lumencode 0.4.3

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.
@@ -0,0 +1,1864 @@
1
+ :root {
2
+ --primary: #111111;
3
+ --primary-active: #242424;
4
+ --ink: #111111;
5
+ --body: #374151;
6
+ --muted: #6b7280;
7
+ --muted-soft: #898989;
8
+ --hairline: #e5e7eb;
9
+ --hairline-soft: #f3f4f6;
10
+ --canvas: #ffffff;
11
+ --surface-soft: #f8f9fa;
12
+ --surface-card: #f5f5f5;
13
+ --surface-strong: #e5e7eb;
14
+ --surface-dark: #101010;
15
+ --on-primary: #ffffff;
16
+ --on-dark: #ffffff;
17
+ --on-dark-soft: #a1a1aa;
18
+ --badge-orange: #fb923c;
19
+ --badge-pink: #ec4899;
20
+ --badge-violet: #8b5cf6;
21
+ --badge-emerald: #34d399;
22
+ --brand-accent: #3b82f6;
23
+ }
24
+
25
+ * { box-sizing: border-box; margin: 0; padding: 0; }
26
+
27
+ /* Screen-reader only utility */
28
+ .sr-only { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0, 0, 0, 0); white-space: nowrap; border: 0; }
29
+
30
+ /* Focus-visible for keyboard accessibility */
31
+ :focus-visible { outline: 2px solid var(--brand-accent); outline-offset: 2px; }
32
+
33
+ /* 全局自定义滚动条 */
34
+ * {
35
+ scrollbar-width: thin;
36
+ scrollbar-color: #c4c4c4 transparent;
37
+ }
38
+ ::-webkit-scrollbar { width: 5px; height: 5px; }
39
+ ::-webkit-scrollbar-track { background: transparent; }
40
+ ::-webkit-scrollbar-thumb {
41
+ background: #c4c4c4;
42
+ border-radius: 9999px;
43
+ }
44
+ ::-webkit-scrollbar-thumb:hover { background: #999; }
45
+ ::-webkit-scrollbar-corner { background: transparent; }
46
+
47
+ [data-theme="dark"] * {
48
+ scrollbar-color: #4b5563 transparent;
49
+ }
50
+ [data-theme="dark"] ::-webkit-scrollbar-thumb {
51
+ background: #4b5563;
52
+ }
53
+ [data-theme="dark"] ::-webkit-scrollbar-thumb:hover {
54
+ background: #6b7280;
55
+ }
56
+
57
+ html { font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; font-size: 16px; }
58
+
59
+ body {
60
+ background: var(--canvas);
61
+ color: var(--ink);
62
+ line-height: 1.5;
63
+ min-height: 100vh;
64
+ display: flex;
65
+ flex-direction: column;
66
+ }
67
+
68
+ .app-layout {
69
+ display: flex;
70
+ flex: 1;
71
+ min-height: 0;
72
+ }
73
+
74
+ /* Top Nav */
75
+ .top-nav {
76
+ background: var(--canvas);
77
+ border-bottom: 1px solid var(--hairline);
78
+ height: 56px;
79
+ position: sticky;
80
+ top: 0;
81
+ z-index: 100;
82
+ }
83
+
84
+ .nav-inner {
85
+ max-width: 1560px;
86
+ margin: 0 auto;
87
+ height: 100%;
88
+ display: flex;
89
+ align-items: center;
90
+ justify-content: space-between;
91
+ padding: 0 32px;
92
+ }
93
+
94
+ .logo {
95
+ font-size: 16px;
96
+ font-weight: 600;
97
+ letter-spacing: -0.3px;
98
+ color: var(--ink);
99
+ }
100
+
101
+ .nav-controls {
102
+ display: flex;
103
+ align-items: center;
104
+ gap: 12px;
105
+ }
106
+
107
+ .nav-pill-group {
108
+ background: var(--surface-soft);
109
+ border-radius: 9999px;
110
+ padding: 4px;
111
+ display: flex;
112
+ gap: 2px;
113
+ }
114
+
115
+ .category-tab {
116
+ background: transparent;
117
+ border: none;
118
+ color: var(--muted);
119
+ font-family: inherit;
120
+ font-size: 13px;
121
+ font-weight: 500;
122
+ padding: 6px 12px;
123
+ border-radius: 6px;
124
+ cursor: pointer;
125
+ transition: all 0.15s;
126
+ }
127
+
128
+ .category-tab:hover { color: var(--ink); }
129
+
130
+ .category-tab.active {
131
+ background: var(--canvas);
132
+ color: var(--ink);
133
+ box-shadow: 0 1px 2px rgba(0,0,0,0.05);
134
+ }
135
+
136
+ /* Work report control bar */
137
+ .work-report-actions {
138
+ display: flex;
139
+ align-items: center;
140
+ gap: 12px;
141
+ flex-wrap: wrap;
142
+ }
143
+
144
+ /* Level tabs (详报/简报) — 主切换,带底部指示条 */
145
+ .level-tab-group {
146
+ display: flex;
147
+ gap: 0;
148
+ border-bottom: 1px solid var(--hairline);
149
+ padding: 0 2px;
150
+ }
151
+
152
+ .level-tab {
153
+ background: transparent;
154
+ border: none;
155
+ border-bottom: 2px solid transparent;
156
+ color: var(--muted);
157
+ font-family: inherit;
158
+ font-size: 13px;
159
+ font-weight: 500;
160
+ padding: 6px 14px;
161
+ margin-bottom: -1px;
162
+ cursor: pointer;
163
+ transition: all 0.15s;
164
+ border-radius: 0;
165
+ }
166
+
167
+ .level-tab:hover { color: var(--body); }
168
+
169
+ .level-tab.active {
170
+ color: var(--ink);
171
+ border-bottom-color: var(--ink);
172
+ }
173
+
174
+ /* Platform tabs (标准/飞书/钉钉) — 次要选择,小标签 */
175
+ .platform-pill-group {
176
+ background: var(--surface-soft);
177
+ border-radius: 9999px;
178
+ padding: 3px;
179
+ display: flex;
180
+ gap: 1px;
181
+ }
182
+
183
+ .platform-tab {
184
+ background: transparent;
185
+ border: none;
186
+ color: var(--muted);
187
+ font-family: inherit;
188
+ font-size: 11px;
189
+ font-weight: 500;
190
+ padding: 3px 10px;
191
+ border-radius: 9999px;
192
+ cursor: pointer;
193
+ transition: all 0.15s;
194
+ }
195
+
196
+ .platform-tab:hover { color: var(--body); }
197
+
198
+ .platform-tab.active {
199
+ background: var(--canvas);
200
+ color: var(--ink);
201
+ box-shadow: 0 1px 2px rgba(0,0,0,0.06);
202
+ }
203
+
204
+ /* 按钮组之间的分隔线 */
205
+ .action-divider {
206
+ width: 1px;
207
+ height: 20px;
208
+ background: var(--hairline);
209
+ flex-shrink: 0;
210
+ }
211
+
212
+ .text-input {
213
+ background: var(--canvas);
214
+ border: 1px solid var(--hairline);
215
+ border-radius: 6px;
216
+ color: var(--ink);
217
+ font-family: inherit;
218
+ font-size: 13px;
219
+ padding: 6px 10px;
220
+ height: 32px;
221
+ outline: none;
222
+ }
223
+
224
+ .text-input:focus { border-color: var(--ink); }
225
+
226
+ /* Container */
227
+ .container {
228
+ max-width: 1560px;
229
+ margin: 0 auto;
230
+ padding: 0 32px;
231
+ flex: 1;
232
+ width: 100%;
233
+ }
234
+
235
+ /* Hero — compact */
236
+ .hero-band {
237
+ padding: 20px 0 12px;
238
+ }
239
+
240
+ .display-lg {
241
+ font-size: 22px;
242
+ font-weight: 600;
243
+ line-height: 1.2;
244
+ letter-spacing: -0.3px;
245
+ color: var(--ink);
246
+ }
247
+
248
+ .body-md {
249
+ font-size: 13px;
250
+ font-weight: 400;
251
+ line-height: 1.4;
252
+ margin-top: 2px;
253
+ }
254
+
255
+ .muted { color: var(--muted); }
256
+
257
+ /* Stats Grid — fixed 5-col */
258
+ .stats-grid {
259
+ display: grid;
260
+ grid-template-columns: repeat(5, 1fr);
261
+ gap: 10px;
262
+ margin-bottom: 12px;
263
+ }
264
+
265
+ .feature-card {
266
+ background: var(--surface-card);
267
+ border-radius: 10px;
268
+ padding: 14px 16px;
269
+ transition: box-shadow 0.2s ease, transform 0.2s ease;
270
+ }
271
+
272
+ .feature-card:hover {
273
+ box-shadow: 0 4px 12px rgba(0,0,0,0.06);
274
+ transform: translateY(-1px);
275
+ }
276
+
277
+ .card-label {
278
+ font-size: 12px;
279
+ font-weight: 500;
280
+ color: var(--muted);
281
+ margin-bottom: 4px;
282
+ }
283
+
284
+ .card-value {
285
+ font-size: 24px;
286
+ font-weight: 600;
287
+ letter-spacing: -0.5px;
288
+ color: var(--ink);
289
+ }
290
+
291
+ .card-sub {
292
+ font-size: 11px;
293
+ color: var(--muted);
294
+ margin-top: 4px;
295
+ line-height: 1.4;
296
+ }
297
+
298
+ .card-sub span {
299
+ display: inline-block;
300
+ margin-right: 8px;
301
+ }
302
+
303
+ /* Section header */
304
+ .section-header {
305
+ display: flex;
306
+ align-items: center;
307
+ justify-content: space-between;
308
+ margin-bottom: 10px;
309
+ }
310
+
311
+ .section-header .title-md {
312
+ font-size: 14px;
313
+ margin-bottom: 0;
314
+ }
315
+
316
+ /* Charts Dashboard — side-by-side layout */
317
+ .charts-dashboard {
318
+ display: flex;
319
+ gap: 14px;
320
+ margin-bottom: 20px;
321
+ align-items: stretch;
322
+ }
323
+
324
+ .charts-dashboard .charts-section {
325
+ flex: 3;
326
+ margin-bottom: 0;
327
+ }
328
+
329
+ .charts-dashboard .trend-section {
330
+ flex: 2;
331
+ margin-bottom: 0;
332
+ }
333
+
334
+ .trend-card {
335
+ height: 100%;
336
+ display: flex;
337
+ flex-direction: column;
338
+ }
339
+
340
+ .chart-wrap-tall {
341
+ flex: 1;
342
+ min-height: 300px;
343
+ position: relative;
344
+ }
345
+
346
+ /* Charts */
347
+ .charts-section { margin-bottom: 20px; }
348
+
349
+ .chart-row {
350
+ display: grid;
351
+ grid-template-columns: 1fr 1fr;
352
+ gap: 10px;
353
+ margin-bottom: 10px;
354
+ }
355
+
356
+ .chart-card {
357
+ background: var(--surface-card);
358
+ border-radius: 10px;
359
+ padding: 14px;
360
+ transition: box-shadow 0.2s ease, transform 0.2s ease;
361
+ }
362
+
363
+ .chart-card:hover {
364
+ box-shadow: 0 4px 12px rgba(0,0,0,0.06);
365
+ transform: translateY(-1px);
366
+ }
367
+
368
+ .title-md {
369
+ font-size: 13px;
370
+ font-weight: 600;
371
+ line-height: 1.4;
372
+ margin-bottom: 10px;
373
+ color: var(--ink);
374
+ }
375
+
376
+ .chart-wrap {
377
+ position: relative;
378
+ height: 210px;
379
+ }
380
+
381
+ /* Git Section — compact */
382
+ .git-section { margin-bottom: 12px; }
383
+
384
+ .cta-band-light {
385
+ background: var(--surface-card);
386
+ border-radius: 10px;
387
+ padding: 14px 20px;
388
+ }
389
+
390
+ .title-lg {
391
+ font-size: 14px;
392
+ font-weight: 600;
393
+ line-height: 1.3;
394
+ letter-spacing: -0.3px;
395
+ margin-bottom: 10px;
396
+ }
397
+
398
+ .git-stats {
399
+ display: grid;
400
+ grid-template-columns: repeat(4, 1fr);
401
+ gap: 16px;
402
+ }
403
+
404
+ .git-stat-item {
405
+ text-align: center;
406
+ }
407
+
408
+ .git-stat-value {
409
+ font-size: 20px;
410
+ font-weight: 600;
411
+ letter-spacing: -0.5px;
412
+ color: var(--ink);
413
+ }
414
+
415
+ .git-stat-label {
416
+ font-size: 12px;
417
+ color: var(--muted);
418
+ margin-top: 2px;
419
+ }
420
+
421
+ /* Git AI cards — compact metrics */
422
+ .git-ai-stats {
423
+ margin-top: 12px;
424
+ display: flex;
425
+ flex-direction: column;
426
+ gap: 10px;
427
+ }
428
+ .git-ai-stats:empty {
429
+ display: none;
430
+ }
431
+
432
+ /* AI Summary Card — hero band */
433
+ .ai-summary-card {
434
+ background: var(--surface-card);
435
+ border-radius: 12px;
436
+ padding: 16px 20px;
437
+ display: flex;
438
+ align-items: center;
439
+ justify-content: space-between;
440
+ gap: 24px;
441
+ border: none;
442
+ position: relative;
443
+ overflow: hidden;
444
+ }
445
+ .ai-summary-card::before {
446
+ content: '';
447
+ position: absolute;
448
+ top: 0;
449
+ left: 0;
450
+ right: 0;
451
+ height: 2px;
452
+ background: var(--ink);
453
+ }
454
+ .ai-summary-left {
455
+ display: flex;
456
+ align-items: baseline;
457
+ gap: 10px;
458
+ }
459
+ .ai-summary-pct {
460
+ font-size: 32px;
461
+ font-weight: 600;
462
+ letter-spacing: -1px;
463
+ color: var(--ink);
464
+ line-height: 1;
465
+ }
466
+ .ai-summary-desc {
467
+ font-size: 13px;
468
+ color: var(--muted);
469
+ line-height: 1.4;
470
+ }
471
+ .ai-summary-desc strong {
472
+ font-weight: 600;
473
+ color: var(--ink);
474
+ }
475
+ .ai-summary-right {
476
+ display: flex;
477
+ flex-direction: column;
478
+ align-items: flex-end;
479
+ gap: 6px;
480
+ min-width: 180px;
481
+ }
482
+ .ai-summary-commits {
483
+ font-size: 13px;
484
+ color: var(--body);
485
+ font-weight: 500;
486
+ }
487
+ .ai-summary-bar {
488
+ width: 100%;
489
+ height: 6px;
490
+ background: var(--surface-strong);
491
+ border-radius: 9999px;
492
+ overflow: hidden;
493
+ }
494
+ .ai-summary-bar-fill {
495
+ height: 100%;
496
+ border-radius: 9999px;
497
+ background: var(--ink);
498
+ transition: width 0.4s ease;
499
+ }
500
+
501
+ /* Tool theme colors */
502
+ .ai-summary-card.theme-all .ai-summary-pct {
503
+ background: linear-gradient(135deg, #d97757, #10a37f, #6366f1);
504
+ -webkit-background-clip: text;
505
+ -webkit-text-fill-color: transparent;
506
+ background-clip: text;
507
+ }
508
+ .ai-summary-card.theme-all .ai-summary-bar-fill {
509
+ background: linear-gradient(90deg, #d97757, #10a37f, #6366f1);
510
+ }
511
+ .ai-summary-card.theme-all::before {
512
+ background: linear-gradient(90deg, #d97757, #10a37f, #6366f1);
513
+ }
514
+
515
+ .ai-summary-card.theme-claude .ai-summary-pct { color: #d97757; }
516
+ .ai-summary-card.theme-claude .ai-summary-bar-fill { background: #d97757; }
517
+ .ai-summary-card.theme-claude::before { background: #d97757; }
518
+
519
+ .ai-summary-card.theme-codex .ai-summary-pct { color: #10a37f; }
520
+ .ai-summary-card.theme-codex .ai-summary-bar-fill { background: #10a37f; }
521
+ .ai-summary-card.theme-codex::before { background: #10a37f; }
522
+
523
+ .ai-summary-card.theme-opencode .ai-summary-pct { color: #6366f1; }
524
+ .ai-summary-card.theme-opencode .ai-summary-bar-fill { background: #6366f1; }
525
+ .ai-summary-card.theme-opencode::before { background: #6366f1; }
526
+
527
+ /* Dark mode adjustments for tool colors */
528
+ [data-theme="dark"] .ai-summary-card.theme-all .ai-summary-pct {
529
+ background: linear-gradient(135deg, #e8956e, #3dd9a8, #8b80f5);
530
+ -webkit-background-clip: text;
531
+ -webkit-text-fill-color: transparent;
532
+ background-clip: text;
533
+ }
534
+ [data-theme="dark"] .ai-summary-card.theme-all .ai-summary-bar-fill {
535
+ background: linear-gradient(90deg, #e8956e, #3dd9a8, #8b80f5);
536
+ }
537
+
538
+ /* AI Metrics — compact key-value list */
539
+ .ai-metrics-list {
540
+ display: grid;
541
+ grid-template-columns: 1fr 1fr;
542
+ gap: 0;
543
+ }
544
+ .ai-kv-row {
545
+ display: flex;
546
+ align-items: baseline;
547
+ gap: 6px;
548
+ padding: 5px 8px;
549
+ border-bottom: 1px solid var(--hairline-soft);
550
+ font-size: 12px;
551
+ line-height: 1.4;
552
+ }
553
+ .ai-kv-row:nth-child(odd) {
554
+ border-right: 1px solid var(--hairline-soft);
555
+ }
556
+ .ai-kv-val {
557
+ font-weight: 600;
558
+ color: var(--ink);
559
+ font-variant-numeric: tabular-nums;
560
+ white-space: nowrap;
561
+ min-width: 48px;
562
+ }
563
+ .ai-kv-lbl {
564
+ color: var(--muted);
565
+ }
566
+
567
+ /* Dark mode AI summary */
568
+ [data-theme="dark"] .ai-summary-card {
569
+ border-color: var(--hairline);
570
+ }
571
+ [data-theme="dark"] .ai-summary-bar-fill {
572
+ background: var(--on-primary);
573
+ }
574
+
575
+ /* Metric tooltip */
576
+ .metric-tip {
577
+ display: inline-flex;
578
+ align-items: center;
579
+ justify-content: center;
580
+ width: 14px;
581
+ height: 14px;
582
+ border-radius: 50%;
583
+ background: var(--border, #d1d5db);
584
+ color: var(--muted, #6b7280);
585
+ font-size: 10px;
586
+ font-weight: 600;
587
+ cursor: help;
588
+ margin-left: 3px;
589
+ vertical-align: middle;
590
+ position: relative;
591
+ line-height: 1;
592
+ }
593
+ .metric-tip:hover::after {
594
+ content: attr(data-tip);
595
+ position: absolute;
596
+ bottom: calc(100% + 6px);
597
+ left: 50%;
598
+ transform: translateX(-50%);
599
+ background: #1f2937;
600
+ color: #f9fafb;
601
+ font-size: 11px;
602
+ font-weight: 400;
603
+ padding: 6px 10px;
604
+ border-radius: 6px;
605
+ white-space: normal;
606
+ width: max-content;
607
+ max-width: 240px;
608
+ line-height: 1.4;
609
+ z-index: 100;
610
+ pointer-events: none;
611
+ box-shadow: 0 4px 12px rgba(0,0,0,.15);
612
+ }
613
+
614
+ /* Git skeleton grid */
615
+ .git-skeleton-grid {
616
+ display: grid;
617
+ grid-template-columns: repeat(4, 1fr);
618
+ gap: 16px;
619
+ padding: 16px 0;
620
+ }
621
+
622
+ /* Git insights row(提交类型 + 文件热点)*/
623
+ .git-insights-row {
624
+ margin-top: 12px;
625
+ }
626
+
627
+ /* 文件热点表格 */
628
+ .hotspots-table {
629
+ font-size: 12px;
630
+ max-height: 280px;
631
+ overflow-y: auto;
632
+ }
633
+ .hotspots-tbl {
634
+ width: 100%;
635
+ border-collapse: collapse;
636
+ }
637
+ .hotspots-tbl th,
638
+ .hotspots-tbl td {
639
+ padding: 6px 8px;
640
+ border-bottom: 1px solid var(--border, #f1f5f9);
641
+ text-align: left;
642
+ }
643
+ .hotspots-tbl th {
644
+ font-weight: 500;
645
+ color: var(--muted);
646
+ font-size: 11px;
647
+ background: var(--surface-soft, #fafafa);
648
+ position: sticky;
649
+ top: 0;
650
+ }
651
+ .hotspots-tbl td.num {
652
+ text-align: right;
653
+ font-variant-numeric: tabular-nums;
654
+ }
655
+ .hotspots-tbl td.pos { color: #16a34a; }
656
+ .hotspots-tbl td.neg { color: #dc2626; }
657
+ .hotspot-path {
658
+ font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
659
+ color: var(--ink);
660
+ max-width: 280px;
661
+ white-space: nowrap;
662
+ overflow: hidden;
663
+ text-overflow: ellipsis;
664
+ }
665
+ .hotspot-bar {
666
+ background: var(--surface-soft, #f1f5f9);
667
+ border-radius: 3px;
668
+ height: 6px;
669
+ width: 80px;
670
+ overflow: hidden;
671
+ }
672
+ .hotspot-bar-fill {
673
+ background: #111111;
674
+ height: 100%;
675
+ border-radius: 3px;
676
+ }
677
+ .hotspots-empty {
678
+ padding: 24px;
679
+ color: var(--muted);
680
+ text-align: center;
681
+ font-size: 12px;
682
+ }
683
+
684
+ /* 暗色主题适配 */
685
+ [data-theme="dark"] .hotspots-tbl th {
686
+ background: var(--surface-dark-soft, #1f2937);
687
+ }
688
+ [data-theme="dark"] .hotspots-tbl td.pos { color: #4ade80; }
689
+ [data-theme="dark"] .hotspots-tbl td.neg { color: #f87171; }
690
+ [data-theme="dark"] .hotspot-bar-fill {
691
+ background: #e5e7eb;
692
+ }
693
+
694
+ /* Session drill commits 展开 */
695
+ .commit-toggle {
696
+ background: none;
697
+ border: none;
698
+ cursor: pointer;
699
+ font-size: 12px;
700
+ color: var(--muted);
701
+ padding: 0 4px;
702
+ }
703
+ .commit-toggle:hover { color: var(--ink); }
704
+ .commit-subrow > td {
705
+ background: var(--surface-soft, #f8fafc);
706
+ padding: 0 !important;
707
+ }
708
+ .commit-subtable {
709
+ width: 100%;
710
+ border-collapse: collapse;
711
+ font-size: 11px;
712
+ }
713
+ .commit-subtable th,
714
+ .commit-subtable td {
715
+ padding: 4px 8px;
716
+ border-bottom: 1px solid var(--border, #f1f5f9);
717
+ }
718
+ .commit-subtable th {
719
+ color: var(--muted);
720
+ font-weight: 500;
721
+ background: var(--surface-card);
722
+ }
723
+ .commit-subtable td.hash code {
724
+ font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
725
+ font-size: 11px;
726
+ }
727
+ .commit-subtable td.num {
728
+ text-align: right;
729
+ font-variant-numeric: tabular-nums;
730
+ }
731
+ .commit-subtable td.num.pos { color: #16a34a; }
732
+ .commit-subtable td.num.neg { color: #dc2626; }
733
+ .commit-subject {
734
+ max-width: 360px;
735
+ white-space: nowrap;
736
+ overflow: hidden;
737
+ text-overflow: ellipsis;
738
+ }
739
+ .commit-type-tag {
740
+ display: inline-block;
741
+ padding: 1px 8px;
742
+ border-radius: 9999px;
743
+ font-size: 11px;
744
+ font-weight: 500;
745
+ background: #f5f5f5;
746
+ color: #111111;
747
+ font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
748
+ letter-spacing: 0.2px;
749
+ }
750
+ [data-theme="dark"] .commit-subrow > td {
751
+ background: var(--surface-dark-soft, #1f2937);
752
+ }
753
+ [data-theme="dark"] .commit-subtable td.num.pos { color: #4ade80; }
754
+ [data-theme="dark"] .commit-subtable td.num.neg { color: #f87171; }
755
+
756
+ /* Footer */
757
+ .footer {
758
+ background: var(--surface-dark);
759
+ color: var(--on-dark-soft);
760
+ padding: 32px 24px;
761
+ margin-top: auto;
762
+ }
763
+
764
+ .footer-inner {
765
+ max-width: 1560px;
766
+ margin: 0 auto;
767
+ text-align: center;
768
+ }
769
+
770
+ .footer p { font-size: 13px; margin-bottom: 4px; }
771
+
772
+ .muted-soft { color: var(--muted-soft); }
773
+
774
+ .icon-btn {
775
+ background: transparent;
776
+ border: none;
777
+ color: var(--muted);
778
+ cursor: pointer;
779
+ padding: 6px;
780
+ border-radius: 6px;
781
+ display: flex;
782
+ align-items: center;
783
+ justify-content: center;
784
+ transition: all 0.15s;
785
+ }
786
+
787
+ .icon-btn:hover { color: var(--ink); background: var(--hairline-soft); }
788
+
789
+ /* Modal */
790
+ .modal {
791
+ position: fixed;
792
+ inset: 0;
793
+ z-index: 200;
794
+ display: flex;
795
+ align-items: center;
796
+ justify-content: center;
797
+ }
798
+
799
+ .modal-backdrop {
800
+ position: absolute;
801
+ inset: 0;
802
+ background: rgba(0,0,0,0.3);
803
+ }
804
+
805
+ .modal-panel {
806
+ position: relative;
807
+ background: var(--canvas);
808
+ border-radius: 14px;
809
+ width: 100%;
810
+ max-width: 520px;
811
+ max-height: 85vh;
812
+ overflow: hidden;
813
+ display: flex;
814
+ flex-direction: column;
815
+ box-shadow: 0 20px 60px rgba(0,0,0,0.15);
816
+ }
817
+
818
+ .modal-header {
819
+ display: flex;
820
+ align-items: center;
821
+ justify-content: space-between;
822
+ padding: 20px 24px 0;
823
+ }
824
+
825
+ .modal-header .title-md { margin-bottom: 0; }
826
+
827
+ .modal-body {
828
+ padding: 24px;
829
+ overflow-y: auto;
830
+ }
831
+
832
+ .modal-footer {
833
+ padding: 16px 24px 24px;
834
+ display: flex;
835
+ justify-content: flex-end;
836
+ }
837
+
838
+ .form-group { margin-bottom: 20px; }
839
+ .form-group:last-child { margin-bottom: 0; }
840
+
841
+ .form-label {
842
+ display: block;
843
+ font-size: 13px;
844
+ font-weight: 500;
845
+ color: var(--ink);
846
+ margin-bottom: 6px;
847
+ }
848
+
849
+ .form-input, .form-textarea {
850
+ width: 100%;
851
+ font-family: inherit;
852
+ resize: vertical;
853
+ }
854
+
855
+ .form-hint {
856
+ font-size: 12px;
857
+ color: var(--muted);
858
+ margin-top: 4px;
859
+ }
860
+
861
+ .btn-primary {
862
+ background: var(--ink);
863
+ color: var(--on-primary);
864
+ border: none;
865
+ border-radius: 6px;
866
+ padding: 8px 16px;
867
+ font-family: inherit;
868
+ font-size: 13px;
869
+ font-weight: 500;
870
+ cursor: pointer;
871
+ transition: opacity 0.15s;
872
+ }
873
+
874
+ .btn-primary:hover { opacity: 0.85; }
875
+
876
+ .btn-secondary {
877
+ background: var(--surface-card);
878
+ color: var(--ink);
879
+ border: 1px solid var(--hairline);
880
+ border-radius: 6px;
881
+ padding: 8px 16px;
882
+ font-family: inherit;
883
+ font-size: 13px;
884
+ font-weight: 500;
885
+ cursor: pointer;
886
+ transition: all 0.15s;
887
+ }
888
+
889
+ .btn-secondary:hover { background: var(--hairline-soft); }
890
+
891
+ .btn-outline {
892
+ background: transparent;
893
+ color: var(--ink);
894
+ border: 1px solid var(--hairline);
895
+ border-radius: 6px;
896
+ padding: 6px 14px;
897
+ font-family: inherit;
898
+ font-size: 13px;
899
+ font-weight: 500;
900
+ cursor: pointer;
901
+ transition: all 0.15s;
902
+ height: 32px;
903
+ }
904
+
905
+ .btn-outline:hover { background: var(--hairline-soft); }
906
+
907
+ .hero-row {
908
+ display: flex;
909
+ align-items: center;
910
+ justify-content: space-between;
911
+ gap: 16px;
912
+ }
913
+
914
+ /* Work Report */
915
+ .work-report-section { margin-bottom: 20px; }
916
+
917
+ .work-report-header {
918
+ display: flex;
919
+ align-items: center;
920
+ justify-content: space-between;
921
+ margin-bottom: 16px;
922
+ }
923
+
924
+ .work-report-header .title-md { margin-bottom: 0; }
925
+
926
+ /* 平台标识徽章 */
927
+ .platform-badge {
928
+ display: inline-flex;
929
+ align-items: center;
930
+ gap: 4px;
931
+ font-size: 11px;
932
+ font-weight: 500;
933
+ padding: 2px 8px;
934
+ border-radius: 4px;
935
+ margin-right: 4px;
936
+ }
937
+ .platform-badge.feishu {
938
+ background: #e8f1fc;
939
+ color: #3370ff;
940
+ }
941
+ .platform-badge.dingtalk {
942
+ background: #e6f7ff;
943
+ color: #0089ff;
944
+ }
945
+ .platform-badge.default {
946
+ background: var(--surface-soft);
947
+ color: var(--muted);
948
+ }
949
+ [data-theme="dark"] .platform-badge.feishu {
950
+ background: #1a2744;
951
+ color: #5b8ff9;
952
+ }
953
+ [data-theme="dark"] .platform-badge.dingtalk {
954
+ background: #0d2137;
955
+ color: #4da6ff;
956
+ }
957
+
958
+ /* 简报/详报内容区 —— 使用卡片式分层设计 */
959
+ .work-report-content {
960
+ background: var(--surface-card);
961
+ border-radius: 12px;
962
+ padding: 28px 32px;
963
+ font-size: 14px;
964
+ line-height: 1.75;
965
+ overflow-x: auto;
966
+ max-height: 70vh;
967
+ overflow-y: auto;
968
+ color: var(--body);
969
+ border: 1px solid var(--hairline);
970
+ transition: box-shadow 0.2s ease;
971
+ }
972
+ .work-report-content:hover {
973
+ box-shadow: 0 4px 16px rgba(0,0,0,0.05);
974
+ }
975
+
976
+ /* Markdown 标题层级 */
977
+ .work-report-content .md-h1 {
978
+ font-size: 22px;
979
+ font-weight: 600;
980
+ color: var(--ink);
981
+ margin-bottom: 16px;
982
+ margin-top: 0;
983
+ letter-spacing: -0.3px;
984
+ line-height: 1.3;
985
+ }
986
+
987
+ .work-report-content .md-h2 {
988
+ font-size: 15px;
989
+ font-weight: 600;
990
+ color: var(--ink);
991
+ margin-top: 24px;
992
+ margin-bottom: 12px;
993
+ padding-bottom: 8px;
994
+ border-bottom: 1px solid var(--hairline);
995
+ display: flex;
996
+ align-items: center;
997
+ gap: 6px;
998
+ }
999
+
1000
+ .work-report-content .md-h2::before {
1001
+ content: '';
1002
+ display: inline-block;
1003
+ width: 3px;
1004
+ height: 14px;
1005
+ background: var(--ink);
1006
+ border-radius: 2px;
1007
+ flex-shrink: 0;
1008
+ }
1009
+
1010
+ /* 段落 */
1011
+ .work-report-content .md-p {
1012
+ margin-bottom: 10px;
1013
+ }
1014
+
1015
+ /* 列表 —— 自定义标记 */
1016
+ .work-report-content .md-ul {
1017
+ margin-bottom: 14px;
1018
+ padding-left: 0;
1019
+ list-style: none;
1020
+ }
1021
+
1022
+ .work-report-content .md-li {
1023
+ margin-bottom: 8px;
1024
+ padding-left: 18px;
1025
+ position: relative;
1026
+ }
1027
+
1028
+ .work-report-content .md-li::before {
1029
+ content: '';
1030
+ position: absolute;
1031
+ left: 0;
1032
+ top: 10px;
1033
+ width: 5px;
1034
+ height: 5px;
1035
+ border-radius: 50%;
1036
+ background: var(--muted-soft);
1037
+ }
1038
+
1039
+ /* 表格 —— 与热点表格风格一致 */
1040
+ .work-report-content .md-table {
1041
+ width: 100%;
1042
+ border-collapse: collapse;
1043
+ margin-bottom: 16px;
1044
+ font-size: 13px;
1045
+ border-radius: 8px;
1046
+ overflow: hidden;
1047
+ }
1048
+
1049
+ .work-report-content .md-table th,
1050
+ .work-report-content .md-table td {
1051
+ padding: 10px 14px;
1052
+ text-align: left;
1053
+ border-bottom: 1px solid var(--hairline-soft);
1054
+ }
1055
+
1056
+ .work-report-content .md-table th {
1057
+ font-weight: 600;
1058
+ color: var(--ink);
1059
+ background: var(--surface-soft);
1060
+ font-size: 12px;
1061
+ text-transform: uppercase;
1062
+ letter-spacing: 0.3px;
1063
+ }
1064
+
1065
+ .work-report-content .md-table tr:last-child td {
1066
+ border-bottom: none;
1067
+ }
1068
+
1069
+ .work-report-content .md-table tr:hover td {
1070
+ background: var(--surface-soft);
1071
+ }
1072
+
1073
+ /* 代码片段 */
1074
+ .work-report-content code {
1075
+ font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
1076
+ font-size: 12px;
1077
+ background: var(--surface-soft);
1078
+ padding: 2px 6px;
1079
+ border-radius: 4px;
1080
+ color: var(--ink);
1081
+ border: 1px solid var(--hairline);
1082
+ }
1083
+
1084
+ .work-report-content strong {
1085
+ font-weight: 600;
1086
+ color: var(--ink);
1087
+ }
1088
+
1089
+ /* 钉钉纯文本模式的分隔线样式 */
1090
+ .work-report-content .md-divider {
1091
+ display: block;
1092
+ color: var(--muted);
1093
+ font-size: 13px;
1094
+ font-weight: 500;
1095
+ margin: 20px 0 12px;
1096
+ padding-bottom: 8px;
1097
+ border-bottom: 1px solid var(--hairline);
1098
+ letter-spacing: 0.5px;
1099
+ }
1100
+
1101
+ /* 简报模式 —— 更紧凑 */
1102
+ .work-report-content.is-brief {
1103
+ padding: 24px 28px;
1104
+ font-size: 13.5px;
1105
+ }
1106
+
1107
+ .work-report-content.is-brief .md-h1 {
1108
+ font-size: 18px;
1109
+ margin-bottom: 12px;
1110
+ }
1111
+
1112
+ .work-report-content.is-brief .md-h2 {
1113
+ font-size: 13px;
1114
+ margin-top: 16px;
1115
+ margin-bottom: 8px;
1116
+ padding-bottom: 6px;
1117
+ }
1118
+
1119
+ .work-report-content.is-brief .md-h2::before {
1120
+ height: 12px;
1121
+ }
1122
+
1123
+ .work-report-content.is-brief .md-li {
1124
+ margin-bottom: 5px;
1125
+ }
1126
+
1127
+ /* 暗色主题适配 */
1128
+ [data-theme="dark"] .work-report-content {
1129
+ border-color: var(--hairline);
1130
+ }
1131
+ [data-theme="dark"] .work-report-content:hover {
1132
+ box-shadow: 0 4px 16px rgba(0,0,0,0.25);
1133
+ }
1134
+ [data-theme="dark"] .work-report-content code {
1135
+ background: var(--surface-dark-soft, #1f2937);
1136
+ border-color: var(--hairline);
1137
+ }
1138
+ [data-theme="dark"] .work-report-content .md-table tr:hover td {
1139
+ background: var(--surface-dark-soft, #1f2937);
1140
+ }
1141
+
1142
+ /* Trend chart (standalone fallback) */
1143
+ .trend-section { margin-bottom: 20px; }
1144
+ .chart-wrap-wide { height: 300px; }
1145
+
1146
+ /* Toast */
1147
+ .toast {
1148
+ position: fixed;
1149
+ top: 72px;
1150
+ left: 50%;
1151
+ transform: translateX(-50%);
1152
+ background: var(--surface-dark);
1153
+ color: var(--on-dark);
1154
+ padding: 10px 20px;
1155
+ border-radius: 6px;
1156
+ font-size: 13px;
1157
+ z-index: 300;
1158
+ box-shadow: 0 4px 12px rgba(0,0,0,0.15);
1159
+ transition: opacity 0.3s;
1160
+ }
1161
+
1162
+ /* Skeleton loading */
1163
+ .skeleton {
1164
+ animation: skeleton-pulse 1.5s ease-in-out infinite;
1165
+ background: linear-gradient(90deg, var(--surface-card) 25%, var(--surface-soft) 50%, var(--surface-card) 75%);
1166
+ background-size: 200% 100%;
1167
+ border-radius: 6px;
1168
+ }
1169
+
1170
+ @keyframes skeleton-pulse {
1171
+ 0% { background-position: 200% 0; }
1172
+ 100% { background-position: -200% 0; }
1173
+ }
1174
+
1175
+ .card-value.skeleton {
1176
+ height: 24px;
1177
+ width: 72px;
1178
+ }
1179
+
1180
+ .chart-skeleton {
1181
+ position: absolute;
1182
+ inset: 0;
1183
+ display: flex;
1184
+ flex-direction: column;
1185
+ justify-content: center;
1186
+ padding: 32px;
1187
+ z-index: 1;
1188
+ background: var(--surface-card);
1189
+ overflow: hidden;
1190
+ }
1191
+
1192
+ .chart-skeleton::before {
1193
+ content: '';
1194
+ position: absolute;
1195
+ top: 0;
1196
+ left: -100%;
1197
+ width: 200%;
1198
+ height: 100%;
1199
+ background: linear-gradient(90deg, transparent 25%, var(--surface-soft) 50%, transparent 75%);
1200
+ background-size: 200% 100%;
1201
+ animation: skeleton-pulse 1.5s ease-in-out infinite;
1202
+ }
1203
+
1204
+ .chart-skeleton-bar {
1205
+ height: 14px;
1206
+ border-radius: 4px;
1207
+ background: var(--surface-strong);
1208
+ margin-bottom: 10px;
1209
+ }
1210
+
1211
+ .chart-skeleton-bar:nth-child(1) { width: 75%; }
1212
+ .chart-skeleton-bar:nth-child(2) { width: 60%; }
1213
+ .chart-skeleton-bar:nth-child(3) { width: 45%; }
1214
+ .chart-skeleton-bar:nth-child(4) { width: 55%; }
1215
+ .chart-skeleton-bar:nth-child(5) { width: 35%; }
1216
+
1217
+ /* Welcome page */
1218
+ .welcome-page {
1219
+ display: flex;
1220
+ justify-content: center;
1221
+ align-items: flex-start;
1222
+ padding: 48px 24px;
1223
+ min-height: 70vh;
1224
+ }
1225
+ .welcome-content {
1226
+ max-width: 560px;
1227
+ width: 100%;
1228
+ }
1229
+ .welcome-brand {
1230
+ text-align: center;
1231
+ margin-bottom: 40px;
1232
+ }
1233
+ .welcome-title {
1234
+ font-size: 28px;
1235
+ font-weight: 600;
1236
+ color: var(--ink);
1237
+ letter-spacing: -0.5px;
1238
+ margin-bottom: 8px;
1239
+ }
1240
+ .welcome-subtitle {
1241
+ font-size: 15px;
1242
+ color: var(--muted);
1243
+ }
1244
+
1245
+ .welcome-features {
1246
+ display: grid;
1247
+ grid-template-columns: repeat(3, 1fr);
1248
+ gap: 16px;
1249
+ margin-bottom: 40px;
1250
+ }
1251
+ .feature-item {
1252
+ background: var(--surface-card);
1253
+ border-radius: 12px;
1254
+ padding: 20px 16px;
1255
+ text-align: center;
1256
+ }
1257
+ .feature-icon-svg {
1258
+ width: 28px;
1259
+ height: 28px;
1260
+ color: var(--ink);
1261
+ margin-bottom: 10px;
1262
+ }
1263
+ .feature-text h4 {
1264
+ font-size: 13px;
1265
+ font-weight: 600;
1266
+ color: var(--ink);
1267
+ margin-bottom: 4px;
1268
+ }
1269
+ .feature-text p {
1270
+ font-size: 12px;
1271
+ color: var(--muted);
1272
+ line-height: 1.4;
1273
+ }
1274
+
1275
+ .welcome-steps {
1276
+ display: flex;
1277
+ flex-direction: column;
1278
+ gap: 16px;
1279
+ margin-bottom: 32px;
1280
+ }
1281
+ .step-card {
1282
+ background: var(--canvas);
1283
+ border: 1px solid var(--hairline, #e5e7eb);
1284
+ border-radius: 12px;
1285
+ padding: 20px 24px;
1286
+ }
1287
+ .step-header {
1288
+ display: flex;
1289
+ align-items: center;
1290
+ gap: 12px;
1291
+ margin-bottom: 8px;
1292
+ }
1293
+ .step-number {
1294
+ display: inline-flex;
1295
+ align-items: center;
1296
+ justify-content: center;
1297
+ width: 28px;
1298
+ height: 28px;
1299
+ border-radius: 50%;
1300
+ background: var(--ink);
1301
+ color: #fff;
1302
+ font-size: 13px;
1303
+ font-weight: 600;
1304
+ flex-shrink: 0;
1305
+ }
1306
+ .step-header h3 {
1307
+ font-size: 15px;
1308
+ font-weight: 600;
1309
+ color: var(--ink);
1310
+ }
1311
+ .step-desc {
1312
+ font-size: 13px;
1313
+ color: var(--muted);
1314
+ margin-bottom: 12px;
1315
+ padding-left: 40px;
1316
+ }
1317
+ .step-desc code {
1318
+ font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
1319
+ font-size: 12px;
1320
+ background: var(--surface-soft, #f8f9fa);
1321
+ padding: 2px 6px;
1322
+ border-radius: 4px;
1323
+ }
1324
+ .welcome-input {
1325
+ width: 100%;
1326
+ margin-left: 40px;
1327
+ width: calc(100% - 40px);
1328
+ padding: 10px 14px;
1329
+ font-size: 14px;
1330
+ border: 1px solid var(--hairline, #e5e7eb);
1331
+ border-radius: 8px;
1332
+ background: var(--canvas);
1333
+ color: var(--ink);
1334
+ outline: none;
1335
+ transition: border-color 0.15s;
1336
+ }
1337
+ .welcome-input:focus {
1338
+ border-color: var(--ink);
1339
+ }
1340
+ .welcome-input::placeholder {
1341
+ color: var(--muted-soft, #898989);
1342
+ }
1343
+
1344
+ .welcome-actions {
1345
+ text-align: center;
1346
+ }
1347
+ .welcome-start-btn {
1348
+ padding: 12px 32px;
1349
+ font-size: 15px;
1350
+ }
1351
+ .welcome-hint {
1352
+ font-size: 13px;
1353
+ color: var(--muted);
1354
+ margin-top: 12px;
1355
+ min-height: 20px;
1356
+ }
1357
+
1358
+ @media (max-width: 640px) {
1359
+ .welcome-features {
1360
+ grid-template-columns: 1fr;
1361
+ }
1362
+ .welcome-title {
1363
+ font-size: 22px;
1364
+ }
1365
+ }
1366
+
1367
+ /* Card value row for trend arrows */
1368
+ .card-value-row {
1369
+ display: flex;
1370
+ align-items: baseline;
1371
+ gap: 6px;
1372
+ }
1373
+
1374
+ .card-trend {
1375
+ font-size: 12px;
1376
+ font-weight: 600;
1377
+ min-width: 36px;
1378
+ }
1379
+
1380
+ .card-trend.up { color: #10b981; }
1381
+ .card-trend.down { color: #ef4444; }
1382
+ .card-trend.flat { color: var(--muted); }
1383
+
1384
+ /* ── Dark mode ── */
1385
+
1386
+ [data-theme="dark"] {
1387
+ --primary: #f5f5f5;
1388
+ --primary-active: #e0e0e0;
1389
+ --ink: #f5f5f5;
1390
+ --body: #d1d5db;
1391
+ --muted: #9ca3af;
1392
+ --muted-soft: #6b7280;
1393
+ --hairline: #374151;
1394
+ --hairline-soft: #1f2937;
1395
+ --canvas: #101010;
1396
+ --surface-soft: #1a1a1a;
1397
+ --surface-card: #1a1a1a;
1398
+ --surface-strong: #374151;
1399
+ --surface-dark: #0a0a0a;
1400
+ --on-primary: #111111;
1401
+ --on-dark: #ffffff;
1402
+ --on-dark-soft: #9ca3af;
1403
+ }
1404
+
1405
+ [data-theme="dark"] .feature-card:hover,
1406
+ [data-theme="dark"] .chart-card:hover {
1407
+ box-shadow: 0 4px 12px rgba(0,0,0,0.3);
1408
+ }
1409
+
1410
+ [data-theme="dark"] .category-tab.active {
1411
+ box-shadow: 0 1px 2px rgba(0,0,0,0.3);
1412
+ }
1413
+
1414
+ [data-theme="dark"] .modal-panel {
1415
+ box-shadow: 0 20px 60px rgba(0,0,0,0.5);
1416
+ }
1417
+
1418
+ [data-theme="dark"] .modal-backdrop {
1419
+ background: rgba(0,0,0,0.6);
1420
+ }
1421
+
1422
+ [data-theme="dark"] .toast {
1423
+ background: var(--surface-strong);
1424
+ }
1425
+
1426
+ [data-theme="dark"] .skeleton {
1427
+ background: linear-gradient(90deg, var(--surface-card) 25%, var(--surface-soft) 50%, var(--surface-card) 75%);
1428
+ }
1429
+
1430
+ /* Responsive */
1431
+ @media (max-width: 1280px) {
1432
+ .charts-dashboard {
1433
+ flex-direction: column;
1434
+ }
1435
+ .charts-dashboard .charts-section,
1436
+ .charts-dashboard .trend-section {
1437
+ flex: none;
1438
+ }
1439
+ .stats-grid { grid-template-columns: repeat(3, 1fr); }
1440
+ }
1441
+
1442
+ @media (max-width: 1024px) {
1443
+ .stats-grid { grid-template-columns: repeat(2, 1fr); }
1444
+ .chart-row { grid-template-columns: 1fr; }
1445
+ .git-stats { grid-template-columns: repeat(2, 1fr); }
1446
+ .ai-metrics-list { grid-template-columns: 1fr; }
1447
+ .ai-kv-row:nth-child(odd) { border-right: none; }
1448
+ .ai-summary-card { flex-direction: column; gap: 12px; }
1449
+ .ai-summary-right { align-items: flex-start; min-width: auto; width: 100%; }
1450
+ }
1451
+
1452
+ @media (max-width: 768px) {
1453
+ .display-lg { font-size: 20px; }
1454
+ .stats-grid { grid-template-columns: 1fr; }
1455
+ .nav-inner { flex-direction: column; height: auto; padding: 10px 16px; gap: 10px; }
1456
+ .top-nav { height: auto; position: relative; }
1457
+ .hero-band { padding: 16px 0 10px; }
1458
+ .container { padding: 0 16px; }
1459
+ .git-stats { grid-template-columns: 1fr; }
1460
+ .ai-metrics-list { grid-template-columns: 1fr; }
1461
+ .ai-kv-row:nth-child(odd) { border-right: none; }
1462
+ .ai-summary-pct { font-size: 24px; }
1463
+ .cta-band-light { padding: 14px; }
1464
+ .hero-row { flex-direction: column; align-items: flex-start; gap: 10px; }
1465
+ }
1466
+
1467
+ /* Drill-down table */
1468
+ .drill-table {
1469
+ width: 100%;
1470
+ border-collapse: collapse;
1471
+ font-size: 13px;
1472
+ }
1473
+ .drill-table th,
1474
+ .drill-table td {
1475
+ padding: 8px 12px;
1476
+ text-align: left;
1477
+ border-bottom: 1px solid var(--hairline);
1478
+ }
1479
+ .drill-table th {
1480
+ font-weight: 600;
1481
+ color: var(--ink);
1482
+ background: var(--surface-soft);
1483
+ }
1484
+ .drill-text {
1485
+ max-width: 300px;
1486
+ overflow: hidden;
1487
+ text-overflow: ellipsis;
1488
+ white-space: nowrap;
1489
+ color: var(--body);
1490
+ }
1491
+ .drill-empty {
1492
+ text-align: center;
1493
+ padding: 32px;
1494
+ color: var(--muted);
1495
+ }
1496
+
1497
+ /* Print / PDF */
1498
+ @media print {
1499
+ .top-nav, .footer, .icon-btn, .btn-outline,
1500
+ .btn-primary:not(#openSettingsBtn),
1501
+ #settingsModal, #drillModal, #toast, #emptyState,
1502
+ .hero-actions { display: none !important; }
1503
+ body { background: white; }
1504
+ .stats-grid { grid-template-columns: repeat(5, 1fr) !important; }
1505
+ .charts-dashboard { flex-direction: column !important; }
1506
+ .chart-row { grid-template-columns: 1fr 1fr !important; }
1507
+ .feature-card, .chart-card { break-inside: avoid; }
1508
+ .container { max-width: 100%; padding: 0; }
1509
+ .hero-band { padding: 12px 0; }
1510
+ }
1511
+
1512
+ .no-data-hint {
1513
+ text-align: center;
1514
+ padding: 48px 20px;
1515
+ color: var(--muted);
1516
+ font-size: 14px;
1517
+ }
1518
+
1519
+ /* ========== 工具侧边栏 ========== */
1520
+
1521
+ .tool-sidebar {
1522
+ width: 200px;
1523
+ min-height: calc(100vh - 56px);
1524
+ background: var(--surface-soft);
1525
+ border-right: 1px solid var(--hairline);
1526
+ display: flex;
1527
+ flex-direction: column;
1528
+ padding: 16px 12px;
1529
+ flex-shrink: 0;
1530
+ position: sticky;
1531
+ top: 56px;
1532
+ align-self: flex-start;
1533
+ }
1534
+
1535
+ .tool-sidebar-header {
1536
+ display: flex;
1537
+ align-items: center;
1538
+ justify-content: space-between;
1539
+ padding: 0 8px 12px;
1540
+ margin-bottom: 8px;
1541
+ border-bottom: 1px solid var(--hairline);
1542
+ }
1543
+
1544
+ .tool-sidebar-title {
1545
+ font-size: 12px;
1546
+ font-weight: 600;
1547
+ letter-spacing: 0.05em;
1548
+ text-transform: uppercase;
1549
+ color: var(--muted);
1550
+ }
1551
+
1552
+ .tool-sidebar-toggle {
1553
+ display: flex;
1554
+ align-items: center;
1555
+ justify-content: center;
1556
+ width: 24px;
1557
+ height: 24px;
1558
+ border: none;
1559
+ border-radius: 6px;
1560
+ background: transparent;
1561
+ color: var(--muted);
1562
+ cursor: pointer;
1563
+ transition: all 0.15s;
1564
+ padding: 0;
1565
+ }
1566
+
1567
+ .tool-sidebar-toggle:hover {
1568
+ background: var(--hairline-soft);
1569
+ color: var(--ink);
1570
+ }
1571
+
1572
+ .tool-sidebar.collapsed {
1573
+ width: 56px;
1574
+ padding: 16px 8px;
1575
+ }
1576
+
1577
+ .tool-sidebar.collapsed .tool-sidebar-header {
1578
+ justify-content: center;
1579
+ padding: 0 0 12px;
1580
+ }
1581
+
1582
+ .tool-sidebar.collapsed .tool-nav-item,
1583
+ .tool-sidebar.collapsed .tool-nav-add {
1584
+ justify-content: center;
1585
+ padding: 8px;
1586
+ }
1587
+
1588
+ .tool-sidebar.collapsed .tool-nav-add {
1589
+ border: none;
1590
+ }
1591
+
1592
+ .tool-nav {
1593
+ display: flex;
1594
+ flex-direction: column;
1595
+ gap: 2px;
1596
+ flex: 1;
1597
+ }
1598
+
1599
+ .tool-nav-item {
1600
+ display: flex;
1601
+ align-items: center;
1602
+ gap: 10px;
1603
+ padding: 8px 12px;
1604
+ border-radius: 8px;
1605
+ border: none;
1606
+ background: transparent;
1607
+ color: var(--body);
1608
+ font-size: 14px;
1609
+ font-weight: 500;
1610
+ cursor: pointer;
1611
+ transition: all 0.15s;
1612
+ font-family: inherit;
1613
+ text-align: left;
1614
+ width: 100%;
1615
+ }
1616
+
1617
+ .tool-nav-item:hover {
1618
+ background: var(--hairline-soft);
1619
+ color: var(--ink);
1620
+ }
1621
+
1622
+ .tool-nav-item.active {
1623
+ background: var(--canvas);
1624
+ color: var(--ink);
1625
+ box-shadow: 0 1px 2px rgba(0,0,0,0.05);
1626
+ }
1627
+
1628
+ .tool-nav-item.disabled {
1629
+ opacity: 0.4;
1630
+ cursor: not-allowed;
1631
+ }
1632
+
1633
+ .tool-dot {
1634
+ width: 8px;
1635
+ height: 8px;
1636
+ border-radius: 50%;
1637
+ flex-shrink: 0;
1638
+ background: var(--muted-soft);
1639
+ }
1640
+
1641
+ .tool-dot-claude { background: #d97757; }
1642
+ .tool-dot-codex { background: #10a37f; }
1643
+ .tool-dot-opencode { background: #6366f1; }
1644
+ .tool-dot-all {
1645
+ background: conic-gradient(#d97757 0deg 120deg, #10a37f 120deg 240deg, #6366f1 240deg 360deg);
1646
+ }
1647
+
1648
+ .tool-nav-text {
1649
+ display: flex;
1650
+ flex-direction: column;
1651
+ min-width: 0;
1652
+ }
1653
+ .tool-nav-label {
1654
+ white-space: nowrap;
1655
+ overflow: hidden;
1656
+ text-overflow: ellipsis;
1657
+ }
1658
+ .tool-nav-version {
1659
+ font-size: 10px;
1660
+ color: var(--muted-soft);
1661
+ font-weight: 400;
1662
+ line-height: 1.2;
1663
+ }
1664
+
1665
+ .tool-sidebar-footer {
1666
+ margin-top: auto;
1667
+ padding-top: 12px;
1668
+ border-top: 1px solid var(--hairline);
1669
+ }
1670
+
1671
+ .tool-nav-add {
1672
+ display: flex;
1673
+ align-items: center;
1674
+ gap: 10px;
1675
+ padding: 8px 12px;
1676
+ border-radius: 8px;
1677
+ border: 1px dashed var(--hairline);
1678
+ background: transparent;
1679
+ color: var(--muted);
1680
+ font-size: 14px;
1681
+ font-weight: 500;
1682
+ cursor: pointer;
1683
+ transition: all 0.15s;
1684
+ font-family: inherit;
1685
+ text-align: left;
1686
+ width: 100%;
1687
+ }
1688
+
1689
+ .tool-nav-add:hover {
1690
+ border-color: var(--ink);
1691
+ color: var(--ink);
1692
+ background: var(--hairline-soft);
1693
+ }
1694
+
1695
+ /* 品牌色标识 */
1696
+ .tool-badge-claude { border-left: 3px solid #d97757; }
1697
+ .tool-badge-codex { border-left: 3px solid #10a37f; }
1698
+ .tool-badge-opencode { border-left: 3px solid #6366f1; }
1699
+
1700
+ /* ========== 汇总视图 ========== */
1701
+
1702
+ .summary-overview {
1703
+ display: grid;
1704
+ grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
1705
+ gap: 16px;
1706
+ margin-bottom: 24px;
1707
+ }
1708
+
1709
+ .summary-tool-card {
1710
+ padding: 16px;
1711
+ border-radius: 12px;
1712
+ background: var(--card-bg, #fff);
1713
+ border: 1px solid var(--border, #e5e7eb);
1714
+ }
1715
+
1716
+ .summary-tool-card.claude { border-left: 4px solid #d97757; }
1717
+ .summary-tool-card.codex { border-left: 4px solid #10a37f; }
1718
+ .summary-tool-card.opencode { border-left: 4px solid #6366f1; }
1719
+
1720
+ /* ========== 加载状态 ========== */
1721
+
1722
+ .loading-overlay {
1723
+ position: fixed;
1724
+ inset: 0;
1725
+ background: rgba(255,255,255,0.8);
1726
+ display: flex;
1727
+ align-items: center;
1728
+ justify-content: center;
1729
+ z-index: 100;
1730
+ }
1731
+
1732
+ .loading-spinner {
1733
+ width: 40px;
1734
+ height: 40px;
1735
+ border: 3px solid var(--border, #e5e7eb);
1736
+ border-top-color: var(--text-primary, #111);
1737
+ border-radius: 50%;
1738
+ animation: spin 0.8s linear infinite;
1739
+ }
1740
+
1741
+ @keyframes spin {
1742
+ to { transform: rotate(360deg); }
1743
+ }
1744
+
1745
+ /* ========== 空状态 ========== */
1746
+
1747
+ .empty-state {
1748
+ text-align: center;
1749
+ padding: 48px 24px;
1750
+ color: var(--text-muted, #6b7280);
1751
+ }
1752
+
1753
+ .empty-state-icon {
1754
+ font-size: 48px;
1755
+ margin-bottom: 16px;
1756
+ }
1757
+
1758
+ /* ========== 暗色模式适配 ========== */
1759
+
1760
+ [data-theme="dark"] .tool-sidebar {
1761
+ background: var(--surface-dark);
1762
+ border-color: var(--hairline);
1763
+ }
1764
+
1765
+ [data-theme="dark"] .tool-sidebar-header {
1766
+ border-color: var(--hairline);
1767
+ }
1768
+
1769
+ [data-theme="dark"] .tool-nav-item:hover {
1770
+ background: rgba(255,255,255,0.05);
1771
+ }
1772
+
1773
+ [data-theme="dark"] .tool-nav-item.active {
1774
+ background: var(--surface-card);
1775
+ box-shadow: 0 1px 2px rgba(0,0,0,0.2);
1776
+ }
1777
+
1778
+ [data-theme="dark"] .tool-sidebar-footer {
1779
+ border-color: var(--hairline);
1780
+ }
1781
+
1782
+ [data-theme="dark"] .tool-nav-add:hover {
1783
+ background: rgba(255,255,255,0.05);
1784
+ }
1785
+
1786
+ [data-theme="dark"] input[type="date"]::-webkit-calendar-picker-indicator {
1787
+ filter: invert(1);
1788
+ opacity: 0.6;
1789
+ }
1790
+
1791
+ [data-theme="dark"] .loading-overlay {
1792
+ background: rgba(0,0,0,0.7);
1793
+ }
1794
+
1795
+ [data-theme="dark"] .loading-spinner {
1796
+ border-color: #374151;
1797
+ border-top-color: #fff;
1798
+ }
1799
+
1800
+ /* ========== 响应式 ========== */
1801
+
1802
+ @media (max-width: 1024px) {
1803
+ .tool-sidebar {
1804
+ width: 64px;
1805
+ padding: 12px 8px;
1806
+ }
1807
+ .tool-sidebar-header,
1808
+ .tool-nav-label {
1809
+ display: none;
1810
+ }
1811
+ .tool-nav-item {
1812
+ justify-content: center;
1813
+ padding: 10px;
1814
+ }
1815
+ .tool-nav-add {
1816
+ justify-content: center;
1817
+ padding: 10px;
1818
+ }
1819
+ .tool-nav-add .tool-nav-label {
1820
+ display: none;
1821
+ }
1822
+ }
1823
+
1824
+ @media (max-width: 768px) {
1825
+ .app-layout {
1826
+ flex-direction: column;
1827
+ }
1828
+ .tool-sidebar {
1829
+ width: 100%;
1830
+ min-height: auto;
1831
+ position: static;
1832
+ flex-direction: row;
1833
+ padding: 8px 12px;
1834
+ border-right: none;
1835
+ border-bottom: 1px solid var(--hairline);
1836
+ gap: 8px;
1837
+ overflow-x: auto;
1838
+ }
1839
+ .tool-sidebar-header {
1840
+ display: none;
1841
+ }
1842
+ .tool-nav {
1843
+ flex-direction: row;
1844
+ gap: 4px;
1845
+ flex: 1;
1846
+ }
1847
+ .tool-nav-item {
1848
+ width: auto;
1849
+ padding: 6px 12px;
1850
+ white-space: nowrap;
1851
+ }
1852
+ .tool-nav-label {
1853
+ display: inline !important;
1854
+ }
1855
+ .tool-sidebar-footer {
1856
+ display: none;
1857
+ }
1858
+ }
1859
+
1860
+ @media (prefers-color-scheme: dark) {
1861
+ .tool-nav-item:hover {
1862
+ background: rgba(255,255,255,0.05);
1863
+ }
1864
+ }