koishi-plugin-group-analysis-mx 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (94) hide show
  1. package/lib/config.d.ts +53 -0
  2. package/lib/config.d.ts.map +1 -0
  3. package/lib/config.js +376 -0
  4. package/lib/config.js.map +1 -0
  5. package/lib/cron.d.ts +8 -0
  6. package/lib/cron.d.ts.map +1 -0
  7. package/lib/cron.js +62 -0
  8. package/lib/cron.js.map +1 -0
  9. package/lib/index.d.ts +6 -0
  10. package/lib/index.d.ts.map +1 -0
  11. package/lib/index.js +51 -0
  12. package/lib/index.js.map +1 -0
  13. package/lib/onebot/cqcode.d.ts +14 -0
  14. package/lib/onebot/cqcode.d.ts.map +1 -0
  15. package/lib/onebot/cqcode.js +92 -0
  16. package/lib/onebot/cqcode.js.map +1 -0
  17. package/lib/plugin.d.ts +4 -0
  18. package/lib/plugin.d.ts.map +1 -0
  19. package/lib/plugin.js +41 -0
  20. package/lib/plugin.js.map +1 -0
  21. package/lib/plugins/command.d.ts +9 -0
  22. package/lib/plugins/command.d.ts.map +1 -0
  23. package/lib/plugins/command.js +196 -0
  24. package/lib/plugins/command.js.map +1 -0
  25. package/lib/service/analysis.d.ts +48 -0
  26. package/lib/service/analysis.d.ts.map +1 -0
  27. package/lib/service/analysis.js +714 -0
  28. package/lib/service/analysis.js.map +1 -0
  29. package/lib/service/llm.d.ts +43 -0
  30. package/lib/service/llm.d.ts.map +1 -0
  31. package/lib/service/llm.js +160 -0
  32. package/lib/service/llm.js.map +1 -0
  33. package/lib/service/message.d.ts +55 -0
  34. package/lib/service/message.d.ts.map +1 -0
  35. package/lib/service/message.js +527 -0
  36. package/lib/service/message.js.map +1 -0
  37. package/lib/service/renderer.d.ts +23 -0
  38. package/lib/service/renderer.d.ts.map +1 -0
  39. package/lib/service/renderer.js +298 -0
  40. package/lib/service/renderer.js.map +1 -0
  41. package/lib/skins/anime.d.ts +19 -0
  42. package/lib/skins/anime.d.ts.map +1 -0
  43. package/lib/skins/anime.js +138 -0
  44. package/lib/skins/anime.js.map +1 -0
  45. package/lib/skins/art.d.ts +19 -0
  46. package/lib/skins/art.d.ts.map +1 -0
  47. package/lib/skins/art.js +146 -0
  48. package/lib/skins/art.js.map +1 -0
  49. package/lib/skins/index.d.ts +50 -0
  50. package/lib/skins/index.d.ts.map +1 -0
  51. package/lib/skins/index.js +84 -0
  52. package/lib/skins/index.js.map +1 -0
  53. package/lib/skins/md3.d.ts +19 -0
  54. package/lib/skins/md3.d.ts.map +1 -0
  55. package/lib/skins/md3.js +147 -0
  56. package/lib/skins/md3.js.map +1 -0
  57. package/lib/skins/newspaper.d.ts +19 -0
  58. package/lib/skins/newspaper.d.ts.map +1 -0
  59. package/lib/skins/newspaper.js +141 -0
  60. package/lib/skins/newspaper.js.map +1 -0
  61. package/lib/skins/scrapbook.d.ts +20 -0
  62. package/lib/skins/scrapbook.d.ts.map +1 -0
  63. package/lib/skins/scrapbook.js +207 -0
  64. package/lib/skins/scrapbook.js.map +1 -0
  65. package/lib/skins/types.d.ts +69 -0
  66. package/lib/skins/types.d.ts.map +1 -0
  67. package/lib/skins/types.js +12 -0
  68. package/lib/skins/types.js.map +1 -0
  69. package/lib/types.d.ts +170 -0
  70. package/lib/types.d.ts.map +1 -0
  71. package/lib/types.js +3 -0
  72. package/lib/types.js.map +1 -0
  73. package/lib/utils.d.ts +55 -0
  74. package/lib/utils.d.ts.map +1 -0
  75. package/lib/utils.js +334 -0
  76. package/lib/utils.js.map +1 -0
  77. package/package.json +48 -0
  78. package/resources/anime/css/template_group.css +470 -0
  79. package/resources/anime/images/decoration_br.svg +19 -0
  80. package/resources/anime/images/decoration_tl.svg +24 -0
  81. package/resources/anime/template_group.html +108 -0
  82. package/resources/anime/template_user.html +99 -0
  83. package/resources/art/css/template_group.css +484 -0
  84. package/resources/art/template_group.html +77 -0
  85. package/resources/art/template_user.html +63 -0
  86. package/resources/md3/css/template_group.css +880 -0
  87. package/resources/md3/template_group.html +189 -0
  88. package/resources/md3/template_user.html +175 -0
  89. package/resources/newspaper/css/template_group.css +568 -0
  90. package/resources/newspaper/template_group.html +133 -0
  91. package/resources/newspaper/template_user.html +119 -0
  92. package/resources/scrapbook/css/style.css +1094 -0
  93. package/resources/scrapbook/template_group.html +115 -0
  94. package/resources/scrapbook/template_user.html +119 -0
@@ -0,0 +1,470 @@
1
+ @import url('https://fonts.googleapis.com/css2?family=Kiwi+Maru:wght@400;500&family=Kosugi+Maru&family=M+PLUS+Rounded+1c:wght@400;500;800&display=swap');
2
+
3
+ :root {
4
+ /* Theme Colors - Nahida/Sumeru Inspired */
5
+ --color-primary: #66BB6A; /* Fresh Green */
6
+ --color-secondary: #AED581; /* Light Green */
7
+ --color-accent: #8BC34A; /* Vivid Green */
8
+ --color-highlight: #FFF176; /* Soft Yellow/Gold */
9
+ --color-text: #33691E; /* Dark Green Text */
10
+ --color-text-light: #558B2F;
11
+ --color-bg: #F1F8E9; /* Very light green tint */
12
+ --color-card: #FFFFFF;
13
+
14
+ /* Layout */
15
+ --container-width: 960px;
16
+ --border-radius: 24px;
17
+ --border-width: 3px;
18
+
19
+ /* Fonts */
20
+ --font-main: 'M PLUS Rounded 1c', sans-serif;
21
+ --font-body: 'Kosugi Maru', sans-serif;
22
+ --font-hand: 'Kiwi Maru', serif;
23
+ }
24
+
25
+ /* Dark Mode Overrides (Dream/Abyss Mode) */
26
+ body.dark-theme {
27
+ --color-primary: #81C784;
28
+ --color-secondary: #4DB6AC;
29
+ --color-accent: #26A69A;
30
+ --color-highlight: #FFD54F;
31
+ --color-text: #E0F2F1;
32
+ --color-text-light: #B2DFDB;
33
+ --color-bg: #004D40;
34
+ --color-card: #00695C;
35
+ }
36
+
37
+ * {
38
+ box-sizing: border-box;
39
+ margin: 0;
40
+ padding: 0;
41
+ }
42
+
43
+ body {
44
+ font-family: var(--font-body);
45
+ background-color: var(--color-bg);
46
+ /* Dot pattern background */
47
+ background-image: radial-gradient(var(--color-secondary) 2px, transparent 2px);
48
+ background-size: 30px 30px;
49
+ color: var(--color-text);
50
+ display: flex;
51
+ justify-content: center;
52
+ min-height: 100vh;
53
+ padding: 40px 20px;
54
+ line-height: 1.5;
55
+ }
56
+
57
+ /* Main Container - The "Book" or "Tablet" */
58
+ .nahida-container {
59
+ position: relative;
60
+ width: 100%;
61
+ max-width: var(--container-width);
62
+ background: var(--color-card);
63
+ border: var(--border-width) solid var(--color-primary);
64
+ border-radius: var(--border-radius);
65
+ /* Hard shadow for 2D/Sticker effect */
66
+ box-shadow: 12px 12px 0px rgba(0,0,0,0.1),
67
+ inset 0 0 0 4px rgba(255,255,255,0.5);
68
+ padding: 0;
69
+ z-index: 1;
70
+ overflow: visible;
71
+ }
72
+
73
+ /* Top/Bottom Decorations */
74
+ .deco-tl, .deco-br {
75
+ position: absolute;
76
+ z-index: 10;
77
+ pointer-events: none;
78
+ filter: drop-shadow(2px 2px 0px rgba(0,0,0,0.1));
79
+ }
80
+
81
+ .deco-tl {
82
+ top: -20px;
83
+ left: -20px;
84
+ width: 160px;
85
+ height: 160px;
86
+ }
87
+
88
+ .deco-br {
89
+ bottom: -40px;
90
+ right: -40px;
91
+ width: 160px;
92
+ height: 160px;
93
+ }
94
+
95
+ /* Header Area */
96
+ .header-area {
97
+ padding: 50px 60px 30px;
98
+ background: linear-gradient(180deg, var(--color-bg) 0%, transparent 100%);
99
+ border-radius: var(--border-radius) var(--border-radius) 0 0;
100
+ position: relative;
101
+ display: flex;
102
+ justify-content: space-between;
103
+ align-items: flex-end;
104
+ border-bottom: 2px dashed var(--color-secondary);
105
+ }
106
+
107
+ .header-title h1 {
108
+ font-family: var(--font-main);
109
+ font-size: 42px;
110
+ font-weight: 800;
111
+ color: var(--color-primary);
112
+ text-shadow: 3px 3px 0px var(--color-bg),
113
+ 5px 5px 0px rgba(0,0,0,0.1);
114
+ letter-spacing: 2px;
115
+ margin-bottom: 8px;
116
+ }
117
+
118
+ .header-title .subtitle {
119
+ font-family: var(--font-hand);
120
+ background: var(--color-highlight);
121
+ color: #5D4037;
122
+ padding: 4px 16px;
123
+ border-radius: 20px;
124
+ font-weight: bold;
125
+ display: inline-block;
126
+ transform: rotate(-2deg);
127
+ border: 2px solid #fff;
128
+ box-shadow: 2px 2px 0px rgba(0,0,0,0.1);
129
+ }
130
+
131
+ .header-meta {
132
+ text-align: right;
133
+ }
134
+
135
+ .header-meta .date {
136
+ font-family: var(--font-main);
137
+ font-size: 24px;
138
+ font-weight: 800;
139
+ color: var(--color-text);
140
+ }
141
+
142
+ .header-meta .group-id {
143
+ font-family: var(--font-hand);
144
+ color: var(--color-text-light);
145
+ margin-top: 4px;
146
+ }
147
+
148
+ /* Main Layout Grid */
149
+ .main-content {
150
+ padding: 40px 60px;
151
+ }
152
+
153
+ /* Section Headings */
154
+ .section-header {
155
+ display: flex;
156
+ align-items: center;
157
+ margin: 40px 0 24px;
158
+ gap: 12px;
159
+ }
160
+
161
+ .section-icon {
162
+ width: 32px;
163
+ height: 32px;
164
+ background: var(--color-primary);
165
+ border-radius: 50%;
166
+ display: flex;
167
+ align-items: center;
168
+ justify-content: center;
169
+ color: white;
170
+ font-weight: bold;
171
+ border: 2px solid white;
172
+ box-shadow: 0 0 0 2px var(--color-primary);
173
+ }
174
+
175
+ .section-title {
176
+ font-family: var(--font-main);
177
+ font-size: 24px;
178
+ color: var(--color-text);
179
+ font-weight: 800;
180
+ position: relative;
181
+ }
182
+
183
+ .section-title::after {
184
+ content: '';
185
+ position: absolute;
186
+ bottom: -4px;
187
+ left: 0;
188
+ width: 100%;
189
+ height: 4px;
190
+ background: var(--color-secondary);
191
+ border-radius: 2px;
192
+ opacity: 0.6;
193
+ }
194
+
195
+ /* Grid Layouts */
196
+ .grid-2 { display: grid; grid-template-columns: 1fr 1fr; gap: 24px; }
197
+ .grid-4 { display: grid; grid-template-columns: repeat(4, 1fr); gap: 20px; }
198
+
199
+ /* Stat Cards (Sticker Style) */
200
+ .stat-sticker {
201
+ background: var(--color-bg);
202
+ border: 2px solid var(--color-primary);
203
+ border-radius: 16px;
204
+ padding: 20px;
205
+ text-align: center;
206
+ position: relative;
207
+ transition: transform 0.2s;
208
+ }
209
+
210
+ .stat-sticker:hover {
211
+ transform: translateY(-4px);
212
+ }
213
+
214
+ .stat-sticker::before {
215
+ /* Tape effect */
216
+ content: '';
217
+ position: absolute;
218
+ top: -10px;
219
+ left: 50%;
220
+ transform: translateX(-50%);
221
+ width: 40px;
222
+ height: 12px;
223
+ background: rgba(0,0,0,0.1);
224
+ border-radius: 2px;
225
+ }
226
+
227
+ .stat-sticker .label {
228
+ font-size: 14px;
229
+ color: var(--color-text-light);
230
+ font-weight: bold;
231
+ margin-bottom: 8px;
232
+ }
233
+
234
+ .stat-sticker .value {
235
+ font-family: var(--font-main);
236
+ font-size: 28px;
237
+ color: var(--color-primary);
238
+ font-weight: 800;
239
+ }
240
+
241
+ /* Character Cards */
242
+ .char-box {
243
+ background: white;
244
+ border: 2px solid var(--color-secondary);
245
+ border-radius: 20px;
246
+ padding: 16px;
247
+ display: flex;
248
+ gap: 16px;
249
+ align-items: center;
250
+ position: relative;
251
+ overflow: hidden;
252
+ }
253
+
254
+ body.dark-theme .char-box {
255
+ background: #004D40;
256
+ border-color: #80CBC4;
257
+ }
258
+
259
+ .char-box::after {
260
+ /* Decorative corner */
261
+ content: '';
262
+ position: absolute;
263
+ bottom: -20px;
264
+ right: -20px;
265
+ width: 60px;
266
+ height: 60px;
267
+ background: var(--color-secondary);
268
+ border-radius: 50%;
269
+ opacity: 0.2;
270
+ }
271
+
272
+ .char-avatar {
273
+ width: 64px;
274
+ height: 64px;
275
+ border-radius: 50%;
276
+ border: 3px solid var(--color-primary);
277
+ object-fit: cover;
278
+ flex-shrink: 0;
279
+ }
280
+
281
+ .char-content {
282
+ flex: 1;
283
+ z-index: 1;
284
+ }
285
+
286
+ .char-name {
287
+ font-family: var(--font-main);
288
+ font-size: 18px;
289
+ font-weight: bold;
290
+ margin-bottom: 4px;
291
+ }
292
+
293
+ .char-detail {
294
+ font-size: 12px;
295
+ color: var(--color-text-light);
296
+ display: flex;
297
+ gap: 10px;
298
+ flex-wrap: wrap;
299
+ }
300
+
301
+ .char-badge {
302
+ background: var(--color-highlight);
303
+ color: #5D4037;
304
+ padding: 2px 8px;
305
+ border-radius: 10px;
306
+ font-size: 11px;
307
+ font-weight: bold;
308
+ border: 1px solid #FBC02D;
309
+ }
310
+
311
+ /* Dialogue Bubbles */
312
+ .bubble-container {
313
+ display: flex;
314
+ flex-direction: column;
315
+ gap: 16px;
316
+ }
317
+
318
+ .bubble {
319
+ background: white;
320
+ border: 2px solid var(--color-primary);
321
+ border-radius: 20px 20px 20px 4px;
322
+ padding: 20px;
323
+ position: relative;
324
+ box-shadow: 4px 4px 0 rgba(0,0,0,0.05);
325
+ }
326
+
327
+ body.dark-theme .bubble {
328
+ background: #004D40;
329
+ border-color: #4DB6AC;
330
+ }
331
+
332
+ .bubble-text {
333
+ font-family: var(--font-hand);
334
+ font-size: 16px;
335
+ line-height: 1.6;
336
+ color: var(--color-text);
337
+ }
338
+
339
+ .bubble-meta {
340
+ margin-top: 10px;
341
+ padding-top: 10px;
342
+ border-top: 1px dashed var(--color-secondary);
343
+ text-align: right;
344
+ font-size: 12px;
345
+ color: var(--color-text-light);
346
+ font-weight: bold;
347
+ }
348
+
349
+ /* Chart */
350
+ .chart-container {
351
+ height: 200px;
352
+ display: flex;
353
+ align-items: flex-end;
354
+ justify-content: space-between;
355
+ padding: 20px;
356
+ background: white;
357
+ border: 2px solid var(--color-secondary);
358
+ border-radius: 20px;
359
+ /* inner grid pattern */
360
+ background-image: linear-gradient(rgba(0,0,0,0.05) 1px, transparent 1px),
361
+ linear-gradient(90deg, rgba(0,0,0,0.05) 1px, transparent 1px);
362
+ background-size: 20px 20px;
363
+ }
364
+
365
+ body.dark-theme .chart-container {
366
+ background-color: #004D40;
367
+ background-image: linear-gradient(rgba(255,255,255,0.05) 1px, transparent 1px),
368
+ linear-gradient(90deg, rgba(255,255,255,0.05) 1px, transparent 1px);
369
+ }
370
+
371
+ .chart-bar-group {
372
+ flex: 1;
373
+ display: flex;
374
+ flex-direction: column;
375
+ align-items: center;
376
+ height: 100%;
377
+ justify-content: flex-end;
378
+ gap: 8px;
379
+ }
380
+
381
+ .chart-bar {
382
+ width: 12px;
383
+ background: var(--color-primary);
384
+ border-radius: 6px;
385
+ min-height: 6px;
386
+ opacity: 0.8;
387
+ transition: height 0.3s;
388
+ }
389
+
390
+ .chart-bar:hover {
391
+ opacity: 1;
392
+ transform: scaleX(1.2);
393
+ }
394
+
395
+ .chart-label {
396
+ font-size: 10px;
397
+ color: var(--color-text-light);
398
+ }
399
+
400
+ /* User Profile Specifics */
401
+ .profile-hero {
402
+ display: flex;
403
+ flex-direction: column;
404
+ align-items: center;
405
+ margin-bottom: 30px;
406
+ position: relative;
407
+ }
408
+
409
+ .profile-avatar-lg {
410
+ width: 120px;
411
+ height: 120px;
412
+ border-radius: 50%;
413
+ border: 4px solid var(--color-card);
414
+ box-shadow: 0 0 0 4px var(--color-primary);
415
+ margin-bottom: 16px;
416
+ }
417
+
418
+ .profile-name {
419
+ font-family: var(--font-main);
420
+ font-size: 32px;
421
+ color: var(--color-text);
422
+ }
423
+
424
+ .tag-container {
425
+ display: flex;
426
+ flex-wrap: wrap;
427
+ gap: 10px;
428
+ justify-content: center;
429
+ }
430
+
431
+ .tag {
432
+ background: var(--color-bg);
433
+ border: 1px solid var(--color-primary);
434
+ color: var(--color-text);
435
+ padding: 6px 12px;
436
+ border-radius: 16px;
437
+ font-size: 14px;
438
+ font-family: var(--font-body);
439
+ box-shadow: 2px 2px 0 rgba(0,0,0,0.05);
440
+ }
441
+
442
+ /* Evidence List */
443
+ .evidence-item {
444
+ background: var(--color-bg);
445
+ padding: 12px 16px;
446
+ border-radius: 8px;
447
+ margin-bottom: 8px;
448
+ border-left: 4px solid var(--color-primary);
449
+ font-size: 14px;
450
+ line-height: 1.4;
451
+ }
452
+
453
+ /* Footer */
454
+ .footer {
455
+ text-align: center;
456
+ margin-top: 40px;
457
+ font-size: 12px;
458
+ color: var(--color-text-light);
459
+ opacity: 0.7;
460
+ font-family: var(--font-hand);
461
+ }
462
+
463
+ .empty-state {
464
+ text-align: center;
465
+ padding: 40px;
466
+ color: var(--color-text-light);
467
+ font-style: italic;
468
+ border: 2px dashed var(--color-secondary);
469
+ border-radius: 12px;
470
+ }
@@ -0,0 +1,19 @@
1
+ <svg width="200" height="200" viewBox="0 0 200 200" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <!-- Wisdom Stamp / Flower Motif -->
3
+ <g transform="translate(100,100) rotate(-15)">
4
+ <!-- Outer Ring -->
5
+ <circle cx="0" cy="0" r="70" stroke="#66BB6A" stroke-width="3" stroke-dasharray="10 5" fill="rgba(255,255,255,0.9)"/>
6
+
7
+ <!-- Inner Flower Shape -->
8
+ <path d="M0 -50 C 20 -20, 50 -20, 50 0 C 50 20, 20 20, 0 50 C -20 20, -50 20, -50 0 C -50 -20, -20 -20, 0 -50" fill="#C8E6C9" stroke="#43A047" stroke-width="2"/>
9
+
10
+ <!-- Center Symbol (Stylized Heart/Seed) -->
11
+ <path d="M0 10 C -15 -5, -15 -25, 0 -35 C 15 -25, 15 -5, 0 10" fill="#43A047"/>
12
+
13
+ <!-- Text -->
14
+ <text x="0" y="30" text-anchor="middle" font-family="sans-serif" font-size="12" fill="#2E7D32" font-weight="bold" letter-spacing="2">ANALYZED</text>
15
+ </g>
16
+
17
+ <!-- Decorative sparkles -->
18
+ <path d="M160 160 L165 175 L180 180 L165 185 L160 200 L155 185 L140 180 L155 175 Z" fill="#FDD835"/>
19
+ </svg>
@@ -0,0 +1,24 @@
1
+ <svg width="180" height="180" viewBox="0 0 180 180" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <!-- Stylized Vines/Leaves (Nahida Style) -->
3
+ <path d="M20 0 V60 C 20 90, 50 100, 60 130" stroke="#8BC34A" stroke-width="4" fill="none" stroke-linecap="round"/>
4
+ <path d="M40 0 V40 C 40 70, 80 80, 90 110" stroke="#AED581" stroke-width="3" fill="none" stroke-linecap="round"/>
5
+
6
+ <!-- Leaves -->
7
+ <g transform="translate(60, 130) rotate(45)">
8
+ <path d="M0 0 Q 15 -15 30 0 Q 15 15 0 0" fill="#66BB6A" />
9
+ </g>
10
+ <g transform="translate(90, 110) rotate(-15)">
11
+ <path d="M0 0 Q 10 -10 20 0 Q 10 10 0 0" fill="#81C784" />
12
+ </g>
13
+ <g transform="translate(20, 60) rotate(-30)">
14
+ <path d="M0 0 Q 12 -12 24 0 Q 12 12 0 0" fill="#8BC34A" />
15
+ </g>
16
+
17
+ <!-- Digital/Akasha Particles -->
18
+ <rect x="120" y="30" width="8" height="8" rx="2" fill="#B2DFDB" opacity="0.8">
19
+ <animate attributeName="y" values="30;35;30" dur="3s" repeatCount="indefinite" />
20
+ </rect>
21
+ <rect x="140" y="50" width="6" height="6" rx="1" fill="#80CBC4" opacity="0.6">
22
+ <animate attributeName="y" values="50;45;50" dur="2.5s" repeatCount="indefinite" />
23
+ </rect>
24
+ </svg>
@@ -0,0 +1,108 @@
1
+ <!doctype html>
2
+ <html lang="zh-CN">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <title>群聊分析报告</title>
7
+ <link rel="stylesheet" href="./css/template_group.css" />
8
+ </head>
9
+ <body class="${theme}-theme">
10
+
11
+ <div class="nahida-container">
12
+ <!-- Decorations -->
13
+ <img src="./images/decoration_tl.svg" class="deco-tl" alt="" />
14
+ <img src="./images/decoration_br.svg" class="deco-br" alt="" />
15
+
16
+ <!-- Header -->
17
+ <div class="header-area">
18
+ <div class="header-title">
19
+ <h1>群聊分析报告</h1>
20
+ <div class="subtitle">Group Analysis Report</div>
21
+ </div>
22
+ <div class="header-meta">
23
+ <div class="date">${analysisDate}</div>
24
+ <div class="group-id">${groupName}</div>
25
+ </div>
26
+ </div>
27
+
28
+ <div class="main-content">
29
+
30
+ <!-- Status Grid -->
31
+ <div class="grid-4">
32
+ <div class="stat-sticker">
33
+ <div class="label">总消息</div>
34
+ <div class="value">${totalMessages}</div>
35
+ </div>
36
+ <div class="stat-sticker">
37
+ <div class="label">参与人数</div>
38
+ <div class="value">${totalParticipants}</div>
39
+ </div>
40
+ <div class="stat-sticker">
41
+ <div class="label">总字数</div>
42
+ <div class="value">${totalChars}</div>
43
+ </div>
44
+ <div class="stat-sticker">
45
+ <div class="label">活跃时段</div>
46
+ <div class="value">${mostActivePeriod}</div>
47
+ </div>
48
+ </div>
49
+
50
+ <!-- Leaderboard -->
51
+ <div class="section-header">
52
+ <div class="section-icon">1</div>
53
+ <h2 class="section-title">龙王榜</h2>
54
+ </div>
55
+ <div class="grid-2">
56
+ ${userStats}
57
+ </div>
58
+
59
+ <!-- Titles -->
60
+ <div class="section-header">
61
+ <div class="section-icon">2</div>
62
+ <h2 class="section-title">群友称号</h2>
63
+ </div>
64
+ <div class="grid-2">
65
+ ${userTitles}
66
+ </div>
67
+
68
+ <!-- Topics -->
69
+ <div class="section-header">
70
+ <div class="section-icon">3</div>
71
+ <h2 class="section-title">热门话题</h2>
72
+ </div>
73
+ <div class="bubble-container">
74
+ ${topics}
75
+ </div>
76
+
77
+ <!-- Quotes -->
78
+ <div class="section-header">
79
+ <div class="section-icon">4</div>
80
+ <h2 class="section-title">本群圣经</h2>
81
+ </div>
82
+ <div class="bubble-container">
83
+ ${goldenQuotes}
84
+ </div>
85
+
86
+ <!-- Chart -->
87
+ <div class="section-header">
88
+ <div class="section-icon">5</div>
89
+ <h2 class="section-title">活跃分布</h2>
90
+ </div>
91
+ ${activeHoursChart}
92
+
93
+ <div class="footer">
94
+ Generated by Koishi Group Analysis | Nahida Theme Ver. 3.0
95
+ </div>
96
+ </div>
97
+ </div>
98
+
99
+ <script>
100
+ const body = document.body;
101
+ if (!body.className.includes('theme') || body.className.includes('auto')) {
102
+ const hour = new Date().getHours();
103
+ body.classList.remove('auto-theme');
104
+ body.classList.add(hour >= 19 || hour < 6 ? 'dark-theme' : 'light-theme');
105
+ }
106
+ </script>
107
+ </body>
108
+ </html>