@tea-agent/loop-agent 0.8.0 → 0.9.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.
@@ -1,42 +1,62 @@
1
1
  :root {
2
- --bg: #0d1117;
3
- --surface: #161b22;
4
- --surface-raised: #1c2128;
5
- --border: #30363d;
6
- --text: #c9d1d9;
7
- --muted: #8b949e;
8
- --link: #58a6ff;
9
- --green: #3fb950;
10
- --red: #f85149;
11
- --yellow: #d29922;
12
- --blue: #58a6ff;
13
- --gray-red: #8b3a3a;
2
+ --canvas: #f7f7f4;
3
+ --canvas-soft: #fafaf7;
4
+ --surface: #ffffff;
5
+ --surface-muted: #f0efe9;
6
+ --surface-ink: #26251e;
7
+ --ink: #26251e;
8
+ --body: #5a5852;
9
+ --muted: #807d72;
10
+ --muted-soft: #a09c92;
11
+ --hairline: #e6e5e0;
12
+ --hairline-strong: #cfcdc4;
13
+ --orange: #f54e00;
14
+ --orange-active: #d04200;
15
+ --blue: #3f6ea4;
16
+ --green: #1f8a65;
17
+ --amber: #a66a00;
18
+ --red: #c72d53;
19
+ --lavender: #e4daf1;
20
+ --mint: #d8ead5;
21
+ --peach: #f1d8cb;
22
+ --gold: #d8b166;
14
23
  --space-1: 4px;
15
24
  --space-2: 8px;
16
25
  --space-3: 12px;
17
26
  --space-4: 16px;
27
+ --space-5: 20px;
18
28
  --space-6: 24px;
19
29
  --space-8: 32px;
30
+ --space-10: 40px;
31
+ --space-12: 48px;
20
32
  --radius-sm: 4px;
21
- --radius-md: 8px;
22
- --radius-lg: 12px;
23
- --shadow-1: 0 4px 18px rgba(0, 0, 0, 0.2);
24
- --transition-fast: 140ms ease;
33
+ --radius-md: 6px;
34
+ --radius-lg: 8px;
35
+ --transition-fast: 160ms ease;
36
+ --transition-base: 240ms ease;
25
37
  }
26
38
 
27
- * {
28
- box-sizing: border-box;
29
- }
39
+ * { box-sizing: border-box; }
40
+
41
+ html { background: var(--canvas); scroll-behavior: smooth; }
30
42
 
31
43
  body {
44
+ min-width: 320px;
32
45
  margin: 0;
46
+ background: var(--canvas);
47
+ color: var(--ink);
33
48
  font-family: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
34
- font-size: 13px;
49
+ font-size: 14px;
35
50
  line-height: 1.5;
36
- background: var(--bg);
37
- color: var(--text);
38
51
  }
39
52
 
53
+ button,
54
+ input,
55
+ select,
56
+ textarea { font: inherit; }
57
+
58
+ a { color: inherit; }
59
+
40
60
  code,
41
61
  pre,
42
62
  .output-block,
@@ -45,678 +65,534 @@ pre,
45
65
  .dag-node-meta,
46
66
  .dag-node-status,
47
67
  td:first-child,
48
- .meta-item dd {
49
- font-family: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace;
68
+ .meta-item dd,
69
+ .header-refresh,
70
+ .kpi-value,
71
+ .risk-total,
72
+ .process-timeline-time {
73
+ font-family: "JetBrains Mono", "SFMono-Regular", Consolas, monospace;
50
74
  }
51
75
 
76
+ .skip-link {
77
+ position: fixed;
78
+ top: -64px;
79
+ left: var(--space-4);
80
+ z-index: 100;
81
+ padding: 9px 12px;
82
+ background: var(--orange);
83
+ color: #fff;
84
+ font-weight: 700;
85
+ text-decoration: none;
86
+ transition: top var(--transition-fast);
87
+ }
88
+
89
+ .skip-link:focus { top: var(--space-3); }
90
+
52
91
  #app {
53
- max-width: 1200px;
92
+ width: min(100% - 48px, 1680px);
54
93
  margin: 0 auto;
55
- padding: 1rem 1.5rem 2rem;
94
+ padding-bottom: 56px;
56
95
  }
57
96
 
58
97
  .site-header {
59
- display: flex;
60
- flex-wrap: wrap;
98
+ position: sticky;
99
+ top: 0;
100
+ z-index: 30;
101
+ display: grid;
102
+ grid-template-columns: auto auto 1fr;
103
+ grid-template-areas: "brand nav status" "crumb crumb crumb";
104
+ column-gap: var(--space-6);
61
105
  align-items: center;
62
- gap: 1rem 1.5rem;
63
- margin-bottom: 1.5rem;
64
- padding-bottom: 0.75rem;
65
- border-bottom: 1px solid var(--border);
106
+ min-height: 76px;
107
+ margin-bottom: var(--space-8);
108
+ padding: 14px 0 12px;
109
+ background: color-mix(in srgb, var(--canvas) 94%, transparent);
110
+ border-bottom: 1px solid var(--hairline);
111
+ backdrop-filter: blur(10px);
66
112
  }
67
113
 
68
114
  .logo {
69
- color: var(--text);
115
+ grid-area: brand;
116
+ display: inline-flex;
117
+ align-items: center;
118
+ gap: 9px;
119
+ color: var(--ink);
120
+ font-size: 16px;
121
+ font-weight: 650;
122
+ letter-spacing: 0;
70
123
  text-decoration: none;
71
- font-weight: 600;
72
124
  }
73
125
 
74
- .logo:hover {
75
- color: var(--link);
76
- }
126
+ .logo > i { color: var(--orange); font-size: 20px; font-weight: 400; }
127
+ .logo:hover { color: var(--orange-active); }
77
128
 
78
129
  .top-nav {
79
- display: flex;
80
- gap: 1rem;
130
+ grid-area: nav;
131
+ display: inline-flex;
132
+ align-items: center;
133
+ gap: 4px;
81
134
  }
82
135
 
83
136
  .nav-link {
84
- color: var(--muted);
137
+ display: inline-flex;
138
+ align-items: center;
139
+ gap: 7px;
140
+ min-height: 36px;
141
+ padding: 0 10px;
142
+ border: 1px solid transparent;
143
+ border-radius: var(--radius-sm);
144
+ color: var(--body);
145
+ font-size: 13px;
146
+ font-weight: 600;
85
147
  text-decoration: none;
86
- font-size: 12px;
148
+ transition: border-color var(--transition-fast), background-color var(--transition-fast), color var(--transition-fast);
87
149
  }
88
150
 
89
- .nav-link:hover {
90
- color: var(--link);
91
- }
151
+ .nav-link > i { font-size: 16px; font-weight: 400; }
152
+ .nav-link:hover,
153
+ .nav-link:focus-visible { border-color: var(--hairline-strong); background: var(--surface); color: var(--ink); outline: none; }
154
+ .nav-link-active { border-color: var(--orange); background: var(--surface); color: var(--ink); }
92
155
 
93
- .header-refresh {
94
- margin-left: auto;
156
+ .header-meta {
157
+ grid-area: status;
158
+ display: inline-flex;
159
+ justify-self: end;
160
+ align-items: center;
161
+ gap: 7px;
95
162
  color: var(--muted);
96
- font-size: 11px;
163
+ font-size: 12px;
164
+ font-variant-numeric: tabular-nums;
97
165
  }
98
166
 
167
+ .header-meta > i { color: var(--green); font-size: 16px; }
168
+
99
169
  .breadcrumb {
100
- flex-basis: 100%;
170
+ grid-area: crumb;
171
+ display: flex;
172
+ min-height: 16px;
173
+ gap: 7px;
101
174
  color: var(--muted);
102
175
  font-size: 12px;
103
176
  }
104
177
 
105
- .breadcrumb a {
106
- color: var(--link);
107
- text-decoration: none;
108
- }
178
+ .breadcrumb[hidden] { display: none; }
109
179
 
110
- .breadcrumb a:hover {
111
- text-decoration: underline;
112
- }
180
+ .breadcrumb a { color: var(--body); text-decoration: none; }
181
+ .breadcrumb a:hover,
182
+ .breadcrumb a:focus-visible { color: var(--orange); text-decoration: underline; outline: none; }
113
183
 
114
- h2 {
115
- margin: 0 0 0.75rem;
116
- font-size: 1.1rem;
117
- font-weight: 600;
118
- }
184
+ .dashboard-main:focus { outline: none; }
185
+ .view { min-width: 0; }
186
+ .view[hidden] { display: none !important; }
187
+ .view:not(.view-dashboard) { display: grid; gap: var(--space-4); }
119
188
 
120
- h3,
121
- .section-heading {
122
- margin: 0 0 0.5rem;
123
- font-size: 0.95rem;
124
- font-weight: 600;
125
- }
126
-
127
- .panel {
128
- background: var(--surface);
129
- border: 1px solid var(--border);
130
- border-radius: var(--radius-md);
131
- padding: 0.75rem 1rem;
132
- margin-bottom: 1rem;
133
- }
134
-
135
- .dag-graph-wrap {
189
+ .view-heading {
136
190
  display: grid;
137
- gap: var(--space-2);
191
+ gap: 4px;
192
+ margin-bottom: var(--space-6);
138
193
  }
139
194
 
140
- .dag-graph-toolbar {
141
- display: flex;
142
- align-items: center;
143
- justify-content: space-between;
144
- gap: var(--space-3);
195
+ .view-kicker {
196
+ margin: 0;
197
+ color: var(--orange);
198
+ font-size: 11px;
199
+ font-weight: 700;
200
+ letter-spacing: .08em;
145
201
  }
146
202
 
147
- .dag-graph-summary,
148
- .dag-graph-fallback {
149
- color: var(--muted);
150
- font-size: 12px;
203
+ .view h2 {
204
+ margin: 0;
205
+ color: var(--ink);
206
+ font-size: 28px;
207
+ font-weight: 500;
208
+ line-height: 1.16;
209
+ letter-spacing: 0;
151
210
  }
152
211
 
153
- .dag-graph-fallback { margin: 0; }
154
-
155
- .dag-graph-reset {
156
- appearance: none;
157
- border: 1px solid var(--border);
158
- border-radius: var(--radius-sm);
159
- background: var(--surface-raised);
160
- color: var(--text);
161
- padding: 6px 10px;
162
- cursor: pointer;
163
- }
212
+ .view-heading > p:last-child { max-width: 66ch; margin: 0; color: var(--body); }
164
213
 
165
- .dag-graph-reset:hover,
166
- .dag-graph-reset:focus-visible { border-color: var(--link); }
167
-
168
- .dag-graph-viewport {
169
- min-height: 220px;
170
- max-height: 620px;
171
- overflow: auto;
172
- border: 1px solid var(--border);
173
- border-radius: var(--radius-md);
174
- background: radial-gradient(circle at 1px 1px, rgba(139, 148, 158, 0.18) 1px, transparent 0) 0 0 / 20px 20px, var(--bg);
175
- scroll-behavior: smooth;
214
+ .panel {
215
+ min-width: 0;
216
+ background: var(--surface);
217
+ border: 1px solid var(--hairline);
218
+ border-radius: var(--radius-lg);
219
+ padding: var(--space-5);
176
220
  }
177
221
 
178
- .dag-graph { display: block; }
179
- .dag-edge { fill: none; stroke: var(--muted); stroke-width: 2; opacity: 0.75; transition: opacity var(--transition-fast); }
180
- .dag-edge + .dag-edge { stroke-width: 1.8; }
181
- #dag-arrow path { fill: var(--muted); }
182
- .dag-graph-node { cursor: pointer; transition: opacity var(--transition-fast); }
183
- .dag-graph-node rect { fill: var(--surface-raised); stroke: var(--border); stroke-width: 1.5; }
184
- .dag-graph-node:hover rect,
185
- .dag-graph-node:focus-visible rect { stroke: var(--link); stroke-width: 2.5; }
186
- .dag-graph-node:focus { outline: none; }
187
- .dag-graph-node.selected rect { stroke: var(--link); stroke-width: 3; filter: drop-shadow(0 0 6px rgba(88, 166, 255, 0.45)); }
188
- .dag-graph-node.status-running rect,
189
- .dag-graph-node.status-started rect { stroke: var(--yellow); }
190
- .dag-graph-node.status-failed rect,
191
- .dag-graph-node.status-error rect { stroke: var(--red); fill: rgba(248, 81, 73, 0.1); }
192
- .dag-graph-node.status-skipped rect { stroke-dasharray: 5 4; }
193
- .dag-node-label { fill: var(--text); font-size: 13px; font-weight: 700; }
194
- .dag-node-meta { fill: var(--muted); font-size: 11px; }
195
- .dag-node-status { fill: var(--text); font-size: 11px; }
196
- .dag-dimmed { opacity: 0.25; }
197
- .dag-graph-node.status-running { animation: graph-node-pulse 2s ease-in-out infinite; }
222
+ .panel-primary { border-color: var(--hairline-strong); }
223
+ .panel-meta { background: transparent; border-color: var(--hairline-strong); }
224
+ .panel-table { overflow: hidden; padding: 0; }
225
+ .panel-output { background: #fbfbf9; }
198
226
 
199
- @keyframes graph-node-pulse {
200
- 50% { filter: drop-shadow(0 0 7px rgba(210, 153, 34, 0.45)); }
227
+ .section-heading,
228
+ .panel h3 {
229
+ margin: 0 0 var(--space-4);
230
+ color: var(--ink);
231
+ font-size: 14px;
232
+ font-weight: 700;
201
233
  }
202
234
 
203
- @media (max-width: 680px) {
204
- #app { padding-inline: var(--space-3); }
205
- .meta-grid { grid-template-columns: 1fr; }
206
- .dag-graph-viewport { max-height: 480px; }
207
- table { min-width: 760px; }
208
- .panel { overflow-x: auto; }
209
- }
235
+ .empty,
236
+ .risk-empty { margin: 0; color: var(--muted); }
237
+ .empty-state { padding: var(--space-8); text-align: center; color: var(--body); }
210
238
 
211
- @media (prefers-reduced-motion: reduce) {
212
- *, *::before, *::after {
213
- animation-duration: 0.01ms !important;
214
- animation-iteration-count: 1 !important;
215
- scroll-behavior: auto !important;
216
- transition-duration: 0.01ms !important;
217
- }
218
- }
239
+ .view-dashboard { display: grid; gap: var(--space-4); }
240
+
241
+ .panel-kpi { padding: 0; background: transparent; border: 0; }
219
242
 
220
243
  .kpi-grid {
221
244
  display: grid;
222
- grid-template-columns: repeat(auto-fill, minmax(120px, 1fr));
223
- gap: 0.75rem;
224
- padding: 0.75rem;
245
+ grid-template-columns: repeat(6, minmax(0, 1fr));
246
+ overflow: hidden;
247
+ border: 1px solid var(--hairline-strong);
248
+ border-radius: var(--radius-lg);
249
+ background: var(--surface);
225
250
  }
226
251
 
227
252
  .kpi-card {
228
- background: var(--bg);
229
- border: 1px solid var(--border);
230
- border-radius: 6px;
231
- padding: 0.6rem 0.75rem;
232
- text-align: center;
253
+ position: relative;
254
+ min-width: 0;
255
+ min-height: 84px;
256
+ padding: 15px 18px 14px;
257
+ border-left: 1px solid var(--hairline);
233
258
  }
234
259
 
235
- .kpi-card.kpi-highlight {
236
- border-color: var(--yellow);
237
- background: rgba(210, 153, 34, 0.08);
238
- }
239
-
240
- .kpi-card.kpi-danger {
241
- border-color: var(--red);
242
- }
243
-
244
- .kpi-label {
245
- color: var(--muted);
246
- font-size: 10px;
247
- text-transform: uppercase;
248
- margin-bottom: 0.25rem;
249
- }
260
+ .kpi-card:first-child { border-left: 0; }
261
+ .kpi-label { margin-bottom: 9px; color: var(--muted); font-size: 11px; font-weight: 650; }
262
+ .kpi-value { color: var(--ink); font-size: 26px; font-weight: 500; line-height: 1; font-variant-numeric: tabular-nums; }
250
263
 
251
- .kpi-value {
252
- font-size: 1.4rem;
253
- font-weight: 700;
254
- }
255
-
256
- .active-dag-list {
257
- display: flex;
258
- flex-direction: column;
259
- gap: 0.75rem;
260
- }
261
-
262
- .active-dag-card {
263
- background: var(--bg);
264
- border: 1px solid var(--border);
265
- border-radius: 6px;
266
- padding: 0.75rem 1rem;
267
- }
268
-
269
- .active-dag-card-running {
270
- border-color: var(--yellow);
271
- box-shadow: 0 0 0 1px rgba(210, 153, 34, 0.25);
272
- animation: pulse-border 2s ease-in-out infinite;
264
+ .dashboard-workspace,
265
+ .dashboard-secondary {
266
+ display: grid;
267
+ gap: var(--space-4);
268
+ align-items: stretch;
273
269
  }
274
270
 
275
- @keyframes pulse-border {
276
- 0%,
277
- 100% {
278
- border-color: var(--yellow);
279
- }
280
- 50% {
281
- border-color: rgba(210, 153, 34, 0.5);
282
- }
283
- }
271
+ .dashboard-workspace { grid-template-columns: 1fr; }
272
+ .dashboard-secondary { grid-template-columns: repeat(2, minmax(0, 1fr)); }
284
273
 
285
- .active-dag-header {
286
- display: flex;
274
+ .panel-risk {
275
+ display: grid;
276
+ grid-template-columns: minmax(130px, .28fr) minmax(0, 1fr) auto;
287
277
  align-items: center;
288
- gap: 0.75rem;
289
- margin-bottom: 0.35rem;
290
- }
291
-
292
- .active-dag-title {
293
- font-weight: 600;
294
- flex: 1;
278
+ gap: var(--space-4);
279
+ background: var(--canvas-soft);
295
280
  }
296
281
 
297
- .active-dag-meta {
298
- display: flex;
299
- flex-direction: column;
300
- gap: 0.2rem;
301
- color: var(--muted);
302
- font-size: 12px;
303
- margin-bottom: 0.5rem;
304
- }
282
+ .panel-risk-attention { border-color: color-mix(in srgb, var(--red) 50%, var(--hairline)); background: #fff8f9; }
283
+ .panel-risk .section-heading { margin: 0; }
284
+ .risk-total { margin: 0; color: var(--amber); font-size: 38px; font-weight: 500; line-height: 1; font-variant-numeric: tabular-nums; }
285
+ .panel-risk-attention .risk-total { color: var(--red); }
286
+ .risk-summary { margin: 0; color: var(--body); font-size: 12px; line-height: 1.6; }
287
+ .panel-risk .risk-empty { grid-column: 2 / -1; }
305
288
 
306
- .active-dag-link {
307
- color: var(--link);
308
- text-decoration: none;
289
+ .risk-link,
290
+ .active-dag-link,
291
+ .link,
292
+ .inbox-link,
293
+ .artifact-link,
294
+ .step-link {
295
+ color: var(--ink);
309
296
  font-size: 12px;
297
+ font-weight: 700;
298
+ text-decoration-color: var(--orange);
299
+ text-decoration-thickness: 1px;
300
+ text-underline-offset: 4px;
310
301
  }
311
302
 
312
- .active-dag-link:hover {
313
- text-decoration: underline;
314
- }
303
+ .risk-link { margin: 0; padding: 0; white-space: nowrap; }
304
+ .risk-link:hover,
305
+ .active-dag-link:hover,
306
+ .link:hover,
307
+ .inbox-link:hover,
308
+ .artifact-link:hover,
309
+ .step-link:hover { color: var(--orange-active); }
315
310
 
316
- .dashboard-footer {
317
- margin-top: 0.75rem;
318
- color: var(--muted);
319
- font-size: 12px;
320
- }
311
+ .active-dag-list { display: grid; gap: 10px; }
312
+ .active-dag-card { padding: 14px; border: 1px solid var(--hairline); border-radius: var(--radius-md); background: var(--canvas-soft); }
313
+ .active-dag-card-running { border-left: 3px solid var(--orange); padding-left: 12px; }
314
+ .active-dag-header { display: flex; align-items: start; justify-content: space-between; gap: var(--space-3); margin-bottom: 9px; }
315
+ .active-dag-title { min-width: 0; color: var(--ink); font-size: 14px; font-weight: 700; overflow-wrap: anywhere; }
316
+ .active-dag-meta { display: grid; gap: 4px; color: var(--body); font-size: 12px; }
317
+ .active-dag-link { display: inline-block; margin-top: 10px; }
321
318
 
322
319
  .meta-grid {
323
320
  display: grid;
324
- grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
325
- gap: 0.5rem 1.5rem;
326
- }
327
-
328
- .meta-item dt {
329
- color: var(--muted);
330
- font-size: 11px;
331
- text-transform: uppercase;
321
+ grid-template-columns: repeat(auto-fit, minmax(160px, 1fr));
322
+ gap: 15px 24px;
332
323
  margin: 0;
333
324
  }
334
325
 
335
- .meta-item dd {
336
- margin: 0.15rem 0 0;
337
- }
338
-
339
- table {
340
- width: 100%;
341
- border-collapse: collapse;
342
- }
326
+ .meta-item { min-width: 0; }
327
+ .meta-item dt { color: var(--muted); font-size: 11px; font-weight: 650; }
328
+ .meta-item dd { min-height: 24px; margin: 4px 0 0; padding-top: 5px; border-top: 1px solid var(--hairline); color: var(--ink); overflow-wrap: anywhere; font-size: 12px; }
343
329
 
330
+ table { width: 100%; border-collapse: collapse; font-size: 13px; }
344
331
  th,
345
- td {
346
- text-align: left;
347
- padding: 0.4rem 0.6rem;
348
- border-bottom: 1px solid var(--border);
349
- }
350
-
351
- th {
352
- color: var(--muted);
353
- font-size: 11px;
354
- text-transform: uppercase;
355
- font-weight: 600;
356
- }
357
-
358
- tbody tr:hover {
359
- background: rgba(255, 255, 255, 0.03);
360
- }
361
-
362
- tbody tr.clickable {
363
- cursor: pointer;
364
- }
365
-
366
- tbody tr.dag-node-selected {
367
- background: rgba(88, 166, 255, 0.12);
368
- }
369
-
370
- .timeline-node-label {
371
- color: var(--muted);
372
- font-size: 12px;
373
- margin: 0 0 0.5rem;
374
- }
375
-
376
- .process-timeline-scroll {
377
- max-height: 320px;
378
- overflow-y: auto;
379
- border: 1px solid var(--border);
380
- border-radius: 4px;
381
- background: var(--bg);
382
- }
383
-
384
- .process-timeline {
385
- list-style: none;
386
- margin: 0;
387
- padding: 0.25rem 0;
388
- }
389
-
390
- .process-timeline-item {
391
- display: flex;
392
- gap: 0.75rem;
393
- padding: 0.35rem 0.75rem;
394
- border-bottom: 1px solid var(--border);
395
- font-size: 12px;
396
- }
397
-
398
- .process-timeline-item:last-child {
399
- border-bottom: none;
400
- }
401
-
402
- .process-timeline-time {
403
- flex: 0 0 4.5rem;
404
- color: var(--muted);
405
- font-variant-numeric: tabular-nums;
406
- }
407
-
408
- .process-timeline-label {
409
- flex: 1;
410
- word-break: break-word;
411
- }
412
-
413
- tbody tr.active-task {
414
- background: rgba(210, 153, 34, 0.12);
415
- }
332
+ td { padding: 11px 14px; border-bottom: 1px solid var(--hairline); text-align: left; vertical-align: top; }
333
+ th { position: sticky; top: 0; z-index: 2; background: var(--surface-muted); color: var(--body); font-size: 11px; font-weight: 700; }
334
+ td { color: var(--body); }
335
+ tbody tr:last-child td { border-bottom: 0; }
336
+ tbody tr { transition: background-color var(--transition-fast); }
337
+ tbody tr:hover { background: #fff8f4; }
338
+ tr.clickable { cursor: pointer; }
339
+ tr.clickable:focus-within { outline: 2px solid var(--orange); outline-offset: -2px; }
416
340
 
417
341
  .badge {
418
- display: inline-block;
419
- padding: 0.1rem 0.45rem;
420
- border-radius: 4px;
342
+ display: inline-flex;
343
+ align-items: center;
344
+ min-height: 22px;
345
+ padding: 2px 7px;
346
+ border: 1px solid currentColor;
347
+ border-radius: 999px;
348
+ background: transparent;
349
+ color: var(--muted);
421
350
  font-size: 11px;
422
- font-weight: 600;
351
+ font-weight: 700;
352
+ line-height: 1.2;
353
+ white-space: nowrap;
423
354
  }
424
355
 
425
356
  .badge-succeeded,
426
357
  .badge-finished,
427
358
  .badge-completed,
428
- .badge-done {
429
- background: rgba(63, 185, 80, 0.2);
430
- color: var(--green);
431
- }
432
-
359
+ .badge-done,
360
+ .liveness-active { color: var(--green); background: #f2faf5; }
433
361
  .badge-failed,
434
- .badge-error {
435
- background: rgba(248, 81, 73, 0.2);
436
- color: var(--red);
437
- }
438
-
439
- .badge-partial-failed {
440
- background: rgba(248, 81, 73, 0.15);
441
- color: #ff9a8b;
442
- border: 1px solid rgba(248, 81, 73, 0.35);
443
- }
444
-
362
+ .badge-error,
363
+ .liveness-stale { color: var(--red); background: #fff5f7; }
364
+ .badge-partial-failed { color: #9a3a4f; background: #fff7f8; }
445
365
  .badge-running,
446
- .badge-started {
447
- background: rgba(210, 153, 34, 0.2);
448
- color: var(--yellow);
449
- }
450
-
451
- .badge-skipped {
452
- background: rgba(139, 148, 158, 0.15);
453
- color: var(--muted);
454
- }
455
-
456
- .badge-stale {
457
- background: rgba(139, 58, 58, 0.3);
458
- color: #e06c75;
459
- }
460
-
461
- .badge-reused {
462
- background: rgba(88, 166, 255, 0.2);
463
- color: var(--blue);
464
- }
465
-
366
+ .badge-started { color: var(--orange-active); background: #fff5ed; }
466
367
  .badge-pending,
368
+ .badge-queued,
467
369
  .badge-blocked,
468
- .badge-unknown,
469
- .badge-queued {
470
- background: rgba(139, 148, 158, 0.15);
471
- color: var(--muted);
472
- }
473
-
474
- .liveness-active {
475
- background: rgba(63, 185, 80, 0.2);
476
- color: var(--green);
477
- }
478
-
479
- .liveness-quiet {
480
- background: rgba(210, 153, 34, 0.2);
481
- color: var(--yellow);
482
- }
483
-
484
- .liveness-stale {
485
- background: rgba(139, 58, 58, 0.3);
486
- color: #e06c75;
487
- }
488
-
489
- .liveness-timeout-risk {
490
- background: rgba(248, 81, 73, 0.25);
491
- color: var(--red);
492
- }
493
-
494
- .rank-lanes {
495
- display: flex;
496
- flex-direction: column;
497
- gap: 0.75rem;
498
- }
499
-
500
- .rank-lane {
501
- border-left: 3px solid var(--border);
502
- padding-left: 0.75rem;
503
- }
504
-
505
- .rank-lane-label {
506
- color: var(--muted);
507
- font-size: 11px;
508
- font-weight: 600;
509
- margin-bottom: 0.35rem;
510
- }
511
-
512
- .rank-lane-nodes {
513
- display: flex;
514
- flex-wrap: wrap;
515
- gap: 0.5rem;
516
- }
517
-
518
- .rank-node-chip {
519
- display: inline-flex;
520
- align-items: center;
521
- gap: 0.35rem;
522
- background: var(--bg);
523
- border: 1px solid var(--border);
524
- border-radius: 4px;
525
- padding: 0.25rem 0.5rem;
526
- font-size: 12px;
527
- }
528
-
529
- .rank-node-active {
530
- border-color: var(--yellow);
531
- background: rgba(210, 153, 34, 0.12);
532
- }
533
-
534
- .rank-node-error {
535
- border-color: var(--red);
536
- background: rgba(248, 81, 73, 0.1);
537
- }
538
-
539
- .rank-node-id {
540
- font-weight: 600;
541
- }
542
-
543
- .rank-node-dur {
544
- color: var(--muted);
545
- font-size: 10px;
546
- }
547
-
548
- .step-timeline {
549
- list-style: none;
550
- margin: 0;
370
+ .badge-unknown { color: var(--body); background: var(--surface-muted); }
371
+ .badge-skipped,
372
+ .badge-reused,
373
+ .liveness-quiet { color: var(--blue); background: #f2f6fb; }
374
+ .liveness-timeout-risk { color: var(--amber); background: #fff8e7; }
375
+
376
+ .dag-detail-workspace { display: block; }
377
+
378
+ .dag-inspector {
379
+ position: fixed;
380
+ z-index: 40;
381
+ top: 96px;
382
+ right: 24px;
383
+ bottom: 24px;
384
+ display: grid;
385
+ grid-template-rows: auto minmax(0, 1fr);
386
+ width: min(440px, calc(100vw - 48px));
387
+ min-width: 0;
551
388
  padding: 0;
552
- }
553
-
554
- .step-timeline li {
555
- display: flex;
556
- align-items: center;
557
- gap: 0.75rem;
558
- padding: 0.35rem 0;
559
- border-bottom: 1px solid var(--border);
560
- }
561
-
562
- .step-timeline li:last-child {
563
- border-bottom: none;
564
- }
565
-
566
- .step-marker {
567
- width: 1.5rem;
568
- text-align: center;
569
- font-weight: 700;
570
- }
571
-
572
- .step-marker.succeeded {
573
- color: var(--green);
574
- }
575
-
576
- .step-marker.running {
577
- color: var(--yellow);
578
- }
579
-
580
- .step-marker.pending {
581
- color: var(--muted);
582
- }
583
-
584
- .step-marker.failed {
585
- color: var(--red);
586
- }
587
-
588
- .step-name {
589
- flex: 1;
590
- }
591
-
592
- .step-duration {
593
- color: var(--muted);
594
- font-size: 11px;
595
- }
596
-
597
- .output-block {
598
- background: var(--bg);
599
- border: 1px solid var(--border);
600
- border-radius: 4px;
601
- padding: 0.5rem 0.75rem;
602
- white-space: pre-wrap;
603
- word-break: break-all;
604
- max-height: 240px;
605
- overflow-y: auto;
389
+ overflow: hidden;
390
+ border-color: var(--hairline-strong);
391
+ box-shadow: 0 20px 48px rgba(38, 37, 30, .16);
392
+ opacity: 0;
393
+ pointer-events: none;
394
+ transform: translateX(calc(100% + 24px));
395
+ visibility: hidden;
396
+ transition: transform var(--transition-base), opacity var(--transition-base);
397
+ }
398
+ .dag-inspector.is-open { opacity: 1; pointer-events: auto; transform: translateX(0); visibility: visible; }
399
+ .dag-inspector-header { display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: var(--space-3); align-items: start; padding: var(--space-4) var(--space-4) var(--space-3); border-bottom: 1px solid var(--hairline); background: var(--canvas-soft); }
400
+ .dag-inspector-title { display: grid; gap: 6px; min-width: 0; }
401
+ .dag-inspector-title h3 { margin: 0; font-size: 14px; }
402
+ .dag-inspector-node { min-width: 0; color: var(--body); font-size: 12px; font-family: "JetBrains Mono", "SFMono-Regular", Consolas, monospace; overflow-wrap: anywhere; }
403
+ .dag-inspector-controls { display: inline-flex; align-items: center; gap: 8px; }
404
+ .dag-inspector-close { display: inline-grid; place-items: center; width: 32px; height: 32px; border: 1px solid var(--hairline-strong); border-radius: var(--radius-sm); background: var(--surface); color: var(--body); cursor: pointer; }
405
+ .dag-inspector-close:hover, .dag-inspector-close:focus-visible { border-color: var(--orange); color: var(--orange-active); outline: none; }
406
+ .dag-inspector-tabs { display: flex; grid-column: 1 / -1; gap: 4px; margin-top: 2px; }
407
+ .dag-inspector-tab { min-height: 32px; padding: 0 10px; border: 1px solid transparent; border-radius: var(--radius-sm); background: transparent; color: var(--muted); font-size: 12px; font-weight: 700; cursor: pointer; }
408
+ .dag-inspector-tab:hover, .dag-inspector-tab:focus-visible { color: var(--ink); outline: none; }
409
+ .dag-inspector-tab[aria-selected="true"] { border-color: color-mix(in srgb, var(--orange) 55%, var(--hairline)); background: #fff5ed; color: var(--orange-active); }
410
+ .dag-inspector-content { min-height: 0; padding: var(--space-4); overflow: auto; overscroll-behavior: contain; }
411
+ .panel-graph { min-height: 0; }
412
+
413
+ .dag-graph-wrap { display: grid; gap: var(--space-3); }
414
+ .dag-graph-toolbar { display: flex; align-items: center; justify-content: space-between; gap: var(--space-3); }
415
+ .dag-graph-summary,
416
+ .dag-graph-fallback { margin: 0; color: var(--muted); font-size: 12px; }
417
+ .dag-graph-reset {
418
+ min-height: 32px;
419
+ padding: 0 10px;
420
+ border: 1px solid var(--hairline-strong);
421
+ border-radius: var(--radius-sm);
422
+ background: var(--surface);
423
+ color: var(--ink);
606
424
  font-size: 12px;
607
- }
608
-
609
- .output-preview {
610
- margin: 0.5rem 0;
611
- }
612
-
613
- .output-preview summary {
425
+ font-weight: 650;
614
426
  cursor: pointer;
615
- color: var(--link);
616
- font-size: 12px;
617
- margin-bottom: 0.25rem;
618
- }
619
-
620
- .error-preview summary {
621
- color: var(--red);
622
- }
623
-
624
- .artifact-list {
625
- list-style: none;
626
- margin: 0;
627
- padding: 0;
628
- }
629
-
630
- .artifact-list li {
631
- padding: 0.25rem 0;
632
- }
633
-
634
- .artifact-list a {
635
- color: var(--link);
636
- text-decoration: none;
637
- }
638
-
639
- .artifact-list a:hover {
640
- text-decoration: underline;
641
- }
642
-
643
- .empty {
644
- color: var(--muted);
645
- font-style: italic;
646
- }
647
-
648
- .link {
649
- color: var(--link);
650
- text-decoration: none;
651
- }
652
-
653
- .link:hover {
654
- text-decoration: underline;
655
- }
656
-
657
- [hidden] {
658
- display: none !important;
659
- }
660
-
661
- .dag-active-node {
662
- background: rgba(210, 153, 34, 0.18);
663
- }
664
-
665
- .dag-error-node {
666
- background: rgba(248, 81, 73, 0.12);
667
- }
668
-
669
- tbody tr.dag-active-node:hover {
670
- background: rgba(210, 153, 34, 0.25);
671
- }
672
-
673
- tbody tr.dag-error-node:hover {
674
- background: rgba(248, 81, 73, 0.18);
675
427
  }
676
-
677
- .dag-output-node {
678
- margin: 0.5rem 0 0.25rem;
679
- font-size: 12px;
680
- color: var(--muted);
681
- }
682
-
683
- .step-link {
684
- margin-left: 0.5rem;
685
- color: var(--link);
686
- text-decoration: none;
687
- font-size: 11px;
688
- }
689
-
690
- .step-link:hover {
691
- text-decoration: underline;
692
- }
693
-
694
- .inbox-link,
695
- .artifact-link {
696
- color: var(--link);
697
- text-decoration: none;
698
- font-size: 11px;
699
- }
700
-
701
- .inbox-link:hover,
702
- .artifact-link:hover {
703
- text-decoration: underline;
704
- }
705
-
706
- .artifact-links {
707
- display: inline-flex;
708
- flex-wrap: wrap;
709
- gap: 6px;
710
- }
711
-
712
- .artifact-links .muted {
713
- color: var(--muted);
714
- }
715
-
716
- #failures-list .row-failed {
717
- border-left: 3px solid var(--red, #e06c75);
428
+ .dag-graph-reset:hover,
429
+ .dag-graph-reset:focus-visible { border-color: var(--orange); color: var(--orange-active); outline: none; }
430
+ .dag-graph-viewport { min-height: 320px; max-height: 560px; overflow: auto; border: 1px solid var(--hairline); border-radius: var(--radius-md); background: var(--canvas-soft); scroll-behavior: auto; }
431
+ .dag-graph { display: block; }
432
+ .dag-edge { fill: none; stroke: var(--hairline-strong); stroke-width: 2; transition: opacity var(--transition-fast), stroke var(--transition-fast); }
433
+ #dag-arrow path { fill: var(--hairline-strong); }
434
+ .dag-graph-node { cursor: pointer; transition: opacity var(--transition-fast); }
435
+ .dag-graph-node rect { fill: var(--surface); stroke: var(--hairline-strong); stroke-width: 1.5; }
436
+ .dag-graph-node:hover rect,
437
+ .dag-graph-node:focus-visible rect { stroke: var(--orange); stroke-width: 2; }
438
+ .dag-graph-node:focus { outline: none; }
439
+ .dag-graph-node.selected rect { stroke: var(--orange); stroke-width: 3; }
440
+ .dag-graph-node.status-running rect,
441
+ .dag-graph-node.status-started rect { stroke: var(--orange); fill: #fff7f0; }
442
+ .dag-graph-node.status-failed rect,
443
+ .dag-graph-node.status-error rect { stroke: var(--red); fill: #fff7f8; }
444
+ .dag-graph-node.status-succeeded:hover rect,
445
+ .dag-graph-node.status-succeeded:focus-visible rect,
446
+ .dag-graph-node.status-finished:hover rect,
447
+ .dag-graph-node.status-finished:focus-visible rect,
448
+ .dag-graph-node.status-completed:hover rect,
449
+ .dag-graph-node.status-completed:focus-visible rect,
450
+ .dag-graph-node.status-done:hover rect,
451
+ .dag-graph-node.status-done:focus-visible rect { stroke: var(--green); fill: #f2faf5; }
452
+ .dag-graph-node.selected.status-succeeded rect,
453
+ .dag-graph-node.selected.status-finished rect,
454
+ .dag-graph-node.selected.status-completed rect,
455
+ .dag-graph-node.selected.status-done rect { stroke: var(--green); fill: #f2faf5; }
456
+ .dag-graph-node.status-skipped rect { stroke-dasharray: 5 4; }
457
+ .dag-node-label { fill: var(--ink); font-size: 13px; font-weight: 700; }
458
+ .dag-node-meta { fill: var(--muted); font-size: 11px; }
459
+ .dag-node-status { fill: var(--body); font-size: 11px; }
460
+ .dag-dimmed { opacity: .28; }
461
+ .dag-graph-node.status-running { animation: graph-node-pulse 2s ease-in-out infinite; }
462
+ @keyframes graph-node-pulse { 50% { opacity: .72; } }
463
+
464
+ .dag-section-heading { display: flex; align-items: baseline; justify-content: space-between; gap: var(--space-3); margin-bottom: var(--space-4); }
465
+ .dag-section-heading h3 { margin: 0; }
466
+ .dag-section-meta { color: var(--muted); font-size: 12px; }
467
+ #dag-nodes .dag-section-heading { padding: var(--space-5) var(--space-5) 0; }
468
+ #dag-nodes .dag-node-table { border-top: 1px solid var(--hairline); }
469
+ .dag-node-table { table-layout: fixed; }
470
+ .dag-node-table th:nth-child(1), .dag-node-table td:nth-child(1) { width: 19%; }
471
+ .dag-node-table th:nth-child(2), .dag-node-table td:nth-child(2) { width: 7%; }
472
+ .dag-node-table th:nth-child(3), .dag-node-table td:nth-child(3) { width: 12%; }
473
+ .dag-node-table th:nth-child(4), .dag-node-table td:nth-child(4) { width: 16%; }
474
+ .dag-node-table th:nth-child(5), .dag-node-table td:nth-child(5) { width: 12%; }
475
+ .dag-node-table th:nth-child(6), .dag-node-table td:nth-child(6) { width: 9%; }
476
+ .dag-node-table th:nth-child(7), .dag-node-table td:nth-child(7) { width: 25%; }
477
+ .dag-node-table td:nth-child(1), .dag-node-table td:nth-child(4), .dag-node-table td:nth-child(7) { overflow-wrap: anywhere; }
478
+ .dag-active-node { background: #fff8f3; }
479
+ .dag-error-node { background: #fff7f8; }
480
+ .dag-node-selected { box-shadow: inset 3px 0 0 var(--orange); }
481
+
482
+ .rank-lanes { display: grid; gap: var(--space-3); }
483
+ .rank-lane { display: grid; grid-template-columns: 56px minmax(0, 1fr); gap: var(--space-3); align-items: center; }
484
+ .rank-lane-label { color: var(--muted); font-size: 11px; font-weight: 700; }
485
+ .rank-lane-nodes { display: flex; flex-wrap: wrap; gap: 8px; }
486
+ .rank-node-chip { display: inline-flex; align-items: center; gap: 7px; min-height: 32px; padding: 5px 8px; border: 1px solid var(--hairline); border-radius: var(--radius-sm); background: var(--canvas-soft); }
487
+ .rank-node-active { border-color: var(--orange); }
488
+ .rank-node-error { border-color: var(--red); }
489
+ .rank-node-id { color: var(--ink); font-size: 11px; }
490
+ .rank-node-dur { color: var(--muted); font-size: 11px; }
491
+
492
+ .process-timeline { position: relative; display: grid; gap: 0; margin: 0; padding: var(--space-2) 0 0; list-style: none; }
493
+ .process-timeline-item { position: relative; display: grid; grid-template-columns: 100px minmax(0, 1fr); gap: var(--space-3); padding: 10px 0 10px 13px; border-left: 1px solid var(--hairline-strong); }
494
+ .process-timeline-item::before { position: absolute; width: 7px; height: 7px; margin-left: -17px; border: 2px solid var(--surface); border-radius: 50%; background: var(--lavender); content: ""; }
495
+ .process-timeline-time { color: var(--muted); font-size: 10px; }
496
+ .process-timeline-label { color: var(--body); font-size: 12px; overflow-wrap: anywhere; }
497
+
498
+ .markdown-output { display: grid; gap: var(--space-3); color: var(--body); font-size: 13px; line-height: 1.65; }
499
+ .markdown-output > :first-child { margin-top: 0; }
500
+ .markdown-output > :last-child { margin-bottom: 0; }
501
+ .markdown-output h1, .markdown-output h2, .markdown-output h3, .markdown-output h4 { margin: var(--space-5) 0 var(--space-2); color: var(--ink); line-height: 1.3; }
502
+ .markdown-output h1 { font-size: 21px; }
503
+ .markdown-output h2 { font-size: 18px; }
504
+ .markdown-output h3 { font-size: 16px; }
505
+ .markdown-output h4 { font-size: 14px; }
506
+ .markdown-output p, .markdown-output blockquote, .markdown-output ul, .markdown-output ol { margin: 0; }
507
+ .markdown-output ul, .markdown-output ol { padding-left: 22px; }
508
+ .markdown-output blockquote { padding-left: 12px; border-left: 3px solid var(--peach); color: var(--body); }
509
+ .markdown-output pre { margin: 0; padding: var(--space-3); overflow: auto; border: 1px solid var(--hairline); border-radius: var(--radius-sm); background: var(--surface-ink); color: #f8f7f2; font-size: 12px; line-height: 1.65; }
510
+ .markdown-output code { padding: 1px 4px; border-radius: 3px; background: var(--surface-muted); color: var(--ink); font-size: .92em; }
511
+ .markdown-output pre code { padding: 0; background: transparent; color: inherit; }
512
+ .markdown-output a { color: var(--orange-active); text-decoration-color: var(--orange); text-underline-offset: 3px; }
513
+ .markdown-output table { font-size: 12px; }
514
+ .markdown-output th, .markdown-output td { padding: 8px 9px; }
515
+ .markdown-output th { position: static; }
516
+ .markdown-error { display: grid; gap: var(--space-2); padding-top: var(--space-4); border-top: 1px solid var(--hairline); }
517
+ .markdown-error-title { margin: 0; color: var(--red); font-size: 12px; font-weight: 700; }
518
+
519
+ .run-detail-workspace { display: grid; grid-template-columns: minmax(220px, .5fr) minmax(0, 1.25fr) minmax(220px, .45fr); gap: var(--space-4); align-items: start; }
520
+ .run-evidence { display: grid; gap: var(--space-4); min-width: 0; }
521
+ .panel-rail { background: var(--canvas-soft); }
522
+ .step-timeline { display: grid; gap: 0; margin: 0; padding: 0; list-style: none; }
523
+ .step-timeline li { display: grid; grid-template-columns: 18px minmax(0, 1fr) auto; align-items: center; gap: 8px; min-height: 38px; border-bottom: 1px solid var(--hairline); }
524
+ .step-timeline li:last-child { border-bottom: 0; }
525
+ .step-marker { display: inline-grid; place-items: center; width: 16px; height: 16px; border: 1px solid var(--hairline-strong); border-radius: 50%; color: var(--muted); font-size: 10px; }
526
+ .step-marker.succeeded { border-color: var(--green); color: var(--green); }
527
+ .step-marker.running { border-color: var(--orange); color: var(--orange-active); }
528
+ .step-marker.failed { border-color: var(--red); color: var(--red); }
529
+ .step-name { min-width: 0; color: var(--body); font-size: 12px; overflow-wrap: anywhere; }
530
+ .step-duration { color: var(--muted); font-size: 11px; font-variant-numeric: tabular-nums; }
531
+
532
+ .output-block { max-height: 480px; margin: 0; padding: var(--space-4); overflow: auto; border: 1px solid var(--hairline); border-radius: var(--radius-sm); background: var(--surface-ink); color: #f8f7f2; font-size: 12px; line-height: 1.7; white-space: pre-wrap; overflow-wrap: anywhere; }
533
+
534
+ .artifact-list { display: grid; gap: 8px; margin: 0; padding: 0; list-style: none; }
535
+ .artifact-list li { min-width: 0; }
536
+ .artifact-list a { color: var(--body); font-size: 12px; overflow-wrap: anywhere; }
537
+ .artifact-links { display: flex; flex-wrap: wrap; gap: 6px; }
538
+ .muted { color: var(--muted); }
539
+
540
+ .dag-run-timeline { position: relative; display: grid; gap: 0; }
541
+ .dag-run-timeline::before { position: absolute; top: 12px; bottom: 12px; left: 10px; width: 1px; background: var(--hairline-strong); content: ""; }
542
+ .dag-run-timeline-item { position: relative; display: grid; grid-template-columns: 24px minmax(0, 1fr) auto; gap: var(--space-3); align-items: start; padding: 9px 0; color: inherit; text-decoration: none; transition: background-color var(--transition-fast); }
543
+ .dag-run-timeline-item:hover,
544
+ .dag-run-timeline-item:focus-visible { margin-inline: -8px; padding-inline: 8px; background: #fff8f4; outline: none; }
545
+ .dag-run-timeline-rail { position: relative; display: grid; place-items: center; min-height: 24px; }
546
+ .dag-run-timeline-dot { position: relative; z-index: 1; width: 9px; height: 9px; border: 2px solid var(--surface); border-radius: 50%; background: var(--muted-soft); }
547
+ .dag-run-timeline-dot.status-finished, .dag-run-timeline-dot.status-succeeded, .dag-run-timeline-dot.status-completed { background: var(--green); }
548
+ .dag-run-timeline-dot.status-failed, .dag-run-timeline-dot.status-error, .dag-run-timeline-dot.status-partial_failed { background: var(--red); }
549
+ .dag-run-timeline-dot.status-running, .dag-run-timeline-dot.status-started { background: var(--orange); }
550
+ .dag-run-timeline-content { display: grid; gap: 3px; min-width: 0; }
551
+ .dag-run-timeline-title { color: var(--ink); font-size: 13px; font-weight: 700; overflow-wrap: anywhere; }
552
+ .dag-run-timeline-meta { color: var(--muted); font-size: 11px; overflow-wrap: anywhere; }
553
+ .dag-run-timeline-status { padding-top: 1px; }
554
+
555
+ #failures-list .row-failed td:first-child,
556
+ #failures-list .row-blocked td:first-child { color: var(--red); font-weight: 700; }
557
+
558
+ @media (max-width: 1320px) {
559
+ .kpi-grid { grid-template-columns: repeat(3, minmax(0, 1fr)); }
560
+ .kpi-card:nth-child(4) { border-left: 0; }
561
+ .kpi-card:nth-child(n + 4) { border-top: 1px solid var(--hairline); }
562
+ .dashboard-workspace { grid-template-columns: 1fr; }
563
+ .run-detail-workspace { grid-template-columns: minmax(200px, .45fr) minmax(0, 1fr); }
564
+ .panel-artifacts { grid-column: 1 / -1; }
565
+ }
566
+
567
+ @media (max-width: 1080px) {
568
+ #app { width: min(100% - 32px, 1680px); }
569
+ .site-header { grid-template-columns: auto auto 1fr; grid-template-areas: "brand nav status" "crumb crumb crumb"; row-gap: 8px; }
570
+ .run-detail-workspace { grid-template-columns: 1fr; }
571
+ .panel-artifacts { grid-column: auto; }
572
+ }
573
+
574
+ @media (max-width: 720px) {
575
+ #app { width: min(100% - 24px, 1680px); }
576
+ .site-header { margin-bottom: var(--space-6); }
577
+ .kpi-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
578
+ .kpi-card:nth-child(n) { border-top: 1px solid var(--hairline); border-left: 1px solid var(--hairline); }
579
+ .kpi-card:nth-child(1), .kpi-card:nth-child(2) { border-top: 0; }
580
+ .kpi-card:nth-child(odd) { border-left: 0; }
581
+ .dag-inspector { top: 76px; right: 12px; bottom: 12px; width: calc(100vw - 24px); }
582
+ .dashboard-secondary { grid-template-columns: 1fr; }
583
+ .panel-risk { grid-template-columns: 1fr; gap: var(--space-2); }
584
+ .panel-risk .risk-empty { grid-column: auto; }
585
+ .panel { padding: var(--space-4); }
586
+ .panel-table { overflow-x: auto; padding: 0; }
587
+ table { min-width: 680px; }
588
+ .view h2 { font-size: 24px; }
718
589
  }
719
590
 
720
- #failures-list .row-blocked {
721
- border-left: 3px solid var(--yellow, #d19a66);
591
+ @media (prefers-reduced-motion: reduce) {
592
+ *, *::before, *::after {
593
+ animation-duration: .01ms !important;
594
+ animation-iteration-count: 1 !important;
595
+ scroll-behavior: auto !important;
596
+ transition-duration: .01ms !important;
597
+ }
722
598
  }