diff --git a/src/.vuepress/public/bg/bgImage.jpg b/image-sources/bg/bgImage.jpg similarity index 100% rename from src/.vuepress/public/bg/bgImage.jpg rename to image-sources/bg/bgImage.jpg diff --git a/image-sources/favicon-source.ico b/image-sources/favicon-source.ico new file mode 100644 index 0000000..12d6c89 Binary files /dev/null and b/image-sources/favicon-source.ico differ diff --git a/src/.vuepress/public/logo/logo.png b/image-sources/logo/logo.png similarity index 100% rename from src/.vuepress/public/logo/logo.png rename to image-sources/logo/logo.png diff --git a/src/.vuepress/public/logo/logoDark.png b/image-sources/logo/logoDark.png similarity index 100% rename from src/.vuepress/public/logo/logoDark.png rename to image-sources/logo/logoDark.png diff --git a/src/.vuepress/public/logo/transparentLogo.png b/image-sources/logo/transparentLogo.png similarity index 100% rename from src/.vuepress/public/logo/transparentLogo.png rename to image-sources/logo/transparentLogo.png diff --git a/package-lock.json b/package-lock.json index 6de5913..dac89ba 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,8 +15,10 @@ "@vuepress/plugin-search": "^2.0.0-rc.128", "eslint": "^9.39.1", "eslint-plugin-vue": "^10.6.1", + "glob": "^13.0.6", "prettier": "^3.6.2", "sass-embedded": "^1.99.0", + "sharp": "^0.34.5", "typescript-eslint": "^8.46.4", "vue": "^3.5.13", "vuepress": "^2.0.0-rc.28", @@ -813,6 +815,496 @@ "url": "https://github.com/sponsors/nzakas" } }, + "node_modules/@img/colour": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/@img/colour/-/colour-1.1.0.tgz", + "integrity": "sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@img/sharp-darwin-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmmirror.com/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.5.tgz", + "integrity": "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-arm64": "1.2.4" + } + }, + "node_modules/@img/sharp-darwin-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmmirror.com/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.5.tgz", + "integrity": "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-x64": "1.2.4" + } + }, + "node_modules/@img/sharp-libvips-darwin-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmmirror.com/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.4.tgz", + "integrity": "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-darwin-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmmirror.com/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.4.tgz", + "integrity": "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm": { + "version": "1.2.4", + "resolved": "https://registry.npmmirror.com/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.4.tgz", + "integrity": "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmmirror.com/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.4.tgz", + "integrity": "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-ppc64": { + "version": "1.2.4", + "resolved": "https://registry.npmmirror.com/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.4.tgz", + "integrity": "sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-riscv64": { + "version": "1.2.4", + "resolved": "https://registry.npmmirror.com/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.2.4.tgz", + "integrity": "sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-s390x": { + "version": "1.2.4", + "resolved": "https://registry.npmmirror.com/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.4.tgz", + "integrity": "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmmirror.com/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.4.tgz", + "integrity": "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-arm64": { + "version": "1.2.4", + "resolved": "https://registry.npmmirror.com/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.4.tgz", + "integrity": "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-x64": { + "version": "1.2.4", + "resolved": "https://registry.npmmirror.com/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.4.tgz", + "integrity": "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-linux-arm": { + "version": "0.34.5", + "resolved": "https://registry.npmmirror.com/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.5.tgz", + "integrity": "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmmirror.com/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.5.tgz", + "integrity": "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-ppc64": { + "version": "0.34.5", + "resolved": "https://registry.npmmirror.com/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.5.tgz", + "integrity": "sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-ppc64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-riscv64": { + "version": "0.34.5", + "resolved": "https://registry.npmmirror.com/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.34.5.tgz", + "integrity": "sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-riscv64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-s390x": { + "version": "0.34.5", + "resolved": "https://registry.npmmirror.com/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.5.tgz", + "integrity": "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-s390x": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmmirror.com/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.5.tgz", + "integrity": "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-x64": "1.2.4" + } + }, + "node_modules/@img/sharp-linuxmusl-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmmirror.com/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.5.tgz", + "integrity": "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-arm64": "1.2.4" + } + }, + "node_modules/@img/sharp-linuxmusl-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmmirror.com/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.5.tgz", + "integrity": "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-x64": "1.2.4" + } + }, + "node_modules/@img/sharp-wasm32": { + "version": "0.34.5", + "resolved": "https://registry.npmmirror.com/@img/sharp-wasm32/-/sharp-wasm32-0.34.5.tgz", + "integrity": "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", + "optional": true, + "dependencies": { + "@emnapi/runtime": "^1.7.0" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-arm64": { + "version": "0.34.5", + "resolved": "https://registry.npmmirror.com/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.5.tgz", + "integrity": "sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-ia32": { + "version": "0.34.5", + "resolved": "https://registry.npmmirror.com/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.5.tgz", + "integrity": "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-x64": { + "version": "0.34.5", + "resolved": "https://registry.npmmirror.com/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.5.tgz", + "integrity": "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.13", "resolved": "https://registry.npmmirror.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", @@ -5206,6 +5698,63 @@ "lit": "^3.2.1" } }, + "node_modules/glob": { + "version": "13.0.6", + "resolved": "https://registry.npmmirror.com/glob/-/glob-13.0.6.tgz", + "integrity": "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "minimatch": "^10.2.2", + "minipass": "^7.1.3", + "path-scurry": "^2.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmmirror.com/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/glob/node_modules/brace-expansion": { + "version": "5.0.6", + "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-5.0.6.tgz", + "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "10.2.5", + "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.5" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/globals": { "version": "14.0.0", "resolved": "https://registry.npmmirror.com/globals/-/globals-14.0.0.tgz", @@ -6063,6 +6612,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/lru-cache": { + "version": "11.3.6", + "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-11.3.6.tgz", + "integrity": "sha512-Gf/KoL3C/MlI7Bt0PGI9I+TeTC/I6r/csU58N4BSNc4lppLBeKsOdFYkK+dX0ABDUMJNfCHTyPpzwwO21Awd3A==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } + }, "node_modules/magic-string": { "version": "0.30.21", "resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.30.21.tgz", @@ -6303,6 +6862,16 @@ "node": "*" } }, + "node_modules/minipass": { + "version": "7.1.3", + "resolved": "https://registry.npmmirror.com/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, "node_modules/mlly": { "version": "1.8.2", "resolved": "https://registry.npmmirror.com/mlly/-/mlly-1.8.2.tgz", @@ -6604,6 +7173,23 @@ "node": ">=8" } }, + "node_modules/path-scurry": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/path-scurry/-/path-scurry-2.0.2.tgz", + "integrity": "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/pathe": { "version": "2.0.3", "resolved": "https://registry.npmmirror.com/pathe/-/pathe-2.0.3.tgz", @@ -7498,6 +8084,51 @@ "dev": true, "license": "ISC" }, + "node_modules/sharp": { + "version": "0.34.5", + "resolved": "https://registry.npmmirror.com/sharp/-/sharp-0.34.5.tgz", + "integrity": "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==", + "dev": true, + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "@img/colour": "^1.0.0", + "detect-libc": "^2.1.2", + "semver": "^7.7.3" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-darwin-arm64": "0.34.5", + "@img/sharp-darwin-x64": "0.34.5", + "@img/sharp-libvips-darwin-arm64": "1.2.4", + "@img/sharp-libvips-darwin-x64": "1.2.4", + "@img/sharp-libvips-linux-arm": "1.2.4", + "@img/sharp-libvips-linux-arm64": "1.2.4", + "@img/sharp-libvips-linux-ppc64": "1.2.4", + "@img/sharp-libvips-linux-riscv64": "1.2.4", + "@img/sharp-libvips-linux-s390x": "1.2.4", + "@img/sharp-libvips-linux-x64": "1.2.4", + "@img/sharp-libvips-linuxmusl-arm64": "1.2.4", + "@img/sharp-libvips-linuxmusl-x64": "1.2.4", + "@img/sharp-linux-arm": "0.34.5", + "@img/sharp-linux-arm64": "0.34.5", + "@img/sharp-linux-ppc64": "0.34.5", + "@img/sharp-linux-riscv64": "0.34.5", + "@img/sharp-linux-s390x": "0.34.5", + "@img/sharp-linux-x64": "0.34.5", + "@img/sharp-linuxmusl-arm64": "0.34.5", + "@img/sharp-linuxmusl-x64": "0.34.5", + "@img/sharp-wasm32": "0.34.5", + "@img/sharp-win32-arm64": "0.34.5", + "@img/sharp-win32-ia32": "0.34.5", + "@img/sharp-win32-x64": "0.34.5" + } + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmmirror.com/shebang-command/-/shebang-command-2.0.0.tgz", diff --git a/package.json b/package.json index 3188b53..4a2014d 100644 --- a/package.json +++ b/package.json @@ -9,6 +9,7 @@ "docs:clean-dev": "vuepress-vite dev src --clean-cache", "docs:dev": "vuepress-vite dev src", "docs:update-package": "npx vp-update", + "optimize:images": "node scripts/optimize-images.mjs", "format": "prettier \"*.{js,json,yml}\" \"src/.vuepress/**/*.{ts,vue,scss}\" --write", "format:check": "prettier \"*.{js,json,yml}\" \"src/.vuepress/**/*.{ts,vue,scss}\" --check", "lint": "eslint \"src/.vuepress/**/*.{ts,vue}\" eslint.config.js", @@ -21,8 +22,10 @@ "@vuepress/plugin-search": "^2.0.0-rc.128", "eslint": "^9.39.1", "eslint-plugin-vue": "^10.6.1", + "glob": "^13.0.6", "prettier": "^3.6.2", "sass-embedded": "^1.99.0", + "sharp": "^0.34.5", "typescript-eslint": "^8.46.4", "vue": "^3.5.13", "vuepress": "^2.0.0-rc.28", diff --git a/scripts/optimize-images.mjs b/scripts/optimize-images.mjs new file mode 100644 index 0000000..f2d053b --- /dev/null +++ b/scripts/optimize-images.mjs @@ -0,0 +1,145 @@ +import sharp from 'sharp'; +import { glob } from 'glob'; +import path from 'path'; +import fs from 'fs/promises'; + +const SOURCE_DIR = 'image-sources'; +const PUBLIC_DIR = 'src/.vuepress/public'; + +async function getFileSize(filePath) { + try { + const stats = await fs.stat(filePath); + return stats.size; + } catch { + return 0; + } +} + +function formatBytes(bytes) { + if (bytes === 0) return '0 B'; + const k = 1024; + const sizes = ['B', 'KB', 'MB', 'GB']; + const i = Math.floor(Math.log(bytes) / Math.log(k)); + return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i]; +} + +async function optimizeImage(inputPath, outputPath, options = {}) { + const { width, quality = 80, outputExt = '.webp' } = options; + const originalSize = await getFileSize(inputPath); + + let pipeline = sharp(inputPath); + + if (width) { + pipeline = pipeline.resize({ width, withoutEnlargement: true }); + } + + if (outputExt === '.webp') { + pipeline = pipeline.webp({ quality, lossless: false, force: true }); + } else if (outputExt === '.png') { + pipeline = pipeline.png({ quality, compressionLevel: 9, force: true }); + } + + const buffer = await pipeline.toBuffer(); + + // For standard images, if webp is larger, we'll keep it if it's the specific target like bgImage + // but for general article images we might skip. + const isTargeted = inputPath.includes(SOURCE_DIR); + if (!isTargeted && buffer.length >= originalSize && outputExt === '.webp') { + console.log(`Skipping ${path.basename(inputPath)}: Optimized size (${formatBytes(buffer.length)}) >= original (${formatBytes(originalSize)})`); + return null; + } + + await fs.mkdir(path.dirname(outputPath), { recursive: true }); + await fs.writeFile(outputPath, buffer); + const optimizedSize = buffer.length; + + return { + inputPath, + outputPath, + name: path.basename(inputPath), + outputName: path.basename(outputPath), + originalSize, + optimizedSize, + reduction: ((originalSize - optimizedSize) / originalSize * 100).toFixed(2) + '%' + }; +} + +async function main() { + console.log('Starting reorganized image optimization...'); + const results = []; + + // 1. Optimize Background from Source + const bgSource = path.join(SOURCE_DIR, 'bg/bgImage.jpg'); + if (await fs.access(bgSource).then(() => true).catch(() => false)) { + const res = await optimizeImage(bgSource, path.join(PUBLIC_DIR, 'bg/bgImage.webp'), { width: 1920, quality: 78 }); + if (res) results.push(res); + } + + // 2. Optimize Logo from Source + const logoSource = path.join(SOURCE_DIR, 'logo/transparentLogo.png'); + if (await fs.access(logoSource).then(() => true).catch(() => false)) { + const res = await optimizeImage(logoSource, path.join(PUBLIC_DIR, 'logo/transparentLogo.webp'), { width: 256, quality: 82 }); + if (res) results.push(res); + } + + // 3. Optimize Favicon from Source (output to public/favicon.png) + const favSource = path.join(SOURCE_DIR, 'favicon-source.ico'); + if (await fs.access(favSource).then(() => true).catch(() => false)) { + const res = await optimizeImage(favSource, path.join(PUBLIC_DIR, 'favicon.png'), { width: 32, outputExt: '.png' }); + if (res) results.push(res); + } + + // 4. Optimize Article Images (In-place WebP generation) + const articleImages = await glob('src/**/*.{jpg,jpeg,png}', { + ignore: ['src/.vuepress/dist/**', 'src/.vuepress/public/**'] + }); + + console.log(`Found ${articleImages.length} article images to process...`); + for (const img of articleImages) { + const metadata = await sharp(img).metadata(); + const outputWebp = img.replace(path.extname(img), '.webp'); + const options = { quality: 80 }; + if (metadata.width > 1600) { + options.width = 1600; + } + const res = await optimizeImage(img, outputWebp, options); + if (res) results.push(res); + } + + // Print Report + console.log('\nOptimization Report:'); + console.table(results.map(r => ({ + File: r.name, + Source: r.inputPath.startsWith(SOURCE_DIR) ? 'Source Folder' : 'Article Folder', + Original: formatBytes(r.originalSize), + Optimized: formatBytes(r.optimizedSize), + Reduction: r.reduction + }))); + + // 5. Update Markdown references + console.log('\nUpdating Markdown references...'); + const mdFiles = await glob('src/**/*.md'); + for (const res of results) { + // Only update for article images (not the core theme images which are already updated) + if (!res.inputPath.includes(SOURCE_DIR)) { + const oldName = res.name; + const newName = res.outputName; + for (const mdFile of mdFiles) { + let content = await fs.readFile(mdFile, 'utf-8'); + if (content.includes(oldName)) { + const newContent = content.replaceAll(oldName, newName); + if (newContent !== content) { + await fs.writeFile(mdFile, newContent); + console.log(`Updated ${oldName} -> ${newName} in ${mdFile}`); + } + } + } + } + } + + const totalOriginal = results.reduce((sum, r) => sum + r.originalSize, 0); + const totalOptimized = results.reduce((sum, r) => sum + r.optimizedSize, 0); + console.log(`\nTotal Reduction: ${formatBytes(totalOriginal - totalOptimized)} (${((totalOriginal - totalOptimized) / totalOriginal * 100).toFixed(2)}%)`); +} + +main().catch(console.error); diff --git a/src/.vuepress/config.ts b/src/.vuepress/config.ts index 2f39455..9f17df5 100644 --- a/src/.vuepress/config.ts +++ b/src/.vuepress/config.ts @@ -11,6 +11,9 @@ export default defineUserConfig({ lang: 'zh-CN', title: '氓氓小栈', description: '氓氓小栈', + + head: [['link', { rel: 'icon', href: '/favicon.png' }]], + theme, bundler: viteBundler({ viteOptions: { diff --git a/src/.vuepress/public/bg/bgImage.webp b/src/.vuepress/public/bg/bgImage.webp new file mode 100644 index 0000000..dcfdf6e Binary files /dev/null and b/src/.vuepress/public/bg/bgImage.webp differ diff --git a/src/.vuepress/public/favicon.ico b/src/.vuepress/public/favicon.ico deleted file mode 100644 index 7a99168..0000000 Binary files a/src/.vuepress/public/favicon.ico and /dev/null differ diff --git a/src/.vuepress/public/favicon.png b/src/.vuepress/public/favicon.png new file mode 100644 index 0000000..33bc944 Binary files /dev/null and b/src/.vuepress/public/favicon.png differ diff --git a/src/.vuepress/public/logo/transparentLogo.webp b/src/.vuepress/public/logo/transparentLogo.webp new file mode 100644 index 0000000..65110d5 Binary files /dev/null and b/src/.vuepress/public/logo/transparentLogo.webp differ diff --git a/src/.vuepress/theme.ts b/src/.vuepress/theme.ts index 23c0b60..4e1299e 100644 --- a/src/.vuepress/theme.ts +++ b/src/.vuepress/theme.ts @@ -39,8 +39,8 @@ export default hopeTheme( sidebar, // 网站logo设置 - logo: 'logo/transparentLogo.png', // 亮色模式下的logo - logoDark: 'logo/transparentLogo.png', // 暗色模式下的logo + logo: 'logo/transparentLogo.webp', // 亮色模式下的logo + logoDark: 'logo/transparentLogo.webp', // 暗色模式下的logo // 支持简写仓库名称,会解析到 GitHub 上,同时也可以是一个完整的 URL // repo: "https://gitea.mangmang.fun/mangmang/blog", diff --git a/src/README.md b/src/README.md index c8813a6..1bbfe15 100644 --- a/src/README.md +++ b/src/README.md @@ -8,8 +8,8 @@ tagline: '' #heroImage: logo/transparentLogo.png #heroImageDark: logo/transparentLogo.png #heroAlt: 可爱小熊猫 -bgImage: bg/bgImage.jpg -bgImageDark: bg/bgImage.jpg +bgImage: bg/bgImage.webp +bgImageDark: bg/bgImage.webp heroFullScreen: true icon: house diff --git a/src/programming/backend/java/功能整理/03WebSocket和HTTP关系.md b/src/programming/backend/java/功能整理/03WebSocket和HTTP关系.md index 5e426cd..4e55232 100644 --- a/src/programming/backend/java/功能整理/03WebSocket和HTTP关系.md +++ b/src/programming/backend/java/功能整理/03WebSocket和HTTP关系.md @@ -94,7 +94,7 @@ WebSocket与HTTP是相辅相成的关系,而非替代关系。WebSocket通过H ## 5. 案例(服务端) ### 5.1 项目结构 -![1746684922168.png](../../../../tools/assets/20210721105228.png) +![1746684922168.png](../../../../tools/assets/20210721105228.webp) ### 5.2 依赖配置 ```xml diff --git a/src/programming/backend/java/功能整理/assets/20210721105228.webp b/src/programming/backend/java/功能整理/assets/20210721105228.webp new file mode 100644 index 0000000..cb1f132 Binary files /dev/null and b/src/programming/backend/java/功能整理/assets/20210721105228.webp differ diff --git a/src/tools/04gitee-ssh.md b/src/tools/04gitee-ssh.md index 28c5768..247fe41 100644 --- a/src/tools/04gitee-ssh.md +++ b/src/tools/04gitee-ssh.md @@ -83,7 +83,7 @@ ssh-ed25519 AAAA***5B Gitee SSH Key 5. 输入Gitee账户密码进行验证 6. 点击「添加」按钮完成操作 -![添加账户SSH公钥](./assets/sshkeys_create-8409f453e6780ca1a8db3ce33c74240b.png "添加用户SSH公钥") +![添加账户SSH公钥](./assets/sshkeys_create-8409f453e6780ca1a8db3ce33c74240b.webp "添加用户SSH公钥") ### 4. 验证SSH连接 @@ -109,9 +109,9 @@ Hi USERNAME! You've successfully authenticated, but GITEE.COM does not provide s 2. 查看公钥详情:点击具体的公钥可以查看其详细信息 3. 删除公钥:当某个SSH公钥不再需要时,可以直接删除它 -![浏览SSH Key](./assets/sshkeys_list-bff1a324894abbdc3ab8f61c49bb63d5.png "浏览SSH Key") +![浏览SSH Key](./assets/sshkeys_list-bff1a324894abbdc3ab8f61c49bb63d5.webp "浏览SSH Key") -![查看/删除SSH Key](./assets/sshkeys_show-a14cdfb89475debed237bfded2bd9848.png "查看/删除SSH Key") +![查看/删除SSH Key](./assets/sshkeys_show-a14cdfb89475debed237bfded2bd9848.webp "查看/删除SSH Key") ## 账户SSH公钥vs仓库SSH公钥 diff --git a/src/tools/assets/20210721105228.webp b/src/tools/assets/20210721105228.webp new file mode 100644 index 0000000..cb1f132 Binary files /dev/null and b/src/tools/assets/20210721105228.webp differ diff --git a/src/tools/assets/sshkeys_create-8409f453e6780ca1a8db3ce33c74240b.webp b/src/tools/assets/sshkeys_create-8409f453e6780ca1a8db3ce33c74240b.webp new file mode 100644 index 0000000..90f8517 Binary files /dev/null and b/src/tools/assets/sshkeys_create-8409f453e6780ca1a8db3ce33c74240b.webp differ diff --git a/src/tools/assets/sshkeys_list-bff1a324894abbdc3ab8f61c49bb63d5.webp b/src/tools/assets/sshkeys_list-bff1a324894abbdc3ab8f61c49bb63d5.webp new file mode 100644 index 0000000..6807b96 Binary files /dev/null and b/src/tools/assets/sshkeys_list-bff1a324894abbdc3ab8f61c49bb63d5.webp differ diff --git a/src/tools/assets/sshkeys_show-a14cdfb89475debed237bfded2bd9848.webp b/src/tools/assets/sshkeys_show-a14cdfb89475debed237bfded2bd9848.webp new file mode 100644 index 0000000..d88b57d Binary files /dev/null and b/src/tools/assets/sshkeys_show-a14cdfb89475debed237bfded2bd9848.webp differ diff --git a/src/work/assets/Snipaste_2026-03-27_15-12-26.webp b/src/work/assets/Snipaste_2026-03-27_15-12-26.webp new file mode 100644 index 0000000..a48c835 Binary files /dev/null and b/src/work/assets/Snipaste_2026-03-27_15-12-26.webp differ diff --git a/src/work/assets/image-20240513143908211.webp b/src/work/assets/image-20240513143908211.webp new file mode 100644 index 0000000..7238e3a Binary files /dev/null and b/src/work/assets/image-20240513143908211.webp differ diff --git a/src/work/todo/2026-03.md b/src/work/todo/2026-03.md index 98d39c0..644b4c3 100644 --- a/src/work/todo/2026-03.md +++ b/src/work/todo/2026-03.md @@ -124,7 +124,7 @@ title: 3月待办(2026-03) - **完成情况**: 已完成,已梳理点位与阈值告警关联关系,实现删除点位时同步清理关联阈值告警功能 - **需求截图**: -![删除点位关联阈值告警需求截图](../assets/Snipaste_2026-03-27_15-12-26.png) +![删除点位关联阈值告警需求截图](../assets/Snipaste_2026-03-27_15-12-26.webp) ### 20. [智慧场站-7050] 录像回放权限问题修复 diff --git a/src/work/常用.md b/src/work/常用.md index 9355c3a..f054c1e 100644 --- a/src/work/常用.md +++ b/src/work/常用.md @@ -191,7 +191,7 @@ export file:/home/sunri/PRS7950/binary/java/jar/x64/dist/ ### 权限图 -![权限图](./assets/image-20240513143908211.png) +![权限图](./assets/image-20240513143908211.webp) ### 问题截图