File size: 3,979 Bytes
7b284c7
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
/* ═══════════════════════════════════════════════════════════════════════
   science.css β€” disclosure surfaces added for the 2026-08 scientific
   review. Kept out of app.css deliberately: this is a small, self-contained
   layer, and app.css is ~8,000 lines with a hostile cascade (see
   docs/ENGINEERING.md Β§13).

   TOKENS: only variables that already exist are used β€” here --line, --ink
   and --ink-soft. Inventing a token name silently computes the whole
   shorthand to nothing (Β§13.1), so grep app.css before adding one.
   ═══════════════════════════════════════════════════════════════════════ */

/* ─── CRISPR scope strip ───────────────────────────────────────────────
   The three things the results panel used to leave the reader to infer:
   the composite's weight, what repair context the indel columns assume,
   and how much of the genome was actually searched. Sits directly above
   the table, always visible β€” not a collapsed <details>, because the whole
   failure being fixed is that these facts were one click away and nobody
   clicked. Quiet by default so it informs without shouting over the data. */
.crispr-scope-strip {
    margin: 10px 0 12px;
    padding: 10px 12px;
    border: 1px solid var(--line);
    border-left-width: 3px;
    border-radius: 6px;
    font-size: 0.82rem;
    line-height: 1.5;
    color: var(--ink-soft);
    display: grid;
    gap: 6px;
}

.crispr-scope-strip:empty { display: none; }

.crispr-scope-row {
    display: grid;
    grid-template-columns: 8.6rem 1fr;
    gap: 10px;
    align-items: baseline;
}

.crispr-scope-k {
    font-weight: 600;
    color: var(--ink);
    letter-spacing: 0.01em;
    text-transform: uppercase;
    font-size: 0.68rem;
    padding-top: 0.12rem;
}

.crispr-scope-v strong { color: var(--ink); font-weight: 600; }
.crispr-scope-v em { font-style: italic; }

/* Stack on narrow screens β€” a 8.6rem label column plus prose does not fit
   a phone, and the label is short enough to read as a heading. */
@media (max-width: 640px) {
    .crispr-scope-row { grid-template-columns: 1fr; gap: 2px; }
}

/* ─── Provenance block: the "Assumes" line ─────────────────────────────
   Rendered by TDMethods from METHODS[*].assumes. Distinct from .basis
   (how the number was made) because it states the biological context the
   number is only valid inside β€” the difference between "here's the
   method" and "here's when it doesn't apply". */
.method-assumes {
    margin: 4px 0 0;
    color: var(--ink-soft);
}

.method-assumes strong { color: var(--ink); }

/* ─── Directed evolution: search objective + library spread ───────────
   The reviewer asked what score the simulated annealing maximises and
   could not find out β€” it was stated only inside the copy-paste
   manuscript paragraph. These two notes sit between the parameter pills
   and that paragraph: the objective in prose, and the MEASURED occupancy
   of the most-shared substitution in the library on screen. */
.run-notes {
    display: grid;
    gap: 8px;
    margin: 10px 0 4px;
}

.run-notes:empty { display: none; }

.run-objective,
.run-diversity {
    margin: 0;
    padding: 9px 11px;
    border: 1px solid var(--line);
    border-radius: 6px;
    font-size: 0.82rem;
    line-height: 1.55;
    color: var(--ink-soft);
}

.run-objective strong,
.run-diversity strong { color: var(--ink); font-weight: 600; }

.run-diversity code {
    font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
    font-size: 0.94em;
}