@anmol-srv/sigil 0.10.3 → 0.12.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,947 @@
1
+ /* ════════════════════════════════════════════════════════════════════════
2
+ Sigil dashboard — design system v2
3
+ Sharp corners, fixed 4px spacing scale, careful typography.
4
+ Inspired by shadcn's discipline but no framework dependency.
5
+ ════════════════════════════════════════════════════════════════════════ */
6
+
7
+ :root {
8
+ /* ── Re-skinned onto the Sigil design system ───────────────────────────
9
+ design/colors_and_type.css (linked BEFORE this file) owns the brand:
10
+ palette, Geist/Geist Mono type, 4px spacing, sharp geometry. Here we
11
+ re-point this dashboard's local token names at those design tokens, so
12
+ every existing rule adopts the brand with no markup churn.
13
+
14
+ Names that ALSO exist in the design tokens (--fg-2/3/4, --border-2,
15
+ --border-strong, --ok, --warn, --font-mono, --focus-ring) are deliberately
16
+ NOT redefined here — the design values flow through unchanged. */
17
+
18
+ /* surfaces (app-local aliases → design surfaces) */
19
+ --bg-canvas: var(--bg-1);
20
+ --bg-surface: var(--surface-1);
21
+ --bg-surface-2: var(--surface-2);
22
+ --bg-surface-3: var(--surface-3);
23
+ --bg-overlay: rgba(8, 9, 11, 0.78);
24
+
25
+ /* text + borders */
26
+ --fg: var(--fg-1);
27
+ --border: var(--border-1);
28
+
29
+ /* brand / accent — the only chromatic UI color is brand blue */
30
+ --accent: var(--brand);
31
+ --accent-2: var(--brand-deep);
32
+ --accent-fg: #ffffff;
33
+
34
+ /* status: foreground --ok/--warn come from design tokens; backgrounds map
35
+ to the design's restrained tints (used only as small dot/row washes) */
36
+ --ok-bg: var(--ok-tint);
37
+ --warn-bg: var(--warn-tint);
38
+ --err: var(--danger);
39
+ --err-bg: var(--danger-tint);
40
+ --info-bg: var(--brand-tint);
41
+
42
+ /* spacing → design 4px grid */
43
+ --s-1: var(--sp-1); --s-2: var(--sp-2); --s-3: var(--sp-3); --s-4: var(--sp-4);
44
+ --s-5: var(--sp-5); --s-6: var(--sp-6); --s-7: var(--sp-7); --s-8: var(--sp-8);
45
+
46
+ /* type scale (px; hierarchy preserved) */
47
+ --t-xs: 11px;
48
+ --t-sm: 12px;
49
+ --t-base: 13px;
50
+ --t-md: 14px;
51
+ --t-lg: 16px;
52
+ --t-xl: 20px;
53
+ --t-2xl: 26px;
54
+ --t-3xl: 34px;
55
+ --lh: 1.5;
56
+ --lh-tight: 1.25;
57
+
58
+ /* fonts → Geist (UI) / Geist Mono (data). --font-mono flows from design. */
59
+ --font-ui: var(--font-sans);
60
+
61
+ /* layout — header height matches the design's 64px top bar */
62
+ --container: 1200px;
63
+ --sidebar: 232px;
64
+ --header-h: var(--nav-h);
65
+ }
66
+
67
+ * { box-sizing: border-box; }
68
+ /* `hidden` must win over component display rules (e.g. .provider-card flex),
69
+ so JS-toggled cards/panes (Docker mode when unavailable) actually hide. */
70
+ [hidden] { display: none !important; }
71
+ html, body { margin: 0; height: 100%; }
72
+ body {
73
+ background: var(--bg-canvas);
74
+ color: var(--fg);
75
+ font: var(--t-base)/var(--lh) var(--font-ui);
76
+ display: flex;
77
+ flex-direction: column;
78
+ -webkit-font-smoothing: antialiased;
79
+ text-rendering: optimizeLegibility;
80
+ }
81
+
82
+ button, input, select, textarea { font-family: inherit; font-size: inherit; }
83
+ :focus-visible { outline: none; box-shadow: var(--focus-ring); }
84
+ a { color: var(--accent); text-decoration: none; }
85
+ a:hover { text-decoration: underline; text-underline-offset: 2px; }
86
+ code, .mono { font-family: var(--font-mono); }
87
+
88
+ /* ════════════════════════════════════════════════════════════════════════
89
+ Top nav
90
+ ════════════════════════════════════════════════════════════════════════ */
91
+ header {
92
+ height: var(--header-h);
93
+ flex-shrink: 0;
94
+ border-bottom: 1px solid var(--border);
95
+ background: var(--bg-surface);
96
+ position: sticky;
97
+ top: 0;
98
+ z-index: 20;
99
+ }
100
+ .header-inner {
101
+ height: 100%;
102
+ display: flex;
103
+ align-items: center;
104
+ padding: 0 var(--s-5);
105
+ max-width: var(--container);
106
+ margin: 0 auto;
107
+ width: 100%;
108
+ }
109
+ .brand {
110
+ display: flex;
111
+ align-items: center;
112
+ gap: var(--s-3);
113
+ padding-right: var(--s-5);
114
+ margin-right: var(--s-5);
115
+ border-right: 1px solid var(--border);
116
+ height: 100%;
117
+ }
118
+ .brand-mark {
119
+ width: 20px;
120
+ height: 20px;
121
+ display: block;
122
+ flex-shrink: 0;
123
+ }
124
+ .brand-name {
125
+ font-weight: 600;
126
+ font-size: var(--t-md);
127
+ letter-spacing: -0.005em;
128
+ }
129
+ .brand-badge {
130
+ font-family: var(--font-mono);
131
+ font-size: 10px;
132
+ font-weight: 500;
133
+ background: var(--bg-surface-2);
134
+ color: var(--fg-3);
135
+ padding: 2px 6px;
136
+ border: 1px solid var(--border);
137
+ text-transform: lowercase;
138
+ letter-spacing: 0.04em;
139
+ }
140
+
141
+ nav { display: flex; flex: 1; height: 100%; }
142
+ nav a {
143
+ display: flex;
144
+ align-items: center;
145
+ height: 100%;
146
+ padding: 0 var(--s-3);
147
+ color: var(--fg-3);
148
+ text-decoration: none;
149
+ font-size: var(--t-base);
150
+ font-weight: 500;
151
+ border-bottom: 2px solid transparent;
152
+ margin-bottom: -1px; /* overlap header border */
153
+ }
154
+ nav a:hover { color: var(--fg); text-decoration: none; }
155
+ nav a.active {
156
+ color: var(--fg);
157
+ border-bottom-color: var(--accent);
158
+ }
159
+
160
+ .conn-status {
161
+ display: inline-flex;
162
+ align-items: center;
163
+ gap: var(--s-2);
164
+ font-size: var(--t-sm);
165
+ color: var(--fg-3);
166
+ margin-left: auto;
167
+ }
168
+ .conn-status::before {
169
+ content: "";
170
+ width: 6px;
171
+ height: 6px;
172
+ background: var(--fg-4);
173
+ display: inline-block;
174
+ }
175
+ .conn-status.ok { color: var(--ok); }
176
+ .conn-status.ok::before { background: var(--ok); }
177
+ .conn-status.err { color: var(--err); }
178
+ .conn-status.err::before { background: var(--err); }
179
+
180
+ /* ════════════════════════════════════════════════════════════════════════
181
+ Main layout
182
+ ════════════════════════════════════════════════════════════════════════ */
183
+ main {
184
+ flex: 1;
185
+ padding: var(--s-6) var(--s-5) var(--s-8);
186
+ max-width: var(--container);
187
+ margin: 0 auto;
188
+ width: 100%;
189
+ }
190
+ .view { display: none; }
191
+ .view.active { display: block; }
192
+
193
+ .section-head {
194
+ display: flex;
195
+ align-items: flex-end;
196
+ justify-content: space-between;
197
+ gap: var(--s-5);
198
+ margin-bottom: var(--s-5);
199
+ padding-bottom: var(--s-5);
200
+ border-bottom: 1px solid var(--border);
201
+ }
202
+ .section-head .title-block { min-width: 0; }
203
+ .section-head h2 {
204
+ margin: 0 0 var(--s-2);
205
+ font-size: var(--t-xl);
206
+ font-weight: 600;
207
+ letter-spacing: -0.015em;
208
+ line-height: var(--lh-tight);
209
+ }
210
+ .section-head p {
211
+ margin: 0;
212
+ color: var(--fg-3);
213
+ font-size: var(--t-base);
214
+ max-width: 640px;
215
+ }
216
+ .section-head .actions {
217
+ display: flex;
218
+ gap: var(--s-2);
219
+ align-items: center;
220
+ flex-shrink: 0;
221
+ }
222
+
223
+ h3.section-sub {
224
+ font-size: var(--t-xs);
225
+ text-transform: uppercase;
226
+ letter-spacing: 0.08em;
227
+ color: var(--fg-3);
228
+ margin: var(--s-6) 0 var(--s-3);
229
+ font-weight: 600;
230
+ }
231
+
232
+ /* ════════════════════════════════════════════════════════════════════════
233
+ Buttons (sharp, no radius)
234
+ ════════════════════════════════════════════════════════════════════════ */
235
+ .btn[hidden] { display: none !important; }
236
+ .btn {
237
+ display: inline-flex;
238
+ align-items: center;
239
+ gap: var(--s-2);
240
+ padding: 6px var(--s-3);
241
+ height: 32px;
242
+ border: 1px solid var(--border-2);
243
+ background: var(--bg-surface);
244
+ color: var(--fg);
245
+ font-size: var(--t-base);
246
+ font-weight: 500;
247
+ cursor: pointer;
248
+ transition: background 80ms ease, border-color 80ms ease;
249
+ white-space: nowrap;
250
+ }
251
+ .btn:hover { background: var(--bg-surface-2); border-color: var(--border-strong); }
252
+ .btn:disabled { opacity: 0.4; cursor: not-allowed; }
253
+ .btn.primary {
254
+ background: var(--accent);
255
+ color: var(--accent-fg);
256
+ border-color: var(--accent);
257
+ font-weight: 600;
258
+ }
259
+ .btn.primary:hover { background: var(--accent-2); border-color: var(--accent-2); }
260
+ .btn.danger {
261
+ border-color: rgba(226,100,100,0.40);
262
+ color: var(--err);
263
+ }
264
+ .btn.danger:hover { background: rgba(226,100,100,0.08); }
265
+ .btn.ghost {
266
+ background: transparent;
267
+ border-color: transparent;
268
+ color: var(--fg-3);
269
+ }
270
+ .btn.ghost:hover { color: var(--fg); background: var(--bg-surface-2); }
271
+ .btn.small { height: 26px; padding: 4px var(--s-2); font-size: var(--t-sm); }
272
+ .btn.large { height: 40px; padding: 8px var(--s-4); font-size: var(--t-md); }
273
+
274
+ /* ════════════════════════════════════════════════════════════════════════
275
+ Panels / cards
276
+ ════════════════════════════════════════════════════════════════════════ */
277
+ .panel {
278
+ background: var(--bg-surface);
279
+ border: 1px solid var(--border);
280
+ }
281
+ .panel-pad { padding: var(--s-5); }
282
+ .panel-head {
283
+ padding: var(--s-3) var(--s-4);
284
+ border-bottom: 1px solid var(--border);
285
+ display: flex;
286
+ align-items: center;
287
+ justify-content: space-between;
288
+ background: var(--bg-surface);
289
+ }
290
+ .panel-head .title { font-size: var(--t-sm); font-weight: 600; color: var(--fg-2); text-transform: uppercase; letter-spacing: 0.06em; }
291
+
292
+ .stat-grid {
293
+ display: grid;
294
+ grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
295
+ gap: 1px;
296
+ background: var(--border);
297
+ border: 1px solid var(--border);
298
+ }
299
+ .stat {
300
+ background: var(--bg-surface);
301
+ padding: var(--s-4) var(--s-5);
302
+ display: flex;
303
+ flex-direction: column;
304
+ gap: var(--s-1);
305
+ }
306
+ .stat .lbl {
307
+ font-size: var(--t-xs);
308
+ text-transform: uppercase;
309
+ letter-spacing: 0.06em;
310
+ color: var(--fg-3);
311
+ font-weight: 500;
312
+ }
313
+ .stat .val {
314
+ font-size: var(--t-xl);
315
+ font-weight: 600;
316
+ letter-spacing: -0.02em;
317
+ font-family: var(--font-mono);
318
+ }
319
+ .stat .sub { color: var(--fg-3); font-size: var(--t-sm); }
320
+
321
+ /* ════════════════════════════════════════════════════════════════════════
322
+ Key-value rows (replaces dl)
323
+ ════════════════════════════════════════════════════════════════════════ */
324
+ .kv {
325
+ border: 1px solid var(--border);
326
+ background: var(--bg-surface);
327
+ }
328
+ .kv .row {
329
+ display: grid;
330
+ grid-template-columns: minmax(180px, max-content) 1fr;
331
+ gap: var(--s-5);
332
+ padding: var(--s-3) var(--s-5);
333
+ border-bottom: 1px solid var(--border);
334
+ align-items: baseline;
335
+ }
336
+ .kv .row:last-child { border-bottom: none; }
337
+ .kv .row .k { color: var(--fg-3); font-size: var(--t-sm); }
338
+ .kv .row .v { font-family: var(--font-mono); font-size: var(--t-base); overflow-wrap: anywhere; }
339
+
340
+ /* ════════════════════════════════════════════════════════════════════════
341
+ Tables
342
+ ════════════════════════════════════════════════════════════════════════ */
343
+ .table-wrap {
344
+ background: var(--bg-surface);
345
+ border: 1px solid var(--border);
346
+ overflow: hidden;
347
+ }
348
+ table { width: 100%; border-collapse: collapse; }
349
+ th, td {
350
+ text-align: left;
351
+ padding: var(--s-3) var(--s-4);
352
+ border-bottom: 1px solid var(--border);
353
+ font-size: var(--t-base);
354
+ vertical-align: middle;
355
+ }
356
+ thead th {
357
+ background: var(--bg-surface-2);
358
+ color: var(--fg-3);
359
+ font-weight: 500;
360
+ font-size: var(--t-xs);
361
+ text-transform: uppercase;
362
+ letter-spacing: 0.06em;
363
+ padding: var(--s-2) var(--s-4);
364
+ }
365
+ tbody tr { transition: background 80ms ease; }
366
+ tbody tr:hover { background: var(--bg-surface-2); }
367
+ tbody tr:last-child td { border-bottom: none; }
368
+ td.mono { font-family: var(--font-mono); font-size: var(--t-sm); }
369
+ td .device-name { font-weight: 500; }
370
+ td .device-sub { display: block; color: var(--fg-3); font-size: var(--t-xs); margin-top: 2px; font-family: var(--font-mono); }
371
+ td.actions-cell { text-align: right; white-space: nowrap; }
372
+ td.actions-cell .btn { margin-left: var(--s-2); }
373
+
374
+ .row-meta {
375
+ display: flex;
376
+ align-items: center;
377
+ gap: var(--s-3);
378
+ padding: var(--s-2) 0;
379
+ margin-bottom: var(--s-3);
380
+ color: var(--fg-3);
381
+ font-size: var(--t-sm);
382
+ }
383
+
384
+ .empty {
385
+ padding: var(--s-7) var(--s-5);
386
+ text-align: center;
387
+ color: var(--fg-3);
388
+ font-size: var(--t-base);
389
+ }
390
+
391
+ /* ════════════════════════════════════════════════════════════════════════
392
+ Forms
393
+ ════════════════════════════════════════════════════════════════════════ */
394
+ .field { display: block; margin-bottom: var(--s-4); }
395
+ .field > .label,
396
+ form label > span {
397
+ display: block;
398
+ color: var(--fg-2);
399
+ font-size: var(--t-sm);
400
+ font-weight: 500;
401
+ margin-bottom: var(--s-2);
402
+ }
403
+ .field > .help, .help-text, span.help {
404
+ display: block;
405
+ margin-top: var(--s-2);
406
+ color: var(--fg-3);
407
+ font-size: var(--t-sm);
408
+ }
409
+
410
+ form input,
411
+ form select,
412
+ form textarea,
413
+ .onboarding-content input:not([type="radio"]):not([type="checkbox"]),
414
+ .onboarding-content select,
415
+ .input {
416
+ width: 100%;
417
+ height: 36px;
418
+ padding: 0 var(--s-3);
419
+ border: 1px solid var(--border-2);
420
+ background: var(--bg-canvas);
421
+ color: var(--fg);
422
+ font: var(--t-base) var(--font-mono);
423
+ transition: border-color 80ms ease;
424
+ }
425
+ form textarea { padding: var(--s-2) var(--s-3); height: auto; min-height: 80px; resize: vertical; }
426
+ form select,
427
+ .onboarding-content select { padding-right: var(--s-5); }
428
+ form input:focus, form select:focus, form textarea:focus,
429
+ .onboarding-content input:focus, .onboarding-content select:focus,
430
+ .input:focus { outline: none; border-color: var(--accent); }
431
+
432
+ form .row-2col,
433
+ .onboarding-content .row-2col { display: grid; grid-template-columns: 1fr 1fr; gap: var(--s-3); }
434
+ form .actions { display: flex; gap: var(--s-2); margin-top: var(--s-2); }
435
+
436
+ /* Forms read best at a fixed measure — don't let inputs stretch the full
437
+ container width. Modal forms are exempt (already bounded by the modal). */
438
+ .view form.panel,
439
+ .onboarding-content .wizard-step .field,
440
+ .onboarding-content #ob-db-url,
441
+ .onboarding-content #ob-db-fields,
442
+ .onboarding-content #ob-llm-fields,
443
+ .onboarding-content #ob-emb-fields { max-width: 560px; }
444
+
445
+ pre.result {
446
+ background: var(--bg-canvas);
447
+ border: 1px solid var(--border);
448
+ padding: var(--s-3) var(--s-4);
449
+ font: var(--t-sm) var(--font-mono);
450
+ white-space: pre-wrap;
451
+ word-break: break-word;
452
+ max-height: 320px;
453
+ overflow: auto;
454
+ margin: var(--s-4) 0 0;
455
+ }
456
+ pre.result.ok { border-color: rgba(78,196,108,0.30); }
457
+ pre.result.err { border-color: rgba(226,100,100,0.30); }
458
+
459
+ /* ════════════════════════════════════════════════════════════════════════
460
+ Badges + status pills
461
+ ════════════════════════════════════════════════════════════════════════ */
462
+ .badge {
463
+ display: inline-block;
464
+ background: var(--bg-surface-2);
465
+ color: var(--fg-3);
466
+ font-size: var(--t-xs);
467
+ font-weight: 500;
468
+ padding: 2px var(--s-2);
469
+ text-transform: uppercase;
470
+ letter-spacing: 0.06em;
471
+ border: 1px solid var(--border);
472
+ }
473
+ .badge.ok { background: var(--ok-bg); color: var(--ok); border-color: rgba(78,196,108,0.30); }
474
+ .badge.warn { background: var(--warn-bg); color: var(--warn); border-color: rgba(232,169,74,0.30); }
475
+ .badge.err { background: var(--err-bg); color: var(--err); border-color: rgba(226,100,100,0.30); }
476
+ .badge.info { background: var(--info-bg); color: var(--accent); border-color: rgba(94,140,255,0.30); }
477
+
478
+ .pill {
479
+ display: inline-flex;
480
+ align-items: center;
481
+ gap: var(--s-2);
482
+ padding: 3px var(--s-3);
483
+ background: var(--bg-surface-2);
484
+ color: var(--fg-3);
485
+ font-size: var(--t-xs);
486
+ font-weight: 500;
487
+ border: 1px solid var(--border);
488
+ }
489
+ .pill::before {
490
+ content: "";
491
+ width: 6px; height: 6px;
492
+ background: var(--fg-4);
493
+ }
494
+ .pill.ok { background: var(--ok-bg); color: var(--ok); border-color: rgba(78,196,108,0.30); }
495
+ .pill.ok::before { background: var(--ok); }
496
+ .pill.warn { background: var(--warn-bg); color: var(--warn); border-color: rgba(232,169,74,0.30); }
497
+ .pill.warn::before { background: var(--warn); }
498
+ .pill.err { background: var(--err-bg); color: var(--err); border-color: rgba(226,100,100,0.30); }
499
+ .pill.err::before { background: var(--err); }
500
+
501
+ /* ════════════════════════════════════════════════════════════════════════
502
+ Activity — causal trace log
503
+ ════════════════════════════════════════════════════════════════════════ */
504
+ .trace-filters { display: flex; gap: var(--s-2); margin-bottom: var(--s-4); }
505
+ .chip {
506
+ height: 28px;
507
+ padding: 0 var(--s-3);
508
+ background: var(--bg-surface);
509
+ border: 1px solid var(--border-2);
510
+ color: var(--fg-3);
511
+ font-size: var(--t-sm);
512
+ font-weight: 500;
513
+ cursor: pointer;
514
+ }
515
+ .chip:hover { color: var(--fg); border-color: var(--border-strong); }
516
+ .chip.active { color: var(--accent-fg); background: var(--accent); border-color: var(--accent); }
517
+
518
+ .trace-list { list-style: none; padding: 0; margin: 0; border: 1px solid var(--border); }
519
+ .trace-card { background: var(--bg-surface); border-bottom: 1px solid var(--border); }
520
+ .trace-card:last-child { border-bottom: none; }
521
+ @keyframes trace-flash { from { background: var(--info-bg); } to { background: var(--bg-surface); } }
522
+ .trace-card.flash { animation: trace-flash 1.2s ease-out; }
523
+
524
+ .trace-head {
525
+ width: 100%;
526
+ display: flex;
527
+ align-items: center;
528
+ gap: var(--s-3);
529
+ padding: var(--s-3) var(--s-4);
530
+ background: transparent;
531
+ border: none;
532
+ cursor: pointer;
533
+ text-align: left;
534
+ color: var(--fg);
535
+ font: inherit;
536
+ }
537
+ .trace-head.static { cursor: default; }
538
+ .trace-head:hover:not(.static) { background: var(--bg-surface-2); }
539
+ .trace-caret { color: var(--fg-3); font-size: 10px; transition: transform 100ms ease; flex-shrink: 0; }
540
+ .trace-card.open .trace-caret { transform: rotate(90deg); }
541
+ .trace-ts { color: var(--fg-3); font-family: var(--font-mono); font-size: var(--t-xs); flex-shrink: 0; }
542
+ .trace-summary { flex: 1; min-width: 0; font-size: var(--t-base); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
543
+ .trace-ns { font-family: var(--font-mono); font-size: var(--t-xs); color: var(--fg-3); background: var(--bg-surface-2); padding: 1px 6px; border: 1px solid var(--border); flex-shrink: 0; }
544
+ .trace-dur { color: var(--fg-3); font-family: var(--font-mono); font-size: var(--t-xs); flex-shrink: 0; min-width: 44px; text-align: right; }
545
+
546
+ .trace-detail { padding: var(--s-2) var(--s-4) var(--s-4); border-top: 1px solid var(--border); background: var(--bg-canvas); }
547
+ .trace-block { margin-top: var(--s-4); }
548
+ .trace-block:first-child { margin-top: var(--s-3); }
549
+ .trace-block-h { font-size: var(--t-xs); text-transform: uppercase; letter-spacing: 0.06em; color: var(--fg-3); font-weight: 600; margin-bottom: var(--s-2); }
550
+ .kvline { display: inline-block; margin-right: var(--s-4); font-size: var(--t-sm); }
551
+ .kvline .muted { margin-right: 4px; }
552
+ .synth { background: var(--bg-surface); border: 1px solid var(--border); border-left: 2px solid var(--accent); padding: var(--s-3) var(--s-4); font-size: var(--t-base); line-height: 1.55; }
553
+ .trace-json { background: var(--bg-surface); border: 1px solid var(--border); padding: var(--s-3); font: var(--t-xs) var(--font-mono); white-space: pre-wrap; word-break: break-word; max-height: 360px; overflow: auto; margin: var(--s-2) 0 0; }
554
+
555
+ .trace-table-wrap { border: 1px solid var(--border); overflow-x: auto; }
556
+ table.trace-table { width: 100%; border-collapse: collapse; font-size: var(--t-sm); }
557
+ table.trace-table th { background: var(--bg-surface-2); color: var(--fg-3); font-size: var(--t-xs); text-transform: uppercase; letter-spacing: 0.04em; font-weight: 500; padding: var(--s-2) var(--s-3); text-align: left; white-space: nowrap; }
558
+ table.trace-table td { padding: var(--s-2) var(--s-3); border-top: 1px solid var(--border); vertical-align: top; }
559
+ table.trace-table td.num { font-family: var(--font-mono); font-size: var(--t-xs); text-align: right; white-space: nowrap; color: var(--fg-2); }
560
+ table.trace-table td.num.strong { color: var(--fg); font-weight: 600; }
561
+ table.trace-table td.fact-cell { width: 100%; line-height: 1.45; }
562
+ table.trace-table td.audm-cell { font-size: var(--t-xs); color: var(--fg-2); white-space: nowrap; }
563
+ .tag { display: inline-block; font-size: 10px; text-transform: uppercase; letter-spacing: 0.04em; color: var(--fg-3); background: var(--bg-surface-2); border: 1px solid var(--border); padding: 0 4px; margin-left: 4px; }
564
+ .tag.vital { color: var(--warn); border-color: rgba(232,169,74,0.30); background: var(--warn-bg); }
565
+
566
+ /* ════════════════════════════════════════════════════════════════════════
567
+ Methods grid
568
+ ════════════════════════════════════════════════════════════════════════ */
569
+ .methods-grid {
570
+ display: grid;
571
+ grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));
572
+ gap: 1px;
573
+ background: var(--border);
574
+ border: 1px solid var(--border);
575
+ list-style: none;
576
+ padding: 0;
577
+ margin: 0;
578
+ }
579
+ .methods-grid li {
580
+ background: var(--bg-surface);
581
+ padding: var(--s-3) var(--s-4);
582
+ font: var(--t-sm) var(--font-mono);
583
+ display: flex;
584
+ align-items: center;
585
+ gap: var(--s-3);
586
+ }
587
+
588
+ /* ════════════════════════════════════════════════════════════════════════
589
+ Modal
590
+ ════════════════════════════════════════════════════════════════════════ */
591
+ .modal[hidden] { display: none !important; }
592
+ .modal {
593
+ position: fixed;
594
+ inset: 0;
595
+ background: var(--bg-overlay);
596
+ display: flex;
597
+ align-items: flex-start;
598
+ justify-content: center;
599
+ z-index: 100;
600
+ padding: 96px var(--s-5) var(--s-5);
601
+ overflow-y: auto;
602
+ animation: modal-fade 100ms ease-out;
603
+ }
604
+ @keyframes modal-fade { from { opacity: 0; } to { opacity: 1; } }
605
+ .modal-body {
606
+ background: var(--bg-surface);
607
+ border: 1px solid var(--border-strong);
608
+ width: 100%;
609
+ max-width: 560px;
610
+ animation: modal-pop 120ms ease-out;
611
+ box-shadow: 0 24px 60px rgba(0,0,0,0.6);
612
+ }
613
+ @keyframes modal-pop { from { transform: translateY(-4px); } to { transform: translateY(0); } }
614
+ .modal-header {
615
+ display: flex;
616
+ align-items: center;
617
+ justify-content: space-between;
618
+ padding: var(--s-3) var(--s-5);
619
+ border-bottom: 1px solid var(--border);
620
+ }
621
+ .modal-header h3 {
622
+ margin: 0;
623
+ font-size: var(--t-md);
624
+ font-weight: 600;
625
+ letter-spacing: -0.01em;
626
+ }
627
+ .modal-close {
628
+ background: transparent;
629
+ border: none;
630
+ cursor: pointer;
631
+ color: var(--fg-3);
632
+ width: 28px; height: 28px;
633
+ display: flex;
634
+ align-items: center;
635
+ justify-content: center;
636
+ font-size: var(--t-lg);
637
+ font-family: var(--font-ui);
638
+ }
639
+ .modal-close:hover { color: var(--fg); background: var(--bg-surface-2); }
640
+ .modal-content { padding: var(--s-5); }
641
+ .modal-footer {
642
+ display: flex;
643
+ gap: var(--s-2);
644
+ justify-content: flex-end;
645
+ padding: var(--s-3) var(--s-5);
646
+ border-top: 1px solid var(--border);
647
+ background: var(--bg-surface-2);
648
+ }
649
+ .modal-content form { background: transparent; border: none; padding: 0; }
650
+
651
+ /* Code result inside modal */
652
+ .code-card {
653
+ background: var(--bg-canvas);
654
+ border: 1px solid var(--accent);
655
+ padding: var(--s-3) var(--s-4);
656
+ margin-bottom: var(--s-3);
657
+ }
658
+ .code-card .lbl {
659
+ font-size: var(--t-xs);
660
+ color: var(--fg-3);
661
+ text-transform: uppercase;
662
+ letter-spacing: 0.06em;
663
+ margin-bottom: var(--s-2);
664
+ }
665
+ .code-card .code {
666
+ font: 600 var(--t-lg) var(--font-mono);
667
+ color: var(--fg);
668
+ letter-spacing: 0.03em;
669
+ display: flex;
670
+ align-items: center;
671
+ gap: var(--s-2);
672
+ }
673
+ .code-card .join-cmd {
674
+ margin-top: var(--s-3);
675
+ padding: var(--s-3) var(--s-4);
676
+ background: var(--bg-surface);
677
+ font: var(--t-sm) var(--font-mono);
678
+ color: var(--fg-2);
679
+ word-break: break-all;
680
+ }
681
+ .copy-btn {
682
+ background: transparent;
683
+ border: 1px solid var(--border-2);
684
+ color: var(--fg-3);
685
+ padding: 2px var(--s-2);
686
+ font: var(--t-xs) var(--font-ui);
687
+ cursor: pointer;
688
+ }
689
+ .copy-btn:hover { color: var(--fg); border-color: var(--fg-3); }
690
+
691
+ /* Radio cards */
692
+ .radio-card-group { display: flex; flex-direction: column; gap: var(--s-2); margin: var(--s-2) 0; }
693
+ .radio-card {
694
+ display: flex;
695
+ gap: var(--s-3);
696
+ align-items: flex-start;
697
+ padding: var(--s-3) var(--s-4);
698
+ background: var(--bg-canvas);
699
+ border: 1px solid var(--border-2);
700
+ cursor: pointer;
701
+ transition: border-color 80ms ease;
702
+ }
703
+ .radio-card:hover { border-color: var(--accent); }
704
+ .radio-card input { width: auto; height: auto; margin-top: 3px; accent-color: var(--accent); }
705
+ .radio-card .rc-title { font-weight: 500; font-size: var(--t-base); color: var(--fg); }
706
+ .radio-card .rc-desc { color: var(--fg-3); font-size: var(--t-sm); margin-top: 2px; }
707
+ .radio-card.danger:hover { border-color: var(--err); }
708
+ .radio-card.selected { border-color: var(--accent); background: var(--info-bg); }
709
+
710
+ /* ════════════════════════════════════════════════════════════════════════
711
+ Onboarding wizard
712
+ ════════════════════════════════════════════════════════════════════════ */
713
+ .onboarding {
714
+ position: fixed;
715
+ inset: 0;
716
+ background: var(--bg-canvas);
717
+ display: grid;
718
+ grid-template-columns: var(--sidebar) 1fr;
719
+ z-index: 50;
720
+ }
721
+ .onboarding[hidden] { display: none !important; }
722
+ .onboarding-sidebar {
723
+ background: var(--bg-surface);
724
+ border-right: 1px solid var(--border);
725
+ padding: var(--s-6) var(--s-5);
726
+ display: flex;
727
+ flex-direction: column;
728
+ gap: var(--s-5);
729
+ }
730
+ .onboarding-sidebar .brand {
731
+ border-right: none;
732
+ padding-right: 0;
733
+ margin-right: 0;
734
+ height: auto;
735
+ }
736
+ .onboarding-steps {
737
+ list-style: none;
738
+ padding: 0;
739
+ margin: 0;
740
+ display: flex;
741
+ flex-direction: column;
742
+ gap: var(--s-1);
743
+ }
744
+ .onboarding-step {
745
+ display: grid;
746
+ grid-template-columns: 24px 1fr;
747
+ gap: var(--s-3);
748
+ padding: var(--s-3);
749
+ align-items: flex-start;
750
+ cursor: default;
751
+ border: 1px solid transparent;
752
+ }
753
+ .onboarding-step .num {
754
+ display: flex;
755
+ align-items: center;
756
+ justify-content: center;
757
+ width: 22px;
758
+ height: 22px;
759
+ background: var(--bg-surface-2);
760
+ color: var(--fg-3);
761
+ font: var(--t-sm) var(--font-mono);
762
+ font-weight: 600;
763
+ border: 1px solid var(--border);
764
+ }
765
+ .onboarding-step.active {
766
+ border-color: var(--border);
767
+ background: var(--bg-surface-2);
768
+ }
769
+ .onboarding-step.active .num {
770
+ background: var(--accent);
771
+ color: var(--accent-fg);
772
+ border-color: var(--accent);
773
+ }
774
+ .onboarding-step.done .num {
775
+ background: var(--ok);
776
+ color: var(--bg-canvas);
777
+ border-color: var(--ok);
778
+ }
779
+ .onboarding-step .label { font-size: var(--t-base); font-weight: 500; color: var(--fg); }
780
+ .onboarding-step .desc { font-size: var(--t-xs); color: var(--fg-3); margin-top: 2px; }
781
+ .onboarding-step.future .label { color: var(--fg-3); }
782
+
783
+ .onboarding-content {
784
+ padding: var(--s-7) var(--s-7) var(--s-8);
785
+ overflow-y: auto;
786
+ max-width: 760px;
787
+ }
788
+ .onboarding-content h1 {
789
+ font-size: var(--t-3xl);
790
+ font-weight: 600;
791
+ letter-spacing: -0.025em;
792
+ margin: 0 0 var(--s-2);
793
+ line-height: var(--lh-tight);
794
+ }
795
+ .onboarding-content .lede {
796
+ color: var(--fg-3);
797
+ font-size: var(--t-md);
798
+ margin: 0 0 var(--s-6);
799
+ max-width: 520px;
800
+ }
801
+ .onboarding-content h2 {
802
+ font-size: var(--t-lg);
803
+ font-weight: 600;
804
+ margin: var(--s-6) 0 var(--s-3);
805
+ letter-spacing: -0.01em;
806
+ }
807
+
808
+ .wizard-step { display: none; }
809
+ .wizard-step.active { display: block; }
810
+ .wizard-actions {
811
+ display: flex;
812
+ justify-content: space-between;
813
+ gap: var(--s-3);
814
+ margin-top: var(--s-6);
815
+ padding-top: var(--s-5);
816
+ border-top: 1px solid var(--border);
817
+ }
818
+ .wizard-actions .spacer { flex: 1; }
819
+
820
+ .provider-card-grid {
821
+ display: grid;
822
+ grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
823
+ gap: var(--s-3);
824
+ }
825
+ .provider-card {
826
+ position: relative;
827
+ display: flex;
828
+ flex-direction: column;
829
+ gap: var(--s-2);
830
+ padding: var(--s-4);
831
+ background: var(--bg-surface);
832
+ border: 1px solid var(--border);
833
+ cursor: pointer;
834
+ transition: border-color 80ms ease, background 80ms ease;
835
+ }
836
+ .provider-card:hover { border-color: var(--border-strong); }
837
+ .provider-card.selected {
838
+ border-color: var(--accent);
839
+ background: var(--info-bg);
840
+ }
841
+ .provider-card .name { font-weight: 600; font-size: var(--t-md); }
842
+ .provider-card .hint { color: var(--fg-3); font-size: var(--t-sm); }
843
+ .provider-card .check {
844
+ position: absolute;
845
+ top: var(--s-3);
846
+ right: var(--s-3);
847
+ width: 16px;
848
+ height: 16px;
849
+ background: var(--accent);
850
+ display: none;
851
+ }
852
+ .provider-card.selected .check { display: block; }
853
+
854
+ /* ════════════════════════════════════════════════════════════════════════
855
+ Footer
856
+ ════════════════════════════════════════════════════════════════════════ */
857
+ footer {
858
+ padding: var(--s-3) 0;
859
+ flex-shrink: 0;
860
+ border-top: 1px solid var(--border);
861
+ background: var(--bg-surface);
862
+ color: var(--fg-3);
863
+ font-size: var(--t-xs);
864
+ }
865
+ footer .footer-inner {
866
+ display: flex;
867
+ justify-content: space-between;
868
+ max-width: var(--container);
869
+ margin: 0 auto;
870
+ padding: 0 var(--s-5);
871
+ width: 100%;
872
+ }
873
+
874
+ /* ════════════════════════════════════════════════════════════════════════
875
+ Utilities
876
+ ════════════════════════════════════════════════════════════════════════ */
877
+ .muted { color: var(--fg-3); }
878
+ .spacer { flex: 1; }
879
+ .flex-row { display: flex; align-items: center; gap: var(--s-3); }
880
+ .text-sm { font-size: var(--t-sm); }
881
+ .text-xs { font-size: var(--t-xs); }
882
+
883
+ /* ════════════════════════════════════════════════════════════════════════
884
+ Design-system components (Phase 7/8) — toasts, connector cards, DB flow.
885
+ All sharp-edged, hairline-bordered, status as a 7px square + word.
886
+ ════════════════════════════════════════════════════════════════════════ */
887
+
888
+ /* ── Toasts ─────────────────────────────────────────────────────────────── */
889
+ .toast-stack {
890
+ position: fixed; top: var(--s-4); right: var(--s-4); z-index: 100;
891
+ display: flex; flex-direction: column; gap: var(--s-2); max-width: 400px;
892
+ }
893
+ .toast {
894
+ display: flex; gap: var(--s-3); align-items: flex-start;
895
+ background: var(--surface-1); border: 1px solid var(--border-2);
896
+ padding: var(--s-3) var(--s-4); box-shadow: var(--shadow-pop);
897
+ }
898
+ .toast-sq { width: 7px; height: 7px; margin-top: 6px; flex: none; background: var(--fg-3); }
899
+ .toast-error .toast-sq { background: var(--danger); }
900
+ .toast-success .toast-sq { background: var(--ok); }
901
+ .toast-info .toast-sq { background: var(--brand); }
902
+ .toast-body { display: flex; flex-direction: column; gap: 3px; min-width: 0; flex: 1; }
903
+ .toast-msg { font-size: var(--t-base); color: var(--fg-1); line-height: 1.4; }
904
+ .toast-hint { font-size: var(--t-sm); color: var(--fg-3); line-height: 1.4; }
905
+ .toast-code {
906
+ align-self: flex-start; margin-top: 2px; font-family: var(--font-mono);
907
+ font-size: var(--t-xs); color: var(--fg-4); border: 1px solid var(--border-2);
908
+ padding: 1px 6px; border-radius: var(--radius-1);
909
+ }
910
+ .toast-x { background: none; border: none; color: var(--fg-4); cursor: pointer; font-size: 16px; line-height: 1; padding: 0 2px; }
911
+ .toast-x:hover { color: var(--fg-2); }
912
+
913
+ /* ── Connector cards (click-to-connect) ─────────────────────────────────── */
914
+ .connector-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); gap: var(--s-3); margin-top: var(--s-4); }
915
+ .connector-card {
916
+ display: flex; flex-direction: column; gap: var(--s-2);
917
+ border: 1px solid var(--border-2); background: var(--surface-1);
918
+ padding: var(--s-4); border-radius: var(--radius-0);
919
+ }
920
+ .connector-card .cc-top { display: flex; align-items: center; justify-content: space-between; gap: var(--s-3); }
921
+ .connector-card .cc-name { font-size: var(--t-md); font-weight: var(--w-semibold); color: var(--fg-1); }
922
+ .connector-card .cc-hint { font-size: var(--t-sm); color: var(--fg-3); line-height: 1.45; }
923
+ .connector-card.unavailable { opacity: 0.55; }
924
+ .connector-card .cc-actions { margin-top: var(--s-2); }
925
+
926
+ /* status square + word (shared) */
927
+ .status-dot { display: inline-flex; align-items: center; gap: 7px; font-size: var(--t-sm); font-weight: 500; }
928
+ .status-dot .sq { width: 7px; height: 7px; flex: none; background: var(--fg-3); }
929
+ .status-dot.ok { color: var(--ok); } .status-dot.ok .sq { background: var(--ok); }
930
+ .status-dot.warn { color: var(--warn); } .status-dot.warn .sq { background: var(--warn); }
931
+ .status-dot.danger { color: var(--danger); } .status-dot.danger .sq { background: var(--danger); }
932
+ .status-dot.muted { color: var(--fg-3); } .status-dot.muted .sq { background: var(--fg-4); }
933
+
934
+ /* ── DB guided flow (linear status rows, replaces button-toggling) ──────── */
935
+ .db-flow { border: 1px solid var(--border-2); background: var(--surface-1); margin-top: var(--s-4); }
936
+ .db-flow-row {
937
+ display: grid; grid-template-columns: 24px 1fr auto; align-items: center; gap: var(--s-3);
938
+ padding: var(--s-3) var(--s-4); border-bottom: 1px solid var(--border-1);
939
+ }
940
+ .db-flow-row:last-child { border-bottom: none; }
941
+ .db-flow-row .step-sq { width: 8px; height: 8px; background: var(--fg-4); justify-self: center; }
942
+ .db-flow-row.active .step-sq { background: var(--brand); }
943
+ .db-flow-row.done .step-sq { background: var(--ok); }
944
+ .db-flow-row.error .step-sq { background: var(--danger); }
945
+ .db-flow-row .step-label { font-size: var(--t-base); color: var(--fg-2); }
946
+ .db-flow-row.done .step-label, .db-flow-row.active .step-label { color: var(--fg-1); }
947
+ .db-flow-row .step-detail { font-family: var(--font-mono); font-size: var(--t-sm); color: var(--fg-3); }