├── .github └── workflows │ └── release.yml ├── .gitignore ├── README.md ├── auto-imports.d.ts ├── components.d.ts ├── index.html ├── package.json ├── pnpm-lock.yaml ├── public └── main.yml ├── src-tauri ├── .gitignore ├── Cargo.lock ├── Cargo.toml ├── build.rs ├── icons │ ├── 128x128.png │ ├── 128x128@2x.png │ ├── 32x32.png │ ├── Square107x107Logo.png │ ├── Square142x142Logo.png │ ├── Square150x150Logo.png │ ├── Square284x284Logo.png │ ├── Square30x30Logo.png │ ├── Square310x310Logo.png │ ├── Square44x44Logo.png │ ├── Square71x71Logo.png │ ├── Square89x89Logo.png │ ├── StoreLogo.png │ ├── icon.icns │ ├── icon.ico │ └── icon.png ├── src │ ├── api │ │ ├── http.rs │ │ └── mod.rs │ ├── config │ │ ├── config.rs │ │ ├── interface.rs │ │ └── mod.rs │ ├── download │ │ ├── download.rs │ │ └── mod.rs │ ├── lib.rs │ ├── main.rs │ ├── top │ │ ├── interface.rs │ │ ├── mod.rs │ │ └── top.rs │ └── utils │ │ ├── error.rs │ │ └── mod.rs └── tauri.conf.json ├── src ├── App.vue ├── assets │ └── vue.svg ├── components │ ├── Config │ │ └── index.vue │ ├── Default │ │ └── index.vue │ ├── Home │ │ └── index.vue │ ├── Hot │ │ └── index.vue │ ├── Index │ │ └── index.vue │ ├── Random │ │ └── index.vue │ ├── Style │ │ └── theme.scss │ └── Top │ │ └── index.vue ├── main.ts ├── router │ └── index.ts ├── static │ └── 2222.png └── vite-env.d.ts ├── tsconfig.json ├── tsconfig.node.json └── vite.config.ts /.github/workflows/release.yml: -------------------------------------------------------------------------------- 1 | name: Release 2 | on: 3 | push: 4 | tags: 5 | - 'v*' 6 | workflow_dispatch: 7 | 8 | permissions: write-all 9 | 10 | jobs: 11 | release: 12 | strategy: 13 | fail-fast: false 14 | matrix: 15 | include: 16 | - os: windows-latest 17 | target: x86_64-pc-windows-msvc 18 | - os: ubuntu-20.04 19 | target: x86_64-unknown-linux-gnu 20 | - os: macos-latest 21 | target: aarch64-apple-darwin 22 | - os: macos-12 23 | target: x86_64-apple-darwin 24 | runs-on: ${{ matrix.os }} 25 | 26 | steps: 27 | - name: Checkout repository 28 | uses: actions/checkout@v4 29 | 30 | - name: Rust setup 31 | uses: dtolnay/rust-toolchain@1.77.0 32 | with: 33 | targets: aarch64-apple-darwin 34 | 35 | - name: Add Rust target 36 | run: rustup target add ${{ matrix.target }} 37 | 38 | - name: Rust cache 39 | uses: Swatinem/rust-cache@v2 40 | with: 41 | workspaces: src-tauri 42 | 43 | - name: Install Node 44 | uses: actions/setup-node@v4 45 | with: 46 | node-version: 16.14.2 47 | 48 | - name: Install pnpm 49 | uses: pnpm/action-setup@v4 50 | with: 51 | version: 8.6.1 52 | run_install: false 53 | 54 | - name: Pnpm install 55 | run: pnpm install 56 | 57 | - name: Install dependencies (ubuntu only) 58 | if: matrix.os == 'ubuntu-20.04' 59 | run: | 60 | sudo apt-get update 61 | sudo apt-get install -y libgtk-3-dev libwebkit2gtk-4.0-dev libayatana-appindicator3-dev librsvg2-dev 62 | 63 | - name: Tauri build 64 | uses: tauri-apps/tauri-action@v0 65 | env: 66 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 67 | with: 68 | tagName: v__VERSION__ # This only works if your workflow triggers on new tags. 69 | releaseName: 'Wallpapers v__VERSION__' # tauri-action replaces \_\_VERSION\_\_ with the app version. 70 | releaseBody: 'fix bugs and add new features' 71 | releaseDraft: false 72 | prerelease: false 73 | releaseId: ${{ needs.create-release.outputs.RELEASE_UPLOAD_ID }} 74 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | pnpm-debug.log* 8 | lerna-debug.log* 9 | 10 | node_modules 11 | dist 12 | dist-ssr 13 | *.local 14 | 15 | # Editor directories and files 16 | .vscode/* 17 | !.vscode/extensions.json 18 | .idea 19 | .DS_Store 20 | *.suo 21 | *.ntvs* 22 | *.njsproj 23 | *.sln 24 | *.sw? -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # wallpaper 壁纸下载器 2 | 3 | - 因找壁纸太麻烦故写了个壁纸下载器 4 | 5 | - 界面显示不怎么好请谅解后期会修复 6 | 7 | - ✅ Toplist 8 | - ✅ Latest 9 | - ✅ Random 10 | - ✅ Hot 11 | - ❎ Search 12 | 13 | - ❎ 分辨率 14 | - ❎ 颜色 15 | - ❎ 热门列表 16 | - ❎ top日期选项 17 | 18 | ## 使用 19 | 20 | - 默认下载位置为用户的c盘图库有需要可以自行修改 -------------------------------------------------------------------------------- /auto-imports.d.ts: -------------------------------------------------------------------------------- 1 | /* eslint-disable */ 2 | /* prettier-ignore */ 3 | // @ts-nocheck 4 | // noinspection JSUnusedGlobalSymbols 5 | // Generated by unplugin-auto-import 6 | export {} 7 | declare global { 8 | 9 | } 10 | -------------------------------------------------------------------------------- /components.d.ts: -------------------------------------------------------------------------------- 1 | /* eslint-disable */ 2 | // @ts-nocheck 3 | // Generated by unplugin-vue-components 4 | // Read more: https://github.com/vuejs/core/pull/3399 5 | export {} 6 | 7 | /* prettier-ignore */ 8 | declare module 'vue' { 9 | export interface GlobalComponents { 10 | Config: typeof import('./src/components/Config/index.vue')['default'] 11 | Default: typeof import('./src/components/Default/index.vue')['default'] 12 | ElBacktop: typeof import('element-plus/es')['ElBacktop'] 13 | ElButton: typeof import('element-plus/es')['ElButton'] 14 | ElContainer: typeof import('element-plus/es')['ElContainer'] 15 | ElEmpty: typeof import('element-plus/es')['ElEmpty'] 16 | ElForm: typeof import('element-plus/es')['ElForm'] 17 | ElFormItem: typeof import('element-plus/es')['ElFormItem'] 18 | ElHeader: typeof import('element-plus/es')['ElHeader'] 19 | ElIcon: typeof import('element-plus/es')['ElIcon'] 20 | ElImage: typeof import('element-plus/es')['ElImage'] 21 | ElInput: typeof import('element-plus/es')['ElInput'] 22 | ElMain: typeof import('element-plus/es')['ElMain'] 23 | ElMenu: typeof import('element-plus/es')['ElMenu'] 24 | ElMenuItem: typeof import('element-plus/es')['ElMenuItem'] 25 | ElTooltip: typeof import('element-plus/es')['ElTooltip'] 26 | Home: typeof import('./src/components/Home/index.vue')['default'] 27 | Hot: typeof import('./src/components/Hot/index.vue')['default'] 28 | Index: typeof import('./src/components/Index/index.vue')['default'] 29 | Random: typeof import('./src/components/Random/index.vue')['default'] 30 | RouterLink: typeof import('vue-router')['RouterLink'] 31 | RouterView: typeof import('vue-router')['RouterView'] 32 | Top: typeof import('./src/components/Top/index.vue')['default'] 33 | } 34 | export interface ComponentCustomProperties { 35 | vInfiniteScroll: typeof import('element-plus/es')['ElInfiniteScroll'] 36 | vLoading: typeof import('element-plus/es')['ElLoadingDirective'] 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | wallhaven 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 21 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "wallhaven_rs", 3 | "private": true, 4 | "version": "0.0.0", 5 | "type": "module", 6 | "scripts": { 7 | "dev": "vite", 8 | "build": "vue-tsc --noEmit && vite build", 9 | "preview": "vite preview", 10 | "tauri": "tauri" 11 | }, 12 | "dependencies": { 13 | "@element-plus/icons-vue": "^2.3.1", 14 | "@tauri-apps/api": "^1", 15 | "element-plus": "^2.7.3", 16 | "vue": "^3.3.4", 17 | "vue-router": "^4.3.2" 18 | }, 19 | "devDependencies": { 20 | "@tauri-apps/cli": "^1", 21 | "@vitejs/plugin-vue": "^5.0.4", 22 | "sass": "^1.77.2", 23 | "typescript": "^5.0.2", 24 | "unplugin-auto-import": "^0.17.6", 25 | "unplugin-vue-components": "^0.27.0", 26 | "vite": "^5.0.0", 27 | "vue-tsc": "^1.8.5" 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '6.1' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | dependencies: 8 | '@element-plus/icons-vue': 9 | specifier: ^2.3.1 10 | version: 2.3.1(vue@3.3.4) 11 | '@tauri-apps/api': 12 | specifier: ^1 13 | version: 1.0.0 14 | element-plus: 15 | specifier: ^2.7.3 16 | version: 2.7.3(vue@3.3.4) 17 | vue: 18 | specifier: ^3.3.4 19 | version: 3.3.4 20 | vue-router: 21 | specifier: ^4.3.2 22 | version: 4.3.2(vue@3.3.4) 23 | 24 | devDependencies: 25 | '@tauri-apps/cli': 26 | specifier: ^1 27 | version: 1.0.0 28 | '@vitejs/plugin-vue': 29 | specifier: ^5.0.4 30 | version: 5.0.4(vite@5.0.0)(vue@3.3.4) 31 | sass: 32 | specifier: ^1.77.2 33 | version: 1.77.2 34 | typescript: 35 | specifier: ^5.0.2 36 | version: 5.0.2 37 | unplugin-auto-import: 38 | specifier: ^0.17.6 39 | version: 0.17.6 40 | unplugin-vue-components: 41 | specifier: ^0.27.0 42 | version: 0.27.0(vue@3.3.4) 43 | vite: 44 | specifier: ^5.0.0 45 | version: 5.0.0(sass@1.77.2) 46 | vue-tsc: 47 | specifier: ^1.8.5 48 | version: 1.8.5(typescript@5.0.2) 49 | 50 | packages: 51 | 52 | /@antfu/utils@0.7.8: 53 | resolution: {integrity: sha512-rWQkqXRESdjXtc+7NRfK9lASQjpXJu1ayp7qi1d23zZorY+wBHVLHHoVcMsEnkqEBWTFqbztO7/QdJFzyEcLTg==} 54 | dev: true 55 | 56 | /@babel/helper-string-parser@7.24.1: 57 | resolution: {integrity: sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==} 58 | engines: {node: '>=6.9.0'} 59 | 60 | /@babel/helper-validator-identifier@7.24.5: 61 | resolution: {integrity: sha512-3q93SSKX2TWCG30M2G2kwaKeTYgEUp5Snjuj8qm729SObL6nbtUldAi37qbxkD5gg3xnBio+f9nqpSepGZMvxA==} 62 | engines: {node: '>=6.9.0'} 63 | 64 | /@babel/parser@7.24.5: 65 | resolution: {integrity: sha512-EOv5IK8arwh3LI47dz1b0tKUb/1uhHAnHJOrjgtQMIpu1uXd9mlFrJg9IUgGUgZ41Ch0K8REPTYpO7B76b4vJg==} 66 | engines: {node: '>=6.0.0'} 67 | hasBin: true 68 | dependencies: 69 | '@babel/types': 7.24.5 70 | 71 | /@babel/types@7.24.5: 72 | resolution: {integrity: sha512-6mQNsaLeXTw0nxYUYu+NSa4Hx4BlF1x1x8/PMFbiR+GBSr+2DkECc69b8hgy2frEodNcvPffeH8YfWd3LI6jhQ==} 73 | engines: {node: '>=6.9.0'} 74 | dependencies: 75 | '@babel/helper-string-parser': 7.24.1 76 | '@babel/helper-validator-identifier': 7.24.5 77 | to-fast-properties: 2.0.0 78 | 79 | /@ctrl/tinycolor@3.6.1: 80 | resolution: {integrity: sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==} 81 | engines: {node: '>=10'} 82 | dev: false 83 | 84 | /@element-plus/icons-vue@2.3.1(vue@3.3.4): 85 | resolution: {integrity: sha512-XxVUZv48RZAd87ucGS48jPf6pKu0yV5UCg9f4FFwtrYxXOwWuVJo6wOvSLKEoMQKjv8GsX/mhP6UsC1lRwbUWg==} 86 | peerDependencies: 87 | vue: ^3.2.0 88 | dependencies: 89 | vue: 3.3.4 90 | dev: false 91 | 92 | /@esbuild/aix-ppc64@0.19.12: 93 | resolution: {integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==} 94 | engines: {node: '>=12'} 95 | cpu: [ppc64] 96 | os: [aix] 97 | requiresBuild: true 98 | dev: true 99 | optional: true 100 | 101 | /@esbuild/android-arm64@0.19.12: 102 | resolution: {integrity: sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==} 103 | engines: {node: '>=12'} 104 | cpu: [arm64] 105 | os: [android] 106 | requiresBuild: true 107 | dev: true 108 | optional: true 109 | 110 | /@esbuild/android-arm@0.19.12: 111 | resolution: {integrity: sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==} 112 | engines: {node: '>=12'} 113 | cpu: [arm] 114 | os: [android] 115 | requiresBuild: true 116 | dev: true 117 | optional: true 118 | 119 | /@esbuild/android-x64@0.19.12: 120 | resolution: {integrity: sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==} 121 | engines: {node: '>=12'} 122 | cpu: [x64] 123 | os: [android] 124 | requiresBuild: true 125 | dev: true 126 | optional: true 127 | 128 | /@esbuild/darwin-arm64@0.19.12: 129 | resolution: {integrity: sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==} 130 | engines: {node: '>=12'} 131 | cpu: [arm64] 132 | os: [darwin] 133 | requiresBuild: true 134 | dev: true 135 | optional: true 136 | 137 | /@esbuild/darwin-x64@0.19.12: 138 | resolution: {integrity: sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==} 139 | engines: {node: '>=12'} 140 | cpu: [x64] 141 | os: [darwin] 142 | requiresBuild: true 143 | dev: true 144 | optional: true 145 | 146 | /@esbuild/freebsd-arm64@0.19.12: 147 | resolution: {integrity: sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==} 148 | engines: {node: '>=12'} 149 | cpu: [arm64] 150 | os: [freebsd] 151 | requiresBuild: true 152 | dev: true 153 | optional: true 154 | 155 | /@esbuild/freebsd-x64@0.19.12: 156 | resolution: {integrity: sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==} 157 | engines: {node: '>=12'} 158 | cpu: [x64] 159 | os: [freebsd] 160 | requiresBuild: true 161 | dev: true 162 | optional: true 163 | 164 | /@esbuild/linux-arm64@0.19.12: 165 | resolution: {integrity: sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==} 166 | engines: {node: '>=12'} 167 | cpu: [arm64] 168 | os: [linux] 169 | requiresBuild: true 170 | dev: true 171 | optional: true 172 | 173 | /@esbuild/linux-arm@0.19.12: 174 | resolution: {integrity: sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==} 175 | engines: {node: '>=12'} 176 | cpu: [arm] 177 | os: [linux] 178 | requiresBuild: true 179 | dev: true 180 | optional: true 181 | 182 | /@esbuild/linux-ia32@0.19.12: 183 | resolution: {integrity: sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==} 184 | engines: {node: '>=12'} 185 | cpu: [ia32] 186 | os: [linux] 187 | requiresBuild: true 188 | dev: true 189 | optional: true 190 | 191 | /@esbuild/linux-loong64@0.19.12: 192 | resolution: {integrity: sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==} 193 | engines: {node: '>=12'} 194 | cpu: [loong64] 195 | os: [linux] 196 | requiresBuild: true 197 | dev: true 198 | optional: true 199 | 200 | /@esbuild/linux-mips64el@0.19.12: 201 | resolution: {integrity: sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==} 202 | engines: {node: '>=12'} 203 | cpu: [mips64el] 204 | os: [linux] 205 | requiresBuild: true 206 | dev: true 207 | optional: true 208 | 209 | /@esbuild/linux-ppc64@0.19.12: 210 | resolution: {integrity: sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==} 211 | engines: {node: '>=12'} 212 | cpu: [ppc64] 213 | os: [linux] 214 | requiresBuild: true 215 | dev: true 216 | optional: true 217 | 218 | /@esbuild/linux-riscv64@0.19.12: 219 | resolution: {integrity: sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==} 220 | engines: {node: '>=12'} 221 | cpu: [riscv64] 222 | os: [linux] 223 | requiresBuild: true 224 | dev: true 225 | optional: true 226 | 227 | /@esbuild/linux-s390x@0.19.12: 228 | resolution: {integrity: sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==} 229 | engines: {node: '>=12'} 230 | cpu: [s390x] 231 | os: [linux] 232 | requiresBuild: true 233 | dev: true 234 | optional: true 235 | 236 | /@esbuild/linux-x64@0.19.12: 237 | resolution: {integrity: sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==} 238 | engines: {node: '>=12'} 239 | cpu: [x64] 240 | os: [linux] 241 | requiresBuild: true 242 | dev: true 243 | optional: true 244 | 245 | /@esbuild/netbsd-x64@0.19.12: 246 | resolution: {integrity: sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==} 247 | engines: {node: '>=12'} 248 | cpu: [x64] 249 | os: [netbsd] 250 | requiresBuild: true 251 | dev: true 252 | optional: true 253 | 254 | /@esbuild/openbsd-x64@0.19.12: 255 | resolution: {integrity: sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==} 256 | engines: {node: '>=12'} 257 | cpu: [x64] 258 | os: [openbsd] 259 | requiresBuild: true 260 | dev: true 261 | optional: true 262 | 263 | /@esbuild/sunos-x64@0.19.12: 264 | resolution: {integrity: sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==} 265 | engines: {node: '>=12'} 266 | cpu: [x64] 267 | os: [sunos] 268 | requiresBuild: true 269 | dev: true 270 | optional: true 271 | 272 | /@esbuild/win32-arm64@0.19.12: 273 | resolution: {integrity: sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==} 274 | engines: {node: '>=12'} 275 | cpu: [arm64] 276 | os: [win32] 277 | requiresBuild: true 278 | dev: true 279 | optional: true 280 | 281 | /@esbuild/win32-ia32@0.19.12: 282 | resolution: {integrity: sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==} 283 | engines: {node: '>=12'} 284 | cpu: [ia32] 285 | os: [win32] 286 | requiresBuild: true 287 | dev: true 288 | optional: true 289 | 290 | /@esbuild/win32-x64@0.19.12: 291 | resolution: {integrity: sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==} 292 | engines: {node: '>=12'} 293 | cpu: [x64] 294 | os: [win32] 295 | requiresBuild: true 296 | dev: true 297 | optional: true 298 | 299 | /@floating-ui/core@1.6.2: 300 | resolution: {integrity: sha512-+2XpQV9LLZeanU4ZevzRnGFg2neDeKHgFLjP6YLW+tly0IvrhqT4u8enLGjLH3qeh85g19xY5rsAusfwTdn5lg==} 301 | dependencies: 302 | '@floating-ui/utils': 0.2.2 303 | dev: false 304 | 305 | /@floating-ui/dom@1.6.5: 306 | resolution: {integrity: sha512-Nsdud2X65Dz+1RHjAIP0t8z5e2ff/IRbei6BqFrl1urT8sDVzM1HMQ+R0XcU5ceRfyO3I6ayeqIfh+6Wb8LGTw==} 307 | dependencies: 308 | '@floating-ui/core': 1.6.2 309 | '@floating-ui/utils': 0.2.2 310 | dev: false 311 | 312 | /@floating-ui/utils@0.2.2: 313 | resolution: {integrity: sha512-J4yDIIthosAsRZ5CPYP/jQvUAQtlZTTD/4suA08/FEnlxqW3sKS9iAhgsa9VYLZ6vDHn/ixJgIqRQPotoBjxIw==} 314 | dev: false 315 | 316 | /@jridgewell/sourcemap-codec@1.4.15: 317 | resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} 318 | 319 | /@nodelib/fs.scandir@2.1.5: 320 | resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} 321 | engines: {node: '>= 8'} 322 | dependencies: 323 | '@nodelib/fs.stat': 2.0.5 324 | run-parallel: 1.2.0 325 | dev: true 326 | 327 | /@nodelib/fs.stat@2.0.5: 328 | resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} 329 | engines: {node: '>= 8'} 330 | dev: true 331 | 332 | /@nodelib/fs.walk@1.2.8: 333 | resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} 334 | engines: {node: '>= 8'} 335 | dependencies: 336 | '@nodelib/fs.scandir': 2.1.5 337 | fastq: 1.17.1 338 | dev: true 339 | 340 | /@rollup/pluginutils@5.1.0: 341 | resolution: {integrity: sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==} 342 | engines: {node: '>=14.0.0'} 343 | peerDependencies: 344 | rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 345 | peerDependenciesMeta: 346 | rollup: 347 | optional: true 348 | dependencies: 349 | '@types/estree': 1.0.5 350 | estree-walker: 2.0.2 351 | picomatch: 2.3.1 352 | dev: true 353 | 354 | /@rollup/rollup-android-arm-eabi@4.17.2: 355 | resolution: {integrity: sha512-NM0jFxY8bB8QLkoKxIQeObCaDlJKewVlIEkuyYKm5An1tdVZ966w2+MPQ2l8LBZLjR+SgyV+nRkTIunzOYBMLQ==} 356 | cpu: [arm] 357 | os: [android] 358 | requiresBuild: true 359 | dev: true 360 | optional: true 361 | 362 | /@rollup/rollup-android-arm64@4.17.2: 363 | resolution: {integrity: sha512-yeX/Usk7daNIVwkq2uGoq2BYJKZY1JfyLTaHO/jaiSwi/lsf8fTFoQW/n6IdAsx5tx+iotu2zCJwz8MxI6D/Bw==} 364 | cpu: [arm64] 365 | os: [android] 366 | requiresBuild: true 367 | dev: true 368 | optional: true 369 | 370 | /@rollup/rollup-darwin-arm64@4.17.2: 371 | resolution: {integrity: sha512-kcMLpE6uCwls023+kknm71ug7MZOrtXo+y5p/tsg6jltpDtgQY1Eq5sGfHcQfb+lfuKwhBmEURDga9N0ol4YPw==} 372 | cpu: [arm64] 373 | os: [darwin] 374 | requiresBuild: true 375 | dev: true 376 | optional: true 377 | 378 | /@rollup/rollup-darwin-x64@4.17.2: 379 | resolution: {integrity: sha512-AtKwD0VEx0zWkL0ZjixEkp5tbNLzX+FCqGG1SvOu993HnSz4qDI6S4kGzubrEJAljpVkhRSlg5bzpV//E6ysTQ==} 380 | cpu: [x64] 381 | os: [darwin] 382 | requiresBuild: true 383 | dev: true 384 | optional: true 385 | 386 | /@rollup/rollup-linux-arm-gnueabihf@4.17.2: 387 | resolution: {integrity: sha512-3reX2fUHqN7sffBNqmEyMQVj/CKhIHZd4y631duy0hZqI8Qoqf6lTtmAKvJFYa6bhU95B1D0WgzHkmTg33In0A==} 388 | cpu: [arm] 389 | os: [linux] 390 | libc: [glibc] 391 | requiresBuild: true 392 | dev: true 393 | optional: true 394 | 395 | /@rollup/rollup-linux-arm-musleabihf@4.17.2: 396 | resolution: {integrity: sha512-uSqpsp91mheRgw96xtyAGP9FW5ChctTFEoXP0r5FAzj/3ZRv3Uxjtc7taRQSaQM/q85KEKjKsZuiZM3GyUivRg==} 397 | cpu: [arm] 398 | os: [linux] 399 | libc: [musl] 400 | requiresBuild: true 401 | dev: true 402 | optional: true 403 | 404 | /@rollup/rollup-linux-arm64-gnu@4.17.2: 405 | resolution: {integrity: sha512-EMMPHkiCRtE8Wdk3Qhtciq6BndLtstqZIroHiiGzB3C5LDJmIZcSzVtLRbwuXuUft1Cnv+9fxuDtDxz3k3EW2A==} 406 | cpu: [arm64] 407 | os: [linux] 408 | libc: [glibc] 409 | requiresBuild: true 410 | dev: true 411 | optional: true 412 | 413 | /@rollup/rollup-linux-arm64-musl@4.17.2: 414 | resolution: {integrity: sha512-NMPylUUZ1i0z/xJUIx6VUhISZDRT+uTWpBcjdv0/zkp7b/bQDF+NfnfdzuTiB1G6HTodgoFa93hp0O1xl+/UbA==} 415 | cpu: [arm64] 416 | os: [linux] 417 | libc: [musl] 418 | requiresBuild: true 419 | dev: true 420 | optional: true 421 | 422 | /@rollup/rollup-linux-powerpc64le-gnu@4.17.2: 423 | resolution: {integrity: sha512-T19My13y8uYXPw/L/k0JYaX1fJKFT/PWdXiHr8mTbXWxjVF1t+8Xl31DgBBvEKclw+1b00Chg0hxE2O7bTG7GQ==} 424 | cpu: [ppc64] 425 | os: [linux] 426 | libc: [glibc] 427 | requiresBuild: true 428 | dev: true 429 | optional: true 430 | 431 | /@rollup/rollup-linux-riscv64-gnu@4.17.2: 432 | resolution: {integrity: sha512-BOaNfthf3X3fOWAB+IJ9kxTgPmMqPPH5f5k2DcCsRrBIbWnaJCgX2ll77dV1TdSy9SaXTR5iDXRL8n7AnoP5cg==} 433 | cpu: [riscv64] 434 | os: [linux] 435 | libc: [glibc] 436 | requiresBuild: true 437 | dev: true 438 | optional: true 439 | 440 | /@rollup/rollup-linux-s390x-gnu@4.17.2: 441 | resolution: {integrity: sha512-W0UP/x7bnn3xN2eYMql2T/+wpASLE5SjObXILTMPUBDB/Fg/FxC+gX4nvCfPBCbNhz51C+HcqQp2qQ4u25ok6g==} 442 | cpu: [s390x] 443 | os: [linux] 444 | libc: [glibc] 445 | requiresBuild: true 446 | dev: true 447 | optional: true 448 | 449 | /@rollup/rollup-linux-x64-gnu@4.17.2: 450 | resolution: {integrity: sha512-Hy7pLwByUOuyaFC6mAr7m+oMC+V7qyifzs/nW2OJfC8H4hbCzOX07Ov0VFk/zP3kBsELWNFi7rJtgbKYsav9QQ==} 451 | cpu: [x64] 452 | os: [linux] 453 | libc: [glibc] 454 | requiresBuild: true 455 | dev: true 456 | optional: true 457 | 458 | /@rollup/rollup-linux-x64-musl@4.17.2: 459 | resolution: {integrity: sha512-h1+yTWeYbRdAyJ/jMiVw0l6fOOm/0D1vNLui9iPuqgRGnXA0u21gAqOyB5iHjlM9MMfNOm9RHCQ7zLIzT0x11Q==} 460 | cpu: [x64] 461 | os: [linux] 462 | libc: [musl] 463 | requiresBuild: true 464 | dev: true 465 | optional: true 466 | 467 | /@rollup/rollup-win32-arm64-msvc@4.17.2: 468 | resolution: {integrity: sha512-tmdtXMfKAjy5+IQsVtDiCfqbynAQE/TQRpWdVataHmhMb9DCoJxp9vLcCBjEQWMiUYxO1QprH/HbY9ragCEFLA==} 469 | cpu: [arm64] 470 | os: [win32] 471 | requiresBuild: true 472 | dev: true 473 | optional: true 474 | 475 | /@rollup/rollup-win32-ia32-msvc@4.17.2: 476 | resolution: {integrity: sha512-7II/QCSTAHuE5vdZaQEwJq2ZACkBpQDOmQsE6D6XUbnBHW8IAhm4eTufL6msLJorzrHDFv3CF8oCA/hSIRuZeQ==} 477 | cpu: [ia32] 478 | os: [win32] 479 | requiresBuild: true 480 | dev: true 481 | optional: true 482 | 483 | /@rollup/rollup-win32-x64-msvc@4.17.2: 484 | resolution: {integrity: sha512-TGGO7v7qOq4CYmSBVEYpI1Y5xDuCEnbVC5Vth8mOsW0gDSzxNrVERPc790IGHsrT2dQSimgMr9Ub3Y1Jci5/8w==} 485 | cpu: [x64] 486 | os: [win32] 487 | requiresBuild: true 488 | dev: true 489 | optional: true 490 | 491 | /@sxzz/popperjs-es@2.11.7: 492 | resolution: {integrity: sha512-Ccy0NlLkzr0Ex2FKvh2X+OyERHXJ88XJ1MXtsI9y9fGexlaXaVTPzBCRBwIxFkORuOb+uBqeu+RqnpgYTEZRUQ==} 493 | dev: false 494 | 495 | /@tauri-apps/api@1.0.0: 496 | resolution: {integrity: sha512-sPnq8/WQumCnyHERTeqKQiryRoM8X4ImMT7K+BJ3zT7bmp/n5162fZS/ZqYIFxKHgQqzwWqT7C96Sb0/CL7WsA==} 497 | engines: {node: '>= 12.22.0', npm: '>= 6.6.0', yarn: '>= 1.19.1'} 498 | dependencies: 499 | type-fest: 2.13.1 500 | dev: false 501 | 502 | /@tauri-apps/cli-darwin-arm64@1.0.0: 503 | resolution: {integrity: sha512-0ryomgLjdpylXypMPVXLU3PZCde3Sw5nwN4coUhBcHPBLFRb8QPet+nweVK/HiZ3mxg8WeIazvpx2s8hS0l2GQ==} 504 | engines: {node: '>= 10'} 505 | cpu: [arm64] 506 | os: [darwin] 507 | requiresBuild: true 508 | dev: true 509 | optional: true 510 | 511 | /@tauri-apps/cli-darwin-x64@1.0.0: 512 | resolution: {integrity: sha512-oejvYUT4dEfzBi+FWMj+CMz4cZ6C2gEFHrUtKVLdTXr8Flj5UTwdB1YPGQjiOqk73LOI7cB/vXxb9DZT+Lrxgg==} 513 | engines: {node: '>= 10'} 514 | cpu: [x64] 515 | os: [darwin] 516 | requiresBuild: true 517 | dev: true 518 | optional: true 519 | 520 | /@tauri-apps/cli-linux-arm-gnueabihf@1.0.0: 521 | resolution: {integrity: sha512-yAu78v8TeXNx/ETS5F2G2Uw/HX+LQvZkX94zNiqFsAj7snfWI/IqSUM52OBrdh/D0EC9NCdjUJ7Vuo32uxf7tg==} 522 | engines: {node: '>= 10'} 523 | cpu: [arm] 524 | os: [linux] 525 | requiresBuild: true 526 | dev: true 527 | optional: true 528 | 529 | /@tauri-apps/cli-linux-arm64-gnu@1.0.0: 530 | resolution: {integrity: sha512-YFUN/S58AN317njAynzcQ+EHhRsCDXqmp5g9Oiqmcdg1vU7fPWZivVLc1WHz+0037C7JnsX5PtKpNYewP/+Oqw==} 531 | engines: {node: '>= 10'} 532 | cpu: [arm64] 533 | os: [linux] 534 | requiresBuild: true 535 | dev: true 536 | optional: true 537 | 538 | /@tauri-apps/cli-linux-arm64-musl@1.0.0: 539 | resolution: {integrity: sha512-al+TxMGoNVikEvRQfMyYE/mdjUcUNMo5brkCIAb+fL4rWQlAhAnYVzmg/rM8N4nhdXm1MOaYAagQmxr8898dNA==} 540 | engines: {node: '>= 10'} 541 | cpu: [arm64] 542 | os: [linux] 543 | requiresBuild: true 544 | dev: true 545 | optional: true 546 | 547 | /@tauri-apps/cli-linux-x64-gnu@1.0.0: 548 | resolution: {integrity: sha512-KQmYlYyGpn6/2kSl9QivWG6EIepm6PJd57e6IKmYwAyNhLr2XfGl1CLuocUQQgO+jprjT70HXp+MXD0tcB0+Sw==} 549 | engines: {node: '>= 10'} 550 | cpu: [x64] 551 | os: [linux] 552 | requiresBuild: true 553 | dev: true 554 | optional: true 555 | 556 | /@tauri-apps/cli-linux-x64-musl@1.0.0: 557 | resolution: {integrity: sha512-Qpaq5lZz569Aea6jfrRchgfEJaOrfLpCRBATcF8CJFFwVKmfCUcoV+MxbCIW30Zqw5Y06njC/ffa3261AV/ZIQ==} 558 | engines: {node: '>= 10'} 559 | cpu: [x64] 560 | os: [linux] 561 | requiresBuild: true 562 | dev: true 563 | optional: true 564 | 565 | /@tauri-apps/cli-win32-ia32-msvc@1.0.0: 566 | resolution: {integrity: sha512-e2DzFqEMI+s+gv14UupdI91gPxTbUJTbbfQlTHdQlOsTk4HEZTsh+ibAYBcCLAaMRW38NEsFlAUe1lQA0iRu/w==} 567 | engines: {node: '>= 10'} 568 | cpu: [ia32] 569 | os: [win32] 570 | requiresBuild: true 571 | dev: true 572 | optional: true 573 | 574 | /@tauri-apps/cli-win32-x64-msvc@1.0.0: 575 | resolution: {integrity: sha512-lWSs90pJeQX+L31IqIzmRhwLayEeyTh7mga0AxX8G868hvdLtcXCQA/rKoFtGdVLuHAx4+M+CBF5SMYb76xGYA==} 576 | engines: {node: '>= 10'} 577 | cpu: [x64] 578 | os: [win32] 579 | requiresBuild: true 580 | dev: true 581 | optional: true 582 | 583 | /@tauri-apps/cli@1.0.0: 584 | resolution: {integrity: sha512-4eHnk3p0xnCXd9Zel3kLvdiiSURnN98GMFvWUAdirm5AjyOjcx8TIET/jqRYmYKE5yd+LMQqYMUfHRwA6JJUkg==} 585 | engines: {node: '>= 10'} 586 | hasBin: true 587 | optionalDependencies: 588 | '@tauri-apps/cli-darwin-arm64': 1.0.0 589 | '@tauri-apps/cli-darwin-x64': 1.0.0 590 | '@tauri-apps/cli-linux-arm-gnueabihf': 1.0.0 591 | '@tauri-apps/cli-linux-arm64-gnu': 1.0.0 592 | '@tauri-apps/cli-linux-arm64-musl': 1.0.0 593 | '@tauri-apps/cli-linux-x64-gnu': 1.0.0 594 | '@tauri-apps/cli-linux-x64-musl': 1.0.0 595 | '@tauri-apps/cli-win32-ia32-msvc': 1.0.0 596 | '@tauri-apps/cli-win32-x64-msvc': 1.0.0 597 | dev: true 598 | 599 | /@types/estree@1.0.5: 600 | resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} 601 | dev: true 602 | 603 | /@types/lodash-es@4.17.12: 604 | resolution: {integrity: sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==} 605 | dependencies: 606 | '@types/lodash': 4.17.4 607 | dev: false 608 | 609 | /@types/lodash@4.17.4: 610 | resolution: {integrity: sha512-wYCP26ZLxaT3R39kiN2+HcJ4kTd3U1waI/cY7ivWYqFP6pW3ZNpvi6Wd6PHZx7T/t8z0vlkXMg3QYLa7DZ/IJQ==} 611 | dev: false 612 | 613 | /@types/web-bluetooth@0.0.16: 614 | resolution: {integrity: sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ==} 615 | dev: false 616 | 617 | /@vitejs/plugin-vue@5.0.4(vite@5.0.0)(vue@3.3.4): 618 | resolution: {integrity: sha512-WS3hevEszI6CEVEx28F8RjTX97k3KsrcY6kvTg7+Whm5y3oYvcqzVeGCU3hxSAn4uY2CLCkeokkGKpoctccilQ==} 619 | engines: {node: ^18.0.0 || >=20.0.0} 620 | peerDependencies: 621 | vite: ^5.0.0 622 | vue: ^3.2.25 623 | dependencies: 624 | vite: 5.0.0(sass@1.77.2) 625 | vue: 3.3.4 626 | dev: true 627 | 628 | /@volar/language-core@1.9.2: 629 | resolution: {integrity: sha512-9GTes/IUPOl0YoV5RQWhCP5a4EDFFfJZGwZn1xA5ug1FO0G6GOVoJI6tQatujtcQmDOQlOM5/0NewnlumygPkQ==} 630 | dependencies: 631 | '@volar/source-map': 1.9.2 632 | dev: true 633 | 634 | /@volar/source-map@1.9.2: 635 | resolution: {integrity: sha512-rYTvV/HMf2CSRkd6oiVxcjX4rnSxEsVfJmw1KTmD4VTBXlz1+b16VIysQX4+1p/eZd2TyCeFblyylIxbZ+YOGg==} 636 | dependencies: 637 | muggle-string: 0.3.1 638 | dev: true 639 | 640 | /@volar/typescript@1.9.2: 641 | resolution: {integrity: sha512-l4DA+S3ZVOWGACDdRNVSYZ41nuTWOH8OMS/yVeFV2fTmr/IuD37+3wzzGnjIPwCUa0w+fpg8vJPalzYetmlFTQ==} 642 | dependencies: 643 | '@volar/language-core': 1.9.2 644 | dev: true 645 | 646 | /@vue/compiler-core@3.3.4: 647 | resolution: {integrity: sha512-cquyDNvZ6jTbf/+x+AgM2Arrp6G4Dzbb0R64jiG804HRMfRiFXWI6kqUVqZ6ZR0bQhIoQjB4+2bhNtVwndW15g==} 648 | dependencies: 649 | '@babel/parser': 7.24.5 650 | '@vue/shared': 3.3.4 651 | estree-walker: 2.0.2 652 | source-map-js: 1.2.0 653 | 654 | /@vue/compiler-core@3.4.27: 655 | resolution: {integrity: sha512-E+RyqY24KnyDXsCuQrI+mlcdW3ALND6U7Gqa/+bVwbcpcR3BRRIckFoz7Qyd4TTlnugtwuI7YgjbvsLmxb+yvg==} 656 | dependencies: 657 | '@babel/parser': 7.24.5 658 | '@vue/shared': 3.4.27 659 | entities: 4.5.0 660 | estree-walker: 2.0.2 661 | source-map-js: 1.2.0 662 | dev: true 663 | 664 | /@vue/compiler-dom@3.3.4: 665 | resolution: {integrity: sha512-wyM+OjOVpuUukIq6p5+nwHYtj9cFroz9cwkfmP9O1nzH68BenTTv0u7/ndggT8cIQlnBeOo6sUT/gvHcIkLA5w==} 666 | dependencies: 667 | '@vue/compiler-core': 3.3.4 668 | '@vue/shared': 3.3.4 669 | 670 | /@vue/compiler-dom@3.4.27: 671 | resolution: {integrity: sha512-kUTvochG/oVgE1w5ViSr3KUBh9X7CWirebA3bezTbB5ZKBQZwR2Mwj9uoSKRMFcz4gSMzzLXBPD6KpCLb9nvWw==} 672 | dependencies: 673 | '@vue/compiler-core': 3.4.27 674 | '@vue/shared': 3.4.27 675 | dev: true 676 | 677 | /@vue/compiler-sfc@3.3.4: 678 | resolution: {integrity: sha512-6y/d8uw+5TkCuzBkgLS0v3lSM3hJDntFEiUORM11pQ/hKvkhSKZrXW6i69UyXlJQisJxuUEJKAWEqWbWsLeNKQ==} 679 | dependencies: 680 | '@babel/parser': 7.24.5 681 | '@vue/compiler-core': 3.3.4 682 | '@vue/compiler-dom': 3.3.4 683 | '@vue/compiler-ssr': 3.3.4 684 | '@vue/reactivity-transform': 3.3.4 685 | '@vue/shared': 3.3.4 686 | estree-walker: 2.0.2 687 | magic-string: 0.30.10 688 | postcss: 8.4.38 689 | source-map-js: 1.2.0 690 | 691 | /@vue/compiler-ssr@3.3.4: 692 | resolution: {integrity: sha512-m0v6oKpup2nMSehwA6Uuu+j+wEwcy7QmwMkVNVfrV9P2qE5KshC6RwOCq8fjGS/Eak/uNb8AaWekfiXxbBB6gQ==} 693 | dependencies: 694 | '@vue/compiler-dom': 3.3.4 695 | '@vue/shared': 3.3.4 696 | 697 | /@vue/devtools-api@6.6.1: 698 | resolution: {integrity: sha512-LgPscpE3Vs0x96PzSSB4IGVSZXZBZHpfxs+ZA1d+VEPwHdOXowy/Y2CsvCAIFrf+ssVU1pD1jidj505EpUnfbA==} 699 | dev: false 700 | 701 | /@vue/language-core@1.8.5(typescript@5.0.2): 702 | resolution: {integrity: sha512-DKQNiNQzNV7nrkZQujvjfX73zqKdj2+KoM4YeKl+ft3f+crO3JB4ycPnmgaRMNX/ULJootdQPGHKFRl5cXxwaw==} 703 | peerDependencies: 704 | typescript: '*' 705 | peerDependenciesMeta: 706 | typescript: 707 | optional: true 708 | dependencies: 709 | '@volar/language-core': 1.9.2 710 | '@volar/source-map': 1.9.2 711 | '@vue/compiler-dom': 3.4.27 712 | '@vue/reactivity': 3.4.27 713 | '@vue/shared': 3.4.27 714 | minimatch: 9.0.4 715 | muggle-string: 0.3.1 716 | typescript: 5.0.2 717 | vue-template-compiler: 2.7.16 718 | dev: true 719 | 720 | /@vue/reactivity-transform@3.3.4: 721 | resolution: {integrity: sha512-MXgwjako4nu5WFLAjpBnCj/ieqcjE2aJBINUNQzkZQfzIZA4xn+0fV1tIYBJvvva3N3OvKGofRLvQIwEQPpaXw==} 722 | dependencies: 723 | '@babel/parser': 7.24.5 724 | '@vue/compiler-core': 3.3.4 725 | '@vue/shared': 3.3.4 726 | estree-walker: 2.0.2 727 | magic-string: 0.30.10 728 | 729 | /@vue/reactivity@3.3.4: 730 | resolution: {integrity: sha512-kLTDLwd0B1jG08NBF3R5rqULtv/f8x3rOFByTDz4J53ttIQEDmALqKqXY0J+XQeN0aV2FBxY8nJDf88yvOPAqQ==} 731 | dependencies: 732 | '@vue/shared': 3.3.4 733 | 734 | /@vue/reactivity@3.4.27: 735 | resolution: {integrity: sha512-kK0g4NknW6JX2yySLpsm2jlunZJl2/RJGZ0H9ddHdfBVHcNzxmQ0sS0b09ipmBoQpY8JM2KmUw+a6sO8Zo+zIA==} 736 | dependencies: 737 | '@vue/shared': 3.4.27 738 | dev: true 739 | 740 | /@vue/runtime-core@3.3.4: 741 | resolution: {integrity: sha512-R+bqxMN6pWO7zGI4OMlmvePOdP2c93GsHFM/siJI7O2nxFRzj55pLwkpCedEY+bTMgp5miZ8CxfIZo3S+gFqvA==} 742 | dependencies: 743 | '@vue/reactivity': 3.3.4 744 | '@vue/shared': 3.3.4 745 | 746 | /@vue/runtime-dom@3.3.4: 747 | resolution: {integrity: sha512-Aj5bTJ3u5sFsUckRghsNjVTtxZQ1OyMWCr5dZRAPijF/0Vy4xEoRCwLyHXcj4D0UFbJ4lbx3gPTgg06K/GnPnQ==} 748 | dependencies: 749 | '@vue/runtime-core': 3.3.4 750 | '@vue/shared': 3.3.4 751 | csstype: 3.1.3 752 | 753 | /@vue/server-renderer@3.3.4(vue@3.3.4): 754 | resolution: {integrity: sha512-Q6jDDzR23ViIb67v+vM1Dqntu+HUexQcsWKhhQa4ARVzxOY2HbC7QRW/ggkDBd5BU+uM1sV6XOAP0b216o34JQ==} 755 | peerDependencies: 756 | vue: 3.3.4 757 | dependencies: 758 | '@vue/compiler-ssr': 3.3.4 759 | '@vue/shared': 3.3.4 760 | vue: 3.3.4 761 | 762 | /@vue/shared@3.3.4: 763 | resolution: {integrity: sha512-7OjdcV8vQ74eiz1TZLzZP4JwqM5fA94K6yntPS5Z25r9HDuGNzaGdgvwKYq6S+MxwF0TFRwe50fIR/MYnakdkQ==} 764 | 765 | /@vue/shared@3.4.27: 766 | resolution: {integrity: sha512-DL3NmY2OFlqmYYrzp39yi3LDkKxa5vZVwxWdQ3rG0ekuWscHraeIbnI8t+aZK7qhYqEqWKTUdijadunb9pnrgA==} 767 | dev: true 768 | 769 | /@vue/typescript@1.8.5(typescript@5.0.2): 770 | resolution: {integrity: sha512-domFBbNr3PEcjGBeB+cmgUM3cI6pJsJezguIUKZ1rphkfIkICyoMjCd3TitoP32yo2KABLiaXcGFzgFfQf6B3w==} 771 | dependencies: 772 | '@volar/typescript': 1.9.2 773 | '@vue/language-core': 1.8.5(typescript@5.0.2) 774 | transitivePeerDependencies: 775 | - typescript 776 | dev: true 777 | 778 | /@vueuse/core@9.13.0(vue@3.3.4): 779 | resolution: {integrity: sha512-pujnclbeHWxxPRqXWmdkKV5OX4Wk4YeK7wusHqRwU0Q7EFusHoqNA/aPhB6KCh9hEqJkLAJo7bb0Lh9b+OIVzw==} 780 | dependencies: 781 | '@types/web-bluetooth': 0.0.16 782 | '@vueuse/metadata': 9.13.0 783 | '@vueuse/shared': 9.13.0(vue@3.3.4) 784 | vue-demi: 0.14.7(vue@3.3.4) 785 | transitivePeerDependencies: 786 | - '@vue/composition-api' 787 | - vue 788 | dev: false 789 | 790 | /@vueuse/metadata@9.13.0: 791 | resolution: {integrity: sha512-gdU7TKNAUVlXXLbaF+ZCfte8BjRJQWPCa2J55+7/h+yDtzw3vOoGQDRXzI6pyKyo6bXFT5/QoPE4hAknExjRLQ==} 792 | dev: false 793 | 794 | /@vueuse/shared@9.13.0(vue@3.3.4): 795 | resolution: {integrity: sha512-UrnhU+Cnufu4S6JLCPZnkWh0WwZGUp72ktOF2DFptMlOs3TOdVv8xJN53zhHGARmVOsz5KqOls09+J1NR6sBKw==} 796 | dependencies: 797 | vue-demi: 0.14.7(vue@3.3.4) 798 | transitivePeerDependencies: 799 | - '@vue/composition-api' 800 | - vue 801 | dev: false 802 | 803 | /acorn@8.11.3: 804 | resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} 805 | engines: {node: '>=0.4.0'} 806 | hasBin: true 807 | dev: true 808 | 809 | /anymatch@3.1.3: 810 | resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} 811 | engines: {node: '>= 8'} 812 | dependencies: 813 | normalize-path: 3.0.0 814 | picomatch: 2.3.1 815 | dev: true 816 | 817 | /async-validator@4.2.5: 818 | resolution: {integrity: sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==} 819 | dev: false 820 | 821 | /balanced-match@1.0.2: 822 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 823 | dev: true 824 | 825 | /binary-extensions@2.3.0: 826 | resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} 827 | engines: {node: '>=8'} 828 | dev: true 829 | 830 | /brace-expansion@2.0.1: 831 | resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} 832 | dependencies: 833 | balanced-match: 1.0.2 834 | dev: true 835 | 836 | /braces@3.0.2: 837 | resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} 838 | engines: {node: '>=8'} 839 | dependencies: 840 | fill-range: 7.0.1 841 | dev: true 842 | 843 | /chokidar@3.6.0: 844 | resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} 845 | engines: {node: '>= 8.10.0'} 846 | dependencies: 847 | anymatch: 3.1.3 848 | braces: 3.0.2 849 | glob-parent: 5.1.2 850 | is-binary-path: 2.1.0 851 | is-glob: 4.0.3 852 | normalize-path: 3.0.0 853 | readdirp: 3.6.0 854 | optionalDependencies: 855 | fsevents: 2.3.3 856 | dev: true 857 | 858 | /confbox@0.1.7: 859 | resolution: {integrity: sha512-uJcB/FKZtBMCJpK8MQji6bJHgu1tixKPxRLeGkNzBoOZzpnZUJm0jm2/sBDWcuBx1dYgxV4JU+g5hmNxCyAmdA==} 860 | dev: true 861 | 862 | /csstype@3.1.3: 863 | resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} 864 | 865 | /dayjs@1.11.11: 866 | resolution: {integrity: sha512-okzr3f11N6WuqYtZSvm+F776mB41wRZMhKP+hc34YdW+KmtYYK9iqvHSwo2k9FEH3fhGXvOPV6yz2IcSrfRUDg==} 867 | dev: false 868 | 869 | /de-indent@1.0.2: 870 | resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==} 871 | dev: true 872 | 873 | /debug@4.3.4: 874 | resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} 875 | engines: {node: '>=6.0'} 876 | peerDependencies: 877 | supports-color: '*' 878 | peerDependenciesMeta: 879 | supports-color: 880 | optional: true 881 | dependencies: 882 | ms: 2.1.2 883 | dev: true 884 | 885 | /element-plus@2.7.3(vue@3.3.4): 886 | resolution: {integrity: sha512-OaqY1kQ2xzNyRFyge3fzM7jqMwux+464RBEqd+ybRV9xPiGxtgnj/sVK4iEbnKnzQIa9XK03DOIFzoToUhu1DA==} 887 | peerDependencies: 888 | vue: ^3.2.0 889 | dependencies: 890 | '@ctrl/tinycolor': 3.6.1 891 | '@element-plus/icons-vue': 2.3.1(vue@3.3.4) 892 | '@floating-ui/dom': 1.6.5 893 | '@popperjs/core': /@sxzz/popperjs-es@2.11.7 894 | '@types/lodash': 4.17.4 895 | '@types/lodash-es': 4.17.12 896 | '@vueuse/core': 9.13.0(vue@3.3.4) 897 | async-validator: 4.2.5 898 | dayjs: 1.11.11 899 | escape-html: 1.0.3 900 | lodash: 4.17.21 901 | lodash-es: 4.17.21 902 | lodash-unified: 1.0.3(@types/lodash-es@4.17.12)(lodash-es@4.17.21)(lodash@4.17.21) 903 | memoize-one: 6.0.0 904 | normalize-wheel-es: 1.2.0 905 | vue: 3.3.4 906 | transitivePeerDependencies: 907 | - '@vue/composition-api' 908 | dev: false 909 | 910 | /entities@4.5.0: 911 | resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} 912 | engines: {node: '>=0.12'} 913 | dev: true 914 | 915 | /esbuild@0.19.12: 916 | resolution: {integrity: sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==} 917 | engines: {node: '>=12'} 918 | hasBin: true 919 | requiresBuild: true 920 | optionalDependencies: 921 | '@esbuild/aix-ppc64': 0.19.12 922 | '@esbuild/android-arm': 0.19.12 923 | '@esbuild/android-arm64': 0.19.12 924 | '@esbuild/android-x64': 0.19.12 925 | '@esbuild/darwin-arm64': 0.19.12 926 | '@esbuild/darwin-x64': 0.19.12 927 | '@esbuild/freebsd-arm64': 0.19.12 928 | '@esbuild/freebsd-x64': 0.19.12 929 | '@esbuild/linux-arm': 0.19.12 930 | '@esbuild/linux-arm64': 0.19.12 931 | '@esbuild/linux-ia32': 0.19.12 932 | '@esbuild/linux-loong64': 0.19.12 933 | '@esbuild/linux-mips64el': 0.19.12 934 | '@esbuild/linux-ppc64': 0.19.12 935 | '@esbuild/linux-riscv64': 0.19.12 936 | '@esbuild/linux-s390x': 0.19.12 937 | '@esbuild/linux-x64': 0.19.12 938 | '@esbuild/netbsd-x64': 0.19.12 939 | '@esbuild/openbsd-x64': 0.19.12 940 | '@esbuild/sunos-x64': 0.19.12 941 | '@esbuild/win32-arm64': 0.19.12 942 | '@esbuild/win32-ia32': 0.19.12 943 | '@esbuild/win32-x64': 0.19.12 944 | dev: true 945 | 946 | /escape-html@1.0.3: 947 | resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} 948 | dev: false 949 | 950 | /escape-string-regexp@5.0.0: 951 | resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} 952 | engines: {node: '>=12'} 953 | dev: true 954 | 955 | /estree-walker@2.0.2: 956 | resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} 957 | 958 | /estree-walker@3.0.3: 959 | resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} 960 | dependencies: 961 | '@types/estree': 1.0.5 962 | dev: true 963 | 964 | /fast-glob@3.3.2: 965 | resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} 966 | engines: {node: '>=8.6.0'} 967 | dependencies: 968 | '@nodelib/fs.stat': 2.0.5 969 | '@nodelib/fs.walk': 1.2.8 970 | glob-parent: 5.1.2 971 | merge2: 1.4.1 972 | micromatch: 4.0.5 973 | dev: true 974 | 975 | /fastq@1.17.1: 976 | resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} 977 | dependencies: 978 | reusify: 1.0.4 979 | dev: true 980 | 981 | /fill-range@7.0.1: 982 | resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} 983 | engines: {node: '>=8'} 984 | dependencies: 985 | to-regex-range: 5.0.1 986 | dev: true 987 | 988 | /fsevents@2.3.3: 989 | resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} 990 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 991 | os: [darwin] 992 | requiresBuild: true 993 | dev: true 994 | optional: true 995 | 996 | /function-bind@1.1.2: 997 | resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} 998 | dev: true 999 | 1000 | /glob-parent@5.1.2: 1001 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} 1002 | engines: {node: '>= 6'} 1003 | dependencies: 1004 | is-glob: 4.0.3 1005 | dev: true 1006 | 1007 | /hasown@2.0.2: 1008 | resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} 1009 | engines: {node: '>= 0.4'} 1010 | dependencies: 1011 | function-bind: 1.1.2 1012 | dev: true 1013 | 1014 | /he@1.2.0: 1015 | resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} 1016 | hasBin: true 1017 | dev: true 1018 | 1019 | /immutable@4.3.6: 1020 | resolution: {integrity: sha512-Ju0+lEMyzMVZarkTn/gqRpdqd5dOPaz1mCZ0SH3JV6iFw81PldE/PEB1hWVEA288HPt4WXW8O7AWxB10M+03QQ==} 1021 | dev: true 1022 | 1023 | /is-binary-path@2.1.0: 1024 | resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} 1025 | engines: {node: '>=8'} 1026 | dependencies: 1027 | binary-extensions: 2.3.0 1028 | dev: true 1029 | 1030 | /is-core-module@2.13.1: 1031 | resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} 1032 | dependencies: 1033 | hasown: 2.0.2 1034 | dev: true 1035 | 1036 | /is-extglob@2.1.1: 1037 | resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 1038 | engines: {node: '>=0.10.0'} 1039 | dev: true 1040 | 1041 | /is-glob@4.0.3: 1042 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 1043 | engines: {node: '>=0.10.0'} 1044 | dependencies: 1045 | is-extglob: 2.1.1 1046 | dev: true 1047 | 1048 | /is-number@7.0.0: 1049 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 1050 | engines: {node: '>=0.12.0'} 1051 | dev: true 1052 | 1053 | /local-pkg@0.5.0: 1054 | resolution: {integrity: sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==} 1055 | engines: {node: '>=14'} 1056 | dependencies: 1057 | mlly: 1.7.0 1058 | pkg-types: 1.1.1 1059 | dev: true 1060 | 1061 | /lodash-es@4.17.21: 1062 | resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} 1063 | dev: false 1064 | 1065 | /lodash-unified@1.0.3(@types/lodash-es@4.17.12)(lodash-es@4.17.21)(lodash@4.17.21): 1066 | resolution: {integrity: sha512-WK9qSozxXOD7ZJQlpSqOT+om2ZfcT4yO+03FuzAHD0wF6S0l0090LRPDx3vhTTLZ8cFKpBn+IOcVXK6qOcIlfQ==} 1067 | peerDependencies: 1068 | '@types/lodash-es': '*' 1069 | lodash: '*' 1070 | lodash-es: '*' 1071 | dependencies: 1072 | '@types/lodash-es': 4.17.12 1073 | lodash: 4.17.21 1074 | lodash-es: 4.17.21 1075 | dev: false 1076 | 1077 | /lodash@4.17.21: 1078 | resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} 1079 | dev: false 1080 | 1081 | /magic-string@0.30.10: 1082 | resolution: {integrity: sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==} 1083 | dependencies: 1084 | '@jridgewell/sourcemap-codec': 1.4.15 1085 | 1086 | /memoize-one@6.0.0: 1087 | resolution: {integrity: sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==} 1088 | dev: false 1089 | 1090 | /merge2@1.4.1: 1091 | resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} 1092 | engines: {node: '>= 8'} 1093 | dev: true 1094 | 1095 | /micromatch@4.0.5: 1096 | resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} 1097 | engines: {node: '>=8.6'} 1098 | dependencies: 1099 | braces: 3.0.2 1100 | picomatch: 2.3.1 1101 | dev: true 1102 | 1103 | /minimatch@9.0.4: 1104 | resolution: {integrity: sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==} 1105 | engines: {node: '>=16 || 14 >=14.17'} 1106 | dependencies: 1107 | brace-expansion: 2.0.1 1108 | dev: true 1109 | 1110 | /mlly@1.7.0: 1111 | resolution: {integrity: sha512-U9SDaXGEREBYQgfejV97coK0UL1r+qnF2SyO9A3qcI8MzKnsIFKHNVEkrDyNncQTKQQumsasmeq84eNMdBfsNQ==} 1112 | dependencies: 1113 | acorn: 8.11.3 1114 | pathe: 1.1.2 1115 | pkg-types: 1.1.1 1116 | ufo: 1.5.3 1117 | dev: true 1118 | 1119 | /ms@2.1.2: 1120 | resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} 1121 | dev: true 1122 | 1123 | /muggle-string@0.3.1: 1124 | resolution: {integrity: sha512-ckmWDJjphvd/FvZawgygcUeQCxzvohjFO5RxTjj4eq8kw359gFF3E1brjfI+viLMxss5JrHTDRHZvu2/tuy0Qg==} 1125 | dev: true 1126 | 1127 | /nanoid@3.3.7: 1128 | resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} 1129 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 1130 | hasBin: true 1131 | 1132 | /normalize-path@3.0.0: 1133 | resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} 1134 | engines: {node: '>=0.10.0'} 1135 | dev: true 1136 | 1137 | /normalize-wheel-es@1.2.0: 1138 | resolution: {integrity: sha512-Wj7+EJQ8mSuXr2iWfnujrimU35R2W4FAErEyTmJoJ7ucwTn2hOUSsRehMb5RSYkxXGTM7Y9QpvPmp++w5ftoJw==} 1139 | dev: false 1140 | 1141 | /path-parse@1.0.7: 1142 | resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} 1143 | dev: true 1144 | 1145 | /pathe@1.1.2: 1146 | resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} 1147 | dev: true 1148 | 1149 | /picocolors@1.0.1: 1150 | resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} 1151 | 1152 | /picomatch@2.3.1: 1153 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 1154 | engines: {node: '>=8.6'} 1155 | dev: true 1156 | 1157 | /pkg-types@1.1.1: 1158 | resolution: {integrity: sha512-ko14TjmDuQJ14zsotODv7dBlwxKhUKQEhuhmbqo1uCi9BB0Z2alo/wAXg6q1dTR5TyuqYyWhjtfe/Tsh+X28jQ==} 1159 | dependencies: 1160 | confbox: 0.1.7 1161 | mlly: 1.7.0 1162 | pathe: 1.1.2 1163 | dev: true 1164 | 1165 | /postcss@8.4.38: 1166 | resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==} 1167 | engines: {node: ^10 || ^12 || >=14} 1168 | dependencies: 1169 | nanoid: 3.3.7 1170 | picocolors: 1.0.1 1171 | source-map-js: 1.2.0 1172 | 1173 | /queue-microtask@1.2.3: 1174 | resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} 1175 | dev: true 1176 | 1177 | /readdirp@3.6.0: 1178 | resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} 1179 | engines: {node: '>=8.10.0'} 1180 | dependencies: 1181 | picomatch: 2.3.1 1182 | dev: true 1183 | 1184 | /resolve@1.22.8: 1185 | resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} 1186 | hasBin: true 1187 | dependencies: 1188 | is-core-module: 2.13.1 1189 | path-parse: 1.0.7 1190 | supports-preserve-symlinks-flag: 1.0.0 1191 | dev: true 1192 | 1193 | /reusify@1.0.4: 1194 | resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} 1195 | engines: {iojs: '>=1.0.0', node: '>=0.10.0'} 1196 | dev: true 1197 | 1198 | /rollup@4.17.2: 1199 | resolution: {integrity: sha512-/9ClTJPByC0U4zNLowV1tMBe8yMEAxewtR3cUNX5BoEpGH3dQEWpJLr6CLp0fPdYRF/fzVOgvDb1zXuakwF5kQ==} 1200 | engines: {node: '>=18.0.0', npm: '>=8.0.0'} 1201 | hasBin: true 1202 | dependencies: 1203 | '@types/estree': 1.0.5 1204 | optionalDependencies: 1205 | '@rollup/rollup-android-arm-eabi': 4.17.2 1206 | '@rollup/rollup-android-arm64': 4.17.2 1207 | '@rollup/rollup-darwin-arm64': 4.17.2 1208 | '@rollup/rollup-darwin-x64': 4.17.2 1209 | '@rollup/rollup-linux-arm-gnueabihf': 4.17.2 1210 | '@rollup/rollup-linux-arm-musleabihf': 4.17.2 1211 | '@rollup/rollup-linux-arm64-gnu': 4.17.2 1212 | '@rollup/rollup-linux-arm64-musl': 4.17.2 1213 | '@rollup/rollup-linux-powerpc64le-gnu': 4.17.2 1214 | '@rollup/rollup-linux-riscv64-gnu': 4.17.2 1215 | '@rollup/rollup-linux-s390x-gnu': 4.17.2 1216 | '@rollup/rollup-linux-x64-gnu': 4.17.2 1217 | '@rollup/rollup-linux-x64-musl': 4.17.2 1218 | '@rollup/rollup-win32-arm64-msvc': 4.17.2 1219 | '@rollup/rollup-win32-ia32-msvc': 4.17.2 1220 | '@rollup/rollup-win32-x64-msvc': 4.17.2 1221 | fsevents: 2.3.3 1222 | dev: true 1223 | 1224 | /run-parallel@1.2.0: 1225 | resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} 1226 | dependencies: 1227 | queue-microtask: 1.2.3 1228 | dev: true 1229 | 1230 | /sass@1.77.2: 1231 | resolution: {integrity: sha512-eb4GZt1C3avsX3heBNlrc7I09nyT00IUuo4eFhAbeXWU2fvA7oXI53SxODVAA+zgZCk9aunAZgO+losjR3fAwA==} 1232 | engines: {node: '>=14.0.0'} 1233 | hasBin: true 1234 | dependencies: 1235 | chokidar: 3.6.0 1236 | immutable: 4.3.6 1237 | source-map-js: 1.2.0 1238 | dev: true 1239 | 1240 | /scule@1.3.0: 1241 | resolution: {integrity: sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==} 1242 | dev: true 1243 | 1244 | /semver@7.6.2: 1245 | resolution: {integrity: sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==} 1246 | engines: {node: '>=10'} 1247 | hasBin: true 1248 | dev: true 1249 | 1250 | /source-map-js@1.2.0: 1251 | resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} 1252 | engines: {node: '>=0.10.0'} 1253 | 1254 | /strip-literal@1.3.0: 1255 | resolution: {integrity: sha512-PugKzOsyXpArk0yWmUwqOZecSO0GH0bPoctLcqNDH9J04pVW3lflYE0ujElBGTloevcxF5MofAOZ7C5l2b+wLg==} 1256 | dependencies: 1257 | acorn: 8.11.3 1258 | dev: true 1259 | 1260 | /supports-preserve-symlinks-flag@1.0.0: 1261 | resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} 1262 | engines: {node: '>= 0.4'} 1263 | dev: true 1264 | 1265 | /to-fast-properties@2.0.0: 1266 | resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} 1267 | engines: {node: '>=4'} 1268 | 1269 | /to-regex-range@5.0.1: 1270 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 1271 | engines: {node: '>=8.0'} 1272 | dependencies: 1273 | is-number: 7.0.0 1274 | dev: true 1275 | 1276 | /type-fest@2.13.1: 1277 | resolution: {integrity: sha512-hXYyrPFwETT2swFLHeoKtJrvSF/ftG/sA15/8nGaLuaDGfVAaq8DYFpu4yOyV4tzp082WqnTEoMsm3flKMI2FQ==} 1278 | engines: {node: '>=12.20'} 1279 | dev: false 1280 | 1281 | /typescript@5.0.2: 1282 | resolution: {integrity: sha512-wVORMBGO/FAs/++blGNeAVdbNKtIh1rbBL2EyQ1+J9lClJ93KiiKe8PmFIVdXhHcyv44SL9oglmfeSsndo0jRw==} 1283 | engines: {node: '>=12.20'} 1284 | hasBin: true 1285 | dev: true 1286 | 1287 | /ufo@1.5.3: 1288 | resolution: {integrity: sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw==} 1289 | dev: true 1290 | 1291 | /unimport@3.7.1: 1292 | resolution: {integrity: sha512-V9HpXYfsZye5bPPYUgs0Otn3ODS1mDUciaBlXljI4C2fTwfFpvFZRywmlOu943puN9sncxROMZhsZCjNXEpzEQ==} 1293 | dependencies: 1294 | '@rollup/pluginutils': 5.1.0 1295 | acorn: 8.11.3 1296 | escape-string-regexp: 5.0.0 1297 | estree-walker: 3.0.3 1298 | fast-glob: 3.3.2 1299 | local-pkg: 0.5.0 1300 | magic-string: 0.30.10 1301 | mlly: 1.7.0 1302 | pathe: 1.1.2 1303 | pkg-types: 1.1.1 1304 | scule: 1.3.0 1305 | strip-literal: 1.3.0 1306 | unplugin: 1.10.1 1307 | transitivePeerDependencies: 1308 | - rollup 1309 | dev: true 1310 | 1311 | /unplugin-auto-import@0.17.6: 1312 | resolution: {integrity: sha512-dmX0Pex5DzMzVuALkexboOZvh51fL/BD6aoPO7qHoTYGlQp0GRKsREv2KMF1lzYI9SXKQiRxAjwzbQnrFFNydQ==} 1313 | engines: {node: '>=14'} 1314 | peerDependencies: 1315 | '@nuxt/kit': ^3.2.2 1316 | '@vueuse/core': '*' 1317 | peerDependenciesMeta: 1318 | '@nuxt/kit': 1319 | optional: true 1320 | '@vueuse/core': 1321 | optional: true 1322 | dependencies: 1323 | '@antfu/utils': 0.7.8 1324 | '@rollup/pluginutils': 5.1.0 1325 | fast-glob: 3.3.2 1326 | local-pkg: 0.5.0 1327 | magic-string: 0.30.10 1328 | minimatch: 9.0.4 1329 | unimport: 3.7.1 1330 | unplugin: 1.10.1 1331 | transitivePeerDependencies: 1332 | - rollup 1333 | dev: true 1334 | 1335 | /unplugin-vue-components@0.27.0(vue@3.3.4): 1336 | resolution: {integrity: sha512-77eTEy23sQ0UpzGWnZ9I2mY3cnmXwklz4ITcn3JfxjCoX643ghImkiZ4nFm58sxbdVcc4Fo/o4LIoFnlqEqsSg==} 1337 | engines: {node: '>=14'} 1338 | peerDependencies: 1339 | '@babel/parser': ^7.15.8 1340 | '@nuxt/kit': ^3.2.2 1341 | vue: 2 || 3 1342 | peerDependenciesMeta: 1343 | '@babel/parser': 1344 | optional: true 1345 | '@nuxt/kit': 1346 | optional: true 1347 | dependencies: 1348 | '@antfu/utils': 0.7.8 1349 | '@rollup/pluginutils': 5.1.0 1350 | chokidar: 3.6.0 1351 | debug: 4.3.4 1352 | fast-glob: 3.3.2 1353 | local-pkg: 0.5.0 1354 | magic-string: 0.30.10 1355 | minimatch: 9.0.4 1356 | resolve: 1.22.8 1357 | unplugin: 1.10.1 1358 | vue: 3.3.4 1359 | transitivePeerDependencies: 1360 | - rollup 1361 | - supports-color 1362 | dev: true 1363 | 1364 | /unplugin@1.10.1: 1365 | resolution: {integrity: sha512-d6Mhq8RJeGA8UfKCu54Um4lFA0eSaRa3XxdAJg8tIdxbu1ubW0hBCZUL7yI2uGyYCRndvbK8FLHzqy2XKfeMsg==} 1366 | engines: {node: '>=14.0.0'} 1367 | dependencies: 1368 | acorn: 8.11.3 1369 | chokidar: 3.6.0 1370 | webpack-sources: 3.2.3 1371 | webpack-virtual-modules: 0.6.1 1372 | dev: true 1373 | 1374 | /vite@5.0.0(sass@1.77.2): 1375 | resolution: {integrity: sha512-ESJVM59mdyGpsiNAeHQOR/0fqNoOyWPYesFto8FFZugfmhdHx8Fzd8sF3Q/xkVhZsyOxHfdM7ieiVAorI9RjFw==} 1376 | engines: {node: ^18.0.0 || >=20.0.0} 1377 | hasBin: true 1378 | peerDependencies: 1379 | '@types/node': ^18.0.0 || >=20.0.0 1380 | less: '*' 1381 | lightningcss: ^1.21.0 1382 | sass: '*' 1383 | stylus: '*' 1384 | sugarss: '*' 1385 | terser: ^5.4.0 1386 | peerDependenciesMeta: 1387 | '@types/node': 1388 | optional: true 1389 | less: 1390 | optional: true 1391 | lightningcss: 1392 | optional: true 1393 | sass: 1394 | optional: true 1395 | stylus: 1396 | optional: true 1397 | sugarss: 1398 | optional: true 1399 | terser: 1400 | optional: true 1401 | dependencies: 1402 | esbuild: 0.19.12 1403 | postcss: 8.4.38 1404 | rollup: 4.17.2 1405 | sass: 1.77.2 1406 | optionalDependencies: 1407 | fsevents: 2.3.3 1408 | dev: true 1409 | 1410 | /vue-demi@0.14.7(vue@3.3.4): 1411 | resolution: {integrity: sha512-EOG8KXDQNwkJILkx/gPcoL/7vH+hORoBaKgGe+6W7VFMvCYJfmF2dGbvgDroVnI8LU7/kTu8mbjRZGBU1z9NTA==} 1412 | engines: {node: '>=12'} 1413 | hasBin: true 1414 | requiresBuild: true 1415 | peerDependencies: 1416 | '@vue/composition-api': ^1.0.0-rc.1 1417 | vue: ^3.0.0-0 || ^2.6.0 1418 | peerDependenciesMeta: 1419 | '@vue/composition-api': 1420 | optional: true 1421 | dependencies: 1422 | vue: 3.3.4 1423 | dev: false 1424 | 1425 | /vue-router@4.3.2(vue@3.3.4): 1426 | resolution: {integrity: sha512-hKQJ1vDAZ5LVkKEnHhmm1f9pMiWIBNGF5AwU67PdH7TyXCj/a4hTccuUuYCAMgJK6rO/NVYtQIEN3yL8CECa7Q==} 1427 | peerDependencies: 1428 | vue: ^3.2.0 1429 | dependencies: 1430 | '@vue/devtools-api': 6.6.1 1431 | vue: 3.3.4 1432 | dev: false 1433 | 1434 | /vue-template-compiler@2.7.16: 1435 | resolution: {integrity: sha512-AYbUWAJHLGGQM7+cNTELw+KsOG9nl2CnSv467WobS5Cv9uk3wFcnr1Etsz2sEIHEZvw1U+o9mRlEO6QbZvUPGQ==} 1436 | dependencies: 1437 | de-indent: 1.0.2 1438 | he: 1.2.0 1439 | dev: true 1440 | 1441 | /vue-tsc@1.8.5(typescript@5.0.2): 1442 | resolution: {integrity: sha512-Jr8PTghJIwp69MFsEZoADDcv2l+lXA8juyN/5AYA5zxyZNvIHjSbgKgkYIYc1qnihrOyIG1VOnfk4ZE0jqn8bw==} 1443 | hasBin: true 1444 | peerDependencies: 1445 | typescript: '*' 1446 | dependencies: 1447 | '@vue/language-core': 1.8.5(typescript@5.0.2) 1448 | '@vue/typescript': 1.8.5(typescript@5.0.2) 1449 | semver: 7.6.2 1450 | typescript: 5.0.2 1451 | dev: true 1452 | 1453 | /vue@3.3.4: 1454 | resolution: {integrity: sha512-VTyEYn3yvIeY1Py0WaYGZsXnz3y5UnGi62GjVEqvEGPl6nxbOrCXbVOTQWBEJUqAyTUk2uJ5JLVnYJ6ZzGbrSw==} 1455 | dependencies: 1456 | '@vue/compiler-dom': 3.3.4 1457 | '@vue/compiler-sfc': 3.3.4 1458 | '@vue/runtime-dom': 3.3.4 1459 | '@vue/server-renderer': 3.3.4(vue@3.3.4) 1460 | '@vue/shared': 3.3.4 1461 | 1462 | /webpack-sources@3.2.3: 1463 | resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} 1464 | engines: {node: '>=10.13.0'} 1465 | dev: true 1466 | 1467 | /webpack-virtual-modules@0.6.1: 1468 | resolution: {integrity: sha512-poXpCylU7ExuvZK8z+On3kX+S8o/2dQ/SVYueKA0D4WEMXROXgY8Ez50/bQEUmvoSMMrWcrJqCHuhAbsiwg7Dg==} 1469 | dev: true 1470 | -------------------------------------------------------------------------------- /public/main.yml: -------------------------------------------------------------------------------- 1 | # 可选,将显示在 GitHub 存储库的“操作”选项卡中的工作流名称 2 | name: Release CI 3 | 4 | # 指定此工作流的触发器 5 | on: 6 | push: 7 | # 匹配特定标签 (refs/tags) 8 | tags: 9 | - 'v*' # 推送事件匹配 v*, 例如 v1.0,v20.15.10 等来触发工作流 10 | 11 | # 需要运行的作业组合 12 | jobs: 13 | # 任务:创建 release 版本 14 | create-release: 15 | permissions: write-all 16 | runs-on: ubuntu-latest 17 | outputs: 18 | RELEASE_UPLOAD_ID: ${{ steps.create_release.outputs.id }} 19 | 20 | steps: 21 | - uses: actions/checkout@v4 22 | # 查询版本号(tag) 23 | - name: Query version number 24 | id: get_version 25 | shell: bash 26 | run: | 27 | echo "using version tag ${GITHUB_REF:10}" 28 | echo ::set-output name=version::"${GITHUB_REF:10}" 29 | 30 | # 根据查询到的版本号创建 release 31 | - name: Create Release 32 | id: create_release 33 | uses: actions/create-release@v1 34 | env: 35 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 36 | with: 37 | tag_name: '${{ steps.get_version.outputs.VERSION }}' 38 | release_name: 'Wallpapers ${{ steps.get_version.outputs.VERSION }}' 39 | body: 'Release ${{ steps.get_version.outputs.VERSION }}' 40 | 41 | # 编译 Tauri 42 | build-tauri: 43 | needs: create-release 44 | strategy: 45 | fail-fast: false 46 | matrix: 47 | platform: [macos-latest, ubuntu-latest, windows-latest] 48 | 49 | runs-on: ${{ matrix.platform }} 50 | steps: 51 | - uses: actions/checkout@v4 52 | 53 | # 安装 Node.js 54 | - name: Setup node 55 | uses: actions/setup-node@v4 56 | with: 57 | node-version: 16.19.1 58 | # 安装pnpm 59 | - name: setup pnpm 60 | uses: pnpm/action-setup@v4 61 | with: 62 | version: 8.6.1 63 | # 安装 Rust 64 | - name: Install Rust stable 65 | uses: dtolnay/rust-toolchain@stable 66 | 67 | # 使用 Rust 缓存,加快安装速度 68 | - uses: Swatinem/rust-cache@v2 69 | 70 | - name: install dependencies (ubuntu only) 71 | if: matrix.platform == 'ubuntu-latest' 72 | run: | 73 | sudo apt-get update 74 | sudo apt-get install -y libgtk-3-dev webkit2gtk-4.0 libappindicator3-dev librsvg2-dev patchelf 75 | 76 | # 安装依赖执行构建,以及推送 github release 77 | - name: Install app dependencies and build it 78 | run: pnpm i && pnpm tauri build 79 | - uses: tauri-apps/tauri-action@dev 80 | env: 81 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 82 | with: 83 | releaseId: ${{ needs.create-release.outputs.RELEASE_UPLOAD_ID }} -------------------------------------------------------------------------------- /src-tauri/.gitignore: -------------------------------------------------------------------------------- 1 | # Generated by Cargo 2 | # will have compiled files and executables 3 | /target/ 4 | 5 | # Generated by Tauri 6 | # will have schema files for capabilities auto-completion 7 | /gen/schemas 8 | -------------------------------------------------------------------------------- /src-tauri/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "wallhaven_rs" 3 | version = "0.0.0" 4 | description = "A Tauri App" 5 | authors = ["you"] 6 | edition = "2021" 7 | 8 | # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html 9 | 10 | [build-dependencies] 11 | tauri-build = { version = "1.5.2", features = [] } 12 | 13 | [dependencies] 14 | tauri = { version = "1.6.6", features = ["api-all"] } 15 | serde = { version = "1.0.202", features = ["derive"] } 16 | tauri-plugin-log = { git = "https://github.com/tauri-apps/plugins-workspace", branch = "v1" } 17 | serde_json = "1.0.117" 18 | reqwest = "0.12.4" 19 | http-cache-reqwest = "0.14.0" 20 | reqwest-middleware = "0.3.1" 21 | log = "^0.4" 22 | scraper = "0.18.1" 23 | thiserror = "1.0.61" 24 | toml = "0.8.13" 25 | 26 | [features] 27 | # This feature is used for production builds or when a dev server is not specified, DO NOT REMOVE!! 28 | custom-protocol = ["tauri/custom-protocol"] 29 | -------------------------------------------------------------------------------- /src-tauri/build.rs: -------------------------------------------------------------------------------- 1 | fn main() { 2 | tauri_build::build() 3 | } 4 | -------------------------------------------------------------------------------- /src-tauri/icons/128x128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sunnnner/wallhaven_rs/339238cb08ade8106888cd02a04e23b7428288db/src-tauri/icons/128x128.png -------------------------------------------------------------------------------- /src-tauri/icons/128x128@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sunnnner/wallhaven_rs/339238cb08ade8106888cd02a04e23b7428288db/src-tauri/icons/128x128@2x.png -------------------------------------------------------------------------------- /src-tauri/icons/32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sunnnner/wallhaven_rs/339238cb08ade8106888cd02a04e23b7428288db/src-tauri/icons/32x32.png -------------------------------------------------------------------------------- /src-tauri/icons/Square107x107Logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sunnnner/wallhaven_rs/339238cb08ade8106888cd02a04e23b7428288db/src-tauri/icons/Square107x107Logo.png -------------------------------------------------------------------------------- /src-tauri/icons/Square142x142Logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sunnnner/wallhaven_rs/339238cb08ade8106888cd02a04e23b7428288db/src-tauri/icons/Square142x142Logo.png -------------------------------------------------------------------------------- /src-tauri/icons/Square150x150Logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sunnnner/wallhaven_rs/339238cb08ade8106888cd02a04e23b7428288db/src-tauri/icons/Square150x150Logo.png -------------------------------------------------------------------------------- /src-tauri/icons/Square284x284Logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sunnnner/wallhaven_rs/339238cb08ade8106888cd02a04e23b7428288db/src-tauri/icons/Square284x284Logo.png -------------------------------------------------------------------------------- /src-tauri/icons/Square30x30Logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sunnnner/wallhaven_rs/339238cb08ade8106888cd02a04e23b7428288db/src-tauri/icons/Square30x30Logo.png -------------------------------------------------------------------------------- /src-tauri/icons/Square310x310Logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sunnnner/wallhaven_rs/339238cb08ade8106888cd02a04e23b7428288db/src-tauri/icons/Square310x310Logo.png -------------------------------------------------------------------------------- /src-tauri/icons/Square44x44Logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sunnnner/wallhaven_rs/339238cb08ade8106888cd02a04e23b7428288db/src-tauri/icons/Square44x44Logo.png -------------------------------------------------------------------------------- /src-tauri/icons/Square71x71Logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sunnnner/wallhaven_rs/339238cb08ade8106888cd02a04e23b7428288db/src-tauri/icons/Square71x71Logo.png -------------------------------------------------------------------------------- /src-tauri/icons/Square89x89Logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sunnnner/wallhaven_rs/339238cb08ade8106888cd02a04e23b7428288db/src-tauri/icons/Square89x89Logo.png -------------------------------------------------------------------------------- /src-tauri/icons/StoreLogo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sunnnner/wallhaven_rs/339238cb08ade8106888cd02a04e23b7428288db/src-tauri/icons/StoreLogo.png -------------------------------------------------------------------------------- /src-tauri/icons/icon.icns: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sunnnner/wallhaven_rs/339238cb08ade8106888cd02a04e23b7428288db/src-tauri/icons/icon.icns -------------------------------------------------------------------------------- /src-tauri/icons/icon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sunnnner/wallhaven_rs/339238cb08ade8106888cd02a04e23b7428288db/src-tauri/icons/icon.ico -------------------------------------------------------------------------------- /src-tauri/icons/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sunnnner/wallhaven_rs/339238cb08ade8106888cd02a04e23b7428288db/src-tauri/icons/icon.png -------------------------------------------------------------------------------- /src-tauri/src/api/http.rs: -------------------------------------------------------------------------------- 1 | use reqwest::{ 2 | header::{HeaderMap, HeaderValue, ACCEPT, ACCEPT_ENCODING, ACCEPT_LANGUAGE, USER_AGENT}, 3 | Client, 4 | }; 5 | 6 | use reqwest_middleware::{ClientBuilder, ClientWithMiddleware}; 7 | use http_cache_reqwest::{Cache, CacheMode, CACacheManager, HttpCache, HttpCacheOptions}; 8 | 9 | 10 | #[derive(Debug)] 11 | pub struct Context { 12 | pub client: ClientWithMiddleware, 13 | } 14 | 15 | impl Context { 16 | pub fn new() -> Self { 17 | let mut headers = HeaderMap::new(); 18 | headers.insert( 19 | USER_AGENT, 20 | HeaderValue::from_str( 21 | "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) \ 22 | AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36 Edg/125.0.0.0", 23 | ) 24 | .expect("Failed to create user agent header"), 25 | ); 26 | headers.insert(ACCEPT, HeaderValue::from_str("text/html,application/xhtml+xml,\ 27 | application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;\ 28 | v=b3;q=0.7").expect("Failed to create accept header")); 29 | headers.insert( 30 | ACCEPT_LANGUAGE, 31 | HeaderValue::from_str("zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6") 32 | .expect("Failed to create accept language header"), 33 | ); 34 | headers.insert( 35 | ACCEPT_ENCODING, 36 | HeaderValue::from_str("gzip, deflate, br, zstd") 37 | .expect("Failed to create accept encoding header"), 38 | ); 39 | headers.insert("sec-ch-ua", HeaderValue::from_str("\"Chromium\";v=\"94\", \";Not A Brand\";v=\"99\"") 40 | .expect("Failed to create sec-ch-ua header")); 41 | headers.insert("sec-ch-ua-mobile", HeaderValue::from_str("?0") 42 | .expect("Failed to create sec-ch-ua-mobile header")); 43 | headers.insert("sec-ch-ua-platform", HeaderValue::from_str("\"macOS\"") 44 | .expect("Failed to create sec-ch-ua-platform header")); 45 | headers.insert("sec-fetch-dest", HeaderValue::from_str("empty") 46 | .expect("Failed to create sec-fetch-dest header")); 47 | headers.insert("sec-fetch-mode", HeaderValue::from_str("cors") 48 | .expect("Failed to create sec-fetch-mode header")); 49 | headers.insert("sec-fetch-site", HeaderValue::from_str("same-origin") 50 | .expect("Failed to create sec-fetch-site header")); 51 | 52 | Self { 53 | client: ClientBuilder::new(Client::new()) 54 | .with(Cache(HttpCache { 55 | mode: CacheMode::ForceCache, 56 | manager: CACacheManager::default(), 57 | options: HttpCacheOptions::default(), 58 | })) 59 | .build() 60 | } 61 | } 62 | 63 | pub fn http_client(&self) -> &ClientWithMiddleware { 64 | &self.client 65 | } 66 | } 67 | 68 | 69 | impl Default for Context { 70 | fn default() -> Self { 71 | Self::new() 72 | } 73 | } 74 | -------------------------------------------------------------------------------- /src-tauri/src/api/mod.rs: -------------------------------------------------------------------------------- 1 | pub mod http; -------------------------------------------------------------------------------- /src-tauri/src/config/config.rs: -------------------------------------------------------------------------------- 1 | use tauri::api::path::{config_dir, picture_dir}; 2 | use crate::config::interface::Config; 3 | use crate::utils::error::{WallResult, Error}; 4 | use toml::Table; 5 | 6 | 7 | impl Config { 8 | pub fn new(download_path: String) -> Self { 9 | Self { 10 | download_path, 11 | } 12 | } 13 | 14 | pub fn save(&self) -> WallResult<()> { 15 | let config_path = config_dir().ok_or(Error::new("config path error"))?; 16 | let config_path = config_path.join("config.toml"); 17 | std::fs::create_dir_all(&self.download_path)?; 18 | let config = Self::new(self.download_path.clone()); 19 | let toml_config = toml::to_string(&config)?; 20 | std::fs::write(config_path, toml_config)?; 21 | Ok(()) 22 | } 23 | 24 | // 从本机配置文件读取配置 25 | pub fn load() -> WallResult { 26 | let config_path_dir = config_dir().ok_or(Error::new("config path error"))?; 27 | let config_path = config_path_dir.join("config.toml"); 28 | // 判断config_path是否存在 29 | if !config_path.exists() { 30 | std::fs::create_dir_all(Self::default().download_path)?; 31 | let config = Self::new(Self::default().download_path.to_string()); 32 | let toml_config = toml::to_string(&config)?; 33 | std::fs::write(config_path, toml_config)?; 34 | return Ok(Self::default()); 35 | } 36 | let config = std::fs::read_to_string(&config_path)?; 37 | let config: Table = toml::from_str(&config)?; 38 | Ok(Self::new(config["download_path"].as_str().unwrap().to_string())) 39 | } 40 | } 41 | 42 | impl Default for Config { 43 | fn default() -> Self { 44 | Self { 45 | download_path: picture_dir().unwrap().to_str().unwrap().to_string(), 46 | } 47 | } 48 | } -------------------------------------------------------------------------------- /src-tauri/src/config/interface.rs: -------------------------------------------------------------------------------- 1 | 2 | 3 | #[derive(Clone, Debug, serde::Serialize, serde::Deserialize)] 4 | pub struct Config { 5 | pub download_path: String, 6 | } 7 | 8 | 9 | 10 | // Path: src-tauri/src/config/config.rs -------------------------------------------------------------------------------- /src-tauri/src/config/mod.rs: -------------------------------------------------------------------------------- 1 | pub mod config; 2 | pub mod interface; -------------------------------------------------------------------------------- /src-tauri/src/download/download.rs: -------------------------------------------------------------------------------- 1 | use std::io::Write; 2 | use http_cache_reqwest::CacheMode; 3 | use tauri::State; 4 | use crate::api::http::Context; 5 | use crate::config::interface::Config; 6 | use crate::utils::error::WallResult; 7 | 8 | #[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] 9 | pub struct Download { 10 | pub url: String, 11 | pub file_name: String, 12 | } 13 | 14 | 15 | impl Download { 16 | pub fn new(url: String, file_name: String) -> Self { 17 | Self { 18 | url, 19 | file_name 20 | } 21 | } 22 | 23 | pub async fn save(&self, context: State<'_, Context>) -> WallResult<()> { 24 | let download_path = Config::load()?.download_path; 25 | let download_path = std::path::Path::new(&download_path).join(&self.file_name); 26 | let client = context.http_client(); 27 | let mut response = client.get(&self.url).with_extension(CacheMode::NoStore).send().await?; 28 | let mut file = std::fs::File::create(download_path)?; 29 | while let Some(chunk) = response.chunk().await? { 30 | file.write_all(&chunk)?; 31 | } 32 | Ok(()) 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /src-tauri/src/download/mod.rs: -------------------------------------------------------------------------------- 1 | pub mod download; -------------------------------------------------------------------------------- /src-tauri/src/lib.rs: -------------------------------------------------------------------------------- 1 | pub mod api; 2 | pub mod utils; 3 | pub mod top; 4 | pub mod download; 5 | pub mod config; -------------------------------------------------------------------------------- /src-tauri/src/main.rs: -------------------------------------------------------------------------------- 1 | // Prevents additional console window on Windows in release, DO NOT REMOVE!! 2 | #![cfg_attr(not(debug_assertions), windows_subsystem = "windows")] 3 | 4 | use tauri::State; 5 | use wallhaven_rs::api::http::Context; 6 | use wallhaven_rs::config::interface::Config; 7 | use wallhaven_rs::download::download::Download; 8 | use wallhaven_rs::top::top::TopTag; 9 | use wallhaven_rs::utils::error::{Error, WallResult}; 10 | use wallhaven_rs::top::interface::{WallhavenResult}; 11 | 12 | 13 | pub type Result = std::result::Result; 14 | 15 | 16 | #[tauri::command(rename_all = "snake_case")] 17 | async fn get_top_wallpapers( 18 | params: TopTag, 19 | context: State<'_, Context>) -> WallResult { 20 | let top = TopTag::new(params); 21 | top.get_top_page(context).await 22 | } 23 | 24 | fn _construct_new_url(src: &str) -> Result { 25 | let b_src = src.replace("th.wallhaven.cc/small", "w.wallhaven.cc/full"); 26 | let parts: Vec<&str> = b_src.rsplitn(3, '/').collect(); 27 | let file_name = format!("wallhaven-{}", parts[0]); 28 | let tag = parts[1]; 29 | Ok(format!("https://w.wallhaven.cc/full/{}/{}", tag, file_name)) 30 | } 31 | 32 | #[tauri::command(rename_all = "snake_case")] 33 | async fn save_config(path: String) -> WallResult<()> { 34 | let config = Config::new(path); 35 | config.save() 36 | } 37 | 38 | #[tauri::command(rename_all = "snake_case")] 39 | async fn load_config() -> WallResult { 40 | Config::load() 41 | } 42 | 43 | #[tauri::command(rename_all = "snake_case")] 44 | async fn download_wallpaper(url: String, file_name: String, context: State<'_, Context>) -> WallResult<()> { 45 | let download = Download::new(url, file_name); 46 | download.save(context).await 47 | } 48 | 49 | fn main() { 50 | let context = Context::default(); 51 | tauri::Builder::default() 52 | .manage(context) 53 | .invoke_handler(tauri::generate_handler![ 54 | get_top_wallpapers, 55 | save_config, 56 | load_config, 57 | download_wallpaper 58 | ]) 59 | .run(tauri::generate_context!()) 60 | .expect("error while running tauri application"); 61 | } 62 | -------------------------------------------------------------------------------- /src-tauri/src/top/interface.rs: -------------------------------------------------------------------------------- 1 | 2 | #[derive(Debug, serde::Serialize, serde::Deserialize, Clone)] 3 | pub struct WallhavenResponse { 4 | pub name: String, 5 | pub url: String, 6 | pub full_url: String, 7 | pub width: i32, 8 | pub height: i32, 9 | } 10 | 11 | impl WallhavenResponse { 12 | pub fn new(name: String, url: String, full_url: String, width: i32, height: i32) -> Self { 13 | Self { 14 | name, 15 | url, 16 | full_url, 17 | width, 18 | height, 19 | } 20 | } 21 | } 22 | 23 | pub type WallhavenResult = Vec; 24 | -------------------------------------------------------------------------------- /src-tauri/src/top/mod.rs: -------------------------------------------------------------------------------- 1 | #[warn(clippy::module_inception)] 2 | 3 | pub mod top; 4 | pub mod interface; -------------------------------------------------------------------------------- /src-tauri/src/top/top.rs: -------------------------------------------------------------------------------- 1 | #![allow(non_snake_case)] 2 | 3 | use crate::api::http::Context; 4 | use crate::top::interface::{WallhavenResponse, WallhavenResult}; 5 | use crate::utils::error::{Error, WallResult}; 6 | use scraper::Selector; 7 | use serde::{Deserialize, Serialize}; 8 | use tauri::State; 9 | 10 | #[derive(Debug, Clone, Deserialize, Serialize)] 11 | pub struct TopTag { 12 | pub categories: i64, 13 | pub purity: i64, 14 | pub topRange: String, 15 | pub sorting: String, 16 | pub order: String, 17 | pub ai_art_filter: i64, 18 | pub page: i64, 19 | } 20 | 21 | 22 | 23 | impl TopTag { 24 | pub fn new( 25 | self 26 | ) -> Self { 27 | self 28 | } 29 | pub fn get_url(&self) -> String { 30 | if self.topRange.is_empty() { 31 | format!( 32 | "https://wallhaven.cc/search?categories={}&purity={}&sorting={}&order={}&ai_art_filter={}&page={}", 33 | self.categories, self.purity, self.sorting, self.order, self.ai_art_filter, self.page 34 | ) 35 | } else { 36 | format!( 37 | "https://wallhaven.cc/search?categories={}&purity={}&topRange={}&sorting={}&order={}&ai_art_filter={}&page={}", 38 | self.categories, self.purity, self.topRange, self.sorting, self.order, self.ai_art_filter, self.page 39 | ) 40 | } 41 | // format!("https://wallhaven.cc/search?categories={}&purity={}&topRange={}&sorting={}&order={}&ai_art_filter={}&page={}", self.categories, self.purity, self.topRange, self.sorting, self.order, self.ai_art_filter, self.page) 42 | } 43 | 44 | pub async fn get_top_page(&self, context: State<'_, Context>) -> WallResult { 45 | let url = self.get_url(); 46 | let client = context.http_client(); 47 | let response = client.get(url).send().await?; 48 | let body = response.text().await?; 49 | let document = scraper::Html::parse_document(&body); 50 | let main_selector = Selector::parse("main")?; 51 | let section_selector = Selector::parse("section")?; 52 | let ul_selector = Selector::parse("ul")?; 53 | let li_selector = Selector::parse("li")?; 54 | let main = document 55 | .select(&main_selector) 56 | .next() 57 | .ok_or(Error::new("Main not found"))?; 58 | let section = main 59 | .select(§ion_selector) 60 | .next() 61 | .ok_or(Error::new("Section not found"))?; 62 | let ul = section 63 | .select(&ul_selector) 64 | .next() 65 | .ok_or(Error::new("Ul not found"))?; 66 | let mut response = WallhavenResult::new(); 67 | for element in ul.select(&li_selector) { 68 | let img_selector = Selector::parse("img[data-src]")?; 69 | let img = element 70 | .select(&img_selector) 71 | .next() 72 | .ok_or(Error::new("Image not found"))?; 73 | let src = img 74 | .value() 75 | .attr("data-src") 76 | .ok_or(Error::new("Src not found"))?; 77 | let png_value = Selector::parse("span.png")?; 78 | let png = element.select(&png_value).next(); 79 | let wall_res = Selector::parse("span.wall-res")?; 80 | let width_height_html = element 81 | .select(&wall_res) 82 | .next() 83 | .ok_or(Error::new("Wall res not found"))?; 84 | let width_height_collect = width_height_html.text().collect::>(); 85 | let width_height = width_height_collect[0] 86 | .split(" x ") 87 | .map(|x| { 88 | x.parse::().unwrap_or_else(|_| { 89 | panic!( 90 | "{}", 91 | Error::new("Failed to parse width and height").to_string() 92 | ) 93 | }) 94 | }) 95 | .collect::>(); 96 | 97 | let b_src = src.replace("th.wallhaven.cc/small", "w.wallhaven.cc/full"); 98 | let parts: Vec<&str> = b_src.rsplitn(3, '/').collect(); 99 | if parts.len() != 3 { 100 | println!("Invalid URL"); 101 | continue; 102 | } 103 | let file_name = parts[0]; 104 | let tag = parts[1]; 105 | let new_file_name = format!("wallhaven-{}", file_name); 106 | 107 | if png.is_some() { 108 | let _new_file_name: Vec<&str> = new_file_name.rsplitn(2, '.').collect(); 109 | let new_file_name = format!("{}.png", _new_file_name[1]); 110 | let new_url = format!("https://w.wallhaven.cc/full/{}/{}", tag, new_file_name); 111 | response.push(WallhavenResponse::new( 112 | new_file_name.to_string(), 113 | src.to_string(), 114 | new_url.to_string(), 115 | width_height[0], 116 | width_height[1], 117 | )); 118 | } else { 119 | let new_url = format!("https://w.wallhaven.cc/full/{}/{}", tag, new_file_name); 120 | response.push(WallhavenResponse::new( 121 | new_file_name.to_string(), 122 | src.to_string(), 123 | new_url.to_string(), 124 | width_height[0], 125 | width_height[1], 126 | )); 127 | } 128 | } 129 | Ok(response) 130 | } 131 | } 132 | -------------------------------------------------------------------------------- /src-tauri/src/utils/error.rs: -------------------------------------------------------------------------------- 1 | 2 | // create the error type that represents all errors possible in our program 3 | 4 | pub type WallResult = std::result::Result; 5 | 6 | #[derive(Debug, thiserror::Error)] 7 | pub enum Error { 8 | #[error(transparent)] 9 | Io(#[from] std::io::Error), 10 | #[error(transparent)] 11 | Reqwest(#[from] reqwest::Error), 12 | #[error(transparent)] 13 | SelectorErrorKind(#[from] scraper::error::SelectorErrorKind<'static>), 14 | #[error(transparent)] 15 | Infallible(#[from] std::convert::Infallible), 16 | #[error(transparent)] 17 | ParseIntError(#[from] std::num::ParseIntError), 18 | #[error(transparent)] 19 | ParseFloatError(#[from] std::num::ParseFloatError), 20 | #[error(transparent)] 21 | BoxError(#[from] Box), 22 | #[error("Error: {0}")] 23 | TomlError(#[from] toml::de::Error), 24 | #[error("Error: {0}")] 25 | TomeSerError(#[from] toml::ser::Error), 26 | #[error("Error: {0}")] 27 | ReqwestMiddlewareError(#[from] reqwest_middleware::Error), 28 | } 29 | 30 | // we must manually implement serde::Serialize 31 | impl serde::Serialize for Error { 32 | fn serialize(&self, serializer: S) -> Result 33 | where 34 | S: serde::ser::Serializer, 35 | { 36 | serializer.serialize_str(self.to_string().as_ref()) 37 | } 38 | } 39 | 40 | impl Error { 41 | pub fn new(message: &str) -> Self { 42 | Self::Io(std::io::Error::new(std::io::ErrorKind::Other, message)) 43 | } 44 | } -------------------------------------------------------------------------------- /src-tauri/src/utils/mod.rs: -------------------------------------------------------------------------------- 1 | pub mod error; -------------------------------------------------------------------------------- /src-tauri/tauri.conf.json: -------------------------------------------------------------------------------- 1 | { 2 | "build": { 3 | "beforeDevCommand": "pnpm dev", 4 | "beforeBuildCommand": "pnpm build", 5 | "devPath": "http://localhost:1420", 6 | "distDir": "../dist", 7 | "withGlobalTauri": false 8 | }, 9 | "package": { 10 | "productName": "Wallpapers", 11 | "version": "1.1.12" 12 | }, 13 | "tauri": { 14 | "allowlist": { 15 | "all": true, 16 | "shell": { 17 | "all": true, 18 | "open": true 19 | }, 20 | "dialog": { 21 | "all": true, 22 | "ask": true, 23 | "confirm": true, 24 | "message": true, 25 | "open": true, 26 | "save": true 27 | }, 28 | "fs": { 29 | "all": true, 30 | "readFile": true, 31 | "writeFile": true, 32 | "readDir": true, 33 | "copyFile": true, 34 | "createDir": true, 35 | "removeDir": true, 36 | "removeFile": true, 37 | "renameFile": true 38 | }, 39 | "notification": { 40 | "all": true 41 | } 42 | }, 43 | "windows": [ 44 | { 45 | "title": "Wallpapers图片浏览器", 46 | "width": 800, 47 | "height": 750 48 | } 49 | ], 50 | "security": { 51 | "csp": null 52 | }, 53 | "bundle": { 54 | "active": true, 55 | "category": "Photography", 56 | "copyright": "", 57 | "identifier": "cn.com.rustcc", 58 | "icon": [ 59 | "icons/32x32.png", 60 | "icons/128x128.png", 61 | "icons/128x128@2x.png", 62 | "icons/icon.icns", 63 | "icons/icon.ico" 64 | ], 65 | "deb": { 66 | "depends": [] 67 | }, 68 | "externalBin": [], 69 | "longDescription": "", 70 | "macOS": { 71 | "entitlements": null, 72 | "exceptionDomain": "", 73 | "frameworks": [], 74 | "providerShortName": null, 75 | "signingIdentity": null 76 | }, 77 | "resources": [], 78 | "shortDescription": "", 79 | "targets": "all", 80 | "windows": { 81 | "certificateThumbprint": null, 82 | "digestAlgorithm": "sha256", 83 | "timestampUrl": "" 84 | } 85 | } 86 | } 87 | } 88 | -------------------------------------------------------------------------------- /src/App.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 11 | 12 | 17 | -------------------------------------------------------------------------------- /src/assets/vue.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/components/Config/index.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 61 | 62 | -------------------------------------------------------------------------------- /src/components/Default/index.vue: -------------------------------------------------------------------------------- 1 | 38 | 39 | 117 | 118 | -------------------------------------------------------------------------------- /src/components/Home/index.vue: -------------------------------------------------------------------------------- 1 | 34 | 35 | 57 | 58 | 65 | -------------------------------------------------------------------------------- /src/components/Hot/index.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 20 | 21 | -------------------------------------------------------------------------------- /src/components/Index/index.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 22 | 23 | -------------------------------------------------------------------------------- /src/components/Random/index.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 20 | 21 | -------------------------------------------------------------------------------- /src/components/Style/theme.scss: -------------------------------------------------------------------------------- 1 | .wallpaper-browser { 2 | height: 100%; 3 | display: flex; 4 | overflow: hidden; 5 | .left { 6 | width: 300px; 7 | height: 100%; 8 | } 9 | .infinite-list { 10 | display: block; 11 | padding: 0; 12 | margin: 0; 13 | list-style: none; 14 | overflow: auto; 15 | height: 100%; 16 | } 17 | 18 | //background-color: #CCFFFF; // 添加科技感背景色 19 | 20 | .thumbnail-container { 21 | margin: 0 10px 10px 10px; 22 | display: flex; 23 | justify-content: center; 24 | align-items: center; 25 | overflow: auto; 26 | } 27 | 28 | .full-image-container { 29 | flex: 1; 30 | height: 100%; 31 | width: 100%; 32 | overflow: hidden; 33 | .full-image { 34 | height: 100%; 35 | width: 100%; 36 | object-fit: contain; 37 | } 38 | } 39 | 40 | .thumbnail-image{ 41 | transition: border 0.1s; 42 | &:hover { 43 | border: 5px solid #409EFF; 44 | } 45 | } 46 | 47 | .float-button, { 48 | transition: background-color 0.3s, transform 0.3s; 49 | 50 | &:hover { 51 | background-color: #a4d7e1; // 鼠标悬停时变更背景色 52 | transform: translateY(-3px); // 轻微升起效果 53 | } 54 | } 55 | 56 | } -------------------------------------------------------------------------------- /src/components/Top/index.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 20 | 21 | -------------------------------------------------------------------------------- /src/main.ts: -------------------------------------------------------------------------------- 1 | import { createApp } from 'vue'; 2 | import ElementPlus from 'element-plus'; 3 | import 'element-plus/dist/index.css'; 4 | import App from './App.vue'; 5 | import router from './router'; 6 | 7 | const app = createApp(App) 8 | 9 | app.use(ElementPlus) 10 | app.use(router) 11 | app.mount('#app') -------------------------------------------------------------------------------- /src/router/index.ts: -------------------------------------------------------------------------------- 1 | import {createWebHistory, createRouter} from 'vue-router' 2 | 3 | import Home from '../components/Home/index.vue'; 4 | import Index from '../components/Index/index.vue'; 5 | import Top from '../components/Top/index.vue'; 6 | import Hot from '../components/Hot/index.vue'; 7 | import random from '../components/Random/index.vue'; 8 | import Config from '../components/Config/index.vue'; 9 | 10 | 11 | const routes = [ 12 | { 13 | path: '/', 14 | redirect: '/index', 15 | }, 16 | { 17 | path: '/index', 18 | name: 'index', 19 | component: Home, 20 | children: [ 21 | { 22 | path: 'latest', 23 | name: 'index', 24 | component: Index, 25 | }, 26 | { 27 | path: 'top', 28 | name: 'top', 29 | component: Top, 30 | }, 31 | { 32 | path: 'hot', 33 | name: 'hot', 34 | component: Hot, 35 | }, 36 | { 37 | path: 'random', 38 | name: 'random', 39 | component: random, 40 | } 41 | ] 42 | }, 43 | { 44 | path: '/config', 45 | name: 'config', 46 | component: Config, 47 | }, 48 | ] 49 | 50 | const router = createRouter({ 51 | history: createWebHistory(), 52 | routes, 53 | }) 54 | 55 | export default router; 56 | -------------------------------------------------------------------------------- /src/static/2222.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Sunnnner/wallhaven_rs/339238cb08ade8106888cd02a04e23b7428288db/src/static/2222.png -------------------------------------------------------------------------------- /src/vite-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | declare module 'vue-router'; 3 | 4 | declare module "*.vue" { 5 | import type { DefineComponent } from "vue"; 6 | const component: DefineComponent<{}, {}, any>; 7 | export default component; 8 | } 9 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ES2020", 4 | "useDefineForClassFields": true, 5 | "module": "ESNext", 6 | "lib": ["ES2020", "DOM", "DOM.Iterable"], 7 | "skipLibCheck": true, 8 | 9 | /* Bundler mode */ 10 | "moduleResolution": "bundler", 11 | "allowImportingTsExtensions": true, 12 | "resolveJsonModule": true, 13 | "isolatedModules": true, 14 | "noEmit": true, 15 | "jsx": "preserve", 16 | 17 | /* Linting */ 18 | "strict": true, 19 | "noUnusedLocals": true, 20 | "noUnusedParameters": true, 21 | "noFallthroughCasesInSwitch": true, 22 | "types": ["element-plus/global"] 23 | }, 24 | "include": [ 25 | "src/**/*.ts", 26 | "src/**/*.d.ts", 27 | "src/**/*.tsx", 28 | "src/**/*.vue", 29 | "node_modules/.pnpm/unplugin-auto-import@0.17.6/node_modules/unplugin-auto-import/auto-imports.d.ts" 30 | ], 31 | "references": [{ "path": "./tsconfig.node.json" }] 32 | } 33 | -------------------------------------------------------------------------------- /tsconfig.node.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "composite": true, 4 | "skipLibCheck": true, 5 | "module": "ESNext", 6 | "moduleResolution": "bundler", 7 | "allowSyntheticDefaultImports": true 8 | }, 9 | "include": ["vite.config.ts"] 10 | } 11 | -------------------------------------------------------------------------------- /vite.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from "vite"; 2 | import vue from "@vitejs/plugin-vue"; 3 | import AutoImport from 'unplugin-auto-import/vite'; 4 | import Components from 'unplugin-vue-components/vite'; 5 | import { ElementPlusResolver } from 'unplugin-vue-components/resolvers'; 6 | 7 | // https://vitejs.dev/config/ 8 | export default defineConfig(async () => ({ 9 | plugins: [ 10 | vue(), 11 | AutoImport({ 12 | resolvers: [ElementPlusResolver()], 13 | }), 14 | Components({ 15 | resolvers: [ElementPlusResolver()], 16 | }), 17 | ], 18 | 19 | // Vite options tailored for Tauri development and only applied in `tauri dev` or `tauri build` 20 | // 21 | // 1. prevent vite from obscuring rust errors 22 | clearScreen: false, 23 | // 2. tauri expects a fixed port, fail if that port is not available 24 | server: { 25 | port: 1420, 26 | strictPort: true, 27 | watch: { 28 | // 3. tell vite to ignore watching `src-tauri` 29 | ignored: ["**/src-tauri/**"], 30 | }, 31 | }, 32 | })); 33 | --------------------------------------------------------------------------------