├── .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 |
247 |
248 |
249 | {{ INTRO[lang].header }}
250 |
254 |
255 |
256 |
257 |
258 |
259 |
260 |
1
261 | {{ RETENTION[lang].title }}
262 |
266 |
267 |
321 |
322 |
323 |
324 |
325 |
2
326 | {{ DAU[lang].title }}
327 |
331 |
332 |
377 |
378 |
379 |
380 |
381 | {{ INTRO[lang].footer }}
382 | Github
383 |
384 |
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 |
--------------------------------------------------------------------------------