/* ═══════════════════════════════════════════════════════════════════════ 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
, 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; }