@validation-os/dashboard 0.4.0 → 0.6.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.
@@ -0,0 +1,2035 @@
1
+ /*
2
+ * @validation-os/dashboard — the dashboard's own styling.
3
+ *
4
+ * The styling seam (OPS-1280): the package ships this token sheet + the
5
+ * semantic classes its components render, so the whole dashboard is
6
+ * self-contained. A thin instance imports it once
7
+ * (`import "@validation-os/dashboard/styles.css"`) and provides no Tailwind, no
8
+ * design token, no CSS of its own. Tokens are the signed-off prototype's:
9
+ * accent + semantic good/warn/crit, surfaces/borders, radius/shadow, mono/sans,
10
+ * covering both light and dark.
11
+ *
12
+ * Theme: the OS preference drives it by default (`prefers-color-scheme`); the
13
+ * topbar toggle stamps `data-theme` on the document element, which wins in both
14
+ * directions.
15
+ *
16
+ * Class prefix is `vos-` throughout so nothing collides with a host's own CSS.
17
+ */
18
+
19
+ :root {
20
+ --vos-bg: #f7f8fa;
21
+ --vos-surface: #fff;
22
+ --vos-surface-2: #f1f3f6;
23
+ --vos-border: #e4e7ec;
24
+ --vos-border-strong: #d3d8e0;
25
+ --vos-text: #171a1f;
26
+ --vos-muted: #667085;
27
+ --vos-faint: #98a2b3;
28
+ --vos-accent: #4a43d6;
29
+ --vos-accent-weak: #ece9fb;
30
+ --vos-accent-text: #4a43d6;
31
+ --vos-good: #0e9f6e;
32
+ --vos-good-weak: #e3f5ed;
33
+ --vos-warn: #c77700;
34
+ --vos-warn-weak: #fbf0dc;
35
+ --vos-crit: #d64550;
36
+ --vos-crit-weak: #fbe6e8;
37
+ --vos-radius: 8px;
38
+ --vos-mono: ui-monospace, "SF Mono", Menlo, Consolas, monospace;
39
+ --vos-sans: ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;
40
+ --vos-shadow: 0 1px 2px rgba(16, 24, 40, 0.06), 0 1px 3px rgba(16, 24, 40, 0.1);
41
+ --vos-shadow-lg: 0 8px 32px rgba(16, 24, 40, 0.14);
42
+ }
43
+
44
+ @media (prefers-color-scheme: dark) {
45
+ :root {
46
+ --vos-bg: #0c0e12;
47
+ --vos-surface: #14171d;
48
+ --vos-surface-2: #1b1f27;
49
+ --vos-border: #262b34;
50
+ --vos-border-strong: #333a45;
51
+ --vos-text: #e7e9ee;
52
+ --vos-muted: #98a2b3;
53
+ --vos-faint: #6b7484;
54
+ --vos-accent: #8b83f5;
55
+ --vos-accent-weak: #201d3a;
56
+ --vos-accent-text: #a9a2fb;
57
+ --vos-good: #38c793;
58
+ --vos-good-weak: #10261e;
59
+ --vos-warn: #e6a23c;
60
+ --vos-warn-weak: #2a2010;
61
+ --vos-crit: #f0656f;
62
+ --vos-crit-weak: #2c1417;
63
+ --vos-shadow: 0 1px 2px rgba(0, 0, 0, 0.3);
64
+ --vos-shadow-lg: 0 12px 40px rgba(0, 0, 0, 0.5);
65
+ }
66
+ }
67
+
68
+ :root[data-theme="light"] {
69
+ --vos-bg: #f7f8fa;
70
+ --vos-surface: #fff;
71
+ --vos-surface-2: #f1f3f6;
72
+ --vos-border: #e4e7ec;
73
+ --vos-border-strong: #d3d8e0;
74
+ --vos-text: #171a1f;
75
+ --vos-muted: #667085;
76
+ --vos-faint: #98a2b3;
77
+ --vos-accent: #4a43d6;
78
+ --vos-accent-weak: #ece9fb;
79
+ --vos-accent-text: #4a43d6;
80
+ --vos-good: #0e9f6e;
81
+ --vos-good-weak: #e3f5ed;
82
+ --vos-warn: #c77700;
83
+ --vos-warn-weak: #fbf0dc;
84
+ --vos-crit: #d64550;
85
+ --vos-crit-weak: #fbe6e8;
86
+ --vos-shadow: 0 1px 2px rgba(16, 24, 40, 0.06), 0 1px 3px rgba(16, 24, 40, 0.1);
87
+ --vos-shadow-lg: 0 8px 32px rgba(16, 24, 40, 0.14);
88
+ }
89
+
90
+ :root[data-theme="dark"] {
91
+ --vos-bg: #0c0e12;
92
+ --vos-surface: #14171d;
93
+ --vos-surface-2: #1b1f27;
94
+ --vos-border: #262b34;
95
+ --vos-border-strong: #333a45;
96
+ --vos-text: #e7e9ee;
97
+ --vos-muted: #98a2b3;
98
+ --vos-faint: #6b7484;
99
+ --vos-accent: #8b83f5;
100
+ --vos-accent-weak: #201d3a;
101
+ --vos-accent-text: #a9a2fb;
102
+ --vos-good: #38c793;
103
+ --vos-good-weak: #10261e;
104
+ --vos-warn: #e6a23c;
105
+ --vos-warn-weak: #2a2010;
106
+ --vos-crit: #f0656f;
107
+ --vos-crit-weak: #2c1417;
108
+ --vos-shadow: 0 1px 2px rgba(0, 0, 0, 0.3);
109
+ --vos-shadow-lg: 0 12px 40px rgba(0, 0, 0, 0.5);
110
+ }
111
+
112
+ /* Everything the dashboard renders lives under .vos-app; scoping the reset
113
+ * there keeps the package from touching a host's own elements. */
114
+ .vos-app,
115
+ .vos-app *,
116
+ .vos-drawer,
117
+ .vos-drawer *,
118
+ .vos-scrim {
119
+ box-sizing: border-box;
120
+ }
121
+
122
+ .vos-app {
123
+ display: grid;
124
+ grid-template-columns: 240px 1fr;
125
+ grid-template-rows: 52px 1fr;
126
+ grid-template-areas:
127
+ "brand topbar"
128
+ "nav main";
129
+ height: 100vh;
130
+ background: var(--vos-bg);
131
+ color: var(--vos-text);
132
+ font-family: var(--vos-sans);
133
+ font-size: 14px;
134
+ line-height: 1.45;
135
+ -webkit-font-smoothing: antialiased;
136
+ }
137
+
138
+ .vos-num {
139
+ font-variant-numeric: tabular-nums;
140
+ font-family: var(--vos-mono);
141
+ }
142
+
143
+ /* ── frame ─────────────────────────────────────────────────────────────── */
144
+ .vos-brand {
145
+ grid-area: brand;
146
+ display: flex;
147
+ align-items: center;
148
+ gap: 9px;
149
+ padding: 0 16px;
150
+ border-right: 1px solid var(--vos-border);
151
+ border-bottom: 1px solid var(--vos-border);
152
+ font-weight: 640;
153
+ letter-spacing: -0.01em;
154
+ }
155
+ .vos-brand-dot {
156
+ width: 22px;
157
+ height: 22px;
158
+ border-radius: 6px;
159
+ background: var(--vos-accent);
160
+ display: grid;
161
+ place-items: center;
162
+ color: #fff;
163
+ font-size: 12px;
164
+ font-weight: 700;
165
+ overflow: hidden;
166
+ }
167
+ .vos-brand-dot img {
168
+ width: 100%;
169
+ height: 100%;
170
+ object-fit: cover;
171
+ }
172
+
173
+ .vos-topbar {
174
+ grid-area: topbar;
175
+ display: flex;
176
+ align-items: center;
177
+ gap: 12px;
178
+ padding: 0 16px;
179
+ border-bottom: 1px solid var(--vos-border);
180
+ background: var(--vos-surface);
181
+ }
182
+ .vos-backend {
183
+ display: flex;
184
+ align-items: center;
185
+ gap: 8px;
186
+ font-size: 12.5px;
187
+ color: var(--vos-muted);
188
+ background: var(--vos-surface-2);
189
+ border: 1px solid var(--vos-border);
190
+ border-radius: 999px;
191
+ padding: 4px 11px;
192
+ }
193
+ .vos-backend b {
194
+ color: var(--vos-text);
195
+ font-weight: 600;
196
+ }
197
+ .vos-live-dot {
198
+ width: 7px;
199
+ height: 7px;
200
+ border-radius: 50%;
201
+ background: var(--vos-good);
202
+ box-shadow: 0 0 0 3px var(--vos-good-weak);
203
+ }
204
+ .vos-spacer {
205
+ flex: 1;
206
+ }
207
+ .vos-iconbtn {
208
+ border: 1px solid var(--vos-border);
209
+ background: var(--vos-surface);
210
+ color: var(--vos-muted);
211
+ border-radius: 7px;
212
+ height: 32px;
213
+ padding: 0 10px;
214
+ cursor: pointer;
215
+ font: inherit;
216
+ font-size: 13px;
217
+ }
218
+ .vos-iconbtn:hover {
219
+ border-color: var(--vos-border-strong);
220
+ color: var(--vos-text);
221
+ }
222
+ .vos-user {
223
+ display: flex;
224
+ align-items: center;
225
+ gap: 8px;
226
+ }
227
+ .vos-avatar {
228
+ width: 28px;
229
+ height: 28px;
230
+ border-radius: 50%;
231
+ background: linear-gradient(135deg, var(--vos-accent), #b6b1f7);
232
+ color: #fff;
233
+ display: grid;
234
+ place-items: center;
235
+ font-size: 12px;
236
+ font-weight: 700;
237
+ }
238
+ .vos-user-name {
239
+ font-weight: 600;
240
+ }
241
+ .vos-user small {
242
+ color: var(--vos-faint);
243
+ font-size: 11px;
244
+ display: block;
245
+ line-height: 1.1;
246
+ }
247
+
248
+ .vos-nav {
249
+ grid-area: nav;
250
+ border-right: 1px solid var(--vos-border);
251
+ background: var(--vos-surface);
252
+ padding: 8px;
253
+ overflow-y: auto;
254
+ }
255
+ .vos-nav-group {
256
+ font-size: 10.5px;
257
+ text-transform: uppercase;
258
+ letter-spacing: 0.07em;
259
+ color: var(--vos-faint);
260
+ padding: 12px 10px 5px;
261
+ }
262
+ .vos-nav-item {
263
+ display: flex;
264
+ align-items: center;
265
+ gap: 10px;
266
+ width: 100%;
267
+ padding: 7px 10px;
268
+ border: none;
269
+ border-radius: 7px;
270
+ background: transparent;
271
+ color: var(--vos-text);
272
+ text-align: left;
273
+ font: inherit;
274
+ font-weight: 500;
275
+ cursor: pointer;
276
+ }
277
+ .vos-nav-item:hover {
278
+ background: var(--vos-surface-2);
279
+ }
280
+ .vos-nav-item.is-active {
281
+ background: var(--vos-accent-weak);
282
+ color: var(--vos-accent-text);
283
+ font-weight: 600;
284
+ }
285
+ .vos-nav-item:focus-visible {
286
+ outline: 2px solid var(--vos-accent);
287
+ outline-offset: -2px;
288
+ }
289
+ .vos-nav-ic {
290
+ width: 16px;
291
+ text-align: center;
292
+ opacity: 0.7;
293
+ }
294
+ .vos-nav-item.is-active .vos-nav-ic {
295
+ opacity: 1;
296
+ }
297
+ .vos-nav-alert {
298
+ margin-left: auto;
299
+ display: inline-flex;
300
+ align-items: center;
301
+ justify-content: center;
302
+ min-width: 18px;
303
+ height: 18px;
304
+ padding: 0 5px;
305
+ border-radius: 999px;
306
+ background: var(--vos-crit);
307
+ color: #fff;
308
+ font-size: 11px;
309
+ font-weight: 600;
310
+ }
311
+ .vos-nav-count {
312
+ margin-left: auto;
313
+ font-size: 12px;
314
+ color: var(--vos-faint);
315
+ }
316
+ .vos-nav-alert + .vos-nav-count {
317
+ margin-left: 6px;
318
+ }
319
+ .vos-nav-item.is-active .vos-nav-count {
320
+ color: var(--vos-accent-text);
321
+ }
322
+ .vos-nav-default {
323
+ margin-left: auto;
324
+ font-size: 9px;
325
+ letter-spacing: 0.04em;
326
+ text-transform: uppercase;
327
+ color: var(--vos-faint);
328
+ border: 1px solid var(--vos-border);
329
+ border-radius: 4px;
330
+ padding: 1px 4px;
331
+ }
332
+ .vos-nav-item.is-active .vos-nav-default {
333
+ color: var(--vos-accent-text);
334
+ border-color: var(--vos-accent-text);
335
+ }
336
+
337
+ .vos-main {
338
+ grid-area: main;
339
+ overflow-y: auto;
340
+ padding: 20px 24px;
341
+ }
342
+ .vos-head {
343
+ display: flex;
344
+ align-items: flex-end;
345
+ gap: 14px;
346
+ margin-bottom: 18px;
347
+ }
348
+ .vos-head h1 {
349
+ margin: 0;
350
+ font-size: 21px;
351
+ letter-spacing: -0.02em;
352
+ }
353
+ .vos-head p {
354
+ margin: 3px 0 0;
355
+ color: var(--vos-muted);
356
+ font-size: 13px;
357
+ }
358
+ .vos-crumbs {
359
+ display: flex;
360
+ align-items: center;
361
+ gap: 7px;
362
+ font-size: 12.5px;
363
+ color: var(--vos-muted);
364
+ margin-bottom: 14px;
365
+ }
366
+ .vos-crumbs button {
367
+ border: none;
368
+ background: none;
369
+ color: var(--vos-accent-text);
370
+ cursor: pointer;
371
+ font: inherit;
372
+ padding: 0;
373
+ }
374
+ .vos-crumbs button:hover {
375
+ text-decoration: underline;
376
+ }
377
+
378
+ /* ── buttons ───────────────────────────────────────────────────────────── */
379
+ .vos-btn {
380
+ border: 1px solid var(--vos-accent);
381
+ background: var(--vos-accent);
382
+ color: #fff;
383
+ border-radius: 7px;
384
+ height: 34px;
385
+ padding: 0 14px;
386
+ font: inherit;
387
+ font-weight: 600;
388
+ cursor: pointer;
389
+ display: inline-flex;
390
+ align-items: center;
391
+ gap: 6px;
392
+ }
393
+ .vos-btn:hover {
394
+ filter: brightness(1.06);
395
+ }
396
+ .vos-btn:disabled {
397
+ opacity: 0.5;
398
+ cursor: default;
399
+ }
400
+ .vos-btn-ghost {
401
+ background: var(--vos-surface);
402
+ color: var(--vos-text);
403
+ border-color: var(--vos-border-strong);
404
+ }
405
+ .vos-btn-ghost:hover {
406
+ background: var(--vos-surface-2);
407
+ filter: none;
408
+ }
409
+ .vos-btn-sm {
410
+ height: 28px;
411
+ padding: 0 10px;
412
+ font-size: 12.5px;
413
+ }
414
+
415
+ /* ── card + table ──────────────────────────────────────────────────────── */
416
+ .vos-card {
417
+ background: var(--vos-surface);
418
+ border: 1px solid var(--vos-border);
419
+ border-radius: var(--vos-radius);
420
+ box-shadow: var(--vos-shadow);
421
+ overflow: hidden;
422
+ }
423
+ .vos-table-scroll {
424
+ overflow-x: auto;
425
+ }
426
+ .vos-table {
427
+ width: 100%;
428
+ border-collapse: collapse;
429
+ }
430
+ .vos-table thead th {
431
+ text-align: left;
432
+ font-size: 11px;
433
+ text-transform: uppercase;
434
+ letter-spacing: 0.05em;
435
+ color: var(--vos-faint);
436
+ font-weight: 600;
437
+ padding: 10px 14px;
438
+ border-bottom: 1px solid var(--vos-border);
439
+ background: var(--vos-surface-2);
440
+ }
441
+ .vos-table thead th.vos-r,
442
+ .vos-table td.vos-r {
443
+ text-align: right;
444
+ }
445
+ .vos-table tbody td {
446
+ padding: 11px 14px;
447
+ border-bottom: 1px solid var(--vos-border);
448
+ vertical-align: middle;
449
+ }
450
+ .vos-table tbody tr {
451
+ cursor: pointer;
452
+ }
453
+ .vos-table tbody tr:last-child td {
454
+ border-bottom: none;
455
+ }
456
+ .vos-table tbody tr:hover td {
457
+ background: var(--vos-surface-2);
458
+ }
459
+ .vos-table tbody tr.is-selected td {
460
+ background: var(--vos-accent-weak);
461
+ }
462
+ .vos-table tbody tr:focus-visible {
463
+ outline: 2px solid var(--vos-accent);
464
+ outline-offset: -2px;
465
+ }
466
+ .vos-rid {
467
+ font-family: var(--vos-mono);
468
+ font-size: 12px;
469
+ color: var(--vos-muted);
470
+ }
471
+ .vos-ttl {
472
+ font-weight: 550;
473
+ max-width: 400px;
474
+ color: var(--vos-text);
475
+ }
476
+ .vos-empty {
477
+ padding: 40px;
478
+ text-align: center;
479
+ color: var(--vos-muted);
480
+ border: 1px dashed var(--vos-border-strong);
481
+ border-radius: var(--vos-radius);
482
+ }
483
+
484
+ /* ── pill ──────────────────────────────────────────────────────────────── */
485
+ .vos-pill {
486
+ display: inline-flex;
487
+ align-items: center;
488
+ gap: 5px;
489
+ font-size: 11.5px;
490
+ font-weight: 600;
491
+ padding: 2px 9px;
492
+ border-radius: 999px;
493
+ white-space: nowrap;
494
+ color: var(--vos-muted);
495
+ background: var(--vos-surface-2);
496
+ }
497
+ .vos-pill::before {
498
+ content: "";
499
+ width: 6px;
500
+ height: 6px;
501
+ border-radius: 50%;
502
+ background: currentColor;
503
+ }
504
+ .vos-pill-good {
505
+ color: var(--vos-good);
506
+ background: var(--vos-good-weak);
507
+ }
508
+ .vos-pill-warn {
509
+ color: var(--vos-warn);
510
+ background: var(--vos-warn-weak);
511
+ }
512
+ .vos-pill-crit {
513
+ color: var(--vos-crit);
514
+ background: var(--vos-crit-weak);
515
+ }
516
+ .vos-pill-accent {
517
+ color: var(--vos-accent-text);
518
+ background: var(--vos-accent-weak);
519
+ }
520
+ .vos-pill-neutral {
521
+ color: var(--vos-muted);
522
+ background: var(--vos-surface-2);
523
+ }
524
+
525
+ /* ── risk bar + in-row confidence ──────────────────────────────────────── */
526
+ .vos-metric-cell {
527
+ display: inline-flex;
528
+ align-items: center;
529
+ gap: 9px;
530
+ justify-content: flex-end;
531
+ }
532
+ .vos-risk-bar {
533
+ width: 46px;
534
+ height: 6px;
535
+ border-radius: 3px;
536
+ background: var(--vos-surface-2);
537
+ overflow: hidden;
538
+ position: relative;
539
+ }
540
+ .vos-risk-bar i {
541
+ position: absolute;
542
+ left: 0;
543
+ top: 0;
544
+ bottom: 0;
545
+ border-radius: 3px;
546
+ }
547
+ .vos-fill-good {
548
+ background: var(--vos-good);
549
+ }
550
+ .vos-fill-warn {
551
+ background: var(--vos-warn);
552
+ }
553
+ .vos-fill-crit {
554
+ background: var(--vos-crit);
555
+ }
556
+ .vos-metric-num {
557
+ font-family: var(--vos-mono);
558
+ font-variant-numeric: tabular-nums;
559
+ font-weight: 700;
560
+ min-width: 30px;
561
+ text-align: right;
562
+ }
563
+ .vos-text-good {
564
+ color: var(--vos-good);
565
+ }
566
+ .vos-text-warn {
567
+ color: var(--vos-warn);
568
+ }
569
+ .vos-text-crit {
570
+ color: var(--vos-crit);
571
+ }
572
+ .vos-spark {
573
+ vertical-align: middle;
574
+ display: inline-block;
575
+ }
576
+
577
+ /* ── stat tile (counts landing / glanceable) ───────────────────────────── */
578
+ .vos-tile-grid {
579
+ display: grid;
580
+ grid-template-columns: repeat(auto-fill, minmax(180px, 1fr));
581
+ gap: 12px;
582
+ }
583
+ .vos-tile {
584
+ display: block;
585
+ text-align: left;
586
+ text-decoration: none;
587
+ color: inherit;
588
+ background: var(--vos-surface);
589
+ border: 1px solid var(--vos-border);
590
+ border-radius: var(--vos-radius);
591
+ box-shadow: var(--vos-shadow);
592
+ padding: 16px;
593
+ font: inherit;
594
+ cursor: default;
595
+ }
596
+ a.vos-tile,
597
+ button.vos-tile {
598
+ cursor: pointer;
599
+ }
600
+ a.vos-tile:hover,
601
+ button.vos-tile:hover {
602
+ border-color: var(--vos-border-strong);
603
+ background: var(--vos-surface-2);
604
+ }
605
+ .vos-tile-label {
606
+ font-size: 13px;
607
+ font-weight: 500;
608
+ color: var(--vos-muted);
609
+ }
610
+ .vos-tile-value {
611
+ margin-top: 4px;
612
+ font-family: var(--vos-mono);
613
+ font-variant-numeric: tabular-nums;
614
+ font-size: 28px;
615
+ font-weight: 700;
616
+ letter-spacing: -0.02em;
617
+ color: var(--vos-text);
618
+ }
619
+ .vos-tile-sub {
620
+ margin-top: 2px;
621
+ font-size: 12px;
622
+ color: var(--vos-faint);
623
+ }
624
+
625
+ /* ── drawer ────────────────────────────────────────────────────────────── */
626
+ .vos-scrim {
627
+ position: fixed;
628
+ inset: 0;
629
+ background: rgba(16, 24, 40, 0.36);
630
+ z-index: 40;
631
+ }
632
+ .vos-drawer {
633
+ position: fixed;
634
+ top: 0;
635
+ right: 0;
636
+ height: 100vh;
637
+ width: 500px;
638
+ max-width: 96vw;
639
+ background: var(--vos-surface);
640
+ border-left: 1px solid var(--vos-border);
641
+ box-shadow: var(--vos-shadow-lg);
642
+ z-index: 50;
643
+ display: flex;
644
+ flex-direction: column;
645
+ color: var(--vos-text);
646
+ font-family: var(--vos-sans);
647
+ font-size: 14px;
648
+ outline: none;
649
+ }
650
+ .vos-drawer-header {
651
+ display: flex;
652
+ align-items: center;
653
+ gap: 10px;
654
+ padding: 12px 16px;
655
+ border-bottom: 1px solid var(--vos-border);
656
+ }
657
+ .vos-drawer-eyebrow {
658
+ font-size: 11px;
659
+ text-transform: uppercase;
660
+ letter-spacing: 0.05em;
661
+ color: var(--vos-faint);
662
+ font-weight: 600;
663
+ }
664
+ .vos-drawer-title {
665
+ margin: 2px 0 0;
666
+ font-size: 17px;
667
+ font-weight: 600;
668
+ letter-spacing: -0.01em;
669
+ }
670
+ .vos-drawer-body {
671
+ padding: 18px;
672
+ overflow-y: auto;
673
+ flex: 1;
674
+ display: flex;
675
+ flex-direction: column;
676
+ gap: 16px;
677
+ }
678
+ .vos-drawer-footer {
679
+ padding: 12px 16px;
680
+ border-top: 1px solid var(--vos-border);
681
+ display: flex;
682
+ gap: 8px;
683
+ align-items: center;
684
+ justify-content: flex-end;
685
+ font-size: 12px;
686
+ color: var(--vos-faint);
687
+ }
688
+ .vos-verbadge {
689
+ font-family: var(--vos-mono);
690
+ font-size: 11px;
691
+ color: var(--vos-muted);
692
+ background: var(--vos-surface-2);
693
+ border: 1px solid var(--vos-border);
694
+ border-radius: 5px;
695
+ padding: 2px 7px;
696
+ }
697
+
698
+ /* ── derived hero ──────────────────────────────────────────────────────── */
699
+ .vos-derived {
700
+ border: 1px solid var(--vos-border);
701
+ border-radius: var(--vos-radius);
702
+ overflow: hidden;
703
+ }
704
+ .vos-derived-head {
705
+ display: flex;
706
+ align-items: center;
707
+ gap: 8px;
708
+ padding: 9px 12px;
709
+ background: var(--vos-surface-2);
710
+ border-bottom: 1px solid var(--vos-border);
711
+ font-size: 11px;
712
+ text-transform: uppercase;
713
+ letter-spacing: 0.05em;
714
+ color: var(--vos-muted);
715
+ font-weight: 700;
716
+ }
717
+ .vos-lock {
718
+ font-size: 11px;
719
+ color: var(--vos-faint);
720
+ text-transform: none;
721
+ letter-spacing: 0;
722
+ margin-left: auto;
723
+ font-weight: 500;
724
+ }
725
+ .vos-dgrid {
726
+ display: grid;
727
+ grid-template-columns: 1fr 1fr;
728
+ }
729
+ .vos-dcell {
730
+ padding: 12px;
731
+ border-right: 1px solid var(--vos-border);
732
+ border-bottom: 1px solid var(--vos-border);
733
+ }
734
+ .vos-dcell:nth-child(2n) {
735
+ border-right: none;
736
+ }
737
+ .vos-dcell:nth-last-child(-n + 2) {
738
+ border-bottom: none;
739
+ }
740
+ .vos-dcell-k {
741
+ font-size: 11px;
742
+ color: var(--vos-faint);
743
+ text-transform: uppercase;
744
+ letter-spacing: 0.04em;
745
+ display: flex;
746
+ align-items: center;
747
+ gap: 6px;
748
+ }
749
+ .vos-why {
750
+ font-size: 10.5px;
751
+ color: var(--vos-accent-text);
752
+ cursor: pointer;
753
+ font-weight: 600;
754
+ letter-spacing: 0;
755
+ text-transform: none;
756
+ border: none;
757
+ background: none;
758
+ padding: 0;
759
+ }
760
+ .vos-dcell-v {
761
+ font-family: var(--vos-mono);
762
+ font-size: 22px;
763
+ font-weight: 700;
764
+ margin-top: 3px;
765
+ letter-spacing: -0.02em;
766
+ }
767
+ .vos-dcell-sub {
768
+ font-size: 11px;
769
+ color: var(--vos-muted);
770
+ margin-top: 2px;
771
+ }
772
+
773
+ /* ── understanding / movers ────────────────────────────────────────────── */
774
+ .vos-why-panel {
775
+ border: 1px solid var(--vos-border);
776
+ border-top: none;
777
+ border-radius: 0 0 var(--vos-radius) var(--vos-radius);
778
+ padding: 10px 12px;
779
+ display: flex;
780
+ flex-direction: column;
781
+ gap: 10px;
782
+ background: var(--vos-bg);
783
+ margin-top: -16px;
784
+ }
785
+ .vos-why-section-title {
786
+ font-size: 11px;
787
+ color: var(--vos-faint);
788
+ text-transform: uppercase;
789
+ letter-spacing: 0.04em;
790
+ font-weight: 700;
791
+ }
792
+ .vos-mover {
793
+ display: flex;
794
+ align-items: center;
795
+ gap: 9px;
796
+ font-size: 12.5px;
797
+ }
798
+ .vos-mover-name {
799
+ flex: 1;
800
+ min-width: 0;
801
+ overflow: hidden;
802
+ text-overflow: ellipsis;
803
+ white-space: nowrap;
804
+ }
805
+ .vos-mover-note {
806
+ font-size: 11px;
807
+ color: var(--vos-muted);
808
+ }
809
+ .vos-mover-note.vos-text-warn {
810
+ color: var(--vos-warn);
811
+ font-weight: 600;
812
+ }
813
+ .vos-mover-note.vos-text-good {
814
+ color: var(--vos-good);
815
+ font-weight: 600;
816
+ }
817
+ .vos-track {
818
+ flex: 0 0 90px;
819
+ height: 7px;
820
+ background: var(--vos-surface-2);
821
+ border-radius: 4px;
822
+ position: relative;
823
+ }
824
+ .vos-track.vos-signed::before {
825
+ content: "";
826
+ position: absolute;
827
+ left: 50%;
828
+ top: -2px;
829
+ bottom: -2px;
830
+ width: 1px;
831
+ background: var(--vos-border-strong);
832
+ }
833
+ .vos-track i {
834
+ position: absolute;
835
+ top: 0;
836
+ bottom: 0;
837
+ border-radius: 4px;
838
+ }
839
+ .vos-mover-val {
840
+ font-family: var(--vos-mono);
841
+ font-size: 12px;
842
+ font-weight: 700;
843
+ width: 40px;
844
+ text-align: right;
845
+ }
846
+
847
+ /* ── trajectory ────────────────────────────────────────────────────────── */
848
+ .vos-traj {
849
+ border: 1px solid var(--vos-border);
850
+ border-radius: var(--vos-radius);
851
+ padding: 12px;
852
+ }
853
+ .vos-traj-head {
854
+ display: flex;
855
+ align-items: center;
856
+ margin-bottom: 8px;
857
+ }
858
+ .vos-traj-head .vos-lbl {
859
+ font-size: 11px;
860
+ text-transform: uppercase;
861
+ letter-spacing: 0.05em;
862
+ color: var(--vos-faint);
863
+ font-weight: 700;
864
+ }
865
+ .vos-traj-foot {
866
+ display: flex;
867
+ justify-content: space-between;
868
+ margin-top: 6px;
869
+ font-size: 11px;
870
+ color: var(--vos-faint);
871
+ }
872
+
873
+ /* ── fields (edit + create) ────────────────────────────────────────────── */
874
+ .vos-field label,
875
+ .vos-field-label {
876
+ display: block;
877
+ font-size: 11px;
878
+ text-transform: uppercase;
879
+ letter-spacing: 0.05em;
880
+ color: var(--vos-faint);
881
+ font-weight: 600;
882
+ margin-bottom: 5px;
883
+ }
884
+ .vos-req {
885
+ color: var(--vos-crit);
886
+ }
887
+ .vos-form {
888
+ display: flex;
889
+ flex-direction: column;
890
+ height: 100%;
891
+ }
892
+ .vos-form-body {
893
+ flex: 1;
894
+ overflow-y: auto;
895
+ padding: 18px;
896
+ display: flex;
897
+ flex-direction: column;
898
+ gap: 14px;
899
+ }
900
+ .vos-input {
901
+ width: 100%;
902
+ border: 1px solid var(--vos-border-strong);
903
+ background: var(--vos-bg);
904
+ color: var(--vos-text);
905
+ border-radius: 7px;
906
+ padding: 8px 10px;
907
+ font: inherit;
908
+ }
909
+ textarea.vos-input {
910
+ resize: vertical;
911
+ min-height: 52px;
912
+ }
913
+ .vos-input:focus {
914
+ outline: 2px solid var(--vos-accent);
915
+ outline-offset: -1px;
916
+ border-color: var(--vos-accent);
917
+ }
918
+ .vos-row2 {
919
+ display: grid;
920
+ grid-template-columns: 1fr 1fr;
921
+ gap: 12px;
922
+ }
923
+ .vos-field-stack {
924
+ display: flex;
925
+ flex-direction: column;
926
+ gap: 14px;
927
+ }
928
+ .vos-sectitle {
929
+ font-size: 11px;
930
+ text-transform: uppercase;
931
+ letter-spacing: 0.05em;
932
+ color: var(--vos-faint);
933
+ font-weight: 700;
934
+ margin-bottom: 8px;
935
+ }
936
+ .vos-relation {
937
+ border-top: 1px solid var(--vos-border);
938
+ padding: 16px 18px;
939
+ }
940
+
941
+ /* ── banners ───────────────────────────────────────────────────────────── */
942
+ .vos-banner {
943
+ padding: 11px 12px;
944
+ border-radius: 8px;
945
+ font-size: 12.5px;
946
+ display: flex;
947
+ align-items: flex-start;
948
+ gap: 9px;
949
+ }
950
+ .vos-banner-warn {
951
+ background: var(--vos-warn-weak);
952
+ color: var(--vos-warn);
953
+ border: 1px solid var(--vos-warn);
954
+ }
955
+ .vos-banner-crit {
956
+ background: var(--vos-crit-weak);
957
+ color: var(--vos-crit);
958
+ border: 1px solid var(--vos-crit);
959
+ }
960
+ .vos-banner-ok {
961
+ background: var(--vos-good-weak);
962
+ color: var(--vos-good);
963
+ border: 1px solid var(--vos-good);
964
+ }
965
+ .vos-banner b {
966
+ font-weight: 700;
967
+ }
968
+ .vos-banner-body {
969
+ display: flex;
970
+ flex-direction: column;
971
+ gap: 2px;
972
+ flex: 1;
973
+ }
974
+ .vos-banner button {
975
+ border: 1px solid currentColor;
976
+ background: transparent;
977
+ color: inherit;
978
+ border-radius: 6px;
979
+ padding: 4px 10px;
980
+ cursor: pointer;
981
+ font: inherit;
982
+ font-weight: 600;
983
+ white-space: nowrap;
984
+ align-self: center;
985
+ }
986
+
987
+ /* ── misc ──────────────────────────────────────────────────────────────── */
988
+ .vos-hint {
989
+ font-size: 12px;
990
+ color: var(--vos-muted);
991
+ }
992
+ .vos-muted {
993
+ color: var(--vos-muted);
994
+ font-size: 13px;
995
+ }
996
+ .vos-error {
997
+ color: var(--vos-crit);
998
+ font-size: 13px;
999
+ }
1000
+ .vos-detail-list {
1001
+ display: flex;
1002
+ flex-direction: column;
1003
+ }
1004
+ .vos-detail-row {
1005
+ display: grid;
1006
+ grid-template-columns: 1fr 2fr;
1007
+ gap: 12px;
1008
+ padding: 10px 0;
1009
+ border-bottom: 1px solid var(--vos-border);
1010
+ }
1011
+ .vos-detail-row:last-child {
1012
+ border-bottom: none;
1013
+ }
1014
+ .vos-detail-k {
1015
+ font-size: 13px;
1016
+ color: var(--vos-muted);
1017
+ }
1018
+ .vos-detail-v {
1019
+ font-size: 13px;
1020
+ color: var(--vos-text);
1021
+ }
1022
+
1023
+ /* ── portfolio pipeline (OPS-1300) ─────────────────────────────────────── */
1024
+
1025
+ /* headline: the one burn-up reading, a single meter (not a chart) */
1026
+ .vos-pipe-hero {
1027
+ background: var(--vos-surface);
1028
+ border: 1px solid var(--vos-border);
1029
+ border-radius: var(--vos-radius);
1030
+ box-shadow: var(--vos-shadow);
1031
+ padding: 20px 24px;
1032
+ margin-bottom: 20px;
1033
+ display: flex;
1034
+ align-items: center;
1035
+ justify-content: space-between;
1036
+ gap: 28px;
1037
+ flex-wrap: wrap;
1038
+ }
1039
+ .vos-pipe-eyebrow {
1040
+ text-transform: uppercase;
1041
+ letter-spacing: 0.07em;
1042
+ font-size: 11px;
1043
+ font-weight: 600;
1044
+ color: var(--vos-muted);
1045
+ }
1046
+ .vos-pipe-big {
1047
+ font-family: var(--vos-mono);
1048
+ font-size: 54px;
1049
+ font-weight: 600;
1050
+ letter-spacing: -0.03em;
1051
+ line-height: 1;
1052
+ margin: 6px 0 4px;
1053
+ color: var(--vos-text);
1054
+ }
1055
+ .vos-pipe-big span {
1056
+ font-size: 26px;
1057
+ color: var(--vos-muted);
1058
+ }
1059
+ .vos-pipe-sub {
1060
+ font-size: 13px;
1061
+ color: var(--vos-muted);
1062
+ }
1063
+ .vos-pipe-figs {
1064
+ display: flex;
1065
+ gap: 26px;
1066
+ }
1067
+ .vos-pipe-fig {
1068
+ text-align: right;
1069
+ }
1070
+ .vos-pipe-fv {
1071
+ font-family: var(--vos-mono);
1072
+ font-variant-numeric: tabular-nums;
1073
+ font-size: 22px;
1074
+ font-weight: 600;
1075
+ color: var(--vos-text);
1076
+ }
1077
+ .vos-pipe-fl {
1078
+ font-size: 11px;
1079
+ color: var(--vos-muted);
1080
+ margin-top: 1px;
1081
+ }
1082
+
1083
+ /* stage legend: the four meters every belief carries */
1084
+ .vos-pipe-stages {
1085
+ display: flex;
1086
+ align-items: stretch;
1087
+ margin: 0 0 10px;
1088
+ flex-wrap: wrap;
1089
+ }
1090
+ .vos-pipe-stage {
1091
+ flex: 1;
1092
+ min-width: 150px;
1093
+ display: flex;
1094
+ gap: 8px;
1095
+ align-items: flex-start;
1096
+ padding: 8px 12px;
1097
+ }
1098
+ .vos-pipe-idx {
1099
+ font-family: var(--vos-mono);
1100
+ font-size: 11px;
1101
+ font-weight: 600;
1102
+ color: #fff;
1103
+ background: var(--vos-accent);
1104
+ width: 18px;
1105
+ height: 18px;
1106
+ border-radius: 5px;
1107
+ display: grid;
1108
+ place-items: center;
1109
+ flex: none;
1110
+ }
1111
+ .vos-pipe-idx-open {
1112
+ background: transparent;
1113
+ color: var(--vos-accent-text);
1114
+ border: 1px dashed var(--vos-accent);
1115
+ }
1116
+ .vos-pipe-skname {
1117
+ font-size: 12.5px;
1118
+ font-weight: 600;
1119
+ }
1120
+ .vos-pipe-skdesc {
1121
+ font-size: 11px;
1122
+ color: var(--vos-muted);
1123
+ line-height: 1.35;
1124
+ }
1125
+ .vos-pipe-arrow {
1126
+ align-self: center;
1127
+ color: var(--vos-border-strong);
1128
+ flex: none;
1129
+ padding: 0 2px;
1130
+ }
1131
+
1132
+ /* the board */
1133
+ .vos-pipe-board {
1134
+ overflow: visible;
1135
+ }
1136
+ .vos-pipe-boardhead {
1137
+ display: flex;
1138
+ align-items: center;
1139
+ justify-content: space-between;
1140
+ padding: 12px 16px;
1141
+ border-bottom: 1px solid var(--vos-border);
1142
+ }
1143
+ .vos-pipe-bt {
1144
+ font-size: 13px;
1145
+ font-weight: 600;
1146
+ }
1147
+ .vos-pipe-bt span {
1148
+ color: var(--vos-muted);
1149
+ font-weight: 400;
1150
+ }
1151
+ .vos-pipe-sortnote {
1152
+ font-size: 11.5px;
1153
+ color: var(--vos-muted);
1154
+ }
1155
+
1156
+ .vos-pipe-row {
1157
+ display: grid;
1158
+ grid-template-columns: 4px minmax(200px, 1.4fr) minmax(280px, 2fr) 92px;
1159
+ align-items: center;
1160
+ gap: 14px;
1161
+ border-bottom: 1px solid var(--vos-border);
1162
+ position: relative;
1163
+ }
1164
+ .vos-pipe-row:last-child {
1165
+ border-bottom: 0;
1166
+ }
1167
+ .vos-pipe-row:hover {
1168
+ background: var(--vos-surface-2);
1169
+ }
1170
+ .vos-pipe-stripe {
1171
+ align-self: stretch;
1172
+ }
1173
+
1174
+ .vos-pipe-belief {
1175
+ text-align: left;
1176
+ border: 0;
1177
+ background: none;
1178
+ font: inherit;
1179
+ color: inherit;
1180
+ cursor: pointer;
1181
+ padding: 14px 0;
1182
+ display: block;
1183
+ }
1184
+ .vos-pipe-stmt {
1185
+ display: block;
1186
+ font-size: 13.5px;
1187
+ font-weight: 550;
1188
+ line-height: 1.35;
1189
+ color: var(--vos-text);
1190
+ }
1191
+ .vos-pipe-belief:hover .vos-pipe-stmt {
1192
+ color: var(--vos-accent-text);
1193
+ }
1194
+ .vos-pipe-bmeta {
1195
+ display: flex;
1196
+ gap: 8px;
1197
+ align-items: center;
1198
+ margin-top: 5px;
1199
+ font-size: 11px;
1200
+ color: var(--vos-faint);
1201
+ }
1202
+ .vos-pipe-impact-track {
1203
+ width: 46px;
1204
+ height: 4px;
1205
+ border-radius: 2px;
1206
+ background: var(--vos-surface-2);
1207
+ overflow: hidden;
1208
+ display: inline-block;
1209
+ vertical-align: middle;
1210
+ }
1211
+ .vos-pipe-impact-track i {
1212
+ display: block;
1213
+ height: 100%;
1214
+ background: var(--vos-border-strong);
1215
+ }
1216
+
1217
+ /* the connected four-meter track */
1218
+ .vos-pipe-prog {
1219
+ display: flex;
1220
+ align-items: stretch;
1221
+ gap: 2px;
1222
+ padding: 14px 0;
1223
+ }
1224
+ .vos-pipe-seg {
1225
+ flex: 1;
1226
+ min-width: 0;
1227
+ }
1228
+ .vos-pipe-track {
1229
+ height: 22px;
1230
+ border-radius: 4px;
1231
+ background: var(--vos-surface-2);
1232
+ position: relative;
1233
+ overflow: hidden;
1234
+ }
1235
+ .vos-pipe-track i {
1236
+ position: absolute;
1237
+ top: 0;
1238
+ bottom: 0;
1239
+ left: 0;
1240
+ border-radius: 4px;
1241
+ }
1242
+ .vos-pipe-fill-accent {
1243
+ background: var(--vos-accent);
1244
+ }
1245
+ .vos-pipe-known {
1246
+ background: linear-gradient(
1247
+ 90deg,
1248
+ var(--vos-crit-weak),
1249
+ var(--vos-surface-2) 50%,
1250
+ var(--vos-good-weak)
1251
+ );
1252
+ }
1253
+ .vos-pipe-known-mid {
1254
+ position: absolute;
1255
+ left: 50%;
1256
+ top: 2px;
1257
+ bottom: 2px;
1258
+ width: 1px;
1259
+ background: var(--vos-border-strong);
1260
+ }
1261
+ .vos-pipe-known-pos {
1262
+ left: 50%;
1263
+ background: var(--vos-good);
1264
+ border-radius: 0 4px 4px 0;
1265
+ }
1266
+ .vos-pipe-known-neg {
1267
+ right: 50%;
1268
+ left: auto;
1269
+ background: var(--vos-crit);
1270
+ border-radius: 4px 0 0 4px;
1271
+ }
1272
+ .vos-pipe-cap {
1273
+ display: flex;
1274
+ align-items: center;
1275
+ gap: 5px;
1276
+ margin-top: 5px;
1277
+ }
1278
+ .vos-pipe-capn {
1279
+ font-family: var(--vos-mono);
1280
+ font-size: 10px;
1281
+ font-weight: 600;
1282
+ color: var(--vos-faint);
1283
+ }
1284
+ .vos-pipe-capv {
1285
+ font-size: 11px;
1286
+ font-weight: 600;
1287
+ }
1288
+ .vos-pipe-flag {
1289
+ font-size: 10px;
1290
+ font-weight: 700;
1291
+ text-transform: uppercase;
1292
+ letter-spacing: 0.04em;
1293
+ color: var(--vos-crit);
1294
+ background: var(--vos-crit-weak);
1295
+ padding: 1px 5px;
1296
+ border-radius: 4px;
1297
+ }
1298
+
1299
+ /* risk cell */
1300
+ .vos-pipe-risk {
1301
+ text-align: right;
1302
+ padding-right: 16px;
1303
+ }
1304
+ .vos-pipe-rv {
1305
+ font-family: var(--vos-mono);
1306
+ font-size: 20px;
1307
+ font-weight: 700;
1308
+ line-height: 1;
1309
+ }
1310
+ .vos-pipe-rl {
1311
+ font-size: 10px;
1312
+ text-transform: uppercase;
1313
+ letter-spacing: 0.05em;
1314
+ color: var(--vos-muted);
1315
+ }
1316
+ .vos-pipe-conf {
1317
+ margin-top: 5px;
1318
+ font-family: var(--vos-mono);
1319
+ font-size: 10.5px;
1320
+ }
1321
+
1322
+ /* hover actions */
1323
+ .vos-pipe-actions {
1324
+ position: absolute;
1325
+ right: 12px;
1326
+ top: 50%;
1327
+ transform: translateY(-50%);
1328
+ display: flex;
1329
+ gap: 6px;
1330
+ opacity: 0;
1331
+ transition: opacity 0.12s;
1332
+ background: linear-gradient(90deg, transparent, var(--vos-surface-2) 22%);
1333
+ padding-left: 40px;
1334
+ }
1335
+ .vos-pipe-row:hover .vos-pipe-actions,
1336
+ .vos-pipe-row:focus-within .vos-pipe-actions {
1337
+ opacity: 1;
1338
+ }
1339
+
1340
+ /* resolved / hidden */
1341
+ .vos-pipe-resolved {
1342
+ margin-top: 14px;
1343
+ }
1344
+ .vos-pipe-disclosure {
1345
+ background: var(--vos-surface);
1346
+ border: 1px dashed var(--vos-border-strong);
1347
+ border-radius: var(--vos-radius);
1348
+ padding: 12px 16px;
1349
+ font-size: 13px;
1350
+ color: var(--vos-muted);
1351
+ cursor: pointer;
1352
+ list-style: none;
1353
+ }
1354
+ .vos-pipe-disclosure::-webkit-details-marker {
1355
+ display: none;
1356
+ }
1357
+ .vos-pipe-disclosure::before {
1358
+ content: "▸";
1359
+ display: inline-block;
1360
+ margin-right: 8px;
1361
+ transition: transform 0.15s;
1362
+ }
1363
+ .vos-pipe-resolved[open] .vos-pipe-disclosure::before {
1364
+ transform: rotate(90deg);
1365
+ }
1366
+ .vos-pipe-disclosure:hover {
1367
+ border-color: var(--vos-accent);
1368
+ color: var(--vos-accent-text);
1369
+ }
1370
+ .vos-pipe-resolved-body {
1371
+ margin-top: 8px;
1372
+ border: 1px solid var(--vos-border);
1373
+ border-radius: var(--vos-radius);
1374
+ overflow: hidden;
1375
+ background: var(--vos-surface);
1376
+ }
1377
+ .vos-pipe-rrow {
1378
+ width: 100%;
1379
+ display: grid;
1380
+ grid-template-columns: minmax(200px, 1fr) 90px 120px;
1381
+ gap: 12px;
1382
+ align-items: center;
1383
+ padding: 11px 16px;
1384
+ border-bottom: 1px solid var(--vos-border);
1385
+ border-left: 0;
1386
+ border-right: 0;
1387
+ border-top: 0;
1388
+ background: none;
1389
+ font: inherit;
1390
+ text-align: left;
1391
+ cursor: pointer;
1392
+ }
1393
+ .vos-pipe-rrow:last-child {
1394
+ border-bottom: 0;
1395
+ }
1396
+ .vos-pipe-rrow:hover {
1397
+ background: var(--vos-surface-2);
1398
+ }
1399
+ .vos-pipe-rstmt {
1400
+ font-size: 13px;
1401
+ color: var(--vos-muted);
1402
+ text-decoration: line-through;
1403
+ text-decoration-color: var(--vos-border-strong);
1404
+ }
1405
+ .vos-pipe-retired {
1406
+ font-family: var(--vos-mono);
1407
+ font-size: 12px;
1408
+ color: var(--vos-good);
1409
+ text-align: right;
1410
+ }
1411
+ .vos-pipe-foot {
1412
+ margin-top: 16px;
1413
+ line-height: 1.6;
1414
+ }
1415
+ .vos-pipe-foot b {
1416
+ color: var(--vos-text);
1417
+ font-weight: 600;
1418
+ }
1419
+
1420
+ @media (max-width: 760px) {
1421
+ .vos-pipe-row {
1422
+ grid-template-columns: 4px 1fr;
1423
+ }
1424
+ .vos-pipe-prog,
1425
+ .vos-pipe-risk {
1426
+ grid-column: 2;
1427
+ padding-top: 0;
1428
+ text-align: left;
1429
+ }
1430
+ .vos-pipe-actions {
1431
+ position: static;
1432
+ opacity: 1;
1433
+ transform: none;
1434
+ background: none;
1435
+ padding: 0 0 14px 2px;
1436
+ grid-column: 2;
1437
+ }
1438
+ }
1439
+
1440
+ /* ── front door: "next move" (OPS-1304) ────────────────────────────────── */
1441
+ .vos-next {
1442
+ display: flex;
1443
+ flex-direction: column;
1444
+ gap: 16px;
1445
+ max-width: 640px;
1446
+ margin: 0 auto;
1447
+ }
1448
+
1449
+ /* The hero — one belief, one act, centred. */
1450
+ .vos-hero {
1451
+ display: flex;
1452
+ flex-direction: column;
1453
+ align-items: center;
1454
+ text-align: center;
1455
+ gap: 14px;
1456
+ padding: 34px 28px;
1457
+ }
1458
+ .vos-hero-kill {
1459
+ border-color: var(--vos-crit);
1460
+ }
1461
+ .vos-hero-eyebrow {
1462
+ font-size: 11px;
1463
+ text-transform: uppercase;
1464
+ letter-spacing: 0.08em;
1465
+ color: var(--vos-faint);
1466
+ font-weight: 700;
1467
+ }
1468
+ .vos-hero-belief {
1469
+ font-size: 22px;
1470
+ font-weight: 700;
1471
+ line-height: 1.3;
1472
+ letter-spacing: -0.01em;
1473
+ color: var(--vos-text);
1474
+ background: none;
1475
+ border: none;
1476
+ cursor: pointer;
1477
+ padding: 0;
1478
+ max-width: 30ch;
1479
+ }
1480
+ .vos-hero-belief:hover {
1481
+ color: var(--vos-accent-text);
1482
+ }
1483
+ .vos-hero-act {
1484
+ height: 40px;
1485
+ padding: 0 22px;
1486
+ font-size: 14px;
1487
+ }
1488
+ .vos-hero-agent {
1489
+ display: flex;
1490
+ flex-direction: column;
1491
+ align-items: center;
1492
+ gap: 8px;
1493
+ }
1494
+ .vos-agent-note {
1495
+ font-size: 12px;
1496
+ color: var(--vos-muted);
1497
+ }
1498
+
1499
+ /* Risk chip — seen, not read: a bar and a plain label, no number. */
1500
+ .vos-riskchip {
1501
+ display: inline-flex;
1502
+ align-items: center;
1503
+ gap: 9px;
1504
+ }
1505
+ .vos-riskchip .vos-risk-bar {
1506
+ width: 84px;
1507
+ height: 7px;
1508
+ }
1509
+ .vos-riskchip-label {
1510
+ font-size: 12.5px;
1511
+ font-weight: 600;
1512
+ }
1513
+
1514
+ /* Why-this panel adapts the drawer's reveal to a standalone card. */
1515
+ .vos-next-why {
1516
+ border: 1px solid var(--vos-border);
1517
+ border-radius: var(--vos-radius);
1518
+ margin-top: 0;
1519
+ max-width: 640px;
1520
+ margin-left: auto;
1521
+ margin-right: auto;
1522
+ width: 100%;
1523
+ }
1524
+ .vos-why-reason {
1525
+ font-size: 13px;
1526
+ color: var(--vos-text);
1527
+ margin: 0;
1528
+ }
1529
+ .vos-why-formula {
1530
+ font-size: 12.5px;
1531
+ color: var(--vos-muted);
1532
+ margin: 0;
1533
+ }
1534
+ .vos-why-rank {
1535
+ /* ── Record page (OPS-1286) ──────────────────────────────────────────────── */
1536
+ .vos-record-head {
1537
+ align-items: flex-start;
1538
+ }
1539
+ .vos-pill-row {
1540
+ display: flex;
1541
+ flex-wrap: wrap;
1542
+ gap: 6px;
1543
+ margin-top: 10px;
1544
+ }
1545
+ .vos-record-cols {
1546
+ display: flex;
1547
+ flex-direction: column;
1548
+ gap: 24px;
1549
+ }
1550
+ .vos-meter-grid {
1551
+ display: grid;
1552
+ grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
1553
+ gap: 16px;
1554
+ }
1555
+ .vos-meter {
1556
+ padding: 14px;
1557
+ border: 1px solid var(--vos-border);
1558
+ border-radius: var(--vos-radius);
1559
+ background: var(--vos-surface);
1560
+ }
1561
+ .vos-meter-head {
1562
+ display: flex;
1563
+ align-items: center;
1564
+ justify-content: space-between;
1565
+ gap: 8px;
1566
+ }
1567
+ .vos-meter-label {
1568
+ font-size: 12px;
1569
+ text-transform: uppercase;
1570
+ letter-spacing: 0.04em;
1571
+ color: var(--vos-muted);
1572
+ }
1573
+ .vos-meter-val {
1574
+ font-family: var(--vos-mono);
1575
+ font-size: 28px;
1576
+ font-weight: 600;
1577
+ margin: 6px 0;
1578
+ }
1579
+ .vos-section-title {
1580
+ margin: 0 0 10px;
1581
+ font-size: 14px;
1582
+ font-weight: 600;
1583
+ }
1584
+ .vos-human-field {
1585
+ margin-bottom: 12px;
1586
+ }
1587
+ .vos-human-field p,
1588
+ .vos-record-prose p {
1589
+ font-size: 14px;
1590
+ line-height: 1.6;
1591
+ color: var(--vos-text);
1592
+ margin: 4px 0 0;
1593
+ }
1594
+ .vos-panels {
1595
+ display: grid;
1596
+ grid-template-columns: repeat(auto-fit, minmax(260px, 1fr));
1597
+ gap: 16px;
1598
+ }
1599
+ .vos-panel {
1600
+ padding: 14px;
1601
+ border: 1px solid var(--vos-border);
1602
+ border-radius: var(--vos-radius);
1603
+ background: var(--vos-surface);
1604
+ }
1605
+ .vos-panel-head {
1606
+ display: flex;
1607
+ align-items: center;
1608
+ gap: 8px;
1609
+ margin: 0 0 10px;
1610
+ font-size: 13px;
1611
+ font-weight: 600;
1612
+ }
1613
+ .vos-backlinks {
1614
+ list-style: none;
1615
+ margin: 0;
1616
+ padding: 0;
1617
+ display: flex;
1618
+ flex-direction: column;
1619
+ gap: 4px;
1620
+ }
1621
+ .vos-why-rank li {
1622
+ display: flex;
1623
+ align-items: center;
1624
+ gap: 10px;
1625
+ font-size: 12.5px;
1626
+ color: var(--vos-muted);
1627
+ }
1628
+ .vos-why-rank-top {
1629
+ color: var(--vos-text);
1630
+ font-weight: 600;
1631
+ }
1632
+ .vos-why-rank-title {
1633
+ .vos-backlink {
1634
+ display: flex;
1635
+ align-items: center;
1636
+ gap: 10px;
1637
+ width: 100%;
1638
+ border: none;
1639
+ background: none;
1640
+ padding: 8px;
1641
+ border-radius: 8px;
1642
+ font: inherit;
1643
+ color: var(--vos-text);
1644
+ text-align: left;
1645
+ cursor: pointer;
1646
+ }
1647
+ .vos-backlink:hover {
1648
+ background: var(--vos-bg);
1649
+ }
1650
+ .vos-backlink-title {
1651
+ flex: 1;
1652
+ min-width: 0;
1653
+ overflow: hidden;
1654
+ text-overflow: ellipsis;
1655
+ white-space: nowrap;
1656
+ }
1657
+ .vos-why-rank-score {
1658
+ font-family: var(--vos-mono);
1659
+ font-variant-numeric: tabular-nums;
1660
+ }
1661
+
1662
+ /* Stage stepper (Framed→Planned→Tested→Known) — hidden behind Why this. */
1663
+ .vos-stepper {
1664
+ display: flex;
1665
+ gap: 6px;
1666
+ flex-wrap: wrap;
1667
+ }
1668
+ .vos-step {
1669
+ font-size: 11px;
1670
+ padding: 3px 9px;
1671
+ border-radius: 999px;
1672
+ background: var(--vos-surface-2);
1673
+ color: var(--vos-faint);
1674
+ }
1675
+ .vos-step-done {
1676
+ color: var(--vos-muted);
1677
+ }
1678
+ .vos-step-at {
1679
+ background: var(--vos-accent-weak);
1680
+ color: var(--vos-accent-text);
1681
+ font-weight: 700;
1682
+ }
1683
+
1684
+ /* On deck — title-only runners-up + an act pill. */
1685
+ .vos-ondeck {
1686
+ display: flex;
1687
+ flex-direction: column;
1688
+ gap: 8px;
1689
+ }
1690
+ .vos-ondeck-row {
1691
+ display: flex;
1692
+ align-items: center;
1693
+ gap: 11px;
1694
+ padding: 10px 12px;
1695
+ background: var(--vos-surface);
1696
+ border: 1px solid var(--vos-border);
1697
+ border-radius: var(--vos-radius);
1698
+ }
1699
+ .vos-ondeck-row .vos-risk-bar {
1700
+ flex: 0 0 46px;
1701
+ }
1702
+ .vos-ondeck-title {
1703
+ flex: 1;
1704
+ min-width: 0;
1705
+ overflow: hidden;
1706
+ text-overflow: ellipsis;
1707
+ white-space: nowrap;
1708
+ text-align: left;
1709
+ background: none;
1710
+ border: none;
1711
+ cursor: pointer;
1712
+ color: var(--vos-text);
1713
+ font: inherit;
1714
+ font-size: 13px;
1715
+ }
1716
+ .vos-ondeck-title:hover {
1717
+ color: var(--vos-accent-text);
1718
+ }
1719
+ .vos-ondeck-act {
1720
+ cursor: pointer;
1721
+ border: none;
1722
+ font: inherit;
1723
+ }
1724
+
1725
+ .vos-override {
1726
+ align-self: center;
1727
+ background: none;
1728
+ border: none;
1729
+ cursor: pointer;
1730
+ color: var(--vos-muted);
1731
+ font: inherit;
1732
+ font-size: 12.5px;
1733
+ padding: 4px;
1734
+ }
1735
+ .vos-override:hover {
1736
+ color: var(--vos-accent-text);
1737
+ }
1738
+ .vos-linkbtn {
1739
+ background: none;
1740
+ border: none;
1741
+ padding: 0;
1742
+ cursor: pointer;
1743
+ color: var(--vos-accent-text);
1744
+ font: inherit;
1745
+ font-weight: 600;
1746
+ }
1747
+
1748
+ /* Step-in form extras (score-impact slider + decision radios). */
1749
+ .vos-slider-row {
1750
+ display: flex;
1751
+ align-items: center;
1752
+ gap: 12px;
1753
+ }
1754
+ .vos-slider {
1755
+ flex: 1;
1756
+ accent-color: var(--vos-accent);
1757
+ }
1758
+ .vos-slider-num {
1759
+ width: 72px;
1760
+ flex: 0 0 auto;
1761
+ }
1762
+ .vos-field-hint {
1763
+ font-size: 11.5px;
1764
+ color: var(--vos-muted);
1765
+ margin: 6px 0 0;
1766
+ }
1767
+ .vos-radio {
1768
+ display: flex;
1769
+ align-items: flex-start;
1770
+ gap: 8px;
1771
+ font-size: 12.5px;
1772
+ color: var(--vos-text);
1773
+ margin-top: 6px;
1774
+ cursor: pointer;
1775
+ }
1776
+ .vos-radio input {
1777
+ margin-top: 2px;
1778
+ accent-color: var(--vos-accent);
1779
+ .vos-chip {
1780
+ display: inline-flex;
1781
+ align-items: center;
1782
+ gap: 5px;
1783
+ flex-shrink: 0;
1784
+ font-size: 12px;
1785
+ }
1786
+ .vos-chip-k {
1787
+ opacity: 0.7;
1788
+ font-size: 10px;
1789
+ text-transform: uppercase;
1790
+ letter-spacing: 0.03em;
1791
+ }
1792
+ .vos-bars {
1793
+ list-style: none;
1794
+ margin: 0;
1795
+ padding: 0;
1796
+ display: flex;
1797
+ flex-direction: column;
1798
+ gap: 6px;
1799
+ }
1800
+ .vos-bar-line {
1801
+ display: flex;
1802
+ align-items: center;
1803
+ justify-content: space-between;
1804
+ gap: 10px;
1805
+ padding: 8px 10px;
1806
+ border: 1px solid var(--vos-border);
1807
+ border-radius: 8px;
1808
+ font-size: 13px;
1809
+ }
1810
+ .vos-journey-host {
1811
+ margin-top: 24px;
1812
+ padding: 16px;
1813
+ border: 1px dashed var(--vos-border-strong);
1814
+ border-radius: var(--vos-radius);
1815
+ }
1816
+
1817
+ /* ── List surface: tabs, controls, groups (OPS-1287) ─────────────────────── */
1818
+ .vos-tabs {
1819
+ display: flex;
1820
+ flex-wrap: wrap;
1821
+ gap: 4px;
1822
+ margin: 16px 0 12px;
1823
+ border-bottom: 1px solid var(--vos-border);
1824
+ }
1825
+ .vos-tab {
1826
+ display: inline-flex;
1827
+ align-items: center;
1828
+ gap: 6px;
1829
+ border: none;
1830
+ background: none;
1831
+ padding: 8px 12px;
1832
+ margin-bottom: -1px;
1833
+ font: inherit;
1834
+ font-size: 13px;
1835
+ color: var(--vos-muted);
1836
+ cursor: pointer;
1837
+ border-bottom: 2px solid transparent;
1838
+ }
1839
+ .vos-tab:hover {
1840
+ color: var(--vos-text);
1841
+ }
1842
+ .vos-tab.is-active {
1843
+ color: var(--vos-text);
1844
+ border-bottom-color: var(--vos-accent);
1845
+ font-weight: 600;
1846
+ }
1847
+ .vos-tab-badge {
1848
+ display: inline-flex;
1849
+ align-items: center;
1850
+ justify-content: center;
1851
+ min-width: 18px;
1852
+ height: 18px;
1853
+ padding: 0 5px;
1854
+ border-radius: 999px;
1855
+ background: var(--vos-crit);
1856
+ color: #fff;
1857
+ font-size: 11px;
1858
+ font-weight: 600;
1859
+ }
1860
+ .vos-view-controls {
1861
+ display: flex;
1862
+ flex-wrap: wrap;
1863
+ align-items: center;
1864
+ gap: 10px;
1865
+ margin-bottom: 14px;
1866
+ }
1867
+ .vos-saved-views {
1868
+ display: flex;
1869
+ flex-wrap: wrap;
1870
+ align-items: center;
1871
+ gap: 8px;
1872
+ margin-bottom: 14px;
1873
+ }
1874
+ .vos-saved-label {
1875
+ font-size: 11px;
1876
+ text-transform: uppercase;
1877
+ letter-spacing: 0.04em;
1878
+ color: var(--vos-muted);
1879
+ }
1880
+ .vos-saved-view {
1881
+ display: inline-flex;
1882
+ align-items: center;
1883
+ border: 1px solid var(--vos-border-strong);
1884
+ border-radius: 999px;
1885
+ overflow: hidden;
1886
+ }
1887
+ .vos-saved-apply {
1888
+ border: none;
1889
+ background: var(--vos-bg);
1890
+ padding: 3px 10px;
1891
+ font: inherit;
1892
+ font-size: 12px;
1893
+ color: var(--vos-text);
1894
+ cursor: pointer;
1895
+ }
1896
+ .vos-saved-apply:hover {
1897
+ color: var(--vos-accent-text);
1898
+ }
1899
+ .vos-saved-x {
1900
+ border: none;
1901
+ border-left: 1px solid var(--vos-border);
1902
+ background: var(--vos-bg);
1903
+ padding: 3px 8px;
1904
+ font: inherit;
1905
+ color: var(--vos-muted);
1906
+ cursor: pointer;
1907
+ }
1908
+ .vos-saved-x:hover {
1909
+ color: var(--vos-crit);
1910
+ }
1911
+ .vos-search {
1912
+ max-width: 260px;
1913
+ flex: 1 1 180px;
1914
+ }
1915
+ .vos-control {
1916
+ display: inline-flex;
1917
+ align-items: center;
1918
+ gap: 6px;
1919
+ font-size: 13px;
1920
+ color: var(--vos-muted);
1921
+ }
1922
+ .vos-control select {
1923
+ width: auto;
1924
+ }
1925
+ .vos-groups {
1926
+ display: flex;
1927
+ flex-direction: column;
1928
+ gap: 20px;
1929
+ }
1930
+ .vos-group-head {
1931
+ display: flex;
1932
+ align-items: center;
1933
+ gap: 8px;
1934
+ margin: 0 0 8px;
1935
+ font-size: 13px;
1936
+ font-weight: 600;
1937
+ text-transform: uppercase;
1938
+ letter-spacing: 0.04em;
1939
+ color: var(--vos-muted);
1940
+ }
1941
+ .vos-group-n {
1942
+ display: inline-flex;
1943
+ align-items: center;
1944
+ justify-content: center;
1945
+ min-width: 20px;
1946
+ padding: 0 6px;
1947
+ border-radius: 999px;
1948
+ background: var(--vos-bg);
1949
+ border: 1px solid var(--vos-border);
1950
+ font-size: 11px;
1951
+ font-weight: 600;
1952
+ color: var(--vos-muted);
1953
+ }
1954
+
1955
+ /* ── Glossary auto-linking (OPS-1285) ─────────────────────────────────────── */
1956
+ /* A dotted inline link; its definition-preview popover shows on hover/focus. */
1957
+ .vos-gloss {
1958
+ position: relative;
1959
+ display: inline;
1960
+ }
1961
+ .vos-gloss-term {
1962
+ border: none;
1963
+ background: none;
1964
+ padding: 0;
1965
+ font: inherit;
1966
+ color: inherit;
1967
+ cursor: help;
1968
+ text-decoration: underline dotted var(--vos-accent);
1969
+ text-underline-offset: 2px;
1970
+ }
1971
+ .vos-gloss-term:hover,
1972
+ .vos-gloss-term:focus-visible {
1973
+ color: var(--vos-accent-text);
1974
+ }
1975
+ .vos-gloss-pop {
1976
+ position: absolute;
1977
+ z-index: 40;
1978
+ left: 0;
1979
+ top: calc(100% + 6px);
1980
+ width: max-content;
1981
+ max-width: 320px;
1982
+ display: none;
1983
+ flex-direction: column;
1984
+ gap: 8px;
1985
+ padding: 12px;
1986
+ background: var(--vos-surface);
1987
+ border: 1px solid var(--vos-border-strong);
1988
+ border-radius: var(--vos-radius);
1989
+ box-shadow: var(--vos-shadow-lg);
1990
+ text-align: left;
1991
+ white-space: normal;
1992
+ }
1993
+ .vos-gloss:hover .vos-gloss-pop,
1994
+ .vos-gloss:focus-within .vos-gloss-pop {
1995
+ display: flex;
1996
+ }
1997
+ .vos-gloss-pop-head {
1998
+ display: flex;
1999
+ align-items: center;
2000
+ justify-content: space-between;
2001
+ gap: 8px;
2002
+ }
2003
+ .vos-gloss-pop-def {
2004
+ font-size: 13px;
2005
+ color: var(--vos-text);
2006
+ line-height: 1.5;
2007
+ }
2008
+ .vos-gloss-pop-neighbours {
2009
+ display: flex;
2010
+ flex-wrap: wrap;
2011
+ align-items: center;
2012
+ gap: 6px;
2013
+ padding-top: 6px;
2014
+ border-top: 1px solid var(--vos-border);
2015
+ }
2016
+ .vos-gloss-pop-label {
2017
+ font-size: 11px;
2018
+ text-transform: uppercase;
2019
+ letter-spacing: 0.04em;
2020
+ color: var(--vos-muted);
2021
+ width: 100%;
2022
+ }
2023
+ .vos-gloss-chip {
2024
+ border: 1px solid var(--vos-border-strong);
2025
+ background: var(--vos-bg);
2026
+ border-radius: 999px;
2027
+ padding: 2px 10px;
2028
+ font-size: 12px;
2029
+ color: var(--vos-text);
2030
+ cursor: pointer;
2031
+ }
2032
+ .vos-gloss-chip:hover {
2033
+ border-color: var(--vos-accent);
2034
+ color: var(--vos-accent-text);
2035
+ }