mover-os 4.7.7 → 4.7.9

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 (119) hide show
  1. package/README.md +34 -24
  2. package/install.js +2868 -251
  3. package/package.json +15 -3
  4. package/src/dashboard/build.js +1541 -0
  5. package/src/dashboard/dashboard.js +276 -0
  6. package/src/dashboard/index.js +319 -0
  7. package/src/dashboard/lib/activation-log.js +297 -0
  8. package/src/dashboard/lib/active-context-parser.js +189 -0
  9. package/src/dashboard/lib/agent-command.js +93 -0
  10. package/src/dashboard/lib/agent-detect.js +255 -0
  11. package/src/dashboard/lib/agent-detector.js +92 -0
  12. package/src/dashboard/lib/agent-session.js +483 -0
  13. package/src/dashboard/lib/anti-identity-detector.js +116 -0
  14. package/src/dashboard/lib/approval-registry.js +170 -0
  15. package/src/dashboard/lib/auto-learnings-parser.js +183 -0
  16. package/src/dashboard/lib/cli-usage-parser.js +92 -0
  17. package/src/dashboard/lib/config-parser.js +109 -0
  18. package/src/dashboard/lib/connect-recommender.js +131 -0
  19. package/src/dashboard/lib/correlations-parser.js +231 -0
  20. package/src/dashboard/lib/daily-note-resolver.js +228 -0
  21. package/src/dashboard/lib/date-utils.js +43 -0
  22. package/src/dashboard/lib/distribution-parser.js +137 -0
  23. package/src/dashboard/lib/dossier-parser.js +64 -0
  24. package/src/dashboard/lib/drift-history.js +88 -0
  25. package/src/dashboard/lib/drift-score.js +119 -0
  26. package/src/dashboard/lib/engine-default-fingerprints.json +53 -0
  27. package/src/dashboard/lib/engine-health.js +173 -0
  28. package/src/dashboard/lib/engine-writer.js +1831 -0
  29. package/src/dashboard/lib/execution-plan.js +125 -0
  30. package/src/dashboard/lib/experiments-parser.js +429 -0
  31. package/src/dashboard/lib/feed-parser.js +294 -0
  32. package/src/dashboard/lib/forked-future.js +60 -0
  33. package/src/dashboard/lib/goal-forecast.js +427 -0
  34. package/src/dashboard/lib/goals-parser.js +67 -0
  35. package/src/dashboard/lib/health-protocols-parser.js +133 -0
  36. package/src/dashboard/lib/hook-activity.js +48 -0
  37. package/src/dashboard/lib/hook-indexer.js +169 -0
  38. package/src/dashboard/lib/hourly-activity-parser.js +143 -0
  39. package/src/dashboard/lib/identity-parser.js +85 -0
  40. package/src/dashboard/lib/ingestion.js +418 -0
  41. package/src/dashboard/lib/library-indexer-v2.js +226 -0
  42. package/src/dashboard/lib/library-indexer.js +105 -0
  43. package/src/dashboard/lib/library-search.js +290 -0
  44. package/src/dashboard/lib/log-activation.sh +61 -0
  45. package/src/dashboard/lib/memory-curator.js +97 -0
  46. package/src/dashboard/lib/memory-gardener.js +177 -0
  47. package/src/dashboard/lib/memory-gepa.js +102 -0
  48. package/src/dashboard/lib/memory-index.js +519 -0
  49. package/src/dashboard/lib/memory-rerank.js +72 -0
  50. package/src/dashboard/lib/memory-text.js +136 -0
  51. package/src/dashboard/lib/metrics-log-parser.js +76 -0
  52. package/src/dashboard/lib/moves-usage-parser.js +184 -0
  53. package/src/dashboard/lib/onboarding-forge.js +70 -0
  54. package/src/dashboard/lib/override-outcome-parser.js +68 -0
  55. package/src/dashboard/lib/override-summary.js +73 -0
  56. package/src/dashboard/lib/paths.js +192 -0
  57. package/src/dashboard/lib/pattern-manifest-loader.js +29 -0
  58. package/src/dashboard/lib/phantom-strategy.js +129 -0
  59. package/src/dashboard/lib/pid-markers.js +80 -0
  60. package/src/dashboard/lib/project-scanner.js +121 -0
  61. package/src/dashboard/lib/promise-wall.js +88 -0
  62. package/src/dashboard/lib/record-score.js +173 -0
  63. package/src/dashboard/lib/redaction.js +140 -0
  64. package/src/dashboard/lib/refusal-parser.js +44 -0
  65. package/src/dashboard/lib/regenerate-manifest.js +206 -0
  66. package/src/dashboard/lib/rewind-snapshots.js +689 -0
  67. package/src/dashboard/lib/roast-wall-parser.js +200 -0
  68. package/src/dashboard/lib/run-registry.js +286 -0
  69. package/src/dashboard/lib/safe-write.js +63 -0
  70. package/src/dashboard/lib/session-log-parser.js +145 -0
  71. package/src/dashboard/lib/session-time-parser.js +158 -0
  72. package/src/dashboard/lib/skill-index.js +171 -0
  73. package/src/dashboard/lib/skill-indexer.js +118 -0
  74. package/src/dashboard/lib/skill-recommender.js +689 -0
  75. package/src/dashboard/lib/state-core/backfill.js +298 -0
  76. package/src/dashboard/lib/state-core/dryrun.js +188 -0
  77. package/src/dashboard/lib/state-core/event-log.js +615 -0
  78. package/src/dashboard/lib/state-core/events.js +265 -0
  79. package/src/dashboard/lib/state-core/projections.js +376 -0
  80. package/src/dashboard/lib/state-core/start-close.js +162 -0
  81. package/src/dashboard/lib/state-core/trial.js +96 -0
  82. package/src/dashboard/lib/strategy-parser.js +248 -0
  83. package/src/dashboard/lib/strategy-protocol-parser.js +135 -0
  84. package/src/dashboard/lib/streak-parser.js +95 -0
  85. package/src/dashboard/lib/suggested-now.js +254 -0
  86. package/src/dashboard/lib/tool-awareness.js +125 -0
  87. package/src/dashboard/lib/transcript-parser.js +371 -0
  88. package/src/dashboard/lib/vault-graph-parser.js +205 -0
  89. package/src/dashboard/lib/view-generator.js +163 -0
  90. package/src/dashboard/lib/voice-dna-parser.js +57 -0
  91. package/src/dashboard/lib/walkthrough-script.js +140 -0
  92. package/src/dashboard/lib/workflow-graph-parser.js +170 -0
  93. package/src/dashboard/lib/workflow-library-parser.js +146 -0
  94. package/src/dashboard/server.js +2402 -0
  95. package/src/dashboard/shortcut.js +284 -0
  96. package/src/dashboard/static/setup-poc.html +306 -0
  97. package/src/dashboard/static/walkthrough-poc.html +580 -0
  98. package/src/dashboard/styles.css +1201 -0
  99. package/src/dashboard/templates/index.html +278 -0
  100. package/src/dashboard/ui/dist/assets/hanken-grotesk-latin-ext-wght-normal-Dg-wlmqe.woff2 +0 -0
  101. package/src/dashboard/ui/dist/assets/hanken-grotesk-latin-wght-normal-CaVRRdDk.woff2 +0 -0
  102. package/src/dashboard/ui/dist/assets/hanken-grotesk-vietnamese-wght-normal-CHiFlh_0.woff2 +0 -0
  103. package/src/dashboard/ui/dist/assets/hero.png +0 -0
  104. package/src/dashboard/ui/dist/assets/index-ByVKPvLf.js +34 -0
  105. package/src/dashboard/ui/dist/assets/index-CCoKjUcC.js +161 -0
  106. package/src/dashboard/ui/dist/assets/index-CZWNQDt5.css +1 -0
  107. package/src/dashboard/ui/dist/assets/jetbrains-mono-cyrillic-wght-normal-D73BlboJ.woff2 +0 -0
  108. package/src/dashboard/ui/dist/assets/jetbrains-mono-greek-wght-normal-Bw9x6K1M.woff2 +0 -0
  109. package/src/dashboard/ui/dist/assets/jetbrains-mono-latin-ext-wght-normal-DBQx-q_a.woff2 +0 -0
  110. package/src/dashboard/ui/dist/assets/jetbrains-mono-latin-wght-normal-B9CIFXIH.woff2 +0 -0
  111. package/src/dashboard/ui/dist/assets/jetbrains-mono-vietnamese-wght-normal-Bt-aOZkq.woff2 +0 -0
  112. package/src/dashboard/ui/dist/assets/mover-system.css +62 -0
  113. package/src/dashboard/ui/dist/assets/xterm-CqkleIqs.js +1 -0
  114. package/src/dashboard/ui/dist/icon.svg +4 -0
  115. package/src/dashboard/ui/dist/index.html +18 -0
  116. package/src/dashboard/ui/dist/manifest.webmanifest +1 -0
  117. package/src/dashboard/ui/dist/registerSW.js +1 -0
  118. package/src/dashboard/ui/dist/sw.js +1 -0
  119. package/src/dashboard/ui/dist/workbox-39fa566e.js +1 -0
@@ -0,0 +1,1201 @@
1
+ :root {
2
+ --bg-0: #0a0a0a;
3
+ --bg-1: #101010;
4
+ --bg-2: #151515;
5
+ --bg-3: #1c1c1c;
6
+ --ink-0: #f2f2f2;
7
+ --ink-1: #c8c8c8;
8
+ --ink-2: #8e8e8e;
9
+ --ink-3: #5a5a5a;
10
+ --ink-inv: #080808;
11
+ --line-0: rgba(255,255,255,.06);
12
+ --line-1: rgba(255,255,255,.10);
13
+ --line-2: rgba(255,255,255,.18);
14
+ --accent: #d97a3c;
15
+ --accent-dim: #8a4d27;
16
+ --accent-soft: rgba(217,122,60,.12);
17
+ --accent-line: rgba(217,122,60,.45);
18
+ --warn: #d4a04a;
19
+ --warn-soft: rgba(212,160,74,.10);
20
+ --warn-line: rgba(212,160,74,.40);
21
+ --crit: #c25450;
22
+ --crit-soft: rgba(194,84,80,.10);
23
+ --crit-line: rgba(194,84,80,.45);
24
+ --font-sans: Inter, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
25
+ --font-mono: "JetBrains Mono", "SF Mono", Menlo, Consolas, monospace;
26
+ --topbar-h: 45px;
27
+ --bottombar-h: 27px;
28
+ --sidebar-w: 208px;
29
+ --rail-w: 320px;
30
+ }
31
+
32
+ * { box-sizing: border-box; }
33
+ html, body { margin: 0; min-height: 100%; background: var(--bg-0); color: var(--ink-0); }
34
+ body {
35
+ font-family: var(--font-sans);
36
+ font-size: 14px;
37
+ line-height: 1.45;
38
+ -webkit-font-smoothing: antialiased;
39
+ text-rendering: optimizeLegibility;
40
+ }
41
+ button, input, select { font: inherit; }
42
+ button { color: inherit; cursor: pointer; }
43
+ ::selection { background: var(--accent-soft); color: var(--ink-0); }
44
+ ::-webkit-scrollbar { width: 8px; height: 8px; }
45
+ ::-webkit-scrollbar-track { background: transparent; }
46
+ ::-webkit-scrollbar-thumb { background: rgba(255,255,255,.07); border-radius: 4px; }
47
+ ::-webkit-scrollbar-thumb:hover { background: rgba(255,255,255,.14); }
48
+
49
+ .mono {
50
+ font-family: var(--font-mono);
51
+ font-feature-settings: "zero", "ss01", "ss02";
52
+ }
53
+
54
+ .studio-frame {
55
+ min-height: 100vh;
56
+ display: flex;
57
+ flex-direction: column;
58
+ background: var(--bg-0);
59
+ color: var(--ink-0);
60
+ overflow: hidden;
61
+ }
62
+
63
+ .studio-topbar {
64
+ height: var(--topbar-h);
65
+ flex: 0 0 var(--topbar-h);
66
+ display: flex;
67
+ align-items: center;
68
+ gap: 18px;
69
+ padding: 0 18px;
70
+ border-bottom: 1px solid var(--line-0);
71
+ background: #080808;
72
+ }
73
+
74
+ .brand-lockup {
75
+ display: flex;
76
+ align-items: center;
77
+ gap: 10px;
78
+ min-width: max-content;
79
+ }
80
+
81
+ .brand-mark {
82
+ width: 19px;
83
+ height: 19px;
84
+ display: inline-grid;
85
+ place-items: center;
86
+ border: 1px solid var(--line-2);
87
+ border-radius: 4px;
88
+ color: var(--ink-0);
89
+ font: 600 11px/1 var(--font-mono);
90
+ }
91
+
92
+ .brand-name {
93
+ font-size: 12px;
94
+ letter-spacing: .04em;
95
+ }
96
+ .brand-name span { color: var(--ink-2); }
97
+ .brand-version {
98
+ color: var(--ink-3);
99
+ font-size: 10px;
100
+ letter-spacing: .08em;
101
+ }
102
+
103
+ .top-status {
104
+ flex: 1;
105
+ min-width: 0;
106
+ display: flex;
107
+ align-items: center;
108
+ justify-content: flex-end;
109
+ gap: 13px;
110
+ font-size: 11px;
111
+ white-space: nowrap;
112
+ }
113
+
114
+ .status-cluster {
115
+ display: inline-flex;
116
+ align-items: center;
117
+ gap: 6px;
118
+ min-width: 0;
119
+ }
120
+ .status-cluster strong {
121
+ color: var(--ink-0);
122
+ font-weight: 500;
123
+ text-transform: uppercase;
124
+ }
125
+ .muted { color: var(--ink-3); }
126
+ .status-sep { color: var(--ink-3); opacity: .7; }
127
+
128
+ .test-pill {
129
+ display: inline-flex;
130
+ gap: 7px;
131
+ align-items: center;
132
+ border: 1px solid var(--accent-line);
133
+ color: var(--accent);
134
+ border-radius: 2px;
135
+ padding: 3px 8px;
136
+ letter-spacing: .1em;
137
+ text-transform: uppercase;
138
+ }
139
+ .test-pill span { color: var(--ink-2); }
140
+
141
+ .icon-button {
142
+ width: 29px;
143
+ height: 29px;
144
+ display: inline-grid;
145
+ place-items: center;
146
+ border: 1px solid var(--line-1);
147
+ border-radius: 6px;
148
+ background: var(--bg-1);
149
+ color: var(--ink-1);
150
+ }
151
+ .icon-button:hover { border-color: var(--line-2); color: var(--ink-0); }
152
+
153
+ .dot {
154
+ width: 6px;
155
+ height: 6px;
156
+ border-radius: 999px;
157
+ background: var(--ink-2);
158
+ display: inline-block;
159
+ }
160
+ .dot-live {
161
+ background: var(--accent);
162
+ box-shadow: 0 0 0 3px var(--accent-soft);
163
+ }
164
+
165
+ .studio-shell {
166
+ flex: 1;
167
+ min-height: 0;
168
+ display: grid;
169
+ grid-template-columns: var(--sidebar-w) minmax(0, 1fr) var(--rail-w);
170
+ }
171
+
172
+ .studio-sidebar,
173
+ .studio-rail,
174
+ .studio-main {
175
+ min-height: 0;
176
+ overflow: auto;
177
+ }
178
+
179
+ .studio-sidebar {
180
+ padding: 14px 10px;
181
+ border-right: 1px solid var(--line-0);
182
+ background: #090909;
183
+ }
184
+
185
+ .nav-group { display: flex; flex-direction: column; gap: 1px; margin-bottom: 20px; }
186
+ .nav-label {
187
+ padding: 0 8px 8px;
188
+ color: var(--ink-3);
189
+ font-size: 9px;
190
+ letter-spacing: .2em;
191
+ text-transform: uppercase;
192
+ }
193
+
194
+ .nav-item,
195
+ .file-link {
196
+ position: relative;
197
+ min-height: 34px;
198
+ display: grid;
199
+ grid-template-columns: 16px 1fr auto;
200
+ align-items: center;
201
+ gap: 8px;
202
+ width: 100%;
203
+ padding: 7px 8px;
204
+ border: 0;
205
+ border-radius: 4px;
206
+ background: transparent;
207
+ color: var(--ink-1);
208
+ text-align: left;
209
+ text-decoration: none;
210
+ }
211
+ .nav-item span {
212
+ color: var(--ink-3);
213
+ font: 10px/1 var(--font-mono);
214
+ text-align: center;
215
+ }
216
+ .nav-item strong,
217
+ .file-link {
218
+ font-size: 12px;
219
+ font-weight: 400;
220
+ }
221
+ .nav-item em {
222
+ color: var(--ink-3);
223
+ font: normal 10px/1 var(--font-mono);
224
+ }
225
+ .nav-item.active {
226
+ background: var(--bg-2);
227
+ color: var(--ink-0);
228
+ }
229
+ .nav-item.active::before {
230
+ content: "";
231
+ position: absolute;
232
+ left: -10px;
233
+ top: 7px;
234
+ bottom: 7px;
235
+ width: 2px;
236
+ border-radius: 1px;
237
+ background: var(--accent);
238
+ }
239
+ .nav-item.active span { color: var(--accent); }
240
+ .nav-item:hover, .file-link:hover { background: var(--bg-1); color: var(--ink-0); }
241
+ .file-link {
242
+ grid-template-columns: 16px 1fr;
243
+ color: var(--ink-2);
244
+ font-size: 11px;
245
+ }
246
+ .file-link::before {
247
+ content: "·";
248
+ color: var(--ink-3);
249
+ text-align: center;
250
+ }
251
+
252
+ .studio-main {
253
+ position: relative;
254
+ border-right: 1px solid var(--line-0);
255
+ background: var(--bg-0);
256
+ }
257
+
258
+ .mode-panel { display: none; min-height: 100%; }
259
+ .mode-panel.active { display: block; }
260
+
261
+ .briefing-wrap {
262
+ max-width: 1180px;
263
+ padding: 44px 56px 56px;
264
+ }
265
+
266
+ .briefing-hero {
267
+ display: grid;
268
+ grid-template-columns: minmax(0, 1fr) 360px;
269
+ gap: 38px;
270
+ align-items: start;
271
+ }
272
+
273
+ .dateline {
274
+ display: flex;
275
+ align-items: center;
276
+ gap: 10px;
277
+ margin-bottom: 18px;
278
+ color: var(--ink-2);
279
+ font-size: 10px;
280
+ letter-spacing: .16em;
281
+ text-transform: uppercase;
282
+ flex-wrap: wrap;
283
+ }
284
+
285
+ .data-box {
286
+ display: inline-flex;
287
+ align-items: center;
288
+ gap: 7px;
289
+ padding: 4px 8px;
290
+ border: 1px solid var(--accent-line);
291
+ border-radius: 2px;
292
+ color: var(--accent);
293
+ }
294
+
295
+ .verdict-block h1,
296
+ .learned-wrap h1,
297
+ .placeholder-mode h1 {
298
+ margin: 0;
299
+ max-width: 26ch;
300
+ color: var(--ink-0);
301
+ font-size: clamp(36px, 4.2vw, 52px);
302
+ font-weight: 500;
303
+ letter-spacing: -.024em;
304
+ line-height: 1.05;
305
+ text-wrap: balance;
306
+ }
307
+
308
+ .proof-card {
309
+ margin-top: 2px;
310
+ border: 1px solid var(--line-1);
311
+ border-radius: 6px;
312
+ background:
313
+ linear-gradient(180deg, rgba(217,122,60,.035), transparent 42%),
314
+ var(--bg-1);
315
+ padding: 16px;
316
+ }
317
+ .proof-head {
318
+ display: flex;
319
+ justify-content: space-between;
320
+ gap: 12px;
321
+ padding-bottom: 12px;
322
+ border-bottom: 1px solid var(--line-0);
323
+ color: var(--ink-1);
324
+ font-size: 10px;
325
+ letter-spacing: .18em;
326
+ text-transform: uppercase;
327
+ }
328
+ .proof-head span:last-child { color: var(--ink-3); letter-spacing: .08em; }
329
+ .proof-chain {
330
+ display: grid;
331
+ grid-template-columns: 1fr 24px 1fr 24px 1fr;
332
+ align-items: center;
333
+ gap: 8px;
334
+ margin-top: 16px;
335
+ }
336
+ .proof-node {
337
+ min-height: 72px;
338
+ display: flex;
339
+ flex-direction: column;
340
+ justify-content: center;
341
+ gap: 5px;
342
+ border: 1px solid var(--line-1);
343
+ border-radius: 6px;
344
+ background: var(--bg-0);
345
+ padding: 12px;
346
+ }
347
+ .proof-node strong {
348
+ color: var(--ink-0);
349
+ font-size: 28px;
350
+ line-height: 1;
351
+ font-weight: 500;
352
+ font-variant-numeric: tabular-nums;
353
+ }
354
+ .proof-node span {
355
+ color: var(--ink-2);
356
+ font: 10px/1.35 var(--font-mono);
357
+ letter-spacing: .06em;
358
+ text-transform: uppercase;
359
+ }
360
+ .proof-node.hot { border-color: var(--crit-line); }
361
+ .proof-node.hot strong { color: var(--crit); }
362
+ .proof-node.warn { border-color: var(--warn-line); }
363
+ .proof-node.warn strong { color: var(--warn); }
364
+ .proof-edge {
365
+ height: 1px;
366
+ background: linear-gradient(90deg, var(--line-2), var(--accent-line));
367
+ }
368
+ .proof-chart {
369
+ display: grid;
370
+ gap: 9px;
371
+ margin-top: 18px;
372
+ }
373
+ .chart-row {
374
+ display: grid;
375
+ grid-template-columns: 54px 1fr 42px;
376
+ align-items: center;
377
+ gap: 10px;
378
+ color: var(--ink-2);
379
+ font: 10px/1 var(--font-mono);
380
+ letter-spacing: .08em;
381
+ text-transform: uppercase;
382
+ }
383
+ .chart-row i {
384
+ position: relative;
385
+ height: 7px;
386
+ border-radius: 999px;
387
+ background: rgba(255,255,255,.07);
388
+ overflow: hidden;
389
+ }
390
+ .chart-row i::before {
391
+ content: "";
392
+ display: block;
393
+ width: var(--w);
394
+ height: 100%;
395
+ border-radius: inherit;
396
+ background: var(--accent);
397
+ }
398
+ .chart-row:first-child i::before { background: var(--ink-0); }
399
+ .chart-row:nth-child(2) i::before { background: var(--crit); }
400
+ .chart-row em {
401
+ color: var(--ink-1);
402
+ font-style: normal;
403
+ text-align: right;
404
+ font-variant-numeric: tabular-nums;
405
+ }
406
+ .proof-spark {
407
+ width: 100%;
408
+ height: 72px;
409
+ margin-top: 16px;
410
+ overflow: visible;
411
+ }
412
+ .proof-spark path {
413
+ fill: none;
414
+ vector-effect: non-scaling-stroke;
415
+ }
416
+ .spark-grid { stroke: rgba(255,255,255,.045); stroke-width: 1; }
417
+ .spark-ship { stroke: var(--ink-1); stroke-width: 2; }
418
+ .spark-polish { stroke: var(--accent); stroke-width: 2.5; }
419
+ .proof-caption {
420
+ margin-top: 10px;
421
+ color: var(--ink-2);
422
+ font-size: 10px;
423
+ letter-spacing: .06em;
424
+ line-height: 1.45;
425
+ }
426
+
427
+ .verdict-subline {
428
+ max-width: 58ch;
429
+ margin: 17px 0 0;
430
+ color: var(--ink-1);
431
+ font-size: 15px;
432
+ line-height: 1.62;
433
+ }
434
+ .verdict-subline sup {
435
+ margin-left: 2px;
436
+ color: var(--ink-1);
437
+ font-family: var(--font-mono);
438
+ font-size: 10px;
439
+ border-bottom: 1px solid var(--line-1);
440
+ }
441
+
442
+ .action-row {
443
+ display: flex;
444
+ align-items: center;
445
+ gap: 8px;
446
+ flex-wrap: wrap;
447
+ margin-top: 28px;
448
+ }
449
+ .btn {
450
+ min-height: 34px;
451
+ display: inline-flex;
452
+ align-items: center;
453
+ gap: 8px;
454
+ padding: 0 14px;
455
+ border: 1px solid var(--line-1);
456
+ border-radius: 6px;
457
+ background: var(--bg-1);
458
+ color: var(--ink-0);
459
+ font-family: var(--font-mono);
460
+ font-size: 12px;
461
+ letter-spacing: .02em;
462
+ }
463
+ .btn:hover { border-color: var(--line-2); background: var(--bg-2); }
464
+ .btn-primary {
465
+ background: var(--ink-0);
466
+ border-color: var(--ink-0);
467
+ color: var(--ink-inv);
468
+ font-weight: 600;
469
+ }
470
+ .btn-primary:hover { background: #fff; border-color: #fff; }
471
+ .btn-secondary .muted { margin-left: 3px; }
472
+ .shortcut { color: rgba(0,0,0,.45); font-size: 10px; margin-left: 5px; }
473
+
474
+ .evidence-section { margin-top: 56px; }
475
+ .workflow-section { margin-top: 48px; }
476
+ .section-head {
477
+ display: flex;
478
+ justify-content: space-between;
479
+ align-items: center;
480
+ gap: 16px;
481
+ padding-bottom: 10px;
482
+ border-bottom: 1px solid var(--line-1);
483
+ }
484
+ .section-head h2 {
485
+ margin: 0;
486
+ color: var(--ink-1);
487
+ font-size: 10px;
488
+ font-weight: 500;
489
+ letter-spacing: .2em;
490
+ text-transform: uppercase;
491
+ }
492
+ .section-head span {
493
+ color: var(--ink-3);
494
+ font-size: 10px;
495
+ letter-spacing: .08em;
496
+ text-transform: uppercase;
497
+ }
498
+
499
+ .receipt-list {
500
+ list-style: none;
501
+ margin: 0;
502
+ padding: 0;
503
+ }
504
+ .receipt-row {
505
+ display: grid;
506
+ grid-template-columns: 32px minmax(0,1fr) auto;
507
+ gap: 14px;
508
+ padding: 17px 0;
509
+ border-top: 1px solid var(--line-0);
510
+ }
511
+ .receipt-row:first-child { border-top: 0; }
512
+ .receipt-num {
513
+ padding-top: 2px;
514
+ color: var(--ink-1);
515
+ font-size: 11px;
516
+ }
517
+ .receipt-row blockquote {
518
+ margin: 0;
519
+ color: var(--ink-0);
520
+ font-size: 14px;
521
+ line-height: 1.5;
522
+ }
523
+ .receipt-row p {
524
+ margin: 6px 0 0;
525
+ color: var(--ink-2);
526
+ font-size: 11px;
527
+ letter-spacing: .04em;
528
+ }
529
+ .receipt-row p span { color: var(--ink-3); }
530
+ .receipt-open {
531
+ align-self: start;
532
+ border: 0;
533
+ background: transparent;
534
+ color: var(--ink-3);
535
+ font-size: 10px;
536
+ letter-spacing: .08em;
537
+ }
538
+ .receipt-open:hover { color: var(--ink-0); }
539
+
540
+ .workflow-teaser {
541
+ display: grid;
542
+ grid-template-columns: repeat(3, minmax(0,1fr));
543
+ gap: 10px;
544
+ padding-top: 14px;
545
+ }
546
+ .workflow-full { grid-template-columns: 1fr; }
547
+
548
+ .suggest-card {
549
+ position: relative;
550
+ min-height: 160px;
551
+ display: flex;
552
+ flex-direction: column;
553
+ gap: 10px;
554
+ padding: 16px;
555
+ border: 1px solid var(--line-1);
556
+ border-radius: 6px;
557
+ background: var(--bg-1);
558
+ transition: border-color .15s, background .15s;
559
+ }
560
+ .suggest-card:hover { border-color: var(--line-2); background: var(--bg-2); }
561
+ .suggest-workflow {
562
+ color: var(--ink-0);
563
+ font-size: 17px;
564
+ font-weight: 500;
565
+ letter-spacing: -.01em;
566
+ }
567
+ .suggest-reason {
568
+ color: var(--ink-1);
569
+ font-size: 13px;
570
+ line-height: 1.5;
571
+ }
572
+ .suggest-meta {
573
+ display: flex;
574
+ align-items: center;
575
+ justify-content: space-between;
576
+ gap: 10px;
577
+ margin-top: auto;
578
+ color: var(--ink-3);
579
+ font-family: var(--font-mono);
580
+ font-size: 10px;
581
+ letter-spacing: .06em;
582
+ text-transform: uppercase;
583
+ }
584
+ .suggest-actions {
585
+ display: flex;
586
+ gap: 6px;
587
+ flex-wrap: wrap;
588
+ }
589
+ .suggest-action-btn {
590
+ height: 24px;
591
+ padding: 0 9px;
592
+ border: 1px solid var(--line-1);
593
+ border-radius: 5px;
594
+ background: transparent;
595
+ color: var(--ink-2);
596
+ font-family: var(--font-mono);
597
+ font-size: 10px;
598
+ }
599
+ .suggest-action-btn:hover { color: var(--ink-0); border-color: var(--line-2); }
600
+
601
+ .status-pill {
602
+ display: inline-flex;
603
+ align-items: center;
604
+ height: 22px;
605
+ padding: 0 8px;
606
+ border: 1px solid var(--line-1);
607
+ border-radius: 999px;
608
+ color: var(--ink-1);
609
+ font-family: var(--font-mono);
610
+ font-size: 10px;
611
+ letter-spacing: .08em;
612
+ text-transform: uppercase;
613
+ }
614
+ .status-red { border-color: var(--crit-line); color: var(--crit); background: var(--crit-soft); }
615
+ .status-amber, .status-yellow { border-color: var(--warn-line); color: var(--warn); background: var(--warn-soft); }
616
+ .status-green, .status-clear, .status-info { border-color: var(--line-1); color: var(--ink-1); }
617
+
618
+ .studio-rail {
619
+ padding: 20px 22px;
620
+ background: #090909;
621
+ }
622
+ .rail-module { margin-bottom: 26px; }
623
+ .rail-head {
624
+ display: flex;
625
+ justify-content: space-between;
626
+ align-items: center;
627
+ gap: 12px;
628
+ padding-bottom: 10px;
629
+ margin-bottom: 12px;
630
+ border-bottom: 1px solid var(--line-1);
631
+ color: var(--ink-1);
632
+ font-size: 10px;
633
+ letter-spacing: .2em;
634
+ text-transform: uppercase;
635
+ }
636
+ .rail-head span:last-child {
637
+ color: var(--ink-3);
638
+ letter-spacing: .08em;
639
+ }
640
+ .rail-head.accent,
641
+ .rail-head.accent span:first-child { color: var(--accent); }
642
+
643
+ .command-box {
644
+ width: 100%;
645
+ min-height: 58px;
646
+ display: flex;
647
+ align-items: center;
648
+ gap: 10px;
649
+ padding: 0 14px;
650
+ border: 1px solid var(--line-1);
651
+ border-radius: 6px;
652
+ background: var(--bg-1);
653
+ color: var(--ink-2);
654
+ font-size: 14px;
655
+ text-align: left;
656
+ }
657
+ .command-box:hover { border-color: var(--line-2); color: var(--ink-0); }
658
+ .command-box span { color: var(--accent); font-size: 16px; }
659
+
660
+ .metric-stack { display: flex; flex-direction: column; gap: 11px; }
661
+ .metric-row {
662
+ display: flex;
663
+ justify-content: space-between;
664
+ align-items: baseline;
665
+ gap: 14px;
666
+ }
667
+ .metric-row strong {
668
+ color: var(--ink-0);
669
+ font-size: 28px;
670
+ font-weight: 500;
671
+ line-height: 1;
672
+ font-variant-numeric: tabular-nums;
673
+ }
674
+ .metric-row strong span { color: var(--ink-3); font-size: 15px; }
675
+ .metric-row em {
676
+ color: var(--ink-2);
677
+ font: normal 10px/1.4 var(--font-mono);
678
+ letter-spacing: .08em;
679
+ text-align: right;
680
+ text-transform: uppercase;
681
+ }
682
+ .bar-10 {
683
+ height: 7px;
684
+ background: repeating-linear-gradient(90deg, rgba(255,255,255,.12) 0 18px, transparent 18px 25px);
685
+ border-radius: 2px;
686
+ overflow: hidden;
687
+ }
688
+ .bar-10 span {
689
+ display: block;
690
+ height: 100%;
691
+ background: var(--ink-0);
692
+ }
693
+ .sparkline {
694
+ width: 100%;
695
+ height: 36px;
696
+ }
697
+ .sparkline path {
698
+ fill: none;
699
+ stroke: var(--accent);
700
+ stroke-width: 2;
701
+ vector-effect: non-scaling-stroke;
702
+ }
703
+
704
+ .health-protocol {
705
+ border: 1px solid var(--line-1);
706
+ border-radius: 6px;
707
+ background: var(--bg-1);
708
+ padding: 13px;
709
+ }
710
+ .health-header {
711
+ display: flex;
712
+ justify-content: space-between;
713
+ gap: 10px;
714
+ align-items: baseline;
715
+ }
716
+ .health-title {
717
+ color: var(--ink-0);
718
+ font-size: 13px;
719
+ font-weight: 500;
720
+ }
721
+ .health-meta {
722
+ color: var(--ink-2);
723
+ font: 10px/1.4 var(--font-mono);
724
+ text-align: right;
725
+ letter-spacing: .04em;
726
+ }
727
+ .health-progress {
728
+ height: 5px;
729
+ margin-top: 12px;
730
+ border-radius: 999px;
731
+ background: rgba(255,255,255,.08);
732
+ overflow: hidden;
733
+ }
734
+ .health-progress span {
735
+ display: block;
736
+ height: 100%;
737
+ background: linear-gradient(90deg, var(--warn), var(--accent));
738
+ }
739
+ .health-progress-label {
740
+ margin-top: 7px;
741
+ color: var(--ink-2);
742
+ font: 10px/1 var(--font-mono);
743
+ letter-spacing: .08em;
744
+ text-transform: uppercase;
745
+ }
746
+ .health-list {
747
+ margin-top: 9px;
748
+ border-top: 1px solid var(--line-0);
749
+ }
750
+ .protocol-module .health-list {
751
+ max-height: 260px;
752
+ overflow: auto;
753
+ }
754
+ .health-item {
755
+ display: grid;
756
+ grid-template-columns: 18px 1fr;
757
+ gap: 8px;
758
+ padding: 8px 0;
759
+ border-bottom: 1px solid var(--line-0);
760
+ color: var(--ink-1);
761
+ font-size: 12px;
762
+ }
763
+ .health-item.checked { color: var(--ink-2); text-decoration: line-through; text-decoration-color: var(--ink-3); }
764
+ .health-check { color: var(--accent); font-family: var(--font-mono); }
765
+
766
+ .privacy-stack {
767
+ display: flex;
768
+ flex-direction: column;
769
+ gap: 9px;
770
+ }
771
+ .privacy-stack div {
772
+ display: grid;
773
+ grid-template-columns: 10px 1fr auto;
774
+ align-items: center;
775
+ gap: 8px;
776
+ }
777
+ .privacy-stack strong {
778
+ color: var(--ink-1);
779
+ font-weight: 500;
780
+ }
781
+ .privacy-stack em {
782
+ color: var(--ink-2);
783
+ font: normal 11px/1 var(--font-mono);
784
+ }
785
+ .privacy-stack.large {
786
+ max-width: 520px;
787
+ margin-top: 24px;
788
+ padding: 18px;
789
+ border: 1px solid var(--line-1);
790
+ border-radius: 6px;
791
+ background: var(--bg-1);
792
+ }
793
+
794
+ .agents-grid {
795
+ display: grid;
796
+ gap: 8px;
797
+ }
798
+ .agent-card {
799
+ min-height: 36px;
800
+ display: grid;
801
+ grid-template-columns: 1fr auto 8px;
802
+ align-items: center;
803
+ gap: 12px;
804
+ padding: 8px 10px;
805
+ border: 1px solid var(--line-0);
806
+ border-radius: 5px;
807
+ background: var(--bg-1);
808
+ }
809
+ .agent-card.installed { border-color: var(--line-1); }
810
+ .agent-name {
811
+ color: var(--ink-1);
812
+ font-size: 12px;
813
+ }
814
+ .agent-meta {
815
+ color: var(--ink-3);
816
+ font: 10px/1 var(--font-mono);
817
+ letter-spacing: .04em;
818
+ white-space: nowrap;
819
+ }
820
+ .agent-dot {
821
+ width: 7px;
822
+ height: 7px;
823
+ border-radius: 50%;
824
+ background: var(--ink-3);
825
+ }
826
+ .agent-dot.installed { background: var(--accent); box-shadow: 0 0 0 3px var(--accent-soft); }
827
+ .rail-agents .agent-card { min-height: 32px; }
828
+
829
+ .learned-wrap,
830
+ .placeholder-mode {
831
+ max-width: 900px;
832
+ padding: 36px 56px 56px;
833
+ }
834
+ .masthead {
835
+ display: flex;
836
+ justify-content: space-between;
837
+ gap: 16px;
838
+ padding-bottom: 15px;
839
+ border-bottom: 1px solid var(--line-1);
840
+ color: var(--ink-3);
841
+ font-size: 10px;
842
+ letter-spacing: .18em;
843
+ text-transform: uppercase;
844
+ }
845
+ .learned-wrap h1,
846
+ .placeholder-mode h1 {
847
+ margin-top: 30px;
848
+ max-width: 22ch;
849
+ font-size: clamp(34px, 3.9vw, 48px);
850
+ }
851
+ .editorial-copy,
852
+ .placeholder-mode p {
853
+ max-width: 62ch;
854
+ color: var(--ink-1);
855
+ font-size: 15px;
856
+ line-height: 1.72;
857
+ }
858
+ .pullquote {
859
+ margin-top: 30px;
860
+ padding: 20px 24px;
861
+ border-left: 2px solid var(--accent);
862
+ background: var(--bg-1);
863
+ color: var(--ink-0);
864
+ font-size: 20px;
865
+ font-style: italic;
866
+ line-height: 1.35;
867
+ }
868
+ .editorial-patterns { margin-top: 30px; }
869
+ .pattern {
870
+ padding: 13px 0;
871
+ border-top: 1px solid var(--line-0);
872
+ }
873
+ .pattern-head {
874
+ display: flex;
875
+ align-items: center;
876
+ justify-content: space-between;
877
+ gap: 14px;
878
+ }
879
+ .pattern-name { color: var(--ink-0); font-size: 14px; }
880
+ .pattern-conf {
881
+ border: 1px solid var(--warn-line);
882
+ border-radius: 999px;
883
+ padding: 3px 8px;
884
+ color: var(--warn);
885
+ font: 10px/1 var(--font-mono);
886
+ text-transform: uppercase;
887
+ }
888
+ .pattern-meta {
889
+ margin-top: 5px;
890
+ color: var(--ink-3);
891
+ display: flex;
892
+ flex-wrap: wrap;
893
+ gap: 10px;
894
+ font: 11px/1.4 var(--font-mono);
895
+ }
896
+ .mode-kicker {
897
+ color: var(--accent);
898
+ font-size: 10px;
899
+ letter-spacing: .2em;
900
+ text-transform: uppercase;
901
+ }
902
+ .settings-grid {
903
+ max-width: 560px;
904
+ margin-top: 24px;
905
+ display: grid;
906
+ gap: 12px;
907
+ }
908
+ .settings-grid label {
909
+ display: grid;
910
+ grid-template-columns: 150px 1fr auto;
911
+ gap: 10px;
912
+ align-items: center;
913
+ color: var(--ink-1);
914
+ }
915
+ .settings-grid input,
916
+ .settings-grid select {
917
+ min-height: 34px;
918
+ border: 1px solid var(--line-1);
919
+ border-radius: 6px;
920
+ background: var(--bg-1);
921
+ color: var(--ink-0);
922
+ padding: 0 10px;
923
+ }
924
+ .hook-stats {
925
+ margin-top: 20px;
926
+ display: grid;
927
+ grid-template-columns: repeat(2, minmax(0, 1fr));
928
+ gap: 10px;
929
+ }
930
+ .hook-stat {
931
+ border: 1px solid var(--line-1);
932
+ border-radius: 6px;
933
+ padding: 12px;
934
+ background: var(--bg-1);
935
+ }
936
+ .hook-stat-name {
937
+ color: var(--ink-2);
938
+ font: 10px/1 var(--font-mono);
939
+ letter-spacing: .08em;
940
+ text-transform: uppercase;
941
+ }
942
+ .hook-stat-num {
943
+ margin-top: 8px;
944
+ color: var(--ink-0);
945
+ font-size: 24px;
946
+ font-variant-numeric: tabular-nums;
947
+ }
948
+
949
+ .mobile-tabs { display: none; }
950
+ .studio-bottombar {
951
+ height: var(--bottombar-h);
952
+ flex: 0 0 var(--bottombar-h);
953
+ display: flex;
954
+ align-items: center;
955
+ gap: 14px;
956
+ padding: 0 16px;
957
+ border-top: 1px solid var(--line-0);
958
+ background: #080808;
959
+ color: var(--ink-2);
960
+ font-size: 10px;
961
+ white-space: nowrap;
962
+ }
963
+ .studio-bottombar span {
964
+ display: inline-flex;
965
+ align-items: center;
966
+ gap: 6px;
967
+ }
968
+ .bottom-right { margin-left: auto; }
969
+
970
+ .modal-backdrop {
971
+ position: fixed;
972
+ inset: 0;
973
+ z-index: 50;
974
+ display: grid;
975
+ place-items: center;
976
+ background: rgba(0,0,0,.66);
977
+ }
978
+ .modal-backdrop.hidden { display: none; }
979
+ .modal {
980
+ width: min(760px, calc(100vw - 32px));
981
+ border: 1px solid var(--line-1);
982
+ border-radius: 8px;
983
+ background: var(--bg-1);
984
+ box-shadow: 0 24px 80px rgba(0,0,0,.5);
985
+ }
986
+ .modal-header {
987
+ display: flex;
988
+ justify-content: space-between;
989
+ align-items: center;
990
+ padding: 14px 16px;
991
+ border-bottom: 1px solid var(--line-0);
992
+ color: var(--ink-0);
993
+ font-family: var(--font-mono);
994
+ }
995
+ .modal-close {
996
+ width: 28px;
997
+ height: 28px;
998
+ border: 1px solid var(--line-1);
999
+ border-radius: 6px;
1000
+ background: transparent;
1001
+ color: var(--ink-1);
1002
+ }
1003
+ .modal-body { padding: 18px; }
1004
+ .command-snippet {
1005
+ margin: 10px 0;
1006
+ padding: 14px;
1007
+ border: 1px solid var(--line-1);
1008
+ border-radius: 6px;
1009
+ background: var(--bg-0);
1010
+ color: var(--ink-0);
1011
+ font-family: var(--font-mono);
1012
+ }
1013
+ .btn-copy {
1014
+ min-height: 32px;
1015
+ border: 1px solid var(--line-1);
1016
+ border-radius: 6px;
1017
+ background: var(--ink-0);
1018
+ color: var(--ink-inv);
1019
+ padding: 0 12px;
1020
+ font-family: var(--font-mono);
1021
+ }
1022
+ .btn-copy.secondary {
1023
+ background: transparent;
1024
+ color: var(--ink-1);
1025
+ }
1026
+ .btn-copy:disabled {
1027
+ opacity: .55;
1028
+ cursor: wait;
1029
+ }
1030
+ .agent-runner {
1031
+ display: grid;
1032
+ gap: 14px;
1033
+ }
1034
+ .agent-runner-reason {
1035
+ color: var(--ink-2);
1036
+ font-size: 13px;
1037
+ line-height: 1.5;
1038
+ }
1039
+ .agent-controls {
1040
+ display: grid;
1041
+ gap: 12px;
1042
+ }
1043
+ .agent-controls label {
1044
+ display: grid;
1045
+ gap: 6px;
1046
+ color: var(--ink-2);
1047
+ font-size: 10px;
1048
+ letter-spacing: .12em;
1049
+ text-transform: uppercase;
1050
+ }
1051
+ .agent-controls select,
1052
+ .agent-controls textarea {
1053
+ width: 100%;
1054
+ border: 1px solid var(--line-1);
1055
+ border-radius: 6px;
1056
+ background: var(--bg-0);
1057
+ color: var(--ink-0);
1058
+ padding: 10px 12px;
1059
+ font: 12px/1.5 var(--font-mono);
1060
+ text-transform: none;
1061
+ letter-spacing: 0;
1062
+ }
1063
+ .agent-controls textarea {
1064
+ min-height: 118px;
1065
+ resize: vertical;
1066
+ }
1067
+ .agent-actions {
1068
+ display: flex;
1069
+ gap: 8px;
1070
+ flex-wrap: wrap;
1071
+ }
1072
+ .agent-output {
1073
+ min-height: 180px;
1074
+ max-height: 360px;
1075
+ overflow: auto;
1076
+ margin: 0;
1077
+ padding: 14px;
1078
+ border: 1px solid var(--line-1);
1079
+ border-radius: 6px;
1080
+ background: #050505;
1081
+ color: var(--ink-1);
1082
+ font-size: 11px;
1083
+ line-height: 1.55;
1084
+ white-space: pre-wrap;
1085
+ }
1086
+
1087
+ @media (max-width: 1120px) {
1088
+ .studio-shell { grid-template-columns: 184px minmax(0,1fr); }
1089
+ .studio-rail { display: none; }
1090
+ .briefing-wrap, .learned-wrap, .placeholder-mode { padding-inline: 36px; }
1091
+ .briefing-hero { grid-template-columns: 1fr; }
1092
+ .workflow-teaser { grid-template-columns: 1fr; }
1093
+ }
1094
+
1095
+ @media (max-width: 760px) {
1096
+ :root { --topbar-h: 48px; --bottombar-h: 0px; }
1097
+ body { font-size: 16px; }
1098
+ .studio-topbar { padding: 0 14px; }
1099
+ .brand-version,
1100
+ .top-status .status-cluster:nth-of-type(n+2),
1101
+ .status-sep,
1102
+ .test-pill { display: none; }
1103
+ .studio-shell {
1104
+ display: block;
1105
+ flex: 1;
1106
+ overflow: auto;
1107
+ }
1108
+ .studio-sidebar { display: none; }
1109
+ .studio-main {
1110
+ min-height: auto;
1111
+ overflow: visible;
1112
+ border-right: 0;
1113
+ }
1114
+ .studio-rail {
1115
+ display: block;
1116
+ overflow: visible;
1117
+ padding: 0 20px 86px;
1118
+ }
1119
+ .briefing-wrap, .learned-wrap, .placeholder-mode {
1120
+ padding: 28px 20px 32px;
1121
+ }
1122
+ .briefing-hero {
1123
+ grid-template-columns: 1fr;
1124
+ gap: 26px;
1125
+ }
1126
+ .proof-chain {
1127
+ grid-template-columns: 1fr;
1128
+ }
1129
+ .proof-edge {
1130
+ width: 1px;
1131
+ height: 16px;
1132
+ justify-self: center;
1133
+ }
1134
+ .dateline {
1135
+ font-size: 9px;
1136
+ gap: 8px;
1137
+ margin-bottom: 16px;
1138
+ }
1139
+ .verdict-block h1,
1140
+ .learned-wrap h1,
1141
+ .placeholder-mode h1 {
1142
+ font-size: 35px;
1143
+ line-height: 1.08;
1144
+ max-width: 11ch;
1145
+ }
1146
+ .verdict-subline {
1147
+ font-size: 16px;
1148
+ line-height: 1.55;
1149
+ }
1150
+ .action-row {
1151
+ display: grid;
1152
+ grid-template-columns: 1fr;
1153
+ }
1154
+ .btn {
1155
+ min-height: 44px;
1156
+ justify-content: center;
1157
+ }
1158
+ .evidence-section { margin-top: 34px; }
1159
+ .receipt-row {
1160
+ grid-template-columns: 28px 1fr;
1161
+ }
1162
+ .receipt-open { display: none; }
1163
+ .workflow-section { margin-top: 32px; }
1164
+ .workflow-teaser { grid-template-columns: 1fr; }
1165
+ .suggest-card { min-height: auto; }
1166
+ .studio-bottombar { display: none; }
1167
+ .mobile-tabs {
1168
+ position: fixed;
1169
+ left: 10px;
1170
+ right: 10px;
1171
+ bottom: 10px;
1172
+ z-index: 20;
1173
+ display: grid;
1174
+ grid-template-columns: repeat(4, 1fr);
1175
+ gap: 4px;
1176
+ padding: 5px;
1177
+ border: 1px solid var(--line-1);
1178
+ border-radius: 8px;
1179
+ background: rgba(10,10,10,.92);
1180
+ backdrop-filter: blur(14px);
1181
+ }
1182
+ .mobile-tabs button {
1183
+ min-height: 42px;
1184
+ border: 0;
1185
+ border-radius: 6px;
1186
+ background: transparent;
1187
+ color: var(--ink-2);
1188
+ font-family: var(--font-mono);
1189
+ font-size: 11px;
1190
+ }
1191
+ .mobile-tabs button.active {
1192
+ background: var(--bg-2);
1193
+ color: var(--ink-0);
1194
+ }
1195
+ .masthead { flex-direction: column; gap: 6px; }
1196
+ }
1197
+
1198
+ @media (prefers-reduced-motion: no-preference) {
1199
+ .mode-panel.active { animation: fade-in .14s ease-out; }
1200
+ @keyframes fade-in { from { opacity: 0; transform: translateY(4px); } to { opacity: 1; transform: none; } }
1201
+ }