@deeeed/metamask-harness 0.47.0 → 0.47.2

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.
@@ -1,1066 +0,0 @@
1
- /* mm-harness getting-started site — single stylesheet, no external assets. */
2
-
3
- :root {
4
- --bg: #0e0f13;
5
- --bg-raised: #15171d;
6
- --surface: #1a1d25;
7
- --surface-2: #20242e;
8
- --line: #2b3040;
9
- --line-soft: #23272f;
10
-
11
- /* Every text token clears WCAG AA (4.5:1) against the darkest-to-lightest
12
- surfaces above; --text-faint is the floor at 5.2:1 on --surface-2. */
13
- --text: #e9eaf0;
14
- --text-dim: #b0b6c6;
15
- --text-faint: #9096a8;
16
-
17
- --accent: #f6851b;
18
- --accent-deep: #d4700f;
19
- --accent-soft: rgba(246, 133, 27, 0.14);
20
- --accent-line: rgba(246, 133, 27, 0.34);
21
-
22
- --pass: #58d68a;
23
- --fail: #f0736b;
24
- --warn: #f0c05a;
25
- --info: #6aa9f0;
26
-
27
- --radius: 12px;
28
- --radius-sm: 8px;
29
- --shadow: 0 1px 2px rgba(0, 0, 0, 0.4), 0 8px 28px rgba(0, 0, 0, 0.28);
30
- --ease: cubic-bezier(0.22, 0.61, 0.36, 1);
31
-
32
- --sans: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue",
33
- Arial, sans-serif;
34
- --mono: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas,
35
- "Liberation Mono", monospace;
36
- }
37
-
38
- *, *::before, *::after { box-sizing: border-box; }
39
-
40
- /* Clears the sticky bar plus the progress rail (114px together), so an anchor
41
- never parks its heading underneath them. */
42
- html { scroll-behavior: smooth; scroll-padding-top: 116px; }
43
-
44
- body {
45
- margin: 0;
46
- background: var(--bg);
47
- color: var(--text);
48
- font-family: var(--sans);
49
- font-size: 16px;
50
- line-height: 1.65;
51
- -webkit-font-smoothing: antialiased;
52
- text-rendering: optimizeLegibility;
53
- }
54
-
55
- /* Ambient wash — keeps the page from reading as a flat README. */
56
- body::before {
57
- content: "";
58
- position: fixed;
59
- inset: 0;
60
- pointer-events: none;
61
- z-index: 0;
62
- background:
63
- radial-gradient(760px 380px at 12% -8%, rgba(246, 133, 27, 0.10), transparent 60%),
64
- radial-gradient(620px 320px at 92% 4%, rgba(106, 169, 240, 0.06), transparent 62%);
65
- }
66
-
67
- body > * { position: relative; z-index: 1; }
68
-
69
- a { color: var(--accent); text-decoration: none; }
70
- a:hover { text-decoration: underline; text-underline-offset: 3px; }
71
-
72
- h1, h2, h3, h4 { line-height: 1.22; letter-spacing: -0.021em; margin: 0 0 0.5em; }
73
- h1 { font-size: clamp(2rem, 4.4vw, 2.9rem); font-weight: 680; }
74
- h2 { font-size: clamp(1.35rem, 2.4vw, 1.7rem); font-weight: 640; margin-top: 2.4em; }
75
- h3 { font-size: 1.1rem; font-weight: 620; margin-top: 1.8em; }
76
- p { margin: 0 0 1.1em; }
77
- p, li { color: #d5d8e2; }
78
-
79
- code {
80
- font-family: var(--mono);
81
- font-size: 0.885em;
82
- background: var(--surface-2);
83
- border: 1px solid var(--line-soft);
84
- border-radius: 5px;
85
- padding: 0.1em 0.38em;
86
- color: #f0d9bd;
87
- }
88
-
89
- strong { color: var(--text); font-weight: 620; }
90
-
91
- /* ---------- layout ---------- */
92
-
93
- .wrap { width: min(940px, calc(100% - 3rem)); margin: 0 auto; }
94
- .wrap-wide { width: min(1160px, calc(100% - 3rem)); margin: 0 auto; }
95
-
96
- main { padding-bottom: 6rem; }
97
-
98
- /* ---------- top bar ---------- */
99
-
100
- .topbar {
101
- position: sticky;
102
- top: 0;
103
- z-index: 50;
104
- background: rgba(14, 15, 19, 0.86);
105
- backdrop-filter: saturate(150%) blur(14px);
106
- -webkit-backdrop-filter: saturate(150%) blur(14px);
107
- border-bottom: 1px solid var(--line-soft);
108
- }
109
-
110
- .topbar-inner {
111
- display: flex;
112
- align-items: center;
113
- flex-wrap: wrap;
114
- gap: 0.5rem 1.5rem;
115
- min-height: 60px;
116
- padding: 0.5rem 0;
117
- }
118
-
119
- .brand {
120
- display: inline-flex;
121
- align-items: center;
122
- gap: 0.6rem;
123
- font-weight: 640;
124
- color: var(--text);
125
- letter-spacing: -0.015em;
126
- white-space: nowrap;
127
- }
128
- .brand:hover { text-decoration: none; }
129
-
130
- .brand-mark { width: 22px; height: 22px; flex: none; display: block; }
131
-
132
- .brand-name { font-family: var(--mono); font-size: 0.95rem; }
133
-
134
- /* Six items fit a laptop on one line; below that they wrap onto a second row
135
- rather than scrolling a label out of sight. */
136
- .nav {
137
- display: flex;
138
- gap: 0.3rem;
139
- margin-left: auto;
140
- min-width: 0;
141
- flex-wrap: wrap;
142
- justify-content: flex-end;
143
- }
144
-
145
- .nav a {
146
- flex: none;
147
- white-space: nowrap;
148
- color: var(--text-dim);
149
- font-size: 0.885rem;
150
- font-weight: 500;
151
- padding: 0.4rem 0.7rem;
152
- border-radius: var(--radius-sm);
153
- transition: color 0.16s var(--ease), background 0.16s var(--ease);
154
- }
155
- .nav a:hover { color: var(--text); background: var(--surface); text-decoration: none; }
156
- .nav a[aria-current="page"] { color: var(--accent); background: var(--accent-soft); }
157
-
158
- /* The way back to the setup prompt. It leads the nav and stays visible when the
159
- rest of the bar scrolls, because it is the one link every page owes a reader. */
160
- .nav a.nav-cta { color: var(--accent); border: 1px solid var(--accent-line); }
161
- .nav a.nav-cta:hover { background: var(--accent-soft); color: var(--accent); }
162
-
163
- /* ---------- progress rail ---------- */
164
-
165
- .progress-rail {
166
- position: sticky;
167
- top: 60px;
168
- z-index: 45;
169
- background: rgba(14, 15, 19, 0.9);
170
- backdrop-filter: blur(12px);
171
- -webkit-backdrop-filter: blur(12px);
172
- border-bottom: 1px solid var(--line-soft);
173
- padding: 0.7rem 0;
174
- }
175
-
176
- .progress-inner { display: flex; align-items: center; gap: 1rem; }
177
-
178
- .progress-track {
179
- flex: 1;
180
- height: 6px;
181
- background: var(--surface-2);
182
- border-radius: 99px;
183
- overflow: hidden;
184
- }
185
-
186
- .progress-fill {
187
- height: 100%;
188
- width: 0%;
189
- border-radius: 99px;
190
- background: linear-gradient(90deg, var(--accent-deep), var(--accent));
191
- transition: width 0.4s var(--ease);
192
- }
193
-
194
- .progress-label {
195
- font-family: var(--mono);
196
- font-size: 0.78rem;
197
- color: var(--text-dim);
198
- white-space: nowrap;
199
- font-variant-numeric: tabular-nums;
200
- }
201
-
202
- .progress-reset {
203
- font: inherit;
204
- font-size: 0.78rem;
205
- color: var(--text-faint);
206
- background: none;
207
- border: 1px solid var(--line);
208
- border-radius: 99px;
209
- padding: 0.22rem 0.7rem;
210
- cursor: pointer;
211
- white-space: nowrap;
212
- transition: all 0.16s var(--ease);
213
- }
214
- .progress-reset:hover { color: var(--text); border-color: var(--accent-line); }
215
-
216
- /* ---------- hero ---------- */
217
-
218
- .hero { padding: 4.5rem 0 2.5rem; }
219
-
220
- .eyebrow {
221
- display: inline-block;
222
- font-family: var(--mono);
223
- font-size: 0.74rem;
224
- letter-spacing: 0.1em;
225
- text-transform: uppercase;
226
- color: var(--accent);
227
- background: var(--accent-soft);
228
- border: 1px solid var(--accent-line);
229
- border-radius: 99px;
230
- padding: 0.3rem 0.8rem;
231
- margin-bottom: 1.4rem;
232
- }
233
-
234
- .hero h1 { max-width: 20ch; }
235
-
236
- .lede {
237
- font-size: 1.14rem;
238
- color: var(--text-dim);
239
- max-width: 66ch;
240
- line-height: 1.68;
241
- }
242
-
243
- .hero-meta {
244
- display: flex;
245
- flex-wrap: wrap;
246
- gap: 0.5rem 1.4rem;
247
- margin-top: 1.6rem;
248
- font-family: var(--mono);
249
- font-size: 0.8rem;
250
- color: var(--text-faint);
251
- }
252
-
253
- /* ---------- lobby (front page) ----------
254
- The entry page carries one idea and one call to action: no nav, no rail, no
255
- checklist. Everything else in the site hangs off the single button below. */
256
-
257
- .lobby {
258
- display: flex;
259
- align-items: center;
260
- min-height: 100vh;
261
- padding: 3rem 0 4rem;
262
- }
263
-
264
- .lobby-inner {
265
- width: min(760px, calc(100% - 3rem));
266
- margin: 0 auto;
267
- text-align: center;
268
- }
269
-
270
- .lobby-mark { display: block; width: 52px; height: 52px; margin: 0 auto 1.6rem; }
271
-
272
- .lobby h1 {
273
- font-size: clamp(2rem, 4.6vw, 2.85rem);
274
- max-width: 24ch;
275
- margin: 0 auto 0.7rem;
276
- /* Break at the comma rather than orphaning the last word. */
277
- text-wrap: balance;
278
- }
279
-
280
- .lobby-lede {
281
- font-size: 1.11rem;
282
- line-height: 1.62;
283
- color: var(--text-dim);
284
- max-width: 60ch;
285
- margin: 0 auto 1.1rem;
286
- }
287
-
288
- .lobby-sub {
289
- font-size: 0.95rem;
290
- color: var(--text-faint);
291
- max-width: 54ch;
292
- margin: 0 auto 1.5rem;
293
- }
294
-
295
- /* Code is never centred, even when its surroundings are. */
296
- .lobby .cmd { text-align: left; }
297
-
298
- /* The prompt is meant to be copied, not read: keep it short enough that the
299
- button under it stays in view, and say so with a fade at the cut. */
300
- /* Wider right gutter than the shared block: the copy control is bigger here. */
301
- .lobby .cmd-hero pre { max-height: 15rem; font-size: 0.8rem; padding-right: 5rem; }
302
-
303
- .lobby .cmd-hero::after {
304
- content: "";
305
- position: absolute;
306
- left: 0;
307
- right: 0;
308
- bottom: 0;
309
- height: 2.6rem;
310
- pointer-events: none;
311
- background: linear-gradient(to bottom, rgba(11, 12, 16, 0), #0b0c10);
312
- }
313
-
314
- /* Copying is the call to action here, so the control is a button, not a hint. */
315
- .lobby .cmd-hero .copy {
316
- font-size: 0.78rem;
317
- font-weight: 600;
318
- padding: 0.38rem 0.85rem;
319
- color: #17120b;
320
- background: var(--accent);
321
- border-color: var(--accent);
322
- }
323
- .lobby .cmd-hero .copy:hover { color: #17120b; background: #ff9630; border-color: #ff9630; }
324
- .lobby .cmd-hero .copy[data-copied="1"] {
325
- color: #0a1a10;
326
- background: var(--pass);
327
- border-color: var(--pass);
328
- }
329
-
330
- /* ---------- quick start (lobby) ----------
331
- Two steps: set up once, then pick the work. Left-aligned inside the centred
332
- lobby, because everything in here is read line by line. */
333
-
334
- .qs { text-align: left; margin-top: 1.8rem; }
335
-
336
- .qs-step + .qs-step { margin-top: 2.6rem; }
337
-
338
- .qs-title {
339
- display: flex;
340
- align-items: center;
341
- font-size: 1.16rem;
342
- font-weight: 640;
343
- margin: 0 0 0.35rem;
344
- }
345
-
346
- /* The margin rather than a flex gap: the badge stays separated from the title
347
- even when the flex layout does not apply. */
348
- .qs-num {
349
- flex: none;
350
- width: 1.7rem;
351
- height: 1.7rem;
352
- margin-right: 0.75rem;
353
- display: inline-grid;
354
- place-items: center;
355
- border-radius: 50%;
356
- background: var(--accent-soft);
357
- border: 1px solid var(--accent-line);
358
- color: var(--accent);
359
- font-family: var(--mono);
360
- font-size: 0.8rem;
361
- line-height: 1;
362
- }
363
-
364
- .qs-why { color: var(--text-dim); font-size: 0.95rem; margin-bottom: 0.9rem; }
365
-
366
- /* ---------- tabs ---------- */
367
-
368
- .tablist {
369
- display: flex;
370
- flex-wrap: wrap;
371
- gap: 0.4rem;
372
- margin-bottom: 0.9rem;
373
- }
374
-
375
- .tab {
376
- font: 560 0.9rem var(--sans);
377
- color: var(--text-dim);
378
- background: var(--surface);
379
- border: 1px solid var(--line);
380
- border-radius: 99px;
381
- padding: 0.4rem 1rem;
382
- cursor: pointer;
383
- transition: all 0.16s var(--ease);
384
- }
385
- .tab:hover { color: var(--text); border-color: var(--accent-line); }
386
- .tab[aria-selected="true"] {
387
- color: var(--accent);
388
- background: var(--accent-soft);
389
- border-color: var(--accent-line);
390
- }
391
-
392
- .qs-panel[hidden] { display: none; }
393
- .qs-panel:focus-visible { outline-offset: 4px; }
394
-
395
- .qs-panel-why { color: var(--text-dim); font-size: 0.92rem; margin-bottom: 0.5rem; }
396
-
397
- /* These prompts are the call to action too, so their copy control never hides. */
398
- .qs-panel .cmd .copy { opacity: 1; }
399
- .qs-panel .cmd pre { white-space: pre-wrap; word-break: break-word; font-size: 0.82rem; }
400
-
401
- .lobby-cta { display: flex; justify-content: center; gap: 0.7rem; flex-wrap: wrap; margin-top: 1.6rem; }
402
-
403
- .lobby-fine {
404
- margin: 2.4rem auto 0;
405
- max-width: 56ch;
406
- font-size: 0.86rem;
407
- color: var(--text-faint);
408
- }
409
-
410
- /* ---------- cards ---------- */
411
-
412
- .card {
413
- background: var(--surface);
414
- border: 1px solid var(--line-soft);
415
- border-radius: var(--radius);
416
- padding: 1.5rem 1.6rem;
417
- transition: border-color 0.2s var(--ease), transform 0.2s var(--ease);
418
- }
419
-
420
- .card h3 { margin-top: 0; }
421
- .card p:last-child { margin-bottom: 0; }
422
-
423
- .grid { display: grid; gap: 1rem; }
424
- .grid-2 { grid-template-columns: repeat(2, minmax(0, 1fr)); }
425
- .grid-3 { grid-template-columns: repeat(3, minmax(0, 1fr)); }
426
-
427
- @media (max-width: 780px) {
428
- .grid-2, .grid-3 { grid-template-columns: 1fr; }
429
- }
430
-
431
- /* Entry-path cards (Step 0) */
432
- .path-card {
433
- background: linear-gradient(180deg, var(--surface) 0%, var(--bg-raised) 100%);
434
- border: 1px solid var(--line);
435
- border-radius: var(--radius);
436
- padding: 1.5rem;
437
- display: flex;
438
- flex-direction: column;
439
- }
440
- .path-card:hover { border-color: var(--accent-line); }
441
- .path-card > :last-child { margin-top: auto; }
442
-
443
- .path-tag {
444
- font-family: var(--mono);
445
- font-size: 0.72rem;
446
- letter-spacing: 0.08em;
447
- text-transform: uppercase;
448
- color: var(--text-faint);
449
- margin-bottom: 0.5rem;
450
- }
451
-
452
- /* ---------- code blocks ---------- */
453
-
454
- .cmd {
455
- position: relative;
456
- background: #0b0c10;
457
- border: 1px solid var(--line);
458
- border-radius: var(--radius-sm);
459
- margin: 0.9rem 0;
460
- overflow: hidden;
461
- }
462
-
463
- .cmd pre {
464
- margin: 0;
465
- padding: 0.85rem 3.2rem 0.85rem 1rem;
466
- overflow-x: auto;
467
- font-family: var(--mono);
468
- font-size: 0.855rem;
469
- line-height: 1.6;
470
- color: #e6e8ef;
471
- }
472
-
473
- .cmd pre code {
474
- background: none;
475
- border: none;
476
- padding: 0;
477
- font-size: inherit;
478
- color: inherit;
479
- }
480
-
481
- /* The shell prompt marker is decorative — excluded from copy by JS. */
482
- .cmd .p { color: var(--accent); user-select: none; }
483
-
484
- .copy {
485
- position: absolute;
486
- top: 0.5rem;
487
- right: 0.5rem;
488
- font: 500 0.72rem var(--sans);
489
- color: var(--text-dim);
490
- background: var(--surface-2);
491
- border: 1px solid var(--line);
492
- border-radius: 6px;
493
- padding: 0.24rem 0.55rem;
494
- cursor: pointer;
495
- opacity: 0;
496
- transition: all 0.16s var(--ease);
497
- }
498
- .cmd:hover .copy, .copy:focus-visible { opacity: 1; }
499
- .copy:hover { color: var(--text); border-color: var(--accent-line); background: var(--accent-soft); }
500
- .copy[data-copied="1"] { color: var(--pass); border-color: var(--pass); opacity: 1; }
501
-
502
- @media (hover: none) { .copy { opacity: 1; } }
503
-
504
- /* The one-prompt block is a call to action: its copy control never hides, and
505
- the prompt scrolls rather than pushing the page down. */
506
- .cmd-hero .copy { opacity: 1; }
507
- .cmd-hero pre {
508
- white-space: pre-wrap;
509
- word-break: break-word;
510
- max-height: 22rem;
511
- overflow-y: auto;
512
- }
513
-
514
- /* Expected-output block */
515
- .out {
516
- background: var(--bg-raised);
517
- border: 1px solid var(--line-soft);
518
- border-left: 2px solid var(--line);
519
- border-radius: var(--radius-sm);
520
- padding: 0.8rem 1rem;
521
- margin: 0.9rem 0;
522
- overflow-x: auto;
523
- font-family: var(--mono);
524
- font-size: 0.8rem;
525
- line-height: 1.62;
526
- color: var(--text-dim);
527
- white-space: pre;
528
- }
529
-
530
- .out .ok { color: var(--pass); }
531
- .out .bad { color: var(--fail); }
532
- .out .hint { color: var(--accent); }
533
- .out .dim { color: var(--text-faint); }
534
-
535
- .out-label {
536
- font-family: var(--mono);
537
- font-size: 0.72rem;
538
- letter-spacing: 0.07em;
539
- text-transform: uppercase;
540
- color: var(--text-faint);
541
- margin: 1.2rem 0 0.1rem;
542
- }
543
-
544
- /* ---------- checklist steps ---------- */
545
-
546
- .steps { list-style: none; margin: 2rem 0 0; padding: 0; counter-reset: step; }
547
-
548
- .step {
549
- position: relative;
550
- border: 1px solid var(--line-soft);
551
- border-radius: var(--radius);
552
- background: var(--surface);
553
- padding: 1.4rem 1.6rem 1.5rem 3.6rem;
554
- margin-bottom: 1rem;
555
- transition: border-color 0.22s var(--ease), background 0.22s var(--ease);
556
- }
557
-
558
- .step::before {
559
- counter-increment: step;
560
- content: counter(step);
561
- position: absolute;
562
- left: 1.15rem;
563
- top: 1.45rem;
564
- width: 1.55rem;
565
- height: 1.55rem;
566
- display: grid;
567
- place-items: center;
568
- border-radius: 50%;
569
- background: var(--surface-2);
570
- border: 1px solid var(--line);
571
- color: var(--text-faint);
572
- font-family: var(--mono);
573
- font-size: 0.76rem;
574
- transition: all 0.22s var(--ease);
575
- }
576
-
577
- .step[data-done="1"] { border-color: rgba(88, 214, 138, 0.34); background: rgba(88, 214, 138, 0.035); }
578
- .step[data-done="1"]::before {
579
- content: "✓";
580
- background: rgba(88, 214, 138, 0.14);
581
- border-color: rgba(88, 214, 138, 0.4);
582
- color: var(--pass);
583
- font-size: 0.85rem;
584
- }
585
-
586
- .step-head {
587
- display: flex;
588
- align-items: flex-start;
589
- gap: 0.8rem;
590
- margin-bottom: 0.3rem;
591
- }
592
-
593
- .step-title { font-size: 1.06rem; font-weight: 620; margin: 0; flex: 1; letter-spacing: -0.012em; }
594
-
595
- .step-check {
596
- flex: none;
597
- width: 1.15rem;
598
- height: 1.15rem;
599
- margin-top: 0.22rem;
600
- accent-color: var(--accent);
601
- cursor: pointer;
602
- }
603
-
604
- .step-why { color: var(--text-dim); font-size: 0.95rem; }
605
-
606
- /* "if it fails" disclosure */
607
- details.fail {
608
- margin-top: 0.9rem;
609
- border: 1px solid var(--line-soft);
610
- border-radius: var(--radius-sm);
611
- background: var(--bg-raised);
612
- overflow: hidden;
613
- }
614
-
615
- details.fail > summary {
616
- cursor: pointer;
617
- padding: 0.6rem 0.95rem;
618
- font-size: 0.86rem;
619
- font-weight: 560;
620
- color: var(--warn);
621
- list-style: none;
622
- transition: background 0.16s var(--ease);
623
- }
624
- details.fail > summary::-webkit-details-marker { display: none; }
625
- details.fail > summary::before { content: "▸ "; color: var(--text-faint); }
626
- details.fail[open] > summary::before { content: "▾ "; }
627
- details.fail > summary:hover { background: var(--surface); }
628
-
629
- .fail-body { padding: 0.2rem 0.95rem 0.9rem; font-size: 0.92rem; }
630
- .fail-body > :last-child { margin-bottom: 0; }
631
-
632
- /* ---------- callouts ---------- */
633
-
634
- .note {
635
- border: 1px solid var(--line);
636
- border-left: 3px solid var(--accent);
637
- background: var(--accent-soft);
638
- border-radius: var(--radius-sm);
639
- padding: 0.95rem 1.15rem;
640
- margin: 1.4rem 0;
641
- font-size: 0.95rem;
642
- }
643
- .note > :last-child { margin-bottom: 0; }
644
- .note-title { font-weight: 640; color: var(--text); display: block; margin-bottom: 0.25rem; }
645
-
646
- .note.blue { border-left-color: var(--info); background: rgba(106, 169, 240, 0.09); }
647
- .note.plain { border-left-color: var(--line); background: var(--surface); }
648
-
649
- /* The doctrine banner — the one idea that must land. */
650
- .doctrine {
651
- border: 1px solid var(--accent-line);
652
- border-radius: var(--radius);
653
- background: linear-gradient(135deg, rgba(246, 133, 27, 0.13), rgba(246, 133, 27, 0.03));
654
- padding: 1.3rem 1.5rem;
655
- margin: 1.5rem 0;
656
- }
657
- .doctrine p { margin: 0; font-size: 1.02rem; }
658
- .doctrine .k { color: var(--accent); font-weight: 640; }
659
-
660
- /* ---------- agent prompt card ---------- */
661
-
662
- .agent-card {
663
- border: 1px solid var(--accent-line);
664
- border-radius: var(--radius);
665
- background: linear-gradient(160deg, rgba(246, 133, 27, 0.10), var(--surface) 55%);
666
- padding: 1.6rem 1.7rem;
667
- margin: 2.2rem 0;
668
- box-shadow: var(--shadow);
669
- }
670
- .agent-card h2 { margin-top: 0; }
671
-
672
- details.prompt > summary {
673
- cursor: pointer;
674
- display: inline-block;
675
- font: 560 0.9rem var(--sans);
676
- color: var(--bg);
677
- background: var(--accent);
678
- border-radius: var(--radius-sm);
679
- padding: 0.55rem 1.05rem;
680
- list-style: none;
681
- transition: background 0.16s var(--ease), transform 0.16s var(--ease);
682
- }
683
- details.prompt > summary::-webkit-details-marker { display: none; }
684
- details.prompt > summary:hover { background: #ff9630; }
685
- details.prompt[open] > summary { background: var(--surface-2); color: var(--text); }
686
-
687
- .prompt-body { margin-top: 1rem; }
688
- .prompt-body .cmd pre { white-space: pre-wrap; word-break: break-word; max-height: 30rem; overflow-y: auto; }
689
-
690
- /* ---------- tables ---------- */
691
-
692
- .table-scroll { overflow-x: auto; margin: 1.2rem 0; }
693
-
694
- table {
695
- width: 100%;
696
- border-collapse: collapse;
697
- font-size: 0.92rem;
698
- border: 1px solid var(--line-soft);
699
- border-radius: var(--radius-sm);
700
- overflow: hidden;
701
- }
702
-
703
- th {
704
- text-align: left;
705
- font-weight: 600;
706
- font-size: 0.78rem;
707
- letter-spacing: 0.06em;
708
- text-transform: uppercase;
709
- color: var(--text-faint);
710
- background: var(--bg-raised);
711
- padding: 0.65rem 0.9rem;
712
- border-bottom: 1px solid var(--line);
713
- white-space: nowrap;
714
- }
715
-
716
- td {
717
- padding: 0.7rem 0.9rem;
718
- border-bottom: 1px solid var(--line-soft);
719
- vertical-align: top;
720
- color: #d5d8e2;
721
- }
722
-
723
- tbody tr:last-child td { border-bottom: none; }
724
- tbody tr:hover td { background: rgba(255, 255, 255, 0.018); }
725
-
726
- td code { white-space: nowrap; }
727
-
728
- /* Reference-table cells are their own copy button. */
729
- code.copyable {
730
- cursor: pointer;
731
- transition: all 0.16s var(--ease);
732
- }
733
- code.copyable:hover {
734
- border-color: var(--accent-line);
735
- background: var(--accent-soft);
736
- color: var(--accent);
737
- }
738
- code.copyable::after {
739
- content: "⧉";
740
- margin-left: 0.45em;
741
- opacity: 0;
742
- color: var(--text-faint);
743
- transition: opacity 0.16s var(--ease);
744
- }
745
- code.copyable:hover::after, code.copyable:focus-visible::after { opacity: 1; }
746
- code.copyable.copied {
747
- color: var(--pass);
748
- border-color: rgba(88, 214, 138, 0.4);
749
- background: rgba(88, 214, 138, 0.1);
750
- }
751
- code.copyable.copied::after { content: ""; margin-left: 0; }
752
-
753
- /* ---------- platform filter ---------- */
754
-
755
- .filters {
756
- display: flex;
757
- flex-wrap: wrap;
758
- gap: 0.45rem;
759
- margin: 1.5rem 0 0.5rem;
760
- align-items: center;
761
- }
762
-
763
- .filter-label {
764
- font-family: var(--mono);
765
- font-size: 0.75rem;
766
- letter-spacing: 0.06em;
767
- text-transform: uppercase;
768
- color: var(--text-faint);
769
- margin-right: 0.4rem;
770
- }
771
-
772
- .chip {
773
- font: 500 0.85rem var(--sans);
774
- color: var(--text-dim);
775
- background: var(--surface);
776
- border: 1px solid var(--line);
777
- border-radius: 99px;
778
- padding: 0.34rem 0.9rem;
779
- cursor: pointer;
780
- transition: all 0.16s var(--ease);
781
- }
782
- .chip:hover { color: var(--text); border-color: var(--accent-line); }
783
- .chip[aria-pressed="true"] {
784
- color: var(--accent);
785
- background: var(--accent-soft);
786
- border-color: var(--accent-line);
787
- }
788
-
789
- .filter-empty {
790
- color: var(--text-faint);
791
- font-style: italic;
792
- padding: 1.5rem 0;
793
- }
794
-
795
- tr[hidden], .filter-hidden { display: none !important; }
796
-
797
- /* ---------- layer diagram ---------- */
798
-
799
- .stack { display: flex; flex-direction: column; gap: 0.55rem; margin: 1.8rem 0; }
800
-
801
- /* Names which end of the diagram is the one you touch. */
802
- .stack-caption {
803
- font-family: var(--mono);
804
- font-size: 0.78rem;
805
- letter-spacing: 0.04em;
806
- color: var(--text-faint);
807
- margin: 1.6rem 0 0.55rem;
808
- }
809
- .stack-caption + .stack { margin-top: 0; }
810
-
811
- .layer {
812
- width: 100%;
813
- text-align: left;
814
- font: inherit;
815
- /* Buttons do not inherit color; without this the UA default wins and the
816
- row titles render near-black on the dark surface. */
817
- color: var(--text);
818
- cursor: pointer;
819
- background: var(--surface);
820
- border: 1px solid var(--line);
821
- border-radius: var(--radius-sm);
822
- padding: 0.95rem 1.2rem;
823
- display: flex;
824
- align-items: center;
825
- gap: 1rem;
826
- transition: all 0.2s var(--ease);
827
- }
828
- .layer:hover { border-color: var(--accent-line); transform: translateX(3px); }
829
-
830
- /* Diagram rows that are illustration, not controls. */
831
- .layer-static { cursor: default; }
832
- .layer-static:hover { border-color: var(--line); transform: none; }
833
- .layer[aria-expanded="true"] {
834
- border-color: var(--accent-line);
835
- background: linear-gradient(90deg, var(--accent-soft), var(--surface) 62%);
836
- }
837
-
838
- .layer-n {
839
- font-family: var(--mono);
840
- font-size: 0.72rem;
841
- color: var(--text-faint);
842
- border: 1px solid var(--line);
843
- border-radius: 5px;
844
- padding: 0.1rem 0.4rem;
845
- flex: none;
846
- }
847
- .layer[aria-expanded="true"] .layer-n { color: var(--accent); border-color: var(--accent-line); }
848
-
849
- .layer-name { font-weight: 620; letter-spacing: -0.01em; }
850
- .layer-sub { color: var(--text-dim); font-size: 0.88rem; margin-left: auto; text-align: right; }
851
-
852
- @media (max-width: 640px) {
853
- .layer { flex-wrap: wrap; }
854
- .layer-sub { margin-left: 0; width: 100%; text-align: left; }
855
- }
856
-
857
- .layer-detail {
858
- border: 1px solid var(--accent-line);
859
- border-top: none;
860
- border-radius: 0 0 var(--radius-sm) var(--radius-sm);
861
- background: var(--bg-raised);
862
- padding: 1.1rem 1.3rem;
863
- margin: -0.55rem 0 0;
864
- font-size: 0.94rem;
865
- }
866
- .layer-detail > :last-child { margin-bottom: 0; }
867
- .layer-detail[hidden] { display: none; }
868
-
869
- .arrow {
870
- text-align: center;
871
- color: var(--text-faint);
872
- font-size: 0.9rem;
873
- line-height: 1;
874
- margin: -0.15rem 0;
875
- }
876
-
877
- /* ---------- video cards ---------- */
878
-
879
- .vid {
880
- display: flex;
881
- flex-direction: column;
882
- background: var(--surface);
883
- border: 1px solid var(--line-soft);
884
- border-radius: var(--radius);
885
- overflow: hidden;
886
- transition: border-color 0.2s var(--ease), transform 0.2s var(--ease);
887
- }
888
- .vid:hover { border-color: var(--accent-line); transform: translateY(-2px); }
889
-
890
- .vid-thumb {
891
- aspect-ratio: 16 / 9;
892
- background:
893
- radial-gradient(420px 200px at 30% 20%, rgba(246, 133, 27, 0.16), transparent 70%),
894
- linear-gradient(150deg, var(--surface-2), var(--bg-raised));
895
- border-bottom: 1px solid var(--line-soft);
896
- display: grid;
897
- place-items: center;
898
- position: relative;
899
- }
900
-
901
- .vid-id {
902
- font-family: var(--mono);
903
- font-size: 2rem;
904
- font-weight: 600;
905
- color: #d98b3a;
906
- letter-spacing: 0.04em;
907
- }
908
-
909
- .vid-body { padding: 1.1rem 1.25rem 1.3rem; display: flex; flex-direction: column; flex: 1; }
910
- .vid-body h3 { margin: 0 0 0.4rem; font-size: 1rem; }
911
- .vid-body p { font-size: 0.9rem; color: var(--text-dim); margin-bottom: 0.9rem; }
912
- .vid-foot { margin-top: auto; display: flex; align-items: center; gap: 0.7rem; flex-wrap: wrap; }
913
-
914
- .badge {
915
- font-family: var(--mono);
916
- font-size: 0.7rem;
917
- letter-spacing: 0.06em;
918
- text-transform: uppercase;
919
- border-radius: 99px;
920
- padding: 0.2rem 0.6rem;
921
- border: 1px solid var(--line);
922
- color: var(--text-faint);
923
- white-space: nowrap;
924
- }
925
- .badge.soon { color: var(--warn); border-color: rgba(240, 192, 90, 0.35); background: rgba(240, 192, 90, 0.08); }
926
- .badge.live { color: var(--pass); border-color: rgba(88, 214, 138, 0.35); background: rgba(88, 214, 138, 0.08); }
927
- .badge.dur { font-family: var(--mono); }
928
-
929
- /* ---------- annotated evidence ---------- */
930
-
931
- .annot { display: grid; grid-template-columns: minmax(0, 1.15fr) minmax(0, 1fr); gap: 1.1rem; margin: 1.4rem 0; align-items: start; }
932
-
933
- @media (max-width: 900px) { .annot { grid-template-columns: 1fr; } }
934
-
935
- .annot-notes { display: flex; flex-direction: column; gap: 0.7rem; }
936
-
937
- .annot-note {
938
- background: var(--surface);
939
- border: 1px solid var(--line-soft);
940
- border-left: 3px solid var(--accent);
941
- border-radius: var(--radius-sm);
942
- padding: 0.75rem 1rem;
943
- font-size: 0.9rem;
944
- }
945
- .annot-note > :last-child { margin-bottom: 0; }
946
- .annot-note b { color: var(--accent); font-family: var(--mono); font-size: 0.85rem; font-weight: 600; }
947
-
948
- .verdict { font-family: var(--mono); font-weight: 600; }
949
- .verdict.pass { color: var(--pass); }
950
- .verdict.fail { color: var(--fail); }
951
-
952
- /* ---------- dependency map ----------
953
- A column of nodes with the edge label between them, so the direction reads
954
- top to bottom without a diagram library. */
955
-
956
- .map { margin: 1.5rem 0 2.5rem; }
957
-
958
- .node {
959
- background: linear-gradient(180deg, var(--surface) 0%, var(--bg-raised) 100%);
960
- border: 1px solid var(--line);
961
- border-radius: var(--radius);
962
- padding: 1.25rem 1.4rem;
963
- }
964
- .node:hover { border-color: var(--accent-line); }
965
-
966
- /* The one you install. */
967
- .node-key { border-color: var(--accent-line); }
968
-
969
- .node-tag {
970
- display: block;
971
- font-family: var(--mono);
972
- font-size: 0.72rem;
973
- letter-spacing: 0.08em;
974
- text-transform: uppercase;
975
- color: var(--text-faint);
976
- margin-bottom: 0.35rem;
977
- }
978
-
979
- .node-name { font-size: 1.12rem; font-weight: 640; margin: 0 0 0.4rem; }
980
- .node-what { font-size: 0.94rem; color: var(--text-dim); margin-bottom: 0.7rem; }
981
-
982
- .node-list {
983
- list-style: none;
984
- margin: 0 0 0.8rem;
985
- padding: 0;
986
- display: flex;
987
- flex-wrap: wrap;
988
- gap: 0.35rem 0.5rem;
989
- font-size: 0.86rem;
990
- }
991
- .node-list li { color: var(--text-dim); }
992
-
993
- .node-url {
994
- display: block;
995
- font-family: var(--mono);
996
- font-size: 0.8rem;
997
- word-break: break-all;
998
- margin-bottom: 0.15rem;
999
- }
1000
-
1001
- .node .badge { margin: 0.55rem 0.4rem 0 0; display: inline-block; }
1002
- .node-more { display: block; font-size: 0.88rem; margin-top: 0.6rem; }
1003
-
1004
- /* Edge labels carry the verb; the arrow alone would not say what flows. */
1005
- .map-edge {
1006
- margin: 0.7rem 0;
1007
- text-align: center;
1008
- font-family: var(--mono);
1009
- font-size: 0.8rem;
1010
- color: var(--text-faint);
1011
- }
1012
-
1013
- .map-split { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 1rem; }
1014
- .map-row { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 1rem; align-items: start; }
1015
-
1016
- @media (max-width: 780px) {
1017
- .map-split { grid-template-columns: 1fr; }
1018
- .map-split .map-edge:last-child { margin-top: 0; }
1019
- .map-row { grid-template-columns: 1fr; }
1020
- }
1021
-
1022
- /* ---------- misc ---------- */
1023
-
1024
- .btn-row { display: flex; flex-wrap: wrap; gap: 0.7rem; margin-top: 1.8rem; }
1025
-
1026
- .btn {
1027
- display: inline-block;
1028
- font: 560 0.92rem var(--sans);
1029
- border-radius: var(--radius-sm);
1030
- padding: 0.62rem 1.25rem;
1031
- border: 1px solid transparent;
1032
- transition: all 0.18s var(--ease);
1033
- }
1034
- .btn-primary { background: var(--accent); color: #17120b; }
1035
- .btn-primary:hover { background: #ff9630; text-decoration: none; transform: translateY(-1px); }
1036
- .btn-ghost { border-color: var(--line); color: var(--text-dim); }
1037
- .btn-ghost:hover { border-color: var(--accent-line); color: var(--text); text-decoration: none; }
1038
-
1039
- .sep { border: none; border-top: 1px solid var(--line-soft); margin: 3rem 0; }
1040
-
1041
- .footer {
1042
- border-top: 1px solid var(--line-soft);
1043
- padding: 2.2rem 0 3rem;
1044
- color: var(--text-faint);
1045
- font-size: 0.86rem;
1046
- }
1047
- .footer p { color: var(--text-faint); margin-bottom: 0.5rem; }
1048
-
1049
- .skip {
1050
- position: absolute;
1051
- left: -9999px;
1052
- top: 0;
1053
- background: var(--accent);
1054
- color: #17120b;
1055
- padding: 0.6rem 1rem;
1056
- border-radius: 0 0 var(--radius-sm) 0;
1057
- z-index: 100;
1058
- }
1059
- .skip:focus { left: 0; }
1060
-
1061
- :focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; border-radius: 4px; }
1062
-
1063
- @media (prefers-reduced-motion: reduce) {
1064
- * { animation-duration: 0.01ms !important; transition-duration: 0.01ms !important; }
1065
- html { scroll-behavior: auto; }
1066
- }