@validation-os/dashboard 0.4.0 → 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.
@@ -0,0 +1,971 @@
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-count {
298
+ margin-left: auto;
299
+ font-size: 12px;
300
+ color: var(--vos-faint);
301
+ }
302
+ .vos-nav-item.is-active .vos-nav-count {
303
+ color: var(--vos-accent-text);
304
+ }
305
+
306
+ .vos-main {
307
+ grid-area: main;
308
+ overflow-y: auto;
309
+ padding: 20px 24px;
310
+ }
311
+ .vos-head {
312
+ display: flex;
313
+ align-items: flex-end;
314
+ gap: 14px;
315
+ margin-bottom: 18px;
316
+ }
317
+ .vos-head h1 {
318
+ margin: 0;
319
+ font-size: 21px;
320
+ letter-spacing: -0.02em;
321
+ }
322
+ .vos-head p {
323
+ margin: 3px 0 0;
324
+ color: var(--vos-muted);
325
+ font-size: 13px;
326
+ }
327
+
328
+ /* ── buttons ───────────────────────────────────────────────────────────── */
329
+ .vos-btn {
330
+ border: 1px solid var(--vos-accent);
331
+ background: var(--vos-accent);
332
+ color: #fff;
333
+ border-radius: 7px;
334
+ height: 34px;
335
+ padding: 0 14px;
336
+ font: inherit;
337
+ font-weight: 600;
338
+ cursor: pointer;
339
+ display: inline-flex;
340
+ align-items: center;
341
+ gap: 6px;
342
+ }
343
+ .vos-btn:hover {
344
+ filter: brightness(1.06);
345
+ }
346
+ .vos-btn:disabled {
347
+ opacity: 0.5;
348
+ cursor: default;
349
+ }
350
+ .vos-btn-ghost {
351
+ background: var(--vos-surface);
352
+ color: var(--vos-text);
353
+ border-color: var(--vos-border-strong);
354
+ }
355
+ .vos-btn-ghost:hover {
356
+ background: var(--vos-surface-2);
357
+ filter: none;
358
+ }
359
+ .vos-btn-sm {
360
+ height: 28px;
361
+ padding: 0 10px;
362
+ font-size: 12.5px;
363
+ }
364
+
365
+ /* ── card + table ──────────────────────────────────────────────────────── */
366
+ .vos-card {
367
+ background: var(--vos-surface);
368
+ border: 1px solid var(--vos-border);
369
+ border-radius: var(--vos-radius);
370
+ box-shadow: var(--vos-shadow);
371
+ overflow: hidden;
372
+ }
373
+ .vos-table-scroll {
374
+ overflow-x: auto;
375
+ }
376
+ .vos-table {
377
+ width: 100%;
378
+ border-collapse: collapse;
379
+ }
380
+ .vos-table thead th {
381
+ text-align: left;
382
+ font-size: 11px;
383
+ text-transform: uppercase;
384
+ letter-spacing: 0.05em;
385
+ color: var(--vos-faint);
386
+ font-weight: 600;
387
+ padding: 10px 14px;
388
+ border-bottom: 1px solid var(--vos-border);
389
+ background: var(--vos-surface-2);
390
+ }
391
+ .vos-table thead th.vos-r,
392
+ .vos-table td.vos-r {
393
+ text-align: right;
394
+ }
395
+ .vos-table tbody td {
396
+ padding: 11px 14px;
397
+ border-bottom: 1px solid var(--vos-border);
398
+ vertical-align: middle;
399
+ }
400
+ .vos-table tbody tr {
401
+ cursor: pointer;
402
+ }
403
+ .vos-table tbody tr:last-child td {
404
+ border-bottom: none;
405
+ }
406
+ .vos-table tbody tr:hover td {
407
+ background: var(--vos-surface-2);
408
+ }
409
+ .vos-table tbody tr.is-selected td {
410
+ background: var(--vos-accent-weak);
411
+ }
412
+ .vos-table tbody tr:focus-visible {
413
+ outline: 2px solid var(--vos-accent);
414
+ outline-offset: -2px;
415
+ }
416
+ .vos-rid {
417
+ font-family: var(--vos-mono);
418
+ font-size: 12px;
419
+ color: var(--vos-muted);
420
+ }
421
+ .vos-ttl {
422
+ font-weight: 550;
423
+ max-width: 400px;
424
+ color: var(--vos-text);
425
+ }
426
+ .vos-empty {
427
+ padding: 40px;
428
+ text-align: center;
429
+ color: var(--vos-muted);
430
+ border: 1px dashed var(--vos-border-strong);
431
+ border-radius: var(--vos-radius);
432
+ }
433
+
434
+ /* ── pill ──────────────────────────────────────────────────────────────── */
435
+ .vos-pill {
436
+ display: inline-flex;
437
+ align-items: center;
438
+ gap: 5px;
439
+ font-size: 11.5px;
440
+ font-weight: 600;
441
+ padding: 2px 9px;
442
+ border-radius: 999px;
443
+ white-space: nowrap;
444
+ color: var(--vos-muted);
445
+ background: var(--vos-surface-2);
446
+ }
447
+ .vos-pill::before {
448
+ content: "";
449
+ width: 6px;
450
+ height: 6px;
451
+ border-radius: 50%;
452
+ background: currentColor;
453
+ }
454
+ .vos-pill-good {
455
+ color: var(--vos-good);
456
+ background: var(--vos-good-weak);
457
+ }
458
+ .vos-pill-warn {
459
+ color: var(--vos-warn);
460
+ background: var(--vos-warn-weak);
461
+ }
462
+ .vos-pill-crit {
463
+ color: var(--vos-crit);
464
+ background: var(--vos-crit-weak);
465
+ }
466
+ .vos-pill-accent {
467
+ color: var(--vos-accent-text);
468
+ background: var(--vos-accent-weak);
469
+ }
470
+ .vos-pill-neutral {
471
+ color: var(--vos-muted);
472
+ background: var(--vos-surface-2);
473
+ }
474
+
475
+ /* ── risk bar + in-row confidence ──────────────────────────────────────── */
476
+ .vos-metric-cell {
477
+ display: inline-flex;
478
+ align-items: center;
479
+ gap: 9px;
480
+ justify-content: flex-end;
481
+ }
482
+ .vos-risk-bar {
483
+ width: 46px;
484
+ height: 6px;
485
+ border-radius: 3px;
486
+ background: var(--vos-surface-2);
487
+ overflow: hidden;
488
+ position: relative;
489
+ }
490
+ .vos-risk-bar i {
491
+ position: absolute;
492
+ left: 0;
493
+ top: 0;
494
+ bottom: 0;
495
+ border-radius: 3px;
496
+ }
497
+ .vos-fill-good {
498
+ background: var(--vos-good);
499
+ }
500
+ .vos-fill-warn {
501
+ background: var(--vos-warn);
502
+ }
503
+ .vos-fill-crit {
504
+ background: var(--vos-crit);
505
+ }
506
+ .vos-metric-num {
507
+ font-family: var(--vos-mono);
508
+ font-variant-numeric: tabular-nums;
509
+ font-weight: 700;
510
+ min-width: 30px;
511
+ text-align: right;
512
+ }
513
+ .vos-text-good {
514
+ color: var(--vos-good);
515
+ }
516
+ .vos-text-warn {
517
+ color: var(--vos-warn);
518
+ }
519
+ .vos-text-crit {
520
+ color: var(--vos-crit);
521
+ }
522
+ .vos-spark {
523
+ vertical-align: middle;
524
+ display: inline-block;
525
+ }
526
+
527
+ /* ── stat tile (counts landing / glanceable) ───────────────────────────── */
528
+ .vos-tile-grid {
529
+ display: grid;
530
+ grid-template-columns: repeat(auto-fill, minmax(180px, 1fr));
531
+ gap: 12px;
532
+ }
533
+ .vos-tile {
534
+ display: block;
535
+ text-align: left;
536
+ text-decoration: none;
537
+ color: inherit;
538
+ background: var(--vos-surface);
539
+ border: 1px solid var(--vos-border);
540
+ border-radius: var(--vos-radius);
541
+ box-shadow: var(--vos-shadow);
542
+ padding: 16px;
543
+ font: inherit;
544
+ cursor: default;
545
+ }
546
+ a.vos-tile,
547
+ button.vos-tile {
548
+ cursor: pointer;
549
+ }
550
+ a.vos-tile:hover,
551
+ button.vos-tile:hover {
552
+ border-color: var(--vos-border-strong);
553
+ background: var(--vos-surface-2);
554
+ }
555
+ .vos-tile-label {
556
+ font-size: 13px;
557
+ font-weight: 500;
558
+ color: var(--vos-muted);
559
+ }
560
+ .vos-tile-value {
561
+ margin-top: 4px;
562
+ font-family: var(--vos-mono);
563
+ font-variant-numeric: tabular-nums;
564
+ font-size: 28px;
565
+ font-weight: 700;
566
+ letter-spacing: -0.02em;
567
+ color: var(--vos-text);
568
+ }
569
+ .vos-tile-sub {
570
+ margin-top: 2px;
571
+ font-size: 12px;
572
+ color: var(--vos-faint);
573
+ }
574
+
575
+ /* ── drawer ────────────────────────────────────────────────────────────── */
576
+ .vos-scrim {
577
+ position: fixed;
578
+ inset: 0;
579
+ background: rgba(16, 24, 40, 0.36);
580
+ z-index: 40;
581
+ }
582
+ .vos-drawer {
583
+ position: fixed;
584
+ top: 0;
585
+ right: 0;
586
+ height: 100vh;
587
+ width: 500px;
588
+ max-width: 96vw;
589
+ background: var(--vos-surface);
590
+ border-left: 1px solid var(--vos-border);
591
+ box-shadow: var(--vos-shadow-lg);
592
+ z-index: 50;
593
+ display: flex;
594
+ flex-direction: column;
595
+ color: var(--vos-text);
596
+ font-family: var(--vos-sans);
597
+ font-size: 14px;
598
+ outline: none;
599
+ }
600
+ .vos-drawer-header {
601
+ display: flex;
602
+ align-items: center;
603
+ gap: 10px;
604
+ padding: 12px 16px;
605
+ border-bottom: 1px solid var(--vos-border);
606
+ }
607
+ .vos-drawer-eyebrow {
608
+ font-size: 11px;
609
+ text-transform: uppercase;
610
+ letter-spacing: 0.05em;
611
+ color: var(--vos-faint);
612
+ font-weight: 600;
613
+ }
614
+ .vos-drawer-title {
615
+ margin: 2px 0 0;
616
+ font-size: 17px;
617
+ font-weight: 600;
618
+ letter-spacing: -0.01em;
619
+ }
620
+ .vos-drawer-body {
621
+ padding: 18px;
622
+ overflow-y: auto;
623
+ flex: 1;
624
+ display: flex;
625
+ flex-direction: column;
626
+ gap: 16px;
627
+ }
628
+ .vos-drawer-footer {
629
+ padding: 12px 16px;
630
+ border-top: 1px solid var(--vos-border);
631
+ display: flex;
632
+ gap: 8px;
633
+ align-items: center;
634
+ justify-content: flex-end;
635
+ font-size: 12px;
636
+ color: var(--vos-faint);
637
+ }
638
+ .vos-verbadge {
639
+ font-family: var(--vos-mono);
640
+ font-size: 11px;
641
+ color: var(--vos-muted);
642
+ background: var(--vos-surface-2);
643
+ border: 1px solid var(--vos-border);
644
+ border-radius: 5px;
645
+ padding: 2px 7px;
646
+ }
647
+
648
+ /* ── derived hero ──────────────────────────────────────────────────────── */
649
+ .vos-derived {
650
+ border: 1px solid var(--vos-border);
651
+ border-radius: var(--vos-radius);
652
+ overflow: hidden;
653
+ }
654
+ .vos-derived-head {
655
+ display: flex;
656
+ align-items: center;
657
+ gap: 8px;
658
+ padding: 9px 12px;
659
+ background: var(--vos-surface-2);
660
+ border-bottom: 1px solid var(--vos-border);
661
+ font-size: 11px;
662
+ text-transform: uppercase;
663
+ letter-spacing: 0.05em;
664
+ color: var(--vos-muted);
665
+ font-weight: 700;
666
+ }
667
+ .vos-lock {
668
+ font-size: 11px;
669
+ color: var(--vos-faint);
670
+ text-transform: none;
671
+ letter-spacing: 0;
672
+ margin-left: auto;
673
+ font-weight: 500;
674
+ }
675
+ .vos-dgrid {
676
+ display: grid;
677
+ grid-template-columns: 1fr 1fr;
678
+ }
679
+ .vos-dcell {
680
+ padding: 12px;
681
+ border-right: 1px solid var(--vos-border);
682
+ border-bottom: 1px solid var(--vos-border);
683
+ }
684
+ .vos-dcell:nth-child(2n) {
685
+ border-right: none;
686
+ }
687
+ .vos-dcell:nth-last-child(-n + 2) {
688
+ border-bottom: none;
689
+ }
690
+ .vos-dcell-k {
691
+ font-size: 11px;
692
+ color: var(--vos-faint);
693
+ text-transform: uppercase;
694
+ letter-spacing: 0.04em;
695
+ display: flex;
696
+ align-items: center;
697
+ gap: 6px;
698
+ }
699
+ .vos-why {
700
+ font-size: 10.5px;
701
+ color: var(--vos-accent-text);
702
+ cursor: pointer;
703
+ font-weight: 600;
704
+ letter-spacing: 0;
705
+ text-transform: none;
706
+ border: none;
707
+ background: none;
708
+ padding: 0;
709
+ }
710
+ .vos-dcell-v {
711
+ font-family: var(--vos-mono);
712
+ font-size: 22px;
713
+ font-weight: 700;
714
+ margin-top: 3px;
715
+ letter-spacing: -0.02em;
716
+ }
717
+ .vos-dcell-sub {
718
+ font-size: 11px;
719
+ color: var(--vos-muted);
720
+ margin-top: 2px;
721
+ }
722
+
723
+ /* ── understanding / movers ────────────────────────────────────────────── */
724
+ .vos-why-panel {
725
+ border: 1px solid var(--vos-border);
726
+ border-top: none;
727
+ border-radius: 0 0 var(--vos-radius) var(--vos-radius);
728
+ padding: 10px 12px;
729
+ display: flex;
730
+ flex-direction: column;
731
+ gap: 10px;
732
+ background: var(--vos-bg);
733
+ margin-top: -16px;
734
+ }
735
+ .vos-why-section-title {
736
+ font-size: 11px;
737
+ color: var(--vos-faint);
738
+ text-transform: uppercase;
739
+ letter-spacing: 0.04em;
740
+ font-weight: 700;
741
+ }
742
+ .vos-mover {
743
+ display: flex;
744
+ align-items: center;
745
+ gap: 9px;
746
+ font-size: 12.5px;
747
+ }
748
+ .vos-mover-name {
749
+ flex: 1;
750
+ min-width: 0;
751
+ overflow: hidden;
752
+ text-overflow: ellipsis;
753
+ white-space: nowrap;
754
+ }
755
+ .vos-mover-note {
756
+ font-size: 11px;
757
+ color: var(--vos-muted);
758
+ }
759
+ .vos-mover-note.vos-text-warn {
760
+ color: var(--vos-warn);
761
+ font-weight: 600;
762
+ }
763
+ .vos-mover-note.vos-text-good {
764
+ color: var(--vos-good);
765
+ font-weight: 600;
766
+ }
767
+ .vos-track {
768
+ flex: 0 0 90px;
769
+ height: 7px;
770
+ background: var(--vos-surface-2);
771
+ border-radius: 4px;
772
+ position: relative;
773
+ }
774
+ .vos-track.vos-signed::before {
775
+ content: "";
776
+ position: absolute;
777
+ left: 50%;
778
+ top: -2px;
779
+ bottom: -2px;
780
+ width: 1px;
781
+ background: var(--vos-border-strong);
782
+ }
783
+ .vos-track i {
784
+ position: absolute;
785
+ top: 0;
786
+ bottom: 0;
787
+ border-radius: 4px;
788
+ }
789
+ .vos-mover-val {
790
+ font-family: var(--vos-mono);
791
+ font-size: 12px;
792
+ font-weight: 700;
793
+ width: 40px;
794
+ text-align: right;
795
+ }
796
+
797
+ /* ── trajectory ────────────────────────────────────────────────────────── */
798
+ .vos-traj {
799
+ border: 1px solid var(--vos-border);
800
+ border-radius: var(--vos-radius);
801
+ padding: 12px;
802
+ }
803
+ .vos-traj-head {
804
+ display: flex;
805
+ align-items: center;
806
+ margin-bottom: 8px;
807
+ }
808
+ .vos-traj-head .vos-lbl {
809
+ font-size: 11px;
810
+ text-transform: uppercase;
811
+ letter-spacing: 0.05em;
812
+ color: var(--vos-faint);
813
+ font-weight: 700;
814
+ }
815
+ .vos-traj-foot {
816
+ display: flex;
817
+ justify-content: space-between;
818
+ margin-top: 6px;
819
+ font-size: 11px;
820
+ color: var(--vos-faint);
821
+ }
822
+
823
+ /* ── fields (edit + create) ────────────────────────────────────────────── */
824
+ .vos-field label,
825
+ .vos-field-label {
826
+ display: block;
827
+ font-size: 11px;
828
+ text-transform: uppercase;
829
+ letter-spacing: 0.05em;
830
+ color: var(--vos-faint);
831
+ font-weight: 600;
832
+ margin-bottom: 5px;
833
+ }
834
+ .vos-req {
835
+ color: var(--vos-crit);
836
+ }
837
+ .vos-form {
838
+ display: flex;
839
+ flex-direction: column;
840
+ height: 100%;
841
+ }
842
+ .vos-form-body {
843
+ flex: 1;
844
+ overflow-y: auto;
845
+ padding: 18px;
846
+ display: flex;
847
+ flex-direction: column;
848
+ gap: 14px;
849
+ }
850
+ .vos-input {
851
+ width: 100%;
852
+ border: 1px solid var(--vos-border-strong);
853
+ background: var(--vos-bg);
854
+ color: var(--vos-text);
855
+ border-radius: 7px;
856
+ padding: 8px 10px;
857
+ font: inherit;
858
+ }
859
+ textarea.vos-input {
860
+ resize: vertical;
861
+ min-height: 52px;
862
+ }
863
+ .vos-input:focus {
864
+ outline: 2px solid var(--vos-accent);
865
+ outline-offset: -1px;
866
+ border-color: var(--vos-accent);
867
+ }
868
+ .vos-row2 {
869
+ display: grid;
870
+ grid-template-columns: 1fr 1fr;
871
+ gap: 12px;
872
+ }
873
+ .vos-field-stack {
874
+ display: flex;
875
+ flex-direction: column;
876
+ gap: 14px;
877
+ }
878
+ .vos-sectitle {
879
+ font-size: 11px;
880
+ text-transform: uppercase;
881
+ letter-spacing: 0.05em;
882
+ color: var(--vos-faint);
883
+ font-weight: 700;
884
+ margin-bottom: 8px;
885
+ }
886
+ .vos-relation {
887
+ border-top: 1px solid var(--vos-border);
888
+ padding: 16px 18px;
889
+ }
890
+
891
+ /* ── banners ───────────────────────────────────────────────────────────── */
892
+ .vos-banner {
893
+ padding: 11px 12px;
894
+ border-radius: 8px;
895
+ font-size: 12.5px;
896
+ display: flex;
897
+ align-items: flex-start;
898
+ gap: 9px;
899
+ }
900
+ .vos-banner-warn {
901
+ background: var(--vos-warn-weak);
902
+ color: var(--vos-warn);
903
+ border: 1px solid var(--vos-warn);
904
+ }
905
+ .vos-banner-crit {
906
+ background: var(--vos-crit-weak);
907
+ color: var(--vos-crit);
908
+ border: 1px solid var(--vos-crit);
909
+ }
910
+ .vos-banner-ok {
911
+ background: var(--vos-good-weak);
912
+ color: var(--vos-good);
913
+ border: 1px solid var(--vos-good);
914
+ }
915
+ .vos-banner b {
916
+ font-weight: 700;
917
+ }
918
+ .vos-banner-body {
919
+ display: flex;
920
+ flex-direction: column;
921
+ gap: 2px;
922
+ flex: 1;
923
+ }
924
+ .vos-banner button {
925
+ border: 1px solid currentColor;
926
+ background: transparent;
927
+ color: inherit;
928
+ border-radius: 6px;
929
+ padding: 4px 10px;
930
+ cursor: pointer;
931
+ font: inherit;
932
+ font-weight: 600;
933
+ white-space: nowrap;
934
+ align-self: center;
935
+ }
936
+
937
+ /* ── misc ──────────────────────────────────────────────────────────────── */
938
+ .vos-hint {
939
+ font-size: 12px;
940
+ color: var(--vos-muted);
941
+ }
942
+ .vos-muted {
943
+ color: var(--vos-muted);
944
+ font-size: 13px;
945
+ }
946
+ .vos-error {
947
+ color: var(--vos-crit);
948
+ font-size: 13px;
949
+ }
950
+ .vos-detail-list {
951
+ display: flex;
952
+ flex-direction: column;
953
+ }
954
+ .vos-detail-row {
955
+ display: grid;
956
+ grid-template-columns: 1fr 2fr;
957
+ gap: 12px;
958
+ padding: 10px 0;
959
+ border-bottom: 1px solid var(--vos-border);
960
+ }
961
+ .vos-detail-row:last-child {
962
+ border-bottom: none;
963
+ }
964
+ .vos-detail-k {
965
+ font-size: 13px;
966
+ color: var(--vos-muted);
967
+ }
968
+ .vos-detail-v {
969
+ font-size: 13px;
970
+ color: var(--vos-text);
971
+ }