bugpatrol 0.1.3 → 0.1.5

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.
package/src/ui/style.css CHANGED
@@ -17,123 +17,352 @@
17
17
  }
18
18
  @media (prefers-color-scheme: light) {
19
19
  :root {
20
- --bg: #f6f7f9; --panel: #fff; --panel-2: #f0f2f6; --line: #dfe3ea;
21
- --fg: #14171c; --muted: #5b6270; --accent: #2b59d8;
22
- --gh-open: #237a36; --gh-merged: #7042b8; --gh-closed: #b73535;
20
+ --bg: #f6f7f9;
21
+ --panel: #fff;
22
+ --panel-2: #f0f2f6;
23
+ --line: #dfe3ea;
24
+ --fg: #14171c;
25
+ --muted: #5b6270;
26
+ --accent: #2b59d8;
27
+ --gh-open: #237a36;
28
+ --gh-merged: #7042b8;
29
+ --gh-closed: #b73535;
23
30
  }
24
31
  }
25
32
 
26
- * { box-sizing: border-box; }
27
- html, body { height: 100%; }
33
+ * {
34
+ box-sizing: border-box;
35
+ }
36
+ html,
37
+ body {
38
+ height: 100%;
39
+ }
28
40
  body {
29
41
  margin: 0;
30
42
  background: var(--bg);
31
43
  color: var(--fg);
32
- font: 14px/1.55 ui-sans-serif, system-ui, -apple-system, sans-serif;
44
+ font:
45
+ 14px / 1.55 ui-sans-serif,
46
+ system-ui,
47
+ -apple-system,
48
+ sans-serif;
49
+ }
50
+ button {
51
+ font: inherit;
52
+ color: inherit;
53
+ cursor: pointer;
33
54
  }
34
- button { font: inherit; color: inherit; cursor: pointer; }
35
55
 
36
56
  /* ---------- top bar ---------- */
37
57
  .topbar {
38
- display: flex; align-items: center; gap: 1.25rem;
39
- padding: .6rem 1rem; border-bottom: 1px solid var(--line);
40
- background: var(--panel); position: sticky; top: 0; z-index: 20;
58
+ display: flex;
59
+ align-items: center;
60
+ gap: 1.25rem;
61
+ padding: 0.6rem 1rem;
62
+ border-bottom: 1px solid var(--line);
63
+ background: var(--panel);
64
+ position: sticky;
65
+ top: 0;
66
+ z-index: 20;
67
+ }
68
+ .brand {
69
+ display: flex;
70
+ align-items: center;
71
+ gap: 0.5rem;
72
+ }
73
+ .mark {
74
+ width: 12px;
75
+ height: 12px;
76
+ border-radius: 3px;
77
+ background: var(--accent);
78
+ }
79
+ .tabs {
80
+ display: flex;
81
+ gap: 0.25rem;
41
82
  }
42
- .brand { display: flex; align-items: center; gap: .5rem; }
43
- .mark { width: 12px; height: 12px; border-radius: 3px; background: var(--accent); }
44
- .tabs { display: flex; gap: .25rem; }
45
83
  .tabs button {
46
- background: transparent; border: 1px solid transparent; border-radius: 6px;
47
- padding: .3rem .7rem; color: var(--muted);
84
+ background: transparent;
85
+ border: 1px solid transparent;
86
+ border-radius: 6px;
87
+ padding: 0.3rem 0.7rem;
88
+ color: var(--muted);
89
+ }
90
+ .tabs button:hover {
91
+ color: var(--fg);
92
+ }
93
+ .tabs button.active {
94
+ background: var(--panel-2);
95
+ border-color: var(--line);
96
+ color: var(--fg);
97
+ }
98
+ .status {
99
+ margin-left: auto;
100
+ display: flex;
101
+ align-items: center;
102
+ gap: 0.75rem;
103
+ font-size: 0.8rem;
48
104
  }
49
- .tabs button:hover { color: var(--fg); }
50
- .tabs button.active { background: var(--panel-2); border-color: var(--line); color: var(--fg); }
51
- .status { margin-left: auto; display: flex; align-items: center; gap: .75rem; font-size: .8rem; }
52
105
  .live {
53
- display: inline-flex; align-items: center; gap: .35rem;
54
- color: var(--ok); font-size: .72rem; text-transform: uppercase; letter-spacing: .04em;
106
+ display: inline-flex;
107
+ align-items: center;
108
+ gap: 0.35rem;
109
+ color: var(--ok);
110
+ font-size: 0.72rem;
111
+ text-transform: uppercase;
112
+ letter-spacing: 0.04em;
113
+ }
114
+ .live::before {
115
+ content: "";
116
+ width: 7px;
117
+ height: 7px;
118
+ border-radius: 50%;
119
+ background: var(--ok);
120
+ }
121
+ .live.stale {
122
+ color: var(--muted);
123
+ }
124
+ .live.stale::before {
125
+ background: var(--muted);
126
+ }
127
+ .muted {
128
+ color: var(--muted);
55
129
  }
56
- .live::before { content: ""; width: 7px; height: 7px; border-radius: 50%; background: var(--ok); }
57
- .live.stale { color: var(--muted); }
58
- .live.stale::before { background: var(--muted); }
59
- .muted { color: var(--muted); }
60
130
 
61
- main { padding: 1rem; }
131
+ main {
132
+ padding: 1rem;
133
+ }
62
134
 
63
135
  /* ---------- generic ---------- */
64
- .empty { color: var(--muted); padding: 3rem 1rem; text-align: center; }
65
- .empty code { background: var(--panel-2); padding: .15rem .4rem; border-radius: 4px; }
66
- .card { background: var(--panel); border: 1px solid var(--line); border-radius: 10px; }
67
- h2 { font-size: .95rem; margin: 0 0 .6rem; }
68
- h3 { font-size: .85rem; margin: 0 0 .4rem; }
69
- code, .mono { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: .82em; }
136
+ .empty {
137
+ color: var(--muted);
138
+ padding: 3rem 1rem;
139
+ text-align: center;
140
+ }
141
+ .empty code {
142
+ background: var(--panel-2);
143
+ padding: 0.15rem 0.4rem;
144
+ border-radius: 4px;
145
+ }
146
+ .card {
147
+ background: var(--panel);
148
+ border: 1px solid var(--line);
149
+ border-radius: 10px;
150
+ }
151
+ h2 {
152
+ font-size: 0.95rem;
153
+ margin: 0 0 0.6rem;
154
+ }
155
+ h3 {
156
+ font-size: 0.85rem;
157
+ margin: 0 0 0.4rem;
158
+ }
159
+ code,
160
+ .mono {
161
+ font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
162
+ font-size: 0.82em;
163
+ }
70
164
 
71
165
  .badge {
72
- display: inline-block; padding: .08rem .45rem; border-radius: 999px;
73
- font-size: .7rem; font-weight: 600; letter-spacing: .02em;
74
- }
75
- .badge.fail { background: var(--critical); color: #fff; }
76
- .badge.pass { background: var(--ok); color: #05270d; }
77
- .badge.warn { background: var(--major); color: #2a1600; }
78
- .badge.info { background: var(--panel-2); color: var(--muted); border: 1px solid var(--line); }
79
- .gh-chip { display: inline-flex; flex: none; align-items: center; border: 1px solid currentColor;
80
- border-radius: 999px; padding: .08rem .45rem; font-size: .7rem; text-decoration: none;
81
- white-space: nowrap; color: var(--muted); }
82
- .gh-chip:hover { text-decoration: underline; }
83
- .gh-open { color: var(--gh-open); }
84
- .gh-merged { color: var(--gh-merged); }
85
- .gh-closed { color: var(--gh-closed); }
86
- .gh-chip.ci-failed, .gh-chip.ci-gave-up { color: var(--gh-closed); }
87
- .github-summary { font-size: .8rem; margin-bottom: .75rem; }
166
+ display: inline-block;
167
+ padding: 0.08rem 0.45rem;
168
+ border-radius: 999px;
169
+ font-size: 0.7rem;
170
+ font-weight: 600;
171
+ letter-spacing: 0.02em;
172
+ }
173
+ .badge.fail {
174
+ background: var(--critical);
175
+ color: #fff;
176
+ }
177
+ .badge.pass {
178
+ background: var(--ok);
179
+ color: #05270d;
180
+ }
181
+ .badge.warn {
182
+ background: var(--major);
183
+ color: #2a1600;
184
+ }
185
+ .badge.info {
186
+ background: var(--panel-2);
187
+ color: var(--muted);
188
+ border: 1px solid var(--line);
189
+ }
190
+ .gh-chip {
191
+ display: inline-flex;
192
+ flex: none;
193
+ align-items: center;
194
+ border: 1px solid currentColor;
195
+ border-radius: 999px;
196
+ padding: 0.08rem 0.45rem;
197
+ font-size: 0.7rem;
198
+ text-decoration: none;
199
+ white-space: nowrap;
200
+ color: var(--muted);
201
+ }
202
+ .gh-chip:hover {
203
+ text-decoration: underline;
204
+ }
205
+ .gh-open {
206
+ color: var(--gh-open);
207
+ }
208
+ .gh-merged {
209
+ color: var(--gh-merged);
210
+ }
211
+ .gh-closed {
212
+ color: var(--gh-closed);
213
+ }
214
+ .gh-chip.ci-failed,
215
+ .gh-chip.ci-gave-up {
216
+ color: var(--gh-closed);
217
+ }
218
+ .github-summary {
219
+ font-size: 0.8rem;
220
+ margin-bottom: 0.75rem;
221
+ }
88
222
 
89
- .sev-critical { --sev: var(--critical); }
90
- .sev-major { --sev: var(--major); }
91
- .sev-minor { --sev: var(--minor); }
92
- .sev-cosmetic { --sev: var(--cosmetic); }
223
+ .sev-critical {
224
+ --sev: var(--critical);
225
+ }
226
+ .sev-major {
227
+ --sev: var(--major);
228
+ }
229
+ .sev-minor {
230
+ --sev: var(--minor);
231
+ }
232
+ .sev-cosmetic {
233
+ --sev: var(--cosmetic);
234
+ }
93
235
 
94
236
  /* ---------- runs list ---------- */
95
- .layout { display: grid; grid-template-columns: 300px 1fr; gap: 1rem; align-items: start; }
96
- @media (max-width: 900px) { .layout { grid-template-columns: 1fr; } }
237
+ .layout {
238
+ display: grid;
239
+ grid-template-columns: 300px 1fr;
240
+ gap: 1rem;
241
+ align-items: start;
242
+ }
243
+ @media (max-width: 900px) {
244
+ .layout {
245
+ grid-template-columns: 1fr;
246
+ }
247
+ }
97
248
 
98
- .runlist { padding: .4rem; max-height: calc(100vh - 6rem); overflow: auto; }
249
+ .runlist {
250
+ padding: 0.4rem;
251
+ max-height: calc(100vh - 6rem);
252
+ overflow: auto;
253
+ }
99
254
  .runitem {
100
- display: block; width: 100%; text-align: left; background: transparent;
101
- border: 1px solid transparent; border-radius: 8px; padding: .55rem .6rem; margin-bottom: .2rem;
255
+ display: block;
256
+ width: 100%;
257
+ text-align: left;
258
+ background: transparent;
259
+ border: 1px solid transparent;
260
+ border-radius: 8px;
261
+ padding: 0.55rem 0.6rem;
262
+ margin-bottom: 0.2rem;
263
+ }
264
+ .runitem:hover {
265
+ background: var(--panel-2);
266
+ }
267
+ .runitem.active {
268
+ background: var(--panel-2);
269
+ border-color: var(--accent);
270
+ }
271
+ .runitem .row {
272
+ display: flex;
273
+ align-items: center;
274
+ gap: 0.4rem;
275
+ }
276
+ .runitem .when {
277
+ color: var(--muted);
278
+ font-size: 0.75rem;
279
+ margin-top: 0.15rem;
102
280
  }
103
- .runitem:hover { background: var(--panel-2); }
104
- .runitem.active { background: var(--panel-2); border-color: var(--accent); }
105
- .runitem .row { display: flex; align-items: center; gap: .4rem; }
106
- .runitem .when { color: var(--muted); font-size: .75rem; margin-top: .15rem; }
107
281
 
108
282
  /* ---------- run detail ---------- */
109
- .detail { padding: 1rem 1.1rem; }
110
- .kv { display: flex; flex-wrap: wrap; gap: .4rem 1.25rem; color: var(--muted); font-size: .8rem; margin-bottom: .9rem; }
283
+ .detail {
284
+ padding: 1rem 1.1rem;
285
+ }
286
+ .kv {
287
+ display: flex;
288
+ flex-wrap: wrap;
289
+ gap: 0.4rem 1.25rem;
290
+ color: var(--muted);
291
+ font-size: 0.8rem;
292
+ margin-bottom: 0.9rem;
293
+ }
111
294
  .notes {
112
295
  margin: 0 0 1rem;
113
- padding: .6rem .8rem;
296
+ padding: 0.6rem 0.8rem;
114
297
  background: var(--panel-2);
115
298
  border-left: 3px solid var(--accent);
116
299
  border-radius: 0 6px 6px 0;
117
300
  }
118
- .notes p { margin: .2rem 0; font-size: .82rem; color: var(--muted); }
301
+ .notes p {
302
+ margin: 0.2rem 0;
303
+ font-size: 0.82rem;
304
+ color: var(--muted);
305
+ }
119
306
 
120
- .screen { border-top: 1px solid var(--line); padding: 1rem 0; }
121
- .screen:first-of-type { border-top: 0; }
122
- .screen-head { display: flex; align-items: baseline; gap: .6rem; flex-wrap: wrap; margin-bottom: .6rem; }
123
- .screen-head .vp { color: var(--muted); font-size: .78rem; }
307
+ .screen {
308
+ border-top: 1px solid var(--line);
309
+ padding: 1rem 0;
310
+ }
311
+ .screen:first-of-type {
312
+ border-top: 0;
313
+ }
314
+ .screen-head {
315
+ display: flex;
316
+ align-items: baseline;
317
+ gap: 0.6rem;
318
+ flex-wrap: wrap;
319
+ margin-bottom: 0.6rem;
320
+ }
321
+ .screen-head .vp {
322
+ color: var(--muted);
323
+ font-size: 0.78rem;
324
+ }
124
325
 
125
- .shots { display: grid; grid-template-columns: repeat(3, 1fr); gap: .5rem; margin: .5rem 0 .8rem; }
126
- .shots figure { margin: 0; }
326
+ .shots {
327
+ display: grid;
328
+ grid-template-columns: repeat(3, 1fr);
329
+ gap: 0.5rem;
330
+ margin: 0.5rem 0 0.8rem;
331
+ }
332
+ .shots figure {
333
+ margin: 0;
334
+ }
127
335
  .shots img {
128
- width: 100%; display: block; border: 1px solid var(--line); border-radius: 6px;
129
- background: var(--panel-2); cursor: zoom-in; max-height: 260px; object-fit: cover; object-position: top;
336
+ width: 100%;
337
+ display: block;
338
+ border: 1px solid var(--line);
339
+ border-radius: 6px;
340
+ background: var(--panel-2);
341
+ cursor: zoom-in;
342
+ max-height: 260px;
343
+ object-fit: cover;
344
+ object-position: top;
345
+ }
346
+ .shots figcaption {
347
+ color: var(--muted);
348
+ font-size: 0.72rem;
349
+ text-align: center;
350
+ margin-top: 0.25rem;
130
351
  }
131
- .shots figcaption { color: var(--muted); font-size: .72rem; text-align: center; margin-top: .25rem; }
132
352
 
133
- .checks { display: flex; flex-wrap: wrap; gap: .3rem; margin: .5rem 0; }
353
+ .checks {
354
+ display: flex;
355
+ flex-wrap: wrap;
356
+ gap: 0.3rem;
357
+ margin: 0.5rem 0;
358
+ }
134
359
  .chk {
135
- font-size: .72rem; padding: .1rem .45rem; border-radius: 4px;
136
- border: 1px solid var(--line); color: var(--muted); background: var(--panel-2);
360
+ font-size: 0.72rem;
361
+ padding: 0.1rem 0.45rem;
362
+ border-radius: 4px;
363
+ border: 1px solid var(--line);
364
+ color: var(--muted);
365
+ background: var(--panel-2);
137
366
  }
138
367
  .chk.fired {
139
368
  border-color: var(--sev, var(--major));
@@ -142,106 +371,327 @@ code, .mono { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-
142
371
  }
143
372
 
144
373
  .finding {
145
- border-left: 3px solid var(--sev, var(--line)); background: var(--panel-2);
146
- border-radius: 0 8px 8px 0; padding: .6rem .8rem; margin: .45rem 0;
374
+ border-left: 3px solid var(--sev, var(--line));
375
+ background: var(--panel-2);
376
+ border-radius: 0 8px 8px 0;
377
+ padding: 0.6rem 0.8rem;
378
+ margin: 0.45rem 0;
379
+ }
380
+ .finding .why {
381
+ color: var(--muted);
382
+ font-size: 0.78rem;
383
+ margin-top: 0.3rem;
384
+ }
385
+ .finding .meta {
386
+ color: var(--muted);
387
+ font-size: 0.72rem;
388
+ margin-top: 0.25rem;
147
389
  }
148
- .finding .why { color: var(--muted); font-size: .78rem; margin-top: .3rem; }
149
- .finding .meta { color: var(--muted); font-size: .72rem; margin-top: .25rem; }
150
390
 
151
- .reasoning { margin-top: .6rem; }
152
- .reasoning summary { cursor: pointer; color: var(--muted); font-size: .78rem; }
153
- .reasoning table { width: 100%; border-collapse: collapse; margin-top: .4rem; font-size: .78rem; }
154
- .reasoning td { padding: .2rem .4rem; border-bottom: 1px solid var(--line); vertical-align: top; }
155
- .reasoning td:first-child { color: var(--muted); white-space: nowrap; width: 1%; }
391
+ .reasoning {
392
+ margin-top: 0.6rem;
393
+ }
394
+ .reasoning summary {
395
+ cursor: pointer;
396
+ color: var(--muted);
397
+ font-size: 0.78rem;
398
+ }
399
+ .reasoning table {
400
+ width: 100%;
401
+ border-collapse: collapse;
402
+ margin-top: 0.4rem;
403
+ font-size: 0.78rem;
404
+ }
405
+ .reasoning td {
406
+ padding: 0.2rem 0.4rem;
407
+ border-bottom: 1px solid var(--line);
408
+ vertical-align: top;
409
+ }
410
+ .reasoning td:first-child {
411
+ color: var(--muted);
412
+ white-space: nowrap;
413
+ width: 1%;
414
+ }
156
415
 
157
416
  /* ---------- lightbox ---------- */
158
417
  .lightbox {
159
- position: fixed; inset: 0; background: rgba(0,0,0,.85); z-index: 50;
160
- display: flex; flex-direction: column; align-items: center; justify-content: center; gap: .75rem; padding: 2rem;
418
+ position: fixed;
419
+ inset: 0;
420
+ background: rgba(0, 0, 0, 0.85);
421
+ z-index: 50;
422
+ display: flex;
423
+ flex-direction: column;
424
+ align-items: center;
425
+ justify-content: center;
426
+ gap: 0.75rem;
427
+ padding: 2rem;
161
428
  }
162
429
  /* `display: flex` above outranks the UA rule for [hidden], so without this the
163
430
  closed lightbox stays a full-screen transparent overlay that swallows every
164
431
  click -- the "the button does nothing" bug, in our own UI. */
165
- .lightbox[hidden] { display: none; }
166
- .lightbox img { max-width: 95vw; max-height: 85vh; object-fit: contain; border-radius: 6px; }
167
- .lightbox p { color: #ddd; font-size: .8rem; margin: 0; }
432
+ .lightbox[hidden] {
433
+ display: none;
434
+ }
435
+ .lightbox img {
436
+ max-width: 95vw;
437
+ max-height: 85vh;
438
+ object-fit: contain;
439
+ border-radius: 6px;
440
+ }
441
+ .lightbox p {
442
+ color: #ddd;
443
+ font-size: 0.8rem;
444
+ margin: 0;
445
+ }
168
446
  .lightbox-close {
169
- position: absolute; top: 1rem; right: 1.25rem; background: transparent;
170
- border: 0; color: #fff; font-size: 2rem; line-height: 1;
447
+ position: absolute;
448
+ top: 1rem;
449
+ right: 1.25rem;
450
+ background: transparent;
451
+ border: 0;
452
+ color: #fff;
453
+ font-size: 2rem;
454
+ line-height: 1;
171
455
  }
172
456
 
173
457
  /* ---------- live run banner ---------- */
174
458
  .runbanner {
175
- display: flex; align-items: center; gap: .6rem; margin-bottom: .75rem;
176
- padding: .5rem .75rem; border-radius: 8px; font-size: .82rem;
459
+ display: flex;
460
+ align-items: center;
461
+ gap: 0.6rem;
462
+ margin-bottom: 0.75rem;
463
+ padding: 0.5rem 0.75rem;
464
+ border-radius: 8px;
465
+ font-size: 0.82rem;
177
466
  background: color-mix(in srgb, var(--accent) 14%, transparent);
178
467
  border: 1px solid color-mix(in srgb, var(--accent) 40%, transparent);
179
468
  }
180
469
  .spinner {
181
- width: 11px; height: 11px; border-radius: 50%; flex: none;
470
+ width: 11px;
471
+ height: 11px;
472
+ border-radius: 50%;
473
+ flex: none;
182
474
  border: 2px solid color-mix(in srgb, var(--accent) 35%, transparent);
183
- border-top-color: var(--accent); animation: spin .8s linear infinite;
475
+ border-top-color: var(--accent);
476
+ animation: spin 0.8s linear infinite;
477
+ }
478
+ @keyframes spin {
479
+ to {
480
+ transform: rotate(360deg);
481
+ }
482
+ }
483
+ @media (prefers-reduced-motion: reduce) {
484
+ .spinner {
485
+ animation: none;
486
+ }
184
487
  }
185
- @keyframes spin { to { transform: rotate(360deg); } }
186
- @media (prefers-reduced-motion: reduce) { .spinner { animation: none; } }
187
488
 
188
489
  /* ---------- grouped findings ---------- */
189
- .finding .members { margin-top: .35rem; }
190
- .finding .members summary { cursor: pointer; color: var(--muted); font-size: .75rem; }
191
- .finding .members ul { margin: .35rem 0 0; padding-left: 1.1rem; max-height: 220px; overflow: auto; }
192
- .finding .members li { font-size: .72rem; color: var(--muted); margin: .1rem 0; }
490
+ .finding .members {
491
+ margin-top: 0.35rem;
492
+ }
493
+ .finding .members summary {
494
+ cursor: pointer;
495
+ color: var(--muted);
496
+ font-size: 0.75rem;
497
+ }
498
+ .finding .members ul {
499
+ margin: 0.35rem 0 0;
500
+ padding-left: 1.1rem;
501
+ max-height: 220px;
502
+ overflow: auto;
503
+ }
504
+ .finding .members li {
505
+ font-size: 0.72rem;
506
+ color: var(--muted);
507
+ margin: 0.1rem 0;
508
+ }
193
509
 
194
510
  /* Agent views keep the same visual hierarchy in light and dark schemes. */
195
- :root { --cosmetic: #8e949d; }
196
- main { max-width: 1600px; margin: auto; padding: 1.25rem; }
197
- h1 { font-size: 1.35rem; line-height: 1.25; margin: 0; }
198
- .topbar { min-height: 56px; }
199
- .status { white-space: nowrap; }
200
- .pill { border: 1px solid var(--line); border-radius: 999px; padding: .15rem .6rem; color: var(--muted); }
201
- .pill.running { color: var(--accent); border-color: var(--accent); }
202
- .live { font-size: 0; }
203
- .live::before { background: var(--muted); }
204
- .live.working::before { background: var(--ok); animation: pulse 1.5s infinite; }
205
- @keyframes pulse { 50% { opacity: .3; } }
206
- @media (prefers-reduced-motion: reduce) { .live.working::before, .state-dot.working { animation: none; } }
207
- .agent-grid { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: .85rem; margin-bottom: .85rem; }
208
- .agent-card, .panel { padding: 1rem; }
209
- .agent-card p { margin: .75rem 0; min-height: 1.4em; }
210
- .agent-head, .section-title, .detail-heading { display: flex; align-items: center; gap: .55rem; }
211
- .agent-head .state-dot { margin-left: auto; }
212
- .role-icon { display: inline-flex; width: 18px; height: 18px; flex: none; color: var(--accent); }
213
- .role-icon svg { width: 100%; height: 100%; }
214
- .state-dot { width: 8px; height: 8px; border-radius: 50%; background: var(--muted); }
215
- .state-dot.working { background: var(--accent); animation: pulse 1.5s infinite; }
216
- .state-dot.idle, .state-dot.waiting { background: var(--ok); }
217
- .state-dot.failed { background: var(--critical); }
218
- .section-title { justify-content: space-between; margin-bottom: .75rem; }
219
- .section-title h2 { margin: 0; font-size: 1rem; }
220
- .overview-grid { display: grid; grid-template-columns: minmax(0, 1.6fr) minmax(300px, 1fr); gap: .85rem; }
221
- .coverage { margin-top: .85rem; }
222
- .usage { margin-top: .85rem; overflow-x: auto; }
223
- .usage-table { width: 100%; border-collapse: collapse; font-size: .82rem; }
224
- .usage-table th { text-align: left; font-weight: 600; color: var(--muted, #64748b); padding: .35rem .5rem; border-bottom: 1px solid var(--line, #e2e8f0); }
225
- .usage-table td { padding: .35rem .5rem; border-bottom: 1px solid var(--line, #e2e8f0); font-variant-numeric: tabular-nums; }
226
- .session-usage { margin: .35rem 0 .6rem; font-size: .8rem; }
227
- .token-chip { white-space: nowrap; font-variant-numeric: tabular-nums; }
228
- .stack, .event-list { display: flex; flex-direction: column; }
229
- .attention-row, .list-row {
511
+ :root {
512
+ --cosmetic: #8e949d;
513
+ }
514
+ main {
515
+ max-width: 1600px;
516
+ margin: auto;
517
+ padding: 1.25rem;
518
+ }
519
+ h1 {
520
+ font-size: 1.35rem;
521
+ line-height: 1.25;
522
+ margin: 0;
523
+ }
524
+ .topbar {
525
+ min-height: 56px;
526
+ }
527
+ .status {
528
+ white-space: nowrap;
529
+ }
530
+ .pill {
531
+ border: 1px solid var(--line);
532
+ border-radius: 999px;
533
+ padding: 0.15rem 0.6rem;
534
+ color: var(--muted);
535
+ }
536
+ .pill.running {
537
+ color: var(--accent);
538
+ border-color: var(--accent);
539
+ }
540
+ .live {
541
+ font-size: 0;
542
+ }
543
+ .live::before {
544
+ background: var(--muted);
545
+ }
546
+ .live.working::before {
547
+ background: var(--ok);
548
+ animation: pulse 1.5s infinite;
549
+ }
550
+ @keyframes pulse {
551
+ 50% {
552
+ opacity: 0.3;
553
+ }
554
+ }
555
+ @media (prefers-reduced-motion: reduce) {
556
+ .live.working::before,
557
+ .state-dot.working {
558
+ animation: none;
559
+ }
560
+ }
561
+ .agent-grid {
562
+ display: grid;
563
+ grid-template-columns: repeat(3, minmax(0, 1fr));
564
+ gap: 0.85rem;
565
+ margin-bottom: 0.85rem;
566
+ }
567
+ .agent-card,
568
+ .panel {
569
+ padding: 1rem;
570
+ }
571
+ .agent-card p {
572
+ margin: 0.75rem 0;
573
+ min-height: 1.4em;
574
+ }
575
+ .agent-head,
576
+ .section-title,
577
+ .detail-heading {
578
+ display: flex;
579
+ align-items: center;
580
+ gap: 0.55rem;
581
+ }
582
+ .agent-head .state-dot {
583
+ margin-left: auto;
584
+ }
585
+ .role-icon {
586
+ display: inline-flex;
587
+ width: 18px;
588
+ height: 18px;
589
+ flex: none;
590
+ color: var(--accent);
591
+ }
592
+ .role-icon svg {
593
+ width: 100%;
594
+ height: 100%;
595
+ }
596
+ .state-dot {
597
+ width: 8px;
598
+ height: 8px;
599
+ border-radius: 50%;
600
+ background: var(--muted);
601
+ }
602
+ .state-dot.working {
603
+ background: var(--accent);
604
+ animation: pulse 1.5s infinite;
605
+ }
606
+ .state-dot.idle,
607
+ .state-dot.waiting {
608
+ background: var(--ok);
609
+ }
610
+ .state-dot.failed {
611
+ background: var(--critical);
612
+ }
613
+ .section-title {
614
+ justify-content: space-between;
615
+ margin-bottom: 0.75rem;
616
+ }
617
+ .section-title h2 {
618
+ margin: 0;
619
+ font-size: 1rem;
620
+ }
621
+ .overview-grid {
622
+ display: grid;
623
+ grid-template-columns: minmax(0, 1.6fr) minmax(300px, 1fr);
624
+ gap: 0.85rem;
625
+ }
626
+ .coverage {
627
+ margin-top: 0.85rem;
628
+ }
629
+ .usage {
630
+ margin-top: 0.85rem;
631
+ overflow-x: auto;
632
+ }
633
+ .usage-table {
634
+ width: 100%;
635
+ border-collapse: collapse;
636
+ font-size: 0.82rem;
637
+ }
638
+ .usage-table th {
639
+ text-align: left;
640
+ font-weight: 600;
641
+ color: var(--muted, #64748b);
642
+ padding: 0.35rem 0.5rem;
643
+ border-bottom: 1px solid var(--line, #e2e8f0);
644
+ }
645
+ .usage-table td {
646
+ padding: 0.35rem 0.5rem;
647
+ border-bottom: 1px solid var(--line, #e2e8f0);
648
+ font-variant-numeric: tabular-nums;
649
+ }
650
+ .session-usage {
651
+ margin: 0.35rem 0 0.6rem;
652
+ font-size: 0.8rem;
653
+ }
654
+ .token-chip {
655
+ white-space: nowrap;
656
+ font-variant-numeric: tabular-nums;
657
+ }
658
+ .stack,
659
+ .event-list {
660
+ display: flex;
661
+ flex-direction: column;
662
+ }
663
+ .attention-row,
664
+ .list-row {
230
665
  display: flex;
231
666
  align-items: center;
232
667
  width: 100%;
233
- gap: .7rem;
668
+ gap: 0.7rem;
234
669
  text-align: left;
235
670
  background: transparent;
236
671
  border: 0;
237
672
  border-top: 1px solid var(--line);
238
- padding: .65rem .2rem;
673
+ padding: 0.65rem 0.2rem;
674
+ }
675
+ .attention-row:hover,
676
+ .list-row:hover,
677
+ .list-row.active {
678
+ background: var(--panel-2);
679
+ }
680
+ .grow {
681
+ flex: 1;
682
+ min-width: 0;
683
+ }
684
+ .attention-row strong,
685
+ .list-row strong {
686
+ display: block;
687
+ font-weight: 600;
688
+ }
689
+ .attention-row small,
690
+ .list-row small {
691
+ display: block;
239
692
  }
240
- .attention-row:hover, .list-row:hover, .list-row.active { background: var(--panel-2); }
241
- .grow { flex: 1; min-width: 0; }
242
- .attention-row strong, .list-row strong { display: block; font-weight: 600; }
243
- .attention-row small, .list-row small { display: block; }
244
- .thumb, .event-thumb {
693
+ .thumb,
694
+ .event-thumb {
245
695
  width: 48px;
246
696
  height: 42px;
247
697
  border-radius: 5px;
@@ -251,33 +701,101 @@ h1 { font-size: 1.35rem; line-height: 1.25; margin: 0; }
251
701
  }
252
702
  .severity {
253
703
  border-radius: 999px;
254
- padding: .12rem .5rem;
255
- font-size: .72rem;
704
+ padding: 0.12rem 0.5rem;
705
+ font-size: 0.72rem;
256
706
  font-weight: 650;
257
707
  text-transform: capitalize;
258
708
  white-space: nowrap;
259
709
  }
260
- .severity-critical { background: #b93038; color: white; }
261
- .severity-major { background: #ae551c; color: white; }
262
- .severity-minor { background: #f0d36a; color: #302600; }
263
- .severity-cosmetic { background: #737983; color: white; }
264
- .live-shot { width: 100%; height: 230px; object-fit: contain; background: var(--panel-2); border-radius: 6px; }
265
- .image-empty { background: var(--panel-2); color: var(--muted); display: grid; place-items: center; }
710
+ .severity-critical {
711
+ background: #b93038;
712
+ color: white;
713
+ }
714
+ .severity-major {
715
+ background: #ae551c;
716
+ color: white;
717
+ }
718
+ .severity-minor {
719
+ background: #f0d36a;
720
+ color: #302600;
721
+ }
722
+ .severity-cosmetic {
723
+ background: #737983;
724
+ color: white;
725
+ }
726
+ .live-shot {
727
+ width: 100%;
728
+ height: 230px;
729
+ object-fit: contain;
730
+ background: var(--panel-2);
731
+ border-radius: 6px;
732
+ }
733
+ .image-empty {
734
+ background: var(--panel-2);
735
+ color: var(--muted);
736
+ display: grid;
737
+ place-items: center;
738
+ }
266
739
  .event-row {
267
740
  display: flex;
268
741
  align-items: center;
269
- gap: .5rem;
742
+ gap: 0.5rem;
270
743
  border-top: 1px solid var(--line);
271
- padding: .4rem 0;
744
+ padding: 0.4rem 0;
272
745
  min-width: 0;
273
746
  }
274
- .event-row time { color: var(--muted); font-size: .75rem; white-space: nowrap; }
275
- .event-row details { flex: none; font-size: .75rem; }
276
- .event-row details[open] { max-width: 45%; }
277
- .event-row pre { white-space: pre-wrap; overflow-wrap: anywhere; }
278
- .truncate { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
279
- .quiet { color: var(--muted); }
280
- .coverage-row { display: flex; gap: .65rem; overflow-x: auto; }
747
+ .event-row time {
748
+ color: var(--muted);
749
+ font-size: 0.75rem;
750
+ white-space: nowrap;
751
+ }
752
+ .flow-row {
753
+ gap: 0.6rem;
754
+ }
755
+ .flow-row.correlated {
756
+ background: color-mix(in srgb, #b93038 12%, transparent);
757
+ }
758
+ .flow-kind {
759
+ flex: none;
760
+ width: 4.2rem;
761
+ font-size: 0.72rem;
762
+ text-transform: uppercase;
763
+ letter-spacing: 0.04em;
764
+ color: var(--muted);
765
+ }
766
+ .flow-action .flow-kind {
767
+ color: #3b6ea5;
768
+ }
769
+ .flow-request .flow-kind {
770
+ color: #ae551c;
771
+ }
772
+ .flow-log .flow-kind {
773
+ color: #4f7a4f;
774
+ }
775
+ .event-row details {
776
+ flex: none;
777
+ font-size: 0.75rem;
778
+ }
779
+ .event-row details[open] {
780
+ max-width: 45%;
781
+ }
782
+ .event-row pre {
783
+ white-space: pre-wrap;
784
+ overflow-wrap: anywhere;
785
+ }
786
+ .truncate {
787
+ overflow: hidden;
788
+ text-overflow: ellipsis;
789
+ white-space: nowrap;
790
+ }
791
+ .quiet {
792
+ color: var(--muted);
793
+ }
794
+ .coverage-row {
795
+ display: flex;
796
+ gap: 0.65rem;
797
+ overflow-x: auto;
798
+ }
281
799
  .coverage-item {
282
800
  width: 136px;
283
801
  flex: none;
@@ -287,139 +805,449 @@ h1 { font-size: 1.35rem; line-height: 1.25; margin: 0; }
287
805
  text-align: left;
288
806
  padding: 0;
289
807
  }
290
- .coverage-item img, .coverage-item .image-empty { width: 136px; height: 80px; object-fit: cover; border-radius: 6px; }
291
- .coverage-item span { display: block; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
808
+ .coverage-item img,
809
+ .coverage-item .image-empty {
810
+ width: 136px;
811
+ height: 80px;
812
+ object-fit: cover;
813
+ border-radius: 6px;
814
+ }
815
+ .coverage-item span {
816
+ display: block;
817
+ overflow: hidden;
818
+ text-overflow: ellipsis;
819
+ white-space: nowrap;
820
+ }
292
821
  .master-detail {
293
822
  display: grid;
294
823
  grid-template-columns: minmax(260px, 350px) minmax(0, 1fr);
295
- gap: .85rem;
824
+ gap: 0.85rem;
296
825
  align-items: start;
297
826
  }
298
- .filters { display: flex; gap: .3rem; flex-wrap: wrap; margin-bottom: .6rem; }
827
+ .filters {
828
+ display: flex;
829
+ gap: 0.3rem;
830
+ flex-wrap: wrap;
831
+ margin-bottom: 0.6rem;
832
+ }
299
833
  .filter {
300
834
  background: transparent;
301
835
  border: 1px solid var(--line);
302
836
  border-radius: 999px;
303
- padding: .17rem .5rem;
837
+ padding: 0.17rem 0.5rem;
304
838
  color: var(--muted);
305
- font-size: .8rem;
839
+ font-size: 0.8rem;
840
+ }
841
+ .filter.active {
842
+ border-color: var(--accent);
843
+ color: var(--fg);
844
+ background: var(--panel-2);
845
+ }
846
+ .detail-heading {
847
+ justify-content: space-between;
848
+ align-items: flex-start;
849
+ margin-bottom: 0.75rem;
306
850
  }
307
- .filter.active { border-color: var(--accent); color: var(--fg); background: var(--panel-2); }
308
- .detail-heading { justify-content: space-between; align-items: flex-start; margin-bottom: .75rem; }
309
851
  /* A grid item grows to its widest child; a long diff line must scroll in its
310
852
  own block, not widen the page. */
311
- .master-detail > * { min-width: 0; }
312
- .issue-detail .section-title { margin-top: 1.2rem; }
313
- .issue-detail .kv { margin-bottom: 1rem; }
314
- .markdown p { margin: .5rem 0; }
315
- .markdown pre, .diff-block, .fix pre {
853
+ .master-detail > * {
854
+ min-width: 0;
855
+ }
856
+ .issue-detail .section-title {
857
+ margin-top: 1.2rem;
858
+ }
859
+ .issue-detail .kv {
860
+ margin-bottom: 1rem;
861
+ }
862
+ .markdown p {
863
+ margin: 0.5rem 0;
864
+ }
865
+ .markdown pre,
866
+ .diff-block,
867
+ .fix pre {
316
868
  background: var(--panel-2);
317
869
  border-radius: 6px;
318
- padding: .6rem;
870
+ padding: 0.6rem;
319
871
  overflow: auto;
320
- font-size: .75rem;
321
- }
322
- .evidence-grid { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: .5rem; }
323
- .evidence-grid figure { margin: 0; }
324
- .evidence-grid img { width: 100%; height: 180px; object-fit: contain; background: var(--panel-2); cursor: zoom-in; }
325
- .evidence-grid figcaption { color: var(--muted); text-align: center; font-size: .75rem; }
326
- .diff-file { border: 1px solid var(--line); border-radius: 6px; margin: .6rem 0; overflow: hidden; }
327
- .diff-file h3 { padding: .5rem .6rem; margin: 0; background: var(--panel-2); overflow-wrap: anywhere; }
328
- .diff-block { margin: 0; border-radius: 0; }
329
- .diff-block span { display: block; min-height: 1em; white-space: pre; }
330
- .diff-block .added { background: color-mix(in srgb, var(--ok) 18%, transparent); }
331
- .diff-block .removed { background: color-mix(in srgb, var(--critical) 18%, transparent); }
332
- .diff-block .hunk { color: var(--muted); }
333
- .retest-block { border-top: 1px solid var(--line); padding: .75rem 0; }
334
- .retest-block p { margin: .35rem 0; }
335
- .retest-shot-pair { margin: .7rem 0; }
336
- .retest-shot-pair h4 { font-size: .85rem; margin: 0 0 .25rem; }
337
- .retest-shots { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: .6rem; }
338
- .retest-shots figure { margin: 0; min-width: 0; }
339
- .retest-shots img, .retest-shots .image-empty { width: 100%; height: 220px; object-fit: contain; background: var(--panel-2); cursor: zoom-in; }
340
- .retest-shots figcaption { text-align: center; color: var(--muted); font-size: .75rem; }
341
- .earlier-retests summary { cursor: pointer; color: var(--muted); }
342
- @media (max-width: 600px) { .retest-shots { grid-template-columns: 1fr; } }
343
- .toggle { display: flex; align-items: center; gap: .4rem; margin-bottom: .5rem; }
872
+ font-size: 0.75rem;
873
+ }
874
+ .evidence-grid {
875
+ display: grid;
876
+ grid-template-columns: repeat(3, minmax(0, 1fr));
877
+ gap: 0.5rem;
878
+ }
879
+ .evidence-grid figure {
880
+ margin: 0;
881
+ }
882
+ .evidence-grid img {
883
+ width: 100%;
884
+ height: 180px;
885
+ object-fit: contain;
886
+ background: var(--panel-2);
887
+ cursor: zoom-in;
888
+ }
889
+ .evidence-grid figcaption {
890
+ color: var(--muted);
891
+ text-align: center;
892
+ font-size: 0.75rem;
893
+ }
894
+ .diff-file {
895
+ border: 1px solid var(--line);
896
+ border-radius: 6px;
897
+ margin: 0.6rem 0;
898
+ overflow: hidden;
899
+ }
900
+ .diff-file h3 {
901
+ padding: 0.5rem 0.6rem;
902
+ margin: 0;
903
+ background: var(--panel-2);
904
+ overflow-wrap: anywhere;
905
+ }
906
+ .diff-block {
907
+ margin: 0;
908
+ border-radius: 0;
909
+ }
910
+ .diff-block span {
911
+ display: block;
912
+ min-height: 1em;
913
+ white-space: pre;
914
+ }
915
+ .diff-block .added {
916
+ background: color-mix(in srgb, var(--ok) 18%, transparent);
917
+ }
918
+ .diff-block .removed {
919
+ background: color-mix(in srgb, var(--critical) 18%, transparent);
920
+ }
921
+ .diff-block .hunk {
922
+ color: var(--muted);
923
+ }
924
+ .retest-block {
925
+ border-top: 1px solid var(--line);
926
+ padding: 0.75rem 0;
927
+ }
928
+ .retest-block p {
929
+ margin: 0.35rem 0;
930
+ }
931
+ .retest-shot-pair {
932
+ margin: 0.7rem 0;
933
+ }
934
+ .retest-shot-pair h4 {
935
+ font-size: 0.85rem;
936
+ margin: 0 0 0.25rem;
937
+ }
938
+ .retest-shots {
939
+ display: grid;
940
+ grid-template-columns: repeat(2, minmax(0, 1fr));
941
+ gap: 0.6rem;
942
+ }
943
+ .retest-shots figure {
944
+ margin: 0;
945
+ min-width: 0;
946
+ }
947
+ .retest-shots img,
948
+ .retest-shots .image-empty {
949
+ width: 100%;
950
+ height: 220px;
951
+ object-fit: contain;
952
+ background: var(--panel-2);
953
+ cursor: zoom-in;
954
+ }
955
+ .retest-shots figcaption {
956
+ text-align: center;
957
+ color: var(--muted);
958
+ font-size: 0.75rem;
959
+ }
960
+ .earlier-retests summary {
961
+ cursor: pointer;
962
+ color: var(--muted);
963
+ }
964
+ @media (max-width: 600px) {
965
+ .retest-shots {
966
+ grid-template-columns: 1fr;
967
+ }
968
+ }
969
+ .toggle {
970
+ display: flex;
971
+ align-items: center;
972
+ gap: 0.4rem;
973
+ margin-bottom: 0.5rem;
974
+ }
344
975
  .candidate {
345
976
  display: flex;
346
977
  justify-content: space-between;
347
- gap: .5rem;
978
+ gap: 0.5rem;
348
979
  border-top: 1px solid var(--line);
349
- padding: .5rem 0;
350
- }
351
- .screen-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(220px, 1fr)); gap: .85rem; }
352
- .screen-card { text-align: left; padding: 0; overflow: hidden; }
353
- .screen-card:hover { border-color: var(--accent); }
354
- .screen-card > img, .screen-card > .image-empty { display: block; width: 100%; height: 145px; object-fit: cover; }
355
- .screen-copy { padding: .75rem; }
356
- .screen-copy p { margin: .2rem 0; }
357
- .issue-count { float: right; color: var(--major); font-size: .75rem; }
358
- .screen-large { width: 100%; max-height: 520px; object-fit: contain; background: var(--panel-2); }
359
- .back { border: 0; background: transparent; color: var(--accent); padding: 0 0 .7rem; }
360
- .screen-mode { display: inline-flex; margin: .5rem 0 .75rem; border: 1px solid var(--line); border-radius: 7px; overflow: hidden; }
361
- .screen-mode button { border: 0; background: var(--panel); padding: .25rem .8rem; }
362
- .screen-mode button.active { background: var(--accent); color: var(--bg); }
363
- .graph-wrap { min-width: 0; width: 100%; }
364
- .graph-toolbar { display: flex; align-items: center; gap: .35rem; flex-wrap: wrap; }
365
- .graph-toolbar button { border: 1px solid var(--line); border-radius: 5px; background: var(--panel); padding: .15rem .55rem; }
366
- .graph-toolbar label { margin-left: .5rem; color: var(--muted); }
367
- .graph-legend { color: var(--muted); font-size: .75rem; margin: .45rem 0; }
368
- .screen-graph { display: block; width: 100%; height: min(70vh, 700px); min-height: 420px;
369
- background: var(--panel); border: 1px solid var(--line); border-radius: 8px; touch-action: none; cursor: grab; }
370
- .screen-graph:active { cursor: grabbing; }
371
- .graph-edge { fill: none; stroke: var(--accent); opacity: .7; pointer-events: stroke; }
372
- .graph-edge.open { stroke-dasharray: 7 5; }
373
- .graph-edge.route { stroke: var(--muted); opacity: .6; }
374
- .graph-edge.other { stroke: var(--muted); opacity: .45; }
375
- .graph-edge.back { stroke: var(--muted); stroke-dasharray: 3 5; opacity: .45; }
376
- .graph-edge.faded { opacity: .08; }
377
- #graph-arrow path { fill: var(--accent); }
378
- #graph-arrow-muted path { fill: var(--muted); }
379
- .graph-card { fill: var(--panel-2); stroke: var(--line); }
380
- .graph-start rect { fill: var(--panel-2); stroke: var(--accent); }
381
- .graph-start text { fill: var(--fg); font-size: 13px; font-weight: 650; }
382
- .graph-node { cursor: pointer; }
383
- .graph-node:hover .graph-card, .graph-node:focus .graph-card { stroke: var(--accent); stroke-width: 2; }
384
- .graph-name, .graph-unlinked { fill: var(--fg); font-size: 14px; font-weight: 600; }
385
- .graph-unlinked { fill: var(--muted); }
386
- .graph-issue { fill: var(--critical); }
387
- .graph-issue-text { fill: white; font-size: 12px; font-weight: 700; }
388
- .screen-links { margin: .8rem 0; }
389
- .screen-links .list-row { display: flex; justify-content: space-between; }
980
+ padding: 0.5rem 0;
981
+ }
982
+ .screen-grid {
983
+ display: grid;
984
+ grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
985
+ gap: 0.85rem;
986
+ }
987
+ .screen-card {
988
+ text-align: left;
989
+ padding: 0;
990
+ overflow: hidden;
991
+ }
992
+ .screen-card:hover {
993
+ border-color: var(--accent);
994
+ }
995
+ .screen-card > img,
996
+ .screen-card > .image-empty {
997
+ display: block;
998
+ width: 100%;
999
+ height: 145px;
1000
+ object-fit: cover;
1001
+ }
1002
+ .screen-copy {
1003
+ padding: 0.75rem;
1004
+ }
1005
+ .screen-copy p {
1006
+ margin: 0.2rem 0;
1007
+ }
1008
+ .issue-count {
1009
+ float: right;
1010
+ color: var(--major);
1011
+ font-size: 0.75rem;
1012
+ }
1013
+ .screen-large {
1014
+ width: 100%;
1015
+ max-height: 520px;
1016
+ object-fit: contain;
1017
+ background: var(--panel-2);
1018
+ }
1019
+ .back {
1020
+ border: 0;
1021
+ background: transparent;
1022
+ color: var(--accent);
1023
+ padding: 0 0 0.7rem;
1024
+ }
1025
+ .screen-mode {
1026
+ display: inline-flex;
1027
+ margin: 0.5rem 0 0.75rem;
1028
+ border: 1px solid var(--line);
1029
+ border-radius: 7px;
1030
+ overflow: hidden;
1031
+ }
1032
+ .screen-mode button {
1033
+ border: 0;
1034
+ background: var(--panel);
1035
+ padding: 0.25rem 0.8rem;
1036
+ }
1037
+ .screen-mode button.active {
1038
+ background: var(--accent);
1039
+ color: var(--bg);
1040
+ }
1041
+ .graph-wrap {
1042
+ min-width: 0;
1043
+ width: 100%;
1044
+ }
1045
+ .graph-toolbar {
1046
+ display: flex;
1047
+ align-items: center;
1048
+ gap: 0.35rem;
1049
+ flex-wrap: wrap;
1050
+ }
1051
+ .graph-toolbar button {
1052
+ border: 1px solid var(--line);
1053
+ border-radius: 5px;
1054
+ background: var(--panel);
1055
+ padding: 0.15rem 0.55rem;
1056
+ }
1057
+ .graph-toolbar label {
1058
+ margin-left: 0.5rem;
1059
+ color: var(--muted);
1060
+ }
1061
+ .graph-legend {
1062
+ color: var(--muted);
1063
+ font-size: 0.75rem;
1064
+ margin: 0.45rem 0;
1065
+ }
1066
+ .screen-graph {
1067
+ display: block;
1068
+ width: 100%;
1069
+ height: min(70vh, 700px);
1070
+ min-height: 420px;
1071
+ background: var(--panel);
1072
+ border: 1px solid var(--line);
1073
+ border-radius: 8px;
1074
+ touch-action: none;
1075
+ cursor: grab;
1076
+ }
1077
+ .screen-graph:active {
1078
+ cursor: grabbing;
1079
+ }
1080
+ .graph-edge {
1081
+ fill: none;
1082
+ stroke: var(--accent);
1083
+ opacity: 0.7;
1084
+ pointer-events: stroke;
1085
+ }
1086
+ .graph-edge.open {
1087
+ stroke-dasharray: 7 5;
1088
+ }
1089
+ .graph-edge.route {
1090
+ stroke: var(--muted);
1091
+ opacity: 0.6;
1092
+ }
1093
+ .graph-edge.other {
1094
+ stroke: var(--muted);
1095
+ opacity: 0.45;
1096
+ }
1097
+ .graph-edge.back {
1098
+ stroke: var(--muted);
1099
+ stroke-dasharray: 3 5;
1100
+ opacity: 0.45;
1101
+ }
1102
+ .graph-edge.faded {
1103
+ opacity: 0.08;
1104
+ }
1105
+ #graph-arrow path {
1106
+ fill: var(--accent);
1107
+ }
1108
+ #graph-arrow-muted path {
1109
+ fill: var(--muted);
1110
+ }
1111
+ .graph-card {
1112
+ fill: var(--panel-2);
1113
+ stroke: var(--line);
1114
+ }
1115
+ .graph-start rect {
1116
+ fill: var(--panel-2);
1117
+ stroke: var(--accent);
1118
+ }
1119
+ .graph-start text {
1120
+ fill: var(--fg);
1121
+ font-size: 13px;
1122
+ font-weight: 650;
1123
+ }
1124
+ .graph-node {
1125
+ cursor: pointer;
1126
+ }
1127
+ .graph-node:hover .graph-card,
1128
+ .graph-node:focus .graph-card {
1129
+ stroke: var(--accent);
1130
+ stroke-width: 2;
1131
+ }
1132
+ .graph-name,
1133
+ .graph-unlinked {
1134
+ fill: var(--fg);
1135
+ font-size: 14px;
1136
+ font-weight: 600;
1137
+ }
1138
+ .graph-unlinked {
1139
+ fill: var(--muted);
1140
+ }
1141
+ .graph-issue {
1142
+ fill: var(--critical);
1143
+ }
1144
+ .graph-issue-text {
1145
+ fill: white;
1146
+ font-size: 12px;
1147
+ font-weight: 700;
1148
+ }
1149
+ .screen-links {
1150
+ margin: 0.8rem 0;
1151
+ }
1152
+ .screen-links .list-row {
1153
+ display: flex;
1154
+ justify-content: space-between;
1155
+ }
390
1156
  @media (max-width: 900px) {
391
- .topbar { flex-wrap: wrap; }
392
- .status { margin-left: 0; }
393
- .overview-grid, .master-detail { grid-template-columns: 1fr; }
1157
+ .topbar {
1158
+ flex-wrap: wrap;
1159
+ }
1160
+ .status {
1161
+ margin-left: 0;
1162
+ }
1163
+ .overview-grid,
1164
+ .master-detail {
1165
+ grid-template-columns: 1fr;
1166
+ }
394
1167
  }
395
1168
  @media (max-width: 600px) {
396
- main { min-width: 0; overflow-x: hidden; }
397
- .screen-graph { height: 60vh; min-height: 360px; }
398
- .agent-grid { grid-template-columns: 1fr; }
399
- .tabs { overflow-x: auto; width: 100%; order: 3; }
400
- .attention-row { flex-wrap: wrap; }
1169
+ main {
1170
+ min-width: 0;
1171
+ overflow-x: hidden;
1172
+ }
1173
+ .screen-graph {
1174
+ height: 60vh;
1175
+ min-height: 360px;
1176
+ }
1177
+ .agent-grid {
1178
+ grid-template-columns: 1fr;
1179
+ }
1180
+ .tabs {
1181
+ overflow-x: auto;
1182
+ width: 100%;
1183
+ order: 3;
1184
+ }
1185
+ .attention-row {
1186
+ flex-wrap: wrap;
1187
+ }
1188
+ }
1189
+ .viewport-tags {
1190
+ display: flex;
1191
+ gap: 0.3rem;
1192
+ margin-top: 0.4rem;
401
1193
  }
402
- .viewport-tags { display: flex; gap: .3rem; margin-top: .4rem; }
403
1194
  .viewport-tags span {
404
1195
  border: 1px solid var(--line);
405
1196
  border-radius: 4px;
406
- padding: 0 .35rem;
1197
+ padding: 0 0.35rem;
407
1198
  color: var(--muted);
408
- font-size: .72rem;
1199
+ font-size: 0.72rem;
409
1200
  }
410
1201
 
411
1202
  /* The replayable path behind an issue: exact, but one click away. */
412
- .recorded-path { margin: 16px 0; }
413
- .recorded-path summary { cursor: pointer; color: var(--muted, #6b7280); font-weight: 600; }
414
- .recorded-path ol { margin-top: 8px; }
1203
+ .recorded-path {
1204
+ margin: 16px 0;
1205
+ }
1206
+ .recorded-path summary {
1207
+ cursor: pointer;
1208
+ color: var(--muted, #6b7280);
1209
+ font-weight: 600;
1210
+ }
1211
+ .recorded-path ol {
1212
+ margin-top: 8px;
1213
+ }
415
1214
 
416
1215
  /* A long agent summary reads as a note under the timeline title. */
417
- .session-summary { margin: 4px 0 12px; color: var(--muted, #6b7280); font-size: 13px; }
1216
+ .session-summary {
1217
+ margin: 4px 0 12px;
1218
+ color: var(--muted, #6b7280);
1219
+ font-size: 13px;
1220
+ }
418
1221
 
419
- .diff-details summary { cursor: pointer; color: var(--muted); margin: .4rem 0; }
420
- .memory-group { margin: 1rem 0; }
421
- .memory-row { display: flex; align-items: center; gap: .75rem; border-top: 1px solid var(--line); padding: .45rem 0; }
422
- .memory-row .muted { font-size: .75rem; white-space: nowrap; }
423
- @media (max-width: 600px) { .memory-row { flex-wrap: wrap; } }
1222
+ .diff-details summary {
1223
+ cursor: pointer;
1224
+ color: var(--muted);
1225
+ margin: 0.4rem 0;
1226
+ }
1227
+ .memory-group {
1228
+ margin: 1rem 0;
1229
+ }
1230
+ .memory-row {
1231
+ display: flex;
1232
+ align-items: center;
1233
+ gap: 0.75rem;
1234
+ border-top: 1px solid var(--line);
1235
+ padding: 0.45rem 0;
1236
+ }
1237
+ .memory-row .muted {
1238
+ font-size: 0.75rem;
1239
+ white-space: nowrap;
1240
+ }
1241
+ @media (max-width: 600px) {
1242
+ .memory-row {
1243
+ flex-wrap: wrap;
1244
+ }
1245
+ }
424
1246
 
425
- .row-meta { display: flex; flex-wrap: wrap; align-items: center; gap: .35rem .5rem; margin-top: .2rem; }
1247
+ .row-meta {
1248
+ display: flex;
1249
+ flex-wrap: wrap;
1250
+ align-items: center;
1251
+ gap: 0.35rem 0.5rem;
1252
+ margin-top: 0.2rem;
1253
+ }