diff --git a/package.json b/package.json index 70819f4..541ea74 100644 --- a/package.json +++ b/package.json @@ -10,6 +10,7 @@ }, "dependencies": { "@unhead/vue": "^2.1.15", + "less": "^4.6.4", "vite-ssg": "^28.3.0", "vue": "^3.5.34", "vue-router": "^4.6.4" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index eaef8d5..b381d79 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -11,9 +11,12 @@ importers: '@unhead/vue': specifier: ^2.1.15 version: 2.1.15(vue@3.5.34(typescript@6.0.3)) + less: + specifier: ^4.6.4 + version: 4.6.4 vite-ssg: specifier: ^28.3.0 - version: 28.3.0(unhead@3.1.0(vite@8.0.12(@types/node@24.12.4)(terser@5.47.1)))(vite@8.0.12(@types/node@24.12.4)(terser@5.47.1))(vue-router@4.6.4(vue@3.5.34(typescript@6.0.3)))(vue@3.5.34(typescript@6.0.3)) + version: 28.3.0(unhead@2.1.15)(vite@8.0.12(@types/node@24.12.4)(less@4.6.4)(terser@5.47.1))(vue-router@4.6.4(vue@3.5.34(typescript@6.0.3)))(vue@3.5.34(typescript@6.0.3)) vue: specifier: ^3.5.34 version: 3.5.34(typescript@6.0.3) @@ -26,7 +29,7 @@ importers: version: 24.12.4 '@vitejs/plugin-vue': specifier: ^6.0.6 - version: 6.0.6(vite@8.0.12(@types/node@24.12.4)(terser@5.47.1))(vue@3.5.34(typescript@6.0.3)) + version: 6.0.6(vite@8.0.12(@types/node@24.12.4)(less@4.6.4)(terser@5.47.1))(vue@3.5.34(typescript@6.0.3)) '@vue/tsconfig': specifier: ^0.9.1 version: 0.9.1(typescript@6.0.3)(vue@3.5.34(typescript@6.0.3)) @@ -35,7 +38,7 @@ importers: version: 6.0.3 vite: specifier: ^8.0.12 - version: 8.0.12(@types/node@24.12.4)(terser@5.47.1) + version: 8.0.12(@types/node@24.12.4)(less@4.6.4)(terser@5.47.1) vite-ssg-sitemap: specifier: ^0.10.0 version: 0.10.0 @@ -140,9 +143,6 @@ packages: '@jridgewell/gen-mapping@0.3.13': resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} - '@jridgewell/remapping@2.3.5': - resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} - '@jridgewell/resolve-uri@3.1.2': resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} @@ -200,36 +200,42 @@ packages: 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==} @@ -378,6 +384,10 @@ packages: commander@2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + copy-anything@3.0.5: + resolution: {integrity: sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==} + engines: {node: '>=12.13'} + css-tree@3.2.1: resolution: {integrity: sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==} engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} @@ -424,6 +434,10 @@ packages: resolution: {integrity: sha512-zwfzJecQ/Uej6tusMqwAqU/6KL2XaB2VZ2Jg54Je6ahNBGNH6Ek6g3jjNCF0fG9EWQKGZNddNjU5F1ZQn/sBnA==} engines: {node: '>=20.19.0'} + errno@0.1.8: + resolution: {integrity: sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==} + hasBin: true + estree-walker@2.0.2: resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} @@ -441,6 +455,9 @@ packages: engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + hookable@6.1.1: resolution: {integrity: sha512-U9LYDy1CwhMCnprUfeAZWZGByVbhd54hwepegYTK7Pi5NvqEj63ifz5z+xukznehT7i6NIZRu89Ay1AZmRsLEQ==} @@ -464,9 +481,22 @@ packages: resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} engines: {node: '>= 14'} + iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + + image-size@0.5.5: + resolution: {integrity: sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==} + engines: {node: '>=0.10.0'} + hasBin: true + is-potential-custom-element-name@1.0.1: resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} + is-what@4.1.16: + resolution: {integrity: sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==} + engines: {node: '>=12.13'} + jsdom@28.1.0: resolution: {integrity: sha512-0+MoQNYyr2rBHqO1xilltfDjV9G7ymYGlAUazgcDLQaUf8JDHbuGwsxN6U9qWaElZ4w1B2r7yEGIL3GdeW3Rug==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} @@ -476,6 +506,11 @@ packages: canvas: optional: true + less@4.6.4: + resolution: {integrity: sha512-OJmO5+HxZLLw0RLzkqaNHzcgEAQG7C0y3aMbwtCzIUFZsLMNNq/1IdAdHEycQ58CwUO3jPTHmoN+tE5I7FQxNg==} + engines: {node: '>=18'} + hasBin: true + lightningcss-android-arm64@1.32.0: resolution: {integrity: sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==} engines: {node: '>= 12.0.0'} @@ -511,24 +546,28 @@ packages: 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==} @@ -556,9 +595,18 @@ packages: magic-string@0.30.21: resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + make-dir@2.1.0: + resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==} + engines: {node: '>=6'} + mdn-data@2.27.1: resolution: {integrity: sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==} + mime@1.6.0: + resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} + engines: {node: '>=4'} + hasBin: true + ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} @@ -570,12 +618,21 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true + needle@3.5.0: + resolution: {integrity: sha512-jaQyPKKk2YokHrEg+vFDYxXIHTCBgiZwSHOoVx/8V3GIBS8/VN6NdVRmg8q1ERtPkMvmOvebsgga4sAj5hls/w==} + engines: {node: '>= 4.4.x'} + hasBin: true + no-case@3.0.4: resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} param-case@3.0.4: resolution: {integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==} + parse-node-version@1.0.1: + resolution: {integrity: sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==} + engines: {node: '>= 0.10'} + parse5@8.0.1: resolution: {integrity: sha512-z1e/HMG90obSGeidlli3hj7cbocou0/wa5HacvI3ASx34PecNjNQeaHNo5WIZpWofN9kgkqV1q5YvXe3F0FoPw==} @@ -592,10 +649,17 @@ packages: resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==} engines: {node: '>=12'} + pify@4.0.1: + resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} + engines: {node: '>=6'} + postcss@8.5.14: resolution: {integrity: sha512-SoSL4+OSEtR99LHFZQiJLkT59C5B1amGO1NzTwj7TT1qCUgUO6hxOvzkOYxD+vMrXBM3XJIKzokoERdqQq/Zmg==} engines: {node: ^10 || ^12 || >=14} + prr@1.0.1: + resolution: {integrity: sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==} + punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} @@ -613,10 +677,21 @@ packages: engines: {node: ^20.19.0 || >=22.12.0} hasBin: true + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + sax@1.6.0: + resolution: {integrity: sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==} + engines: {node: '>=11.0.0'} + saxes@6.0.0: resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} engines: {node: '>=v12.22.7'} + semver@5.7.2: + resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} + hasBin: true + source-map-js@1.2.1: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} @@ -673,18 +748,6 @@ packages: unhead@2.1.15: resolution: {integrity: sha512-MCt5T90mCWyr3Z6pUCdM9lVRXoMoVBlL7z7U4CYVIiaDiuzad/UCfLuMqz5MeNmpZUgoBCQnrucJimU7EZR+XA==} - unhead@3.1.0: - resolution: {integrity: sha512-SH1PAjAMspLIoBjAjE/R8hty2NYo7YcIrdu5I+PVfiW4QmmwEG4pgoiKG0MCs6WRSwiatzeha+4lqSqvHW9PEg==} - peerDependencies: - vite: '>=6.4.2' - peerDependenciesMeta: - vite: - optional: true - - unplugin@3.0.0: - resolution: {integrity: sha512-0Mqk3AT2TZCXWKdcoaufeXNukv2mTrEZExeXlHIOZXdqYoHHr4n51pymnwV8x2BOVxwXbK2HLlI7usrqMpycdg==} - engines: {node: ^20.19.0 || >=22.12.0} - vite-ssg-sitemap@0.10.0: resolution: {integrity: sha512-OIja4fqUMcvWl5+bxQARe3LgzWTd8U/dWHWgrqiC7vv3AmTn0YnhMNUAimQ0M/0Aa9myEIAGLV0yKlYbKP8BJQ==} @@ -779,9 +842,6 @@ packages: resolution: {integrity: sha512-BMhLD/Sw+GbJC21C/UgyaZX41nPt8bUTg+jWyDeg7e7YN4xOM05YPSIXceACnXVtqyEw/LMClUQMtMZ+PGGpqQ==} engines: {node: '>=20'} - webpack-virtual-modules@0.6.2: - resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==} - whatwg-mimetype@5.0.0: resolution: {integrity: sha512-sXcNcHOC51uPGF0P/D4NVtrkjSU2fNsm9iog4ZvZJsL3rjoDAzXZhkm2MWt1y+PUdggKAYVoMAIYcs78wJ51Cw==} engines: {node: '>=20'} @@ -885,11 +945,6 @@ snapshots: '@jridgewell/sourcemap-codec': 1.5.5 '@jridgewell/trace-mapping': 0.3.31 - '@jridgewell/remapping@2.3.5': - dependencies: - '@jridgewell/gen-mapping': 0.3.13 - '@jridgewell/trace-mapping': 0.3.31 - '@jridgewell/resolve-uri@3.1.2': {} '@jridgewell/source-map@0.3.11': @@ -975,9 +1030,9 @@ snapshots: dependencies: undici-types: 7.16.0 - '@unhead/dom@2.1.15(unhead@3.1.0(vite@8.0.12(@types/node@24.12.4)(terser@5.47.1)))': + '@unhead/dom@2.1.15(unhead@2.1.15)': dependencies: - unhead: 3.1.0(vite@8.0.12(@types/node@24.12.4)(terser@5.47.1)) + unhead: 2.1.15 '@unhead/vue@2.1.15(vue@3.5.34(typescript@6.0.3))': dependencies: @@ -985,10 +1040,10 @@ snapshots: unhead: 2.1.15 vue: 3.5.34(typescript@6.0.3) - '@vitejs/plugin-vue@6.0.6(vite@8.0.12(@types/node@24.12.4)(terser@5.47.1))(vue@3.5.34(typescript@6.0.3))': + '@vitejs/plugin-vue@6.0.6(vite@8.0.12(@types/node@24.12.4)(less@4.6.4)(terser@5.47.1))(vue@3.5.34(typescript@6.0.3))': dependencies: '@rolldown/pluginutils': 1.0.0-rc.13 - vite: 8.0.12(@types/node@24.12.4)(terser@5.47.1) + vite: 8.0.12(@types/node@24.12.4)(less@4.6.4)(terser@5.47.1) vue: 3.5.34(typescript@6.0.3) '@volar/language-core@2.4.28': @@ -1103,6 +1158,10 @@ snapshots: commander@2.20.3: {} + copy-anything@3.0.5: + dependencies: + is-what: 4.1.16 + css-tree@3.2.1: dependencies: mdn-data: 2.27.1 @@ -1143,6 +1202,11 @@ snapshots: entities@8.0.0: {} + errno@0.1.8: + dependencies: + prr: 1.0.1 + optional: true + estree-walker@2.0.2: {} fdir@6.5.0(picomatch@4.0.4): @@ -1152,6 +1216,9 @@ snapshots: fsevents@2.3.3: optional: true + graceful-fs@4.2.11: + optional: true + hookable@6.1.1: {} html-encoding-sniffer@6.0.0: @@ -1188,8 +1255,18 @@ snapshots: transitivePeerDependencies: - supports-color + iconv-lite@0.6.3: + dependencies: + safer-buffer: 2.1.2 + optional: true + + image-size@0.5.5: + optional: true + is-potential-custom-element-name@1.0.1: {} + is-what@4.1.16: {} + jsdom@28.1.0: dependencies: '@acemir/cssom': 0.9.31 @@ -1217,6 +1294,19 @@ snapshots: - '@noble/hashes' - supports-color + less@4.6.4: + dependencies: + copy-anything: 3.0.5 + parse-node-version: 1.0.1 + optionalDependencies: + errno: 0.1.8 + graceful-fs: 4.2.11 + image-size: 0.5.5 + make-dir: 2.1.0 + mime: 1.6.0 + needle: 3.5.0 + source-map: 0.6.1 + lightningcss-android-arm64@1.32.0: optional: true @@ -1276,14 +1366,29 @@ snapshots: dependencies: '@jridgewell/sourcemap-codec': 1.5.5 + make-dir@2.1.0: + dependencies: + pify: 4.0.1 + semver: 5.7.2 + optional: true + mdn-data@2.27.1: {} + mime@1.6.0: + optional: true + ms@2.1.3: {} muggle-string@0.4.1: {} nanoid@3.3.12: {} + needle@3.5.0: + dependencies: + iconv-lite: 0.6.3 + sax: 1.6.0 + optional: true + no-case@3.0.4: dependencies: lower-case: 2.0.2 @@ -1294,6 +1399,8 @@ snapshots: dot-case: 3.0.4 tslib: 2.8.1 + parse-node-version@1.0.1: {} + parse5@8.0.1: dependencies: entities: 8.0.0 @@ -1309,12 +1416,18 @@ snapshots: picomatch@4.0.4: {} + pify@4.0.1: + optional: true + postcss@8.5.14: dependencies: nanoid: 3.3.12 picocolors: 1.1.1 source-map-js: 1.2.1 + prr@1.0.1: + optional: true + punycode@2.3.1: {} relateurl@0.2.7: {} @@ -1342,10 +1455,19 @@ snapshots: '@rolldown/binding-win32-arm64-msvc': 1.0.0 '@rolldown/binding-win32-x64-msvc': 1.0.0 + safer-buffer@2.1.2: + optional: true + + sax@1.6.0: + optional: true + saxes@6.0.0: dependencies: xmlchars: 2.2.0 + semver@5.7.2: + optional: true + source-map-js@1.2.1: {} source-map-support@0.5.21: @@ -1395,31 +1517,18 @@ snapshots: dependencies: hookable: 6.1.1 - unhead@3.1.0(vite@8.0.12(@types/node@24.12.4)(terser@5.47.1)): - dependencies: - hookable: 6.1.1 - unplugin: 3.0.0 - optionalDependencies: - vite: 8.0.12(@types/node@24.12.4)(terser@5.47.1) - - unplugin@3.0.0: - dependencies: - '@jridgewell/remapping': 2.3.5 - picomatch: 4.0.4 - webpack-virtual-modules: 0.6.2 - vite-ssg-sitemap@0.10.0: {} - vite-ssg@28.3.0(unhead@3.1.0(vite@8.0.12(@types/node@24.12.4)(terser@5.47.1)))(vite@8.0.12(@types/node@24.12.4)(terser@5.47.1))(vue-router@4.6.4(vue@3.5.34(typescript@6.0.3)))(vue@3.5.34(typescript@6.0.3)): + vite-ssg@28.3.0(unhead@2.1.15)(vite@8.0.12(@types/node@24.12.4)(less@4.6.4)(terser@5.47.1))(vue-router@4.6.4(vue@3.5.34(typescript@6.0.3)))(vue@3.5.34(typescript@6.0.3)): dependencies: - '@unhead/dom': 2.1.15(unhead@3.1.0(vite@8.0.12(@types/node@24.12.4)(terser@5.47.1))) + '@unhead/dom': 2.1.15(unhead@2.1.15) '@unhead/vue': 2.1.15(vue@3.5.34(typescript@6.0.3)) ansis: 4.3.0 cac: 6.7.14 html-minifier-terser: 7.2.0 html5parser: 2.0.2 jsdom: 28.1.0 - vite: 8.0.12(@types/node@24.12.4)(terser@5.47.1) + vite: 8.0.12(@types/node@24.12.4)(less@4.6.4)(terser@5.47.1) vue: 3.5.34(typescript@6.0.3) optionalDependencies: vue-router: 4.6.4(vue@3.5.34(typescript@6.0.3)) @@ -1429,7 +1538,7 @@ snapshots: - supports-color - unhead - vite@8.0.12(@types/node@24.12.4)(terser@5.47.1): + vite@8.0.12(@types/node@24.12.4)(less@4.6.4)(terser@5.47.1): dependencies: lightningcss: 1.32.0 picomatch: 4.0.4 @@ -1439,6 +1548,7 @@ snapshots: optionalDependencies: '@types/node': 24.12.4 fsevents: 2.3.3 + less: 4.6.4 terser: 5.47.1 vscode-uri@3.1.0: {} @@ -1470,8 +1580,6 @@ snapshots: webidl-conversions@8.0.1: {} - webpack-virtual-modules@0.6.2: {} - whatwg-mimetype@5.0.0: {} whatwg-url@16.0.1: diff --git a/src/App.vue b/src/App.vue index 90c6c65..336ed26 100644 --- a/src/App.vue +++ b/src/App.vue @@ -1,9 +1,25 @@ + diff --git a/src/assets/css/style.css b/src/assets/css/style.css new file mode 100644 index 0000000..81beb9e --- /dev/null +++ b/src/assets/css/style.css @@ -0,0 +1,151 @@ +body, +html, +div, +ul, +li, +h1, +h2, +h3, +p { + margin: 0; + padding: 0; +} +* { + box-sizing: border-box; +} +html, +body, +#app { + width: 100%; + height: 100%; + overflow: hidden; + font-family: 'KaiseiOpti-Medium'; + color: #232323; +} +@keyframes loading { + 0% { + transform: rotate(0deg); + } + 100% { + transform: rotate(360deg); + } +} +@keyframes opacity-in { + 0% { + opacity: 0; + } + 100% { + opacity: 1; + } +} +@keyframes z-index-10to-1 { + 0% { + z-index: 10; + } + 100% { + z-index: -1; + } +} +.flex { + display: flex; +} +.flex-center { + justify-content: center; + align-items: center; +} +.flex-1 { + flex: 1; +} +.flex-col { + flex-direction: column; +} +.align-center { + align-items: center; +} +.space-between { + justify-content: space-between; +} +.justify-center { + justify-content: center; +} +.relative { + position: relative; +} +.el-overlay { + --el-color-primary: #ff7a51; + --el-color-primary-light-3: #ffa785; + --el-color-primary-light-5: #ffc2aa; + --el-color-primary-light-7: #ffddcf; + --el-color-primary-light-8: #ffe8df; + --el-color-primary-light-9: #fff2ec; + --el-color-primary-dark-2: #cc6241; +} +.el-select, +.el-popper { + --el-color-primary: #6c6c6c; + /* 主灰色 */ + --el-color-primary-light-3: #8a8a8a; + /* 较浅的灰色(混合20%白) */ + --el-color-primary-light-5: #a8a8a8; + /* 更浅的灰色(混合33%白) */ + --el-color-primary-light-7: #c6c6c6; + /* 浅灰色(混合47%白) */ + --el-color-primary-light-8: #d4d4d4; + /* 很浅的灰色(混合53%白) */ + --el-color-primary-light-9: #e3e3e3; + /* 极浅的灰色(混合60%白) */ + --el-color-primary-dark-2: #565656; + /* 深灰色(加深20%) */ +} +.mini-scrollbar { + --mini-scrollbar-width: 0.4rem; +} +.mini-scrollbar::-webkit-scrollbar { + width: var(--mini-scrollbar-width); +} +.mini-scrollbar::-webkit-scrollbar-thumb { + border-radius: 0.4rem; + background: rgba(0, 0, 0, 0.2); +} +.mosaic-bg { + --mosaic-bg-size: 1rem; + --mosaic-bg-color1: #efefef; + --mosaic-bg-color2: #fff; + background-image: repeating-conic-gradient(var(--mosaic-bg-color1) 0% 25%, var(--mosaic-bg-color2) 0% 50%); + background-repeat: repeat; + background-position: 50% 50%; + background-size: var(--mosaic-bg-size) var(--mosaic-bg-size); +} +button[custom], +button[custom="white"] { + min-width: 19.4rem; + height: 5rem; + padding: 0 1rem; + border-radius: 0; + font-family: KaiseiOpti-Bold; + font-size: var(--button-font-size, 2rem); + color: var(--button-color, #232323); + background: var(--button-bgcolor, #fff); + border: var(--button-border, none); + cursor: pointer; +} +button[custom]:active, +button[custom="white"]:active { + background: var(--button-click-bgcolor, #e4e4e4); + color: var(--button-click-color, #232323); +} +button[custom="black"] { + --button-bgcolor: #232323; + --button-color: #fff; + --button-click-bgcolor: #333; + --button-click-color: #fff; + --button-font-size: 1.6rem; +} +button[custom="black-box"] { + --button-bgcolor: transparent; + --button-color: #232323; + --button-border: 0.2rem solid #979797; + --button-click-bgcolor: #979797; + --button-click-color: #fff; + --button-font-size: 1.6rem; +} diff --git a/src/assets/css/style.less b/src/assets/css/style.less new file mode 100644 index 0000000..23f75a9 --- /dev/null +++ b/src/assets/css/style.less @@ -0,0 +1,180 @@ +body, +html, +div, +ul, +li, +h1, +h2, +h3, +p { + margin: 0; + padding: 0; +} + +* { + box-sizing: border-box; +} + +html, +body, +#app { + width: 100%; + height: 100%; + overflow: hidden; + font-family: 'KaiseiOpti-Medium'; + color: #232323; +} + +@keyframes loading { + 0% { + transform: rotate(0deg); + } + + 100% { + transform: rotate(360deg); + } +} + +@keyframes opacity-in { + 0% { + opacity: 0; + } + + 100% { + opacity: 1; + } +} + +@keyframes z-index-10to-1 { + 0% { + z-index: 10; + } + + 100% { + z-index: -1; + } +} + +.flex { + display: flex; +} + +.flex-center { + justify-content: center; + align-items: center; +} + +.flex-1 { + flex: 1; +} + +.flex-col { + flex-direction: column; +} + +.align-center { + align-items: center; +} + +.space-between { + justify-content: space-between; +} + +.justify-center { + justify-content: center; +} + +.relative { + position: relative; +} + +.el-overlay { + --el-color-primary: #ff7a51; // 主橙红色 + --el-color-primary-light-3: #ffa785; // 较浅的橙红(混合20%白) + --el-color-primary-light-5: #ffc2aa; // 更浅的橙红(混合33%白) + --el-color-primary-light-7: #ffddcf; // 浅橙红(混合47%白) + --el-color-primary-light-8: #ffe8df; // 很浅的橙红(混合53%白) + --el-color-primary-light-9: #fff2ec; // 极浅的橙红(混合60%白) + --el-color-primary-dark-2: #cc6241; // 深橙红(加深20%) +} + +.el-select, +.el-popper { + --el-color-primary: #6c6c6c; + /* 主灰色 */ + --el-color-primary-light-3: #8a8a8a; + /* 较浅的灰色(混合20%白) */ + --el-color-primary-light-5: #a8a8a8; + /* 更浅的灰色(混合33%白) */ + --el-color-primary-light-7: #c6c6c6; + /* 浅灰色(混合47%白) */ + --el-color-primary-light-8: #d4d4d4; + /* 很浅的灰色(混合53%白) */ + --el-color-primary-light-9: #e3e3e3; + /* 极浅的灰色(混合60%白) */ + --el-color-primary-dark-2: #565656; + /* 深灰色(加深20%) */ +} + + +// 迷你滚动条 +.mini-scrollbar { + --mini-scrollbar-width: 0.4rem; + + &::-webkit-scrollbar { + width: var(--mini-scrollbar-width); + } + + &::-webkit-scrollbar-thumb { + border-radius: 0.4rem; + background: rgba(0, 0, 0, 0.2); + } +} + +.mosaic-bg { + --mosaic-bg-size: 1rem; + --mosaic-bg-color1: #efefef; + --mosaic-bg-color2: #fff; + background-image: repeating-conic-gradient(var(--mosaic-bg-color1) 0% 25%, var(--mosaic-bg-color2) 0% 50%); + background-repeat: repeat; + background-position: 50% 50%; + background-size: var(--mosaic-bg-size) var(--mosaic-bg-size); +} + + +// 自定义button按钮 +button[custom], +button[custom="white"] { + min-width: 19.4rem; + height: 5rem; + padding: 0 1rem; + border-radius: 0; + font-family: KaiseiOpti-Bold; + font-size: var(--button-font-size, 2rem); + color: var(--button-color, #232323); + background: var(--button-bgcolor, #fff); + border: var(--button-border, none); + cursor: pointer; + + &:active { + background: var(--button-click-bgcolor, #e4e4e4); + color: var(--button-click-color, #232323); + } +} + +button[custom="black"] { + --button-bgcolor: #232323; + --button-color: #fff; + --button-click-bgcolor: #333; + --button-click-color: #fff; + --button-font-size: 1.6rem; +} + +button[custom="black-box"] { + --button-bgcolor: transparent; + --button-color: #232323; + --button-border: 0.2rem solid #979797; + --button-click-bgcolor: #979797; + --button-click-color: #fff; + --button-font-size: 1.6rem; +} \ No newline at end of file diff --git a/src/components/footer.vue b/src/components/footer.vue new file mode 100644 index 0000000..bb55661 --- /dev/null +++ b/src/components/footer.vue @@ -0,0 +1,25 @@ + + + \ No newline at end of file diff --git a/src/components/header.vue b/src/components/header.vue new file mode 100644 index 0000000..bb55661 --- /dev/null +++ b/src/components/header.vue @@ -0,0 +1,25 @@ + + + \ No newline at end of file diff --git a/src/routes.ts b/src/routes.ts index b2192ee..50ec043 100644 --- a/src/routes.ts +++ b/src/routes.ts @@ -5,24 +5,29 @@ import HomeView from './pages/HomeView.vue' import ProductsView from './pages/ProductsView.vue' export const routes: RouteRecordRaw[] = [ - { - path: '/', - name: 'home', - component: HomeView, - }, - { - path: '/about', - name: 'about', - component: AboutView, - }, - { - path: '/products', - name: 'products', - component: ProductsView, - }, - { - path: '/contact', - name: 'contact', - component: ContactView, - }, + { + path: '/:lang?', + children: [ + { + path: '', + component: HomeView, + alias: ['/:lang?', '/:lang?/home'], + + }, + { + path: 'about', + component: AboutView, + }, + { + path: 'products', + name: 'products', + component: ProductsView, + }, + { + path: 'contact', + name: 'contact', + component: ContactView, + }, + ], + }, ] diff --git a/vite.config.ts b/vite.config.ts index 0b2b8fe..01fba58 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -3,11 +3,14 @@ import type { ViteSSGOptions } from 'vite-ssg' import { defineConfig } from 'vite' import vue from '@vitejs/plugin-vue' import generateSitemap from 'vite-ssg-sitemap' +import { fileURLToPath, URL } from 'node:url' // https://vite.dev/config/ const config = { base: '/', - plugins: [vue()], + plugins: [vue() + + ], ssgOptions: { dirStyle: 'nested', script: 'defer', @@ -21,7 +24,13 @@ const config = { outDir: 'dist' }) } - } + }, + resolve: { + alias: { + '@': fileURLToPath(new URL('./src', import.meta.url)), + _c: fileURLToPath(new URL('./src/components', import.meta.url)) + } + }, } satisfies UserConfig & { ssgOptions: ViteSSGOptions } export default defineConfig(config)