@neat.is/web 0.2.10

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.
@@ -0,0 +1,891 @@
1
+ @tailwind base;
2
+ @tailwind components;
3
+ @tailwind utilities;
4
+
5
+ /* ------------------------------------------------------------------
6
+ PALETTE — "ink and paper, in the dark"
7
+ ------------------------------------------------------------------ */
8
+ :root {
9
+ --ink-0: #0a0a0b;
10
+ --ink-1: #111114;
11
+ --ink-2: #16161a;
12
+ --ink-3: #1d1d22;
13
+ --ink-4: #26262d;
14
+ --rule: #232328;
15
+ --rule-soft: #1a1a1f;
16
+
17
+ --paper-0: #f4efe6;
18
+ --paper-1: #d8d3c9;
19
+ --paper-2: #9b968c;
20
+ --paper-3: #6a675f;
21
+ --paper-4: #46443f;
22
+
23
+ --accent: #c8a25a;
24
+
25
+ --prov-static: #6ea8ff;
26
+ --prov-observed: #5fcf9e;
27
+ --prov-inferred: #d27ad8;
28
+
29
+ --n-service: #d8d3c9;
30
+ --n-db: #b8c7c2;
31
+ --n-cache: #c2b8a8;
32
+ --n-stream: #b8b0c8;
33
+ --n-queue: #b8b0c8;
34
+ --n-lambda: #c8c0a8;
35
+ --n-cron: #b09c8a;
36
+ --n-api: #a8b8c8;
37
+ --n-apigw: #98a8b8;
38
+ --n-compute: #c8b098;
39
+ --n-storage: #a8a89c;
40
+ --n-external: #888278;
41
+ --n-search: #c4b6a0;
42
+ --n-cluster: #5a5750;
43
+ --n-namespace: #45433d;
44
+ --n-vpc: #38362f;
45
+ --n-env: #2a2823;
46
+ }
47
+
48
+ * { box-sizing: border-box; }
49
+ html, body {
50
+ margin: 0; padding: 0;
51
+ height: 100%; width: 100%;
52
+ background: var(--ink-0);
53
+ color: var(--paper-1);
54
+ font-family: 'Spectral', 'Iowan Old Style', Georgia, serif;
55
+ font-feature-settings: "ss01", "kern", "liga";
56
+ -webkit-font-smoothing: antialiased;
57
+ overflow: hidden;
58
+ }
59
+ .mono { font-family: 'JetBrains Mono', ui-monospace, monospace; font-feature-settings: "ss02", "calt", "zero"; }
60
+ .sans { font-family: 'Inter', -apple-system, system-ui, sans-serif; }
61
+ .serif { font-family: 'Spectral', Georgia, serif; }
62
+
63
+ /* ------------------------------------------------------------------
64
+ APP SHELL
65
+ ------------------------------------------------------------------ */
66
+ .app {
67
+ display: grid;
68
+ grid-template-columns: 56px 1fr 360px;
69
+ grid-template-rows: 44px 1fr 28px;
70
+ grid-template-areas:
71
+ "topbar topbar topbar"
72
+ "rail canvas inspect"
73
+ "rail status status";
74
+ height: 100vh;
75
+ width: 100vw;
76
+ }
77
+
78
+ /* ---- TOP BAR ------------------------------------------------------ */
79
+ .topbar {
80
+ grid-area: topbar;
81
+ display: flex;
82
+ align-items: center;
83
+ border-bottom: 1px solid var(--rule);
84
+ background: var(--ink-1);
85
+ padding-right: 8px;
86
+ user-select: none;
87
+ }
88
+ .brand {
89
+ width: 56px;
90
+ height: 100%;
91
+ display: flex;
92
+ align-items: center;
93
+ justify-content: center;
94
+ border-right: 1px solid var(--rule);
95
+ font-family: 'Spectral', Georgia, serif;
96
+ font-weight: 500;
97
+ font-style: italic;
98
+ font-size: 22px;
99
+ color: var(--paper-0);
100
+ letter-spacing: 0.01em;
101
+ position: relative;
102
+ }
103
+ .brand::after {
104
+ content: "";
105
+ width: 4px; height: 4px;
106
+ background: var(--accent);
107
+ border-radius: 50%;
108
+ margin-left: 2px;
109
+ margin-bottom: -10px;
110
+ }
111
+ .crumbs {
112
+ display: flex;
113
+ align-items: center;
114
+ gap: 8px;
115
+ padding: 0 14px;
116
+ color: var(--paper-2);
117
+ font-size: 13px;
118
+ letter-spacing: 0.01em;
119
+ }
120
+ .crumbs .sep { color: var(--paper-4); }
121
+ .crumbs .here { color: var(--paper-0); font-style: italic; }
122
+ .crumbs .repo {
123
+ font-family: 'JetBrains Mono', monospace;
124
+ font-size: 12px;
125
+ color: var(--paper-1);
126
+ }
127
+
128
+ .topbar-spacer { flex: 1; }
129
+
130
+ .top-search {
131
+ display: flex;
132
+ align-items: center;
133
+ gap: 8px;
134
+ background: var(--ink-2);
135
+ border: 1px solid var(--rule);
136
+ border-radius: 4px;
137
+ padding: 4px 10px;
138
+ width: 320px;
139
+ color: var(--paper-2);
140
+ font-family: 'JetBrains Mono', monospace;
141
+ font-size: 12px;
142
+ position: relative;
143
+ }
144
+ .top-search input {
145
+ background: transparent;
146
+ border: 0; outline: 0;
147
+ color: var(--paper-0);
148
+ font: inherit;
149
+ flex: 1;
150
+ }
151
+ .top-search .kbd {
152
+ color: var(--paper-3);
153
+ font-size: 10.5px;
154
+ border: 1px solid var(--rule-soft);
155
+ padding: 1px 5px;
156
+ border-radius: 3px;
157
+ }
158
+ .search-results {
159
+ position: absolute;
160
+ top: calc(100% + 4px);
161
+ left: 0; right: 0;
162
+ background: var(--ink-2);
163
+ border: 1px solid var(--rule);
164
+ border-radius: 4px;
165
+ z-index: 100;
166
+ max-height: 320px;
167
+ overflow-y: auto;
168
+ }
169
+ .search-result-item {
170
+ display: flex;
171
+ align-items: center;
172
+ gap: 8px;
173
+ padding: 7px 10px;
174
+ cursor: pointer;
175
+ font-size: 12px;
176
+ }
177
+ .search-result-item:hover { background: var(--ink-3); }
178
+ .search-result-item .sr-name {
179
+ font-family: 'JetBrains Mono', monospace;
180
+ color: var(--paper-1);
181
+ flex: 1;
182
+ }
183
+ .search-result-item .sr-type {
184
+ font-family: 'Spectral', serif;
185
+ font-style: italic;
186
+ font-size: 11px;
187
+ color: var(--paper-3);
188
+ }
189
+ .search-result-item .sr-score {
190
+ font-family: 'JetBrains Mono', monospace;
191
+ font-size: 10.5px;
192
+ color: var(--paper-4);
193
+ }
194
+
195
+ .top-actions { display: flex; align-items: center; gap: 4px; margin-left: 10px; }
196
+ .top-btn {
197
+ height: 28px;
198
+ padding: 0 10px;
199
+ background: transparent;
200
+ color: var(--paper-1);
201
+ border: 1px solid transparent;
202
+ border-radius: 4px;
203
+ font-family: 'Spectral', Georgia, serif;
204
+ font-size: 13px;
205
+ cursor: pointer;
206
+ display: flex; align-items: center; gap: 6px;
207
+ }
208
+ .top-btn:hover { background: var(--ink-2); border-color: var(--rule); }
209
+ .top-btn.primary {
210
+ background: var(--paper-0);
211
+ color: var(--ink-0);
212
+ font-weight: 500;
213
+ }
214
+ .top-btn.primary:hover { background: #fff; }
215
+ .top-btn .dot { width: 6px; height: 6px; border-radius: 50%; background: var(--paper-4); }
216
+ .top-btn .dot.live { background: var(--prov-observed); }
217
+
218
+ .env-pill {
219
+ display: inline-flex; align-items: center; gap: 6px;
220
+ padding: 3px 8px 3px 7px;
221
+ background: var(--ink-2);
222
+ border: 1px solid var(--rule);
223
+ border-radius: 3px;
224
+ color: var(--paper-1);
225
+ font-family: 'JetBrains Mono', monospace;
226
+ font-size: 11.5px;
227
+ }
228
+ .env-pill .dot {
229
+ width: 6px; height: 6px; border-radius: 50%;
230
+ background: var(--prov-observed);
231
+ box-shadow: 0 0 0 2px rgba(95, 207, 158, 0.18);
232
+ }
233
+
234
+ /* project switcher in topbar */
235
+ .project-select {
236
+ background: var(--ink-2);
237
+ border: 1px solid var(--rule);
238
+ border-radius: 3px;
239
+ color: var(--paper-1);
240
+ font-family: 'JetBrains Mono', monospace;
241
+ font-size: 12px;
242
+ padding: 2px 6px;
243
+ outline: none;
244
+ cursor: pointer;
245
+ }
246
+ .project-select:focus { border-color: var(--accent); }
247
+
248
+ /* ---- LEFT RAIL ---------------------------------------------------- */
249
+ .rail {
250
+ grid-area: rail;
251
+ background: var(--ink-1);
252
+ border-right: 1px solid var(--rule);
253
+ display: flex;
254
+ flex-direction: column;
255
+ align-items: center;
256
+ padding: 6px 0;
257
+ gap: 2px;
258
+ }
259
+ .rail-group {
260
+ display: flex; flex-direction: column; align-items: center;
261
+ gap: 2px;
262
+ padding: 4px 0;
263
+ }
264
+ .rail-group + .rail-group { border-top: 1px solid var(--rule); margin-top: 4px; }
265
+ .rail-btn {
266
+ width: 36px; height: 36px;
267
+ border-radius: 4px;
268
+ display: flex; align-items: center; justify-content: center;
269
+ color: var(--paper-2);
270
+ cursor: pointer;
271
+ position: relative;
272
+ background: transparent;
273
+ border: none;
274
+ }
275
+ .rail-btn:hover { background: var(--ink-2); color: var(--paper-0); }
276
+ .rail-btn.active {
277
+ background: var(--ink-3);
278
+ color: var(--paper-0);
279
+ }
280
+ .rail-btn.active::before {
281
+ content: "";
282
+ position: absolute; left: -1px; top: 8px; bottom: 8px;
283
+ width: 2px; background: var(--accent);
284
+ border-radius: 0 2px 2px 0;
285
+ }
286
+ .rail-btn svg { width: 18px; height: 18px; stroke-width: 1.4; }
287
+ .rail-btn .badge {
288
+ position: absolute; top: 4px; right: 4px;
289
+ min-width: 14px; height: 14px;
290
+ background: var(--prov-inferred);
291
+ color: var(--ink-0);
292
+ border-radius: 7px;
293
+ font-family: 'JetBrains Mono', monospace;
294
+ font-size: 9px;
295
+ font-weight: 600;
296
+ display: flex; align-items: center; justify-content: center;
297
+ padding: 0 3px;
298
+ }
299
+ .rail-tip {
300
+ position: absolute; left: 44px; top: 50%; transform: translateY(-50%);
301
+ background: var(--ink-3);
302
+ border: 1px solid var(--rule);
303
+ color: var(--paper-0);
304
+ padding: 4px 8px;
305
+ border-radius: 3px;
306
+ font-size: 11.5px;
307
+ font-family: 'Spectral', serif;
308
+ white-space: nowrap;
309
+ pointer-events: none;
310
+ opacity: 0;
311
+ transition: opacity 0.12s;
312
+ z-index: 50;
313
+ }
314
+ .rail-tip .k { color: var(--paper-3); margin-left: 8px; font-family: 'JetBrains Mono', monospace; font-size: 10.5px; }
315
+ .rail-btn:hover .rail-tip { opacity: 1; }
316
+ .rail-spacer { flex: 1; }
317
+
318
+ /* ---- CANVAS ------------------------------------------------------- */
319
+ .canvas-wrap {
320
+ grid-area: canvas;
321
+ position: relative;
322
+ overflow: hidden;
323
+ background:
324
+ radial-gradient(circle at 20% 0%, rgba(110, 168, 255, 0.04) 0%, transparent 40%),
325
+ radial-gradient(circle at 80% 100%, rgba(210, 122, 216, 0.03) 0%, transparent 45%),
326
+ var(--ink-0);
327
+ }
328
+ .canvas-wrap::before {
329
+ content: "";
330
+ position: absolute; inset: 0;
331
+ background-image:
332
+ linear-gradient(to right, rgba(244, 239, 230, 0.018) 1px, transparent 1px),
333
+ linear-gradient(to bottom, rgba(244, 239, 230, 0.018) 1px, transparent 1px);
334
+ background-size: 24px 24px;
335
+ pointer-events: none;
336
+ }
337
+ #cy {
338
+ position: absolute; inset: 0;
339
+ width: 100%; height: 100%;
340
+ }
341
+
342
+ .canvas-tag {
343
+ position: absolute; top: 12px; left: 14px;
344
+ display: flex; align-items: baseline; gap: 10px;
345
+ color: var(--paper-2);
346
+ pointer-events: none;
347
+ z-index: 5;
348
+ }
349
+ .canvas-tag .title {
350
+ font-family: 'Spectral', serif;
351
+ font-style: italic;
352
+ font-size: 18px;
353
+ color: var(--paper-0);
354
+ }
355
+ .canvas-tag .meta {
356
+ font-family: 'JetBrains Mono', monospace;
357
+ font-size: 11px;
358
+ color: var(--paper-3);
359
+ letter-spacing: 0.02em;
360
+ }
361
+
362
+ .canvas-toolbar {
363
+ position: absolute; top: 12px; right: 14px;
364
+ display: flex; gap: 4px;
365
+ background: var(--ink-1);
366
+ border: 1px solid var(--rule);
367
+ border-radius: 4px;
368
+ padding: 3px;
369
+ z-index: 5;
370
+ }
371
+ .canvas-toolbar button {
372
+ height: 26px;
373
+ padding: 0 9px;
374
+ background: transparent;
375
+ border: 0;
376
+ color: var(--paper-1);
377
+ font-family: 'Spectral', serif;
378
+ font-size: 12.5px;
379
+ cursor: pointer;
380
+ border-radius: 3px;
381
+ display: flex; align-items: center; gap: 6px;
382
+ }
383
+ .canvas-toolbar button:hover { background: var(--ink-3); color: var(--paper-0); }
384
+ .canvas-toolbar button.on {
385
+ background: var(--ink-3);
386
+ color: var(--paper-0);
387
+ }
388
+ .canvas-toolbar .div { width: 1px; background: var(--rule); margin: 4px 2px; }
389
+ .canvas-toolbar .mono { font-family: 'JetBrains Mono', monospace; font-size: 11px; color: var(--paper-2); }
390
+
391
+ /* PROVENANCE LEGEND */
392
+ .legend {
393
+ position: absolute;
394
+ left: 14px; bottom: 14px;
395
+ background: var(--ink-1);
396
+ border: 1px solid var(--rule);
397
+ border-radius: 4px;
398
+ padding: 10px 12px 11px;
399
+ z-index: 6;
400
+ min-width: 220px;
401
+ }
402
+ .legend h4 {
403
+ margin: 0 0 8px;
404
+ font-family: 'Spectral', serif;
405
+ font-style: italic;
406
+ font-weight: 500;
407
+ font-size: 12px;
408
+ color: var(--paper-2);
409
+ letter-spacing: 0.04em;
410
+ text-transform: uppercase;
411
+ }
412
+ .legend-row {
413
+ display: flex; align-items: center; gap: 9px;
414
+ padding: 4px 0;
415
+ font-size: 12.5px;
416
+ color: var(--paper-1);
417
+ cursor: pointer;
418
+ }
419
+ .legend-row .swatch {
420
+ width: 18px; height: 2px; border-radius: 1px;
421
+ flex-shrink: 0;
422
+ }
423
+ .legend-row .swatch.dashed {
424
+ background: transparent;
425
+ border-top: 1.5px dashed var(--prov-observed);
426
+ height: 0;
427
+ }
428
+ .legend-row .swatch.dotted {
429
+ background: transparent;
430
+ border-top: 2px dotted var(--prov-inferred);
431
+ height: 0;
432
+ }
433
+ .legend-row .name {
434
+ font-family: 'Spectral', serif;
435
+ font-style: italic;
436
+ flex: 1;
437
+ }
438
+ .legend-row .ct {
439
+ font-family: 'JetBrains Mono', monospace;
440
+ font-size: 11px;
441
+ color: var(--paper-3);
442
+ }
443
+ .legend-rule {
444
+ height: 1px;
445
+ background: var(--rule);
446
+ margin: 8px -12px 8px;
447
+ }
448
+ .legend .nodes-grid {
449
+ display: grid; grid-template-columns: 1fr 1fr; column-gap: 12px; row-gap: 4px;
450
+ font-size: 11px;
451
+ }
452
+ .legend .nodes-grid .nrow {
453
+ display: flex; align-items: center; gap: 7px;
454
+ color: var(--paper-2);
455
+ }
456
+ .legend .nodes-grid .nrow .nsq {
457
+ width: 9px; height: 9px; border-radius: 2px;
458
+ flex-shrink: 0;
459
+ }
460
+
461
+ /* MINIMAP */
462
+ .minimap {
463
+ position: absolute;
464
+ right: 14px; bottom: 14px;
465
+ width: 220px; height: 150px;
466
+ background: var(--ink-1);
467
+ border: 1px solid var(--rule);
468
+ border-radius: 4px;
469
+ z-index: 6;
470
+ overflow: hidden;
471
+ }
472
+ .minimap canvas { width: 100%; height: 100%; display: block; }
473
+ .minimap .frame {
474
+ position: absolute;
475
+ border: 1px solid var(--accent);
476
+ background: rgba(200, 162, 90, 0.08);
477
+ pointer-events: none;
478
+ }
479
+ .minimap-label {
480
+ position: absolute; top: 4px; left: 6px;
481
+ font-family: 'Spectral', serif;
482
+ font-style: italic;
483
+ font-size: 11px;
484
+ color: var(--paper-3);
485
+ pointer-events: none;
486
+ }
487
+
488
+ /* ZOOM CONTROLS */
489
+ .zoomctl {
490
+ position: absolute;
491
+ right: 14px; top: 56px;
492
+ display: flex; flex-direction: column;
493
+ background: var(--ink-1);
494
+ border: 1px solid var(--rule);
495
+ border-radius: 4px;
496
+ z-index: 5;
497
+ overflow: hidden;
498
+ }
499
+ .zoomctl button {
500
+ width: 30px; height: 28px;
501
+ background: transparent;
502
+ border: 0;
503
+ color: var(--paper-1);
504
+ cursor: pointer;
505
+ display: flex; align-items: center; justify-content: center;
506
+ font-size: 14px;
507
+ }
508
+ .zoomctl button:hover { background: var(--ink-3); color: var(--paper-0); }
509
+ .zoomctl button + button { border-top: 1px solid var(--rule); }
510
+
511
+ /* ---- INSPECTOR --------------------------------------------------- */
512
+ .inspect {
513
+ grid-area: inspect;
514
+ background: var(--ink-1);
515
+ border-left: 1px solid var(--rule);
516
+ overflow-y: auto;
517
+ overflow-x: hidden;
518
+ }
519
+ .inspect-tabs {
520
+ display: flex;
521
+ border-bottom: 1px solid var(--rule);
522
+ padding: 0 10px;
523
+ gap: 4px;
524
+ }
525
+ .inspect-tab {
526
+ padding: 10px 8px 9px;
527
+ font-family: 'Spectral', serif;
528
+ font-size: 13px;
529
+ color: var(--paper-2);
530
+ cursor: pointer;
531
+ border-bottom: 1px solid transparent;
532
+ margin-bottom: -1px;
533
+ }
534
+ .inspect-tab.on {
535
+ color: var(--paper-0);
536
+ border-bottom-color: var(--accent);
537
+ font-style: italic;
538
+ }
539
+ .inspect-tab .ct {
540
+ font-family: 'JetBrains Mono', monospace;
541
+ font-size: 10.5px;
542
+ color: var(--paper-3);
543
+ margin-left: 4px;
544
+ }
545
+
546
+ .insp-section { padding: 14px 16px 18px; }
547
+ .insp-section + .insp-section { border-top: 1px solid var(--rule); }
548
+
549
+ .insp-eyebrow {
550
+ font-family: 'JetBrains Mono', monospace;
551
+ font-size: 10.5px;
552
+ color: var(--paper-3);
553
+ text-transform: uppercase;
554
+ letter-spacing: 0.08em;
555
+ margin-bottom: 6px;
556
+ }
557
+ .insp-title {
558
+ font-family: 'Spectral', serif;
559
+ font-size: 22px;
560
+ line-height: 1.2;
561
+ color: var(--paper-0);
562
+ font-weight: 400;
563
+ word-break: break-word;
564
+ }
565
+ .insp-title .stem { font-style: italic; color: var(--paper-2); margin-right: 4px; }
566
+ .insp-sub {
567
+ font-family: 'JetBrains Mono', monospace;
568
+ font-size: 11px;
569
+ color: var(--paper-2);
570
+ margin-top: 6px;
571
+ word-break: break-all;
572
+ }
573
+ .insp-tags {
574
+ display: flex; flex-wrap: wrap; gap: 5px;
575
+ margin-top: 10px;
576
+ }
577
+ .tag {
578
+ font-family: 'JetBrains Mono', monospace;
579
+ font-size: 10.5px;
580
+ padding: 2px 6px;
581
+ border-radius: 2px;
582
+ background: var(--ink-3);
583
+ color: var(--paper-1);
584
+ border: 1px solid var(--rule);
585
+ }
586
+ .tag.alive { color: var(--prov-observed); border-color: rgba(95,207,158,0.25); }
587
+ .tag.warn { color: var(--prov-inferred); border-color: rgba(210,122,216,0.25); }
588
+
589
+ .kv {
590
+ display: grid;
591
+ grid-template-columns: 110px 1fr;
592
+ column-gap: 12px;
593
+ row-gap: 4px;
594
+ font-size: 12px;
595
+ }
596
+ .kv dt {
597
+ font-family: 'Spectral', serif;
598
+ font-style: italic;
599
+ color: var(--paper-3);
600
+ }
601
+ .kv dd {
602
+ margin: 0;
603
+ font-family: 'JetBrains Mono', monospace;
604
+ color: var(--paper-1);
605
+ word-break: break-all;
606
+ }
607
+
608
+ .insp-h {
609
+ font-family: 'Spectral', serif;
610
+ font-style: italic;
611
+ font-weight: 500;
612
+ color: var(--paper-0);
613
+ font-size: 13px;
614
+ margin: 0 0 8px;
615
+ display: flex; align-items: baseline; justify-content: space-between;
616
+ }
617
+ .insp-h .ct {
618
+ font-family: 'JetBrains Mono', monospace;
619
+ font-size: 10.5px;
620
+ font-style: normal;
621
+ color: var(--paper-3);
622
+ }
623
+
624
+ .edge-list { list-style: none; margin: 0; padding: 0; }
625
+ .edge-list li {
626
+ display: flex; align-items: center; gap: 8px;
627
+ padding: 5px 0;
628
+ font-size: 12px;
629
+ border-bottom: 1px dashed var(--rule-soft);
630
+ }
631
+ .edge-list li:last-child { border-bottom: 0; }
632
+ .edge-list .verb {
633
+ font-family: 'Spectral', serif;
634
+ font-style: italic;
635
+ color: var(--paper-2);
636
+ width: 70px;
637
+ flex-shrink: 0;
638
+ }
639
+ .edge-list .target {
640
+ font-family: 'JetBrains Mono', monospace;
641
+ color: var(--paper-1);
642
+ flex: 1;
643
+ overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
644
+ }
645
+ .edge-list .pdot {
646
+ width: 6px; height: 6px; border-radius: 50%;
647
+ flex-shrink: 0;
648
+ }
649
+ .edge-list .pdot.STATIC { background: var(--prov-static); }
650
+ .edge-list .pdot.OBSERVED { background: var(--prov-observed); }
651
+ .edge-list .pdot.INFERRED { background: var(--prov-inferred); }
652
+ .edge-list .conf {
653
+ font-family: 'JetBrains Mono', monospace;
654
+ font-size: 10.5px;
655
+ color: var(--paper-3);
656
+ width: 32px;
657
+ text-align: right;
658
+ }
659
+
660
+ /* root cause block */
661
+ .root-cause-block {
662
+ background: var(--ink-2);
663
+ border: 1px solid var(--rule);
664
+ border-radius: 3px;
665
+ padding: 10px 12px;
666
+ }
667
+ .root-cause-block .rc-label {
668
+ font-family: 'JetBrains Mono', monospace;
669
+ font-size: 10px;
670
+ color: var(--prov-inferred);
671
+ text-transform: uppercase;
672
+ letter-spacing: 0.08em;
673
+ margin-bottom: 5px;
674
+ }
675
+ .root-cause-block .rc-node {
676
+ font-family: 'JetBrains Mono', monospace;
677
+ font-size: 12px;
678
+ color: var(--paper-0);
679
+ margin-bottom: 5px;
680
+ }
681
+ .root-cause-block .rc-reason {
682
+ font-family: 'Spectral', serif;
683
+ font-style: italic;
684
+ font-size: 12.5px;
685
+ color: var(--paper-1);
686
+ margin-bottom: 5px;
687
+ }
688
+ .root-cause-block .rc-fix {
689
+ font-family: 'Spectral', serif;
690
+ font-size: 12px;
691
+ color: var(--prov-observed);
692
+ }
693
+
694
+ /* metric strip */
695
+ .metrics {
696
+ display: grid;
697
+ grid-template-columns: 1fr 1fr 1fr;
698
+ gap: 10px;
699
+ }
700
+ .metric {
701
+ background: var(--ink-2);
702
+ border: 1px solid var(--rule);
703
+ border-radius: 3px;
704
+ padding: 8px 10px;
705
+ }
706
+ .metric .lbl {
707
+ font-family: 'Spectral', serif;
708
+ font-style: italic;
709
+ font-size: 11px;
710
+ color: var(--paper-3);
711
+ }
712
+ .metric .val {
713
+ font-family: 'JetBrains Mono', monospace;
714
+ font-size: 16px;
715
+ color: var(--paper-0);
716
+ margin-top: 2px;
717
+ }
718
+ .metric .delta {
719
+ font-family: 'JetBrains Mono', monospace;
720
+ font-size: 10.5px;
721
+ color: var(--prov-observed);
722
+ margin-top: 1px;
723
+ }
724
+ .metric .delta.bad { color: #e87a7a; }
725
+
726
+ /* ---- STATUS BAR -------------------------------------------------- */
727
+ .status {
728
+ grid-area: status;
729
+ border-top: 1px solid var(--rule);
730
+ background: var(--ink-1);
731
+ display: flex;
732
+ align-items: center;
733
+ padding: 0 10px;
734
+ gap: 14px;
735
+ color: var(--paper-2);
736
+ font-family: 'JetBrains Mono', monospace;
737
+ font-size: 11px;
738
+ }
739
+ .status .st-item { display: flex; align-items: center; gap: 6px; }
740
+ .status .st-item .k { color: var(--paper-3); }
741
+ .status .st-item .v { color: var(--paper-1); }
742
+ .status .st-spacer { flex: 1; }
743
+ .status .live::before {
744
+ content: ""; display: inline-block;
745
+ width: 6px; height: 6px; border-radius: 50%;
746
+ background: var(--prov-observed);
747
+ margin-right: 6px;
748
+ box-shadow: 0 0 0 0 rgba(95,207,158,0.5);
749
+ animation: pulse 1.8s infinite;
750
+ }
751
+ .status .live-dead::before {
752
+ content: ""; display: inline-block;
753
+ width: 6px; height: 6px; border-radius: 50%;
754
+ background: var(--paper-4);
755
+ margin-right: 6px;
756
+ }
757
+ @keyframes pulse {
758
+ 0% { box-shadow: 0 0 0 0 rgba(95,207,158,0.45); }
759
+ 70% { box-shadow: 0 0 0 6px rgba(95,207,158,0); }
760
+ 100% { box-shadow: 0 0 0 0 rgba(95,207,158,0); }
761
+ }
762
+
763
+ /* time scrubber */
764
+ .scrub {
765
+ display: flex; align-items: center; gap: 8px;
766
+ background: var(--ink-2);
767
+ border: 1px solid var(--rule);
768
+ border-radius: 3px;
769
+ padding: 2px 8px;
770
+ height: 20px;
771
+ }
772
+ .scrub .bar {
773
+ width: 220px; height: 4px;
774
+ background: var(--ink-3);
775
+ border-radius: 2px;
776
+ position: relative;
777
+ }
778
+ .scrub .bar .fill {
779
+ position: absolute; left: 0; top: 0; bottom: 0;
780
+ width: 100%;
781
+ background: linear-gradient(to right, rgba(110,168,255,0.4), rgba(95,207,158,0.6));
782
+ border-radius: 2px;
783
+ }
784
+ .scrub .bar .head {
785
+ position: absolute; right: 0; top: -3px;
786
+ width: 2px; height: 10px; background: var(--accent);
787
+ }
788
+ .scrub .now { color: var(--paper-1); }
789
+
790
+ /* ---- INCIDENTS PAGE ----------------------------------------------- */
791
+ .incidents-page {
792
+ padding: 24px 32px;
793
+ max-width: 1000px;
794
+ overflow-y: auto;
795
+ height: calc(100vh - 44px);
796
+ }
797
+ .incidents-page h1 {
798
+ font-family: 'Spectral', serif;
799
+ font-style: italic;
800
+ font-weight: 400;
801
+ font-size: 28px;
802
+ color: var(--paper-0);
803
+ margin: 0 0 4px;
804
+ }
805
+ .incidents-page .subtitle {
806
+ font-family: 'JetBrains Mono', monospace;
807
+ font-size: 11.5px;
808
+ color: var(--paper-3);
809
+ margin-bottom: 24px;
810
+ }
811
+ .incidents-table {
812
+ width: 100%;
813
+ border-collapse: collapse;
814
+ font-size: 12.5px;
815
+ }
816
+ .incidents-table th {
817
+ font-family: 'Spectral', serif;
818
+ font-style: italic;
819
+ font-weight: 500;
820
+ font-size: 11.5px;
821
+ color: var(--paper-2);
822
+ text-align: left;
823
+ padding: 6px 12px;
824
+ border-bottom: 1px solid var(--rule);
825
+ }
826
+ .incidents-table td {
827
+ padding: 8px 12px;
828
+ border-bottom: 1px solid var(--rule-soft);
829
+ vertical-align: top;
830
+ }
831
+ .incidents-table tr:hover td { background: var(--ink-2); }
832
+ .incidents-table .td-node {
833
+ font-family: 'JetBrains Mono', monospace;
834
+ color: var(--paper-1);
835
+ white-space: nowrap;
836
+ }
837
+ .incidents-table .td-time {
838
+ font-family: 'JetBrains Mono', monospace;
839
+ font-size: 11px;
840
+ color: var(--paper-3);
841
+ white-space: nowrap;
842
+ }
843
+ .incidents-table .td-type {
844
+ font-family: 'JetBrains Mono', monospace;
845
+ font-size: 11px;
846
+ color: var(--prov-inferred);
847
+ }
848
+ .incidents-table .td-msg {
849
+ font-family: 'Spectral', serif;
850
+ font-style: italic;
851
+ color: var(--paper-1);
852
+ max-width: 400px;
853
+ }
854
+ .incidents-empty {
855
+ font-family: 'Spectral', serif;
856
+ font-style: italic;
857
+ color: var(--paper-3);
858
+ padding: 32px 0;
859
+ text-align: center;
860
+ }
861
+ .incidents-nav-link {
862
+ color: var(--paper-2);
863
+ text-decoration: none;
864
+ font-family: 'JetBrains Mono', monospace;
865
+ font-size: 12px;
866
+ }
867
+ .incidents-node-link {
868
+ color: var(--paper-1);
869
+ text-decoration: none;
870
+ font-family: 'JetBrains Mono', monospace;
871
+ }
872
+ .incidents-node-link:hover { color: var(--paper-0); text-decoration: underline; }
873
+ .td-stacktrace { padding: 0 !important; background: var(--ink-2); }
874
+ .stacktrace-pre {
875
+ margin: 0;
876
+ padding: 12px 16px;
877
+ font-family: 'JetBrains Mono', monospace;
878
+ font-size: 10.5px;
879
+ color: var(--paper-3);
880
+ white-space: pre-wrap;
881
+ word-break: break-all;
882
+ background: var(--ink-2);
883
+ border-bottom: 1px solid var(--rule-soft);
884
+ }
885
+ .stack-toggle { color: var(--paper-3); font-style: normal; font-size: 10px; }
886
+
887
+ /* scrollbars */
888
+ ::-webkit-scrollbar { width: 8px; height: 8px; }
889
+ ::-webkit-scrollbar-track { background: transparent; }
890
+ ::-webkit-scrollbar-thumb { background: var(--ink-3); border-radius: 4px; }
891
+ ::-webkit-scrollbar-thumb:hover { background: var(--ink-4); }