/* results */
#panel-results{padding:0;overflow:hidden}
#panel-results .res-hdr,#run-btn,#tgrid{flex-shrink:0}
#feat-register{flex:1;overflow-y:auto;min-height:0}
/* Sticky for the same reason .panel-hdr is: #panel-report scrolls as a whole, so its heading
   would otherwise slide away while Define and Screen keep theirs pinned. Harmless on Review,
   which does not scroll (its inner #feat-register does). */
.res-hdr{position:sticky;top:0;z-index:2;padding:12px 14px;border-bottom:1px solid var(--divider);background:var(--navy-dark);display:flex;align-items:flex-start;justify-content:space-between;gap:10px}
/* .res-hdr-txt / .res-eyebrow / .res-title / .res-summary now serve all four step panels,
   so they live in base.css as shared panel chrome rather than here. */
.res-hdr-txt{flex:1;min-width:0}
.res-summary strong{color:var(--text)}
/* ── Verdict card ─────────────────────────────────────────────────────────────
   Summary-before-detail at the top of Review. Tallies are factual categories
   (statutory / other / nearby), NOT a risk rating — see renderVerdictCard(). */
#verdict-card{margin:var(--s3) var(--s6) var(--s5);padding:var(--s5);background:var(--navy-mid);
  border:1px solid var(--divider);border-radius:var(--r-xl);box-shadow:var(--e1)}
.vc-top{display:flex;align-items:flex-start;gap:var(--s4);margin-bottom:var(--s4)}
.vc-icon{width:34px;height:34px;flex:0 0 auto;border-radius:var(--r-xl);display:flex;align-items:center;justify-content:center;
  font-size:var(--t-xl);background:var(--teal-dim);color:var(--teal)}
.vc-icon.hit{background:var(--amber-dim);color:var(--amber)}
.vc-t{font-size:var(--t-md);font-weight:700;color:var(--text);line-height:1.25}
.vc-s{font-size:var(--t-xs);color:var(--text-dim);margin-top:3px;line-height:1.45}
.vc-tallies{display:flex;gap:var(--s2)}
.vc-tally{flex:1;background:var(--navy-dark);border:1px solid var(--divider);border-radius:var(--r-lg);padding:var(--s3) var(--s4)}
.vc-n{font-size:var(--t-2xl);font-weight:750;line-height:1;letter-spacing:-.02em;color:var(--text);font-variant-numeric:tabular-nums}
.vc-k{font-size:var(--t-2xs);text-transform:uppercase;letter-spacing:.07em;font-weight:700;color:var(--text-faint);
  margin-top:5px;display:flex;align-items:center;gap:5px}
.vc-k::before{content:"";width:7px;height:7px;border-radius:50%;background:var(--c)}
.vc-tally.stat{--c:var(--amber)} .vc-tally.other{--c:var(--text-dim)} .vc-tally.near{--c:var(--green)}
.vc-tally.stat .vc-n{color:var(--amber)}
.vc-note{font-size:var(--t-2xs);color:var(--text-faint);margin-top:var(--s4);padding-top:var(--s3);
  border-top:1px solid var(--divider);line-height:1.45}

.query-fail-banner{display:none;gap:8px;align-items:flex-start;margin:0 14px 12px;padding:8px 10px;background:var(--amber-bg,rgba(239,159,39,.1));border:1px solid var(--amber-border,rgba(239,159,39,.3));border-radius:var(--radius);font-size:var(--t-sm);line-height:1.5;color:var(--text)}
.query-fail-banner.visible{display:flex}
.query-fail-banner .qfb-icon{color:var(--amber,#EF9F27);flex-shrink:0;font-size:var(--t-md);line-height:1.4}
.query-fail-banner strong{color:var(--amber,#EF9F27)}
#run-btn{margin:12px 14px 0;display:flex;align-items:center;justify-content:center;gap:8px;padding:10px;background:var(--brand-grad);color:#fff;border:none;border-radius:var(--radius);font-size:var(--t-base);font-weight:600;cursor:pointer;width:calc(100% - 28px);transition:filter .15s}
#run-btn:hover{filter:brightness(1.08)}
#run-btn:disabled{background:var(--divider);color:var(--text-dim);cursor:not-allowed}
#legal-panel{margin:8px 14px;padding:10px 12px;background:var(--red-bg);border:1px solid var(--red-border);border-radius:var(--radius);display:none}
#legal-panel.visible{display:block}
.legal-hdr{display:flex;align-items:center;gap:8px;margin-bottom:8px}
.legal-hdr-title{font-size:var(--t-sm);font-weight:600;color:var(--red);flex:1}
.legal-cnt{font-size:var(--t-xs);font-weight:600;padding:1px 7px;border-radius:var(--r-xs);background:var(--red-dim);color:var(--red);border:1px solid var(--red-border)}
.trig-row{background:rgba(255,255,255,.04);border:1px solid rgba(240,149,149,.2);border-radius:var(--r-sm);padding:7px 10px;margin-bottom:4px}
.trig-row:last-child{margin-bottom:0}
.trig-name{font-size:var(--t-sm);font-weight:600;color:var(--red);margin-bottom:2px}
.trig-action{font-size:var(--t-xs);color:var(--red);margin-bottom:4px}
.trig-link{font-size:var(--t-xs);color:var(--teal);cursor:pointer;text-decoration:underline}
/* ── Regulatory matrix cards ── */
.matrix-card{background:rgba(255,255,255,.03);border:1px solid rgba(240,149,149,.18);border-radius:var(--r-md);margin-bottom:6px;overflow:hidden}
.matrix-card:last-child{margin-bottom:0}
.matrix-card-hdr{background:rgba(240,149,149,.09);border-bottom:1px solid rgba(240,149,149,.15);padding:7px 10px;display:flex;align-items:center;gap:7px}
.matrix-card-name{font-size:var(--t-sm);font-weight:600;color:var(--red);flex:1;line-height:1.3}
.matrix-rows{padding:7px 10px 9px;display:flex;flex-direction:column;gap:4px}
.matrix-row{display:flex;gap:0;font-size:var(--t-xs);line-height:1.45}
.matrix-key{color:var(--text-dim);width:76px;flex-shrink:0;padding-top:1px;font-size:var(--t-xs);text-transform:uppercase;letter-spacing:.03em}
.matrix-val{color:var(--text-muted);flex:1}
.matrix-note{font-size:var(--t-xs);color:var(--text-dim);background:rgba(255,255,255,.03);border-radius:var(--r-xs);padding:5px 7px;margin-top:4px;line-height:1.5}
.matrix-link-row{margin-top:6px}
.matrix-link{font-size:var(--t-xs);color:var(--teal);text-decoration:none;display:inline-flex;align-items:center;gap:3px}
.matrix-link:hover{text-decoration:underline}
.rg{border-bottom:1px solid var(--divider)}
.rg-hdr{display:flex;align-items:center;gap:8px;padding:8px 14px;cursor:pointer;background:var(--navy-mid);transition:background .1s}
.rg-hdr:hover{background:var(--navy-mid)}
.rg-dot{width:8px;height:8px;border-radius:2px;flex-shrink:0}
.rg-name{font-size:var(--t-sm);font-weight:500;color:var(--text-muted);flex:1}
.rg-cnt{font-size:var(--t-2xs);font-weight:600;padding:1px 6px;border-radius:var(--r-lg)}
.rg-chev{font-size:var(--t-sm);color:var(--text-faint)}
.rg-items{display:none}
.rg-items.expanded{display:block}
/* ── Severity sections ────────────────────────────────────────────────────────
   Top-level split by consequence. The coloured rule carries the signal so the header
   text can stay quiet — amber for statutory, neutral for everything else. */
.sev-sec{margin-bottom:var(--s7)}
.sev-hdr{display:flex;align-items:center;gap:var(--s2);padding:0 var(--s4) var(--s2);
  font-size:var(--t-2xs);text-transform:uppercase;letter-spacing:.1em;font-weight:700}
.sev-bar{width:16px;height:3px;border-radius:var(--r-pill);flex-shrink:0}
.sev-stat .sev-bar{background:var(--amber)}
.sev-stat .sev-name{color:var(--amber)}
.sev-other .sev-bar{background:var(--text-faint)}
.sev-other .sev-name{color:var(--text-muted)}
.sev-note{text-transform:none;letter-spacing:0;font-weight:400;color:var(--text-faint);
  font-size:var(--t-2xs);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.sev-cnt{margin-left:auto;color:var(--text-faint);font-weight:700;flex-shrink:0}
/* Statutory findings sit flat and undivided — no category chrome between them. */
.sev-stat .sev-items>.lyr-hdr:first-of-type{border-top:none}

/* ── Finding card ─────────────────────────────────────────────────────────────
   Each result reads as a card: title row, a secondary line saying what the dataset is
   and how current, then its measured extent. A left stripe + "Statutory" tag mark hits
   carrying a legislative trigger, so the consequential ones are scannable. The stripe
   colour is the same factual signal as the verdict card — not a risk rating. */
.lyr-hdr{position:relative;display:flex;align-items:flex-start;gap:var(--s3);padding:10px var(--s4) 10px 17px;
  background:var(--navy-mid);border-top:2px solid var(--divider);font-size:var(--t-sm);transition:background .12s}
.lyr-hdr:hover{background:var(--navy-light)}
.lyr-hdr::before{content:"";position:absolute;left:0;top:0;bottom:0;width:3px;background:transparent}
.lyr-hdr.is-statutory::before{background:var(--amber)}
/* Category glyph in a tinted disc — the concept's left-hand icon. Colour comes from the
   category via inline background/border, so it matches the tile and the map legend. */
.lyr-ico{flex-shrink:0;width:26px;height:26px;border-radius:var(--r-lg);border:1px solid;
  display:flex;align-items:center;justify-content:center;font-size:var(--t-md);line-height:1}
.lyr-main{flex:1;min-width:0;display:flex;flex-direction:column;gap:3px}
.lyr-title-row{display:flex;align-items:baseline;gap:var(--s2);flex-wrap:wrap}
/* Plain-English implication — what the designation means procedurally. */
.lyr-impl{margin-top:var(--s1);padding:var(--s2) var(--s3);border-radius:var(--r-sm);
  background:var(--navy-dark);border-left:2px solid var(--divider);
  font-size:var(--t-2xs);line-height:1.45;color:var(--text-muted)}
.lyr-hdr.is-statutory .lyr-impl{border-left-color:var(--amber);color:var(--text-dim)}
.lyr-hdr-name{font-weight:600;color:var(--text-muted);line-height:1.3}
.lyr-hdr.is-statutory .lyr-hdr-name{color:var(--text)}
.lyr-tag{flex-shrink:0;font-size:9px;text-transform:uppercase;letter-spacing:.06em;font-weight:700;
  padding:2px 6px;border-radius:var(--r-pill);line-height:1.3}
.lyr-tag.stat{color:var(--amber);background:var(--amber-dim);border:1px solid var(--amber-border)}
/* Line 2: provenance text, then the measured-extent chip, download pushed to the right. */
/* nowrap is deliberate: the provenance text shrinks and ellipsises (below) so the extent
   chip, count and download hold their place on one line even when the panel is dragged
   narrow. With wrap enabled they dropped to a second line and the card grew to 3–4 lines. */
.lyr-sub{display:flex;align-items:center;gap:var(--s2);flex-wrap:nowrap;
  font-size:var(--t-2xs);color:var(--text-faint);line-height:1.4}
/* Shrinks and ellipsises before anything else on the row, so the extent chip, count and
   download never wrap to a third line no matter how narrow the panel gets. */
.lyr-sub-txt{flex:0 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;cursor:help}
.lyr-sub .lyr-hdr-cnt{margin-left:auto}
.lyr-hdr-cnt{margin-left:auto;font-size:var(--t-2xs);color:var(--text-faint);white-space:nowrap}
.lyr-hdr-ov{font-size:var(--t-2xs);color:var(--teal);background:rgba(45,212,170,.12);border:1px solid rgba(45,212,170,.3);border-radius:var(--r-xs);padding:1px 5px;white-space:nowrap;flex-shrink:0}
.lyr-hdr-fresh{font-size:var(--t-xs);color:var(--text-faint);cursor:help;flex-shrink:0}
.lyr-dl-btn{flex-shrink:0;font-size:var(--t-2xs);font-weight:600;padding:2px 7px;border:1px solid var(--teal-border);border-radius:var(--r-sm);background:var(--teal-dim);color:var(--teal);cursor:pointer;transition:background .15s;white-space:nowrap}
.lyr-dl-btn:hover{background:rgba(29,158,117,0.35)}
.feat-col-hdr{display:grid;grid-template-columns:2fr 2fr 1fr;gap:6px;padding:4px 14px 4px 24px;background:var(--navy-dark);border-top:1px solid var(--divider)}
.feat-col-h{font-size:var(--t-2xs);font-weight:600;color:var(--text-faint);text-transform:uppercase;letter-spacing:.05em;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.feat-col-h-r{text-align:right}
.feat-row{display:grid;grid-template-columns:2fr 2fr 1fr;align-items:center;gap:6px;padding:5px 14px 5px 24px;border-top:1px solid var(--divider);font-size:var(--t-sm);cursor:pointer;transition:background .1s}
.feat-row:hover{background:rgba(255,255,255,.03)}
.feat-flag{color:var(--red);flex-shrink:0;font-size:var(--t-xs)}
.feat-col{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;line-height:1.4}
.feat-name{color:var(--text-muted)}
.feat-secondary{color:var(--text-dim);font-style:italic}
.feat-tertiary{color:var(--teal);font-size:var(--t-xs);text-align:right}

/* (a second .res-hdr rule lived here and silently overrode align-items on the canonical
   definition at the top of this file — folded in, justify-content was the only new bit.) */

#update-results-banner{display:none;padding:0 14px;margin-top:8px}
#update-results-btn{width:100%;display:flex;align-items:center;justify-content:center;gap:6px;padding:7px 10px;background:var(--teal-dim);border:1px solid var(--teal-border);border-radius:var(--radius);color:var(--amber);font-size:var(--t-base);font-weight:600;cursor:pointer;font-family:inherit;transition:background .15s ease}
#update-results-btn{background:rgba(239,159,39,0.15);border-color:rgba(239,159,39,0.4);color:var(--amber)}
#update-results-btn:hover{background:rgba(239,159,39,0.25)}
#update-results-btn.all-in{background:var(--teal-dim);border-color:var(--teal-border);color:var(--teal)}
#update-results-btn.all-in:hover{background:rgba(29,158,117,0.25)}
#update-results-btn .uri{font-size:var(--t-md)}

#partial-report-notice{display:none;font-size:var(--t-xs);color:var(--amber);margin:2px 0 4px}
#partial-report-notice label{display:flex;align-items:center;gap:6px;cursor:pointer}
#partial-report-notice input{accent-color:var(--amber);cursor:pointer}

/* z-index TIER SCALE — every full-viewport overlay in this file must sit above 15000.
   Current tiers, lowest to highest:
     15000            results-expand-overlay (popped-out Results tab — see below)
     15050-15051      finding-detail popup (.fpop/.fpop-ov)
     15100-15110      onboarding/tour (welcome, wizard-arrow, tour-*, guided-intro)
     15200-15400      true action modals (mapmaker, wizard-overlay, report-overlay)
     20000+           auth/about gates (must always win)
   results-expand-overlay sits at the floor rather than sharing the finding-popup tier so a
   finding's own detail popup (.fpop) can still render on top of it if opened while expanded. */
/* align-items:flex-start (not center) + a top padding that clears the 80px topbar with room to
   spare — a pure vh-based max-height risked the box's centered top edge landing above the
   viewport (behind/under the topbar) on shorter windows. max-height is sized off the same
   top offset so the box can never run past the bottom of the viewport either. */
#results-expand-overlay{display:none;position:fixed;inset:0;z-index:15000;align-items:flex-start;justify-content:center;padding:104px 24px 24px;background:rgba(7,13,20,0.72);backdrop-filter:blur(4px)}
body.results-expanded #results-expand-overlay{display:flex}
.rxo-box{width:100%;max-width:1100px;max-height:calc(100vh - 128px);background:var(--navy);border:1px solid var(--divider);border-radius:var(--r-xl);box-shadow:0 30px 80px rgba(0,0,0,.5);display:flex;flex-direction:column;overflow:hidden}
.rxo-hdr{flex-shrink:0;display:flex;align-items:center;justify-content:space-between;padding:12px 16px;border-bottom:1px solid var(--divider);background:var(--navy-dark)}
.rxo-hdr-text{display:flex;flex-direction:column;gap:2px;min-width:0}
.rxo-title{font-size:var(--t-lg);font-weight:700;color:var(--text)}
.rxo-subtitle{font-size:var(--t-sm);color:var(--text-muted);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.rxo-subtitle strong{color:var(--text-dim)}
.rxo-close{font-size:var(--t-sm);padding:6px 12px;background:var(--navy-mid);border:1px solid var(--divider);border-radius:var(--r-md);color:var(--text-muted);cursor:pointer;font-family:inherit}
.rxo-close:hover{border-color:var(--teal);color:var(--teal)}
.rxo-hdr-btns{display:flex;align-items:center;gap:8px;flex-shrink:0}
.rxo-fullpage-btn{font-size:var(--t-sm);padding:6px 12px;background:var(--navy-mid);border:1px solid var(--divider);border-radius:var(--r-md);color:var(--text-muted);cursor:pointer;font-family:inherit}
.rxo-fullpage-btn:hover{border-color:var(--teal);color:var(--teal)}
/* Full-page mode drops the 1100px cap and most of the side/bottom padding, but keeps a
   floor on the TOP padding roughly matching the topbar's own height (80px) — the topbar
   sits above the overlay by z-index, but letting the box's own header physically overlap
   that same screen region made its buttons (Collapse, Full page) unclickable, something
   else there was winning the hit-test at that exact point. Simplest robust fix: never let
   the box occupy the topbar's row at all, full-page or not. */
body.results-fullpage #results-expand-overlay{padding:88px 16px 16px}
body.results-fullpage .rxo-box{max-width:none;max-height:calc(100vh - 104px)}
#results-expand-mount{flex:1;display:flex;flex-direction:column;min-height:0;overflow:hidden;padding:12px 16px}
#results-expand-btn{flex-shrink:0;display:none;align-items:center;justify-content:center;width:26px;height:26px;background:var(--navy-mid);border:1px solid var(--divider);border-radius:var(--r-md);color:var(--text-dim);cursor:pointer;font-family:inherit;transition:color .15s ease,border-color .15s ease}
#results-expand-btn:hover{color:var(--teal);border-color:var(--teal-border)}
#results-expand-btn .rxi{font-size:var(--t-md)}
body.results-expanded #results-expand-btn{display:none !important}
/* Docked: #results-cols just stacks the findings above the actions rail in one column, same
   as the plain single-column layout already had. Only body.results-expanded (via the popout
   above) splits it into a wider findings column + a narrower actions column side by side. */
#results-cols{flex:1;display:flex;flex-direction:column;min-height:0;overflow:hidden}
/* The findings column's fixed children (#tgrid ~136px + the two toolbars ~79px) already
   exceed the space this column gets once the verdict card is above it, which starved
   #feat-register — the actual findings list — to ZERO height on a 1000px-tall window.
   Guarantee the list a usable floor and let the column itself scroll, so the tile grid
   scrolls out of the way rather than the findings disappearing. */
#results-col-findings{flex:1;display:flex;flex-direction:column;min-height:0;overflow-y:auto}
#results-col-findings > #feat-register{min-height:240px}
#results-col-actions{flex-shrink:0}
body.results-expanded #results-cols{flex-direction:row;gap:14px}
body.results-expanded #results-col-findings{flex:1.3}
body.results-expanded #results-col-actions{flex:1;overflow-y:auto;border-left:1px solid var(--divider);padding-left:14px}
/* Forward step out of Review. Was an inline style blob on the button (rule 6b) — same
   appearance, now a class. Sits first in the actions rail. */
#report-setup-band{padding:var(--s4) var(--s6) 0}
.res-report-cta{width:100%;display:flex;align-items:center;justify-content:center;gap:var(--s3);
  padding:var(--s4) var(--s5);background:var(--brand-grad);color:#fff;border:none;
  border-radius:var(--r-md);font-size:var(--t-md);font-weight:600;cursor:pointer;
  font-family:inherit;transition:filter .15s}
.res-report-cta:hover{filter:brightness(1.07)}
.rrc-arr{opacity:.85}

#proximity-bar{display:flex;align-items:center;gap:6px;padding:var(--s3) var(--s6);margin-top:var(--s3);border-top:1px solid var(--divider)}
#prox-btn{flex:1;padding:7px 10px;background:var(--navy-mid);border:1px solid var(--divider);border-radius:var(--r-md);color:var(--text);font-size:var(--t-sm);cursor:pointer;white-space:nowrap}
#prox-btn:hover{border-color:var(--teal);color:var(--teal)}
#prox-btn:disabled{opacity:.6;cursor:not-allowed}
#prox-radius{padding:7px 6px;background:var(--navy);border:1px solid var(--divider);border-radius:var(--r-md);color:var(--text);font-size:var(--t-sm);cursor:pointer}
#prox-status{font-size:var(--t-xs);color:var(--text-faint);white-space:nowrap;flex-shrink:0}
.prox-row{display:flex;align-items:center;gap:8px;padding:6px 14px;border-top:1px solid var(--divider);font-size:var(--t-sm)}
.prox-name{flex:1;color:var(--text-muted)}
.prox-dist{color:var(--teal);white-space:nowrap;font-weight:600}
#results-toolbar{flex-shrink:0;display:flex;gap:6px;padding:8px 14px;border-top:1px solid var(--divider);border-bottom:1px solid var(--divider);background:var(--navy)}
#results-toolbar #results-filter{flex:1;min-width:0;padding:6px 9px;background:var(--navy-dark);border:1px solid var(--divider);border-radius:var(--r-md);color:var(--text);font-size:var(--t-base)}
#results-toolbar #results-filter::placeholder{color:var(--text-faint)}
#results-toolbar #results-sort{flex-shrink:0;padding:6px 8px;background:var(--navy-dark);border:1px solid var(--divider);border-radius:var(--r-md);color:var(--text);font-size:var(--t-base);cursor:pointer}
/* results toolbar row 2 — triggers-only + expand/collapse all */
#results-toolbar{border-bottom:none;padding:8px 14px 6px}
#results-toolbar2{flex-shrink:0;display:flex;align-items:center;gap:8px;padding:0 14px 8px;border-bottom:1px solid var(--divider);background:var(--navy)}
.res-toggle-btn{display:inline-flex;align-items:center;gap:5px;font-size:var(--t-sm);font-weight:600;padding:4px 10px;border:1px solid var(--divider);border-radius:var(--r-md);background:var(--navy-dark);color:var(--text-dim);cursor:pointer;transition:all .12s}
.res-toggle-btn:hover{border-color:var(--text-dim)}
.res-toggle-btn.active{background:var(--red-bg);border-color:var(--red-border);color:var(--red)}
.res-expand-btn{margin-left:auto;font-size:var(--t-sm);font-weight:500;padding:4px 6px;border:none;background:none;color:var(--teal);cursor:pointer}
.res-expand-btn:hover{text-decoration:underline}
/* collapsible layer cards */
.lyr-hdr{cursor:pointer}
/* Background/reference entries have no .lyr-main wrapper — keep the old single-row layout. */
.lyr-hdr-static{cursor:default;align-items:center}
.lyr-hdr-static .lyr-hdr-name{flex:1}
.lyr-chev{font-size:var(--t-2xs);color:var(--text-faint);flex-shrink:0;transition:transform .12s;width:10px;text-align:center;line-height:1.6}
.lyr-hdr.expanded .lyr-chev{transform:rotate(90deg)}
.lyr-features{display:none}
.lyr-features.expanded{display:block}
/* collapsible regulatory trigger cards */
.matrix-card-hdr{cursor:pointer}
.matrix-chev{font-size:var(--t-2xs);color:var(--red);flex-shrink:0;transition:transform .12s;width:10px;text-align:center}
.matrix-card.expanded .matrix-chev{transform:rotate(90deg)}
.matrix-rows{display:none}
.matrix-card.expanded .matrix-rows{display:flex}
.matrix-card-tag{font-size:var(--t-2xs);color:var(--red);opacity:.75;white-space:nowrap;flex-shrink:0;font-weight:500}
#export-bar{padding:10px 14px;border-top:1px solid var(--divider);background:var(--navy-dark);display:flex;flex-direction:row;gap:6px}
#export-bar .btn{font-size:var(--t-sm);padding:7px 12px}
#no-results{padding:32px 20px;text-align:center;color:var(--text-dim)}
#no-results .nr-icon{font-size:32px;margin-bottom:10px}
#no-results p{font-size:var(--t-base);line-height:1.6}
/* ── RE species panel ── */
#re-species-panel{margin:8px 14px;border:1px solid var(--teal-border);border-radius:var(--radius);overflow:hidden;display:none}
#re-species-panel.visible{display:block}
.rsp-hdr{background:var(--teal-dim);padding:8px 12px;display:flex;align-items:center;gap:8px;cursor:pointer}
.rsp-hdr-title{font-size:var(--t-sm);font-weight:600;color:var(--teal);flex:1;background:var(--brand-grad);-webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:transparent}
.rsp-cnt{font-size:var(--t-xs);font-weight:600;padding:1px 7px;border-radius:var(--r-xs);background:rgba(29,158,117,.2);color:var(--teal);border:1px solid var(--teal-border)}
.rsp-chev{font-size:var(--t-sm);color:var(--teal)}
.rsp-body{display:none;padding:6px 0}
.rsp-body.expanded{display:block}
.rsp-disc{font-size:var(--t-xs);color:var(--text-faint);padding:4px 12px 8px;border-bottom:1px solid var(--divider);line-height:1.5}
.rsp-subsect{font-size:var(--t-xs);font-weight:700;color:var(--text-dim);text-transform:uppercase;letter-spacing:.06em;padding:7px 12px 3px;border-bottom:1px solid var(--divider);display:flex;align-items:center;gap:6px}
.rsp-subsect-badge{font-size:var(--t-3xs);font-weight:600;padding:1px 5px;border-radius:var(--r-xs);background:rgba(255,255,255,.08);color:var(--text-dim);border:1px solid var(--divider)}
.rsp-re-group{border-bottom:1px solid var(--divider)}
.rsp-re-group:last-child{border-bottom:none}
.rsp-re-hdr{display:flex;align-items:center;gap:8px;padding:7px 12px;cursor:pointer;transition:background .1s}
.rsp-re-hdr:hover{background:rgba(255,255,255,.03)}
.rsp-re-code{font-size:var(--t-xs);font-weight:700;color:var(--teal);flex-shrink:0;font-family:monospace}
.rsp-re-desc{font-size:var(--t-xs);color:var(--text-dim);flex:1;line-height:1.3}
.rsp-re-chev{font-size:var(--t-xs);color:var(--text-faint)}
.rsp-sp-list{display:none;padding:0 12px 8px 28px}
.rsp-sp-list.expanded{display:block}
.rsp-sp-row{display:flex;align-items:baseline;gap:8px;padding:3px 0;border-top:1px solid rgba(255,255,255,.04)}
.rsp-sp-name{font-size:var(--t-xs);color:var(--text-muted);flex:1;font-style:italic}
.rsp-sp-badge{font-size:var(--t-2xs);font-weight:600;padding:1px 6px;border-radius:var(--r-xs);white-space:nowrap;flex-shrink:0}
.rsp-badge-e{background:rgba(192,56,48,.2);color:var(--red);border:1px solid rgba(192,56,48,.3)}
.rsp-badge-v{background:rgba(239,159,39,.15);color:var(--amber);border:1px solid rgba(239,159,39,.25)}
.rsp-badge-nt{background:rgba(29,158,117,.15);color:var(--teal);border:1px solid var(--teal-border)}
.rsp-badge-t{background:rgba(255,255,255,.07);color:var(--text-dim);border:1px solid var(--divider)}
/* WildNet species panel */
#wildnet-panel{border-top:2px solid var(--divider)}
.wn-hdr{display:flex;align-items:center;gap:8px;padding:9px 14px;background:var(--navy-dark);border-bottom:1px solid var(--divider)}
.wn-hdr-title{font-size:var(--t-xs);font-weight:700;color:var(--text-dim);text-transform:uppercase;letter-spacing:.07em;flex:1}
.wn-hdr-badge{font-size:var(--t-2xs);font-weight:600;padding:2px 8px;border-radius:var(--r-lg);background:rgba(255,255,255,.07);color:var(--text-dim);border:1px solid var(--divider);white-space:nowrap}
.wn-alert{margin:8px 14px;padding:8px 12px;border-radius:var(--radius);background:var(--red-bg);border:1px solid var(--red-border);font-size:var(--t-sm);color:var(--red);line-height:1.5}
.wn-subsect{display:flex;align-items:center;gap:8px;font-size:var(--t-2xs);font-weight:700;color:var(--text-faint);text-transform:uppercase;letter-spacing:.07em;padding:8px 14px 4px;border-bottom:1px solid var(--divider)}
.wn-sp-row{display:grid;grid-template-columns:1.6fr 1.6fr 1fr auto;align-items:center;gap:6px;padding:5px 14px;border-top:1px solid var(--divider);font-size:var(--t-sm)}
.wn-sp-clickable{cursor:pointer}
.wn-sp-clickable:hover{background:var(--hover)}
.wn-sp-active{background:color-mix(in srgb,var(--teal) 10%,transparent)!important}
.wn-sp-chevron{font-size:var(--t-2xs);color:var(--text-faint);justify-self:end}
.wn-rec-list{background:var(--surface2);border-top:1px solid var(--divider);border-bottom:1px solid var(--divider);padding:4px 0}
.wn-rec-hdr{padding:5px 14px 4px;font-size:var(--t-xs);color:var(--text-faint);border-bottom:1px solid var(--divider);font-style:italic}
.wn-rec-row{display:grid;grid-template-columns:28px 80px 1fr auto;align-items:center;gap:6px;padding:4px 14px;font-size:var(--t-xs);color:var(--text-sub)}
.wn-rec-row:hover{background:var(--hover)}
.wn-rec-num{color:var(--text-faint);font-size:var(--t-2xs)}
.wn-rec-date{font-weight:600;color:var(--text)}
.wn-rec-basis{color:var(--text-faint);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.wn-rec-locate{background:none;border:1px solid var(--divider);border-radius:var(--r-sm);cursor:pointer;padding:1px 5px;font-size:var(--t-sm);color:var(--text);flex-shrink:0}
.wn-rec-locate:hover{background:var(--brand-grad);color:#fff;border-color:transparent}
.wn-sp-com{color:var(--text-muted);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.wn-sp-sci{color:var(--text-dim);font-style:italic;font-size:var(--t-xs);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.wn-sp-badge{font-size:var(--t-2xs);font-weight:600;padding:2px 6px;border-radius:var(--r-xs);white-space:normal;line-height:1.3;text-align:right}
/* popup */
.fpop{position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);z-index:15051;background:var(--navy-mid);border:1px solid var(--divider);border-radius:var(--r-xl);padding:0;max-width:420px;width:90vw;max-height:65vh;overflow:hidden;box-shadow:0 12px 40px rgba(0,0,0,.55);display:flex;flex-direction:column;animation:fInCenter .18s cubic-bezier(.2,.8,.2,1) both}
.fpop-ov{animation:fadeBg .18s ease both}
.fpop-hdr{display:flex;align-items:center;gap:10px;padding:14px 16px;border-bottom:1px solid var(--divider);background:var(--navy-dark);flex-shrink:0}
.fpop-title{font-size:var(--t-md);font-weight:600;flex:1;color:var(--text);line-height:1.4}
.fpop-close{background:none;border:none;color:var(--text-faint);cursor:pointer;font-size:var(--t-xl);padding:2px 6px;border-radius:var(--r-sm);transition:all .15s;flex-shrink:0}
.fpop-close:hover{color:var(--text);background:rgba(255,255,255,.06)}
.fpop-body{overflow-y:auto;padding:6px 16px 14px}
.fpop-row{padding:9px 0;border-bottom:1px solid var(--divider)}
.fpop-row:last-child{border-bottom:none}
.fpop-key{font-size:var(--t-xs);color:var(--text-faint);text-transform:uppercase;letter-spacing:.04em;margin-bottom:3px}
.fpop-val{font-size:var(--t-base);color:var(--text-muted);line-height:1.45;word-break:break-word}
.fpop-empty{font-size:var(--t-sm);color:var(--text-faint);padding:14px 0;text-align:center}
.fpop-ov{position:fixed;inset:0;z-index:15050;background:rgba(8,14,22,.45)}

/* export-bar's gap/margin were inline (rule 6b). display is left to JS, which sets flex. */
#export-bar{gap:var(--s2);padding:0 var(--s6);margin-top:var(--s2)}

/* Same as .define-cta — matched to the ordinary button height. Declared here because
   results.css loads after base.css and carries this class's own earlier padding. */
.res-report-cta{padding:5px 12px;font-size:var(--t-sm);gap:var(--s2)}
.rrc-arr{font-size:var(--t-base)}

/* ── Constraint rating + graded findings ─────────────────────────────────────
   The rating comes from reportRisk() via js/severity.js — the same call the PDF makes — so
   the panel and the report state one level for one screen. Colour maps to the report's own
   RISK_STYLE hues so a reader moving between the two isn't relearning the scale. */
.vc-rating{display:flex;align-items:baseline;gap:var(--s3);margin-bottom:var(--s2)}
.vc-lvl{font-size:var(--t-3xl);font-weight:800;line-height:1;letter-spacing:-.02em;color:var(--rc)}
.vc-lvl-k{font-size:var(--t-2xs);text-transform:uppercase;letter-spacing:.08em;font-weight:700;color:var(--text-faint)}
.vc-lvl-high{--rc:var(--red)} .vc-lvl-moderate{--rc:var(--amber)}
.vc-lvl-low{--rc:var(--green)} .vc-lvl-minimal{--rc:var(--text-dim)}
/* The published reason, verbatim from reportRisk().levelReason — the reader can check the
   rating against the rule table printed in the report. */
.vc-why{font-size:var(--t-xs);color:var(--text-muted);line-height:1.5;margin-bottom:var(--s4)}
.vc-sev-split{display:flex;flex-wrap:wrap;gap:var(--s2);margin-bottom:var(--s4)}
.vcs{font-size:var(--t-2xs);font-weight:600;padding:2px var(--s3);border-radius:var(--r-pill);
  background:var(--sc-bg);border:1px solid var(--sc-bd);color:var(--sc-fg)}
.vcs b{font-weight:800;font-variant-numeric:tabular-nums}

/* Per-finding grade pill and its section heading share one colour set. */
.sev-high{--sc-bg:var(--red-dim);--sc-bd:var(--red-border);--sc-fg:var(--red)}
.sev-mod{--sc-bg:var(--amber-dim);--sc-bd:var(--amber-border);--sc-fg:var(--amber)}
.sev-low{--sc-bg:var(--teal-dim);--sc-bd:var(--teal-border);--sc-fg:var(--green)}
.sev-near{--sc-bg:var(--surface-tint);--sc-bd:var(--divider);--sc-fg:var(--text-dim)}
.lyr-sev{flex-shrink:0;font-size:var(--t-3xs);font-weight:800;letter-spacing:.06em;
  padding:1px 5px;border-radius:var(--r-xs);background:var(--sc-bg);border:1px solid var(--sc-bd);color:var(--sc-fg)}
.sev-sec .sev-bar{background:var(--sc-fg)}
.sev-sec .sev-name{color:var(--sc-fg)}

/* Progressive disclosure in Review. Two drawers, both shut on arrival: refinement tools and
   side errands. The verdict card, the graded sections and "Set up your report" stay exposed
   — those are the finding and the way forward. */
.res-more{border-top:1px solid var(--divider);margin-top:var(--s3)}
.res-more-sum{list-style:none;cursor:pointer;padding:var(--s3) var(--s4);display:flex;align-items:center;
  justify-content:space-between;font-size:var(--t-xs);font-weight:600;color:var(--text-dim)}
.res-more-sum::-webkit-details-marker{display:none}
.res-more-sum:hover{color:var(--text)}
.res-more-arr{transition:transform .16s ease;font-size:var(--t-md)}
.res-more[open] .res-more-arr{transform:rotate(90deg)}

/* Re-run, in the header. Deliberately a quiet icon next to Expand, not a second primary
   button: once results exist the forward move is "Set up your report", and re-running is a
   correction. Sized to match #results-expand-btn so the pair reads as one control group. */
#results-rerun-btn{flex:0 0 auto;width:26px;height:26px;padding:0;display:flex;align-items:center;
  justify-content:center;background:none;border:1px solid var(--divider);border-radius:var(--r-md);
  color:var(--text-dim);font-family:inherit;font-size:var(--t-lg);line-height:1;cursor:pointer;
  transition:color .15s,border-color .15s}
#results-rerun-btn:hover{color:var(--teal);border-color:var(--teal)}
#results-rerun-btn:focus-visible{outline:2px solid var(--teal);outline-offset:2px}

/* ── Run animation: the tiles are the progress display ────────────────────────
   Replaces the radar sweep that used to play over the map. That was decoration — it told you
   nothing about how far through ~300 layers a run actually was. These do: each tile shimmers
   while its category is being queried, then settles with a brief lift as its number lands. */
.tc .tc-icon svg{width:16px;height:16px;stroke:currentColor;fill:none;stroke-width:1.4;
  stroke-linecap:round;stroke-linejoin:round;display:block}
.tc-scanning{position:relative;overflow:hidden}
/* A single band travelling across the tile — one moving element, not a pulsing background,
   so five of these side by side read as one coordinated sweep rather than five blinking boxes. */
.tc-scanning::after{content:'';position:absolute;inset:0;pointer-events:none;
  background:linear-gradient(105deg,transparent 30%,var(--surface-tint) 50%,transparent 70%);
  background-size:220% 100%;animation:tcScan 1.15s linear infinite}
@keyframes tcScan{from{background-position:180% 0}to{background-position:-80% 0}}
/* Settle: the count lands, the tile lifts a touch and returns. Short enough to read as
   "done" rather than as an effect. */
@keyframes tcSettle{0%{transform:translateY(3px);opacity:.5}60%{transform:translateY(-1px)}100%{transform:none;opacity:1}}
.tc-settled .tc-cnt{animation:tcSettle .34s cubic-bezier(.2,.8,.2,1) both}
/* Nothing found is information too, but it shouldn't shout — a category that returned zero
   recedes instead of sitting at a stark 0. */
.tc-none{opacity:.55}
@media (prefers-reduced-motion:reduce){
  .tc-scanning::after{animation:none;background:var(--surface-tint)}
  .tc-settled .tc-cnt{animation:none}
}

/* ── Three tiers: spine · panel · expand ──────────────────────────────────────
   Docked, Review shows what you must act on — High and Moderate. The Low tail and the
   proximity band are hidden here and live in the expand, which is the point of the expand:
   before this, both views rendered identical content, so expanding bought width and nothing
   else. Scoped by :not(.results-expanded) so opening the wide view reveals everything with
   no second render path to keep in step. */
body:not(.results-expanded) #sev-low,
body:not(.results-expanded) #sev-nearby{display:none}
body.results-expanded .sev-see-all{display:none}

/* The way in. Full-width and quiet — it is a route to more detail, not a competing action
   against "Set up your report". */
.sev-see-all{display:block;width:calc(100% - var(--s9));margin:var(--s4) auto var(--s2);
  padding:var(--s3) var(--s5);background:none;border:1px dashed var(--divider);
  border-radius:var(--r-lg);color:var(--text-dim);font-family:inherit;font-size:var(--t-xs);
  font-weight:600;cursor:pointer;transition:color .15s,border-color .15s}
.sev-see-all:hover{color:var(--teal);border-color:var(--teal-border);border-style:solid}
