├── .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 |
9 |
10 |
11 |
12 |
17 |
--------------------------------------------------------------------------------
/src/assets/vue.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/src/components/Config/index.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | 保存
8 |
9 |
10 |
11 |
12 |
61 |
62 |
--------------------------------------------------------------------------------
/src/components/Default/index.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
15 |
16 |
17 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
117 |
118 |
--------------------------------------------------------------------------------
/src/components/Home/index.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
9 | 主页
10 | 排行榜
11 | 热门
12 | 随机
13 |
14 |
15 |
16 |
17 | 配置
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
57 |
58 |
65 |
--------------------------------------------------------------------------------
/src/components/Hot/index.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
20 |
21 |
--------------------------------------------------------------------------------
/src/components/Index/index.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
22 |
23 |
--------------------------------------------------------------------------------
/src/components/Random/index.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
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 |
2 |
3 |
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 |
--------------------------------------------------------------------------------