design-spine 0.1.0 → 0.2.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,1313 @@
1
+ :root {
2
+ color-scheme: light dark;
3
+ --bg: #f7f6f2;
4
+ --surface: #fff;
5
+ --ink: #20231f;
6
+ --muted: #62675e;
7
+ --line: #dedfd7;
8
+ --accent: #b34512;
9
+ --accent-bg: #f9eadf;
10
+ --ok: #25633f;
11
+ --ok-bg: #e8f2e9;
12
+ --bad: #a83232;
13
+ --bad-bg: #f9e8e5;
14
+ --warn: #785411;
15
+ --warn-bg: #f8efd8;
16
+ --focus: #b94713;
17
+ --on-strong: #fff;
18
+ --radius: 8px;
19
+ --mono: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
20
+ }
21
+ @media (prefers-color-scheme: dark) {
22
+ :root {
23
+ --bg: #171b18;
24
+ --surface: #202620;
25
+ --ink: #eef0e8;
26
+ --muted: #adb5a7;
27
+ --line: #3a4438;
28
+ --accent: #ffac7c;
29
+ --accent-bg: #3c2b22;
30
+ --ok: #8fdaac;
31
+ --ok-bg: #223a2b;
32
+ --bad: #ffaaa4;
33
+ --bad-bg: #402929;
34
+ --warn: #ead08a;
35
+ --warn-bg: #3b3422;
36
+ --focus: #ffac7c;
37
+ --on-strong: #171b18;
38
+ }
39
+ }
40
+ * {
41
+ box-sizing: border-box;
42
+ }
43
+ body {
44
+ margin: 0;
45
+ background: var(--bg);
46
+ color: var(--ink);
47
+ font:
48
+ 14px / 1.5 -apple-system,
49
+ BlinkMacSystemFont,
50
+ "Segoe UI",
51
+ sans-serif;
52
+ }
53
+ button,
54
+ input,
55
+ select,
56
+ textarea {
57
+ font: inherit;
58
+ color: inherit;
59
+ }
60
+ button {
61
+ cursor: pointer;
62
+ }
63
+ button,
64
+ select,
65
+ input {
66
+ min-height: 44px;
67
+ }
68
+ button:disabled {
69
+ opacity: 0.55;
70
+ cursor: wait;
71
+ }
72
+ a {
73
+ color: inherit;
74
+ }
75
+ button,
76
+ input,
77
+ select,
78
+ textarea,
79
+ a {
80
+ -webkit-tap-highlight-color: transparent;
81
+ }
82
+ :focus-visible {
83
+ outline: 2px solid var(--focus);
84
+ outline-offset: 3px;
85
+ }
86
+ .skip {
87
+ position: fixed;
88
+ left: 16px;
89
+ top: -80px;
90
+ z-index: 50;
91
+ background: var(--surface);
92
+ padding: 12px;
93
+ }
94
+ .skip:focus {
95
+ top: 8px;
96
+ }
97
+ header {
98
+ height: 64px;
99
+ padding: 0 24px;
100
+ border-bottom: 1px solid var(--line);
101
+ display: flex;
102
+ gap: 24px;
103
+ align-items: center;
104
+ background: var(--surface);
105
+ }
106
+ .brand {
107
+ display: flex;
108
+ gap: 12px;
109
+ align-items: center;
110
+ font-weight: 700;
111
+ font-size: 18px;
112
+ letter-spacing: -0.5px;
113
+ }
114
+ .mark {
115
+ width: 25px;
116
+ height: 30px;
117
+ border-left: 5px solid var(--accent);
118
+ display: grid;
119
+ gap: 3px;
120
+ padding-left: 4px;
121
+ }
122
+ .mark i {
123
+ background: var(--ink);
124
+ height: 7px;
125
+ width: 16px;
126
+ }
127
+ .header-label {
128
+ border-left: 1px solid var(--line);
129
+ padding-left: 24px;
130
+ color: var(--muted);
131
+ font-size: 12px;
132
+ }
133
+ .header-actions {
134
+ margin-left: auto;
135
+ display: flex;
136
+ gap: 8px;
137
+ }
138
+ .button,
139
+ .pill,
140
+ .actions button {
141
+ background: var(--surface);
142
+ border: 1px solid var(--line);
143
+ border-radius: var(--radius);
144
+ padding: 8px 16px;
145
+ font-weight: 600;
146
+ }
147
+ .button:hover,
148
+ .pill:hover,
149
+ .actions button:hover {
150
+ border-color: var(--muted);
151
+ background: var(--bg);
152
+ }
153
+ .button.primary {
154
+ background: var(--ink);
155
+ color: var(--bg);
156
+ border-color: var(--ink);
157
+ }
158
+ .workspace {
159
+ display: grid;
160
+ grid-template-columns: 208px minmax(0, 1fr);
161
+ min-height: calc(100vh - 64px);
162
+ }
163
+ aside {
164
+ padding: 32px 20px;
165
+ border-right: 1px solid var(--line);
166
+ }
167
+ .sidebar-sticky {
168
+ position: sticky;
169
+ top: 24px;
170
+ }
171
+ .eyebrow {
172
+ font: 11px / 1.4 var(--mono);
173
+ text-transform: uppercase;
174
+ letter-spacing: 0.1em;
175
+ color: var(--muted);
176
+ }
177
+ #route-nav {
178
+ min-height: 44px;
179
+ display: grid;
180
+ gap: 4px;
181
+ margin-top: 16px;
182
+ }
183
+ #route-nav a {
184
+ text-decoration: none;
185
+ display: flex;
186
+ justify-content: space-between;
187
+ gap: 8px;
188
+ border-radius: 6px;
189
+ padding: 11px 12px;
190
+ font: 12px / 1.5 var(--mono);
191
+ overflow-wrap: anywhere;
192
+ }
193
+ #route-nav a:hover {
194
+ background: var(--accent-bg);
195
+ color: var(--accent);
196
+ }
197
+ .stat span {
198
+ color: var(--muted);
199
+ font-size: 12px;
200
+ }
201
+ #route-nav span {
202
+ color: var(--muted);
203
+ flex-shrink: 0;
204
+ white-space: nowrap;
205
+ }
206
+ .sidebar-note {
207
+ border-top: 1px solid var(--line);
208
+ margin-top: 32px;
209
+ padding-top: 20px;
210
+ font-size: 12px;
211
+ color: var(--muted);
212
+ }
213
+ main {
214
+ min-width: 0;
215
+ max-width: 1800px;
216
+ width: 100%;
217
+ padding: 16px 28px 120px;
218
+ margin: 0 auto;
219
+ }
220
+ .intro {
221
+ display: flex;
222
+ justify-content: space-between;
223
+ gap: 24px;
224
+ align-items: end;
225
+ }
226
+ h1 {
227
+ font-size: clamp(28px, 3vw, 36px);
228
+ font-weight: 650;
229
+ letter-spacing: -2px;
230
+ line-height: 1.1;
231
+ margin: 6px 0;
232
+ }
233
+ .subtitle {
234
+ color: var(--muted);
235
+ margin: 0;
236
+ max-width: 52ch;
237
+ }
238
+ .run-context {
239
+ max-width: 270px;
240
+ color: var(--muted);
241
+ text-align: right;
242
+ font: 11px / 1.7 var(--mono);
243
+ overflow-wrap: anywhere;
244
+ }
245
+ #runid {
246
+ display: block;
247
+ }
248
+ .stats {
249
+ min-height: 64px;
250
+ display: grid;
251
+ grid-template-columns: repeat(5, minmax(0, 1fr));
252
+ margin-top: 8px;
253
+ border: 1px solid var(--line);
254
+ border-radius: var(--radius);
255
+ background: var(--surface);
256
+ }
257
+ .stat {
258
+ padding: 8px 16px;
259
+ border-right: 1px solid var(--line);
260
+ display: flex;
261
+ flex-direction: column;
262
+ gap: 4px;
263
+ }
264
+ .stat:last-child {
265
+ border: 0;
266
+ }
267
+ .stat b {
268
+ font-size: 24px;
269
+ font-weight: 550;
270
+ letter-spacing: -1px;
271
+ font-variant-numeric: tabular-nums;
272
+ }
273
+ .stat.flagged b {
274
+ color: var(--accent);
275
+ }
276
+ .progress-row {
277
+ display: flex;
278
+ align-items: center;
279
+ gap: 16px;
280
+ margin: 10px 0 12px;
281
+ color: var(--muted);
282
+ font-size: 12px;
283
+ }
284
+ progress {
285
+ appearance: none;
286
+ border: 0;
287
+ background: var(--line);
288
+ height: 4px;
289
+ flex: 1;
290
+ border-radius: 4px;
291
+ }
292
+ progress::-webkit-progress-bar {
293
+ background: var(--line);
294
+ border-radius: 4px;
295
+ }
296
+ progress::-webkit-progress-value {
297
+ background: var(--accent);
298
+ border-radius: 4px;
299
+ }
300
+ progress::-moz-progress-bar {
301
+ background: var(--accent);
302
+ }
303
+ .toolbar {
304
+ display: flex;
305
+ flex-wrap: wrap;
306
+ gap: 12px;
307
+ align-items: end;
308
+ border-top: 1px solid var(--line);
309
+ border-bottom: 1px solid var(--line);
310
+ padding: 10px 0;
311
+ }
312
+ .secondary-filters {
313
+ display: contents;
314
+ }
315
+ .coverage-short {
316
+ display: none;
317
+ }
318
+ #toggle-filters {
319
+ display: none;
320
+ }
321
+ .coverage-scroll {
322
+ max-height: 420px;
323
+ overflow: auto;
324
+ margin: 12px 0;
325
+ }
326
+ .coverage-matrix {
327
+ border-collapse: collapse;
328
+ width: 100%;
329
+ font-size: 12px;
330
+ }
331
+ .coverage-matrix caption {
332
+ text-align: left;
333
+ font-weight: 600;
334
+ padding: 8px 0;
335
+ color: var(--ink);
336
+ }
337
+ .coverage-matrix th,
338
+ .coverage-matrix td {
339
+ border-bottom: 1px solid var(--line);
340
+ padding: 6px;
341
+ text-align: left;
342
+ }
343
+ .coverage-matrix thead th {
344
+ position: sticky;
345
+ top: 0;
346
+ background: var(--surface);
347
+ white-space: nowrap;
348
+ }
349
+ .coverage-matrix tbody th {
350
+ min-width: 160px;
351
+ max-width: 300px;
352
+ overflow-wrap: anywhere;
353
+ font-weight: 500;
354
+ }
355
+ .coverage-cell {
356
+ min-width: 100px;
357
+ background: var(--surface);
358
+ border: 1px solid var(--line);
359
+ border-radius: var(--radius);
360
+ padding: 6px 10px;
361
+ text-align: left;
362
+ }
363
+ .coverage-cell[data-decision="approve"] {
364
+ color: var(--ok);
365
+ background: var(--ok-bg);
366
+ }
367
+ .coverage-cell[data-decision="reject"] {
368
+ color: var(--bad);
369
+ background: var(--bad-bg);
370
+ }
371
+ .coverage-unavailable {
372
+ display: block;
373
+ min-width: 100px;
374
+ padding: 6px;
375
+ color: var(--muted);
376
+ }
377
+ .field {
378
+ display: grid;
379
+ gap: 6px;
380
+ font-size: 12px;
381
+ color: var(--muted);
382
+ }
383
+ .search-field {
384
+ flex: 1;
385
+ min-width: 180px;
386
+ }
387
+ input,
388
+ select {
389
+ border: 1px solid var(--line);
390
+ border-radius: var(--radius);
391
+ background: var(--surface);
392
+ padding: 8px 12px;
393
+ width: 100%;
394
+ }
395
+ .filters {
396
+ display: flex;
397
+ flex-wrap: wrap;
398
+ gap: 8px;
399
+ }
400
+ .pill {
401
+ font-size: 12px;
402
+ }
403
+ .pill[aria-pressed="true"] {
404
+ background: var(--accent-bg);
405
+ border-color: var(--accent);
406
+ color: var(--accent);
407
+ }
408
+ .results-row {
409
+ display: flex;
410
+ justify-content: space-between;
411
+ gap: 16px;
412
+ margin: 4px 0 8px;
413
+ color: var(--muted);
414
+ font: 11px / 1.5 var(--mono);
415
+ }
416
+ .route {
417
+ margin: 0 0 48px;
418
+ scroll-margin-top: 24px;
419
+ }
420
+ .route > h2 {
421
+ display: flex;
422
+ gap: 12px;
423
+ align-items: center;
424
+ font-size: 20px;
425
+ margin: 0;
426
+ font-weight: 600;
427
+ }
428
+ .route > h2::before {
429
+ content: "";
430
+ background: var(--accent);
431
+ width: 4px;
432
+ height: 20px;
433
+ }
434
+ .route > h2 code {
435
+ font: 600 18px var(--mono);
436
+ overflow-wrap: anywhere;
437
+ }
438
+ .state {
439
+ margin: 4px 0 8px;
440
+ }
441
+ .state > h3 {
442
+ font: 11px var(--mono);
443
+ text-transform: uppercase;
444
+ letter-spacing: 0.08em;
445
+ color: var(--muted);
446
+ margin: 0 0 12px;
447
+ }
448
+ .row {
449
+ display: grid;
450
+ gap: 12px;
451
+ grid-template-columns: repeat(auto-fill, minmax(min(100%, 232px), 1fr));
452
+ align-items: start;
453
+ }
454
+ .tile {
455
+ background: var(--surface);
456
+ border: 1px solid var(--line);
457
+ border-radius: var(--radius);
458
+ padding: 10px;
459
+ display: flex;
460
+ flex-direction: column;
461
+ gap: 8px;
462
+ min-width: 0;
463
+ }
464
+ .tile.focus {
465
+ border-color: var(--focus);
466
+ box-shadow: 0 0 0 2px color-mix(in srgb, var(--focus) 20%, transparent);
467
+ }
468
+ .tile.approved {
469
+ border-top: 3px solid var(--ok);
470
+ padding-top: 10px;
471
+ }
472
+ .tile.rejected {
473
+ border-top: 3px solid var(--bad);
474
+ padding-top: 10px;
475
+ }
476
+ .tile .head {
477
+ display: flex;
478
+ justify-content: space-between;
479
+ gap: 8px;
480
+ font: 11px / 1.5 var(--mono);
481
+ color: var(--muted);
482
+ }
483
+ .thumb {
484
+ border: 1px solid var(--line);
485
+ border-radius: 4px;
486
+ overflow: auto;
487
+ height: 220px;
488
+ background: var(--bg);
489
+ }
490
+ .thumb img {
491
+ display: block;
492
+ width: 100%;
493
+ height: auto;
494
+ object-position: top;
495
+ cursor: zoom-in;
496
+ }
497
+ .badges {
498
+ display: flex;
499
+ flex-wrap: wrap;
500
+ gap: 4px;
501
+ min-height: 22px;
502
+ }
503
+ .badge {
504
+ font-size: 11px;
505
+ font-weight: 600;
506
+ padding: 2px 6px;
507
+ border-radius: 4px;
508
+ background: var(--bad-bg);
509
+ color: var(--bad);
510
+ overflow-wrap: anywhere;
511
+ }
512
+ .badge.warn {
513
+ background: var(--warn-bg);
514
+ color: var(--warn);
515
+ }
516
+ .badge.ok {
517
+ background: var(--ok-bg);
518
+ color: var(--ok);
519
+ }
520
+ .crit {
521
+ font-size: 12px;
522
+ border-top: 1px solid var(--line);
523
+ padding-top: 12px;
524
+ overflow-wrap: anywhere;
525
+ }
526
+ .crit ul {
527
+ margin: 8px 0 0;
528
+ padding-left: 16px;
529
+ }
530
+ .crit .sev {
531
+ font-weight: 700;
532
+ text-transform: uppercase;
533
+ font-size: 10px;
534
+ color: var(--muted);
535
+ }
536
+ .actions {
537
+ display: flex;
538
+ gap: 6px;
539
+ }
540
+ .actions button {
541
+ flex: 1;
542
+ padding: 6px 4px;
543
+ font-size: 12px;
544
+ min-width: 0;
545
+ }
546
+ .comparison-status {
547
+ margin: 0;
548
+ color: var(--muted);
549
+ font: 11px / 1.5 var(--mono);
550
+ }
551
+ .tile .comparison-status {
552
+ margin: 0;
553
+ }
554
+ .tile-more {
555
+ font-size: 12px;
556
+ color: var(--muted);
557
+ border-top: 1px solid var(--line);
558
+ padding-top: 4px;
559
+ }
560
+ .tile-more > summary {
561
+ cursor: pointer;
562
+ min-height: 32px;
563
+ padding: 6px 0;
564
+ overflow-wrap: anywhere;
565
+ }
566
+ .diagnostics summary {
567
+ cursor: pointer;
568
+ padding: 6px 0;
569
+ }
570
+ .viewer-note summary {
571
+ cursor: pointer;
572
+ min-height: 32px;
573
+ padding: 8px 0;
574
+ }
575
+ .tile-more[open] > summary {
576
+ color: var(--ink);
577
+ }
578
+ .tile-more > * + * {
579
+ margin-top: 8px;
580
+ }
581
+ .actions .approve[aria-pressed="true"] {
582
+ background: var(--ok);
583
+ border-color: var(--ok);
584
+ color: var(--on-strong);
585
+ }
586
+ .actions .reject[aria-pressed="true"] {
587
+ background: var(--bad);
588
+ border-color: var(--bad);
589
+ color: var(--on-strong);
590
+ }
591
+ textarea {
592
+ width: 100%;
593
+ resize: vertical;
594
+ min-height: 64px;
595
+ background: var(--bg);
596
+ border: 1px solid var(--line);
597
+ border-radius: 4px;
598
+ padding: 10px;
599
+ font-size: 12px;
600
+ }
601
+ .empty {
602
+ padding: 64px 24px;
603
+ text-align: center;
604
+ color: var(--muted);
605
+ }
606
+ .empty h2 {
607
+ color: var(--ink);
608
+ font-size: 24px;
609
+ letter-spacing: -0.5px;
610
+ }
611
+ .keys {
612
+ color: var(--muted);
613
+ font-size: 11px;
614
+ }
615
+ kbd {
616
+ border: 1px solid var(--line);
617
+ border-bottom-width: 2px;
618
+ border-radius: 4px;
619
+ padding: 0 4px;
620
+ font: 10px var(--mono);
621
+ }
622
+ footer {
623
+ display: flex;
624
+ justify-content: space-between;
625
+ gap: 16px;
626
+ border-top: 1px solid var(--line);
627
+ padding: 20px 0;
628
+ color: var(--muted);
629
+ font-size: 11px;
630
+ }
631
+ #cards[aria-busy="true"] ~ footer {
632
+ visibility: hidden;
633
+ }
634
+ #comparison-status {
635
+ min-height: 64px;
636
+ padding: 10px 0;
637
+ margin-bottom: 8px;
638
+ color: var(--muted);
639
+ font-size: 12px;
640
+ display: flex;
641
+ gap: 12px;
642
+ align-items: center;
643
+ flex-wrap: wrap;
644
+ }
645
+ .pagination {
646
+ display: flex;
647
+ align-items: center;
648
+ justify-content: space-between;
649
+ gap: 12px;
650
+ padding: 20px 0;
651
+ border-top: 1px solid var(--line);
652
+ }
653
+ .pagination[hidden] {
654
+ display: none;
655
+ }
656
+ .page-label {
657
+ color: var(--muted);
658
+ font-size: 12px;
659
+ text-align: center;
660
+ }
661
+ #save-status:empty {
662
+ visibility: hidden;
663
+ }
664
+ #save-status {
665
+ position: fixed;
666
+ z-index: 20;
667
+ bottom: 12px;
668
+ left: 236px;
669
+ right: 28px;
670
+ min-height: 44px;
671
+ padding: 8px 12px;
672
+ margin-bottom: 0;
673
+ border: 1px solid var(--line);
674
+ border-radius: var(--radius);
675
+ background: var(--surface);
676
+ font-size: 12px;
677
+ display: flex;
678
+ align-items: center;
679
+ flex-wrap: wrap;
680
+ gap: 12px;
681
+ }
682
+ #save-status.error {
683
+ color: var(--bad);
684
+ border-color: var(--bad);
685
+ background: var(--bad-bg);
686
+ }
687
+ .note-label {
688
+ display: grid;
689
+ gap: 6px;
690
+ font-size: 11px;
691
+ color: var(--muted);
692
+ }
693
+ .inspect {
694
+ width: 100%;
695
+ font-size: 12px;
696
+ min-height: 44px;
697
+ }
698
+ .diagnostics {
699
+ font-size: 12px;
700
+ color: var(--muted);
701
+ overflow-wrap: anywhere;
702
+ }
703
+ .diagnostics ul {
704
+ padding-left: 18px;
705
+ }
706
+ .capture-missing {
707
+ padding: 24px;
708
+ color: var(--muted);
709
+ }
710
+ #lightbox {
711
+ width: calc(100vw - 48px);
712
+ max-width: 1600px;
713
+ height: calc(100vh - 48px);
714
+ max-height: none;
715
+ padding: 0;
716
+ border: 1px solid var(--line);
717
+ border-radius: 12px;
718
+ background: var(--bg);
719
+ color: var(--ink);
720
+ }
721
+ #lightbox::backdrop {
722
+ background: #101510db;
723
+ }
724
+ .viewer-toolbar {
725
+ padding: 16px 24px;
726
+ border-bottom: 1px solid var(--line);
727
+ background: var(--surface);
728
+ display: flex;
729
+ gap: 16px;
730
+ justify-content: space-between;
731
+ align-items: center;
732
+ }
733
+ .viewer-toolbar h2 {
734
+ font: 600 14px var(--mono);
735
+ margin: 0;
736
+ overflow-wrap: anywhere;
737
+ }
738
+ .viewer-toolbar p {
739
+ margin: 4px 0 0;
740
+ color: var(--muted);
741
+ font: 11px var(--mono);
742
+ }
743
+ .viewer-actions {
744
+ display: flex;
745
+ gap: 8px;
746
+ flex-wrap: wrap;
747
+ }
748
+ .viewer-actions .button {
749
+ font-size: 12px;
750
+ text-decoration: none;
751
+ display: inline-flex;
752
+ align-items: center;
753
+ justify-content: center;
754
+ }
755
+ #lightbox[open] {
756
+ display: flex;
757
+ flex-direction: column;
758
+ }
759
+ .viewer-toolbar {
760
+ flex-shrink: 0;
761
+ }
762
+ .viewer-canvas {
763
+ overflow: auto;
764
+ flex: 1;
765
+ min-height: 0;
766
+ padding: 24px;
767
+ }
768
+ #viewer-image {
769
+ display: block;
770
+ max-width: 100%;
771
+ height: auto;
772
+ margin: 0 auto;
773
+ background: #fff;
774
+ }
775
+ #viewer-image.actual {
776
+ max-width: none;
777
+ }
778
+ #viewer-image[hidden] {
779
+ display: none;
780
+ }
781
+ .evidence-frame {
782
+ position: relative;
783
+ width: fit-content;
784
+ max-width: 100%;
785
+ margin: 0 auto;
786
+ }
787
+ .evidence-frame.actual {
788
+ max-width: none;
789
+ }
790
+ #diagnostic-overlay,
791
+ #note-overlay {
792
+ position: absolute;
793
+ inset: 0;
794
+ width: 100%;
795
+ height: 100%;
796
+ pointer-events: none;
797
+ }
798
+ #note-overlay[hidden],
799
+ #diagnostic-overlay[hidden] {
800
+ display: none;
801
+ }
802
+ #diagnostic-overlay rect {
803
+ fill: #efb62c26;
804
+ stroke: #a24c00;
805
+ stroke-width: 2;
806
+ vector-effect: non-scaling-stroke;
807
+ }
808
+ .diagnostic-controls[hidden] {
809
+ display: none;
810
+ }
811
+ .diagnostic-controls {
812
+ display: flex;
813
+ flex-wrap: wrap;
814
+ align-items: center;
815
+ gap: 10px;
816
+ }
817
+ #viewer-error {
818
+ color: var(--bad);
819
+ }
820
+ .viewer-review {
821
+ flex-shrink: 0;
822
+ padding: 12px 24px;
823
+ border-top: 1px solid var(--line);
824
+ background: var(--surface);
825
+ max-height: 42%;
826
+ overflow: auto;
827
+ }
828
+ .viewer-decisions {
829
+ display: flex;
830
+ align-items: center;
831
+ flex-wrap: wrap;
832
+ gap: 8px;
833
+ }
834
+ #viewer-decision {
835
+ font: 600 12px var(--mono);
836
+ margin-right: auto;
837
+ }
838
+ .viewer-decisions [aria-pressed="true"] {
839
+ outline: 2px solid currentColor;
840
+ outline-offset: -4px;
841
+ }
842
+ #viewer-save-status {
843
+ margin: 8px 0 0;
844
+ font-size: 12px;
845
+ color: var(--muted);
846
+ overflow-wrap: anywhere;
847
+ }
848
+ #viewer-save-status.error {
849
+ color: var(--bad);
850
+ }
851
+ .viewer-note {
852
+ margin-top: 8px;
853
+ font-size: 12px;
854
+ }
855
+ .viewer-note .note-label {
856
+ margin: 8px 0;
857
+ }
858
+ #viewer-note-help {
859
+ font-size: 12px;
860
+ line-height: 1.5;
861
+ background: var(--surface);
862
+ }
863
+ #viewer-note {
864
+ width: 100%;
865
+ min-height: 64px;
866
+ resize: vertical;
867
+ padding: 10px;
868
+ color: var(--ink);
869
+ background: var(--bg);
870
+ border: 1px solid var(--line);
871
+ border-radius: 4px;
872
+ font: inherit;
873
+ }
874
+ @media (max-width: 700px) {
875
+ .viewer-review {
876
+ padding: 10px 12px;
877
+ }
878
+ .viewer-decisions .button {
879
+ padding: 8px 10px;
880
+ font-size: 12px;
881
+ }
882
+ }
883
+ .comparison-toolbar {
884
+ padding: 12px 24px;
885
+ border-bottom: 1px solid var(--line);
886
+ display: flex;
887
+ gap: 16px;
888
+ align-items: center;
889
+ flex-wrap: wrap;
890
+ }
891
+ .comparison-toolbar label {
892
+ white-space: nowrap;
893
+ display: flex;
894
+ gap: 8px;
895
+ align-items: center;
896
+ }
897
+ .comparison-toolbar select {
898
+ padding: 8px;
899
+ background: var(--surface);
900
+ border: 1px solid var(--line);
901
+ border-radius: 4px;
902
+ }
903
+ #comparison-context {
904
+ margin: 0;
905
+ color: var(--muted);
906
+ font-size: 12px;
907
+ overflow-wrap: anywhere;
908
+ }
909
+ .viewer-pair {
910
+ display: grid;
911
+ grid-template-columns: minmax(0, 1fr);
912
+ gap: 20px;
913
+ }
914
+ .viewer-pair.split {
915
+ grid-template-columns: repeat(2, minmax(0, 1fr));
916
+ }
917
+ .viewer-pair figure {
918
+ margin: 0;
919
+ min-width: 0;
920
+ }
921
+ .viewer-pair figcaption {
922
+ color: var(--muted);
923
+ margin-bottom: 8px;
924
+ font: 12px var(--mono);
925
+ }
926
+ #baseline-pane[hidden] {
927
+ display: none;
928
+ }
929
+ #baseline-image {
930
+ display: block;
931
+ max-width: 100%;
932
+ height: auto;
933
+ background: #fff;
934
+ }
935
+ #baseline-image.actual {
936
+ max-width: none;
937
+ }
938
+ @media (max-width: 700px) {
939
+ .viewer-pair.split {
940
+ grid-template-columns: minmax(0, 1fr);
941
+ }
942
+ .comparison-toolbar {
943
+ padding: 12px;
944
+ }
945
+ }
946
+ @media (max-width: 700px) {
947
+ #lightbox {
948
+ width: calc(100vw - 16px);
949
+ height: calc(100dvh - 16px);
950
+ }
951
+ .viewer-toolbar {
952
+ padding: 12px;
953
+ flex-direction: column;
954
+ align-items: stretch;
955
+ position: relative;
956
+ }
957
+ .viewer-toolbar > div:first-child {
958
+ padding-right: 70px;
959
+ }
960
+ #viewer-close {
961
+ position: absolute;
962
+ top: 12px;
963
+ right: 12px;
964
+ }
965
+ .viewer-actions {
966
+ gap: 6px;
967
+ }
968
+ .viewer-actions .button {
969
+ padding: 8px 10px;
970
+ }
971
+ .viewer-canvas {
972
+ padding: 12px;
973
+ }
974
+ #save-status {
975
+ left: 12px;
976
+ right: 12px;
977
+ min-height: 44px;
978
+ }
979
+ .toolbar > .field:not(.search-field) {
980
+ flex: 1 1 90px;
981
+ }
982
+ .toolbar > .search-field {
983
+ flex-basis: 100%;
984
+ min-width: 0;
985
+ }
986
+ .filters .button,
987
+ .filters .pill {
988
+ padding: 8px 10px;
989
+ font-size: 11px;
990
+ }
991
+ .brand {
992
+ font-size: 16px;
993
+ gap: 8px;
994
+ }
995
+ }
996
+ @media (max-width: 1000px) {
997
+ #save-status {
998
+ left: 194px;
999
+ right: 24px;
1000
+ }
1001
+ main {
1002
+ padding: 32px 24px 120px;
1003
+ }
1004
+ .workspace {
1005
+ grid-template-columns: 170px minmax(0, 1fr);
1006
+ }
1007
+ .intro {
1008
+ align-items: start;
1009
+ flex-direction: column;
1010
+ }
1011
+ .run-context {
1012
+ text-align: left;
1013
+ max-width: 100%;
1014
+ }
1015
+ .stat {
1016
+ padding: 12px;
1017
+ }
1018
+ }
1019
+ @media (max-width: 700px) {
1020
+ header {
1021
+ height: auto;
1022
+ min-height: 72px;
1023
+ padding: 8px 16px;
1024
+ gap: 12px;
1025
+ flex-wrap: wrap;
1026
+ }
1027
+ .header-label {
1028
+ display: none;
1029
+ }
1030
+ .header-actions .button {
1031
+ padding: 8px 12px;
1032
+ font-size: 12px;
1033
+ }
1034
+ .workspace {
1035
+ display: block;
1036
+ }
1037
+ aside {
1038
+ border-right: 0;
1039
+ border-bottom: 1px solid var(--line);
1040
+ padding: 4px 16px;
1041
+ }
1042
+ .sidebar-sticky {
1043
+ position: static;
1044
+ }
1045
+ aside .eyebrow,
1046
+ .sidebar-note {
1047
+ display: none;
1048
+ }
1049
+ #route-nav {
1050
+ display: flex;
1051
+ overflow-x: auto;
1052
+ margin: 0;
1053
+ }
1054
+ #route-nav a {
1055
+ flex-shrink: 0;
1056
+ gap: 16px;
1057
+ }
1058
+ main {
1059
+ padding: 12px 16px 100px;
1060
+ }
1061
+ h1 {
1062
+ letter-spacing: -1.5px;
1063
+ }
1064
+ .intro {
1065
+ gap: 16px;
1066
+ }
1067
+ .stats {
1068
+ min-height: 82px;
1069
+ grid-template-columns: repeat(5, minmax(0, 1fr));
1070
+ margin-top: 24px;
1071
+ }
1072
+ .stat {
1073
+ padding: 12px 6px;
1074
+ }
1075
+ .stat b {
1076
+ font-size: 24px;
1077
+ }
1078
+ .stat span {
1079
+ font-size: 11px;
1080
+ }
1081
+ .progress-row {
1082
+ margin-bottom: 24px;
1083
+ }
1084
+ .row {
1085
+ grid-template-columns: repeat(auto-fill, minmax(min(100%, 150px), 1fr));
1086
+ gap: 8px;
1087
+ }
1088
+ .thumb {
1089
+ height: 200px;
1090
+ }
1091
+ .keys {
1092
+ display: none;
1093
+ }
1094
+ footer {
1095
+ flex-direction: column;
1096
+ }
1097
+ .intro > div:first-child {
1098
+ position: absolute;
1099
+ width: 1px;
1100
+ height: 1px;
1101
+ overflow: hidden;
1102
+ clip: rect(0 0 0 0);
1103
+ white-space: nowrap;
1104
+ }
1105
+ #runid {
1106
+ display: none;
1107
+ }
1108
+ .stats {
1109
+ margin-top: 12px;
1110
+ min-height: 0;
1111
+ }
1112
+ .stat {
1113
+ padding: 8px 4px;
1114
+ }
1115
+ .stat b {
1116
+ font-size: 20px;
1117
+ }
1118
+ .progress-row {
1119
+ margin-bottom: 12px;
1120
+ }
1121
+ .toolbar {
1122
+ gap: 8px;
1123
+ }
1124
+ .coverage-short {
1125
+ display: inline;
1126
+ }
1127
+ .coverage-long {
1128
+ display: none;
1129
+ }
1130
+ .stats {
1131
+ display: flex;
1132
+ overflow-x: auto;
1133
+ }
1134
+ .stat {
1135
+ flex: 1;
1136
+ flex-direction: row;
1137
+ align-items: center;
1138
+ gap: 4px;
1139
+ padding: 6px;
1140
+ }
1141
+ .stat b {
1142
+ font-size: 16px;
1143
+ }
1144
+ .stat span {
1145
+ font-size: 10px;
1146
+ }
1147
+ #toggle-filters {
1148
+ display: block;
1149
+ flex-shrink: 0;
1150
+ }
1151
+ .toolbar > .search-field {
1152
+ flex: 1;
1153
+ min-width: 0;
1154
+ }
1155
+ .secondary-filters {
1156
+ display: none;
1157
+ width: 100%;
1158
+ gap: 8px;
1159
+ flex-wrap: wrap;
1160
+ }
1161
+ .toolbar[data-expanded="true"] .secondary-filters {
1162
+ display: flex;
1163
+ }
1164
+ .secondary-filters > .field {
1165
+ flex: 1 1 calc(50% - 8px);
1166
+ font-size: 12px;
1167
+ }
1168
+ .secondary-filters .filters {
1169
+ flex-wrap: wrap;
1170
+ width: 100%;
1171
+ }
1172
+ .pagination {
1173
+ padding: 8px 0;
1174
+ }
1175
+ .page-label {
1176
+ max-width: 160px;
1177
+ }
1178
+ #route-nav a {
1179
+ padding: 6px 8px;
1180
+ }
1181
+ .run-context {
1182
+ width: 100%;
1183
+ display: flex;
1184
+ flex-wrap: wrap;
1185
+ gap: 4px 12px;
1186
+ align-items: center;
1187
+ }
1188
+ .run-context label {
1189
+ display: flex;
1190
+ align-items: center;
1191
+ gap: 8px;
1192
+ white-space: nowrap;
1193
+ }
1194
+ #save-status {
1195
+ left: auto;
1196
+ right: 12px;
1197
+ max-width: calc(100vw - 24px);
1198
+ }
1199
+ .toolbar > .field:not(.search-field) {
1200
+ flex: 1 1 calc(50% - 8px);
1201
+ }
1202
+ .toolbar > .field {
1203
+ font-size: 0;
1204
+ gap: 0;
1205
+ }
1206
+ .toolbar > .field select,
1207
+ .toolbar > .field input {
1208
+ font-size: 14px;
1209
+ }
1210
+ .filters > * {
1211
+ flex-shrink: 0;
1212
+ }
1213
+ }
1214
+ @media (min-width: 1001px) {
1215
+ #route-nav {
1216
+ max-height: calc(100dvh - 280px);
1217
+ overflow-y: auto;
1218
+ overscroll-behavior: contain;
1219
+ }
1220
+ }
1221
+ @media (max-width: 700px) {
1222
+ #save-status {
1223
+ left: 12px;
1224
+ right: 12px;
1225
+ }
1226
+ }
1227
+ @media (prefers-reduced-motion: no-preference) {
1228
+ button,
1229
+ a {
1230
+ transition:
1231
+ background 0.15s,
1232
+ border-color 0.15s;
1233
+ }
1234
+ }
1235
+ #coverage {
1236
+ margin-top: 10px;
1237
+ }
1238
+ #coverage-details ul {
1239
+ max-height: 220px;
1240
+ overflow: auto;
1241
+ }
1242
+ #coverage-details pre {
1243
+ white-space: pre-wrap;
1244
+ overflow-wrap: anywhere;
1245
+ }
1246
+ #overlay-image {
1247
+ position: absolute;
1248
+ inset: 0;
1249
+ width: 100%;
1250
+ height: 100%;
1251
+ opacity: 0.5;
1252
+ pointer-events: none;
1253
+ }
1254
+ #overlay-image[hidden],
1255
+ #blend-control[hidden] {
1256
+ display: none;
1257
+ }
1258
+ #blend {
1259
+ width: 100px;
1260
+ }
1261
+ #note-overlay circle {
1262
+ fill: #b34512;
1263
+ stroke: white;
1264
+ stroke-width: 2;
1265
+ vector-effect: non-scaling-stroke;
1266
+ }
1267
+ .viewer-note fieldset {
1268
+ display: flex;
1269
+ flex-wrap: wrap;
1270
+ gap: 12px;
1271
+ }
1272
+ .viewer-note fieldset label {
1273
+ max-width: 140px;
1274
+ }
1275
+ #anchor-status {
1276
+ font-size: 12px;
1277
+ margin: 6px 0;
1278
+ }
1279
+ @media (min-width: 1001px) {
1280
+ .intro .subtitle {
1281
+ display: none;
1282
+ }
1283
+ }
1284
+ @media (min-width: 1001px) {
1285
+ .run-context label {
1286
+ display: flex;
1287
+ gap: 8px;
1288
+ align-items: center;
1289
+ white-space: nowrap;
1290
+ }
1291
+ .run-context select {
1292
+ min-width: 0;
1293
+ }
1294
+ .run-context {
1295
+ max-width: 420px;
1296
+ }
1297
+ #runid {
1298
+ display: inline;
1299
+ margin-left: 8px;
1300
+ }
1301
+ .stats {
1302
+ min-height: 44px;
1303
+ }
1304
+ .stat {
1305
+ flex-direction: row;
1306
+ align-items: center;
1307
+ padding: 8px 12px;
1308
+ gap: 8px;
1309
+ }
1310
+ .stat b {
1311
+ font-size: 20px;
1312
+ }
1313
+ }