metripy 0.3.2__py3-none-any.whl → 0.3.3__py3-none-any.whl

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.

Potentially problematic release.


This version of metripy might be problematic. Click here for more details.

@@ -0,0 +1,1386 @@
1
+ /* ===== CSS RESET AND BASE STYLES ===== */
2
+ * {
3
+ margin: 0;
4
+ padding: 0;
5
+ box-sizing: border-box;
6
+ }
7
+
8
+ :root {
9
+ /* Color Palette */
10
+ --primary-color: #3b82f6;
11
+ --primary-dark: #2563eb;
12
+ --secondary-color: #64748b;
13
+ --success-color: #10b981;
14
+ --warning-color: #f59e0b;
15
+ --danger-color: #ef4444;
16
+ --info-color: #06b6d4;
17
+
18
+ /* Background Colors */
19
+ --bg-primary: #ffffff;
20
+ --bg-secondary: #f8fafc;
21
+ --bg-tertiary: #f1f5f9;
22
+ --sidebar-bg: #1e293b;
23
+ --sidebar-bg-light: #334155;
24
+
25
+ /* Text Colors */
26
+ --text-primary: #1e293b;
27
+ --text-secondary: #64748b;
28
+ --text-muted: #94a3b8;
29
+ --text-white: #ffffff;
30
+ --text-light: #f8fafc;
31
+
32
+ /* Border Colors */
33
+ --border-light: #e2e8f0;
34
+ --border-medium: #cbd5e1;
35
+
36
+ /* Shadows */
37
+ --shadow-sm: 0 1px 2px 0 rgb(0 0 0 / 0.05);
38
+ --shadow-md: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);
39
+ --shadow-lg: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);
40
+ --shadow-xl: 0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1);
41
+
42
+ /* Spacing */
43
+ --spacing-xs: 0.25rem;
44
+ --spacing-sm: 0.5rem;
45
+ --spacing-md: 1rem;
46
+ --spacing-lg: 1.5rem;
47
+ --spacing-xl: 2rem;
48
+ --spacing-2xl: 3rem;
49
+
50
+ /* Border Radius */
51
+ --radius-sm: 0.375rem;
52
+ --radius-md: 0.5rem;
53
+ --radius-lg: 0.75rem;
54
+ --radius-xl: 1rem;
55
+
56
+ /* Transitions */
57
+ --transition-fast: 0.15s ease;
58
+ --transition-normal: 0.3s ease;
59
+ --transition-slow: 0.5s ease;
60
+ }
61
+
62
+ html {
63
+ overflow-x: hidden;
64
+ max-width: 100%;
65
+ }
66
+
67
+ body {
68
+ font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
69
+ background-color: var(--bg-secondary);
70
+ color: var(--text-primary);
71
+ line-height: 1.6;
72
+ overflow-x: hidden;
73
+ max-width: 100vw;
74
+ }
75
+
76
+ /* ===== DASHBOARD LAYOUT ===== */
77
+ .dashboard {
78
+ display: flex;
79
+ min-height: 100vh;
80
+ width: 100%;
81
+ max-width: 100vw;
82
+ overflow-x: hidden;
83
+ }
84
+
85
+ /* ===== SIDEBAR STYLES ===== */
86
+ .sidebar {
87
+ width: 280px;
88
+ background: linear-gradient(180deg, var(--sidebar-bg) 0%, var(--sidebar-bg-light) 100%);
89
+ color: var(--text-white);
90
+ display: flex;
91
+ flex-direction: column;
92
+ position: fixed;
93
+ height: 100vh;
94
+ left: 0;
95
+ top: 0;
96
+ z-index: 100;
97
+ box-shadow: var(--shadow-lg);
98
+ }
99
+
100
+ .sidebar-header {
101
+ padding: var(--spacing-xl);
102
+ border-bottom: 1px solid rgba(255, 255, 255, 0.1);
103
+ }
104
+
105
+ .logo {
106
+ display: flex;
107
+ align-items: center;
108
+ gap: var(--spacing-md);
109
+ }
110
+
111
+ .logo i {
112
+ font-size: 2rem;
113
+ color: var(--primary-color);
114
+ }
115
+
116
+ .logo-icon {
117
+ width: 36px;
118
+ height: 36px;
119
+ }
120
+
121
+ .logo h2 {
122
+ font-size: 1.5rem;
123
+ font-weight: 700;
124
+ color: var(--text-white);
125
+ }
126
+
127
+ .sidebar-nav {
128
+ flex: 1;
129
+ padding: var(--spacing-lg) 0;
130
+ }
131
+
132
+ .sidebar-nav ul {
133
+ list-style: none;
134
+ }
135
+
136
+ .nav-item {
137
+ margin: var(--spacing-xs) 0;
138
+ }
139
+
140
+ .nav-link {
141
+ display: flex;
142
+ align-items: center;
143
+ gap: var(--spacing-md);
144
+ padding: var(--spacing-md) var(--spacing-xl);
145
+ color: var(--text-light);
146
+ text-decoration: none;
147
+ transition: all var(--transition-fast);
148
+ border-radius: 0 var(--radius-lg) var(--radius-lg) 0;
149
+ margin-right: var(--spacing-md);
150
+ }
151
+
152
+ .nav-link:hover {
153
+ background-color: rgba(255, 255, 255, 0.1);
154
+ color: var(--text-white);
155
+ transform: translateX(4px);
156
+ }
157
+
158
+ .nav-item.active .nav-link {
159
+ background-color: var(--primary-color);
160
+ color: var(--text-white);
161
+ box-shadow: var(--shadow-md);
162
+ }
163
+
164
+ .nav-link i {
165
+ font-size: 1.125rem;
166
+ width: 20px;
167
+ text-align: center;
168
+ }
169
+
170
+ .sidebar-footer {
171
+ padding: var(--spacing-xl);
172
+ border-top: 1px solid rgba(255, 255, 255, 0.1);
173
+ }
174
+
175
+ .project-info h4 {
176
+ font-size: 0.875rem;
177
+ font-weight: 600;
178
+ margin-bottom: var(--spacing-xs);
179
+ color: var(--text-white);
180
+ }
181
+
182
+ .project-info p {
183
+ font-size: 0.75rem;
184
+ color: var(--text-muted);
185
+ }
186
+
187
+ /* ===== MAIN CONTENT STYLES ===== */
188
+ .main-content {
189
+ flex: 1;
190
+ margin-left: 280px;
191
+ padding: var(--spacing-2xl);
192
+ background-color: var(--bg-secondary);
193
+ min-height: 100vh;
194
+ width: calc(100vw - 280px);
195
+ max-width: calc(100vw - 280px);
196
+ overflow-x: hidden;
197
+ }
198
+
199
+ .page-header {
200
+ margin-bottom: var(--spacing-lg);
201
+ background: linear-gradient(135deg, var(--bg-primary) 0%, var(--bg-tertiary) 100%);
202
+ padding: var(--spacing-lg);
203
+ border-radius: var(--radius-lg);
204
+ box-shadow: var(--shadow-md);
205
+ }
206
+
207
+ .header-content h1 {
208
+ font-size: 1.875rem;
209
+ font-weight: 600;
210
+ color: var(--text-primary);
211
+ margin-bottom: var(--spacing-xs);
212
+ }
213
+
214
+ .subtitle {
215
+ font-size: 1rem;
216
+ color: var(--text-secondary);
217
+ font-weight: 400;
218
+ }
219
+
220
+
221
+ /* ===== BUTTON STYLES ===== */
222
+ .btn {
223
+ display: inline-flex;
224
+ align-items: center;
225
+ gap: var(--spacing-sm);
226
+ padding: var(--spacing-md) var(--spacing-lg);
227
+ font-size: 0.875rem;
228
+ font-weight: 500;
229
+ border: none;
230
+ border-radius: var(--radius-md);
231
+ cursor: pointer;
232
+ transition: all var(--transition-fast);
233
+ text-decoration: none;
234
+ }
235
+
236
+ .btn-primary {
237
+ background-color: var(--primary-color);
238
+ color: var(--text-white);
239
+ }
240
+
241
+ .btn-primary:hover {
242
+ background-color: var(--primary-dark);
243
+ transform: translateY(-1px);
244
+ box-shadow: var(--shadow-lg);
245
+ }
246
+
247
+ .btn-secondary {
248
+ background-color: var(--bg-primary);
249
+ color: var(--text-primary);
250
+ border: 1px solid var(--border-light);
251
+ }
252
+
253
+ .btn-secondary:hover {
254
+ background-color: var(--bg-tertiary);
255
+ border-color: var(--border-medium);
256
+ transform: translateY(-1px);
257
+ }
258
+
259
+ .btn-sm {
260
+ padding: var(--spacing-sm) var(--spacing-md);
261
+ font-size: 0.75rem;
262
+ }
263
+
264
+ .btn.active {
265
+ background-color: var(--primary-color);
266
+ color: var(--text-white);
267
+ }
268
+
269
+ /* ===== METRICS GRID ===== */
270
+ .metrics-grid {
271
+ display: grid;
272
+ grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
273
+ gap: var(--spacing-xl);
274
+ margin-bottom: var(--spacing-2xl);
275
+ }
276
+
277
+ .metric-card {
278
+ background: linear-gradient(135deg, var(--bg-primary) 0%, rgba(255, 255, 255, 0.95) 100%);
279
+ border-radius: var(--radius-xl);
280
+ padding: var(--spacing-xl);
281
+ box-shadow: var(--shadow-md);
282
+ border: 1px solid var(--border-light);
283
+ transition: all var(--transition-normal);
284
+ position: relative;
285
+ overflow: hidden;
286
+ }
287
+
288
+ .metric-card::before {
289
+ content: '';
290
+ position: absolute;
291
+ top: 0;
292
+ left: 0;
293
+ right: 0;
294
+ height: 4px;
295
+ background: linear-gradient(90deg, var(--primary-color), var(--info-color));
296
+ }
297
+
298
+ .metric-card:hover {
299
+ transform: translateY(-4px);
300
+ box-shadow: var(--shadow-xl);
301
+ }
302
+
303
+ .metric-header {
304
+ display: flex;
305
+ align-items: flex-start;
306
+ gap: var(--spacing-md);
307
+ margin-bottom: var(--spacing-lg);
308
+ }
309
+
310
+ .metric-icon {
311
+ width: 50px;
312
+ height: 50px;
313
+ border-radius: var(--radius-lg);
314
+ display: flex;
315
+ align-items: center;
316
+ justify-content: center;
317
+ font-size: 1.5rem;
318
+ color: var(--text-white);
319
+ }
320
+
321
+ .metric-icon.loc {
322
+ background: linear-gradient(135deg, var(--primary-color), var(--primary-dark));
323
+ }
324
+
325
+ .metric-icon.complexity {
326
+ background: linear-gradient(135deg, var(--warning-color), #d97706);
327
+ }
328
+
329
+ .metric-icon.maintainability {
330
+ background: linear-gradient(135deg, var(--success-color), #059669);
331
+ }
332
+
333
+ .metric-icon.avg-loc {
334
+ background: linear-gradient(135deg, var(--info-color), #0891b2);
335
+ }
336
+
337
+ .metric-title h3 {
338
+ font-size: 1.125rem;
339
+ font-weight: 600;
340
+ color: var(--text-primary);
341
+ margin-bottom: var(--spacing-xs);
342
+ }
343
+
344
+ .metric-title p {
345
+ font-size: 0.875rem;
346
+ color: var(--text-secondary);
347
+ }
348
+
349
+ .metric-value {
350
+ margin-bottom: var(--spacing-md);
351
+ position: relative;
352
+ }
353
+
354
+ .metric-value .value {
355
+ font-size: 2.5rem;
356
+ font-weight: 700;
357
+ color: var(--text-primary);
358
+ display: inline-block;
359
+ }
360
+
361
+ .metric-value .unit {
362
+ font-size: 0.875rem;
363
+ color: var(--text-secondary);
364
+ margin-left: var(--spacing-sm);
365
+ }
366
+
367
+ .trend-badge {
368
+ position: absolute;
369
+ top: -4px;
370
+ right: 0;
371
+ display: inline-flex;
372
+ align-items: center;
373
+ gap: 0.25rem;
374
+ padding: 0.25rem 0.5rem;
375
+ border-radius: 12px;
376
+ font-size: 0.6875rem;
377
+ font-weight: 600;
378
+ border: 1px solid;
379
+ cursor: help;
380
+ transition: all var(--transition-fast);
381
+ box-shadow: 0 1px 3px rgba(0,0,0,0.08);
382
+ }
383
+
384
+ .trend-badge:hover {
385
+ transform: translateY(-2px);
386
+ box-shadow: 0 3px 6px rgba(0,0,0,0.12);
387
+ }
388
+
389
+ .trend-badge i {
390
+ font-size: 0.625rem;
391
+ }
392
+
393
+ .trend-badge .trend-value {
394
+ font-weight: 700;
395
+ }
396
+
397
+ .trend-badge.positive {
398
+ background-color: rgba(16, 185, 129, 0.1);
399
+ border-color: rgba(16, 185, 129, 0.3);
400
+ color: #059669;
401
+ }
402
+
403
+ .trend-badge.negative {
404
+ background-color: rgba(239, 68, 68, 0.1);
405
+ border-color: rgba(239, 68, 68, 0.3);
406
+ color: #dc2626;
407
+ }
408
+
409
+ .trend-badge.neutral {
410
+ background-color: rgba(148, 163, 184, 0.1);
411
+ border-color: rgba(148, 163, 184, 0.3);
412
+ color: #64748b;
413
+ }
414
+
415
+ .metric-description {
416
+ margin-top: var(--spacing-lg);
417
+ padding-top: var(--spacing-md);
418
+ border-top: 1px solid var(--border-light);
419
+ }
420
+
421
+ .metric-description p {
422
+ font-size: 0.875rem;
423
+ color: var(--text-secondary);
424
+ line-height: 1.4;
425
+ margin: 0;
426
+ }
427
+
428
+ /* Metric Segmentation Styles */
429
+ .metric-segmentation {
430
+ margin-top: var(--spacing-lg);
431
+ padding-top: var(--spacing-md); /* Add padding to prevent tooltip clipping */
432
+ }
433
+
434
+ .segment-bar {
435
+ display: flex;
436
+ width: 100%;
437
+ height: 8px;
438
+ border-radius: 4px;
439
+ overflow: hidden;
440
+ background-color: var(--bg-tertiary);
441
+ margin-bottom: var(--spacing-md);
442
+ }
443
+
444
+ .segment {
445
+ height: 100%;
446
+ transition: all 0.3s ease;
447
+ flex-shrink: 0;
448
+ flex-grow: 0;
449
+ cursor: pointer;
450
+ position: relative;
451
+ /* min-width now handled dynamically in JavaScript */
452
+ }
453
+
454
+ .segment:hover {
455
+ transform: scaleY(1.2);
456
+ z-index: 10;
457
+ }
458
+
459
+ /* Tooltip styles */
460
+ .segment[title]:hover::after {
461
+ content: attr(title);
462
+ position: absolute;
463
+ bottom: 100%;
464
+ left: 50%;
465
+ transform: translateX(-50%);
466
+ background-color: rgba(0, 0, 0, 0.9);
467
+ color: white;
468
+ padding: 8px 12px;
469
+ border-radius: 6px;
470
+ font-size: 0.875rem;
471
+ white-space: nowrap;
472
+ z-index: 1000;
473
+ margin-bottom: 5px;
474
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
475
+ }
476
+
477
+ .segment[title]:hover::before {
478
+ content: '';
479
+ position: absolute;
480
+ bottom: 100%;
481
+ left: 50%;
482
+ transform: translateX(-50%);
483
+ border: 5px solid transparent;
484
+ border-top-color: rgba(0, 0, 0, 0.9);
485
+ margin-bottom: -5px;
486
+ z-index: 1000;
487
+ }
488
+
489
+ .segment.good {
490
+ background-color: #10b981; /* Green */
491
+ }
492
+
493
+ .segment.okay {
494
+ background-color: #f59e0b; /* Yellow/Amber */
495
+ }
496
+
497
+ .segment.warning {
498
+ background-color: #f97316; /* Orange */
499
+ }
500
+
501
+ .segment.critical {
502
+ background-color: #ef4444; /* Red */
503
+ }
504
+
505
+ .segment-labels {
506
+ display: grid;
507
+ grid-template-columns: repeat(4, 1fr);
508
+ gap: var(--spacing-sm);
509
+ }
510
+
511
+ .segment-label {
512
+ text-align: center;
513
+ padding: var(--spacing-xs);
514
+ }
515
+
516
+ .segment-count {
517
+ font-size: 1.125rem;
518
+ font-weight: 600;
519
+ color: var(--text-primary);
520
+ margin-bottom: 2px;
521
+ }
522
+
523
+ .segment-text {
524
+ font-size: 0.75rem;
525
+ color: var(--text-secondary);
526
+ font-weight: 500;
527
+ text-transform: uppercase;
528
+ letter-spacing: 0.025em;
529
+ }
530
+
531
+ .segment-label.good .segment-count {
532
+ color: #10b981;
533
+ }
534
+
535
+ .segment-label.okay .segment-count {
536
+ color: #f59e0b;
537
+ }
538
+
539
+ .segment-label.warning .segment-count {
540
+ color: #f97316;
541
+ }
542
+
543
+ .segment-label.critical .segment-count {
544
+ color: #ef4444;
545
+ }
546
+
547
+
548
+ /* ===== CHART SECTION ===== */
549
+ .chart-section {
550
+ margin-bottom: var(--spacing-2xl);
551
+ display: grid;
552
+ grid-template-columns: 2fr 1fr;
553
+ gap: var(--spacing-xl);
554
+ }
555
+
556
+ .chart-container {
557
+ background: var(--bg-primary);
558
+ border-radius: var(--radius-xl);
559
+ padding: var(--spacing-xl);
560
+ box-shadow: var(--shadow-md);
561
+ border: 1px solid var(--border-light);
562
+ }
563
+
564
+ .chart-header {
565
+ display: flex;
566
+ justify-content: space-between;
567
+ align-items: flex-start;
568
+ margin-bottom: var(--spacing-xl);
569
+ }
570
+
571
+ .chart-header h3 {
572
+ font-size: 1.5rem;
573
+ font-weight: 600;
574
+ color: var(--text-primary);
575
+ margin-bottom: var(--spacing-xs);
576
+ }
577
+
578
+ .chart-header p {
579
+ color: var(--text-secondary);
580
+ font-size: 0.875rem;
581
+ }
582
+
583
+ .chart-controls {
584
+ display: flex;
585
+ gap: var(--spacing-sm);
586
+ }
587
+
588
+ .chart-content {
589
+ height: 300px;
590
+ position: relative;
591
+ }
592
+
593
+ .chart-container.small .chart-content {
594
+ height: 250px;
595
+ }
596
+
597
+ .chart-container.small {
598
+ padding: var(--spacing-lg);
599
+ }
600
+
601
+ .chart-container.small .chart-header h3 {
602
+ font-size: 1.125rem;
603
+ }
604
+
605
+ .chart-container.small .chart-header p {
606
+ font-size: 0.8125rem;
607
+ }
608
+
609
+ /* ===== ADDITIONAL CONTENT SECTIONS ===== */
610
+ .content-sections {
611
+ margin-bottom: var(--spacing-2xl);
612
+ }
613
+
614
+ .section-grid {
615
+ display: grid;
616
+ grid-template-columns: repeat(auto-fit, minmax(400px, 1fr));
617
+ gap: var(--spacing-xl);
618
+ }
619
+
620
+ .info-card {
621
+ background: var(--bg-primary);
622
+ border-radius: var(--radius-xl);
623
+ padding: var(--spacing-xl);
624
+ box-shadow: var(--shadow-md);
625
+ border: 1px solid var(--border-light);
626
+ }
627
+
628
+ .info-card h4 {
629
+ font-size: 1.25rem;
630
+ font-weight: 600;
631
+ color: var(--text-primary);
632
+ margin-bottom: var(--spacing-lg);
633
+ padding-bottom: var(--spacing-md);
634
+ border-bottom: 1px solid var(--border-light);
635
+ }
636
+
637
+ /* ===== RESPONSIVE DESIGN ===== */
638
+ @media (max-width: 1024px) {
639
+ .sidebar {
640
+ transform: translateX(-100%);
641
+ transition: transform var(--transition-normal);
642
+ }
643
+
644
+ .sidebar.open {
645
+ transform: translateX(0);
646
+ }
647
+
648
+ .main-content {
649
+ margin-left: 0;
650
+ }
651
+
652
+ .page-header {
653
+ flex-direction: column;
654
+ gap: var(--spacing-lg);
655
+ }
656
+
657
+ .metrics-grid {
658
+ grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
659
+ }
660
+ }
661
+
662
+ @media (max-width: 768px) {
663
+ .dashboard {
664
+ flex-direction: column;
665
+ }
666
+
667
+ .sidebar {
668
+ width: 100%;
669
+ height: auto;
670
+ position: relative;
671
+ }
672
+
673
+ .main-content {
674
+ padding: var(--spacing-lg);
675
+ margin-left: 0;
676
+ width: 100%;
677
+ max-width: 100vw;
678
+ overflow-x: hidden;
679
+ }
680
+
681
+ .metrics-grid {
682
+ grid-template-columns: 1fr;
683
+ }
684
+
685
+ .section-grid {
686
+ grid-template-columns: 1fr;
687
+ }
688
+
689
+ .chart-section {
690
+ grid-template-columns: 1fr;
691
+ }
692
+
693
+ .chart-header {
694
+ flex-direction: column;
695
+ gap: var(--spacing-md);
696
+ }
697
+
698
+ .header-content h1 {
699
+ font-size: 2rem;
700
+ }
701
+ }
702
+
703
+ /* ===== ANIMATIONS ===== */
704
+ @keyframes fadeInUp {
705
+ from {
706
+ opacity: 0;
707
+ transform: translateY(20px);
708
+ }
709
+ to {
710
+ opacity: 1;
711
+ transform: translateY(0);
712
+ }
713
+ }
714
+
715
+ .metric-card {
716
+ animation: fadeInUp var(--transition-normal) ease-out;
717
+ }
718
+
719
+ .metric-card:nth-child(1) { animation-delay: 0.1s; }
720
+ .metric-card:nth-child(2) { animation-delay: 0.2s; }
721
+ .metric-card:nth-child(3) { animation-delay: 0.3s; }
722
+ .metric-card:nth-child(4) { animation-delay: 0.4s; }
723
+
724
+ /* ===== LOADING STATES ===== */
725
+ .loading {
726
+ opacity: 0.6;
727
+ pointer-events: none;
728
+ }
729
+
730
+ .loading::after {
731
+ content: '';
732
+ position: absolute;
733
+ top: 50%;
734
+ left: 50%;
735
+ width: 20px;
736
+ height: 20px;
737
+ margin: -10px 0 0 -10px;
738
+ border: 2px solid var(--primary-color);
739
+ border-radius: 50%;
740
+ border-top: 2px solid transparent;
741
+ animation: spin 1s linear infinite;
742
+ }
743
+
744
+ @keyframes spin {
745
+ 0% { transform: rotate(0deg); }
746
+ 100% { transform: rotate(360deg); }
747
+ }
748
+
749
+ /* ===== GIT ANALYSIS PAGE SPECIFIC STYLES ===== */
750
+ .git-metrics-grid {
751
+ display: grid;
752
+ grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
753
+ gap: var(--spacing-xl);
754
+ margin-bottom: var(--spacing-2xl);
755
+ }
756
+
757
+ .hotspot-table, .contributor-table {
758
+ width: 100%;
759
+ border-collapse: collapse;
760
+ margin-top: var(--spacing-md);
761
+ table-layout: fixed; /* Prevents table from expanding beyond container */
762
+ }
763
+
764
+ .hotspot-table th, .hotspot-table td,
765
+ .contributor-table th, .contributor-table td {
766
+ padding: var(--spacing-md);
767
+ text-align: left;
768
+ border-bottom: 1px solid var(--border-light);
769
+ word-wrap: break-word; /* Allows long text to wrap */
770
+ overflow: hidden;
771
+ }
772
+
773
+ .hotspot-table th, .contributor-table th {
774
+ background-color: var(--bg-tertiary);
775
+ font-weight: 600;
776
+ font-size: 0.875rem;
777
+ color: var(--text-primary);
778
+ }
779
+
780
+ .hotspot-table td, .contributor-table td {
781
+ font-size: 0.875rem;
782
+ color: var(--text-secondary);
783
+ }
784
+
785
+ /* File path column should be flexible */
786
+ .hotspot-table td:first-child,
787
+ .contributor-table td:first-child {
788
+ max-width: 0;
789
+ white-space: nowrap;
790
+ overflow: hidden;
791
+ text-overflow: ellipsis;
792
+ }
793
+
794
+ .risk-badge {
795
+ padding: var(--spacing-xs) var(--spacing-sm);
796
+ border-radius: var(--radius-sm);
797
+ font-size: 0.75rem;
798
+ font-weight: 500;
799
+ text-transform: uppercase;
800
+ white-space: nowrap;
801
+ }
802
+
803
+ .risk-high { background-color: rgba(239, 68, 68, 0.1); color: #dc2626; }
804
+ .risk-medium { background-color: rgba(245, 158, 11, 0.1); color: #d97706; }
805
+ .risk-low { background-color: rgba(16, 185, 129, 0.1); color: #059669; }
806
+
807
+ .author-avatar {
808
+ width: 32px;
809
+ height: 32px;
810
+ border-radius: 50%;
811
+ background: linear-gradient(135deg, var(--primary-color), var(--info-color));
812
+ display: inline-flex;
813
+ align-items: center;
814
+ justify-content: center;
815
+ color: white;
816
+ font-weight: 600;
817
+ font-size: 0.875rem;
818
+ margin-right: var(--spacing-sm);
819
+ vertical-align: middle;
820
+ flex-shrink: 0;
821
+ }
822
+
823
+ .progress-bar {
824
+ width: 100px;
825
+ height: 8px;
826
+ background-color: var(--bg-tertiary);
827
+ border-radius: 4px;
828
+ overflow: hidden;
829
+ display: inline-block;
830
+ vertical-align: middle;
831
+ margin-left: var(--spacing-sm);
832
+ }
833
+
834
+ .progress-fill {
835
+ height: 100%;
836
+ background: linear-gradient(90deg, var(--success-color), var(--info-color));
837
+ transition: width 0.3s ease;
838
+ }
839
+
840
+ .two-column-section {
841
+ display: grid;
842
+ grid-template-columns: 1fr 1fr;
843
+ gap: var(--spacing-xl);
844
+ margin-bottom: var(--spacing-2xl);
845
+ }
846
+
847
+ .stat-highlight {
848
+ font-size: 1.125rem;
849
+ font-weight: 600;
850
+ color: var(--primary-color);
851
+ }
852
+
853
+ .section-divider {
854
+ margin: var(--spacing-2xl) 0;
855
+ height: 1px;
856
+ background: linear-gradient(90deg, transparent, var(--border-light), transparent);
857
+ }
858
+
859
+ /* Table container with horizontal scroll for mobile */
860
+ .table-container {
861
+ overflow-x: auto;
862
+ margin: -1px; /* Prevent scrollbar from clipping */
863
+ }
864
+
865
+ /* ===== RESPONSIVE STYLES FOR GIT ANALYSIS ===== */
866
+ @media (max-width: 1200px) {
867
+ .git-metrics-grid {
868
+ grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
869
+ gap: var(--spacing-lg);
870
+ }
871
+ }
872
+
873
+ @media (max-width: 768px) {
874
+ .git-metrics-grid {
875
+ grid-template-columns: 1fr;
876
+ gap: var(--spacing-lg);
877
+ }
878
+
879
+ .two-column-section {
880
+ grid-template-columns: 1fr;
881
+ gap: var(--spacing-lg);
882
+ }
883
+
884
+ .hotspot-table, .contributor-table {
885
+ font-size: 0.8rem;
886
+ }
887
+
888
+ .hotspot-table th, .hotspot-table td,
889
+ .contributor-table th, .contributor-table td {
890
+ padding: var(--spacing-sm);
891
+ }
892
+
893
+ /* Stack author info vertically on mobile */
894
+ .contributor-table td:first-child {
895
+ white-space: normal;
896
+ }
897
+
898
+ .author-avatar {
899
+ width: 28px;
900
+ height: 28px;
901
+ font-size: 0.75rem;
902
+ }
903
+
904
+ .progress-bar {
905
+ width: 80px;
906
+ margin: var(--spacing-xs) 0;
907
+ display: block;
908
+ }
909
+
910
+ .stat-highlight {
911
+ font-size: 1rem;
912
+ }
913
+ }
914
+
915
+ @media (max-width: 480px) {
916
+ .main-content {
917
+ padding: var(--spacing-md);
918
+ }
919
+
920
+ .git-metrics-grid {
921
+ gap: var(--spacing-md);
922
+ }
923
+
924
+ .two-column-section {
925
+ gap: var(--spacing-md);
926
+ }
927
+
928
+ .hotspot-table, .contributor-table {
929
+ font-size: 0.75rem;
930
+ }
931
+
932
+ .hotspot-table th, .hotspot-table td,
933
+ .contributor-table th, .contributor-table td {
934
+ padding: var(--spacing-xs) var(--spacing-sm);
935
+ }
936
+
937
+ /* Hide less important columns on very small screens */
938
+ .hotspot-table th:last-child,
939
+ .hotspot-table td:last-child {
940
+ display: none;
941
+ }
942
+
943
+ .risk-badge {
944
+ font-size: 0.65rem;
945
+ padding: 2px var(--spacing-xs);
946
+ }
947
+ }
948
+
949
+ /* ===== TRENDS PAGE STYLES ===== */
950
+ .trends-section {
951
+ margin-bottom: var(--spacing-2xl);
952
+ }
953
+
954
+ .section-header {
955
+ margin-bottom: var(--spacing-xl);
956
+ }
957
+
958
+ .section-header h2 {
959
+ font-size: 1.5rem;
960
+ font-weight: 600;
961
+ color: var(--text-primary);
962
+ display: flex;
963
+ align-items: center;
964
+ gap: var(--spacing-sm);
965
+ margin-bottom: var(--spacing-xs);
966
+ }
967
+
968
+ .section-header h2 i {
969
+ color: var(--primary-color);
970
+ }
971
+
972
+ .section-header p {
973
+ color: var(--text-secondary);
974
+ font-size: 0.9375rem;
975
+ margin-left: 2.25rem;
976
+ }
977
+
978
+ /* Health Distribution Grid */
979
+ .health-distribution-grid {
980
+ display: grid;
981
+ grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
982
+ gap: var(--spacing-xl);
983
+ }
984
+
985
+ .health-card {
986
+ background: var(--bg-primary);
987
+ border-radius: var(--radius-xl);
988
+ padding: var(--spacing-xl);
989
+ box-shadow: var(--shadow-md);
990
+ border: 1px solid var(--border-light);
991
+ }
992
+
993
+ .health-card-header {
994
+ display: flex;
995
+ justify-content: space-between;
996
+ align-items: center;
997
+ margin-bottom: var(--spacing-lg);
998
+ padding-bottom: var(--spacing-md);
999
+ border-bottom: 1px solid var(--border-light);
1000
+ }
1001
+
1002
+ .health-card-header h3 {
1003
+ font-size: 1.125rem;
1004
+ font-weight: 600;
1005
+ color: var(--text-primary);
1006
+ }
1007
+
1008
+ .time-label {
1009
+ font-size: 0.75rem;
1010
+ color: var(--text-muted);
1011
+ font-weight: 500;
1012
+ }
1013
+
1014
+ /* Segment Comparison */
1015
+ .segment-comparison {
1016
+ display: flex;
1017
+ flex-direction: column;
1018
+ gap: var(--spacing-md);
1019
+ margin-bottom: var(--spacing-lg);
1020
+ }
1021
+
1022
+ .comparison-row {
1023
+ display: flex;
1024
+ align-items: center;
1025
+ gap: var(--spacing-md);
1026
+ }
1027
+
1028
+ .row-label {
1029
+ font-size: 0.75rem;
1030
+ font-weight: 600;
1031
+ color: var(--text-secondary);
1032
+ min-width: 70px;
1033
+ text-transform: uppercase;
1034
+ letter-spacing: 0.05em;
1035
+ }
1036
+
1037
+ .segment-bar-horizontal {
1038
+ flex: 1;
1039
+ height: 40px;
1040
+ display: flex;
1041
+ border-radius: var(--radius-md);
1042
+ overflow: hidden;
1043
+ box-shadow: 0 2px 4px rgba(0,0,0,0.06);
1044
+ background: var(--bg-tertiary);
1045
+ }
1046
+
1047
+ .segment-piece {
1048
+ display: flex;
1049
+ align-items: center;
1050
+ justify-content: center;
1051
+ font-size: 0.8125rem;
1052
+ font-weight: 700;
1053
+ color: white;
1054
+ transition: all var(--transition-normal);
1055
+ position: relative;
1056
+ cursor: pointer;
1057
+ }
1058
+
1059
+ .segment-piece::after {
1060
+ content: attr(data-count);
1061
+ opacity: 0;
1062
+ transition: opacity var(--transition-fast);
1063
+ }
1064
+
1065
+ .segment-piece:hover::after {
1066
+ opacity: 1;
1067
+ }
1068
+
1069
+ .segment-piece:hover {
1070
+ filter: brightness(1.1);
1071
+ }
1072
+
1073
+ .segment-piece.good {
1074
+ background: linear-gradient(90deg, #10b981, #059669);
1075
+ }
1076
+
1077
+ .segment-piece.okay {
1078
+ background: linear-gradient(90deg, #f59e0b, #d97706);
1079
+ }
1080
+
1081
+ .segment-piece.warning {
1082
+ background: linear-gradient(90deg, #f97316, #ea580c);
1083
+ }
1084
+
1085
+ .segment-piece.critical {
1086
+ background: linear-gradient(90deg, #ef4444, #dc2626);
1087
+ }
1088
+
1089
+ /* Segment Legend */
1090
+ .segment-legend {
1091
+ display: flex;
1092
+ justify-content: space-around;
1093
+ gap: var(--spacing-md);
1094
+ flex-wrap: wrap;
1095
+ padding-top: var(--spacing-md);
1096
+ border-top: 1px solid var(--border-light);
1097
+ margin-top: var(--spacing-md);
1098
+ }
1099
+
1100
+ .legend-item {
1101
+ display: flex;
1102
+ align-items: center;
1103
+ gap: 0.625rem;
1104
+ flex: 1;
1105
+ min-width: 140px;
1106
+ }
1107
+
1108
+ .legend-dot {
1109
+ width: 12px;
1110
+ height: 12px;
1111
+ border-radius: 3px;
1112
+ flex-shrink: 0;
1113
+ }
1114
+
1115
+ .legend-dot.good { background: linear-gradient(135deg, #10b981, #059669); }
1116
+ .legend-dot.okay { background: linear-gradient(135deg, #f59e0b, #d97706); }
1117
+ .legend-dot.warning { background: linear-gradient(135deg, #f97316, #ea580c); }
1118
+ .legend-dot.critical { background: linear-gradient(135deg, #ef4444, #dc2626); }
1119
+
1120
+ .legend-info {
1121
+ display: flex;
1122
+ flex-direction: column;
1123
+ gap: 0.125rem;
1124
+ }
1125
+
1126
+ .legend-label {
1127
+ font-size: 0.75rem;
1128
+ font-weight: 600;
1129
+ color: var(--text-primary);
1130
+ }
1131
+
1132
+ .legend-values {
1133
+ font-size: 0.75rem;
1134
+ color: var(--text-secondary);
1135
+ font-weight: 500;
1136
+ font-family: 'Monaco', 'Courier New', monospace;
1137
+ }
1138
+
1139
+ /* Improvement Grid */
1140
+ .improvement-grid {
1141
+ display: grid;
1142
+ grid-template-columns: repeat(auto-fit, minmax(400px, 1fr));
1143
+ gap: var(--spacing-xl);
1144
+ }
1145
+
1146
+ .trend-card {
1147
+ background: var(--bg-primary);
1148
+ border-radius: var(--radius-xl);
1149
+ padding: var(--spacing-xl);
1150
+ box-shadow: var(--shadow-md);
1151
+ border: 1px solid var(--border-light);
1152
+ }
1153
+
1154
+ .trend-card-header {
1155
+ display: flex;
1156
+ align-items: center;
1157
+ gap: var(--spacing-sm);
1158
+ margin-bottom: var(--spacing-lg);
1159
+ padding-bottom: var(--spacing-md);
1160
+ border-bottom: 2px solid;
1161
+ }
1162
+
1163
+ .trend-card-header.improved {
1164
+ border-color: var(--success-color);
1165
+ color: var(--success-color);
1166
+ }
1167
+
1168
+ .trend-card-header.worsened {
1169
+ border-color: var(--danger-color);
1170
+ color: var(--danger-color);
1171
+ }
1172
+
1173
+ .trend-card-header i {
1174
+ font-size: 1.25rem;
1175
+ }
1176
+
1177
+ .trend-card-header h3 {
1178
+ font-size: 1.125rem;
1179
+ font-weight: 600;
1180
+ color: var(--text-primary);
1181
+ }
1182
+
1183
+ /* Trend List */
1184
+ .trend-list {
1185
+ display: flex;
1186
+ flex-direction: column;
1187
+ gap: var(--spacing-md);
1188
+ }
1189
+
1190
+ .trend-item {
1191
+ padding: var(--spacing-md);
1192
+ background: linear-gradient(135deg, var(--bg-secondary), var(--bg-tertiary));
1193
+ border-radius: var(--radius-md);
1194
+ border-left: 4px solid var(--primary-color);
1195
+ transition: all var(--transition-fast);
1196
+ }
1197
+
1198
+ .trend-item:hover {
1199
+ transform: translateX(4px);
1200
+ box-shadow: var(--shadow-md);
1201
+ }
1202
+
1203
+ .trend-item-header {
1204
+ display: flex;
1205
+ justify-content: space-between;
1206
+ align-items: center;
1207
+ margin-bottom: var(--spacing-sm);
1208
+ }
1209
+
1210
+ .file-name {
1211
+ font-weight: 600;
1212
+ color: var(--text-primary);
1213
+ font-size: 0.875rem;
1214
+ overflow: hidden;
1215
+ text-overflow: ellipsis;
1216
+ white-space: nowrap;
1217
+ flex: 1;
1218
+ }
1219
+
1220
+ .trend-item-details {
1221
+ display: flex;
1222
+ align-items: center;
1223
+ gap: var(--spacing-sm);
1224
+ font-size: 0.8125rem;
1225
+ color: var(--text-secondary);
1226
+ }
1227
+
1228
+ .prev-value, .curr-value {
1229
+ font-weight: 600;
1230
+ }
1231
+
1232
+ .curr-value {
1233
+ color: var(--text-primary);
1234
+ }
1235
+
1236
+ .trend-item-details i {
1237
+ font-size: 0.625rem;
1238
+ color: var(--text-muted);
1239
+ }
1240
+
1241
+ /* Trend Delta */
1242
+ .trend-delta {
1243
+ display: flex;
1244
+ align-items: center;
1245
+ gap: 0.375rem;
1246
+ font-size: 0.875rem;
1247
+ font-weight: 600;
1248
+ padding: 0.375rem 0.625rem;
1249
+ border-radius: var(--radius-md);
1250
+ transition: all var(--transition-fast);
1251
+ }
1252
+
1253
+ .trend-delta.positive {
1254
+ color: var(--success-color);
1255
+ background: rgba(16, 185, 129, 0.1);
1256
+ }
1257
+
1258
+ .trend-delta.negative {
1259
+ color: var(--danger-color);
1260
+ background: rgba(239, 68, 68, 0.1);
1261
+ }
1262
+
1263
+ .trend-delta i {
1264
+ font-size: 0.875rem;
1265
+ }
1266
+
1267
+ .delta-value {
1268
+ font-weight: 700;
1269
+ }
1270
+
1271
+ .trend-item:hover .trend-delta {
1272
+ transform: scale(1.05);
1273
+ }
1274
+
1275
+ .trend-item:hover .trend-delta.positive {
1276
+ background: rgba(16, 185, 129, 0.15);
1277
+ }
1278
+
1279
+ .trend-item:hover .trend-delta.negative {
1280
+ background: rgba(239, 68, 68, 0.15);
1281
+ }
1282
+
1283
+ /* Empty State */
1284
+ .empty-state {
1285
+ display: flex;
1286
+ flex-direction: column;
1287
+ align-items: center;
1288
+ justify-content: center;
1289
+ padding: var(--spacing-2xl);
1290
+ text-align: center;
1291
+ background: linear-gradient(135deg, var(--bg-secondary), var(--bg-tertiary));
1292
+ border-radius: var(--radius-xl);
1293
+ border: 2px dashed var(--border-light);
1294
+ min-height: 400px;
1295
+ }
1296
+
1297
+ .empty-state i {
1298
+ font-size: 4rem;
1299
+ color: var(--text-muted);
1300
+ margin-bottom: var(--spacing-lg);
1301
+ }
1302
+
1303
+ .empty-state h3 {
1304
+ font-size: 1.5rem;
1305
+ font-weight: 600;
1306
+ color: var(--text-primary);
1307
+ margin-bottom: var(--spacing-sm);
1308
+ }
1309
+
1310
+ .empty-state p {
1311
+ font-size: 1rem;
1312
+ color: var(--text-secondary);
1313
+ max-width: 500px;
1314
+ }
1315
+
1316
+ /* Responsive */
1317
+ @media (max-width: 768px) {
1318
+ .health-distribution-grid {
1319
+ grid-template-columns: 1fr;
1320
+ }
1321
+
1322
+ .improvement-grid {
1323
+ grid-template-columns: 1fr;
1324
+ }
1325
+
1326
+ .comparison-row {
1327
+ flex-direction: column;
1328
+ align-items: stretch;
1329
+ gap: var(--spacing-xs);
1330
+ }
1331
+
1332
+ .row-label {
1333
+ min-width: auto;
1334
+ font-size: 0.6875rem;
1335
+ }
1336
+
1337
+ .segment-bar-horizontal {
1338
+ height: 35px;
1339
+ }
1340
+
1341
+ .segment-piece {
1342
+ font-size: 0.75rem;
1343
+ }
1344
+
1345
+ .legend-item {
1346
+ min-width: 120px;
1347
+ }
1348
+
1349
+ .legend-label {
1350
+ font-size: 0.6875rem;
1351
+ }
1352
+
1353
+ .legend-values {
1354
+ font-size: 0.6875rem;
1355
+ }
1356
+
1357
+ .legend-dot {
1358
+ width: 10px;
1359
+ height: 10px;
1360
+ }
1361
+ }
1362
+
1363
+ /* ===== UTILITY CLASSES ===== */
1364
+ .text-primary { color: var(--text-primary); }
1365
+ .text-secondary { color: var(--text-secondary); }
1366
+ .text-muted { color: var(--text-muted); }
1367
+ .text-success { color: var(--success-color); }
1368
+ .text-warning { color: var(--warning-color); }
1369
+ .text-danger { color: var(--danger-color); }
1370
+ .text-info { color: var(--info-color); }
1371
+
1372
+ .bg-primary { background-color: var(--bg-primary); }
1373
+ .bg-secondary { background-color: var(--bg-secondary); }
1374
+
1375
+ .d-none { display: none; }
1376
+ .d-flex { display: flex; }
1377
+ .d-grid { display: grid; }
1378
+
1379
+ .justify-center { justify-content: center; }
1380
+ .justify-between { justify-content: space-between; }
1381
+ .align-center { align-items: center; }
1382
+
1383
+ .mb-sm { margin-bottom: var(--spacing-sm); }
1384
+ .mb-md { margin-bottom: var(--spacing-md); }
1385
+ .mb-lg { margin-bottom: var(--spacing-lg); }
1386
+ .mb-xl { margin-bottom: var(--spacing-xl); }