omkit 0.8.15 → 0.8.17

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,433 +1,493 @@
1
- :root {
2
- --bg: #0b1020;
3
- --panel: #111831;
4
- --panel-2: #0e152b;
5
- --raise: #18213f;
6
- --line: #222c4d;
7
- --line-soft: #1a2342;
8
- --text: #e6eaf5;
9
- --text-2: #a9b2cc;
10
- --text-3: #6f7a99;
11
- --accent: #3b82f6;
12
- --accent-soft: rgba(59, 130, 246, 0.18);
13
- --ok: #22c55e;
14
- --fail: #ef4444;
15
- --cancel: #f59e0b;
16
- --running: #38bdf8;
17
- --c1: #4f8ff7;
18
- --c2: #8b5cf6;
19
- --c3: #22c55e;
20
- --c4: #f59e0b;
21
- --c5: #f0568c;
22
- --c6: #22d3ee;
23
- --c7: #a3e635;
24
- --c8: #fb7185;
25
- --bar-text: #0b1020;
26
- --shadow: 0 10px 30px rgba(0, 0, 0, 0.45);
27
- --mono: ui-monospace, "SF Mono", "Cascadia Code", Consolas, monospace;
28
- --sans: system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;
29
- color-scheme: dark;
30
- }
31
- :root[data-theme="light"] {
32
- --bg: #f4f6fb;
33
- --panel: #ffffff;
34
- --panel-2: #f8f9fc;
35
- --raise: #eef1f8;
36
- --line: #dde2ee;
37
- --line-soft: #e9ecf4;
38
- --text: #182033;
39
- --text-2: #4b5672;
40
- --text-3: #8590ab;
41
- --accent: #2563eb;
42
- --accent-soft: rgba(37, 99, 235, 0.12);
43
- --bar-text: #0b1020;
44
- --shadow: 0 10px 30px rgba(20, 30, 60, 0.15);
45
- color-scheme: light;
46
- }
47
- @media (prefers-color-scheme: light) {
48
- :root:not([data-theme="dark"]) {
49
- --bg: #f4f6fb;
50
- --panel: #ffffff;
51
- --panel-2: #f8f9fc;
52
- --raise: #eef1f8;
53
- --line: #dde2ee;
54
- --line-soft: #e9ecf4;
55
- --text: #182033;
56
- --text-2: #4b5672;
57
- --text-3: #8590ab;
58
- --accent: #2563eb;
59
- --accent-soft: rgba(37, 99, 235, 0.12);
60
- --shadow: 0 10px 30px rgba(20, 30, 60, 0.15);
61
- color-scheme: light;
62
- }
63
- }
64
-
65
- * { box-sizing: border-box; }
66
- html, body { margin: 0; height: 100%; }
67
- body {
68
- background: var(--bg);
69
- color: var(--text);
70
- font: 13px/1.4 var(--sans);
71
- overflow: hidden;
72
- }
73
- button { font: inherit; color: inherit; }
74
- [hidden] { display: none !important; }
75
-
76
- /* ── loader ─────────────────────────────────────────────── */
77
- #loader {
78
- position: fixed; inset: 0; display: grid; place-items: center;
79
- background: var(--bg); z-index: 100;
80
- }
81
- .loader-card { display: grid; justify-items: center; gap: 14px; }
82
- .loader-spin {
83
- width: 42px; height: 42px; border-radius: 50%;
84
- border: 3px solid var(--line); border-top-color: var(--accent);
85
- animation: spin 0.9s linear infinite;
86
- }
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); } }
90
-
91
- /* ── shell ──────────────────────────────────────────────── */
92
- #app {
93
- height: 100vh; display: grid; gap: 10px; padding: 12px 14px 14px;
94
- grid-template-rows: auto minmax(0, 1fr) 230px;
95
- }
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); }
106
-
107
- .btn-group { display: flex; border: 1px solid var(--line); border-radius: 8px; overflow: hidden; background: var(--panel); }
108
- .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); }
117
-
118
- .main {
119
- display: grid; gap: 10px; min-height: 0;
120
- grid-template-columns: minmax(0, 1fr) 320px;
121
- }
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; }
124
-
125
- /* ── 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) 84px 82px; 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; }
133
- .timeline.no-tree .tl-head, .timeline.no-tree .tl-body { grid-template-columns: minmax(0, 1fr); }
134
- .timeline.no-tree .tree, .timeline.no-tree .tl-head .cols { display: none; }
135
-
136
- .tree { border-right: 1px solid var(--line); position: sticky; left: 0; background: var(--panel); z-index: 2; }
137
- .row {
138
- height: var(--row-h); display: grid; grid-template-columns: minmax(0, 1fr) 84px 82px;
139
- align-items: center; cursor: pointer; border-bottom: 1px solid transparent;
140
- }
141
- .row:hover { background: var(--raise); }
142
- .row.selected { background: var(--accent-soft); }
143
- .row .name { display: flex; align-items: center; gap: 7px; min-width: 0; padding-right: 8px; }
144
- .row .name .label { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
145
- .row .name .tagchip { color: var(--text-3); font-size: 11px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
146
- .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; }
147
- .row .twist svg { width: 12px; height: 12px; transition: transform 0.12s; }
148
- .row .twist.open svg { transform: rotate(90deg); }
149
- .row .icon { width: 22px; height: 22px; flex: none; display: grid; place-items: center; border-radius: 6px; }
150
- .row .icon svg { width: 14px; height: 14px; }
151
- .row .status, .row .dur { padding: 0 12px; display: flex; align-items: center; gap: 7px; color: var(--text-2); font-variant-numeric: tabular-nums; }
152
- .guide { width: 14px; flex: none; align-self: stretch; position: relative; }
153
- .guide::before { content: ""; position: absolute; left: 7px; top: 0; bottom: 0; border-left: 1px solid var(--line); }
154
-
155
- .chart { position: relative; min-width: 0; }
156
- .chart svg { display: block; overflow: hidden; }
157
- .chart .bar-label { font-size: 12px; fill: var(--bar-text); font-weight: 500; cursor: pointer; }
158
- .chart .hit { fill: transparent; cursor: pointer; }
159
- .chart .hit:hover + .bar { filter: brightness(1.15); }
160
- .chart .bar-label.outside { fill: var(--text); }
161
- .chart .mark-label { font-size: 11px; fill: var(--text-2); cursor: pointer; }
162
- .chart .mark-label:hover { fill: var(--text); }
163
- .chart .grid line { stroke: var(--line-soft); }
164
- .chart .cursor { stroke: var(--text-2); stroke-dasharray: 3 3; pointer-events: none; }
165
- .chart .link { fill: none; stroke: var(--text-3); stroke-width: 1.2; }
166
- .chart .bar { cursor: pointer; }
167
- .chart .bar.selected { stroke: var(--text); stroke-width: 2; }
168
- .chart .mark { cursor: pointer; stroke: var(--panel); stroke-width: 1.5; }
169
- .axis text { fill: var(--text-2); font-size: 11px; }
170
- .axis line, .axis path { stroke: var(--line); }
171
-
172
- .flow-view, .flame-view { position: absolute; inset: 0; }
173
- .flame-view { overflow-y: auto; overflow-x: hidden; }
174
- .flow-view svg, .flame-view svg { width: 100%; height: 100%; display: block; cursor: grab; }
175
- .flow-card rect.box { fill: var(--raise); stroke: var(--line); rx: 8; }
176
- .flow-card.selected rect.box { stroke: var(--accent); stroke-width: 2; }
177
- .flow-card text { fill: var(--text); font-size: 12px; }
178
- .flow-card text.nm { font-weight: 600; }
179
- .flow-card .flow-icon { pointer-events: none; }
180
- .flow-seq { fill: none; stroke: var(--text-3); stroke-width: 1.4; stroke-dasharray: 5 4; }
181
- .flow-seq.parallel { stroke-dasharray: 1 4; stroke-linecap: round; stroke-width: 2; opacity: 0.8; }
182
- .flow-arrowhead { fill: var(--text-3); }
183
- .flow-par { fill: var(--text-3); font-size: 10px; font-style: italic; }
184
- .flow-shot-t { fill: var(--text-3); font-size: 10.5px; pointer-events: none; }
185
- .flow-card text.sub { fill: var(--text-3); font-size: 11px; }
186
- .flow-link { fill: none; stroke: var(--text-3); stroke-width: 1.3; }
187
- .flame-rect { cursor: pointer; stroke: var(--panel); stroke-width: 1; }
188
- .flame-rect.selected { stroke: var(--text); stroke-width: 2; }
189
- .flame-text { font-size: 11px; fill: var(--bar-text); cursor: pointer; }
190
-
191
- /* ── details ────────────────────────────────────────────── */
192
- .details { display: grid; grid-template-rows: auto auto minmax(0, 1fr); overflow: hidden; }
193
- .details .dh { display: flex; align-items: center; justify-content: space-between; padding: 10px 14px; font-weight: 600; }
194
- .details .x { border: 0; background: none; cursor: pointer; color: var(--text-2); padding: 2px; }
195
- .details .who { display: flex; align-items: center; gap: 10px; padding: 4px 14px 10px; }
196
- .details .who .icon { width: 30px; height: 30px; border-radius: 8px; display: grid; place-items: center; flex: none; }
197
- .details .who .icon svg { width: 16px; height: 16px; }
198
- .details .who .nm { font-size: 16px; font-weight: 600; flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
199
- .pill { display: inline-flex; align-items: center; gap: 6px; padding: 3px 10px; border-radius: 999px; background: var(--raise); font-size: 12px; }
200
- .details .scroll { overflow: auto; padding: 0 14px 14px; }
201
- .kv { display: grid; grid-template-columns: 92px minmax(0, 1fr); gap: 6px 10px; margin: 2px 0 12px; }
202
- .kv .k { color: var(--text-2); }
203
- .kv .v { min-width: 0; overflow-wrap: anywhere; font-variant-numeric: tabular-nums; }
204
- a { color: var(--accent); text-decoration: none; }
205
- a:hover { text-decoration: underline; }
206
- .tabs { display: flex; gap: 2px; border-bottom: 1px solid var(--line); margin: 0 0 10px; overflow-x: auto; }
207
- .tab { border: 0; background: none; padding: 7px 9px; cursor: pointer; color: var(--text-2); border-bottom: 2px solid transparent; white-space: nowrap; }
208
- .tab.active { color: var(--text); border-bottom-color: var(--accent); font-weight: 600; }
209
- .section-title { font-weight: 600; margin: 14px 0 8px; }
210
- .ev-list { list-style: none; margin: 0; padding: 0; position: relative; }
211
- .ev-list li { display: grid; grid-template-columns: 64px 18px minmax(0, 1fr); gap: 8px; align-items: start; padding: 4px 0; }
212
- .ev-list .t { color: var(--text-2); font-variant-numeric: tabular-nums; text-align: right; }
213
- .ev-list .m { overflow-wrap: anywhere; }
214
- .ev-ico { width: 16px; height: 16px; border-radius: 50%; display: grid; place-items: center; margin-top: 1px; }
215
- .ev-ico svg { width: 10px; height: 10px; }
216
- pre.code {
217
- margin: 0; padding: 10px; background: var(--panel-2); border: 1px solid var(--line-soft); border-radius: 8px;
218
- font: 12px/1.45 var(--mono); white-space: pre-wrap; overflow-wrap: anywhere; max-height: 60vh; overflow: auto;
219
- }
220
- .muted { color: var(--text-3); }
221
- .thumbs { display: grid; grid-template-columns: repeat(auto-fill, minmax(84px, 1fr)); gap: 8px; }
222
- .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; }
223
- .thumb:hover { border-color: var(--accent); }
224
- .thumb img { width: 100%; height: 100%; object-fit: cover; display: block; }
225
- .thumb .json-ico { font: 600 12px var(--mono); color: var(--text-3); }
226
-
227
- /* ── bottom strip ───────────────────────────────────────── */
228
- .bottom { display: grid; gap: 10px; grid-template-columns: minmax(0, 1fr) 270px 250px; min-height: 0; }
229
- .lower { display: grid; grid-template-rows: auto minmax(0, 1fr); overflow: hidden; }
230
- .lower .tabs { margin: 0; padding: 0 10px; align-items: center; }
231
- .lower .tabs .spacer { flex: 1; }
232
- .filter { border: 1px solid var(--line); background: var(--panel-2); border-radius: 7px; padding: 5px 9px; color: var(--text); width: 200px; margin: 4px 0; }
233
- .lower .body { overflow: auto; padding: 10px 12px; }
234
- .gallery { display: flex; gap: 12px; }
235
- .gal-item { flex: none; width: 160px; cursor: pointer; border: 1px solid transparent; border-radius: 8px; padding: 4px; }
236
- .gal-item:hover, .gal-item.active { border-color: var(--accent); background: var(--accent-soft); }
237
- .gal-item .thumb { aspect-ratio: 16 / 10; }
238
- .gal-item .cap { display: flex; gap: 8px; margin-top: 5px; font-size: 12px; }
239
- .gal-item .cap .t { color: var(--text-2); font-variant-numeric: tabular-nums; }
240
- .gal-item .cap .n { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
241
- .gal-item .sz { color: var(--text-3); font-size: 11px; }
242
- table.list { width: 100%; border-collapse: collapse; font-size: 12px; }
243
- table.list td { padding: 3px 8px; border-bottom: 1px solid var(--line-soft); vertical-align: top; }
244
- table.list td.t { color: var(--text-2); white-space: nowrap; font-variant-numeric: tabular-nums; width: 1%; }
245
- table.list td.p { color: var(--text-3); white-space: nowrap; max-width: 260px; overflow: hidden; text-overflow: ellipsis; width: 1%; }
246
- table.list td.m { font-family: var(--mono); white-space: pre-wrap; overflow-wrap: anywhere; }
247
- table.list tr.err td.m { color: var(--fail); }
248
- table.list tr { cursor: pointer; }
249
- table.list tr:hover td { background: var(--raise); }
250
- .legend { padding: 10px 14px; }
251
- .legend h3, .overview h3 { margin: 0 0 10px; font-size: 13px; font-weight: 600; }
252
- .legend .grid2 { display: grid; grid-template-columns: 1fr 1fr; gap: 9px 12px; }
253
- .legend .li { display: flex; align-items: center; gap: 8px; color: var(--text-2); font-size: 12px; }
254
- .overview { padding: 10px 14px; display: grid; grid-template-rows: auto auto minmax(0, 1fr); }
255
- .overview .range { color: var(--text-2); font-size: 11px; text-align: right; margin-bottom: 4px; font-variant-numeric: tabular-nums; }
256
- .overview svg { width: 100%; height: 100%; display: block; }
257
- .overview .brush .selection { fill: var(--accent-soft); stroke: var(--text-2); }
258
-
259
- /* ── floating ───────────────────────────────────────────── */
260
- .tip {
261
- position: fixed; pointer-events: none; z-index: 50; background: var(--panel); border: 1px solid var(--line);
262
- border-radius: 8px; padding: 8px 10px; box-shadow: var(--shadow); max-width: 360px; font-size: 12px;
263
- }
264
- .tip .tt { font-weight: 600; margin-bottom: 2px; }
265
- .tip .ts { color: var(--text-2); }
266
- .tip.wide { max-width: 420px; min-width: 260px; }
267
- .tip .mono { font-family: var(--mono); font-size: 11px; overflow-wrap: anywhere; }
268
- .tip .small { color: var(--text-2); }
269
- .tip .badges { display: flex; flex-wrap: wrap; gap: 5px; margin: 6px 0; }
270
- .tip .badge { display: inline-flex; align-items: center; gap: 5px; padding: 1px 8px; border-radius: 999px; background: var(--raise); font-size: 11px; color: var(--text-2); }
271
- .tip .badge.mcp { background: var(--accent-soft); color: var(--accent); font-weight: 600; }
272
- .tip .summary { margin: 4px 0 8px; line-height: 1.45; }
273
- .tip .tkv { display: grid; grid-template-columns: auto minmax(0, 1fr); gap: 2px 10px; font-variant-numeric: tabular-nums; }
274
- .tip .tkv .k, .tip .sec { color: var(--text-3); }
275
- .tip .sec { margin: 8px 0 3px; font-size: 11px; text-transform: uppercase; letter-spacing: 0.04em; }
276
- .tip .sec.fail { color: var(--fail); }
277
- .params { display: grid; gap: 3px; }
278
- .param { font: 11px/1.4 var(--mono); }
279
- .param .pn { color: var(--text); }
280
- .param .pt { color: var(--accent); margin-left: 6px; }
281
- .param .pd { color: var(--text-3); margin-left: 6px; }
282
- .param .pdesc { font-family: var(--sans); color: var(--text-2); margin-left: 10px; }
283
- .kv .v.defined { display: flex; align-items: center; gap: 6px; }
284
- .kv .v.defined a { min-width: 0; overflow-wrap: anywhere; font-family: var(--mono); font-size: 12px; }
285
- .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; }
286
- .icon-btn:hover { color: var(--text); border-color: var(--accent); }
287
- .icon-btn svg { width: 13px; height: 13px; }
288
- .tip .hint { margin-top: 8px; color: var(--text-3); font-size: 11px; }
289
- .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); }
290
- .badge-inline { display: inline-block; padding: 0 7px; border-radius: 999px; background: var(--accent-soft); color: var(--accent); font-size: 11px; font-weight: 600; }
291
- .tip img { display: block; max-width: 240px; max-height: 150px; border-radius: 4px; margin: 6px 0; border: 1px solid var(--line); }
292
- .modal { position: fixed; inset: 0; background: rgba(5, 8, 18, 0.72); z-index: 60; display: grid; place-items: center; padding: 28px; }
293
- .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; }
294
- .modal .mh { display: flex; align-items: center; gap: 12px; padding: 10px 14px; border-bottom: 1px solid var(--line); }
295
- .modal .mh .nm { font-weight: 600; flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
296
- .modal .mb { overflow: auto; padding: 14px; }
297
- .modal img { max-width: 100%; display: block; margin: auto; }
298
- .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; }
299
- .menu button { display: block; width: 100%; text-align: left; border: 0; background: none; padding: 7px 10px; border-radius: 6px; cursor: pointer; }
300
- .menu button:hover { background: var(--raise); }
301
- .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; }
302
-
303
- /* ── title info, locate, defined-at, code popover ───────── */
304
- .title-row { display: flex; align-items: center; gap: 8px; min-width: 0; }
305
- .title-row h1 { min-width: 0; }
306
- .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; }
307
- .info-btn:hover, .info-btn:focus-visible { color: var(--accent); background: var(--accent-soft); }
308
- .info-btn svg { width: 17px; height: 17px; }
309
- .gal-item .cap .locate { margin-left: auto; width: 22px; height: 20px; }
310
- .kv .v.defined { flex-wrap: wrap; }
311
- .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; }
312
- a.icon-btn { text-decoration: none; }
313
- .chart .code-btn, .flow-card .code-btn { cursor: pointer; opacity: 0; transition: opacity 0.12s; }
314
- .chart g.r:hover .code-btn, .chart g.r.sel .code-btn, .flow-card:hover .code-btn, .flow-card.selected .code-btn { opacity: 1; }
315
- .code-btn circle { fill: var(--panel); stroke: var(--text-3); stroke-width: 1.2; }
316
- .code-btn text { fill: var(--text-2); font: 700 9px var(--mono); pointer-events: none; }
317
- .code-btn:hover circle { stroke: var(--accent); }
318
- .code-btn:hover text { fill: var(--accent); }
319
- .chart line.pin.flash, .flame-view line.pin.flash { animation: pin-flash 0.6s ease-in-out 3; }
320
- .chart circle.mark.flash { animation: mark-flash 0.6s ease-in-out 3; transform-box: fill-box; transform-origin: center; }
321
- @keyframes pin-flash { 50% { stroke-width: 5; } }
322
- @keyframes mark-flash { 50% { transform: scale(1.9); } }
323
- .code-pop {
324
- position: fixed; z-index: 58; width: 640px; max-width: 92vw; max-height: 70vh; display: flex; flex-direction: column;
325
- background: var(--panel); border: 1px solid var(--line); border-radius: 10px; box-shadow: var(--shadow); overflow: hidden;
326
- }
327
- .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); }
328
- .code-pop .cp-path { font: 12px var(--mono); color: var(--text-2); min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
329
- .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; }
330
- .code-pop .cp-body { overflow: auto; min-height: 0; }
331
- .code-pop .cp-code { font: 11.5px/1.65 var(--mono); padding: 8px 0; min-width: max-content; }
332
- .code-pop .cl { display: grid; grid-template-columns: 48px auto; white-space: pre; }
333
- .code-pop .cl.at { background: var(--accent-soft); }
334
- .code-pop .ln { color: var(--text-3); text-align: right; padding-right: 14px; user-select: none; }
335
- .code-pop .lc { padding-right: 16px; }
336
- .code-pop .cp-more { padding: 6px 14px 10px; font-size: 12px; }
337
- :root { --tk-c: #6f7a99; --tk-s: #7ee0a3; --tk-n: #f0b26b; --tk-k: #c792ea; --tk-f: #82aaff; --tk-t: #ffcb6b; }
338
- :root[data-theme="light"] { --tk-c: #6a737d; --tk-s: #116329; --tk-n: #b35900; --tk-k: #cf222e; --tk-f: #6639ba; --tk-t: #953800; }
339
- @media (prefers-color-scheme: light) {
340
- :root:not([data-theme="dark"]) { --tk-c: #6a737d; --tk-s: #116329; --tk-n: #b35900; --tk-k: #cf222e; --tk-f: #6639ba; --tk-t: #953800; }
341
- }
342
- .tk-c { color: var(--tk-c); font-style: italic; }
343
- .tk-s { color: var(--tk-s); }
344
- .tk-n { color: var(--tk-n); }
345
- .tk-k { color: var(--tk-k); }
346
- .tk-f { color: var(--tk-f); }
347
- .tk-t { color: var(--tk-t); }
348
- .tk-p { color: var(--tk-f); }
349
-
350
- /* ── popover tabs, prompt panel, flow snapshot strip ───── */
351
- .code-pop .cp-tabs { display: flex; gap: 2px; padding: 0 8px; border-bottom: 1px solid var(--line); background: var(--panel-2); }
352
- .code-pop .cp-tabs .tab { padding: 6px 9px; font-size: 12px; }
353
- .pp { padding: 12px 14px 14px; display: grid; gap: 10px; }
354
- .pp-q { font-size: 14px; font-weight: 600; white-space: pre-wrap; }
355
- .pp-grid { display: grid; grid-template-columns: 76px minmax(0, 1fr); gap: 4px 10px; font-size: 12px; }
356
- .pp-k { color: var(--text-3); font-size: 12px; }
357
- .pp-choices { margin: 0; padding-left: 18px; }
358
- .pp-choices li.picked { color: var(--accent); font-weight: 600; }
359
- .pp-answer { display: grid; gap: 6px; justify-items: start; }
360
- .pp-answer pre { width: 100%; }
361
- .tip .tprompt { font-weight: 600; white-space: pre-wrap; margin-bottom: 4px; }
362
- .flow-shots .shot { cursor: pointer; }
363
- .flow-shots .shot rect { fill: var(--panel-2); stroke: var(--line); }
364
- .flow-shots .shot:hover rect { stroke: var(--accent); }
365
- .flow-shots .shot text { fill: var(--text-3); font: 600 9px var(--mono); pointer-events: none; }
366
-
367
- /* ── returned values ───────────────────────────────────── */
368
- .code-btn path { fill: none; stroke: var(--text-2); stroke-width: 2.6; stroke-linecap: round; stroke-linejoin: round; pointer-events: none; }
369
- .code-btn:hover path { stroke: var(--accent); }
370
- .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; }
371
- .btn.small { padding: 3px 9px; font-size: 12px; }
372
- .btn.small svg { width: 13px; height: 13px; }
373
- .code-box { border: 1px solid var(--line-soft); border-radius: 8px; background: var(--panel-2); overflow: auto; max-height: 60vh; }
374
- .code-box .cp-code, .code-pop .cp-code { font: 11.5px/1.65 var(--mono); padding: 8px 0; min-width: max-content; }
375
- .code-box .cl { display: grid; grid-template-columns: 40px auto; white-space: pre; }
376
- .code-box .ln { color: var(--text-3); text-align: right; padding-right: 12px; user-select: none; }
377
- .code-box .lc { padding-right: 14px; }
378
-
379
- /* ── errors ────────────────────────────────────────────── */
380
- .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; }
381
- .tab-count.bad { background: rgba(239, 68, 68, 0.16); color: var(--fail); font-weight: 700; }
382
- .linkish { border: 0; background: none; padding: 0; cursor: pointer; font: inherit; color: var(--accent); }
383
- .linkish.bad { color: var(--fail); }
384
- .linkish.warn { color: var(--cancel); }
385
- .tab-count.warn { background: rgba(245, 158, 11, 0.16); color: var(--cancel); font-weight: 700; }
386
- .linkish:hover { text-decoration: underline; }
387
- .err-bar { display: flex; align-items: center; justify-content: space-between; gap: 10px; margin-bottom: 8px; flex-wrap: wrap; }
388
- .segs { display: flex; border: 1px solid var(--line); border-radius: 7px; overflow: hidden; }
389
- .seg { border: 0; background: var(--panel); padding: 4px 10px; cursor: pointer; color: var(--text-2); font-size: 12px; }
390
- .seg + .seg { border-left: 1px solid var(--line); }
391
- .seg.active { background: var(--accent-soft); color: var(--text); font-weight: 600; }
392
- .btn.small.active { background: rgba(239, 68, 68, 0.14); color: var(--fail); border-color: var(--fail); }
393
- .err-sec { margin-bottom: 10px; }
394
- .err-sec-h { display: flex; align-items: center; gap: 6px; font-weight: 600; font-size: 12px; color: var(--text-2); margin: 6px 0 4px; }
395
- .err-sec-h svg { width: 13px; height: 13px; color: var(--fail); }
396
- .err-entry { border: 1px solid var(--line-soft); border-left: 3px solid var(--fail); border-radius: 6px; margin-bottom: 4px; background: var(--panel); }
397
- .err-entry.output { border-left-color: var(--cancel); }
398
- .err-entry.assert { border-left-color: #f97316; }
399
- .err-row { display: flex; align-items: center; gap: 8px; padding: 4px 6px; cursor: pointer; min-width: 0; font-size: 12px; }
400
- .err-row:hover { background: var(--raise); }
401
- .err-row .twist { width: 14px; height: 14px; display: grid; place-items: center; color: var(--text-3); flex: none; }
402
- .err-row .twist svg { width: 11px; height: 11px; transition: transform 0.12s; }
403
- .err-row .twist.open svg { transform: rotate(90deg); }
404
- .err-row .t { color: var(--text-2); font-variant-numeric: tabular-nums; flex: none; min-width: 44px; }
405
- .err-row .who { color: var(--text); font-weight: 600; flex: none; max-width: 220px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
406
- .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; }
407
- .err-row .msg { flex: 1; min-width: 0; font-family: var(--mono); color: var(--fail); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
408
- .err-entry.output .err-row .msg { color: var(--text-2); }
409
- .err-row .err-n { color: var(--text-3); font-size: 11px; flex: none; }
410
- .err-row .icon-btn { width: 22px; height: 20px; }
411
- .err-text { margin: 0 8px 8px 28px; max-height: 260px; }
412
- .err-kind { color: var(--fail); }
413
- .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; }
414
- /* highlight mode — errored nodes in red, the path to them marked, the rest dimmed */
415
- #app.hl-on .chart g.r:not(.err):not(.err-path),
416
- #app.hl-on .flame-view g.cell:not(.err):not(.err-path),
417
- #app.hl-on .flow-card:not(.err):not(.err-path) { opacity: 0.22; }
418
- #app.hl-on .tree .row:not(.err):not(.err-path) { opacity: 0.4; }
419
- #app.hl-on .chart g.r.err rect.bar,
420
- #app.hl-on .flame-view g.cell.err rect { stroke: var(--fail); stroke-width: 2.5; filter: drop-shadow(0 0 5px rgba(239, 68, 68, 0.75)); }
421
- #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)); }
422
- #app.hl-on .chart g.r.err-path rect.bar,
423
- #app.hl-on .flame-view g.cell.err-path rect,
424
- #app.hl-on .flow-card.err-path rect.box { stroke: var(--fail); stroke-width: 1.2; stroke-dasharray: 4 3; }
425
- #app.hl-on .tree .row.err { background: rgba(239, 68, 68, 0.1); }
426
- .chart g.r, .flame-view g.cell, .flow-card, .tree .row { transition: opacity 0.15s; }
427
-
428
- @media (max-width: 1100px) {
429
- .bottom { grid-template-columns: minmax(0, 1fr); }
430
- .legend, .overview { display: none; }
431
- .main { grid-template-columns: minmax(0, 1fr); }
432
- .details { display: none; }
433
- }
1
+ :root {
2
+ --bg: #0b1020;
3
+ --panel: #111831;
4
+ --panel-2: #0e152b;
5
+ --raise: #18213f;
6
+ --line: #222c4d;
7
+ --line-soft: #1a2342;
8
+ --text: #e6eaf5;
9
+ --text-2: #a9b2cc;
10
+ --text-3: #6f7a99;
11
+ --accent: #3b82f6;
12
+ --accent-soft: rgba(59, 130, 246, 0.18);
13
+ --ok: #22c55e;
14
+ --fail: #ef4444;
15
+ --cancel: #f59e0b;
16
+ --running: #38bdf8;
17
+ --c1: #4f8ff7;
18
+ --c2: #8b5cf6;
19
+ --c3: #22c55e;
20
+ --c4: #f59e0b;
21
+ --c5: #f0568c;
22
+ --c6: #22d3ee;
23
+ --c7: #a3e635;
24
+ --c8: #fb7185;
25
+ --bar-text: #0b1020;
26
+ --shadow: 0 10px 30px rgba(0, 0, 0, 0.45);
27
+ --mono: ui-monospace, "SF Mono", "Cascadia Code", Consolas, monospace;
28
+ --sans: system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;
29
+ color-scheme: dark;
30
+ }
31
+ :root[data-theme="light"] {
32
+ --bg: #f4f6fb;
33
+ --panel: #ffffff;
34
+ --panel-2: #f8f9fc;
35
+ --raise: #eef1f8;
36
+ --line: #dde2ee;
37
+ --line-soft: #e9ecf4;
38
+ --text: #182033;
39
+ --text-2: #4b5672;
40
+ --text-3: #8590ab;
41
+ --accent: #2563eb;
42
+ --accent-soft: rgba(37, 99, 235, 0.12);
43
+ --bar-text: #0b1020;
44
+ --shadow: 0 10px 30px rgba(20, 30, 60, 0.15);
45
+ color-scheme: light;
46
+ }
47
+ @media (prefers-color-scheme: light) {
48
+ :root:not([data-theme="dark"]) {
49
+ --bg: #f4f6fb;
50
+ --panel: #ffffff;
51
+ --panel-2: #f8f9fc;
52
+ --raise: #eef1f8;
53
+ --line: #dde2ee;
54
+ --line-soft: #e9ecf4;
55
+ --text: #182033;
56
+ --text-2: #4b5672;
57
+ --text-3: #8590ab;
58
+ --accent: #2563eb;
59
+ --accent-soft: rgba(37, 99, 235, 0.12);
60
+ --shadow: 0 10px 30px rgba(20, 30, 60, 0.15);
61
+ color-scheme: light;
62
+ }
63
+ }
64
+
65
+ * { box-sizing: border-box; }
66
+ html, body { margin: 0; height: 100%; }
67
+ body {
68
+ background: var(--bg);
69
+ color: var(--text);
70
+ font: 13px/1.4 var(--sans);
71
+ overflow: hidden;
72
+ }
73
+ button { font: inherit; color: inherit; }
74
+ [hidden] { display: none !important; }
75
+
76
+ /* ── loader ─────────────────────────────────────────────── */
77
+ #loader {
78
+ position: fixed; inset: 0; display: grid; place-items: center;
79
+ background: var(--bg); z-index: 100;
80
+ }
81
+ .loader-card { display: grid; justify-items: center; gap: 14px; }
82
+ .loader-spin {
83
+ width: 42px; height: 42px; border-radius: 50%;
84
+ border: 3px solid var(--line); border-top-color: var(--accent);
85
+ animation: spin 0.9s linear infinite;
86
+ }
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); } }
90
+
91
+ /* ── shell ──────────────────────────────────────────────── */
92
+ #app {
93
+ height: 100vh; display: grid; gap: 10px; padding: 12px 14px 14px;
94
+ grid-template-rows: auto minmax(0, 1fr) 230px;
95
+ }
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); }
106
+
107
+ .btn-group { display: flex; border: 1px solid var(--line); border-radius: 8px; overflow: hidden; background: var(--panel); }
108
+ .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); }
117
+
118
+ .main {
119
+ display: grid; gap: 10px; min-height: 0;
120
+ grid-template-columns: minmax(0, 1fr) 320px;
121
+ }
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; }
124
+
125
+ /* ── 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; }
133
+
134
+ .tree { border-right: 1px solid var(--line); position: sticky; left: 0; background: var(--panel); z-index: 2; }
135
+ .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;
138
+ }
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
+ /* the name keeps its room; the chips shrink (each to an ellipsis) into what is left */
143
+ /* 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); }
164
+
165
+ .chart { position: relative; min-width: 0; }
166
+ .chart svg { display: block; overflow: hidden; }
167
+ .chart .bar-label { font-size: 12px; fill: var(--bar-text); font-weight: 500; cursor: pointer; }
168
+ .chart .hit { fill: transparent; cursor: pointer; }
169
+ .chart .hit:hover + .bar { filter: brightness(1.15); }
170
+ .chart .bar-label.outside { fill: var(--text); }
171
+ .chart .mark-label { font-size: 11px; fill: var(--text-2); cursor: pointer; }
172
+ .chart .mark-label:hover { fill: var(--text); }
173
+ .chart .grid line { stroke: var(--line-soft); }
174
+ .chart .cursor { stroke: var(--text-2); stroke-dasharray: 3 3; pointer-events: none; }
175
+ .chart .link { fill: none; stroke: var(--text-3); stroke-width: 1.2; }
176
+ .chart .bar { cursor: pointer; }
177
+ .chart .bar.selected { stroke: var(--text); stroke-width: 2; }
178
+ .chart .mark { cursor: pointer; stroke: var(--panel); stroke-width: 1.5; }
179
+ .axis text { fill: var(--text-2); font-size: 11px; }
180
+ .axis line, .axis path { stroke: var(--line); }
181
+
182
+ .flow-view { position: absolute; inset: 0; }
183
+ .flow-view svg { width: 100%; height: 100%; display: block; cursor: grab; }
184
+ .flow-card rect.box { fill: var(--raise); stroke: var(--line); rx: 8; }
185
+ .flow-card.selected rect.box { stroke: var(--accent); stroke-width: 2; }
186
+ .flow-card text { fill: var(--text); font-size: 12px; }
187
+ .flow-card text.nm { font-weight: 600; }
188
+ .flow-card .flow-icon { pointer-events: none; }
189
+ .flow-seq { fill: none; stroke: var(--text-3); stroke-width: 1.4; stroke-dasharray: 5 4; }
190
+ .flow-seq.parallel { stroke-dasharray: 1 4; stroke-linecap: round; stroke-width: 2; opacity: 0.8; }
191
+ .flow-arrowhead { fill: var(--text-3); }
192
+ .flow-par { fill: var(--text-3); font-size: 10px; font-style: italic; }
193
+ .flow-shot-t { fill: var(--text-3); font-size: 10.5px; pointer-events: none; }
194
+ .flow-card text.sub { fill: var(--text-3); font-size: 11px; }
195
+ .flow-card .tchip text { fill: var(--text); font-size: 10.5px; }
196
+ .flow-card .tchip.more text { fill: var(--text-3); }
197
+ .flow-link { fill: none; stroke: var(--text-3); stroke-width: 1.3; }
198
+
199
+ /* ── details ────────────────────────────────────────────── */
200
+ .details { display: grid; grid-template-rows: auto auto minmax(0, 1fr); overflow: hidden; }
201
+ .details .dh { display: flex; align-items: center; justify-content: space-between; padding: 10px 14px; font-weight: 600; }
202
+ .details .x { border: 0; background: none; cursor: pointer; color: var(--text-2); padding: 2px; }
203
+ .details .who { display: flex; align-items: center; gap: 10px; padding: 4px 14px 10px; }
204
+ .details .who .icon { width: 30px; height: 30px; border-radius: 8px; display: grid; place-items: center; flex: none; }
205
+ .details .who .icon svg { width: 16px; height: 16px; }
206
+ .details .who .nm { font-size: 16px; font-weight: 600; flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
207
+ .pill { display: inline-flex; align-items: center; gap: 6px; padding: 3px 10px; border-radius: 999px; background: var(--raise); font-size: 12px; }
208
+ .details .scroll { overflow: auto; padding: 0 14px 14px; }
209
+ .kv .v.mono-sm { font: 11.5px var(--mono); color: var(--text-2); }
210
+ /* details accordion */
211
+ .acc { border-top: 1px solid var(--line-soft); }
212
+ .acc-sec { border-bottom: 1px solid var(--line-soft); }
213
+ .acc-h { display: flex; align-items: center; gap: 6px; padding: 8px 2px; font-weight: 600; cursor: pointer; list-style: none; user-select: none; }
214
+ .acc-h::-webkit-details-marker { display: none; }
215
+ .acc-h svg { width: 12px; height: 12px; color: var(--text-3); transition: transform 0.12s; flex: none; }
216
+ .acc-sec[open] > .acc-h svg { transform: rotate(90deg); }
217
+ .acc-h:hover { color: var(--accent); }
218
+ .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; }
219
+ .acc-sec.errors .acc-n { background: var(--fail); color: #fff; }
220
+ .acc-sec.empty .acc-h { color: var(--text-3); font-weight: 500; cursor: default; }
221
+ .acc-sec.empty .acc-h svg { opacity: 0.35; }
222
+ .acc-sec.empty .acc-n { background: none; color: var(--text-3); }
223
+ .acc-b { padding: 0 0 12px; }
224
+ .acc-b > .params { margin-bottom: 8px; }
225
+ .acc-b .section-title:first-child { margin-top: 0; }
226
+ .acc-file { display: flex; align-items: center; gap: 6px; margin-bottom: 6px; color: var(--text-2); }
227
+ .shots { display: grid; gap: 6px; }
228
+ .shot { 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; }
229
+ .shot:hover { border-color: var(--accent); background: var(--accent-soft); }
230
+ .shot .thumb { width: 64px; }
231
+ .shot .nm { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
232
+ .shot .t { color: var(--text-3); font-size: 11px; font-variant-numeric: tabular-nums; }
233
+ .kv { display: grid; grid-template-columns: 92px minmax(0, 1fr); gap: 6px 10px; margin: 2px 0 12px; }
234
+ .kv .k { color: var(--text-2); }
235
+ .kv .v { min-width: 0; overflow-wrap: anywhere; font-variant-numeric: tabular-nums; }
236
+ a { color: var(--accent); text-decoration: none; }
237
+ a:hover { text-decoration: underline; }
238
+ .tabs { display: flex; gap: 2px; border-bottom: 1px solid var(--line); margin: 0 0 10px; overflow-x: auto; }
239
+ .tab { border: 0; background: none; padding: 7px 9px; cursor: pointer; color: var(--text-2); border-bottom: 2px solid transparent; white-space: nowrap; }
240
+ .tab.active { color: var(--text); border-bottom-color: var(--accent); font-weight: 600; }
241
+ .section-title { font-weight: 600; margin: 14px 0 8px; }
242
+ .ev-list { list-style: none; margin: 0; padding: 0; position: relative; }
243
+ .ev-list li { display: grid; grid-template-columns: 64px 18px minmax(0, 1fr); gap: 8px; align-items: start; padding: 4px 0; }
244
+ .ev-list .t { color: var(--text-2); font-variant-numeric: tabular-nums; text-align: right; }
245
+ .ev-list .m { overflow-wrap: anywhere; }
246
+ .ev-ico { width: 16px; height: 16px; border-radius: 50%; display: grid; place-items: center; margin-top: 1px; }
247
+ .ev-ico svg { width: 10px; height: 10px; }
248
+ pre.code {
249
+ margin: 0; padding: 10px; background: var(--panel-2); border: 1px solid var(--line-soft); border-radius: 8px;
250
+ font: 12px/1.45 var(--mono); white-space: pre-wrap; overflow-wrap: anywhere; max-height: 60vh; overflow: auto;
251
+ }
252
+ .muted { color: var(--text-3); }
253
+ .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; }
254
+ .thumb:hover { border-color: var(--accent); }
255
+ .thumb img { width: 100%; height: 100%; object-fit: cover; display: block; }
256
+ .thumb .json-ico { font: 600 12px var(--mono); color: var(--text-3); }
257
+
258
+ /* ── bottom strip ───────────────────────────────────────── */
259
+ .bottom { display: grid; gap: 10px; grid-template-columns: minmax(0, 1fr) 250px; min-height: 0; }
260
+ .lower { display: grid; grid-template-rows: auto minmax(0, 1fr); overflow: hidden; }
261
+ .lower .tabs { margin: 0; padding: 0 10px; align-items: center; }
262
+ .lower .tabs .spacer { flex: 1; }
263
+ .filter { border: 1px solid var(--line); background: var(--panel-2); border-radius: 7px; padding: 5px 9px; color: var(--text); width: 200px; margin: 4px 0; }
264
+ .lower .body { overflow: auto; padding: 10px 12px; }
265
+ .gallery { display: flex; gap: 12px; }
266
+ .gal-item { flex: none; width: 160px; cursor: pointer; border: 1px solid transparent; border-radius: 8px; padding: 4px; }
267
+ .gal-item:hover, .gal-item.active { border-color: var(--accent); background: var(--accent-soft); }
268
+ .gal-item .thumb { aspect-ratio: 16 / 10; }
269
+ .gal-item .cap { display: flex; gap: 8px; margin-top: 5px; font-size: 12px; }
270
+ .gal-item .cap .t { color: var(--text-2); font-variant-numeric: tabular-nums; }
271
+ .gal-item .cap .n { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
272
+ .gal-item .sz { color: var(--text-3); font-size: 11px; }
273
+ table.list { width: 100%; border-collapse: collapse; font-size: 12px; }
274
+ table.list td { padding: 3px 8px; border-bottom: 1px solid var(--line-soft); vertical-align: top; }
275
+ table.list td.t { color: var(--text-2); white-space: nowrap; font-variant-numeric: tabular-nums; width: 1%; }
276
+ table.list td.p { color: var(--text-3); white-space: nowrap; max-width: 260px; overflow: hidden; text-overflow: ellipsis; width: 1%; }
277
+ table.list td.m { font-family: var(--mono); white-space: pre-wrap; overflow-wrap: anywhere; }
278
+ table.list tr.err td.m { color: var(--fail); }
279
+ table.list tr { cursor: pointer; }
280
+ table.list tr:hover td { background: var(--raise); }
281
+ .legend { padding: 10px 14px; }
282
+ /* at the end of the tree's header cell, clear of the time axis; top-right in the flow (no axis) */
283
+ .legend-btn { position: absolute; top: 6px; left: calc(var(--tree-w, 360px) - 30px); z-index: 6; background: var(--panel); cursor: pointer; }
284
+ .timeline.is-flow .legend-btn { left: auto; right: 8px; }
285
+ .timeline.is-flow .legend-pop { left: auto; right: 8px; }
286
+ .legend-btn.active { color: var(--accent); background: var(--accent-soft); }
287
+ .legend-pop {
288
+ position: absolute; top: 34px; left: calc(var(--tree-w, 360px) - 30px); z-index: 7; width: 270px; background: var(--panel);
289
+ border: 1px solid var(--line); border-radius: 8px; box-shadow: var(--shadow);
290
+ }
291
+ .legend h3, .overview h3 { margin: 0 0 10px; font-size: 13px; font-weight: 600; }
292
+ .legend .grid2 { display: grid; grid-template-columns: 1fr 1fr; gap: 9px 12px; }
293
+ .legend .li { display: flex; align-items: center; gap: 8px; color: var(--text-2); font-size: 12px; }
294
+ .overview { padding: 10px 14px; display: grid; grid-template-rows: auto auto minmax(0, 1fr); }
295
+ .overview .range { color: var(--text-2); font-size: 11px; text-align: right; margin-bottom: 4px; font-variant-numeric: tabular-nums; }
296
+ .overview svg { width: 100%; height: 100%; display: block; }
297
+ .overview .brush .selection { fill: var(--accent-soft); stroke: var(--text-2); }
298
+
299
+ /* ── floating ───────────────────────────────────────────── */
300
+ .tip {
301
+ position: fixed; pointer-events: none; z-index: 50; background: var(--panel); border: 1px solid var(--line);
302
+ border-radius: 8px; padding: 8px 10px; box-shadow: var(--shadow); max-width: 360px; font-size: 12px;
303
+ }
304
+ .tip .tt { font-weight: 600; margin-bottom: 2px; }
305
+ .tip .ts { color: var(--text-2); }
306
+ .tip.wide { max-width: 420px; min-width: 260px; }
307
+ .tip .mono { font-family: var(--mono); font-size: 11px; overflow-wrap: anywhere; }
308
+ .tip .small { color: var(--text-2); }
309
+ .tip .summary { margin: 6px 0 0; line-height: 1.45; }
310
+ .tip .sec { color: var(--text-3); margin: 8px 0 3px; font-size: 11px; text-transform: uppercase; letter-spacing: 0.04em; }
311
+ .tip .sec.fail { color: var(--fail); }
312
+ .params { display: grid; gap: 3px; }
313
+ .param { font: 11px/1.4 var(--mono); }
314
+ .param .pn { color: var(--text); }
315
+ .param .pt { color: var(--accent); margin-left: 6px; }
316
+ .param .pd { color: var(--text-3); margin-left: 6px; }
317
+ .param .pdesc { font-family: var(--sans); color: var(--text-2); margin-left: 10px; }
318
+ .kv .v.defined { display: flex; align-items: center; gap: 6px; }
319
+ .kv .v.defined a { min-width: 0; overflow-wrap: anywhere; font-family: var(--mono); font-size: 12px; }
320
+ .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; }
321
+ .icon-btn:hover { color: var(--text); border-color: var(--accent); }
322
+ .icon-btn svg { width: 13px; height: 13px; }
323
+ .tip .hint { margin-top: 8px; color: var(--text-3); font-size: 11px; }
324
+ .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); }
325
+ /* tag chips — one look everywhere a tag shows (the flow's SVG chips match it) */
326
+ .chips { display: flex; flex-wrap: wrap; gap: 4px; min-width: 0; }
327
+ .chip {
328
+ flex: none; max-width: 170px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; padding: 0 6px;
329
+ border-radius: 4px; background: var(--raise); border: 1px solid var(--line); color: var(--text); font-size: 10.5px; line-height: 16px;
330
+ }
331
+ .chip.more { background: none; color: var(--text-3); }
332
+ .badge-inline { display: inline-block; padding: 0 7px; border-radius: 999px; background: var(--accent-soft); color: var(--accent); font-size: 11px; font-weight: 600; }
333
+ .tip img { display: block; max-width: 240px; max-height: 150px; border-radius: 4px; margin: 6px 0; border: 1px solid var(--line); }
334
+ .modal { position: fixed; inset: 0; background: rgba(5, 8, 18, 0.72); z-index: 60; display: grid; place-items: center; padding: 28px; }
335
+ .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; }
336
+ .modal .mh { display: flex; align-items: center; gap: 12px; padding: 10px 14px; border-bottom: 1px solid var(--line); }
337
+ .modal .mh .nm { font-weight: 600; flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
338
+ .modal .mb { overflow: auto; padding: 14px; }
339
+ .modal img { max-width: 100%; display: block; margin: auto; }
340
+ .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; }
341
+ .menu button { display: block; width: 100%; text-align: left; border: 0; background: none; padding: 7px 10px; border-radius: 6px; cursor: pointer; }
342
+ .menu button:hover { background: var(--raise); }
343
+ .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; }
344
+
345
+ /* ── title info, locate, defined-at, code popover ───────── */
346
+ .title-row { display: flex; align-items: center; gap: 8px; min-width: 0; }
347
+ .title-row h1 { min-width: 0; }
348
+ .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; }
349
+ .info-btn:hover, .info-btn:focus-visible { color: var(--accent); background: var(--accent-soft); }
350
+ .info-btn svg { width: 17px; height: 17px; }
351
+ .gal-item .cap .locate { margin-left: auto; width: 22px; height: 20px; }
352
+ .kv .v.defined { flex-wrap: wrap; }
353
+ .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; }
354
+ a.icon-btn { text-decoration: none; }
355
+ .chart .code-btn, .flow-card .code-btn { cursor: pointer; opacity: 0; transition: opacity 0.12s; }
356
+ .chart g.r:hover .code-btn, .chart g.r.sel .code-btn, .flow-card:hover .code-btn, .flow-card.selected .code-btn { opacity: 1; }
357
+ .code-btn circle { fill: var(--panel); stroke: var(--text-3); stroke-width: 1.2; }
358
+ .code-btn text { fill: var(--text-2); font: 700 9px var(--mono); pointer-events: none; }
359
+ .code-btn:hover circle { stroke: var(--accent); }
360
+ .code-btn:hover text { fill: var(--accent); }
361
+ .chart line.pin.flash { animation: pin-flash 0.6s ease-in-out 3; }
362
+ .chart circle.mark.flash { animation: mark-flash 0.6s ease-in-out 3; transform-box: fill-box; transform-origin: center; }
363
+ @keyframes pin-flash { 50% { stroke-width: 5; } }
364
+ @keyframes mark-flash { 50% { transform: scale(1.9); } }
365
+ .code-pop {
366
+ position: fixed; z-index: 58; width: 640px; max-width: 92vw; max-height: 70vh; display: flex; flex-direction: column;
367
+ background: var(--panel); border: 1px solid var(--line); border-radius: 10px; box-shadow: var(--shadow); overflow: hidden;
368
+ }
369
+ .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); }
370
+ .code-pop .cp-path { font: 12px var(--mono); color: var(--text-2); min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
371
+ .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; }
372
+ .code-pop .cp-body { overflow: auto; min-height: 0; }
373
+ .code-pop .cp-code { font: 11.5px/1.65 var(--mono); padding: 8px 0; min-width: max-content; }
374
+ .code-pop .cl { display: grid; grid-template-columns: 48px auto; white-space: pre; }
375
+ .code-pop .cl.at { background: var(--accent-soft); }
376
+ .code-pop .ln { color: var(--text-3); text-align: right; padding-right: 14px; user-select: none; }
377
+ .code-pop .lc { padding-right: 16px; }
378
+ .code-pop .cp-more { padding: 6px 14px 10px; font-size: 12px; }
379
+ :root { --tk-c: #6f7a99; --tk-s: #7ee0a3; --tk-n: #f0b26b; --tk-k: #c792ea; --tk-f: #82aaff; --tk-t: #ffcb6b; }
380
+ :root[data-theme="light"] { --tk-c: #6a737d; --tk-s: #116329; --tk-n: #b35900; --tk-k: #cf222e; --tk-f: #6639ba; --tk-t: #953800; }
381
+ @media (prefers-color-scheme: light) {
382
+ :root:not([data-theme="dark"]) { --tk-c: #6a737d; --tk-s: #116329; --tk-n: #b35900; --tk-k: #cf222e; --tk-f: #6639ba; --tk-t: #953800; }
383
+ }
384
+ .tk-c { color: var(--tk-c); font-style: italic; }
385
+ .tk-s { color: var(--tk-s); }
386
+ .tk-n { color: var(--tk-n); }
387
+ .tk-k { color: var(--tk-k); }
388
+ .tk-f { color: var(--tk-f); }
389
+ .tk-t { color: var(--tk-t); }
390
+ .tk-p { color: var(--tk-f); }
391
+
392
+ /* ── popover tabs, prompt panel, flow snapshot strip ───── */
393
+ .code-pop .cp-tabs { display: flex; gap: 2px; padding: 0 8px; border-bottom: 1px solid var(--line); background: var(--panel-2); }
394
+ .code-pop .cp-tabs .tab { padding: 6px 9px; font-size: 12px; }
395
+ .pp { padding: 12px 14px 14px; display: grid; gap: 10px; }
396
+ .pp-q { font-size: 14px; font-weight: 600; white-space: pre-wrap; }
397
+ .pp-grid { display: grid; grid-template-columns: 76px minmax(0, 1fr); gap: 4px 10px; font-size: 12px; }
398
+ .pp-k { color: var(--text-3); font-size: 12px; }
399
+ .pp-choices { margin: 0; padding-left: 18px; }
400
+ .pp-choices li.picked { color: var(--accent); font-weight: 600; }
401
+ .pp-answer { display: grid; gap: 6px; justify-items: start; }
402
+ .pp-answer pre { width: 100%; }
403
+ .tcall { font: 12px var(--mono); color: var(--text-3); overflow-wrap: anywhere; }
404
+ .tcall .b { color: var(--accent); font-weight: 600; }
405
+ .tcall .f { color: var(--text); }
406
+ .tip .tcall { margin: 2px 0 5px; }
407
+ .details .who-call { margin: 0 0 10px; }
408
+ .tip .tmeta { display: flex; align-items: center; gap: 6px; color: var(--text-2); font-size: 11px; }
409
+ .tip .tmeta .sep { color: var(--text-3); }
410
+ .tip .tmeta .mcp { color: var(--accent); font-weight: 600; }
411
+ .tip .chips { margin-top: 6px; }
412
+ .tip .tfail { margin-top: 6px; color: var(--fail); font: 11px var(--mono); overflow-wrap: anywhere; }
413
+ .flow-shots .shot { cursor: pointer; }
414
+ .flow-shots .shot rect { fill: var(--panel-2); stroke: var(--line); }
415
+ .flow-shots .shot:hover rect { stroke: var(--accent); }
416
+ .flow-shots .shot text { fill: var(--text-3); font: 600 9px var(--mono); pointer-events: none; }
417
+
418
+ /* ── returned values ───────────────────────────────────── */
419
+ .code-btn path { fill: none; stroke: var(--text-2); stroke-width: 2.6; stroke-linecap: round; stroke-linejoin: round; pointer-events: none; }
420
+ .code-btn:hover path { stroke: var(--accent); }
421
+ .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; }
422
+ .btn.small { padding: 3px 9px; font-size: 12px; }
423
+ .btn.small svg { width: 13px; height: 13px; }
424
+ .code-box { border: 1px solid var(--line-soft); border-radius: 8px; background: var(--panel-2); overflow: auto; max-height: 60vh; }
425
+ .code-box .cp-code, .code-pop .cp-code { font: 11.5px/1.65 var(--mono); padding: 8px 0; min-width: max-content; }
426
+ .code-box .cl { display: grid; grid-template-columns: 40px auto; white-space: pre; }
427
+ .code-box .ln { color: var(--text-3); text-align: right; padding-right: 12px; user-select: none; }
428
+ .code-box .lc { padding-right: 14px; }
429
+
430
+ /* ── errors ────────────────────────────────────────────── */
431
+ .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; }
432
+ .tab-count.bad { background: rgba(239, 68, 68, 0.16); color: var(--fail); font-weight: 700; }
433
+ .linkish { border: 0; background: none; padding: 0; cursor: pointer; font: inherit; color: var(--accent); }
434
+ .linkish.bad { color: var(--fail); }
435
+ .linkish.warn { color: var(--cancel); }
436
+ .tab-count.warn { background: rgba(245, 158, 11, 0.16); color: var(--cancel); font-weight: 700; }
437
+ .linkish:hover { text-decoration: underline; }
438
+ .err-bar { display: flex; align-items: center; justify-content: space-between; gap: 10px; margin-bottom: 8px; flex-wrap: wrap; }
439
+ .segs { display: flex; border: 1px solid var(--line); border-radius: 7px; overflow: hidden; }
440
+ .seg { border: 0; background: var(--panel); padding: 4px 10px; cursor: pointer; color: var(--text-2); font-size: 12px; }
441
+ .seg + .seg { border-left: 1px solid var(--line); }
442
+ .seg.active { background: var(--accent-soft); color: var(--text); font-weight: 600; }
443
+ .btn.small.active { background: rgba(239, 68, 68, 0.14); color: var(--fail); border-color: var(--fail); }
444
+ .err-sec { margin-bottom: 10px; }
445
+ .err-sec-h { display: flex; align-items: center; gap: 6px; font-weight: 600; font-size: 12px; color: var(--text-2); margin: 6px 0 4px; }
446
+ .err-sec-h svg { width: 13px; height: 13px; color: var(--fail); }
447
+ .err-entry { border: 1px solid var(--line-soft); border-left: 3px solid var(--fail); border-radius: 6px; margin-bottom: 4px; background: var(--panel); }
448
+ .err-entry.output { border-left-color: var(--cancel); }
449
+ .err-entry.assert { border-left-color: #f97316; }
450
+ .err-row { display: flex; align-items: center; gap: 8px; padding: 4px 6px; cursor: pointer; min-width: 0; font-size: 12px; }
451
+ .err-row:hover { background: var(--raise); }
452
+ .err-row .twist { width: 14px; height: 14px; display: grid; place-items: center; color: var(--text-3); flex: none; }
453
+ .err-row .twist svg { width: 11px; height: 11px; transition: transform 0.12s; }
454
+ .err-row .twist.open svg { transform: rotate(90deg); }
455
+ .err-row .t { color: var(--text-2); font-variant-numeric: tabular-nums; flex: none; min-width: 44px; }
456
+ .err-row .who { color: var(--text); font-weight: 600; flex: none; max-width: 220px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
457
+ .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; }
458
+ .err-row .msg { flex: 1; min-width: 0; font-family: var(--mono); color: var(--fail); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
459
+ .err-entry.output .err-row .msg { color: var(--text-2); }
460
+ .err-row .err-n { color: var(--text-3); font-size: 11px; flex: none; }
461
+ .err-row .icon-btn { width: 22px; height: 20px; }
462
+ .err-text { margin: 0 8px 8px 28px; max-height: 260px; }
463
+ .err-kind { color: var(--fail); }
464
+ .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; }
465
+ /* highlight mode — errored nodes in red, the path to them marked, the rest dimmed */
466
+ #app.hl-on .chart g.r:not(.err):not(.err-path),
467
+ #app.hl-on .flow-card:not(.err):not(.err-path) { opacity: 0.22; }
468
+ #app.hl-on .tree .row:not(.err):not(.err-path) { opacity: 0.4; }
469
+ #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)); }
470
+ #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)); }
471
+ #app.hl-on .chart g.r.err-path rect.bar,
472
+ #app.hl-on .flow-card.err-path rect.box { stroke: var(--fail); stroke-width: 1.2; stroke-dasharray: 4 3; }
473
+ #app.hl-on .tree .row.err { background: rgba(239, 68, 68, 0.1); }
474
+ .chart g.r, .flow-card, .tree .row { transition: opacity 0.15s; }
475
+ /* cross-node links: waits (dashed), ref calls (solid), connectors between rows / cards */
476
+ .xl-span { stroke-width: 3; stroke-linecap: round; cursor: pointer; }
477
+ .xl-span.once { stroke-width: 2.5; stroke-dasharray: 4 3; stroke-linecap: butt; }
478
+ .xl-wire { fill: none; stroke-width: 1.4; stroke-dasharray: 3 3; opacity: 0.85; cursor: pointer; }
479
+ .xl-span:hover { stroke-width: 4.5; }
480
+ .xl-hit { fill: none; stroke: transparent; stroke-width: 10; cursor: pointer; }
481
+ #xl-arrow path { fill: var(--text-2); }
482
+ .flow-xlink { cursor: pointer; }
483
+ .flow-xlink path { fill: none; stroke-width: 1.4; stroke-dasharray: 4 4; opacity: 0.8; }
484
+ .flow-xlink path.hit { stroke: transparent; stroke-width: 12; stroke-dasharray: none; }
485
+ .flow-xlink:hover path:not(.hit) { stroke-width: 2.6; opacity: 1; }
486
+ .flow-xlink text { font-size: 10.5px; fill: var(--text-2); stroke: var(--panel); stroke-width: 3px; paint-order: stroke; }
487
+
488
+ @media (max-width: 1100px) {
489
+ .bottom { grid-template-columns: minmax(0, 1fr); }
490
+ .overview { display: none; }
491
+ .main { grid-template-columns: minmax(0, 1fr); }
492
+ .details { display: none; }
493
+ }