:root { color-scheme:dark; }
* { box-sizing:border-box; }
html { background:var(--sv-bg); color:var(--sv-bone); scroll-behavior:smooth; }
body { margin:0; min-width:0; overflow-x:hidden; background:var(--sv-bg); font-family:var(--sv-font-body); line-height:var(--sv-leading); }
a { color:inherit; text-decoration-thickness:1px; text-underline-offset:var(--fs-space-1); }
button, input { font:inherit; }
.sr-only { position:absolute; width:1px; height:1px; padding:0; margin:-1px; overflow:hidden; clip:rect(0,0,0,0); white-space:nowrap; border:0; }
.grain, .coordinate-grid { position:fixed; inset:0; z-index:-2; pointer-events:none; }
.grain { background:url('/assets/site-v2/paper-charcoal.webp') center/500px; opacity:.12; }
.coordinate-grid { inset:var(--fs-space-5); z-index:-1; border:1px solid var(--sv-line); background:url('/assets/site-v2/paper-bone.webp') center/420px; opacity:.12; mix-blend-mode:soft-light; }
.reader-case { min-height:100vh; min-height:100dvh; }
.reader-masthead, .reader-root, .case-footer { width:var(--sv-shell); margin:0 auto; }
.reader-masthead { display:grid; grid-template-columns:1fr auto 1fr; align-items:center; gap:var(--fs-space-4); padding:var(--fs-space-5) 0; border-bottom:1px solid var(--sv-line); font:var(--fs-text-xs) var(--sv-font-mono); letter-spacing:.09em; }
.reader-mark { text-decoration:none; font:500 var(--fs-text-md) var(--sv-font-display); letter-spacing:.12em; }
.reader-mark span { margin-left:var(--fs-space-1); color:var(--sv-noted); font-family:var(--sv-font-cjk-display); }
.reader-masthead > p { margin:0; color:var(--sv-compass); text-align:center; }
.reader-masthead nav { display:flex; justify-content:flex-end; gap:var(--fs-space-4); }
.reader-masthead nav a { text-decoration:none; }
.reader-masthead nav a:hover, .reader-masthead nav a:focus-visible { color:var(--sv-noted); text-decoration:underline; }
.language-toggle { color:var(--sv-noted); }
/* THE INTAKE IS THE PAGE'S JOB. The masthead introduces the form; it does not bury it.
   Both figures below are sized so the whole form — four address fields, the optional
   link, and the submit — clears the fold at 1280x800 (the smaller of the two laptop
   sizes we hold this to); scripts/check-reader-rendered.mjs measures it rather than
   trusting the arithmetic. The headline is still the largest thing on the screen. */
.reader-intake { display:grid; grid-template-columns:minmax(130px,1fr) minmax(0,6fr); gap:var(--fs-space-6); padding:clamp(var(--fs-space-6),4.2vw,4.75rem) 0 clamp(var(--fs-space-8),6vw,5.5rem); }
.intake-docket { margin:0; padding-right:var(--fs-space-4); border-right:1px solid var(--sv-line); color:var(--sv-compass); font:var(--fs-text-2xs)/1.7 var(--sv-font-mono); letter-spacing:.1em; }
.intake-docket p { margin:0 0 var(--fs-space-4); }
.intake-copy { max-width:760px; min-width:0; }
.reader-kicker, .dossier-kicker, .dossier-section-title, .status-kicker { font:var(--fs-text-xs) var(--sv-font-mono); letter-spacing:.1em; }
.reader-kicker { margin:0 0 var(--fs-space-4); color:var(--sv-noted); }
.reader-intake h1 { margin:0; font:500 clamp(2.45rem,5vw,4.6rem)/.9 var(--sv-font-display); letter-spacing:-.05em; }
.reader-deck { max-width:620px; margin:var(--fs-space-5) 0 0; font:var(--fs-text-xl)/1.38 var(--sv-font-display); }
.reader-form { display:grid; gap:var(--fs-space-3); max-width:620px; margin-top:var(--fs-space-5); }
.reader-input { min-width:0; width:100%; padding:var(--fs-space-3) var(--fs-space-4); border:1px solid var(--sv-line); border-radius:var(--fs-radius-sm); outline:0; color:var(--sv-bone); background:var(--sv-deep-indigo); font:var(--fs-text-md) var(--sv-font-body); }
/* Examples, not values — held a step back so an EMPTY form never reads as a filled one. */
.reader-input::placeholder { color:var(--sv-compass); opacity:.78; }
.reader-input:focus-visible { border-color:var(--sv-noted); box-shadow:0 0 0 var(--fs-space-1) var(--sv-deep-indigo); }
/* THE ADDRESS IS THE REQUEST. One field per address section (street · city · state ·
   ZIP), so the four parts are separately editable and separately labelled — and so the
   listing link can drop to what it always was: one convenient way to obtain an
   address. Field labels are set in the same mono the case file stamps its labels in,
   so the intake reads as the first page of the docket, not as a generic web form.
   Tab progression is the browser's own; only the fixed-width ZIP auto-advances
   (read.js), because guessing when a street or city name is "finished" fights editing. */
.reader-address { min-width:0; margin:0; padding:0; border:0; }
.intake-legend { margin-bottom:var(--fs-space-2); padding:0; color:var(--sv-noted); }
.intake-legend, .addr-field label, .reader-alt > label { font:var(--fs-text-2xs) var(--sv-font-mono); letter-spacing:.09em; text-transform:uppercase; }
.addr-field label, .reader-alt > label { color:var(--sv-compass); }
.address-grid { display:grid; grid-template-columns:minmax(0,1fr) 5.5rem 7rem; gap:var(--fs-space-2) var(--fs-space-3); }
.addr-field { display:grid; min-width:0; gap:var(--fs-space-1); margin:0; }
.addr-field--street { grid-column:1 / -1; }
.reader-alt { display:grid; min-width:0; gap:var(--fs-space-1); margin:var(--fs-space-2) 0 0; }
.addr-optional { margin-left:var(--fs-space-2); color:var(--sv-compass); opacity:.85; }
.intake-action { display:flex; align-items:center; gap:var(--fs-space-4); margin-top:var(--fs-space-1); }
.reader-go, .reader-share { border:1px solid var(--sv-noted); border-radius:var(--fs-radius-sm); color:var(--sv-ink); background:var(--sv-noted); cursor:pointer; font:500 var(--fs-text-sm) var(--sv-font-mono); letter-spacing:.08em; }
.reader-go { min-height:44px; padding:var(--fs-space-3) var(--fs-space-4); white-space:nowrap; }
.reader-go span { margin-left:var(--fs-space-3); }
.reader-go:hover, .reader-share:hover { background:var(--sv-bone); border-color:var(--sv-bone); }
.reader-go:focus-visible, .reader-share:focus-visible { outline:2px solid var(--sv-noted); outline-offset:var(--fs-space-1); }
.reader-go[disabled] { cursor:progress; opacity:var(--fs-opacity-disabled); }
.reader-hint { margin:0; color:var(--sv-compass); font:var(--fs-text-xs) var(--sv-font-mono); letter-spacing:.06em; }
.reader-privacy { max-width:570px; margin:var(--fs-space-4) 0 0; padding-left:var(--fs-space-3); border-left:2px solid var(--sv-clear); color:var(--sv-compass); font:var(--fs-text-xs)/1.65 var(--sv-font-mono); letter-spacing:.03em; overflow-wrap:anywhere; }
.reading:empty { display:none; }
.reading { margin-bottom:clamp(var(--fs-space-8),9vw,7rem); }
/* The head is the ruling, not a card: kicker + address as the case caption, then the
   verdict set at the largest type on the page. Address recedes so the verdict leads. */
.dossier-head { max-width:820px; padding:var(--fs-space-5) 0 var(--fs-space-6); border-top:1px solid var(--sv-line); border-bottom:1px solid var(--sv-line); }
.dossier-kicker { margin:0 0 var(--fs-space-3); color:var(--sv-noted); }
.dossier-address { max-width:720px; margin:0; overflow-wrap:anywhere; color:var(--sv-bone); font:500 clamp(var(--fs-text-xl),2.7vw,2.05rem)/1.14 var(--sv-font-display); letter-spacing:-.03em; }
.dossier-verdict { display:grid; justify-items:start; gap:var(--fs-space-3); margin:var(--fs-space-6) 0 0; }
.verdict-phrase { margin:0; color:var(--sv-bone); font:500 clamp(2.5rem,6.4vw,4.75rem)/.9 var(--sv-font-display); letter-spacing:-.052em; }
.dossier-count { margin:var(--fs-space-5) 0 0; color:var(--sv-compass); font:var(--fs-text-xs)/1.6 var(--sv-font-mono); letter-spacing:.04em; }
.dossier-findings { margin-top:clamp(var(--fs-space-6),8vw,6rem); }
.dossier-section-head { display:flex; align-items:baseline; justify-content:space-between; gap:var(--fs-space-4); padding-bottom:var(--fs-space-2); border-bottom:1px solid var(--sv-line); }
.dossier-section-title { margin:0; color:var(--sv-noted); font-weight:500; }
.dossier-section-count { margin:0; color:var(--sv-compass); font:var(--fs-text-2xs) var(--sv-font-mono); letter-spacing:.09em; white-space:nowrap; }
/* ONE composed finding entry: head + prose + map-evidence + 化解 + links in column 1, the
   evidence diagram in column 2 — never a detached box. Weight is carried by STATE, not by
   a uniform card: WATCH sits on a red spine over a deeper ink wash and takes the larger
   term; NEEDS-CHECK gets a hairline spine; nothing here is a bordered box. */
.case-finding { display:grid; grid-template-columns:minmax(0,1.4fr) minmax(200px,.82fr); gap:var(--fs-space-4) var(--fs-space-5); padding:var(--fs-space-5) 0 var(--fs-space-6); border-top:1px solid var(--sv-line); scroll-margin-top:var(--fs-space-5); }
.dossier-findings > .case-finding:first-of-type { border-top:0; }
.case-finding:focus { outline:none; }
.case-finding:focus-visible { outline:2px solid var(--sv-noted); outline-offset:var(--fs-space-2); }
.case-finding--watch, .case-finding--mixed { padding:var(--fs-space-5) var(--fs-space-5) var(--fs-space-6); border-left:2px solid var(--sv-watch); background:rgb(var(--sv-ink-rgb)/.55); }
.case-finding--mixed { border-left-color:var(--sv-noted); }
.case-finding-head { grid-column:1 / -1; display:flex; align-items:flex-start; justify-content:space-between; gap:var(--fs-space-4); min-width:0; }
.case-body { grid-column:1; min-width:0; }
.case-finding--solo { grid-template-columns:minmax(0,1fr); }
.case-finding--solo .case-body { grid-column:1 / -1; }
.case-term { min-width:0; margin:0; font:500 var(--fs-text-lg)/1.12 var(--sv-font-display); letter-spacing:-.025em; }
.case-finding--watch .case-term, .case-finding--mixed .case-term { font-size:var(--fs-text-2xl); }
.case-term-link { text-decoration:none; }
.case-term-link:hover, .case-term-link:focus-visible { color:var(--sv-noted); text-decoration:underline; }
.case-term b { font-weight:500; }
.case-term-alt { margin-left:var(--fs-space-2); color:var(--sv-noted); font:var(--fs-text-sm) var(--sv-font-cjk-display); letter-spacing:.03em; }
.case-finding-meta { display:flex; flex:0 1 auto; flex-wrap:wrap; justify-content:flex-end; align-items:center; gap:var(--fs-space-2); }
.case-stamp { display:inline-flex; max-width:100%; align-items:center; gap:var(--fs-space-1); padding:var(--fs-space-1) var(--fs-space-2); border:1px solid currentColor; border-radius:var(--fs-radius-sm); font:500 var(--fs-text-2xs)/1.35 var(--sv-font-mono); letter-spacing:.06em; overflow-wrap:anywhere; }
.stamp-glyph { font-size:var(--fs-text-xs); }
.stamp-watch { color:var(--sv-watch); }
.stamp-mixed, .stamp-needs-check, .stamp-extension { color:var(--sv-noted); }
.stamp-favorable, .stamp-clear { color:var(--sv-clear); }
.stamp-unassessed { color:var(--sv-compass); border-style:dashed; }
.case-confidence { color:var(--sv-compass); font:var(--fs-text-2xs) var(--sv-font-mono); letter-spacing:.05em; white-space:nowrap; }
.case-confidence.high { color:var(--sv-clear); }
.case-confidence.medium { color:var(--sv-noted); }
.case-elements { display:inline-flex; gap:var(--fs-space-1); }
.case-element { display:inline-grid; width:20px; height:20px; place-items:center; border:1px solid currentColor; border-radius:var(--fs-radius-sm); color:var(--sv-compass); font:var(--fs-text-xs)/1 var(--sv-font-cjk-display); font-style:normal; }
/* Element glyphs ride the shared --sv-wx-* set (site review D2), so the reading, the
   register on /factors/ and the method specimen name the five elements in one colour
   language. Previously 土 and 金 shared --sv-noted (two elements, one colour) and 水
   borrowed --sv-road; worse, 木/火 borrowed --sv-clear/--sv-watch, i.e. the STATUS
   colours, so a wood finding read as "clear" at a glance. These five are taxonomy only. */
.case-element.e-wood { color:var(--sv-wx-wood); }
.case-element.e-fire { color:var(--sv-wx-fire); }
.case-element.e-earth { color:var(--sv-wx-earth); }
.case-element.e-metal { color:var(--sv-wx-metal); }
.case-element.e-water { color:var(--sv-wx-water); }
.case-line { margin:0 0 var(--fs-space-3); color:var(--sv-bone); font:var(--fs-text-md)/1.65 var(--sv-font-body); }
.case-line:last-child { margin-bottom:0; }
.case-label { display:block; margin-bottom:var(--fs-space-1); color:var(--sv-noted); font:var(--fs-text-2xs) var(--sv-font-mono); letter-spacing:.09em; }
.case-tradition { color:var(--sv-compass); }
.case-map-evidence { margin-bottom:0; padding-top:var(--fs-space-3); border-top:1px solid var(--sv-line); color:var(--sv-bone); font-family:var(--sv-font-mono); font-size:var(--fs-text-xs); }
/* 化解 — the one place a finding says what can be done, on the jade spine that carries
   "what helps" everywhere on this surface, ending in the link to its register entry. */
.case-help { margin-top:var(--fs-space-5); padding-left:var(--fs-space-3); border-left:2px solid var(--sv-clear); }
.case-help-label { margin:0 0 var(--fs-space-2); color:var(--sv-clear); font:500 var(--fs-text-2xs) var(--sv-font-mono); letter-spacing:.09em; }
.case-help-copy { margin:0; color:var(--sv-bone); font:var(--fs-text-sm)/1.65 var(--sv-font-body); }
.case-help-link { display:inline-block; margin-top:var(--fs-space-2); color:var(--sv-clear); font:var(--fs-text-2xs) var(--sv-font-mono); letter-spacing:.06em; }
.case-actions { margin:var(--fs-space-4) 0 0; }
.dossier-map { grid-column:2; align-self:start; overflow:hidden; border:1px solid var(--sv-divider); border-radius:var(--fs-radius-sm); background:var(--sv-deep-indigo); }
.dossier-map svg { display:block; width:100%; height:auto; }
.dossier-register { width:min(880px,100%); margin:clamp(var(--fs-space-8),11vw,8rem) 0 0 0; }
/* The register is an INDEX, not a second reading: one compact row per family, rows with a
   finding step forward and jump to the written entry, screened rows recede. */
.factor-register { margin:var(--fs-space-2) 0 0; padding:0; list-style:none; }
.factor-register-row { display:grid; grid-template-columns:2.2rem minmax(0,1fr) minmax(0,1.3fr) auto; align-items:baseline; gap:var(--fs-space-2) var(--fs-space-3); padding:var(--fs-space-3) 0; border-bottom:1px solid var(--sv-line); }
.register-index { color:var(--sv-compass); font:var(--fs-text-2xs)/1.5 var(--sv-font-mono); letter-spacing:.06em; }
.register-name { min-width:0; color:var(--sv-compass); text-decoration:none; font:var(--fs-text-md)/1.3 var(--sv-font-display); letter-spacing:-.015em; }
.register-name b { font-weight:500; }
.register-name-en { margin-left:var(--fs-space-2); color:var(--sv-compass); font:var(--fs-text-xs) var(--sv-font-body); letter-spacing:0; }
.register-name:hover, .register-name:focus-visible { color:var(--sv-noted); text-decoration:underline; }
.register-note { min-width:0; color:var(--sv-compass); font:var(--fs-text-xs)/1.55 var(--sv-font-mono); letter-spacing:.02em; overflow-wrap:anywhere; }
.register-rollup { color:var(--sv-compass); }
.register-jump { color:var(--sv-noted); text-decoration:none; }
.register-jump:hover, .register-jump:focus-visible { text-decoration:underline; }
.register-jump-hint { color:var(--sv-compass); }
.factor-register-row .case-stamp { justify-self:end; }
.register-state-watch, .register-state-mixed, .register-state-needs-check { border-bottom-color:var(--sv-line); }
.register-state-watch .register-name, .register-state-mixed .register-name, .register-state-needs-check .register-name { color:var(--sv-bone); font-size:var(--fs-text-lg); }
.register-state-clear .case-stamp, .register-state-unassessed .case-stamp, .register-state-extension .case-stamp { opacity:.7; }
.factor-file-link { color:var(--sv-noted); font:var(--fs-text-2xs) var(--sv-font-mono); letter-spacing:.06em; }
.register-legend { margin:var(--fs-space-4) 0 0; color:var(--sv-compass); font:var(--fs-text-2xs)/1.6 var(--sv-font-mono); letter-spacing:.05em; }
/* A screened row that found nothing says what it screened — one recessive line, a step
   quieter than the note above it. This replaces NOTHING of the deleted educational
   blurbs: no schematic, no doctrine, no second copy of a finding. It is the smallest
   honest answer to "clear of what?", and the factor page stays the deep dive. */
.register-unassessed, .register-gloss { display:block; }
.register-gloss { color:var(--sv-compass); font-size:var(--fs-text-2xs); letter-spacing:.045em; }
.register-unassessed + .register-gloss { margin-top:var(--fs-space-1); }
.reader-share { display:block; margin:var(--fs-space-5) 0 0 auto; padding:var(--fs-space-2) var(--fs-space-3); }
.map-attribution { margin:var(--fs-space-4) 0 0; color:var(--sv-compass); font:var(--fs-text-xs) var(--sv-font-mono); letter-spacing:.04em; }
.map-attribution a { color:var(--sv-noted); }
.reader-notice { max-width:620px; margin:var(--fs-space-4) 0 0; padding-left:var(--fs-space-3); border-left:2px solid var(--sv-noted); color:var(--sv-bone); font:var(--fs-text-sm)/1.6 var(--sv-font-body); }
.reader-notice[hidden] { display:none; }
/* Recent case files — a calm register under the intake form; case-file language (mono
   label, bone rules), each row a listing address + its verdict chip. */
.reader-recent { max-width:620px; margin:var(--fs-space-8) 0 0; padding-top:var(--fs-space-5); border-top:1px solid var(--sv-line); }
.reader-recent[hidden] { display:none; }
.reader-recent-title { margin:0 0 var(--fs-space-3); color:var(--sv-noted); font:500 var(--fs-text-xs) var(--sv-font-mono); letter-spacing:.1em; text-transform:uppercase; }
.reader-recent-list { margin:0; padding:0; list-style:none; }
.reader-recent-item { border-top:1px solid var(--sv-line); }
.reader-recent-item:first-child { border-top:0; }
.reader-recent-link { display:flex; flex-wrap:wrap; align-items:center; justify-content:space-between; gap:var(--fs-space-3); padding:var(--fs-space-3) 0; color:var(--sv-bone); text-decoration:none; }
.reader-recent-addr { min-width:0; overflow-wrap:anywhere; font:var(--fs-text-md)/1.3 var(--sv-font-display); letter-spacing:-.02em; }
.reader-recent-link:hover .reader-recent-addr, .reader-recent-link:focus-visible .reader-recent-addr { color:var(--sv-noted); text-decoration:underline; }
.reader-recent-verdict { flex:0 0 auto; }
.reader-status { display:flex; flex-wrap:wrap; align-items:center; gap:var(--fs-space-3); margin-top:var(--fs-space-6); padding:var(--fs-space-5); border-top:1px solid var(--sv-line); border-bottom:1px solid var(--sv-line); color:var(--sv-bone); }
.status-kicker { color:var(--sv-noted); }
.status-copy { color:var(--sv-compass); }
.status-target { flex-basis:100%; overflow:hidden; color:var(--sv-compass); font:var(--fs-text-xs) var(--sv-font-mono); letter-spacing:.03em; text-overflow:ellipsis; white-space:nowrap; }
.reader-loading { justify-content:flex-start; }
.reader-spinner { width:18px; height:18px; flex:0 0 auto; border:2px solid var(--sv-line); border-top-color:var(--sv-noted); border-radius:50%; animation:reader-spin .8s linear infinite; }
@keyframes reader-spin { to { transform:rotate(360deg); } }
.reader-error { display:grid; grid-template-columns:auto minmax(0,1fr); border-left:2px solid var(--sv-watch); }
.reader-error p { margin:0; }
.reader-empty { color:var(--sv-compass); }
.reader-boundary { display:grid; grid-template-columns:minmax(130px,1fr) minmax(0,4fr); gap:var(--fs-space-6); margin-left:8%; padding:clamp(var(--fs-space-6),8vw,6rem) 0; border-top:1px solid var(--sv-line); }
.reader-boundary .reader-kicker { margin:0; }
.reader-boundary h2 { margin:0; font:500 var(--fs-text-2xl)/1.05 var(--sv-font-display); letter-spacing:-.035em; }
.reader-boundary div > p { max-width:620px; margin:var(--fs-space-4) 0 0; color:var(--sv-compass); font:var(--fs-text-md)/1.7 var(--sv-font-body); }
.case-footer { display:flex; justify-content:space-between; gap:var(--fs-space-5); padding:var(--fs-space-5) 0; border-top:1px solid var(--sv-line); color:var(--sv-compass); font:var(--fs-text-xs)/1.6 var(--sv-font-mono); letter-spacing:.06em; }
.case-footer nav { max-width:660px; }
.case-footer a { color:var(--sv-bone); }
.case-footer p { max-width:360px; margin:0; text-align:right; }
.case-footer p span { color:var(--sv-compass); }
.noscript { width:var(--sv-shell); margin:var(--fs-space-5) auto; padding:var(--fs-space-4); border-left:2px solid var(--sv-watch); color:var(--sv-bone); background:var(--sv-deep-indigo); font:var(--fs-text-sm) var(--sv-font-body); }
.ev-el { fill:none; stroke-linecap:round; stroke-linejoin:round; }
.ev-mapped { stroke:var(--sv-bone); stroke-width:var(--fs-map-stroke-strong); }
.ev-sparse { stroke:var(--sv-road); stroke-width:var(--fs-map-stroke-mid); stroke-dasharray:var(--fs-map-sparse-dash); opacity:var(--fs-map-sparse-opacity); }
.ev-derived { stroke:var(--sv-compass); stroke-width:var(--fs-map-stroke-fine); stroke-dasharray:var(--fs-map-frontier-dash); opacity:var(--fs-map-frontier-opacity); }
.ev-map[data-family="lonely-tower"] .ev-el[data-geometry-id^="sector-"].ev-mapped, .ev-map[data-family="lonely-tower"] .ev-el[data-geometry-id^="sector-"].ev-sparse { fill:var(--sv-deep-indigo); stroke:var(--sv-clear); }
.ev-map[data-family="lonely-tower"] .ev-el[data-geometry-id^="sector-"].ev-sparse { fill-opacity:.72; }
.ev-map[data-family="lonely-tower"] .ev-el[data-geometry-id^="sector-"].ev-absent { fill:none; stroke:var(--sv-compass); stroke-width:var(--fs-map-stroke-fine); opacity:var(--fs-map-wheel-exposed-opacity); }
.ev-el[data-geometry-id="toward-ray"] { stroke:var(--sv-watch); stroke-width:2.3px; stroke-linecap:round; }
.ev-el[data-geometry-id="toward-ray"].ev-sparse { stroke-dasharray:var(--fs-map-sparse-dash); opacity:var(--fs-map-sparse-opacity); }
.ev-home { fill:var(--sv-bone); stroke:var(--sv-ink); stroke-width:1.5px; }
.ev-north, .ev-scale { fill:var(--sv-compass); stroke:var(--sv-compass); stroke-width:1.2px; opacity:.55; }
.ev-wedge { fill:var(--sv-deep-indigo); stroke:var(--sv-clear); stroke-width:1px; opacity:.75; }
.ev-gap { fill:none; stroke:var(--sv-noted); stroke-width:var(--fs-map-stroke-fine); stroke-dasharray:var(--fs-map-gap-dash); opacity:var(--fs-map-gap-opacity); }
.ev-calm-ring { stroke:var(--sv-clear); stroke-width:var(--fs-map-stroke-strong); opacity:var(--fs-map-calm-jade-opacity); }
.ev-seal, .ev-luopan { stroke:var(--sv-bone); stroke-width:var(--fs-map-stroke-mid); opacity:var(--fs-map-seal-opacity); stroke-linecap:round; }
.ev-seal-outer { opacity:.5; }
.ev-tick, .ev-needle { stroke:var(--sv-clear); stroke-width:var(--fs-map-stroke-strong); stroke-linecap:round; }
.ev-cardinal { stroke:var(--sv-noted); stroke-width:var(--fs-map-stroke-strong); stroke-linecap:round; }
.ev-num { fill:var(--sv-bone); font-family:var(--sv-font-mono); font-variant-numeric:tabular-nums; font-size:9px; font-weight:500; paint-order:stroke fill; stroke:var(--sv-ink); stroke-width:var(--fs-map-proof-halo-stroke); stroke-linejoin:round; }
/* ── located-home site plan: the code-drawn plan of THIS home, in the same dark map
   palette as the findings (reuses ev-*); sp-* + heavier wires are added here. ── */
.dossier-corrected { margin:var(--fs-space-2) 0 0; color:var(--sv-clear); font:var(--fs-text-xs)/1.55 var(--sv-font-mono); letter-spacing:.03em; overflow-wrap:anywhere; }
.dossier-corrected .case-label { display:inline; margin:0 var(--fs-space-1) 0 0; color:var(--sv-noted); }
.dossier-corrected-src { color:var(--sv-compass); }
.dossier-siteplan { width:min(560px,100%); margin:var(--fs-space-6) 0 0; }
.siteplan-map { overflow:hidden; border:1px solid var(--sv-divider); border-radius:var(--fs-radius-sm); background:var(--sv-deep-indigo); }
.siteplan-map svg { display:block; width:100%; height:auto; }
.siteplan-cap { margin:var(--fs-space-2) 0 0; color:var(--sv-compass); font:var(--fs-text-2xs)/1.5 var(--sv-font-mono); letter-spacing:.05em; }
.siteplan-map .ev-mapped { stroke-width:2.6px; } /* thicker: the plan spans a wider radius */
.siteplan-map .ev-sparse { stroke-width:2px; }
.siteplan-map .ev-home { fill:var(--sv-watch); stroke:var(--sv-deep-indigo); stroke-width:1.6px; }
.sp-hatch-line { stroke:var(--sv-bone); stroke-width:.7px; opacity:.28; }
.sp-shade { stroke:var(--sv-bone); stroke-width:1px; opacity:.55; fill-opacity:.16; }
.sp-shade--home { stroke:var(--sv-watch); stroke-width:2px; fill-opacity:.3; }
.sp-north-label { fill:var(--sv-compass); font-family:var(--sv-font-mono); font-size:8.5px; font-weight:500; opacity:.7; }
.sp-caption { fill:var(--sv-compass); font-family:var(--sv-font-mono); font-size:9px; letter-spacing:.04em; }
.sp-note { fill:var(--sv-watch); font-family:var(--sv-font-mono); font-size:10px; font-weight:600; paint-order:stroke fill; stroke:var(--sv-deep-indigo); stroke-width:3.2px; stroke-linejoin:round; }
.sp-foot { fill:var(--sv-compass); font-family:var(--sv-font-mono); font-size:8.5px; letter-spacing:.03em; opacity:.8; }
.zh { font-family:var(--sv-font-cjk-body); }
.zh .reader-intake h1, .zh .dossier-address, .zh .reader-boundary h2, .zh .verdict-phrase, .zh .reader-recent-addr { font-family:var(--sv-font-cjk-display); letter-spacing:.02em; }
.zh .reader-deck, .zh .case-line, .zh .case-help-copy, .zh .reader-notice, .zh .reader-boundary div > p { font-family:var(--sv-font-cjk-body); }
.zh .register-name, .zh .register-note { font-family:var(--sv-font-cjk-body); }
/* DM Mono carries no CJK, so the /zh/ field labels ride the CJK body face rather than
   falling through to whatever the OS picks. Uppercasing does nothing to 漢字; the
   tracking is eased because CJK glyphs are already square. */
.zh .intake-legend, .zh .addr-field label, .zh .reader-alt > label { font-family:var(--sv-font-cjk-body); letter-spacing:.06em; }
@media (max-width:699px) {
  .coordinate-grid { inset:var(--fs-space-3); }
  .reader-masthead, .reader-root, .case-footer { width:86vw; }
  .reader-masthead { display:flex; justify-content:space-between; }
  .reader-masthead > p { display:none; }
  .reader-masthead nav { width:125px; flex-wrap:wrap; gap:var(--fs-space-2); }
  .reader-intake, .reader-boundary { display:block; margin-left:0; }
  .reader-intake { padding-top:clamp(var(--fs-space-6),9vw,4rem); }
  .intake-docket { display:flex; gap:var(--fs-space-3); padding:0 0 var(--fs-space-4); border-right:0; border-bottom:1px solid var(--sv-line); }
  .intake-docket p { margin:0; }
  .reader-intake h1 { font-size:clamp(2rem,8.5vw,3rem); }
  .reader-deck { font-size:var(--fs-text-xl); }
  /* Narrow: street and city take the full width; state and ZIP share the last row —
     three columns at 375 would squeeze the city name to nothing. */
  .address-grid { grid-template-columns:minmax(0,1fr) minmax(0,1fr); }
  .addr-field--city { grid-column:1 / -1; }
  .addr-field--state { grid-column:1; }
  .addr-field--zip { grid-column:2; }
  .intake-action { align-items:flex-start; flex-direction:column; gap:var(--fs-space-2); }
  .verdict-phrase { font-size:clamp(2.1rem,9.5vw,3.4rem); }
  .case-finding { grid-template-columns:minmax(0,1fr); }
  .case-finding-head, .case-body, .dossier-map { grid-column:1; }
  .case-finding-head { flex-direction:column; gap:var(--fs-space-2); }
  .case-finding-meta { justify-content:flex-start; }
  .case-finding--watch, .case-finding--mixed { padding:var(--fs-space-4) var(--fs-space-4) var(--fs-space-5); }
  .dossier-map { width:100%; }
  .factor-register-row { grid-template-columns:2rem minmax(0,1fr) auto; }
  .register-index { grid-column:1; grid-row:1; }
  .register-name { grid-column:2; grid-row:1; }
  .factor-register-row .case-stamp { grid-column:3; grid-row:1; justify-self:end; white-space:normal; }
  .register-note { grid-column:2 / -1; grid-row:2; }
  .reader-share { margin-left:0; }
  .reader-boundary { padding:var(--fs-space-6) 0; }
  .reader-boundary .reader-kicker { margin-bottom:var(--fs-space-4); }
  .case-footer { display:block; }
  .case-footer p { margin-top:var(--fs-space-4); text-align:left; }
}
/* The finish line. A reading lands in #out, BELOW a four-field form, so "it worked" was
   happening off-screen: the page sat on the intake looking idle. read.js now scrolls the
   dossier into view and moves focus to it; these two rules make the landing readable —
   the stamp says the work is OVER (the verdict says what was found, which is a different
   question), and the scroll-margin keeps the head off the very top edge. */
.dossier-done { margin:0 0 var(--fs-space-2); color:var(--sv-clear); font:500 var(--fs-text-2xs) var(--sv-font-mono); letter-spacing:.14em; }
.dossier-head, .reader-status { scroll-margin-top:var(--fs-space-5); }
.dossier-head:focus-visible, .dossier-address:focus-visible, .status-kicker:focus-visible { outline:2px solid var(--sv-noted); outline-offset:var(--fs-space-2); }
/* Focused programmatically after a reading lands — do not paint a ring for a cursor the
   buyer did not move themselves; :focus-visible above still covers keyboard users. */
.dossier-address:focus:not(:focus-visible), .status-kicker:focus:not(:focus-visible) { outline:none; }

/* A reading in flight: the intake has to LOOK spent, not just refuse the click. Only the
   button was disabled before, so every field stayed lit and editable while the request was
   already gone — a buyer could keep typing an address that was never going to be sent.
   The fields are readOnly (not disabled) so focus stays put, and this is what makes that
   state visible: the paper goes flat, the caret turns away, the button names what it is
   doing. Scoped to [data-busy] on the form, set and cleared in read.js. */
.reader-form[data-busy] .reader-input { background:var(--sv-map-ink); color:var(--sv-compass); border-color:var(--sv-line); cursor:default; }
.reader-form[data-busy] .reader-input::placeholder { color:transparent; }
.reader-form[data-busy] label, .reader-form[data-busy] .intake-legend { color:var(--sv-compass); }
.reader-form[data-busy] .reader-go { background:none; color:var(--sv-noted); cursor:progress; }
/* The one moving thing sits IN the button, where the eye already is when it clicks. */
.reader-form[data-busy] .reader-go::before { content:''; display:inline-block; width:.72em; height:.72em; margin-right:var(--fs-space-3); vertical-align:-.06em; border:2px solid var(--sv-noted); border-right-color:transparent; border-radius:50%; animation:reader-busy .8s linear infinite; }
@keyframes reader-busy { to { transform:rotate(360deg); } }
@media (prefers-reduced-motion:reduce) {
  html { scroll-behavior:auto; }
  .reader-spinner { animation-duration:2.4s; }
  .reader-form[data-busy] .reader-go::before { animation-duration:2.4s; }
}
