fallow-code-scan 0.1.0

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,791 @@
1
+ :root {
2
+ --bg: #111311;
3
+ --border: #333936;
4
+ --critical: #df6d63;
5
+ --control: #1a1f1d;
6
+ --good: #5fb57d;
7
+ --ink: #f5f1e8;
8
+ --muted: #aaa59a;
9
+ --panel: #1d211f;
10
+ --refactoring: #b47cff;
11
+ --surface: #252a27;
12
+ --warn: #e0a84f;
13
+ }
14
+
15
+ * {
16
+ box-sizing: border-box;
17
+ }
18
+
19
+ body {
20
+ margin: 0;
21
+ background: var(--bg);
22
+ color: var(--ink);
23
+ font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
24
+ }
25
+
26
+ button,
27
+ input {
28
+ font: inherit;
29
+ }
30
+
31
+ button {
32
+ min-height: 38px;
33
+ border: 0;
34
+ border-radius: 6px;
35
+ background: var(--good);
36
+ color: #08120c;
37
+ cursor: pointer;
38
+ font-weight: 800;
39
+ padding: 8px 16px;
40
+ }
41
+
42
+ .icon-button,
43
+ .run-summary-item,
44
+ .section-subhead,
45
+ .finding-group-static summary {
46
+ display: flex;
47
+ align-items: center;
48
+ }
49
+
50
+ .icon-button {
51
+ justify-content: center;
52
+ gap: 7px;
53
+ }
54
+
55
+ .icon-button svg {
56
+ width: 16px;
57
+ height: 16px;
58
+ }
59
+
60
+ .icon-button.is-spinning svg {
61
+ animation: spin 900ms linear infinite;
62
+ }
63
+
64
+ .secondary-button {
65
+ border: 1px solid var(--border);
66
+ background: var(--control);
67
+ color: var(--ink);
68
+ }
69
+
70
+ button:disabled {
71
+ cursor: wait;
72
+ opacity: 0.58;
73
+ }
74
+
75
+ h1,
76
+ h2,
77
+ h3,
78
+ p {
79
+ margin: 0;
80
+ }
81
+
82
+ h1 {
83
+ font-size: 28px;
84
+ line-height: 1.15;
85
+ }
86
+
87
+ h2 {
88
+ font-size: 16px;
89
+ line-height: 1.2;
90
+ }
91
+
92
+ h3 {
93
+ font-size: 13px;
94
+ line-height: 1.25;
95
+ }
96
+
97
+ .app-shell {
98
+ max-width: 1480px;
99
+ margin: 0 auto;
100
+ padding: 24px;
101
+ }
102
+
103
+ .topbar,
104
+ .panel-header,
105
+ .file-score {
106
+ display: flex;
107
+ align-items: center;
108
+ justify-content: space-between;
109
+ gap: 16px;
110
+ }
111
+
112
+ .topbar {
113
+ align-items: flex-start;
114
+ margin-bottom: 18px;
115
+ }
116
+
117
+ .title-line {
118
+ display: flex;
119
+ align-items: center;
120
+ gap: 10px;
121
+ }
122
+
123
+ .title-icon {
124
+ width: 25px;
125
+ height: 25px;
126
+ color: var(--good);
127
+ }
128
+
129
+ .toolbar {
130
+ display: flex;
131
+ align-items: center;
132
+ gap: 12px;
133
+ }
134
+
135
+ .auto-refresh {
136
+ display: flex;
137
+ align-items: center;
138
+ gap: 8px;
139
+ color: var(--muted);
140
+ font-size: 13px;
141
+ font-weight: 700;
142
+ }
143
+
144
+ .muted {
145
+ color: var(--muted);
146
+ font-size: 13px;
147
+ margin-top: 6px;
148
+ }
149
+
150
+ .run-summary-item {
151
+ display: inline-flex;
152
+ gap: 5px;
153
+ }
154
+
155
+ .run-summary-item + .run-summary-item {
156
+ margin-left: 10px;
157
+ }
158
+
159
+ .run-summary-item svg {
160
+ width: 13px;
161
+ height: 13px;
162
+ }
163
+
164
+ .panel,
165
+ .metric {
166
+ border: 1px solid var(--border);
167
+ border-radius: 8px;
168
+ background: var(--panel);
169
+ }
170
+
171
+ .status-pill {
172
+ min-width: 70px;
173
+ border-radius: 999px;
174
+ padding: 6px 10px;
175
+ text-align: center;
176
+ font-size: 12px;
177
+ font-weight: 900;
178
+ text-transform: uppercase;
179
+ }
180
+
181
+ .status-idle {
182
+ background: #3a3f3c;
183
+ }
184
+
185
+ .status-running {
186
+ background: #456a7c;
187
+ }
188
+
189
+ .status-ready {
190
+ background: #315c40;
191
+ }
192
+
193
+ .status-failed {
194
+ background: #6f3530;
195
+ }
196
+
197
+ .error-banner {
198
+ margin-bottom: 16px;
199
+ border: 1px solid rgba(223, 109, 99, 0.7);
200
+ border-radius: 6px;
201
+ background: rgba(111, 53, 48, 0.42);
202
+ color: #f2b2ac;
203
+ font-size: 13px;
204
+ line-height: 1.4;
205
+ padding: 11px 13px;
206
+ overflow-wrap: anywhere;
207
+ }
208
+
209
+ .error-banner[hidden] {
210
+ display: none;
211
+ }
212
+
213
+ .overview-grid {
214
+ display: grid;
215
+ grid-template-columns:
216
+ repeat(2, minmax(0, 1fr))
217
+ minmax(320px, calc((100% - 18px) / 3));
218
+ gap: 18px;
219
+ margin-bottom: 18px;
220
+ }
221
+
222
+ .metric-maintainability {
223
+ grid-column: 3;
224
+ border-color: rgba(245, 241, 232, 0.68);
225
+ }
226
+
227
+ .metric {
228
+ padding: 14px;
229
+ }
230
+
231
+ .metric-header,
232
+ .section-title {
233
+ display: flex;
234
+ align-items: center;
235
+ }
236
+
237
+ .metric-header {
238
+ justify-content: space-between;
239
+ gap: 12px;
240
+ }
241
+
242
+ .section-title {
243
+ min-width: 0;
244
+ gap: 8px;
245
+ }
246
+
247
+ .metric-label {
248
+ color: var(--ink);
249
+ font-size: 16px;
250
+ font-weight: 700;
251
+ }
252
+
253
+ .metric-value {
254
+ margin-top: 8px;
255
+ font-size: 26px;
256
+ font-weight: 900;
257
+ }
258
+
259
+ .metric-score-row {
260
+ display: grid;
261
+ grid-template-columns: auto minmax(80px, 1fr);
262
+ align-items: center;
263
+ gap: 16px;
264
+ margin-top: 8px;
265
+ }
266
+
267
+ .metric-score-row .metric-value {
268
+ margin-top: 0;
269
+ }
270
+
271
+ .metric-good .metric-value {
272
+ color: var(--good);
273
+ }
274
+
275
+ .metric-warn .metric-value {
276
+ color: var(--warn);
277
+ }
278
+
279
+ .metric-neutral .metric-value {
280
+ color: var(--muted);
281
+ }
282
+
283
+ .metric-critical .metric-value {
284
+ color: var(--critical);
285
+ }
286
+
287
+ .metric-blocking-findings {
288
+ border-color: rgba(223, 109, 99, 0.75);
289
+ }
290
+
291
+ .metric-blocking-findings .metric-value,
292
+ .metric-blocking-findings .metric-icon {
293
+ color: var(--critical);
294
+ }
295
+
296
+ .metric-refactoring-suggestions {
297
+ border-color: rgba(180, 124, 255, 0.7);
298
+ }
299
+
300
+ .metric-refactoring-suggestions .metric-value,
301
+ .metric-refactoring-suggestions .metric-icon {
302
+ color: var(--refactoring);
303
+ }
304
+
305
+ .metric-progress {
306
+ display: block;
307
+ width: 100%;
308
+ height: 5px;
309
+ margin: 0;
310
+ border: 0;
311
+ border-radius: 999px;
312
+ overflow: hidden;
313
+ appearance: none;
314
+ background: var(--surface);
315
+ }
316
+
317
+ .metric-progress::-webkit-progress-bar {
318
+ border-radius: 999px;
319
+ background: var(--surface);
320
+ }
321
+
322
+ .metric-progress::-webkit-progress-value {
323
+ border-radius: 999px;
324
+ background: var(--good);
325
+ }
326
+
327
+ .metric-warn .metric-progress::-webkit-progress-value {
328
+ background: var(--warn);
329
+ }
330
+
331
+ .metric-critical .metric-progress::-webkit-progress-value {
332
+ background: var(--critical);
333
+ }
334
+
335
+ .metric-progress::-moz-progress-bar {
336
+ border-radius: 999px;
337
+ background: var(--good);
338
+ }
339
+
340
+ .metric-warn .metric-progress::-moz-progress-bar {
341
+ background: var(--warn);
342
+ }
343
+
344
+ .metric-critical .metric-progress::-moz-progress-bar {
345
+ background: var(--critical);
346
+ }
347
+
348
+ .metric-icon,
349
+ .section-icon {
350
+ display: inline-grid;
351
+ flex: 0 0 auto;
352
+ place-items: center;
353
+ }
354
+
355
+ .metric-icon {
356
+ width: 24px;
357
+ height: 24px;
358
+ font-size: 21px;
359
+ }
360
+
361
+ .section-icon {
362
+ width: 20px;
363
+ height: 20px;
364
+ font-size: 18px;
365
+ }
366
+
367
+ .analysis-grid {
368
+ display: grid;
369
+ grid-template-columns: minmax(0, 2fr) minmax(320px, 1fr);
370
+ gap: 18px;
371
+ align-items: start;
372
+ }
373
+
374
+ .main-column {
375
+ display: grid;
376
+ gap: 18px;
377
+ }
378
+
379
+ .panel {
380
+ padding: 16px;
381
+ }
382
+
383
+ .copy-section {
384
+ min-height: 28px;
385
+ border: 1px solid var(--border);
386
+ border-radius: 6px;
387
+ background: var(--control);
388
+ color: var(--muted);
389
+ font-size: 12px;
390
+ font-weight: 650;
391
+ padding: 4px 9px;
392
+ }
393
+
394
+ .copy-section:hover {
395
+ color: var(--ink);
396
+ }
397
+
398
+ .panel-critical {
399
+ border-color: rgba(223, 109, 99, 0.7);
400
+ }
401
+
402
+ .panel-refactoring {
403
+ border-color: rgba(180, 124, 255, 0.62);
404
+ }
405
+
406
+ .panel-count {
407
+ min-width: 42px;
408
+ border-radius: 999px;
409
+ background: var(--surface);
410
+ color: var(--muted);
411
+ font-size: 12px;
412
+ font-weight: 900;
413
+ padding: 5px 9px;
414
+ text-align: center;
415
+ }
416
+
417
+ .section-title-critical,
418
+ .section-title-critical .panel-count {
419
+ color: var(--critical);
420
+ }
421
+
422
+ .section-title-critical .panel-count {
423
+ background: rgba(223, 109, 99, 0.14);
424
+ }
425
+
426
+ .section-title-refactoring,
427
+ .section-title-refactoring .panel-count {
428
+ color: var(--refactoring);
429
+ }
430
+
431
+ .section-title-refactoring .panel-count {
432
+ background: rgba(180, 124, 255, 0.14);
433
+ }
434
+
435
+ .section-title h2 {
436
+ color: var(--ink);
437
+ }
438
+
439
+ .stack-list {
440
+ display: grid;
441
+ gap: 10px;
442
+ margin-top: 14px;
443
+ }
444
+
445
+ .file-score,
446
+ .target-card,
447
+ .summary-item,
448
+ .empty-state {
449
+ border: 1px solid var(--border);
450
+ border-radius: 6px;
451
+ background: var(--surface);
452
+ }
453
+
454
+ .finding-group-static {
455
+ padding: 12px 0 4px;
456
+ }
457
+
458
+ .finding-group-static:first-child {
459
+ padding-top: 0;
460
+ }
461
+
462
+ .finding-group-static + .finding-group-static {
463
+ margin-top: 10px;
464
+ }
465
+
466
+ .finding-group-static h3 {
467
+ color: var(--muted);
468
+ font-weight: 650;
469
+ }
470
+
471
+ .finding-group-static summary {
472
+ width: 100%;
473
+ gap: 7px;
474
+ cursor: pointer;
475
+ list-style: none;
476
+ padding: 0 4px 10px;
477
+ border-bottom: 1px solid rgba(223, 109, 99, 0.28);
478
+ }
479
+
480
+ .finding-group-static summary::-webkit-details-marker {
481
+ display: none;
482
+ }
483
+
484
+ .finding-chevron {
485
+ width: 15px;
486
+ height: 15px;
487
+ color: var(--muted);
488
+ }
489
+
490
+ .finding-type-icon {
491
+ width: 17px;
492
+ height: 17px;
493
+ color: var(--critical);
494
+ }
495
+
496
+ .finding-group-static[open] .chevron-closed,
497
+ .finding-group-static:not([open]) .chevron-open {
498
+ display: none;
499
+ }
500
+
501
+ ul {
502
+ display: grid;
503
+ gap: 8px;
504
+ margin: 12px 0 0;
505
+ padding: 0;
506
+ list-style: none;
507
+ }
508
+
509
+ li {
510
+ display: grid;
511
+ gap: 3px;
512
+ min-width: 0;
513
+ }
514
+
515
+ .finding-record {
516
+ align-items: start;
517
+ border: 1px solid var(--border);
518
+ border-radius: 6px;
519
+ background: rgba(111, 53, 48, 0.13);
520
+ padding: 11px 12px;
521
+ }
522
+
523
+ .panel-critical .finding-record {
524
+ border-color: rgba(223, 109, 99, 0.32);
525
+ }
526
+
527
+ .item-title,
528
+ .target-card h3 {
529
+ color: var(--ink);
530
+ font-size: 13px;
531
+ font-weight: 500;
532
+ overflow-wrap: anywhere;
533
+ }
534
+
535
+ .item-detail,
536
+ .target-card p {
537
+ color: var(--muted);
538
+ font-size: 13px;
539
+ line-height: 1.35;
540
+ }
541
+
542
+ .file-score {
543
+ padding: 10px 12px;
544
+ }
545
+
546
+ .file-score-warn {
547
+ border-left: 3px solid var(--warn);
548
+ }
549
+
550
+ .file-score .item-title {
551
+ display: block;
552
+ line-height: 1.35;
553
+ text-transform: none;
554
+ }
555
+
556
+ .file-score .item-detail {
557
+ display: block;
558
+ margin-top: 3px;
559
+ text-transform: none;
560
+ }
561
+
562
+ .score-value {
563
+ color: var(--good);
564
+ font-size: 18px;
565
+ font-weight: 700;
566
+ }
567
+
568
+ .file-score-side {
569
+ display: grid;
570
+ justify-items: end;
571
+ gap: 4px;
572
+ }
573
+
574
+ .complexity-badge {
575
+ border-radius: 999px;
576
+ background: rgba(224, 168, 79, 0.13);
577
+ color: var(--warn);
578
+ font-size: 12px;
579
+ font-weight: 650;
580
+ padding: 3px 7px;
581
+ white-space: nowrap;
582
+ }
583
+
584
+ .file-score-warn .score-value {
585
+ color: var(--warn);
586
+ }
587
+
588
+ .health-panel {
589
+ position: sticky;
590
+ top: 16px;
591
+ }
592
+
593
+ .health-summary {
594
+ display: grid;
595
+ gap: 14px;
596
+ margin-top: 16px;
597
+ }
598
+
599
+ .health-section {
600
+ display: grid;
601
+ gap: 8px;
602
+ }
603
+
604
+ .health-section-header {
605
+ display: flex;
606
+ align-items: center;
607
+ justify-content: space-between;
608
+ gap: 8px;
609
+ }
610
+
611
+ .health-section h3 {
612
+ color: var(--muted);
613
+ font-weight: 650;
614
+ }
615
+
616
+ .health-rows {
617
+ display: grid;
618
+ border: 1px solid var(--border);
619
+ border-radius: 6px;
620
+ background: var(--surface);
621
+ }
622
+
623
+ .health-row {
624
+ display: grid;
625
+ grid-template-columns: minmax(0, 1fr) auto;
626
+ gap: 12px;
627
+ padding: 9px 10px;
628
+ border-top: 1px solid var(--border);
629
+ border-left: 3px solid transparent;
630
+ }
631
+
632
+ .health-row:first-child {
633
+ border-top: 0;
634
+ }
635
+
636
+ .health-row span:first-child {
637
+ color: var(--muted);
638
+ font-size: 13px;
639
+ }
640
+
641
+ .health-row span:last-child {
642
+ color: var(--ink);
643
+ font-size: 13px;
644
+ font-weight: 500;
645
+ text-align: right;
646
+ }
647
+
648
+ .health-row-good {
649
+ border-left-color: var(--good);
650
+ }
651
+
652
+ .health-row-warn {
653
+ border-left-color: var(--warn);
654
+ }
655
+
656
+ .health-row-critical {
657
+ border-left-color: var(--critical);
658
+ }
659
+
660
+ .health-row-good span:last-child {
661
+ color: var(--good);
662
+ }
663
+
664
+ .health-row-warn span:last-child {
665
+ color: var(--warn);
666
+ }
667
+
668
+ .health-row-critical span:last-child {
669
+ color: var(--critical);
670
+ }
671
+
672
+ .section-subhead {
673
+ gap: 7px;
674
+ margin-top: 22px;
675
+ padding-top: 18px;
676
+ border-top: 1px solid var(--border);
677
+ color: var(--muted);
678
+ font-weight: 650;
679
+ }
680
+
681
+ .section-subhead svg {
682
+ width: 17px;
683
+ height: 17px;
684
+ color: var(--warn);
685
+ }
686
+
687
+ .targets-panel {
688
+ margin-top: 0;
689
+ }
690
+
691
+ .target-grid {
692
+ display: grid;
693
+ grid-template-columns: repeat(3, minmax(220px, 1fr));
694
+ gap: 12px;
695
+ margin-top: 14px;
696
+ }
697
+
698
+ .target-card {
699
+ display: grid;
700
+ gap: 10px;
701
+ padding: 12px;
702
+ border-left: 4px solid var(--muted);
703
+ }
704
+
705
+ .panel-refactoring .target-card {
706
+ border-top-color: rgba(180, 124, 255, 0.28);
707
+ border-right-color: rgba(180, 124, 255, 0.28);
708
+ border-bottom-color: rgba(180, 124, 255, 0.28);
709
+ }
710
+
711
+ .target-critical {
712
+ border-left-color: var(--critical);
713
+ }
714
+
715
+ .target-warn {
716
+ border-left-color: var(--warn);
717
+ }
718
+
719
+ .target-good {
720
+ border-left-color: var(--good);
721
+ }
722
+
723
+ .target-score {
724
+ color: var(--muted);
725
+ font-size: 13px;
726
+ font-weight: 650;
727
+ }
728
+
729
+ .empty-state {
730
+ display: flex;
731
+ align-items: center;
732
+ width: 100%;
733
+ min-height: 64px;
734
+ color: var(--muted);
735
+ padding: 14px;
736
+ }
737
+
738
+ .target-grid > .empty-state {
739
+ grid-column: 1 / -1;
740
+ }
741
+
742
+ .copy-buffer {
743
+ position: fixed;
744
+ left: -9999px;
745
+ top: 0;
746
+ }
747
+
748
+ @keyframes spin {
749
+ to {
750
+ transform: rotate(360deg);
751
+ }
752
+ }
753
+
754
+ @media (max-width: 1100px) {
755
+ .overview-grid,
756
+ .analysis-grid,
757
+ .target-grid {
758
+ grid-template-columns: 1fr 1fr;
759
+ }
760
+
761
+ .metric-maintainability {
762
+ grid-column: auto;
763
+ }
764
+
765
+ .health-panel {
766
+ position: static;
767
+ }
768
+ }
769
+
770
+ @media (max-width: 720px) {
771
+ .app-shell {
772
+ padding: 16px;
773
+ }
774
+
775
+ .topbar,
776
+ .toolbar {
777
+ align-items: stretch;
778
+ flex-direction: column;
779
+ }
780
+
781
+ .overview-grid,
782
+ .analysis-grid,
783
+ .target-grid,
784
+ .health-row {
785
+ grid-template-columns: 1fr;
786
+ }
787
+
788
+ .health-row span:last-child {
789
+ text-align: left;
790
+ }
791
+ }