/* ================= THEME TOKENS ================= */
/* RentSpire — Palantir Foundry visual language, ported verbatim from
   rentspire-bspain/spain-terminal-v2 client/src/index.css. Light-first (Foundry
   light) with a real dark mode (the "Common Operating Picture" look). The app's
   legacy variable names are kept and repointed onto the --ft-* Foundry palette so
   every existing component re-skins in one stroke. */
:root{
  /* ------------------------------------------------------------------
     CONTRAST PASS 2026-08-04 (Brett: "everything is whitewashed and
     non-contrasting"). The old light palette put #14181d text on a pure
     #ffffff page with #d8dee4 hairlines -- panels had no edge, dividers
     were invisible at 1px, and the accent blue (#2d72d2, 4.4:1 on white)
     failed AA as body-size text. This palette is a terminal palette: the
     PAGE is a mid grey so white data panels read as panels, hairlines are
     load-bearing (>=3:1 against every surface they sit on), and every
     foreground token clears 4.5:1 on every surface it is used on.
     Ratios are computed, not eyeballed -- see rr-pro-wcag-check.py.
     Change tokens here; never scatter one-off hex values in components.
     ------------------------------------------------------------------ */
  /* Civic Modern PHA aliases (task-spec token names, mapped onto the canonical Foundry palette) */
  --pha-blue:#1a56a4;
  --pha-text:#0a0d11;
  --pha-hairline:#6f7b89;

  /* Foundry semantic tokens (canonical) */
  --ft-app-bg:#e3e8ef;        /* page canvas -- deliberately NOT white */
  --ft-canvas:#d5dbe4;        /* recessed rails / strips */
  --ft-rail:#d5dbe4;
  --ft-card:#ffffff;          /* data panel */
  --ft-sunken:#eceff4;        /* inset block inside a panel */
  --ft-input-bg:#ffffff;      /* form controls stay white on the grey page */
  --ft-hairline:#6f7b89;      /* 4.31:1 on card, 3.50:1 on page, 3.74:1 on sunken */
  --ft-hairline-soft:#c3cbd4; /* decorative inner rule only -- never a component edge */
  --ft-hairline-strong:#4a5561;
  --ft-text:#0a0d11;          /* 19.47:1 on card */
  --ft-text-secondary:#1d262f;/* 15.32:1 on card */
  --ft-text-muted:#3b4652;    /*  9.62:1 on card, 6.91:1 on canvas */
  --ft-blue:#1a56a4;          /*  7.21:1 on card (was #2d72d2 @ 4.40:1 = AA fail) */
  --ft-blue-solid:#1a56a4;    /* button fill; white on it = 7.21:1 */
  --ft-blue-hover:#123f7c;
  --ft-link:#123f7c;
  --ft-bar:#1a56a4;
  --ft-green:#106339;
  --ft-green-bg:#d3ead9;
  --ft-amber:#82500a;
  --ft-amber-bg:#f3e4c8;
  --ft-red:#a51d24;
  --ft-red-bg:#f5dadb;
  --ft-cyan:#0a5675;
  --ft-cyan-bg:#d6e9f3;
  --ft-purple:#55309f;
  --ft-purple-bg:#e2daf5;
  --ft-sel-row:#d3e2f7;
  --on-blue:#ffffff;
  --ft-map-land:#dde2e8;
  --ft-map-stroke:#ffffff;
  --ft-ticker-h:32px;
  /* Always-dark data panels (login coverage band, pipeline strip). These are
     intentionally dark in BOTH themes -- they are the "live instrument" band. */
  --ft-panel-bg:#080c12;
  --ft-panel-head:#0d1219;
  --ft-panel-text:#ffffff;
  --ft-panel-label:#cfdcea;   /* 14.07:1 on panel bg */
  --ft-panel-muted:#94a7bd;   /*  7.95:1 on panel bg */
  --ft-panel-mono:#9db1c8;    /*  8.92:1 on panel bg */
  --ft-panel-accent:#9fd8c4;  /* 12.22:1 on panel bg */
  --ft-panel-warn:#f0c882;    /* 12.40:1 on panel bg */
  --ft-panel-line:rgba(255,255,255,.14);

  /* Legacy names repointed onto Foundry light palette */
  --bg:var(--ft-app-bg);
  --bg2:var(--ft-canvas);
  --surface:var(--ft-card);
  --surface2:var(--ft-sunken);
  --border:var(--ft-hairline);
  --border2:var(--ft-hairline-strong);
  --text:var(--ft-text);
  --muted:var(--ft-text-secondary);
  --faint:var(--ft-text-muted);
  --teal:var(--ft-blue);
  --teal2:var(--ft-blue-hover);
  --teal-soft:var(--ft-sel-row);
  --blue:var(--ft-blue);
  --blue2:var(--ft-blue-hover);
  --blue-soft:var(--ft-sel-row);
  --cyan:var(--ft-bar);
  --green:var(--ft-green);
  --green-soft:var(--ft-green-bg);
  --amber:var(--ft-amber);
  --amber-soft:var(--ft-amber-bg);
  --amber-dim:var(--ft-amber);
  --on-teal:var(--on-blue);
  --shadow-card:0 1px 0 rgba(10,13,17,.05);
  --shadow-pop:0 24px 64px rgba(16,22,26,.30);
  --map-dot:var(--ft-blue);
  /* Terminal density + geometry. Square-ish corners, tight rhythm. */
  --r-sm:3px; --r-md:4px; --r-lg:6px;
  --font-display:'Inter',system-ui,-apple-system,sans-serif;
  --font-body:'Inter',system-ui,-apple-system,sans-serif;
  --font-mono:'IBM Plex Mono',ui-monospace,monospace;
}
.dark{
  --pha-blue:#7ab3ff;
  --pha-text:#ffffff;
  --pha-hairline:#616d7a;
  --ft-app-bg:#04060a;
  --ft-canvas:#0a0e13;
  --ft-rail:#0f141a;
  --ft-card:#1a212a;
  --ft-sunken:#0a0e13;
  --ft-input-bg:#0a0e13;
  --ft-hairline:#616d7a;      /* 3.07:1 on card, 3.84:1 on page */
  --ft-hairline-soft:#2a323c;
  --ft-hairline-strong:#8794a1;
  --ft-text:#ffffff;
  --ft-text-secondary:#e7edf3;
  --ft-text-muted:#a7b4c2;    /* 8.38:1 on card */
  --ft-blue:#7ab3ff;          /* 8.18:1 on card */
  --ft-blue-solid:#1c5fc9;    /* white on it = 5.95:1 */
  --ft-blue-hover:#2a72e0;
  --ft-link:#7ab3ff;
  --ft-bar:#5b9bff;
  --ft-green:#48dc9b;
  --ft-green-bg:#0d2f22;
  --ft-amber:#f2b13f;
  --ft-amber-bg:#33260c;
  --ft-red:#ff8a8a;
  --ft-red-bg:#361517;
  --ft-cyan:#54c8f5;
  --ft-cyan-bg:#0a2a38;
  --ft-purple:#b79bf0;
  --ft-purple-bg:#221a3a;
  --ft-sel-row:#152a47;
  --on-blue:#ffffff;
  --ft-map-land:#232a33;
  --ft-map-stroke:#04060a;

  --bg:var(--ft-app-bg);
  --bg2:var(--ft-canvas);
  --surface:var(--ft-card);
  --surface2:var(--ft-sunken);
  --border:var(--ft-hairline);
  --border2:var(--ft-hairline-strong);
  --text:var(--ft-text);
  --muted:var(--ft-text-secondary);
  --faint:var(--ft-text-muted);
  --teal:var(--ft-blue);
  --teal2:var(--ft-blue-hover);
  --teal-soft:var(--ft-sel-row);
  --blue:var(--ft-blue);
  --blue2:var(--ft-blue-hover);
  --blue-soft:var(--ft-sel-row);
  --cyan:var(--ft-bar);
  --green:var(--ft-green);
  --green-soft:var(--ft-green-bg);
  --amber:var(--ft-amber);
  --amber-soft:var(--ft-amber-bg);
  --amber-dim:var(--ft-amber);
  --on-teal:var(--on-blue);
  --shadow-card:0 1px 0 rgba(0,0,0,.6);
  --shadow-pop:0 24px 64px rgba(0,0,0,.7);
  --map-dot:var(--ft-blue);
}
*{box-sizing:border-box;margin:0;padding:0}
html,body{background:var(--bg);color:var(--text);font-family:var(--font-body);-webkit-font-smoothing:antialiased;line-height:1.55;transition:background .25s,color .25s}
body{overflow-x:hidden}
.hidden{display:none!important}
strong{color:var(--text);font-weight:600}
button{font-family:inherit;cursor:pointer}
a{color:var(--blue)}

/* logo */
.logo{width:30px;height:30px;color:var(--teal)}
.logo.sm{width:24px;height:24px}
.brand-name{font-family:var(--font-display);font-weight:700;font-size:19px;letter-spacing:-.02em}
.brand-row{display:flex;align-items:center;gap:10px;margin-bottom:26px}

/* ============ SIGN IN ============ */
.signin-wrap{min-height:100vh;display:flex;align-items:center;justify-content:center;position:relative;padding:32px 20px}
.grid-bg{position:absolute;inset:0;background:
  radial-gradient(1100px 600px at 50% -10%, var(--blue-soft), transparent 60%),
  linear-gradient(rgba(148,163,184,.16) 1px, transparent 1px),
  linear-gradient(90deg, rgba(148,163,184,.16) 1px, transparent 1px);
  background-size:auto, 46px 46px, 46px 46px;background-color:var(--bg);
  mask-image:radial-gradient(circle at 50% 30%, #000 55%, transparent 100%);z-index:0}
.dark .grid-bg{background:
  radial-gradient(1100px 600px at 50% -10%, rgba(45,212,191,.10), transparent 60%),
  linear-gradient(rgba(30,51,70,.35) 1px, transparent 1px),
  linear-gradient(90deg, rgba(30,51,70,.35) 1px, transparent 1px);
  background-size:auto, 46px 46px, 46px 46px;background-color:var(--bg)}
.signin-card{position:relative;z-index:1;width:100%;max-width:460px;background:var(--surface);
  border:1px solid var(--border);border-radius:18px;padding:38px 34px;box-shadow:var(--shadow-card)}
.eyebrow{font-family:var(--font-mono);font-size:11px;letter-spacing:.16em;color:var(--teal);text-transform:uppercase;margin-bottom:14px}
.signin-h1{font-family:var(--font-display);font-weight:700;font-size:29px;line-height:1.15;letter-spacing:-.02em;margin-bottom:14px}
.signin-body{color:var(--muted);font-size:15px;margin-bottom:26px}
.field-label{display:block;font-size:13px;font-weight:600;color:var(--text);margin:0 0 8px 2px}
.select-wrap{position:relative;margin-bottom:18px}
.select-wrap::after{content:"";position:absolute;right:16px;top:50%;width:8px;height:8px;border-right:2px solid var(--muted);border-bottom:2px solid var(--muted);transform:translateY(-70%) rotate(45deg);pointer-events:none}
.field-select{width:100%;appearance:none;background:var(--ft-input-bg);color:var(--text);border:1px solid var(--border2);
  border-radius:11px;padding:13px 40px 13px 14px;font-size:14px;font-family:inherit;transition:border-color .15s;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.field-select:focus{outline:none;border-color:var(--blue);box-shadow:0 0 0 3px var(--blue-soft)}
.btn-primary{background:var(--ft-blue-solid);color:var(--on-blue);font-weight:700;font-size:15px;
  border:none;border-radius:11px;padding:14px 20px;transition:transform .1s, box-shadow .2s, background .15s;box-shadow:0 8px 22px -10px rgba(29,95,216,.6)}
.btn-primary:hover{transform:none;background:var(--ft-blue-hover);box-shadow:0 12px 28px -10px rgba(29,95,216,.7)}
.btn-primary:active{transform:translateY(0)}
/* Secondary CTA -- CONVERSION.md §5/§12.5: only ONE element on the route may carry
   .btn-primary. The quick-demo "Get the answer" button is real and useful but is
   not the platform's primary conversion goal (signing in), so it gets an outlined
   treatment that still reads as clickable without competing for top billing. */
.btn-secondary{background:var(--surface);color:var(--blue);font-weight:700;font-size:15px;
  border:1.5px solid var(--blue);border-radius:11px;padding:12.5px 20px;transition:transform .1s, background .15s, color .15s}
.btn-secondary:hover{transform:translateY(-1px);background:var(--blue-soft)}
.btn-secondary:active{transform:translateY(0)}
.btn-block{width:100%;margin-top:6px}
.arr{margin-left:2px}
.signin-footer{display:flex;align-items:center;gap:8px;margin-top:20px;color:var(--faint);font-size:12.5px}
.signin-footer svg{color:var(--teal);flex-shrink:0}

/* ============ ENTERPRISE HERO (Problem 1 fix) ============
   Enterprise-first, two-panel layout: left/primary panel carries the PHA
   credibility framing with sign-in as a first-class, always-visible element;
   right/secondary panel subordinates the single-address consumer demo. */
/* .signin-wrap is `display:flex` for its original single-child centering use
   case. .ent-hero now stacks TWO full-width children (.ent-hero-inner, then
   .data-coverage) -- as a flex row each child was sizing to its own content
   instead of stretching to the container, which is why the coverage band
   collapsed to ~106px and got pushed to the right at narrow widths. Override
   to a column flow so both children take the full available width. */
.ent-hero{min-height:100vh;height:auto;padding:56px 20px;display:block}
.ent-hero.signin-wrap{display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start}
/* Two explicit rows in the right column (demo card, then the data visual) so the
   right side keeps working past the demo card's own height instead of leaving a
   dead field of whitespace beside a much-taller left card -- CONVERSION.md §9/§5
   flagged ~55% dead whitespace at 1512px when the right column was a single
   short card next to the taller sign-in panel. */
.ent-hero-inner{position:relative;z-index:1;width:100%;max-width:1320px;margin:0 auto;
  display:grid;grid-template-columns:1.05fr 0.95fr;grid-template-rows:auto 1fr;gap:26px;align-items:stretch}
.ent-primary{grid-row:1 / 3}
.ent-demo{grid-column:2;grid-row:1}
.ent-visual{grid-column:2;grid-row:2}
.ent-card{background:var(--surface);border:1px solid var(--border);border-radius:18px;box-shadow:var(--shadow-card)}
.ent-primary{padding:40px 38px}
.ent-primary .signin-h1{font-size:32px}
.ent-trust-list{list-style:none;margin:0 0 28px;padding:0;display:flex;flex-direction:column;gap:11px}
.ent-trust-list li{display:flex;align-items:flex-start;gap:10px;font-size:14px;color:var(--muted)}
.ent-trust-list li svg{color:var(--green);flex-shrink:0;margin-top:2px}
.ent-signin-block{border-top:1px solid var(--border);padding-top:24px}
.ent-signin-label{font-family:var(--font-mono);font-size:11px;letter-spacing:.14em;color:var(--text);font-weight:700;margin-bottom:14px}
.ent-demo{padding:26px 26px 28px;background:var(--surface2);align-self:start}
.ent-demo-label{font-family:var(--font-mono);font-size:10.5px;letter-spacing:.12em;color:var(--faint);text-transform:uppercase;margin-bottom:10px}
.ent-demo-h2{font-family:var(--font-display);font-weight:700;font-size:19px;letter-spacing:-.01em;margin-bottom:8px}
.ent-demo-sub{color:var(--muted);font-size:13px;margin-bottom:18px;line-height:1.45}

/* ---- Original data visual card (CONVERSION.md §6): a real, non-stock,
   non-people SVG rendered from the same mv_rr_login_headline row the stat
   band below reads -- see renderCoverageVisual() in app.js. ---- */
.ent-visual{padding:22px 24px 20px;background:var(--surface2);display:flex;flex-direction:column;min-height:220px}
.ent-visual-label{font-family:var(--font-mono);font-size:10.5px;letter-spacing:.12em;color:var(--faint);text-transform:uppercase;margin-bottom:12px}
.coverage-visual-svg{width:100%;height:auto;flex:1;min-height:120px}
.ent-visual-note{color:var(--muted);font-size:12px;margin-top:10px;line-height:1.5}
.cv-bar-track{fill:var(--bg2)}
.cv-bar-fill{fill:var(--blue)}
.cv-bar-fill-dim{fill:var(--border2)}
.cv-bar-label{font-family:var(--font-mono);font-size:9.5px;fill:var(--faint)}
.cv-bar-value{font-family:var(--font-mono);font-size:10.5px;font-weight:600;fill:var(--text)}

@media (max-width: 900px){
  .ent-hero-inner{grid-template-columns:1fr;grid-template-rows:auto}
  .ent-primary{grid-row:auto;padding:30px 24px}
  .ent-demo{grid-column:auto;grid-row:auto}
  .ent-visual{grid-column:auto;grid-row:auto}
  .ent-primary .signin-h1{font-size:26px}
}

/* ---- typeahead autocomplete dropdown (shared: hero demo + workspace search) ---- */
.ac-wrap{position:relative}
.ac-results{position:absolute;left:0;right:0;top:calc(100% + 6px);z-index:30;background:var(--surface);
  border:1px solid var(--border2);border-radius:12px;box-shadow:0 14px 34px -12px rgba(16,22,26,.28);
  max-height:320px;overflow-y:auto;padding:6px}
.ac-item{display:flex;flex-direction:column;gap:2px;padding:10px 12px;border-radius:8px;cursor:pointer}
.ac-item:hover,.ac-item.ac-active{background:var(--blue-soft)}
.ac-item-name{font-weight:600;font-size:13.5px;color:var(--text);display:flex;align-items:center;gap:8px;justify-content:space-between}
.ac-item-addr{font-size:12px;color:var(--muted)}
.ac-badge{font-family:var(--font-mono);font-size:9.5px;letter-spacing:.05em;text-transform:uppercase;padding:2px 7px;border-radius:999px;flex-shrink:0}
.ac-badge-comps{background:var(--green-soft);color:var(--green)}
.ac-badge-nocomps{background:var(--bg2);color:var(--faint);border:1px solid var(--border2)}
.ac-empty{padding:14px 12px;font-size:13px;color:var(--muted)}
.ac-loading{padding:10px 12px;font-size:12.5px;color:var(--faint);font-family:var(--font-mono)}

/* ============ WORKSPACE ============ */
.workspace{min-height:100vh}
.appbar{position:sticky;top:0;z-index:40;display:flex;align-items:center;justify-content:space-between;
  padding:12px 22px;background:color-mix(in srgb, var(--surface) 85%, transparent);backdrop-filter:blur(12px);border-bottom:1px solid var(--border)}
.appbar-brand{display:flex;align-items:center;gap:9px}
.appbar-tag{font-family:var(--font-mono);font-size:11px;color:var(--faint);border-left:1px solid var(--border2);padding-left:10px;margin-left:2px;letter-spacing:.04em}
.appbar-right{display:flex;align-items:center;gap:14px}
.appbar-pha{font-size:12.5px;color:var(--muted);max-width:340px;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
/* theme toggle */
.theme-toggle{display:inline-flex;align-items:center;justify-content:center;width:36px;height:36px;border-radius:9px;
  background:var(--bg2);border:1px solid var(--border);color:var(--muted);transition:all .15s;flex-shrink:0}
.theme-toggle:hover{color:var(--text);border-color:var(--border2)}
.btn-switch-state{display:inline-flex;align-items:center;gap:6px;height:36px;padding:0 13px;border-radius:9px;
  background:var(--bg2);border:1px solid var(--border);color:var(--muted);font-size:12.5px;font-weight:600;
  cursor:pointer;transition:all .15s;flex-shrink:0;font-family:inherit}
.btn-switch-state:hover{color:var(--teal);border-color:var(--teal)}
.btn-switch-state svg{flex-shrink:0}
.theme-toggle svg{width:18px;height:18px}
.theme-toggle .icon-moon{display:none}
.dark .theme-toggle .icon-sun{display:none}
.dark .theme-toggle .icon-moon{display:block}

.map-header{padding:20px 22px 14px;position:sticky;top:53px;z-index:30;background:linear-gradient(180deg,var(--bg) 70%,transparent);border-bottom:0}
.map-title{font-family:var(--font-display);font-weight:700;font-size:20px;letter-spacing:-.01em;line-height:1.2}
.map-sub{color:var(--muted);font-size:13.5px;margin-top:5px}
.ms-loading{display:inline-flex;align-items:center;gap:6px;color:var(--muted);font-style:italic}
.ms-spin{width:11px;height:11px;border:2px solid var(--border2);border-top-color:var(--teal);border-radius:50%;animation:sp .7s linear infinite;display:inline-block}
.map-wrap{position:relative}
.map{height:460px;width:100%;background:var(--bg2);border-top:1px solid var(--border);border-bottom:1px solid var(--border)}
.map-loading{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;background:color-mix(in srgb,var(--bg2) 80%,transparent);z-index:5;font-size:13.5px;color:var(--muted);gap:10px}
.spin{width:18px;height:18px;border:2px solid var(--border2);border-top-color:var(--teal);border-radius:50%;animation:sp .7s linear infinite}
@keyframes sp{to{transform:rotate(360deg)}}

/* map legend */
.map-legend{position:absolute;bottom:14px;left:14px;z-index:6;background:color-mix(in srgb,var(--surface) 92%,transparent);
  backdrop-filter:blur(8px);border:1px solid var(--border);border-radius:11px;padding:10px 13px;display:flex;flex-direction:column;gap:7px;box-shadow:var(--shadow-card)}
.map-legend .lg{display:flex;align-items:center;gap:8px;font-size:12px;color:var(--muted);font-weight:500}
.lg-dot{width:11px;height:11px;border-radius:50%;flex-shrink:0;border:1.5px solid #fff}
.dark .lg-dot{border-color:rgba(255,255,255,.25)}
.lg-dot.all{background:var(--map-dot)}
.lg-dot.comp{background:var(--amber)}
.lg-dot.subj{background:var(--blue)}

.content{max-width:1060px;margin:0 auto;padding:26px 22px 60px}

/* stepper */
.stepper{display:flex;align-items:center;gap:0;margin-bottom:24px;flex-wrap:wrap}
.step{display:flex;align-items:center;gap:9px;font-size:13.5px;color:var(--faint);font-weight:600;white-space:nowrap}
.step-num{display:inline-flex;align-items:center;justify-content:center;width:24px;height:24px;border-radius:50%;
  background:var(--bg2);border:1px solid var(--border2);color:var(--muted);font-size:12px;font-family:var(--font-mono)}
.step.active{color:var(--text)}
.step.active .step-num{background:var(--ft-blue-solid);color:var(--on-blue);border-color:transparent}
.step.done .step-num{background:var(--teal-soft);color:var(--teal);border-color:var(--teal)}
.step-line{flex:1;min-width:20px;height:1px;background:var(--border2);margin:0 12px}

/* cards */
.card{background:var(--surface);border:1px solid var(--border);border-radius:16px;padding:24px;margin-bottom:22px;box-shadow:var(--shadow-card)}
.card-h3{font-family:var(--font-display);font-weight:600;font-size:18px;margin-bottom:6px}
.card-sub{color:var(--muted);font-size:13.5px;margin-bottom:16px}

/* search */
.search-input-wrap{position:relative}
.search-icon{position:absolute;left:15px;top:50%;transform:translateY(-50%);width:18px;height:18px;color:var(--faint)}
.search-input{width:100%;background:var(--bg);border:1px solid var(--border2);border-radius:11px;
  padding:14px 14px 14px 44px;color:var(--text);font-size:14.5px;font-family:inherit;transition:border-color .15s,box-shadow .15s}
.search-input:focus{outline:none;border-color:var(--blue);box-shadow:0 0 0 3px var(--blue-soft)}
.search-input::placeholder{color:var(--faint)}
.search-results{position:absolute;top:calc(100% + 6px);left:0;right:0;background:var(--surface);
  border:1px solid var(--border2);border-radius:12px;max-height:320px;overflow-y:auto;z-index:20;box-shadow:var(--shadow-pop)}
.sr-item{padding:11px 15px;border-bottom:1px solid var(--border);cursor:pointer;transition:background .12s}
.sr-item:last-child{border-bottom:none}
.sr-item:hover,.sr-item.hi{background:var(--blue-soft)}
.sr-name{font-size:14px;font-weight:600}
.sr-addr{font-size:12.5px;color:var(--muted);margin-top:2px}
.sr-empty{padding:14px 15px;color:var(--faint);font-size:13px}

/* subject card */
.subj-top{display:flex;justify-content:space-between;align-items:flex-start;gap:16px;flex-wrap:wrap;margin-bottom:6px}
.subj-eyebrow{display:inline-flex;align-items:center;gap:9px;font-family:var(--font-mono);font-size:15px;font-weight:700;letter-spacing:.22em;color:var(--teal);text-transform:uppercase;background:var(--teal-soft,color-mix(in srgb,var(--teal) 12%,transparent));border:1px solid color-mix(in srgb,var(--teal) 35%,transparent);border-radius:8px;padding:7px 14px}
.subj-eyebrow-dot{width:9px;height:9px;border-radius:50%;background:var(--teal);box-shadow:0 0 0 4px color-mix(in srgb,var(--teal) 22%,transparent)}
.legend{display:flex;gap:8px;flex-wrap:wrap}
.legend-pill{display:inline-flex;align-items:center;gap:6px;font-size:11.5px;padding:4px 10px;border-radius:20px;font-weight:600}
.legend-pill.db{background:var(--green-soft);color:var(--green);border:1px solid color-mix(in srgb,var(--green) 30%,transparent)}
.legend-pill.est{background:var(--amber-soft);color:var(--amber);border:1px solid color-mix(in srgb,var(--amber) 30%,transparent)}
.dot{width:7px;height:7px;border-radius:50%}
.dot.g{background:var(--green)} .dot.a{background:var(--amber)}
.subj-name{font-family:var(--font-display);font-weight:700;font-size:22px;letter-spacing:-.01em;margin-top:12px}
.subj-addr{color:var(--muted);font-size:14px;margin-top:3px}
.ptype-pill{display:inline-block;font-family:var(--font-mono);font-size:10px;letter-spacing:.06em;text-transform:uppercase;padding:3px 8px;border-radius:6px;background:var(--blue-soft);color:var(--blue);margin-top:8px;font-weight:600}

.tiles{display:grid;grid-template-columns:repeat(3,1fr);gap:12px;margin-top:20px}
.tile{background:var(--bg2);border:1px solid var(--border);border-radius:12px;padding:14px}
.tile-label{font-family:var(--font-mono);font-size:10.5px;letter-spacing:.08em;color:var(--faint);text-transform:uppercase}
.tile-val{font-size:17px;font-weight:600;margin-top:6px;display:flex;align-items:center;gap:8px;flex-wrap:wrap;font-family:var(--font-display)}

/* nine-factor comparability cards (24 CFR 982.507(b)) */
.factors-head{margin-top:22px;font-family:var(--font-display);font-weight:600;font-size:14.5px;color:var(--muted)}
.factors-head strong{color:var(--text)}
.factors-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:12px;margin-top:12px}
.fcard{position:relative;background:var(--bg2);border:1px solid var(--border);border-radius:12px;padding:14px 14px 30px}
.fcard-label{font-family:var(--font-mono);font-size:10.5px;letter-spacing:.06em;color:var(--faint);text-transform:uppercase}
.fcard-val{font-family:var(--font-display);font-weight:600;font-size:17px;margin-top:7px;line-height:1.25}
.fcard-val.sm{font-size:13.5px}
.fcard-sub{font-size:12px;color:var(--muted);margin-top:5px;line-height:1.4}
.fcard-src{position:absolute;left:14px;right:14px;bottom:11px;width:max-content;max-width:calc(100% - 28px);font-family:var(--font-mono);font-size:9px;font-weight:700;letter-spacing:.04em;padding:2px 7px;border-radius:6px;background:var(--green-soft);color:var(--green);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.fcard-src.na{background:var(--amber-soft);color:var(--amber)}
.fcard-src.src-link{display:inline-flex;align-items:center;gap:5px;text-decoration:none;transition:background .12s,color .12s}
.fcard-src.src-link svg{width:10px;height:10px;flex-shrink:0}
.fcard-src.src-link:hover{background:var(--green);color:#fff}
.badge{font-size:10px;font-weight:700;padding:2px 7px;border-radius:6px;font-family:var(--font-mono);letter-spacing:.03em}
.badge.db{background:var(--green-soft);color:var(--green)}
.badge.est{background:var(--amber-soft);color:var(--amber)}

.roster-head{margin-top:24px;display:flex;align-items:baseline;gap:10px;flex-wrap:wrap}
.roster-title{font-family:var(--font-display);font-weight:600;font-size:15.5px}
.roster-sub{color:var(--muted);font-size:12.5px}
.roster-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:12px;margin-top:12px}
.unit-card{background:var(--bg2);border:1px solid var(--border);border-radius:12px;padding:14px;cursor:pointer;transition:border-color .12s,box-shadow .12s}
.unit-card:hover{border-color:var(--blue);box-shadow:0 0 0 3px var(--blue-soft)}
.unit-card.sel{border-color:var(--blue);box-shadow:0 0 0 3px var(--blue-soft)}
.unit-bed{font-family:var(--font-display);font-weight:600;font-size:15px}
.unit-line{font-size:12.5px;color:var(--muted);margin-top:5px}
.unit-badges{display:flex;gap:6px;flex-wrap:wrap;margin-top:10px}

.util-head{margin-top:26px;display:flex;flex-direction:column;gap:3px}
.util-title{font-family:var(--font-display);font-weight:600;font-size:15.5px}
.util-sub{color:var(--muted);font-size:12.5px;line-height:1.45}
.util-legend{margin-top:12px;background:var(--bg2);border:1px solid var(--border);border-radius:10px;padding:12px 14px;font-size:12px;color:var(--muted);line-height:1.55;display:flex;flex-direction:column;gap:4px}
.util-legend strong{color:var(--text)}
.util-legend em{font-style:italic;color:var(--text)}
.util-legend-cite{margin-top:2px;font-family:var(--font-mono);font-size:10.5px;letter-spacing:.02em;color:var(--faint)}
.util-group-label{margin-top:16px;font-family:var(--font-mono);font-size:11px;font-weight:700;letter-spacing:.08em;text-transform:uppercase;color:var(--faint)}
.util-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:10px;margin-top:9px}
.util-item{display:flex;align-items:flex-start;gap:11px;background:var(--bg2);border:1px solid var(--border);border-radius:10px;padding:12px 13px;cursor:pointer;user-select:none;transition:border-color .12s}
.util-item:hover{border-color:var(--teal)}
.util-to{flex-shrink:0;width:26px;height:26px;border-radius:7px;display:inline-flex;align-items:center;justify-content:center;font-family:var(--font-mono);font-weight:700;font-size:13px;border:1.5px solid var(--border2)}
.util-to.t{background:var(--teal);border-color:var(--teal);color:var(--on-teal)}
.util-to.o{background:var(--blue-soft);border-color:color-mix(in srgb,var(--blue) 35%,transparent);color:var(--blue)}
.util-body{display:flex;flex-direction:column;gap:2px;min-width:0}
.util-label-row{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.util-label{font-family:var(--font-display);font-weight:600;font-size:14px}
.util-desc{font-size:11.5px;color:var(--muted);line-height:1.4}
.util-who{font-weight:700;color:var(--text)}
.util-confirm{font-family:var(--font-mono);font-size:9px;font-weight:700;letter-spacing:.03em;text-transform:uppercase;padding:2px 6px;border-radius:5px;background:var(--green-soft);color:var(--green)}

.gen-btn{margin-top:24px;width:100%;background:var(--ft-blue-solid);color:var(--on-blue);
  font-weight:700;font-size:16px;border:none;border-radius:13px;padding:17px;display:flex;align-items:center;justify-content:center;gap:9px;
  box-shadow:0 10px 26px -10px rgba(29,95,216,.5);transition:transform .1s,background .15s}
.gen-btn:hover{transform:translateY(-1px);background:var(--blue2)}
.gen-btn:disabled{opacity:.5;cursor:not-allowed;transform:none}
.gen-sub{text-align:center;color:var(--muted);font-size:12.5px;margin-top:11px}

/* report */
.report-card{border-color:var(--border2)}
.report-eyebrow{font-family:var(--font-mono);font-size:11px;letter-spacing:.14em;color:var(--teal);text-transform:uppercase}
.report-h2{font-family:var(--font-display);font-weight:700;font-size:20px;margin-top:8px;margin-bottom:4px}
.report-meta{color:var(--muted);font-size:13px;margin-bottom:18px}
.rr-verdict{display:flex;align-items:center;gap:12px;padding:16px 18px;border-radius:12px;margin-bottom:18px;background:var(--green-soft);border:1px solid color-mix(in srgb,var(--green) 30%,transparent)}
.rr-verdict.high{background:var(--amber-soft);border-color:color-mix(in srgb,var(--amber) 35%,transparent)}
.rr-verdict-icon{width:40px;height:40px;border-radius:10px;background:var(--green);color:#fff;display:flex;align-items:center;justify-content:center;flex-shrink:0;font-size:20px;font-weight:700}
.rr-verdict.high .rr-verdict-icon{background:var(--amber)}
.rr-verdict-title{font-family:var(--font-display);font-weight:700;font-size:16px}
.rr-verdict-sub{font-size:13px;color:var(--muted);margin-top:2px}
.rr-table{width:100%;border-collapse:collapse;font-size:13.5px;margin-top:8px}
.rr-table th{text-align:left;font-family:var(--font-mono);font-size:10.5px;letter-spacing:.06em;color:var(--faint);text-transform:uppercase;padding:8px 10px;border-bottom:1px solid var(--border2);font-weight:600}
.rr-table td{padding:11px 10px;border-bottom:1px solid var(--border)}
.rr-table tr:last-child td{border-bottom:none}
.rr-table .num{font-family:var(--font-mono);font-variant-numeric:tabular-nums}
.rr-det{color:var(--teal);font-weight:700}
.rr-note{font-size:12.5px;color:var(--muted);margin-top:14px;padding:12px 14px;background:var(--bg2);border:1px solid var(--border);border-radius:10px}
.rr-src{font-size:11.5px;color:var(--faint);margin-top:3px}
.rr-src a{color:var(--blue);text-decoration:none}
.rr-src a:hover{text-decoration:underline}
.comp-sub{font-family:var(--font-display);font-weight:600;font-size:14px;margin:20px 0 8px}

/* sections */
.section{margin-top:40px}
.section-head{display:flex;gap:14px;align-items:flex-start;margin-bottom:20px}
.section-icon{flex-shrink:0;width:38px;height:38px;border-radius:10px;background:var(--teal-soft);color:var(--teal);
  display:flex;align-items:center;justify-content:center;font-size:20px;font-weight:700;font-family:var(--font-display)}
.section-icon.warn{background:var(--amber-soft);color:var(--amber)}
.section-title{font-family:var(--font-display);font-weight:700;font-size:21px;letter-spacing:-.01em}
.section-sub{color:var(--muted);font-size:13.5px;margin-top:4px}

.method-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:14px}
.method-card{background:var(--surface);border:1px solid var(--border);border-radius:14px;padding:18px;box-shadow:var(--shadow-card)}
.method-title{font-family:var(--font-display);font-weight:600;font-size:15px;margin-bottom:7px}
.method-body{color:var(--muted);font-size:13px;line-height:1.5}
.method-cite{display:inline-flex;align-items:center;gap:5px;margin-top:12px;font-family:var(--font-mono);font-size:11.5px;color:var(--blue);text-decoration:none;transition:color .12s}
.method-cite:hover{color:var(--teal)}

.mqi-disclosure-card,.provenance-summary-card{margin-top:18px;padding:18px}
.mqi-disclosure-card .method-body,.provenance-summary-card .method-body{color:var(--muted);font-size:13.5px;line-height:1.6}
.mqi-disclosure-stats{display:flex;flex-wrap:wrap;gap:18px;margin-top:14px}
.mqi-stat{display:flex;align-items:center;gap:10px;flex:1 1 260px}
.mqi-stat-label{color:var(--faint);font-size:12.5px;line-height:1.4}

/* Provenance badge palette -- ported from pha-module-kit's ProvenanceBadge.tsx (database/imputed/
   reviewer/stale) so this app and every PHA module share one vocabulary and color mapping. */
.pha-badge{display:inline-flex;align-items:center;gap:4px;font-size:10.5px;font-weight:700;letter-spacing:.03em;text-transform:uppercase;padding:3px 9px;border-radius:999px;border:1px solid transparent;white-space:nowrap;font-family:var(--font-mono)}
.pha-badge-db{color:var(--cyan);background:var(--ft-cyan-bg);border-color:var(--cyan)}
.pha-badge-imputed{color:var(--amber);background:var(--amber-soft);border-color:var(--amber)}
.pha-badge-reviewer{color:var(--ft-purple);background:var(--ft-purple-bg);border-color:var(--ft-purple)}
.pha-badge-stale{color:var(--ft-red);background:var(--ft-red-bg);border-color:var(--ft-red)}

/* ---------------------------------------------------------------------
   Field Coverage Tracker -- dense, grouped, per-field fill-rate list.
   Bloomberg/Foundry density: label + fraction + bar, no card-per-field.
   --------------------------------------------------------------------- */
.coverage-tracker-card,.derived-score-card,.prov-pipeline-health-card,.prov-kpi-rollup-card,.prov-gap-remediation-card,.prov-ontology-coverage-card,.prov-documents-card{margin-top:18px;padding:18px}
.coverage-tracker-card .method-body,.derived-score-card .method-body,.prov-pipeline-health-card .method-body,.prov-kpi-rollup-card .method-body,.prov-gap-remediation-card .method-body,.prov-ontology-coverage-card .method-body,.prov-documents-card .method-body{color:var(--muted);font-size:13.5px;line-height:1.6}
.coverage-tracker-card code,.derived-score-card code,.prov-pipeline-health-card code,.prov-kpi-rollup-card code,.prov-gap-remediation-card code,.prov-ontology-coverage-card code,.prov-documents-card code{font-family:var(--font-mono);font-size:12px;background:var(--surface-alt,var(--border));padding:1px 5px;border-radius:4px}
.cov-groups{margin-top:16px;display:flex;flex-direction:column;gap:14px}
.cov-group{border:1px solid var(--border);border-radius:10px;padding:12px 14px}
.cov-group-lead{border-color:var(--teal);background:color-mix(in srgb,var(--teal) 5%,transparent)}
.cov-group-head{display:flex;align-items:baseline;justify-content:space-between;margin-bottom:8px}
.cov-group-title{font-family:var(--font-display);font-weight:600;font-size:13px}
.cov-group-count{color:var(--faint);font-size:11px;font-family:var(--font-mono)}
.cov-row{display:grid;grid-template-columns:1fr auto 140px;gap:12px;align-items:center;padding:5px 0;border-top:1px solid color-mix(in srgb,var(--border) 60%,transparent)}
.cov-row:first-of-type{border-top:none}
.cov-field-name{font-size:12.5px;color:var(--text,inherit)}
.cov-field-frac{font-family:var(--font-mono);font-size:12px;color:var(--muted);white-space:nowrap}
.cov-slash{color:var(--faint)}
.cov-denom{color:var(--faint);text-decoration:underline dotted;cursor:help}
.cov-field-metric{display:flex;align-items:center;gap:8px;justify-self:end}
.cov-bar-track{width:72px;height:6px;border-radius:4px;background:var(--border);overflow:hidden;flex-shrink:0}
.cov-bar-fill{display:block;height:100%;border-radius:4px}
.cov-bar-hi{background:var(--green)}
.cov-bar-mid{background:var(--amber)}
.cov-bar-lo{background:var(--ft-red)}
.cov-pct-txt{font-family:var(--font-mono);font-size:11.5px;color:var(--muted);width:48px;text-align:right}
.cov-pct-na{font-family:var(--font-mono);font-size:11.5px;color:var(--faint)}
.cov-note{margin-top:8px;color:var(--faint);font-size:11.5px;line-height:1.4}

/* ---------------------------------------------------------------------
   Derived Score Coverage -- grade-distribution bar + confidence pills.
   Never a bare letter grade: caveats render inline, same visual weight
   as the stats they qualify.
   --------------------------------------------------------------------- */
.score-cards{margin-top:16px;display:flex;flex-direction:column;gap:16px}
.score-card-block{border:1px solid var(--border);border-radius:10px;padding:14px}
.score-card-head{display:flex;align-items:center;justify-content:space-between;margin-bottom:10px}
.score-title{font-family:var(--font-display);font-weight:600;font-size:14px}
.grade-bar{display:flex;width:100%;height:14px;border-radius:5px;overflow:hidden;background:var(--border)}
.grade-seg{display:block;height:100%}
.grade-a{background:var(--green)}
.grade-b{background:var(--cyan)}
.grade-c{background:var(--amber)}
.grade-d{background:color-mix(in srgb,var(--ft-red) 60%,var(--amber))}
.grade-f{background:var(--ft-red)}
.grade-legend{display:flex;flex-wrap:wrap;gap:10px;margin-top:6px;font-family:var(--font-mono);font-size:11px;color:var(--muted)}
.grade-legend-item{display:inline-flex;align-items:center;gap:4px}
.grade-dot{width:8px;height:8px;border-radius:50%;display:inline-block}
.grade-note{color:var(--faint);font-size:12px;font-style:italic;padding:4px 0}
.score-caveat{margin-top:10px;padding:10px 12px;border-radius:8px;background:var(--amber-soft);border:1px solid color-mix(in srgb,var(--amber) 30%,transparent);font-size:12px;line-height:1.5;color:var(--text,inherit)}
.score-caveat-weak{background:var(--ft-red-bg);border-color:color-mix(in srgb,var(--ft-red) 30%,transparent)}

.hotma-box{margin-top:18px;background:var(--amber-soft);border:1px solid color-mix(in srgb,var(--amber) 25%,transparent);border-radius:14px;padding:20px}
.hotma-badge{font-family:var(--font-mono);font-size:10.5px;letter-spacing:.12em;color:var(--amber);margin-bottom:8px}
.hotma-box p{color:var(--muted);font-size:13.5px;line-height:1.6}

.disclaimer-list{list-style:none;display:flex;flex-direction:column;gap:12px}
.disclaimer-list li{position:relative;padding-left:26px;color:var(--muted);font-size:13.5px;line-height:1.5}
.disclaimer-list li::before{content:"";position:absolute;left:6px;top:8px;width:6px;height:6px;border-radius:50%;background:var(--amber)}

.app-footer{margin-top:48px;padding-top:22px;border-top:1px solid var(--border);display:flex;flex-direction:column;gap:6px;color:var(--faint);font-size:12px}

/* maplibre popup */
.maplibregl-popup-content{background:var(--surface);border:1px solid var(--border2);border-radius:12px;padding:14px 15px;color:var(--text);box-shadow:var(--shadow-pop);font-family:var(--font-body)}
.maplibregl-popup-tip{border-top-color:var(--surface)!important;border-bottom-color:var(--surface)!important}
.maplibregl-popup-close-button{color:var(--muted);font-size:18px;padding:2px 7px}
.pop-name{font-family:var(--font-display);font-weight:600;font-size:15px;padding-right:14px}
.pop-addr{font-size:12.5px;color:var(--muted);margin-top:3px}
.pop-meta{font-size:12px;color:var(--faint);margin-top:6px}
.pop-btn{margin-top:11px;width:100%;background:var(--ft-blue-solid);color:var(--on-blue);font-weight:700;font-size:13px;border:none;border-radius:9px;padding:9px}
.pop-btn:hover{background:var(--blue2)}

/* dot markers rendered as DOM elements */
.dot-marker{border-radius:50%;cursor:pointer;border:1.5px solid #fff;box-shadow:0 1px 3px rgba(0,0,0,.3)}
.dark .dot-marker{border-color:rgba(255,255,255,.3)}

/* responsive */
@media(max-width:760px){
  .tiles,.roster-grid,.method-grid,.factors-grid{grid-template-columns:1fr}
  .util-grid{grid-template-columns:1fr}
  .map{height:380px}
  .signin-card{padding:30px 22px}
  .signin-h1{font-size:25px}
  .appbar-pha{display:none}
  .map-header{top:53px}
  .step-line{margin:0 6px}
  .step{font-size:12px}
  .cov-row{grid-template-columns:1fr;gap:4px}
  .cov-field-metric{justify-self:start}
  .cov-bar-track{width:100px}
}
@media(max-width:440px){
  .util-grid{grid-template-columns:1fr}
  .content{padding:22px 16px 50px}
}

/* ============ v2: MULTI-SELECT + COSTAR REPORT ============ */
/* subject card layout w/ photo */
.subj-main{flex:1;min-width:240px}
.subj-photo{width:190px;height:132px;border-radius:12px;object-fit:cover;border:1px solid var(--border2);background:var(--bg2);flex-shrink:0}

/* unit multi-select checkmark */
.unit-check{position:absolute;top:10px;right:10px;width:20px;height:20px;border-radius:6px;border:1.5px solid var(--border2);
  background:var(--surface);display:inline-flex;align-items:center;justify-content:center;transition:all .12s}
.unit-check svg{width:12px;height:12px;opacity:0;color:#fff}
.unit-card{position:relative}
.unit-card.sel .unit-check{background:var(--blue);border-color:var(--blue)}
.unit-card.sel .unit-check svg{opacity:1}

/* utilities sub caption */
.util-sub{color:var(--muted);font-size:12.5px;margin-top:3px}

/* report action buttons */
.report-actions{display:flex;gap:12px;flex-wrap:wrap;margin:18px 0 6px}
.pdf{background:var(--teal);color:var(--on-teal);font-weight:700;font-size:14.5px;border:none;border-radius:11px;
  padding:13px 20px;display:inline-flex;align-items:center;gap:9px;box-shadow:0 8px 22px -12px rgba(14,143,138,.6);transition:transform .1s,background .15s}
.pdf:hover{transform:translateY(-1px);background:var(--teal2)}
.pdf:disabled{opacity:.55;cursor:progress;transform:none}
.pdf svg{width:17px;height:17px}
.pdf-note{color:var(--faint);font-size:12px;margin-top:8px}

/* FMR band line */
.fmr-line{font-size:12.5px;color:var(--muted);margin-top:4px}
.fmr-line .num{font-family:var(--font-mono);font-variant-numeric:tabular-nums;color:var(--text);font-weight:600}
.rr-thin{font-weight:400;color:var(--muted)}
.zero{color:var(--faint)}

/* per-bedroom block */
.bed-block{margin-top:26px;padding-top:22px;border-top:1px solid var(--border2)}
.bed-block:first-of-type{border-top:none;margin-top:14px;padding-top:0}
.bed-head{display:flex;justify-content:space-between;align-items:flex-start;gap:14px;flex-wrap:wrap;margin-bottom:4px}
.bed-title{font-family:var(--font-display);font-weight:700;font-size:17px}
.bed-sub{color:var(--muted);font-size:12.5px;margin-top:2px}

/* ===== "LIVE BRAIN" LOADING ANIMATION ===== */
.brain{padding:6px 2px 4px}
.brain-head{display:flex;align-items:center;gap:14px}
.brain-head>div{flex:1;min-width:0}
.brain-title{font-family:var(--font-display);font-weight:700;font-size:16px;color:var(--text)}
.brain-sub{font-size:12.5px;color:var(--muted);margin-top:2px}
.brain-sub strong{color:var(--text)}
.brain-pct{font-family:var(--font-mono);font-weight:700;font-size:22px;color:var(--teal);font-variant-numeric:tabular-nums;letter-spacing:-.01em}
.brain-pulse{position:relative;width:34px;height:34px;flex:none;display:inline-flex;align-items:center;justify-content:center}
.brain-pulse i{position:absolute;inset:0;margin:auto;width:10px;height:10px;border-radius:50%;background:var(--teal);opacity:.9}
.brain-pulse i:nth-child(2){animation:brainRing 1.6s ease-out infinite}
.brain-pulse i:nth-child(3){animation:brainRing 1.6s ease-out .8s infinite}
@keyframes brainRing{0%{transform:scale(1);opacity:.5}100%{transform:scale(3.4);opacity:0}}
.brain-bar{height:6px;border-radius:6px;background:var(--bg2);overflow:hidden;margin:16px 0 6px}
.brain-bar>span{display:block;height:100%;width:0;border-radius:6px;background:linear-gradient(90deg,var(--teal),var(--blue));transition:width .42s cubic-bezier(.4,0,.2,1)}
.brain-steps{list-style:none;margin:14px 0 4px;padding:0;display:flex;flex-direction:column;gap:2px}
.bstep{display:flex;align-items:flex-start;gap:12px;padding:8px 10px;border-radius:10px;opacity:.45;transition:opacity .3s,background .3s}
.bstep.active{opacity:1;background:var(--teal-soft)}
.bstep.done{opacity:.85}
.bstep-dot{position:relative;width:20px;height:20px;flex:none;border-radius:50%;border:1.5px solid var(--border2);margin-top:1px;display:inline-flex;align-items:center;justify-content:center;color:#fff;transition:background .3s,border-color .3s}
.bstep.done .bstep-dot{background:var(--teal);border-color:var(--teal)}
.bstep-check{width:13px;height:13px;opacity:0;transition:opacity .25s}
.bstep.done .bstep-check{opacity:1}
.bstep-spin{position:absolute;width:14px;height:14px;border-radius:50%;border:2px solid var(--teal);border-top-color:transparent;opacity:0}
.bstep.active .bstep-spin{opacity:1;animation:bspin .7s linear infinite}
.bstep.active .bstep-dot{border-color:var(--teal)}
@keyframes bspin{to{transform:rotate(360deg)}}
.bstep-txt{display:flex;flex-direction:column;gap:1px;min-width:0}
.bstep-txt b{font-family:var(--font-display);font-weight:600;font-size:13.5px;color:var(--text)}
.bstep-txt em{font-style:normal;font-size:11.5px;color:var(--muted)}
@media(prefers-reduced-motion:reduce){.brain-pulse i,.bstep-spin{animation:none}}

/* ===== PER-BED RESULT HERO ===== */
.comp-sub{font-family:var(--font-display);font-weight:600;font-size:13.5px;margin:16px 0 10px;color:var(--muted)}
.result-hero{display:flex;justify-content:space-between;align-items:flex-start;gap:20px;flex-wrap:wrap}
.rh-left{min-width:0;flex:1}
.rh-unit{font-family:var(--font-display);font-weight:700;font-size:22px;line-height:1.1;color:var(--text)}
.rh-tags{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-top:10px}
.rh-tag{display:inline-flex;align-items:center;font-family:var(--font-mono);font-size:11px;font-weight:600;padding:3px 9px;border-radius:20px;background:var(--bg2);color:var(--muted);white-space:nowrap;border:1px solid var(--border)}
.rh-right{text-align:right;flex:none}
.rh-cap{font-family:var(--font-mono);font-size:10.5px;letter-spacing:.14em;color:var(--teal);font-weight:600}
.rh-num{font-family:var(--font-display);font-weight:700;font-size:40px;line-height:1;letter-spacing:-.02em;color:var(--text);font-variant-numeric:tabular-nums;margin-top:3px}
.rh-num span{font-family:var(--font-body);font-size:16px;font-weight:500;color:var(--muted);letter-spacing:0}
.rh-det{font-size:11.5px;color:var(--faint);margin-top:5px}
.rh-band{font-family:var(--font-mono);font-size:12px;color:var(--muted);margin-top:3px}
.rh-band b{color:var(--text);font-weight:600}
.score-bar{height:8px;border-radius:8px;background:var(--bg2);overflow:hidden;margin:18px 0 14px}
.score-bar>span{display:block;height:100%;border-radius:8px;background:linear-gradient(90deg,var(--teal),var(--blue));width:0;animation:scoreGrow .9s cubic-bezier(.4,0,.2,1) forwards}
@keyframes scoreGrow{from{width:0}}
@media(prefers-reduced-motion:reduce){.score-bar>span{animation:none}}
.rh-stats{display:grid;grid-template-columns:repeat(4,1fr);gap:14px;margin-bottom:14px}
.rh-stat{display:flex;flex-direction:column;gap:2px}
.rh-stat b{font-family:var(--font-display);font-weight:700;font-size:20px;color:var(--text);line-height:1;font-variant-numeric:tabular-nums}
.rh-stat span{font-size:11px;color:var(--muted)}
.rh-util{font-size:12.5px;color:var(--muted);line-height:1.5;padding:10px 12px;background:var(--surface2);border:1px solid var(--border);border-radius:10px}
.rh-util strong{color:var(--text)}

/* ===== COLLAPSIBLE COMPARABLES DATA TABLE ===== */
.comp-panel{margin-top:16px;border:1px solid var(--border2);border-radius:12px;overflow:hidden}
.comp-panel>summary{list-style:none;cursor:pointer;display:flex;align-items:center;justify-content:space-between;gap:10px;
  padding:13px 16px;font-family:var(--font-display);font-weight:600;font-size:14px;color:var(--text);background:var(--surface2);user-select:none}
.comp-panel>summary::-webkit-details-marker{display:none}
.comp-panel>summary:hover{background:var(--bg2)}
.cp-chev{width:18px;height:18px;color:var(--muted);transition:transform .25s}
.comp-panel[open] .cp-chev{transform:rotate(180deg)}
.comp-table-wrap{overflow-x:auto;max-width:100%;-webkit-overflow-scrolling:touch}
.comp-table{width:100%;border-collapse:collapse;font-size:13px;min-width:820px}
.comp-table th{text-align:left;font-family:var(--font-mono);font-size:10px;letter-spacing:.06em;color:var(--faint);text-transform:uppercase;
  padding:11px 14px;border-bottom:1px solid var(--border2);font-weight:600;white-space:nowrap;background:var(--surface)}
.comp-table th .th-sub{display:block;font-size:8.5px;letter-spacing:.04em;color:var(--faint);opacity:.8;font-weight:500;margin-top:1px}
.comp-table td{padding:12px 14px;border-bottom:1px solid var(--border);vertical-align:middle;overflow-wrap:anywhere;word-break:break-word}
.comp-table tr:last-child td{border-bottom:none}
.comp-table .num{font-family:var(--font-mono);font-variant-numeric:tabular-nums;white-space:nowrap}
.ct-name{display:flex;align-items:flex-start;gap:9px;min-width:260px;max-width:360px}
.ct-idx{font-family:var(--font-mono);font-size:11px;font-weight:700;color:var(--teal);padding-top:1px}
.ct-name>div{min-width:0}
.ct-name b{font-family:var(--font-display);font-weight:600;font-size:13.5px;color:var(--text);line-height:1.25}
.ct-name em{display:block;font-style:normal;font-size:11.5px;color:var(--muted);margin-top:1px}
.ct-samplecount{display:inline-block;font-family:var(--font-mono);font-size:9.5px;font-weight:700;letter-spacing:.03em;
  color:var(--teal);background:var(--teal-soft);border-radius:5px;padding:1px 6px;margin-left:5px;vertical-align:middle}
.ct-samples{display:flex;flex-wrap:wrap;gap:4px 10px;margin-top:5px}
.ct-samples .samp{font-family:var(--font-mono);font-size:10px;color:var(--muted);background:var(--surface2);border:1px solid var(--border);border-radius:5px;padding:1px 6px}
.ct-med{font-family:var(--font-mono);font-size:8.5px;font-weight:600;color:var(--faint);text-transform:uppercase;letter-spacing:.04em}
.ct-nosrc{color:var(--faint)}
.ct-foot{padding:10px 14px;font-size:11px;color:var(--muted);background:var(--surface2);line-height:1.5}
/* inline nine-factor block, shown on every comparable row */
.nf-inline{margin-top:7px}
.nf-inline>summary{cursor:pointer;list-style:none;font-family:var(--font-mono);font-size:10px;font-weight:700;letter-spacing:.03em;
  color:var(--teal);display:inline-flex;align-items:center;gap:5px;padding:2px 0;user-select:none}
.nf-inline>summary::-webkit-details-marker{display:none}
.nf-inline>summary::before{content:"▸";font-size:9px;transition:transform .15s ease;color:var(--teal)}
.nf-inline[open]>summary::before{transform:rotate(90deg)}
/* ---- rebuilt nine-factor block: inline chip summary + flat scannable grid (no cascading list) ---- */
/* summary line: label + at-a-glance chip strip of factors that moved + data-backed count */
.nf-inline>summary{flex-wrap:wrap;gap:7px}
.nf-sum-lead{flex:none}
.nf-sum-chips{display:inline-flex;flex-wrap:wrap;gap:4px;font-family:var(--font-body);font-weight:600;letter-spacing:0}
.nf-sum-count{margin-left:auto;font-family:var(--font-mono);font-size:9.5px;font-weight:700;letter-spacing:.04em;
  color:var(--teal);background:var(--surface2);border:1px solid var(--border);border-radius:20px;padding:2px 8px;white-space:nowrap}
.nfc-chip{display:inline-flex;align-items:center;font-family:var(--font-mono);font-size:10px;font-weight:700;
  padding:2px 7px;border-radius:6px;white-space:nowrap;font-variant-numeric:tabular-nums}
.nfc-chip.pos{background:var(--green-soft);color:var(--green)}
.nfc-chip.neg{background:var(--amber-soft);color:var(--amber)}
.nfc-chip.flat{background:var(--bg2);color:var(--muted);font-weight:600}
/* flat grid: one row per factor — factor · adj · source flag · basis
   Fix 2026-08-04 (Severity 4: Defects 3 + 6, nine-factor grid). This grid lives inside
   .ct-name, whose own max-width:360px (line ~703) caps it to ~300-320px of real content
   room on EVERY viewport, not just mobile -- a rigid `96px 62px 96px 1fr` grid template
   left only ~40px for the "why" text column, so words collapsed to one character per line
   and inflated single rows past 1900px tall (reproduced identically at 375px and 1280px
   viewports -- the constraint is the ancestor's fixed max-width, not the screen size, so
   no media query is used). The rigid 4-column grid is replaced with a flex layout: factor
   label / adjustment value / source flag share one compact wrapping line, and the why text
   is forced onto its own full-width line beneath -- readable at any container width, never
   truncated or single-character-wrapped. */
.nfg{margin:8px 0 2px;border:1px solid var(--border);border-radius:9px;background:var(--surface2);overflow:hidden}
.nfg-head{display:none}
.nfg-row{display:flex;flex-wrap:wrap;align-items:baseline;gap:4px 10px;padding:8px 11px;font-size:11px;line-height:1.35;border-bottom:1px solid var(--border)}
.nfg-row:last-child{border-bottom:none}
.nfg-fac{font-weight:600;color:var(--text);flex:1 1 auto;min-width:0;overflow-wrap:break-word;word-break:normal;hyphens:auto;order:1}
.nfg-val{font-family:var(--font-mono);font-weight:700;font-size:10.5px;font-variant-numeric:tabular-nums;order:2}
.nfg-val.pos{color:var(--green)}.nfg-val.neg{color:var(--amber)}.nfg-val.zero{color:var(--faint)}
.nfg-why{color:var(--muted);font-size:10.5px;overflow-wrap:anywhere;word-break:break-word;order:4;flex:1 1 100%;width:100%;margin-top:2px}
.nfg-flag{font-family:var(--font-mono);font-size:8.5px;font-weight:700;letter-spacing:.03em;text-transform:uppercase;
  padding:2px 6px;border-radius:5px;white-space:nowrap;align-self:start;text-align:center;order:3}
.nfg-flag.backed{background:var(--green-soft);color:var(--green)}
.nfg-flag.matched{background:var(--bg2);color:var(--muted)}
.nfg-flag.reviewer{background:rgba(29,95,216,.10);color:var(--blue)}
.nfg-flag.assess{background:var(--amber-soft);color:var(--amber)}
/* precision badge — which learned tier drove the dollars + fit metrics */
.prec-badge{margin-top:14px;display:flex;flex-wrap:wrap;align-items:center;gap:10px 14px;
  padding:10px 13px;border:1px solid var(--border2);border-radius:11px;
  background:linear-gradient(180deg,var(--surface2),var(--surface));}
.prec-badge.loading{font-size:11.5px;color:var(--muted);gap:8px}
.prec-badge .pb-dot{width:7px;height:7px;border-radius:50%;background:var(--amber);flex:none}
.pb-lead{display:inline-flex;align-items:center;gap:8px}
.pb-tier{font-family:var(--font-mono);font-size:10px;font-weight:700;letter-spacing:.03em;padding:3px 9px;border-radius:7px;
  text-transform:uppercase;background:var(--green-soft);color:var(--green);white-space:nowrap}
.pb-tier.regional{background:rgba(29,95,216,.10);color:var(--blue)}
.pb-tier.national{background:var(--bg2);color:var(--muted)}
.pb-label{font-size:11px;font-weight:600;color:var(--text)}
.pb-metrics{display:inline-flex;flex-wrap:wrap;gap:5px}
.pb-metric{font-family:var(--font-mono);font-size:9.5px;font-weight:700;letter-spacing:.02em;font-variant-numeric:tabular-nums;
  padding:2px 7px;border-radius:6px;background:var(--surface);border:1px solid var(--border);color:var(--text)}
.pb-metric.cal{background:var(--amber-soft);color:var(--amber);border-color:transparent;font-weight:600}
.pb-foot{flex-basis:100%;font-size:10.5px;color:var(--muted);line-height:1.4}
.adjchip.note{background:var(--amber-soft);color:var(--amber);white-space:normal;line-height:1.35;max-width:230px;font-weight:600}
.cs-badge{display:inline-flex;align-items:baseline;gap:1px;font-family:var(--font-mono);font-weight:700;font-size:14px;
  padding:3px 8px;border-radius:8px;font-variant-numeric:tabular-nums}
.cs-badge i{font-style:normal;font-size:9px;font-weight:600;opacity:.7}
.cs-badge.hi{background:var(--green-soft);color:var(--green)}
.cs-badge.mid{background:var(--amber-soft);color:var(--amber)}
.cs-badge.lo{background:var(--bg2);color:var(--muted)}
.ct-adj{max-width:240px}
.adjchip{display:inline-flex;align-items:center;font-family:var(--font-mono);font-size:10.5px;font-weight:600;
  padding:2px 7px;border-radius:6px;margin:1px 2px 1px 0;white-space:nowrap}
.adjchip.pos{background:var(--green-soft);color:var(--green)}
.adjchip.neg{background:var(--amber-soft);color:var(--amber)}
.adjchip.zero{background:var(--bg2);color:var(--faint)}
.ct-adjusted{font-weight:700;color:var(--text)}
.ct-src{max-width:180px}
.ct-src a{color:var(--blue);text-decoration:none;font-size:12px;display:inline-block;max-width:100%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;vertical-align:middle}
.ct-src a:hover{text-decoration:underline}

/* nine-factor grid */
.nine-wrap{margin-top:16px;border:1px solid var(--border2);border-radius:12px;overflow:hidden}
.rr-table.nine{margin-top:0}
.rr-table.nine th,.rr-table.nine td{padding:9px 12px;overflow-wrap:anywhere;word-break:break-word}
.rr-table.nine .fac{font-weight:600;color:var(--text)}
.rr-table.nine .fac-reason{font-size:11.5px;color:var(--muted);margin-top:2px;line-height:1.4;overflow-wrap:anywhere;word-break:break-word}
.rr-table.nine tr.nine-total td{background:var(--surface2);font-weight:700;border-top:1px solid var(--border2)}

/* ===== Amenity bullet checklist (fix 2026-08-04, Severity 2.3) =====
   Renders differentiating amenities as one ✓/✗ bullet per line instead of a single
   comma/serialized-joined string. overflow-wrap:anywhere guards every line so even an
   unusually long single amenity name (or one containing embedded punctuation) wraps
   inside its own list item instead of bleeding into neighboring cells. Long lists are
   capped at AMENITY_BULLET_CAP (4) with a native <details> "show all N" expander rather
   than ever dumping every amenity into one block. */
.amen-wrap{margin-top:4px;max-width:100%}
.amen-list{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:3px;max-width:100%}
.amen-list.compact{gap:2px}
.amen-li{display:flex;align-items:baseline;gap:6px;font-size:11px;line-height:1.35;overflow-wrap:anywhere;word-break:break-word;max-width:100%}
.amen-mark{flex:none;font-weight:700;width:13px;text-align:center}
.amen-li.amen-yes .amen-mark{color:var(--green)}
.amen-li.amen-no .amen-mark{color:var(--amber)}
.amen-name{flex:1 1 auto;min-width:0;color:var(--text);overflow-wrap:anywhere;word-break:break-word}
.amen-val{flex:none;font-family:var(--font-mono);font-weight:700;font-size:10.5px;font-variant-numeric:tabular-nums}
.amen-val.pos{color:var(--green)}
.amen-val.neg{color:var(--amber)}
.amen-more{margin-top:3px}
.amen-more>summary{cursor:pointer;font-size:10.5px;font-weight:600;color:var(--blue);list-style:none}
.amen-more>summary::-webkit-details-marker{display:none}
.amen-more>summary::before{content:"+ ";}
/* Fix 2026-08-04 (Sev: literal "u2212" text bug): CSS string escapes use \XXXX
   (no "u" prefix) -- "\u2212" is not a valid CSS escape, so browsers render it as the
   literal four characters "u2212" followed by a space instead of a minus sign. The
   correct CSS escape for U+2212 MINUS SIGN is \2212. */
.amen-more[open]>summary::before{content:"\2212 ";}

/* verdict chips (per-factor + comp status) */
.vchip{display:inline-flex;align-items:center;gap:5px;font-family:var(--font-mono);font-size:10.5px;font-weight:700;
  padding:3px 9px;border-radius:20px;letter-spacing:.03em;white-space:nowrap}
.vchip.ok{background:var(--green-soft);color:var(--green)}
.vchip.no{background:var(--amber-soft);color:var(--amber)}
.vchip.pend{background:var(--bg2);color:var(--faint);border:1px solid var(--border2)}
.vchip.refused{background:var(--ft-red-bg);color:var(--ft-red);border:1px solid var(--ft-red)}

/* comp-count badge in determination summary */
.comp-badge{display:inline-flex;align-items:center;gap:4px;font-family:var(--font-mono);
  font-weight:700;font-size:12px;padding:3px 9px;border-radius:20px;letter-spacing:.02em;
  background:var(--green-soft);color:var(--green);white-space:nowrap}
.comp-badge.low{background:var(--amber-soft);color:var(--amber)}
.comp-badge .cb-label{font-size:9.5px;font-weight:600;letter-spacing:.05em;text-transform:uppercase;opacity:.8}
.comp-badge .cb-icon{width:12px;height:12px;flex:none;margin-right:1px}
.bed-head-chips{display:inline-flex;align-items:center;gap:8px;flex-wrap:wrap}

@media(max-width:760px){
  .rh-stats{grid-template-columns:repeat(2,1fr)}
  .result-hero{flex-direction:column}
  .rh-right{text-align:left}
  .rh-num{font-size:34px}
  .subj-photo{width:100%;height:150px}
}

/* ===== Amenity dollar-weight editor (reviewer-editable, 982.507(b)(2)) ===== */
.aw-panel{margin-top:20px;border:1px solid var(--border2);border-radius:12px;overflow:hidden;background:var(--surface)}
.aw-panel>summary{list-style:none;cursor:pointer;display:flex;align-items:center;gap:10px;
  padding:13px 16px;font-weight:650;font-size:14px;color:var(--text);background:var(--surface2)}
.aw-panel>summary::-webkit-details-marker{display:none}
.aw-panel>summary::before{content:"";width:8px;height:8px;border-right:2px solid var(--muted);
  border-bottom:2px solid var(--muted);transform:rotate(-45deg);transition:transform .18s;margin-right:2px}
.aw-panel[open]>summary::before{transform:rotate(45deg)}
.aw-panel>summary:hover{background:var(--bg2)}
.aw-badge{font-size:10.5px;font-weight:700;letter-spacing:.03em;text-transform:uppercase;
  color:var(--teal2);background:var(--teal-soft);border-radius:20px;padding:2px 9px}
.aw-body{padding:14px 16px 18px}
.aw-note{font-size:12.5px;line-height:1.55;color:var(--muted);margin:0 0 14px}
.aw-note a{color:var(--blue);text-decoration:underline}
.aw-globals{display:flex;flex-wrap:wrap;align-items:flex-end;gap:14px;margin-bottom:16px}
.aw-fld{display:flex;flex-direction:column;gap:5px}
.aw-fld label{font-size:11.5px;font-weight:600;color:var(--muted)}
.aw-ov-input{position:relative;display:flex;align-items:center}
.aw-dollar{position:absolute;left:10px;font-size:13px;color:var(--faint);pointer-events:none}
.aw-ov-input input{width:110px;padding:8px 10px 8px 22px;border:1px solid var(--border2);border-radius:8px;
  background:var(--bg);color:var(--text);font-size:13px;font-variant-numeric:tabular-nums}
.aw-ov-input input:focus{outline:none;border-color:var(--blue);box-shadow:0 0 0 3px var(--blue-soft)}
.aw-reset{align-self:flex-end;background:var(--bg2);color:var(--muted);border:1px solid var(--border2);
  border-radius:8px;padding:8px 14px;font-size:12.5px;font-weight:600;cursor:pointer}
.aw-reset:hover{background:var(--border);color:var(--text)}
.aw-ov-head{font-size:11.5px;font-weight:700;letter-spacing:.02em;text-transform:uppercase;
  color:var(--faint);margin:6px 0 10px;padding-top:12px;border-top:1px solid var(--border)}
.aw-ov-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:8px 16px}
.aw-ov-row{display:flex;align-items:center;justify-content:space-between;gap:10px}
.aw-ov-name{font-size:12.5px;color:var(--text);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.aw-ov-row .aw-ov-input input{width:86px}
.aw-empty{font-size:12.5px;color:var(--muted);font-style:italic}
.aw-ov-default{font-size:10.5px;color:var(--faint);font-weight:500;margin-left:6px;white-space:nowrap}
@media(max-width:640px){.aw-ov-grid{grid-template-columns:1fr}}

/* sqft not on file / withheld as implausible — dash with a tooltip explaining why, never a bare
   1-5 sf raw value (ENRICHMENT_FIX_SPEC.md section C). */
.sqft-na{color:var(--faint);cursor:help;border-bottom:1px dotted var(--faint)}

/* =====================================================================
   FOUNDRY OVERRIDE LAYER
   Pixel-match rentspire-bspain/spain-terminal-v2 (Palantir Foundry
   visual language) for the Rent Reasonableness vertical. Cascades last
   so it wins over the legacy Civic rules without editing every one.
   ===================================================================== */

/* Global type + density. Inter, 15px canvas, tighter heading tracking. */
html,body{font-family:var(--font-body);font-size:15px;line-height:1.5}
body{font-feature-settings:'cv02','cv03','cv04','cv11'}
.ft-mono,.mono{font-family:var(--font-mono);font-variant-numeric:tabular-nums}

/* Flatten radii to Foundry 4px. Pills/steppers keep their round. */
.card,.subject-card,.report-card,.search-card,.hotma-box,.method-card,
.field-select,.search-input,.search-input-wrap,.btn-primary,.btn-switch-state,
.theme-toggle,.section-icon,.signin-card{border-radius:4px !important}
.card{padding:16px !important;margin-bottom:14px !important;box-shadow:none !important;
  background:var(--ft-card);border:1px solid var(--ft-hairline)}
.section{margin-top:26px}

/* ---- Foundry top app bar (44px, flat, brand cube) ---- */
.appbar{position:sticky;top:0;z-index:40;height:44px;padding:0 12px;
  background:var(--ft-app-bg) !important;backdrop-filter:none !important;
  border-bottom:1px solid var(--ft-hairline);gap:12px}
.appbar-brand{gap:10px}
/* replace the legacy outlined RentSpire mark with the Foundry gradient cube */
.appbar .logo.sm{width:26px;height:26px;color:var(--on-blue);background:var(--ft-blue-solid);
  border-radius:6px;padding:5px;box-shadow:0 1px 2px rgba(16,22,26,.25)}
.dark .appbar .logo.sm{color:#fff}
.brand-name{font-family:var(--font-body);font-weight:700;font-size:15px;letter-spacing:-.01em}
.appbar-tag{font-family:var(--font-mono);font-size:10px;color:var(--ft-text-muted);
  border-left:1px solid var(--ft-hairline);padding-left:10px;letter-spacing:.05em;text-transform:uppercase}
.appbar-right{gap:8px}
.appbar-pha{font-size:12px;color:var(--ft-text-muted);max-width:300px}
.theme-toggle,.btn-switch-state{height:32px;background:var(--ft-card) !important;
  border:1px solid var(--ft-hairline);color:var(--ft-text-secondary)}
.theme-toggle{width:32px}.theme-toggle svg{width:15px;height:15px}
.btn-switch-state{font-size:12.5px;font-weight:600}
.btn-switch-state:hover,.theme-toggle:hover{border-color:var(--ft-hairline-strong);color:var(--ft-text)}

/* LIVE object-count pill (Foundry chrome) */
.ft-live{display:inline-flex;align-items:center;gap:6px;font-family:var(--font-mono);
  font-size:11.5px;color:var(--ft-text-muted);letter-spacing:.02em}
.ft-live .dot{width:7px;height:7px;border-radius:50%;background:var(--ft-green);
  box-shadow:0 0 6px var(--ft-green);display:inline-block}

/* ASK button (mirrors the ⌘K palette affordance) */
.ft-ask{display:inline-flex;align-items:center;gap:6px;height:32px;padding:0 10px;border-radius:4px;
  border:1px solid var(--ft-hairline);background:var(--ft-card);color:var(--ft-text-secondary);
  font-size:12.5px;font-weight:600;cursor:pointer}
.ft-ask:hover{border-color:var(--ft-hairline-strong);color:var(--ft-text)}
.ft-ask kbd{font-family:var(--font-mono);font-size:11px;color:var(--ft-text-muted);
  border:none;background:none;padding:0}

/* ---- second-row nav (context tabs) ---- */
.ft-nav{position:sticky;top:44px;z-index:39;display:flex;align-items:stretch;height:32px;
  padding:0 10px;gap:2px;background:var(--ft-app-bg);border-bottom:1px solid var(--ft-hairline);
  overflow-x:auto}
.ft-nav .navgroup{font-family:var(--font-mono);font-size:10px;letter-spacing:.09em;font-weight:700;
  color:var(--ft-cyan);background:var(--ft-cyan-bg);border:1px solid var(--ft-cyan);border-radius:var(--r-sm);
  padding:2px 6px;align-self:center;margin-right:7px}

.ft-nav a{display:inline-flex;align-items:center;gap:6px;padding:0 8px;white-space:nowrap;
  font-size:13px;font-weight:500;color:var(--ft-text-muted);text-decoration:none;position:relative}
.ft-nav a.active{color:var(--ft-text);font-weight:600}
.ft-nav a.active::after{content:"";position:absolute;left:6px;right:6px;bottom:0;height:2px;
  background:var(--ft-blue);border-radius:2px}
.ft-nav a svg{width:14px;height:14px}
.ft-nav .sep{width:1px;background:var(--ft-hairline);margin:6px 7px}

/* ---- Foundry chips ---- */
.ft-chip{display:inline-flex;align-items:center;gap:4px;font-size:12px;font-weight:500;
  padding:1px 7px;border-radius:3px;line-height:18px;white-space:nowrap}
.ft-chip.green{background:var(--ft-green-bg);color:var(--ft-green)}
.ft-chip.amber{background:var(--ft-amber-bg);color:var(--ft-amber)}
.ft-chip.red{background:var(--ft-red-bg);color:var(--ft-red)}
.ft-chip.blue{background:var(--ft-sel-row);color:var(--ft-blue)}
.ft-chip.neutral{background:var(--ft-sunken);color:var(--ft-text-secondary)}
.ft-chip .cdot{width:6px;height:6px;border-radius:50%;background:currentColor;display:inline-block}

/* Column-head label */
.ft-colhead{font-size:11px;font-weight:600;letter-spacing:.03em;text-transform:uppercase;color:var(--ft-text-secondary)}

/* Dense tables: 40px-ish rows, hairline borders, hover + selected row */
table td,table th{font-size:13px}
tr{transition:background .1s}
.ft-selrow{background:var(--ft-sel-row) !important;box-shadow:inset 2px 0 0 var(--ft-blue)}

/* Headings retract to Foundry sizes */
.card-h3,.map-title{font-family:var(--font-body);font-weight:600;font-size:15px;letter-spacing:-.01em}
.section-title{font-family:var(--font-body);font-weight:600;font-size:16px;letter-spacing:-.01em}
.signin-h1{font-family:var(--font-body);font-weight:700;font-size:26px;letter-spacing:-.01em}
.brand-name{font-family:var(--font-body)}

/* map header sits right under the 44+32 chrome */
.map-header{top:76px}

/* ---- Signal ticker pinned to the viewport floor (Foundry chrome) ---- */
.ft-ticker{position:fixed;left:0;right:0;bottom:0;height:var(--ft-ticker-h);z-index:60;
  display:flex;align-items:center;gap:0;background:var(--ft-app-bg);
  border-top:1px solid var(--ft-hairline);overflow:hidden;font-size:12px}
.ft-ticker .tk-label{flex-shrink:0;display:inline-flex;align-items:center;gap:6px;height:100%;
  padding:0 12px;background:var(--ft-sunken);border-right:1px solid var(--ft-hairline);
  font-family:var(--font-mono);font-size:10px;font-weight:700;letter-spacing:.08em;
  text-transform:uppercase;color:var(--ft-text-secondary)}
.ft-ticker .tk-label .dot{width:7px;height:7px;border-radius:50%;background:var(--ft-green);
  box-shadow:0 0 6px var(--ft-green)}
.ft-ticker .tk-track{display:inline-flex;align-items:center;white-space:nowrap;
  animation:ft-marquee 90s linear infinite;will-change:transform}
.ft-ticker:hover .tk-track{animation-play-state:paused}
.ft-ticker .tk-item{padding:0 22px;color:var(--ft-text-secondary)}
.ft-ticker .tk-item b{color:var(--ft-text);font-weight:600}
.ft-ticker .tk-item .up{color:var(--ft-green)}.ft-ticker .tk-item .dn{color:var(--ft-red)}
@keyframes ft-marquee{from{transform:translateX(0)}to{transform:translateX(-50%)}}
@media (prefers-reduced-motion:reduce){.ft-ticker .tk-track{animation:none}}
/* keep page content clear of the fixed ticker */
.content{padding-bottom:60px}
@media print{.ft-ticker,.ft-dock{display:none !important}}

/* ---- Ask AIP chat dock (rule 7) ---- */
.ft-dock{position:fixed;right:16px;bottom:calc(var(--ft-ticker-h) + 14px);z-index:70}
.ft-dock-pill{display:inline-flex;align-items:center;gap:8px;height:38px;padding:0 15px 0 13px;
  border-radius:999px;background:var(--ft-card);border:1px solid var(--ft-hairline-strong);
  box-shadow:var(--shadow-pop);cursor:pointer;font-size:12.5px;font-weight:600;color:var(--ft-text)}
.ft-dock-pill svg{color:var(--ft-link)}
.ft-dock-panel{width:420px;max-width:calc(100vw - 32px);max-height:min(560px,calc(100vh - 140px));
  display:flex;flex-direction:column;background:var(--ft-card);border:1px solid var(--ft-hairline-strong);
  border-radius:8px;box-shadow:var(--shadow-pop)}
.ft-dock-head{display:flex;align-items:center;gap:8px;height:38px;padding:0 12px;
  border-bottom:1px solid var(--ft-hairline);flex-shrink:0}
.ft-dock-head .ttl{font-size:12.5px;font-weight:600;color:var(--ft-text)}
.ft-dock-head .sub{font-size:10.5px;color:var(--ft-text-muted)}
.ft-dock-head .x{margin-left:auto;width:24px;height:24px;border:none;background:none;cursor:pointer;
  color:var(--ft-text-muted);display:flex;align-items:center;justify-content:center;border-radius:4px}
.ft-dock-head .x:hover{background:var(--ft-sunken)}
.ft-dock-body{flex:1;overflow:auto}
.ft-dock-note{padding:8px 12px;font-size:12px;color:var(--ft-text);border-bottom:1px solid var(--ft-hairline);background:var(--ft-sunken)}
.ft-dock-intro{padding:10px 12px}
.ft-dock-intro .lead{font-size:11.5px;color:var(--ft-text-muted);line-height:1.45}
.ft-dock-intro .try{font-size:10px;letter-spacing:.08em;color:var(--ft-text-muted);font-weight:600;margin-top:10px}
.ft-dock-chips{display:flex;flex-wrap:wrap;gap:6px;margin-top:6px}
.ft-dock-ex{cursor:pointer;background:var(--ft-sunken);color:var(--ft-text-secondary);
  border:1px solid var(--ft-hairline);border-radius:3px;font-size:12px;padding:1px 7px;line-height:18px}
.ft-dock-ex:hover{border-color:var(--ft-hairline-strong)}
.ft-dock-plan{padding:8px 12px;border-bottom:1px solid var(--ft-hairline);background:var(--ft-sunken)}
.ft-dock-plan .hd{font-size:10px;letter-spacing:.08em;color:var(--ft-text-muted);font-weight:600}
.ft-dock-tags{display:flex;flex-wrap:wrap;gap:6px;margin-top:5px}
.ft-tag{display:inline-flex;align-items:center;gap:4px;font-size:11px;padding:1px 6px;border-radius:3px;
  background:var(--ft-sunken);color:var(--ft-text-secondary);border:1px solid var(--ft-hairline)}
.ft-tag.blue{background:var(--ft-sel-row);color:var(--ft-blue);border-color:transparent}
.ft-tag.green{background:var(--ft-green-bg);color:var(--ft-green);border-color:transparent}
.ft-tag.amber{background:var(--ft-amber-bg);color:var(--ft-amber);border-color:transparent}
.ft-tag.red{background:var(--ft-red-bg);color:var(--ft-red);border-color:transparent}
.ft-tag .op{color:var(--ft-blue)}
.ft-dock-readtoggle{margin-top:6px;font-size:10.5px;color:var(--ft-link);background:none;border:none;
  padding:0;cursor:pointer;text-decoration:underline}
.ft-dock-read{margin-top:5px;font-family:var(--font-mono);font-size:10px;line-height:1.5;
  color:var(--ft-text-muted);word-break:break-all;background:var(--ft-card);
  border:1px solid var(--ft-hairline);border-radius:4px;padding:5px 6px}
.ft-dock-resulthead{display:flex;align-items:center;gap:8px;padding:6px 12px;
  border-bottom:1px solid var(--ft-hairline);font-size:11.5px}
.ft-dock-resulthead .tbl{margin-left:auto;font-family:var(--font-mono);font-size:10px;color:var(--ft-text-muted)}
.ft-dock-row{padding:6px 12px;border-bottom:1px solid var(--ft-hairline)}
.ft-dock-row .kv{display:flex;gap:8px;font-size:11.5px;align-items:baseline}
.ft-dock-row .kv .k{color:var(--ft-text-muted);min-width:96px;flex-shrink:0}
.ft-dock-row .kv .v{color:var(--ft-text);word-break:break-word}
.ft-dock-input{display:flex;align-items:center;gap:8px;height:42px;padding:0 12px;
  border-top:1px solid var(--ft-hairline);flex-shrink:0}
.ft-dock-input input{flex:1;background:transparent;border:none;outline:none;font-size:13px;color:var(--ft-text);font-family:inherit}
.ft-dock-input button{height:28px;padding:0 12px;border-radius:4px;border:none;
  background:var(--ft-blue-solid);color:var(--on-blue);font-size:11.5px;font-weight:600;cursor:pointer;
  display:inline-flex;align-items:center;gap:5px}
.ft-dock-input button:disabled{opacity:.45;cursor:not-allowed}
.ft-dock-foot{padding:6px 12px;border-top:1px solid var(--ft-hairline);font-size:10px;color:var(--ft-text-muted)}

/* ---- Foundry appbar: keep a single line on small screens ---- */
@media(max-width:520px){
  .appbar-tag{display:none}
  .appbar{padding:0 10px}
  .brand-name{font-size:14px}
  .ft-live{font-size:10px}
  .ft-ask .kbd,.ft-ask kbd{display:none}
}
@media(max-width:400px){
  .appbar .logo.sm{width:24px;height:24px}
  /* §12.6: "Change state" button's text label (127px) pushed #theme-toggle
     off the right edge of a 390px viewport, causing horizontal overflow.
     Collapse to icon-only, matching the existing ⌘K-hiding pattern above. */
  .btn-switch-state span{display:none}
  .btn-switch-state{padding:0 9px;width:32px;justify-content:center}
  .appbar-right{gap:6px}
}
@media(max-width:440px){
  .ia-row{grid-template-columns:1fr}
}

/* ---- Fixed Foundry chrome (ticker + Ask AIP dock) never collides with page
   content at narrow widths (§12.6 defect, reproduced on the REAL first-paint
   state -- no property selected yet, so #subject-card/#report-card are both
   .hidden and the page is only appbar+nav+map(380px)+picker-card tall before
   Methodology starts. At 390x844 that lands the Methodology heading directly
   behind the fixed ticker bar, which has an opaque background -- the
   section-sub text is genuinely unreadable under it, not just a test
   artifact). scroll-margin-bottom keeps browser scroll-into-view/anchor
   behavior from ever parking a heading behind the fixed zone on later
   scroll; content padding and the explicit gap below reserve real clearance
   for the common, everyday first-load case above. ---- */
.section{scroll-margin-bottom:calc(var(--ft-ticker-h) + 64px)}
@media(max-width:520px){
  .content{padding-bottom:calc(var(--ft-ticker-h) + 76px)}
  .ft-dock{right:10px;bottom:calc(var(--ft-ticker-h) + 10px)}
  .ft-dock-pill span{display:none} /* icon-only pill: "Ask AIP" text was the width driver colliding with adjacent content */
  .ft-dock-pill{padding:0 11px;gap:0}
  .ft-ticker{font-size:11px}
  .ft-ticker .tk-label{padding:0 8px;font-size:9px}
  .ft-ticker .tk-item{padding:0 14px}
  /* Reserve real clearance above the fixed ticker+dock zone specifically
     where the short first-load state (map + picker card, nothing selected
     yet) would otherwise put the Methodology heading directly behind it. */
  #nav-method{margin-top:calc(var(--ft-ticker-h) + 56px)}
}

/* ============ INSTANT ANSWER FAST PATH ============
   The single-screen entry point: address + bedrooms in, determination out.
   Lives on the sign-in card, above the state/PHA workspace sign-in (which
   collapses into a <details> for power users). Civic Modern light tokens
   only -- no new framework, no new palette. */
.instant-answer{margin-top:18px;padding:18px;background:var(--ft-canvas);border:1px solid var(--ft-hairline);border-radius:12px}
.ia-input{margin-bottom:14px}
.ia-row{display:grid;grid-template-columns:1fr 1fr;gap:12px;margin-bottom:4px}
.ia-col{display:flex;flex-direction:column}
.instant-answer .btn-primary{margin-top:14px}
.ia-coverage{display:flex;align-items:center;gap:8px;margin-top:12px;font-size:12.5px;color:var(--ft-text-secondary);line-height:1.4}
.ia-cov-dot{flex-shrink:0;width:9px;height:9px;border-radius:50%}
.ia-cov-good{background:var(--ft-green)}
.ia-cov-thin{background:var(--ft-amber)}
.ia-status{margin-top:12px;display:flex;align-items:center;gap:8px;font-size:12.5px;color:var(--ft-text-secondary)}
.ia-status .spin{width:13px;height:13px;border-width:2px}

.ia-advanced{margin-top:16px;font-size:12.5px;color:var(--ft-text-muted)}
.ia-advanced summary{cursor:pointer;padding:4px 0;color:var(--ft-link)}
.ia-advanced-body{margin-top:14px;padding-top:14px;border-top:1px solid var(--ft-hairline)}

/* Confirmation strip shown in the workspace when arriving via the fast path */
.ia-banner{background:var(--ft-sel-row);border-color:color-mix(in srgb,var(--ft-blue) 30%,transparent)}
.ia-banner-row{display:flex;flex-direction:column;gap:4px;font-size:13.5px}

/* ============ DATA COVERAGE STRIP (login screen) ============
   CONVERSION.md §7 designed treatment: a grouped, contrast band -- not bare
   numbers floating in whitespace, and not a flex-nowrap row that collides at
   narrow widths (the §12.6 defect: "974 Adjustment coefficients" and
   "27 Amenity value weights" and "4,585 Properties w/ unit mix" running into
   each other on the live site because flex:1 1 0 + min-width + nowrap labels
   never had room to both fit). Fixed with an explicit CSS grid: each cell has
   a fixed column track, and labels/sub-lines WRAP instead of clipping or
   overlapping. Single source of truth for every number: public.mv_rr_login_headline
   (see loadDataCoverage() in app.js) -- never a fabricated or hardcoded value. */
.data-coverage{position:relative;z-index:1;width:100%;max-width:1320px;margin:22px auto 0;
  background:var(--ft-panel-bg);border:1px solid var(--ft-panel-line);border-radius:var(--r-lg);box-shadow:var(--shadow-card);
  overflow:hidden}
.dc-head{display:flex;flex-wrap:wrap;align-items:baseline;justify-content:space-between;gap:8px;
  padding:14px 22px;border-bottom:1px solid rgba(255,255,255,.10)}
.dc-head-title{font-family:var(--font-display);font-weight:700;font-size:14px;color:var(--ft-panel-text);letter-spacing:-.01em}
.dc-head-source{font-family:var(--font-mono);font-size:11px;color:var(--ft-panel-mono);letter-spacing:.01em}
.dc-head-source code{font-family:var(--font-mono);color:var(--ft-panel-accent);background:rgba(255,255,255,.06);padding:1px 5px;border-radius:4px}
.dc-grid{display:grid;grid-template-columns:repeat(4, 1fr);gap:1px;background:var(--ft-panel-line)}
.dc-item{background:var(--ft-panel-bg);display:flex;flex-direction:column;gap:4px;padding:18px 20px;min-width:0}
.dc-num{font-family:var(--font-mono);font-variant-numeric:tabular-nums;font-weight:700;
  font-size:26px;letter-spacing:-.01em;color:var(--ft-panel-text);line-height:1.1}
.dc-label{font-size:12px;letter-spacing:.02em;color:var(--ft-panel-label);
  font-weight:600;white-space:normal;overflow-wrap:break-word;line-height:1.35}
.dc-sub{font-size:11px;color:var(--ft-panel-muted);line-height:1.4;white-space:normal;overflow-wrap:break-word;min-height:1.4em}
/* Ingestion pipeline status strip. Same shell as .data-coverage so it reads as one
   system, not a bolted-on widget. Every value comes from public.v_rr_pipeline_status;
   the strip stays hidden entirely if that fetch fails -- never a stale number. */
.pipeline-status{position:relative;z-index:1;width:100%;max-width:1320px;margin:14px auto 0;
  background:var(--ft-panel-bg);border:1px solid var(--ft-panel-line);border-radius:var(--r-lg);box-shadow:var(--shadow-card);
  overflow:hidden}
.pipeline-status[hidden]{display:none}
.ps-bar{height:8px;background:rgba(255,255,255,.07);margin:16px 22px 0;border-radius:999px;
  overflow:hidden}
.ps-bar-fill{height:100%;border-radius:999px;
  background:linear-gradient(90deg,#2f7d6a 0%,#4fb79b 100%);transition:width .6s ease}
.ps-bar-caption{font-family:var(--font-mono);font-size:11.5px;color:var(--ft-panel-mono);
  padding:8px 22px 16px;line-height:1.5;letter-spacing:.01em}
.ps-bar-caption strong{color:var(--ft-panel-accent);font-weight:700}
.ps-caption-note{display:block;font-family:var(--font-body);font-size:11px;color:var(--ft-panel-muted);
  margin-top:3px;line-height:1.45}
.ps-foot{font-size:11px;color:var(--ft-panel-muted);padding:12px 22px;line-height:1.4;
  border-top:1px solid rgba(255,255,255,.08)}
/* No-rent comps block (added 2026-08-04, owner instruction). Reuses .dc-grid/.dc-item/
   .ps-foot verbatim so it reads as the same system as the strip above it -- only new
   rule needed is the separating top border and the asterisk accent color. Rendered by
   pipeline-status.js from public.v_rr_apartment_headline_norent; kept visually and
   numerically distinct from the rent-bearing strip above (never blended). */
.ps-norent{border-top:1px solid rgba(255,255,255,.14)}
.ps-asterisk{color:var(--ft-panel-warn,#c98a3a);font-weight:700}
.ps-norent-foot{border-top:0}
@media (max-width:900px){
  .ps-bar{margin:14px 16px 0}
  .ps-bar-caption{padding:8px 16px 14px}
  .ps-foot{padding:10px 16px}
}

#dc-computed{font-weight:600;color:var(--ft-panel-label)}
#dc-refreshed{font-weight:600;color:var(--ft-panel-label)}
#dc-refreshed-rel{display:inline;font-weight:400;color:var(--ft-panel-muted);margin-left:4px}
#dc-refreshed-rel:not(:empty)::before{content:"\00b7 "}
/* Structure-type honesty note + source concentration disclosure (2026-08-01).
   Ship with a visible "Loading..." placeholder (never a fabricated number) so the
   disclosure slot is never silently blank while the live fetch is in flight -- these
   are honesty-critical, not decorative, so a stalled network must say so, not hide.
   Only collapses to zero height if JS never touches the element at all (no-JS edge case). */
.dc-structure-note,.dc-concentration-note{font-size:12px;line-height:1.5;color:var(--ft-panel-label);
  padding:10px 22px;border-top:1px solid rgba(255,255,255,.10)}
.dc-structure-note:empty,.dc-concentration-note:empty{display:none;padding:0;border:0}
.dc-structure-note strong,.dc-concentration-note strong{color:var(--ft-panel-text);font-weight:700}
.dc-concentration-note{color:var(--ft-panel-warn)}
.dc-concentration-note strong{color:var(--ft-panel-warn)}
.dc-note-loading{color:var(--ft-panel-muted);font-style:italic}
.dc-note-error{color:var(--ft-panel-muted)}
@media(max-width:720px){
  .dc-grid{grid-template-columns:1fr 1fr}
  .dc-head{flex-direction:column;align-items:flex-start}
}
@media(max-width:440px){
  .dc-grid{grid-template-columns:1fr}
  .dc-num{font-size:22px}
}
.ia-banner-note{color:var(--ft-text-secondary);font-size:12.5px;line-height:1.4}

/* Printable determination record button -- visually distinct from the full RFTA PDF button */
.gen-btn.record{background:var(--ft-text);}
.gen-btn.record:hover{background:#000}

/* =====================================================================
   REFUSAL STATE — Enforce comp refusal (24 CFR 982.507 strict interpretation).
   Designed as an authoritative product outcome, not an error/empty state.
   ===================================================================== */
.rr-refusal-row td{background:var(--ft-red-bg);color:var(--ft-red);font-weight:600}
.rr-refusal-block{border-top:none !important}
.refusal-card{
  border:1.5px solid var(--ft-red);
  background:var(--ft-red-bg);
  border-radius:14px;
  padding:20px 22px;
}
.refusal-head{display:flex;align-items:flex-start;gap:12px;margin-bottom:14px}
.refusal-icon{font-size:22px;line-height:1;color:var(--ft-red);flex:none}
.refusal-title{font-size:16px;font-weight:700;color:var(--ft-red);letter-spacing:-.01em}
.refusal-sub{font-size:12.5px;color:var(--muted);margin-top:2px}
.refusal-stats{display:flex;gap:24px;flex-wrap:wrap;padding:14px 0;border-top:1px solid var(--ft-hairline);border-bottom:1px solid var(--ft-hairline);margin-bottom:14px}
.refusal-stat{display:flex;flex-direction:column;gap:2px}
.refusal-stat b{font-size:18px;font-weight:700;color:var(--text);font-family:var(--font-mono)}
.refusal-stat span{font-size:11px;color:var(--muted);text-transform:uppercase;letter-spacing:.04em}
.refusal-body{font-size:13px;line-height:1.55;color:var(--text);margin-bottom:14px}
.refusal-actions{background:var(--surface);border:1px solid var(--ft-hairline);border-radius:10px;padding:12px 16px}
.refusal-actions-label{font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.05em;color:var(--muted);margin-bottom:6px}
.refusal-actions ul{margin:0;padding-left:18px}
.refusal-actions li{font-size:12.5px;line-height:1.6;color:var(--text)}
.rr-widen-note{border-color:var(--ft-amber);background:var(--ft-amber-bg);color:var(--ft-amber)}
.rr-widen-note strong{color:var(--ft-amber)}

/* =====================================================================
   PHA UI RESTRUCTURE — 2026-08-04
   Brett: "everything is also so whitewashed and non-contrasting still.
   I need the PHA-facing UI to really get cleaned up across the board."
   Target: Palantir / Bloomberg-terminal density and contrast, not a
   marketing page. Everything below is driven by the :root tokens at the
   top of this file — no one-off hex values.

   Contents
     1. Landing hero rebalance (the "Is this rent reasonable?" demo card
        was deleted from index.html; the state/PHA panel is re-centred)
     2. Section + panel hierarchy (mono eyebrows, hairline rules, density)
     3. Coverage/gap-analysis row grid — FIXES the bug where the progress
        bar overlapped the "3,817 / 3,818" count text
     4. "Time and money saved" planning estimate (landing page)
     5. data.html chrome (standalone data & methodology page)
   ===================================================================== */

/* ---------- 1. LANDING HERO REBALANCE -------------------------------
   The hero used a 1.05fr / 0.95fr two-column grid whose right column held
   the quick-demo card. With that card deleted the grid left a dead column,
   so the hero is now a single measured column, centred, with the sign-in
   panel as the one focal object. */
.ent-hero{padding:40px 20px 28px}
.ent-hero-inner{max-width:720px;grid-template-columns:minmax(0,1fr);grid-template-rows:auto;gap:18px}
.ent-primary{grid-row:auto;grid-column:auto;padding:28px 30px 30px}
.ent-primary .signin-h1{font-size:27px;line-height:1.18}
.ent-card{border:1px solid var(--ft-hairline);border-radius:var(--r-lg);box-shadow:var(--shadow-card)}
.brand-row{margin-bottom:18px}
.eyebrow{font-size:10.5px;letter-spacing:.17em;color:var(--ft-text-secondary);font-weight:700;margin-bottom:10px;
  padding-bottom:8px;border-bottom:1px solid var(--ft-hairline)}
.signin-body{font-size:14px;color:var(--ft-text-secondary);margin-bottom:18px}
.ent-trust-list{margin:0 0 20px;gap:8px}
.ent-trust-list li{font-size:13.5px;color:var(--ft-text-secondary)}
.ent-signin-block{border-top:1px solid var(--ft-hairline);padding-top:18px}
.ent-signin-label{font-size:10.5px;letter-spacing:.16em;color:var(--ft-text);margin-bottom:12px}
.field-label{font-size:11.5px;font-weight:700;letter-spacing:.06em;text-transform:uppercase;
  color:var(--ft-text-secondary);margin-bottom:6px}
.select-wrap{margin-bottom:14px}
.field-select{border:1px solid var(--ft-hairline);border-radius:var(--r-sm);padding:10px 38px 10px 12px;font-size:14px}
.field-select:focus{border-color:var(--ft-blue);box-shadow:0 0 0 2px var(--ft-sel-row)}
.btn-primary{border-radius:var(--r-sm);padding:12px 18px;font-size:14px;box-shadow:none}
.btn-primary:hover{box-shadow:none}
.signin-footer{margin-top:14px;color:var(--ft-text-muted);font-size:12px}
/* The decorative grid wash was the single biggest source of the "washed
   out" read: a pale blue radial bloom over a white page. Keep the grid as
   a faint technical texture, drop the bloom. */
.grid-bg{background:
  linear-gradient(var(--ft-hairline-soft) 1px, transparent 1px),
  linear-gradient(90deg, var(--ft-hairline-soft) 1px, transparent 1px);
  background-size:32px 32px, 32px 32px;background-color:var(--ft-app-bg);
  mask-image:none;opacity:.55}
.dark .grid-bg{background:
  linear-gradient(var(--ft-hairline-soft) 1px, transparent 1px),
  linear-gradient(90deg, var(--ft-hairline-soft) 1px, transparent 1px);
  background-size:32px 32px, 32px 32px;background-color:var(--ft-app-bg);opacity:.9}
/* The live instrument bands sit on the same measured column as the hero. */
.data-coverage,.pipeline-status,.rs-est{max-width:1320px}

/* ---------- 2. SECTION + PANEL HIERARCHY ---------------------------- */
.content{padding-bottom:calc(var(--ft-ticker-h) + 24px)}
.section{margin-top:22px}
.section-head{gap:10px;margin-bottom:12px;padding-bottom:10px;border-bottom:2px solid var(--ft-hairline);align-items:center}
.section-icon{width:28px;height:28px;border-radius:var(--r-sm);background:var(--ft-sel-row);color:var(--ft-blue);
  border:1px solid var(--ft-blue);font-size:15px}
.section-icon.warn{background:var(--ft-amber-bg);color:var(--ft-amber);border-color:var(--ft-amber)}
.section-title{font-size:15px;font-weight:700;letter-spacing:.01em;text-transform:uppercase;color:var(--ft-text)}
.section-sub{color:var(--ft-text-muted);font-size:12.5px;margin-top:2px}
.card{border:1px solid var(--ft-hairline);box-shadow:none}
.card-h3{font-size:14px;font-weight:700;letter-spacing:.02em;text-transform:uppercase;color:var(--ft-text)}
.card-sub{color:var(--ft-text-muted);font-size:12.5px;margin-bottom:12px}
/* Every data card gets a titled header rule so a screen of cards reads as
   an instrument stack rather than a run of paragraphs. */
.method-title{font-family:var(--font-mono);font-size:11.5px;font-weight:700;letter-spacing:.1em;
  text-transform:uppercase;color:var(--ft-text);margin:-4px -4px 10px;padding:0 0 8px;
  border-bottom:1px solid var(--ft-hairline)}
.method-body{color:var(--ft-text-secondary);font-size:12.5px;line-height:1.55}
.method-body p+p{margin-top:8px}
.method-body code,.card code{font-family:var(--font-mono);font-size:11.5px;background:var(--ft-sunken);
  border:1px solid var(--ft-hairline-soft);border-radius:var(--r-sm);padding:0 4px;color:var(--ft-text)}
.method-grid{gap:10px}
.method-card{border:1px solid var(--ft-hairline);box-shadow:none;padding:14px}
.method-cite{color:var(--ft-link);font-weight:600}
.mqi-disclosure-card,.provenance-summary-card,.coverage-tracker-card,.derived-score-card,
.prov-pipeline-health-card,.prov-kpi-rollup-card,.prov-gap-remediation-card,
.prov-ontology-coverage-card,.prov-documents-card{margin-top:12px;padding:14px 16px}
.mqi-disclosure-card .method-body,.provenance-summary-card .method-body,
.coverage-tracker-card .method-body,.derived-score-card .method-body,
.prov-pipeline-health-card .method-body,.prov-kpi-rollup-card .method-body,
.prov-gap-remediation-card .method-body,.prov-ontology-coverage-card .method-body,
.prov-documents-card .method-body{color:var(--ft-text-secondary);font-size:12.5px;line-height:1.55}
.mqi-disclosure-stats{gap:10px;margin-top:10px}
.mqi-stat{gap:8px;background:var(--ft-sunken);border:1px solid var(--ft-hairline-soft);
  border-radius:var(--r-sm);padding:7px 9px}
.mqi-stat-label{color:var(--ft-text-secondary);font-size:12px}
.pha-badge{border-radius:var(--r-sm);font-size:10px;letter-spacing:.06em;padding:2px 6px}
.hotma-box{border:1px solid var(--ft-amber);border-radius:var(--r-lg);padding:14px 16px;background:var(--ft-amber-bg)}
.hotma-badge{font-weight:700;letter-spacing:.14em;color:var(--ft-amber)}
.hotma-box p{color:var(--ft-text-secondary);font-size:12.5px}
.disclaimer-list li{color:var(--ft-text-secondary);font-size:12.5px}
.app-footer{color:var(--ft-text-muted);font-size:11.5px;border-top:2px solid var(--ft-hairline);margin-top:28px}
.stepper .step{color:var(--ft-text-muted)}
.stepper .step.active{color:var(--ft-text)}

/* ---------- 3. COVERAGE / GAP-ANALYSIS ROW GRID ---------------------
   BUG FIX: .cov-field-metric was a flex box inside a fixed 140px grid
   column with justify-self:end. On the ontology-coverage card the row also
   carries a leader badge ("RENTSPIRE" / "UNKNOWN"), so the flex content
   ran to ~220px, overflowed its 140px column to the LEFT, and drew the
   progress bar straight over the "3,817 / 3,818" count text (see
   Screenshot-2026-08-03-230408-3 / -230354-5).
   Fix: the metric column is max-content — it can never be narrower than
   its contents — and the metric itself is a 3-column grid (bar / percent /
   badge) with fixed tracks, so bars also line up down the card. */
.cov-groups{gap:10px;margin-top:12px}
.cov-group{border:1px solid var(--ft-hairline);border-radius:var(--r-md);padding:0;overflow:visible}
.cov-group-lead{border-color:var(--ft-blue)}
.cov-group-head{margin:0;padding:7px 12px;background:var(--ft-sunken);
  border-bottom:1px solid var(--ft-hairline);align-items:center;
  border-radius:calc(var(--r-md) - 1px) calc(var(--r-md) - 1px) 0 0}
.cov-group-lead .cov-group-head{background:var(--ft-sel-row)}
.cov-group-title{font-family:var(--font-mono);font-size:11.5px;font-weight:700;letter-spacing:.07em;
  text-transform:uppercase;color:var(--ft-text)}
.cov-group-count{color:var(--ft-text-muted);font-size:10.5px}
.cov-row{grid-template-columns:minmax(0,1fr) max-content max-content;gap:16px;padding:5px 12px;
  border-top:1px solid var(--ft-hairline-soft)}
.cov-row:nth-child(even){background:var(--ft-sunken)}
.cov-field-name{min-width:0;font-size:12px;color:var(--ft-text);overflow-wrap:break-word}
.cov-field-frac{font-size:11.5px;color:var(--ft-text);font-variant-numeric:tabular-nums}
.cov-slash,.cov-denom{color:var(--ft-text-muted)}
.cov-field-metric{display:grid;grid-template-columns:78px 50px minmax(92px,max-content);gap:8px;
  align-items:center;justify-items:start;justify-self:end;white-space:nowrap}
.cov-field-metric .pha-badge{margin-left:0 !important}
.cov-bar-track{width:78px;height:8px;border-radius:var(--r-sm);background:var(--ft-canvas);
  border:1px solid var(--ft-hairline-soft);flex:none}
.cov-bar-fill{border-radius:2px}
.cov-pct-txt{width:50px;text-align:right;font-size:11.5px;color:var(--ft-text);
  font-variant-numeric:tabular-nums;justify-self:end}
.cov-pct-na{grid-column:1 / 3;justify-self:end;font-size:11.5px;color:var(--ft-text-muted)}
.cov-note{color:var(--ft-text-muted);font-size:11.5px;padding:8px 12px;margin:0;
  border-top:1px solid var(--ft-hairline-soft)}
@media (max-width: 900px){
  /* Stacked rows on narrow screens: the metric grid becomes its own line and
     keeps its fixed tracks so nothing can overlap the count text. */
  .cov-row{grid-template-columns:minmax(0,1fr);gap:3px;padding:8px 10px}
  .cov-field-metric{justify-self:start;grid-template-columns:78px 50px minmax(92px,max-content)}
  .cov-pct-txt{justify-self:start;text-align:left}
  .cov-pct-na{grid-column:1;justify-self:start}
  .cov-bar-track{width:78px}
}

/* ---------- 4. "TIME AND MONEY SAVED" PLANNING ESTIMATE -------------
   HARD RULE COMPLIANCE. This is a sales aid, not an instrument reading.
   It is deliberately styled so it can never be mistaken for a measured
   metric or a HUD rent-reasonableness determination: dashed amber edge,
   no dark instrument-panel chrome, no .dc-num numerals, every figure
   prefixed with "≈", and every input visible and user-adjustable. */
.rs-est{position:relative;z-index:1;width:100%;margin:14px auto 0;background:var(--ft-card);
  border:2px dashed var(--ft-amber);border-radius:var(--r-lg)}
.rs-est-head{display:flex;flex-wrap:wrap;align-items:baseline;justify-content:space-between;gap:8px;
  padding:11px 16px;border-bottom:1px dashed var(--ft-amber);background:var(--ft-amber-bg)}
.rs-est-badge{font-family:var(--font-mono);font-size:10.5px;font-weight:700;letter-spacing:.14em;
  text-transform:uppercase;color:var(--ft-amber)}
.rs-est-title{font-size:13.5px;font-weight:700;color:var(--ft-text)}
.rs-est-body{padding:14px 16px 16px}
.rs-est-lede{font-size:12.5px;color:var(--ft-text-secondary);margin-bottom:14px;max-width:80ch}
.rs-est-inputs{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:12px}
.rs-est-field{display:flex;flex-direction:column;min-width:0}
.rs-est-field label{font-size:11px;font-weight:700;letter-spacing:.05em;text-transform:uppercase;
  color:var(--ft-text-secondary);margin-bottom:5px}
.rs-est-field input{font-family:var(--font-mono);font-size:14px;font-variant-numeric:tabular-nums;
  background:var(--ft-input-bg);color:var(--ft-text);border:1px solid var(--ft-hairline);
  border-radius:var(--r-sm);padding:8px 10px;width:100%}
.rs-est-field input:focus{outline:none;border-color:var(--ft-blue);box-shadow:0 0 0 2px var(--ft-sel-row)}
.rs-est-field input:invalid{border-color:var(--ft-red)}
.rs-est-basis{font-size:11px;line-height:1.4;color:var(--ft-text-muted);margin-top:5px}
.rs-est-basis b{color:var(--ft-text-secondary);font-weight:700}
.rs-est-math{margin-top:14px;border:1px solid var(--ft-hairline);border-radius:var(--r-md);overflow:hidden}
.rs-est-math-head{font-family:var(--font-mono);font-size:10.5px;font-weight:700;letter-spacing:.1em;
  text-transform:uppercase;color:var(--ft-text);background:var(--ft-sunken);padding:6px 12px;
  border-bottom:1px solid var(--ft-hairline)}
.rs-est-step{display:grid;grid-template-columns:minmax(0,1fr) max-content;gap:14px;align-items:baseline;
  padding:6px 12px;border-top:1px solid var(--ft-hairline-soft);font-size:12px}
.rs-est-step:first-of-type{border-top:none}
.rs-est-step:nth-child(even){background:var(--ft-sunken)}
.rs-est-step-label{color:var(--ft-text-secondary);min-width:0;overflow-wrap:break-word}
.rs-est-step-label code{font-family:var(--font-mono);font-size:11px;background:transparent;border:none;padding:0;
  color:var(--ft-text-muted)}
.rs-est-step-val{font-family:var(--font-mono);font-size:12.5px;font-weight:700;color:var(--ft-text);
  font-variant-numeric:tabular-nums;white-space:nowrap}
.rs-est-total{padding:9px 12px;border-top:2px solid var(--ft-amber);background:var(--ft-amber-bg);
  display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px}
.rs-est-total div{min-width:0}
.rs-est-total-label{display:block;font-size:11px;font-weight:700;letter-spacing:.05em;
  text-transform:uppercase;color:var(--ft-text-secondary)}
.rs-est-total-val{display:block;font-family:var(--font-mono);font-size:19px;font-weight:700;
  color:var(--ft-text);font-variant-numeric:tabular-nums;line-height:1.3;overflow-wrap:break-word}
.rs-est-foot{margin-top:12px;font-size:11.5px;line-height:1.5;color:var(--ft-text-secondary);
  border-top:1px dashed var(--ft-amber);padding-top:10px}
.rs-est-foot b{color:var(--ft-text)}
@media (max-width: 900px){
  .rs-est-inputs{grid-template-columns:repeat(2,minmax(0,1fr))}
  .rs-est-total{grid-template-columns:minmax(0,1fr)}
}
@media (max-width: 520px){
  .rs-est-inputs{grid-template-columns:minmax(0,1fr)}
  .rs-est-step{grid-template-columns:minmax(0,1fr);gap:2px}
  .rs-est-step-val{justify-self:start}
}

/* ---------- 5. data.html CHROME ------------------------------------- */
.dp-body{background:var(--ft-app-bg)}
.dp-wrap{max-width:1320px;margin:0 auto;padding:18px 20px calc(var(--ft-ticker-h) + 32px)}
.dp-appbar{position:sticky;top:0;z-index:40;display:flex;align-items:center;justify-content:space-between;
  gap:12px;height:44px;padding:0 14px;background:var(--ft-app-bg);border-bottom:1px solid var(--ft-hairline)}
.dp-nav{position:sticky;top:44px;z-index:39;display:flex;align-items:stretch;gap:2px;height:32px;padding:0 12px;
  background:var(--ft-app-bg);border-bottom:1px solid var(--ft-hairline);overflow-x:auto}
.dp-nav a{display:inline-flex;align-items:center;gap:6px;padding:0 9px;white-space:nowrap;font-size:13px;
  font-weight:500;color:var(--ft-text-muted);text-decoration:none;position:relative}
.dp-nav a:hover{color:var(--ft-text)}
.dp-nav a.active{color:var(--ft-text);font-weight:700}
.dp-nav a.active::after{content:"";position:absolute;left:7px;right:7px;bottom:0;height:2px;background:var(--ft-blue)}
.dp-head{padding:18px 0 14px;border-bottom:2px solid var(--ft-hairline);margin-bottom:16px}
.dp-eyebrow{font-family:var(--font-mono);font-size:10.5px;font-weight:700;letter-spacing:.16em;
  text-transform:uppercase;color:var(--ft-text-secondary);margin-bottom:7px}
.dp-h1{font-size:21px;font-weight:700;letter-spacing:-.01em;color:var(--ft-text)}
.dp-sub{margin-top:6px;font-size:13px;line-height:1.55;color:var(--ft-text-secondary);max-width:96ch}
.dp-toc{display:flex;flex-wrap:wrap;gap:6px;margin-top:12px}
.dp-toc a{font-family:var(--font-mono);font-size:11px;letter-spacing:.04em;text-transform:uppercase;
  color:var(--ft-text-secondary);text-decoration:none;border:1px solid var(--ft-hairline);
  border-radius:var(--r-sm);padding:3px 7px;background:var(--ft-card)}
.dp-toc a:hover{border-color:var(--ft-blue);color:var(--ft-blue)}
.dp-group{margin-top:24px}
.dp-group-head{display:flex;align-items:baseline;gap:10px;padding-bottom:8px;
  border-bottom:2px solid var(--ft-hairline);margin-bottom:10px}
.dp-group-title{font-family:var(--font-mono);font-size:12px;font-weight:700;letter-spacing:.1em;
  text-transform:uppercase;color:var(--ft-text)}
.dp-group-sub{font-size:12px;color:var(--ft-text-muted)}
.dp-note{background:var(--ft-sunken);border:1px solid var(--ft-hairline);border-left:3px solid var(--ft-blue);
  border-radius:var(--r-sm);padding:10px 12px;font-size:12.5px;line-height:1.55;color:var(--ft-text-secondary)}
.dp-note b{color:var(--ft-text)}
.dp-back{font-family:var(--font-mono);font-size:11.5px;font-weight:700;letter-spacing:.06em;
  text-transform:uppercase;color:var(--ft-blue);text-decoration:none}
.dp-back:hover{text-decoration:underline}
.dp-footer{margin-top:32px;padding-top:14px;border-top:2px solid var(--ft-hairline);
  display:flex;flex-direction:column;gap:5px;color:var(--ft-text-muted);font-size:11.5px}
/* Placeholder container owned by enrichment-metrics.js (separate workstream).
   It is intentionally empty here and collapses to nothing until that script
   fills it, so an absent script can never leave a blank labelled panel. */
#enrichment-metrics-card:empty{display:none}


/* ---------- 6. DARK-MODE FIXES FOR SHARED WIDGETS -------------------
   pha-walkthrough.css paints the tour launcher as `color:var(--pha-blue)`
   on a literal `background:#fff`. In dark mode --pha-blue is the light
   accent (#7ab3ff), so that pill measured 2.16:1 in the runtime contrast
   audit at 390px — light-on-light, effectively unreadable. Overridden here
   (a file this workstream owns) instead of editing pha-walkthrough.css.
   Dark: #7ab3ff on --ft-card #1a212a = 8.18:1. Light is left untouched at
   #1a56a4 on #ffffff = 7.21:1. */
.dark .pha-tour-launcher{background:var(--ft-card);color:var(--ft-blue);border-color:var(--ft-blue)}
.dark .pha-tour-launcher:hover{background:var(--ft-blue-solid);color:var(--on-blue)}

/* =====================================================================
   2026-08-04 PASS — merged live-metrics card, tri-state §11 utilities,
   RFTA fill report, planning-estimate expansion, and legible form inputs.
   Every colour pair below is drawn from the documented token set so the
   existing WCAG AA audit still holds (ratios noted where a new pair is
   introduced).
   ===================================================================== */

/* ---------- A. MERGED LIVE-METRICS CARD (was two cards) --------------
   The two panels keep their own heads, source chips and timestamps. This
   only merges the CHROME: one outer border/shadow, inner panels flattened
   so they read as two sections of one instrument, not two competing cards. */
.live-metrics{position:relative;z-index:1;width:100%;max-width:1320px;margin:26px auto 0;
  background:var(--ft-panel-bg);border:1px solid var(--ft-panel-line);border-radius:var(--r-lg);
  box-shadow:var(--shadow-card);overflow:hidden}
.live-metrics.hidden{display:none}
.lm-head{padding:16px 22px;border-bottom:1px solid rgba(255,255,255,.14);
  background:var(--ft-panel-head);display:flex;flex-direction:column;gap:5px}
.lm-title{font-family:var(--font-display);font-weight:700;font-size:16px;color:var(--ft-panel-text);
  letter-spacing:-.01em}
.lm-sub{font-size:12px;line-height:1.5;color:var(--ft-panel-label);max-width:96ch}
.lm-part{position:relative}
/* Flatten the nested cards: no double border, no stacked radius, no margins. */
.live-metrics .data-coverage,
.live-metrics .pipeline-status{margin:0;border:0;border-radius:0;box-shadow:none;max-width:none;width:100%}
.live-metrics .pipeline-status[hidden]{display:none}
.lm-denom{padding:14px 22px;border-top:1px solid rgba(255,255,255,.14);
  border-bottom:1px solid rgba(255,255,255,.14);background:rgba(255,255,255,.04)}
.lm-denom-hd{display:block;font-family:var(--font-mono);font-size:10.5px;font-weight:700;
  letter-spacing:.12em;text-transform:uppercase;color:var(--ft-panel-warn);margin-bottom:6px}
.lm-denom p{margin:0;font-size:12.5px;line-height:1.6;color:var(--ft-panel-label);max-width:104ch;
  overflow-wrap:break-word}
.lm-denom b{color:var(--ft-panel-text);font-weight:700}
.lm-denom code{font-family:var(--font-mono);font-size:11.5px;color:var(--ft-panel-accent);
  background:rgba(255,255,255,.06);padding:1px 5px;border-radius:4px;overflow-wrap:break-word}
@media(max-width:720px){
  .lm-head{padding:14px 16px}
  .lm-denom{padding:12px 16px}
  .live-metrics .dc-head{padding:12px 16px}
  .live-metrics .dc-item{padding:14px 16px}
  .live-metrics .dc-structure-note,.live-metrics .dc-concentration-note{padding:10px 16px}
}

/* ---------- B. TRI-STATE §11 UTILITY RESPONSIBILITY ------------------
   Unknown is a FIRST-CLASS state, not a styling afterthought: it is drawn
   differently (dashed, amber "unanswered" tag) because it prints BLANK on
   the government form instead of asserting a payer. */
.util-to.unk{background:transparent;border-style:dashed;border-color:var(--ft-amber);
  color:var(--ft-amber);font-weight:700}
.util-item-unans{border-style:dashed;border-color:var(--ft-amber)}
.util-item-unans:hover{border-color:var(--ft-amber)}
.util-unans-tag{font-family:var(--font-mono);font-size:9px;font-weight:700;letter-spacing:.05em;
  text-transform:uppercase;padding:2px 6px;border-radius:5px;background:var(--ft-amber-bg);
  color:var(--ft-amber);white-space:nowrap}
.util-fuel{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-top:7px}
.util-fuel-lab{font-size:11px;font-weight:700;letter-spacing:.04em;text-transform:uppercase;
  color:var(--ft-text-muted)}
.util-fuel-sel{font-family:var(--font-mono);font-size:14px;font-weight:700;padding:7px 9px;
  border:1px solid var(--ft-hairline);border-radius:var(--r-sm);background:var(--ft-input-bg);
  color:var(--ft-text);min-width:150px;max-width:100%}
.util-fuel-sel:focus{outline:none;border-color:var(--ft-blue);box-shadow:0 0 0 2px var(--ft-sel-row)}
.util-fuel-src{font-family:var(--font-mono);font-size:9.5px;font-weight:700;letter-spacing:.03em;
  text-transform:uppercase;padding:2px 6px;border-radius:5px;overflow-wrap:break-word}
.util-fuel-src.ev{background:var(--ft-sel-row);color:var(--ft-blue)}
.util-fuel-src.usr{background:var(--ft-green-bg);color:var(--ft-green)}
.util-fuel-src.unk{background:var(--ft-amber-bg);color:var(--ft-amber)}
.util-unans{margin-top:12px;border:1px solid var(--ft-amber);border-left-width:4px;
  border-radius:var(--r-md);background:var(--ft-amber-bg);padding:11px 13px;font-size:12px;
  line-height:1.55;color:var(--ft-text-secondary)}
.util-unans.ok{border-color:var(--ft-green);background:var(--ft-green-bg)}
.util-unans-hd{font-family:var(--font-mono);font-size:10.5px;font-weight:700;letter-spacing:.08em;
  text-transform:uppercase;color:var(--ft-amber);margin-bottom:5px}
.util-unans-k{font-weight:700;color:var(--ft-text)}
.util-unans-ft{margin-top:6px;font-size:11.5px;color:var(--ft-text-muted);line-height:1.5}

/* ---------- C. RFTA FILL REPORT (no more silent skips) ---------------- */
.rfta-fill-report{margin-top:12px;border:1px solid var(--ft-hairline);border-radius:var(--r-md);
  padding:11px 13px;font-size:12px;line-height:1.55;background:var(--ft-card);color:var(--ft-text-secondary)}
.rfta-fill-report[hidden]{display:none}
.rfta-fr-hd{font-family:var(--font-mono);font-size:10.5px;font-weight:700;letter-spacing:.08em;
  text-transform:uppercase;margin-bottom:6px}
.rfta-fr-hd.bad{color:var(--ft-red)}
.rfta-fr-hd.ok{color:var(--ft-green)}
.rfta-fr-hd.warn{color:var(--ft-amber);margin-top:10px}
.rfta-fr-list{margin:0 0 4px;padding-left:18px}
.rfta-fr-list li{margin-bottom:4px;overflow-wrap:break-word}
.rfta-fr-list code{font-family:var(--font-mono);font-size:11px;color:var(--ft-text)}
.rfta-fr-kind{font-family:var(--font-mono);font-size:10px;color:var(--ft-text-muted);
  text-transform:uppercase;letter-spacing:.04em}
.rfta-fr-err{display:block;font-family:var(--font-mono);font-size:10.5px;color:var(--ft-red)}
.rfta-fr-blank{font-size:11.5px;color:var(--ft-text-secondary)}
.rfta-fr-ft{margin-top:6px;font-size:11.5px;color:var(--ft-text-muted);line-height:1.5}

/* ---------- D. LEGIBLE FORM INPUTS + "WE FILLED THIS" AFFORDANCE ------
   Brett could not tell the product had auto-filled the form because the
   input text was tiny. Two changes: every on-page control gets a larger,
   heavier, tabular face, and auto-filled-from-data controls are marked
   with a blue left rail + tint + an explicit source chip next to them, so
   the distinction survives greyscale and colour-blindness (shape + text,
   not colour alone). */
.field-select{font-size:16px;font-weight:600}
.search-input{font-size:16px;font-weight:600}
.ft-dock-input input{font-size:15px;font-weight:600}
.aw-ov-input input{font-size:15px;font-weight:700;font-variant-numeric:tabular-nums}
.rs-est-field input,.rs-est-field select{font-size:16px;font-weight:700}
input.is-autofilled,select.is-autofilled,textarea.is-autofilled{
  background:var(--ft-sel-row);border-color:var(--ft-blue);border-left:4px solid var(--ft-blue);
  color:var(--ft-text);font-weight:700}
input.is-answered,select.is-answered,textarea.is-answered{
  border-left:4px solid var(--ft-green);font-weight:700}
input.is-unanswered,select.is-unanswered,textarea.is-unanswered{
  border-style:dashed;border-color:var(--ft-amber);border-left:4px dashed var(--ft-amber);
  font-weight:600}

/* ---------- E. PLANNING ESTIMATE — PROVENANCE TAGS + NEW BLOCKS ------- */
.rs-est-field select{font-family:var(--font-mono);font-variant-numeric:tabular-nums;
  background:var(--ft-input-bg);color:var(--ft-text);border:1px solid var(--ft-hairline);
  border-radius:var(--r-sm);padding:8px 10px;width:100%}
.rs-est-field select:focus{outline:none;border-color:var(--ft-blue);box-shadow:0 0 0 2px var(--ft-sel-row)}
.rs-lab-q{font-weight:600;text-transform:none;letter-spacing:0;color:var(--ft-text-muted)}
.rs-tag{display:inline-block;font-family:var(--font-mono);font-size:9.5px;font-weight:700;
  letter-spacing:.08em;text-transform:uppercase;padding:2px 6px;border-radius:5px;margin-top:6px;
  white-space:nowrap}
.rs-tag.brett{background:var(--ft-green-bg);color:var(--ft-green)}   /* 5.77:1 light / 8.28:1 dark */
.rs-tag.hud{background:var(--ft-sel-row);color:var(--ft-blue)}       /* 5.49:1 light / 6.68:1 dark */
.rs-tag.est{background:var(--ft-sunken);color:var(--ft-text-muted)}  /* 8.34:1 light / 9.17:1 dark */
.rs-tag.nf{background:var(--ft-red-bg);color:var(--ft-red)}          /* 5.69:1 light / 7.25:1 dark */
.rs-est-lede .rs-tag{margin-top:0}
.rs-step-note{display:block;font-size:10.5px;color:var(--ft-text-muted);line-height:1.45;margin-top:2px}
/* The monthly-equivalents block (.rs-est-monthly / .rs-est-mrow) was DELETED with
   the pricing chain on 2026-08-04: its three rows were minutes, hours and a
   dollar labour value per month, and the card is hours-only now. Rules removed
   rather than left as dead selectors. */
.rs-est-ctx{margin-top:14px;border:1px solid var(--ft-hairline);border-radius:var(--r-md);
  background:var(--ft-sunken);padding:11px 13px}
.rs-est-ctx-head{font-family:var(--font-mono);font-size:10.5px;font-weight:700;letter-spacing:.08em;
  text-transform:uppercase;color:var(--ft-text-secondary);margin-bottom:7px}
.rs-est-ctx-head b{color:var(--ft-text)}
.rs-est-ctx-list{margin:0;padding-left:18px;display:flex;flex-direction:column;gap:7px}
.rs-est-ctx-list li{font-size:11.5px;line-height:1.55;color:var(--ft-text-secondary);overflow-wrap:break-word}
.rs-est-ctx-list b{color:var(--ft-text)}
.rs-est-ctx-list .rs-tag{margin-top:0;margin-right:4px;vertical-align:baseline}
/* Long option labels must not clip: the select ellipsises instead of cutting a word. */
.rs-est-field select{text-overflow:ellipsis}
/* Narrow phones: the printed arithmetic is long (e.g. "(330 x 28) / 60 = 9,240 /
   60 ~ 154.0 hr"), so the value column has to be allowed to wrap at its spaces
   instead of forcing a horizontal scroll. break-word only breaks a token that is
   itself wider than the column -- none of these are, so no mid-word wrapping
   occurs. */
@media(max-width:560px){
  .rs-est-step-val{white-space:normal;overflow-wrap:break-word}
  .rs-est-step-label,.rs-est-step-label code{overflow-wrap:break-word}
  .rs-est-total-val{white-space:normal}
}

/* ---------- F. PLANNING ESTIMATE V2 — NINE-STEP WORKFLOW TABLE + TWO TOTALS ---
   2026-08-04. The pricing chain is gone; the card is staff-hours only. Two
   structural additions:

     1. .rs-wf — the itemized tenancy-approval table. Real <table> semantics on
        desktop; below 760px each row becomes a labelled card (the <thead> is
        hidden and each cell carries its own header via data-label), because six
        columns cannot honestly fit a 390px viewport without truncating.
     2. Two visually distinct totals blocks. .rs-today keeps the amber planning-
        estimate treatment of the card. .rs-roadmap is deliberately DIFFERENT —
        blue, dashed, with a "Not available today" chip — so the roadmap figure
        can never be mistaken for the shipping one at a glance.

   Colour pairs used here are the audited tokens already in this file:
   ft-text/ft-text-secondary/ft-text-muted on ft-card and ft-sunken, ft-green on
   ft-green-bg (5.77:1 light / 8.28:1 dark), ft-blue on ft-sel-row (5.49:1 /
   6.68:1), ft-amber on ft-amber-bg, ft-text-muted on ft-sunken (8.34:1 / 9.17:1),
   and white on ft-blue-solid (7.21:1 / 5.95:1). No new colour is introduced. */
.rs-est .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}
.rs-tag.range{background:var(--ft-sel-row);color:var(--ft-blue)}     /* same pair as .rs-tag.hud */

.rs-wf-wrap{margin-top:14px;border:1px solid var(--ft-hairline);border-radius:var(--r-md);overflow:hidden}
.rs-wf-head{font-family:var(--font-mono);font-size:10.5px;font-weight:700;letter-spacing:.1em;
  text-transform:uppercase;color:var(--ft-text);background:var(--ft-sunken);padding:7px 12px;
  border-bottom:1px solid var(--ft-hairline)}
.rs-wf-head span{display:block;margin-top:3px;font-family:var(--font-body);font-size:11px;font-weight:600;
  letter-spacing:0;text-transform:none;color:var(--ft-text-muted)}
.rs-wf{width:100%;border-collapse:collapse;table-layout:fixed}
.rs-wf th,.rs-wf td{text-align:left;vertical-align:top;padding:7px 10px;font-size:12px;
  border-top:1px solid var(--ft-hairline-soft);overflow-wrap:break-word}
.rs-wf thead th{font-family:var(--font-mono);font-size:10px;font-weight:700;letter-spacing:.08em;
  text-transform:uppercase;color:var(--ft-text-secondary);background:var(--ft-card);border-top:none;
  border-bottom:1px solid var(--ft-hairline)}
.rs-wf thead th.rs-wf-n,.rs-wf td.rs-wf-n{width:34px;text-align:right;font-family:var(--font-mono);
  font-weight:700;color:var(--ft-text-muted)}
.rs-wf col,.rs-wf thead th:nth-child(2){width:auto}
.rs-wf thead th:nth-child(3),.rs-wf thead th:nth-child(4){width:104px}
.rs-wf thead th:nth-child(5){width:19%}
.rs-wf thead th:nth-child(6){width:21%}
.rs-wf tbody tr:nth-child(even){background:var(--ft-sunken)}
.rs-wf-step b{color:var(--ft-text);font-weight:700}
.rs-wf-basis{display:block;margin-top:3px;font-size:10.5px;line-height:1.45;color:var(--ft-text-muted)}
.rs-wf-basis b{color:var(--ft-text-secondary)}
.rs-wf-in{font-family:var(--font-mono);font-size:15px;font-weight:700;font-variant-numeric:tabular-nums;
  background:var(--ft-input-bg);color:var(--ft-text);border:1px solid var(--ft-hairline);
  border-radius:var(--r-sm);padding:6px 8px;width:100%;max-width:88px}
.rs-wf-in:focus{outline:none;border-color:var(--ft-blue);box-shadow:0 0 0 2px var(--ft-sel-row)}
.rs-wf-cell .rs-tag{margin-top:4px}
.rs-wf-saved{font-family:var(--font-mono);font-size:11.5px;font-weight:700;color:var(--ft-text);
  font-variant-numeric:tabular-nums;overflow-wrap:break-word}
.rs-wf-hero{background:var(--ft-green-bg) !important}
.rs-wf-hero .rs-wf-basis,.rs-wf-hero .rs-wf-n{color:var(--ft-text-secondary)}
/* tokens only, never a literal: --ft-green-bg inverts between themes (#d3ead9 light,
   #0d2f22 dark) and a hardcoded dark green would fail AA in dark mode. */
.rs-cov{display:inline-block;font-family:var(--font-mono);font-size:9.5px;font-weight:700;letter-spacing:.08em;
  text-transform:uppercase;padding:2px 6px;border-radius:5px;white-space:nowrap}
.rs-cov.live{background:var(--ft-green-bg);color:var(--ft-green);border:1px solid var(--ft-green)}
.rs-cov.roadmap{background:var(--ft-sel-row);color:var(--ft-blue);border:1px dashed var(--ft-blue)}
.rs-cov.never{background:var(--ft-sunken);color:var(--ft-text-muted);border:1px solid var(--ft-hairline)}
.rs-cov.unknown{background:var(--ft-amber-bg);color:var(--ft-amber);border:1px dashed var(--ft-amber)}
.rs-cov-note{display:block;margin-top:3px;font-size:10.5px;line-height:1.4;color:var(--ft-text-muted)}
.rs-wf tfoot td{border-top:2px solid var(--ft-hairline);background:var(--ft-card);font-weight:700}

.rs-chip{float:right;font-family:var(--font-mono);font-size:9.5px;font-weight:700;letter-spacing:.08em;
  text-transform:uppercase;padding:2px 7px;border-radius:5px;white-space:nowrap}
.rs-chip.live{background:var(--ft-green-bg);color:var(--ft-green);border:1px solid var(--ft-green)}
.rs-chip.notyet{background:var(--ft-blue-solid);color:#fff}
.rs-today{border-color:var(--ft-green)}
.rs-today .rs-est-math-head{background:var(--ft-green-bg);color:var(--ft-text);border-bottom-color:var(--ft-green)}
.rs-est-scope{margin:0;padding:8px 12px;font-size:11px;line-height:1.5;color:var(--ft-text-secondary);
  background:var(--ft-sunken);border-top:1px solid var(--ft-hairline-soft)}
.rs-roadmap{margin-top:14px;border:2px dashed var(--ft-blue)}
.rs-roadmap-head{background:var(--ft-sel-row) !important;color:var(--ft-blue) !important;
  border-bottom:1px dashed var(--ft-blue) !important}
.rs-roadmap-warn{margin:0;padding:9px 12px;font-size:11.5px;line-height:1.55;color:var(--ft-text-secondary);
  background:var(--ft-card);border-bottom:1px solid var(--ft-hairline-soft)}
.rs-roadmap-warn b{color:var(--ft-text)}
.rs-roadmap-total{border-top:2px dashed var(--ft-blue);background:var(--ft-sel-row)}
.rs-roadmap-total .rs-est-total-label{color:var(--ft-text-secondary)}
@media (max-width: 900px){
  .rs-wf thead th:nth-child(3),.rs-wf thead th:nth-child(4){width:92px}
}
/* Below 760px six columns cannot fit without truncation, so each row becomes a
   labelled card. Nothing is hidden and nothing is clipped: every cell keeps its
   own header text via data-label. */
@media (max-width: 760px){
  .rs-wf,.rs-wf tbody,.rs-wf tfoot,.rs-wf tr,.rs-wf td{display:block;width:auto}
  .rs-wf thead{display:none}
  .rs-wf tr{border-top:1px solid var(--ft-hairline);padding:4px 0}
  .rs-wf td{border-top:none;padding:4px 12px;display:grid;grid-template-columns:minmax(0,13ch) minmax(0,1fr);
    gap:10px;align-items:baseline}
  .rs-wf td::before{content:attr(data-label);font-family:var(--font-mono);font-size:9.5px;font-weight:700;
    letter-spacing:.06em;text-transform:uppercase;color:var(--ft-text-muted);overflow-wrap:break-word}
  /* the 34px numeral column is a desktop-only table width; as a block cell it
     would squeeze the "Step" label into one letter per line */
  .rs-wf thead th.rs-wf-n,.rs-wf td.rs-wf-n{width:auto;text-align:left;
    grid-template-columns:minmax(0,13ch) minmax(0,1fr)}
  .rs-wf-in{max-width:110px}
  .rs-chip{float:none;display:inline-block;margin-top:5px}
  /* tags, coverage chips and notes are grid items now: keep them at their own
     width instead of being stretched into full-width bars */
  .rs-wf td{justify-items:start}
  .rs-wf td .rs-tag,.rs-wf td .rs-cov{justify-self:start}
  /* an empty cell would otherwise print a lone header label with no value */
  .rs-wf td:empty{display:none}
  .rs-wf tfoot td.rs-wf-n{display:none}
}
@media (max-width: 520px){
  .rs-wf td,.rs-wf td.rs-wf-n{grid-template-columns:minmax(0,1fr);gap:2px}
  .rs-wf td::before{margin-bottom:1px}
}
