├── .editorconfig ├── .gitignore ├── LICENSE ├── README.md ├── favicon.ico ├── index.html ├── package.json ├── pnpm-lock.yaml ├── src ├── App.vue ├── assets │ ├── 24 │ │ ├── img │ │ │ ├── bg.webp │ │ │ ├── blow │ │ │ │ ├── 1.webp │ │ │ │ ├── 2.webp │ │ │ │ ├── 3.webp │ │ │ │ ├── 4.webp │ │ │ │ ├── 5.webp │ │ │ │ ├── 6.webp │ │ │ │ ├── 7.webp │ │ │ │ ├── 8.webp │ │ │ │ └── 9.webp │ │ │ ├── bullet.webp │ │ │ ├── ebullet.webp │ │ │ ├── eplane.webp │ │ │ └── plane.webp │ │ └── sounds │ │ │ ├── bgm.mp3 │ │ │ ├── bullet.mp3 │ │ │ ├── end.mp3 │ │ │ ├── enemy_down.mp3 │ │ │ ├── enemy_hit.mp3 │ │ │ ├── lv_up.mp3 │ │ │ ├── player_skill_0.mp3 │ │ │ ├── player_skill_1.mp3 │ │ │ ├── player_skill_2.mp3 │ │ │ ├── player_skill_3.mp3 │ │ │ ├── player_treat.mp3 │ │ │ └── start.mp3 │ ├── aniki │ │ ├── img │ │ │ ├── bg.webp │ │ │ ├── blow │ │ │ │ ├── 1.webp │ │ │ │ ├── 2.webp │ │ │ │ ├── 3.webp │ │ │ │ ├── 4.webp │ │ │ │ ├── 5.webp │ │ │ │ ├── 6.webp │ │ │ │ ├── 7.webp │ │ │ │ ├── 8.webp │ │ │ │ └── 9.webp │ │ │ ├── bullet.webp │ │ │ ├── ebullet.webp │ │ │ ├── eplane.webp │ │ │ └── plane.webp │ │ └── sounds │ │ │ ├── bgm.mp3 │ │ │ ├── bullet.mp3 │ │ │ ├── end.mp3 │ │ │ ├── enemy_down.mp3 │ │ │ ├── enemy_hit.mp3 │ │ │ ├── lv_up.mp3 │ │ │ ├── player_skill_0.mp3 │ │ │ ├── player_skill_1.mp3 │ │ │ ├── player_skill_2.mp3 │ │ │ ├── player_skill_3.mp3 │ │ │ ├── player_treat.mp3 │ │ │ └── start.mp3 │ └── bg_welcome.webp ├── components │ └── MainCanvas.vue ├── game │ ├── assets.js │ ├── circle-points.js │ ├── type.js │ └── utils.js ├── hooks │ └── useGameAudio.js ├── main.css ├── main.js ├── router │ └── index.js ├── stores │ ├── bitmap-store.js │ └── log-store.js └── views │ ├── end.vue │ ├── play.vue │ └── welcome.vue └── vite.config.js /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | charset = utf-8 5 | indent_style = space 6 | indent_size = 2 7 | insert_final_newline = true 8 | trim_trailing_whitespace = true 9 | -------------------------------------------------------------------------------- /.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 | .DS_Store 12 | dist 13 | dist-ssr 14 | coverage 15 | *.local 16 | 17 | /cypress/videos/ 18 | /cypress/screenshots/ 19 | 20 | # Editor directories and files 21 | .vscode/* 22 | !.vscode/extensions.json 23 | .idea 24 | *.suo 25 | *.ntvs* 26 | *.njsproj 27 | *.sln 28 | *.sw? 29 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Mozilla Public License Version 2.0 2 | ================================== 3 | 4 | 1. Definitions 5 | -------------- 6 | 7 | 1.1. "Contributor" 8 | means each individual or legal entity that creates, contributes to 9 | the creation of, or owns Covered Software. 10 | 11 | 1.2. "Contributor Version" 12 | means the combination of the Contributions of others (if any) used 13 | by a Contributor and that particular Contributor's Contribution. 14 | 15 | 1.3. "Contribution" 16 | means Covered Software of a particular Contributor. 17 | 18 | 1.4. "Covered Software" 19 | means Source Code Form to which the initial Contributor has attached 20 | the notice in Exhibit A, the Executable Form of such Source Code 21 | Form, and Modifications of such Source Code Form, in each case 22 | including portions thereof. 23 | 24 | 1.5. "Incompatible With Secondary Licenses" 25 | means 26 | 27 | (a) that the initial Contributor has attached the notice described 28 | in Exhibit B to the Covered Software; or 29 | 30 | (b) that the Covered Software was made available under the terms of 31 | version 1.1 or earlier of the License, but not also under the 32 | terms of a Secondary License. 33 | 34 | 1.6. "Executable Form" 35 | means any form of the work other than Source Code Form. 36 | 37 | 1.7. "Larger Work" 38 | means a work that combines Covered Software with other material, in 39 | a separate file or files, that is not Covered Software. 40 | 41 | 1.8. "License" 42 | means this document. 43 | 44 | 1.9. "Licensable" 45 | means having the right to grant, to the maximum extent possible, 46 | whether at the time of the initial grant or subsequently, any and 47 | all of the rights conveyed by this License. 48 | 49 | 1.10. "Modifications" 50 | means any of the following: 51 | 52 | (a) any file in Source Code Form that results from an addition to, 53 | deletion from, or modification of the contents of Covered 54 | Software; or 55 | 56 | (b) any new file in Source Code Form that contains any Covered 57 | Software. 58 | 59 | 1.11. "Patent Claims" of a Contributor 60 | means any patent claim(s), including without limitation, method, 61 | process, and apparatus claims, in any patent Licensable by such 62 | Contributor that would be infringed, but for the grant of the 63 | License, by the making, using, selling, offering for sale, having 64 | made, import, or transfer of either its Contributions or its 65 | Contributor Version. 66 | 67 | 1.12. "Secondary License" 68 | means either the GNU General Public License, Version 2.0, the GNU 69 | Lesser General Public License, Version 2.1, the GNU Affero General 70 | Public License, Version 3.0, or any later versions of those 71 | licenses. 72 | 73 | 1.13. "Source Code Form" 74 | means the form of the work preferred for making modifications. 75 | 76 | 1.14. "You" (or "Your") 77 | means an individual or a legal entity exercising rights under this 78 | License. For legal entities, "You" includes any entity that 79 | controls, is controlled by, or is under common control with You. For 80 | purposes of this definition, "control" means (a) the power, direct 81 | or indirect, to cause the direction or management of such entity, 82 | whether by contract or otherwise, or (b) ownership of more than 83 | fifty percent (50%) of the outstanding shares or beneficial 84 | ownership of such entity. 85 | 86 | 2. License Grants and Conditions 87 | -------------------------------- 88 | 89 | 2.1. Grants 90 | 91 | Each Contributor hereby grants You a world-wide, royalty-free, 92 | non-exclusive license: 93 | 94 | (a) under intellectual property rights (other than patent or trademark) 95 | Licensable by such Contributor to use, reproduce, make available, 96 | modify, display, perform, distribute, and otherwise exploit its 97 | Contributions, either on an unmodified basis, with Modifications, or 98 | as part of a Larger Work; and 99 | 100 | (b) under Patent Claims of such Contributor to make, use, sell, offer 101 | for sale, have made, import, and otherwise transfer either its 102 | Contributions or its Contributor Version. 103 | 104 | 2.2. Effective Date 105 | 106 | The licenses granted in Section 2.1 with respect to any Contribution 107 | become effective for each Contribution on the date the Contributor first 108 | distributes such Contribution. 109 | 110 | 2.3. Limitations on Grant Scope 111 | 112 | The licenses granted in this Section 2 are the only rights granted under 113 | this License. No additional rights or licenses will be implied from the 114 | distribution or licensing of Covered Software under this License. 115 | Notwithstanding Section 2.1(b) above, no patent license is granted by a 116 | Contributor: 117 | 118 | (a) for any code that a Contributor has removed from Covered Software; 119 | or 120 | 121 | (b) for infringements caused by: (i) Your and any other third party's 122 | modifications of Covered Software, or (ii) the combination of its 123 | Contributions with other software (except as part of its Contributor 124 | Version); or 125 | 126 | (c) under Patent Claims infringed by Covered Software in the absence of 127 | its Contributions. 128 | 129 | This License does not grant any rights in the trademarks, service marks, 130 | or logos of any Contributor (except as may be necessary to comply with 131 | the notice requirements in Section 3.4). 132 | 133 | 2.4. Subsequent Licenses 134 | 135 | No Contributor makes additional grants as a result of Your choice to 136 | distribute the Covered Software under a subsequent version of this 137 | License (see Section 10.2) or under the terms of a Secondary License (if 138 | permitted under the terms of Section 3.3). 139 | 140 | 2.5. Representation 141 | 142 | Each Contributor represents that the Contributor believes its 143 | Contributions are its original creation(s) or it has sufficient rights 144 | to grant the rights to its Contributions conveyed by this License. 145 | 146 | 2.6. Fair Use 147 | 148 | This License is not intended to limit any rights You have under 149 | applicable copyright doctrines of fair use, fair dealing, or other 150 | equivalents. 151 | 152 | 2.7. Conditions 153 | 154 | Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted 155 | in Section 2.1. 156 | 157 | 3. Responsibilities 158 | ------------------- 159 | 160 | 3.1. Distribution of Source Form 161 | 162 | All distribution of Covered Software in Source Code Form, including any 163 | Modifications that You create or to which You contribute, must be under 164 | the terms of this License. You must inform recipients that the Source 165 | Code Form of the Covered Software is governed by the terms of this 166 | License, and how they can obtain a copy of this License. You may not 167 | attempt to alter or restrict the recipients' rights in the Source Code 168 | Form. 169 | 170 | 3.2. Distribution of Executable Form 171 | 172 | If You distribute Covered Software in Executable Form then: 173 | 174 | (a) such Covered Software must also be made available in Source Code 175 | Form, as described in Section 3.1, and You must inform recipients of 176 | the Executable Form how they can obtain a copy of such Source Code 177 | Form by reasonable means in a timely manner, at a charge no more 178 | than the cost of distribution to the recipient; and 179 | 180 | (b) You may distribute such Executable Form under the terms of this 181 | License, or sublicense it under different terms, provided that the 182 | license for the Executable Form does not attempt to limit or alter 183 | the recipients' rights in the Source Code Form under this License. 184 | 185 | 3.3. Distribution of a Larger Work 186 | 187 | You may create and distribute a Larger Work under terms of Your choice, 188 | provided that You also comply with the requirements of this License for 189 | the Covered Software. If the Larger Work is a combination of Covered 190 | Software with a work governed by one or more Secondary Licenses, and the 191 | Covered Software is not Incompatible With Secondary Licenses, this 192 | License permits You to additionally distribute such Covered Software 193 | under the terms of such Secondary License(s), so that the recipient of 194 | the Larger Work may, at their option, further distribute the Covered 195 | Software under the terms of either this License or such Secondary 196 | License(s). 197 | 198 | 3.4. Notices 199 | 200 | You may not remove or alter the substance of any license notices 201 | (including copyright notices, patent notices, disclaimers of warranty, 202 | or limitations of liability) contained within the Source Code Form of 203 | the Covered Software, except that You may alter any license notices to 204 | the extent required to remedy known factual inaccuracies. 205 | 206 | 3.5. Application of Additional Terms 207 | 208 | You may choose to offer, and to charge a fee for, warranty, support, 209 | indemnity or liability obligations to one or more recipients of Covered 210 | Software. However, You may do so only on Your own behalf, and not on 211 | behalf of any Contributor. You must make it absolutely clear that any 212 | such warranty, support, indemnity, or liability obligation is offered by 213 | You alone, and You hereby agree to indemnify every Contributor for any 214 | liability incurred by such Contributor as a result of warranty, support, 215 | indemnity or liability terms You offer. You may include additional 216 | disclaimers of warranty and limitations of liability specific to any 217 | jurisdiction. 218 | 219 | 4. Inability to Comply Due to Statute or Regulation 220 | --------------------------------------------------- 221 | 222 | If it is impossible for You to comply with any of the terms of this 223 | License with respect to some or all of the Covered Software due to 224 | statute, judicial order, or regulation then You must: (a) comply with 225 | the terms of this License to the maximum extent possible; and (b) 226 | describe the limitations and the code they affect. Such description must 227 | be placed in a text file included with all distributions of the Covered 228 | Software under this License. Except to the extent prohibited by statute 229 | or regulation, such description must be sufficiently detailed for a 230 | recipient of ordinary skill to be able to understand it. 231 | 232 | 5. Termination 233 | -------------- 234 | 235 | 5.1. The rights granted under this License will terminate automatically 236 | if You fail to comply with any of its terms. However, if You become 237 | compliant, then the rights granted under this License from a particular 238 | Contributor are reinstated (a) provisionally, unless and until such 239 | Contributor explicitly and finally terminates Your grants, and (b) on an 240 | ongoing basis, if such Contributor fails to notify You of the 241 | non-compliance by some reasonable means prior to 60 days after You have 242 | come back into compliance. Moreover, Your grants from a particular 243 | Contributor are reinstated on an ongoing basis if such Contributor 244 | notifies You of the non-compliance by some reasonable means, this is the 245 | first time You have received notice of non-compliance with this License 246 | from such Contributor, and You become compliant prior to 30 days after 247 | Your receipt of the notice. 248 | 249 | 5.2. If You initiate litigation against any entity by asserting a patent 250 | infringement claim (excluding declaratory judgment actions, 251 | counter-claims, and cross-claims) alleging that a Contributor Version 252 | directly or indirectly infringes any patent, then the rights granted to 253 | You by any and all Contributors for the Covered Software under Section 254 | 2.1 of this License shall terminate. 255 | 256 | 5.3. In the event of termination under Sections 5.1 or 5.2 above, all 257 | end user license agreements (excluding distributors and resellers) which 258 | have been validly granted by You or Your distributors under this License 259 | prior to termination shall survive termination. 260 | 261 | ************************************************************************ 262 | * * 263 | * 6. Disclaimer of Warranty * 264 | * ------------------------- * 265 | * * 266 | * Covered Software is provided under this License on an "as is" * 267 | * basis, without warranty of any kind, either expressed, implied, or * 268 | * statutory, including, without limitation, warranties that the * 269 | * Covered Software is free of defects, merchantable, fit for a * 270 | * particular purpose or non-infringing. The entire risk as to the * 271 | * quality and performance of the Covered Software is with You. * 272 | * Should any Covered Software prove defective in any respect, You * 273 | * (not any Contributor) assume the cost of any necessary servicing, * 274 | * repair, or correction. This disclaimer of warranty constitutes an * 275 | * essential part of this License. No use of any Covered Software is * 276 | * authorized under this License except under this disclaimer. * 277 | * * 278 | ************************************************************************ 279 | 280 | ************************************************************************ 281 | * * 282 | * 7. Limitation of Liability * 283 | * -------------------------- * 284 | * * 285 | * Under no circumstances and under no legal theory, whether tort * 286 | * (including negligence), contract, or otherwise, shall any * 287 | * Contributor, or anyone who distributes Covered Software as * 288 | * permitted above, be liable to You for any direct, indirect, * 289 | * special, incidental, or consequential damages of any character * 290 | * including, without limitation, damages for lost profits, loss of * 291 | * goodwill, work stoppage, computer failure or malfunction, or any * 292 | * and all other commercial damages or losses, even if such party * 293 | * shall have been informed of the possibility of such damages. This * 294 | * limitation of liability shall not apply to liability for death or * 295 | * personal injury resulting from such party's negligence to the * 296 | * extent applicable law prohibits such limitation. Some * 297 | * jurisdictions do not allow the exclusion or limitation of * 298 | * incidental or consequential damages, so this exclusion and * 299 | * limitation may not apply to You. * 300 | * * 301 | ************************************************************************ 302 | 303 | 8. Litigation 304 | ------------- 305 | 306 | Any litigation relating to this License may be brought only in the 307 | courts of a jurisdiction where the defendant maintains its principal 308 | place of business and such litigation shall be governed by laws of that 309 | jurisdiction, without reference to its conflict-of-law provisions. 310 | Nothing in this Section shall prevent a party's ability to bring 311 | cross-claims or counter-claims. 312 | 313 | 9. Miscellaneous 314 | ---------------- 315 | 316 | This License represents the complete agreement concerning the subject 317 | matter hereof. If any provision of this License is held to be 318 | unenforceable, such provision shall be reformed only to the extent 319 | necessary to make it enforceable. Any law or regulation which provides 320 | that the language of a contract shall be construed against the drafter 321 | shall not be used to construe this License against a Contributor. 322 | 323 | 10. Versions of the License 324 | --------------------------- 325 | 326 | 10.1. New Versions 327 | 328 | Mozilla Foundation is the license steward. Except as provided in Section 329 | 10.3, no one other than the license steward has the right to modify or 330 | publish new versions of this License. Each version will be given a 331 | distinguishing version number. 332 | 333 | 10.2. Effect of New Versions 334 | 335 | You may distribute the Covered Software under the terms of the version 336 | of the License under which You originally received the Covered Software, 337 | or under the terms of any subsequent version published by the license 338 | steward. 339 | 340 | 10.3. Modified Versions 341 | 342 | If you create software not governed by this License, and you want to 343 | create a new license for such software, you may create and use a 344 | modified version of this License if you rename the license and remove 345 | any references to the name of the license steward (except to note that 346 | such modified license differs from this License). 347 | 348 | 10.4. Distributing Source Code Form that is Incompatible With Secondary 349 | Licenses 350 | 351 | If You choose to distribute Source Code Form that is Incompatible With 352 | Secondary Licenses under the terms of this version of the License, the 353 | notice described in Exhibit B of this License must be attached. 354 | 355 | Exhibit A - Source Code Form License Notice 356 | ------------------------------------------- 357 | 358 | This Source Code Form is subject to the terms of the Mozilla Public 359 | License, v. 2.0. If a copy of the MPL was not distributed with this 360 | file, You can obtain one at http://mozilla.org/MPL/2.0/. 361 | 362 | If it is not possible or desirable to put the notice in a particular 363 | file, then You may include the notice in a location (such as a LICENSE 364 | file in a relevant directory) where a recipient would be likely to look 365 | for such a notice. 366 | 367 | You may add additional accurate notices of copyright ownership. 368 | 369 | Exhibit B - "Incompatible With Secondary Licenses" Notice 370 | --------------------------------------------------------- 371 | 372 | This Source Code Form is "Incompatible With Secondary Licenses", as 373 | defined by the Mozilla Public License, v. 2.0. 374 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # plane-war-vue 2 | 3 | vue3 做的小游戏,支持电脑和手机游玩 4 | 5 | > 素材均来源于网络收集 6 | -------------------------------------------------------------------------------- /favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blyrin/plane-war-vue/c0eca9bfa941751d17186178d1e67867be8375fc/favicon.ico -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 飞机大战 8 | 9 | 10 |
11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "plane-war-vue", 3 | "version": "0.0.0", 4 | "private": true, 5 | "scripts": { 6 | "dev": "vite --host 0.0.0.0", 7 | "build": "vite build", 8 | "preview": "vite preview" 9 | }, 10 | "dependencies": { 11 | "@vueuse/core": "^10.11.1", 12 | "@vueuse/sound": "^2.1.3", 13 | "pinia": "^2.3.1", 14 | "vue": "^3.5.16", 15 | "vue-router": "^4.5.1" 16 | }, 17 | "devDependencies": { 18 | "@vitejs/plugin-vue": "^4.6.2", 19 | "postcss-preset-env": "^9.6.0", 20 | "vite": "^4.5.14" 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '9.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | importers: 8 | 9 | .: 10 | dependencies: 11 | '@vueuse/core': 12 | specifier: ^10.11.1 13 | version: 10.11.1(vue@3.5.16) 14 | '@vueuse/sound': 15 | specifier: ^2.1.3 16 | version: 2.1.3(vue@3.5.16) 17 | pinia: 18 | specifier: ^2.3.1 19 | version: 2.3.1(vue@3.5.16) 20 | vue: 21 | specifier: ^3.5.16 22 | version: 3.5.16 23 | vue-router: 24 | specifier: ^4.5.1 25 | version: 4.5.1(vue@3.5.16) 26 | devDependencies: 27 | '@vitejs/plugin-vue': 28 | specifier: ^4.6.2 29 | version: 4.6.2(vite@4.5.14)(vue@3.5.16) 30 | postcss-preset-env: 31 | specifier: ^9.6.0 32 | version: 9.6.0(postcss@8.5.4) 33 | vite: 34 | specifier: ^4.5.14 35 | version: 4.5.14 36 | 37 | packages: 38 | 39 | '@babel/helper-string-parser@7.27.1': 40 | resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} 41 | engines: {node: '>=6.9.0'} 42 | 43 | '@babel/helper-validator-identifier@7.27.1': 44 | resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} 45 | engines: {node: '>=6.9.0'} 46 | 47 | '@babel/parser@7.27.4': 48 | resolution: {integrity: sha512-BRmLHGwpUqLFR2jzx9orBuX/ABDkj2jLKOXrHDTN2aOKL+jFDDKaRNo9nyYsIl9h/UE/7lMKdDjKQQyxKKDZ7g==} 49 | engines: {node: '>=6.0.0'} 50 | hasBin: true 51 | 52 | '@babel/types@7.27.3': 53 | resolution: {integrity: sha512-Y1GkI4ktrtvmawoSq+4FCVHNryea6uR+qUQy0AGxLSsjCX0nVmkYQMBLHDkXZuo5hGx7eYdnIaslsdBFm7zbUw==} 54 | engines: {node: '>=6.9.0'} 55 | 56 | '@csstools/cascade-layer-name-parser@1.0.13': 57 | resolution: {integrity: sha512-MX0yLTwtZzr82sQ0zOjqimpZbzjMaK/h2pmlrLK7DCzlmiZLYFpoO94WmN1akRVo6ll/TdpHb53vihHLUMyvng==} 58 | engines: {node: ^14 || ^16 || >=18} 59 | peerDependencies: 60 | '@csstools/css-parser-algorithms': ^2.7.1 61 | '@csstools/css-tokenizer': ^2.4.1 62 | 63 | '@csstools/color-helpers@4.2.1': 64 | resolution: {integrity: sha512-CEypeeykO9AN7JWkr1OEOQb0HRzZlPWGwV0Ya6DuVgFdDi6g3ma/cPZ5ZPZM4AWQikDpq/0llnGGlIL+j8afzw==} 65 | engines: {node: ^14 || ^16 || >=18} 66 | 67 | '@csstools/css-calc@1.2.4': 68 | resolution: {integrity: sha512-tfOuvUQeo7Hz+FcuOd3LfXVp+342pnWUJ7D2y8NUpu1Ww6xnTbHLpz018/y6rtbHifJ3iIEf9ttxXd8KG7nL0Q==} 69 | engines: {node: ^14 || ^16 || >=18} 70 | peerDependencies: 71 | '@csstools/css-parser-algorithms': ^2.7.1 72 | '@csstools/css-tokenizer': ^2.4.1 73 | 74 | '@csstools/css-color-parser@2.0.5': 75 | resolution: {integrity: sha512-lRZSmtl+DSjok3u9hTWpmkxFZnz7stkbZxzKc08aDUsdrWwhSgWo8yq9rq9DaFUtbAyAq2xnH92fj01S+pwIww==} 76 | engines: {node: ^14 || ^16 || >=18} 77 | peerDependencies: 78 | '@csstools/css-parser-algorithms': ^2.7.1 79 | '@csstools/css-tokenizer': ^2.4.1 80 | 81 | '@csstools/css-parser-algorithms@2.7.1': 82 | resolution: {integrity: sha512-2SJS42gxmACHgikc1WGesXLIT8d/q2l0UFM7TaEeIzdFCE/FPMtTiizcPGGJtlPo2xuQzY09OhrLTzRxqJqwGw==} 83 | engines: {node: ^14 || ^16 || >=18} 84 | peerDependencies: 85 | '@csstools/css-tokenizer': ^2.4.1 86 | 87 | '@csstools/css-tokenizer@2.4.1': 88 | resolution: {integrity: sha512-eQ9DIktFJBhGjioABJRtUucoWR2mwllurfnM8LuNGAqX3ViZXaUchqk+1s7jjtkFiT9ySdACsFEA3etErkALUg==} 89 | engines: {node: ^14 || ^16 || >=18} 90 | 91 | '@csstools/media-query-list-parser@2.1.13': 92 | resolution: {integrity: sha512-XaHr+16KRU9Gf8XLi3q8kDlI18d5vzKSKCY510Vrtc9iNR0NJzbY9hhTmwhzYZj/ZwGL4VmB3TA9hJW0Um2qFA==} 93 | engines: {node: ^14 || ^16 || >=18} 94 | peerDependencies: 95 | '@csstools/css-parser-algorithms': ^2.7.1 96 | '@csstools/css-tokenizer': ^2.4.1 97 | 98 | '@csstools/postcss-cascade-layers@4.0.6': 99 | resolution: {integrity: sha512-Xt00qGAQyqAODFiFEJNkTpSUz5VfYqnDLECdlA/Vv17nl/OIV5QfTRHGAXrBGG5YcJyHpJ+GF9gF/RZvOQz4oA==} 100 | engines: {node: ^14 || ^16 || >=18} 101 | peerDependencies: 102 | postcss: ^8.4 103 | 104 | '@csstools/postcss-color-function@3.0.19': 105 | resolution: {integrity: sha512-d1OHEXyYGe21G3q88LezWWx31ImEDdmINNDy0LyLNN9ChgN2bPxoubUPiHf9KmwypBMaHmNcMuA/WZOKdZk/Lg==} 106 | engines: {node: ^14 || ^16 || >=18} 107 | peerDependencies: 108 | postcss: ^8.4 109 | 110 | '@csstools/postcss-color-mix-function@2.0.19': 111 | resolution: {integrity: sha512-mLvQlMX+keRYr16AuvuV8WYKUwF+D0DiCqlBdvhQ0KYEtcQl9/is9Ssg7RcIys8x0jIn2h1zstS4izckdZj9wg==} 112 | engines: {node: ^14 || ^16 || >=18} 113 | peerDependencies: 114 | postcss: ^8.4 115 | 116 | '@csstools/postcss-content-alt-text@1.0.0': 117 | resolution: {integrity: sha512-SkHdj7EMM/57GVvSxSELpUg7zb5eAndBeuvGwFzYtU06/QXJ/h9fuK7wO5suteJzGhm3GDF/EWPCdWV2h1IGHQ==} 118 | engines: {node: ^14 || ^16 || >=18} 119 | peerDependencies: 120 | postcss: ^8.4 121 | 122 | '@csstools/postcss-exponential-functions@1.0.9': 123 | resolution: {integrity: sha512-x1Avr15mMeuX7Z5RJUl7DmjhUtg+Amn5DZRD0fQ2TlTFTcJS8U1oxXQ9e5mA62S2RJgUU6db20CRoJyDvae2EQ==} 124 | engines: {node: ^14 || ^16 || >=18} 125 | peerDependencies: 126 | postcss: ^8.4 127 | 128 | '@csstools/postcss-font-format-keywords@3.0.2': 129 | resolution: {integrity: sha512-E0xz2sjm4AMCkXLCFvI/lyl4XO6aN1NCSMMVEOngFDJ+k2rDwfr6NDjWljk1li42jiLNChVX+YFnmfGCigZKXw==} 130 | engines: {node: ^14 || ^16 || >=18} 131 | peerDependencies: 132 | postcss: ^8.4 133 | 134 | '@csstools/postcss-gamut-mapping@1.0.11': 135 | resolution: {integrity: sha512-KrHGsUPXRYxboXmJ9wiU/RzDM7y/5uIefLWKFSc36Pok7fxiPyvkSHO51kh+RLZS1W5hbqw9qaa6+tKpTSxa5g==} 136 | engines: {node: ^14 || ^16 || >=18} 137 | peerDependencies: 138 | postcss: ^8.4 139 | 140 | '@csstools/postcss-gradients-interpolation-method@4.0.20': 141 | resolution: {integrity: sha512-ZFl2JBHano6R20KB5ZrB8KdPM2pVK0u+/3cGQ2T8VubJq982I2LSOvQ4/VtxkAXjkPkk1rXt4AD1ni7UjTZ1Og==} 142 | engines: {node: ^14 || ^16 || >=18} 143 | peerDependencies: 144 | postcss: ^8.4 145 | 146 | '@csstools/postcss-hwb-function@3.0.18': 147 | resolution: {integrity: sha512-3ifnLltR5C7zrJ+g18caxkvSRnu9jBBXCYgnBznRjxm6gQJGnnCO9H6toHfywNdNr/qkiVf2dymERPQLDnjLRQ==} 148 | engines: {node: ^14 || ^16 || >=18} 149 | peerDependencies: 150 | postcss: ^8.4 151 | 152 | '@csstools/postcss-ic-unit@3.0.7': 153 | resolution: {integrity: sha512-YoaNHH2wNZD+c+rHV02l4xQuDpfR8MaL7hD45iJyr+USwvr0LOheeytJ6rq8FN6hXBmEeoJBeXXgGmM8fkhH4g==} 154 | engines: {node: ^14 || ^16 || >=18} 155 | peerDependencies: 156 | postcss: ^8.4 157 | 158 | '@csstools/postcss-initial@1.0.1': 159 | resolution: {integrity: sha512-wtb+IbUIrIf8CrN6MLQuFR7nlU5C7PwuebfeEXfjthUha1+XZj2RVi+5k/lukToA24sZkYAiSJfHM8uG/UZIdg==} 160 | engines: {node: ^14 || ^16 || >=18} 161 | peerDependencies: 162 | postcss: ^8.4 163 | 164 | '@csstools/postcss-is-pseudo-class@4.0.8': 165 | resolution: {integrity: sha512-0aj591yGlq5Qac+plaWCbn5cpjs5Sh0daovYUKJUOMjIp70prGH/XPLp7QjxtbFXz3CTvb0H9a35dpEuIuUi3Q==} 166 | engines: {node: ^14 || ^16 || >=18} 167 | peerDependencies: 168 | postcss: ^8.4 169 | 170 | '@csstools/postcss-light-dark-function@1.0.8': 171 | resolution: {integrity: sha512-x0UtpCyVnERsplUeoaY6nEtp1HxTf4lJjoK/ULEm40DraqFfUdUSt76yoOyX5rGY6eeOUOkurHyYlFHVKv/pew==} 172 | engines: {node: ^14 || ^16 || >=18} 173 | peerDependencies: 174 | postcss: ^8.4 175 | 176 | '@csstools/postcss-logical-float-and-clear@2.0.1': 177 | resolution: {integrity: sha512-SsrWUNaXKr+e/Uo4R/uIsqJYt3DaggIh/jyZdhy/q8fECoJSKsSMr7nObSLdvoULB69Zb6Bs+sefEIoMG/YfOA==} 178 | engines: {node: ^14 || ^16 || >=18} 179 | peerDependencies: 180 | postcss: ^8.4 181 | 182 | '@csstools/postcss-logical-overflow@1.0.1': 183 | resolution: {integrity: sha512-Kl4lAbMg0iyztEzDhZuQw8Sj9r2uqFDcU1IPl+AAt2nue8K/f1i7ElvKtXkjhIAmKiy5h2EY8Gt/Cqg0pYFDCw==} 184 | engines: {node: ^14 || ^16 || >=18} 185 | peerDependencies: 186 | postcss: ^8.4 187 | 188 | '@csstools/postcss-logical-overscroll-behavior@1.0.1': 189 | resolution: {integrity: sha512-+kHamNxAnX8ojPCtV8WPcUP3XcqMFBSDuBuvT6MHgq7oX4IQxLIXKx64t7g9LiuJzE7vd06Q9qUYR6bh4YnGpQ==} 190 | engines: {node: ^14 || ^16 || >=18} 191 | peerDependencies: 192 | postcss: ^8.4 193 | 194 | '@csstools/postcss-logical-resize@2.0.1': 195 | resolution: {integrity: sha512-W5Gtwz7oIuFcKa5SmBjQ2uxr8ZoL7M2bkoIf0T1WeNqljMkBrfw1DDA8/J83k57NQ1kcweJEjkJ04pUkmyee3A==} 196 | engines: {node: ^14 || ^16 || >=18} 197 | peerDependencies: 198 | postcss: ^8.4 199 | 200 | '@csstools/postcss-logical-viewport-units@2.0.11': 201 | resolution: {integrity: sha512-ElITMOGcjQtvouxjd90WmJRIw1J7KMP+M+O87HaVtlgOOlDt1uEPeTeii8qKGe2AiedEp0XOGIo9lidbiU2Ogg==} 202 | engines: {node: ^14 || ^16 || >=18} 203 | peerDependencies: 204 | postcss: ^8.4 205 | 206 | '@csstools/postcss-media-minmax@1.1.8': 207 | resolution: {integrity: sha512-KYQCal2i7XPNtHAUxCECdrC7tuxIWQCW+s8eMYs5r5PaAiVTeKwlrkRS096PFgojdNCmHeG0Cb7njtuNswNf+w==} 208 | engines: {node: ^14 || ^16 || >=18} 209 | peerDependencies: 210 | postcss: ^8.4 211 | 212 | '@csstools/postcss-media-queries-aspect-ratio-number-values@2.0.11': 213 | resolution: {integrity: sha512-YD6jrib20GRGQcnOu49VJjoAnQ/4249liuz7vTpy/JfgqQ1Dlc5eD4HPUMNLOw9CWey9E6Etxwf/xc/ZF8fECA==} 214 | engines: {node: ^14 || ^16 || >=18} 215 | peerDependencies: 216 | postcss: ^8.4 217 | 218 | '@csstools/postcss-nested-calc@3.0.2': 219 | resolution: {integrity: sha512-ySUmPyawiHSmBW/VI44+IObcKH0v88LqFe0d09Sb3w4B1qjkaROc6d5IA3ll9kjD46IIX/dbO5bwFN/swyoyZA==} 220 | engines: {node: ^14 || ^16 || >=18} 221 | peerDependencies: 222 | postcss: ^8.4 223 | 224 | '@csstools/postcss-normalize-display-values@3.0.2': 225 | resolution: {integrity: sha512-fCapyyT/dUdyPtrelQSIV+d5HqtTgnNP/BEG9IuhgXHt93Wc4CfC1bQ55GzKAjWrZbgakMQ7MLfCXEf3rlZJOw==} 226 | engines: {node: ^14 || ^16 || >=18} 227 | peerDependencies: 228 | postcss: ^8.4 229 | 230 | '@csstools/postcss-oklab-function@3.0.19': 231 | resolution: {integrity: sha512-e3JxXmxjU3jpU7TzZrsNqSX4OHByRC3XjItV3Ieo/JEQmLg5rdOL4lkv/1vp27gXemzfNt44F42k/pn0FpE21Q==} 232 | engines: {node: ^14 || ^16 || >=18} 233 | peerDependencies: 234 | postcss: ^8.4 235 | 236 | '@csstools/postcss-progressive-custom-properties@3.3.0': 237 | resolution: {integrity: sha512-W2oV01phnILaRGYPmGFlL2MT/OgYjQDrL9sFlbdikMFi6oQkFki9B86XqEWR7HCsTZFVq7dbzr/o71B75TKkGg==} 238 | engines: {node: ^14 || ^16 || >=18} 239 | peerDependencies: 240 | postcss: ^8.4 241 | 242 | '@csstools/postcss-relative-color-syntax@2.0.19': 243 | resolution: {integrity: sha512-MxUMSNvio1WwuS6WRLlQuv6nNPXwIWUFzBBAvL/tBdWfiKjiJnAa6eSSN5gtaacSqUkQ/Ce5Z1OzLRfeaWhADA==} 244 | engines: {node: ^14 || ^16 || >=18} 245 | peerDependencies: 246 | postcss: ^8.4 247 | 248 | '@csstools/postcss-scope-pseudo-class@3.0.1': 249 | resolution: {integrity: sha512-3ZFonK2gfgqg29gUJ2w7xVw2wFJ1eNWVDONjbzGkm73gJHVCYK5fnCqlLr+N+KbEfv2XbWAO0AaOJCFB6Fer6A==} 250 | engines: {node: ^14 || ^16 || >=18} 251 | peerDependencies: 252 | postcss: ^8.4 253 | 254 | '@csstools/postcss-stepped-value-functions@3.0.10': 255 | resolution: {integrity: sha512-MZwo0D0TYrQhT5FQzMqfy/nGZ28D1iFtpN7Su1ck5BPHS95+/Y5O9S4kEvo76f2YOsqwYcT8ZGehSI1TnzuX2g==} 256 | engines: {node: ^14 || ^16 || >=18} 257 | peerDependencies: 258 | postcss: ^8.4 259 | 260 | '@csstools/postcss-text-decoration-shorthand@3.0.7': 261 | resolution: {integrity: sha512-+cptcsM5r45jntU6VjotnkC9GteFR7BQBfZ5oW7inLCxj7AfLGAzMbZ60hKTP13AULVZBdxky0P8um0IBfLHVA==} 262 | engines: {node: ^14 || ^16 || >=18} 263 | peerDependencies: 264 | postcss: ^8.4 265 | 266 | '@csstools/postcss-trigonometric-functions@3.0.10': 267 | resolution: {integrity: sha512-G9G8moTc2wiad61nY5HfvxLiM/myX0aYK4s1x8MQlPH29WDPxHQM7ghGgvv2qf2xH+rrXhztOmjGHJj4jsEqXw==} 268 | engines: {node: ^14 || ^16 || >=18} 269 | peerDependencies: 270 | postcss: ^8.4 271 | 272 | '@csstools/postcss-unset-value@3.0.1': 273 | resolution: {integrity: sha512-dbDnZ2ja2U8mbPP0Hvmt2RMEGBiF1H7oY6HYSpjteXJGihYwgxgTr6KRbbJ/V6c+4wd51M+9980qG4gKVn5ttg==} 274 | engines: {node: ^14 || ^16 || >=18} 275 | peerDependencies: 276 | postcss: ^8.4 277 | 278 | '@csstools/selector-resolve-nested@1.1.0': 279 | resolution: {integrity: sha512-uWvSaeRcHyeNenKg8tp17EVDRkpflmdyvbE0DHo6D/GdBb6PDnCYYU6gRpXhtICMGMcahQmj2zGxwFM/WC8hCg==} 280 | engines: {node: ^14 || ^16 || >=18} 281 | peerDependencies: 282 | postcss-selector-parser: ^6.0.13 283 | 284 | '@csstools/selector-specificity@3.1.1': 285 | resolution: {integrity: sha512-a7cxGcJ2wIlMFLlh8z2ONm+715QkPHiyJcxwQlKOz/03GPw1COpfhcmC9wm4xlZfp//jWHNNMwzjtqHXVWU9KA==} 286 | engines: {node: ^14 || ^16 || >=18} 287 | peerDependencies: 288 | postcss-selector-parser: ^6.0.13 289 | 290 | '@csstools/utilities@1.0.0': 291 | resolution: {integrity: sha512-tAgvZQe/t2mlvpNosA4+CkMiZ2azISW5WPAcdSalZlEjQvUfghHxfQcrCiK/7/CrfAWVxyM88kGFYO82heIGDg==} 292 | engines: {node: ^14 || ^16 || >=18} 293 | peerDependencies: 294 | postcss: ^8.4 295 | 296 | '@esbuild/android-arm64@0.18.20': 297 | resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==} 298 | engines: {node: '>=12'} 299 | cpu: [arm64] 300 | os: [android] 301 | 302 | '@esbuild/android-arm@0.18.20': 303 | resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==} 304 | engines: {node: '>=12'} 305 | cpu: [arm] 306 | os: [android] 307 | 308 | '@esbuild/android-x64@0.18.20': 309 | resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==} 310 | engines: {node: '>=12'} 311 | cpu: [x64] 312 | os: [android] 313 | 314 | '@esbuild/darwin-arm64@0.18.20': 315 | resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==} 316 | engines: {node: '>=12'} 317 | cpu: [arm64] 318 | os: [darwin] 319 | 320 | '@esbuild/darwin-x64@0.18.20': 321 | resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==} 322 | engines: {node: '>=12'} 323 | cpu: [x64] 324 | os: [darwin] 325 | 326 | '@esbuild/freebsd-arm64@0.18.20': 327 | resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==} 328 | engines: {node: '>=12'} 329 | cpu: [arm64] 330 | os: [freebsd] 331 | 332 | '@esbuild/freebsd-x64@0.18.20': 333 | resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==} 334 | engines: {node: '>=12'} 335 | cpu: [x64] 336 | os: [freebsd] 337 | 338 | '@esbuild/linux-arm64@0.18.20': 339 | resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==} 340 | engines: {node: '>=12'} 341 | cpu: [arm64] 342 | os: [linux] 343 | 344 | '@esbuild/linux-arm@0.18.20': 345 | resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==} 346 | engines: {node: '>=12'} 347 | cpu: [arm] 348 | os: [linux] 349 | 350 | '@esbuild/linux-ia32@0.18.20': 351 | resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==} 352 | engines: {node: '>=12'} 353 | cpu: [ia32] 354 | os: [linux] 355 | 356 | '@esbuild/linux-loong64@0.18.20': 357 | resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==} 358 | engines: {node: '>=12'} 359 | cpu: [loong64] 360 | os: [linux] 361 | 362 | '@esbuild/linux-mips64el@0.18.20': 363 | resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==} 364 | engines: {node: '>=12'} 365 | cpu: [mips64el] 366 | os: [linux] 367 | 368 | '@esbuild/linux-ppc64@0.18.20': 369 | resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==} 370 | engines: {node: '>=12'} 371 | cpu: [ppc64] 372 | os: [linux] 373 | 374 | '@esbuild/linux-riscv64@0.18.20': 375 | resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==} 376 | engines: {node: '>=12'} 377 | cpu: [riscv64] 378 | os: [linux] 379 | 380 | '@esbuild/linux-s390x@0.18.20': 381 | resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==} 382 | engines: {node: '>=12'} 383 | cpu: [s390x] 384 | os: [linux] 385 | 386 | '@esbuild/linux-x64@0.18.20': 387 | resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==} 388 | engines: {node: '>=12'} 389 | cpu: [x64] 390 | os: [linux] 391 | 392 | '@esbuild/netbsd-x64@0.18.20': 393 | resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==} 394 | engines: {node: '>=12'} 395 | cpu: [x64] 396 | os: [netbsd] 397 | 398 | '@esbuild/openbsd-x64@0.18.20': 399 | resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==} 400 | engines: {node: '>=12'} 401 | cpu: [x64] 402 | os: [openbsd] 403 | 404 | '@esbuild/sunos-x64@0.18.20': 405 | resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==} 406 | engines: {node: '>=12'} 407 | cpu: [x64] 408 | os: [sunos] 409 | 410 | '@esbuild/win32-arm64@0.18.20': 411 | resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==} 412 | engines: {node: '>=12'} 413 | cpu: [arm64] 414 | os: [win32] 415 | 416 | '@esbuild/win32-ia32@0.18.20': 417 | resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==} 418 | engines: {node: '>=12'} 419 | cpu: [ia32] 420 | os: [win32] 421 | 422 | '@esbuild/win32-x64@0.18.20': 423 | resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==} 424 | engines: {node: '>=12'} 425 | cpu: [x64] 426 | os: [win32] 427 | 428 | '@jridgewell/sourcemap-codec@1.5.0': 429 | resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} 430 | 431 | '@types/web-bluetooth@0.0.20': 432 | resolution: {integrity: sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==} 433 | 434 | '@vitejs/plugin-vue@4.6.2': 435 | resolution: {integrity: sha512-kqf7SGFoG+80aZG6Pf+gsZIVvGSCKE98JbiWqcCV9cThtg91Jav0yvYFC9Zb+jKetNGF6ZKeoaxgZfND21fWKw==} 436 | engines: {node: ^14.18.0 || >=16.0.0} 437 | peerDependencies: 438 | vite: ^4.0.0 || ^5.0.0 439 | vue: ^3.2.25 440 | 441 | '@vue/compiler-core@3.5.16': 442 | resolution: {integrity: sha512-AOQS2eaQOaaZQoL1u+2rCJIKDruNXVBZSiUD3chnUrsoX5ZTQMaCvXlWNIfxBJuU15r1o7+mpo5223KVtIhAgQ==} 443 | 444 | '@vue/compiler-dom@3.5.16': 445 | resolution: {integrity: sha512-SSJIhBr/teipXiXjmWOVWLnxjNGo65Oj/8wTEQz0nqwQeP75jWZ0n4sF24Zxoht1cuJoWopwj0J0exYwCJ0dCQ==} 446 | 447 | '@vue/compiler-sfc@3.5.16': 448 | resolution: {integrity: sha512-rQR6VSFNpiinDy/DVUE0vHoIDUF++6p910cgcZoaAUm3POxgNOOdS/xgoll3rNdKYTYPnnbARDCZOyZ+QSe6Pw==} 449 | 450 | '@vue/compiler-ssr@3.5.16': 451 | resolution: {integrity: sha512-d2V7kfxbdsjrDSGlJE7my1ZzCXViEcqN6w14DOsDrUCHEA6vbnVCpRFfrc4ryCP/lCKzX2eS1YtnLE/BuC9f/A==} 452 | 453 | '@vue/devtools-api@6.6.4': 454 | resolution: {integrity: sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==} 455 | 456 | '@vue/reactivity@3.5.16': 457 | resolution: {integrity: sha512-FG5Q5ee/kxhIm1p2bykPpPwqiUBV3kFySsHEQha5BJvjXdZTUfmya7wP7zC39dFuZAcf/PD5S4Lni55vGLMhvA==} 458 | 459 | '@vue/runtime-core@3.5.16': 460 | resolution: {integrity: sha512-bw5Ykq6+JFHYxrQa7Tjr+VSzw7Dj4ldR/udyBZbq73fCdJmyy5MPIFR9IX/M5Qs+TtTjuyUTCnmK3lWWwpAcFQ==} 461 | 462 | '@vue/runtime-dom@3.5.16': 463 | resolution: {integrity: sha512-T1qqYJsG2xMGhImRUV9y/RseB9d0eCYZQ4CWca9ztCuiPj/XWNNN+lkNBuzVbia5z4/cgxdL28NoQCvC0Xcfww==} 464 | 465 | '@vue/server-renderer@3.5.16': 466 | resolution: {integrity: sha512-BrX0qLiv/WugguGsnQUJiYOE0Fe5mZTwi6b7X/ybGB0vfrPH9z0gD/Y6WOR1sGCgX4gc25L1RYS5eYQKDMoNIg==} 467 | peerDependencies: 468 | vue: 3.5.16 469 | 470 | '@vue/shared@3.5.16': 471 | resolution: {integrity: sha512-c/0fWy3Jw6Z8L9FmTyYfkpM5zklnqqa9+a6dz3DvONRKW2NEbh46BP0FHuLFSWi2TnQEtp91Z6zOWNrU6QiyPg==} 472 | 473 | '@vueuse/core@10.11.1': 474 | resolution: {integrity: sha512-guoy26JQktXPcz+0n3GukWIy/JDNKti9v6VEMu6kV2sYBsWuGiTU8OWdg+ADfUbHg3/3DlqySDe7JmdHrktiww==} 475 | 476 | '@vueuse/metadata@10.11.1': 477 | resolution: {integrity: sha512-IGa5FXd003Ug1qAZmyE8wF3sJ81xGLSqTqtQ6jaVfkeZ4i5kS2mwQF61yhVqojRnenVew5PldLyRgvdl4YYuSw==} 478 | 479 | '@vueuse/shared@10.11.1': 480 | resolution: {integrity: sha512-LHpC8711VFZlDaYUXEBbFBCQ7GS3dVU9mjOhhMhXP6txTV4EhYQg/KGnQuvt/sPAtoUKq7VVUnL6mVtFoL42sA==} 481 | 482 | '@vueuse/sound@2.1.3': 483 | resolution: {integrity: sha512-yZW1dzMJqCp57+ZM1tJ2oPye4RJvWhzkUpGvokB5fhk/jAmOwKGbdvm8O7dJ/YAmP+eLFCBQmELjso6sXSfnAg==} 484 | peerDependencies: 485 | '@vue/composition-api': ^1.0.0-rc.1 486 | vue: ^2.0.0 || >=3.0.0 487 | peerDependenciesMeta: 488 | '@vue/composition-api': 489 | optional: true 490 | 491 | autoprefixer@10.4.21: 492 | resolution: {integrity: sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==} 493 | engines: {node: ^10 || ^12 || >=14} 494 | hasBin: true 495 | peerDependencies: 496 | postcss: ^8.1.0 497 | 498 | browserslist@4.25.0: 499 | resolution: {integrity: sha512-PJ8gYKeS5e/whHBh8xrwYK+dAvEj7JXtz6uTucnMRB8OiGTsKccFekoRrjajPBHV8oOY+2tI4uxeceSimKwMFA==} 500 | engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} 501 | hasBin: true 502 | 503 | caniuse-lite@1.0.30001720: 504 | resolution: {integrity: sha512-Ec/2yV2nNPwb4DnTANEV99ZWwm3ZWfdlfkQbWSDDt+PsXEVYwlhPH8tdMaPunYTKKmz7AnHi2oNEi1GcmKCD8g==} 505 | 506 | css-blank-pseudo@6.0.2: 507 | resolution: {integrity: sha512-J/6m+lsqpKPqWHOifAFtKFeGLOzw3jR92rxQcwRUfA/eTuZzKfKlxOmYDx2+tqOPQAueNvBiY8WhAeHu5qNmTg==} 508 | engines: {node: ^14 || ^16 || >=18} 509 | peerDependencies: 510 | postcss: ^8.4 511 | 512 | css-has-pseudo@6.0.5: 513 | resolution: {integrity: sha512-ZTv6RlvJJZKp32jPYnAJVhowDCrRrHUTAxsYSuUPBEDJjzws6neMnzkRblxtgmv1RgcV5dhH2gn7E3wA9Wt6lw==} 514 | engines: {node: ^14 || ^16 || >=18} 515 | peerDependencies: 516 | postcss: ^8.4 517 | 518 | css-prefers-color-scheme@9.0.1: 519 | resolution: {integrity: sha512-iFit06ochwCKPRiWagbTa1OAWCvWWVdEnIFd8BaRrgO8YrrNh4RAWUQTFcYX5tdFZgFl1DJ3iiULchZyEbnF4g==} 520 | engines: {node: ^14 || ^16 || >=18} 521 | peerDependencies: 522 | postcss: ^8.4 523 | 524 | cssdb@8.3.0: 525 | resolution: {integrity: sha512-c7bmItIg38DgGjSwDPZOYF/2o0QU/sSgkWOMyl8votOfgFuyiFKWPesmCGEsrGLxEA9uL540cp8LdaGEjUGsZQ==} 526 | 527 | cssesc@3.0.0: 528 | resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} 529 | engines: {node: '>=4'} 530 | hasBin: true 531 | 532 | csstype@3.1.3: 533 | resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} 534 | 535 | electron-to-chromium@1.5.162: 536 | resolution: {integrity: sha512-hQA+Zb5QQwoSaXJWEAGEw1zhk//O7qDzib05Z4qTqZfNju/FAkrm5ZInp0JbTp4Z18A6bilopdZWEYrFSsfllA==} 537 | 538 | entities@4.5.0: 539 | resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} 540 | engines: {node: '>=0.12'} 541 | 542 | esbuild@0.18.20: 543 | resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==} 544 | engines: {node: '>=12'} 545 | hasBin: true 546 | 547 | escalade@3.2.0: 548 | resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} 549 | engines: {node: '>=6'} 550 | 551 | estree-walker@2.0.2: 552 | resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} 553 | 554 | fraction.js@4.3.7: 555 | resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} 556 | 557 | fsevents@2.3.3: 558 | resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} 559 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 560 | os: [darwin] 561 | 562 | howler@2.2.4: 563 | resolution: {integrity: sha512-iARIBPgcQrwtEr+tALF+rapJ8qSc+Set2GJQl7xT1MQzWaVkFebdJhR3alVlSiUf5U7nAANKuj3aWpwerocD5w==} 564 | 565 | magic-string@0.30.17: 566 | resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} 567 | 568 | nanoid@3.3.11: 569 | resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} 570 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 571 | hasBin: true 572 | 573 | node-releases@2.0.19: 574 | resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} 575 | 576 | normalize-range@0.1.2: 577 | resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} 578 | engines: {node: '>=0.10.0'} 579 | 580 | picocolors@1.1.1: 581 | resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} 582 | 583 | pinia@2.3.1: 584 | resolution: {integrity: sha512-khUlZSwt9xXCaTbbxFYBKDc/bWAGWJjOgvxETwkTN7KRm66EeT1ZdZj6i2ceh9sP2Pzqsbc704r2yngBrxBVug==} 585 | peerDependencies: 586 | typescript: '>=4.4.4' 587 | vue: ^2.7.0 || ^3.5.11 588 | peerDependenciesMeta: 589 | typescript: 590 | optional: true 591 | 592 | postcss-attribute-case-insensitive@6.0.3: 593 | resolution: {integrity: sha512-KHkmCILThWBRtg+Jn1owTnHPnFit4OkqS+eKiGEOPIGke54DCeYGJ6r0Fx/HjfE9M9kznApCLcU0DvnPchazMQ==} 594 | engines: {node: ^14 || ^16 || >=18} 595 | peerDependencies: 596 | postcss: ^8.4 597 | 598 | postcss-clamp@4.1.0: 599 | resolution: {integrity: sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow==} 600 | engines: {node: '>=7.6.0'} 601 | peerDependencies: 602 | postcss: ^8.4.6 603 | 604 | postcss-color-functional-notation@6.0.14: 605 | resolution: {integrity: sha512-dNUX+UH4dAozZ8uMHZ3CtCNYw8fyFAmqqdcyxMr7PEdM9jLXV19YscoYO0F25KqZYhmtWKQ+4tKrIZQrwzwg7A==} 606 | engines: {node: ^14 || ^16 || >=18} 607 | peerDependencies: 608 | postcss: ^8.4 609 | 610 | postcss-color-hex-alpha@9.0.4: 611 | resolution: {integrity: sha512-XQZm4q4fNFqVCYMGPiBjcqDhuG7Ey2xrl99AnDJMyr5eDASsAGalndVgHZF8i97VFNy1GQeZc4q2ydagGmhelQ==} 612 | engines: {node: ^14 || ^16 || >=18} 613 | peerDependencies: 614 | postcss: ^8.4 615 | 616 | postcss-color-rebeccapurple@9.0.3: 617 | resolution: {integrity: sha512-ruBqzEFDYHrcVq3FnW3XHgwRqVMrtEPLBtD7K2YmsLKVc2jbkxzzNEctJKsPCpDZ+LeMHLKRDoSShVefGc+CkQ==} 618 | engines: {node: ^14 || ^16 || >=18} 619 | peerDependencies: 620 | postcss: ^8.4 621 | 622 | postcss-custom-media@10.0.8: 623 | resolution: {integrity: sha512-V1KgPcmvlGdxTel4/CyQtBJEFhMVpEmRGFrnVtgfGIHj5PJX9vO36eFBxKBeJn+aCDTed70cc+98Mz3J/uVdGQ==} 624 | engines: {node: ^14 || ^16 || >=18} 625 | peerDependencies: 626 | postcss: ^8.4 627 | 628 | postcss-custom-properties@13.3.12: 629 | resolution: {integrity: sha512-oPn/OVqONB2ZLNqN185LDyaVByELAA/u3l2CS2TS16x2j2XsmV4kd8U49+TMxmUsEU9d8fB/I10E6U7kB0L1BA==} 630 | engines: {node: ^14 || ^16 || >=18} 631 | peerDependencies: 632 | postcss: ^8.4 633 | 634 | postcss-custom-selectors@7.1.12: 635 | resolution: {integrity: sha512-ctIoprBMJwByYMGjXG0F7IT2iMF2hnamQ+aWZETyBM0aAlyaYdVZTeUkk8RB+9h9wP+NdN3f01lfvKl2ZSqC0g==} 636 | engines: {node: ^14 || ^16 || >=18} 637 | peerDependencies: 638 | postcss: ^8.4 639 | 640 | postcss-dir-pseudo-class@8.0.1: 641 | resolution: {integrity: sha512-uULohfWBBVoFiZXgsQA24JV6FdKIidQ+ZqxOouhWwdE+qJlALbkS5ScB43ZTjPK+xUZZhlaO/NjfCt5h4IKUfw==} 642 | engines: {node: ^14 || ^16 || >=18} 643 | peerDependencies: 644 | postcss: ^8.4 645 | 646 | postcss-double-position-gradients@5.0.7: 647 | resolution: {integrity: sha512-1xEhjV9u1s4l3iP5lRt1zvMjI/ya8492o9l/ivcxHhkO3nOz16moC4JpMxDUGrOs4R3hX+KWT7gKoV842cwRgg==} 648 | engines: {node: ^14 || ^16 || >=18} 649 | peerDependencies: 650 | postcss: ^8.4 651 | 652 | postcss-focus-visible@9.0.1: 653 | resolution: {integrity: sha512-N2VQ5uPz3Z9ZcqI5tmeholn4d+1H14fKXszpjogZIrFbhaq0zNAtq8sAnw6VLiqGbL8YBzsnu7K9bBkTqaRimQ==} 654 | engines: {node: ^14 || ^16 || >=18} 655 | peerDependencies: 656 | postcss: ^8.4 657 | 658 | postcss-focus-within@8.0.1: 659 | resolution: {integrity: sha512-NFU3xcY/xwNaapVb+1uJ4n23XImoC86JNwkY/uduytSl2s9Ekc2EpzmRR63+ExitnW3Mab3Fba/wRPCT5oDILA==} 660 | engines: {node: ^14 || ^16 || >=18} 661 | peerDependencies: 662 | postcss: ^8.4 663 | 664 | postcss-font-variant@5.0.0: 665 | resolution: {integrity: sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==} 666 | peerDependencies: 667 | postcss: ^8.1.0 668 | 669 | postcss-gap-properties@5.0.1: 670 | resolution: {integrity: sha512-k2z9Cnngc24c0KF4MtMuDdToROYqGMMUQGcE6V0odwjHyOHtaDBlLeRBV70y9/vF7KIbShrTRZ70JjsI1BZyWw==} 671 | engines: {node: ^14 || ^16 || >=18} 672 | peerDependencies: 673 | postcss: ^8.4 674 | 675 | postcss-image-set-function@6.0.3: 676 | resolution: {integrity: sha512-i2bXrBYzfbRzFnm+pVuxVePSTCRiNmlfssGI4H0tJQvDue+yywXwUxe68VyzXs7cGtMaH6MCLY6IbCShrSroCw==} 677 | engines: {node: ^14 || ^16 || >=18} 678 | peerDependencies: 679 | postcss: ^8.4 680 | 681 | postcss-lab-function@6.0.19: 682 | resolution: {integrity: sha512-vwln/mgvFrotJuGV8GFhpAOu9iGf3pvTBr6dLPDmUcqVD5OsQpEFyQMAFTxSxWXGEzBj6ld4pZ/9GDfEpXvo0g==} 683 | engines: {node: ^14 || ^16 || >=18} 684 | peerDependencies: 685 | postcss: ^8.4 686 | 687 | postcss-logical@7.0.1: 688 | resolution: {integrity: sha512-8GwUQZE0ri0K0HJHkDv87XOLC8DE0msc+HoWLeKdtjDZEwpZ5xuK3QdV6FhmHSQW40LPkg43QzvATRAI3LsRkg==} 689 | engines: {node: ^14 || ^16 || >=18} 690 | peerDependencies: 691 | postcss: ^8.4 692 | 693 | postcss-nesting@12.1.5: 694 | resolution: {integrity: sha512-N1NgI1PDCiAGWPTYrwqm8wpjv0bgDmkYHH72pNsqTCv9CObxjxftdYu6AKtGN+pnJa7FQjMm3v4sp8QJbFsYdQ==} 695 | engines: {node: ^14 || ^16 || >=18} 696 | peerDependencies: 697 | postcss: ^8.4 698 | 699 | postcss-opacity-percentage@2.0.0: 700 | resolution: {integrity: sha512-lyDrCOtntq5Y1JZpBFzIWm2wG9kbEdujpNt4NLannF+J9c8CgFIzPa80YQfdza+Y+yFfzbYj/rfoOsYsooUWTQ==} 701 | engines: {node: ^14 || ^16 || >=18} 702 | peerDependencies: 703 | postcss: ^8.2 704 | 705 | postcss-overflow-shorthand@5.0.1: 706 | resolution: {integrity: sha512-XzjBYKLd1t6vHsaokMV9URBt2EwC9a7nDhpQpjoPk2HRTSQfokPfyAS/Q7AOrzUu6q+vp/GnrDBGuj/FCaRqrQ==} 707 | engines: {node: ^14 || ^16 || >=18} 708 | peerDependencies: 709 | postcss: ^8.4 710 | 711 | postcss-page-break@3.0.4: 712 | resolution: {integrity: sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==} 713 | peerDependencies: 714 | postcss: ^8 715 | 716 | postcss-place@9.0.1: 717 | resolution: {integrity: sha512-JfL+paQOgRQRMoYFc2f73pGuG/Aw3tt4vYMR6UA3cWVMxivviPTnMFnFTczUJOA4K2Zga6xgQVE+PcLs64WC8Q==} 718 | engines: {node: ^14 || ^16 || >=18} 719 | peerDependencies: 720 | postcss: ^8.4 721 | 722 | postcss-preset-env@9.6.0: 723 | resolution: {integrity: sha512-Lxfk4RYjUdwPCYkc321QMdgtdCP34AeI94z+/8kVmqnTIlD4bMRQeGcMZgwz8BxHrzQiFXYIR5d7k/9JMs2MEA==} 724 | engines: {node: ^14 || ^16 || >=18} 725 | peerDependencies: 726 | postcss: ^8.4 727 | 728 | postcss-pseudo-class-any-link@9.0.2: 729 | resolution: {integrity: sha512-HFSsxIqQ9nA27ahyfH37cRWGk3SYyQLpk0LiWw/UGMV4VKT5YG2ONee4Pz/oFesnK0dn2AjcyequDbIjKJgB0g==} 730 | engines: {node: ^14 || ^16 || >=18} 731 | peerDependencies: 732 | postcss: ^8.4 733 | 734 | postcss-replace-overflow-wrap@4.0.0: 735 | resolution: {integrity: sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==} 736 | peerDependencies: 737 | postcss: ^8.0.3 738 | 739 | postcss-selector-not@7.0.2: 740 | resolution: {integrity: sha512-/SSxf/90Obye49VZIfc0ls4H0P6i6V1iHv0pzZH8SdgvZOPFkF37ef1r5cyWcMflJSFJ5bfuoluTnFnBBFiuSA==} 741 | engines: {node: ^14 || ^16 || >=18} 742 | peerDependencies: 743 | postcss: ^8.4 744 | 745 | postcss-selector-parser@6.1.2: 746 | resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} 747 | engines: {node: '>=4'} 748 | 749 | postcss-value-parser@4.2.0: 750 | resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} 751 | 752 | postcss@8.5.4: 753 | resolution: {integrity: sha512-QSa9EBe+uwlGTFmHsPKokv3B/oEMQZxfqW0QqNCyhpa6mB1afzulwn8hihglqAb2pOw+BJgNlmXQ8la2VeHB7w==} 754 | engines: {node: ^10 || ^12 || >=14} 755 | 756 | rollup@3.29.5: 757 | resolution: {integrity: sha512-GVsDdsbJzzy4S/v3dqWPJ7EfvZJfCHiDqe80IyrF59LYuP+e6U1LJoUqeuqRbwAWoMNoXivMNeNAOf5E22VA1w==} 758 | engines: {node: '>=14.18.0', npm: '>=8.0.0'} 759 | hasBin: true 760 | 761 | source-map-js@1.2.1: 762 | resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} 763 | engines: {node: '>=0.10.0'} 764 | 765 | update-browserslist-db@1.1.3: 766 | resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==} 767 | hasBin: true 768 | peerDependencies: 769 | browserslist: '>= 4.21.0' 770 | 771 | util-deprecate@1.0.2: 772 | resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} 773 | 774 | vite@4.5.14: 775 | resolution: {integrity: sha512-+v57oAaoYNnO3hIu5Z/tJRZjq5aHM2zDve9YZ8HngVHbhk66RStobhb1sqPMIPEleV6cNKYK4eGrAbE9Ulbl2g==} 776 | engines: {node: ^14.18.0 || >=16.0.0} 777 | hasBin: true 778 | peerDependencies: 779 | '@types/node': '>= 14' 780 | less: '*' 781 | lightningcss: ^1.21.0 782 | sass: '*' 783 | stylus: '*' 784 | sugarss: '*' 785 | terser: ^5.4.0 786 | peerDependenciesMeta: 787 | '@types/node': 788 | optional: true 789 | less: 790 | optional: true 791 | lightningcss: 792 | optional: true 793 | sass: 794 | optional: true 795 | stylus: 796 | optional: true 797 | sugarss: 798 | optional: true 799 | terser: 800 | optional: true 801 | 802 | vue-demi@0.14.10: 803 | resolution: {integrity: sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==} 804 | engines: {node: '>=12'} 805 | hasBin: true 806 | peerDependencies: 807 | '@vue/composition-api': ^1.0.0-rc.1 808 | vue: ^3.0.0-0 || ^2.6.0 809 | peerDependenciesMeta: 810 | '@vue/composition-api': 811 | optional: true 812 | 813 | vue-router@4.5.1: 814 | resolution: {integrity: sha512-ogAF3P97NPm8fJsE4by9dwSYtDwXIY1nFY9T6DyQnGHd1E2Da94w9JIolpe42LJGIl0DwOHBi8TcRPlPGwbTtw==} 815 | peerDependencies: 816 | vue: ^3.2.0 817 | 818 | vue@3.5.16: 819 | resolution: {integrity: sha512-rjOV2ecxMd5SiAmof2xzh2WxntRcigkX/He4YFJ6WdRvVUrbt6DxC1Iujh10XLl8xCDRDtGKMeO3D+pRQ1PP9w==} 820 | peerDependencies: 821 | typescript: '*' 822 | peerDependenciesMeta: 823 | typescript: 824 | optional: true 825 | 826 | snapshots: 827 | 828 | '@babel/helper-string-parser@7.27.1': {} 829 | 830 | '@babel/helper-validator-identifier@7.27.1': {} 831 | 832 | '@babel/parser@7.27.4': 833 | dependencies: 834 | '@babel/types': 7.27.3 835 | 836 | '@babel/types@7.27.3': 837 | dependencies: 838 | '@babel/helper-string-parser': 7.27.1 839 | '@babel/helper-validator-identifier': 7.27.1 840 | 841 | '@csstools/cascade-layer-name-parser@1.0.13(@csstools/css-parser-algorithms@2.7.1(@csstools/css-tokenizer@2.4.1))(@csstools/css-tokenizer@2.4.1)': 842 | dependencies: 843 | '@csstools/css-parser-algorithms': 2.7.1(@csstools/css-tokenizer@2.4.1) 844 | '@csstools/css-tokenizer': 2.4.1 845 | 846 | '@csstools/color-helpers@4.2.1': {} 847 | 848 | '@csstools/css-calc@1.2.4(@csstools/css-parser-algorithms@2.7.1(@csstools/css-tokenizer@2.4.1))(@csstools/css-tokenizer@2.4.1)': 849 | dependencies: 850 | '@csstools/css-parser-algorithms': 2.7.1(@csstools/css-tokenizer@2.4.1) 851 | '@csstools/css-tokenizer': 2.4.1 852 | 853 | '@csstools/css-color-parser@2.0.5(@csstools/css-parser-algorithms@2.7.1(@csstools/css-tokenizer@2.4.1))(@csstools/css-tokenizer@2.4.1)': 854 | dependencies: 855 | '@csstools/color-helpers': 4.2.1 856 | '@csstools/css-calc': 1.2.4(@csstools/css-parser-algorithms@2.7.1(@csstools/css-tokenizer@2.4.1))(@csstools/css-tokenizer@2.4.1) 857 | '@csstools/css-parser-algorithms': 2.7.1(@csstools/css-tokenizer@2.4.1) 858 | '@csstools/css-tokenizer': 2.4.1 859 | 860 | '@csstools/css-parser-algorithms@2.7.1(@csstools/css-tokenizer@2.4.1)': 861 | dependencies: 862 | '@csstools/css-tokenizer': 2.4.1 863 | 864 | '@csstools/css-tokenizer@2.4.1': {} 865 | 866 | '@csstools/media-query-list-parser@2.1.13(@csstools/css-parser-algorithms@2.7.1(@csstools/css-tokenizer@2.4.1))(@csstools/css-tokenizer@2.4.1)': 867 | dependencies: 868 | '@csstools/css-parser-algorithms': 2.7.1(@csstools/css-tokenizer@2.4.1) 869 | '@csstools/css-tokenizer': 2.4.1 870 | 871 | '@csstools/postcss-cascade-layers@4.0.6(postcss@8.5.4)': 872 | dependencies: 873 | '@csstools/selector-specificity': 3.1.1(postcss-selector-parser@6.1.2) 874 | postcss: 8.5.4 875 | postcss-selector-parser: 6.1.2 876 | 877 | '@csstools/postcss-color-function@3.0.19(postcss@8.5.4)': 878 | dependencies: 879 | '@csstools/css-color-parser': 2.0.5(@csstools/css-parser-algorithms@2.7.1(@csstools/css-tokenizer@2.4.1))(@csstools/css-tokenizer@2.4.1) 880 | '@csstools/css-parser-algorithms': 2.7.1(@csstools/css-tokenizer@2.4.1) 881 | '@csstools/css-tokenizer': 2.4.1 882 | '@csstools/postcss-progressive-custom-properties': 3.3.0(postcss@8.5.4) 883 | '@csstools/utilities': 1.0.0(postcss@8.5.4) 884 | postcss: 8.5.4 885 | 886 | '@csstools/postcss-color-mix-function@2.0.19(postcss@8.5.4)': 887 | dependencies: 888 | '@csstools/css-color-parser': 2.0.5(@csstools/css-parser-algorithms@2.7.1(@csstools/css-tokenizer@2.4.1))(@csstools/css-tokenizer@2.4.1) 889 | '@csstools/css-parser-algorithms': 2.7.1(@csstools/css-tokenizer@2.4.1) 890 | '@csstools/css-tokenizer': 2.4.1 891 | '@csstools/postcss-progressive-custom-properties': 3.3.0(postcss@8.5.4) 892 | '@csstools/utilities': 1.0.0(postcss@8.5.4) 893 | postcss: 8.5.4 894 | 895 | '@csstools/postcss-content-alt-text@1.0.0(postcss@8.5.4)': 896 | dependencies: 897 | '@csstools/css-parser-algorithms': 2.7.1(@csstools/css-tokenizer@2.4.1) 898 | '@csstools/css-tokenizer': 2.4.1 899 | '@csstools/postcss-progressive-custom-properties': 3.3.0(postcss@8.5.4) 900 | '@csstools/utilities': 1.0.0(postcss@8.5.4) 901 | postcss: 8.5.4 902 | 903 | '@csstools/postcss-exponential-functions@1.0.9(postcss@8.5.4)': 904 | dependencies: 905 | '@csstools/css-calc': 1.2.4(@csstools/css-parser-algorithms@2.7.1(@csstools/css-tokenizer@2.4.1))(@csstools/css-tokenizer@2.4.1) 906 | '@csstools/css-parser-algorithms': 2.7.1(@csstools/css-tokenizer@2.4.1) 907 | '@csstools/css-tokenizer': 2.4.1 908 | postcss: 8.5.4 909 | 910 | '@csstools/postcss-font-format-keywords@3.0.2(postcss@8.5.4)': 911 | dependencies: 912 | '@csstools/utilities': 1.0.0(postcss@8.5.4) 913 | postcss: 8.5.4 914 | postcss-value-parser: 4.2.0 915 | 916 | '@csstools/postcss-gamut-mapping@1.0.11(postcss@8.5.4)': 917 | dependencies: 918 | '@csstools/css-color-parser': 2.0.5(@csstools/css-parser-algorithms@2.7.1(@csstools/css-tokenizer@2.4.1))(@csstools/css-tokenizer@2.4.1) 919 | '@csstools/css-parser-algorithms': 2.7.1(@csstools/css-tokenizer@2.4.1) 920 | '@csstools/css-tokenizer': 2.4.1 921 | postcss: 8.5.4 922 | 923 | '@csstools/postcss-gradients-interpolation-method@4.0.20(postcss@8.5.4)': 924 | dependencies: 925 | '@csstools/css-color-parser': 2.0.5(@csstools/css-parser-algorithms@2.7.1(@csstools/css-tokenizer@2.4.1))(@csstools/css-tokenizer@2.4.1) 926 | '@csstools/css-parser-algorithms': 2.7.1(@csstools/css-tokenizer@2.4.1) 927 | '@csstools/css-tokenizer': 2.4.1 928 | '@csstools/postcss-progressive-custom-properties': 3.3.0(postcss@8.5.4) 929 | '@csstools/utilities': 1.0.0(postcss@8.5.4) 930 | postcss: 8.5.4 931 | 932 | '@csstools/postcss-hwb-function@3.0.18(postcss@8.5.4)': 933 | dependencies: 934 | '@csstools/css-color-parser': 2.0.5(@csstools/css-parser-algorithms@2.7.1(@csstools/css-tokenizer@2.4.1))(@csstools/css-tokenizer@2.4.1) 935 | '@csstools/css-parser-algorithms': 2.7.1(@csstools/css-tokenizer@2.4.1) 936 | '@csstools/css-tokenizer': 2.4.1 937 | '@csstools/postcss-progressive-custom-properties': 3.3.0(postcss@8.5.4) 938 | '@csstools/utilities': 1.0.0(postcss@8.5.4) 939 | postcss: 8.5.4 940 | 941 | '@csstools/postcss-ic-unit@3.0.7(postcss@8.5.4)': 942 | dependencies: 943 | '@csstools/postcss-progressive-custom-properties': 3.3.0(postcss@8.5.4) 944 | '@csstools/utilities': 1.0.0(postcss@8.5.4) 945 | postcss: 8.5.4 946 | postcss-value-parser: 4.2.0 947 | 948 | '@csstools/postcss-initial@1.0.1(postcss@8.5.4)': 949 | dependencies: 950 | postcss: 8.5.4 951 | 952 | '@csstools/postcss-is-pseudo-class@4.0.8(postcss@8.5.4)': 953 | dependencies: 954 | '@csstools/selector-specificity': 3.1.1(postcss-selector-parser@6.1.2) 955 | postcss: 8.5.4 956 | postcss-selector-parser: 6.1.2 957 | 958 | '@csstools/postcss-light-dark-function@1.0.8(postcss@8.5.4)': 959 | dependencies: 960 | '@csstools/css-parser-algorithms': 2.7.1(@csstools/css-tokenizer@2.4.1) 961 | '@csstools/css-tokenizer': 2.4.1 962 | '@csstools/postcss-progressive-custom-properties': 3.3.0(postcss@8.5.4) 963 | '@csstools/utilities': 1.0.0(postcss@8.5.4) 964 | postcss: 8.5.4 965 | 966 | '@csstools/postcss-logical-float-and-clear@2.0.1(postcss@8.5.4)': 967 | dependencies: 968 | postcss: 8.5.4 969 | 970 | '@csstools/postcss-logical-overflow@1.0.1(postcss@8.5.4)': 971 | dependencies: 972 | postcss: 8.5.4 973 | 974 | '@csstools/postcss-logical-overscroll-behavior@1.0.1(postcss@8.5.4)': 975 | dependencies: 976 | postcss: 8.5.4 977 | 978 | '@csstools/postcss-logical-resize@2.0.1(postcss@8.5.4)': 979 | dependencies: 980 | postcss: 8.5.4 981 | postcss-value-parser: 4.2.0 982 | 983 | '@csstools/postcss-logical-viewport-units@2.0.11(postcss@8.5.4)': 984 | dependencies: 985 | '@csstools/css-tokenizer': 2.4.1 986 | '@csstools/utilities': 1.0.0(postcss@8.5.4) 987 | postcss: 8.5.4 988 | 989 | '@csstools/postcss-media-minmax@1.1.8(postcss@8.5.4)': 990 | dependencies: 991 | '@csstools/css-calc': 1.2.4(@csstools/css-parser-algorithms@2.7.1(@csstools/css-tokenizer@2.4.1))(@csstools/css-tokenizer@2.4.1) 992 | '@csstools/css-parser-algorithms': 2.7.1(@csstools/css-tokenizer@2.4.1) 993 | '@csstools/css-tokenizer': 2.4.1 994 | '@csstools/media-query-list-parser': 2.1.13(@csstools/css-parser-algorithms@2.7.1(@csstools/css-tokenizer@2.4.1))(@csstools/css-tokenizer@2.4.1) 995 | postcss: 8.5.4 996 | 997 | '@csstools/postcss-media-queries-aspect-ratio-number-values@2.0.11(postcss@8.5.4)': 998 | dependencies: 999 | '@csstools/css-parser-algorithms': 2.7.1(@csstools/css-tokenizer@2.4.1) 1000 | '@csstools/css-tokenizer': 2.4.1 1001 | '@csstools/media-query-list-parser': 2.1.13(@csstools/css-parser-algorithms@2.7.1(@csstools/css-tokenizer@2.4.1))(@csstools/css-tokenizer@2.4.1) 1002 | postcss: 8.5.4 1003 | 1004 | '@csstools/postcss-nested-calc@3.0.2(postcss@8.5.4)': 1005 | dependencies: 1006 | '@csstools/utilities': 1.0.0(postcss@8.5.4) 1007 | postcss: 8.5.4 1008 | postcss-value-parser: 4.2.0 1009 | 1010 | '@csstools/postcss-normalize-display-values@3.0.2(postcss@8.5.4)': 1011 | dependencies: 1012 | postcss: 8.5.4 1013 | postcss-value-parser: 4.2.0 1014 | 1015 | '@csstools/postcss-oklab-function@3.0.19(postcss@8.5.4)': 1016 | dependencies: 1017 | '@csstools/css-color-parser': 2.0.5(@csstools/css-parser-algorithms@2.7.1(@csstools/css-tokenizer@2.4.1))(@csstools/css-tokenizer@2.4.1) 1018 | '@csstools/css-parser-algorithms': 2.7.1(@csstools/css-tokenizer@2.4.1) 1019 | '@csstools/css-tokenizer': 2.4.1 1020 | '@csstools/postcss-progressive-custom-properties': 3.3.0(postcss@8.5.4) 1021 | '@csstools/utilities': 1.0.0(postcss@8.5.4) 1022 | postcss: 8.5.4 1023 | 1024 | '@csstools/postcss-progressive-custom-properties@3.3.0(postcss@8.5.4)': 1025 | dependencies: 1026 | postcss: 8.5.4 1027 | postcss-value-parser: 4.2.0 1028 | 1029 | '@csstools/postcss-relative-color-syntax@2.0.19(postcss@8.5.4)': 1030 | dependencies: 1031 | '@csstools/css-color-parser': 2.0.5(@csstools/css-parser-algorithms@2.7.1(@csstools/css-tokenizer@2.4.1))(@csstools/css-tokenizer@2.4.1) 1032 | '@csstools/css-parser-algorithms': 2.7.1(@csstools/css-tokenizer@2.4.1) 1033 | '@csstools/css-tokenizer': 2.4.1 1034 | '@csstools/postcss-progressive-custom-properties': 3.3.0(postcss@8.5.4) 1035 | '@csstools/utilities': 1.0.0(postcss@8.5.4) 1036 | postcss: 8.5.4 1037 | 1038 | '@csstools/postcss-scope-pseudo-class@3.0.1(postcss@8.5.4)': 1039 | dependencies: 1040 | postcss: 8.5.4 1041 | postcss-selector-parser: 6.1.2 1042 | 1043 | '@csstools/postcss-stepped-value-functions@3.0.10(postcss@8.5.4)': 1044 | dependencies: 1045 | '@csstools/css-calc': 1.2.4(@csstools/css-parser-algorithms@2.7.1(@csstools/css-tokenizer@2.4.1))(@csstools/css-tokenizer@2.4.1) 1046 | '@csstools/css-parser-algorithms': 2.7.1(@csstools/css-tokenizer@2.4.1) 1047 | '@csstools/css-tokenizer': 2.4.1 1048 | postcss: 8.5.4 1049 | 1050 | '@csstools/postcss-text-decoration-shorthand@3.0.7(postcss@8.5.4)': 1051 | dependencies: 1052 | '@csstools/color-helpers': 4.2.1 1053 | postcss: 8.5.4 1054 | postcss-value-parser: 4.2.0 1055 | 1056 | '@csstools/postcss-trigonometric-functions@3.0.10(postcss@8.5.4)': 1057 | dependencies: 1058 | '@csstools/css-calc': 1.2.4(@csstools/css-parser-algorithms@2.7.1(@csstools/css-tokenizer@2.4.1))(@csstools/css-tokenizer@2.4.1) 1059 | '@csstools/css-parser-algorithms': 2.7.1(@csstools/css-tokenizer@2.4.1) 1060 | '@csstools/css-tokenizer': 2.4.1 1061 | postcss: 8.5.4 1062 | 1063 | '@csstools/postcss-unset-value@3.0.1(postcss@8.5.4)': 1064 | dependencies: 1065 | postcss: 8.5.4 1066 | 1067 | '@csstools/selector-resolve-nested@1.1.0(postcss-selector-parser@6.1.2)': 1068 | dependencies: 1069 | postcss-selector-parser: 6.1.2 1070 | 1071 | '@csstools/selector-specificity@3.1.1(postcss-selector-parser@6.1.2)': 1072 | dependencies: 1073 | postcss-selector-parser: 6.1.2 1074 | 1075 | '@csstools/utilities@1.0.0(postcss@8.5.4)': 1076 | dependencies: 1077 | postcss: 8.5.4 1078 | 1079 | '@esbuild/android-arm64@0.18.20': 1080 | optional: true 1081 | 1082 | '@esbuild/android-arm@0.18.20': 1083 | optional: true 1084 | 1085 | '@esbuild/android-x64@0.18.20': 1086 | optional: true 1087 | 1088 | '@esbuild/darwin-arm64@0.18.20': 1089 | optional: true 1090 | 1091 | '@esbuild/darwin-x64@0.18.20': 1092 | optional: true 1093 | 1094 | '@esbuild/freebsd-arm64@0.18.20': 1095 | optional: true 1096 | 1097 | '@esbuild/freebsd-x64@0.18.20': 1098 | optional: true 1099 | 1100 | '@esbuild/linux-arm64@0.18.20': 1101 | optional: true 1102 | 1103 | '@esbuild/linux-arm@0.18.20': 1104 | optional: true 1105 | 1106 | '@esbuild/linux-ia32@0.18.20': 1107 | optional: true 1108 | 1109 | '@esbuild/linux-loong64@0.18.20': 1110 | optional: true 1111 | 1112 | '@esbuild/linux-mips64el@0.18.20': 1113 | optional: true 1114 | 1115 | '@esbuild/linux-ppc64@0.18.20': 1116 | optional: true 1117 | 1118 | '@esbuild/linux-riscv64@0.18.20': 1119 | optional: true 1120 | 1121 | '@esbuild/linux-s390x@0.18.20': 1122 | optional: true 1123 | 1124 | '@esbuild/linux-x64@0.18.20': 1125 | optional: true 1126 | 1127 | '@esbuild/netbsd-x64@0.18.20': 1128 | optional: true 1129 | 1130 | '@esbuild/openbsd-x64@0.18.20': 1131 | optional: true 1132 | 1133 | '@esbuild/sunos-x64@0.18.20': 1134 | optional: true 1135 | 1136 | '@esbuild/win32-arm64@0.18.20': 1137 | optional: true 1138 | 1139 | '@esbuild/win32-ia32@0.18.20': 1140 | optional: true 1141 | 1142 | '@esbuild/win32-x64@0.18.20': 1143 | optional: true 1144 | 1145 | '@jridgewell/sourcemap-codec@1.5.0': {} 1146 | 1147 | '@types/web-bluetooth@0.0.20': {} 1148 | 1149 | '@vitejs/plugin-vue@4.6.2(vite@4.5.14)(vue@3.5.16)': 1150 | dependencies: 1151 | vite: 4.5.14 1152 | vue: 3.5.16 1153 | 1154 | '@vue/compiler-core@3.5.16': 1155 | dependencies: 1156 | '@babel/parser': 7.27.4 1157 | '@vue/shared': 3.5.16 1158 | entities: 4.5.0 1159 | estree-walker: 2.0.2 1160 | source-map-js: 1.2.1 1161 | 1162 | '@vue/compiler-dom@3.5.16': 1163 | dependencies: 1164 | '@vue/compiler-core': 3.5.16 1165 | '@vue/shared': 3.5.16 1166 | 1167 | '@vue/compiler-sfc@3.5.16': 1168 | dependencies: 1169 | '@babel/parser': 7.27.4 1170 | '@vue/compiler-core': 3.5.16 1171 | '@vue/compiler-dom': 3.5.16 1172 | '@vue/compiler-ssr': 3.5.16 1173 | '@vue/shared': 3.5.16 1174 | estree-walker: 2.0.2 1175 | magic-string: 0.30.17 1176 | postcss: 8.5.4 1177 | source-map-js: 1.2.1 1178 | 1179 | '@vue/compiler-ssr@3.5.16': 1180 | dependencies: 1181 | '@vue/compiler-dom': 3.5.16 1182 | '@vue/shared': 3.5.16 1183 | 1184 | '@vue/devtools-api@6.6.4': {} 1185 | 1186 | '@vue/reactivity@3.5.16': 1187 | dependencies: 1188 | '@vue/shared': 3.5.16 1189 | 1190 | '@vue/runtime-core@3.5.16': 1191 | dependencies: 1192 | '@vue/reactivity': 3.5.16 1193 | '@vue/shared': 3.5.16 1194 | 1195 | '@vue/runtime-dom@3.5.16': 1196 | dependencies: 1197 | '@vue/reactivity': 3.5.16 1198 | '@vue/runtime-core': 3.5.16 1199 | '@vue/shared': 3.5.16 1200 | csstype: 3.1.3 1201 | 1202 | '@vue/server-renderer@3.5.16(vue@3.5.16)': 1203 | dependencies: 1204 | '@vue/compiler-ssr': 3.5.16 1205 | '@vue/shared': 3.5.16 1206 | vue: 3.5.16 1207 | 1208 | '@vue/shared@3.5.16': {} 1209 | 1210 | '@vueuse/core@10.11.1(vue@3.5.16)': 1211 | dependencies: 1212 | '@types/web-bluetooth': 0.0.20 1213 | '@vueuse/metadata': 10.11.1 1214 | '@vueuse/shared': 10.11.1(vue@3.5.16) 1215 | vue-demi: 0.14.10(vue@3.5.16) 1216 | transitivePeerDependencies: 1217 | - '@vue/composition-api' 1218 | - vue 1219 | 1220 | '@vueuse/metadata@10.11.1': {} 1221 | 1222 | '@vueuse/shared@10.11.1(vue@3.5.16)': 1223 | dependencies: 1224 | vue-demi: 0.14.10(vue@3.5.16) 1225 | transitivePeerDependencies: 1226 | - '@vue/composition-api' 1227 | - vue 1228 | 1229 | '@vueuse/sound@2.1.3(vue@3.5.16)': 1230 | dependencies: 1231 | howler: 2.2.4 1232 | vue: 3.5.16 1233 | vue-demi: 0.14.10(vue@3.5.16) 1234 | 1235 | autoprefixer@10.4.21(postcss@8.5.4): 1236 | dependencies: 1237 | browserslist: 4.25.0 1238 | caniuse-lite: 1.0.30001720 1239 | fraction.js: 4.3.7 1240 | normalize-range: 0.1.2 1241 | picocolors: 1.1.1 1242 | postcss: 8.5.4 1243 | postcss-value-parser: 4.2.0 1244 | 1245 | browserslist@4.25.0: 1246 | dependencies: 1247 | caniuse-lite: 1.0.30001720 1248 | electron-to-chromium: 1.5.162 1249 | node-releases: 2.0.19 1250 | update-browserslist-db: 1.1.3(browserslist@4.25.0) 1251 | 1252 | caniuse-lite@1.0.30001720: {} 1253 | 1254 | css-blank-pseudo@6.0.2(postcss@8.5.4): 1255 | dependencies: 1256 | postcss: 8.5.4 1257 | postcss-selector-parser: 6.1.2 1258 | 1259 | css-has-pseudo@6.0.5(postcss@8.5.4): 1260 | dependencies: 1261 | '@csstools/selector-specificity': 3.1.1(postcss-selector-parser@6.1.2) 1262 | postcss: 8.5.4 1263 | postcss-selector-parser: 6.1.2 1264 | postcss-value-parser: 4.2.0 1265 | 1266 | css-prefers-color-scheme@9.0.1(postcss@8.5.4): 1267 | dependencies: 1268 | postcss: 8.5.4 1269 | 1270 | cssdb@8.3.0: {} 1271 | 1272 | cssesc@3.0.0: {} 1273 | 1274 | csstype@3.1.3: {} 1275 | 1276 | electron-to-chromium@1.5.162: {} 1277 | 1278 | entities@4.5.0: {} 1279 | 1280 | esbuild@0.18.20: 1281 | optionalDependencies: 1282 | '@esbuild/android-arm': 0.18.20 1283 | '@esbuild/android-arm64': 0.18.20 1284 | '@esbuild/android-x64': 0.18.20 1285 | '@esbuild/darwin-arm64': 0.18.20 1286 | '@esbuild/darwin-x64': 0.18.20 1287 | '@esbuild/freebsd-arm64': 0.18.20 1288 | '@esbuild/freebsd-x64': 0.18.20 1289 | '@esbuild/linux-arm': 0.18.20 1290 | '@esbuild/linux-arm64': 0.18.20 1291 | '@esbuild/linux-ia32': 0.18.20 1292 | '@esbuild/linux-loong64': 0.18.20 1293 | '@esbuild/linux-mips64el': 0.18.20 1294 | '@esbuild/linux-ppc64': 0.18.20 1295 | '@esbuild/linux-riscv64': 0.18.20 1296 | '@esbuild/linux-s390x': 0.18.20 1297 | '@esbuild/linux-x64': 0.18.20 1298 | '@esbuild/netbsd-x64': 0.18.20 1299 | '@esbuild/openbsd-x64': 0.18.20 1300 | '@esbuild/sunos-x64': 0.18.20 1301 | '@esbuild/win32-arm64': 0.18.20 1302 | '@esbuild/win32-ia32': 0.18.20 1303 | '@esbuild/win32-x64': 0.18.20 1304 | 1305 | escalade@3.2.0: {} 1306 | 1307 | estree-walker@2.0.2: {} 1308 | 1309 | fraction.js@4.3.7: {} 1310 | 1311 | fsevents@2.3.3: 1312 | optional: true 1313 | 1314 | howler@2.2.4: {} 1315 | 1316 | magic-string@0.30.17: 1317 | dependencies: 1318 | '@jridgewell/sourcemap-codec': 1.5.0 1319 | 1320 | nanoid@3.3.11: {} 1321 | 1322 | node-releases@2.0.19: {} 1323 | 1324 | normalize-range@0.1.2: {} 1325 | 1326 | picocolors@1.1.1: {} 1327 | 1328 | pinia@2.3.1(vue@3.5.16): 1329 | dependencies: 1330 | '@vue/devtools-api': 6.6.4 1331 | vue: 3.5.16 1332 | vue-demi: 0.14.10(vue@3.5.16) 1333 | transitivePeerDependencies: 1334 | - '@vue/composition-api' 1335 | 1336 | postcss-attribute-case-insensitive@6.0.3(postcss@8.5.4): 1337 | dependencies: 1338 | postcss: 8.5.4 1339 | postcss-selector-parser: 6.1.2 1340 | 1341 | postcss-clamp@4.1.0(postcss@8.5.4): 1342 | dependencies: 1343 | postcss: 8.5.4 1344 | postcss-value-parser: 4.2.0 1345 | 1346 | postcss-color-functional-notation@6.0.14(postcss@8.5.4): 1347 | dependencies: 1348 | '@csstools/css-color-parser': 2.0.5(@csstools/css-parser-algorithms@2.7.1(@csstools/css-tokenizer@2.4.1))(@csstools/css-tokenizer@2.4.1) 1349 | '@csstools/css-parser-algorithms': 2.7.1(@csstools/css-tokenizer@2.4.1) 1350 | '@csstools/css-tokenizer': 2.4.1 1351 | '@csstools/postcss-progressive-custom-properties': 3.3.0(postcss@8.5.4) 1352 | '@csstools/utilities': 1.0.0(postcss@8.5.4) 1353 | postcss: 8.5.4 1354 | 1355 | postcss-color-hex-alpha@9.0.4(postcss@8.5.4): 1356 | dependencies: 1357 | '@csstools/utilities': 1.0.0(postcss@8.5.4) 1358 | postcss: 8.5.4 1359 | postcss-value-parser: 4.2.0 1360 | 1361 | postcss-color-rebeccapurple@9.0.3(postcss@8.5.4): 1362 | dependencies: 1363 | '@csstools/utilities': 1.0.0(postcss@8.5.4) 1364 | postcss: 8.5.4 1365 | postcss-value-parser: 4.2.0 1366 | 1367 | postcss-custom-media@10.0.8(postcss@8.5.4): 1368 | dependencies: 1369 | '@csstools/cascade-layer-name-parser': 1.0.13(@csstools/css-parser-algorithms@2.7.1(@csstools/css-tokenizer@2.4.1))(@csstools/css-tokenizer@2.4.1) 1370 | '@csstools/css-parser-algorithms': 2.7.1(@csstools/css-tokenizer@2.4.1) 1371 | '@csstools/css-tokenizer': 2.4.1 1372 | '@csstools/media-query-list-parser': 2.1.13(@csstools/css-parser-algorithms@2.7.1(@csstools/css-tokenizer@2.4.1))(@csstools/css-tokenizer@2.4.1) 1373 | postcss: 8.5.4 1374 | 1375 | postcss-custom-properties@13.3.12(postcss@8.5.4): 1376 | dependencies: 1377 | '@csstools/cascade-layer-name-parser': 1.0.13(@csstools/css-parser-algorithms@2.7.1(@csstools/css-tokenizer@2.4.1))(@csstools/css-tokenizer@2.4.1) 1378 | '@csstools/css-parser-algorithms': 2.7.1(@csstools/css-tokenizer@2.4.1) 1379 | '@csstools/css-tokenizer': 2.4.1 1380 | '@csstools/utilities': 1.0.0(postcss@8.5.4) 1381 | postcss: 8.5.4 1382 | postcss-value-parser: 4.2.0 1383 | 1384 | postcss-custom-selectors@7.1.12(postcss@8.5.4): 1385 | dependencies: 1386 | '@csstools/cascade-layer-name-parser': 1.0.13(@csstools/css-parser-algorithms@2.7.1(@csstools/css-tokenizer@2.4.1))(@csstools/css-tokenizer@2.4.1) 1387 | '@csstools/css-parser-algorithms': 2.7.1(@csstools/css-tokenizer@2.4.1) 1388 | '@csstools/css-tokenizer': 2.4.1 1389 | postcss: 8.5.4 1390 | postcss-selector-parser: 6.1.2 1391 | 1392 | postcss-dir-pseudo-class@8.0.1(postcss@8.5.4): 1393 | dependencies: 1394 | postcss: 8.5.4 1395 | postcss-selector-parser: 6.1.2 1396 | 1397 | postcss-double-position-gradients@5.0.7(postcss@8.5.4): 1398 | dependencies: 1399 | '@csstools/postcss-progressive-custom-properties': 3.3.0(postcss@8.5.4) 1400 | '@csstools/utilities': 1.0.0(postcss@8.5.4) 1401 | postcss: 8.5.4 1402 | postcss-value-parser: 4.2.0 1403 | 1404 | postcss-focus-visible@9.0.1(postcss@8.5.4): 1405 | dependencies: 1406 | postcss: 8.5.4 1407 | postcss-selector-parser: 6.1.2 1408 | 1409 | postcss-focus-within@8.0.1(postcss@8.5.4): 1410 | dependencies: 1411 | postcss: 8.5.4 1412 | postcss-selector-parser: 6.1.2 1413 | 1414 | postcss-font-variant@5.0.0(postcss@8.5.4): 1415 | dependencies: 1416 | postcss: 8.5.4 1417 | 1418 | postcss-gap-properties@5.0.1(postcss@8.5.4): 1419 | dependencies: 1420 | postcss: 8.5.4 1421 | 1422 | postcss-image-set-function@6.0.3(postcss@8.5.4): 1423 | dependencies: 1424 | '@csstools/utilities': 1.0.0(postcss@8.5.4) 1425 | postcss: 8.5.4 1426 | postcss-value-parser: 4.2.0 1427 | 1428 | postcss-lab-function@6.0.19(postcss@8.5.4): 1429 | dependencies: 1430 | '@csstools/css-color-parser': 2.0.5(@csstools/css-parser-algorithms@2.7.1(@csstools/css-tokenizer@2.4.1))(@csstools/css-tokenizer@2.4.1) 1431 | '@csstools/css-parser-algorithms': 2.7.1(@csstools/css-tokenizer@2.4.1) 1432 | '@csstools/css-tokenizer': 2.4.1 1433 | '@csstools/postcss-progressive-custom-properties': 3.3.0(postcss@8.5.4) 1434 | '@csstools/utilities': 1.0.0(postcss@8.5.4) 1435 | postcss: 8.5.4 1436 | 1437 | postcss-logical@7.0.1(postcss@8.5.4): 1438 | dependencies: 1439 | postcss: 8.5.4 1440 | postcss-value-parser: 4.2.0 1441 | 1442 | postcss-nesting@12.1.5(postcss@8.5.4): 1443 | dependencies: 1444 | '@csstools/selector-resolve-nested': 1.1.0(postcss-selector-parser@6.1.2) 1445 | '@csstools/selector-specificity': 3.1.1(postcss-selector-parser@6.1.2) 1446 | postcss: 8.5.4 1447 | postcss-selector-parser: 6.1.2 1448 | 1449 | postcss-opacity-percentage@2.0.0(postcss@8.5.4): 1450 | dependencies: 1451 | postcss: 8.5.4 1452 | 1453 | postcss-overflow-shorthand@5.0.1(postcss@8.5.4): 1454 | dependencies: 1455 | postcss: 8.5.4 1456 | postcss-value-parser: 4.2.0 1457 | 1458 | postcss-page-break@3.0.4(postcss@8.5.4): 1459 | dependencies: 1460 | postcss: 8.5.4 1461 | 1462 | postcss-place@9.0.1(postcss@8.5.4): 1463 | dependencies: 1464 | postcss: 8.5.4 1465 | postcss-value-parser: 4.2.0 1466 | 1467 | postcss-preset-env@9.6.0(postcss@8.5.4): 1468 | dependencies: 1469 | '@csstools/postcss-cascade-layers': 4.0.6(postcss@8.5.4) 1470 | '@csstools/postcss-color-function': 3.0.19(postcss@8.5.4) 1471 | '@csstools/postcss-color-mix-function': 2.0.19(postcss@8.5.4) 1472 | '@csstools/postcss-content-alt-text': 1.0.0(postcss@8.5.4) 1473 | '@csstools/postcss-exponential-functions': 1.0.9(postcss@8.5.4) 1474 | '@csstools/postcss-font-format-keywords': 3.0.2(postcss@8.5.4) 1475 | '@csstools/postcss-gamut-mapping': 1.0.11(postcss@8.5.4) 1476 | '@csstools/postcss-gradients-interpolation-method': 4.0.20(postcss@8.5.4) 1477 | '@csstools/postcss-hwb-function': 3.0.18(postcss@8.5.4) 1478 | '@csstools/postcss-ic-unit': 3.0.7(postcss@8.5.4) 1479 | '@csstools/postcss-initial': 1.0.1(postcss@8.5.4) 1480 | '@csstools/postcss-is-pseudo-class': 4.0.8(postcss@8.5.4) 1481 | '@csstools/postcss-light-dark-function': 1.0.8(postcss@8.5.4) 1482 | '@csstools/postcss-logical-float-and-clear': 2.0.1(postcss@8.5.4) 1483 | '@csstools/postcss-logical-overflow': 1.0.1(postcss@8.5.4) 1484 | '@csstools/postcss-logical-overscroll-behavior': 1.0.1(postcss@8.5.4) 1485 | '@csstools/postcss-logical-resize': 2.0.1(postcss@8.5.4) 1486 | '@csstools/postcss-logical-viewport-units': 2.0.11(postcss@8.5.4) 1487 | '@csstools/postcss-media-minmax': 1.1.8(postcss@8.5.4) 1488 | '@csstools/postcss-media-queries-aspect-ratio-number-values': 2.0.11(postcss@8.5.4) 1489 | '@csstools/postcss-nested-calc': 3.0.2(postcss@8.5.4) 1490 | '@csstools/postcss-normalize-display-values': 3.0.2(postcss@8.5.4) 1491 | '@csstools/postcss-oklab-function': 3.0.19(postcss@8.5.4) 1492 | '@csstools/postcss-progressive-custom-properties': 3.3.0(postcss@8.5.4) 1493 | '@csstools/postcss-relative-color-syntax': 2.0.19(postcss@8.5.4) 1494 | '@csstools/postcss-scope-pseudo-class': 3.0.1(postcss@8.5.4) 1495 | '@csstools/postcss-stepped-value-functions': 3.0.10(postcss@8.5.4) 1496 | '@csstools/postcss-text-decoration-shorthand': 3.0.7(postcss@8.5.4) 1497 | '@csstools/postcss-trigonometric-functions': 3.0.10(postcss@8.5.4) 1498 | '@csstools/postcss-unset-value': 3.0.1(postcss@8.5.4) 1499 | autoprefixer: 10.4.21(postcss@8.5.4) 1500 | browserslist: 4.25.0 1501 | css-blank-pseudo: 6.0.2(postcss@8.5.4) 1502 | css-has-pseudo: 6.0.5(postcss@8.5.4) 1503 | css-prefers-color-scheme: 9.0.1(postcss@8.5.4) 1504 | cssdb: 8.3.0 1505 | postcss: 8.5.4 1506 | postcss-attribute-case-insensitive: 6.0.3(postcss@8.5.4) 1507 | postcss-clamp: 4.1.0(postcss@8.5.4) 1508 | postcss-color-functional-notation: 6.0.14(postcss@8.5.4) 1509 | postcss-color-hex-alpha: 9.0.4(postcss@8.5.4) 1510 | postcss-color-rebeccapurple: 9.0.3(postcss@8.5.4) 1511 | postcss-custom-media: 10.0.8(postcss@8.5.4) 1512 | postcss-custom-properties: 13.3.12(postcss@8.5.4) 1513 | postcss-custom-selectors: 7.1.12(postcss@8.5.4) 1514 | postcss-dir-pseudo-class: 8.0.1(postcss@8.5.4) 1515 | postcss-double-position-gradients: 5.0.7(postcss@8.5.4) 1516 | postcss-focus-visible: 9.0.1(postcss@8.5.4) 1517 | postcss-focus-within: 8.0.1(postcss@8.5.4) 1518 | postcss-font-variant: 5.0.0(postcss@8.5.4) 1519 | postcss-gap-properties: 5.0.1(postcss@8.5.4) 1520 | postcss-image-set-function: 6.0.3(postcss@8.5.4) 1521 | postcss-lab-function: 6.0.19(postcss@8.5.4) 1522 | postcss-logical: 7.0.1(postcss@8.5.4) 1523 | postcss-nesting: 12.1.5(postcss@8.5.4) 1524 | postcss-opacity-percentage: 2.0.0(postcss@8.5.4) 1525 | postcss-overflow-shorthand: 5.0.1(postcss@8.5.4) 1526 | postcss-page-break: 3.0.4(postcss@8.5.4) 1527 | postcss-place: 9.0.1(postcss@8.5.4) 1528 | postcss-pseudo-class-any-link: 9.0.2(postcss@8.5.4) 1529 | postcss-replace-overflow-wrap: 4.0.0(postcss@8.5.4) 1530 | postcss-selector-not: 7.0.2(postcss@8.5.4) 1531 | 1532 | postcss-pseudo-class-any-link@9.0.2(postcss@8.5.4): 1533 | dependencies: 1534 | postcss: 8.5.4 1535 | postcss-selector-parser: 6.1.2 1536 | 1537 | postcss-replace-overflow-wrap@4.0.0(postcss@8.5.4): 1538 | dependencies: 1539 | postcss: 8.5.4 1540 | 1541 | postcss-selector-not@7.0.2(postcss@8.5.4): 1542 | dependencies: 1543 | postcss: 8.5.4 1544 | postcss-selector-parser: 6.1.2 1545 | 1546 | postcss-selector-parser@6.1.2: 1547 | dependencies: 1548 | cssesc: 3.0.0 1549 | util-deprecate: 1.0.2 1550 | 1551 | postcss-value-parser@4.2.0: {} 1552 | 1553 | postcss@8.5.4: 1554 | dependencies: 1555 | nanoid: 3.3.11 1556 | picocolors: 1.1.1 1557 | source-map-js: 1.2.1 1558 | 1559 | rollup@3.29.5: 1560 | optionalDependencies: 1561 | fsevents: 2.3.3 1562 | 1563 | source-map-js@1.2.1: {} 1564 | 1565 | update-browserslist-db@1.1.3(browserslist@4.25.0): 1566 | dependencies: 1567 | browserslist: 4.25.0 1568 | escalade: 3.2.0 1569 | picocolors: 1.1.1 1570 | 1571 | util-deprecate@1.0.2: {} 1572 | 1573 | vite@4.5.14: 1574 | dependencies: 1575 | esbuild: 0.18.20 1576 | postcss: 8.5.4 1577 | rollup: 3.29.5 1578 | optionalDependencies: 1579 | fsevents: 2.3.3 1580 | 1581 | vue-demi@0.14.10(vue@3.5.16): 1582 | dependencies: 1583 | vue: 3.5.16 1584 | 1585 | vue-router@4.5.1(vue@3.5.16): 1586 | dependencies: 1587 | '@vue/devtools-api': 6.6.4 1588 | vue: 3.5.16 1589 | 1590 | vue@3.5.16: 1591 | dependencies: 1592 | '@vue/compiler-dom': 3.5.16 1593 | '@vue/compiler-sfc': 3.5.16 1594 | '@vue/runtime-dom': 3.5.16 1595 | '@vue/server-renderer': 3.5.16(vue@3.5.16) 1596 | '@vue/shared': 3.5.16 1597 | -------------------------------------------------------------------------------- /src/App.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 12 | 13 | 15 | -------------------------------------------------------------------------------- /src/assets/24/img/bg.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blyrin/plane-war-vue/c0eca9bfa941751d17186178d1e67867be8375fc/src/assets/24/img/bg.webp -------------------------------------------------------------------------------- /src/assets/24/img/blow/1.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blyrin/plane-war-vue/c0eca9bfa941751d17186178d1e67867be8375fc/src/assets/24/img/blow/1.webp -------------------------------------------------------------------------------- /src/assets/24/img/blow/2.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blyrin/plane-war-vue/c0eca9bfa941751d17186178d1e67867be8375fc/src/assets/24/img/blow/2.webp -------------------------------------------------------------------------------- /src/assets/24/img/blow/3.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blyrin/plane-war-vue/c0eca9bfa941751d17186178d1e67867be8375fc/src/assets/24/img/blow/3.webp -------------------------------------------------------------------------------- /src/assets/24/img/blow/4.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blyrin/plane-war-vue/c0eca9bfa941751d17186178d1e67867be8375fc/src/assets/24/img/blow/4.webp -------------------------------------------------------------------------------- /src/assets/24/img/blow/5.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blyrin/plane-war-vue/c0eca9bfa941751d17186178d1e67867be8375fc/src/assets/24/img/blow/5.webp -------------------------------------------------------------------------------- /src/assets/24/img/blow/6.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blyrin/plane-war-vue/c0eca9bfa941751d17186178d1e67867be8375fc/src/assets/24/img/blow/6.webp -------------------------------------------------------------------------------- /src/assets/24/img/blow/7.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blyrin/plane-war-vue/c0eca9bfa941751d17186178d1e67867be8375fc/src/assets/24/img/blow/7.webp -------------------------------------------------------------------------------- /src/assets/24/img/blow/8.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blyrin/plane-war-vue/c0eca9bfa941751d17186178d1e67867be8375fc/src/assets/24/img/blow/8.webp -------------------------------------------------------------------------------- /src/assets/24/img/blow/9.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blyrin/plane-war-vue/c0eca9bfa941751d17186178d1e67867be8375fc/src/assets/24/img/blow/9.webp -------------------------------------------------------------------------------- /src/assets/24/img/bullet.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blyrin/plane-war-vue/c0eca9bfa941751d17186178d1e67867be8375fc/src/assets/24/img/bullet.webp -------------------------------------------------------------------------------- /src/assets/24/img/ebullet.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blyrin/plane-war-vue/c0eca9bfa941751d17186178d1e67867be8375fc/src/assets/24/img/ebullet.webp -------------------------------------------------------------------------------- /src/assets/24/img/eplane.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blyrin/plane-war-vue/c0eca9bfa941751d17186178d1e67867be8375fc/src/assets/24/img/eplane.webp -------------------------------------------------------------------------------- /src/assets/24/img/plane.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blyrin/plane-war-vue/c0eca9bfa941751d17186178d1e67867be8375fc/src/assets/24/img/plane.webp -------------------------------------------------------------------------------- /src/assets/24/sounds/bgm.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blyrin/plane-war-vue/c0eca9bfa941751d17186178d1e67867be8375fc/src/assets/24/sounds/bgm.mp3 -------------------------------------------------------------------------------- /src/assets/24/sounds/bullet.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blyrin/plane-war-vue/c0eca9bfa941751d17186178d1e67867be8375fc/src/assets/24/sounds/bullet.mp3 -------------------------------------------------------------------------------- /src/assets/24/sounds/end.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blyrin/plane-war-vue/c0eca9bfa941751d17186178d1e67867be8375fc/src/assets/24/sounds/end.mp3 -------------------------------------------------------------------------------- /src/assets/24/sounds/enemy_down.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blyrin/plane-war-vue/c0eca9bfa941751d17186178d1e67867be8375fc/src/assets/24/sounds/enemy_down.mp3 -------------------------------------------------------------------------------- /src/assets/24/sounds/enemy_hit.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blyrin/plane-war-vue/c0eca9bfa941751d17186178d1e67867be8375fc/src/assets/24/sounds/enemy_hit.mp3 -------------------------------------------------------------------------------- /src/assets/24/sounds/lv_up.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blyrin/plane-war-vue/c0eca9bfa941751d17186178d1e67867be8375fc/src/assets/24/sounds/lv_up.mp3 -------------------------------------------------------------------------------- /src/assets/24/sounds/player_skill_0.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blyrin/plane-war-vue/c0eca9bfa941751d17186178d1e67867be8375fc/src/assets/24/sounds/player_skill_0.mp3 -------------------------------------------------------------------------------- /src/assets/24/sounds/player_skill_1.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blyrin/plane-war-vue/c0eca9bfa941751d17186178d1e67867be8375fc/src/assets/24/sounds/player_skill_1.mp3 -------------------------------------------------------------------------------- /src/assets/24/sounds/player_skill_2.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blyrin/plane-war-vue/c0eca9bfa941751d17186178d1e67867be8375fc/src/assets/24/sounds/player_skill_2.mp3 -------------------------------------------------------------------------------- /src/assets/24/sounds/player_skill_3.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blyrin/plane-war-vue/c0eca9bfa941751d17186178d1e67867be8375fc/src/assets/24/sounds/player_skill_3.mp3 -------------------------------------------------------------------------------- /src/assets/24/sounds/player_treat.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blyrin/plane-war-vue/c0eca9bfa941751d17186178d1e67867be8375fc/src/assets/24/sounds/player_treat.mp3 -------------------------------------------------------------------------------- /src/assets/24/sounds/start.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blyrin/plane-war-vue/c0eca9bfa941751d17186178d1e67867be8375fc/src/assets/24/sounds/start.mp3 -------------------------------------------------------------------------------- /src/assets/aniki/img/bg.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blyrin/plane-war-vue/c0eca9bfa941751d17186178d1e67867be8375fc/src/assets/aniki/img/bg.webp -------------------------------------------------------------------------------- /src/assets/aniki/img/blow/1.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blyrin/plane-war-vue/c0eca9bfa941751d17186178d1e67867be8375fc/src/assets/aniki/img/blow/1.webp -------------------------------------------------------------------------------- /src/assets/aniki/img/blow/2.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blyrin/plane-war-vue/c0eca9bfa941751d17186178d1e67867be8375fc/src/assets/aniki/img/blow/2.webp -------------------------------------------------------------------------------- /src/assets/aniki/img/blow/3.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blyrin/plane-war-vue/c0eca9bfa941751d17186178d1e67867be8375fc/src/assets/aniki/img/blow/3.webp -------------------------------------------------------------------------------- /src/assets/aniki/img/blow/4.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blyrin/plane-war-vue/c0eca9bfa941751d17186178d1e67867be8375fc/src/assets/aniki/img/blow/4.webp -------------------------------------------------------------------------------- /src/assets/aniki/img/blow/5.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blyrin/plane-war-vue/c0eca9bfa941751d17186178d1e67867be8375fc/src/assets/aniki/img/blow/5.webp -------------------------------------------------------------------------------- /src/assets/aniki/img/blow/6.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blyrin/plane-war-vue/c0eca9bfa941751d17186178d1e67867be8375fc/src/assets/aniki/img/blow/6.webp -------------------------------------------------------------------------------- /src/assets/aniki/img/blow/7.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blyrin/plane-war-vue/c0eca9bfa941751d17186178d1e67867be8375fc/src/assets/aniki/img/blow/7.webp -------------------------------------------------------------------------------- /src/assets/aniki/img/blow/8.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blyrin/plane-war-vue/c0eca9bfa941751d17186178d1e67867be8375fc/src/assets/aniki/img/blow/8.webp -------------------------------------------------------------------------------- /src/assets/aniki/img/blow/9.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blyrin/plane-war-vue/c0eca9bfa941751d17186178d1e67867be8375fc/src/assets/aniki/img/blow/9.webp -------------------------------------------------------------------------------- /src/assets/aniki/img/bullet.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blyrin/plane-war-vue/c0eca9bfa941751d17186178d1e67867be8375fc/src/assets/aniki/img/bullet.webp -------------------------------------------------------------------------------- /src/assets/aniki/img/ebullet.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blyrin/plane-war-vue/c0eca9bfa941751d17186178d1e67867be8375fc/src/assets/aniki/img/ebullet.webp -------------------------------------------------------------------------------- /src/assets/aniki/img/eplane.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blyrin/plane-war-vue/c0eca9bfa941751d17186178d1e67867be8375fc/src/assets/aniki/img/eplane.webp -------------------------------------------------------------------------------- /src/assets/aniki/img/plane.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blyrin/plane-war-vue/c0eca9bfa941751d17186178d1e67867be8375fc/src/assets/aniki/img/plane.webp -------------------------------------------------------------------------------- /src/assets/aniki/sounds/bgm.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blyrin/plane-war-vue/c0eca9bfa941751d17186178d1e67867be8375fc/src/assets/aniki/sounds/bgm.mp3 -------------------------------------------------------------------------------- /src/assets/aniki/sounds/bullet.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blyrin/plane-war-vue/c0eca9bfa941751d17186178d1e67867be8375fc/src/assets/aniki/sounds/bullet.mp3 -------------------------------------------------------------------------------- /src/assets/aniki/sounds/end.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blyrin/plane-war-vue/c0eca9bfa941751d17186178d1e67867be8375fc/src/assets/aniki/sounds/end.mp3 -------------------------------------------------------------------------------- /src/assets/aniki/sounds/enemy_down.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blyrin/plane-war-vue/c0eca9bfa941751d17186178d1e67867be8375fc/src/assets/aniki/sounds/enemy_down.mp3 -------------------------------------------------------------------------------- /src/assets/aniki/sounds/enemy_hit.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blyrin/plane-war-vue/c0eca9bfa941751d17186178d1e67867be8375fc/src/assets/aniki/sounds/enemy_hit.mp3 -------------------------------------------------------------------------------- /src/assets/aniki/sounds/lv_up.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blyrin/plane-war-vue/c0eca9bfa941751d17186178d1e67867be8375fc/src/assets/aniki/sounds/lv_up.mp3 -------------------------------------------------------------------------------- /src/assets/aniki/sounds/player_skill_0.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blyrin/plane-war-vue/c0eca9bfa941751d17186178d1e67867be8375fc/src/assets/aniki/sounds/player_skill_0.mp3 -------------------------------------------------------------------------------- /src/assets/aniki/sounds/player_skill_1.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blyrin/plane-war-vue/c0eca9bfa941751d17186178d1e67867be8375fc/src/assets/aniki/sounds/player_skill_1.mp3 -------------------------------------------------------------------------------- /src/assets/aniki/sounds/player_skill_2.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blyrin/plane-war-vue/c0eca9bfa941751d17186178d1e67867be8375fc/src/assets/aniki/sounds/player_skill_2.mp3 -------------------------------------------------------------------------------- /src/assets/aniki/sounds/player_skill_3.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blyrin/plane-war-vue/c0eca9bfa941751d17186178d1e67867be8375fc/src/assets/aniki/sounds/player_skill_3.mp3 -------------------------------------------------------------------------------- /src/assets/aniki/sounds/player_treat.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blyrin/plane-war-vue/c0eca9bfa941751d17186178d1e67867be8375fc/src/assets/aniki/sounds/player_treat.mp3 -------------------------------------------------------------------------------- /src/assets/aniki/sounds/start.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blyrin/plane-war-vue/c0eca9bfa941751d17186178d1e67867be8375fc/src/assets/aniki/sounds/start.mp3 -------------------------------------------------------------------------------- /src/assets/bg_welcome.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blyrin/plane-war-vue/c0eca9bfa941751d17186178d1e67867be8375fc/src/assets/bg_welcome.webp -------------------------------------------------------------------------------- /src/components/MainCanvas.vue: -------------------------------------------------------------------------------- 1 | 45 | 46 | 49 | 50 | 53 | -------------------------------------------------------------------------------- /src/game/assets.js: -------------------------------------------------------------------------------- 1 | class AssetsMod { 2 | constructor(name, info) { 3 | this.name = name 4 | this.info = info 5 | this.#loadBitmapSrc() 6 | this.#loadAudioSrc() 7 | } 8 | 9 | #loadBitmapSrc() { 10 | const bg = new URL(`../assets/${this.name}/img/bg.webp`, import.meta.url).href 11 | const bitmaps = [ 12 | new URL(`../assets/${this.name}/img/plane.webp`, import.meta.url), 13 | new URL(`../assets/${this.name}/img/bullet.webp`, import.meta.url), 14 | new URL(`../assets/${this.name}/img/eplane.webp`, import.meta.url), 15 | new URL(`../assets/${this.name}/img/ebullet.webp`, import.meta.url), 16 | ].map((url) => url.href) 17 | const blowBitmaps = Array.from( 18 | { length: 9 }, 19 | (v, i) => new URL(`../assets/${this.name}/img/blow/${i + 1}.webp`, import.meta.url), 20 | ).map((url) => url.href) 21 | this.bitmapSrc = { bg, bitmaps, blowBitmaps } 22 | } 23 | 24 | #loadAudioSrc() { 25 | this.audioSrc = { 26 | bgm: new URL(`../assets/${this.name}/sounds/bgm.mp3`, import.meta.url).href, 27 | bullet: new URL(`../assets/${this.name}/sounds/bullet.mp3`, import.meta.url).href, 28 | end: new URL(`../assets/${this.name}/sounds/end.mp3`, import.meta.url).href, 29 | enemyHit: new URL(`../assets/${this.name}/sounds/enemy_hit.mp3`, import.meta.url).href, 30 | enemyDown: new URL(`../assets/${this.name}/sounds/enemy_down.mp3`, import.meta.url).href, 31 | playerSkill0: new URL(`../assets/${this.name}/sounds/player_skill_0.mp3`, import.meta.url).href, 32 | playerSkill1: new URL(`../assets/${this.name}/sounds/player_skill_1.mp3`, import.meta.url).href, 33 | playerSkill2: new URL(`../assets/${this.name}/sounds/player_skill_2.mp3`, import.meta.url).href, 34 | playerSkill3: new URL(`../assets/${this.name}/sounds/player_skill_3.mp3`, import.meta.url).href, 35 | playerTreat: new URL(`../assets/${this.name}/sounds/player_treat.mp3`, import.meta.url).href, 36 | lvUp: new URL(`../assets/${this.name}/sounds/lv_up.mp3`, import.meta.url).href, 37 | start: new URL(`../assets/${this.name}/sounds/start.mp3`, import.meta.url).href, 38 | } 39 | } 40 | 41 | } 42 | 43 | export default [ 44 | new AssetsMod('aniki', '哲学♂'), 45 | new AssetsMod('24', '24号(仅BGM)'), 46 | ] 47 | -------------------------------------------------------------------------------- /src/game/circle-points.js: -------------------------------------------------------------------------------- 1 | export default [ 2 | [ 3 | { 4 | x: -1.9177021544168118, 5 | y: 3.510330247561491, 6 | }, 7 | { 8 | x: -0.7390914279064467, 9 | y: 3.9311250121555803, 10 | }, 11 | { 12 | x: 0.5118667171201802, 13 | y: 3.9671138708013673, 14 | }, 15 | { 16 | x: 1.7127197814899575, 17 | y: 3.614773983265481, 18 | }, 19 | { 20 | x: 2.745919900427091, 21 | y: 2.9085948326362807, 22 | }, 23 | { 24 | x: 3.5103302475614906, 25 | y: 1.9177021544168125, 26 | }, 27 | { 28 | x: 3.93112501215558, 29 | y: 0.7390914279064471, 30 | }, 31 | { 32 | x: 3.967113870801368, 33 | y: -0.51186671712018, 34 | }, 35 | { 36 | x: 3.6147739832654815, 37 | y: -1.7127197814899568, 38 | }, 39 | { 40 | x: 2.908594832636281, 41 | y: -2.745919900427091, 42 | }, 43 | { 44 | x: 1.9177021544168122, 45 | y: -3.5103302475614906, 46 | }, 47 | { 48 | x: 0.7390914279064471, 49 | y: -3.93112501215558, 50 | }, 51 | { 52 | x: -0.5118667171201797, 53 | y: -3.967113870801368, 54 | }, 55 | { 56 | x: -1.712719781489957, 57 | y: -3.6147739832654815, 58 | }, 59 | { 60 | x: -2.7459199004270904, 61 | y: -2.908594832636281, 62 | }, 63 | { 64 | x: -3.5103302475614906, 65 | y: -1.9177021544168125, 66 | }, 67 | { 68 | x: -3.93112501215558, 69 | y: -0.7390914279064482, 70 | }, 71 | { 72 | x: -3.967113870801368, 73 | y: 0.5118667171201786, 74 | }, 75 | { 76 | x: -3.614773983265482, 77 | y: 1.712719781489956, 78 | }, 79 | { 80 | x: -2.908594832636282, 81 | y: 2.74591990042709, 82 | }, 83 | { 84 | x: -1.9177021544168134, 85 | y: 3.51033024756149, 86 | }, 87 | ], 88 | [ 89 | { 90 | x: -3.365883939231586, 91 | y: 2.161209223472559, 92 | }, 93 | { 94 | x: -2.533295475046496, 95 | y: 3.095547453377019, 96 | }, 97 | { 98 | x: -1.4527303992564078, 99 | y: 3.726871930597605, 100 | }, 101 | { 102 | x: -0.22996195021923735, 103 | y: 3.993384216607684, 104 | }, 105 | { 106 | x: 1.015316776744513, 107 | y: 3.8689962319523046, 108 | }, 109 | { 110 | x: 2.161209223472559, 111 | y: 3.365883939231586, 112 | }, 113 | { 114 | x: 3.095547453377019, 115 | y: 2.533295475046496, 116 | }, 117 | { 118 | x: 3.726871930597605, 119 | y: 1.452730399256408, 120 | }, 121 | { 122 | x: 3.9933842166076836, 123 | y: 0.22996195021923801, 124 | }, 125 | { 126 | x: 3.868996231952305, 127 | y: -1.0153167767445128, 128 | }, 129 | { 130 | x: 3.365883939231586, 131 | y: -2.1612092234725586, 132 | }, 133 | { 134 | x: 2.5332954750464967, 135 | y: -3.0955474533770184, 136 | }, 137 | { 138 | x: 1.4527303992564082, 139 | y: -3.726871930597605, 140 | }, 141 | { 142 | x: 0.22996195021923782, 143 | y: -3.993384216607684, 144 | }, 145 | { 146 | x: -1.0153167767445126, 147 | y: -3.868996231952305, 148 | }, 149 | { 150 | x: -2.1612092234725586, 151 | y: -3.3658839392315865, 152 | }, 153 | { 154 | x: -3.095547453377018, 155 | y: -2.5332954750464975, 156 | }, 157 | { 158 | x: -3.7268719305976044, 159 | y: -1.4527303992564093, 160 | }, 161 | { 162 | x: -3.9933842166076836, 163 | y: -0.22996195021923888, 164 | }, 165 | { 166 | x: -3.868996231952305, 167 | y: 1.0153167767445115, 168 | }, 169 | { 170 | x: -3.365883939231587, 171 | y: 2.1612092234725577, 172 | }, 173 | ], 174 | [ 175 | { 176 | x: -3.989979946416218, 177 | y: 0.2829488066708119, 178 | }, 179 | { 180 | x: -3.707260438126739, 181 | y: 1.5020719170200665, 182 | }, 183 | { 184 | x: -3.061648448151105, 185 | y: 2.574161762580963, 186 | }, 187 | { 188 | x: -2.116340976311367, 189 | y: 3.3942747195808196, 190 | }, 191 | { 192 | x: -0.9638713042956403, 193 | y: 3.882132417725524, 194 | }, 195 | { 196 | x: 0.2829488066708116, 197 | y: 3.989979946416218, 198 | }, 199 | { 200 | x: 1.5020719170200663, 201 | y: 3.707260438126739, 202 | }, 203 | { 204 | x: 2.574161762580963, 205 | y: 3.061648448151105, 206 | }, 207 | { 208 | x: 3.394274719580819, 209 | y: 2.1163409763113674, 210 | }, 211 | { 212 | x: 3.882132417725524, 213 | y: 0.9638713042956405, 214 | }, 215 | { 216 | x: 3.989979946416218, 217 | y: -0.2829488066708114, 218 | }, 219 | { 220 | x: 3.7072604381267396, 221 | y: -1.502071917020066, 222 | }, 223 | { 224 | x: 3.061648448151105, 225 | y: -2.574161762580963, 226 | }, 227 | { 228 | x: 2.116340976311367, 229 | y: -3.394274719580819, 230 | }, 231 | { 232 | x: 0.9638713042956408, 233 | y: -3.882132417725524, 234 | }, 235 | { 236 | x: -0.2829488066708111, 237 | y: -3.989979946416218, 238 | }, 239 | { 240 | x: -1.5020719170200667, 241 | y: -3.707260438126739, 242 | }, 243 | { 244 | x: -2.5741617625809634, 245 | y: -3.0616484481511046, 246 | }, 247 | { 248 | x: -3.3942747195808187, 249 | y: -2.116340976311368, 250 | }, 251 | { 252 | x: -3.8821324177255234, 253 | y: -0.9638713042956418, 254 | }, 255 | { 256 | x: -3.989979946416218, 257 | y: 0.2829488066708101, 258 | }, 259 | ], 260 | [ 261 | { 262 | x: -3.637189707302727, 263 | y: -1.6645873461885694, 264 | }, 265 | { 266 | x: -3.9735587507256827, 267 | y: -0.45916321121291215, 268 | }, 269 | { 270 | x: -3.9209681782158534, 271 | y: 0.7912070180544732, 272 | }, 273 | { 274 | x: -3.4845659214305664, 275 | y: 1.9641283917312402, 276 | }, 277 | { 278 | x: -2.7070700738572793, 279 | y: 2.9447871935381587, 280 | }, 281 | { 282 | x: -1.6645873461885696, 283 | y: 3.637189707302727, 284 | }, 285 | { 286 | x: -0.45916321121291237, 287 | y: 3.9735587507256827, 288 | }, 289 | { 290 | x: 0.791207018054473, 291 | y: 3.9209681782158534, 292 | }, 293 | { 294 | x: 1.96412839173124, 295 | y: 3.4845659214305664, 296 | }, 297 | { 298 | x: 2.9447871935381587, 299 | y: 2.7070700738572793, 300 | }, 301 | { 302 | x: 3.637189707302727, 303 | y: 1.6645873461885698, 304 | }, 305 | { 306 | x: 3.9735587507256827, 307 | y: 0.45916321121291265, 308 | }, 309 | { 310 | x: 3.9209681782158534, 311 | y: -0.7912070180544728, 312 | }, 313 | { 314 | x: 3.4845659214305664, 315 | y: -1.9641283917312398, 316 | }, 317 | { 318 | x: 2.7070700738572793, 319 | y: -2.9447871935381587, 320 | }, 321 | { 322 | x: 1.66458734618857, 323 | y: -3.6371897073027264, 324 | }, 325 | { 326 | x: 0.4591632112129119, 327 | y: -3.9735587507256827, 328 | }, 329 | { 330 | x: -0.7912070180544735, 331 | y: -3.9209681782158534, 332 | }, 333 | { 334 | x: -1.9641283917312404, 335 | y: -3.4845659214305664, 336 | }, 337 | { 338 | x: -2.9447871935381578, 339 | y: -2.70707007385728, 340 | }, 341 | { 342 | x: -3.637189707302726, 343 | y: -1.664587346188571, 344 | }, 345 | ], 346 | [ 347 | { 348 | x: -2.393888576415826, 349 | y: -3.204574462187735, 350 | }, 351 | { 352 | x: -3.2669912984407676, 353 | y: -2.307979171464142, 354 | }, 355 | { 356 | x: -3.8202981497074875, 357 | y: -1.1854627988011892, 358 | }, 359 | { 360 | x: -3.9996476004984807, 361 | y: 0.053094932213419155, 362 | }, 363 | { 364 | x: -3.787483676969223, 365 | y: 1.2864553613288325, 366 | }, 367 | { 368 | x: -3.204574462187735, 369 | y: 2.393888576415826, 370 | }, 371 | { 372 | x: -2.3079791714641424, 373 | y: 3.266991298440767, 374 | }, 375 | { 376 | x: -1.1854627988011894, 377 | y: 3.8202981497074875, 378 | }, 379 | { 380 | x: 0.053094932213418905, 381 | y: 3.9996476004984807, 382 | }, 383 | { 384 | x: 1.2864553613288323, 385 | y: 3.787483676969223, 386 | }, 387 | { 388 | x: 2.3938885764158258, 389 | y: 3.204574462187735, 390 | }, 391 | { 392 | x: 3.266991298440767, 393 | y: 2.3079791714641424, 394 | }, 395 | { 396 | x: 3.820298149707487, 397 | y: 1.1854627988011897, 398 | }, 399 | { 400 | x: 3.9996476004984807, 401 | y: -0.05309493221341866, 402 | }, 403 | { 404 | x: 3.787483676969223, 405 | y: -1.286455361328832, 406 | }, 407 | { 408 | x: 3.2045744621877352, 409 | y: -2.3938885764158258, 410 | }, 411 | { 412 | x: 2.307979171464142, 413 | y: -3.2669912984407676, 414 | }, 415 | { 416 | x: 1.1854627988011888, 417 | y: -3.8202981497074875, 418 | }, 419 | { 420 | x: -0.0530949322134194, 421 | y: -3.9996476004984807, 422 | }, 423 | { 424 | x: -1.2864553613288328, 425 | y: -3.7874836769692224, 426 | }, 427 | { 428 | x: -2.393888576415826, 429 | y: -3.204574462187735, 430 | }, 431 | ], 432 | ] 433 | -------------------------------------------------------------------------------- /src/game/type.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @class 3 | * @classdesc 游戏元素类 4 | */ 5 | export class GameObject { 6 | /** 7 | * @class 8 | * @classdesc 游戏元素类 9 | * @param {CanvasImageSource} img 图片 10 | * @param {number} x 横坐标 11 | * @param {number} y 纵坐标 12 | * @param {number} w 像素宽度 13 | * @param {number} h 像素高度 14 | * @param {number} blood 血量 15 | * @param {number} damage 伤害 16 | */ 17 | constructor(img, x, y, w, h, blood, damage) { 18 | this.img = img 19 | this.x = x 20 | this.y = y 21 | this.w = w 22 | this.h = h 23 | this.blood = blood || 1 24 | this.damage = damage || 1 25 | } 26 | 27 | /** 28 | * @property 是否存活 29 | * @return {boolean} 30 | */ 31 | get isAlive() { 32 | return this.blood > 0 33 | } 34 | 35 | /** 36 | * @function 碰撞血量计算 37 | * @param {GameObject} other 另一个需要碰撞的游戏元素 38 | */ 39 | collide(other) { 40 | other.blood -= this.damage 41 | this.blood -= other.damage 42 | } 43 | } 44 | 45 | /** 46 | * @class 47 | * @extends {GameObject} 48 | * @classdesc 自移动游戏元素类 49 | */ 50 | export class MovableGameObject extends GameObject { 51 | /** 52 | * @class 53 | * @extends {GameObject} 54 | * @classdesc 自移动游戏元素类 55 | * @param {ImageBitmap} img 图片 56 | * @param {number} x 横坐标 57 | * @param {number} y 纵坐标 58 | * @param {number} w 像素宽度 59 | * @param {number} h 像素高度 60 | * @param {number} speedX 横坐标移动像素 61 | * @param {number} speedY 纵坐标移动像素 62 | * @param {number} blood 血量 63 | * @param {number} damage 伤害 64 | */ 65 | constructor(img, x, y, w, h, speedX, speedY, blood, damage) { 66 | super(img, x, y, w, h, blood, damage) 67 | this.speedX = speedX 68 | this.speedY = speedY 69 | } 70 | 71 | /** 72 | * @function 移动元素 73 | * @param {number} limitX 横坐标限制 74 | * @param {number} limitY 纵坐标限制 75 | * @return {boolean} 是否移动成功 76 | */ 77 | move(limitX, limitY) { 78 | const newX = this.x + this.speedX 79 | const newY = this.y + this.speedY 80 | if ( 81 | newY < -this.h || 82 | newX < -this.w || 83 | newX > limitX + this.w || 84 | newY > limitY + this.h 85 | ) { 86 | return false 87 | } 88 | this.x = newX 89 | this.y = newY 90 | return true 91 | } 92 | } 93 | 94 | /** 95 | * @class 96 | * @classdesc 动画对象, 用于渲染gif 97 | */ 98 | export class AnimeGameObject { 99 | /** 100 | * @class 101 | * @classdesc 动画对象, 用于渲染gif 102 | * @param {CanvasImageSource[]} imgs 图片数组 103 | * @param {number} x 横坐标 104 | * @param {number} y 纵坐标 105 | * @param {number} w 像素宽度 106 | * @param {number} h 像素高度 107 | */ 108 | constructor(imgs, x, y, w, h) { 109 | this.imgs = imgs 110 | this.x = x 111 | this.y = y 112 | this.w = w 113 | this.h = h 114 | this.index = 0 115 | } 116 | 117 | /** 118 | * @property 是否画完 119 | * @return {boolean} 120 | */ 121 | get drawOver() { 122 | return this.index >= this.imgs.length 123 | } 124 | 125 | /** 126 | * @property 获取一张图片 127 | * @return {CanvasImageSource} 128 | */ 129 | get img() { 130 | return this.imgs[Math.min(this.index++, this.imgs.length - 1)] 131 | } 132 | } 133 | -------------------------------------------------------------------------------- /src/game/utils.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 判断坐标是否在目标范围内 3 | */ 4 | export const isColliding = (x, y, target) => 5 | x > target.x && x < target.x + target.w && 6 | y > target.y && y < target.y + target.h 7 | 8 | /** 9 | * 计算两点距离 10 | */ 11 | export const distanceBetweenPoints = (x1, y1, x2, y2) => 12 | Math.sqrt(Math.pow(x2 - x1, 2) + Math.pow(y2 - y1, 2)) 13 | -------------------------------------------------------------------------------- /src/hooks/useGameAudio.js: -------------------------------------------------------------------------------- 1 | import { useSound } from '@vueuse/sound' 2 | import assets from '@/game/assets' 3 | import { useLocalStorage } from '@vueuse/core' 4 | 5 | export default function () { 6 | const currentAssetsMod = useLocalStorage('assets-mod', { index: 0 }) 7 | const audioSrc = assets[currentAssetsMod.value.index].audioSrc 8 | const bgm = new Audio(audioSrc.bgm) 9 | bgm.volume = 0.6 10 | bgm.loop = true 11 | const start = new Audio(audioSrc.start) 12 | start.loop = false 13 | const sounds = {} 14 | for (const key in audioSrc) { 15 | const options = { volume: 0.5 } 16 | sounds[key] = useSound(audioSrc[key], options).play 17 | } 18 | 19 | return { 20 | ...sounds, 21 | bgm: () => bgm.play(), 22 | start: () => start.play(), 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/main.css: -------------------------------------------------------------------------------- 1 | * { 2 | margin: 0; 3 | padding: 0; 4 | box-sizing: border-box; 5 | } 6 | 7 | html, body, #app { 8 | color-scheme: light only; 9 | width: 100%; 10 | height: 100%; 11 | overflow: hidden; 12 | overscroll-behavior: contain; 13 | } 14 | 15 | body { 16 | background: url(./assets/bg_welcome.webp) no-repeat center; 17 | background-size: cover; 18 | } 19 | 20 | #app { 21 | backdrop-filter: blur(1em); 22 | } 23 | 24 | .page-enter-active, 25 | .page-leave-active { 26 | transition: all 0.3s; 27 | } 28 | 29 | .page-enter-from, 30 | .page-leave-to { 31 | opacity: 0; 32 | filter: blur(1em); 33 | } 34 | -------------------------------------------------------------------------------- /src/main.js: -------------------------------------------------------------------------------- 1 | import './main.css' 2 | 3 | import { createApp } from 'vue' 4 | import App from './App.vue' 5 | import { createPinia } from 'pinia' 6 | import router from './router' 7 | 8 | createApp(App) 9 | .use(createPinia()) 10 | .use(router) 11 | .mount('#app') 12 | -------------------------------------------------------------------------------- /src/router/index.js: -------------------------------------------------------------------------------- 1 | import { createMemoryHistory, createRouter } from 'vue-router' 2 | import { useLogStore } from '@/stores/log-store' 3 | 4 | const routeOptions = { 5 | history: createMemoryHistory(import.meta.env.BASE_URL), 6 | routes: [ 7 | { 8 | path: '/', 9 | name: 'welcome', 10 | component: () => import('../views/welcome.vue'), 11 | }, 12 | { 13 | path: '/play', 14 | name: 'play', 15 | component: () => import('../views/play.vue'), 16 | }, 17 | { 18 | path: '/end', 19 | name: 'end', 20 | component: () => import('../views/end.vue'), 21 | }, 22 | ], 23 | } 24 | 25 | const index = createRouter(routeOptions) 26 | 27 | index.beforeEach((to) => { 28 | if (to.name !== 'welcome') { 29 | const logStore = useLogStore() 30 | if (!logStore.loaded) { 31 | return {name: 'welcome'} 32 | } 33 | } 34 | return true 35 | }) 36 | 37 | export default index 38 | -------------------------------------------------------------------------------- /src/stores/bitmap-store.js: -------------------------------------------------------------------------------- 1 | import { defineStore } from 'pinia' 2 | import { ref } from 'vue' 3 | import assets from '@/game/assets' 4 | import { useLocalStorage } from '@vueuse/core' 5 | 6 | export const useBitmapStore = defineStore('bitmap', () => { 7 | const currentAssetsMod = useLocalStorage('assets-mod', { index: 0 }) 8 | 9 | let loaded = false 10 | 11 | const bg = ref(null) 12 | 13 | /** @const 图片源(0为玩家, 1为玩家子弹, 2为敌机, 3为敌机子弹) */ 14 | const bitmaps = ref([]) 15 | 16 | /** @const 爆炸图片源 */ 17 | const blowBitmaps = ref([]) 18 | 19 | /** 20 | * 从url加载bitmap 21 | */ 22 | const loadBitmapFromUrl = async (url) => { 23 | const resp = await fetch(url) 24 | const blob = await resp.blob() 25 | return await createImageBitmap(blob) 26 | } 27 | 28 | /** 29 | * @function 加载图片 30 | * */ 31 | const loadBitmaps = async () => { 32 | if (loaded) return 33 | const bitmapSrc = assets[currentAssetsMod.value.index].bitmapSrc 34 | bg.value = bitmapSrc.bg 35 | bitmaps.value = await Promise.all(bitmapSrc.bitmaps.map((src) => loadBitmapFromUrl(src))) 36 | blowBitmaps.value = await Promise.all(bitmapSrc.blowBitmaps.map((src) => loadBitmapFromUrl(src))) 37 | loaded = true 38 | } 39 | 40 | return { bg, bitmaps, blowBitmaps, loadBitmaps, currentAssetsMod } 41 | }) 42 | -------------------------------------------------------------------------------- /src/stores/log-store.js: -------------------------------------------------------------------------------- 1 | import { defineStore } from 'pinia' 2 | import { computed, ref } from 'vue' 3 | 4 | export const useLogStore = defineStore('log', () => { 5 | const loaded = ref(false) 6 | const score = ref(0) 7 | // 全局日志 8 | const logger = { 9 | info(msg) { 10 | console.info(msg) 11 | this.history.push({code: 0, msg}) 12 | }, 13 | err(msg) { 14 | console.error(msg) 15 | this.history.push({code: 1, msg}) 16 | }, 17 | history: [], 18 | } 19 | const log = computed(() => { 20 | if (logger.history.length === 0) return '' 21 | const latestLog = logger.history[logger.history.length - 1] 22 | const title = latestLog.code === 0 ? '信息' : '错误' 23 | return `${title}:${latestLog.msg}` 24 | }) 25 | 26 | return {loaded, score, logger, log} 27 | }) 28 | -------------------------------------------------------------------------------- /src/views/end.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 21 | 22 | 53 | -------------------------------------------------------------------------------- /src/views/play.vue: -------------------------------------------------------------------------------- 1 | 513 | 514 | 537 | 538 | 640 | -------------------------------------------------------------------------------- /src/views/welcome.vue: -------------------------------------------------------------------------------- 1 | 25 | 26 | 52 | 53 | 95 | -------------------------------------------------------------------------------- /vite.config.js: -------------------------------------------------------------------------------- 1 | import { fileURLToPath, URL } from 'node:url' 2 | 3 | import { defineConfig } from 'vite' 4 | import vue from '@vitejs/plugin-vue' 5 | import postcssPresetEnv from 'postcss-preset-env' 6 | 7 | // https://vitejs.dev/config/ 8 | export default defineConfig({ 9 | build: { 10 | cssCodeSplit: false, 11 | }, 12 | plugins: [ 13 | vue(), 14 | ], 15 | css: { 16 | postcss: { 17 | plugins: [ 18 | postcssPresetEnv({ 19 | browsers: ['Chrome >= 87', 'Firefox >= 78', 'Safari >= 14', 'Edge >= 88'], 20 | features: { 21 | 'nesting-rules': true, 22 | }, 23 | }), 24 | ], 25 | }, 26 | }, 27 | resolve: { 28 | alias: { 29 | '@': fileURLToPath(new URL('./src', import.meta.url)), 30 | }, 31 | }, 32 | }) 33 | --------------------------------------------------------------------------------