@crewhaus/hangar-ui 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. package/README.md +309 -0
  2. package/assets/hangar.css +1726 -0
  3. package/assets/index.html +21 -0
  4. package/assets/js/api.js +368 -0
  5. package/assets/js/app.js +734 -0
  6. package/assets/js/dom.js +228 -0
  7. package/assets/js/keys.js +159 -0
  8. package/assets/js/markdown.js +131 -0
  9. package/assets/js/notify.js +152 -0
  10. package/assets/js/omnibox.js +307 -0
  11. package/assets/js/router.js +280 -0
  12. package/assets/js/routes.js +793 -0
  13. package/assets/js/shapes.js +36 -0
  14. package/assets/js/supervision.js +1334 -0
  15. package/assets/js/util.js +426 -0
  16. package/assets/js/views/activity.js +140 -0
  17. package/assets/js/views/approvals.js +155 -0
  18. package/assets/js/views/channels.js +455 -0
  19. package/assets/js/views/control.js +253 -0
  20. package/assets/js/views/costs.js +103 -0
  21. package/assets/js/views/creds.js +610 -0
  22. package/assets/js/views/data.js +456 -0
  23. package/assets/js/views/deploy.js +106 -0
  24. package/assets/js/views/evals-lab.js +1029 -0
  25. package/assets/js/views/evals.js +342 -0
  26. package/assets/js/views/feedback.js +555 -0
  27. package/assets/js/views/health.js +176 -0
  28. package/assets/js/views/inbox.js +103 -0
  29. package/assets/js/views/inspect.js +751 -0
  30. package/assets/js/views/jobs.js +110 -0
  31. package/assets/js/views/library.js +605 -0
  32. package/assets/js/views/memory-fabric.js +2026 -0
  33. package/assets/js/views/memory.js +228 -0
  34. package/assets/js/views/onboarding.js +253 -0
  35. package/assets/js/views/overview.js +196 -0
  36. package/assets/js/views/panes.js +132 -0
  37. package/assets/js/views/proc.js +280 -0
  38. package/assets/js/views/review.js +164 -0
  39. package/assets/js/views/runs.js +452 -0
  40. package/assets/js/views/runtime.js +450 -0
  41. package/assets/js/views/schedulers.js +133 -0
  42. package/assets/js/views/security.js +925 -0
  43. package/assets/js/views/sessions.js +265 -0
  44. package/assets/js/views/settings.js +489 -0
  45. package/assets/js/views/spec-edit.js +1289 -0
  46. package/assets/js/views/spec.js +66 -0
  47. package/assets/js/views/thredz.js +1853 -0
  48. package/assets/js/views/token.js +49 -0
  49. package/dist/index.d.ts +15 -0
  50. package/dist/index.js +145 -0
  51. package/package.json +36 -0
@@ -0,0 +1,1726 @@
1
+ /* ==========================================================================
2
+ Hangar — calm, dense "drafting paper" console.
3
+ Dark default; light theme is an explicit [data-theme="light"] override
4
+ (no prefers-color-scheme auto-switch — the toggle owns it). System font
5
+ stack, subtle borders, per-shape accent via the --accent custom property,
6
+ no animation beyond opacity.
7
+ ========================================================================== */
8
+
9
+ :root {
10
+ /* paper */
11
+ --bg: #0a0d0f;
12
+ --panel: #0f1418;
13
+ --panel-2: #11171b;
14
+ --panel-3: #151c21;
15
+
16
+ /* ink */
17
+ --ink: #e8efe9;
18
+ --ink-2: #98a39e;
19
+ --ink-3: #5e6a65;
20
+
21
+ /* accent (mint default; per-shape values are set inline where scoped) */
22
+ --mint: #2ecc8b;
23
+ --accent: var(--mint);
24
+ --accent-ghost: rgba(46, 204, 139, 0.12);
25
+
26
+ /* semantic */
27
+ --ok: #2ecc8b;
28
+ --warn: #e6b450;
29
+ --bad: #ef6f6f;
30
+ --info: #64b5ff;
31
+ --off: #5e6a65;
32
+ --warn-ghost: rgba(230, 180, 80, 0.12);
33
+ --bad-ghost: rgba(239, 111, 111, 0.12);
34
+
35
+ /* rules */
36
+ --rule: rgba(140, 180, 165, 0.14);
37
+ --rule-2: rgba(140, 180, 165, 0.24);
38
+
39
+ --radius: 10px;
40
+ --radius-sm: 7px;
41
+
42
+ --sans: ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial,
43
+ sans-serif;
44
+ --mono: ui-monospace, "SFMono-Regular", Menlo, Consolas, "Liberation Mono", monospace;
45
+ }
46
+
47
+ :root[data-theme="light"] {
48
+ --bg: #e9ece6;
49
+ --panel: #fbfcf9;
50
+ --panel-2: #f4f6f1;
51
+ --panel-3: #edf0ea;
52
+
53
+ --ink: #16221b;
54
+ --ink-2: #45524b;
55
+ --ink-3: #6d7b73;
56
+
57
+ --accent-ghost: rgba(46, 204, 139, 0.16);
58
+
59
+ --ok: #1e9664;
60
+ --warn: #b7791f;
61
+ --bad: #d0463f;
62
+ --info: #2f7fd6;
63
+ --off: #6d7b73;
64
+ --warn-ghost: rgba(183, 121, 31, 0.14);
65
+ --bad-ghost: rgba(208, 70, 63, 0.12);
66
+
67
+ --rule: rgba(40, 62, 50, 0.16);
68
+ --rule-2: rgba(40, 62, 50, 0.28);
69
+ }
70
+
71
+ * {
72
+ box-sizing: border-box;
73
+ }
74
+
75
+ html,
76
+ body {
77
+ margin: 0;
78
+ min-height: 100%;
79
+ }
80
+
81
+ body {
82
+ background: var(--bg);
83
+ color: var(--ink);
84
+ font-family: var(--sans);
85
+ font-size: 13.5px;
86
+ line-height: 1.5;
87
+ -webkit-font-smoothing: antialiased;
88
+ }
89
+
90
+ a {
91
+ color: var(--accent);
92
+ text-decoration: none;
93
+ }
94
+ a:hover {
95
+ text-decoration: underline;
96
+ }
97
+
98
+ code,
99
+ .mono {
100
+ font-family: var(--mono);
101
+ font-size: 0.93em;
102
+ }
103
+
104
+ .muted {
105
+ color: var(--ink-2);
106
+ }
107
+
108
+ /* ── shell ─────────────────────────────────────────────────────────────── */
109
+
110
+ #app {
111
+ display: flex;
112
+ flex-direction: column;
113
+ min-height: 100vh;
114
+ }
115
+
116
+ .app-header {
117
+ display: flex;
118
+ align-items: center;
119
+ gap: 12px;
120
+ padding: 10px 18px;
121
+ border-bottom: 1px solid var(--rule);
122
+ background: var(--panel);
123
+ }
124
+
125
+ .brand {
126
+ display: flex;
127
+ align-items: baseline;
128
+ gap: 9px;
129
+ color: var(--ink);
130
+ }
131
+ .brand:hover {
132
+ text-decoration: none;
133
+ }
134
+ .brand .logo {
135
+ align-self: center;
136
+ width: 26px;
137
+ height: 26px;
138
+ display: grid;
139
+ place-items: center;
140
+ border-radius: 7px;
141
+ border: 1px solid var(--rule-2);
142
+ background: var(--accent-ghost);
143
+ color: var(--accent);
144
+ font-weight: 700;
145
+ }
146
+ .brand-name {
147
+ font-weight: 650;
148
+ letter-spacing: 0.01em;
149
+ }
150
+ .brand-sub {
151
+ color: var(--ink-3);
152
+ font-size: 12px;
153
+ }
154
+
155
+ .spacer {
156
+ flex: 1;
157
+ }
158
+
159
+ .view {
160
+ flex: 1;
161
+ width: 100%;
162
+ max-width: 1240px;
163
+ margin: 0 auto;
164
+ padding: 16px 18px 40px;
165
+ }
166
+
167
+ .app-foot {
168
+ display: flex;
169
+ gap: 14px;
170
+ align-items: center;
171
+ justify-content: space-between;
172
+ padding: 8px 18px;
173
+ border-top: 1px solid var(--rule);
174
+ color: var(--ink-3);
175
+ font-size: 12px;
176
+ }
177
+
178
+ /* ── controls ──────────────────────────────────────────────────────────── */
179
+
180
+ .btn {
181
+ font: inherit;
182
+ color: var(--ink);
183
+ background: var(--panel-2);
184
+ border: 1px solid var(--rule-2);
185
+ border-radius: var(--radius-sm);
186
+ padding: 5px 11px;
187
+ cursor: pointer;
188
+ }
189
+ .btn:hover {
190
+ border-color: var(--accent);
191
+ }
192
+ .btn:disabled {
193
+ opacity: 0.5;
194
+ cursor: default;
195
+ }
196
+ .btn-primary {
197
+ background: var(--accent-ghost);
198
+ border-color: var(--accent);
199
+ color: var(--accent);
200
+ }
201
+ .btn-ghost {
202
+ background: transparent;
203
+ border-color: transparent;
204
+ color: var(--ink-2);
205
+ }
206
+ .btn-ghost:hover,
207
+ .btn-ghost.active {
208
+ color: var(--ink);
209
+ border-color: var(--rule-2);
210
+ }
211
+ .btn-danger {
212
+ border-color: var(--bad);
213
+ color: var(--bad);
214
+ background: var(--bad-ghost);
215
+ }
216
+ .btn-copy.ok {
217
+ color: var(--ok);
218
+ }
219
+
220
+ .input {
221
+ font: inherit;
222
+ color: var(--ink);
223
+ background: var(--panel-2);
224
+ border: 1px solid var(--rule-2);
225
+ border-radius: var(--radius-sm);
226
+ padding: 5px 9px;
227
+ }
228
+ .input:focus {
229
+ outline: none;
230
+ border-color: var(--accent);
231
+ }
232
+ .grow {
233
+ flex: 1;
234
+ min-width: 0;
235
+ }
236
+
237
+ /* ── cards, chips, dots ────────────────────────────────────────────────── */
238
+
239
+ .card {
240
+ background: var(--panel);
241
+ border: 1px solid var(--rule);
242
+ border-radius: var(--radius);
243
+ padding: 14px 16px;
244
+ margin: 10px 0;
245
+ }
246
+
247
+ .card-title {
248
+ display: flex;
249
+ align-items: baseline;
250
+ gap: 10px;
251
+ margin: 0 0 10px;
252
+ font-size: 13px;
253
+ font-weight: 650;
254
+ text-transform: uppercase;
255
+ letter-spacing: 0.06em;
256
+ color: var(--ink-2);
257
+ }
258
+ .card-sub {
259
+ text-transform: none;
260
+ letter-spacing: 0;
261
+ font-weight: 400;
262
+ }
263
+
264
+ .chip {
265
+ display: inline-block;
266
+ padding: 1px 7px;
267
+ margin: 1px 3px 1px 0;
268
+ border: 1px solid var(--rule-2);
269
+ border-radius: 999px;
270
+ font-size: 11.5px;
271
+ color: var(--ink-2);
272
+ background: var(--panel-2);
273
+ white-space: nowrap;
274
+ }
275
+ .chip-warn {
276
+ color: var(--warn);
277
+ border-color: var(--warn);
278
+ background: var(--warn-ghost);
279
+ }
280
+ .chip-group {
281
+ color: var(--accent);
282
+ border-color: var(--accent);
283
+ background: var(--accent-ghost);
284
+ }
285
+ .chip-tool {
286
+ font-family: var(--mono);
287
+ }
288
+
289
+ .dot-pair {
290
+ display: inline-flex;
291
+ align-items: center;
292
+ gap: 6px;
293
+ white-space: nowrap;
294
+ }
295
+ .dot {
296
+ width: 8px;
297
+ height: 8px;
298
+ border-radius: 50%;
299
+ background: var(--off);
300
+ }
301
+ .dot-ok .dot {
302
+ background: var(--ok);
303
+ }
304
+ .dot-warn .dot {
305
+ background: var(--warn);
306
+ }
307
+ .dot-bad .dot {
308
+ background: var(--bad);
309
+ }
310
+ .dot-unknown .dot {
311
+ background: var(--info);
312
+ }
313
+ .dot-label {
314
+ font-size: 12.5px;
315
+ }
316
+ .dot-ok .dot-label {
317
+ color: var(--ok);
318
+ }
319
+ .dot-warn .dot-label {
320
+ color: var(--warn);
321
+ }
322
+ .dot-bad .dot-label {
323
+ color: var(--bad);
324
+ }
325
+ .dot-off .dot-label {
326
+ color: var(--ink-3);
327
+ }
328
+
329
+ .asof {
330
+ margin-left: 6px;
331
+ font-size: 11px;
332
+ color: var(--ink-3);
333
+ white-space: nowrap;
334
+ }
335
+
336
+ /* ── skeleton + empty states ───────────────────────────────────────────── */
337
+
338
+ .skeleton {
339
+ padding: 10px 0;
340
+ }
341
+ .skel-line {
342
+ height: 14px;
343
+ margin: 10px 0;
344
+ border-radius: 5px;
345
+ background: var(--panel-3);
346
+ opacity: 0.7;
347
+ animation: pulse 1.2s ease-in-out infinite alternate;
348
+ }
349
+ @keyframes pulse {
350
+ from {
351
+ opacity: 0.35;
352
+ }
353
+ to {
354
+ opacity: 0.8;
355
+ }
356
+ }
357
+ .boot {
358
+ max-width: 640px;
359
+ margin: 80px auto;
360
+ padding: 0 20px;
361
+ }
362
+
363
+ .empty {
364
+ border: 1px dashed var(--rule-2);
365
+ border-radius: var(--radius);
366
+ padding: 22px 18px;
367
+ margin: 10px 0;
368
+ text-align: center;
369
+ color: var(--ink-2);
370
+ }
371
+ .empty-msg {
372
+ font-weight: 550;
373
+ }
374
+ .empty-verb {
375
+ margin-top: 5px;
376
+ font-size: 12.5px;
377
+ color: var(--ink-3);
378
+ }
379
+ .empty-verb code {
380
+ color: var(--accent);
381
+ }
382
+
383
+ /* ── library ───────────────────────────────────────────────────────────── */
384
+
385
+ .lib {
386
+ display: grid;
387
+ grid-template-columns: 205px minmax(0, 1fr);
388
+ gap: 18px;
389
+ }
390
+ @media (max-width: 860px) {
391
+ .lib {
392
+ grid-template-columns: minmax(0, 1fr);
393
+ }
394
+ }
395
+
396
+ .rail {
397
+ display: flex;
398
+ flex-direction: column;
399
+ gap: 2px;
400
+ align-self: start;
401
+ }
402
+ .rail-head {
403
+ margin: 12px 0 3px;
404
+ font-size: 11px;
405
+ text-transform: uppercase;
406
+ letter-spacing: 0.07em;
407
+ color: var(--ink-3);
408
+ }
409
+ .rail-item {
410
+ display: flex;
411
+ align-items: center;
412
+ gap: 7px;
413
+ width: 100%;
414
+ text-align: left;
415
+ font: inherit;
416
+ color: var(--ink-2);
417
+ background: transparent;
418
+ border: 1px solid transparent;
419
+ border-radius: var(--radius-sm);
420
+ padding: 4px 8px;
421
+ cursor: pointer;
422
+ }
423
+ .rail-item:hover {
424
+ color: var(--ink);
425
+ background: var(--panel-2);
426
+ }
427
+ .rail-item.active {
428
+ color: var(--ink);
429
+ background: var(--panel-3);
430
+ border-color: var(--rule-2);
431
+ }
432
+ .rail-label {
433
+ flex: 1;
434
+ min-width: 0;
435
+ overflow: hidden;
436
+ text-overflow: ellipsis;
437
+ white-space: nowrap;
438
+ }
439
+ .rail-count {
440
+ font-size: 11.5px;
441
+ color: var(--ink-3);
442
+ }
443
+ .rail-new {
444
+ color: var(--ink-3);
445
+ }
446
+ .rail-form {
447
+ display: flex;
448
+ flex-direction: column;
449
+ gap: 5px;
450
+ padding: 5px 0;
451
+ }
452
+ .swatch {
453
+ width: 9px;
454
+ height: 9px;
455
+ border-radius: 3px;
456
+ border: 1px solid var(--rule-2);
457
+ }
458
+
459
+ .toolbar,
460
+ .add-form {
461
+ display: flex;
462
+ gap: 8px;
463
+ align-items: center;
464
+ margin: 0 0 10px;
465
+ }
466
+ .search {
467
+ flex: 1;
468
+ min-width: 120px;
469
+ }
470
+
471
+ .rollup {
472
+ display: flex;
473
+ align-items: baseline;
474
+ gap: 8px;
475
+ margin: 2px 0 10px;
476
+ color: var(--ink-2);
477
+ }
478
+
479
+ /* table */
480
+ .table-scroll {
481
+ overflow-x: auto;
482
+ border: 1px solid var(--rule);
483
+ border-radius: var(--radius);
484
+ background: var(--panel);
485
+ }
486
+ table.fleet {
487
+ width: 100%;
488
+ border-collapse: collapse;
489
+ font-size: 13px;
490
+ }
491
+ .fleet th {
492
+ text-align: left;
493
+ font-size: 11.5px;
494
+ text-transform: uppercase;
495
+ letter-spacing: 0.05em;
496
+ color: var(--ink-3);
497
+ font-weight: 600;
498
+ padding: 8px 10px;
499
+ border-bottom: 1px solid var(--rule-2);
500
+ white-space: nowrap;
501
+ }
502
+ .fleet td {
503
+ padding: 7px 10px;
504
+ border-bottom: 1px solid var(--rule);
505
+ vertical-align: top;
506
+ }
507
+ .fleet tbody tr:last-child td {
508
+ border-bottom: none;
509
+ }
510
+ .fleet tbody tr:hover td {
511
+ background: var(--panel-2);
512
+ }
513
+ .th-sort {
514
+ font: inherit;
515
+ color: inherit;
516
+ text-transform: inherit;
517
+ letter-spacing: inherit;
518
+ background: none;
519
+ border: none;
520
+ padding: 0;
521
+ cursor: pointer;
522
+ }
523
+ .th-sort:hover,
524
+ .th-sort.active {
525
+ color: var(--ink);
526
+ }
527
+ .num {
528
+ text-align: right;
529
+ font-variant-numeric: tabular-nums;
530
+ white-space: nowrap;
531
+ }
532
+
533
+ .cell-name {
534
+ min-width: 170px;
535
+ }
536
+ .name-line {
537
+ display: flex;
538
+ align-items: center;
539
+ gap: 5px;
540
+ }
541
+ .name-link {
542
+ font-weight: 600;
543
+ color: var(--ink);
544
+ }
545
+ .name-link:hover {
546
+ color: var(--accent);
547
+ }
548
+ .sub {
549
+ font-size: 11.5px;
550
+ color: var(--ink-3);
551
+ overflow: hidden;
552
+ text-overflow: ellipsis;
553
+ white-space: nowrap;
554
+ max-width: 260px;
555
+ }
556
+ .pin {
557
+ font: inherit;
558
+ background: none;
559
+ border: none;
560
+ padding: 0 2px;
561
+ cursor: pointer;
562
+ color: var(--ink-3);
563
+ }
564
+ .pin.pinned {
565
+ color: var(--warn);
566
+ }
567
+
568
+ .shape-badge {
569
+ display: inline-block;
570
+ padding: 1px 8px;
571
+ border-radius: 999px;
572
+ font-size: 11.5px;
573
+ font-weight: 600;
574
+ color: var(--accent);
575
+ border: 1px solid var(--accent);
576
+ background: color-mix(in srgb, var(--accent) 12%, transparent);
577
+ white-space: nowrap;
578
+ }
579
+
580
+ .editor-tr td {
581
+ background: var(--panel-2);
582
+ }
583
+ .row-editor {
584
+ display: flex;
585
+ flex-wrap: wrap;
586
+ gap: 12px;
587
+ align-items: flex-end;
588
+ padding: 4px 0;
589
+ }
590
+ .field {
591
+ display: flex;
592
+ flex-direction: column;
593
+ gap: 3px;
594
+ font-size: 12px;
595
+ color: var(--ink-2);
596
+ }
597
+ .notes {
598
+ min-width: 220px;
599
+ resize: vertical;
600
+ }
601
+ .group-checks {
602
+ display: flex;
603
+ flex-wrap: wrap;
604
+ gap: 8px;
605
+ }
606
+ .check {
607
+ display: inline-flex;
608
+ align-items: center;
609
+ gap: 4px;
610
+ color: var(--ink);
611
+ }
612
+
613
+ .missing-card {
614
+ border-color: var(--bad);
615
+ }
616
+ .missing-head {
617
+ display: flex;
618
+ align-items: center;
619
+ gap: 8px;
620
+ }
621
+ .missing-dir {
622
+ margin: 6px 0;
623
+ color: var(--ink-3);
624
+ text-decoration: line-through;
625
+ }
626
+ .missing-actions {
627
+ display: flex;
628
+ gap: 10px;
629
+ flex-wrap: wrap;
630
+ align-items: center;
631
+ }
632
+
633
+ /* ── harness detail ────────────────────────────────────────────────────── */
634
+
635
+ .h-head {
636
+ margin: 4px 0 12px;
637
+ }
638
+ .h-title {
639
+ display: flex;
640
+ align-items: center;
641
+ gap: 10px;
642
+ }
643
+ .h-title h2 {
644
+ margin: 0;
645
+ font-size: 19px;
646
+ }
647
+ .h-dir {
648
+ display: flex;
649
+ align-items: center;
650
+ gap: 6px;
651
+ margin: 4px 0;
652
+ min-width: 0;
653
+ }
654
+ .h-dir .mono {
655
+ overflow: hidden;
656
+ text-overflow: ellipsis;
657
+ white-space: nowrap;
658
+ }
659
+
660
+ .safety-strip {
661
+ margin-top: 6px;
662
+ }
663
+
664
+ .tabs {
665
+ display: flex;
666
+ gap: 2px;
667
+ border-bottom: 1px solid var(--rule-2);
668
+ margin-bottom: 12px;
669
+ overflow-x: auto;
670
+ }
671
+ .tab {
672
+ padding: 6px 12px;
673
+ color: var(--ink-2);
674
+ border: 1px solid transparent;
675
+ border-bottom: none;
676
+ border-radius: var(--radius-sm) var(--radius-sm) 0 0;
677
+ white-space: nowrap;
678
+ }
679
+ .tab:hover {
680
+ color: var(--ink);
681
+ text-decoration: none;
682
+ }
683
+ .tab.active {
684
+ color: var(--ink);
685
+ background: var(--panel);
686
+ border-color: var(--rule-2);
687
+ }
688
+ /* A second surface stacked inside one tab (an M1/M2 panel above its M3
689
+ half). Each view clears the container it is given, so they get their own. */
690
+ .tab-section {
691
+ margin-top: 12px;
692
+ }
693
+
694
+ .crumb-line {
695
+ display: flex;
696
+ align-items: baseline;
697
+ gap: 10px;
698
+ margin: 2px 0 10px;
699
+ }
700
+
701
+ /* overview grid */
702
+ .ov-grid {
703
+ display: grid;
704
+ grid-template-columns: repeat(auto-fit, minmax(270px, 1fr));
705
+ gap: 10px;
706
+ }
707
+ .ov-card {
708
+ margin: 0;
709
+ }
710
+ .ov-wide {
711
+ grid-column: 1 / -1;
712
+ }
713
+
714
+ .check-list,
715
+ .issue-list,
716
+ .fact-list,
717
+ .wiki-list {
718
+ list-style: none;
719
+ margin: 0;
720
+ padding: 0;
721
+ }
722
+ .check-list li,
723
+ .issue-list li,
724
+ .wiki-list li {
725
+ padding: 3px 0;
726
+ border-bottom: 1px solid var(--rule);
727
+ }
728
+ .check-list li:last-child,
729
+ .issue-list li:last-child,
730
+ .wiki-list li:last-child {
731
+ border-bottom: none;
732
+ }
733
+ .check-list .dot-pair {
734
+ margin-right: 7px;
735
+ }
736
+ .issue-list .dot-pair,
737
+ .issue-list .dot-label {
738
+ white-space: normal;
739
+ }
740
+ .reason {
741
+ display: block;
742
+ margin-left: 14px;
743
+ font-size: 12px;
744
+ }
745
+
746
+ .big-stat {
747
+ display: flex;
748
+ align-items: baseline;
749
+ gap: 8px;
750
+ margin-bottom: 8px;
751
+ }
752
+ .stat-num {
753
+ font-size: 22px;
754
+ font-weight: 650;
755
+ font-variant-numeric: tabular-nums;
756
+ }
757
+ .mini-row {
758
+ display: flex;
759
+ gap: 18px;
760
+ flex-wrap: wrap;
761
+ }
762
+ .mini-num {
763
+ font-size: 17px;
764
+ font-weight: 650;
765
+ font-variant-numeric: tabular-nums;
766
+ }
767
+ .mini-label {
768
+ font-size: 11.5px;
769
+ color: var(--ink-3);
770
+ }
771
+
772
+ .spark path {
773
+ stroke: var(--accent);
774
+ }
775
+ .bars rect {
776
+ fill: var(--accent);
777
+ opacity: 0.85;
778
+ }
779
+ .bars-lg {
780
+ width: 100%;
781
+ height: auto;
782
+ }
783
+ .bar-labels {
784
+ display: flex;
785
+ justify-content: space-between;
786
+ font-size: 10.5px;
787
+ }
788
+
789
+ /* preflight + folds */
790
+ .fold {
791
+ border: 1px solid var(--rule);
792
+ border-radius: var(--radius-sm);
793
+ margin: 5px 0;
794
+ background: var(--panel-2);
795
+ }
796
+ .fold-summary {
797
+ display: flex;
798
+ align-items: baseline;
799
+ gap: 8px;
800
+ padding: 6px 10px;
801
+ cursor: pointer;
802
+ list-style: none;
803
+ }
804
+ .fold-summary::-webkit-details-marker {
805
+ display: none;
806
+ }
807
+ .fold-body {
808
+ padding: 2px 10px 8px;
809
+ border-top: 1px solid var(--rule);
810
+ }
811
+ .pf-mark {
812
+ font-weight: 700;
813
+ }
814
+ .pf-ok {
815
+ color: var(--ok);
816
+ }
817
+ .pf-warn {
818
+ color: var(--warn);
819
+ }
820
+ .pf-bad {
821
+ color: var(--bad);
822
+ }
823
+ .pf-level {
824
+ font-size: 11px;
825
+ text-transform: uppercase;
826
+ letter-spacing: 0.05em;
827
+ color: var(--ink-3);
828
+ min-width: 52px;
829
+ }
830
+ .pf-area {
831
+ font-size: 11.5px;
832
+ min-width: 74px;
833
+ }
834
+ .pf-msg {
835
+ flex: 1;
836
+ min-width: 0;
837
+ }
838
+
839
+ /* ── spec ──────────────────────────────────────────────────────────────── */
840
+
841
+ .spec-layout {
842
+ display: grid;
843
+ grid-template-columns: minmax(0, 1fr) 250px;
844
+ gap: 14px;
845
+ }
846
+ @media (max-width: 860px) {
847
+ .spec-layout {
848
+ grid-template-columns: minmax(0, 1fr);
849
+ }
850
+ }
851
+ .spec-head {
852
+ display: flex;
853
+ justify-content: space-between;
854
+ align-items: center;
855
+ margin-bottom: 6px;
856
+ }
857
+ .codeview {
858
+ border: 1px solid var(--rule);
859
+ border-radius: var(--radius);
860
+ background: var(--panel);
861
+ overflow-x: auto;
862
+ font-family: var(--mono);
863
+ font-size: 12.5px;
864
+ line-height: 1.6;
865
+ padding: 8px 0;
866
+ }
867
+ .codeline {
868
+ display: flex;
869
+ white-space: pre;
870
+ }
871
+ .ln {
872
+ flex: 0 0 44px;
873
+ text-align: right;
874
+ padding-right: 12px;
875
+ color: var(--ink-3);
876
+ user-select: none;
877
+ }
878
+ .lc {
879
+ flex: 1;
880
+ padding-right: 14px;
881
+ }
882
+
883
+ /* ── sessions / transcript ─────────────────────────────────────────────── */
884
+
885
+ tr.evicted td {
886
+ color: var(--ink-3);
887
+ }
888
+ tr.deflated td {
889
+ color: var(--ink-3);
890
+ }
891
+
892
+ .transcript-tools {
893
+ display: flex;
894
+ justify-content: flex-end;
895
+ margin-bottom: 6px;
896
+ }
897
+ .transcript {
898
+ display: flex;
899
+ flex-direction: column;
900
+ gap: 8px;
901
+ }
902
+ .bubble {
903
+ max-width: 82%;
904
+ border: 1px solid var(--rule);
905
+ border-radius: var(--radius);
906
+ padding: 8px 12px;
907
+ background: var(--panel);
908
+ }
909
+ .bubble-user {
910
+ align-self: flex-end;
911
+ background: var(--accent-ghost);
912
+ border-color: var(--rule-2);
913
+ }
914
+ .bubble-role {
915
+ font-size: 10.5px;
916
+ text-transform: uppercase;
917
+ letter-spacing: 0.06em;
918
+ color: var(--ink-3);
919
+ margin-bottom: 3px;
920
+ }
921
+ .bubble-body {
922
+ white-space: pre-wrap;
923
+ overflow-wrap: anywhere;
924
+ }
925
+ .gutter {
926
+ display: flex;
927
+ align-items: center;
928
+ gap: 7px;
929
+ padding-left: 8px;
930
+ font-size: 12px;
931
+ }
932
+ .tool-summary {
933
+ font-family: var(--mono);
934
+ font-size: 11.5px;
935
+ overflow: hidden;
936
+ text-overflow: ellipsis;
937
+ white-space: nowrap;
938
+ }
939
+ .rawjson {
940
+ border: 1px solid var(--rule);
941
+ border-radius: var(--radius);
942
+ background: var(--panel);
943
+ padding: 10px 12px;
944
+ overflow-x: auto;
945
+ font-family: var(--mono);
946
+ font-size: 12px;
947
+ white-space: pre;
948
+ }
949
+
950
+ .filter-bar {
951
+ display: flex;
952
+ gap: 4px;
953
+ margin: 8px 0;
954
+ }
955
+
956
+ .baseline-star {
957
+ color: var(--warn);
958
+ }
959
+
960
+ /* ── memory ────────────────────────────────────────────────────────────── */
961
+
962
+ .fact {
963
+ padding: 5px 0;
964
+ border-bottom: 1px solid var(--rule);
965
+ }
966
+ .fact-list li:last-child {
967
+ border-bottom: none;
968
+ }
969
+ .fact-meta {
970
+ margin-top: 2px;
971
+ }
972
+ .folded {
973
+ opacity: 0.75;
974
+ }
975
+ .sub-title {
976
+ margin: 8px 0 4px;
977
+ font-size: 12px;
978
+ text-transform: uppercase;
979
+ letter-spacing: 0.05em;
980
+ color: var(--ink-3);
981
+ }
982
+ .prose-pre {
983
+ white-space: pre-wrap;
984
+ overflow-wrap: anywhere;
985
+ font-family: var(--sans);
986
+ font-size: 13px;
987
+ background: var(--panel-2);
988
+ border: 1px solid var(--rule);
989
+ border-radius: var(--radius-sm);
990
+ padding: 8px 10px;
991
+ margin: 0 0 6px;
992
+ }
993
+ .kv {
994
+ display: flex;
995
+ gap: 10px;
996
+ padding: 3px 0;
997
+ }
998
+ .kv-k {
999
+ flex: 0 0 110px;
1000
+ color: var(--ink-3);
1001
+ font-size: 12px;
1002
+ }
1003
+ .wiki-article h2 {
1004
+ margin-top: 0;
1005
+ }
1006
+
1007
+ .md h1,
1008
+ .md h2,
1009
+ .md h3,
1010
+ .md h4 {
1011
+ margin: 14px 0 6px;
1012
+ line-height: 1.3;
1013
+ }
1014
+ .md p {
1015
+ margin: 6px 0;
1016
+ }
1017
+ .md code {
1018
+ background: var(--panel-3);
1019
+ border: 1px solid var(--rule);
1020
+ border-radius: 4px;
1021
+ padding: 0 4px;
1022
+ }
1023
+ .mdcode {
1024
+ background: var(--panel);
1025
+ border: 1px solid var(--rule);
1026
+ border-radius: var(--radius-sm);
1027
+ padding: 8px 10px;
1028
+ overflow-x: auto;
1029
+ font-family: var(--mono);
1030
+ font-size: 12px;
1031
+ }
1032
+ .mdcode code {
1033
+ background: none;
1034
+ border: none;
1035
+ padding: 0;
1036
+ }
1037
+
1038
+ /* ── token screen ──────────────────────────────────────────────────────── */
1039
+
1040
+ .token-screen {
1041
+ display: grid;
1042
+ place-items: center;
1043
+ padding: 40px 0;
1044
+ }
1045
+ .token-card {
1046
+ max-width: 480px;
1047
+ }
1048
+ .token-form {
1049
+ display: flex;
1050
+ gap: 8px;
1051
+ }
1052
+ .token-input {
1053
+ flex: 1;
1054
+ font-family: var(--mono);
1055
+ }
1056
+
1057
+ .error-card {
1058
+ border-color: var(--bad);
1059
+ }
1060
+
1061
+ .editor-actions {
1062
+ display: flex;
1063
+ gap: 8px;
1064
+ }
1065
+ .foot-version {
1066
+ white-space: nowrap;
1067
+ }
1068
+
1069
+ .toast {
1070
+ position: fixed;
1071
+ right: 16px;
1072
+ bottom: 16px;
1073
+ z-index: 100;
1074
+ max-width: 420px;
1075
+ padding: 10px 14px;
1076
+ border-radius: 8px;
1077
+ background: var(--panel-3);
1078
+ color: var(--ink);
1079
+ border: 1px solid var(--rule-2);
1080
+ box-shadow: 0 4px 18px rgba(0, 0, 0, 0.35);
1081
+ }
1082
+ .toast-error {
1083
+ border-color: var(--bad);
1084
+ background: var(--bad-ghost);
1085
+ }
1086
+ .toast-info {
1087
+ border-color: var(--ok);
1088
+ }
1089
+
1090
+ .transcript-meta {
1091
+ display: flex;
1092
+ gap: 8px;
1093
+ align-items: center;
1094
+ margin: 8px 0;
1095
+ }
1096
+
1097
+ /* ==========================================================================
1098
+ M2 — supervision: the fleet nav, process controls, CLI twins, the run
1099
+ console, the four-lane timeline, the inboxes, jobs and deployments.
1100
+ ========================================================================== */
1101
+
1102
+ /* ── fleet nav ─────────────────────────────────────────────────────────── */
1103
+
1104
+ .app-nav {
1105
+ display: flex;
1106
+ gap: 2px;
1107
+ margin-left: 10px;
1108
+ overflow-x: auto;
1109
+ }
1110
+ .navlink {
1111
+ display: inline-flex;
1112
+ align-items: center;
1113
+ gap: 5px;
1114
+ padding: 4px 9px;
1115
+ border-radius: var(--radius-sm);
1116
+ border: 1px solid transparent;
1117
+ color: var(--ink-2);
1118
+ white-space: nowrap;
1119
+ }
1120
+ .navlink:hover {
1121
+ color: var(--ink);
1122
+ background: var(--panel-2);
1123
+ text-decoration: none;
1124
+ }
1125
+ .navlink.active {
1126
+ color: var(--ink);
1127
+ background: var(--panel-3);
1128
+ border-color: var(--rule-2);
1129
+ }
1130
+ .nav-badge {
1131
+ min-width: 17px;
1132
+ padding: 0 5px;
1133
+ border-radius: 999px;
1134
+ font-size: 11px;
1135
+ text-align: center;
1136
+ color: var(--warn);
1137
+ border: 1px solid var(--warn);
1138
+ background: var(--warn-ghost);
1139
+ }
1140
+
1141
+ /* ── CLI twins + gated actions ─────────────────────────────────────────── */
1142
+
1143
+ .twin {
1144
+ display: flex;
1145
+ align-items: center;
1146
+ gap: 7px;
1147
+ margin: 5px 0;
1148
+ min-width: 0;
1149
+ font-size: 12px;
1150
+ }
1151
+ .twin-label {
1152
+ flex: 0 0 auto;
1153
+ font-size: 10.5px;
1154
+ text-transform: uppercase;
1155
+ letter-spacing: 0.06em;
1156
+ color: var(--ink-3);
1157
+ }
1158
+ .twin-cmd {
1159
+ flex: 1;
1160
+ min-width: 0;
1161
+ overflow-x: auto;
1162
+ white-space: nowrap;
1163
+ padding: 2px 7px;
1164
+ border: 1px solid var(--rule);
1165
+ border-radius: var(--radius-sm);
1166
+ background: var(--panel-2);
1167
+ color: var(--ink);
1168
+ }
1169
+
1170
+ .gated {
1171
+ display: inline-flex;
1172
+ flex-direction: column;
1173
+ gap: 2px;
1174
+ }
1175
+ .gated-why {
1176
+ font-size: 11.5px;
1177
+ max-width: 460px;
1178
+ }
1179
+
1180
+ .control-action {
1181
+ margin: 6px 0;
1182
+ }
1183
+ .control-row {
1184
+ display: flex;
1185
+ align-items: center;
1186
+ gap: 8px;
1187
+ }
1188
+ .control-state {
1189
+ min-height: 18px;
1190
+ }
1191
+
1192
+ /* ── modal (the preflight refusal) ─────────────────────────────────────── */
1193
+
1194
+ .modal-backdrop {
1195
+ position: fixed;
1196
+ inset: 0;
1197
+ z-index: 200;
1198
+ display: grid;
1199
+ place-items: center;
1200
+ padding: 20px;
1201
+ background: rgba(0, 0, 0, 0.55);
1202
+ }
1203
+ .modal {
1204
+ max-width: 680px;
1205
+ width: 100%;
1206
+ max-height: 82vh;
1207
+ overflow-y: auto;
1208
+ margin: 0;
1209
+ box-shadow: 0 10px 40px rgba(0, 0, 0, 0.45);
1210
+ }
1211
+ .modal-body {
1212
+ margin: 6px 0;
1213
+ }
1214
+ .modal-actions {
1215
+ display: flex;
1216
+ gap: 8px;
1217
+ align-items: center;
1218
+ margin-top: 12px;
1219
+ }
1220
+ .refusal-list {
1221
+ list-style: none;
1222
+ margin: 0;
1223
+ padding: 0;
1224
+ }
1225
+ .refusal-item {
1226
+ padding: 7px 0;
1227
+ border-bottom: 1px solid var(--rule);
1228
+ }
1229
+ .refusal-item:last-child {
1230
+ border-bottom: none;
1231
+ }
1232
+ .refusal-head {
1233
+ display: flex;
1234
+ gap: 8px;
1235
+ align-items: baseline;
1236
+ flex-wrap: wrap;
1237
+ }
1238
+
1239
+ /* ── process card + board ──────────────────────────────────────────────── */
1240
+
1241
+ .sup-strip {
1242
+ display: flex;
1243
+ flex-wrap: wrap;
1244
+ align-items: center;
1245
+ gap: 8px;
1246
+ margin-top: 7px;
1247
+ }
1248
+ .proc-facts {
1249
+ display: grid;
1250
+ grid-template-columns: repeat(auto-fit, minmax(230px, 1fr));
1251
+ gap: 0 18px;
1252
+ }
1253
+ .proc-bar {
1254
+ margin: 10px 0 4px;
1255
+ }
1256
+ .proc-actions {
1257
+ display: flex;
1258
+ flex-wrap: wrap;
1259
+ gap: 7px;
1260
+ align-items: center;
1261
+ }
1262
+ .proc-twin {
1263
+ margin-top: 4px;
1264
+ }
1265
+ .proc-reasons {
1266
+ margin-top: 2px;
1267
+ }
1268
+ .proc-links {
1269
+ display: flex;
1270
+ gap: 14px;
1271
+ margin-top: 10px;
1272
+ font-size: 12.5px;
1273
+ }
1274
+ .exit-banner {
1275
+ display: flex;
1276
+ flex-wrap: wrap;
1277
+ align-items: center;
1278
+ gap: 8px;
1279
+ margin: 8px 0;
1280
+ padding: 8px 10px;
1281
+ border: 1px solid var(--rule-2);
1282
+ border-radius: var(--radius-sm);
1283
+ background: var(--panel-2);
1284
+ }
1285
+ .cell-actions {
1286
+ min-width: 250px;
1287
+ }
1288
+ .fleet .reason,
1289
+ .fleet .gated-why {
1290
+ max-width: 240px;
1291
+ }
1292
+ .state-link {
1293
+ color: inherit;
1294
+ }
1295
+ .state-link:hover {
1296
+ text-decoration: none;
1297
+ }
1298
+
1299
+ .fail-group {
1300
+ padding: 7px 0;
1301
+ border-bottom: 1px solid var(--rule);
1302
+ }
1303
+ .fail-group:last-child {
1304
+ border-bottom: none;
1305
+ }
1306
+ .fail-head {
1307
+ display: flex;
1308
+ gap: 8px;
1309
+ align-items: baseline;
1310
+ flex-wrap: wrap;
1311
+ }
1312
+ .fail-members {
1313
+ margin-top: 4px;
1314
+ }
1315
+
1316
+ .job-groups .job-group + .job-group {
1317
+ margin-top: 12px;
1318
+ }
1319
+ .job-action {
1320
+ display: inline-flex;
1321
+ flex-direction: column;
1322
+ gap: 2px;
1323
+ min-width: 220px;
1324
+ }
1325
+ /* Inside a dense table the twin must not widen the row — it scrolls itself. */
1326
+ .fleet .job-action {
1327
+ min-width: 0;
1328
+ max-width: 300px;
1329
+ }
1330
+ .fleet .twin-cmd {
1331
+ max-width: 220px;
1332
+ }
1333
+
1334
+ /* ── run console ───────────────────────────────────────────────────────── */
1335
+
1336
+ .hud {
1337
+ padding: 8px 12px;
1338
+ border: 1px solid var(--rule);
1339
+ border-radius: var(--radius);
1340
+ background: var(--panel);
1341
+ margin-bottom: 8px;
1342
+ }
1343
+ .run-banner {
1344
+ display: flex;
1345
+ flex-wrap: wrap;
1346
+ gap: 8px;
1347
+ align-items: center;
1348
+ margin-bottom: 8px;
1349
+ }
1350
+ .feed-wrap {
1351
+ max-height: 62vh;
1352
+ overflow-y: auto;
1353
+ border: 1px solid var(--rule);
1354
+ border-radius: var(--radius);
1355
+ padding: 8px 10px;
1356
+ background: var(--panel);
1357
+ }
1358
+ .run-feed .fold {
1359
+ margin: 3px 0;
1360
+ }
1361
+ .feed-prose {
1362
+ margin: 4px 0;
1363
+ font-family: var(--mono);
1364
+ font-size: 12px;
1365
+ }
1366
+
1367
+ /* ── four-lane timeline ────────────────────────────────────────────────── */
1368
+
1369
+ .lanes {
1370
+ display: grid;
1371
+ grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
1372
+ gap: 10px;
1373
+ }
1374
+ .lane-card {
1375
+ margin: 0;
1376
+ }
1377
+ /* Lane titles carry a dot-pair whose label is a sentence — let it wrap
1378
+ rather than clip inside a narrow column. */
1379
+ .lane-card .card-title {
1380
+ flex-wrap: wrap;
1381
+ }
1382
+ .lane-card .dot-pair,
1383
+ .lane-card .dot-label {
1384
+ white-space: normal;
1385
+ }
1386
+ .lane-off {
1387
+ opacity: 0.72;
1388
+ }
1389
+ .lane-phase {
1390
+ margin-bottom: 8px;
1391
+ }
1392
+ .lane-actions {
1393
+ border-top: 1px solid var(--rule);
1394
+ padding-top: 8px;
1395
+ }
1396
+
1397
+ /* ── inboxes ───────────────────────────────────────────────────────────── */
1398
+
1399
+ .inbox-hint {
1400
+ font-size: 12px;
1401
+ margin: 6px 0;
1402
+ }
1403
+ .keyhelp,
1404
+ .rowmenu {
1405
+ margin: 6px 0;
1406
+ }
1407
+ .keyhelp kbd {
1408
+ display: inline-block;
1409
+ min-width: 42px;
1410
+ color: var(--accent);
1411
+ }
1412
+ .rowmenu-body {
1413
+ display: flex;
1414
+ gap: 8px;
1415
+ flex-wrap: wrap;
1416
+ }
1417
+ .inbox-card {
1418
+ border-left: 3px solid transparent;
1419
+ }
1420
+ .inbox-card.selected {
1421
+ border-left-color: var(--accent);
1422
+ background: var(--panel-2);
1423
+ }
1424
+ .inbox-head {
1425
+ display: flex;
1426
+ flex-wrap: wrap;
1427
+ align-items: center;
1428
+ gap: 8px;
1429
+ margin-bottom: 6px;
1430
+ }
1431
+ .inbox-actions {
1432
+ display: flex;
1433
+ gap: 8px;
1434
+ flex-wrap: wrap;
1435
+ margin-top: 8px;
1436
+ }
1437
+ .inbox-twins {
1438
+ margin-top: 4px;
1439
+ }
1440
+ .activity-row {
1441
+ display: flex;
1442
+ gap: 10px;
1443
+ align-items: baseline;
1444
+ flex-wrap: wrap;
1445
+ }
1446
+
1447
+ /* ==========================================================================
1448
+ M4 — health score, omnibox, bindings sheet, onboarding, settings, panes
1449
+ ========================================================================== */
1450
+
1451
+ /* ── the read-only / mode banner strip ─────────────────────────────────── */
1452
+
1453
+ .banner-slot:empty {
1454
+ display: none;
1455
+ }
1456
+ .banner {
1457
+ display: flex;
1458
+ flex-wrap: wrap;
1459
+ align-items: center;
1460
+ gap: 10px;
1461
+ padding: 8px 16px;
1462
+ border-bottom: 1px solid var(--rule);
1463
+ background: var(--panel-2);
1464
+ font-size: 13px;
1465
+ }
1466
+ .banner-warn {
1467
+ border-left: 3px solid var(--warn);
1468
+ }
1469
+ .banner-link {
1470
+ color: var(--accent);
1471
+ }
1472
+
1473
+ /* ── health score (HM-11): the number never appears alone ──────────────── */
1474
+
1475
+ .health-head {
1476
+ display: flex;
1477
+ align-items: baseline;
1478
+ gap: 8px;
1479
+ flex-wrap: wrap;
1480
+ }
1481
+ .health-score {
1482
+ font-family: var(--mono);
1483
+ font-size: 30px;
1484
+ font-weight: 600;
1485
+ line-height: 1.1;
1486
+ }
1487
+ .health-good {
1488
+ color: var(--ok);
1489
+ }
1490
+ .health-fair {
1491
+ color: var(--warn);
1492
+ }
1493
+ .health-poor {
1494
+ color: var(--bad);
1495
+ }
1496
+ .health-of {
1497
+ font-size: 13px;
1498
+ }
1499
+ .health-row-head {
1500
+ margin-bottom: 4px;
1501
+ }
1502
+ .health-name {
1503
+ font-weight: 600;
1504
+ color: var(--accent);
1505
+ }
1506
+ .ded-list {
1507
+ list-style: none;
1508
+ margin: 10px 0 0;
1509
+ padding: 0;
1510
+ display: flex;
1511
+ flex-direction: column;
1512
+ gap: 8px;
1513
+ }
1514
+ .ded-row {
1515
+ display: grid;
1516
+ grid-template-columns: 44px 1fr auto;
1517
+ gap: 4px 10px;
1518
+ align-items: baseline;
1519
+ padding-top: 8px;
1520
+ border-top: 1px solid var(--rule);
1521
+ }
1522
+ .ded-points {
1523
+ color: var(--bad);
1524
+ font-weight: 600;
1525
+ }
1526
+ .ded-label {
1527
+ font-weight: 500;
1528
+ }
1529
+ .ded-detail {
1530
+ grid-column: 2 / 4;
1531
+ font-size: 12px;
1532
+ }
1533
+ .ded-fix {
1534
+ color: var(--accent);
1535
+ font-size: 12px;
1536
+ white-space: nowrap;
1537
+ }
1538
+
1539
+ /* ── ⌘K omnibox (HM-189) ───────────────────────────────────────────────── */
1540
+
1541
+ .omni-open {
1542
+ display: inline-flex;
1543
+ align-items: center;
1544
+ gap: 6px;
1545
+ }
1546
+ .omni-open kbd {
1547
+ border: 1px solid var(--rule-2);
1548
+ border-radius: 4px;
1549
+ padding: 0 4px;
1550
+ font-size: 11px;
1551
+ color: var(--ink-2);
1552
+ }
1553
+ .omni-backdrop,
1554
+ .sheet-backdrop {
1555
+ position: fixed;
1556
+ inset: 0;
1557
+ z-index: 60;
1558
+ background: rgba(0, 0, 0, 0.45);
1559
+ display: flex;
1560
+ justify-content: center;
1561
+ align-items: flex-start;
1562
+ padding: 10vh 16px 16px;
1563
+ overflow-y: auto;
1564
+ }
1565
+ .omni-panel {
1566
+ width: min(760px, 100%);
1567
+ background: var(--panel);
1568
+ border: 1px solid var(--rule-2);
1569
+ border-radius: var(--radius);
1570
+ box-shadow: 0 24px 64px rgba(0, 0, 0, 0.4);
1571
+ overflow: hidden;
1572
+ }
1573
+ .omni-input {
1574
+ width: 100%;
1575
+ font: inherit;
1576
+ font-size: 16px;
1577
+ color: var(--ink);
1578
+ background: transparent;
1579
+ border: 0;
1580
+ border-bottom: 1px solid var(--rule);
1581
+ padding: 14px 16px;
1582
+ }
1583
+ .omni-input:focus {
1584
+ outline: none;
1585
+ border-bottom-color: var(--accent);
1586
+ }
1587
+ .omni-list {
1588
+ max-height: 52vh;
1589
+ overflow-y: auto;
1590
+ }
1591
+ .omni-row {
1592
+ display: grid;
1593
+ grid-template-columns: 84px 1fr auto;
1594
+ gap: 10px;
1595
+ align-items: baseline;
1596
+ padding: 8px 16px;
1597
+ border-bottom: 1px solid var(--rule);
1598
+ color: var(--ink);
1599
+ }
1600
+ .omni-row.selected {
1601
+ background: var(--panel-2);
1602
+ box-shadow: inset 3px 0 0 var(--accent);
1603
+ }
1604
+ .omni-kind {
1605
+ font-family: var(--mono);
1606
+ font-size: 11px;
1607
+ color: var(--ink-2);
1608
+ text-transform: lowercase;
1609
+ }
1610
+ .omni-title {
1611
+ font-weight: 500;
1612
+ }
1613
+ .omni-sub {
1614
+ font-size: 12px;
1615
+ justify-self: end;
1616
+ max-width: 46%;
1617
+ overflow: hidden;
1618
+ text-overflow: ellipsis;
1619
+ white-space: nowrap;
1620
+ }
1621
+ .omni-action {
1622
+ border-left: 3px solid var(--warn);
1623
+ }
1624
+ .omni-twin {
1625
+ grid-column: 2 / 3;
1626
+ font-size: 12px;
1627
+ color: var(--ink-2);
1628
+ }
1629
+ .omni-confirm {
1630
+ display: flex;
1631
+ gap: 6px;
1632
+ }
1633
+ .omni-hint {
1634
+ padding: 8px 16px;
1635
+ font-size: 12px;
1636
+ border-top: 1px solid var(--rule);
1637
+ }
1638
+
1639
+ /* ── the `?` bindings sheet (HM-190) ───────────────────────────────────── */
1640
+
1641
+ .sheet {
1642
+ width: min(520px, 100%);
1643
+ }
1644
+ .sheet-section {
1645
+ margin: 12px 0 4px;
1646
+ font-size: 12px;
1647
+ text-transform: uppercase;
1648
+ letter-spacing: 0.06em;
1649
+ color: var(--ink-2);
1650
+ }
1651
+ .sheet kbd {
1652
+ display: inline-block;
1653
+ min-width: 92px;
1654
+ color: var(--accent);
1655
+ }
1656
+
1657
+ /* ── onboarding + settings forms ───────────────────────────────────────── */
1658
+
1659
+ .suggest-row {
1660
+ display: flex;
1661
+ flex-wrap: wrap;
1662
+ align-items: center;
1663
+ gap: 10px;
1664
+ }
1665
+ .field-inline {
1666
+ display: inline-flex;
1667
+ align-items: center;
1668
+ gap: 6px;
1669
+ font-size: 12px;
1670
+ color: var(--ink-2);
1671
+ }
1672
+ .num-input {
1673
+ width: 84px;
1674
+ }
1675
+ .note {
1676
+ font-size: 12px;
1677
+ }
1678
+ .rules-table td,
1679
+ .rules-table th {
1680
+ vertical-align: middle;
1681
+ }
1682
+ .plugin-row {
1683
+ display: flex;
1684
+ flex-direction: column;
1685
+ gap: 4px;
1686
+ padding-top: 8px;
1687
+ border-top: 1px solid var(--rule);
1688
+ }
1689
+
1690
+ /* ── sandboxed plugin panes (HM-179) ───────────────────────────────────── */
1691
+
1692
+ .pane-frame {
1693
+ width: 100%;
1694
+ min-height: 240px;
1695
+ border: 1px solid var(--rule-2);
1696
+ border-radius: var(--radius-sm);
1697
+ background: var(--panel-2);
1698
+ }
1699
+
1700
+ /* ── narrow screens: the overlays become full-bleed ────────────────────── */
1701
+
1702
+ @media (max-width: 720px) {
1703
+ .omni-backdrop,
1704
+ .sheet-backdrop {
1705
+ padding: 0;
1706
+ }
1707
+ .omni-panel,
1708
+ .sheet {
1709
+ width: 100%;
1710
+ border-radius: 0;
1711
+ min-height: 100%;
1712
+ }
1713
+ .omni-row {
1714
+ grid-template-columns: 1fr;
1715
+ }
1716
+ .omni-sub {
1717
+ justify-self: start;
1718
+ max-width: 100%;
1719
+ }
1720
+ .ded-row {
1721
+ grid-template-columns: 44px 1fr;
1722
+ }
1723
+ .ded-fix {
1724
+ grid-column: 2 / 3;
1725
+ }
1726
+ }