├── .gitattributes ├── .gitignore ├── .vscode └── extensions.json ├── README.md ├── index.html ├── jsconfig.json ├── package-lock.json ├── package.json ├── public └── favicon.ico ├── src ├── App.vue ├── assets │ ├── info.png │ ├── logo.png │ └── star.png ├── locale.js └── main.js └── vite.config.js /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | -------------------------------------------------------------------------------- /.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 | 30 | *.tsbuildinfo 31 | -------------------------------------------------------------------------------- /.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | "recommendations": ["Vue.volar"] 3 | } 4 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # DAU Calculator 2 | 3 | A small tool that uses a simple mathematical model to predict user retention and future DAU. 4 | 5 | 一个用简单的数学模型来预测用户留存与未来 DAU 的小工具。 -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | DAU Calculator 8 | 9 | 10 |
11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /jsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "paths": { 4 | "@/*": ["./src/*"] 5 | } 6 | }, 7 | "exclude": ["node_modules", "dist"] 8 | } 9 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "dau-calc", 3 | "version": "0.0.0", 4 | "lockfileVersion": 2, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "dau-calc", 9 | "version": "0.0.0", 10 | "dependencies": { 11 | "echarts": "^5.5.0", 12 | "vue": "^3.4.21" 13 | }, 14 | "devDependencies": { 15 | "@vitejs/plugin-vue": "^5.0.4", 16 | "vite": "^5.2.11" 17 | } 18 | }, 19 | "node_modules/@babel/parser": { 20 | "version": "7.24.5", 21 | "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.5.tgz", 22 | "integrity": "sha512-EOv5IK8arwh3LI47dz1b0tKUb/1uhHAnHJOrjgtQMIpu1uXd9mlFrJg9IUgGUgZ41Ch0K8REPTYpO7B76b4vJg==", 23 | "bin": { 24 | "parser": "bin/babel-parser.js" 25 | }, 26 | "engines": { 27 | "node": ">=6.0.0" 28 | } 29 | }, 30 | "node_modules/@esbuild/aix-ppc64": { 31 | "version": "0.20.2", 32 | "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz", 33 | "integrity": "sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==", 34 | "cpu": [ 35 | "ppc64" 36 | ], 37 | "dev": true, 38 | "optional": true, 39 | "os": [ 40 | "aix" 41 | ], 42 | "engines": { 43 | "node": ">=12" 44 | } 45 | }, 46 | "node_modules/@esbuild/android-arm": { 47 | "version": "0.20.2", 48 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.2.tgz", 49 | "integrity": "sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==", 50 | "cpu": [ 51 | "arm" 52 | ], 53 | "dev": true, 54 | "optional": true, 55 | "os": [ 56 | "android" 57 | ], 58 | "engines": { 59 | "node": ">=12" 60 | } 61 | }, 62 | "node_modules/@esbuild/android-arm64": { 63 | "version": "0.20.2", 64 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz", 65 | "integrity": "sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==", 66 | "cpu": [ 67 | "arm64" 68 | ], 69 | "dev": true, 70 | "optional": true, 71 | "os": [ 72 | "android" 73 | ], 74 | "engines": { 75 | "node": ">=12" 76 | } 77 | }, 78 | "node_modules/@esbuild/android-x64": { 79 | "version": "0.20.2", 80 | "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.2.tgz", 81 | "integrity": "sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==", 82 | "cpu": [ 83 | "x64" 84 | ], 85 | "dev": true, 86 | "optional": true, 87 | "os": [ 88 | "android" 89 | ], 90 | "engines": { 91 | "node": ">=12" 92 | } 93 | }, 94 | "node_modules/@esbuild/darwin-arm64": { 95 | "version": "0.20.2", 96 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz", 97 | "integrity": "sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==", 98 | "cpu": [ 99 | "arm64" 100 | ], 101 | "dev": true, 102 | "optional": true, 103 | "os": [ 104 | "darwin" 105 | ], 106 | "engines": { 107 | "node": ">=12" 108 | } 109 | }, 110 | "node_modules/@esbuild/darwin-x64": { 111 | "version": "0.20.2", 112 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz", 113 | "integrity": "sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==", 114 | "cpu": [ 115 | "x64" 116 | ], 117 | "dev": true, 118 | "optional": true, 119 | "os": [ 120 | "darwin" 121 | ], 122 | "engines": { 123 | "node": ">=12" 124 | } 125 | }, 126 | "node_modules/@esbuild/freebsd-arm64": { 127 | "version": "0.20.2", 128 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz", 129 | "integrity": "sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==", 130 | "cpu": [ 131 | "arm64" 132 | ], 133 | "dev": true, 134 | "optional": true, 135 | "os": [ 136 | "freebsd" 137 | ], 138 | "engines": { 139 | "node": ">=12" 140 | } 141 | }, 142 | "node_modules/@esbuild/freebsd-x64": { 143 | "version": "0.20.2", 144 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz", 145 | "integrity": "sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==", 146 | "cpu": [ 147 | "x64" 148 | ], 149 | "dev": true, 150 | "optional": true, 151 | "os": [ 152 | "freebsd" 153 | ], 154 | "engines": { 155 | "node": ">=12" 156 | } 157 | }, 158 | "node_modules/@esbuild/linux-arm": { 159 | "version": "0.20.2", 160 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz", 161 | "integrity": "sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==", 162 | "cpu": [ 163 | "arm" 164 | ], 165 | "dev": true, 166 | "optional": true, 167 | "os": [ 168 | "linux" 169 | ], 170 | "engines": { 171 | "node": ">=12" 172 | } 173 | }, 174 | "node_modules/@esbuild/linux-arm64": { 175 | "version": "0.20.2", 176 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz", 177 | "integrity": "sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==", 178 | "cpu": [ 179 | "arm64" 180 | ], 181 | "dev": true, 182 | "optional": true, 183 | "os": [ 184 | "linux" 185 | ], 186 | "engines": { 187 | "node": ">=12" 188 | } 189 | }, 190 | "node_modules/@esbuild/linux-ia32": { 191 | "version": "0.20.2", 192 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz", 193 | "integrity": "sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==", 194 | "cpu": [ 195 | "ia32" 196 | ], 197 | "dev": true, 198 | "optional": true, 199 | "os": [ 200 | "linux" 201 | ], 202 | "engines": { 203 | "node": ">=12" 204 | } 205 | }, 206 | "node_modules/@esbuild/linux-loong64": { 207 | "version": "0.20.2", 208 | "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz", 209 | "integrity": "sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==", 210 | "cpu": [ 211 | "loong64" 212 | ], 213 | "dev": true, 214 | "optional": true, 215 | "os": [ 216 | "linux" 217 | ], 218 | "engines": { 219 | "node": ">=12" 220 | } 221 | }, 222 | "node_modules/@esbuild/linux-mips64el": { 223 | "version": "0.20.2", 224 | "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz", 225 | "integrity": "sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==", 226 | "cpu": [ 227 | "mips64el" 228 | ], 229 | "dev": true, 230 | "optional": true, 231 | "os": [ 232 | "linux" 233 | ], 234 | "engines": { 235 | "node": ">=12" 236 | } 237 | }, 238 | "node_modules/@esbuild/linux-ppc64": { 239 | "version": "0.20.2", 240 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz", 241 | "integrity": "sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==", 242 | "cpu": [ 243 | "ppc64" 244 | ], 245 | "dev": true, 246 | "optional": true, 247 | "os": [ 248 | "linux" 249 | ], 250 | "engines": { 251 | "node": ">=12" 252 | } 253 | }, 254 | "node_modules/@esbuild/linux-riscv64": { 255 | "version": "0.20.2", 256 | "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz", 257 | "integrity": "sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==", 258 | "cpu": [ 259 | "riscv64" 260 | ], 261 | "dev": true, 262 | "optional": true, 263 | "os": [ 264 | "linux" 265 | ], 266 | "engines": { 267 | "node": ">=12" 268 | } 269 | }, 270 | "node_modules/@esbuild/linux-s390x": { 271 | "version": "0.20.2", 272 | "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz", 273 | "integrity": "sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==", 274 | "cpu": [ 275 | "s390x" 276 | ], 277 | "dev": true, 278 | "optional": true, 279 | "os": [ 280 | "linux" 281 | ], 282 | "engines": { 283 | "node": ">=12" 284 | } 285 | }, 286 | "node_modules/@esbuild/linux-x64": { 287 | "version": "0.20.2", 288 | "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz", 289 | "integrity": "sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==", 290 | "cpu": [ 291 | "x64" 292 | ], 293 | "dev": true, 294 | "optional": true, 295 | "os": [ 296 | "linux" 297 | ], 298 | "engines": { 299 | "node": ">=12" 300 | } 301 | }, 302 | "node_modules/@esbuild/netbsd-x64": { 303 | "version": "0.20.2", 304 | "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz", 305 | "integrity": "sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==", 306 | "cpu": [ 307 | "x64" 308 | ], 309 | "dev": true, 310 | "optional": true, 311 | "os": [ 312 | "netbsd" 313 | ], 314 | "engines": { 315 | "node": ">=12" 316 | } 317 | }, 318 | "node_modules/@esbuild/openbsd-x64": { 319 | "version": "0.20.2", 320 | "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz", 321 | "integrity": "sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==", 322 | "cpu": [ 323 | "x64" 324 | ], 325 | "dev": true, 326 | "optional": true, 327 | "os": [ 328 | "openbsd" 329 | ], 330 | "engines": { 331 | "node": ">=12" 332 | } 333 | }, 334 | "node_modules/@esbuild/sunos-x64": { 335 | "version": "0.20.2", 336 | "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz", 337 | "integrity": "sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==", 338 | "cpu": [ 339 | "x64" 340 | ], 341 | "dev": true, 342 | "optional": true, 343 | "os": [ 344 | "sunos" 345 | ], 346 | "engines": { 347 | "node": ">=12" 348 | } 349 | }, 350 | "node_modules/@esbuild/win32-arm64": { 351 | "version": "0.20.2", 352 | "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz", 353 | "integrity": "sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==", 354 | "cpu": [ 355 | "arm64" 356 | ], 357 | "dev": true, 358 | "optional": true, 359 | "os": [ 360 | "win32" 361 | ], 362 | "engines": { 363 | "node": ">=12" 364 | } 365 | }, 366 | "node_modules/@esbuild/win32-ia32": { 367 | "version": "0.20.2", 368 | "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz", 369 | "integrity": "sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==", 370 | "cpu": [ 371 | "ia32" 372 | ], 373 | "dev": true, 374 | "optional": true, 375 | "os": [ 376 | "win32" 377 | ], 378 | "engines": { 379 | "node": ">=12" 380 | } 381 | }, 382 | "node_modules/@esbuild/win32-x64": { 383 | "version": "0.20.2", 384 | "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz", 385 | "integrity": "sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==", 386 | "cpu": [ 387 | "x64" 388 | ], 389 | "dev": true, 390 | "optional": true, 391 | "os": [ 392 | "win32" 393 | ], 394 | "engines": { 395 | "node": ">=12" 396 | } 397 | }, 398 | "node_modules/@jridgewell/sourcemap-codec": { 399 | "version": "1.4.15", 400 | "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", 401 | "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" 402 | }, 403 | "node_modules/@rollup/rollup-android-arm-eabi": { 404 | "version": "4.17.2", 405 | "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.17.2.tgz", 406 | "integrity": "sha512-NM0jFxY8bB8QLkoKxIQeObCaDlJKewVlIEkuyYKm5An1tdVZ966w2+MPQ2l8LBZLjR+SgyV+nRkTIunzOYBMLQ==", 407 | "cpu": [ 408 | "arm" 409 | ], 410 | "dev": true, 411 | "optional": true, 412 | "os": [ 413 | "android" 414 | ] 415 | }, 416 | "node_modules/@rollup/rollup-android-arm64": { 417 | "version": "4.17.2", 418 | "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.17.2.tgz", 419 | "integrity": "sha512-yeX/Usk7daNIVwkq2uGoq2BYJKZY1JfyLTaHO/jaiSwi/lsf8fTFoQW/n6IdAsx5tx+iotu2zCJwz8MxI6D/Bw==", 420 | "cpu": [ 421 | "arm64" 422 | ], 423 | "dev": true, 424 | "optional": true, 425 | "os": [ 426 | "android" 427 | ] 428 | }, 429 | "node_modules/@rollup/rollup-darwin-arm64": { 430 | "version": "4.17.2", 431 | "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.17.2.tgz", 432 | "integrity": "sha512-kcMLpE6uCwls023+kknm71ug7MZOrtXo+y5p/tsg6jltpDtgQY1Eq5sGfHcQfb+lfuKwhBmEURDga9N0ol4YPw==", 433 | "cpu": [ 434 | "arm64" 435 | ], 436 | "dev": true, 437 | "optional": true, 438 | "os": [ 439 | "darwin" 440 | ] 441 | }, 442 | "node_modules/@rollup/rollup-darwin-x64": { 443 | "version": "4.17.2", 444 | "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.17.2.tgz", 445 | "integrity": "sha512-AtKwD0VEx0zWkL0ZjixEkp5tbNLzX+FCqGG1SvOu993HnSz4qDI6S4kGzubrEJAljpVkhRSlg5bzpV//E6ysTQ==", 446 | "cpu": [ 447 | "x64" 448 | ], 449 | "dev": true, 450 | "optional": true, 451 | "os": [ 452 | "darwin" 453 | ] 454 | }, 455 | "node_modules/@rollup/rollup-linux-arm-gnueabihf": { 456 | "version": "4.17.2", 457 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.17.2.tgz", 458 | "integrity": "sha512-3reX2fUHqN7sffBNqmEyMQVj/CKhIHZd4y631duy0hZqI8Qoqf6lTtmAKvJFYa6bhU95B1D0WgzHkmTg33In0A==", 459 | "cpu": [ 460 | "arm" 461 | ], 462 | "dev": true, 463 | "optional": true, 464 | "os": [ 465 | "linux" 466 | ] 467 | }, 468 | "node_modules/@rollup/rollup-linux-arm-musleabihf": { 469 | "version": "4.17.2", 470 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.17.2.tgz", 471 | "integrity": "sha512-uSqpsp91mheRgw96xtyAGP9FW5ChctTFEoXP0r5FAzj/3ZRv3Uxjtc7taRQSaQM/q85KEKjKsZuiZM3GyUivRg==", 472 | "cpu": [ 473 | "arm" 474 | ], 475 | "dev": true, 476 | "optional": true, 477 | "os": [ 478 | "linux" 479 | ] 480 | }, 481 | "node_modules/@rollup/rollup-linux-arm64-gnu": { 482 | "version": "4.17.2", 483 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.17.2.tgz", 484 | "integrity": "sha512-EMMPHkiCRtE8Wdk3Qhtciq6BndLtstqZIroHiiGzB3C5LDJmIZcSzVtLRbwuXuUft1Cnv+9fxuDtDxz3k3EW2A==", 485 | "cpu": [ 486 | "arm64" 487 | ], 488 | "dev": true, 489 | "optional": true, 490 | "os": [ 491 | "linux" 492 | ] 493 | }, 494 | "node_modules/@rollup/rollup-linux-arm64-musl": { 495 | "version": "4.17.2", 496 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.17.2.tgz", 497 | "integrity": "sha512-NMPylUUZ1i0z/xJUIx6VUhISZDRT+uTWpBcjdv0/zkp7b/bQDF+NfnfdzuTiB1G6HTodgoFa93hp0O1xl+/UbA==", 498 | "cpu": [ 499 | "arm64" 500 | ], 501 | "dev": true, 502 | "optional": true, 503 | "os": [ 504 | "linux" 505 | ] 506 | }, 507 | "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { 508 | "version": "4.17.2", 509 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.17.2.tgz", 510 | "integrity": "sha512-T19My13y8uYXPw/L/k0JYaX1fJKFT/PWdXiHr8mTbXWxjVF1t+8Xl31DgBBvEKclw+1b00Chg0hxE2O7bTG7GQ==", 511 | "cpu": [ 512 | "ppc64" 513 | ], 514 | "dev": true, 515 | "optional": true, 516 | "os": [ 517 | "linux" 518 | ] 519 | }, 520 | "node_modules/@rollup/rollup-linux-riscv64-gnu": { 521 | "version": "4.17.2", 522 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.17.2.tgz", 523 | "integrity": "sha512-BOaNfthf3X3fOWAB+IJ9kxTgPmMqPPH5f5k2DcCsRrBIbWnaJCgX2ll77dV1TdSy9SaXTR5iDXRL8n7AnoP5cg==", 524 | "cpu": [ 525 | "riscv64" 526 | ], 527 | "dev": true, 528 | "optional": true, 529 | "os": [ 530 | "linux" 531 | ] 532 | }, 533 | "node_modules/@rollup/rollup-linux-s390x-gnu": { 534 | "version": "4.17.2", 535 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.17.2.tgz", 536 | "integrity": "sha512-W0UP/x7bnn3xN2eYMql2T/+wpASLE5SjObXILTMPUBDB/Fg/FxC+gX4nvCfPBCbNhz51C+HcqQp2qQ4u25ok6g==", 537 | "cpu": [ 538 | "s390x" 539 | ], 540 | "dev": true, 541 | "optional": true, 542 | "os": [ 543 | "linux" 544 | ] 545 | }, 546 | "node_modules/@rollup/rollup-linux-x64-gnu": { 547 | "version": "4.17.2", 548 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.17.2.tgz", 549 | "integrity": "sha512-Hy7pLwByUOuyaFC6mAr7m+oMC+V7qyifzs/nW2OJfC8H4hbCzOX07Ov0VFk/zP3kBsELWNFi7rJtgbKYsav9QQ==", 550 | "cpu": [ 551 | "x64" 552 | ], 553 | "dev": true, 554 | "optional": true, 555 | "os": [ 556 | "linux" 557 | ] 558 | }, 559 | "node_modules/@rollup/rollup-linux-x64-musl": { 560 | "version": "4.17.2", 561 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.17.2.tgz", 562 | "integrity": "sha512-h1+yTWeYbRdAyJ/jMiVw0l6fOOm/0D1vNLui9iPuqgRGnXA0u21gAqOyB5iHjlM9MMfNOm9RHCQ7zLIzT0x11Q==", 563 | "cpu": [ 564 | "x64" 565 | ], 566 | "dev": true, 567 | "optional": true, 568 | "os": [ 569 | "linux" 570 | ] 571 | }, 572 | "node_modules/@rollup/rollup-win32-arm64-msvc": { 573 | "version": "4.17.2", 574 | "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.17.2.tgz", 575 | "integrity": "sha512-tmdtXMfKAjy5+IQsVtDiCfqbynAQE/TQRpWdVataHmhMb9DCoJxp9vLcCBjEQWMiUYxO1QprH/HbY9ragCEFLA==", 576 | "cpu": [ 577 | "arm64" 578 | ], 579 | "dev": true, 580 | "optional": true, 581 | "os": [ 582 | "win32" 583 | ] 584 | }, 585 | "node_modules/@rollup/rollup-win32-ia32-msvc": { 586 | "version": "4.17.2", 587 | "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.17.2.tgz", 588 | "integrity": "sha512-7II/QCSTAHuE5vdZaQEwJq2ZACkBpQDOmQsE6D6XUbnBHW8IAhm4eTufL6msLJorzrHDFv3CF8oCA/hSIRuZeQ==", 589 | "cpu": [ 590 | "ia32" 591 | ], 592 | "dev": true, 593 | "optional": true, 594 | "os": [ 595 | "win32" 596 | ] 597 | }, 598 | "node_modules/@rollup/rollup-win32-x64-msvc": { 599 | "version": "4.17.2", 600 | "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.17.2.tgz", 601 | "integrity": "sha512-TGGO7v7qOq4CYmSBVEYpI1Y5xDuCEnbVC5Vth8mOsW0gDSzxNrVERPc790IGHsrT2dQSimgMr9Ub3Y1Jci5/8w==", 602 | "cpu": [ 603 | "x64" 604 | ], 605 | "dev": true, 606 | "optional": true, 607 | "os": [ 608 | "win32" 609 | ] 610 | }, 611 | "node_modules/@types/estree": { 612 | "version": "1.0.5", 613 | "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", 614 | "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", 615 | "dev": true 616 | }, 617 | "node_modules/@vitejs/plugin-vue": { 618 | "version": "5.0.4", 619 | "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.0.4.tgz", 620 | "integrity": "sha512-WS3hevEszI6CEVEx28F8RjTX97k3KsrcY6kvTg7+Whm5y3oYvcqzVeGCU3hxSAn4uY2CLCkeokkGKpoctccilQ==", 621 | "dev": true, 622 | "engines": { 623 | "node": "^18.0.0 || >=20.0.0" 624 | }, 625 | "peerDependencies": { 626 | "vite": "^5.0.0", 627 | "vue": "^3.2.25" 628 | } 629 | }, 630 | "node_modules/@vue/compiler-core": { 631 | "version": "3.4.27", 632 | "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.4.27.tgz", 633 | "integrity": "sha512-E+RyqY24KnyDXsCuQrI+mlcdW3ALND6U7Gqa/+bVwbcpcR3BRRIckFoz7Qyd4TTlnugtwuI7YgjbvsLmxb+yvg==", 634 | "dependencies": { 635 | "@babel/parser": "^7.24.4", 636 | "@vue/shared": "3.4.27", 637 | "entities": "^4.5.0", 638 | "estree-walker": "^2.0.2", 639 | "source-map-js": "^1.2.0" 640 | } 641 | }, 642 | "node_modules/@vue/compiler-dom": { 643 | "version": "3.4.27", 644 | "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.4.27.tgz", 645 | "integrity": "sha512-kUTvochG/oVgE1w5ViSr3KUBh9X7CWirebA3bezTbB5ZKBQZwR2Mwj9uoSKRMFcz4gSMzzLXBPD6KpCLb9nvWw==", 646 | "dependencies": { 647 | "@vue/compiler-core": "3.4.27", 648 | "@vue/shared": "3.4.27" 649 | } 650 | }, 651 | "node_modules/@vue/compiler-sfc": { 652 | "version": "3.4.27", 653 | "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.4.27.tgz", 654 | "integrity": "sha512-nDwntUEADssW8e0rrmE0+OrONwmRlegDA1pD6QhVeXxjIytV03yDqTey9SBDiALsvAd5U4ZrEKbMyVXhX6mCGA==", 655 | "dependencies": { 656 | "@babel/parser": "^7.24.4", 657 | "@vue/compiler-core": "3.4.27", 658 | "@vue/compiler-dom": "3.4.27", 659 | "@vue/compiler-ssr": "3.4.27", 660 | "@vue/shared": "3.4.27", 661 | "estree-walker": "^2.0.2", 662 | "magic-string": "^0.30.10", 663 | "postcss": "^8.4.38", 664 | "source-map-js": "^1.2.0" 665 | } 666 | }, 667 | "node_modules/@vue/compiler-ssr": { 668 | "version": "3.4.27", 669 | "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.4.27.tgz", 670 | "integrity": "sha512-CVRzSJIltzMG5FcidsW0jKNQnNRYC8bT21VegyMMtHmhW3UOI7knmUehzswXLrExDLE6lQCZdrhD4ogI7c+vuw==", 671 | "dependencies": { 672 | "@vue/compiler-dom": "3.4.27", 673 | "@vue/shared": "3.4.27" 674 | } 675 | }, 676 | "node_modules/@vue/reactivity": { 677 | "version": "3.4.27", 678 | "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.4.27.tgz", 679 | "integrity": "sha512-kK0g4NknW6JX2yySLpsm2jlunZJl2/RJGZ0H9ddHdfBVHcNzxmQ0sS0b09ipmBoQpY8JM2KmUw+a6sO8Zo+zIA==", 680 | "dependencies": { 681 | "@vue/shared": "3.4.27" 682 | } 683 | }, 684 | "node_modules/@vue/runtime-core": { 685 | "version": "3.4.27", 686 | "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.4.27.tgz", 687 | "integrity": "sha512-7aYA9GEbOOdviqVvcuweTLe5Za4qBZkUY7SvET6vE8kyypxVgaT1ixHLg4urtOlrApdgcdgHoTZCUuTGap/5WA==", 688 | "dependencies": { 689 | "@vue/reactivity": "3.4.27", 690 | "@vue/shared": "3.4.27" 691 | } 692 | }, 693 | "node_modules/@vue/runtime-dom": { 694 | "version": "3.4.27", 695 | "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.4.27.tgz", 696 | "integrity": "sha512-ScOmP70/3NPM+TW9hvVAz6VWWtZJqkbdf7w6ySsws+EsqtHvkhxaWLecrTorFxsawelM5Ys9FnDEMt6BPBDS0Q==", 697 | "dependencies": { 698 | "@vue/runtime-core": "3.4.27", 699 | "@vue/shared": "3.4.27", 700 | "csstype": "^3.1.3" 701 | } 702 | }, 703 | "node_modules/@vue/server-renderer": { 704 | "version": "3.4.27", 705 | "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.4.27.tgz", 706 | "integrity": "sha512-dlAMEuvmeA3rJsOMJ2J1kXU7o7pOxgsNHVr9K8hB3ImIkSuBrIdy0vF66h8gf8Tuinf1TK3mPAz2+2sqyf3KzA==", 707 | "dependencies": { 708 | "@vue/compiler-ssr": "3.4.27", 709 | "@vue/shared": "3.4.27" 710 | }, 711 | "peerDependencies": { 712 | "vue": "3.4.27" 713 | } 714 | }, 715 | "node_modules/@vue/shared": { 716 | "version": "3.4.27", 717 | "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.4.27.tgz", 718 | "integrity": "sha512-DL3NmY2OFlqmYYrzp39yi3LDkKxa5vZVwxWdQ3rG0ekuWscHraeIbnI8t+aZK7qhYqEqWKTUdijadunb9pnrgA==" 719 | }, 720 | "node_modules/csstype": { 721 | "version": "3.1.3", 722 | "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", 723 | "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" 724 | }, 725 | "node_modules/echarts": { 726 | "version": "5.5.0", 727 | "resolved": "https://registry.npmjs.org/echarts/-/echarts-5.5.0.tgz", 728 | "integrity": "sha512-rNYnNCzqDAPCr4m/fqyUFv7fD9qIsd50S6GDFgO1DxZhncCsNsG7IfUlAlvZe5oSEQxtsjnHiUuppzccry93Xw==", 729 | "dependencies": { 730 | "tslib": "2.3.0", 731 | "zrender": "5.5.0" 732 | } 733 | }, 734 | "node_modules/entities": { 735 | "version": "4.5.0", 736 | "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", 737 | "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", 738 | "engines": { 739 | "node": ">=0.12" 740 | }, 741 | "funding": { 742 | "url": "https://github.com/fb55/entities?sponsor=1" 743 | } 744 | }, 745 | "node_modules/esbuild": { 746 | "version": "0.20.2", 747 | "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.2.tgz", 748 | "integrity": "sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==", 749 | "dev": true, 750 | "hasInstallScript": true, 751 | "bin": { 752 | "esbuild": "bin/esbuild" 753 | }, 754 | "engines": { 755 | "node": ">=12" 756 | }, 757 | "optionalDependencies": { 758 | "@esbuild/aix-ppc64": "0.20.2", 759 | "@esbuild/android-arm": "0.20.2", 760 | "@esbuild/android-arm64": "0.20.2", 761 | "@esbuild/android-x64": "0.20.2", 762 | "@esbuild/darwin-arm64": "0.20.2", 763 | "@esbuild/darwin-x64": "0.20.2", 764 | "@esbuild/freebsd-arm64": "0.20.2", 765 | "@esbuild/freebsd-x64": "0.20.2", 766 | "@esbuild/linux-arm": "0.20.2", 767 | "@esbuild/linux-arm64": "0.20.2", 768 | "@esbuild/linux-ia32": "0.20.2", 769 | "@esbuild/linux-loong64": "0.20.2", 770 | "@esbuild/linux-mips64el": "0.20.2", 771 | "@esbuild/linux-ppc64": "0.20.2", 772 | "@esbuild/linux-riscv64": "0.20.2", 773 | "@esbuild/linux-s390x": "0.20.2", 774 | "@esbuild/linux-x64": "0.20.2", 775 | "@esbuild/netbsd-x64": "0.20.2", 776 | "@esbuild/openbsd-x64": "0.20.2", 777 | "@esbuild/sunos-x64": "0.20.2", 778 | "@esbuild/win32-arm64": "0.20.2", 779 | "@esbuild/win32-ia32": "0.20.2", 780 | "@esbuild/win32-x64": "0.20.2" 781 | } 782 | }, 783 | "node_modules/estree-walker": { 784 | "version": "2.0.2", 785 | "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", 786 | "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" 787 | }, 788 | "node_modules/fsevents": { 789 | "version": "2.3.3", 790 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", 791 | "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", 792 | "dev": true, 793 | "hasInstallScript": true, 794 | "optional": true, 795 | "os": [ 796 | "darwin" 797 | ], 798 | "engines": { 799 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 800 | } 801 | }, 802 | "node_modules/magic-string": { 803 | "version": "0.30.10", 804 | "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.10.tgz", 805 | "integrity": "sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==", 806 | "dependencies": { 807 | "@jridgewell/sourcemap-codec": "^1.4.15" 808 | } 809 | }, 810 | "node_modules/nanoid": { 811 | "version": "3.3.7", 812 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", 813 | "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", 814 | "funding": [ 815 | { 816 | "type": "github", 817 | "url": "https://github.com/sponsors/ai" 818 | } 819 | ], 820 | "bin": { 821 | "nanoid": "bin/nanoid.cjs" 822 | }, 823 | "engines": { 824 | "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" 825 | } 826 | }, 827 | "node_modules/picocolors": { 828 | "version": "1.0.0", 829 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", 830 | "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" 831 | }, 832 | "node_modules/postcss": { 833 | "version": "8.4.38", 834 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", 835 | "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", 836 | "funding": [ 837 | { 838 | "type": "opencollective", 839 | "url": "https://opencollective.com/postcss/" 840 | }, 841 | { 842 | "type": "tidelift", 843 | "url": "https://tidelift.com/funding/github/npm/postcss" 844 | }, 845 | { 846 | "type": "github", 847 | "url": "https://github.com/sponsors/ai" 848 | } 849 | ], 850 | "dependencies": { 851 | "nanoid": "^3.3.7", 852 | "picocolors": "^1.0.0", 853 | "source-map-js": "^1.2.0" 854 | }, 855 | "engines": { 856 | "node": "^10 || ^12 || >=14" 857 | } 858 | }, 859 | "node_modules/rollup": { 860 | "version": "4.17.2", 861 | "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.17.2.tgz", 862 | "integrity": "sha512-/9ClTJPByC0U4zNLowV1tMBe8yMEAxewtR3cUNX5BoEpGH3dQEWpJLr6CLp0fPdYRF/fzVOgvDb1zXuakwF5kQ==", 863 | "dev": true, 864 | "dependencies": { 865 | "@types/estree": "1.0.5" 866 | }, 867 | "bin": { 868 | "rollup": "dist/bin/rollup" 869 | }, 870 | "engines": { 871 | "node": ">=18.0.0", 872 | "npm": ">=8.0.0" 873 | }, 874 | "optionalDependencies": { 875 | "@rollup/rollup-android-arm-eabi": "4.17.2", 876 | "@rollup/rollup-android-arm64": "4.17.2", 877 | "@rollup/rollup-darwin-arm64": "4.17.2", 878 | "@rollup/rollup-darwin-x64": "4.17.2", 879 | "@rollup/rollup-linux-arm-gnueabihf": "4.17.2", 880 | "@rollup/rollup-linux-arm-musleabihf": "4.17.2", 881 | "@rollup/rollup-linux-arm64-gnu": "4.17.2", 882 | "@rollup/rollup-linux-arm64-musl": "4.17.2", 883 | "@rollup/rollup-linux-powerpc64le-gnu": "4.17.2", 884 | "@rollup/rollup-linux-riscv64-gnu": "4.17.2", 885 | "@rollup/rollup-linux-s390x-gnu": "4.17.2", 886 | "@rollup/rollup-linux-x64-gnu": "4.17.2", 887 | "@rollup/rollup-linux-x64-musl": "4.17.2", 888 | "@rollup/rollup-win32-arm64-msvc": "4.17.2", 889 | "@rollup/rollup-win32-ia32-msvc": "4.17.2", 890 | "@rollup/rollup-win32-x64-msvc": "4.17.2", 891 | "fsevents": "~2.3.2" 892 | } 893 | }, 894 | "node_modules/source-map-js": { 895 | "version": "1.2.0", 896 | "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", 897 | "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", 898 | "engines": { 899 | "node": ">=0.10.0" 900 | } 901 | }, 902 | "node_modules/tslib": { 903 | "version": "2.3.0", 904 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", 905 | "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==" 906 | }, 907 | "node_modules/vite": { 908 | "version": "5.2.11", 909 | "resolved": "https://registry.npmjs.org/vite/-/vite-5.2.11.tgz", 910 | "integrity": "sha512-HndV31LWW05i1BLPMUCE1B9E9GFbOu1MbenhS58FuK6owSO5qHm7GiCotrNY1YE5rMeQSFBGmT5ZaLEjFizgiQ==", 911 | "dev": true, 912 | "dependencies": { 913 | "esbuild": "^0.20.1", 914 | "postcss": "^8.4.38", 915 | "rollup": "^4.13.0" 916 | }, 917 | "bin": { 918 | "vite": "bin/vite.js" 919 | }, 920 | "engines": { 921 | "node": "^18.0.0 || >=20.0.0" 922 | }, 923 | "funding": { 924 | "url": "https://github.com/vitejs/vite?sponsor=1" 925 | }, 926 | "optionalDependencies": { 927 | "fsevents": "~2.3.3" 928 | }, 929 | "peerDependencies": { 930 | "@types/node": "^18.0.0 || >=20.0.0", 931 | "less": "*", 932 | "lightningcss": "^1.21.0", 933 | "sass": "*", 934 | "stylus": "*", 935 | "sugarss": "*", 936 | "terser": "^5.4.0" 937 | }, 938 | "peerDependenciesMeta": { 939 | "@types/node": { 940 | "optional": true 941 | }, 942 | "less": { 943 | "optional": true 944 | }, 945 | "lightningcss": { 946 | "optional": true 947 | }, 948 | "sass": { 949 | "optional": true 950 | }, 951 | "stylus": { 952 | "optional": true 953 | }, 954 | "sugarss": { 955 | "optional": true 956 | }, 957 | "terser": { 958 | "optional": true 959 | } 960 | } 961 | }, 962 | "node_modules/vue": { 963 | "version": "3.4.27", 964 | "resolved": "https://registry.npmjs.org/vue/-/vue-3.4.27.tgz", 965 | "integrity": "sha512-8s/56uK6r01r1icG/aEOHqyMVxd1bkYcSe9j8HcKtr/xTOFWvnzIVTehNW+5Yt89f+DLBe4A569pnZLS5HzAMA==", 966 | "dependencies": { 967 | "@vue/compiler-dom": "3.4.27", 968 | "@vue/compiler-sfc": "3.4.27", 969 | "@vue/runtime-dom": "3.4.27", 970 | "@vue/server-renderer": "3.4.27", 971 | "@vue/shared": "3.4.27" 972 | }, 973 | "peerDependencies": { 974 | "typescript": "*" 975 | }, 976 | "peerDependenciesMeta": { 977 | "typescript": { 978 | "optional": true 979 | } 980 | } 981 | }, 982 | "node_modules/zrender": { 983 | "version": "5.5.0", 984 | "resolved": "https://registry.npmjs.org/zrender/-/zrender-5.5.0.tgz", 985 | "integrity": "sha512-O3MilSi/9mwoovx77m6ROZM7sXShR/O/JIanvzTwjN3FORfLSr81PsUGd7jlaYOeds9d8tw82oP44+3YucVo+w==", 986 | "dependencies": { 987 | "tslib": "2.3.0" 988 | } 989 | } 990 | }, 991 | "dependencies": { 992 | "@babel/parser": { 993 | "version": "7.24.5", 994 | "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.5.tgz", 995 | "integrity": "sha512-EOv5IK8arwh3LI47dz1b0tKUb/1uhHAnHJOrjgtQMIpu1uXd9mlFrJg9IUgGUgZ41Ch0K8REPTYpO7B76b4vJg==" 996 | }, 997 | "@esbuild/aix-ppc64": { 998 | "version": "0.20.2", 999 | "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz", 1000 | "integrity": "sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==", 1001 | "dev": true, 1002 | "optional": true 1003 | }, 1004 | "@esbuild/android-arm": { 1005 | "version": "0.20.2", 1006 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.2.tgz", 1007 | "integrity": "sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==", 1008 | "dev": true, 1009 | "optional": true 1010 | }, 1011 | "@esbuild/android-arm64": { 1012 | "version": "0.20.2", 1013 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz", 1014 | "integrity": "sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==", 1015 | "dev": true, 1016 | "optional": true 1017 | }, 1018 | "@esbuild/android-x64": { 1019 | "version": "0.20.2", 1020 | "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.2.tgz", 1021 | "integrity": "sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==", 1022 | "dev": true, 1023 | "optional": true 1024 | }, 1025 | "@esbuild/darwin-arm64": { 1026 | "version": "0.20.2", 1027 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz", 1028 | "integrity": "sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==", 1029 | "dev": true, 1030 | "optional": true 1031 | }, 1032 | "@esbuild/darwin-x64": { 1033 | "version": "0.20.2", 1034 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz", 1035 | "integrity": "sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==", 1036 | "dev": true, 1037 | "optional": true 1038 | }, 1039 | "@esbuild/freebsd-arm64": { 1040 | "version": "0.20.2", 1041 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz", 1042 | "integrity": "sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==", 1043 | "dev": true, 1044 | "optional": true 1045 | }, 1046 | "@esbuild/freebsd-x64": { 1047 | "version": "0.20.2", 1048 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz", 1049 | "integrity": "sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==", 1050 | "dev": true, 1051 | "optional": true 1052 | }, 1053 | "@esbuild/linux-arm": { 1054 | "version": "0.20.2", 1055 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz", 1056 | "integrity": "sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==", 1057 | "dev": true, 1058 | "optional": true 1059 | }, 1060 | "@esbuild/linux-arm64": { 1061 | "version": "0.20.2", 1062 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz", 1063 | "integrity": "sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==", 1064 | "dev": true, 1065 | "optional": true 1066 | }, 1067 | "@esbuild/linux-ia32": { 1068 | "version": "0.20.2", 1069 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz", 1070 | "integrity": "sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==", 1071 | "dev": true, 1072 | "optional": true 1073 | }, 1074 | "@esbuild/linux-loong64": { 1075 | "version": "0.20.2", 1076 | "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz", 1077 | "integrity": "sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==", 1078 | "dev": true, 1079 | "optional": true 1080 | }, 1081 | "@esbuild/linux-mips64el": { 1082 | "version": "0.20.2", 1083 | "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz", 1084 | "integrity": "sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==", 1085 | "dev": true, 1086 | "optional": true 1087 | }, 1088 | "@esbuild/linux-ppc64": { 1089 | "version": "0.20.2", 1090 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz", 1091 | "integrity": "sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==", 1092 | "dev": true, 1093 | "optional": true 1094 | }, 1095 | "@esbuild/linux-riscv64": { 1096 | "version": "0.20.2", 1097 | "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz", 1098 | "integrity": "sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==", 1099 | "dev": true, 1100 | "optional": true 1101 | }, 1102 | "@esbuild/linux-s390x": { 1103 | "version": "0.20.2", 1104 | "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz", 1105 | "integrity": "sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==", 1106 | "dev": true, 1107 | "optional": true 1108 | }, 1109 | "@esbuild/linux-x64": { 1110 | "version": "0.20.2", 1111 | "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz", 1112 | "integrity": "sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==", 1113 | "dev": true, 1114 | "optional": true 1115 | }, 1116 | "@esbuild/netbsd-x64": { 1117 | "version": "0.20.2", 1118 | "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz", 1119 | "integrity": "sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==", 1120 | "dev": true, 1121 | "optional": true 1122 | }, 1123 | "@esbuild/openbsd-x64": { 1124 | "version": "0.20.2", 1125 | "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz", 1126 | "integrity": "sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==", 1127 | "dev": true, 1128 | "optional": true 1129 | }, 1130 | "@esbuild/sunos-x64": { 1131 | "version": "0.20.2", 1132 | "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz", 1133 | "integrity": "sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==", 1134 | "dev": true, 1135 | "optional": true 1136 | }, 1137 | "@esbuild/win32-arm64": { 1138 | "version": "0.20.2", 1139 | "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz", 1140 | "integrity": "sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==", 1141 | "dev": true, 1142 | "optional": true 1143 | }, 1144 | "@esbuild/win32-ia32": { 1145 | "version": "0.20.2", 1146 | "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz", 1147 | "integrity": "sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==", 1148 | "dev": true, 1149 | "optional": true 1150 | }, 1151 | "@esbuild/win32-x64": { 1152 | "version": "0.20.2", 1153 | "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz", 1154 | "integrity": "sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==", 1155 | "dev": true, 1156 | "optional": true 1157 | }, 1158 | "@jridgewell/sourcemap-codec": { 1159 | "version": "1.4.15", 1160 | "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", 1161 | "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" 1162 | }, 1163 | "@rollup/rollup-android-arm-eabi": { 1164 | "version": "4.17.2", 1165 | "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.17.2.tgz", 1166 | "integrity": "sha512-NM0jFxY8bB8QLkoKxIQeObCaDlJKewVlIEkuyYKm5An1tdVZ966w2+MPQ2l8LBZLjR+SgyV+nRkTIunzOYBMLQ==", 1167 | "dev": true, 1168 | "optional": true 1169 | }, 1170 | "@rollup/rollup-android-arm64": { 1171 | "version": "4.17.2", 1172 | "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.17.2.tgz", 1173 | "integrity": "sha512-yeX/Usk7daNIVwkq2uGoq2BYJKZY1JfyLTaHO/jaiSwi/lsf8fTFoQW/n6IdAsx5tx+iotu2zCJwz8MxI6D/Bw==", 1174 | "dev": true, 1175 | "optional": true 1176 | }, 1177 | "@rollup/rollup-darwin-arm64": { 1178 | "version": "4.17.2", 1179 | "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.17.2.tgz", 1180 | "integrity": "sha512-kcMLpE6uCwls023+kknm71ug7MZOrtXo+y5p/tsg6jltpDtgQY1Eq5sGfHcQfb+lfuKwhBmEURDga9N0ol4YPw==", 1181 | "dev": true, 1182 | "optional": true 1183 | }, 1184 | "@rollup/rollup-darwin-x64": { 1185 | "version": "4.17.2", 1186 | "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.17.2.tgz", 1187 | "integrity": "sha512-AtKwD0VEx0zWkL0ZjixEkp5tbNLzX+FCqGG1SvOu993HnSz4qDI6S4kGzubrEJAljpVkhRSlg5bzpV//E6ysTQ==", 1188 | "dev": true, 1189 | "optional": true 1190 | }, 1191 | "@rollup/rollup-linux-arm-gnueabihf": { 1192 | "version": "4.17.2", 1193 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.17.2.tgz", 1194 | "integrity": "sha512-3reX2fUHqN7sffBNqmEyMQVj/CKhIHZd4y631duy0hZqI8Qoqf6lTtmAKvJFYa6bhU95B1D0WgzHkmTg33In0A==", 1195 | "dev": true, 1196 | "optional": true 1197 | }, 1198 | "@rollup/rollup-linux-arm-musleabihf": { 1199 | "version": "4.17.2", 1200 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.17.2.tgz", 1201 | "integrity": "sha512-uSqpsp91mheRgw96xtyAGP9FW5ChctTFEoXP0r5FAzj/3ZRv3Uxjtc7taRQSaQM/q85KEKjKsZuiZM3GyUivRg==", 1202 | "dev": true, 1203 | "optional": true 1204 | }, 1205 | "@rollup/rollup-linux-arm64-gnu": { 1206 | "version": "4.17.2", 1207 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.17.2.tgz", 1208 | "integrity": "sha512-EMMPHkiCRtE8Wdk3Qhtciq6BndLtstqZIroHiiGzB3C5LDJmIZcSzVtLRbwuXuUft1Cnv+9fxuDtDxz3k3EW2A==", 1209 | "dev": true, 1210 | "optional": true 1211 | }, 1212 | "@rollup/rollup-linux-arm64-musl": { 1213 | "version": "4.17.2", 1214 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.17.2.tgz", 1215 | "integrity": "sha512-NMPylUUZ1i0z/xJUIx6VUhISZDRT+uTWpBcjdv0/zkp7b/bQDF+NfnfdzuTiB1G6HTodgoFa93hp0O1xl+/UbA==", 1216 | "dev": true, 1217 | "optional": true 1218 | }, 1219 | "@rollup/rollup-linux-powerpc64le-gnu": { 1220 | "version": "4.17.2", 1221 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.17.2.tgz", 1222 | "integrity": "sha512-T19My13y8uYXPw/L/k0JYaX1fJKFT/PWdXiHr8mTbXWxjVF1t+8Xl31DgBBvEKclw+1b00Chg0hxE2O7bTG7GQ==", 1223 | "dev": true, 1224 | "optional": true 1225 | }, 1226 | "@rollup/rollup-linux-riscv64-gnu": { 1227 | "version": "4.17.2", 1228 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.17.2.tgz", 1229 | "integrity": "sha512-BOaNfthf3X3fOWAB+IJ9kxTgPmMqPPH5f5k2DcCsRrBIbWnaJCgX2ll77dV1TdSy9SaXTR5iDXRL8n7AnoP5cg==", 1230 | "dev": true, 1231 | "optional": true 1232 | }, 1233 | "@rollup/rollup-linux-s390x-gnu": { 1234 | "version": "4.17.2", 1235 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.17.2.tgz", 1236 | "integrity": "sha512-W0UP/x7bnn3xN2eYMql2T/+wpASLE5SjObXILTMPUBDB/Fg/FxC+gX4nvCfPBCbNhz51C+HcqQp2qQ4u25ok6g==", 1237 | "dev": true, 1238 | "optional": true 1239 | }, 1240 | "@rollup/rollup-linux-x64-gnu": { 1241 | "version": "4.17.2", 1242 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.17.2.tgz", 1243 | "integrity": "sha512-Hy7pLwByUOuyaFC6mAr7m+oMC+V7qyifzs/nW2OJfC8H4hbCzOX07Ov0VFk/zP3kBsELWNFi7rJtgbKYsav9QQ==", 1244 | "dev": true, 1245 | "optional": true 1246 | }, 1247 | "@rollup/rollup-linux-x64-musl": { 1248 | "version": "4.17.2", 1249 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.17.2.tgz", 1250 | "integrity": "sha512-h1+yTWeYbRdAyJ/jMiVw0l6fOOm/0D1vNLui9iPuqgRGnXA0u21gAqOyB5iHjlM9MMfNOm9RHCQ7zLIzT0x11Q==", 1251 | "dev": true, 1252 | "optional": true 1253 | }, 1254 | "@rollup/rollup-win32-arm64-msvc": { 1255 | "version": "4.17.2", 1256 | "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.17.2.tgz", 1257 | "integrity": "sha512-tmdtXMfKAjy5+IQsVtDiCfqbynAQE/TQRpWdVataHmhMb9DCoJxp9vLcCBjEQWMiUYxO1QprH/HbY9ragCEFLA==", 1258 | "dev": true, 1259 | "optional": true 1260 | }, 1261 | "@rollup/rollup-win32-ia32-msvc": { 1262 | "version": "4.17.2", 1263 | "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.17.2.tgz", 1264 | "integrity": "sha512-7II/QCSTAHuE5vdZaQEwJq2ZACkBpQDOmQsE6D6XUbnBHW8IAhm4eTufL6msLJorzrHDFv3CF8oCA/hSIRuZeQ==", 1265 | "dev": true, 1266 | "optional": true 1267 | }, 1268 | "@rollup/rollup-win32-x64-msvc": { 1269 | "version": "4.17.2", 1270 | "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.17.2.tgz", 1271 | "integrity": "sha512-TGGO7v7qOq4CYmSBVEYpI1Y5xDuCEnbVC5Vth8mOsW0gDSzxNrVERPc790IGHsrT2dQSimgMr9Ub3Y1Jci5/8w==", 1272 | "dev": true, 1273 | "optional": true 1274 | }, 1275 | "@types/estree": { 1276 | "version": "1.0.5", 1277 | "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", 1278 | "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", 1279 | "dev": true 1280 | }, 1281 | "@vitejs/plugin-vue": { 1282 | "version": "5.0.4", 1283 | "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.0.4.tgz", 1284 | "integrity": "sha512-WS3hevEszI6CEVEx28F8RjTX97k3KsrcY6kvTg7+Whm5y3oYvcqzVeGCU3hxSAn4uY2CLCkeokkGKpoctccilQ==", 1285 | "dev": true, 1286 | "requires": {} 1287 | }, 1288 | "@vue/compiler-core": { 1289 | "version": "3.4.27", 1290 | "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.4.27.tgz", 1291 | "integrity": "sha512-E+RyqY24KnyDXsCuQrI+mlcdW3ALND6U7Gqa/+bVwbcpcR3BRRIckFoz7Qyd4TTlnugtwuI7YgjbvsLmxb+yvg==", 1292 | "requires": { 1293 | "@babel/parser": "^7.24.4", 1294 | "@vue/shared": "3.4.27", 1295 | "entities": "^4.5.0", 1296 | "estree-walker": "^2.0.2", 1297 | "source-map-js": "^1.2.0" 1298 | } 1299 | }, 1300 | "@vue/compiler-dom": { 1301 | "version": "3.4.27", 1302 | "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.4.27.tgz", 1303 | "integrity": "sha512-kUTvochG/oVgE1w5ViSr3KUBh9X7CWirebA3bezTbB5ZKBQZwR2Mwj9uoSKRMFcz4gSMzzLXBPD6KpCLb9nvWw==", 1304 | "requires": { 1305 | "@vue/compiler-core": "3.4.27", 1306 | "@vue/shared": "3.4.27" 1307 | } 1308 | }, 1309 | "@vue/compiler-sfc": { 1310 | "version": "3.4.27", 1311 | "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.4.27.tgz", 1312 | "integrity": "sha512-nDwntUEADssW8e0rrmE0+OrONwmRlegDA1pD6QhVeXxjIytV03yDqTey9SBDiALsvAd5U4ZrEKbMyVXhX6mCGA==", 1313 | "requires": { 1314 | "@babel/parser": "^7.24.4", 1315 | "@vue/compiler-core": "3.4.27", 1316 | "@vue/compiler-dom": "3.4.27", 1317 | "@vue/compiler-ssr": "3.4.27", 1318 | "@vue/shared": "3.4.27", 1319 | "estree-walker": "^2.0.2", 1320 | "magic-string": "^0.30.10", 1321 | "postcss": "^8.4.38", 1322 | "source-map-js": "^1.2.0" 1323 | } 1324 | }, 1325 | "@vue/compiler-ssr": { 1326 | "version": "3.4.27", 1327 | "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.4.27.tgz", 1328 | "integrity": "sha512-CVRzSJIltzMG5FcidsW0jKNQnNRYC8bT21VegyMMtHmhW3UOI7knmUehzswXLrExDLE6lQCZdrhD4ogI7c+vuw==", 1329 | "requires": { 1330 | "@vue/compiler-dom": "3.4.27", 1331 | "@vue/shared": "3.4.27" 1332 | } 1333 | }, 1334 | "@vue/reactivity": { 1335 | "version": "3.4.27", 1336 | "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.4.27.tgz", 1337 | "integrity": "sha512-kK0g4NknW6JX2yySLpsm2jlunZJl2/RJGZ0H9ddHdfBVHcNzxmQ0sS0b09ipmBoQpY8JM2KmUw+a6sO8Zo+zIA==", 1338 | "requires": { 1339 | "@vue/shared": "3.4.27" 1340 | } 1341 | }, 1342 | "@vue/runtime-core": { 1343 | "version": "3.4.27", 1344 | "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.4.27.tgz", 1345 | "integrity": "sha512-7aYA9GEbOOdviqVvcuweTLe5Za4qBZkUY7SvET6vE8kyypxVgaT1ixHLg4urtOlrApdgcdgHoTZCUuTGap/5WA==", 1346 | "requires": { 1347 | "@vue/reactivity": "3.4.27", 1348 | "@vue/shared": "3.4.27" 1349 | } 1350 | }, 1351 | "@vue/runtime-dom": { 1352 | "version": "3.4.27", 1353 | "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.4.27.tgz", 1354 | "integrity": "sha512-ScOmP70/3NPM+TW9hvVAz6VWWtZJqkbdf7w6ySsws+EsqtHvkhxaWLecrTorFxsawelM5Ys9FnDEMt6BPBDS0Q==", 1355 | "requires": { 1356 | "@vue/runtime-core": "3.4.27", 1357 | "@vue/shared": "3.4.27", 1358 | "csstype": "^3.1.3" 1359 | } 1360 | }, 1361 | "@vue/server-renderer": { 1362 | "version": "3.4.27", 1363 | "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.4.27.tgz", 1364 | "integrity": "sha512-dlAMEuvmeA3rJsOMJ2J1kXU7o7pOxgsNHVr9K8hB3ImIkSuBrIdy0vF66h8gf8Tuinf1TK3mPAz2+2sqyf3KzA==", 1365 | "requires": { 1366 | "@vue/compiler-ssr": "3.4.27", 1367 | "@vue/shared": "3.4.27" 1368 | } 1369 | }, 1370 | "@vue/shared": { 1371 | "version": "3.4.27", 1372 | "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.4.27.tgz", 1373 | "integrity": "sha512-DL3NmY2OFlqmYYrzp39yi3LDkKxa5vZVwxWdQ3rG0ekuWscHraeIbnI8t+aZK7qhYqEqWKTUdijadunb9pnrgA==" 1374 | }, 1375 | "csstype": { 1376 | "version": "3.1.3", 1377 | "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", 1378 | "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" 1379 | }, 1380 | "echarts": { 1381 | "version": "5.5.0", 1382 | "resolved": "https://registry.npmjs.org/echarts/-/echarts-5.5.0.tgz", 1383 | "integrity": "sha512-rNYnNCzqDAPCr4m/fqyUFv7fD9qIsd50S6GDFgO1DxZhncCsNsG7IfUlAlvZe5oSEQxtsjnHiUuppzccry93Xw==", 1384 | "requires": { 1385 | "tslib": "2.3.0", 1386 | "zrender": "5.5.0" 1387 | } 1388 | }, 1389 | "entities": { 1390 | "version": "4.5.0", 1391 | "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", 1392 | "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==" 1393 | }, 1394 | "esbuild": { 1395 | "version": "0.20.2", 1396 | "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.2.tgz", 1397 | "integrity": "sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==", 1398 | "dev": true, 1399 | "requires": { 1400 | "@esbuild/aix-ppc64": "0.20.2", 1401 | "@esbuild/android-arm": "0.20.2", 1402 | "@esbuild/android-arm64": "0.20.2", 1403 | "@esbuild/android-x64": "0.20.2", 1404 | "@esbuild/darwin-arm64": "0.20.2", 1405 | "@esbuild/darwin-x64": "0.20.2", 1406 | "@esbuild/freebsd-arm64": "0.20.2", 1407 | "@esbuild/freebsd-x64": "0.20.2", 1408 | "@esbuild/linux-arm": "0.20.2", 1409 | "@esbuild/linux-arm64": "0.20.2", 1410 | "@esbuild/linux-ia32": "0.20.2", 1411 | "@esbuild/linux-loong64": "0.20.2", 1412 | "@esbuild/linux-mips64el": "0.20.2", 1413 | "@esbuild/linux-ppc64": "0.20.2", 1414 | "@esbuild/linux-riscv64": "0.20.2", 1415 | "@esbuild/linux-s390x": "0.20.2", 1416 | "@esbuild/linux-x64": "0.20.2", 1417 | "@esbuild/netbsd-x64": "0.20.2", 1418 | "@esbuild/openbsd-x64": "0.20.2", 1419 | "@esbuild/sunos-x64": "0.20.2", 1420 | "@esbuild/win32-arm64": "0.20.2", 1421 | "@esbuild/win32-ia32": "0.20.2", 1422 | "@esbuild/win32-x64": "0.20.2" 1423 | } 1424 | }, 1425 | "estree-walker": { 1426 | "version": "2.0.2", 1427 | "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", 1428 | "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" 1429 | }, 1430 | "fsevents": { 1431 | "version": "2.3.3", 1432 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", 1433 | "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", 1434 | "dev": true, 1435 | "optional": true 1436 | }, 1437 | "magic-string": { 1438 | "version": "0.30.10", 1439 | "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.10.tgz", 1440 | "integrity": "sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==", 1441 | "requires": { 1442 | "@jridgewell/sourcemap-codec": "^1.4.15" 1443 | } 1444 | }, 1445 | "nanoid": { 1446 | "version": "3.3.7", 1447 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", 1448 | "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==" 1449 | }, 1450 | "picocolors": { 1451 | "version": "1.0.0", 1452 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", 1453 | "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" 1454 | }, 1455 | "postcss": { 1456 | "version": "8.4.38", 1457 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", 1458 | "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", 1459 | "requires": { 1460 | "nanoid": "^3.3.7", 1461 | "picocolors": "^1.0.0", 1462 | "source-map-js": "^1.2.0" 1463 | } 1464 | }, 1465 | "rollup": { 1466 | "version": "4.17.2", 1467 | "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.17.2.tgz", 1468 | "integrity": "sha512-/9ClTJPByC0U4zNLowV1tMBe8yMEAxewtR3cUNX5BoEpGH3dQEWpJLr6CLp0fPdYRF/fzVOgvDb1zXuakwF5kQ==", 1469 | "dev": true, 1470 | "requires": { 1471 | "@rollup/rollup-android-arm-eabi": "4.17.2", 1472 | "@rollup/rollup-android-arm64": "4.17.2", 1473 | "@rollup/rollup-darwin-arm64": "4.17.2", 1474 | "@rollup/rollup-darwin-x64": "4.17.2", 1475 | "@rollup/rollup-linux-arm-gnueabihf": "4.17.2", 1476 | "@rollup/rollup-linux-arm-musleabihf": "4.17.2", 1477 | "@rollup/rollup-linux-arm64-gnu": "4.17.2", 1478 | "@rollup/rollup-linux-arm64-musl": "4.17.2", 1479 | "@rollup/rollup-linux-powerpc64le-gnu": "4.17.2", 1480 | "@rollup/rollup-linux-riscv64-gnu": "4.17.2", 1481 | "@rollup/rollup-linux-s390x-gnu": "4.17.2", 1482 | "@rollup/rollup-linux-x64-gnu": "4.17.2", 1483 | "@rollup/rollup-linux-x64-musl": "4.17.2", 1484 | "@rollup/rollup-win32-arm64-msvc": "4.17.2", 1485 | "@rollup/rollup-win32-ia32-msvc": "4.17.2", 1486 | "@rollup/rollup-win32-x64-msvc": "4.17.2", 1487 | "@types/estree": "1.0.5", 1488 | "fsevents": "~2.3.2" 1489 | } 1490 | }, 1491 | "source-map-js": { 1492 | "version": "1.2.0", 1493 | "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", 1494 | "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==" 1495 | }, 1496 | "tslib": { 1497 | "version": "2.3.0", 1498 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", 1499 | "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==" 1500 | }, 1501 | "vite": { 1502 | "version": "5.2.11", 1503 | "resolved": "https://registry.npmjs.org/vite/-/vite-5.2.11.tgz", 1504 | "integrity": "sha512-HndV31LWW05i1BLPMUCE1B9E9GFbOu1MbenhS58FuK6owSO5qHm7GiCotrNY1YE5rMeQSFBGmT5ZaLEjFizgiQ==", 1505 | "dev": true, 1506 | "requires": { 1507 | "esbuild": "^0.20.1", 1508 | "fsevents": "~2.3.3", 1509 | "postcss": "^8.4.38", 1510 | "rollup": "^4.13.0" 1511 | } 1512 | }, 1513 | "vue": { 1514 | "version": "3.4.27", 1515 | "resolved": "https://registry.npmjs.org/vue/-/vue-3.4.27.tgz", 1516 | "integrity": "sha512-8s/56uK6r01r1icG/aEOHqyMVxd1bkYcSe9j8HcKtr/xTOFWvnzIVTehNW+5Yt89f+DLBe4A569pnZLS5HzAMA==", 1517 | "requires": { 1518 | "@vue/compiler-dom": "3.4.27", 1519 | "@vue/compiler-sfc": "3.4.27", 1520 | "@vue/runtime-dom": "3.4.27", 1521 | "@vue/server-renderer": "3.4.27", 1522 | "@vue/shared": "3.4.27" 1523 | } 1524 | }, 1525 | "zrender": { 1526 | "version": "5.5.0", 1527 | "resolved": "https://registry.npmjs.org/zrender/-/zrender-5.5.0.tgz", 1528 | "integrity": "sha512-O3MilSi/9mwoovx77m6ROZM7sXShR/O/JIanvzTwjN3FORfLSr81PsUGd7jlaYOeds9d8tw82oP44+3YucVo+w==", 1529 | "requires": { 1530 | "tslib": "2.3.0" 1531 | } 1532 | } 1533 | } 1534 | } 1535 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "dau-calc", 3 | "version": "0.0.0", 4 | "private": true, 5 | "type": "module", 6 | "scripts": { 7 | "dev": "vite", 8 | "build": "vite build", 9 | "preview": "vite preview" 10 | }, 11 | "dependencies": { 12 | "echarts": "^5.5.0", 13 | "vue": "^3.4.21" 14 | }, 15 | "devDependencies": { 16 | "@vitejs/plugin-vue": "^5.0.4", 17 | "vite": "^5.2.11" 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ethonlau/dau-calculator/f6818495794fc627ace3fc7ae06cd58a88fbcb90/public/favicon.ico -------------------------------------------------------------------------------- /src/App.vue: -------------------------------------------------------------------------------- 1 | 245 | 246 | 385 | 386 | 616 | -------------------------------------------------------------------------------- /src/assets/info.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ethonlau/dau-calculator/f6818495794fc627ace3fc7ae06cd58a88fbcb90/src/assets/info.png -------------------------------------------------------------------------------- /src/assets/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ethonlau/dau-calculator/f6818495794fc627ace3fc7ae06cd58a88fbcb90/src/assets/logo.png -------------------------------------------------------------------------------- /src/assets/star.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ethonlau/dau-calculator/f6818495794fc627ace3fc7ae06cd58a88fbcb90/src/assets/star.png -------------------------------------------------------------------------------- /src/locale.js: -------------------------------------------------------------------------------- 1 | export const INTRO = { 2 | zh: { 3 | header: 'DAU (Daily Active Users),即某一天活跃的总用户数。我们可以使用简单的数学模型来预测用户留存情况,并据此预测未来的 DAU。', 4 | footer: '实际情况中,投放拉新的用户留存会比自然新增的用户留存低,用户的生命周期可能也没有那么长,用户半年后可能都完全流失了。所以这只是个很粗略的模型。\n\n希望这个小工具,能让更多人了解如何科学地做用户增长。', 5 | downloadAsCsv: '下载 csv 表格' 6 | }, 7 | en: { 8 | header: 'DAU (Daily Active Users), which refers to the total number of active users in a day. We can use a simple mathematical model to predict user retention and, based on this, forecast future DAU."', 9 | footer: 'In actual scenarios, the retention of users acquired through new promotions is lower than that of naturally added users, and the user lifecycle might not be as long, leading to complete user attrition after six months. Thus, this is a very rough model.\n\nWe hope this tool can help more people understand how to scientifically grow their user base.', 10 | downloadAsCsv: 'Download table as CSV' 11 | } 12 | } 13 | 14 | export const RETENTION = { 15 | zh: { 16 | title: '留存拟合曲线', 17 | desc: '使用乘幂函数进行拟合,与 excel 中绘制散点图并使用乘幂函数进行拟合,是相同的。', 18 | newUser1dayRetentionRate: '新用户次留', 19 | newUser1dayRetentionRateDesc: '新用户次日留存率,当天的新用户,在第 2 天仍然活跃的比例', 20 | newUser7dayRetentionRate: '新用户七留', 21 | newUser7dayRetentionRateDesc: '新用户七日留存率,当天的新用户,在第 7 天仍然活跃的比例', 22 | newUser30dayRetentionRate: '新用户三十留', 23 | newUser30dayRetentionRateDesc: '新用户三十日留存率,当天的新用户,在第 30 天仍然活跃的比例' 24 | }, 25 | en: { 26 | title: 'Retention Curve', 27 | desc: 'Fitting with a power function, the same as plotting a scatter chart in Excel and fitting it with a power function.', 28 | newUser1dayRetentionRate: 'New user 1-day retention', 29 | newUser1dayRetentionRateDesc: 'The 1-day retention rate for new users, indicating the proportion of new users from the current day who are still active on the second day.', 30 | newUser7dayRetentionRate: 'New user 7-day retention', 31 | newUser7dayRetentionRateDesc: 'The 7-day retention rate for new users, indicating the proportion of new users from the current day who are still active on the seventh day.', 32 | newUser30dayRetentionRate: 'New user 30-day retention', 33 | newUser30dayRetentionRateDesc: 'The 30-day retention rate for new users, indicating the proportion of new users from the current day who are still active on the thirtieth day.' 34 | } 35 | } 36 | 37 | export const DAU = { 38 | zh: { 39 | title: 'DAU 趋势', 40 | desc: '我们可以认为日活是“当天的新增用户和此前每一天新增用户在当天的留存用户之和”,因此我们可以用一个简单的公式表达日活:\n\nDAU(n)=A(n)+A(n-1)R(1)+A(n-2)R(2)+...+A(1)R(n-1)\n\n其中,DAU(n) 为第 n 天的日活,A(n) 为第 n 天的新增,R(n-1) 为新增用户在第 n-1 天后的留存率。\n\n如果我们假设,每日用户的新增是一个固定的数值 A,则公式可简写为:\n\nDAU(n)=A(1+R(1)+R(2)+...+R(n-1))', 41 | dailyNewUserCount: '每日新用户数', 42 | retainedUserCount: '已留存用户数', 43 | retainedDesc: '长期留存的用户,不代表当前的 DAU', 44 | forecastDayCount: '预测天数', 45 | finalDAU: '最终 DAU 约为' 46 | }, 47 | en: { 48 | title: 'DAU Trend', 49 | desc: 'We can consider the daily active users as "the sum of new users for the day and the retained users from each previous day", therefore we can express the daily active users using a simple formula:\n\nDAU(n) = A(n) + A(n-1)R(1) + A(n-2)R(2) + ... + A(1)R(n-1)\n\nWhere, DAU(n) is the daily active users on day n, A(n) is the new users on day n, and R(n-1) is the retention rate after n-1 days.\n\nAssuming a constant number of new users each day, the formula can be simplified to:\n\nDAU(n) = A(1 + R(1) + R(2) + ... + R(n-1))', 50 | dailyNewUserCount: 'Daily new user count', 51 | retainedUserCount: 'Retained user count', 52 | retainedDesc: 'Refers to long-term retained users, not representing the current DAU', 53 | forecastDayCount: 'Forecast Days', 54 | finalDAU: 'Final DAU is around' 55 | } 56 | } -------------------------------------------------------------------------------- /src/main.js: -------------------------------------------------------------------------------- 1 | import { createApp } from 'vue' 2 | import App from './App.vue' 3 | 4 | createApp(App).mount('#app') 5 | -------------------------------------------------------------------------------- /vite.config.js: -------------------------------------------------------------------------------- 1 | import { fileURLToPath, URL } from 'node:url' 2 | 3 | import { defineConfig } from 'vite' 4 | import vue from '@vitejs/plugin-vue' 5 | 6 | // https://vitejs.dev/config/ 7 | export default defineConfig({ 8 | plugins: [ 9 | vue(), 10 | ], 11 | resolve: { 12 | alias: { 13 | '@': fileURLToPath(new URL('./src', import.meta.url)) 14 | } 15 | } 16 | }) 17 | --------------------------------------------------------------------------------