trace-field-notes / frontend /static /field_report.css
JacobLinCool's picture
feat: serve designer React frontend via gradio.Server on ZeroGPU
bd351d2 verified
Raw
History Blame
28.5 kB
/* Trace Field Notes — designer's field-notebook / trail-map system.
Fonts swapped to Google Fonts (originals were bundled woff2). */
@import url('https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:ital,wght@0,400;0,500;0,600;1,400&family=Spectral:ital,wght@0,300;0,400;0,500;0,600;0,700;0,800;1,400;1,500&family=Spectral+SC:wght@400;500;600;700&display=swap');
:root {
--paper-0: #e0d5bc; /* page edge / outside the map */
--paper-1: #efe7d3; /* main field */
--paper-2: #f6f0e0; /* card */
--paper-3: #fcf8ee; /* raised */
--paper-inset: #e9e0c9;
--ink: #2a261d;
--ink-2: #574f3f;
--ink-3: #897f68;
--ink-faint: #a89b7e;
--rule: #d8ccad;
--rule-strong: #c5b690;
--edge: #cdbe98;
--edge-strong: #b6a577;
--accent: #2f6b4f;
--accent-2: #3c875f;
--accent-deep: #234f3b;
--accent-tint: rgba(47, 107, 79, 0.10);
--on-accent: #f6f0e0;
--warn: #b06a1f;
--warn-tint: rgba(176, 106, 31, 0.10);
/* trail-difficulty tone palette */
--tone-stable: #3f7d52;
--tone-detour: #356f9c;
--tone-iterative: #2f8a86;
--tone-partial: #b9852b;
--tone-risk: #b24a30;
--tone-unknown: #8a8270;
--shadow-card: 0 1px 0 rgba(255,255,255,0.5) inset, 0 8px 24px -16px rgba(42,38,29,0.5);
--shadow-pop: 0 18px 50px -22px rgba(42,38,29,0.55);
--paper-grain: rgba(120, 104, 70, 0.05);
--topo-stroke: rgba(120, 104, 70, 0.16);
--topo-stroke-strong: rgba(120, 104, 70, 0.26);
--font-serif: 'Spectral', Georgia, 'Times New Roman', serif;
--font-sc: 'Spectral SC', 'Spectral', serif;
--font-mono: 'IBM Plex Mono', ui-monospace, SFMono-Regular, Menlo, monospace;
/* density (overwritten by [data-density]) */
--space: 1;
--radius: 3px;
--radius-lg: 5px;
}
/* ---------- Tokens: DARK (dusk survey) ---------- */
[data-theme="dark"] {
--paper-0: #14130f;
--paper-1: #1c1a15;
--paper-2: #232019;
--paper-3: #2b271f;
--paper-inset: #18160f;
--ink: #f0e9d6;
--ink-2: #cabfa3;
--ink-3: #9a8f74;
--ink-faint: #6f6650;
--rule: rgba(180, 160, 110, 0.18);
--rule-strong: rgba(180, 160, 110, 0.30);
--edge: rgba(180, 160, 110, 0.22);
--edge-strong: rgba(180, 160, 110, 0.38);
--accent: #5cae84;
--accent-2: #6fc197;
--accent-deep: #8ad3ac;
--accent-tint: rgba(92, 174, 132, 0.14);
--on-accent: #14130f;
--warn: #d99a4e;
--warn-tint: rgba(217, 154, 78, 0.14);
--tone-stable: #5fb079;
--tone-detour: #5b9fce;
--tone-iterative: #4fc1bb;
--tone-partial: #d9a64a;
--tone-risk: #e0775a;
--tone-unknown: #a99e83;
--shadow-card: 0 1px 0 rgba(255,255,255,0.04) inset, 0 10px 30px -18px rgba(0,0,0,0.8);
--shadow-pop: 0 22px 60px -24px rgba(0,0,0,0.9);
--paper-grain: rgba(255, 240, 200, 0.025);
--topo-stroke: rgba(190, 170, 120, 0.12);
--topo-stroke-strong: rgba(190, 170, 120, 0.22);
}
/* ---------- Density ---------- */
[data-density="compact"] { --space: 0.78; }
[data-density="regular"] { --space: 1; }
[data-density="comfy"] { --space: 1.28; }
/* ---------- Voice (narrative typeface) ---------- */
[data-voice="terminal"] { --font-body: var(--font-mono); --body-size: 14.5px; --body-lh: 1.65; }
:root, [data-voice="journal"] { --font-body: var(--font-serif); --body-size: 17px; --body-lh: 1.62; }
/* ============================================================
Base
============================================================ */
* { box-sizing: border-box; }
html, body { margin: 0; padding: 0; }
body {
background: var(--paper-0);
color: var(--ink);
font-family: var(--font-serif);
-webkit-font-smoothing: antialiased;
text-rendering: optimizeLegibility;
}
::selection { background: var(--accent-tint); }
button { font-family: inherit; cursor: pointer; }
a { color: var(--accent); }
.app-root { position: relative; min-height: 100vh; }
/* topo + grain backdrop sits behind everything */
.backdrop {
position: fixed; inset: 0; z-index: 0; pointer-events: none;
background:
radial-gradient(120% 90% at 50% -10%, color-mix(in srgb, var(--paper-1) 70%, transparent), transparent 60%),
var(--paper-1);
}
.backdrop .grain {
position: absolute; inset: 0;
background-image: radial-gradient(var(--paper-grain) 0.6px, transparent 0.7px);
background-size: 4px 4px;
opacity: 0.9;
}
.backdrop svg { position: absolute; inset: 0; width: 100%; height: 100%; }
.no-topo .backdrop svg { display: none; }
.page { position: relative; z-index: 1; }
/* ============================================================
Shared atoms
============================================================ */
/* small-cap stamped label */
.label {
font-family: var(--font-mono);
font-size: 11px;
font-weight: 600;
letter-spacing: 0.16em;
text-transform: uppercase;
color: var(--ink-3);
}
.label--accent { color: var(--accent); }
/* coordinate / meta mono text */
.mono { font-family: var(--font-mono); }
.muted { color: var(--ink-3); }
.kicker {
display: inline-flex; align-items: center; gap: 8px;
font-family: var(--font-mono); font-size: 11.5px; font-weight: 600;
letter-spacing: 0.18em; text-transform: uppercase; color: var(--accent);
}
.kicker::before {
content: ""; width: 18px; height: 1px; background: var(--accent); opacity: 0.6;
}
/* paper card with torn/taped feel */
.card {
position: relative;
background: var(--paper-2);
border: 1px solid var(--edge);
border-radius: var(--radius-lg);
box-shadow: var(--shadow-card);
}
.card--raised { background: var(--paper-3); }
/* ruled divider */
.rule { height: 1px; background: var(--rule); border: 0; }
.rule--dashed { height: 0; border: 0; border-top: 1px dashed var(--rule-strong); }
/* chips */
.chip {
display: inline-flex; align-items: center; gap: 6px;
font-family: var(--font-mono); font-size: 11px; font-weight: 500;
letter-spacing: 0.04em;
padding: 3px 9px; border-radius: 999px;
border: 1px solid var(--edge);
background: color-mix(in srgb, var(--paper-3) 70%, transparent);
color: var(--ink-2);
white-space: nowrap;
}
.chip .dot { width: 7px; height: 7px; border-radius: 50%; background: var(--tone-unknown); }
/* tone dot + swatch */
.tone-dot { width: 10px; height: 10px; border-radius: 50%; display: inline-block; box-shadow: 0 0 0 3px color-mix(in srgb, currentColor 18%, transparent); }
/* rubber stamp */
.stamp {
display: inline-flex; align-items: center; gap: 8px;
font-family: var(--font-sc); font-weight: 700;
letter-spacing: 0.06em; text-transform: uppercase;
padding: 7px 14px;
border: 2px solid currentColor; border-radius: 4px;
transform: rotate(-2.5deg);
opacity: 0.92;
}
.stamp::before { content: ""; width: 9px; height: 9px; border-radius: 50%; background: currentColor; }
/* buttons */
.btn {
display: inline-flex; align-items: center; justify-content: center; gap: 9px;
font-family: var(--font-mono); font-size: 13px; font-weight: 600;
letter-spacing: 0.04em;
padding: 12px 20px; border-radius: var(--radius);
border: 1px solid var(--edge-strong); white-space: nowrap;
background: var(--paper-3); color: var(--ink);
transition: transform .12s ease, background .15s ease, box-shadow .15s ease, border-color .15s ease;
}
.btn:hover { transform: translateY(-1px); box-shadow: var(--shadow-card); border-color: var(--ink-3); }
.btn:active { transform: translateY(0); }
.btn--primary {
background: var(--accent); border-color: var(--accent-deep); color: var(--on-accent);
}
.btn--primary:hover { background: var(--accent-2); border-color: var(--accent); }
.btn--ghost { background: transparent; }
.btn--sm { padding: 8px 13px; font-size: 12px; }
.btn:disabled { opacity: 0.45; cursor: not-allowed; transform: none; }
/* focus ring */
:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
/* ============================================================
views.css — layout + component styling for all views
============================================================ */
/* generic spacing helpers driven by --space */
.landing, .report, .analyzing, .report-wrap {
max-width: 1140px;
margin: 0 auto;
padding: 0 28px;
}
.report-wrap { padding-top: 18px; padding-bottom: 80px; }
/* ---------------- Top bar ---------------- */
.topbar {
display: flex; align-items: center; justify-content: space-between;
padding: 26px 0 18px;
}
.topbar__brand { display: flex; align-items: center; gap: 13px; }
.topbar__word { display: flex; flex-direction: column; line-height: 1.1; }
.topbar__name { font-family: var(--font-serif); font-weight: 700; font-size: 19px; letter-spacing: -0.01em; }
.topbar__tag { font-size: 11px; color: var(--ink-3); letter-spacing: 0.02em; margin-top: 2px; }
.topbar__right { display: flex; gap: 8px; }
.topbar__pill {
font-size: 10.5px; font-weight: 500; letter-spacing: 0.08em; text-transform: uppercase;
padding: 4px 10px; border-radius: 999px; border: 1px solid var(--edge);
color: var(--ink-3); background: color-mix(in srgb, var(--paper-3) 50%, transparent);
}
/* ---------------- Hero ---------------- */
.hero {
position: relative; overflow: hidden;
padding: calc(40px * var(--space)) 0 calc(26px * var(--space));
border-top: 1px solid var(--rule);
margin-top: 4px;
}
.hero__title {
font-family: var(--font-serif); font-weight: 700;
font-size: clamp(34px, 5.2vw, 58px); line-height: 1.04; letter-spacing: -0.022em;
margin: 16px 0 0; max-width: none; text-wrap: balance;
}
.hero__amp { color: var(--accent); font-style: italic; font-weight: 500; }
.hero__sub {
font-family: var(--font-serif); font-size: clamp(16px, 1.7vw, 19px); line-height: 1.55;
color: var(--ink-2); max-width: 64ch; margin: 18px 0 0;
}
.hero__sub em { color: var(--accent); font-style: italic; }
/* ---------------- Privacy callout ---------------- */
.privacy {
display: flex; gap: 13px; align-items: flex-start;
margin: 22px 0 34px; padding: 14px 16px;
border: 1px solid color-mix(in srgb, var(--warn) 40%, var(--edge));
border-left: 3px solid var(--warn);
background: var(--warn-tint); border-radius: var(--radius-lg);
}
.privacy__mark {
flex: none; width: 22px; height: 22px; border-radius: 50%;
display: grid; place-items: center; font-family: var(--font-mono); font-weight: 700;
color: var(--on-accent); background: var(--warn); font-size: 13px; margin-top: 1px;
}
.privacy p { margin: 0; font-size: 14.5px; line-height: 1.5; color: var(--ink-2); }
.privacy b { color: var(--ink); }
/* ---------------- Landing grid ---------------- */
.landing__grid {
display: grid; grid-template-columns: 1.15fr 0.85fr; gap: 22px;
padding-bottom: 70px;
}
.panel { padding: calc(22px * var(--space)); }
.guide { display: flex; flex-direction: column; gap: 22px; }
/* section head */
.sec-head { margin-bottom: 16px; }
.sec-head__top { display: flex; align-items: center; gap: 12px; }
.sec-head__no { font-size: 12px; color: var(--ink-faint); font-weight: 600; }
.sec-head__title {
font-family: var(--font-serif); font-weight: 600; letter-spacing: -0.015em;
font-size: clamp(20px, 2.4vw, 27px); line-height: 1.12; margin: 8px 0 0;
}
.sec-head__sub { font-size: 14.5px; line-height: 1.5; color: var(--ink-2); margin: 9px 0 0; max-width: 60ch; }
/* dropzone */
.drop {
margin: 4px 0 18px; border: 1.5px dashed var(--edge-strong); border-radius: var(--radius-lg);
background: var(--paper-inset); padding: 30px 18px; text-align: center;
cursor: pointer; transition: border-color .15s, background .15s, transform .12s;
}
.drop:hover { border-color: var(--accent); transform: translateY(-1px); }
.drop--over { border-color: var(--accent); background: var(--accent-tint); }
.drop--staged { border-style: solid; border-color: var(--accent); background: var(--accent-tint); }
.drop__empty { display: flex; flex-direction: column; align-items: center; gap: 6px; }
.drop__icon { font-size: 30px; color: var(--accent); line-height: 1; }
.drop__title { font-family: var(--font-serif); font-size: 17px; font-weight: 600; }
.drop__title code, .muted code { font-family: var(--font-mono); font-size: 0.85em; background: var(--paper-inset); padding: 1px 5px; border-radius: 3px; }
.drop__staged { display: flex; flex-direction: column; gap: 6px; align-items: center; }
.drop__file { font-size: 14px; font-weight: 600; color: var(--accent-deep); word-break: break-all; }
/* toggles */
.opts { display: flex; flex-direction: column; gap: 4px; margin-bottom: 18px; }
.toggle {
display: flex; align-items: center; gap: 12px; width: 100%; text-align: left;
background: none; border: 0; padding: 9px 6px; border-radius: var(--radius);
}
.toggle:hover { background: var(--paper-inset); }
.toggle--locked { cursor: default; opacity: 0.72; }
.toggle--locked:hover { background: none; }
.toggle__sw {
flex: none; width: 38px; height: 22px; border-radius: 999px; padding: 2px;
background: var(--rule-strong); transition: background .18s; display: flex;
}
.toggle--on .toggle__sw { background: var(--accent); }
.toggle__knob {
width: 18px; height: 18px; border-radius: 50%; background: var(--paper-3);
box-shadow: 0 1px 2px rgba(0,0,0,0.3); transition: transform .18s;
}
.toggle--on .toggle__knob { transform: translateX(16px); }
.toggle__txt { display: flex; flex-direction: column; line-height: 1.3; flex: 1; min-width: 0; }
.toggle__label { font-size: 14px; font-weight: 600; color: var(--ink); }
.toggle__sub { font-size: 12px; }
/* engine */
.engine { margin-bottom: 20px; }
.engine__opts { display: flex; flex-direction: column; gap: 8px; margin: 10px 0; }
.engine__opt {
display: flex; justify-content: space-between; align-items: baseline; gap: 10px;
padding: 11px 14px; border: 1px solid var(--edge); border-radius: var(--radius);
background: var(--paper-3); color: var(--ink); text-align: left; transition: border-color .15s, background .15s;
}
.engine__opt:hover { border-color: var(--ink-3); }
.engine__opt--on { border-color: var(--accent); background: var(--accent-tint); box-shadow: inset 0 0 0 1px var(--accent); }
.engine__name { font-family: var(--font-serif); font-weight: 600; font-size: 15px; white-space: nowrap; color: var(--ink); }
.engine__detail { font-size: 11.5px; color: var(--ink-3); white-space: nowrap; text-align: right; }
.engine__note { font-size: 12px; line-height: 1.45; margin: 4px 0 0; }
.panel__actions { display: flex; flex-wrap: wrap; gap: 10px; }
.panel__actions .btn--primary { flex: 1 1 auto; min-width: 170px; }
/* guide: paths table */
.paths { width: 100%; border-collapse: collapse; }
.paths td { padding: 9px 4px; border-bottom: 1px dashed var(--rule); font-size: 14px; }
.paths tr:last-child td { border-bottom: 0; }
.paths__agent { font-family: var(--font-serif); font-weight: 600; width: 38%; }
.paths__path { color: var(--accent-deep); font-size: 12.5px; }
/* agent-callable */
.agentcall__hd { display: flex; justify-content: space-between; align-items: flex-start; gap: 10px; }
.agentcall__blurb { font-size: 13.5px; line-height: 1.5; color: var(--ink-2); margin: 4px 0 12px; }
.agentcall__pre {
margin: 0; padding: 14px; border-radius: var(--radius); background: var(--paper-inset);
border: 1px solid var(--edge); font-size: 11.5px; line-height: 1.6; color: var(--ink-2);
white-space: pre-wrap; max-height: 200px; overflow: auto;
}
.getrow { display: grid; grid-template-columns: repeat(3, 1fr); gap: 12px; }
.getrow__item {
display: flex; flex-direction: column; gap: 3px; padding: 13px;
border: 1px solid var(--edge); border-radius: var(--radius); background: var(--paper-2);
}
.getrow__t { font-family: var(--font-serif); font-weight: 600; font-size: 14px; }
.getrow__s { font-size: 11.5px; line-height: 1.35; }
/* ---------------- Analyzing ---------------- */
.analyzing { min-height: 78vh; display: grid; place-items: center; }
.analyzing__card { padding: 34px 38px; width: min(440px, 90vw); }
.analyzing__svg { width: 100%; height: auto; margin-bottom: 14px; }
.analyzing__trail { stroke-dasharray: 360; stroke-dashoffset: 360; animation: draw 2.4s ease forwards; }
@keyframes draw { to { stroke-dashoffset: 0; } }
.analyzing__dot { offset-path: path("M20 96 C 70 60, 100 104, 150 70 S 230 30, 300 44"); animation: ride 2.4s ease forwards; }
@keyframes ride { from { offset-distance: 0%; } to { offset-distance: 100%; } }
.analyzing__steps { list-style: none; margin: 16px 0 0; padding: 0; display: flex; flex-direction: column; gap: 8px; }
.analyzing__steps li { font-size: 14px; color: var(--ink-faint); display: flex; gap: 10px; transition: color .3s; }
.analyzing__steps li.active { color: var(--ink); }
.analyzing__steps li.done { color: var(--ink-2); }
.analyzing__tick { color: var(--accent); width: 14px; }
/* ---------------- Report ---------------- */
.report-back { margin-bottom: 16px; }
.report { padding: 0; }
.report > * + * { margin-top: calc(34px * var(--space)); }
.sec > * + * { margin-top: 18px; }
/* report header (specimen tag) */
.rhead {
position: relative; padding: 24px 26px; border: 1px solid var(--edge);
border-radius: var(--radius-lg); background: var(--paper-2);
background-image: repeating-linear-gradient(var(--rule) 0 1px, transparent 1px 28px);
background-position: 0 54px;
}
.rhead__tag {
position: absolute; top: 0; right: 22px; transform: translateY(-50%) rotate(1.5deg);
font-size: 11px; font-weight: 600; letter-spacing: 0.14em; color: var(--on-accent); white-space: nowrap;
background: var(--accent-deep); padding: 5px 11px; border-radius: 3px;
}
.rhead__file { font-family: var(--font-mono); font-weight: 600; font-size: clamp(18px, 2.4vw, 24px); margin: 4px 0 0; word-break: break-all; }
.rhead__grid { display: grid; grid-template-columns: repeat(6, 1fr); gap: 14px; margin: 20px 0 0; }
.rhead__cell { display: flex; flex-direction: column; gap: 3px; }
.rhead__cell dd { margin: 0; font-size: 13px; color: var(--ink-2); text-transform: capitalize; }
.rhead__cell .mono { font-size: 12.5px; }
/* verdict */
.verdict {
position: relative; overflow: hidden; display: grid; grid-template-columns: 1.5fr 1fr;
gap: 28px; padding: 28px 30px 28px 36px;
}
.verdict__band { position: absolute; left: 0; top: 0; bottom: 0; width: 7px; background: var(--tone); }
.verdict__headline {
font-family: var(--font-serif); font-weight: 700; letter-spacing: -0.02em;
font-size: clamp(24px, 3.2vw, 36px); line-height: 1.08; margin: 12px 0 0; text-wrap: balance;
}
.verdict__detail { font-size: 15.5px; line-height: 1.55; color: var(--ink-2); margin: 14px 0 0; }
.verdict__stamps { margin-top: 18px; }
.verdict__right { display: flex; flex-direction: column; gap: 16px; justify-content: center;
border-left: 1px dashed var(--rule-strong); padding-left: 26px; }
.verdict__gauge { display: flex; flex-direction: column; gap: 4px; }
.verdict__gauge-val { font-family: var(--font-serif); font-weight: 700; font-size: 21px; color: var(--tone); line-height: 1.1; }
.verdict__gauge-blurb { font-size: 13px; color: var(--ink-2); line-height: 1.4; }
.verdict__stats { display: flex; gap: 26px; }
.verdict__stats > div { display: flex; flex-direction: column; gap: 2px; }
.verdict__num { font-size: 25px; font-weight: 600; color: var(--ink); line-height: 1; white-space: nowrap; }
/* ---------------- Trail ---------------- */
.trail-card { padding: 22px 24px 18px; }
.trail__chrome { display: grid; grid-template-columns: 26px 1fr; gap: 10px; }
.trail__axis-y {
display: flex; flex-direction: column; justify-content: space-between; align-items: center;
writing-mode: vertical-rl; transform: rotate(180deg);
font-family: var(--font-mono); font-size: 9.5px; letter-spacing: 0.14em; text-transform: uppercase;
color: var(--ink-faint); padding: 6px 0 40px;
}
.trail__axis-y span:nth-child(2) { color: var(--ink-3); }
.trail__plot { position: relative; aspect-ratio: 1000 / 360; width: 100%; }
.trail__svg { position: absolute; inset: 0; width: 100%; height: 100%; }
.trail__node { cursor: pointer; }
.trail__node circle { transition: r .15s ease; }
/* waypoint flags (HTML over SVG) */
.wp {
position: absolute; transform: translate(-50%, -50%);
display: flex; flex-direction: column; align-items: center; gap: 1px;
background: none; border: 0; padding: 0; cursor: pointer; width: max-content; max-width: 150px;
z-index: 2;
}
.wp--above { transform: translate(-50%, calc(-100% - 16px)); }
.wp--below { transform: translate(-50%, 18px); }
.wp--first.wp--above { transform: translate(-14%, calc(-100% - 16px)); align-items: flex-start; }
.wp--first.wp--below { transform: translate(-14%, 18px); align-items: flex-start; }
.wp--first .wp__title { text-align: left; }
.wp--last.wp--above { transform: translate(-86%, calc(-100% - 16px)); align-items: flex-end; }
.wp--last.wp--below { transform: translate(-86%, 18px); align-items: flex-end; }
.wp--last .wp__title { text-align: right; }
.wp__id { font-size: 10.5px; font-weight: 700; color: var(--tone); letter-spacing: 0.06em; }
.wp__title {
font-family: var(--font-serif); font-size: 12.5px; font-weight: 600; line-height: 1.12;
color: var(--ink); text-align: center; padding: 2px 7px; border-radius: 3px;
background: color-mix(in srgb, var(--paper-3) 88%, transparent);
border: 1px solid transparent; transition: border-color .15s, background .15s;
}
.wp__dur { font-size: 9.5px; color: var(--ink-faint); }
.wp:hover .wp__title { border-color: var(--tone); }
.wp--sel .wp__title { border-color: var(--tone); background: var(--paper-3); box-shadow: var(--shadow-card); }
.wp--sel .wp__id { font-size: 11.5px; }
.trail__xaxis {
display: flex; justify-content: space-between; align-items: center; margin: 14px 0 0 36px;
font-size: 11px; color: var(--ink-faint);
}
/* legend */
.legend { display: flex; align-items: center; gap: 16px; flex-wrap: wrap; padding-top: 6px; }
.legend__items { display: flex; flex-wrap: wrap; gap: 8px 18px; }
.legend__item { display: flex; align-items: center; gap: 7px; }
.legend__txt { font-size: 12px; color: var(--ink-2); }
.legend__txt b { font-weight: 600; color: var(--ink); }
/* episode detail */
.epd { position: relative; overflow: hidden; padding: 24px 26px 26px; }
.epd__band { position: absolute; left: 0; top: 0; bottom: 0; width: 6px; background: var(--tone); }
.epd__head { display: flex; align-items: flex-start; gap: 14px; }
.epd__head > div:last-child { flex: 1; min-width: 0; }
.epd__id { display: flex; align-items: center; gap: 7px; flex: none; padding-top: 2px; }
.epd__no { font-size: 17px; font-weight: 700; color: var(--tone); }
.epd__title { font-family: var(--font-serif); font-weight: 700; font-size: 22px; letter-spacing: -0.015em; margin: 0; line-height: 1.16; }
.epd__meta { font-size: 11.5px; color: var(--ink-3); margin-top: 6px; }
.epd__flow { display: grid; grid-template-columns: repeat(3, 1fr); gap: 18px; margin: 20px 0; }
.epd__step { display: flex; flex-direction: column; gap: 6px; }
.epd__step p { margin: 0; font-size: 14px; line-height: 1.5; color: var(--ink-2); font-family: var(--font-body); }
.epd__codes { display: flex; flex-wrap: wrap; gap: 7px; margin: 16px 0; }
.epd__quotes { display: flex; flex-direction: column; gap: 8px; margin: 16px 0; }
.epd__memo { margin-top: 16px; padding: 14px 16px; background: var(--accent-tint); border-radius: var(--radius); border: 1px solid color-mix(in srgb, var(--accent) 24%, transparent); }
.epd__memo p { margin: 6px 0 0; font-size: 14.5px; line-height: 1.55; color: var(--ink); font-family: var(--font-body); }
/* quotes */
.quote {
margin: 0; padding: 8px 14px; border-left: 2px solid var(--rule-strong);
font-family: var(--font-serif); font-style: italic; font-size: 14.5px; line-height: 1.5; color: var(--ink-2);
}
.quote--sm { font-size: 13px; padding: 4px 12px; }
/* ledger variant */
.ledger { display: flex; flex-direction: column; }
.ledger__row {
display: grid; grid-template-columns: 26px 36px 1fr auto; align-items: center; gap: 12px;
width: 100%; text-align: left; background: none; border: 0; border-bottom: 1px dashed var(--rule);
padding: 13px 6px; transition: background .12s;
}
.ledger__row:hover { background: var(--paper-inset); }
.ledger__row--sel { background: var(--accent-tint); }
.ledger__rail { display: grid; place-items: center; }
.ledger__id { font-size: 12px; font-weight: 700; color: var(--tone); }
.ledger__main { display: flex; flex-direction: column; gap: 2px; }
.ledger__title { font-family: var(--font-serif); font-weight: 600; font-size: 15px; }
.ledger__sub { font-size: 12px; color: var(--ink-3); }
.ledger__dur { font-size: 11.5px; color: var(--ink-faint); }
/* ---------------- Difficulty map ---------------- */
.dmap { display: grid; grid-template-columns: repeat(auto-fill, minmax(240px, 1fr)); gap: 16px; }
.dmap__cell { padding: 16px 18px; }
.dmap__hd { display: flex; justify-content: space-between; align-items: baseline; gap: 10px; margin-bottom: 8px; }
.dmap__type { font-family: var(--font-serif); font-weight: 600; font-size: 15.5px; }
.dmap__ids { font-size: 11px; color: var(--accent-deep); }
/* ---------------- Detour ---------------- */
.detour { display: grid; grid-template-columns: repeat(3, 1fr); gap: 16px; }
.detour__col { padding: 18px; border-top: 3px solid var(--tone); }
.detour__hd { display: flex; align-items: center; gap: 8px; margin-bottom: 6px; }
.detour__title { font-family: var(--font-serif); font-weight: 600; font-size: 15.5px; flex: 1; }
.detour__count { font-size: 18px; font-weight: 600; color: var(--tone); }
.detour__blurb { font-size: 13px; line-height: 1.45; color: var(--ink-2); margin: 0 0 12px; }
.detour__list { display: flex; flex-direction: column; gap: 8px; }
.detour__ep { display: flex; align-items: center; gap: 8px; }
.detour__epid { font-size: 12px; font-weight: 700; color: var(--ink-3); }
.detour__none { font-size: 13px; }
/* ---------------- Recovery ---------------- */
.recov { padding: 8px 26px; }
.recov__row { display: grid; grid-template-columns: 30px 130px 1fr; gap: 16px; align-items: baseline; padding: 16px 0; border-bottom: 1px dashed var(--rule); }
.recov__row:last-child { border-bottom: 0; }
.recov__no { color: var(--ink-faint); font-size: 12px; }
.recov__k { padding-top: 2px; }
.recov__v { margin: 0; font-size: 15px; line-height: 1.55; color: var(--ink); font-family: var(--font-body); }
/* ---------------- Outcome audit ---------------- */
.audit { padding: 8px 24px; }
.audit__row { display: grid; grid-template-columns: 54px 1fr; gap: 16px; padding: 16px 0; border-bottom: 1px dashed var(--rule); }
.audit__row:last-child { border-bottom: 0; }
.audit__rail { display: flex; flex-direction: column; align-items: center; gap: 8px; padding-top: 2px; }
.audit__rail .mono { font-size: 12px; font-weight: 700; color: var(--ink-3); }
.audit__claim { display: flex; align-items: baseline; gap: 12px; flex-wrap: wrap; }
.audit__verb { font-family: var(--font-serif); font-weight: 700; font-size: 16px; color: var(--tone); }
.audit__note { font-size: 13.5px; color: var(--ink-2); }
.audit__body .quote { margin-top: 8px; }
/* ---------------- Privacy / exports ---------------- */
.px { display: grid; grid-template-columns: 1fr 0.8fr; gap: 22px; }
.px__notes { padding: 22px 24px; }
.px__list { margin: 8px 0 0; padding-left: 18px; }
.px__list li { font-size: 14px; line-height: 1.7; color: var(--ink-2); }
.px__exports { padding: 22px 24px; display: flex; flex-direction: column; gap: 12px; }
.px__blurb { font-size: 14px; line-height: 1.5; color: var(--ink-2); margin: 0; }
.px__btns { display: flex; flex-direction: column; gap: 9px; }
.px__btns .btn { justify-content: flex-start; }
.px__btns .btn span { color: var(--accent); font-weight: 700; }
/* footer */
.foot { display: flex; flex-direction: column; gap: 4px; margin-top: 50px; padding-top: 20px; border-top: 1px solid var(--rule); }
.foot .mono { font-size: 12px; font-weight: 600; letter-spacing: 0.04em; }
.foot .muted { font-size: 12.5px; }
/* ---------------- Responsive ---------------- */
@media (max-width: 920px) {
.landing__grid, .verdict, .px { grid-template-columns: 1fr; }
.verdict__right { border-left: 0; border-top: 1px dashed var(--rule-strong); padding-left: 0; padding-top: 18px; }
.rhead__grid { grid-template-columns: repeat(3, 1fr); }
.detour { grid-template-columns: 1fr; }
.epd__flow { grid-template-columns: 1fr; gap: 12px; }
}
@media (max-width: 560px) {
.landing, .report, .report-wrap { padding: 0 16px; }
.rhead__grid { grid-template-columns: repeat(2, 1fr); }
.getrow { grid-template-columns: 1fr; }
.wp__title { font-size: 11px; }
.recov__row { grid-template-columns: 1fr; gap: 4px; }
}