sloppatrol 0.1.1 → 0.1.2

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.
Files changed (73) hide show
  1. package/README.md +111 -160
  2. package/dist/census/index.js +4 -2
  3. package/dist/census/index.js.map +1 -1
  4. package/dist/census/lib/guardrails.js +38 -9
  5. package/dist/census/lib/guardrails.js.map +1 -1
  6. package/dist/census/lib/stack.d.ts +2 -1
  7. package/dist/census/lib/stack.js +8 -4
  8. package/dist/census/lib/stack.js.map +1 -1
  9. package/dist/cli/index.js +20 -4
  10. package/dist/cli/index.js.map +1 -1
  11. package/dist/cli/lib/browser.d.ts +2 -0
  12. package/dist/cli/lib/browser.js +13 -0
  13. package/dist/cli/lib/browser.js.map +1 -0
  14. package/dist/cli/lib/usage.d.ts +1 -1
  15. package/dist/cli/lib/usage.js +4 -3
  16. package/dist/cli/lib/usage.js.map +1 -1
  17. package/dist/config/lib/schema.d.ts +30 -0
  18. package/dist/config/lib/schema.js +16 -0
  19. package/dist/config/lib/schema.js.map +1 -1
  20. package/dist/dashboard/index.d.ts +4 -0
  21. package/dist/dashboard/index.js +6 -2
  22. package/dist/dashboard/index.js.map +1 -1
  23. package/dist/dashboard/lib/snapshot.d.ts +168 -30
  24. package/dist/dashboard/lib/snapshot.js +104 -37
  25. package/dist/dashboard/lib/snapshot.js.map +1 -1
  26. package/dist/dashboard/lib/summary.d.ts +230 -0
  27. package/dist/dashboard/lib/summary.js +398 -0
  28. package/dist/dashboard/lib/summary.js.map +1 -0
  29. package/dist/domain/index.d.ts +2 -0
  30. package/dist/domain/index.js +1 -0
  31. package/dist/domain/index.js.map +1 -1
  32. package/dist/domain/lib/cycle.d.ts +17 -0
  33. package/dist/domain/lib/cycle.js +2 -0
  34. package/dist/domain/lib/cycle.js.map +1 -0
  35. package/dist/{patrol → domain}/lib/pick.d.ts +2 -1
  36. package/dist/{patrol → domain}/lib/pick.js.map +1 -1
  37. package/dist/domain/lib/refactor.d.ts +2 -0
  38. package/dist/gate/index.d.ts +7 -0
  39. package/dist/gate/index.js +15 -0
  40. package/dist/gate/index.js.map +1 -1
  41. package/dist/patrol/lib/attempt.js +10 -2
  42. package/dist/patrol/lib/attempt.js.map +1 -1
  43. package/dist/patrol/lib/base.d.ts +10 -3
  44. package/dist/patrol/lib/base.js +14 -8
  45. package/dist/patrol/lib/base.js.map +1 -1
  46. package/dist/patrol/lib/cycle.d.ts +1 -1
  47. package/dist/patrol/lib/cycle.js +32 -1
  48. package/dist/patrol/lib/cycle.js.map +1 -1
  49. package/dist/patrol/lib/recover.d.ts +2 -1
  50. package/dist/patrol/lib/recover.js +16 -1
  51. package/dist/patrol/lib/recover.js.map +1 -1
  52. package/dist/patrol/lib/scorecard.js +12 -4
  53. package/dist/patrol/lib/scorecard.js.map +1 -1
  54. package/dist/patrol/lib/steps.d.ts +5 -2
  55. package/dist/patrol/lib/steps.js +9 -6
  56. package/dist/patrol/lib/steps.js.map +1 -1
  57. package/dist/playbook/index.js +3 -3
  58. package/dist/roles/lib/prompts.d.ts +1 -0
  59. package/dist/roles/lib/prompts.js +6 -0
  60. package/dist/roles/lib/prompts.js.map +1 -1
  61. package/dist/roles/lib/refactorer.d.ts +1 -0
  62. package/dist/roles/lib/refactorer.js +24 -6
  63. package/dist/roles/lib/refactorer.js.map +1 -1
  64. package/dist/roles/lib/scorecard-text.js +1 -1
  65. package/dist/roles/lib/scorecard-text.js.map +1 -1
  66. package/dist/store/index.d.ts +4 -1
  67. package/dist/store/index.js +7 -0
  68. package/dist/store/index.js.map +1 -1
  69. package/package.json +1 -1
  70. package/ui/app.js +1236 -324
  71. package/ui/index.html +35 -13
  72. package/ui/style.css +1063 -340
  73. /package/dist/{patrol → domain}/lib/pick.js +0 -0
package/ui/style.css CHANGED
@@ -1,40 +1,46 @@
1
+ /* The theme comes from data-theme on <html>: the user's choice, or else the system setting (index.html). */
1
2
  :root {
2
3
  --bg: #f7f7f5;
3
4
  --panel: #ffffff;
5
+ --panel-2: #f1f1ee;
4
6
  --line: #e4e4e0;
5
7
  --text: #1c1c1a;
6
- --muted: #6b6b66;
8
+ --muted: #62625d;
7
9
  --accent: #3b5bdb;
8
- --ok: #2b8a3e;
9
- --ok-bg: #ebfbee;
10
- --bad: #c92a2a;
11
- --bad-bg: #fff5f5;
12
- --run: #e67700;
13
- --run-bg: #fff9db;
14
- --idle: #868e96;
15
- --idle-bg: #f1f3f5;
10
+ --ok: #237a36;
11
+ --ok-bg: #e6f6e9;
12
+ --bad: #b42323;
13
+ --bad-bg: #fdeeee;
14
+ --warn: #8f4a00;
15
+ --warn-bg: #fff3dc;
16
+ --run: #2f4fc4;
17
+ --run-bg: #eaeefc;
18
+ --idle: #5f6670;
19
+ --idle-bg: #eef0f2;
16
20
  --radius: 10px;
17
21
  --mono: ui-monospace, "SF Mono", Menlo, Consolas, monospace;
18
- color-scheme: light dark;
19
- }
20
-
21
- @media (prefers-color-scheme: dark) {
22
- :root {
23
- --bg: #121212;
24
- --panel: #1b1b1b;
25
- --line: #2c2c2c;
26
- --text: #ececec;
27
- --muted: #9a9a9a;
28
- --accent: #748ffc;
29
- --ok: #69db7c;
30
- --ok-bg: #16281b;
31
- --bad: #ff8787;
32
- --bad-bg: #2c1717;
33
- --run: #ffc078;
34
- --run-bg: #2b2414;
35
- --idle: #868e96;
36
- --idle-bg: #232323;
37
- }
22
+ color-scheme: light;
23
+ }
24
+
25
+ :root[data-theme="dark"] {
26
+ --bg: #121212;
27
+ --panel: #1b1b1b;
28
+ --panel-2: #232323;
29
+ --line: #2e2e2e;
30
+ --text: #ececec;
31
+ --muted: #a3a3a3;
32
+ --accent: #8199fc;
33
+ --ok: #69db7c;
34
+ --ok-bg: #16281b;
35
+ --bad: #ff8787;
36
+ --bad-bg: #2f1818;
37
+ --warn: #ffc078;
38
+ --warn-bg: #2d2414;
39
+ --run: #91a7ff;
40
+ --run-bg: #1c2240;
41
+ --idle: #a0a7ae;
42
+ --idle-bg: #262626;
43
+ color-scheme: dark;
38
44
  }
39
45
 
40
46
  * {
@@ -58,18 +64,59 @@ a {
58
64
  text-decoration: none;
59
65
  }
60
66
 
67
+ a:hover {
68
+ text-decoration: underline;
69
+ }
70
+
71
+ button {
72
+ font: inherit;
73
+ color: inherit;
74
+ }
75
+
76
+ :focus-visible {
77
+ outline: 2px solid var(--accent);
78
+ outline-offset: 2px;
79
+ }
80
+
61
81
  code,
62
82
  pre {
63
83
  font-family: var(--mono);
64
84
  font-size: 12px;
65
85
  }
66
86
 
87
+ .sr-only {
88
+ position: absolute;
89
+ width: 1px;
90
+ height: 1px;
91
+ overflow: hidden;
92
+ clip-path: inset(50%);
93
+ white-space: nowrap;
94
+ }
95
+
96
+ .muted {
97
+ color: var(--muted);
98
+ }
99
+
100
+ .small {
101
+ font-size: 12px;
102
+ }
103
+
104
+ .num {
105
+ font-variant-numeric: tabular-nums;
106
+ text-align: right;
107
+ }
108
+
109
+ /* ---------- top bar ---------- */
110
+
67
111
  .top {
112
+ position: sticky;
113
+ top: 0;
114
+ z-index: 2;
68
115
  display: flex;
69
116
  align-items: center;
70
- justify-content: space-between;
71
- gap: 16px;
72
- padding: 14px 24px;
117
+ gap: 24px;
118
+ padding: 0 24px;
119
+ height: 52px;
73
120
  border-bottom: 1px solid var(--line);
74
121
  background: var(--panel);
75
122
  }
@@ -77,7 +124,8 @@ pre {
77
124
  .brand {
78
125
  display: flex;
79
126
  align-items: baseline;
80
- gap: 10px;
127
+ gap: 8px;
128
+ white-space: nowrap;
81
129
  }
82
130
 
83
131
  .logo {
@@ -89,123 +137,152 @@ pre {
89
137
  letter-spacing: -0.01em;
90
138
  }
91
139
 
92
- .project,
93
- .meta {
140
+ .project {
94
141
  color: var(--muted);
95
142
  }
96
143
 
97
- .meta {
144
+ .tabs {
98
145
  display: flex;
99
- gap: 14px;
100
- align-items: center;
101
- font-size: 13px;
102
- }
103
-
104
- .lanes {
105
- display: grid;
106
- grid-template-columns: repeat(6, minmax(0, 1fr));
107
- gap: 12px;
108
- padding: 16px 24px 0;
146
+ gap: 2px;
147
+ align-self: stretch;
148
+ flex: 1;
149
+ min-width: 0;
150
+ overflow-x: auto;
109
151
  }
110
152
 
111
- .lane {
112
- background: var(--panel);
113
- border: 1px solid var(--line);
114
- border-radius: var(--radius);
115
- padding: 12px 14px;
116
- min-height: 86px;
117
- cursor: default;
153
+ .tabs a {
154
+ display: flex;
155
+ align-items: center;
156
+ padding: 0 10px;
157
+ color: var(--muted);
158
+ border-bottom: 2px solid transparent;
159
+ white-space: nowrap;
118
160
  }
119
161
 
120
- .lane[data-session] {
121
- cursor: pointer;
162
+ .tabs a:hover {
163
+ color: var(--text);
164
+ text-decoration: none;
122
165
  }
123
166
 
124
- .lane[data-session]:hover {
167
+ .tabs a.active {
168
+ color: var(--text);
125
169
  border-color: var(--accent);
170
+ font-weight: 600;
126
171
  }
127
172
 
128
- .lane-head {
173
+ .tools {
129
174
  display: flex;
130
175
  align-items: center;
131
- justify-content: space-between;
132
- font-weight: 600;
133
- }
134
-
135
- .lane-detail {
136
- color: var(--muted);
137
- font-size: 13px;
138
- margin-top: 6px;
139
- display: -webkit-box;
140
- -webkit-line-clamp: 2;
141
- -webkit-box-orient: vertical;
142
- overflow: hidden;
176
+ gap: 6px;
143
177
  }
144
178
 
145
- .lane-time {
146
- color: var(--muted);
147
- font-size: 12px;
148
- margin-top: 4px;
179
+ .activity {
180
+ margin-right: 6px;
149
181
  }
150
182
 
151
- .stats {
152
- display: flex;
153
- flex-wrap: wrap;
154
- gap: 24px;
155
- padding: 14px 24px;
183
+ .icon-button {
184
+ display: inline-grid;
185
+ place-items: center;
186
+ width: 30px;
187
+ height: 30px;
188
+ border: 1px solid transparent;
189
+ border-radius: 7px;
190
+ background: none;
156
191
  color: var(--muted);
192
+ cursor: pointer;
157
193
  }
158
194
 
159
- .stats b {
195
+ .icon-button:hover {
160
196
  color: var(--text);
161
- font-size: 18px;
162
- margin-right: 6px;
163
- font-variant-numeric: tabular-nums;
197
+ background: var(--panel-2);
198
+ text-decoration: none;
164
199
  }
165
200
 
166
- .tabs {
167
- display: flex;
168
- gap: 4px;
169
- padding: 0 24px;
170
- border-bottom: 1px solid var(--line);
201
+ .icon-button svg,
202
+ .external svg {
203
+ width: 16px;
204
+ height: 16px;
205
+ fill: none;
206
+ stroke: currentColor;
207
+ stroke-width: 1.4;
208
+ stroke-linecap: round;
209
+ stroke-linejoin: round;
171
210
  }
172
211
 
173
- .tabs a {
174
- padding: 10px 12px;
175
- color: var(--muted);
176
- border-bottom: 2px solid transparent;
177
- margin-bottom: -1px;
212
+ .offline {
213
+ padding: 10px 24px;
214
+ background: var(--bad-bg);
215
+ color: var(--bad);
216
+ border-bottom: 1px solid var(--line);
178
217
  }
179
218
 
180
- .tabs a.active {
181
- color: var(--text);
182
- border-color: var(--accent);
183
- font-weight: 600;
219
+ body:has(.offline:not([hidden])) main {
220
+ opacity: 0.55;
184
221
  }
185
222
 
186
- .tabs .count {
187
- color: var(--muted);
188
- font-weight: 400;
189
- margin-left: 4px;
190
- }
223
+ /* ---------- layout ---------- */
191
224
 
192
225
  .layout {
193
226
  display: flex;
194
227
  gap: 16px;
195
- padding: 16px 24px 40px;
228
+ padding: 16px 24px 48px;
196
229
  align-items: flex-start;
230
+ max-width: 1680px;
231
+ margin: 0 auto;
197
232
  }
198
233
 
199
234
  main {
200
235
  flex: 1;
201
236
  min-width: 0;
237
+ display: flex;
238
+ flex-direction: column;
239
+ gap: 14px;
240
+ }
241
+
242
+ .grid {
243
+ display: grid;
244
+ gap: 14px;
245
+ align-items: start;
246
+ }
247
+
248
+ .grid.two {
249
+ grid-template-columns: minmax(0, 1.5fr) minmax(0, 1fr);
250
+ }
251
+
252
+ .grid.two.narrow-right {
253
+ grid-template-columns: minmax(0, 3fr) minmax(260px, 1fr);
254
+ }
255
+
256
+ .card {
257
+ background: var(--panel);
258
+ border: 1px solid var(--line);
259
+ border-radius: var(--radius);
260
+ padding: 14px 16px;
261
+ min-width: 0;
262
+ }
263
+
264
+ .card-head {
265
+ display: flex;
266
+ align-items: baseline;
267
+ justify-content: space-between;
268
+ gap: 12px;
269
+ margin-bottom: 10px;
270
+ }
271
+
272
+ .card-head h2 {
273
+ font-size: 14px;
274
+ margin: 0;
275
+ }
276
+
277
+ .card-head .muted {
278
+ font-size: 12px;
202
279
  }
203
280
 
204
281
  .detail {
205
- width: min(560px, 45vw);
282
+ width: min(560px, 42vw);
206
283
  position: sticky;
207
- top: 16px;
208
- max-height: calc(100vh - 32px);
284
+ top: 68px;
285
+ max-height: calc(100vh - 84px);
209
286
  overflow: auto;
210
287
  background: var(--panel);
211
288
  border: 1px solid var(--line);
@@ -215,7 +292,8 @@ main {
215
292
 
216
293
  .detail h2 {
217
294
  font-size: 16px;
218
- margin: 0 32px 6px 0;
295
+ margin: 0 36px 8px 0;
296
+ overflow-wrap: anywhere;
219
297
  }
220
298
 
221
299
  .detail h3 {
@@ -228,11 +306,7 @@ main {
228
306
 
229
307
  .detail .close {
230
308
  float: right;
231
- border: 0;
232
- background: none;
233
- color: var(--muted);
234
309
  font-size: 18px;
235
- cursor: pointer;
236
310
  }
237
311
 
238
312
  .detail p {
@@ -240,354 +314,886 @@ main {
240
314
  white-space: pre-wrap;
241
315
  }
242
316
 
243
- .list {
317
+ /* ---------- stats band ---------- */
318
+
319
+ .band {
320
+ display: grid;
321
+ grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
322
+ gap: 1px;
323
+ background: var(--line);
324
+ border: 1px solid var(--line);
325
+ border-radius: var(--radius);
326
+ overflow: hidden;
327
+ }
328
+
329
+ .stat {
244
330
  display: flex;
245
331
  flex-direction: column;
246
- gap: 8px;
332
+ gap: 2px;
333
+ min-width: 0;
334
+ padding: 11px 14px;
335
+ background: var(--panel);
336
+ border: 0;
337
+ text-align: left;
247
338
  }
248
339
 
249
- .row {
250
- background: var(--panel);
251
- border: 1px solid var(--line);
252
- border-radius: var(--radius);
253
- padding: 12px 14px;
340
+ button.stat {
254
341
  cursor: pointer;
255
342
  }
256
343
 
257
- .row:hover,
258
- .row.selected {
259
- border-color: var(--accent);
344
+ button.stat:hover {
345
+ background: var(--panel-2);
260
346
  }
261
347
 
262
- .row-head {
263
- display: flex;
264
- align-items: center;
265
- gap: 8px;
266
- min-width: 0;
348
+ .stat-label {
349
+ color: var(--muted);
350
+ font-size: 11px;
351
+ font-weight: 600;
352
+ text-transform: uppercase;
353
+ letter-spacing: 0.04em;
267
354
  }
268
355
 
269
- .row-title {
270
- font-weight: 600;
271
- flex: 1;
272
- min-width: 0;
273
- overflow: hidden;
274
- text-overflow: ellipsis;
275
- white-space: nowrap;
356
+ .stat-value {
357
+ font-size: 21px;
358
+ line-height: 1.25;
359
+ font-variant-numeric: tabular-nums;
360
+ overflow-wrap: anywhere;
276
361
  }
277
362
 
278
- .row-sub {
363
+ .stat-value .of {
364
+ font-size: 13px;
365
+ font-weight: 500;
279
366
  color: var(--muted);
280
- font-size: 12px;
281
- margin-top: 6px;
282
- display: flex;
283
- gap: 12px;
284
- flex-wrap: wrap;
285
367
  }
286
368
 
287
- .chip {
288
- display: inline-flex;
289
- align-items: center;
290
- gap: 5px;
369
+ .stat-note {
370
+ display: -webkit-box;
371
+ -webkit-box-orient: vertical;
372
+ -webkit-line-clamp: 2;
373
+ overflow: hidden;
374
+ color: var(--muted);
291
375
  font-size: 12px;
292
- padding: 1px 8px;
293
- border-radius: 999px;
294
- background: var(--idle-bg);
295
- color: var(--idle);
296
- white-space: nowrap;
297
376
  }
298
377
 
299
- .chip.ok {
300
- background: var(--ok-bg);
378
+ .stat.tone-pass .stat-value {
301
379
  color: var(--ok);
302
380
  }
303
381
 
304
- .chip.bad {
305
- background: var(--bad-bg);
382
+ .stat.tone-fail .stat-value {
306
383
  color: var(--bad);
307
384
  }
308
385
 
309
- .chip.run {
310
- background: var(--run-bg);
311
- color: var(--run);
386
+ .stat.tone-warn .stat-value {
387
+ color: var(--warn);
312
388
  }
313
389
 
314
- .chip.kind {
315
- background: transparent;
316
- border: 1px solid var(--line);
317
- color: var(--muted);
390
+ .stat.tone-run .stat-value {
391
+ color: var(--run);
318
392
  }
319
393
 
320
- .dot {
321
- width: 8px;
322
- height: 8px;
323
- border-radius: 50%;
324
- background: currentColor;
325
- flex: none;
394
+ .stat.tone-pass,
395
+ .stat.tone-fail,
396
+ .stat.tone-warn {
397
+ box-shadow: inset 3px 0 0 currentColor;
326
398
  }
327
399
 
328
- .chip.run .dot,
329
- .step.run .mark {
330
- animation: pulse 1.2s ease-in-out infinite;
400
+ .stat.tone-pass {
401
+ color: var(--ok);
331
402
  }
332
403
 
333
- @keyframes pulse {
334
- 50% {
335
- opacity: 0.3;
336
- }
404
+ .stat.tone-fail {
405
+ color: var(--bad);
337
406
  }
338
407
 
339
- .steps {
340
- display: flex;
341
- align-items: center;
342
- gap: 6px;
343
- margin-top: 10px;
344
- flex-wrap: wrap;
408
+ .stat.tone-warn {
409
+ color: var(--warn);
345
410
  }
346
411
 
347
- .step {
348
- display: inline-flex;
349
- align-items: center;
350
- gap: 5px;
351
- font-size: 12px;
352
- color: var(--idle);
412
+ .stat.tone-pass .stat-label,
413
+ .stat.tone-fail .stat-label,
414
+ .stat.tone-warn .stat-label {
415
+ color: var(--muted);
353
416
  }
354
417
 
355
- .step .mark {
356
- width: 18px;
357
- height: 18px;
358
- border-radius: 50%;
359
- display: inline-grid;
360
- place-items: center;
361
- font-size: 11px;
362
- background: var(--idle-bg);
418
+ .delta {
419
+ font-size: 12px;
420
+ font-weight: 600;
421
+ color: var(--muted);
422
+ font-variant-numeric: tabular-nums;
423
+ vertical-align: middle;
363
424
  }
364
425
 
365
- .step.ok {
426
+ .delta.up {
366
427
  color: var(--ok);
367
428
  }
368
- .step.ok .mark {
369
- background: var(--ok-bg);
370
- }
371
- .step.bad {
429
+
430
+ .delta.down {
372
431
  color: var(--bad);
373
432
  }
374
- .step.bad .mark {
375
- background: var(--bad-bg);
433
+
434
+ /* ---------- empty state and commands ---------- */
435
+
436
+ .empty-state {
437
+ max-width: 40rem;
438
+ margin: 28px auto;
439
+ text-align: center;
376
440
  }
377
- .step.run {
378
- color: var(--run);
441
+
442
+ .empty-state.compact {
443
+ margin: 2px 0;
444
+ max-width: none;
445
+ text-align: left;
379
446
  }
380
- .step.run .mark {
381
- background: var(--run-bg);
447
+
448
+ .empty-state h3 {
449
+ font-size: 15px;
450
+ margin: 0 0 6px;
382
451
  }
383
452
 
384
- .arrow {
385
- color: var(--line);
453
+ .empty-state.compact h3 {
454
+ font-size: 14px;
386
455
  }
387
456
 
388
- .pills {
457
+ .empty-state p {
458
+ margin: 0 0 10px;
459
+ color: var(--muted);
460
+ }
461
+
462
+ .empty-state:not(.compact) .command {
463
+ margin-inline: auto;
464
+ }
465
+
466
+ .command {
467
+ display: flex;
468
+ align-items: center;
469
+ gap: 8px;
470
+ width: fit-content;
471
+ max-width: 100%;
472
+ padding: 4px 4px 4px 10px;
473
+ background: var(--panel-2);
474
+ border: 1px solid var(--line);
475
+ border-radius: 7px;
476
+ text-align: left;
477
+ }
478
+
479
+ .command code {
480
+ overflow-wrap: anywhere;
481
+ }
482
+
483
+ .copy {
484
+ flex: none;
485
+ background: var(--panel);
486
+ border: 1px solid var(--line);
487
+ border-radius: 5px;
488
+ padding: 2px 9px;
489
+ font-size: 12px;
490
+ color: var(--muted);
491
+ cursor: pointer;
492
+ }
493
+
494
+ .copy:hover {
495
+ color: var(--text);
496
+ }
497
+
498
+ .link {
499
+ background: none;
500
+ border: 0;
501
+ padding: 0;
502
+ color: var(--accent);
503
+ cursor: pointer;
504
+ text-align: left;
505
+ }
506
+
507
+ .link:hover {
508
+ text-decoration: underline;
509
+ }
510
+
511
+ .callout {
512
+ display: flex;
513
+ flex-wrap: wrap;
514
+ align-items: center;
515
+ gap: 8px 12px;
516
+ padding: 10px 12px;
517
+ border-left: 3px solid var(--accent);
518
+ background: var(--panel);
519
+ border-radius: 0 var(--radius) var(--radius) 0;
520
+ }
521
+
522
+ .callout p {
523
+ margin: 0;
524
+ }
525
+
526
+ /* ---------- needs attention ---------- */
527
+
528
+ .attention-list {
529
+ list-style: none;
530
+ margin: 0;
531
+ padding: 0;
532
+ display: flex;
533
+ flex-direction: column;
534
+ gap: 10px;
535
+ }
536
+
537
+ .attention {
538
+ padding: 10px 12px;
539
+ border-left: 3px solid var(--idle);
540
+ background: var(--panel-2);
541
+ border-radius: 0 8px 8px 0;
542
+ }
543
+
544
+ .attention.fail {
545
+ border-color: var(--bad);
546
+ }
547
+
548
+ .attention.warn {
549
+ border-color: var(--warn);
550
+ }
551
+
552
+ .attention.info {
553
+ border-color: var(--accent);
554
+ }
555
+
556
+ .attention-head {
557
+ display: flex;
558
+ justify-content: space-between;
559
+ gap: 12px;
560
+ }
561
+
562
+ .attention p {
563
+ margin: 2px 0 8px;
564
+ color: var(--muted);
565
+ }
566
+
567
+ .attention .links {
568
+ margin: 0 0 8px;
569
+ padding-left: 18px;
570
+ }
571
+
572
+ .attention .links li {
573
+ margin-bottom: 2px;
574
+ }
575
+
576
+ .external {
577
+ color: var(--muted);
578
+ vertical-align: -3px;
579
+ }
580
+
581
+ /* ---------- agents ---------- */
582
+
583
+ .agents {
584
+ display: flex;
585
+ flex-direction: column;
586
+ }
587
+
588
+ .agent {
589
+ display: grid;
590
+ grid-template-columns: 92px auto 1fr auto;
591
+ align-items: baseline;
592
+ gap: 4px 10px;
593
+ padding: 7px 4px;
594
+ border: 0;
595
+ border-top: 1px solid var(--line);
596
+ background: none;
597
+ text-align: left;
598
+ }
599
+
600
+ .agent:first-child {
601
+ border-top: 0;
602
+ }
603
+
604
+ button.agent {
605
+ cursor: pointer;
606
+ border-radius: 6px;
607
+ }
608
+
609
+ button.agent:hover {
610
+ background: var(--panel-2);
611
+ }
612
+
613
+ .agent-name {
614
+ font-weight: 600;
615
+ }
616
+
617
+ .agent-detail {
618
+ color: var(--muted);
619
+ font-size: 13px;
620
+ min-width: 0;
621
+ overflow-wrap: anywhere;
622
+ }
623
+
624
+ .agent-time {
625
+ color: var(--muted);
626
+ font-size: 12px;
627
+ white-space: nowrap;
628
+ }
629
+
630
+ /* ---------- quality and results ---------- */
631
+
632
+ .meters,
633
+ .tally {
634
+ list-style: none;
635
+ margin: 0;
636
+ padding: 0;
637
+ }
638
+
639
+ .meters li {
640
+ display: grid;
641
+ grid-template-columns: 140px 1fr 44px 40px;
642
+ align-items: center;
643
+ gap: 10px;
644
+ padding: 4px 0;
645
+ font-size: 13px;
646
+ }
647
+
648
+ .meter {
649
+ height: 6px;
650
+ border-radius: 999px;
651
+ background: var(--idle-bg);
652
+ overflow: hidden;
653
+ }
654
+
655
+ .meter span {
656
+ display: block;
657
+ height: 100%;
658
+ border-radius: 999px;
659
+ }
660
+
661
+ .meter .low {
662
+ background: var(--bad);
663
+ }
664
+
665
+ .meter .mid {
666
+ background: var(--warn);
667
+ }
668
+
669
+ .meter .high {
670
+ background: var(--ok);
671
+ }
672
+
673
+ .big {
674
+ font-size: 22px;
675
+ font-weight: 700;
676
+ margin: 0 0 8px;
677
+ font-variant-numeric: tabular-nums;
678
+ }
679
+
680
+ .big .muted {
681
+ font-size: 13px;
682
+ font-weight: 400;
683
+ }
684
+
685
+ .bar {
686
+ display: flex;
687
+ gap: 2px;
688
+ height: 8px;
689
+ border-radius: 4px;
690
+ overflow: hidden;
691
+ }
692
+
693
+ .bar > span {
694
+ flex-basis: 0;
695
+ min-width: 3px;
696
+ }
697
+
698
+ .bar-ok {
699
+ background: var(--ok);
700
+ }
701
+
702
+ .bar-warn {
703
+ background: var(--warn);
704
+ }
705
+
706
+ .bar-bad {
707
+ background: var(--bad);
708
+ }
709
+
710
+ .bar-idle {
711
+ background: var(--idle);
712
+ }
713
+
714
+ .bar-stop {
715
+ background: repeating-linear-gradient(135deg, var(--bad) 0 2px, transparent 2px 5px);
716
+ }
717
+
718
+ .legend {
719
+ display: flex;
720
+ flex-wrap: wrap;
721
+ gap: 4px 14px;
722
+ margin: 8px 0 4px;
723
+ color: var(--muted);
724
+ font-size: 12px;
725
+ font-variant-numeric: tabular-nums;
726
+ }
727
+
728
+ .legend span {
729
+ display: inline-flex;
730
+ align-items: center;
731
+ gap: 5px;
732
+ }
733
+
734
+ .legend i {
735
+ width: 8px;
736
+ height: 8px;
737
+ border-radius: 2px;
738
+ }
739
+
740
+ .tally {
741
+ margin-top: 10px;
742
+ border-top: 1px solid var(--line);
743
+ }
744
+
745
+ .tally li {
746
+ display: flex;
747
+ justify-content: space-between;
748
+ padding: 5px 0;
749
+ font-size: 13px;
750
+ border-bottom: 1px solid var(--line);
751
+ }
752
+
753
+ /* ---------- lists, rows and groups ---------- */
754
+
755
+ .list {
389
756
  display: flex;
757
+ flex-direction: column;
390
758
  gap: 6px;
759
+ }
760
+
761
+ .row {
762
+ display: block;
763
+ width: 100%;
764
+ background: var(--panel);
765
+ border: 1px solid var(--line);
766
+ border-radius: var(--radius);
767
+ padding: 10px 14px;
768
+ text-align: left;
769
+ cursor: pointer;
770
+ }
771
+
772
+ .card .row {
773
+ background: var(--panel);
774
+ }
775
+
776
+ .row:hover,
777
+ .row.selected {
778
+ border-color: var(--accent);
779
+ }
780
+
781
+ .row-head {
782
+ display: flex;
783
+ align-items: center;
784
+ gap: 8px;
785
+ min-width: 0;
786
+ }
787
+
788
+ .row-title {
789
+ font-weight: 600;
790
+ flex: 1;
791
+ min-width: 0;
792
+ overflow: hidden;
793
+ text-overflow: ellipsis;
794
+ white-space: nowrap;
795
+ }
796
+
797
+ .row-sub {
798
+ color: var(--muted);
799
+ font-size: 12px;
800
+ margin-top: 6px;
801
+ display: flex;
802
+ gap: 4px 14px;
391
803
  flex-wrap: wrap;
392
- margin-top: 8px;
804
+ }
805
+
806
+ .row-sub .why {
807
+ color: var(--text);
808
+ }
809
+
810
+ .rank {
811
+ display: inline-grid;
812
+ place-items: center;
813
+ min-width: 22px;
814
+ height: 22px;
815
+ border-radius: 6px;
816
+ background: var(--panel-2);
817
+ border: 1px solid var(--line);
818
+ font-size: 12px;
819
+ font-weight: 600;
820
+ font-variant-numeric: tabular-nums;
821
+ }
822
+
823
+ .group {
824
+ border-top: 1px solid var(--line);
825
+ padding-top: 8px;
826
+ }
827
+
828
+ .group summary {
829
+ display: flex;
830
+ align-items: center;
831
+ gap: 8px;
832
+ padding: 2px 0 8px;
833
+ cursor: pointer;
834
+ list-style: none;
835
+ font-weight: 600;
836
+ }
837
+
838
+ .group summary::-webkit-details-marker {
839
+ display: none;
840
+ }
841
+
842
+ .group summary::before {
843
+ content: "▸";
844
+ color: var(--muted);
845
+ font-size: 11px;
846
+ transition: transform 0.12s;
847
+ }
848
+
849
+ .group[open] summary::before {
850
+ transform: rotate(90deg);
851
+ }
852
+
853
+ .group-title.bad {
854
+ color: var(--bad);
855
+ }
856
+
857
+ .group-title.warn {
858
+ color: var(--warn);
859
+ }
860
+
861
+ .group-title.run {
862
+ color: var(--run);
863
+ }
864
+
865
+ .count {
866
+ color: var(--muted);
867
+ font-weight: 500;
868
+ font-variant-numeric: tabular-nums;
393
869
  }
394
870
 
395
871
  .filters {
396
872
  display: flex;
397
873
  gap: 6px;
398
- margin-bottom: 12px;
399
874
  flex-wrap: wrap;
400
875
  }
401
876
 
402
- .filters button {
403
- border: 1px solid var(--line);
404
- background: var(--panel);
405
- color: var(--muted);
406
- border-radius: 999px;
407
- padding: 3px 10px;
408
- font: inherit;
409
- font-size: 12px;
410
- cursor: pointer;
877
+ .card .filters {
878
+ margin-bottom: 10px;
879
+ }
880
+
881
+ .filters button {
882
+ border: 1px solid var(--line);
883
+ background: var(--panel);
884
+ color: var(--muted);
885
+ border-radius: 999px;
886
+ padding: 3px 11px;
887
+ font-size: 12px;
888
+ cursor: pointer;
889
+ }
890
+
891
+ .filters button:hover {
892
+ color: var(--text);
893
+ }
894
+
895
+ .filters button.active {
896
+ color: var(--text);
897
+ border-color: var(--accent);
898
+ background: var(--run-bg);
899
+ font-weight: 600;
900
+ }
901
+
902
+ .filters button.active::before {
903
+ content: "✓ ";
904
+ }
905
+
906
+ /* ---------- chips and steps ---------- */
907
+
908
+ .chip {
909
+ display: inline-flex;
910
+ align-items: center;
911
+ gap: 5px;
912
+ font-size: 12px;
913
+ padding: 1px 8px;
914
+ border-radius: 999px;
915
+ background: var(--idle-bg);
916
+ color: var(--idle);
917
+ white-space: nowrap;
918
+ }
919
+
920
+ .chip.ok {
921
+ background: var(--ok-bg);
922
+ color: var(--ok);
923
+ }
924
+
925
+ .chip.bad {
926
+ background: var(--bad-bg);
927
+ color: var(--bad);
928
+ }
929
+
930
+ .chip.warn {
931
+ background: var(--warn-bg);
932
+ color: var(--warn);
933
+ }
934
+
935
+ .chip.run {
936
+ background: var(--run-bg);
937
+ color: var(--run);
938
+ }
939
+
940
+ .chip.stop .dot {
941
+ background: none;
942
+ border: 1.5px solid currentColor;
943
+ }
944
+
945
+ .chip.kind {
946
+ background: transparent;
947
+ border: 1px solid var(--line);
948
+ color: var(--muted);
949
+ }
950
+
951
+ .chip.kind .dot {
952
+ display: none;
953
+ }
954
+
955
+ .dot {
956
+ width: 7px;
957
+ height: 7px;
958
+ border-radius: 50%;
959
+ background: currentColor;
960
+ flex: none;
961
+ }
962
+
963
+ @media (prefers-reduced-motion: no-preference) {
964
+ .chip.run .dot,
965
+ .step.run .mark {
966
+ animation: pulse 1.2s ease-in-out infinite;
967
+ }
968
+ }
969
+
970
+ @keyframes pulse {
971
+ 50% {
972
+ opacity: 0.3;
973
+ }
974
+ }
975
+
976
+ .steps {
977
+ display: flex;
978
+ align-items: center;
979
+ gap: 4px 14px;
980
+ margin: 8px 0 0;
981
+ padding: 0;
982
+ list-style: none;
983
+ flex-wrap: wrap;
984
+ }
985
+
986
+ .step {
987
+ display: inline-flex;
988
+ align-items: center;
989
+ gap: 5px;
990
+ font-size: 12px;
991
+ color: var(--idle);
992
+ }
993
+
994
+ .step .mark {
995
+ width: 17px;
996
+ height: 17px;
997
+ border-radius: 50%;
998
+ display: inline-grid;
999
+ place-items: center;
1000
+ font-size: 10px;
1001
+ border: 1px dashed var(--line);
411
1002
  }
412
1003
 
413
- .filters button.active {
414
- color: var(--text);
415
- border-color: var(--accent);
1004
+ .step.ok,
1005
+ .step.bad,
1006
+ .step.run,
1007
+ .step.wait {
1008
+ font-weight: 500;
416
1009
  }
417
1010
 
418
- pre.output {
419
- background: var(--bg);
420
- border: 1px solid var(--line);
421
- border-radius: 8px;
422
- padding: 10px;
423
- max-height: 320px;
424
- overflow: auto;
425
- white-space: pre-wrap;
426
- word-break: break-word;
427
- margin: 6px 0 0;
1011
+ .step.ok {
1012
+ color: var(--ok);
428
1013
  }
429
1014
 
430
- .events {
431
- list-style: none;
432
- padding: 0;
433
- margin: 0;
434
- display: flex;
435
- flex-direction: column;
436
- gap: 6px;
1015
+ .step.ok .mark {
1016
+ background: var(--ok-bg);
1017
+ border: 0;
437
1018
  }
438
1019
 
439
- .events li {
440
- display: grid;
441
- grid-template-columns: 64px 1fr;
442
- gap: 8px;
443
- font-size: 13px;
1020
+ .step.bad {
1021
+ color: var(--bad);
444
1022
  }
445
1023
 
446
- .events time {
447
- color: var(--muted);
448
- font-variant-numeric: tabular-nums;
449
- font-size: 12px;
1024
+ .step.bad .mark {
1025
+ background: var(--bad-bg);
1026
+ border: 0;
450
1027
  }
451
1028
 
452
- .events .tool {
453
- font-family: var(--mono);
454
- font-size: 12px;
455
- color: var(--accent);
1029
+ .step.run {
1030
+ color: var(--run);
456
1031
  }
457
1032
 
458
- .events .error {
459
- color: var(--bad);
1033
+ .step.run .mark {
1034
+ background: var(--run-bg);
1035
+ border: 0;
460
1036
  }
461
1037
 
462
- .empty {
463
- color: var(--muted);
464
- padding: 32px;
465
- text-align: center;
466
- border: 1px dashed var(--line);
467
- border-radius: var(--radius);
1038
+ .step.wait {
1039
+ color: var(--warn);
468
1040
  }
469
1041
 
470
- .files code {
471
- display: inline-block;
472
- margin: 0 6px 4px 0;
1042
+ .step.wait .mark {
1043
+ background: var(--warn-bg);
1044
+ border: 0;
473
1045
  }
474
1046
 
475
- @media (max-width: 1000px) {
476
- .lanes {
477
- grid-template-columns: repeat(2, minmax(0, 1fr));
478
- }
479
- .layout {
480
- flex-direction: column;
481
- }
482
- .detail {
483
- width: 100%;
484
- position: static;
485
- max-height: none;
486
- }
1047
+ .pills {
1048
+ display: flex;
1049
+ gap: 6px;
1050
+ flex-wrap: wrap;
1051
+ margin-top: 8px;
487
1052
  }
488
1053
 
1054
+ /* ---------- scorecard ---------- */
1055
+
489
1056
  .metrics {
490
1057
  display: grid;
491
- grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
492
- gap: 12px;
493
- margin-bottom: 14px;
1058
+ grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
1059
+ gap: 10px;
494
1060
  }
495
1061
 
496
1062
  .metric {
497
1063
  background: var(--panel);
498
1064
  border: 1px solid var(--line);
499
1065
  border-radius: var(--radius);
500
- padding: 12px 14px;
1066
+ padding: 10px 12px;
501
1067
  }
502
1068
 
503
1069
  .metric-name {
1070
+ font-size: 12px;
1071
+ color: var(--muted);
504
1072
  font-weight: 600;
505
1073
  }
506
1074
 
507
1075
  .metric-value {
508
- font-size: 26px;
1076
+ font-size: 20px;
509
1077
  font-weight: 700;
510
1078
  font-variant-numeric: tabular-nums;
511
- margin: 4px 0;
1079
+ margin: 2px 0;
512
1080
  }
513
1081
 
514
- .metric-value .of {
515
- font-size: 16px;
516
- font-weight: 600;
1082
+ .score-text.low {
1083
+ color: var(--bad);
517
1084
  }
518
1085
 
519
- .metric-q {
520
- color: var(--muted);
521
- font-size: 12px;
522
- margin-top: 4px;
1086
+ .score-text.mid {
1087
+ color: var(--warn);
1088
+ }
1089
+
1090
+ .score-text.high {
1091
+ color: var(--ok);
523
1092
  }
524
1093
 
525
1094
  .spark polyline {
526
1095
  fill: none;
527
1096
  stroke: var(--accent);
528
- stroke-width: 2;
1097
+ stroke-width: 1.6;
529
1098
  }
530
1099
 
531
- .delta {
1100
+ .guardrails {
1101
+ list-style: none;
1102
+ margin: 0;
1103
+ padding: 0;
1104
+ }
1105
+
1106
+ .guardrails li {
1107
+ display: grid;
1108
+ grid-template-columns: 18px 1fr;
1109
+ gap: 0 6px;
1110
+ padding: 6px 0;
1111
+ border-top: 1px solid var(--line);
532
1112
  font-size: 13px;
533
- font-weight: 600;
534
- color: var(--muted);
535
1113
  }
536
1114
 
537
- .delta.up {
1115
+ .guardrails li:first-child {
1116
+ border-top: 0;
1117
+ }
1118
+
1119
+ .guardrails .mark {
1120
+ grid-row: span 2;
1121
+ font-weight: 700;
1122
+ }
1123
+
1124
+ .guardrails .ok .mark {
538
1125
  color: var(--ok);
539
1126
  }
540
1127
 
541
- .delta.down {
1128
+ .guardrails .bad .mark {
542
1129
  color: var(--bad);
543
1130
  }
544
1131
 
1132
+ .guardrails .muted {
1133
+ font-size: 12px;
1134
+ overflow-wrap: anywhere;
1135
+ }
1136
+
1137
+ .table-wrap {
1138
+ overflow-x: auto;
1139
+ border: 1px solid var(--line);
1140
+ border-radius: 8px;
1141
+ }
1142
+
545
1143
  table.units,
546
1144
  table.scores {
547
1145
  width: 100%;
548
1146
  border-collapse: collapse;
549
- background: var(--panel);
550
- border: 1px solid var(--line);
551
- border-radius: var(--radius);
552
- overflow: hidden;
553
1147
  font-variant-numeric: tabular-nums;
554
1148
  }
555
1149
 
1150
+ table.scores {
1151
+ border: 1px solid var(--line);
1152
+ }
1153
+
556
1154
  table.units th,
557
1155
  table.units td,
558
1156
  table.scores th,
559
1157
  table.scores td {
560
- padding: 8px 10px;
1158
+ padding: 6px 10px;
561
1159
  border-bottom: 1px solid var(--line);
562
1160
  text-align: left;
563
1161
  font-size: 13px;
564
1162
  }
565
1163
 
566
- table.units th,
567
- table.scores th {
1164
+ table.units tbody tr:last-child > * {
1165
+ border-bottom: 0;
1166
+ }
1167
+
1168
+ table.units thead th,
1169
+ table.scores thead th {
568
1170
  color: var(--muted);
569
1171
  font-weight: 500;
570
1172
  font-size: 12px;
571
- }
572
-
573
- table.units tbody tr {
574
- cursor: pointer;
1173
+ background: var(--panel-2);
1174
+ white-space: nowrap;
575
1175
  }
576
1176
 
577
1177
  table.units tbody tr:hover,
578
1178
  table.units tbody tr.selected {
579
- background: var(--bg);
1179
+ background: var(--panel-2);
580
1180
  }
581
1181
 
582
- td.path {
583
- max-width: 420px;
1182
+ th.path {
1183
+ font-weight: 400;
1184
+ max-width: 340px;
584
1185
  overflow: hidden;
585
1186
  text-overflow: ellipsis;
586
1187
  white-space: nowrap;
587
1188
  }
588
1189
 
1190
+ th.path .link {
1191
+ font-family: var(--mono);
1192
+ font-size: 12px;
1193
+ }
1194
+
589
1195
  td.na {
590
- color: var(--line);
1196
+ color: var(--muted);
591
1197
  }
592
1198
 
593
1199
  tr.target td {
@@ -599,8 +1205,8 @@ tr.target td {
599
1205
  place-items: center;
600
1206
  min-width: 30px;
601
1207
  padding: 0 4px;
602
- height: 22px;
603
- border-radius: 6px;
1208
+ height: 21px;
1209
+ border-radius: 5px;
604
1210
  font-weight: 600;
605
1211
  font-size: 12px;
606
1212
  }
@@ -611,8 +1217,8 @@ tr.target td {
611
1217
  }
612
1218
 
613
1219
  .score.mid {
614
- background: var(--run-bg);
615
- color: var(--run);
1220
+ background: var(--warn-bg);
1221
+ color: var(--warn);
616
1222
  }
617
1223
 
618
1224
  .score.high {
@@ -629,58 +1235,175 @@ ul.proof li {
629
1235
  margin-bottom: 4px;
630
1236
  }
631
1237
 
632
- .muted {
1238
+ /* ---------- checks and sessions ---------- */
1239
+
1240
+ pre.output {
1241
+ background: var(--panel-2);
1242
+ border: 1px solid var(--line);
1243
+ border-radius: 8px;
1244
+ padding: 10px;
1245
+ max-height: 320px;
1246
+ overflow: auto;
1247
+ white-space: pre-wrap;
1248
+ word-break: break-word;
1249
+ margin: 6px 0 0;
1250
+ }
1251
+
1252
+ .events {
1253
+ list-style: none;
1254
+ padding: 0;
1255
+ margin: 0;
1256
+ display: flex;
1257
+ flex-direction: column;
1258
+ gap: 6px;
1259
+ }
1260
+
1261
+ .events li {
1262
+ display: grid;
1263
+ grid-template-columns: 64px 1fr;
1264
+ gap: 8px;
1265
+ font-size: 13px;
1266
+ }
1267
+
1268
+ .events time {
633
1269
  color: var(--muted);
1270
+ font-variant-numeric: tabular-nums;
1271
+ font-size: 12px;
634
1272
  }
635
1273
 
636
- h3.section {
1274
+ .events .tool {
1275
+ font-family: var(--mono);
637
1276
  font-size: 12px;
638
- text-transform: uppercase;
639
- letter-spacing: 0.04em;
640
- color: var(--muted);
641
- margin: 4px 0 6px;
1277
+ color: var(--accent);
1278
+ }
1279
+
1280
+ .events .error {
1281
+ color: var(--bad);
1282
+ }
1283
+
1284
+ .files code {
1285
+ display: inline-block;
1286
+ margin: 0 6px 4px 0;
1287
+ }
1288
+
1289
+ /* ---------- narrow screens ---------- */
1290
+
1291
+ @media (max-width: 1100px) {
1292
+ .grid.two,
1293
+ .grid.two.narrow-right {
1294
+ grid-template-columns: minmax(0, 1fr);
1295
+ }
1296
+ .layout {
1297
+ flex-direction: column;
1298
+ }
1299
+ .detail {
1300
+ width: 100%;
1301
+ position: static;
1302
+ max-height: none;
1303
+ }
1304
+ }
1305
+
1306
+ @media (max-width: 760px) {
1307
+ .top {
1308
+ flex-wrap: wrap;
1309
+ height: auto;
1310
+ gap: 4px 12px;
1311
+ padding: 8px 12px 0;
1312
+ }
1313
+ .tabs {
1314
+ order: 3;
1315
+ flex-basis: 100%;
1316
+ height: 40px;
1317
+ }
1318
+ .tools {
1319
+ margin-left: auto;
1320
+ }
1321
+ .layout {
1322
+ padding: 12px;
1323
+ }
1324
+ .agent {
1325
+ grid-template-columns: 1fr auto;
1326
+ }
1327
+ .agent-detail {
1328
+ grid-column: 1 / -1;
1329
+ }
1330
+ .meters li {
1331
+ grid-template-columns: 1fr 44px 40px;
1332
+ }
1333
+ .meter {
1334
+ display: none;
1335
+ }
1336
+ .row-title {
1337
+ white-space: normal;
1338
+ }
1339
+ .row-head {
1340
+ flex-wrap: wrap;
1341
+ }
642
1342
  }
643
1343
 
644
- .pills.guardrails {
645
- margin-bottom: 14px;
1344
+ /* ---------- share ---------- */
1345
+
1346
+ .page-actions {
1347
+ display: flex;
1348
+ justify-content: flex-end;
1349
+ }
1350
+
1351
+ .share-link {
1352
+ padding: 5px 12px;
1353
+ border: 1px solid var(--line);
1354
+ border-radius: 7px;
1355
+ background: var(--panel);
1356
+ font-weight: 600;
646
1357
  }
647
1358
 
648
- .metric.overall {
1359
+ .share-link:hover {
649
1360
  border-color: var(--accent);
1361
+ text-decoration: none;
650
1362
  }
651
1363
 
652
- .metric-value.low {
653
- color: var(--bad);
1364
+ /* The card page has no top bar: only the card and its actions. */
1365
+ body.sharing {
1366
+ background: #05070f;
1367
+ color: #e2e8f0;
654
1368
  }
655
1369
 
656
- .metric-value.mid {
657
- color: var(--run);
1370
+ body.sharing .top {
1371
+ display: none;
658
1372
  }
659
1373
 
660
- .metric-value.high {
661
- color: var(--ok);
1374
+ .share {
1375
+ display: flex;
1376
+ flex-direction: column;
1377
+ gap: 14px;
1378
+ width: 100%;
1379
+ max-width: 1200px;
1380
+ margin: 0 auto;
662
1381
  }
663
1382
 
664
- .coverage {
1383
+ .share-bar {
665
1384
  display: flex;
666
1385
  align-items: center;
667
- gap: 12px;
668
- color: var(--muted);
669
- font-size: 13px;
670
- margin: 4px 0 10px;
1386
+ gap: 16px;
671
1387
  }
672
1388
 
673
- .coverage-bar {
674
- width: 160px;
675
- height: 8px;
676
- border-radius: 999px;
677
- background: var(--idle-bg);
678
- overflow: hidden;
679
- flex: none;
1389
+ .share-bar .muted {
1390
+ color: #94a3b8;
680
1391
  }
681
1392
 
682
- .coverage-bar span {
1393
+ .share-back {
1394
+ color: #67e8f9;
1395
+ }
1396
+
1397
+ .share-actions {
1398
+ display: flex;
1399
+ gap: 8px;
1400
+ margin-left: auto;
1401
+ }
1402
+
1403
+ .share-card svg {
683
1404
  display: block;
684
- height: 100%;
685
- background: var(--accent);
1405
+ width: 100%;
1406
+ height: auto;
1407
+ border-radius: 16px;
1408
+ box-shadow: 0 24px 64px rgb(0 0 0 / 0.5);
686
1409
  }