omkit 0.8.23 → 0.8.25

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.
@@ -62,428 +62,1862 @@
62
62
  }
63
63
  }
64
64
 
65
- * { box-sizing: border-box; }
66
- html, body { margin: 0; height: 100%; }
65
+ * {
66
+ box-sizing: border-box;
67
+ }
68
+ html,
69
+ body {
70
+ margin: 0;
71
+ height: 100%;
72
+ }
67
73
  body {
68
74
  background: var(--bg);
69
75
  color: var(--text);
70
76
  font: 13px/1.4 var(--sans);
71
77
  overflow: hidden;
72
78
  }
73
- button { font: inherit; color: inherit; }
74
- [hidden] { display: none !important; }
79
+ button {
80
+ font: inherit;
81
+ color: inherit;
82
+ }
83
+ [hidden] {
84
+ display: none !important;
85
+ }
75
86
 
76
87
  /* ── loader ─────────────────────────────────────────────── */
77
88
  #loader {
78
- position: fixed; inset: 0; display: grid; place-items: center;
79
- background: var(--bg); z-index: 100;
89
+ position: fixed;
90
+ inset: 0;
91
+ display: grid;
92
+ place-items: center;
93
+ background: var(--bg);
94
+ z-index: 100;
95
+ }
96
+ .loader-card {
97
+ display: grid;
98
+ justify-items: center;
99
+ gap: 14px;
80
100
  }
81
- .loader-card { display: grid; justify-items: center; gap: 14px; }
82
101
  .loader-spin {
83
- width: 42px; height: 42px; border-radius: 50%;
84
- border: 3px solid var(--line); border-top-color: var(--accent);
102
+ width: 42px;
103
+ height: 42px;
104
+ border-radius: 50%;
105
+ border: 3px solid var(--line);
106
+ border-top-color: var(--accent);
85
107
  animation: spin 0.9s linear infinite;
86
108
  }
87
- .loader-title { font-size: 16px; font-weight: 600; }
88
- .loader-step { color: var(--text-3); font-size: 12px; }
89
- @keyframes spin { to { transform: rotate(360deg); } }
109
+ .loader-title {
110
+ font-size: 16px;
111
+ font-weight: 600;
112
+ }
113
+ .loader-step {
114
+ color: var(--text-3);
115
+ font-size: 12px;
116
+ }
117
+ @keyframes spin {
118
+ to {
119
+ transform: rotate(360deg);
120
+ }
121
+ }
90
122
 
91
123
  /* ── shell ──────────────────────────────────────────────── */
92
124
  #app {
93
- height: 100vh; display: grid; gap: 10px; padding: 12px 14px 14px;
125
+ height: 100vh;
126
+ display: grid;
127
+ gap: 10px;
128
+ padding: 12px 14px 14px;
94
129
  grid-template-rows: auto minmax(0, 1fr) 230px;
95
130
  }
96
- .top { display: flex; align-items: center; gap: 14px; min-width: 0; }
97
- .top .titles { min-width: 0; flex: 1; }
98
- .top h1 { margin: 0; font-size: 19px; font-weight: 600; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
99
- .top .meta { color: var(--text-2); display: flex; gap: 10px; align-items: center; margin-top: 3px; flex-wrap: wrap; }
100
- .top .meta .sep { color: var(--text-3); }
101
- .dot { width: 9px; height: 9px; border-radius: 50%; display: inline-block; flex: none; }
102
- .dot.ok { background: var(--ok); }
103
- .dot.failed { background: var(--fail); }
104
- .dot.cancelled { background: var(--cancel); }
105
- .dot.running { background: var(--running); }
131
+ .top {
132
+ display: flex;
133
+ align-items: center;
134
+ gap: 14px;
135
+ min-width: 0;
136
+ }
137
+ .top .titles {
138
+ min-width: 0;
139
+ flex: 1;
140
+ }
141
+ .top h1 {
142
+ margin: 0;
143
+ font-size: 19px;
144
+ font-weight: 600;
145
+ white-space: nowrap;
146
+ overflow: hidden;
147
+ text-overflow: ellipsis;
148
+ }
149
+ .top .meta {
150
+ color: var(--text-2);
151
+ display: flex;
152
+ gap: 10px;
153
+ align-items: center;
154
+ margin-top: 3px;
155
+ flex-wrap: wrap;
156
+ }
157
+ .top .meta .sep {
158
+ color: var(--text-3);
159
+ }
160
+ .dot {
161
+ width: 9px;
162
+ height: 9px;
163
+ border-radius: 50%;
164
+ display: inline-block;
165
+ flex: none;
166
+ }
167
+ .dot.ok {
168
+ background: var(--ok);
169
+ }
170
+ .dot.failed {
171
+ background: var(--fail);
172
+ }
173
+ .dot.cancelled {
174
+ background: var(--cancel);
175
+ }
176
+ .dot.running {
177
+ background: var(--running);
178
+ }
106
179
 
107
- .btn-group { display: flex; border: 1px solid var(--line); border-radius: 8px; overflow: hidden; background: var(--panel); }
180
+ .btn-group {
181
+ display: flex;
182
+ border: 1px solid var(--line);
183
+ border-radius: 8px;
184
+ overflow: hidden;
185
+ background: var(--panel);
186
+ }
108
187
  .btn {
109
- border: 0; background: transparent; padding: 7px 12px; cursor: pointer;
110
- display: inline-flex; align-items: center; gap: 7px; color: var(--text-2); white-space: nowrap;
111
- }
112
- .btn + .btn { border-left: 1px solid var(--line); }
113
- .btn:hover { background: var(--raise); color: var(--text); }
114
- .btn.active { background: var(--accent); color: #fff; }
115
- .btn svg { width: 15px; height: 15px; }
116
- .btn.solo { border: 1px solid var(--line); border-radius: 8px; background: var(--panel); }
188
+ border: 0;
189
+ background: transparent;
190
+ padding: 7px 12px;
191
+ cursor: pointer;
192
+ display: inline-flex;
193
+ align-items: center;
194
+ gap: 7px;
195
+ color: var(--text-2);
196
+ white-space: nowrap;
197
+ }
198
+ .btn + .btn {
199
+ border-left: 1px solid var(--line);
200
+ }
201
+ .btn:hover {
202
+ background: var(--raise);
203
+ color: var(--text);
204
+ }
205
+ .btn.active {
206
+ background: var(--accent);
207
+ color: #fff;
208
+ }
209
+ .btn svg {
210
+ width: 15px;
211
+ height: 15px;
212
+ }
213
+ .btn.solo {
214
+ border: 1px solid var(--line);
215
+ border-radius: 8px;
216
+ background: var(--panel);
217
+ }
117
218
 
118
219
  .main {
119
- display: grid; gap: 10px; min-height: 0;
220
+ display: grid;
221
+ gap: 10px;
222
+ min-height: 0;
120
223
  grid-template-columns: minmax(0, 1fr) 320px;
121
224
  }
122
- .main.no-details { grid-template-columns: minmax(0, 1fr); }
123
- .card { background: var(--panel); border: 1px solid var(--line); border-radius: 10px; min-height: 0; min-width: 0; }
225
+ .main.no-details {
226
+ grid-template-columns: minmax(0, 1fr);
227
+ }
228
+ .card {
229
+ background: var(--panel);
230
+ border: 1px solid var(--line);
231
+ border-radius: 10px;
232
+ min-height: 0;
233
+ min-width: 0;
234
+ }
124
235
 
125
236
  /* ── timeline: tree + chart share one vertical scroll ──── */
126
- .timeline { display: grid; grid-template-rows: 34px minmax(0, 1fr); overflow: hidden; }
127
- .tl-head { display: grid; grid-template-columns: var(--tree-w, 420px) minmax(0, 1fr); border-bottom: 1px solid var(--line); }
128
- .tl-head .cols { display: grid; grid-template-columns: minmax(0, 1fr); align-items: center; border-right: 1px solid var(--line); }
129
- .tl-head .cols > div { padding: 0 12px; color: var(--text-2); font-weight: 600; font-size: 12px; }
130
- .tl-head .cols > div + div { border-left: 1px solid var(--line-soft); height: 100%; display: flex; align-items: center; }
131
- .tl-head svg { display: block; width: 100%; height: 34px; }
132
- .tl-body { overflow: auto; display: grid; grid-template-columns: var(--tree-w, 420px) minmax(0, 1fr); align-items: start; position: relative; }
237
+ .timeline {
238
+ display: grid;
239
+ grid-template-rows: 34px minmax(0, 1fr);
240
+ overflow: hidden;
241
+ }
242
+ .tl-head {
243
+ display: grid;
244
+ grid-template-columns: var(--tree-w, 420px) minmax(0, 1fr);
245
+ border-bottom: 1px solid var(--line);
246
+ }
247
+ .tl-head .cols {
248
+ display: grid;
249
+ grid-template-columns: minmax(0, 1fr);
250
+ align-items: center;
251
+ border-right: 1px solid var(--line);
252
+ }
253
+ .tl-head .cols > div {
254
+ padding: 0 12px;
255
+ color: var(--text-2);
256
+ font-weight: 600;
257
+ font-size: 12px;
258
+ }
259
+ .tl-head .cols > div + div {
260
+ border-left: 1px solid var(--line-soft);
261
+ height: 100%;
262
+ display: flex;
263
+ align-items: center;
264
+ }
265
+ .tl-head svg {
266
+ display: block;
267
+ width: 100%;
268
+ height: 34px;
269
+ }
270
+ .tl-body {
271
+ overflow: auto;
272
+ display: grid;
273
+ grid-template-columns: var(--tree-w, 420px) minmax(0, 1fr);
274
+ align-items: start;
275
+ position: relative;
276
+ }
133
277
 
134
- .tree { border-right: 1px solid var(--line); position: sticky; left: 0; background: var(--panel); z-index: 2; }
278
+ .tree {
279
+ border-right: 1px solid var(--line);
280
+ position: sticky;
281
+ left: 0;
282
+ background: var(--panel);
283
+ z-index: 2;
284
+ }
135
285
  .row {
136
- height: var(--row-h); display: grid; grid-template-columns: minmax(0, 1fr);
137
- align-items: center; cursor: pointer; border-bottom: 1px solid transparent;
286
+ height: var(--row-h);
287
+ display: grid;
288
+ grid-template-columns: minmax(0, 1fr);
289
+ align-items: center;
290
+ cursor: pointer;
291
+ border-bottom: 1px solid transparent;
292
+ }
293
+ .row:hover {
294
+ background: var(--raise);
295
+ }
296
+ .row.selected {
297
+ background: var(--accent-soft);
298
+ }
299
+ .row .name {
300
+ display: flex;
301
+ align-items: center;
302
+ gap: 7px;
303
+ min-width: 0;
304
+ padding-right: 8px;
138
305
  }
139
- .row:hover { background: var(--raise); }
140
- .row.selected { background: var(--accent-soft); }
141
- .row .name { display: flex; align-items: center; gap: 7px; min-width: 0; padding-right: 8px; }
142
306
  /* the name keeps its room; the chips shrink (each to an ellipsis) into what is left */
143
307
  /* two lines: the label (and error count), then status · duration · tags, smaller */
144
- .row .lines { display: flex; flex-direction: column; justify-content: center; gap: 2px; flex: 1; min-width: 0; }
145
- .row .l1, .row .l2 { display: flex; align-items: center; gap: 6px; min-width: 0; }
146
- .row .label { flex: 0 1 auto; min-width: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
147
- .row .label .tcall { font-size: 11.5px; }
148
- .row .label .sep, .row .l2 .sep { color: var(--text-3); }
149
- .row .l2 { font-size: 11px; color: var(--text-2); font-variant-numeric: tabular-nums; }
150
- .row .l2 .meta { display: inline-flex; align-items: center; gap: 6px; flex: none; margin-left: auto; padding-right: 4px; }
151
- .row .l2 .st { display: inline-flex; align-items: center; gap: 4px; }
152
- .row .l2 .dot { width: 7px; height: 7px; }
153
- .row .l2 .du { flex: none; }
154
- .row .l2 .chips { flex: 0 1 auto; flex-wrap: nowrap; overflow: hidden; }
155
- .row .l2 .chip { flex: 0 1 auto; min-width: 24px; font-size: 10px; line-height: 14px; }
156
- .row .l2 .chip.more { flex: none; }
157
- .row .twist { width: 16px; height: 16px; flex: none; display: grid; place-items: center; color: var(--text-3); border: 0; background: none; padding: 0; cursor: pointer; }
158
- .row .twist svg { width: 12px; height: 12px; transition: transform 0.12s; }
159
- .row .twist.open svg { transform: rotate(90deg); }
160
- .row .icon { width: 22px; height: 22px; flex: none; display: grid; place-items: center; border-radius: 6px; }
161
- .row .icon svg { width: 14px; height: 14px; }
162
- .guide { width: 14px; flex: none; align-self: stretch; position: relative; }
163
- .guide::before { content: ""; position: absolute; left: 7px; top: 0; bottom: 0; border-left: 1px solid var(--line); }
308
+ .row .lines {
309
+ display: flex;
310
+ flex-direction: column;
311
+ justify-content: center;
312
+ gap: 2px;
313
+ flex: 1;
314
+ min-width: 0;
315
+ }
316
+ .row .l1,
317
+ .row .l2 {
318
+ display: flex;
319
+ align-items: center;
320
+ gap: 6px;
321
+ min-width: 0;
322
+ }
323
+ .row .label {
324
+ flex: 0 1 auto;
325
+ min-width: 0;
326
+ white-space: nowrap;
327
+ overflow: hidden;
328
+ text-overflow: ellipsis;
329
+ }
330
+ .row .label .tcall {
331
+ font-size: 11.5px;
332
+ }
333
+ .row .label .sep,
334
+ .row .l2 .sep {
335
+ color: var(--text-3);
336
+ }
337
+ .row .l2 {
338
+ font-size: 11px;
339
+ color: var(--text-2);
340
+ font-variant-numeric: tabular-nums;
341
+ }
342
+ .row .l2 .meta {
343
+ display: inline-flex;
344
+ align-items: center;
345
+ gap: 6px;
346
+ flex: none;
347
+ margin-left: auto;
348
+ padding-right: 4px;
349
+ }
350
+ .row .l2 .st {
351
+ display: inline-flex;
352
+ align-items: center;
353
+ gap: 4px;
354
+ }
355
+ .row .l2 .dot {
356
+ width: 7px;
357
+ height: 7px;
358
+ }
359
+ .row .l2 .du {
360
+ flex: none;
361
+ }
362
+ .row .l2 .chips {
363
+ flex: 0 1 auto;
364
+ flex-wrap: nowrap;
365
+ overflow: hidden;
366
+ }
367
+ .row .l2 .chip {
368
+ flex: 0 1 auto;
369
+ min-width: 24px;
370
+ font-size: 10px;
371
+ line-height: 14px;
372
+ }
373
+ .row .l2 .chip.more {
374
+ flex: none;
375
+ }
376
+ .row .twist {
377
+ width: 16px;
378
+ height: 16px;
379
+ flex: none;
380
+ display: grid;
381
+ place-items: center;
382
+ color: var(--text-3);
383
+ border: 0;
384
+ background: none;
385
+ padding: 0;
386
+ cursor: pointer;
387
+ }
388
+ .row .twist svg {
389
+ width: 12px;
390
+ height: 12px;
391
+ transition: transform 0.12s;
392
+ }
393
+ .row .twist.open svg {
394
+ transform: rotate(90deg);
395
+ }
396
+ .row .icon {
397
+ width: 22px;
398
+ height: 22px;
399
+ flex: none;
400
+ display: grid;
401
+ place-items: center;
402
+ border-radius: 6px;
403
+ }
404
+ .row .icon svg {
405
+ width: 14px;
406
+ height: 14px;
407
+ }
408
+ .guide {
409
+ width: 14px;
410
+ flex: none;
411
+ align-self: stretch;
412
+ position: relative;
413
+ }
414
+ .guide::before {
415
+ content: "";
416
+ position: absolute;
417
+ left: 7px;
418
+ top: 0;
419
+ bottom: 0;
420
+ border-left: 1px solid var(--line);
421
+ }
164
422
 
165
- .chart { position: relative; min-width: 0; }
166
- .chart svg { display: block; overflow: hidden; }
423
+ .chart {
424
+ position: relative;
425
+ min-width: 0;
426
+ }
427
+ .chart svg {
428
+ display: block;
429
+ overflow: hidden;
430
+ }
167
431
  /* the row's hit target already spans the label — letting it through keeps the marks under it hoverable */
168
- .chart .bar-label { font-size: 12px; fill: var(--bar-text); font-weight: 500; pointer-events: none; }
169
- .chart .hit { fill: transparent; cursor: pointer; }
170
- .chart .hit:hover + .bar { filter: brightness(1.15); }
171
- .chart .bar-label.outside { fill: var(--text); }
172
- .chart .mark-label { font-size: 11px; fill: var(--text-2); cursor: pointer; }
173
- .chart .mark-label:hover { fill: var(--text); }
174
- .chart .grid line { stroke: var(--line-soft); }
175
- .chart .cursor { stroke: var(--text-2); stroke-dasharray: 3 3; pointer-events: none; }
176
- .chart .link { fill: none; stroke: var(--text-3); stroke-width: 1.2; }
177
- .chart .bar { cursor: pointer; }
178
- .chart .bar.selected { stroke: var(--text); stroke-width: 2; }
179
- .chart .mark { cursor: pointer; stroke: var(--panel); stroke-width: 1.5; }
180
- .axis text { fill: var(--text-2); font-size: 11px; }
181
- .axis line, .axis path { stroke: var(--line); }
432
+ .chart .bar-label {
433
+ font-size: 12px;
434
+ fill: var(--bar-text);
435
+ font-weight: 500;
436
+ pointer-events: none;
437
+ }
438
+ .chart .hit {
439
+ fill: transparent;
440
+ cursor: pointer;
441
+ }
442
+ .chart .hit:hover + .bar {
443
+ filter: brightness(1.15);
444
+ }
445
+ .chart .bar-label.outside {
446
+ fill: var(--text);
447
+ }
448
+ .chart .mark-label {
449
+ font-size: 11px;
450
+ fill: var(--text-2);
451
+ cursor: pointer;
452
+ }
453
+ .chart .mark-label:hover {
454
+ fill: var(--text);
455
+ }
456
+ .chart .grid line {
457
+ stroke: var(--line-soft);
458
+ }
459
+ .chart .cursor {
460
+ stroke: var(--text-2);
461
+ stroke-dasharray: 3 3;
462
+ pointer-events: none;
463
+ }
464
+ .chart .link {
465
+ fill: none;
466
+ stroke: var(--text-3);
467
+ stroke-width: 1.2;
468
+ }
469
+ .chart .bar {
470
+ cursor: pointer;
471
+ }
472
+ .chart .bar.selected {
473
+ stroke: var(--text);
474
+ stroke-width: 2;
475
+ }
476
+ .chart .mark {
477
+ cursor: pointer;
478
+ stroke: var(--panel);
479
+ stroke-width: 1.5;
480
+ }
481
+ .axis text {
482
+ fill: var(--text-2);
483
+ font-size: 11px;
484
+ }
485
+ .axis line,
486
+ .axis path {
487
+ stroke: var(--line);
488
+ }
182
489
 
183
- .flow-view { position: absolute; inset: 0; }
184
- .flow-view svg { width: 100%; height: 100%; display: block; cursor: grab; }
185
- .flow-card rect.box { fill: var(--raise); stroke: var(--line); rx: 8; }
186
- .flow-card.selected rect.box { stroke: var(--accent); stroke-width: 2; }
187
- .flow-card text { fill: var(--text); font-size: 12px; }
188
- .flow-card text.nm { font-weight: 600; }
189
- .flow-card .flow-icon { pointer-events: none; }
190
- .flow-seq { fill: none; stroke: var(--text-3); stroke-width: 1.4; stroke-dasharray: 5 4; }
191
- .flow-seq.parallel { stroke-dasharray: 1 4; stroke-linecap: round; stroke-width: 2; opacity: 0.8; }
192
- .flow-arrowhead { fill: var(--text-3); }
193
- .flow-par { fill: var(--text-3); font-size: 10px; font-style: italic; }
194
- .flow-shot-t { fill: var(--text-3); font-size: 10.5px; pointer-events: none; stroke: var(--panel); stroke-width: 4px; paint-order: stroke; }
195
- .flow-card text.sub { fill: var(--text-3); font-size: 11px; }
196
- .flow-card .tchip text { fill: var(--text); font-size: 10.5px; }
197
- .flow-card .tchip.more text { fill: var(--text-3); }
198
- .flow-link { fill: none; stroke: var(--text-3); stroke-width: 1.3; }
490
+ .flow-view {
491
+ position: absolute;
492
+ inset: 0;
493
+ }
494
+ .flow-view svg {
495
+ width: 100%;
496
+ height: 100%;
497
+ display: block;
498
+ cursor: grab;
499
+ }
500
+ .flow-card rect.box {
501
+ fill: var(--raise);
502
+ stroke: var(--line);
503
+ rx: 8;
504
+ }
505
+ .flow-card.selected rect.box {
506
+ stroke: var(--accent);
507
+ stroke-width: 2;
508
+ }
509
+ .flow-card text {
510
+ fill: var(--text);
511
+ font-size: 12px;
512
+ }
513
+ .flow-card text.nm {
514
+ font-weight: 600;
515
+ }
516
+ .flow-card .flow-icon {
517
+ pointer-events: none;
518
+ }
519
+ .flow-seq {
520
+ fill: none;
521
+ stroke: var(--text-3);
522
+ stroke-width: 1.4;
523
+ stroke-dasharray: 5 4;
524
+ }
525
+ .flow-seq.parallel {
526
+ stroke-dasharray: 1 4;
527
+ stroke-linecap: round;
528
+ stroke-width: 2;
529
+ opacity: 0.8;
530
+ }
531
+ .flow-arrowhead {
532
+ fill: var(--text-3);
533
+ }
534
+ .flow-par {
535
+ fill: var(--text-3);
536
+ font-size: 10px;
537
+ font-style: italic;
538
+ }
539
+ .flow-shot-t {
540
+ fill: var(--text-3);
541
+ font-size: 10.5px;
542
+ pointer-events: none;
543
+ stroke: var(--panel);
544
+ stroke-width: 4px;
545
+ paint-order: stroke;
546
+ }
547
+ .flow-card text.sub {
548
+ fill: var(--text-3);
549
+ font-size: 11px;
550
+ }
551
+ .flow-card .tchip text {
552
+ fill: var(--text);
553
+ font-size: 10.5px;
554
+ }
555
+ .flow-card .tchip.more text {
556
+ fill: var(--text-3);
557
+ }
558
+ .flow-link {
559
+ fill: none;
560
+ stroke: var(--text-3);
561
+ stroke-width: 1.3;
562
+ }
199
563
 
200
564
  /* ── details ────────────────────────────────────────────── */
201
- .details { display: grid; grid-template-rows: auto auto minmax(0, 1fr); overflow: hidden; }
202
- .details .dh { display: flex; align-items: center; justify-content: space-between; padding: 10px 14px; font-weight: 600; }
203
- .details .x { border: 0; background: none; cursor: pointer; color: var(--text-2); padding: 2px; }
204
- .details .who { display: flex; align-items: center; gap: 10px; padding: 4px 14px 10px; }
205
- .details .who .icon { width: 30px; height: 30px; border-radius: 8px; display: grid; place-items: center; flex: none; }
206
- .details .who .icon svg { width: 16px; height: 16px; }
207
- .details .who .nm { font-size: 16px; font-weight: 600; flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
208
- .pill { display: inline-flex; align-items: center; gap: 6px; padding: 3px 10px; border-radius: 999px; background: var(--raise); font-size: 12px; }
209
- .details .scroll { overflow: auto; padding: 0 14px 14px; }
210
- .kv .v.mono-sm { font: 11.5px var(--mono); color: var(--text-2); }
565
+ .details {
566
+ display: grid;
567
+ grid-template-rows: auto auto minmax(0, 1fr);
568
+ overflow: hidden;
569
+ }
570
+ .details .dh {
571
+ display: flex;
572
+ align-items: center;
573
+ justify-content: space-between;
574
+ padding: 10px 14px;
575
+ font-weight: 600;
576
+ }
577
+ .details .x {
578
+ border: 0;
579
+ background: none;
580
+ cursor: pointer;
581
+ color: var(--text-2);
582
+ padding: 2px;
583
+ }
584
+ .details .who {
585
+ display: flex;
586
+ align-items: center;
587
+ gap: 10px;
588
+ padding: 4px 14px 10px;
589
+ }
590
+ .details .who .icon {
591
+ width: 30px;
592
+ height: 30px;
593
+ border-radius: 8px;
594
+ display: grid;
595
+ place-items: center;
596
+ flex: none;
597
+ }
598
+ .details .who .icon svg {
599
+ width: 16px;
600
+ height: 16px;
601
+ }
602
+ .details .who .nm {
603
+ font-size: 16px;
604
+ font-weight: 600;
605
+ flex: 1;
606
+ min-width: 0;
607
+ overflow: hidden;
608
+ text-overflow: ellipsis;
609
+ white-space: nowrap;
610
+ }
611
+ .pill {
612
+ display: inline-flex;
613
+ align-items: center;
614
+ gap: 6px;
615
+ padding: 3px 10px;
616
+ border-radius: 999px;
617
+ background: var(--raise);
618
+ font-size: 12px;
619
+ }
620
+ .details .scroll {
621
+ overflow: auto;
622
+ padding: 0 14px 14px;
623
+ }
624
+ .kv .v.mono-sm {
625
+ font: 11.5px var(--mono);
626
+ color: var(--text-2);
627
+ }
211
628
  /* details accordion */
212
- .acc { border-top: 1px solid var(--line-soft); }
213
- .acc-sec { border-bottom: 1px solid var(--line-soft); }
214
- .acc-h { display: flex; align-items: center; gap: 6px; padding: 8px 2px; font-weight: 600; cursor: pointer; list-style: none; user-select: none; }
215
- .acc-h::-webkit-details-marker { display: none; }
216
- .acc-h svg { width: 12px; height: 12px; color: var(--text-3); transition: transform 0.12s; flex: none; }
217
- .acc-sec[open] > .acc-h svg { transform: rotate(90deg); }
218
- .acc-h:hover { color: var(--accent); }
219
- .acc-n { margin-left: auto; min-width: 18px; padding: 0 6px; border-radius: 999px; background: var(--raise); color: var(--text-2); font-size: 11px; font-weight: 600; text-align: center; }
220
- .acc-sec.errors .acc-n { background: var(--fail); color: #fff; }
221
- .acc-sec.empty .acc-h { color: var(--text-3); font-weight: 500; cursor: default; }
222
- .acc-sec.empty .acc-h svg { opacity: 0.35; }
223
- .acc-sec.empty .acc-n { background: none; color: var(--text-3); }
224
- .acc-b { padding: 0 0 12px; }
225
- .acc-b > .params { margin-bottom: 8px; }
226
- .acc-b .section-title:first-child { margin-top: 0; }
227
- .acc-file { display: flex; align-items: center; gap: 6px; margin-bottom: 6px; color: var(--text-2); }
228
- .dshots { display: grid; gap: 6px; }
229
- .dshot { display: grid; grid-template-columns: 64px minmax(0, 1fr) auto; align-items: center; gap: 10px; padding: 4px; border: 1px solid transparent; border-radius: 8px; cursor: pointer; }
230
- .dshot:hover { border-color: var(--accent); background: var(--accent-soft); }
231
- .dshot .thumb { width: 64px; }
232
- .dshot .nm { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
233
- .dshot .t { color: var(--text-3); font-size: 11px; font-variant-numeric: tabular-nums; }
234
- .kv { display: grid; grid-template-columns: 92px minmax(0, 1fr); gap: 6px 10px; margin: 2px 0 12px; }
235
- .kv .k { color: var(--text-2); }
236
- .kv .v { min-width: 0; overflow-wrap: anywhere; font-variant-numeric: tabular-nums; }
237
- a { color: var(--accent); text-decoration: none; }
238
- a:hover { text-decoration: underline; }
239
- .tabs { display: flex; gap: 2px; border-bottom: 1px solid var(--line); margin: 0 0 10px; overflow-x: auto; }
240
- .tab { border: 0; background: none; padding: 7px 9px; cursor: pointer; color: var(--text-2); border-bottom: 2px solid transparent; white-space: nowrap; }
241
- .tab.active { color: var(--text); border-bottom-color: var(--accent); font-weight: 600; }
242
- .section-title { font-weight: 600; margin: 14px 0 8px; }
243
- .ev-list { list-style: none; margin: 0; padding: 0; position: relative; }
244
- .ev-list li { display: grid; grid-template-columns: 64px 18px minmax(0, 1fr); gap: 8px; align-items: start; padding: 4px 0; }
245
- .ev-list .t { color: var(--text-2); font-variant-numeric: tabular-nums; text-align: right; }
246
- .ev-list .m { overflow-wrap: anywhere; }
247
- .ev-ico { width: 16px; height: 16px; border-radius: 50%; display: grid; place-items: center; margin-top: 1px; }
248
- .ev-ico svg { width: 10px; height: 10px; }
629
+ .acc {
630
+ border-top: 1px solid var(--line-soft);
631
+ }
632
+ .acc-sec {
633
+ border-bottom: 1px solid var(--line-soft);
634
+ }
635
+ .acc-h {
636
+ display: flex;
637
+ align-items: center;
638
+ gap: 6px;
639
+ padding: 8px 2px;
640
+ font-weight: 600;
641
+ cursor: pointer;
642
+ list-style: none;
643
+ user-select: none;
644
+ }
645
+ .acc-h::-webkit-details-marker {
646
+ display: none;
647
+ }
648
+ .acc-h svg {
649
+ width: 12px;
650
+ height: 12px;
651
+ color: var(--text-3);
652
+ transition: transform 0.12s;
653
+ flex: none;
654
+ }
655
+ .acc-sec[open] > .acc-h svg {
656
+ transform: rotate(90deg);
657
+ }
658
+ .acc-h:hover {
659
+ color: var(--accent);
660
+ }
661
+ .acc-n {
662
+ margin-left: auto;
663
+ min-width: 18px;
664
+ padding: 0 6px;
665
+ border-radius: 999px;
666
+ background: var(--raise);
667
+ color: var(--text-2);
668
+ font-size: 11px;
669
+ font-weight: 600;
670
+ text-align: center;
671
+ }
672
+ .acc-sec.errors .acc-n {
673
+ background: var(--fail);
674
+ color: #fff;
675
+ }
676
+ .acc-sec.empty .acc-h {
677
+ color: var(--text-3);
678
+ font-weight: 500;
679
+ cursor: default;
680
+ }
681
+ .acc-sec.empty .acc-h svg {
682
+ opacity: 0.35;
683
+ }
684
+ .acc-sec.empty .acc-n {
685
+ background: none;
686
+ color: var(--text-3);
687
+ }
688
+ .acc-b {
689
+ padding: 0 0 12px;
690
+ }
691
+ .acc-b > .params {
692
+ margin-bottom: 8px;
693
+ }
694
+ .acc-b .section-title:first-child {
695
+ margin-top: 0;
696
+ }
697
+ .acc-file {
698
+ display: flex;
699
+ align-items: center;
700
+ gap: 6px;
701
+ margin-bottom: 6px;
702
+ color: var(--text-2);
703
+ }
704
+ .dshots {
705
+ display: grid;
706
+ gap: 6px;
707
+ }
708
+ .dshot {
709
+ display: grid;
710
+ grid-template-columns: 64px minmax(0, 1fr) auto;
711
+ align-items: center;
712
+ gap: 10px;
713
+ padding: 4px;
714
+ border: 1px solid transparent;
715
+ border-radius: 8px;
716
+ cursor: pointer;
717
+ }
718
+ .dshot:hover {
719
+ border-color: var(--accent);
720
+ background: var(--accent-soft);
721
+ }
722
+ .dshot .thumb {
723
+ width: 64px;
724
+ }
725
+ .dshot .nm {
726
+ overflow: hidden;
727
+ text-overflow: ellipsis;
728
+ white-space: nowrap;
729
+ }
730
+ .dshot .t {
731
+ color: var(--text-3);
732
+ font-size: 11px;
733
+ font-variant-numeric: tabular-nums;
734
+ }
735
+ .kv {
736
+ display: grid;
737
+ grid-template-columns: 92px minmax(0, 1fr);
738
+ gap: 6px 10px;
739
+ margin: 2px 0 12px;
740
+ }
741
+ .kv .k {
742
+ color: var(--text-2);
743
+ }
744
+ .kv .v {
745
+ min-width: 0;
746
+ overflow-wrap: anywhere;
747
+ font-variant-numeric: tabular-nums;
748
+ }
749
+ a {
750
+ color: var(--accent);
751
+ text-decoration: none;
752
+ }
753
+ a:hover {
754
+ text-decoration: underline;
755
+ }
756
+ .tabs {
757
+ display: flex;
758
+ gap: 2px;
759
+ border-bottom: 1px solid var(--line);
760
+ margin: 0 0 10px;
761
+ overflow-x: auto;
762
+ }
763
+ .tab {
764
+ border: 0;
765
+ background: none;
766
+ padding: 7px 9px;
767
+ cursor: pointer;
768
+ color: var(--text-2);
769
+ border-bottom: 2px solid transparent;
770
+ white-space: nowrap;
771
+ }
772
+ .tab.active {
773
+ color: var(--text);
774
+ border-bottom-color: var(--accent);
775
+ font-weight: 600;
776
+ }
777
+ .section-title {
778
+ font-weight: 600;
779
+ margin: 14px 0 8px;
780
+ }
781
+ .ev-list {
782
+ list-style: none;
783
+ margin: 0;
784
+ padding: 0;
785
+ position: relative;
786
+ }
787
+ .ev-list li {
788
+ display: grid;
789
+ grid-template-columns: 64px 18px minmax(0, 1fr);
790
+ gap: 8px;
791
+ align-items: start;
792
+ padding: 4px 0;
793
+ }
794
+ .ev-list .t {
795
+ color: var(--text-2);
796
+ font-variant-numeric: tabular-nums;
797
+ text-align: right;
798
+ }
799
+ .ev-list .m {
800
+ overflow-wrap: anywhere;
801
+ }
802
+ .ev-ico {
803
+ width: 16px;
804
+ height: 16px;
805
+ border-radius: 50%;
806
+ display: grid;
807
+ place-items: center;
808
+ margin-top: 1px;
809
+ }
810
+ .ev-ico svg {
811
+ width: 10px;
812
+ height: 10px;
813
+ }
249
814
  pre.code {
250
- margin: 0; padding: 10px; background: var(--panel-2); border: 1px solid var(--line-soft); border-radius: 8px;
251
- font: 12px/1.45 var(--mono); white-space: pre-wrap; overflow-wrap: anywhere; max-height: 60vh; overflow: auto;
252
- }
253
- .muted { color: var(--text-3); }
254
- .thumb { border: 1px solid var(--line); border-radius: 6px; overflow: hidden; cursor: pointer; background: var(--panel-2); aspect-ratio: 16 / 10; display: grid; place-items: center; }
255
- .thumb:hover { border-color: var(--accent); }
256
- .thumb img { width: 100%; height: 100%; object-fit: cover; display: block; }
257
- .thumb .json-ico { font: 600 12px var(--mono); color: var(--text-3); }
815
+ margin: 0;
816
+ padding: 10px;
817
+ background: var(--panel-2);
818
+ border: 1px solid var(--line-soft);
819
+ border-radius: 8px;
820
+ font: 12px/1.45 var(--mono);
821
+ white-space: pre-wrap;
822
+ overflow-wrap: anywhere;
823
+ max-height: 60vh;
824
+ overflow: auto;
825
+ }
826
+ .muted {
827
+ color: var(--text-3);
828
+ }
829
+ .thumb {
830
+ border: 1px solid var(--line);
831
+ border-radius: 6px;
832
+ overflow: hidden;
833
+ cursor: pointer;
834
+ background: var(--panel-2);
835
+ aspect-ratio: 16 / 10;
836
+ display: grid;
837
+ place-items: center;
838
+ }
839
+ .thumb:hover {
840
+ border-color: var(--accent);
841
+ }
842
+ .thumb img {
843
+ width: 100%;
844
+ height: 100%;
845
+ object-fit: cover;
846
+ display: block;
847
+ }
848
+ .thumb .json-ico {
849
+ font: 600 12px var(--mono);
850
+ color: var(--text-3);
851
+ }
258
852
 
259
853
  /* ── bottom strip ───────────────────────────────────────── */
260
- .bottom { display: grid; gap: 10px; grid-template-columns: minmax(0, 1fr) 250px; min-height: 0; }
261
- .lower { display: grid; grid-template-rows: auto minmax(0, 1fr); overflow: hidden; }
262
- .lower .tabs { margin: 0; padding: 0 10px; align-items: center; }
263
- .lower .tabs .spacer { flex: 1; }
264
- .filter { border: 1px solid var(--line); background: var(--panel-2); border-radius: 7px; padding: 5px 9px; color: var(--text); width: 200px; margin: 4px 0; }
265
- .lower .body { overflow: auto; padding: 10px 12px; }
266
- .gallery { display: flex; gap: 12px; }
267
- .gal-item { flex: none; width: 160px; cursor: pointer; border: 1px solid transparent; border-radius: 8px; padding: 4px; }
268
- .gal-item:hover, .gal-item.active { border-color: var(--accent); background: var(--accent-soft); }
269
- .gal-item .thumb { aspect-ratio: 16 / 10; }
270
- .gal-item .cap { display: flex; gap: 8px; margin-top: 5px; font-size: 12px; }
271
- .gal-item .cap .t { color: var(--text-2); font-variant-numeric: tabular-nums; }
272
- .gal-item .cap .n { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
273
- .gal-item .sz { color: var(--text-3); font-size: 11px; }
274
- table.list { width: 100%; border-collapse: collapse; font-size: 12px; }
275
- table.list td { padding: 3px 8px; border-bottom: 1px solid var(--line-soft); vertical-align: top; }
276
- table.list td.t { color: var(--text-2); white-space: nowrap; font-variant-numeric: tabular-nums; width: 1%; }
277
- table.list td.p { color: var(--text-3); white-space: nowrap; max-width: 260px; overflow: hidden; text-overflow: ellipsis; width: 1%; }
278
- table.list td.m { font-family: var(--mono); white-space: pre-wrap; overflow-wrap: anywhere; }
279
- table.list tr.err td.m { color: var(--fail); }
280
- table.list tr { cursor: pointer; }
281
- table.list tr:hover td { background: var(--raise); }
282
- .legend { padding: 10px 14px; }
854
+ .bottom {
855
+ display: grid;
856
+ gap: 10px;
857
+ grid-template-columns: minmax(0, 1fr) 250px;
858
+ min-height: 0;
859
+ }
860
+ .lower {
861
+ display: grid;
862
+ grid-template-rows: auto minmax(0, 1fr);
863
+ overflow: hidden;
864
+ }
865
+ .lower .tabs {
866
+ margin: 0;
867
+ padding: 0 10px;
868
+ align-items: center;
869
+ }
870
+ .lower .tabs .spacer {
871
+ flex: 1;
872
+ }
873
+ .filter {
874
+ border: 1px solid var(--line);
875
+ background: var(--panel-2);
876
+ border-radius: 7px;
877
+ padding: 5px 9px;
878
+ color: var(--text);
879
+ width: 200px;
880
+ margin: 4px 0;
881
+ }
882
+ .lower .body {
883
+ overflow: auto;
884
+ padding: 10px 12px;
885
+ }
886
+ .gallery {
887
+ display: flex;
888
+ gap: 12px;
889
+ }
890
+ .gal-item {
891
+ flex: none;
892
+ width: 160px;
893
+ cursor: pointer;
894
+ border: 1px solid transparent;
895
+ border-radius: 8px;
896
+ padding: 4px;
897
+ }
898
+ .gal-item:hover,
899
+ .gal-item.active {
900
+ border-color: var(--accent);
901
+ background: var(--accent-soft);
902
+ }
903
+ .gal-item .thumb {
904
+ aspect-ratio: 16 / 10;
905
+ }
906
+ .gal-item .cap {
907
+ display: flex;
908
+ gap: 8px;
909
+ margin-top: 5px;
910
+ font-size: 12px;
911
+ }
912
+ .gal-item .cap .t {
913
+ color: var(--text-2);
914
+ font-variant-numeric: tabular-nums;
915
+ }
916
+ .gal-item .cap .n {
917
+ overflow: hidden;
918
+ text-overflow: ellipsis;
919
+ white-space: nowrap;
920
+ }
921
+ .gal-item .sz {
922
+ color: var(--text-3);
923
+ font-size: 11px;
924
+ }
925
+ table.list {
926
+ width: 100%;
927
+ border-collapse: collapse;
928
+ font-size: 12px;
929
+ }
930
+ table.list td {
931
+ padding: 3px 8px;
932
+ border-bottom: 1px solid var(--line-soft);
933
+ vertical-align: top;
934
+ }
935
+ table.list td.t {
936
+ color: var(--text-2);
937
+ white-space: nowrap;
938
+ font-variant-numeric: tabular-nums;
939
+ width: 1%;
940
+ }
941
+ table.list td.p {
942
+ color: var(--text-3);
943
+ white-space: nowrap;
944
+ max-width: 260px;
945
+ overflow: hidden;
946
+ text-overflow: ellipsis;
947
+ width: 1%;
948
+ }
949
+ table.list td.m {
950
+ font-family: var(--mono);
951
+ white-space: pre-wrap;
952
+ overflow-wrap: anywhere;
953
+ }
954
+ table.list tr.err td.m {
955
+ color: var(--fail);
956
+ }
957
+ table.list tr {
958
+ cursor: pointer;
959
+ }
960
+ table.list tr:hover td {
961
+ background: var(--raise);
962
+ }
963
+ .legend {
964
+ padding: 10px 14px;
965
+ }
283
966
  /* at the end of the tree's header cell, clear of the time axis; top-right in the flow (no axis) */
284
- .legend-btn { position: absolute; top: 6px; left: calc(var(--tree-w, 360px) - 30px); z-index: 6; background: var(--panel); cursor: pointer; }
285
- .timeline.is-flow .legend-btn { left: auto; right: 8px; }
286
- .timeline.is-flow .legend-pop { left: auto; right: 8px; }
287
- .legend-btn.active { color: var(--accent); background: var(--accent-soft); }
967
+ .legend-btn {
968
+ position: absolute;
969
+ top: 6px;
970
+ left: calc(var(--tree-w, 360px) - 30px);
971
+ z-index: 6;
972
+ background: var(--panel);
973
+ cursor: pointer;
974
+ }
975
+ .timeline.is-flow .legend-btn {
976
+ left: auto;
977
+ right: 8px;
978
+ }
979
+ .timeline.is-flow .legend-pop {
980
+ left: auto;
981
+ right: 8px;
982
+ }
983
+ .legend-btn.active {
984
+ color: var(--accent);
985
+ background: var(--accent-soft);
986
+ }
288
987
  .legend-pop {
289
- position: absolute; top: 34px; left: calc(var(--tree-w, 360px) - 30px); z-index: 7; width: 270px; background: var(--panel);
290
- border: 1px solid var(--line); border-radius: 8px; box-shadow: var(--shadow);
291
- }
292
- .legend h3, .overview h3 { margin: 0 0 10px; font-size: 13px; font-weight: 600; }
293
- .legend .grid2 { display: grid; grid-template-columns: 1fr 1fr; gap: 9px 12px; }
294
- .legend .li { display: flex; align-items: center; gap: 8px; color: var(--text-2); font-size: 12px; }
295
- .overview { padding: 10px 14px; display: grid; grid-template-rows: auto auto minmax(0, 1fr); }
296
- .overview .range { color: var(--text-2); font-size: 11px; text-align: right; margin-bottom: 4px; font-variant-numeric: tabular-nums; }
297
- .overview svg { width: 100%; height: 100%; display: block; }
298
- .overview .brush .selection { fill: var(--accent-soft); stroke: var(--text-2); }
988
+ position: absolute;
989
+ top: 34px;
990
+ left: calc(var(--tree-w, 360px) - 30px);
991
+ z-index: 7;
992
+ width: 270px;
993
+ background: var(--panel);
994
+ border: 1px solid var(--line);
995
+ border-radius: 8px;
996
+ box-shadow: var(--shadow);
997
+ }
998
+ .legend h3,
999
+ .overview h3 {
1000
+ margin: 0 0 10px;
1001
+ font-size: 13px;
1002
+ font-weight: 600;
1003
+ }
1004
+ .legend .grid2 {
1005
+ display: grid;
1006
+ grid-template-columns: 1fr 1fr;
1007
+ gap: 9px 12px;
1008
+ }
1009
+ .legend .li {
1010
+ display: flex;
1011
+ align-items: center;
1012
+ gap: 8px;
1013
+ color: var(--text-2);
1014
+ font-size: 12px;
1015
+ }
1016
+ .overview {
1017
+ padding: 10px 14px;
1018
+ display: grid;
1019
+ grid-template-rows: auto auto minmax(0, 1fr);
1020
+ }
1021
+ .overview .range {
1022
+ color: var(--text-2);
1023
+ font-size: 11px;
1024
+ text-align: right;
1025
+ margin-bottom: 4px;
1026
+ font-variant-numeric: tabular-nums;
1027
+ }
1028
+ .overview svg {
1029
+ width: 100%;
1030
+ height: 100%;
1031
+ display: block;
1032
+ }
1033
+ .overview .brush .selection {
1034
+ fill: var(--accent-soft);
1035
+ stroke: var(--text-2);
1036
+ }
299
1037
 
300
1038
  /* ── floating ───────────────────────────────────────────── */
301
1039
  .tip {
302
- position: fixed; pointer-events: none; z-index: 50; background: var(--panel); border: 1px solid var(--line);
303
- border-radius: 8px; padding: 8px 10px; box-shadow: var(--shadow); max-width: 360px; font-size: 12px;
304
- }
305
- .tip .tt { font-weight: 600; margin-bottom: 2px; }
306
- .tip .ts { color: var(--text-2); }
307
- .tip.wide { max-width: 420px; min-width: 260px; }
308
- .tip .mono { font-family: var(--mono); font-size: 11px; overflow-wrap: anywhere; }
309
- .tip .small { color: var(--text-2); }
310
- .tip .summary { margin: 6px 0 0; line-height: 1.45; }
311
- .tip .sec { color: var(--text-3); margin: 8px 0 3px; font-size: 11px; text-transform: uppercase; letter-spacing: 0.04em; }
312
- .tip .sec.fail { color: var(--fail); }
313
- .params { display: grid; gap: 3px; }
314
- .param { font: 11px/1.4 var(--mono); }
315
- .param .pn { color: var(--text); }
316
- .param .pt { color: var(--accent); margin-left: 6px; }
317
- .param .pd { color: var(--text-3); margin-left: 6px; }
318
- .param .pdesc { font-family: var(--sans); color: var(--text-2); margin-left: 10px; }
319
- .kv .v.defined { display: flex; align-items: center; gap: 6px; }
320
- .kv .v.defined a { min-width: 0; overflow-wrap: anywhere; font-family: var(--mono); font-size: 12px; }
321
- .icon-btn { flex: none; border: 1px solid var(--line); background: var(--panel-2); color: var(--text-2); border-radius: 6px; width: 24px; height: 22px; display: grid; place-items: center; cursor: pointer; padding: 0; }
322
- .icon-btn:hover { color: var(--text); border-color: var(--accent); }
323
- .icon-btn svg { width: 13px; height: 13px; }
324
- .tip .hint { margin-top: 8px; color: var(--text-3); font-size: 11px; }
325
- .tip kbd { font: 600 10px var(--mono); border: 1px solid var(--line); border-bottom-width: 2px; border-radius: 4px; padding: 0 4px; color: var(--text-2); }
1040
+ position: fixed;
1041
+ pointer-events: none;
1042
+ z-index: 50;
1043
+ background: var(--panel);
1044
+ border: 1px solid var(--line);
1045
+ border-radius: 8px;
1046
+ padding: 8px 10px;
1047
+ box-shadow: var(--shadow);
1048
+ max-width: 360px;
1049
+ font-size: 12px;
1050
+ }
1051
+ .tip .tt {
1052
+ font-weight: 600;
1053
+ margin-bottom: 2px;
1054
+ }
1055
+ .tip .ts {
1056
+ color: var(--text-2);
1057
+ }
1058
+ .tip.wide {
1059
+ max-width: 420px;
1060
+ min-width: 260px;
1061
+ }
1062
+ .tip .mono {
1063
+ font-family: var(--mono);
1064
+ font-size: 11px;
1065
+ overflow-wrap: anywhere;
1066
+ }
1067
+ .tip .small {
1068
+ color: var(--text-2);
1069
+ }
1070
+ .tip .summary {
1071
+ margin: 6px 0 0;
1072
+ line-height: 1.45;
1073
+ }
1074
+ .tip .sec {
1075
+ color: var(--text-3);
1076
+ margin: 8px 0 3px;
1077
+ font-size: 11px;
1078
+ text-transform: uppercase;
1079
+ letter-spacing: 0.04em;
1080
+ }
1081
+ .tip .sec.fail {
1082
+ color: var(--fail);
1083
+ }
1084
+ .params {
1085
+ display: grid;
1086
+ gap: 3px;
1087
+ }
1088
+ .param {
1089
+ font: 11px/1.4 var(--mono);
1090
+ }
1091
+ .param .pn {
1092
+ color: var(--text);
1093
+ }
1094
+ .param .pt {
1095
+ color: var(--accent);
1096
+ margin-left: 6px;
1097
+ }
1098
+ .param .pd {
1099
+ color: var(--text-3);
1100
+ margin-left: 6px;
1101
+ }
1102
+ .param .pdesc {
1103
+ font-family: var(--sans);
1104
+ color: var(--text-2);
1105
+ margin-left: 10px;
1106
+ }
1107
+ .kv .v.defined {
1108
+ display: flex;
1109
+ align-items: center;
1110
+ gap: 6px;
1111
+ }
1112
+ .kv .v.defined a {
1113
+ min-width: 0;
1114
+ overflow-wrap: anywhere;
1115
+ font-family: var(--mono);
1116
+ font-size: 12px;
1117
+ }
1118
+ .icon-btn {
1119
+ flex: none;
1120
+ border: 1px solid var(--line);
1121
+ background: var(--panel-2);
1122
+ color: var(--text-2);
1123
+ border-radius: 6px;
1124
+ width: 24px;
1125
+ height: 22px;
1126
+ display: grid;
1127
+ place-items: center;
1128
+ cursor: pointer;
1129
+ padding: 0;
1130
+ }
1131
+ .icon-btn:hover {
1132
+ color: var(--text);
1133
+ border-color: var(--accent);
1134
+ }
1135
+ .icon-btn svg {
1136
+ width: 13px;
1137
+ height: 13px;
1138
+ }
1139
+ .tip .hint {
1140
+ margin-top: 8px;
1141
+ color: var(--text-3);
1142
+ font-size: 11px;
1143
+ }
1144
+ .tip kbd {
1145
+ font: 600 10px var(--mono);
1146
+ border: 1px solid var(--line);
1147
+ border-bottom-width: 2px;
1148
+ border-radius: 4px;
1149
+ padding: 0 4px;
1150
+ color: var(--text-2);
1151
+ }
326
1152
  /* tag chips — one look everywhere a tag shows (the flow's SVG chips match it) */
327
- .chips { display: flex; flex-wrap: wrap; gap: 4px; min-width: 0; }
1153
+ .chips {
1154
+ display: flex;
1155
+ flex-wrap: wrap;
1156
+ gap: 4px;
1157
+ min-width: 0;
1158
+ }
328
1159
  .chip {
329
- flex: none; max-width: 170px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; padding: 0 6px;
330
- border-radius: 4px; background: var(--raise); border: 1px solid var(--line); color: var(--text); font-size: 10.5px; line-height: 16px;
331
- }
332
- .chip.more { background: none; color: var(--text-3); }
333
- .badge-inline { display: inline-block; padding: 0 7px; border-radius: 999px; background: var(--accent-soft); color: var(--accent); font-size: 11px; font-weight: 600; }
334
- .tip img { display: block; max-width: 240px; max-height: 150px; border-radius: 4px; margin: 6px 0; border: 1px solid var(--line); }
335
- .modal { position: fixed; inset: 0; background: rgba(5, 8, 18, 0.72); z-index: 60; display: grid; place-items: center; padding: 28px; }
336
- .modal .box { background: var(--panel); border: 1px solid var(--line); border-radius: 12px; box-shadow: var(--shadow); max-width: min(1200px, 100%); max-height: 100%; display: grid; grid-template-rows: auto minmax(0, 1fr); overflow: hidden; }
337
- .modal .mh { display: flex; align-items: center; gap: 12px; padding: 10px 14px; border-bottom: 1px solid var(--line); }
338
- .modal .mh .nm { font-weight: 600; flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
339
- .modal .mb { overflow: auto; padding: 14px; }
340
- .modal img { max-width: 100%; display: block; margin: auto; }
341
- .menu { position: fixed; z-index: 55; background: var(--panel); border: 1px solid var(--line); border-radius: 8px; box-shadow: var(--shadow); padding: 4px; min-width: 200px; }
342
- .menu button { display: block; width: 100%; text-align: left; border: 0; background: none; padding: 7px 10px; border-radius: 6px; cursor: pointer; }
343
- .menu button:hover { background: var(--raise); }
344
- .toast { position: fixed; bottom: 18px; left: 50%; transform: translateX(-50%); background: var(--raise); border: 1px solid var(--line); padding: 7px 14px; border-radius: 8px; z-index: 70; }
1160
+ flex: none;
1161
+ max-width: 170px;
1162
+ overflow: hidden;
1163
+ text-overflow: ellipsis;
1164
+ white-space: nowrap;
1165
+ padding: 0 6px;
1166
+ border-radius: 4px;
1167
+ background: var(--raise);
1168
+ border: 1px solid var(--line);
1169
+ color: var(--text);
1170
+ font-size: 10.5px;
1171
+ line-height: 16px;
1172
+ }
1173
+ .chip.more {
1174
+ background: none;
1175
+ color: var(--text-3);
1176
+ }
1177
+ .badge-inline {
1178
+ display: inline-block;
1179
+ padding: 0 7px;
1180
+ border-radius: 999px;
1181
+ background: var(--accent-soft);
1182
+ color: var(--accent);
1183
+ font-size: 11px;
1184
+ font-weight: 600;
1185
+ }
1186
+ .tip img {
1187
+ display: block;
1188
+ max-width: 240px;
1189
+ max-height: 150px;
1190
+ border-radius: 4px;
1191
+ margin: 6px 0;
1192
+ border: 1px solid var(--line);
1193
+ }
1194
+ .modal {
1195
+ position: fixed;
1196
+ inset: 0;
1197
+ background: rgba(5, 8, 18, 0.72);
1198
+ z-index: 60;
1199
+ display: grid;
1200
+ place-items: center;
1201
+ padding: 28px;
1202
+ }
1203
+ .modal .box {
1204
+ background: var(--panel);
1205
+ border: 1px solid var(--line);
1206
+ border-radius: 12px;
1207
+ box-shadow: var(--shadow);
1208
+ max-width: min(1200px, 100%);
1209
+ max-height: 100%;
1210
+ display: grid;
1211
+ grid-template-rows: auto minmax(0, 1fr);
1212
+ overflow: hidden;
1213
+ }
1214
+ .modal .mh {
1215
+ display: flex;
1216
+ align-items: center;
1217
+ gap: 12px;
1218
+ padding: 10px 14px;
1219
+ border-bottom: 1px solid var(--line);
1220
+ }
1221
+ .modal .mh .nm {
1222
+ font-weight: 600;
1223
+ flex: 1;
1224
+ min-width: 0;
1225
+ overflow: hidden;
1226
+ text-overflow: ellipsis;
1227
+ white-space: nowrap;
1228
+ }
1229
+ .modal .mb {
1230
+ overflow: auto;
1231
+ padding: 14px;
1232
+ }
1233
+ .modal img {
1234
+ max-width: 100%;
1235
+ display: block;
1236
+ margin: auto;
1237
+ }
1238
+ .menu {
1239
+ position: fixed;
1240
+ z-index: 55;
1241
+ background: var(--panel);
1242
+ border: 1px solid var(--line);
1243
+ border-radius: 8px;
1244
+ box-shadow: var(--shadow);
1245
+ padding: 4px;
1246
+ min-width: 200px;
1247
+ }
1248
+ .menu button {
1249
+ display: block;
1250
+ width: 100%;
1251
+ text-align: left;
1252
+ border: 0;
1253
+ background: none;
1254
+ padding: 7px 10px;
1255
+ border-radius: 6px;
1256
+ cursor: pointer;
1257
+ }
1258
+ .menu button:hover {
1259
+ background: var(--raise);
1260
+ }
1261
+ .toast {
1262
+ position: fixed;
1263
+ bottom: 18px;
1264
+ left: 50%;
1265
+ transform: translateX(-50%);
1266
+ background: var(--raise);
1267
+ border: 1px solid var(--line);
1268
+ padding: 7px 14px;
1269
+ border-radius: 8px;
1270
+ z-index: 70;
1271
+ }
345
1272
 
346
1273
  /* ── title info, locate, defined-at, code popover ───────── */
347
- .title-row { display: flex; align-items: center; gap: 8px; min-width: 0; }
348
- .title-row h1 { min-width: 0; }
349
- .info-btn { flex: none; width: 22px; height: 22px; border: 0; border-radius: 50%; background: none; color: var(--text-3); display: grid; place-items: center; cursor: help; padding: 0; }
350
- .info-btn:hover, .info-btn:focus-visible { color: var(--accent); background: var(--accent-soft); }
351
- .info-btn svg { width: 17px; height: 17px; }
352
- .gal-item .cap .locate { margin-left: auto; width: 22px; height: 20px; }
353
- .kv .v.defined { flex-wrap: wrap; }
354
- .kv .v.defined .defined-name { color: var(--text-2); font-family: var(--mono); font-size: 12px; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
355
- a.icon-btn { text-decoration: none; }
356
- .chart .code-btn, .flow-card .code-btn { cursor: pointer; opacity: 0; transition: opacity 0.12s; }
357
- .chart g.r:hover .code-btn, .chart g.r.sel .code-btn, .flow-card:hover .code-btn, .flow-card.selected .code-btn { opacity: 1; }
358
- .code-btn circle { fill: var(--panel); stroke: var(--text-3); stroke-width: 1.2; }
359
- .code-btn text { fill: var(--text-2); font: 700 9px var(--mono); pointer-events: none; }
360
- .code-btn:hover circle { stroke: var(--accent); }
361
- .code-btn:hover text { fill: var(--accent); }
362
- .chart line.pin.flash { animation: pin-flash 0.6s ease-in-out 3; }
363
- .chart circle.mark.flash { animation: mark-flash 0.6s ease-in-out 3; transform-box: fill-box; transform-origin: center; }
364
- @keyframes pin-flash { 50% { stroke-width: 5; } }
365
- @keyframes mark-flash { 50% { transform: scale(1.9); } }
1274
+ .title-row {
1275
+ display: flex;
1276
+ align-items: center;
1277
+ gap: 8px;
1278
+ min-width: 0;
1279
+ }
1280
+ .title-row h1 {
1281
+ min-width: 0;
1282
+ }
1283
+ .info-btn {
1284
+ flex: none;
1285
+ width: 22px;
1286
+ height: 22px;
1287
+ border: 0;
1288
+ border-radius: 50%;
1289
+ background: none;
1290
+ color: var(--text-3);
1291
+ display: grid;
1292
+ place-items: center;
1293
+ cursor: help;
1294
+ padding: 0;
1295
+ }
1296
+ .info-btn:hover,
1297
+ .info-btn:focus-visible {
1298
+ color: var(--accent);
1299
+ background: var(--accent-soft);
1300
+ }
1301
+ .info-btn svg {
1302
+ width: 17px;
1303
+ height: 17px;
1304
+ }
1305
+ .gal-item .cap .locate {
1306
+ margin-left: auto;
1307
+ width: 22px;
1308
+ height: 20px;
1309
+ }
1310
+ .kv .v.defined {
1311
+ flex-wrap: wrap;
1312
+ }
1313
+ .kv .v.defined .defined-name {
1314
+ color: var(--text-2);
1315
+ font-family: var(--mono);
1316
+ font-size: 12px;
1317
+ min-width: 0;
1318
+ overflow: hidden;
1319
+ text-overflow: ellipsis;
1320
+ white-space: nowrap;
1321
+ }
1322
+ a.icon-btn {
1323
+ text-decoration: none;
1324
+ }
1325
+ .chart .code-btn,
1326
+ .flow-card .code-btn {
1327
+ cursor: pointer;
1328
+ opacity: 0;
1329
+ transition: opacity 0.12s;
1330
+ }
1331
+ .chart g.r:hover .code-btn,
1332
+ .chart g.r.sel .code-btn,
1333
+ .flow-card:hover .code-btn,
1334
+ .flow-card.selected .code-btn {
1335
+ opacity: 1;
1336
+ }
1337
+ .code-btn circle {
1338
+ fill: var(--panel);
1339
+ stroke: var(--text-3);
1340
+ stroke-width: 1.2;
1341
+ }
1342
+ .code-btn text {
1343
+ fill: var(--text-2);
1344
+ font: 700 9px var(--mono);
1345
+ pointer-events: none;
1346
+ }
1347
+ .code-btn:hover circle {
1348
+ stroke: var(--accent);
1349
+ }
1350
+ .code-btn:hover text {
1351
+ fill: var(--accent);
1352
+ }
1353
+ .chart line.pin.flash {
1354
+ animation: pin-flash 0.6s ease-in-out 3;
1355
+ }
1356
+ .chart circle.mark.flash {
1357
+ animation: mark-flash 0.6s ease-in-out 3;
1358
+ transform-box: fill-box;
1359
+ transform-origin: center;
1360
+ }
1361
+ @keyframes pin-flash {
1362
+ 50% {
1363
+ stroke-width: 5;
1364
+ }
1365
+ }
1366
+ @keyframes mark-flash {
1367
+ 50% {
1368
+ transform: scale(1.9);
1369
+ }
1370
+ }
366
1371
  .code-pop {
367
- position: fixed; z-index: 58; width: 640px; max-width: 92vw; max-height: 70vh; display: flex; flex-direction: column;
368
- background: var(--panel); border: 1px solid var(--line); border-radius: 10px; box-shadow: var(--shadow); overflow: hidden;
369
- }
370
- .code-pop .cp-head { display: flex; align-items: center; gap: 6px; padding: 6px 8px 6px 12px; background: var(--panel-2); border-bottom: 1px solid var(--line); }
371
- .code-pop .cp-path { font: 12px var(--mono); color: var(--text-2); min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
372
- .code-pop .cp-name { flex: 1; text-align: right; color: var(--text-3); font-size: 12px; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
373
- .code-pop .cp-body { overflow: auto; min-height: 0; }
374
- .code-pop .cp-code { font: 11.5px/1.65 var(--mono); padding: 8px 0; min-width: max-content; }
375
- .code-pop .cl { display: grid; grid-template-columns: 48px auto; white-space: pre; }
376
- .code-pop .cl.at { background: var(--accent-soft); }
377
- .code-pop .ln { color: var(--text-3); text-align: right; padding-right: 14px; user-select: none; }
378
- .code-pop .lc { padding-right: 16px; }
379
- .code-pop .cp-more { padding: 6px 14px 10px; font-size: 12px; }
380
- :root { --tk-c: #6f7a99; --tk-s: #7ee0a3; --tk-n: #f0b26b; --tk-k: #c792ea; --tk-f: #82aaff; --tk-t: #ffcb6b; }
381
- :root[data-theme="light"] { --tk-c: #6a737d; --tk-s: #116329; --tk-n: #b35900; --tk-k: #cf222e; --tk-f: #6639ba; --tk-t: #953800; }
1372
+ position: fixed;
1373
+ z-index: 58;
1374
+ width: 640px;
1375
+ max-width: 92vw;
1376
+ max-height: 70vh;
1377
+ display: flex;
1378
+ flex-direction: column;
1379
+ background: var(--panel);
1380
+ border: 1px solid var(--line);
1381
+ border-radius: 10px;
1382
+ box-shadow: var(--shadow);
1383
+ overflow: hidden;
1384
+ }
1385
+ .code-pop .cp-head {
1386
+ display: flex;
1387
+ align-items: center;
1388
+ gap: 6px;
1389
+ padding: 6px 8px 6px 12px;
1390
+ background: var(--panel-2);
1391
+ border-bottom: 1px solid var(--line);
1392
+ }
1393
+ .code-pop .cp-path {
1394
+ font: 12px var(--mono);
1395
+ color: var(--text-2);
1396
+ min-width: 0;
1397
+ overflow: hidden;
1398
+ text-overflow: ellipsis;
1399
+ white-space: nowrap;
1400
+ }
1401
+ .code-pop .cp-name {
1402
+ flex: 1;
1403
+ text-align: right;
1404
+ color: var(--text-3);
1405
+ font-size: 12px;
1406
+ min-width: 0;
1407
+ overflow: hidden;
1408
+ text-overflow: ellipsis;
1409
+ white-space: nowrap;
1410
+ }
1411
+ .code-pop .cp-body {
1412
+ overflow: auto;
1413
+ min-height: 0;
1414
+ }
1415
+ .code-pop .cp-code {
1416
+ font: 11.5px/1.65 var(--mono);
1417
+ padding: 8px 0;
1418
+ min-width: max-content;
1419
+ }
1420
+ .code-pop .cl {
1421
+ display: grid;
1422
+ grid-template-columns: 48px auto;
1423
+ white-space: pre;
1424
+ }
1425
+ .code-pop .cl.at {
1426
+ background: var(--accent-soft);
1427
+ }
1428
+ .code-pop .ln {
1429
+ color: var(--text-3);
1430
+ text-align: right;
1431
+ padding-right: 14px;
1432
+ user-select: none;
1433
+ }
1434
+ .code-pop .lc {
1435
+ padding-right: 16px;
1436
+ }
1437
+ .code-pop .cp-more {
1438
+ padding: 6px 14px 10px;
1439
+ font-size: 12px;
1440
+ }
1441
+ :root {
1442
+ --tk-c: #6f7a99;
1443
+ --tk-s: #7ee0a3;
1444
+ --tk-n: #f0b26b;
1445
+ --tk-k: #c792ea;
1446
+ --tk-f: #82aaff;
1447
+ --tk-t: #ffcb6b;
1448
+ }
1449
+ :root[data-theme="light"] {
1450
+ --tk-c: #6a737d;
1451
+ --tk-s: #116329;
1452
+ --tk-n: #b35900;
1453
+ --tk-k: #cf222e;
1454
+ --tk-f: #6639ba;
1455
+ --tk-t: #953800;
1456
+ }
382
1457
  @media (prefers-color-scheme: light) {
383
- :root:not([data-theme="dark"]) { --tk-c: #6a737d; --tk-s: #116329; --tk-n: #b35900; --tk-k: #cf222e; --tk-f: #6639ba; --tk-t: #953800; }
384
- }
385
- .tk-c { color: var(--tk-c); font-style: italic; }
386
- .tk-s { color: var(--tk-s); }
387
- .tk-n { color: var(--tk-n); }
388
- .tk-k { color: var(--tk-k); }
389
- .tk-f { color: var(--tk-f); }
390
- .tk-t { color: var(--tk-t); }
391
- .tk-p { color: var(--tk-f); }
1458
+ :root:not([data-theme="dark"]) {
1459
+ --tk-c: #6a737d;
1460
+ --tk-s: #116329;
1461
+ --tk-n: #b35900;
1462
+ --tk-k: #cf222e;
1463
+ --tk-f: #6639ba;
1464
+ --tk-t: #953800;
1465
+ }
1466
+ }
1467
+ .tk-c {
1468
+ color: var(--tk-c);
1469
+ font-style: italic;
1470
+ }
1471
+ .tk-s {
1472
+ color: var(--tk-s);
1473
+ }
1474
+ .tk-n {
1475
+ color: var(--tk-n);
1476
+ }
1477
+ .tk-k {
1478
+ color: var(--tk-k);
1479
+ }
1480
+ .tk-f {
1481
+ color: var(--tk-f);
1482
+ }
1483
+ .tk-t {
1484
+ color: var(--tk-t);
1485
+ }
1486
+ .tk-p {
1487
+ color: var(--tk-f);
1488
+ }
392
1489
 
393
1490
  /* ── popover tabs, prompt panel, flow snapshot strip ───── */
394
- .code-pop .cp-tabs { display: flex; gap: 2px; padding: 0 8px; border-bottom: 1px solid var(--line); background: var(--panel-2); }
395
- .code-pop .cp-tabs .tab { padding: 6px 9px; font-size: 12px; }
396
- .pp { padding: 12px 14px 14px; display: grid; gap: 10px; }
397
- .pp-q { font-size: 14px; font-weight: 600; white-space: pre-wrap; }
398
- .pp-grid { display: grid; grid-template-columns: 76px minmax(0, 1fr); gap: 4px 10px; font-size: 12px; }
399
- .pp-k { color: var(--text-3); font-size: 12px; }
400
- .pp-choices { margin: 0; padding-left: 18px; }
401
- .pp-choices li.picked { color: var(--accent); font-weight: 600; }
402
- .pp-answer { display: grid; gap: 6px; justify-items: start; }
403
- .pp-answer pre { width: 100%; }
404
- .tcall { font: 12px var(--mono); color: var(--text-3); overflow-wrap: anywhere; }
405
- .tcall .b { color: var(--accent); font-weight: 600; }
406
- .tcall .f { color: var(--text); }
407
- .tip .tcall { margin: 2px 0 5px; }
408
- .details .who-call { margin: 0 0 10px; }
409
- .tip .tmeta { display: flex; align-items: center; gap: 6px; color: var(--text-2); font-size: 11px; }
410
- .tip .tmeta .sep { color: var(--text-3); }
411
- .tip .tmeta .mcp { color: var(--accent); font-weight: 600; }
412
- .tip .chips { margin-top: 6px; }
413
- .tip .tfail { margin-top: 6px; color: var(--fail); font: 11px var(--mono); overflow-wrap: anywhere; }
414
- .flow-shots .shot { cursor: pointer; }
415
- .flow-shots .shot rect { fill: var(--panel-2); stroke: var(--line); }
416
- .flow-shots .shot:hover rect { stroke: var(--accent); }
417
- .flow-shots .shot text { fill: var(--text-3); font: 600 9px var(--mono); pointer-events: none; }
1491
+ .code-pop .cp-tabs {
1492
+ display: flex;
1493
+ gap: 2px;
1494
+ padding: 0 8px;
1495
+ border-bottom: 1px solid var(--line);
1496
+ background: var(--panel-2);
1497
+ }
1498
+ .code-pop .cp-tabs .tab {
1499
+ padding: 6px 9px;
1500
+ font-size: 12px;
1501
+ }
1502
+ .pp {
1503
+ padding: 12px 14px 14px;
1504
+ display: grid;
1505
+ gap: 10px;
1506
+ }
1507
+ .pp-q {
1508
+ font-size: 14px;
1509
+ font-weight: 600;
1510
+ white-space: pre-wrap;
1511
+ }
1512
+ .pp-grid {
1513
+ display: grid;
1514
+ grid-template-columns: 76px minmax(0, 1fr);
1515
+ gap: 4px 10px;
1516
+ font-size: 12px;
1517
+ }
1518
+ .pp-k {
1519
+ color: var(--text-3);
1520
+ font-size: 12px;
1521
+ }
1522
+ .pp-choices {
1523
+ margin: 0;
1524
+ padding-left: 18px;
1525
+ }
1526
+ .pp-choices li.picked {
1527
+ color: var(--accent);
1528
+ font-weight: 600;
1529
+ }
1530
+ .pp-answer {
1531
+ display: grid;
1532
+ gap: 6px;
1533
+ justify-items: start;
1534
+ }
1535
+ .pp-answer pre {
1536
+ width: 100%;
1537
+ }
1538
+ .tcall {
1539
+ font: 12px var(--mono);
1540
+ color: var(--text-3);
1541
+ overflow-wrap: anywhere;
1542
+ }
1543
+ .tcall .b {
1544
+ color: var(--accent);
1545
+ font-weight: 600;
1546
+ }
1547
+ .tcall .f {
1548
+ color: var(--text);
1549
+ }
1550
+ .tip .tcall {
1551
+ margin: 2px 0 5px;
1552
+ }
1553
+ .details .who-call {
1554
+ margin: 0 0 10px;
1555
+ }
1556
+ .tip .tmeta {
1557
+ display: flex;
1558
+ align-items: center;
1559
+ gap: 6px;
1560
+ color: var(--text-2);
1561
+ font-size: 11px;
1562
+ }
1563
+ .tip .tmeta .sep {
1564
+ color: var(--text-3);
1565
+ }
1566
+ .tip .tmeta .mcp {
1567
+ color: var(--accent);
1568
+ font-weight: 600;
1569
+ }
1570
+ .tip .chips {
1571
+ margin-top: 6px;
1572
+ }
1573
+ .tip .tfail {
1574
+ margin-top: 6px;
1575
+ color: var(--fail);
1576
+ font: 11px var(--mono);
1577
+ overflow-wrap: anywhere;
1578
+ }
1579
+ .flow-shots .shot {
1580
+ cursor: pointer;
1581
+ }
1582
+ .flow-shots .shot rect {
1583
+ fill: var(--panel-2);
1584
+ stroke: var(--line);
1585
+ }
1586
+ .flow-shots .shot:hover rect {
1587
+ stroke: var(--accent);
1588
+ }
1589
+ .flow-shots .shot text {
1590
+ fill: var(--text-3);
1591
+ font: 600 9px var(--mono);
1592
+ pointer-events: none;
1593
+ }
418
1594
 
419
1595
  /* ── returned values ───────────────────────────────────── */
420
- .code-btn path { fill: none; stroke: var(--text-2); stroke-width: 2.6; stroke-linecap: round; stroke-linejoin: round; pointer-events: none; }
421
- .code-btn:hover path { stroke: var(--accent); }
422
- .cp-tools { display: flex; align-items: center; justify-content: space-between; gap: 10px; padding: 6px 10px 6px 14px; border-bottom: 1px solid var(--line-soft); font-size: 12px; }
423
- .btn.small { padding: 3px 9px; font-size: 12px; }
424
- .btn.small svg { width: 13px; height: 13px; }
425
- .code-box { border: 1px solid var(--line-soft); border-radius: 8px; background: var(--panel-2); overflow: auto; max-height: 60vh; }
426
- .code-box .cp-code, .code-pop .cp-code { font: 11.5px/1.65 var(--mono); padding: 8px 0; min-width: max-content; }
427
- .code-box .cl { display: grid; grid-template-columns: 40px auto; white-space: pre; }
428
- .code-box .ln { color: var(--text-3); text-align: right; padding-right: 12px; user-select: none; }
429
- .code-box .lc { padding-right: 14px; }
1596
+ .code-btn path {
1597
+ fill: none;
1598
+ stroke: var(--text-2);
1599
+ stroke-width: 2.6;
1600
+ stroke-linecap: round;
1601
+ stroke-linejoin: round;
1602
+ pointer-events: none;
1603
+ }
1604
+ .code-btn:hover path {
1605
+ stroke: var(--accent);
1606
+ }
1607
+ .cp-tools {
1608
+ display: flex;
1609
+ align-items: center;
1610
+ justify-content: space-between;
1611
+ gap: 10px;
1612
+ padding: 6px 10px 6px 14px;
1613
+ border-bottom: 1px solid var(--line-soft);
1614
+ font-size: 12px;
1615
+ }
1616
+ .btn.small {
1617
+ padding: 3px 9px;
1618
+ font-size: 12px;
1619
+ }
1620
+ .btn.small svg {
1621
+ width: 13px;
1622
+ height: 13px;
1623
+ }
1624
+ .code-box {
1625
+ border: 1px solid var(--line-soft);
1626
+ border-radius: 8px;
1627
+ background: var(--panel-2);
1628
+ overflow: auto;
1629
+ max-height: 60vh;
1630
+ }
1631
+ .code-box .cp-code,
1632
+ .code-pop .cp-code {
1633
+ font: 11.5px/1.65 var(--mono);
1634
+ padding: 8px 0;
1635
+ min-width: max-content;
1636
+ }
1637
+ .code-box .cl {
1638
+ display: grid;
1639
+ grid-template-columns: 40px auto;
1640
+ white-space: pre;
1641
+ }
1642
+ .code-box .ln {
1643
+ color: var(--text-3);
1644
+ text-align: right;
1645
+ padding-right: 12px;
1646
+ user-select: none;
1647
+ }
1648
+ .code-box .lc {
1649
+ padding-right: 14px;
1650
+ }
430
1651
 
431
1652
  /* ── errors ────────────────────────────────────────────── */
432
- .tab-count { display: inline-block; min-width: 18px; padding: 0 6px; border-radius: 999px; background: var(--raise); color: var(--text-2); font-size: 11px; text-align: center; }
433
- .tab-count.bad { background: rgba(239, 68, 68, 0.16); color: var(--fail); font-weight: 700; }
434
- .linkish { border: 0; background: none; padding: 0; cursor: pointer; font: inherit; color: var(--accent); }
435
- .linkish.bad { color: var(--fail); }
436
- .linkish.warn { color: var(--cancel); }
437
- .tab-count.warn { background: rgba(245, 158, 11, 0.16); color: var(--cancel); font-weight: 700; }
438
- .linkish:hover { text-decoration: underline; }
439
- .err-bar { display: flex; align-items: center; justify-content: space-between; gap: 10px; margin-bottom: 8px; flex-wrap: wrap; }
440
- .segs { display: flex; border: 1px solid var(--line); border-radius: 7px; overflow: hidden; }
441
- .seg { border: 0; background: var(--panel); padding: 4px 10px; cursor: pointer; color: var(--text-2); font-size: 12px; }
442
- .seg + .seg { border-left: 1px solid var(--line); }
443
- .seg.active { background: var(--accent-soft); color: var(--text); font-weight: 600; }
444
- .btn.small.active { background: rgba(239, 68, 68, 0.14); color: var(--fail); border-color: var(--fail); }
445
- .err-sec { margin-bottom: 10px; }
446
- .err-sec-h { display: flex; align-items: center; gap: 6px; font-weight: 600; font-size: 12px; color: var(--text-2); margin: 6px 0 4px; }
447
- .err-sec-h svg { width: 13px; height: 13px; color: var(--fail); }
448
- .err-entry { border: 1px solid var(--line-soft); border-left: 3px solid var(--fail); border-radius: 6px; margin-bottom: 4px; background: var(--panel); }
449
- .err-entry.output { border-left-color: var(--cancel); }
450
- .err-entry.assert { border-left-color: #f97316; }
451
- .err-row { display: flex; align-items: center; gap: 8px; padding: 4px 6px; cursor: pointer; min-width: 0; font-size: 12px; }
452
- .err-row:hover { background: var(--raise); }
453
- .err-row .twist { width: 14px; height: 14px; display: grid; place-items: center; color: var(--text-3); flex: none; }
454
- .err-row .twist svg { width: 11px; height: 11px; transition: transform 0.12s; }
455
- .err-row .twist.open svg { transform: rotate(90deg); }
456
- .err-row .t { color: var(--text-2); font-variant-numeric: tabular-nums; flex: none; min-width: 44px; }
457
- .err-row .who { color: var(--text); font-weight: 600; flex: none; max-width: 220px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
458
- .err-row .err-src { color: var(--text-3); font-family: var(--mono); font-size: 11px; flex: none; max-width: 180px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
459
- .err-row .msg { flex: 1; min-width: 0; font-family: var(--mono); color: var(--fail); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
460
- .err-entry.output .err-row .msg { color: var(--text-2); }
461
- .err-row .err-n { color: var(--text-3); font-size: 11px; flex: none; }
462
- .err-row .icon-btn { width: 22px; height: 20px; }
463
- .err-text { margin: 0 8px 8px 28px; max-height: 260px; }
464
- .err-kind { color: var(--fail); }
465
- .errbadge { flex: none; min-width: 16px; height: 16px; padding: 0 5px; border-radius: 999px; background: var(--fail); color: #fff; font-size: 10px; font-weight: 700; display: inline-grid; place-items: center; }
1653
+ .tab-count {
1654
+ display: inline-block;
1655
+ min-width: 18px;
1656
+ padding: 0 6px;
1657
+ border-radius: 999px;
1658
+ background: var(--raise);
1659
+ color: var(--text-2);
1660
+ font-size: 11px;
1661
+ text-align: center;
1662
+ }
1663
+ .tab-count.bad {
1664
+ background: rgba(239, 68, 68, 0.16);
1665
+ color: var(--fail);
1666
+ font-weight: 700;
1667
+ }
1668
+ .linkish {
1669
+ border: 0;
1670
+ background: none;
1671
+ padding: 0;
1672
+ cursor: pointer;
1673
+ font: inherit;
1674
+ color: var(--accent);
1675
+ }
1676
+ .linkish.bad {
1677
+ color: var(--fail);
1678
+ }
1679
+ .linkish.warn {
1680
+ color: var(--cancel);
1681
+ }
1682
+ .tab-count.warn {
1683
+ background: rgba(245, 158, 11, 0.16);
1684
+ color: var(--cancel);
1685
+ font-weight: 700;
1686
+ }
1687
+ .linkish:hover {
1688
+ text-decoration: underline;
1689
+ }
1690
+ .err-bar {
1691
+ display: flex;
1692
+ align-items: center;
1693
+ justify-content: space-between;
1694
+ gap: 10px;
1695
+ margin-bottom: 8px;
1696
+ flex-wrap: wrap;
1697
+ }
1698
+ .segs {
1699
+ display: flex;
1700
+ border: 1px solid var(--line);
1701
+ border-radius: 7px;
1702
+ overflow: hidden;
1703
+ }
1704
+ .seg {
1705
+ border: 0;
1706
+ background: var(--panel);
1707
+ padding: 4px 10px;
1708
+ cursor: pointer;
1709
+ color: var(--text-2);
1710
+ font-size: 12px;
1711
+ }
1712
+ .seg + .seg {
1713
+ border-left: 1px solid var(--line);
1714
+ }
1715
+ .seg.active {
1716
+ background: var(--accent-soft);
1717
+ color: var(--text);
1718
+ font-weight: 600;
1719
+ }
1720
+ .btn.small.active {
1721
+ background: rgba(239, 68, 68, 0.14);
1722
+ color: var(--fail);
1723
+ border-color: var(--fail);
1724
+ }
1725
+ .err-sec {
1726
+ margin-bottom: 10px;
1727
+ }
1728
+ .err-sec-h {
1729
+ display: flex;
1730
+ align-items: center;
1731
+ gap: 6px;
1732
+ font-weight: 600;
1733
+ font-size: 12px;
1734
+ color: var(--text-2);
1735
+ margin: 6px 0 4px;
1736
+ }
1737
+ .err-sec-h svg {
1738
+ width: 13px;
1739
+ height: 13px;
1740
+ color: var(--fail);
1741
+ }
1742
+ .err-entry {
1743
+ border: 1px solid var(--line-soft);
1744
+ border-left: 3px solid var(--fail);
1745
+ border-radius: 6px;
1746
+ margin-bottom: 4px;
1747
+ background: var(--panel);
1748
+ }
1749
+ .err-entry.output {
1750
+ border-left-color: var(--cancel);
1751
+ }
1752
+ .err-entry.assert {
1753
+ border-left-color: #f97316;
1754
+ }
1755
+ .err-row {
1756
+ display: flex;
1757
+ align-items: center;
1758
+ gap: 8px;
1759
+ padding: 4px 6px;
1760
+ cursor: pointer;
1761
+ min-width: 0;
1762
+ font-size: 12px;
1763
+ }
1764
+ .err-row:hover {
1765
+ background: var(--raise);
1766
+ }
1767
+ .err-row .twist {
1768
+ width: 14px;
1769
+ height: 14px;
1770
+ display: grid;
1771
+ place-items: center;
1772
+ color: var(--text-3);
1773
+ flex: none;
1774
+ }
1775
+ .err-row .twist svg {
1776
+ width: 11px;
1777
+ height: 11px;
1778
+ transition: transform 0.12s;
1779
+ }
1780
+ .err-row .twist.open svg {
1781
+ transform: rotate(90deg);
1782
+ }
1783
+ .err-row .t {
1784
+ color: var(--text-2);
1785
+ font-variant-numeric: tabular-nums;
1786
+ flex: none;
1787
+ min-width: 44px;
1788
+ }
1789
+ .err-row .who {
1790
+ color: var(--text);
1791
+ font-weight: 600;
1792
+ flex: none;
1793
+ max-width: 220px;
1794
+ overflow: hidden;
1795
+ text-overflow: ellipsis;
1796
+ white-space: nowrap;
1797
+ }
1798
+ .err-row .err-src {
1799
+ color: var(--text-3);
1800
+ font-family: var(--mono);
1801
+ font-size: 11px;
1802
+ flex: none;
1803
+ max-width: 180px;
1804
+ overflow: hidden;
1805
+ text-overflow: ellipsis;
1806
+ white-space: nowrap;
1807
+ }
1808
+ .err-row .msg {
1809
+ flex: 1;
1810
+ min-width: 0;
1811
+ font-family: var(--mono);
1812
+ color: var(--fail);
1813
+ overflow: hidden;
1814
+ text-overflow: ellipsis;
1815
+ white-space: nowrap;
1816
+ }
1817
+ .err-entry.output .err-row .msg {
1818
+ color: var(--text-2);
1819
+ }
1820
+ .err-row .err-n {
1821
+ color: var(--text-3);
1822
+ font-size: 11px;
1823
+ flex: none;
1824
+ }
1825
+ .err-row .icon-btn {
1826
+ width: 22px;
1827
+ height: 20px;
1828
+ }
1829
+ .err-text {
1830
+ margin: 0 8px 8px 28px;
1831
+ max-height: 260px;
1832
+ }
1833
+ .err-kind {
1834
+ color: var(--fail);
1835
+ }
1836
+ .errbadge {
1837
+ flex: none;
1838
+ min-width: 16px;
1839
+ height: 16px;
1840
+ padding: 0 5px;
1841
+ border-radius: 999px;
1842
+ background: var(--fail);
1843
+ color: #fff;
1844
+ font-size: 10px;
1845
+ font-weight: 700;
1846
+ display: inline-grid;
1847
+ place-items: center;
1848
+ }
466
1849
  /* highlight mode — errored nodes in red, the path to them marked, the rest dimmed */
467
1850
  #app.hl-on .chart g.r:not(.err):not(.err-path),
468
- #app.hl-on .flow-card:not(.err):not(.err-path) { opacity: 0.22; }
469
- #app.hl-on .tree .row:not(.err):not(.err-path) { opacity: 0.4; }
470
- #app.hl-on .chart g.r.err rect.bar { stroke: var(--fail); stroke-width: 2.5; filter: drop-shadow(0 0 5px rgba(239, 68, 68, 0.75)); }
471
- #app.hl-on .flow-card.err rect.box { stroke: var(--fail); stroke-width: 2.5; filter: drop-shadow(0 0 5px rgba(239, 68, 68, 0.6)); }
1851
+ #app.hl-on .flow-card:not(.err):not(.err-path) {
1852
+ opacity: 0.22;
1853
+ }
1854
+ #app.hl-on .tree .row:not(.err):not(.err-path) {
1855
+ opacity: 0.4;
1856
+ }
1857
+ #app.hl-on .chart g.r.err rect.bar {
1858
+ stroke: var(--fail);
1859
+ stroke-width: 2.5;
1860
+ filter: drop-shadow(0 0 5px rgba(239, 68, 68, 0.75));
1861
+ }
1862
+ #app.hl-on .flow-card.err rect.box {
1863
+ stroke: var(--fail);
1864
+ stroke-width: 2.5;
1865
+ filter: drop-shadow(0 0 5px rgba(239, 68, 68, 0.6));
1866
+ }
472
1867
  #app.hl-on .chart g.r.err-path rect.bar,
473
- #app.hl-on .flow-card.err-path rect.box { stroke: var(--fail); stroke-width: 1.2; stroke-dasharray: 4 3; }
474
- #app.hl-on .tree .row.err { background: rgba(239, 68, 68, 0.1); }
475
- .chart g.r, .flow-card, .tree .row { transition: opacity 0.15s; }
1868
+ #app.hl-on .flow-card.err-path rect.box {
1869
+ stroke: var(--fail);
1870
+ stroke-width: 1.2;
1871
+ stroke-dasharray: 4 3;
1872
+ }
1873
+ #app.hl-on .tree .row.err {
1874
+ background: rgba(239, 68, 68, 0.1);
1875
+ }
1876
+ .chart g.r,
1877
+ .flow-card,
1878
+ .tree .row {
1879
+ transition: opacity 0.15s;
1880
+ }
476
1881
  /* cross-node links: hollow points on the caller's row, chips in the flow */
477
- .chart circle.mark.link { stroke-width: 2; }
478
- .xwire { stroke-width: 1.2; stroke-dasharray: 3 3; opacity: 0.55; pointer-events: none; }
479
- .xwire.hot { stroke-width: 2; opacity: 1; }
480
- .fwire { fill: none; stroke-width: 1.2; stroke-dasharray: 3 3; opacity: 0.5; pointer-events: none; }
481
- .fwire.hot { stroke-width: 2; opacity: 1; }
482
- .flow-shots .shot rect[stroke] { stroke-width: 1.5; }
1882
+ .chart circle.mark.link {
1883
+ stroke-width: 2;
1884
+ }
1885
+ .xwire {
1886
+ stroke-width: 1.2;
1887
+ stroke-dasharray: 3 3;
1888
+ opacity: 0.55;
1889
+ pointer-events: none;
1890
+ }
1891
+ .xwire.hot {
1892
+ stroke-width: 2;
1893
+ opacity: 1;
1894
+ }
1895
+ .fwire {
1896
+ fill: none;
1897
+ stroke-width: 1.2;
1898
+ stroke-dasharray: 3 3;
1899
+ opacity: 0.5;
1900
+ pointer-events: none;
1901
+ }
1902
+ .fwire.hot {
1903
+ stroke-width: 2;
1904
+ opacity: 1;
1905
+ }
1906
+ .flow-shots .shot rect[stroke] {
1907
+ stroke-width: 1.5;
1908
+ }
483
1909
 
484
1910
  @media (max-width: 1100px) {
485
- .bottom { grid-template-columns: minmax(0, 1fr); }
486
- .overview { display: none; }
487
- .main { grid-template-columns: minmax(0, 1fr); }
488
- .details { display: none; }
1911
+ .bottom {
1912
+ grid-template-columns: minmax(0, 1fr);
1913
+ }
1914
+ .overview {
1915
+ display: none;
1916
+ }
1917
+ .main {
1918
+ grid-template-columns: minmax(0, 1fr);
1919
+ }
1920
+ .details {
1921
+ display: none;
1922
+ }
489
1923
  }