oficina-opencode 3.1.0 → 3.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (69) hide show
  1. package/README.md +1 -1
  2. package/commands/oficina.md +7 -6
  3. package/dashboard/.dom-check.html +1257 -0
  4. package/dashboard/README-DASHBOARD.md +64 -0
  5. package/dashboard/assets/factory.css +1543 -0
  6. package/dashboard/assets/tokens.css +208 -0
  7. package/dashboard/build-kanban-data.mjs +279 -0
  8. package/dashboard/dashboard.css +753 -0
  9. package/dashboard/dashboard.html +121 -0
  10. package/dashboard/dashboard.js +610 -0
  11. package/dashboard/data/snapshot.json +883 -0
  12. package/dashboard/debate.html +134 -0
  13. package/dashboard/factory/build-snapshot.mjs +89 -0
  14. package/dashboard/factory/factory-app.js +1185 -0
  15. package/dashboard/factory/factory-core.js +541 -0
  16. package/dashboard/factory/snapshot.js +850 -0
  17. package/dashboard/factory.html +350 -0
  18. package/dashboard/kanban-data.json +671 -0
  19. package/dashboard/kanban-source.js +643 -0
  20. package/dashboard/kanban.check.mjs +454 -0
  21. package/dashboard/kanban.html +1257 -0
  22. package/dashboard/leadership.html +1008 -0
  23. package/dashboard/lib/debate-app.js +1149 -0
  24. package/dashboard/lib/debate-core.js +698 -0
  25. package/dashboard/lib/debate-data.js +163 -0
  26. package/dashboard/lib/debate-demo.js +110 -0
  27. package/dashboard/lib/debate.css +1155 -0
  28. package/dashboard/lib/leadership-model.js +946 -0
  29. package/dashboard/probe.mjs +35 -0
  30. package/dashboard/scripts/serve.mjs +122 -0
  31. package/dashboard/scripts/snapshot-data.mjs +93 -0
  32. package/dashboard/scripts/snapshot.mjs +28 -0
  33. package/dashboard/server.mjs +242 -0
  34. package/dashboard/shot.mjs +54 -0
  35. package/dashboard/shots/desktop-gates.png +0 -0
  36. package/dashboard/shots/desktop-light.png +0 -0
  37. package/dashboard/shots/desktop-real.png +0 -0
  38. package/dashboard/shots/mobile.png +0 -0
  39. package/dashboard/test/factory-core.test.mjs +244 -0
  40. package/dashboard/tests/debate-core.test.mjs +336 -0
  41. package/dashboard/tests/leadership-model.test.mjs +404 -0
  42. package/dist/cli.js +24 -0
  43. package/dist/cli.js.map +1 -1
  44. package/dist/core/dashboard.d.ts +33 -0
  45. package/dist/core/dashboard.d.ts.map +1 -0
  46. package/dist/core/dashboard.js +115 -0
  47. package/dist/core/dashboard.js.map +1 -0
  48. package/dist/core/dispatch.d.ts.map +1 -1
  49. package/dist/core/dispatch.js +11 -0
  50. package/dist/core/dispatch.js.map +1 -1
  51. package/dist/core/environment.d.ts +28 -0
  52. package/dist/core/environment.d.ts.map +1 -0
  53. package/dist/core/environment.js +80 -0
  54. package/dist/core/environment.js.map +1 -0
  55. package/dist/core/systemPrompt.d.ts.map +1 -1
  56. package/dist/core/systemPrompt.js +3 -0
  57. package/dist/core/systemPrompt.js.map +1 -1
  58. package/dist/tools/index.d.ts +9 -1
  59. package/dist/tools/index.d.ts.map +1 -1
  60. package/dist/tools/index.js +26 -22
  61. package/dist/tools/index.js.bak +972 -0
  62. package/dist/tools/index.js.map +1 -1
  63. package/dist/v2.d.ts +5 -0
  64. package/dist/v2.d.ts.map +1 -1
  65. package/dist/v2.js +57 -5
  66. package/dist/v2.js.bak +517 -0
  67. package/dist/v2.js.map +1 -1
  68. package/docs/QUE-ES.md +1 -1
  69. package/package.json +4 -1
@@ -0,0 +1,1543 @@
1
+ /* ==========================================================================
2
+ dashboard/factory.html — "Agent Foundry" panel (card T-08)
3
+ Visual story: detect a coverage hole -> press a new ficha -> register it in
4
+ the dynamic catalog -> match the next card. All motion is CSS-driven and
5
+ respects prefers-reduced-motion.
6
+ ========================================================================== */
7
+
8
+ /* --- shell --------------------------------------------------------------- */
9
+
10
+ .shell {
11
+ min-height: 100vh;
12
+ display: grid;
13
+ grid-template-rows: auto minmax(0, 1fr) auto;
14
+ background: var(--of-bg);
15
+ }
16
+
17
+ .topbar {
18
+ display: flex;
19
+ align-items: center;
20
+ gap: var(--of-4);
21
+ padding: var(--of-4) var(--of-5);
22
+ border-bottom: 1px solid var(--of-line);
23
+ background:
24
+ radial-gradient(120% 180% at 0% 0%, var(--of-ember-soft), transparent 55%),
25
+ var(--of-panel);
26
+ flex-wrap: wrap;
27
+ }
28
+
29
+ .brand {
30
+ display: flex;
31
+ align-items: center;
32
+ gap: var(--of-3);
33
+ min-width: 0;
34
+ }
35
+
36
+ .brand-mark {
37
+ width: 38px;
38
+ height: 38px;
39
+ flex: none;
40
+ border: 1px solid var(--of-line-strong);
41
+ border-radius: var(--of-radius);
42
+ background: var(--of-panel-2);
43
+ display: grid;
44
+ place-items: center;
45
+ }
46
+ .brand-mark svg {
47
+ width: 22px;
48
+ height: 22px;
49
+ color: var(--of-ember);
50
+ }
51
+
52
+ .brand-text {
53
+ min-width: 0;
54
+ }
55
+ .brand-title {
56
+ margin: 0;
57
+ font-size: var(--of-text-lg);
58
+ font-weight: 650;
59
+ letter-spacing: 0.16em;
60
+ text-transform: uppercase;
61
+ line-height: 1.1;
62
+ }
63
+ .brand-sub {
64
+ margin: 2px 0 0;
65
+ font-family: var(--of-font-mono);
66
+ font-size: var(--of-text-2xs);
67
+ color: var(--of-ink-faint);
68
+ letter-spacing: 0.04em;
69
+ white-space: nowrap;
70
+ overflow: hidden;
71
+ text-overflow: ellipsis;
72
+ }
73
+ .brand-sub b {
74
+ color: var(--of-ink-dim);
75
+ font-weight: 500;
76
+ }
77
+
78
+ .topbar-spacer {
79
+ flex: 1 1 24px;
80
+ }
81
+
82
+ .status-strip {
83
+ display: flex;
84
+ align-items: center;
85
+ gap: var(--of-2);
86
+ flex-wrap: wrap;
87
+ }
88
+
89
+ .chip {
90
+ display: inline-flex;
91
+ align-items: center;
92
+ gap: 6px;
93
+ padding: 4px 9px;
94
+ border: 1px solid var(--of-line);
95
+ border-radius: var(--of-radius-pill);
96
+ background: var(--of-panel-2);
97
+ font-family: var(--of-font-mono);
98
+ font-size: var(--of-text-3xs);
99
+ letter-spacing: 0.09em;
100
+ text-transform: uppercase;
101
+ color: var(--of-ink-dim);
102
+ white-space: nowrap;
103
+ }
104
+ .chip .dot {
105
+ width: 6px;
106
+ height: 6px;
107
+ border-radius: 50%;
108
+ background: var(--of-ink-faint);
109
+ }
110
+ .chip[data-live="live"] .dot {
111
+ background: var(--of-ok);
112
+ box-shadow: 0 0 0 3px var(--of-ok-soft);
113
+ animation: pulse-dot 2s var(--of-ease) infinite;
114
+ }
115
+ .chip[data-live="static"] .dot {
116
+ background: var(--of-steel);
117
+ }
118
+ .chip[data-live="snapshot"] .dot {
119
+ background: var(--of-warn);
120
+ }
121
+ .chip[data-live="error"] .dot {
122
+ background: var(--of-bad);
123
+ }
124
+
125
+ @keyframes pulse-dot {
126
+ 0%,
127
+ 100% {
128
+ box-shadow: 0 0 0 3px var(--of-ok-soft);
129
+ }
130
+ 50% {
131
+ box-shadow: 0 0 0 6px transparent;
132
+ }
133
+ }
134
+
135
+ .controls {
136
+ display: flex;
137
+ align-items: center;
138
+ gap: var(--of-2);
139
+ }
140
+
141
+ .btn {
142
+ display: inline-flex;
143
+ align-items: center;
144
+ gap: 7px;
145
+ padding: 8px 12px;
146
+ border: 1px solid var(--of-line-strong);
147
+ border-radius: var(--of-radius);
148
+ background: var(--of-panel-2);
149
+ color: var(--of-ink);
150
+ font-size: var(--of-text-sm);
151
+ font-weight: 520;
152
+ transition:
153
+ background 140ms var(--of-ease),
154
+ border-color 140ms var(--of-ease),
155
+ transform 140ms var(--of-ease);
156
+ }
157
+ .btn:hover {
158
+ background: var(--of-panel-3);
159
+ border-color: var(--of-ink-faint);
160
+ }
161
+ .btn:active {
162
+ transform: translateY(1px);
163
+ }
164
+ .btn[disabled] {
165
+ opacity: 0.45;
166
+ cursor: not-allowed;
167
+ transform: none;
168
+ }
169
+ .btn svg {
170
+ width: 15px;
171
+ height: 15px;
172
+ flex: none;
173
+ }
174
+ .btn-ghost {
175
+ border-color: transparent;
176
+ background: transparent;
177
+ color: var(--of-ink-dim);
178
+ }
179
+ .btn-ghost:hover {
180
+ background: var(--of-panel-2);
181
+ border-color: var(--of-line);
182
+ color: var(--of-ink);
183
+ }
184
+
185
+ .btn-primary {
186
+ background: var(--of-ember);
187
+ border-color: var(--of-ember);
188
+ color: oklch(0.19 0.03 58);
189
+ font-weight: 640;
190
+ }
191
+ .btn-primary:hover {
192
+ background: oklch(0.84 0.15 66);
193
+ border-color: oklch(0.84 0.15 66);
194
+ }
195
+ .btn-primary[aria-disabled="true"] {
196
+ opacity: 0.5;
197
+ }
198
+
199
+ .btn-armed {
200
+ animation: armed-glow 2.6s var(--of-ease) infinite;
201
+ }
202
+ @keyframes armed-glow {
203
+ 0%,
204
+ 100% {
205
+ box-shadow: 0 0 0 0 var(--of-ember-soft);
206
+ }
207
+ 50% {
208
+ box-shadow: 0 0 0 6px var(--of-ember-soft);
209
+ }
210
+ }
211
+
212
+ .keys {
213
+ position: relative;
214
+ }
215
+ .keys > summary {
216
+ list-style: none;
217
+ cursor: pointer;
218
+ display: inline-flex;
219
+ align-items: center;
220
+ justify-content: center;
221
+ width: 34px;
222
+ height: 34px;
223
+ border: 1px solid var(--of-line);
224
+ border-radius: var(--of-radius);
225
+ color: var(--of-ink-faint);
226
+ font-family: var(--of-font-mono);
227
+ font-size: var(--of-text-sm);
228
+ }
229
+ .keys > summary::-webkit-details-marker {
230
+ display: none;
231
+ }
232
+ .keys > summary:hover {
233
+ color: var(--of-ink);
234
+ border-color: var(--of-line-strong);
235
+ }
236
+ .keys-panel {
237
+ position: absolute;
238
+ right: 0;
239
+ top: calc(100% + 8px);
240
+ z-index: 40;
241
+ width: 268px;
242
+ padding: var(--of-3);
243
+ border: 1px solid var(--of-line-strong);
244
+ border-radius: var(--of-radius);
245
+ background: var(--of-panel-2);
246
+ box-shadow: var(--of-shadow);
247
+ }
248
+ .keys-panel dl {
249
+ margin: 0;
250
+ display: grid;
251
+ grid-template-columns: auto 1fr;
252
+ gap: 6px var(--of-3);
253
+ font-size: var(--of-text-xs);
254
+ }
255
+ .keys-panel dt {
256
+ font-family: var(--of-font-mono);
257
+ color: var(--of-ember);
258
+ }
259
+ .keys-panel dd {
260
+ margin: 0;
261
+ color: var(--of-ink-dim);
262
+ }
263
+
264
+ /* --- workspace ----------------------------------------------------------- */
265
+
266
+ .workspace {
267
+ display: grid;
268
+ grid-template-columns: minmax(0, 300px) minmax(0, 1fr) minmax(0, 340px);
269
+ gap: 1px;
270
+ background: var(--of-line);
271
+ min-height: 0;
272
+ }
273
+
274
+ .panel {
275
+ display: flex;
276
+ flex-direction: column;
277
+ min-width: 0;
278
+ min-height: 0;
279
+ background: var(--of-bg);
280
+ background-image: linear-gradient(180deg, var(--of-panel) 0, transparent 130px);
281
+ }
282
+
283
+ .panel-head {
284
+ display: flex;
285
+ align-items: baseline;
286
+ gap: var(--of-3);
287
+ padding: var(--of-4) var(--of-4) var(--of-3);
288
+ border-bottom: 1px solid var(--of-line);
289
+ }
290
+ .panel-eyebrow {
291
+ font-family: var(--of-font-mono);
292
+ font-size: var(--of-text-3xs);
293
+ letter-spacing: 0.16em;
294
+ text-transform: uppercase;
295
+ color: var(--of-ember);
296
+ white-space: nowrap;
297
+ }
298
+ .panel-title {
299
+ margin: 0;
300
+ font-size: var(--of-text-sm);
301
+ font-weight: 600;
302
+ letter-spacing: 0.02em;
303
+ color: var(--of-ink);
304
+ }
305
+ .panel-head-right {
306
+ margin-left: auto;
307
+ font-family: var(--of-font-mono);
308
+ font-size: var(--of-text-2xs);
309
+ color: var(--of-ink-faint);
310
+ white-space: nowrap;
311
+ }
312
+ .panel-body {
313
+ padding: var(--of-4);
314
+ overflow: auto;
315
+ flex: 1;
316
+ min-height: 0;
317
+ }
318
+
319
+ /* --- detection ----------------------------------------------------------- */
320
+
321
+ .coverage {
322
+ padding: var(--of-4);
323
+ border-bottom: 1px solid var(--of-line);
324
+ }
325
+
326
+ .coverage-top {
327
+ display: flex;
328
+ align-items: flex-end;
329
+ justify-content: space-between;
330
+ gap: var(--of-3);
331
+ }
332
+ .coverage-value {
333
+ font-family: var(--of-font-mono);
334
+ font-size: 2.35rem;
335
+ line-height: 1;
336
+ font-weight: 500;
337
+ letter-spacing: -0.03em;
338
+ font-variant-numeric: tabular-nums;
339
+ }
340
+ .coverage-value small {
341
+ font-size: 0.95rem;
342
+ color: var(--of-ink-faint);
343
+ margin-left: 2px;
344
+ }
345
+ .coverage-label {
346
+ font-family: var(--of-font-mono);
347
+ font-size: var(--of-text-3xs);
348
+ letter-spacing: 0.12em;
349
+ text-transform: uppercase;
350
+ color: var(--of-ink-faint);
351
+ text-align: right;
352
+ line-height: 1.5;
353
+ }
354
+
355
+ .meter {
356
+ position: relative;
357
+ height: 8px;
358
+ margin-top: var(--of-3);
359
+ border-radius: var(--of-radius-pill);
360
+ background: var(--of-panel-3);
361
+ overflow: hidden;
362
+ }
363
+ .meter-fill {
364
+ position: absolute;
365
+ inset: 0 auto 0 0;
366
+ width: 0%;
367
+ border-radius: inherit;
368
+ background: linear-gradient(90deg, var(--of-ember-deep), var(--of-ember));
369
+ transition: width 620ms var(--of-ease-out);
370
+ }
371
+ .meter-fill[data-tone="ok"] {
372
+ background: linear-gradient(90deg, oklch(0.6 0.13 158), var(--of-ok));
373
+ }
374
+ .meter-fill[data-tone="bad"] {
375
+ background: linear-gradient(90deg, oklch(0.5 0.17 25), var(--of-bad));
376
+ }
377
+ .meter-scale {
378
+ position: relative;
379
+ height: 16px;
380
+ margin-top: 4px;
381
+ font-family: var(--of-font-mono);
382
+ font-size: var(--of-text-3xs);
383
+ color: var(--of-ink-faint);
384
+ }
385
+ .meter-scale span {
386
+ position: absolute;
387
+ top: 0;
388
+ transform: translateX(-50%);
389
+ }
390
+ .meter-threshold {
391
+ position: absolute;
392
+ top: -3px;
393
+ bottom: -3px;
394
+ width: 1px;
395
+ background: var(--of-ink-dim);
396
+ z-index: 2;
397
+ }
398
+ .meter-threshold::after {
399
+ content: attr(data-label);
400
+ position: absolute;
401
+ top: -18px;
402
+ left: 50%;
403
+ transform: translateX(-50%);
404
+ font-family: var(--of-font-mono);
405
+ font-size: 9px;
406
+ letter-spacing: 0.08em;
407
+ color: var(--of-ink-dim);
408
+ white-space: nowrap;
409
+ }
410
+
411
+ .gap-list {
412
+ display: flex;
413
+ flex-direction: column;
414
+ gap: 2px;
415
+ padding: var(--of-2) 0 var(--of-4);
416
+ }
417
+
418
+ .gap-card {
419
+ display: block;
420
+ width: 100%;
421
+ text-align: left;
422
+ padding: 10px var(--of-4);
423
+ border-left: 2px solid transparent;
424
+ border-bottom: 1px solid var(--of-line);
425
+ transition:
426
+ background 120ms var(--of-ease),
427
+ border-color 120ms var(--of-ease);
428
+ }
429
+ .gap-card:hover {
430
+ background: var(--of-panel-2);
431
+ }
432
+ .gap-card[aria-pressed="true"] {
433
+ background: linear-gradient(90deg, var(--of-ember-soft), transparent 70%);
434
+ border-left-color: var(--of-ember);
435
+ }
436
+ .gap-top {
437
+ display: flex;
438
+ align-items: center;
439
+ gap: var(--of-2);
440
+ font-family: var(--of-font-mono);
441
+ font-size: var(--of-text-2xs);
442
+ }
443
+ .gap-id {
444
+ color: var(--of-ink);
445
+ font-weight: 600;
446
+ letter-spacing: 0.02em;
447
+ }
448
+ .gap-pct {
449
+ margin-left: auto;
450
+ font-variant-numeric: tabular-nums;
451
+ color: var(--of-bad);
452
+ }
453
+ .gap-pct[data-tone="ok"] {
454
+ color: var(--of-ok);
455
+ }
456
+ .gap-title {
457
+ display: block;
458
+ margin: 5px 0 7px;
459
+ font-size: var(--of-text-sm);
460
+ color: var(--of-ink-dim);
461
+ line-height: 1.35;
462
+ overflow: hidden;
463
+ text-overflow: ellipsis;
464
+ white-space: nowrap;
465
+ }
466
+ .gap-missing {
467
+ display: flex;
468
+ flex-wrap: wrap;
469
+ gap: 4px;
470
+ }
471
+ .cap {
472
+ font-family: var(--of-font-mono);
473
+ font-size: 10px;
474
+ letter-spacing: 0.02em;
475
+ padding: 1px 5px;
476
+ border-radius: 3px;
477
+ border: 1px solid var(--of-line);
478
+ color: var(--of-ink-faint);
479
+ background: var(--of-panel);
480
+ white-space: nowrap;
481
+ }
482
+ .cap[data-kind="missing"] {
483
+ color: var(--of-bad);
484
+ border-color: oklch(0.67 0.19 25 / 0.35);
485
+ background: var(--of-bad-soft);
486
+ }
487
+
488
+ .badge {
489
+ font-family: var(--of-font-mono);
490
+ font-size: 9px;
491
+ letter-spacing: 0.1em;
492
+ text-transform: uppercase;
493
+ padding: 2px 6px;
494
+ border-radius: var(--of-radius-pill);
495
+ border: 1px solid var(--of-line);
496
+ color: var(--of-ink-faint);
497
+ white-space: nowrap;
498
+ }
499
+ .badge[data-state="in_progress"] {
500
+ color: var(--of-ember);
501
+ border-color: oklch(0.79 0.16 62 / 0.4);
502
+ background: var(--of-ember-soft);
503
+ }
504
+ .badge[data-state="todo"] {
505
+ color: var(--of-ink-dim);
506
+ }
507
+ .badge[data-state="blocked"],
508
+ .badge[data-state="escalated"] {
509
+ color: var(--of-bad);
510
+ border-color: oklch(0.67 0.19 25 / 0.35);
511
+ background: var(--of-bad-soft);
512
+ }
513
+ .badge[data-state="done"] {
514
+ color: var(--of-ok);
515
+ border-color: oklch(0.78 0.13 158 / 0.35);
516
+ background: var(--of-ok-soft);
517
+ }
518
+
519
+ .empty {
520
+ padding: var(--of-5) var(--of-4);
521
+ border: 1px dashed var(--of-line-strong);
522
+ border-radius: var(--of-radius);
523
+ color: var(--of-ink-dim);
524
+ font-size: var(--of-text-sm);
525
+ text-align: center;
526
+ }
527
+ .empty strong {
528
+ display: block;
529
+ color: var(--of-ok);
530
+ font-family: var(--of-font-mono);
531
+ font-size: var(--of-text-xs);
532
+ letter-spacing: 0.1em;
533
+ text-transform: uppercase;
534
+ margin-bottom: 6px;
535
+ }
536
+
537
+ /* --- press scene --------------------------------------------------------- */
538
+
539
+ .stage {
540
+ padding: var(--of-4) var(--of-4) 0;
541
+ }
542
+
543
+ .scene {
544
+ position: relative;
545
+ border: 1px solid var(--of-line);
546
+ border-radius: var(--of-radius-lg);
547
+ background:
548
+ linear-gradient(180deg, var(--of-panel-2), var(--of-panel) 70%),
549
+ var(--of-panel);
550
+ overflow: hidden;
551
+ }
552
+ .scene::before {
553
+ content: "";
554
+ position: absolute;
555
+ inset: 0;
556
+ background-image:
557
+ linear-gradient(var(--of-line) 1px, transparent 1px),
558
+ linear-gradient(90deg, var(--of-line) 1px, transparent 1px);
559
+ background-size: 32px 32px;
560
+ opacity: 0.22;
561
+ pointer-events: none;
562
+ mask-image: radial-gradient(120% 90% at 50% 0%, #000 30%, transparent 80%);
563
+ }
564
+ .scene svg {
565
+ display: block;
566
+ width: 100%;
567
+ height: auto;
568
+ position: relative;
569
+ }
570
+
571
+ .scene-readout {
572
+ position: absolute;
573
+ top: 10px;
574
+ left: 12px;
575
+ right: 12px;
576
+ display: flex;
577
+ justify-content: space-between;
578
+ gap: var(--of-2);
579
+ font-family: var(--of-font-mono);
580
+ font-size: 10px;
581
+ letter-spacing: 0.1em;
582
+ text-transform: uppercase;
583
+ color: var(--of-ink-faint);
584
+ pointer-events: none;
585
+ }
586
+ .scene-readout b {
587
+ color: var(--of-ember);
588
+ font-weight: 500;
589
+ }
590
+
591
+ /* svg parts */
592
+ .press-head {
593
+ transform: translateY(-26px);
594
+ transition: transform 420ms var(--of-ease);
595
+ }
596
+ .stage[data-scene="write"] .press-head,
597
+ .stage[data-scene="synthesize"] .press-head {
598
+ transform: translateY(6px);
599
+ }
600
+ .stage[data-scene="done"] .press-head {
601
+ transform: translateY(-26px);
602
+ }
603
+
604
+ .sparks {
605
+ opacity: 0;
606
+ transition: opacity 200ms var(--of-ease);
607
+ }
608
+ .stage[data-scene="write"] .sparks {
609
+ opacity: 1;
610
+ animation: spark-pulse 900ms var(--of-ease) infinite;
611
+ }
612
+ @keyframes spark-pulse {
613
+ 0%,
614
+ 100% {
615
+ opacity: 0.15;
616
+ }
617
+ 40% {
618
+ opacity: 1;
619
+ }
620
+ }
621
+ .spark {
622
+ transform-box: fill-box;
623
+ transform-origin: center;
624
+ }
625
+ .stage[data-scene="write"] .spark:nth-child(odd) {
626
+ animation: spark-fly 1.1s var(--of-ease) infinite;
627
+ }
628
+ .stage[data-scene="write"] .spark:nth-child(even) {
629
+ animation: spark-fly 1.4s var(--of-ease) 0.2s infinite;
630
+ }
631
+ @keyframes spark-fly {
632
+ 0% {
633
+ transform: translateY(0) scale(0.4);
634
+ opacity: 1;
635
+ }
636
+ 100% {
637
+ transform: translateY(-22px) scale(1);
638
+ opacity: 0;
639
+ }
640
+ }
641
+
642
+ .belt-dashes {
643
+ stroke-dasharray: 6 10;
644
+ animation: belt-run 1.6s linear infinite;
645
+ }
646
+ @keyframes belt-run {
647
+ to {
648
+ stroke-dashoffset: -32;
649
+ }
650
+ }
651
+ .stage[data-scene="idle"] .belt-dashes {
652
+ animation-play-state: paused;
653
+ }
654
+
655
+ .mold {
656
+ transform: translateX(-220px);
657
+ opacity: 0;
658
+ transition:
659
+ transform 620ms var(--of-ease-out),
660
+ opacity 300ms var(--of-ease);
661
+ }
662
+ .stage[data-scene="detect"] .mold,
663
+ .stage[data-scene="synthesize"] .mold,
664
+ .stage[data-scene="write"] .mold,
665
+ .stage[data-scene="register"] .mold,
666
+ .stage[data-scene="match"] .mold,
667
+ .stage[data-scene="done"] .mold {
668
+ transform: translateX(0);
669
+ opacity: 1;
670
+ }
671
+
672
+ .out-chip {
673
+ transform: translateX(-200px);
674
+ opacity: 0;
675
+ transition:
676
+ transform 700ms var(--of-ease-out),
677
+ opacity 400ms var(--of-ease);
678
+ }
679
+ .stage[data-scene="register"] .out-chip,
680
+ .stage[data-scene="match"] .out-chip,
681
+ .stage[data-scene="done"] .out-chip {
682
+ transform: translateX(0);
683
+ opacity: 1;
684
+ }
685
+
686
+ .bin-pulse {
687
+ opacity: 0;
688
+ }
689
+ .stage[data-scene="register"] .bin-pulse {
690
+ animation: bin-hit 900ms var(--of-ease) 1;
691
+ }
692
+ @keyframes bin-hit {
693
+ 0% {
694
+ opacity: 0;
695
+ }
696
+ 30% {
697
+ opacity: 0.9;
698
+ }
699
+ 100% {
700
+ opacity: 0;
701
+ }
702
+ }
703
+
704
+ .scene .label {
705
+ font-family: var(--of-font-mono);
706
+ font-size: 9px;
707
+ letter-spacing: 0.12em;
708
+ text-transform: uppercase;
709
+ fill: var(--of-ink-faint);
710
+ }
711
+ .scene .tag {
712
+ font-family: var(--of-font-mono);
713
+ font-size: 11px;
714
+ letter-spacing: 0.04em;
715
+ fill: var(--of-ink);
716
+ }
717
+
718
+ /* --- steps --------------------------------------------------------------- */
719
+
720
+ .steps-wrap {
721
+ padding: var(--of-4);
722
+ border-bottom: 1px solid var(--of-line);
723
+ }
724
+ .steps {
725
+ list-style: none;
726
+ margin: 0;
727
+ padding: 0;
728
+ display: flex;
729
+ flex-direction: column;
730
+ }
731
+ .step {
732
+ position: relative;
733
+ display: grid;
734
+ grid-template-columns: 26px minmax(0, 1fr) auto;
735
+ gap: var(--of-3);
736
+ align-items: start;
737
+ padding: 7px 0;
738
+ }
739
+ .step + .step::before {
740
+ content: "";
741
+ position: absolute;
742
+ left: 12px;
743
+ top: -9px;
744
+ height: 10px;
745
+ width: 1px;
746
+ background: var(--of-line);
747
+ }
748
+ .step-icon {
749
+ width: 26px;
750
+ height: 26px;
751
+ display: grid;
752
+ place-items: center;
753
+ border-radius: 50%;
754
+ border: 1px solid var(--of-line-strong);
755
+ font-family: var(--of-font-mono);
756
+ font-size: 11px;
757
+ color: var(--of-ink-faint);
758
+ background: var(--of-panel);
759
+ transition:
760
+ color 160ms var(--of-ease),
761
+ border-color 160ms var(--of-ease),
762
+ background 160ms var(--of-ease);
763
+ }
764
+ .step-label {
765
+ font-size: var(--of-text-sm);
766
+ font-weight: 550;
767
+ color: var(--of-ink-dim);
768
+ line-height: 1.3;
769
+ padding-top: 3px;
770
+ }
771
+ .step-meta {
772
+ display: block;
773
+ font-family: var(--of-font-mono);
774
+ font-size: var(--of-text-3xs);
775
+ font-weight: 400;
776
+ color: var(--of-ink-faint);
777
+ margin-top: 3px;
778
+ overflow: hidden;
779
+ text-overflow: ellipsis;
780
+ white-space: nowrap;
781
+ }
782
+ .step-end {
783
+ font-family: var(--of-font-mono);
784
+ font-size: var(--of-text-3xs);
785
+ letter-spacing: 0.08em;
786
+ text-transform: uppercase;
787
+ color: var(--of-ink-faint);
788
+ padding-top: 6px;
789
+ white-space: nowrap;
790
+ }
791
+
792
+ .step[data-status="active"] .step-icon {
793
+ border-color: var(--of-ember);
794
+ color: var(--of-ember);
795
+ background: var(--of-ember-soft);
796
+ }
797
+ .step[data-status="active"] .step-label {
798
+ color: var(--of-ink);
799
+ }
800
+ .step[data-status="active"] .step-end {
801
+ color: var(--of-ember);
802
+ }
803
+ .step[data-status="active"] .step-icon::after {
804
+ content: "";
805
+ position: absolute;
806
+ width: 26px;
807
+ height: 26px;
808
+ border-radius: 50%;
809
+ border: 1px solid var(--of-ember);
810
+ animation: step-ring 1.5s var(--of-ease) infinite;
811
+ }
812
+ @keyframes step-ring {
813
+ 0% {
814
+ transform: scale(0.8);
815
+ opacity: 0.8;
816
+ }
817
+ 100% {
818
+ transform: scale(1.7);
819
+ opacity: 0;
820
+ }
821
+ }
822
+ .step[data-status="done"] .step-icon {
823
+ border-color: oklch(0.78 0.13 158 / 0.45);
824
+ background: var(--of-ok-soft);
825
+ color: var(--of-ok);
826
+ }
827
+ .step[data-status="done"] .step-label {
828
+ color: var(--of-ink);
829
+ }
830
+ .step[data-status="done"] .step-end {
831
+ color: var(--of-ok);
832
+ }
833
+ .step[data-status="skipped"] {
834
+ opacity: 0.45;
835
+ }
836
+
837
+ /* --- terminal ------------------------------------------------------------ */
838
+
839
+ .term-wrap {
840
+ padding: var(--of-4);
841
+ display: flex;
842
+ flex-direction: column;
843
+ min-height: 220px;
844
+ flex: 1;
845
+ }
846
+ .term {
847
+ display: flex;
848
+ flex-direction: column;
849
+ flex: 1;
850
+ min-height: 0;
851
+ border: 1px solid var(--of-line-strong);
852
+ border-radius: var(--of-radius);
853
+ background: oklch(0.145 0.012 60);
854
+ overflow: hidden;
855
+ }
856
+ :root[data-theme="light"] .term {
857
+ background: oklch(0.18 0.014 60);
858
+ }
859
+ .term-bar {
860
+ display: flex;
861
+ align-items: center;
862
+ gap: var(--of-2);
863
+ padding: 6px 10px;
864
+ border-bottom: 1px solid oklch(0.3 0.014 60);
865
+ background: oklch(0.21 0.014 60);
866
+ font-family: var(--of-font-mono);
867
+ font-size: 10px;
868
+ color: oklch(0.68 0.012 70);
869
+ min-height: 30px;
870
+ }
871
+ .term-dots {
872
+ display: inline-flex;
873
+ gap: 4px;
874
+ margin-right: 6px;
875
+ }
876
+ .term-dots i {
877
+ width: 7px;
878
+ height: 7px;
879
+ border-radius: 50%;
880
+ background: oklch(0.4 0.015 60);
881
+ }
882
+ .term-dots i:first-child {
883
+ background: oklch(0.62 0.17 30);
884
+ }
885
+ .term-dots i:nth-child(2) {
886
+ background: oklch(0.72 0.13 80);
887
+ }
888
+ .term-dots i:last-child {
889
+ background: oklch(0.6 0.12 155);
890
+ }
891
+ .term-path {
892
+ overflow: hidden;
893
+ text-overflow: ellipsis;
894
+ white-space: nowrap;
895
+ }
896
+ .term-path b {
897
+ color: oklch(0.85 0.012 80);
898
+ font-weight: 500;
899
+ }
900
+ .term-tag {
901
+ margin-left: auto;
902
+ font-size: 9px;
903
+ letter-spacing: 0.1em;
904
+ text-transform: uppercase;
905
+ color: oklch(0.6 0.02 70);
906
+ white-space: nowrap;
907
+ }
908
+ .term-body {
909
+ margin: 0;
910
+ padding: 10px 12px 14px;
911
+ overflow: auto;
912
+ flex: 1;
913
+ max-height: 260px;
914
+ font-family: var(--of-font-mono);
915
+ font-size: 11.5px;
916
+ line-height: 1.65;
917
+ color: oklch(0.84 0.012 85);
918
+ white-space: pre-wrap;
919
+ word-break: break-word;
920
+ }
921
+ .term-line {
922
+ display: block;
923
+ }
924
+ .term-line[data-kind="path"] {
925
+ color: var(--of-ember);
926
+ }
927
+ .term-line[data-kind="front"] {
928
+ color: oklch(0.62 0.03 70);
929
+ }
930
+ .term-line[data-kind="head"] {
931
+ color: oklch(0.93 0.03 80);
932
+ font-weight: 600;
933
+ }
934
+ .term-line[data-kind="dim"] {
935
+ color: oklch(0.6 0.015 70);
936
+ }
937
+ .term-placeholder {
938
+ color: oklch(0.52 0.015 70);
939
+ font-style: italic;
940
+ white-space: normal;
941
+ }
942
+ .cursor {
943
+ display: inline-block;
944
+ width: 7px;
945
+ height: 1.05em;
946
+ vertical-align: -0.16em;
947
+ background: var(--of-ember);
948
+ margin-left: 1px;
949
+ animation: blink 1.05s steps(1, end) infinite;
950
+ }
951
+ @keyframes blink {
952
+ 0%,
953
+ 49% {
954
+ opacity: 1;
955
+ }
956
+ 50%,
957
+ 100% {
958
+ opacity: 0;
959
+ }
960
+ }
961
+
962
+ /* --- roster -------------------------------------------------------------- */
963
+
964
+ .roster-grid {
965
+ display: grid;
966
+ grid-template-columns: 1fr;
967
+ gap: 6px;
968
+ padding: var(--of-4) 0;
969
+ }
970
+
971
+ .agent-chip {
972
+ display: grid;
973
+ grid-template-columns: 34px minmax(0, 1fr) auto;
974
+ gap: 10px;
975
+ align-items: center;
976
+ width: 100%;
977
+ text-align: left;
978
+ padding: 8px 10px;
979
+ border: 1px solid var(--of-line);
980
+ border-radius: var(--of-radius);
981
+ background: var(--of-panel);
982
+ transition:
983
+ border-color 160ms var(--of-ease),
984
+ background 160ms var(--of-ease),
985
+ transform 160ms var(--of-ease);
986
+ }
987
+ .agent-chip:hover {
988
+ border-color: var(--of-line-strong);
989
+ background: var(--of-panel-2);
990
+ transform: translateY(-1px);
991
+ }
992
+ .agent-avatar {
993
+ width: 34px;
994
+ height: 34px;
995
+ border-radius: var(--of-radius-sm);
996
+ display: grid;
997
+ place-items: center;
998
+ font-family: var(--of-font-mono);
999
+ font-size: 11px;
1000
+ font-weight: 600;
1001
+ letter-spacing: 0.02em;
1002
+ color: oklch(0.2 0.02 60);
1003
+ background: var(--of-steel);
1004
+ }
1005
+ .agent-chip[data-fabricated="true"] .agent-avatar {
1006
+ background: var(--of-ember);
1007
+ }
1008
+ .agent-name {
1009
+ font-size: var(--of-text-sm);
1010
+ font-weight: 550;
1011
+ overflow: hidden;
1012
+ text-overflow: ellipsis;
1013
+ white-space: nowrap;
1014
+ }
1015
+ .agent-role {
1016
+ font-family: var(--of-font-mono);
1017
+ font-size: 10px;
1018
+ color: var(--of-ink-faint);
1019
+ overflow: hidden;
1020
+ text-overflow: ellipsis;
1021
+ white-space: nowrap;
1022
+ }
1023
+ .agent-state {
1024
+ display: inline-flex;
1025
+ align-items: center;
1026
+ gap: 5px;
1027
+ font-family: var(--of-font-mono);
1028
+ font-size: 9px;
1029
+ letter-spacing: 0.08em;
1030
+ text-transform: uppercase;
1031
+ color: var(--of-ink-faint);
1032
+ white-space: nowrap;
1033
+ }
1034
+ .agent-state i {
1035
+ width: 6px;
1036
+ height: 6px;
1037
+ border-radius: 50%;
1038
+ background: var(--of-ink-faint);
1039
+ }
1040
+ .agent-state[data-state="working"] i {
1041
+ background: var(--of-ember);
1042
+ }
1043
+ .agent-state[data-state="idle_available"] i {
1044
+ background: var(--of-ok);
1045
+ }
1046
+ .agent-chip[data-fabricated="true"] {
1047
+ border-color: oklch(0.79 0.16 62 / 0.55);
1048
+ background: linear-gradient(90deg, var(--of-ember-soft), transparent 80%);
1049
+ }
1050
+ .agent-chip.is-new {
1051
+ animation: agent-born 900ms var(--of-ease-out) both;
1052
+ }
1053
+ @keyframes agent-born {
1054
+ 0% {
1055
+ opacity: 0;
1056
+ transform: translateY(8px) scale(0.97);
1057
+ box-shadow: 0 0 0 0 oklch(0.79 0.16 62 / 0.5);
1058
+ }
1059
+ 55% {
1060
+ opacity: 1;
1061
+ box-shadow: 0 0 0 7px oklch(0.79 0.16 62 / 0);
1062
+ }
1063
+ 100% {
1064
+ opacity: 1;
1065
+ transform: none;
1066
+ }
1067
+ }
1068
+
1069
+ /* --- match projection ---------------------------------------------------- */
1070
+
1071
+ .match {
1072
+ border-top: 1px solid var(--of-line);
1073
+ padding: var(--of-4);
1074
+ }
1075
+ .match-head {
1076
+ display: flex;
1077
+ align-items: center;
1078
+ gap: var(--of-2);
1079
+ margin-bottom: var(--of-3);
1080
+ }
1081
+ .match-head h3 {
1082
+ margin: 0;
1083
+ font-family: var(--of-font-mono);
1084
+ font-size: var(--of-text-3xs);
1085
+ letter-spacing: 0.14em;
1086
+ text-transform: uppercase;
1087
+ color: var(--of-ink-faint);
1088
+ font-weight: 500;
1089
+ }
1090
+ .match-card {
1091
+ border: 1px solid var(--of-line);
1092
+ border-radius: var(--of-radius);
1093
+ padding: 10px 12px;
1094
+ background: var(--of-panel);
1095
+ position: relative;
1096
+ overflow: hidden;
1097
+ }
1098
+ .match-card + .match-card {
1099
+ margin-top: 8px;
1100
+ }
1101
+ .match-id {
1102
+ font-family: var(--of-font-mono);
1103
+ font-size: var(--of-text-2xs);
1104
+ color: var(--of-ink);
1105
+ }
1106
+ .match-name {
1107
+ display: block;
1108
+ font-size: var(--of-text-xs);
1109
+ color: var(--of-ink-dim);
1110
+ margin: 2px 0 8px;
1111
+ overflow: hidden;
1112
+ text-overflow: ellipsis;
1113
+ white-space: nowrap;
1114
+ }
1115
+ .match-bars {
1116
+ display: grid;
1117
+ grid-template-columns: 52px minmax(0, 1fr) 40px;
1118
+ gap: 8px;
1119
+ align-items: center;
1120
+ font-family: var(--of-font-mono);
1121
+ font-size: 9px;
1122
+ letter-spacing: 0.06em;
1123
+ color: var(--of-ink-faint);
1124
+ text-transform: uppercase;
1125
+ }
1126
+ .match-bars + .match-bars {
1127
+ margin-top: 5px;
1128
+ }
1129
+ .match-bars .meter {
1130
+ margin: 0;
1131
+ height: 6px;
1132
+ }
1133
+ .match-bars .meter-fill[data-tone="ok"] {
1134
+ background: linear-gradient(90deg, oklch(0.6 0.13 158), var(--of-ok));
1135
+ }
1136
+ .match-value {
1137
+ text-align: right;
1138
+ font-variant-numeric: tabular-nums;
1139
+ color: var(--of-ink-dim);
1140
+ }
1141
+ .match-stamp {
1142
+ position: absolute;
1143
+ right: 8px;
1144
+ top: 8px;
1145
+ font-family: var(--of-font-mono);
1146
+ font-size: 8.5px;
1147
+ letter-spacing: 0.16em;
1148
+ padding: 2px 7px;
1149
+ border: 1px solid var(--of-ok);
1150
+ color: var(--of-ok);
1151
+ border-radius: 3px;
1152
+ transform: rotate(-6deg);
1153
+ opacity: 0;
1154
+ transition: opacity 260ms var(--of-ease);
1155
+ pointer-events: none;
1156
+ }
1157
+ .match-card[data-matched="true"] .match-stamp {
1158
+ opacity: 1;
1159
+ animation: stamp-in 380ms var(--of-ease-out) both;
1160
+ }
1161
+ @keyframes stamp-in {
1162
+ from {
1163
+ transform: rotate(-6deg) scale(1.6);
1164
+ opacity: 0;
1165
+ }
1166
+ to {
1167
+ transform: rotate(-6deg) scale(1);
1168
+ opacity: 1;
1169
+ }
1170
+ }
1171
+
1172
+ /* --- toasts -------------------------------------------------------------- */
1173
+
1174
+ .toasts {
1175
+ position: fixed;
1176
+ right: var(--of-4);
1177
+ bottom: var(--of-4);
1178
+ z-index: 60;
1179
+ display: flex;
1180
+ flex-direction: column-reverse;
1181
+ gap: 10px;
1182
+ width: min(360px, calc(100vw - 2rem));
1183
+ pointer-events: none;
1184
+ }
1185
+ .toast {
1186
+ position: relative;
1187
+ display: grid;
1188
+ grid-template-columns: minmax(0, 1fr) auto;
1189
+ align-items: stretch;
1190
+ border: 1px solid var(--of-line-strong);
1191
+ border-left: 3px solid var(--of-ember);
1192
+ border-radius: var(--of-radius);
1193
+ background: var(--of-panel-2);
1194
+ box-shadow: var(--of-shadow);
1195
+ overflow: hidden;
1196
+ pointer-events: auto;
1197
+ animation: toast-in 320ms var(--of-ease-out) both;
1198
+ }
1199
+ .toast.is-leaving {
1200
+ animation: toast-out 220ms var(--of-ease) both;
1201
+ }
1202
+ @keyframes toast-in {
1203
+ from {
1204
+ opacity: 0;
1205
+ transform: translateY(12px) scale(0.98);
1206
+ }
1207
+ }
1208
+ @keyframes toast-out {
1209
+ to {
1210
+ opacity: 0;
1211
+ transform: translateY(6px);
1212
+ }
1213
+ }
1214
+ .toast-open {
1215
+ text-align: left;
1216
+ padding: 11px 12px 12px;
1217
+ display: block;
1218
+ width: 100%;
1219
+ }
1220
+ .toast-open:hover .toast-cta {
1221
+ color: var(--of-ember);
1222
+ gap: 8px;
1223
+ }
1224
+ .toast-kicker {
1225
+ display: block;
1226
+ font-family: var(--of-font-mono);
1227
+ font-size: 9px;
1228
+ letter-spacing: 0.14em;
1229
+ text-transform: uppercase;
1230
+ color: var(--of-ember);
1231
+ }
1232
+ .toast-name {
1233
+ display: block;
1234
+ margin: 3px 0 2px;
1235
+ font-size: var(--of-text-sm);
1236
+ font-weight: 600;
1237
+ color: var(--of-ink);
1238
+ }
1239
+ .toast-body {
1240
+ display: block;
1241
+ font-size: var(--of-text-xs);
1242
+ color: var(--of-ink-dim);
1243
+ line-height: 1.4;
1244
+ }
1245
+ .toast-cta {
1246
+ display: inline-flex;
1247
+ align-items: center;
1248
+ gap: 5px;
1249
+ margin-top: 7px;
1250
+ font-family: var(--of-font-mono);
1251
+ font-size: 10px;
1252
+ letter-spacing: 0.08em;
1253
+ text-transform: uppercase;
1254
+ color: var(--of-steel);
1255
+ transition:
1256
+ color 140ms var(--of-ease),
1257
+ gap 140ms var(--of-ease);
1258
+ }
1259
+ .toast-close {
1260
+ padding: 0 10px;
1261
+ color: var(--of-ink-faint);
1262
+ font-size: 16px;
1263
+ line-height: 1;
1264
+ border-left: 1px solid var(--of-line);
1265
+ }
1266
+ .toast-close:hover {
1267
+ color: var(--of-ink);
1268
+ background: var(--of-panel-3);
1269
+ }
1270
+ .toast-timer {
1271
+ position: absolute;
1272
+ left: 0;
1273
+ bottom: 0;
1274
+ height: 2px;
1275
+ width: 100%;
1276
+ background: var(--of-ember);
1277
+ transform-origin: left;
1278
+ animation: toast-timer 12s linear both;
1279
+ }
1280
+ @keyframes toast-timer {
1281
+ to {
1282
+ transform: scaleX(0);
1283
+ }
1284
+ }
1285
+
1286
+ /* --- modal --------------------------------------------------------------- */
1287
+
1288
+ .modal {
1289
+ width: min(880px, 94vw);
1290
+ max-height: 88vh;
1291
+ padding: 0;
1292
+ border: 1px solid var(--of-line-strong);
1293
+ border-radius: var(--of-radius-lg);
1294
+ background: var(--of-panel);
1295
+ color: var(--of-ink);
1296
+ box-shadow: 0 40px 90px -30px oklch(0.05 0.01 60 / 0.9);
1297
+ overflow: hidden;
1298
+ }
1299
+ .modal::backdrop {
1300
+ background: oklch(0.12 0.01 60 / 0.7);
1301
+ backdrop-filter: blur(3px);
1302
+ }
1303
+ .modal[open] {
1304
+ animation: modal-in 240ms var(--of-ease-out) both;
1305
+ }
1306
+ @keyframes modal-in {
1307
+ from {
1308
+ opacity: 0;
1309
+ transform: translateY(10px) scale(0.99);
1310
+ }
1311
+ }
1312
+ .modal-head {
1313
+ display: grid;
1314
+ grid-template-columns: 44px minmax(0, 1fr) auto;
1315
+ gap: var(--of-3);
1316
+ align-items: center;
1317
+ padding: var(--of-4) var(--of-5);
1318
+ border-bottom: 1px solid var(--of-line);
1319
+ background: linear-gradient(180deg, var(--of-panel-2), transparent);
1320
+ }
1321
+ .modal-avatar {
1322
+ width: 44px;
1323
+ height: 44px;
1324
+ border-radius: var(--of-radius);
1325
+ display: grid;
1326
+ place-items: center;
1327
+ background: var(--of-ember);
1328
+ color: oklch(0.19 0.03 58);
1329
+ font-family: var(--of-font-mono);
1330
+ font-weight: 700;
1331
+ font-size: 14px;
1332
+ }
1333
+ .modal-title {
1334
+ margin: 0;
1335
+ font-size: var(--of-text-lg);
1336
+ font-weight: 620;
1337
+ line-height: 1.2;
1338
+ }
1339
+ .modal-sub {
1340
+ margin: 3px 0 0;
1341
+ font-family: var(--of-font-mono);
1342
+ font-size: var(--of-text-2xs);
1343
+ color: var(--of-ink-faint);
1344
+ overflow: hidden;
1345
+ text-overflow: ellipsis;
1346
+ white-space: nowrap;
1347
+ }
1348
+ .modal-close {
1349
+ width: 34px;
1350
+ height: 34px;
1351
+ border: 1px solid var(--of-line);
1352
+ border-radius: var(--of-radius);
1353
+ color: var(--of-ink-dim);
1354
+ display: grid;
1355
+ place-items: center;
1356
+ font-size: 18px;
1357
+ }
1358
+ .modal-close:hover {
1359
+ color: var(--of-ink);
1360
+ border-color: var(--of-line-strong);
1361
+ }
1362
+ .modal-meta {
1363
+ display: flex;
1364
+ flex-wrap: wrap;
1365
+ gap: 6px;
1366
+ align-items: center;
1367
+ padding: 10px var(--of-5);
1368
+ border-bottom: 1px solid var(--of-line);
1369
+ background: var(--of-panel-2);
1370
+ }
1371
+ .modal-body {
1372
+ padding: var(--of-4) var(--of-5) var(--of-5);
1373
+ overflow: auto;
1374
+ max-height: 58vh;
1375
+ font-size: var(--of-text-sm);
1376
+ line-height: 1.65;
1377
+ }
1378
+ .modal-foot {
1379
+ display: flex;
1380
+ align-items: center;
1381
+ gap: var(--of-3);
1382
+ padding: 10px var(--of-5);
1383
+ border-top: 1px solid var(--of-line);
1384
+ background: var(--of-panel-2);
1385
+ }
1386
+ .modal-foot .note {
1387
+ margin-left: auto;
1388
+ font-family: var(--of-font-mono);
1389
+ font-size: 10px;
1390
+ color: var(--of-ink-faint);
1391
+ }
1392
+
1393
+ .md h3 {
1394
+ margin: 1.2em 0 0.4em;
1395
+ font-size: var(--of-text-md);
1396
+ letter-spacing: 0.02em;
1397
+ }
1398
+ .md h4 {
1399
+ margin: 1.1em 0 0.3em;
1400
+ font-family: var(--of-font-mono);
1401
+ font-size: var(--of-text-2xs);
1402
+ letter-spacing: 0.14em;
1403
+ text-transform: uppercase;
1404
+ color: var(--of-ember);
1405
+ }
1406
+ .md p {
1407
+ margin: 0.45em 0;
1408
+ color: var(--of-ink-dim);
1409
+ }
1410
+ .md ul {
1411
+ margin: 0.4em 0;
1412
+ padding-left: 1.1em;
1413
+ color: var(--of-ink-dim);
1414
+ }
1415
+ .md li {
1416
+ margin: 0.18em 0;
1417
+ }
1418
+ .md code {
1419
+ padding: 1px 5px;
1420
+ border-radius: 3px;
1421
+ background: var(--of-panel-3);
1422
+ color: var(--of-ink);
1423
+ }
1424
+ .md-front {
1425
+ margin: 0 0 var(--of-3);
1426
+ padding: 8px 10px;
1427
+ border-left: 2px solid var(--of-steel);
1428
+ background: var(--of-steel-soft);
1429
+ border-radius: 0 var(--of-radius-sm) var(--of-radius-sm) 0;
1430
+ font-family: var(--of-font-mono);
1431
+ font-size: 10.5px;
1432
+ color: var(--of-ink-dim);
1433
+ white-space: pre-wrap;
1434
+ }
1435
+
1436
+ /* --- footer -------------------------------------------------------------- */
1437
+
1438
+ .footbar {
1439
+ display: flex;
1440
+ gap: var(--of-4);
1441
+ align-items: center;
1442
+ padding: 10px var(--of-5);
1443
+ border-top: 1px solid var(--of-line);
1444
+ background: var(--of-panel);
1445
+ font-family: var(--of-font-mono);
1446
+ font-size: 10px;
1447
+ color: var(--of-ink-faint);
1448
+ flex-wrap: wrap;
1449
+ }
1450
+ .footbar .sep {
1451
+ width: 1px;
1452
+ height: 12px;
1453
+ background: var(--of-line-strong);
1454
+ }
1455
+ .footbar a {
1456
+ color: var(--of-ink-dim);
1457
+ text-decoration: none;
1458
+ border-bottom: 1px dotted var(--of-line-strong);
1459
+ }
1460
+ .footbar a:hover {
1461
+ color: var(--of-ember);
1462
+ }
1463
+ .legend {
1464
+ display: inline-flex;
1465
+ align-items: center;
1466
+ gap: 6px;
1467
+ margin-left: auto;
1468
+ }
1469
+ .legend i {
1470
+ width: 8px;
1471
+ height: 8px;
1472
+ border-radius: 2px;
1473
+ display: inline-block;
1474
+ }
1475
+ .legend i[data-tone="bad"] {
1476
+ background: var(--of-bad);
1477
+ }
1478
+ .legend i[data-tone="ok"] {
1479
+ background: var(--of-ok);
1480
+ }
1481
+ .legend i[data-tone="ember"] {
1482
+ background: var(--of-ember);
1483
+ }
1484
+
1485
+ /* --- responsive ---------------------------------------------------------- */
1486
+
1487
+ @media (max-width: 1240px) {
1488
+ .workspace {
1489
+ grid-template-columns: minmax(0, 260px) minmax(0, 1fr) minmax(0, 300px);
1490
+ }
1491
+ }
1492
+
1493
+ @media (max-width: 1040px) {
1494
+ .workspace {
1495
+ grid-template-columns: minmax(0, 1fr);
1496
+ grid-auto-rows: auto;
1497
+ gap: 1px;
1498
+ overflow: auto;
1499
+ }
1500
+ .panel {
1501
+ min-height: 0;
1502
+ }
1503
+ .panel-body {
1504
+ max-height: none;
1505
+ }
1506
+ .gap-list {
1507
+ max-height: 320px;
1508
+ overflow: auto;
1509
+ }
1510
+ .term-body {
1511
+ max-height: 220px;
1512
+ }
1513
+ .toasts {
1514
+ right: var(--of-3);
1515
+ left: var(--of-3);
1516
+ width: auto;
1517
+ }
1518
+ }
1519
+
1520
+ @media (max-width: 620px) {
1521
+ .topbar {
1522
+ padding: var(--of-3) var(--of-4);
1523
+ }
1524
+ .brand-sub {
1525
+ display: none;
1526
+ }
1527
+ .status-strip {
1528
+ order: 3;
1529
+ width: 100%;
1530
+ }
1531
+ .scene-readout {
1532
+ font-size: 9px;
1533
+ }
1534
+ .modal-head {
1535
+ grid-template-columns: 38px minmax(0, 1fr) auto;
1536
+ padding: var(--of-3) var(--of-4);
1537
+ }
1538
+ .modal-body,
1539
+ .modal-meta,
1540
+ .modal-foot {
1541
+ padding-inline: var(--of-4);
1542
+ }
1543
+ }