/* ============================================================
   CADASTRE — DESIGN SYSTEM · B3 ATELIER
   ---------------------------------------------------------
   A premium operator's workstation for PE acquisitions.
   Warm dark canvas · brass accent · serif headings ·
   monospace numerics · dense, restrained, readable.
   ---------------------------------------------------------
   Single source of truth. Edit tokens at top; components
   inherit. All existing class names are preserved so
   existing HTML and app.js continue to render correctly.
   ============================================================ */

@import url('https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;500;600;700&family=IBM+Plex+Sans:wght@300;400;500;600;700&family=IBM+Plex+Serif:ital,wght@0,400;0,500;0,600;0,700;1,400;1,500&display=swap');

:root {
  /* ===== Color · warm dark workstation ===== */
  /* surfaces */
  --paper:        #100e0a;   /* page canvas */
  --paper-2:      #1a1612;   /* primary card / panel */
  --paper-3:      #241f17;   /* row / inset / subtle fill */
  --paper-4:      #2c2620;   /* hover / focus */

  /* hairlines */
  --rule:         #2a241c;
  --rule-soft:    #221d16;
  --rule-strong:  #3a342a;

  /* type */
  --ink:          #ebe3d0;   /* body */
  --ink-2:        #cfc7b1;   /* secondary (raised for legibility on dark paper) */
  --ink-dim:      #9d9482;   /* tertiary / labels (raised from #8a8170) */
  --ink-faint:    #6f6754;   /* placeholder (raised from #5d5544) */

  /* brand · brass */
  --mark:         #b8853a;
  --mark-deep:    #8e5e1f;
  --mark-soft:    rgba(184,133,58,0.14);

  /* semantic */
  --good:         #7a9966;
  --good-soft:    rgba(122,153,102,0.14);
  --warn:         #c89a3a;
  --warn-soft:    rgba(200,154,58,0.14);
  --bad:          #b85a3c;
  --bad-soft:     rgba(184,90,60,0.14);
  --info:         #7a8db8;
  --info-soft:    rgba(122,141,184,0.14);

  /* editorial accents — retained from prior system for callouts */
  --accent-amber:      #c89a3a;
  --accent-amber-soft: rgba(200,154,58,0.12);
  --accent-amber-deep: #b8853a;
  --accent-blue:       #7a8db8;
  --accent-blue-soft:  rgba(122,141,184,0.12);
  --accent-blue-deep:  #4a5e89;

  /* ===== Type stacks ===== */
  --serif:  'IBM Plex Serif', 'Times New Roman', Georgia, serif;
  --sans:   'IBM Plex Sans', system-ui, -apple-system, sans-serif;
  --mono:   'IBM Plex Mono', ui-monospace, 'JetBrains Mono', monospace;

  /* ===== Layout ===== */
  --maxw:    1320px;
  --gutter:  32px;
  --radius:  3px;
  --radius-lg: 5px;

  /* ===== Shadow / depth ===== */
  --shadow-1: 0 1px 0 rgba(0,0,0,0.20);
  --shadow-2: 0 1px 2px rgba(0,0,0,0.30), 0 8px 24px rgba(0,0,0,0.20);
  --shadow-glow: 0 0 0 1px var(--mark), 0 0 0 4px var(--mark-soft);
}

* { box-sizing: border-box; }
html, body { margin: 0; padding: 0; }
body {
  font-family: var(--sans);
  font-size: 14.5px;
  line-height: 1.55;
  color: var(--ink);
  background: var(--paper);
  -webkit-font-smoothing: antialiased;
  text-rendering: optimizeLegibility;
  font-feature-settings: "ss01" on, "kern" on;
}

/* ===== TYPE SCALE ===== */
/* Display sizes use IBM Plex Serif. Italic is reserved for editorial
   moments — display headlines, deal names, IC memo titles. */
.display {
  font-family: var(--serif);
  font-weight: 400;
  font-size: clamp(48px, 6vw, 84px);
  line-height: 0.98;
  letter-spacing: -0.025em;
  color: var(--ink);
}
.display em {
  font-style: italic;
  color: var(--ink);
}

h1, .h1 {
  font-family: var(--serif);
  font-weight: 400;
  font-size: 44px;
  line-height: 1.05;
  letter-spacing: -0.02em;
  margin: 0;
  color: var(--ink);
}
h1 em, .h1 em { font-style: italic; color: var(--ink); }

h2, .h2 {
  font-family: var(--serif);
  font-weight: 500;
  font-size: 28px;
  line-height: 1.15;
  letter-spacing: -0.012em;
  margin: 0;
  color: var(--ink);
}
h3, .h3 {
  font-family: var(--serif);
  font-weight: 500;
  font-size: 20px;
  line-height: 1.2;
  margin: 0;
  color: var(--ink);
}
h4, .h4 {
  font-family: var(--sans);
  font-weight: 600;
  font-size: 15px;
  margin: 0;
  letter-spacing: 0.005em;
  color: var(--ink);
}

.eyebrow {
  font-family: var(--mono);
  font-size: 10.5px;
  font-weight: 500;
  letter-spacing: 0.20em;
  text-transform: uppercase;
  color: var(--mark);
}
.eyebrow.mark { color: var(--mark); }

.label {
  font-family: var(--mono);
  font-size: 10.5px;
  font-weight: 500;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  color: var(--ink-dim);
}

.mono   { font-family: var(--mono); }
.serif  { font-family: var(--serif); }
.dim    { color: var(--ink-dim); }
.muted  { color: var(--ink-2); }
.faint  { color: var(--ink-faint); }
.tabular{ font-variant-numeric: tabular-nums; }

p { margin: 0 0 1em; }
strong, b { font-weight: 600; color: var(--ink); }

a {
  color: var(--mark);
  text-decoration: none;
  border-bottom: 1px solid currentColor;
  transition: color 0.12s ease, border-color 0.12s ease;
}
a:hover { color: var(--mark-deep); }
a.plain { border-bottom: 0; color: inherit; }
a.plain:hover { color: var(--mark); }
a:focus-visible {
  outline: 2px solid var(--mark);
  outline-offset: 3px;
  border-radius: 1px;
}

/* ===== LAYOUT ===== */
.wrap {
  max-width: var(--maxw);
  margin: 0 auto;
  padding: 0 var(--gutter);
}

/* utilities preserved from prior system */
.mt-8  { margin-top: 8px; }
.mt-16 { margin-top: 16px; }
.mt-24 { margin-top: 24px; }
.mt-48 { margin-top: 48px; }
.mt-32 { margin-top: 32px; }
.mb-8  { margin-bottom: 8px; }
.mb-16 { margin-bottom: 16px; }
.row { display: flex; align-items: center; gap: 12px; }
.row.baseline { align-items: baseline; }
.row.between { justify-content: space-between; }
.row.wrap-row { flex-wrap: wrap; }
.hidden { display: none !important; }

/* ===== TOPBAR ===== */
/* Same .topbar / .brand / .topnav / .pill / .topnav-divider classes
   as the prior system — rendered by Cadastre.renderTopbar() in app.js.
   The brand wordmark stays Plex Serif; the dot is brass. */
.topbar {
  position: sticky;
  top: 0;
  z-index: 100;
  background: var(--paper);
  border-bottom: 1px solid var(--rule);
  height: 60px;
  display: flex;
  align-items: center;
  backdrop-filter: blur(4px);
}
.topbar .wrap {
  width: 100%;
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 24px;
}
.brand {
  display: inline-flex;
  align-items: baseline;
  gap: 12px;
  font-family: var(--serif);
  font-weight: 500;
  font-size: 20px;
  letter-spacing: -0.005em;
  color: var(--ink);
  border-bottom: 0;
}
.brand:hover { color: var(--ink); }
.brand .mark {
  /* Topbar punctuation mark — a small brass tile that reads as a
     bullet/period before the wordmark. The glyph (a serif C on a
     brass plate) lives only in favicons / app tiles, where the
     wordmark can't fit. In every other context the brand is the
     wordmark alone, with this tile as a quiet flourish. */
  display: inline-block;
  width: 10px;
  height: 10px;
  background: var(--mark);
  border-radius: 1px;
  transform: translateY(-1px);
}
.brand small {
  font-family: var(--mono);
  font-size: 10px;
  font-weight: 500;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--ink-dim);
  margin-left: 4px;
}
.topnav {
  display: flex;
  gap: 14px;
  align-items: center;
}
.topnav a {
  font-family: var(--sans);
  font-size: 13.5px;
  font-weight: 500;
  color: var(--ink-2);
  border-bottom: 0;
  padding: 4px 0;
  letter-spacing: 0.005em;
  white-space: nowrap;
}
.topnav a:hover { color: var(--ink); }
.topnav a.active,
.topnav a.is-active,
.topnav a.navlink.is-active { color: var(--mark); }
.topnav-divider {
  width: 1px;
  height: 22px;
  background: var(--rule);
  margin: 0 6px;
}
.topnav .pill {
  font-family: var(--mono);
  font-size: 10.5px;
  text-transform: uppercase;
  letter-spacing: 0.12em;
  color: var(--ink);
  padding: 4px 10px;
  border: 1px solid var(--rule);
  background: var(--paper-2);
  border-radius: 2px;
  cursor: default;
}

/* Marketing topbar pair (Sign in + Get started) */
.topnav-signin {
  position: relative;
  font-family: var(--sans);
  font-size: 13.5px;
  font-weight: 500;
  color: var(--ink-2);
  border-bottom: 0;
  padding: 6px 4px;
  transition: color 0.15s ease;
  white-space: nowrap;
}
.topnav-signin:hover { color: var(--ink); }
.topnav-signin::after {
  content: "";
  position: absolute;
  left: 4px; right: 4px; bottom: 2px;
  height: 1px;
  background: var(--ink);
  transform: scaleX(0);
  transform-origin: left center;
  transition: transform 0.18s ease;
}
.topnav-signin:hover::after { transform: scaleX(1); }

/* "Request access" CTA — matches the rhythm of the rest of the topnav
   (which are plain sans-serif links). Brass to preserve the brand accent,
   but without the loud filled-pill treatment that broke visual rhythm
   against neighboring text links. */
.topnav-cta {
  font-family: var(--sans);
  font-size: 13.5px;
  font-weight: 500;
  color: var(--mark);
  background: transparent;
  padding: 6px 4px;
  border-radius: 0;
  border-bottom: 1px solid var(--mark);
  display: inline-flex;
  align-items: center;
  gap: 4px;
  transition: color 0.14s ease, border-color 0.14s ease;
  white-space: nowrap;
}
.topnav-cta:hover {
  color: var(--mark-deep);
  border-bottom-color: var(--mark-deep);
  background: transparent;
}
.topnav-cta span {
  display: inline-block;
  transition: transform 0.15s ease;
}
.topnav-cta:hover span { transform: translateX(2px); }

/* ===== BUTTONS =====
   .btn-mark = primary brass action
   .btn-primary = alias for .btn-mark (legacy)
   .btn-ghost = secondary outline
   .btn-link = bare text-link with arrow */
.btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 8px;
  font-family: var(--sans);
  font-size: 13.5px;
  font-weight: 500;
  line-height: 1;
  padding: 11px 18px;
  border-radius: 2px;
  border: 1px solid transparent;
  cursor: pointer;
  letter-spacing: 0.005em;
  transition: background 0.12s ease, color 0.12s ease, border-color 0.12s ease, transform 0.05s ease;
  text-decoration: none;
}
.btn:active { transform: translateY(0.5px); }
.btn:disabled { opacity: 0.55; cursor: not-allowed; }
.btn:focus-visible { outline: 2px solid var(--mark); outline-offset: 2px; }

.btn-mark {
  background: var(--mark);
  color: var(--paper);
  border-color: var(--mark);
}
.btn-mark:hover {
  background: var(--mark-deep);
  border-color: var(--mark-deep);
  color: var(--paper);
}

.btn-ghost {
  background: transparent;
  color: var(--ink);
  border-color: var(--rule-strong);
}
.btn-ghost:hover {
  border-color: var(--mark);
  color: var(--mark);
}

.btn-lg { padding: 14px 22px; font-size: 14.5px; }
.btn-md { padding: 11px 18px; font-size: 13.5px; }
.btn-sm { padding: 8px 14px; font-size: 12.5px; }
.btn-xs { padding: 5px 10px; font-size: 11.5px; }

.btn-danger {
  background: var(--bad);
  color: var(--ink);
  border-color: var(--bad);
}
.btn-danger:hover { background: #963f29; border-color: #963f29; }

/* ===== FORMS ===== */
.field {
  display: block;
  margin-bottom: 18px;
}
.field label,
label {
  display: block;
  font-family: var(--mono);
  font-size: 10.5px;
  font-weight: 500;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--ink-dim);
  margin-bottom: 8px;
}
.field .help,
.help {
  font-family: var(--sans);
  font-size: 12.5px;
  color: var(--ink-dim);
  margin-top: 6px;
  font-style: italic;
}

.input, select.input, textarea.input,
input[type="text"], input[type="email"], input[type="password"],
input[type="search"], input[type="number"], input[type="tel"],
input[type="url"], input[type="date"], textarea, select {
  width: 100%;
  font-family: var(--sans);
  font-size: 14px;
  line-height: 1.5;
  color: var(--ink);
  background: var(--paper-2);
  border: 1px solid var(--rule-strong);
  border-radius: 2px;
  padding: 10px 14px;
  transition: border-color 0.14s ease, background 0.14s ease;
  appearance: none;
  /* Render native pickers (the <select> options popup, date pickers, spin
     buttons) in dark mode so they match the dark UI instead of the OS
     default white-and-blue. */
  color-scheme: dark;
}
/* Dark, on-brand option list for native selects (Chromium honors these). */
select option { background: var(--paper-2); color: var(--ink); }
select option:checked { background: var(--paper-4); color: var(--ink); }
.input:focus, select.input:focus, textarea.input:focus,
input:focus, textarea:focus, select:focus {
  outline: none;
  border-color: var(--mark);
  background: var(--paper-3);
  box-shadow: 0 0 0 3px var(--mark-soft);
}
.input::placeholder,
input::placeholder, textarea::placeholder {
  color: var(--ink-faint);
}
textarea { min-height: 96px; resize: vertical; }
select.input, select {
  background-image:
    linear-gradient(45deg, transparent 50%, var(--ink-dim) 50%),
    linear-gradient(135deg, var(--ink-dim) 50%, transparent 50%);
  background-position: calc(100% - 17px) 52%, calc(100% - 12px) 52%;
  background-size: 5px 5px, 5px 5px;
  background-repeat: no-repeat;
  padding-right: 36px;
  cursor: pointer;
}

.error-text {
  font-family: var(--sans);
  font-size: 13px;
  color: var(--bad);
  margin: 12px 0;
  padding: 10px 14px;
  background: var(--bad-soft);
  border-left: 2px solid var(--bad);
  border-radius: 2px;
}

/* ===== CARDS, SHEETS, PANELS ===== */
.sheet {
  background: var(--paper-2);
  border: 1px solid var(--rule);
  border-radius: var(--radius);
  padding: 24px;
}

.panel {
  background: var(--paper-2);
  border: 1px solid var(--rule);
  border-radius: var(--radius);
}

/* ===== KEY–VALUE LISTS ===== */
.kv {
  display: grid;
  grid-template-columns: minmax(140px, max-content) 1fr;
  gap: 8px 24px;
  font-size: 14px;
}
.kv dt {
  font-family: var(--mono);
  font-size: 10.5px;
  font-weight: 500;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--ink-dim);
  align-self: baseline;
}
.kv dd {
  margin: 0;
  font-family: var(--sans);
  font-size: 14px;
  color: var(--ink);
}
.kv dd.num {
  font-family: var(--mono);
  font-feature-settings: "tnum";
  font-weight: 500;
}

/* ===== EMPTY STATE ===== */
.empty {
  text-align: left;
  padding: 64px 0;
  border-top: 1px solid var(--rule);
}
.empty .eyebrow { margin-bottom: 18px; }
.empty h1 {
  font-family: var(--serif);
  font-weight: 400;
  font-size: 44px;
  line-height: 1.04;
  letter-spacing: -0.02em;
  margin: 0 0 16px;
  max-width: 16ch;
}

/* ===== BADGES / TAGS / STATUS ===== */
.badge,
.tag,
.bc-tag {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  font-family: var(--mono);
  font-size: 9.5px;
  font-weight: 600;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  padding: 3px 8px;
  border-radius: 2px;
  background: var(--paper-3);
  color: var(--ink-2);
  border: 1px solid var(--rule);
}
.badge-mark { background: var(--mark-soft); color: var(--mark); border-color: rgba(184,133,58,0.30); }
.badge-good { background: var(--good-soft); color: var(--good); border-color: rgba(122,153,102,0.30); }
.badge-warn { background: var(--warn-soft); color: var(--warn); border-color: rgba(200,154,58,0.30); }
.badge-bad { background: var(--bad-soft);  color: var(--bad);  border-color: rgba(184,90,60,0.30); }
.badge-info { background: var(--info-soft); color: var(--info); border-color: rgba(122,141,184,0.30); }

/* ===== TABLES ===== */
.tbl, table.tbl {
  width: 100%;
  border-collapse: collapse;
  font-family: var(--sans);
  font-size: 13.5px;
}
.tbl thead th {
  font-family: var(--mono);
  font-size: 10px;
  font-weight: 500;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--ink-dim);
  text-align: left;
  padding: 14px 18px;
  border-bottom: 1px solid var(--ink-2);
  background: transparent;
}
.tbl th.num, .tbl td.num,
.tbl th.right, .tbl td.right { text-align: right; }
.tbl th.center, .tbl td.center { text-align: center; }
.tbl tbody td {
  padding: 11px 18px;
  border-bottom: 1px solid var(--rule);
  color: var(--ink);
}
.tbl tbody td.num,
.tbl tbody td.mono {
  font-family: var(--mono);
  font-variant-numeric: tabular-nums;
  font-weight: 500;
  font-size: 13px;
}
.tbl tr.section td {
  font-family: var(--mono);
  font-size: 10px;
  letter-spacing: 0.20em;
  text-transform: uppercase;
  color: var(--mark);
  background: var(--paper-2);
  padding: 10px 18px;
  border-top: 1px solid var(--rule);
  border-bottom: 1px solid var(--rule);
  font-weight: 500;
}
.tbl tr.subtotal td {
  background: var(--paper-2);
  font-weight: 600;
}
.tbl tr.subtotal td:first-child {
  font-family: var(--mono);
  font-size: 11.5px;
  letter-spacing: 0.10em;
  text-transform: uppercase;
}
.tbl tr.total td {
  border-top: 2px solid var(--ink);
  border-bottom: 2px solid var(--ink);
  padding: 16px 18px;
  font-family: var(--serif);
  font-size: 17px;
  font-weight: 500;
  letter-spacing: -0.005em;
}
.tbl tr.total td.num {
  font-family: var(--mono);
  font-size: 16px;
  font-weight: 700;
}
.tbl td.up   { color: var(--good); }
.tbl td.down { color: var(--bad); }
.tbl tr.row-flag td { background: rgba(184,90,60,0.04); }

/* ===== MODAL ===== */
.modal-backdrop {
  position: fixed; inset: 0;
  background: rgba(8,6,4,0.72);
  display: flex; align-items: center; justify-content: center;
  z-index: 1000;
  padding: 24px;
  backdrop-filter: blur(2px);
  animation: modalIn 0.16s ease-out;
}
.modal {
  background: var(--paper-2);
  border: 1px solid var(--rule-strong);
  border-radius: var(--radius);
  width: 100%;
  max-width: 540px;
  max-height: 88vh;
  overflow: hidden;
  display: flex;
  flex-direction: column;
  box-shadow: var(--shadow-2);
}
/* The assumptions editor carries a 4-column table + a live returns preview;
   it needs more room than the default confirm/info modal. */
.modal.modal-assume { max-width: 720px; }
.modal.modal-assume .ap-preview { margin-bottom: 14px; }
.modal-head {
  display: flex; align-items: center; justify-content: space-between;
  padding: 18px 22px;
  border-bottom: 1px solid var(--rule);
}
.modal-head h3 {
  font-family: var(--serif);
  font-size: 20px;
  font-weight: 500;
  letter-spacing: -0.005em;
  margin: 0;
  color: var(--ink);
}
.x-close {
  background: transparent;
  border: 0;
  color: var(--ink-dim);
  font-size: 22px;
  line-height: 1;
  cursor: pointer;
  padding: 4px 8px;
  border-radius: 2px;
}
.x-close:hover { color: var(--mark); background: var(--paper-3); }
.modal-body { padding: 20px 22px; overflow-y: auto; color: var(--ink-2); font-size: 14.5px; line-height: 1.55; }
.modal-foot {
  display: flex; gap: 10px; justify-content: flex-end;
  padding: 16px 22px;
  border-top: 1px solid var(--rule);
  background: var(--paper);
}
@keyframes modalIn {
  from { opacity: 0; transform: translateY(8px); }
  to   { opacity: 1; transform: translateY(0); }
}

/* ===== TOAST ===== */
.toast-host {
  position: fixed;
  top: 20px; right: 24px;
  z-index: 2000;
  display: flex; flex-direction: column;
  gap: 8px;
  pointer-events: none;
}
.toast {
  pointer-events: auto;
  background: var(--paper-2);
  border: 1px solid var(--rule-strong);
  color: var(--ink);
  padding: 12px 16px;
  border-radius: 2px;
  font-size: 13.5px;
  max-width: 380px;
  box-shadow: var(--shadow-2);
  border-left: 2px solid var(--ink-dim);
  animation: toastIn 0.16s ease-out;
}
.toast.ok   { border-left-color: var(--good); }
.toast.err  { border-left-color: var(--bad); }
.toast.warn { border-left-color: var(--warn); }
@keyframes toastIn {
  from { opacity: 0; transform: translateY(-6px); }
  to   { opacity: 1; transform: translateY(0); }
}

/* ===== INLINE CONFIRM ===== */

/* ===== AUTH SHELL =====
   Used by /login, /signup, /forgot-password, /reset-password,
   /verify-email. */
.auth-form {
  max-width: 400px;
  width: 100%;
  margin: 0 auto;
}
.auth-form h1 {
  font-family: var(--serif);
  font-weight: 400;
  font-size: 40px;
  letter-spacing: -0.02em;
  line-height: 1.05;
  margin: 0 0 12px;
}
.auth-form h1 em { font-style: italic; color: var(--ink); }
.auth-form .lede {
  font-family: var(--sans);
  font-size: 15.5px;
  color: var(--ink-2);
  margin: 0 0 32px;
  line-height: 1.55;
}
.auth-card { max-width: 460px; width: 100%; text-align: left; }
.auth-card h1 { font-size: 36px; }

/* the editorial side-panel epigraph used on /login */
.attribution {
  font-family: var(--mono);
  font-size: 10.5px;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--ink-dim);
  margin-top: 18px;
}
.checklist {
  list-style: none;
  padding: 0;
  margin: 28px 0 0;
}
.checklist li {
  padding: 12px 0;
  border-top: 1px solid var(--rule);
  display: grid;
  grid-template-columns: 16px 1fr;
  gap: 12px;
  align-items: baseline;
  font-size: 14px;
  color: var(--ink-2);
}
.checklist li::before {
  content: '·';
  color: var(--mark);
  font-size: 22px;
  line-height: 1;
  font-weight: 700;
}
.verify-mark {
  width: 56px; height: 56px; border-radius: 50%;
  margin-bottom: 24px;
  display: inline-flex; align-items: center; justify-content: center;
  font-size: 26px;
  border: 1px solid var(--rule);
}
.verify-mark.ok   { background: var(--good-soft); color: var(--good); border-color: var(--good); }
.verify-mark.bad  { background: var(--bad-soft);  color: var(--bad);  border-color: var(--bad);  }
.verify-mark.wait { background: var(--paper-3);   color: var(--ink-dim); }
.spin { animation: spin 0.9s linear infinite; }
@keyframes spin { to { transform: rotate(360deg); } }
.verify-actions {
  display: flex; gap: 12px; flex-wrap: wrap;
  margin-top: 8px;
}

/* ===== VERIFY-EMAIL BANNER (rendered by app.js) ===== */
.verify-banner {
  position: fixed;
  bottom: 18px; left: 50%;
  transform: translateX(-50%);
  z-index: 900;
  display: flex; align-items: center; gap: 14px;
  background: var(--paper-2);
  border: 1px solid var(--warn);
  border-left: 3px solid var(--warn);
  color: var(--ink);
  font-size: 13px;
  padding: 12px 16px;
  border-radius: 2px;
  box-shadow: var(--shadow-2);
  max-width: 720px;
}
.verify-banner strong { color: var(--mark); font-weight: 600; }
.verify-banner button {
  font-family: var(--mono);
  font-size: 11px;
  font-weight: 600;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  background: var(--warn);
  color: var(--paper);
  border: 0;
  padding: 6px 10px;
  border-radius: 2px;
  cursor: pointer;
  white-space: nowrap;
}
.verify-banner button:hover { background: var(--mark); }

/* ===== HOMEPAGE / MARKETING ===== */
.hero { padding: 96px 0 64px; position: relative; overflow: hidden; }
.hero .wrap { position: relative; }
.hero .lede { max-width: 56ch; }
.hero .actions { display: flex; gap: 12px; flex-wrap: wrap; margin-top: 32px; align-items: center; }
.feature .num {
  display: inline-block;
  font-family: var(--mono);
  font-size: 10.5px;
  color: var(--mark);
  letter-spacing: 0.18em;
  padding-bottom: 6px;
  border-bottom: 1px solid var(--mark);
  margin-bottom: 20px;
}
.feature h3 {
  font-family: var(--serif);
  font-size: 24px;
  font-weight: 500;
  margin: 0 0 12px;
  max-width: 22ch;
  letter-spacing: -0.012em;
  line-height: 1.18;
  color: var(--ink);
}
.feature h3 em {
  font-style: italic;
  color: var(--mark);
}
.feature p {
  color: var(--ink-2);
  max-width: 48ch;
  line-height: 1.55;
  font-size: 14.5px;
}

/* footer */
.foot {
  border-top: 1px solid var(--rule);
  padding: 24px 0 32px;
  background: var(--paper);
  font-family: var(--mono);
  font-size: 10.5px;
  letter-spacing: 0.14em;
  color: var(--ink-dim);
}
.foot .wrap {
  display: flex;
  justify-content: space-between;
  align-items: center;
  flex-wrap: wrap;
  gap: 12px;
}
.foot a { color: var(--ink-dim); border-bottom: 0; }
.foot a:hover { color: var(--mark); }

/* ===== TOPBAR · ATELIER =====
   Five-tab nav, centered. Account block on the right with firm name +
   initials avatar. Brand on the left. Matches the planned design exactly. */
.topbar-atelier {
  position: sticky;
  top: 0;
  z-index: 100;
  background: var(--paper);
  border-bottom: 1px solid var(--rule);
  height: 64px;
  display: flex;
  align-items: center;
  backdrop-filter: blur(4px);
}
.topbar-atelier .wrap {
  width: 100%;
  display: grid;
  grid-template-columns: 1fr auto 1fr;
  align-items: center;
  gap: 32px;
}
.topbar-atelier.is-marketing .wrap {
  grid-template-columns: auto 1fr;
  gap: 24px;
}
.topbar-atelier.is-marketing .topnav-tabs {
  justify-self: end;
}
.topbar-atelier .brand {
  justify-self: start;
  display: inline-flex;
  align-items: baseline;
  gap: 12px;
  font-family: var(--serif);
  font-weight: 500;
  font-size: 22px;
  letter-spacing: -0.005em;
  color: var(--ink);
  border-bottom: 0;
}
.topbar-atelier .brand:hover { color: var(--ink); }
.topbar-atelier .brand .mark {
  display: inline-block;
  width: 11px;
  height: 11px;
  background: var(--mark);
  border-radius: 1px;
  transform: translateY(-1px);
  background-image: none;
}
.topbar-atelier .brand .brand-word { font-family: var(--serif); font-weight: 500; }

.topnav-tabs {
  justify-self: center;
  display: inline-flex;
  align-items: baseline;
  gap: 38px;
}
.topnav-tab {
  font-family: var(--sans);
  font-weight: 500;
  font-size: 14.5px;
  color: var(--ink-dim);
  border-bottom: 0;
  padding: 4px 0;
  position: relative;
  letter-spacing: 0.005em;
  white-space: nowrap;
  cursor: pointer;
}
.topnav-tab:hover { color: var(--ink); }
.topnav-tab.is-active { color: var(--ink); }
.topnav-tab.is-active::after {
  content: "";
  position: absolute;
  left: 0; right: 0; bottom: -22px;
  height: 2px;
  background: var(--mark);
}
.topnav-tab.is-soon { color: var(--ink-dim); }
.topnav-tab.is-soon:hover { color: var(--ink-2); }

.topnav-account {
  justify-self: end;
  display: inline-flex;
  align-items: center;
  gap: 16px;
  font-family: var(--mono);
  font-size: 10.5px;
  letter-spacing: 0.14em;
  color: var(--ink-dim);
}
.topnav-firm {
  text-transform: uppercase;
  color: var(--ink-2);
  letter-spacing: 0.14em;
  white-space: nowrap;
  max-width: 200px;
  overflow: hidden;
  text-overflow: ellipsis;
}
.topnav-user { position: relative; display: inline-flex; }
.topnav-avatar {
  width: 30px; height: 30px;
  border-radius: 50%;
  background: var(--mark);
  color: var(--paper);
  display: inline-flex;
  align-items: center;
  justify-content: center;
  font-family: var(--mono);
  font-size: 11px;
  font-weight: 700;
  letter-spacing: 0.04em;
  border: 0;
  padding: 0;
  border-bottom: 0;
  cursor: pointer;
  transition: filter 0.12s, box-shadow 0.12s;
}
.topnav-avatar:hover { filter: brightness(1.08); color: var(--paper); }
.topnav-avatar[aria-expanded="true"] { box-shadow: 0 0 0 3px var(--mark-soft); }

/* Account dropdown menu */
.topnav-menu {
  position: absolute;
  top: calc(100% + 12px);
  right: 0;
  min-width: 200px;
  background: var(--paper-2);
  border: 1px solid var(--rule-strong);
  border-radius: var(--radius);
  box-shadow: var(--shadow-2);
  padding: 6px;
  z-index: 200;
  display: flex;
  flex-direction: column;
  gap: 1px;
}
.topnav-menu[hidden] { display: none; }
.topnav-menu-id {
  display: flex;
  flex-direction: column;
  gap: 2px;
  padding: 8px 10px 10px;
  margin-bottom: 4px;
  border-bottom: 1px solid var(--rule);
}
.topnav-menu-name {
  font-family: var(--serif);
  font-size: 15px;
  font-weight: 500;
  color: var(--ink);
  letter-spacing: -0.005em;
}
.topnav-menu-firm {
  font-family: var(--mono); font-size: 10px; letter-spacing: 0.12em;
  text-transform: uppercase; color: var(--ink-2); margin-top: 1px;
}
.topnav-menu-email {
  font-family: var(--mono);
  font-size: 10.5px;
  letter-spacing: 0.04em;
  color: var(--ink-dim);
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
.topnav-menu-item {
  display: block;
  font-family: var(--sans);
  font-size: 13.5px;
  font-weight: 500;
  color: var(--ink-2);
  border-bottom: 0;
  padding: 8px 10px;
  border-radius: 2px;
  letter-spacing: 0.005em;
}
.topnav-menu-item:hover { color: var(--ink); background: var(--paper-3); }
.topnav-menu-item[data-active="1"] { color: var(--mark); }
/* ===== Mobile hamburger + drawer ===== */
.topnav-burger {
  display: none;            /* shown < 860px */
  justify-self: end;
  width: 42px; height: 42px;
  flex-direction: column; align-items: center; justify-content: center; gap: 4px;
  background: var(--paper); border: 1px solid var(--rule); border-radius: var(--radius);
  cursor: pointer; padding: 0;
}
.topnav-burger span {
  display: block; width: 18px; height: 1.5px; background: var(--ink-2);
  transition: transform 0.2s ease, opacity 0.2s ease;
}
.topnav-burger.is-open span:nth-child(1) { transform: translateY(5.5px) rotate(45deg); }
.topnav-burger.is-open span:nth-child(2) { opacity: 0; }
.topnav-burger.is-open span:nth-child(3) { transform: translateY(-5.5px) rotate(-45deg); }

.topnav-scrim {
  position: fixed; inset: 64px 0 0; background: rgba(8,7,5,0.55);
  z-index: 90; opacity: 0; transition: opacity 0.2s ease;
}
.topnav-scrim.is-open { opacity: 1; }
.topnav-scrim[hidden] { display: none; }

.topnav-drawer {
  position: fixed; top: 64px; left: 0; right: 0; z-index: 95;
  background: var(--paper); border-bottom: 1px solid var(--rule-strong);
  box-shadow: var(--shadow-2);
  padding: 8px 0 20px;
  display: flex; flex-direction: column;
  transform: translateY(-10px); opacity: 0;
  transition: transform 0.2s ease, opacity 0.2s ease;
  max-height: calc(100dvh - 64px); overflow-y: auto;
}
.topnav-drawer.is-open { transform: translateY(0); opacity: 1; }
.topnav-drawer[hidden] { display: none; }
.topnav-d-link {
  display: block; padding: 15px 22px; border-bottom: 1px solid var(--rule-soft);
  font-family: var(--sans); font-size: 16px; font-weight: 500;
  color: var(--ink-2); letter-spacing: 0.005em;
}
.topnav-d-link:hover, .topnav-d-link.is-active { color: var(--mark); }
.topnav-d-firm {
  padding: 10px 22px 12px; font-family: var(--mono); font-size: 10px;
  letter-spacing: 0.16em; text-transform: uppercase; color: var(--ink-dim);
  border-bottom: 1px solid var(--rule);
}
.topnav-d-sep { height: 6px; }
.topnav-d-cta {
  margin: 14px 22px 4px; justify-content: center; text-align: center;
  font-family: var(--mono); letter-spacing: 0.14em; text-transform: uppercase;
  font-size: 12px; font-weight: 600;
}

@media (max-width: 1024px) {
  .topbar-atelier .wrap { gap: 18px; }
  .topnav-tabs { gap: 22px; }
  .topnav-firm { display: none; }
}
/* Collapse the inline bar into the hamburger before items start cramming. */
@media (max-width: 860px) {
  .topbar-atelier .wrap,
  .topbar-atelier.is-marketing .wrap,
  .topbar-atelier.is-app .wrap { grid-template-columns: 1fr auto; gap: 14px; }
  .topnav-tabs, .topnav-account { display: none !important; }
  .topnav-burger { display: inline-flex; }
}

/* ===== DASHBOARD: PIPELINE / KANBAN =====
   Keeps existing class names (.col, .col-head, .col-body, .col-dot,
   .col-count, .col-empty, .bcard, .bc-name, .bc-loc, .bc-metrics,
   .bc-metric, .bc-foot, .bc-type, .bc-when, .bc-flag, .bc-tag,
   .bc-actions, .bc-act) — restyled to the Atelier system. */
.board {
  display: flex;
  gap: 14px;
  align-items: flex-start;
  overflow-x: auto;
  padding-bottom: 20px;
  scroll-snap-type: x proximity;
}
.col {
  flex: 0 0 308px;
  scroll-snap-align: start;
  background: var(--paper-2);
  border: 1px solid var(--rule);
  border-radius: var(--radius);
  display: flex;
  flex-direction: column;
  max-height: calc(100vh - 280px);
  transition: border-color 0.14s ease, box-shadow 0.14s ease;
}
.col.drop-active {
  border-color: var(--mark);
  box-shadow: inset 0 0 0 1px var(--mark);
}
.col-head {
  display: grid;
  grid-template-columns: 16px auto 1fr auto;
  align-items: center;
  gap: 10px;
  padding: 14px 16px 12px;
  border-bottom: 1px solid var(--rule);
  position: sticky;
  top: 0;
  background: var(--paper-2);
  border-radius: var(--radius) var(--radius) 0 0;
  z-index: 1;
}
.col-head h2 {
  font-family: var(--serif);
  font-size: 16px;
  font-weight: 500;
  margin: 0;
  letter-spacing: -0.005em;
  color: var(--ink);
}
.col-head .col-num {
  font-family: var(--serif);
  font-style: italic;
  font-size: 16px;
  color: var(--mark);
}
.col-head .col-count {
  font-family: var(--mono);
  font-size: 10.5px;
  color: var(--ink-dim);
  background: var(--paper);
  border: 1px solid var(--rule);
  border-radius: 999px;
  padding: 2px 8px;
}
.col-dot {
  width: 8px; height: 8px; border-radius: 50%;
  flex: 0 0 auto;
  background: var(--ink-faint);
}
.col[data-stage="screening"]      .col-dot { background: var(--ink-dim); }
.col[data-stage="underwriting"]   .col-dot { background: var(--mark); box-shadow: 0 0 0 3px var(--mark-soft); }
.col[data-stage="loi_submitted"]  .col-dot { background: var(--warn); box-shadow: 0 0 0 3px var(--warn-soft); }
.col[data-stage="under_contract"] .col-dot { background: var(--info); box-shadow: 0 0 0 3px var(--info-soft); }
.col[data-stage="closed"]         .col-dot { background: var(--good); box-shadow: 0 0 0 3px var(--good-soft); }
.col[data-stage="passed"]         .col-dot { background: var(--bad);  box-shadow: 0 0 0 3px var(--bad-soft); }

.col-body {
  padding: 10px;
  overflow-y: auto;
  flex: 1 1 auto;
  min-height: 90px;
  display: flex;
  flex-direction: column;
  gap: 10px;
}
.col-empty {
  color: var(--ink-faint);
  font-size: 12.5px;
  font-style: italic;
  padding: 14px 6px;
  text-align: center;
  font-family: var(--serif);
}

/* deal card */
.bcard {
  position: relative;
  display: block;
  text-decoration: none;
  color: inherit;
  background: var(--paper);
  border: 1px solid var(--rule);
  border-radius: var(--radius);
  padding: 14px 14px 12px;
  cursor: grab;
  transition: border-color 0.14s ease, box-shadow 0.14s ease, transform 0.05s ease;
  border-bottom: 1px solid var(--rule); /* override default underline */
}
.bcard:hover { border-color: var(--rule-strong); box-shadow: var(--shadow-2); }
.bcard:active { cursor: grabbing; transform: translateY(0.5px); }
.bcard.dragging { opacity: 0.45; border-style: dashed; }
.bcard.is-archived { opacity: 0.85; }
.bcard.is-focus { border-color: var(--mark); box-shadow: inset 0 0 0 1px var(--mark); }
.bc-name {
  font-family: var(--serif);
  font-size: 17px;
  font-weight: 500;
  color: var(--ink);
  line-height: 1.2;
  padding-right: 18px;
  letter-spacing: -0.005em;
}
.bc-loc {
  font-family: var(--mono);
  font-size: 10.5px;
  color: var(--ink-dim);
  margin-top: 4px;
  letter-spacing: 0.04em;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
.bc-loc.muted { color: var(--ink-faint); }
.bc-thesis {
  font-family: var(--serif);
  font-style: italic;
  font-size: 13px;
  line-height: 1.45;
  color: var(--ink-2);
  margin-top: 10px;
  padding-top: 10px;
  border-top: 1px solid var(--rule);
}
.bc-metrics {
  display: flex;
  gap: 18px;
  margin-top: 10px;
  padding-top: 10px;
  border-top: 1px dashed var(--rule);
}
.bcard:not(:has(.bc-thesis)) .bc-metrics { border-top: 1px solid var(--rule); }
.bc-metric {
  display: flex;
  flex-direction: column;
  gap: 3px;
  min-width: 0;
}
.bc-metric .k {
  font-family: var(--mono);
  font-size: 9.5px;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  color: var(--ink-dim);
}
.bc-metric .v {
  font-family: var(--mono);
  font-size: 15px;
  font-weight: 600;
  line-height: 1;
  color: var(--ink);
  font-variant-numeric: tabular-nums;
}
.bc-metric .v.awaiting { font-size: 13px; color: var(--ink-faint); font-weight: 400; }
.bc-foot {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 8px;
  margin-top: 10px;
  padding-top: 10px;
  border-top: 1px solid var(--rule);
}
.bc-type {
  font-family: var(--mono);
  font-size: 9px;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--ink-dim);
  border: 1px solid var(--rule);
  border-radius: 999px;
  padding: 2px 8px;
}
.bc-when {
  font-family: var(--mono);
  font-size: 10px;
  color: var(--ink-faint);
  white-space: nowrap;
  letter-spacing: 0.04em;
}
.bc-flag {
  font-family: var(--mono);
  font-size: 9.5px;
  font-weight: 700;
  letter-spacing: 0.10em;
  text-transform: uppercase;
  background: var(--bad-soft);
  color: var(--bad);
  border-radius: 2px;
  padding: 2px 8px;
}
.bc-tag {
  display: inline-block;
  font-family: var(--mono);
  font-size: 9px;
  letter-spacing: 0.10em;
  text-transform: uppercase;
  font-weight: 600;
  background: var(--warn-soft);
  color: var(--warn);
  border: 1px solid rgba(200,154,58,0.30);
  border-radius: 2px;
  padding: 2px 8px;
  margin-top: 10px;
  margin-right: 4px;
}
.bc-actions {
  position: absolute;
  top: 8px; right: 8px;
  display: flex; gap: 2px;
  opacity: 0;
  transition: opacity 0.12s;
}
.bcard:hover .bc-actions { opacity: 1; }
.bc-act {
  background: var(--paper-2);
  border: 1px solid var(--rule);
  color: var(--ink-dim);
  cursor: pointer;
  font-size: 11px;
  line-height: 1;
  padding: 4px 7px;
  border-radius: 2px;
  font-family: var(--sans);
}
.bc-act:hover { color: var(--mark); border-color: var(--mark); background: var(--paper-3); }

/* ===== FEEDBACK LAUNCHER · rendered by app.js as .fb-launcher ===== */
.fb-launcher {
  position: fixed;
  bottom: 20px; right: 20px;
  z-index: 800;
  display: inline-flex;
  align-items: center;
  gap: 8px;
  font-family: var(--mono);
  font-size: 11px;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  font-weight: 600;
  padding: 9px 14px;
  background: var(--paper-2);
  color: var(--ink-2);
  border: 1px solid var(--rule-strong);
  border-radius: 2px;
  cursor: pointer;
  box-shadow: var(--shadow-2);
  transition: color 0.14s, border-color 0.14s, background 0.14s;
}
.fb-launcher:hover { color: var(--mark); border-color: var(--mark); background: var(--paper-3); }
.fb-launcher .fb-dot {
  width: 7px; height: 7px; border-radius: 50%;
  background: var(--mark);
  display: inline-block;
}

/* ===== BRAND LOCKUPS · re-usable composition primitives =====
   The brand is the wordmark. The C-glyph plate appears in lockups
   for visual presence at hero scale — auth side panels, the brand
   study, document covers. .brand-lockup composes them. */
.brand-lockup {
  display: inline-flex;
  align-items: center;
  gap: 18px;
  color: var(--ink);
  text-decoration: none;
  border-bottom: 0;
}
.brand-lockup .lockup-mark {
  width: 40px;
  height: 40px;
  flex: 0 0 40px;
  border-radius: 3px;
  background: var(--mark);
  display: inline-flex;
  align-items: center;
  justify-content: center;
  font-family: var(--serif);
  font-weight: 600;
  font-size: 28px;
  line-height: 1;
  color: var(--paper);
  letter-spacing: 0;
  user-select: none;
}
.brand-lockup .lockup-mark::before {
  content: "C";
  display: block;
  /* small optical adjustment so the serif C centers visually */
  transform: translateY(-0.04em);
}
.brand-lockup .lockup-word {
  font-family: var(--serif);
  font-weight: 500;
  font-size: 32px;
  letter-spacing: -0.014em;
  color: var(--ink);
  line-height: 1;
}
.brand-lockup.lockup-lg .lockup-mark { width: 64px; height: 64px; flex-basis: 64px; font-size: 46px; border-radius: 4px; }
.brand-lockup.lockup-lg .lockup-word { font-size: 48px; letter-spacing: -0.020em; }
.brand-lockup.lockup-sm .lockup-mark { width: 24px; height: 24px; flex-basis: 24px; font-size: 17px; border-radius: 2px; }
.brand-lockup.lockup-sm .lockup-word { font-size: 18px; letter-spacing: -0.005em; }
.brand-lockup.lockup-stacked {
  flex-direction: column;
  align-items: flex-start;
  gap: 12px;
}
.brand-lockup.lockup-hero .lockup-mark { width: 96px; height: 96px; flex-basis: 96px; font-size: 68px; border-radius: 5px; }
.brand-lockup.lockup-hero .lockup-word { font-size: 76px; letter-spacing: -0.024em; }

/* glyph-only (no wordmark) variant for tile contexts */

/* ===== MASTHEAD BAR · publication-voice ribbon =====
   Used at the top of outward-facing pages (home, login, signup,
   brand study) just under the topbar. Renders three columns:
   masthead-l (publication), masthead-c (issue), masthead-r (date). */

/* ===== BULLETIN BAR · in-product status ribbon =====
   Used at the top of inside-the-product pages (dashboard) — a
   more reserved cousin of the masthead bar. Date + headline. */

/* ===== ATELIER · polish overrides for project.html JS-rendered panes =====
   The Data, Analysis, and Summary tabs render through 5K lines of JS in
   project.html. We can't refactor that safely, but we can give the existing
   class names a stronger Atelier voice via these overrides. */

/* Data tab — source cards */
.data-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(320px, 1fr));
  gap: 14px;
  margin-top: 8px;
}
.data-card {
  background: var(--paper-2);
  border: 1px solid var(--rule);
  border-radius: var(--radius);
  padding: 22px 22px 18px 24px;
  display: flex;
  flex-direction: column;
  gap: 14px;
  position: relative;
  overflow: hidden;
  cursor: pointer;
  transition: border-color 0.16s ease, box-shadow 0.16s ease, transform 0.16s ease;
}
/* Status accent: a thin colored rail keyed to the card's tone so the grid
   reads as a status board at a glance — green = clean, amber = wants a look,
   gold = analyst-adjusted, faint = a recommended input still missing. */
.data-card::before {
  content: '';
  position: absolute;
  left: 0; top: 0; bottom: 0;
  width: 3px;
  background: transparent;
  transition: background 0.16s ease;
}
.data-card.tone-good::before    { background: var(--good); }
.data-card.tone-review::before  { background: var(--accent-amber); }
.data-card.tone-low::before     { background: var(--accent-amber); }
.data-card.tone-edited::before  { background: var(--mark); }
.data-card.tone-missing::before { background: var(--rule-strong); }
.data-card:hover {
  border-color: var(--rule-strong);
  transform: translateY(-1px);
  box-shadow: 0 10px 30px rgba(0,0,0,0.30);
}
/* Empty / optional cards read as quiet placeholders, not live data. */
.data-card.is-empty {
  border-style: dashed;
  background: transparent;
}
.data-card.tone-missing { border-color: rgba(184,133,58,0.28); }
.data-card-head {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 10px;
}
.data-card-head .eyebrow {
  font-family: var(--mono);
  font-size: 10px;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--ink-dim);
}
.data-card h3 {
  font-family: var(--serif);
  font-weight: 500;
  font-size: 18px;
  letter-spacing: -0.005em;
  color: var(--ink);
  margin: 0;
  font-style: italic;
}
.data-card .subtitle {
  font-family: var(--sans);
  font-size: 13.5px;
  color: var(--ink-2);
  line-height: 1.45;
  margin: -8px 0 4px;
}
.data-card-stats {
  list-style: none;
  margin: 0;
  padding: 0;
  display: flex;
  flex-direction: column;
  gap: 6px;
  border-top: 1px dashed var(--rule);
  padding-top: 12px;
}
.data-card-stats li {
  display: grid;
  grid-template-columns: minmax(80px, max-content) 1fr;
  gap: 14px;
  align-items: baseline;
  font-family: var(--mono);
  font-size: 12.5px;
  font-variant-numeric: tabular-nums;
}
.data-card-stats li strong {
  font-weight: 500;
  color: var(--ink-dim);
  font-size: 10.5px;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  font-family: var(--mono);
}
.data-card-foot {
  margin-top: auto;
  padding-top: 6px;
}
/* The footer CTA reads as a quiet link that warms to gold when the whole
   card is hovered — reinforcing that the card itself is the click target. */
.data-card-foot .btn {
  transition: color 0.16s ease, border-color 0.16s ease, gap 0.16s ease;
}
.data-card:hover .data-card-foot .btn {
  color: var(--mark);
  border-color: var(--mark);
}
/* Tint the discrepancy note to match the amber status rail. */
.data-card-note.tone-review,
.data-card-note.tone-low { color: var(--accent-amber); }

/* Primary / Secondary tier headers on the Data tab. Primary inputs feel
   like the spine of the workspace; secondary inputs are muted reference. */
.data-section-head {
  display: flex; align-items: baseline; justify-content: space-between;
  gap: 12px; margin: 30px 0 12px;
}
/* The first tier sits right under the readiness banner — tighten that gap so
   the vertical rhythm between tiers stays uniform everywhere else. */
.deal-control + .data-section-head { margin-top: 14px; }
.data-section-head-secondary { margin-top: 30px; }
.data-section-head .eyebrow {
  font-family: var(--mono); font-size: 10.5px; letter-spacing: 0.22em;
  text-transform: uppercase; color: var(--ink-dim);
}
.data-section-note {
  font-family: var(--serif); font-style: italic; font-size: 12.5px;
  color: var(--ink-faint);
}

/* Secondary tier: muted background, slimmer cards, reduced visual weight.
   Primary tier stays at the full Atelier treatment defined above. */
.data-grid-secondary { gap: 12px; opacity: 0.92; }
.data-grid-secondary .data-card {
  background: transparent;
  padding: 16px 18px 14px 20px;
  gap: 10px;
}
.data-grid-secondary .data-card h3 { font-size: 16px; }
.data-grid-secondary .data-card-stats { padding-top: 10px; gap: 4px; }
.data-grid-secondary .data-card-stats li { font-size: 11.5px; }

/* Category-scoped upload panes (Leases, OM) — same dropzone treatment as
   the data room but trimmer; one bucket only, no classification UI. */
.cat-upload {
  border: 1px dashed var(--rule-strong);
  border-radius: var(--radius);
  padding: 18px 20px;
  background: var(--paper-2);
  transition: border-color 0.14s, background 0.14s;
}
.cat-upload.is-drag {
  border-color: var(--mark);
  background: var(--mark-soft);
}
.cat-upload-inner {
  display: flex; align-items: center; flex-wrap: wrap; gap: 12px;
}
.cat-upload-hint {
  font-family: var(--serif); font-style: italic; font-size: 13px;
  color: var(--ink-dim);
}
.cat-file-list { list-style: none; padding: 0; margin: 0; }
.cat-file-row {
  display: grid;
  grid-template-columns: 1fr auto auto;
  gap: 14px; align-items: baseline;
  padding: 10px 0;
  border-bottom: 1px solid var(--rule);
}
.cat-file-row:last-child { border-bottom: 0; }
.cat-file-name {
  font-family: var(--serif); font-size: 14px; color: var(--ink);
  text-decoration: none; border-bottom: 1px solid transparent;
}
.cat-file-name:hover { border-bottom-color: var(--mark); color: var(--mark); }
.cat-file-meta {
  font-family: var(--mono); font-size: 10.5px; letter-spacing: 0.06em;
  color: var(--ink-dim);
}
.cat-empty {
  font-family: var(--serif); font-style: italic; font-size: 13px;
  color: var(--ink-dim); padding: 20px 0;
}

/* Section header used at the top of a tab pane */
.pane-intro {
  margin-bottom: 32px;
  max-width: 64ch;
}
.pane-intro .eyebrow { margin-bottom: 14px; }
.pane-intro h2,
.pane-intro h1 {
  font-family: var(--serif);
  font-weight: 400;
  font-style: italic;
  font-size: clamp(28px, 3.4vw, 40px);
  line-height: 1.04;
  letter-spacing: -0.02em;
  margin: 0 0 12px;
  color: var(--ink);
}
.pane-intro p {
  font-family: var(--serif);
  font-style: italic;
  font-size: 16px;
  line-height: 1.55;
  color: var(--ink-2);
  margin: 0;
}

/* Analysis tab columns */
.analysis-col {
  background: var(--paper-2);
  border: 1px solid var(--rule);
  border-radius: var(--radius);
  padding: 22px;
}
.analysis-col h3 {
  font-family: var(--serif);
  font-weight: 500;
  font-style: italic;
  font-size: 20px;
  letter-spacing: -0.005em;
  margin: 0 0 8px;
  color: var(--ink);
}
.analysis-empty {
  padding: 32px 24px;
  background: var(--paper-2);
  border: 1px dashed var(--rule);
  border-radius: var(--radius);
  font-family: var(--serif);
  font-style: italic;
  font-size: 15px;
  color: var(--ink-dim);
  text-align: center;
}

/* Dossier section headers in the Data tab */
.dossier-section { margin-top: 28px; }
.dossier-section-title {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  padding-bottom: 10px;
  margin-bottom: 14px;
  border-bottom: 1px solid var(--rule);
}
.dossier-section-title h2 {
  font-family: var(--serif);
  font-weight: 500;
  font-style: italic;
  font-size: 22px;
  letter-spacing: -0.01em;
  margin: 0;
  color: var(--ink);
}
.dossier-section-title .meta {
  font-family: var(--mono);
  font-size: 10.5px;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--ink-dim);
}

/* ===== SCROLLBARS ===== */
* {
  scrollbar-color: var(--rule-strong) var(--paper);
  scrollbar-width: thin;
}
*::-webkit-scrollbar { width: 9px; height: 9px; }
*::-webkit-scrollbar-track { background: var(--paper); }
*::-webkit-scrollbar-thumb {
  background: var(--rule-strong);
  border-radius: 0;
  border: 2px solid var(--paper);
}
*::-webkit-scrollbar-thumb:hover { background: var(--ink-faint); }

/* ===== SELECTION ===== */
::selection { background: var(--mark-soft); color: var(--mark); }

/* ===== UTILITY · responsive ===== */
@media (max-width: 720px) {
  .wrap { padding: 0 20px; }
  .hero { padding: 56px 0 40px; }
  .display { font-size: clamp(40px, 9vw, 64px); }
  h1, .h1 { font-size: 34px; }
}

/* =====================================================================
   INNER WORKFLOW · the operational workspace (Data · Analysis · Summary)
   ---------------------------------------------------------------------
   The deal panes are rendered by the JS in project.html + app.js, which
   emit this class vocabulary. These rules give those panes the same
   Atelier voice as the shell: hairline grids, serif headings, mono
   numerics, brass accents, generous rhythm.
   ===================================================================== */

/* ----- shared layout primitives ----- */
.scroll-x { overflow-x: auto; -webkit-overflow-scrolling: touch; }

/* ----- editorial section heads (used across dossier + analysis) ----- */
.analysis-section-eyebrow,
.analysis-col-eyebrow,
.an-sens-eyebrow,
.rr-eyebrow,
.scen-compare-head,
.comp-band-source {
  font-family: var(--mono);
  font-size: 10px;
  font-weight: 500;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--ink-dim);
}
.analysis-col-eyebrow { color: var(--mark); margin-bottom: 4px; }
.analysis-col-muted { font-family: var(--serif); font-style: italic; color: var(--ink-dim); font-size: 14px; }

/* dossier KPI grid */

/* aside cards (Property facts / Save / Census) */
/* De-boxed: rows list under the section title (the dividers carry structure,
   no filled card), matching the analysis-tab lease stats. */
.glance-card {
  padding: 4px 0 0;
}
.glance-row {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: 16px;
  padding: 10px 0;
  border-bottom: 1px solid var(--rule-soft);
}
.glance-row:last-child { border-bottom: 0; }
.glance-card .glance-row:last-of-type { border-bottom: 0; }
.glance-row .k {
  font-family: var(--mono);
  font-size: 10px;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--ink-dim);
}
.glance-row .v {
  font-family: var(--sans);
  font-size: 13.5px;
  font-weight: 500;
  color: var(--ink);
  font-variant-numeric: tabular-nums;
  text-align: right;
}

/* ===================================================================
   EDITORIAL TABLES (dossier + analysis waterfalls / projections)
   =================================================================== */
.tbl-editorial,
.tbl-waterfall,
.tbl-proforma,
.tbl-expenses,
.asm-tbl,
.scen-compare,
.adm-tbl {
  width: 100%;
  border-collapse: collapse;
  font-family: var(--sans);
  font-size: 13.5px;
}
.tbl-editorial thead th,
.tbl-proforma thead th,
.tbl-expenses thead th,
.asm-tbl thead th,
.scen-compare thead th {
  font-family: var(--mono);
  font-size: 10px;
  font-weight: 500;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  color: var(--ink-dim);
  text-align: left;
  padding: 12px 14px;
  border-bottom: 1px solid var(--ink-2);
  white-space: nowrap;
}
.tbl-editorial th.num,
.tbl-editorial td.num,
.tbl-waterfall td.num,
.tbl-proforma th.num,
.tbl-proforma td.num,
.tbl-expenses th.num,
.tbl-expenses td.num,
.asm-tbl th.num,
.asm-tbl td.num,
.scen-compare th.num,
.scen-compare td.num { text-align: right; }
.tbl-editorial tbody td,
.tbl-waterfall tbody td,
.tbl-proforma tbody td,
.tbl-expenses tbody td {
  padding: 10px 14px;
  border-bottom: 1px solid var(--rule);
  color: var(--ink);
  vertical-align: baseline;
}
.tbl-editorial td.num,
.tbl-waterfall td.num,
.tbl-proforma td.num,
.tbl-expenses td.num,
.tbl-editorial td.mono,
td.c-num {
  font-family: var(--mono);
  font-variant-numeric: tabular-nums;
  font-weight: 500;
  font-size: 13px;
}
.tbl-waterfall td.line, .tbl-editorial td.line { color: var(--ink); }
.line-sub {
  display: block;
  font-family: var(--mono);
  font-size: 10px;
  letter-spacing: 0.04em;
  color: var(--ink-dim);
  margin-top: 3px;
  text-transform: none;
}
/* waterfall row variants */
.tbl-waterfall .is-loss td.num { color: var(--ink-2); }
.tbl-waterfall .is-subtotal td {
  background: var(--paper-2);
  font-weight: 600;
}
.tbl-waterfall .is-subtotal td:first-child {
  font-family: var(--mono);
  font-size: 11px;
  letter-spacing: 0.06em;
  text-transform: uppercase;
}
.tbl-waterfall .is-noi td,
.tbl-editorial tr.total td,
.tbl-editorial tr.is-total td {
  border-top: 2px solid var(--ink);
  border-bottom: 2px solid var(--ink);
  padding-top: 14px; padding-bottom: 14px;
}
.tbl-waterfall .is-noi td.line,
.tbl-editorial tr.total td:first-child {
  font-family: var(--serif);
  font-style: italic;
  font-size: 17px;
  font-weight: 500;
}
.tbl-waterfall .is-noi td.num,
.tbl-editorial tr.total td.num {
  font-family: var(--mono);
  font-size: 16px;
  font-weight: 700;
}
.tbl-waterfall .is-ratio td {
  color: var(--ink-dim);
  font-size: 12.5px;
  border-bottom: 0;
}
.tbl-proforma .is-current td,
.tbl-editorial tr.is-current td { background: var(--mark-soft); }
.tbl-editorial td.up, .tbl-waterfall td.up { color: var(--good); }
.tbl-editorial td.down, .tbl-waterfall td.down { color: var(--bad); }
.tbl-editorial .note, .tbl-editorial td.note {
  font-family: var(--serif);
  font-style: italic;
  color: var(--ink-dim);
  font-size: 13px;
  text-align: left;
}
/* income/expenses variance table — section + subtotal rows */
.tbl-editorial tr.is-section td {
  font-family: var(--serif);
  font-style: italic;
  font-size: 15px;
  color: var(--mark);
  background: var(--paper-2);
  padding-top: 12px;
  padding-bottom: 12px;
  border-bottom: 1px solid var(--rule);
}
.tbl-editorial tr.is-subtotal td { background: var(--paper-2); font-weight: 600; }
.tbl-editorial tr.is-subtotal td.line { font-weight: 600; }
/* Expense-composition bar — the single visual anchor in the Income & Expenses
   section. Warm tonal segments, mono legend; reads composition at a glance. */
.opx-wrap { margin: 26px 0 2px; }
.opx-head { font-family: var(--mono); font-size: 10px; letter-spacing: 0.12em; text-transform: uppercase;
  color: var(--ink-dim); margin-bottom: 10px; }
.opx-bar { display: flex; height: 12px; border-radius: 3px; overflow: hidden; background: var(--paper-3); }
.opx-seg { height: 100%; }
.opx-seg + .opx-seg { box-shadow: inset 1px 0 0 var(--paper); }
.opx-legend { display: flex; flex-wrap: wrap; gap: 7px 16px; margin-top: 12px; }
.opx-leg { display: inline-flex; align-items: center; gap: 6px; font-family: var(--mono); font-size: 11px;
  color: var(--ink-2); white-space: nowrap; }
.opx-dot { width: 8px; height: 8px; border-radius: 2px; flex: none; }
.opx-pct { color: var(--ink-dim); font-variant-numeric: tabular-nums; }
/* Operating-margin bar — NOI (kept, green) vs OpEx (spent, brass) as a share
   of EGI. Companion to the expense-composition bar above the value-add strip. */
.opm-wrap { margin: 30px 0 2px; }
.opm-bar { display: flex; height: 12px; border-radius: 3px; overflow: hidden; background: var(--paper-3); }
.opm-seg { height: 100%; }
.opm-seg.is-noi { background: var(--good); }
.opm-seg.is-opex { background: var(--mark); }
.opm-seg + .opm-seg { box-shadow: inset 1px 0 0 var(--paper); }
.opm-legend { display: flex; flex-wrap: wrap; gap: 7px 18px; margin-top: 12px; }
.opm-leg { display: inline-flex; align-items: center; gap: 6px; font-family: var(--mono); font-size: 11px;
  color: var(--ink-2); white-space: nowrap; }
.opm-dot { width: 8px; height: 8px; border-radius: 2px; flex: none; }
.opm-dot.is-noi { background: var(--good); }
.opm-dot.is-opex { background: var(--mark); }
/* Capital-stack split (Debt section): debt (brass) vs equity (green). */
.opm-seg.is-debt { background: var(--mark); }
.opm-seg.is-equity { background: var(--good); }
.opm-dot.is-debt { background: var(--mark); }
.opm-dot.is-equity { background: var(--good); }
.tbl-variance thead th:last-child { text-align: left; }
/* Notes wrap and are width-capped. A long note used to be `nowrap`, which let
   one row's note balloon the column and squish every other column to the left
   (and force the line-item text to wrap) on deals with verbose notes. */
.tbl-variance td.note { white-space: normal; max-width: 280px; overflow-wrap: anywhere; }
.tbl-variance tr.total td.note { color: var(--ink-2); }
.exp-cat { color: var(--ink); }
.exp-perunit {
  display: block;
  font-family: var(--mono);
  font-size: 10px;
  color: var(--ink-dim);
  margin-top: 2px;
}

/* ===================================================================
   ANALYSIS PAGE
   =================================================================== */
.analysis-page { display: block; }

/* Cluster tabs — the Analysis tab's five tiers on one row. The active tier
   carries the brass underline; only its panel is shown. Replaces the old
   wrap-around jump-link rail. */
.analysis-tabs {
  display: flex;
  gap: 2px;
  margin: 24px 0 26px;
  border-bottom: 1px solid var(--rule);
  /* Stay docked while a long cluster scrolls, so jumping tiers never means
     scrolling back to the top. Sits just under the 50px workspace tab bar
     (which is sticky at top:0, z-index 10); the canvas fill keeps content from
     bleeding through underneath. */
  position: sticky;
  top: 50px;
  z-index: 6;
  background: var(--paper);
  padding-top: 2px;
}
.analysis-tab {
  position: relative;
  font-family: var(--mono);
  font-size: 12px;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--ink-dim);
  background: none;
  border: 0;
  border-bottom: 2px solid transparent;
  padding: 13px 18px;
  margin-bottom: -1px;
  cursor: pointer;
  transition: color 0.12s ease;
}
.analysis-tab:first-child { padding-left: 0; }
/* Download actions ride the right edge of the tab row (PDF + Excel), at the
   same level as the five analysis tabs. */
.analysis-tabs-dl { margin-left: auto; display: flex; gap: 8px; align-items: center; }
.analysis-tab:hover { color: var(--ink); }
.analysis-tab.is-active { color: var(--mark); border-bottom-color: var(--mark); }
/* A small dot rides beside a tier's label when that tier holds an unresolved
   flag — a quiet "look here" before you click in. Tone follows severity. */
.analysis-tab .tab-dot {
  display: inline-block;
  width: 5px;
  height: 5px;
  border-radius: 50%;
  margin-left: 7px;
  vertical-align: 1px;
  background: var(--warn);
}
.analysis-tab .tab-dot.is-bad { background: var(--bad); }
.analysis-cluster { display: none; }
.analysis-cluster.is-active { display: block; }

.analysis-section {
  padding: 34px 0 30px;
  border-top: 1px solid var(--rule);
  scroll-margin-top: 80px;
}
.analysis-section:first-of-type { border-top: 0; padding-top: 26px; }

/* The first section inside each cluster panel sits directly under the tab row,
   so it drops its own top border to avoid a double rule. Handled by
   .analysis-section:first-of-type, which is scoped within each .analysis-cluster
   parent. */
.analysis-sec-head { margin-bottom: 20px; }
.analysis-sec-head h2 {
  font-family: var(--serif);
  font-weight: 400;
  font-style: italic;
  font-size: 18.5px;
  letter-spacing: -0.01em;
  color: var(--ink);
  margin: 0;
  position: relative;
  padding-left: 16px;
}
/* Brass tick before every section title — echoes the wordmark's square,
   gives the editorial headings a consistent anchor across all clusters. */
.analysis-sec-head h2::before {
  content: '';
  position: absolute;
  left: 0;
  top: 0.62em;
  width: 6px;
  height: 6px;
  background: var(--mark);
  border-radius: 1px;
}

/* Collapsible secondary section (Comps, Checks). The <summary> element is
   the clickable header — strip the default disclosure triangle and use our
   own caret instead so the row reads cleanly. */
details.analysis-section.is-collapsible { padding: 22px 0; }
details.analysis-section > summary.analysis-sec-head {
  cursor: pointer;
  list-style: none;
  margin-bottom: 0;
  display: flex; align-items: baseline; justify-content: space-between;
  gap: 12px;
}
details.analysis-section > summary.analysis-sec-head::-webkit-details-marker { display: none; }
details.analysis-section > summary.analysis-sec-head::marker { content: ''; }
.analysis-sec-toggle {
  font-family: var(--mono); font-size: 10.5px;
  letter-spacing: 0.16em; text-transform: uppercase;
  color: var(--ink-dim);
}
details.analysis-section[open] > summary .analysis-sec-toggle::after { content: ' ↑'; }
details.analysis-section[open] { padding-bottom: 32px; }
details.analysis-section[open] > summary { margin-bottom: 20px; }
.analysis-empty {
  padding: 28px 24px;
  background: var(--paper-2);
  border: 1px dashed var(--rule);
  border-radius: var(--radius);
  font-family: var(--serif);
  font-style: italic;
  font-size: 14.5px;
  color: var(--ink-dim);
}
/* Instructive empty state (analysisEmptyCard) — sections with nothing loaded
   yet. Open layout (no box / no strip): a quiet icon, the prompt, the action. */
.an-empty-card {
  display: flex;
  align-items: center;
  gap: 16px;
  padding: 14px 0;
}
.an-empty-card .aec-ico { font-size: 19px; color: var(--ink-faint); flex: none; }
.an-empty-card .aec-body { min-width: 0; }
.an-empty-card .aec-title { font-family: var(--serif); font-style: italic; font-size: 15.5px; color: var(--ink); margin-bottom: 3px; }
.an-empty-card .aec-desc { font-size: 12.5px; color: var(--ink-dim); line-height: 1.55; max-width: 72ch; }
.an-empty-card .aec-action { margin-left: auto; flex: none; }
@media (max-width: 640px) {
  .an-empty-card { flex-direction: column; align-items: flex-start; }
  .an-empty-card .aec-action { margin-left: 0; }
}
/* Market benchmarks — the research narrative as a prominent "Market read"
   (the analyst-useful part: per-source figures + caveats), and sources as
   clean chips rather than a bullet list buried in muted text. */
/* Market benchmarks: the comparison line under each metric (conservative =
   green, optimistic = amber), research highlights as a skimmable label+line
   list, and sources as quiet link rows. No boxes. */
.an-var-sub.is-good { color: var(--good); }
.an-var-sub.is-warn { color: var(--warn); }
.mkt-hl-h, .mkt-srcs-h { font-family: var(--mono); font-size: 10px; letter-spacing: 0.14em;
  text-transform: uppercase; color: var(--ink-dim); margin: 22px 0 13px; }
.mkt-hl { display: flex; flex-direction: column; gap: 12px; }
.mkt-hl-row { display: flex; gap: 14px; font-size: 13px; line-height: 1.52; }
.mkt-hl-label { font-family: var(--mono); font-size: 11px; letter-spacing: 0.02em; color: var(--mark);
  min-width: 92px; flex: none; padding-top: 1px; }
.mkt-hl-text { color: var(--ink-2); }
.mkt-hl-text strong, .mkt-hl-text b { color: var(--ink); font-weight: 500; }
.mkt-srcs { display: flex; flex-direction: column; gap: 8px; }
.mkt-src-row { display: flex; align-items: center; gap: 9px; font-size: 12px; color: var(--ink-2);
  text-decoration: none; }
.mkt-src-row:hover .mkt-src-name { color: var(--mark); }
.mkt-src-ico { color: var(--ink-dim); font-size: 11px; flex: none; }
.mkt-src-name { overflow: hidden; white-space: nowrap; text-overflow: ellipsis; }
.mkt-src-as { font-family: var(--mono); font-size: 10px; color: var(--ink-faint); margin-left: auto; flex: none; }
.analysis-two-col {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 18px;
}
@media (max-width: 880px) { .analysis-two-col { grid-template-columns: 1fr; } }

/* Workspace load skeleton — a pulse outline of the shell while the deal loads. */
@keyframes wsk-pulse { 0%, 100% { opacity: 0.4; } 50% { opacity: 0.85; } }
.wsk { padding: 8px 0; }
.wsk-bar { background: var(--paper-3); border-radius: 3px; animation: wsk-pulse 1.4s ease-in-out infinite; }
.wsk-cells { display: flex; border-top: 1px solid var(--rule); border-bottom: 1px solid var(--rule); margin: 18px 0 22px; }
.wsk-cell { flex: 1; padding: 16px 22px; border-left: 1px solid var(--rule); }
.wsk-cell:first-child { border-left: 0; padding-left: 0; }
.wsk-lines > .wsk-bar { margin-bottom: 11px; }
@media (prefers-reduced-motion: reduce) { .wsk-bar { animation: none; opacity: 0.6; } }

/* variance band — open stat cells with vertical dividers (modelled on the
   header KPI strip), NOT boxes with a left strip. Tone rides on the value. */
.an-variance {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
  border-top: 1px solid var(--rule);
  border-bottom: 1px solid var(--rule);
  margin: 20px 0 8px;
}
.an-var {
  padding: 15px 24px;
  border-left: 1px solid var(--rule);
}
.an-var:first-child { border-left: 0; padding-left: 0; }
.an-var-k {
  font-family: var(--mono);
  font-size: 10px;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  color: var(--ink-dim);
  margin-bottom: 9px;
}
.an-var-v {
  font-family: var(--serif);
  font-weight: 500;
  font-size: 25px;
  letter-spacing: -0.02em;
  line-height: 1;
  color: var(--ink);
  font-variant-numeric: tabular-nums;
}
.an-var.is-good .an-var-v { color: var(--good); }
.an-var.is-warn .an-var-v { color: var(--warn); }
.an-var.is-bad  .an-var-v { color: var(--bad); }
.an-var-sub { font-family: var(--mono); font-size: 10.5px; letter-spacing: 0.04em; color: var(--ink-dim); margin-top: 8px; }
.an-var-v .an-var-u { font-family: var(--mono); font-size: 13px; color: var(--ink-2); font-variant-numeric: normal; }
/* Provenance trace (Verification) — grouped by source document, aligned rows. */
.prov-list { display: flex; flex-direction: column; gap: 20px; margin-top: 6px; }
.prov-group-h { font-family: var(--mono); font-size: 10px; letter-spacing: 0.1em; text-transform: uppercase;
  color: var(--mark); padding-bottom: 8px; border-bottom: 1px solid var(--rule); margin-bottom: 2px; }
.prov-row { display: flex; align-items: baseline; gap: 16px; padding: 9px 0; font-size: 12.5px;
  border-bottom: 1px solid var(--rule-soft); }
.prov-row:last-child { border-bottom: 0; }
.prov-row.src-link { cursor: pointer; }
.prov-key { flex: 1; color: var(--ink-2); min-width: 0; }
.prov-row.src-link:hover .prov-key { color: var(--ink); }
.prov-val { font-family: var(--mono); font-variant-numeric: tabular-nums; color: var(--ink); width: 84px; text-align: right; flex: none; }
.prov-loc { color: var(--ink-dim); font-size: 11.5px; width: 300px; flex: none; }
.prov-go { font-family: var(--mono); font-size: 11px; color: var(--ink-faint); width: 120px; text-align: right; flex: none; }
.prov-row.src-link:hover .prov-go { color: var(--mark); }
@media (max-width: 820px) { .prov-loc { display: none; } }

/* Engine verification (v3) — leads with the shared .an-variance health row
   (glance), then flat ledger rows + verdict pills for the detail (same language
   as the Document cross-check above it), then two opt-in disclosure drawers. No
   colored-rail cards. */
.v3-health { margin-top: 4px; }               /* lead the section on the glance row */
.an-var-sub.is-bad { color: var(--bad); }
.v3-grp { font-family: var(--mono); font-size: 10px; letter-spacing: 0.1em; text-transform: uppercase;
  color: var(--ink-faint); margin: 16px 0 2px; }
.recon-led-row .v3-eq { flex: 1.5; min-width: 0; text-align: left; font-family: var(--mono);
  font-size: 11px; color: var(--ink-dim); font-variant-numeric: tabular-nums; }
.v3-gate-src { color: var(--ink-2); }
.v3-gate-checks { display: block; margin-top: 3px; font-family: var(--mono); font-size: 11px; color: var(--ink-dim); }
.v3-note { font-family: var(--mono); font-size: 10px; color: var(--ink-faint); }
/* The two deep-detail drawers sit below a hairline, quieter than the sections. */
.v3-drawers { margin-top: 24px; border-top: 1px solid var(--rule); padding-top: 6px; }
.v3-details { margin: 0; border-bottom: 1px solid var(--rule-soft); }
.v3-details:last-child { border-bottom: 0; }
.v3-details > summary { padding: 12px 0; }
.v3-drawer { padding: 2px 0 14px; }
.v3-prov-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(320px, 1fr)); gap: 0 32px; margin: 2px 0 6px; }
.v3-prov-row { display: flex; align-items: baseline; justify-content: space-between; gap: 12px;
  padding: 5px 0; border-bottom: 1px solid var(--rule-soft); font-size: 12px; }
.v3-prov-row .fig { color: var(--ink-2); min-width: 0; }
.v3-ref { font-family: var(--mono); font-size: 10.5px; color: var(--ink-faint); white-space: nowrap; }

/* Data checks — a pass-count lead, then issues (full rows) over a compact,
   boxless passing checklist. */
.chk-summary { font-size: 13px; color: var(--ink-2); margin-bottom: 16px; }
.chk-summary strong { color: var(--ink); font-weight: 500; }
.chk-summary.is-warn .chk-issue { color: var(--warn); }
.chk-summary.is-good { color: var(--good); }
.chk-pass-row { display: flex; flex-wrap: wrap; gap: 9px 22px; margin-top: 4px; }
.chk-pass-item { display: inline-flex; align-items: baseline; gap: 7px; font-size: 12.5px; color: var(--ink-2); }
.chk-pass-ic { color: var(--good); font-size: 11px; flex: none; }
.chk-pass-d { font-family: var(--mono); font-size: 11px; color: var(--ink-dim); }

/* single-number callout */
/* Single-number callout — open block (no box / no strip). The big tone-coloured
   value carries the emphasis; a hairline above sets it off from the prose. */

/* sensitivity callout */
.an-sensitivity {
  background: var(--paper-2);
  border: 1px solid var(--rule);
  border-radius: var(--radius);
  padding: 18px 20px;
  margin-top: 16px;
}
.an-sens-eyebrow { color: var(--mark); margin-bottom: 8px; }

/* pro-forma active-assumptions strip — dot-separated, mono caps. Lives
   between the scenario pills and the chart; without this the spans
   render with no spacing ("Rent growth 3.0%OpEx growth 2.5%..."). */
.analysis-assumptions {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 7px 16px;
  margin: 6px 0 20px;
  font-family: var(--mono);
  font-size: 10.5px;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--ink-2);
}
.analysis-assumptions span { display: inline-flex; align-items: center; }
.analysis-assumptions span:not(:first-child)::before {
  content: "";
  width: 3px; height: 3px;
  border-radius: 50%;
  background: var(--ink-faint);
  margin-right: 16px;
}

/* pro forma: lift the bookend years (Y1 / final) so the trajectory reads */
/* Pro forma: NOI is the output — keep it full-contrast with the YoY move; the
   GPR/vacancy/EGI/OpEx build-up columns recede to muted. */
.tbl-proforma th.soft, .tbl-proforma td.soft { color: var(--ink-faint); }
.tbl-proforma th.noi-col { color: var(--mark); }
.tbl-proforma td.noi-col { color: var(--ink); font-weight: 500;
  border-left: 1px solid var(--rule); padding-left: 16px; }
.tbl-proforma th.noi-col { border-left: 1px solid var(--rule); padding-left: 16px; }
.tbl-proforma .noi-g { font-family: var(--mono); font-size: 10.5px; font-weight: 400; margin-left: 5px; }
.tbl-proforma .noi-g.up { color: var(--good); }
.tbl-proforma .noi-g.down { color: var(--bad); }

/* collapsible detail */

/* scenario selector */
.scenario-bar { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; margin: 4px 0 18px; }
.scenario-pill {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  font-family: var(--mono);
  font-size: 10.5px;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  color: var(--ink-dim);
  background: var(--paper-2);
  border: 1px solid var(--rule-strong);
  border-radius: 999px;
  padding: 7px 14px;
  cursor: pointer;
  transition: color 0.12s, border-color 0.12s, background 0.12s;
}
.scenario-pill:hover { color: var(--ink); border-color: var(--mark); }
.scenario-pill.is-active { color: var(--paper); background: var(--mark); border-color: var(--mark); }
.scenario-pill-dot { width: 7px; height: 7px; border-radius: 50%; background: currentColor; opacity: 0.7; }
.scenario-edit-link { font-family: var(--mono); font-size: 10.5px; letter-spacing: 0.1em; text-transform: uppercase; margin-left: 6px; background: none; border: 0; padding: 0; color: var(--mark); cursor: pointer; }
.scenario-edit-link:hover { text-decoration: underline; }

/* scenario comparison — div grid (head row + value rows), 4 columns */
.scen-compare-block { margin-top: 8px; }
.scen-compare-block-label { font-family: var(--mono); font-size: 10px; letter-spacing: 0.16em; text-transform: uppercase; color: var(--mark); margin-bottom: 6px; }
.scen-compare-block-sub { font-family: var(--sans); font-size: 13px; color: var(--ink-2); margin: 0 0 14px; }
.scen-compare-block-sub strong { color: var(--ink); }
.scen-compare {
  border: 1px solid var(--rule);
  border-radius: var(--radius);
  overflow: hidden;
}
.scen-compare-head,
.scen-compare-row {
  display: grid;
  grid-template-columns: 1.5fr 1fr 1fr 1fr;
  align-items: baseline;
}
.scen-compare-head {
  background: var(--paper-2);
  border-bottom: 1px solid var(--ink-2);
}
.scen-compare-head > div {
  font-family: var(--mono);
  font-size: 10px;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--ink-dim);
  padding: 11px 14px;
  text-align: right;
}
.scen-compare-head > div:first-child { text-align: left; }
.scen-compare-head .is-active { color: var(--mark); }
.scen-compare-row { border-top: 1px solid var(--rule); }
.scen-compare-row:first-of-type { border-top: 0; }
.scen-compare-row > div { padding: 10px 14px; }
.scen-compare-row .label {
  font-family: var(--mono);
  font-size: 10.5px;
  letter-spacing: 0.1em;
  text-transform: uppercase;
  color: var(--ink-dim);
}
.scen-compare-row .v {
  font-family: var(--mono);
  font-size: 13px;
  font-weight: 600;
  color: var(--ink);
  font-variant-numeric: tabular-nums;
  text-align: right;
}
.scen-compare-row .v.dim { color: var(--ink-dim); font-weight: 500; }
.scen-compare-row .v.neg { color: var(--bad); }

/* assumptions panel */
.ap-preview {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(0, 1fr));
  grid-auto-flow: column;
  border: 1px solid var(--rule);
  border-radius: var(--radius);
  background: var(--paper-2);
  overflow: hidden;
  margin-bottom: 16px;
}
@media (max-width: 720px) { .ap-preview { grid-auto-flow: row; grid-template-columns: 1fr 1fr; } }
.ap-cell { padding: 14px 18px; border-right: 1px solid var(--rule); }
.ap-cell:last-child { border-right: 0; }
.ap-cell .k { font-family: var(--mono); font-size: 9.5px; letter-spacing: 0.14em; text-transform: uppercase; color: var(--ink-dim); display: block; margin-bottom: 6px; }
.ap-cell .v { font-family: var(--mono); font-weight: 600; font-size: 19px; color: var(--ink); font-variant-numeric: tabular-nums; }
.ap-cell .v.na { color: var(--ink-faint); }
.asm-actions { display: flex; align-items: center; gap: 10px; margin: 14px 0; }
.save-state { font-family: var(--mono); font-size: 10.5px; letter-spacing: 0.1em; color: var(--good); text-transform: uppercase; }
.sum-assume-wrap { margin-top: 6px; }
.asm-tbl tbody td { padding: 9px 14px; border-bottom: 1px solid var(--rule); }
.asm-label { font-family: var(--sans); font-size: 13px; color: var(--ink); }
.asm-unit { color: var(--ink-dim); font-family: var(--mono); font-size: 10.5px; }
.asm-col-default, .asm-col-extracted { font-family: var(--mono); font-size: 12px; color: var(--ink-dim); font-variant-numeric: tabular-nums; }
.asm-input-cell input {
  width: 110px;
  font-family: var(--mono);
  font-size: 13px;
  text-align: right;
  padding: 6px 10px;
  background: var(--paper);
  border: 1px solid var(--rule-strong);
  border-radius: 2px;
  color: var(--ink);
}
.asm-input-cell input:focus { outline: none; border-color: var(--mark); background: var(--paper-3); }
.asm-note { margin-top: 12px; }

/* debt & capex */
.dc-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(160px, 1fr));
  border: 1px solid var(--rule);
  border-radius: var(--radius);
  background: var(--paper-2);
  overflow: hidden;
  margin-bottom: 16px;
}
.dc-grid > div { padding: 16px 18px; border-right: 1px solid var(--rule); border-bottom: 1px solid var(--rule); }
.dc-grid .k { font-family: var(--mono); font-size: 10px; letter-spacing: 0.14em; text-transform: uppercase; color: var(--ink-dim); display: block; margin-bottom: 6px; }
.dc-grid .v { font-family: var(--mono); font-weight: 600; font-size: 18px; color: var(--ink); font-variant-numeric: tabular-nums; }
.lender-badge {
  display: inline-flex; align-items: center; gap: 6px;
  font-family: var(--mono); font-size: 9.5px; font-weight: 600;
  letter-spacing: 0.12em; text-transform: uppercase;
  padding: 3px 9px; border-radius: 999px;
}
.lender-badge.is-pass { background: var(--good-soft); color: var(--good); border: 1px solid rgba(122,153,102,0.30); }
.lender-badge.is-fail { background: var(--bad-soft); color: var(--bad); border: 1px solid rgba(184,90,60,0.30); }
.lender-badge.is-na   { background: rgba(150,150,160,0.10); color: var(--ink-dim); border: 1px solid var(--rule); }
.lender-meta { font-family: var(--mono); font-size: 10.5px; color: var(--ink-dim); letter-spacing: 0.04em; }

/* Lender view — the credit-desk reframing (verdict banner, credit box, sizing). */
.lender-verdict { display:flex; align-items:center; gap:10px; padding:12px 16px; border-radius:var(--radius);
  border:1px solid var(--rule); border-left-width:3px; margin-bottom:18px; font-family:var(--serif); font-size:16px; color:var(--ink); }
.lender-verdict.is-within { border-left-color:var(--good); background:var(--good-soft); }
.lender-verdict.is-outside { border-left-color:var(--bad); background:var(--bad-soft); }
.lender-verdict.is-stress { border-left-color:var(--warn); background:var(--warn-soft); }
.lender-verdict.is-na { border-left-color:var(--ink-faint); }
.lender-verdict .lv-tag { font-family:var(--mono); font-size:9.5px; font-weight:600; letter-spacing:.12em;
  text-transform:uppercase; padding:3px 9px; border-radius:999px; background:var(--paper-3); color:var(--ink-dim); white-space:nowrap; }
.lender-box { display:grid; grid-template-columns:repeat(3,1fr); gap:12px; margin-bottom:18px; }
.lender-metric { border:1px solid var(--rule); border-radius:var(--radius); padding:13px 15px; background:var(--paper-2); }
.lender-metric .lm-k { font-family:var(--mono); font-size:9.5px; letter-spacing:.12em; text-transform:uppercase; color:var(--ink-dim); margin-bottom:7px; display:flex; justify-content:space-between; align-items:center; }
.lender-metric .lm-v { font-family:var(--serif); font-size:24px; font-weight:500; letter-spacing:-0.015em; color:var(--ink); line-height:1; }
.lender-metric .lm-policy { font-family:var(--mono); font-size:10.5px; color:var(--ink-dim); margin-top:6px; }
.lender-metric.is-fail { border-color:rgba(184,90,60,0.34); }
.lender-sizing { width:100%; max-width:560px; }
.lender-sizing tr.is-binding td { color:var(--ink); font-weight:600; background:var(--mark-soft); }
.lender-sizing tr.is-binding td:first-child::before { content:'▸ '; color:var(--mark); }
.lender-note { font-family:var(--mono); font-size:10.5px; color:var(--ink-dim); letter-spacing:.03em; margin-top:8px; }
@media (max-width: 720px){ .lender-box { grid-template-columns:1fr; } }

/* Collections quality — month-over-month bad-debt trend + signals. */
.coll-stats { display:flex; gap:28px; flex-wrap:wrap; margin:10px 0 22px; }
/* Equal-width columns so the labels and the values below them line up on a
   consistent grid (same convention as the lender metric row), instead of
   ragged content-width columns with uneven gaps. */
.coll-stat { flex:1 1 0; min-width:135px; }
.coll-stat .cs-k { font-family:var(--mono); font-size:10.5px; letter-spacing:.1em; text-transform:uppercase; color:var(--ink-dim); margin-bottom:9px; white-space:nowrap; }
.coll-stat .cs-v { font-family:var(--serif); font-size:24px; font-weight:500; color:var(--ink); line-height:1; white-space:nowrap; }
.coll-chart { margin:24px 0 16px; }
.coll-chart-h { font-family:var(--mono); font-size:10.5px; letter-spacing:.1em; text-transform:uppercase; color:var(--ink-2); margin-bottom:12px; }
.coll-bars { display:flex; align-items:flex-end; gap:4px; height:44px; padding-top:4px; }
.coll-bar { flex:1; display:flex; flex-direction:column; align-items:center; justify-content:flex-end; height:100%; }
.coll-bar i { width:100%; max-width:26px; min-height:2px; border-radius:2px 2px 0 0; background:var(--good); display:block; }
.coll-bar.is-elevated i { background:var(--warn); }
.coll-bar.is-high i { background:var(--bad); }
.coll-bar .cb-m { font-family:var(--mono); font-size:9px; color:var(--ink-dim); margin-top:7px; }
/* Closing note for the collections trend — a hairline + brighter, larger text
   so it reads as the caption for the metrics/chart above, not floating subtext. */
.coll-basis { margin-top:18px; padding-top:13px; border-top:1px solid var(--rule-soft);
  font-size:11.5px; line-height:1.55; color:var(--ink-2); letter-spacing:.02em; }

/* Slice B1 — aging / delinquency reconciliation (rent roll's "current" vs the
   aging report's real delinquency). Sits above the T-12 collections trend. */
.aging-recon { margin:0 0 20px; padding-bottom:18px; border-bottom:1px solid var(--rule); }
.aging-recon .ag-bar { display:flex; width:100%; height:26px; border-radius:5px; overflow:hidden;
  border:1px solid var(--rule); margin:14px 0 22px; background:var(--paper-3); }
.aging-recon .ag-seg { display:flex; align-items:center; justify-content:center; min-width:0; overflow:hidden; }
.aging-recon .ag-seg span { font-family:var(--mono); font-size:9.5px; letter-spacing:.04em; color:#fff; white-space:nowrap;
  padding:0 4px; text-shadow:0 1px 1px rgba(0,0,0,0.25); }
.aging-recon .ag-seg.is-current { background:var(--good); }
.aging-recon .ag-seg.is-due { background:var(--warn); }
.aging-recon .ag-seg.is-late { background:var(--bad); }
.aging-recon .ir-loss { font-size:14.5px; line-height:1.6; color:var(--ink); margin:18px 0 12px; }
.aging-recon .ir-q { font-size:14.5px; line-height:1.6; color:var(--ink-2); margin:12px 0 14px;
  padding:11px 15px; background:var(--paper-2); border:1px solid var(--rule);
  border-left:3px solid var(--mark); border-radius:0 var(--radius) var(--radius) 0; }
.aging-recon .ir-loss b { color:var(--ink); font-weight:600; }
.aging-recon .ir-q b { display:block; margin-bottom:3px; font-family:var(--mono); font-size:9.5px;
  font-weight:600; letter-spacing:.12em; text-transform:uppercase; color:var(--mark); }

/* Analyst read · expectation lens (interpretation layer, Slice 1). Each key line
   is read against its three references — the property's own trailing history, the
   market benchmark, and the OM / sister-document claim — with the deterministically
   computed gap and a signal-confidence bar. Laid BESIDE the canonical numbers;
   re-rates nothing. */
/* Disposition pill — the carry-forward call (Slice 2). */
/* Read cards (Slice 3) — the per-item analyst read in prose. */

/* Deal-story brief on the Summary / IC-prep surface (Slice 4). */
.sum-read { margin:16px 0; padding:16px 18px; border:1px solid var(--rule); border-radius:var(--radius);
  background:var(--paper-2); }
/* De-slabbed deal story: a constrained lead paragraph + aligned finding rows. */
.sum-read .sr-lead { font-size:13.5px; line-height:1.66; color:var(--ink-2); margin:2px 0 14px; max-width:74ch; }
.sum-read .sr-finds { display:flex; flex-direction:column; }
.sum-read .sr-find { display:flex; align-items:baseline; gap:12px; padding:9px 0; border-top:1px solid var(--rule-soft); }
.sum-read .sr-find:first-child { border-top:0; }
.sum-read .sr-disp { font-family:var(--mono); font-size:9px; font-weight:600; letter-spacing:.06em;
  padding:3px 8px; border-radius:var(--radius); white-space:nowrap; flex:none; }
.sum-read .sr-disp.is-aberration { background:rgba(150,150,160,0.12); color:var(--ink-dim); }
.sum-read .sr-disp.is-carry { background:var(--mark-soft); color:var(--mark); }
.sum-read .sr-disp.is-investigate { background:var(--bad-soft); color:var(--bad); }
.sum-read .sr-find .sr-label { flex:1; font-size:13.5px; color:var(--ink); line-height:1.4; }
.sum-read .sr-find .sr-stake { font-family:var(--mono); font-variant-numeric:tabular-nums; font-size:12px; color:var(--bad); white-space:nowrap; }
/* Open-items reference, INLINE at the end of the analyst-read lead — the prose
   names the open items, so the link lives in that sentence (one place, at the
   top) rather than as a second mention. An inline brass pill; red when a
   blocker is open. Only in the .an-read (Analysis) variant. */
.sum-read .sr-lead .ar-oi { display:inline-flex; align-items:center; gap:5px; margin-left:7px;
  padding:2px 10px; vertical-align:baseline; font-family:var(--mono); font-size:11px; letter-spacing:.02em;
  color:var(--mark); background:var(--mark-soft); border:1px solid transparent; border-radius:999px;
  cursor:pointer; transition:border-color .12s ease, background .12s ease; }
.sum-read .sr-lead .ar-oi:hover { border-color:var(--mark-deep); }
.sum-read .sr-lead .ar-oi.is-crit { color:var(--bad); background:var(--bad-soft); }
.sum-read .sr-lead .ar-oi.is-crit:hover { border-color:var(--bad); }
.sum-read .sr-lead .ar-oi .ar-oi-ico { font-size:10px; }
/* Analyst read (Analysis variant) — editorial redesign, aligned with the rest
   of Operations: a prominent lead verdict, clean finding rows with fixed-width
   disposition tags so the labels line up, neutral stake figures (not alarmist
   red), and a contained questions block. */
.sum-read.an-read .sr-lead { font-size:14.5px; line-height:1.62; color:var(--ink); margin:0 0 18px; }
.sum-read.an-read .sr-finds { border-top:1px solid var(--rule); }
.sum-read.an-read .sr-find { gap:14px; padding:11px 2px; align-items:center; border-top:1px solid var(--rule-soft); }
.sum-read.an-read .sr-find:first-child { border-top:0; }
.sum-read.an-read .sr-disp { min-width:80px; text-align:center; }
.sum-read.an-read .sr-find .sr-label { font-size:13.5px; color:var(--ink); }
.sum-read.an-read .sr-find .sr-stake { font-size:12.5px; color:var(--ink-2); }
.sum-read.an-read .sum-read-q { margin-top:18px; padding:14px 16px; background:var(--paper-2);
  border:1px solid var(--rule); border-radius:var(--radius); }
.sum-read.an-read .sum-read-q .iq-h { color:var(--mark); margin-bottom:8px; }
.sum-read.an-read .sum-read-q li { color:var(--ink-2); }
.sum-read .sum-read-q { margin-top:12px; padding-top:10px; border-top:1px solid var(--rule); }
.sum-read .sum-read-q .iq-h { font-family:var(--mono); font-size:9.5px; letter-spacing:.12em; text-transform:uppercase;
  color:var(--ink-dim); margin-bottom:6px; }
.sum-read .sum-read-q ul { margin:0; padding-left:18px; }
.sum-read .sum-read-q li { font-size:12.5px; line-height:1.55; color:var(--ink-2); margin-bottom:4px; }

/* Intent / window-dressing banner (Slice 5). */
.sum-read .sum-read-intent { margin:0 0 10px; padding:9px 12px; border-radius:var(--radius);
  border:1px solid var(--rule); border-left:3px solid var(--warn); background:var(--warn-soft);
  font-size:12.5px; line-height:1.5; color:var(--ink); }
.sum-read .sum-read-intent.sev-warn { border-left-color:var(--bad); background:var(--bad-soft); }
.sum-read .sum-read-intent .lv-tag { font-family:var(--mono); font-size:9px; font-weight:600; letter-spacing:.1em;
  text-transform:uppercase; color:var(--bad); }

/* Slice A — comps positioning write-up (subject vs comp set, comparability + spreads). */
.interp-comps { margin:2px 0 12px; padding:11px 14px; border:1px solid var(--rule); border-left:3px solid var(--mark);
  border-radius:var(--radius); background:var(--paper-2); }
.interp-comps .ic-head { font-family:var(--mono); font-size:10px; font-weight:600; letter-spacing:.1em;
  text-transform:uppercase; color:var(--ink-2); margin-bottom:6px; }
.interp-comps .ic-sub { color:var(--ink-faint); font-weight:400; letter-spacing:.04em; }
.interp-comps .ic-narr { font-size:13px; line-height:1.55; color:var(--ink); margin:0 0 8px; }
.interp-comps .ic-list { display:flex; flex-direction:column; gap:7px; }
.interp-comps .ic-comp { padding:7px 10px; border:1px solid var(--rule); border-radius:var(--radius); background:var(--paper-3); }
.interp-comps .ic-row1 { display:flex; align-items:center; gap:8px; flex-wrap:wrap; margin-bottom:3px; }
.interp-comps .ic-label { font-size:12.5px; font-weight:600; color:var(--ink); }
.interp-comps .ic-kind { font-family:var(--mono); font-size:9.5px; letter-spacing:.06em; text-transform:uppercase;
  color:var(--ink-faint); }
.interp-comps .ic-band { margin-left:auto; font-family:var(--mono); font-size:10px; letter-spacing:.02em;
  padding:2px 8px; border-radius:999px; border:1px solid var(--rule); background:var(--paper-2); color:var(--ink-dim); }
.interp-comps .ic-band.is-good { color:var(--good); background:var(--good-soft); border-color:rgba(122,153,102,0.30); }
.interp-comps .ic-band.is-bad  { color:var(--bad);  background:var(--bad-soft);  border-color:rgba(184,90,60,0.30); }
.interp-comps .ic-pos { font-size:12px; line-height:1.5; color:var(--ink-2); }
.sum-read .sum-read-comps { margin:0 0 10px; padding:9px 12px; border-radius:var(--radius);
  border:1px solid var(--rule); border-left:3px solid var(--mark); background:var(--paper-2);
  font-size:12.5px; line-height:1.5; color:var(--ink); }
.sum-read .sum-read-comps .lv-tag { font-family:var(--mono); font-size:9px; font-weight:600; letter-spacing:.1em;
  text-transform:uppercase; color:var(--ink-dim); }

/* Unit-type legend — floor-plan code → bed/bath mapping with confirm flags. */
.utl-note { font-size:12.5px; color:var(--ink-dim); margin:2px 0 12px; line-height:1.5; }
.utl-code { font-family:var(--mono); font-size:12.5px; color:var(--ink); letter-spacing:.02em; }
.utl-hint { font-family:var(--mono); font-size:10.5px; color:var(--ink-faint); margin-left:8px; }
.cc-tag.cc-trend { background:var(--warn-soft); color:var(--warn); border-color:rgba(200,154,58,0.34); }

/* comps band */
.comp-band-grid { display: flex; flex-direction: column; gap: 18px; margin-bottom: 8px; }
.comp-band { padding: 4px 0; }
.comp-band-label { font-family: var(--mono); font-size: 10.5px; letter-spacing: 0.14em; text-transform: uppercase; color: var(--ink-2); margin-bottom: 10px; display: flex; justify-content: space-between; }
.comp-band-source { color: var(--ink-dim); }
.comp-band-empty { font-family: var(--serif); font-style: italic; color: var(--ink-dim); }
.comp-band-bar { position: relative; }
.comp-band-track { position: relative; height: 8px; background: var(--paper-3); border-radius: 999px; }
.comp-band-range { position: absolute; top: 0; height: 8px; background: var(--mark-soft); border-radius: 999px; }
.comp-band-mean { position: absolute; top: -3px; width: 2px; height: 14px; background: var(--ink-dim); }
.comp-band-subject { position: absolute; top: -5px; width: 3px; height: 18px; background: var(--mark); border-radius: 1px; }
.comp-band-foot { display: flex; justify-content: space-between; margin-top: 10px; font-family: var(--mono); font-size: 10px; letter-spacing: 0.08em; color: var(--ink-dim); }
.comp-band-avg-label .pos, .comp-band-foot .pos { color: var(--good); }
.comp-band-subject-label { color: var(--mark); }
.comp-rows-details { margin-top: 8px; }

/* checks list */
.checks-list { list-style: none; margin: 0 0 8px; padding: 0; }
.checks-list li {
  display: grid;
  grid-template-columns: 14px 1fr;
  column-gap: 12px;
  row-gap: 3px;
  align-items: baseline;
  padding: 12px 0;
  border-bottom: 1px solid var(--rule);
  font-family: var(--sans);
  font-size: 13.5px;
  font-weight: 500;
  color: var(--ink);
}
.checks-list li:last-child { border-bottom: 0; }
.check-dot {
  grid-column: 1; grid-row: 1;
  width: 9px; height: 9px; border-radius: 50%;
  background: var(--ink-faint);
  align-self: center;
}
.check-dot.is-pass { background: var(--good); box-shadow: 0 0 0 3px var(--good-soft); }
.check-dot.is-fail { background: var(--bad);  box-shadow: 0 0 0 3px var(--bad-soft); }
.check-dot.is-na   { background: var(--ink-faint); }
.check-detail {
  grid-column: 2;
  font-family: var(--mono);
  font-size: 10.5px;
  font-weight: 400;
  letter-spacing: 0.02em;
  color: var(--ink-dim);
}
.checks-list-muted li { color: var(--ink-dim); }
.checks-list-muted .check-detail { font-family: var(--serif); font-style: italic; font-size: 12px; letter-spacing: 0; }

/* mini visualizations (inline charts) */
.mini-viz { margin-top: 8px; }
.mini-viz-head { font-family: var(--mono); font-size: 10px; letter-spacing: 0.14em; text-transform: uppercase; color: var(--ink-dim); margin-bottom: 12px; display: flex; justify-content: space-between; align-items: baseline; }
.mini-bars { position: relative; display: flex; align-items: flex-end; gap: 12px; height: 150px; }
.mini-bar-col { flex: 1; display: flex; flex-direction: column; align-items: center; gap: 8px; justify-content: flex-end; height: 100%; }
.mini-bar-track { width: 100%; display: flex; align-items: flex-end; justify-content: center; flex: 1; }
.mini-bar { width: 54%; background: var(--mark); border-radius: 3px 3px 0 0; min-height: 2px; opacity: 0.62; transition: opacity 0.15s; }
.mini-bar.is-peak, .mini-bar-col.is-peak .mini-bar { background: var(--mark); opacity: 1; }
.mini-bar.is-risk { background: var(--bad); opacity: 0.9; }
.mini-bar-val { font-family: var(--mono); font-size: 10.5px; font-weight: 600; color: var(--ink); font-variant-numeric: tabular-nums; min-height: 13px; }
.mini-bar-label { font-family: var(--mono); font-size: 9.5px; letter-spacing: 0.08em; color: var(--ink-dim); text-transform: uppercase; }
/* Peak callout sits in the chart header (right-aligned), matching the
   tenant-mix vacancy note — keeps the cue out of the plotting area. */
.mini-viz-peak-note { font-family: var(--mono); font-size: 9.5px; letter-spacing: 0.1em; text-transform: uppercase; color: var(--mark); background: var(--mark-soft); border-radius: 999px; padding: 2px 9px; white-space: nowrap; }
.mini-stack-bar { display: flex; height: 16px; border-radius: 3px; overflow: hidden; margin: 10px 0 4px; }
.mini-stack-seg { height: 100%; }
.mini-legend { list-style: none; padding: 0; display: flex; flex-direction: column; gap: 8px; margin: 14px 0 0; }
.mini-legend > li, .mini-legend > div { display: flex; align-items: center; gap: 10px; font-family: var(--mono); font-size: 11px; color: var(--ink-2); }
.mini-legend-dot { width: 9px; height: 9px; border-radius: 2px; flex: 0 0 9px; }
.mini-legend-name { color: var(--ink-2); }
.mini-legend-val { margin-left: auto; font-variant-numeric: tabular-nums; color: var(--ink); font-weight: 600; }
.mini-viz-axis { font-family: var(--mono); font-size: 9.5px; color: var(--ink-dim); display: flex; justify-content: space-between; margin-top: 10px; padding-top: 8px; border-top: 1px solid var(--rule-soft); }
.mini-viz-vacancy-note { font-family: var(--mono); font-size: 10px; color: var(--ink-dim); margin-top: 8px; }
.mini-spark, .mini-viz-spark { width: 100%; }
/* NOI trend chart (Pro Forma): open full-width plot under a hairline, no box. */
.mini-viz-spark {
  border-top: 1px solid var(--rule);
  padding: 16px 0 4px;
  margin: 18px 0 6px;
}
.mini-viz-spark .mini-spark { display: block; }
.noi-area { fill: var(--mark-soft); }
.noi-line { fill: none; stroke: var(--mark); stroke-width: 2; }
.noi-marker { fill: var(--mark); }
.noi-endpoint-label { font-family: var(--mono); font-size: 10px; fill: var(--ink-2); }
.mini-viz-spend { margin-top: 12px; }
.mini-viz-spend-head { font-family: var(--mono); font-size: 10px; letter-spacing: 0.12em; text-transform: uppercase; color: var(--ink-dim); margin-bottom: 6px; }
.mini-viz-spend .sep { color: var(--ink-faint); margin: 0 6px; }

/* ===================================================================
   RENT-ROLL DOSSIER (app.js renderRoll — Data → Rent Roll detail)
   =================================================================== */
.rr-header { display: flex; align-items: flex-start; justify-content: space-between; gap: 24px; margin-bottom: 24px; }
.rr-headblock { min-width: 0; flex: 1; }
.rr-eyebrow { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; margin-bottom: 10px; color: var(--mark); }
/* Status line under the headline: source/as-of on the left, verification +
   detected-type chips on the right. */
.rr-statusline { display: flex; align-items: flex-end; justify-content: space-between; gap: 16px; flex-wrap: wrap; margin-top: 10px; }
.rr-statusline .rr-sub { margin-top: 0; }
.rr-chips { display: flex; gap: 7px; flex-shrink: 0; }
.rr-headline {
  font-family: var(--serif);
  font-weight: 400;
  font-style: italic;
  font-size: clamp(28px, 3.4vw, 40px);
  letter-spacing: -0.02em;
  line-height: 1.02;
  color: var(--ink);
  margin: 0;
}
.rr-sub { font-family: var(--mono); font-size: 11.5px; letter-spacing: 0.04em; color: var(--ink-dim); margin-top: 8px; }
.rr-actions { flex-shrink: 0; display: flex; gap: 8px; }
.rr-save-inline { display: flex; gap: 8px; margin-top: 10px; }
.conf-chip {
  font-family: var(--mono);
  font-size: 9px;
  font-weight: 600;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  padding: 2px 8px;
  border-radius: 2px;
  border: 1px solid var(--rule);
}
.conf-chip.is-verified { background: var(--good-soft); color: var(--good); border-color: rgba(122,153,102,0.30); }
.conf-chip.is-notes { background: var(--warn-soft); color: var(--warn); border-color: rgba(200,154,58,0.30); }
.conf-chip.is-low { background: var(--bad-soft); color: var(--bad); border-color: rgba(184,90,60,0.30); }

/* Open metric strip (not a filled box) — same language as the analysis KPI
   strip: top/bottom rule, hairline dividers between cells, flush-left. */
.rr-stamp-row {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  border-top: 1px solid var(--rule);
  border-bottom: 1px solid var(--rule);
  margin-bottom: 28px;
}
@media (max-width: 720px) {
  .rr-stamp-row { grid-template-columns: 1fr 1fr; }
  .rr-stamp-cell:nth-child(odd) { padding-left: 0; border-left: 0; }
}
.rr-stamp-cell { padding: 16px 22px; border-right: 1px solid var(--rule); }
.rr-stamp-cell:first-child { padding-left: 0; }
.rr-stamp-cell:last-child { border-right: 0; }
.rr-stamp-cell .v.good { color: var(--good); }
.rr-stamp-cell .v.bad { color: var(--bad); }
.rr-stamp-cell .v.warn { color: var(--warn); }
.rr-stamp-cell .k { font-family: var(--mono); font-size: 10px; letter-spacing: 0.16em; text-transform: uppercase; color: var(--ink-dim); display: block; margin-bottom: 8px; }
.rr-stamp-cell .v { font-family: var(--serif); font-weight: 500; font-size: 26px; letter-spacing: -0.015em; color: var(--ink); line-height: 1; display: block; }
.rr-stamp-cell .sub { font-family: var(--mono); font-size: 10px; color: var(--ink-dim); margin-top: 8px; display: block; }

/* Analyst market-rent input, shown in the Mark-to-market section when the
   source rent roll carried no market column (market rent is entered as $/SF).
   The input inherits the app's dark input styling; we only constrain its width
   and match its height to the .btn-sm so the row aligns on one baseline. */
.rr-market-input { display: flex; align-items: center; flex-wrap: wrap; gap: 10px; margin-top: 14px; }
.rr-market-input .rr-market-label { font-family: var(--mono); font-size: 11px; letter-spacing: 0.06em; text-transform: uppercase; color: var(--ink-dim); }
.rr-market-input .rr-market-psf { box-sizing: border-box; width: 108px; flex: 0 0 auto; padding: 8px 10px; font-family: var(--mono); font-size: 12.5px; }
.rr-market-input .rr-market-save { flex: 0 0 auto; }
.rr-market-input .rr-market-hint { flex: 1 1 240px; min-width: 200px; font-size: 11px; line-height: 1.4; color: var(--ink-dim); }

.rr-grid-2 { display: grid; grid-template-columns: 1fr 1fr; gap: 36px; }
@media (max-width: 880px) { .rr-grid-2 { grid-template-columns: 1fr; gap: 24px; } }
.rr-section { min-width: 0; }
.rr-unit-tbl.is-editable td { padding-top: 6px; padding-bottom: 6px; }
/* Unit-detail pagination: collapse hides every row past the preview set; the
   toggle below the table reveals them. */
.rr-unit-tbl.is-collapsed tbody tr.rr-unit-extra { display: none; }
.rr-units-toggle {
  display: inline-flex; align-items: center; gap: 6px;
  margin-top: 12px;
  font-family: var(--mono); font-size: 11px; letter-spacing: 0.12em;
  text-transform: uppercase;
  color: var(--mark);
  background: none; border: none; cursor: pointer;
  padding: 6px 2px;
}
.rr-units-toggle::after {
  content: '▾'; font-size: 10px; transition: transform 0.16s ease;
}
.rr-units-toggle[aria-expanded="true"]::after { transform: rotate(180deg); }
.rr-units-toggle:hover { color: var(--mark-deep); }
/* Unit-mix rollup — the at-a-glance "what am I buying / where's the upside"
   summary that leads the collapsed unit-by-unit table. */
.rr-unit-mix { margin: 12px 0 4px; }
/* Major roll sections sit on a consistent rhythm so each reads as its own
   block (not patched onto the one above). 28px matches .dossier-section. */
.rr-section-wide { min-width: 0; margin-top: 28px; }
.rr-units-collapse { margin-top: 6px; }
.rr-units-wrap { margin-top: 4px; }
.rr-units-wrap[hidden] { display: none; }
/* Analysis rent-roll section (curated read, not the Data-tab dump): a viz sits
   under its section title; the data-tab link closes the section. */
.a-rr-viz { margin: 12px 0 6px; }
.a-rr-datalink { margin-top: 22px; }
.rr-cell-input {
  width: 100%;
  font-family: var(--sans);
  font-size: 13px;
  padding: 5px 8px;
  background: transparent;
  border: 1px solid transparent;
  border-radius: 2px;
  color: var(--ink);
}
.rr-cell-input:hover { border-color: var(--rule); background: var(--paper-3); }
.rr-cell-input:focus { outline: none; border-color: var(--mark); background: var(--paper-3); }
.rr-cell-input.is-num { text-align: right; font-family: var(--mono); }
.rr-cell-input.is-saving { opacity: 0.5; }
.rr-cell-status { cursor: pointer; }
.rr-edit-dot { display: inline-block; width: 5px; height: 5px; border-radius: 50%; background: var(--mark); margin-right: 5px; vertical-align: middle; }
.unit-status {
  display: inline-flex; align-items: center;
  font-family: var(--mono); font-size: 9.5px; font-weight: 600;
  letter-spacing: 0.1em; text-transform: uppercase;
  padding: 2px 8px; border-radius: 999px;
}
.unit-status.is-occupied { background: var(--good-soft); color: var(--good); }
.unit-status.is-vacant { background: var(--bad-soft); color: var(--bad); }

.flag-list { list-style: none; margin: 0; padding: 0; }
.flag-list li {
  display: flex; align-items: baseline; gap: 10px;
  padding: 11px 0; border-bottom: 1px solid var(--rule);
  font-size: 13.5px; color: var(--ink-2);
}
.flag-list li:last-child { border-bottom: 0; }
.flag-list li::before { content: ""; width: 7px; height: 7px; border-radius: 50%; background: var(--ink-dim); flex: 0 0 7px; transform: translateY(4px); }
.flag-list li.sev-warn::before { background: var(--warn); }
.flag-list li.sev-fail::before { background: var(--bad); }
.flag-list .kind { margin-left: auto; font-family: var(--mono); font-size: 9.5px; letter-spacing: 0.1em; text-transform: uppercase; color: var(--ink-dim); }

/* ===================================================================
   UPLOAD / JOB PROGRESS
   =================================================================== */
@keyframes progIndet { 0% { margin-left: -35%; } 100% { margin-left: 100%; } }

/* ===================================================================
   PROCESSING TRAY — background, parallel document jobs.
   Fixed, cross-tab: lives outside the panes so navigation and further
   uploads never interrupt a running extraction.
   =================================================================== */
#docjob-tray {
  position: fixed; right: 20px; bottom: 20px; z-index: 1200;
  width: 340px; max-width: calc(100vw - 32px);
  display: flex; flex-direction: column; gap: 10px;
  font-family: var(--sans);
}
@keyframes djtIn { from { opacity: 0; transform: translateY(12px); } to { opacity: 1; transform: none; } }
.djt-head {
  display: flex; align-items: center; gap: 8px; padding-left: 2px;
  font-family: var(--mono); font-size: 10px; letter-spacing: 0.16em;
  text-transform: uppercase; color: var(--ink-dim);
}
.djt-count {
  display: inline-flex; align-items: center; justify-content: center;
  min-width: 18px; height: 18px; padding: 0 5px; border-radius: 999px;
  background: var(--mark-soft); color: var(--mark); font-size: 10px; letter-spacing: 0;
}
.djt-job {
  background: var(--paper-2); border: 1px solid var(--rule);
  border-radius: var(--radius); padding: 14px 16px 13px;
  box-shadow: 0 8px 28px rgba(0,0,0,0.38);
  animation: djtIn 0.32s cubic-bezier(0.2, 0.8, 0.2, 1);
}
.djt-job.is-failed { border-color: rgba(184,90,60,0.5); }
.djt-job-head { display: flex; align-items: center; gap: 8px; }
.djt-kind {
  font-family: var(--mono); font-size: 10px; letter-spacing: 0.12em;
  text-transform: uppercase; color: var(--mark); font-weight: 600;
}
.djt-dismiss {
  margin-left: auto; background: none; border: none; cursor: pointer;
  color: var(--ink-dim); font-size: 13px; line-height: 1; padding: 2px 4px;
}
.djt-dismiss:hover { color: var(--ink); }
.djt-file {
  font-size: 12px; color: var(--ink-2); margin-top: 2px;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.djt-steps {
  display: flex; align-items: flex-start; justify-content: space-between;
  list-style: none; margin: 12px 0 10px; padding: 0; gap: 4px;
}
.djt-step {
  position: relative; flex: 1; display: flex; flex-direction: column;
  align-items: center; gap: 6px; text-align: center;
}
/* Connector line that fills in as steps complete. */
.djt-step::before {
  content: ''; position: absolute; top: 5px; left: -50%; width: 100%; height: 2px;
  background: var(--paper-3); z-index: 0; transition: background 0.3s ease;
}
.djt-step:first-child::before { display: none; }
.djt-step.is-done::before { background: var(--good); }
.djt-step.is-active::before { background: var(--mark); }
.djt-dot {
  position: relative; z-index: 1; width: 11px; height: 11px; box-sizing: border-box;
  border-radius: 999px; background: var(--paper-3); border: 2px solid var(--rule);
  transition: background 0.3s ease, border-color 0.3s ease;
}
.djt-step.is-done .djt-dot { background: var(--good); border-color: var(--good); }
.djt-step.is-active .djt-dot {
  background: var(--mark); border-color: var(--mark);
  animation: djtPulse 1.4s ease-in-out infinite;
}
.djt-step.is-failed .djt-dot { background: var(--bad); border-color: var(--bad); }
@keyframes djtPulse {
  0%, 100% { box-shadow: 0 0 0 3px rgba(184,133,58,0.22); }
  50%      { box-shadow: 0 0 0 6px rgba(184,133,58,0.04); }
}
.djt-step-label {
  font-family: var(--mono); font-size: 8.5px; letter-spacing: 0.03em;
  line-height: 1.25; color: var(--ink-dim); max-width: 66px;
}
.djt-step.is-active .djt-step-label { color: var(--ink); }
.djt-step.is-done .djt-step-label { color: var(--ink-2); }
.djt-bar {
  height: 5px; background: var(--paper-3); border-radius: 999px;
  overflow: hidden; margin: 2px 0 8px;
}
.djt-bar-fill {
  height: 100%; width: 0; border-radius: 999px; background: var(--mark);
  transition: width 0.32s cubic-bezier(0.4, 0, 0.2, 1);
}
.djt-job.is-done .djt-bar-fill { background: var(--good); }
.djt-job.is-failed .djt-bar-fill { background: var(--bad); }
.djt-status { font-size: 11.5px; color: var(--ink-2); font-variant-numeric: tabular-nums; }
.djt-job.is-failed .djt-status { color: var(--bad); }
@media (max-width: 480px) {
  #docjob-tray { right: 8px; left: 8px; bottom: 8px; width: auto; }
}

/* ---- In-place processing card: the SAME job card, scaled up to be the
   primary focus inside the upload area where the file was dropped. ---- */
.proc-card-host .djt-job {
  padding: 40px 44px 34px;
  border-radius: var(--radius);
  background: var(--paper-2);
  box-shadow: 0 1px 0 rgba(255,255,255,0.02) inset;
  animation: none;
}
.proc-card-host .djt-job-head { justify-content: center; }
.proc-card-host .djt-kind { font-size: 11px; letter-spacing: 0.18em; }
.proc-card-host .djt-file {
  font-size: 17px; color: var(--ink); text-align: center;
  margin-top: 6px; font-family: var(--serif); font-style: italic;
  white-space: normal;
}
.proc-card-host .djt-steps {
  max-width: 460px; margin: 26px auto 18px; gap: 6px;
}
.proc-card-host .djt-dot { width: 13px; height: 13px; }
.proc-card-host .djt-step::before { top: 6px; }
.proc-card-host .djt-step-label { font-size: 10px; max-width: 88px; }
.proc-card-host .djt-bar { height: 7px; max-width: 520px; margin: 0 auto 14px; }
.proc-card-host .djt-status {
  font-size: 13px; text-align: center; color: var(--ink-2);
}
.proc-card-host .djc-retry { display: block; margin: 16px auto 0; }
.proc-card-host .djt-job.is-failed { border-color: rgba(184,90,60,0.55); }

@media (prefers-reduced-motion: reduce) {
  .djt-step.is-active .djt-dot { animation: none; }
  .djt-job { animation: none; }
}

/* ===================================================================
   MISC inner-workflow atoms
   =================================================================== */
.link-mark { color: var(--mark); border-bottom: 1px solid currentColor; }
.link-mark:hover { color: var(--mark-deep); }
.sheet-bordered { border: 1px solid var(--rule); }
.empty-state {
  padding: 32px 24px;
  border: 1px dashed var(--rule);
  border-radius: var(--radius);
  background: var(--paper-2);
  font-family: var(--serif);
  font-style: italic;
  color: var(--ink-dim);
}
.data-card-note { font-family: var(--serif); font-style: italic; font-size: 12.5px; color: var(--ink-dim); margin-top: 4px; }
.t12-edited-pill {
  font-family: var(--mono); font-size: 9px; font-weight: 600;
  letter-spacing: 0.1em; text-transform: uppercase;
  background: var(--mark-soft); color: var(--mark);
  padding: 2px 7px; border-radius: 2px;
}
.t12-edit-form .field { margin-bottom: 14px; }
.t12-edit-section { border-top: 1px solid var(--rule); padding-top: 14px; margin-top: 14px; }
.btn-x { background: transparent; border: 0; color: var(--ink-dim); cursor: pointer; font-size: 16px; line-height: 1; padding: 2px 6px; }
.btn-x:hover { color: var(--bad); }

/* custom select (feedback modal etc.) */
.cad-select { position: relative; }
.cad-select-btn {
  width: 100%;
  display: flex; align-items: center; justify-content: space-between;
  font-family: var(--sans); font-size: 14px; color: var(--ink);
  background: var(--paper-2); border: 1px solid var(--rule-strong);
  border-radius: 2px; padding: 10px 14px; cursor: pointer;
}
.cad-select-btn:hover { border-color: var(--mark); }
.cad-select-chev { width: 7px; height: 7px; border-right: 1.5px solid var(--ink-dim); border-bottom: 1.5px solid var(--ink-dim); transform: rotate(45deg); }
.cad-select-list {
  position: absolute; top: calc(100% + 4px); left: 0; right: 0;
  background: var(--paper-2); border: 1px solid var(--rule-strong);
  border-radius: 2px; box-shadow: var(--shadow-2); z-index: 50;
  list-style: none; margin: 0; padding: 4px;
}
.cad-select-list[hidden] { display: none; }
.cad-select-list [role=option] { padding: 9px 12px; border-radius: 2px; cursor: pointer; font-size: 13.5px; color: var(--ink-2); }
.cad-select-list [role=option]:hover, .cad-select-list [role=option].is-selected { background: var(--paper-3); color: var(--ink); }

/* =====================================================================
   DEAL CONTROL CENTER (Data tab) — readiness, next-actions, issues, notes.
   Phase 8 deal workflow layer. Dark-palette consistent with .data-card.
   ===================================================================== */
.deal-control { margin: 0 0 18px; display: block; }

/* Data-tab toolbar: utilities for the tab, right-aligned. Currently hosts the
   Data room entry point (a distinct auto-sort feature, not a deal-input card). */
.data-toolbar { display: flex; justify-content: flex-end; align-items: center; margin-bottom: 12px; }
.dataroom-btn {
  display: inline-flex; align-items: center; gap: 8px;
  font-family: var(--mono); font-size: 10.5px; letter-spacing: 0.1em;
  text-transform: uppercase; color: var(--ink-2);
  background: var(--paper-2); border: 1px solid var(--rule);
  border-radius: 7px; padding: 7px 12px; cursor: pointer;
  transition: border-color 0.14s, color 0.14s;
}
.dataroom-btn:hover { border-color: var(--rule-strong); color: var(--ink); }
.dataroom-btn svg { width: 15px; height: 15px; opacity: 0.75; }
.dataroom-count {
  font-family: var(--mono); font-size: 10px; font-variant-numeric: tabular-nums;
  background: var(--mark-soft); color: var(--mark);
  border-radius: 999px; padding: 1px 7px; letter-spacing: 0;
}
.dataroom-btn.needs .dataroom-count { background: var(--warn-soft); color: var(--warn); }

/* Notes live at the bottom of the Data tab — an attribution record, below the
   intake cards rather than above them. */
.deal-notes { margin-top: 32px; display: block; }
.dctl-skeleton {
  border: 1px dashed var(--rule); border-radius: var(--radius);
  padding: 22px; color: var(--ink-dim); font-family: var(--mono);
  font-size: 12px; letter-spacing: 0.04em;
}

/* Banner ------------------------------------------------------------- */
.dctl-banner {
  background: var(--paper-2); border: 1px solid var(--rule);
  border-radius: var(--radius); padding: 13px 18px;
  display: flex; gap: 20px; flex-wrap: wrap; align-items: center;
}
.dctl-state {
  display: inline-flex; align-items: center; gap: 8px;
  font-family: var(--mono); font-size: 11px; font-weight: 600;
  letter-spacing: 0.14em; text-transform: uppercase; color: var(--ink-2);
  flex: 0 0 auto;
}
.dctl-state-dot { width: 9px; height: 9px; border-radius: 50%; background: var(--ink-dim); }
.dctl-state.good .dctl-state-dot { background: var(--good); }
.dctl-state.good { color: var(--good); }
.dctl-state.warn .dctl-state-dot { background: var(--warn); }
.dctl-state.warn { color: var(--warn); }
.dctl-state.mark .dctl-state-dot { background: var(--mark); }
.dctl-state.mark { color: var(--mark); }
.dctl-state.dim .dctl-state-dot { background: var(--ink-faint); }
.dctl-state.dim { color: var(--ink-dim); }

.dctl-prog { flex: 1 1 280px; display: flex; align-items: center; gap: 12px; min-width: 200px; }
.dctl-prog-bar {
  flex: 1; height: 5px; border-radius: 3px; background: var(--paper-4);
  overflow: hidden; min-width: 90px;
}
.dctl-prog-bar > span { display: block; height: 100%; background: var(--mark); transition: width 0.3s; }
.dctl-prog-meta { font-size: 12px; color: var(--ink-dim); white-space: nowrap; }
.dctl-prog-meta strong { color: var(--ink); font-weight: 600; }
.dctl-prog-sep { margin: 0 7px; color: var(--ink-faint); }

.dctl-banner-meta {
  display: flex; align-items: center; gap: 16px; flex: 0 0 auto;
  font-size: 12px; color: var(--ink-dim);
}
.dctl-updated { color: var(--ink-dim); }
.dctl-ic { font-size: 12px; color: var(--ink-2); }
.dctl-ic.good { color: var(--good); font-weight: 600; }
.dctl-ic.blocked { color: var(--warn); font-weight: 600; }

/* Two-up grid (actions / issues) ------------------------------------- */
.dctl-card {
  background: var(--paper-2); border: 1px solid var(--rule);
  border-radius: var(--radius); padding: 16px 18px;
}
.dctl-card-head {
  display: flex; align-items: center; justify-content: space-between;
  gap: 10px; margin-bottom: 12px;
}
.dctl-card-head h4 {
  margin: 0; font-family: var(--serif); font-size: 16px; color: var(--ink);
}
.dctl-empty { color: var(--ink-dim); font-size: 13px; padding: 6px 0; }

/* Tasks -------------------------------------------------------------- */

/* Issues ------------------------------------------------------------- */
.dctl-link {
  background: none; border: none; padding: 0; cursor: pointer;
  font-family: var(--mono); font-size: 10.5px; letter-spacing: 0.06em;
  text-transform: uppercase; color: var(--mark);
}
.dctl-link:hover { color: var(--mark-deep); text-decoration: underline; }

/* Add rows ----------------------------------------------------------- */
.dctl-addrow { display: flex; gap: 8px; margin-top: 12px; align-items: flex-start; }
.dctl-addrow .input, .dctl-addrow .textarea { flex: 1; }
.dctl-addrow[hidden] { display: none; }

/* Disclosure --------------------------------------------------------- */

/* Notes -------------------------------------------------------------- */
.dctl-notes { margin-top: 0; }
.dctl-ntabs { display: flex; flex-wrap: wrap; gap: 4px; margin-bottom: 12px; }
.dctl-ntab {
  background: var(--paper-3); border: 1px solid var(--rule);
  border-radius: 2px; padding: 5px 11px; cursor: pointer;
  font-family: var(--mono); font-size: 10.5px; letter-spacing: 0.06em;
  text-transform: uppercase; color: var(--ink-dim);
}
.dctl-ntab:hover { color: var(--ink-2); border-color: var(--rule-strong); }
.dctl-ntab.is-active { background: var(--mark-soft); color: var(--mark); border-color: rgba(184,133,58,0.30); }
.dctl-ncount { font-weight: 700; }
.dctl-notelist { list-style: none; margin: 0; padding: 0; }
.dctl-note { padding: 9px 0; border-top: 1px solid var(--rule-soft); }
.dctl-note:first-child { border-top: none; }
.dctl-note.is-resolved .dctl-note-body { color: var(--ink-dim); text-decoration: line-through; }
.dctl-note-body { font-size: 13.5px; color: var(--ink); line-height: 1.55; white-space: pre-wrap; }
.dctl-note-meta {
  font-family: var(--mono); font-size: 10px; letter-spacing: 0.04em;
  color: var(--ink-faint); margin-top: 4px; display: flex; gap: 10px; align-items: center;
}

/* =====================================================================
   ANALYSIS — "what breaks" flags panel + sensitivity matrix (Phase 8 / P2)
   ===================================================================== */

/* Sensitivity ------------------------------------------------------- */
.an-sens-controls { display: flex; flex-direction: column; gap: 10px; margin-bottom: 14px; }
.an-sens-ctl-row { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; }
.an-sens-ctl-k {
  font-family: var(--mono); font-size: 9.5px; letter-spacing: 0.14em;
  text-transform: uppercase; color: var(--ink-dim); min-width: 54px;
}
.an-sens-pills { display: flex; flex-wrap: wrap; gap: 4px; }
.an-sens-pill {
  background: var(--paper-3); border: 1px solid var(--rule); border-radius: 2px;
  padding: 5px 11px; cursor: pointer; font-family: var(--mono);
  font-size: 10.5px; letter-spacing: 0.04em; color: var(--ink-dim);
}
.an-sens-pill:hover { color: var(--ink-2); border-color: var(--rule-strong); }
.an-sens-pill.is-active { background: var(--mark-soft); color: var(--mark); border-color: rgba(184,133,58,0.30); }
.an-sens-grid-meta { font-size: 12.5px; color: var(--ink-dim); margin-bottom: 10px; }
.an-sens-grid-wrap { overflow-x: auto; }
.an-sens-table { border-collapse: collapse; font-family: var(--mono); font-size: 12px; }
.an-sens-table th, .an-sens-table td {
  border: 1px solid var(--rule); padding: 9px 12px; text-align: center; white-space: nowrap;
}
.an-sens-table thead th {
  color: var(--ink-2); background: var(--paper-3); font-weight: 600;
}
.an-sens-rowh { color: var(--ink-2); background: var(--paper-3); font-weight: 600; }
.an-sens-corner { background: var(--paper-2); text-align: left; line-height: 1.4; }
.an-sens-corner > span { display: block; color: var(--ink-2); }
.an-sens-corner .an-sens-xlab { color: var(--ink-dim); font-size: 10px; font-weight: 400; }
.an-sens-table th.is-base-axis, .an-sens-rowh.is-base-axis { color: var(--mark); }
.an-sens-cell { color: var(--ink); }
.an-sens-cell.qna { color: var(--ink-faint); }
.an-sens-cell.q0 { background: rgba(184,90,60,0.22); }
.an-sens-cell.q1 { background: rgba(184,90,60,0.11); }
.an-sens-cell.q2 { background: var(--paper-3); }
.an-sens-cell.q3 { background: rgba(122,153,102,0.13); }
.an-sens-cell.q4 { background: rgba(122,153,102,0.26); }
.an-sens-cell.is-base { outline: 2px solid var(--mark); outline-offset: -2px; font-weight: 700; }

/* Three-lens income legend (Analysis · Income & Expenses) */
.an-lens-legend {
  display: flex; flex-wrap: wrap; gap: 6px 18px; margin-bottom: 12px;
  font-size: 12px; color: var(--ink-dim);
}
.an-lens-legend strong { color: var(--ink-2); font-weight: 600; }
.an-lens-legend span { padding-left: 9px; border-left: 2px solid var(--rule); }
/* Three-lens colour coding — consistent everywhere Actual / In-place / Stabilized
   appear, so the eye tracks one column across the page. Actual = neutral ink,
   In-place = gold (the going-in decision basis), Stabilized = green (the upside). */
.an-lens-legend .lg-actual  { border-left-color: var(--ink-faint); }
.an-lens-legend .lg-inplace { border-left-color: var(--mark); }
.an-lens-legend .lg-stab    { border-left-color: var(--good); }
.tbl-3lens thead th { white-space: nowrap; }
.tbl-3lens thead th.lens-actual  { box-shadow: inset 0 -2px 0 var(--ink-faint); }
.tbl-3lens thead th.lens-inplace { box-shadow: inset 0 -2px 0 var(--mark); color: var(--ink); }
.tbl-3lens thead th.lens-stab    { box-shadow: inset 0 -2px 0 var(--good); }
.tbl-3lens td.lens-inplace { color: var(--ink); }
.tbl-3lens td.lens-stab    { color: var(--good); }
.tbl-3lens tr.total td.lens-inplace { font-weight: 600; }

/* Value-add bridge strip (Analysis income + Summary) — the PE money shot: the
   going-in vs stabilized math, segregated and labeled so the upside is never
   mistaken for the in-place read. */
.va-strip { display: flex; flex-wrap: wrap; gap: 10px; margin: 2px 0 4px; }
.va-chip {
  flex: 1 1 150px; border: 1px solid var(--rule); border-left: 2px solid var(--good);
  border-radius: var(--radius); background: var(--paper-2); padding: 10px 13px;
}
.va-chip .k {
  font-family: var(--mono); font-size: 9.5px; letter-spacing: 0.12em;
  text-transform: uppercase; color: var(--ink-dim); margin-bottom: 5px;
}
.va-chip .v { font-family: var(--serif); font-size: 20px; color: var(--ink); line-height: 1; }
.va-chip .sub { font-family: var(--mono); font-size: 10.5px; color: var(--ink-2); margin-top: 4px; }
.va-chip.is-going-in { border-left-color: var(--mark); }
/* The value-add bridge is its OWN group (going-in -> stabilized story), distinct
   from the margin / composition bars above. Separate it from the bars (top),
   then bind the caption to the boxes it labels (small bottom) so the caption +
   strip read as one unit rather than a trailing line of the composition bar. */
.va-note { font-size: 12px; color: var(--ink-2); margin: 24px 0 9px; }

/* NOI hero "preliminary" badge — shown ONLY when the in-place NOI rests on a
   default (un-extracted) expense ratio rather than the trailing actuals. */

/* =====================================================================
   SUMMARY — decision card, open-items, source attribution (Phase 8 / P3)
   ===================================================================== */
.dec-card {
  border: 1px solid var(--rule); border-radius: var(--radius);
  background: var(--paper-2); padding: 20px 22px; margin: 0 0 20px;
}
/* The decision block is the hero of the memo: one suggested call + headline,
   the case for / against, the metric strip, then a live "where it stands"
   process line. One verdict, one vocabulary. */
.dec-head { display: flex; align-items: flex-start; justify-content: space-between; gap: 16px; margin-bottom: 4px; }
.dec-head-main { min-width: 0; }
.dec-eyebrow {
  font-family: var(--mono); font-size: 9.5px; letter-spacing: 0.14em;
  text-transform: uppercase; color: var(--ink-dim); margin-bottom: 6px;
}
.dec-headline {
  font-family: var(--serif); font-size: 19px; line-height: 1.32;
  color: var(--ink); max-width: 56ch;
}
.dec-pill {
  flex: none; font-family: var(--mono); font-size: 11px; font-weight: 600;
  letter-spacing: 0.12em; text-transform: uppercase; padding: 5px 13px;
  border-radius: var(--radius); background: var(--paper-3); color: var(--ink-2);
  border: 1px solid var(--rule);
}
.dec-pill.is-pursue { background: var(--good-soft); color: var(--good); border-color: rgba(122,153,102,0.3); }
.dec-pill.is-hold   { background: var(--warn-soft); color: var(--warn); border-color: rgba(200,154,58,0.3); }
.dec-pill.is-pass   { background: var(--bad-soft);  color: var(--bad);  border-color: rgba(184,90,60,0.3); }

/* the case for / against */
.dec-why {
  display: grid; grid-template-columns: 1fr 1fr; gap: 18px 30px;
  margin: 16px 0 18px; padding-top: 14px; border-top: 1px solid var(--rule-soft);
}
@media (max-width: 640px) { .dec-why { grid-template-columns: 1fr; } }
.dec-col-k {
  font-family: var(--mono); font-size: 10px; letter-spacing: 0.12em;
  text-transform: uppercase; margin-bottom: 9px;
}
.dec-col.is-for .dec-col-k { color: var(--good); }
.dec-col.is-against .dec-col-k { color: var(--bad); }
.dec-col ul { list-style: none; margin: 0; padding: 0; display: grid; gap: 8px; }
.dec-col li { position: relative; padding-left: 16px; line-height: 1.4; }
.dec-col li::before {
  content: ''; position: absolute; left: 0; top: 6px;
  width: 7px; height: 7px; border-radius: 50%; background: var(--ink-faint);
}
.dec-col li.tone-good::before { background: var(--good); }
.dec-col li.tone-warn::before { background: var(--warn); }
.dec-col li.tone-bad::before  { background: var(--bad); }
.dec-reason { display: block; font-size: 13.5px; color: var(--ink); }
.dec-reason-detail { display: block; font-family: var(--mono); font-size: 11px; color: var(--ink-dim); margin-top: 2px; }
.dec-col-none { font-size: 13px; color: var(--ink-faint); font-style: italic; }

/* Metrics rail — a two-row grid (labels row / values row): one value face
   and size for all seven cells (the header KPI strip's own mono-label /
   serif-value pattern), so there is exactly ONE baseline and ONE uniform
   label-to-value gap. Mixed value sizes can't line up both ways: the old
   rail either ragged the baselines (top-aligned) or ragged the gaps
   (baseline-aligned). space-between spans the rail edge to edge. */
.dec-metrics {
  display: grid; grid-auto-flow: column; grid-template-rows: auto auto;
  justify-content: space-between; align-items: baseline;
  column-gap: 24px; row-gap: 6px;
  border-top: 1px solid var(--rule-soft); border-bottom: 1px solid var(--rule-soft);
  padding: 15px 0; margin: 14px 0 4px;
}
.dec-metric { display: contents; }
.dec-metric .k {
  grid-row: 1; font-family: var(--mono); font-size: 9px; letter-spacing: 0.12em;
  text-transform: uppercase; color: var(--ink-dim);
}
.dec-metric .v {
  grid-row: 2; font-family: var(--serif); font-variant-numeric: tabular-nums;
  font-size: 20px; line-height: 1; color: var(--ink);
}
.dec-metric .v.na { color: var(--ink-faint); }
/* A 7-column grid can't wrap; narrow screens keep the wrapping cells. */
@media (max-width: 720px) {
  .dec-metrics { display: flex; flex-wrap: wrap; gap: 18px 30px; }
  .dec-metric { display: block; }
  .dec-metric .k { margin-bottom: 4px; }
}

/* The leverage read: one quiet line under the metrics rail. (The open-item
   count lives in the Analyst read's .ar-oi pill, not on the decision card.) */
.dec-leverage {
  font-family: var(--mono); font-size: 11px; color: var(--ink-dim);
  margin: 2px 0 10px;
}

/* Stale-memo warning strip above the memo prose. */
.memo-stale {
  font-family: var(--mono); font-size: 11.5px; color: var(--warn);
  background: var(--warn-soft); border: 1px solid rgba(200,154,58,0.3);
  border-radius: 4px; padding: 8px 12px; margin-bottom: 16px;
}
.memo-stale.is-soft { color: var(--ink-dim); background: transparent;
  border-color: var(--rule-soft); }

.memo-sources { margin: 22px 0; }
/* Collapsed Summary open-items: a single count pill that opens the drawer,
   plus a quiet "blocks IC" callout when one actually does. The full list
   lives in the Open items drawer, mirroring the Data tab. */
.srcnote-grid {
  display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
  gap: 16px; margin-top: 10px;
}
.srcnote-col { border-left: 2px solid var(--rule-strong); padding-left: 12px; }
.srcnote-k {
  font-family: var(--mono); font-size: 10px; letter-spacing: 0.1em;
  text-transform: uppercase; color: var(--ink-dim); margin-bottom: 6px;
}
.srcnote-col ul { margin: 0; padding-left: 16px; }
.srcnote-col li { font-size: 13px; color: var(--ink-2); margin: 4px 0; line-height: 1.5; }

/* =====================================================================
   OPEN ITEMS — the single canonical deal-level work surface.
   A sticky trigger + a right-docked panel that owns flags, tasks, and
   diligence questions. Replaces the per-tab management boxes so there is
   exactly one place to manage open work on a deal.
   ===================================================================== */

/* --- sticky trigger (lives at the right of the tab bar) --- */
.oi-trigger {
  align-self: center; margin-left: 14px;
  display: inline-flex; align-items: center; gap: 8px;
  background: var(--paper-2); border: 1px solid var(--rule);
  border-radius: var(--radius); padding: 5px 11px; cursor: pointer;
  color: var(--ink-2); font-family: var(--mono); font-size: 11px;
  letter-spacing: 0.04em; transition: border-color 0.12s, background 0.12s;
  white-space: nowrap;
}
.oi-trigger:hover { border-color: var(--rule-strong); background: var(--paper-3); }
.oi-trigger.has-critical { border-color: rgba(184,90,60,0.45); }
.oi-trigger.is-open { background: var(--paper-3); border-color: var(--rule-strong); }
.oi-trigger-ico { color: var(--ink-dim); font-size: 12px; line-height: 1; }
.oi-trigger.has-critical .oi-trigger-ico { color: var(--bad); }
.oi-trigger.has-open .oi-trigger-ico { color: var(--mark); }
.oi-trigger-counts { display: inline-flex; align-items: center; gap: 8px; }
.oi-trigger-empty { color: var(--ink-dim); }
.oi-cnt { display: inline-flex; align-items: center; gap: 4px; font-weight: 600; }
.oi-cnt::before { content: ""; width: 6px; height: 6px; border-radius: 50%; }
.oi-cnt.bad  { color: var(--bad);  } .oi-cnt.bad::before  { background: var(--bad); }
.oi-cnt.warn { color: var(--warn); } .oi-cnt.warn::before { background: var(--warn); }
.oi-cnt.info { color: var(--info); } .oi-cnt.info::before { background: var(--info); }
.oi-cnt.task { color: var(--ink-2); } .oi-cnt.task::before { background: var(--ink-dim); border-radius: 1px; }
.oi-trigger-block {
  font-family: var(--mono); font-size: 9px; font-weight: 700; letter-spacing: 0.08em;
  text-transform: uppercase; color: var(--bad); background: var(--bad-soft);
  border: 1px solid rgba(184,90,60,0.3); border-radius: 2px; padding: 1px 5px;
}
@media (max-width: 720px) { .oi-trigger-counts .oi-cnt span { display: none; } }

/* --- scrim + panel --- */
.oi-scrim {
  position: fixed; inset: 0; background: rgba(8,7,5,0.5);
  z-index: 120; opacity: 0; transition: opacity 0.18s ease;
}
.oi-scrim.is-open { opacity: 1; }
.oi-panel {
  position: fixed; top: 0; right: 0; bottom: 0; width: 440px; max-width: 92vw;
  background: var(--paper); border-left: 1px solid var(--rule-strong);
  box-shadow: -16px 0 48px rgba(0,0,0,0.4); z-index: 121;
  display: flex; flex-direction: column;
  transform: translateX(100%); transition: transform 0.2s ease;
}
.oi-panel.is-open { transform: translateX(0); }
.oi-head {
  display: flex; align-items: center; justify-content: space-between;
  padding: 16px 20px 14px; border-bottom: 1px solid var(--rule); flex: none;
}
.oi-head-l { display: flex; align-items: baseline; gap: 12px; min-width: 0; }
.oi-head-k {
  font-family: var(--mono); font-size: 11px; font-weight: 600;
  letter-spacing: 0.16em; text-transform: uppercase; color: var(--ink);
}
.oi-state {
  font-family: var(--mono); font-size: 10px; letter-spacing: 0.1em;
  text-transform: uppercase; color: var(--ink-dim);
  display: inline-flex; align-items: center; gap: 6px;
}
.oi-state::before { content: ""; width: 7px; height: 7px; border-radius: 50%; background: var(--ink-faint); }
.oi-state.good::before { background: var(--good); } .oi-state.good { color: var(--good); }
.oi-state.warn::before { background: var(--warn); } .oi-state.warn { color: var(--warn); }
.oi-state.mark::before { background: var(--mark); } .oi-state.mark { color: var(--mark); }
.oi-close {
  flex: none; background: none; border: none; color: var(--ink-dim);
  font-size: 22px; line-height: 1; cursor: pointer; padding: 0 4px;
}
.oi-close:hover { color: var(--ink); }
.oi-body { flex: 1; overflow-y: auto; padding: 6px 0 32px; }

/* --- section scaffolding --- */
.oi-sec { padding: 14px 20px 4px; }
.oi-sec + .oi-sec { border-top: 1px solid var(--rule); }
.oi-sec-head {
  display: flex; align-items: center; justify-content: space-between;
  gap: 10px; margin-bottom: 10px;
}
.oi-sec-title {
  font-family: var(--mono); font-size: 10px; font-weight: 600;
  letter-spacing: 0.14em; text-transform: uppercase; color: var(--ink-2);
  display: inline-flex; align-items: center; gap: 8px;
}
.oi-sec-n {
  font-family: var(--mono); font-size: 10px; color: var(--ink-dim);
  background: var(--paper-3); border: 1px solid var(--rule); border-radius: 2px;
  padding: 0 5px; font-weight: 600;
}
.oi-add {
  background: none; border: none; cursor: pointer; padding: 2px 4px;
  font-family: var(--mono); font-size: 10px; letter-spacing: 0.06em;
  text-transform: uppercase; color: var(--mark);
}
.oi-add:hover { color: var(--mark-deep); }
.oi-empty { color: var(--ink-dim); font-size: 12.5px; padding: 2px 0 8px; }

/* --- flag rows (instant resolve / dismiss, inline optional note) --- */
.oi-list { list-style: none; margin: 0; padding: 0; }
.oi-flag {
  display: flex; gap: 10px; padding: 11px 0;
  border-top: 1px solid var(--rule-soft);
}
.oi-flag:first-child { border-top: none; }
.oi-flag.is-cleared { opacity: 0.55; }
.oi-fdot { flex: none; width: 7px; height: 7px; border-radius: 50%; margin-top: 5px; background: var(--ink-dim); }
.oi-fdot.bad { background: var(--bad); } .oi-fdot.warn { background: var(--warn); } .oi-fdot.info { background: var(--info); }
.oi-fbody { flex: 1; min-width: 0; }
.oi-ftop { display: flex; flex-wrap: wrap; align-items: center; gap: 7px; }
.oi-ftitle { font-size: 13px; color: var(--ink); font-weight: 500; }
.oi-fdetail { font-size: 12px; color: var(--ink-2); margin-top: 3px; line-height: 1.5; }
.oi-tag {
  font-family: var(--mono); font-size: 8.5px; letter-spacing: 0.08em;
  text-transform: uppercase; color: var(--ink-dim);
  border: 1px solid var(--rule); border-radius: 2px; padding: 1px 4px;
}
.oi-tag.block { color: var(--bad); border-color: rgba(184,90,60,0.3); background: var(--bad-soft); }
.oi-facts { display: flex; gap: 12px; margin-top: 7px; align-items: center; flex-wrap: wrap; }
.oi-act {
  background: none; border: none; padding: 0; cursor: pointer;
  font-family: var(--mono); font-size: 10px; letter-spacing: 0.06em;
  text-transform: uppercase; color: var(--ink-dim);
}
.oi-act:hover { color: var(--ink); }
.oi-act.primary { color: var(--mark); }
.oi-act.primary:hover { color: var(--mark-deep); }
.oi-note { font-size: 11.5px; color: var(--ink-dim); font-style: italic; margin-top: 5px; line-height: 1.45; }
.oi-noterow { display: flex; gap: 6px; margin-top: 7px; }
.oi-noterow[hidden] { display: none; }
.oi-noterow input {
  flex: 1; background: var(--paper-2); border: 1px solid var(--rule);
  border-radius: 3px; padding: 5px 8px; color: var(--ink); font-size: 12px;
  font-family: var(--sans);
}
.oi-noterow input:focus { outline: none; border-color: var(--mark); }

/* --- task rows --- */
.oi-task { display: flex; align-items: flex-start; gap: 10px; padding: 9px 0; border-top: 1px solid var(--rule-soft); }
.oi-task:first-child { border-top: none; }
.oi-check {
  flex: none; width: 17px; height: 17px; margin-top: 1px;
  border: 1.5px solid var(--rule-strong); border-radius: 3px;
  background: transparent; color: var(--good); cursor: pointer;
  font-size: 11px; line-height: 1; display: flex; align-items: center; justify-content: center;
  transition: border-color 0.12s, background 0.12s;
}
.oi-check:hover { border-color: var(--mark); }
.oi-task.is-done .oi-check { background: var(--good-soft); border-color: var(--good); }
.oi-tbody { flex: 1; min-width: 0; }
.oi-tlabel { font-size: 13px; color: var(--ink); }
.oi-task.is-done .oi-tlabel { color: var(--ink-dim); text-decoration: line-through; }
.oi-tmeta { font-family: var(--mono); font-size: 9.5px; letter-spacing: 0.04em; color: var(--ink-faint); margin-top: 3px; }
.oi-tx { flex: none; background: none; border: none; color: var(--ink-faint); cursor: pointer; font-size: 15px; line-height: 1; padding: 0 2px; }
.oi-tx:hover { color: var(--bad); }

/* --- diligence questions --- */
.oi-q { padding: 9px 0; border-top: 1px solid var(--rule-soft); }
.oi-q:first-child { border-top: none; }
.oi-qbody { font-size: 12.5px; color: var(--ink-2); line-height: 1.5; }
.oi-q.is-resolved .oi-qbody { color: var(--ink-faint); text-decoration: line-through; }
.oi-qmeta { display: flex; gap: 12px; margin-top: 5px; }

/* --- inline add form (flags/tasks/questions) --- */
.oi-addform { margin-top: 10px; }
.oi-addform[hidden] { display: none; }
.oi-addform input, .oi-addform textarea {
  width: 100%; background: var(--paper-2); border: 1px solid var(--rule);
  border-radius: 3px; padding: 7px 9px; color: var(--ink); font-size: 12.5px;
  font-family: var(--sans); margin-bottom: 7px;
}
.oi-addform input:focus, .oi-addform textarea:focus, .oi-addform select:focus { outline: none; border-color: var(--mark); }
.oi-addform-row { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }
.oi-addform select {
  background: var(--paper-2); border: 1px solid var(--rule); border-radius: 3px;
  padding: 5px 8px; color: var(--ink); font-family: var(--mono); font-size: 11px;
}
.oi-addform label.chk {
  display: inline-flex; align-items: center; gap: 6px;
  font-family: var(--mono); font-size: 10.5px; color: var(--ink-2); cursor: pointer;
}
.oi-addform-acts { display: flex; gap: 8px; margin-left: auto; }

.oi-cleared-toggle {
  cursor: pointer; font-family: var(--mono); font-size: 10px; letter-spacing: 0.08em;
  text-transform: uppercase; color: var(--ink-dim); padding: 8px 0 2px; list-style: none;
}
.oi-cleared-toggle::-webkit-details-marker { display: none; }
.oi-cleared-toggle:hover { color: var(--ink-2); }

/* =====================================================================
   COMPACT IN-TAB REFERENCES — small, read-only pointers into Open items.
   Used on Data / Analysis / Summary instead of duplicated management boxes.
   ===================================================================== */
.oi-ref {
  display: flex; align-items: center; gap: 14px; flex-wrap: wrap;
  background: var(--paper-2); border: 1px solid var(--rule);
  border-left: 3px solid var(--rule-strong); border-radius: var(--radius);
  padding: 11px 16px; margin: 4px 0 22px; cursor: pointer;
  transition: border-color 0.12s, background 0.12s;
}
.oi-ref:hover { background: var(--paper-3); }
.oi-ref.has-critical { border-left-color: var(--bad); }
.oi-ref.all-clear { border-left-color: var(--good); cursor: default; }
.oi-ref-k {
  font-family: var(--mono); font-size: 9.5px; font-weight: 600; letter-spacing: 0.14em;
  text-transform: uppercase; color: var(--ink-dim); flex: none;
}
.oi-ref-chips { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; flex: 1; min-width: 0; }
.oi-ref-lead { font-size: 12.5px; color: var(--ink-2); min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.oi-ref-cta {
  font-family: var(--mono); font-size: 10px; letter-spacing: 0.06em; text-transform: uppercase;
  color: var(--mark); margin-left: auto; flex: none; white-space: nowrap;
}
.oi-ref:hover .oi-ref-cta { color: var(--mark-deep); }

/* Summary open-items: compact read-only checklist (no management chrome). */
button.oi-ref-cta { background: none; border: none; cursor: pointer; margin-left: 0; }
button.oi-ref-cta:hover { color: var(--mark-deep); }

/* =====================================================================
   DATA ROOM (Data tab → Documents) — folder upload + bucketed review (P4)
   ===================================================================== */
.dr-drop {
  border: 1.5px dashed var(--rule-strong); border-radius: var(--radius);
  background: var(--paper-2); padding: 26px 20px; text-align: center;
  transition: border-color 0.14s, background 0.14s;
}
.dr-drop.is-drag { border-color: var(--mark); background: var(--mark-soft); }
.dr-progress { margin-top: 12px; font-size: 12.5px; color: var(--mark); }
.dr-sorting {
  margin-top: 14px; font-family: var(--mono); font-size: 12px; color: var(--ink-dim);
  display: flex; align-items: center; gap: 8px;
}
.dr-sorting::before {
  content: ""; width: 11px; height: 11px; border-radius: 50%;
  border: 2px solid var(--rule); border-top-color: var(--mark);
  animation: dr-spin 0.8s linear infinite;
}
@keyframes dr-spin { to { transform: rotate(360deg); } }
.dr-summary {
  margin-top: 12px; font-size: 12.5px; color: var(--ink-dim);
}
.dr-suggest {
  margin-top: 16px; padding: 12px 14px; border-radius: var(--radius);
  background: var(--paper-3); border: 1px solid var(--rule);
}
.dr-suggest-head {
  font-family: var(--mono); font-size: 11px; letter-spacing: 0.06em;
  text-transform: uppercase; color: var(--ink-2); margin-bottom: 8px;
}
.dr-suggest-row {
  display: flex; align-items: center; gap: 10px; padding: 5px 0;
}
.dr-suggest-name { flex: 1; min-width: 0; font-size: 13.5px; color: var(--ink);
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.dr-suggest-to { font-family: var(--mono); font-size: 11px; color: var(--ink-dim); }
.dr-suggest-row .dr-route-cat { max-width: 170px; }
.dr-review-banner {
  margin-top: 14px; padding: 10px 14px; border-radius: var(--radius);
  background: var(--warn-soft); border: 1px solid rgba(200,154,58,0.3);
  color: var(--warn); font-size: 13px;
}

.dr-row.is-review { border-left: 2px solid var(--warn); padding-left: 10px; }
.dr-pill {
  font-family: var(--mono); font-size: 9px; font-weight: 600; letter-spacing: 0.08em;
  text-transform: uppercase; padding: 1px 6px; border-radius: 2px; white-space: nowrap;
}
.dr-pill.review { background: var(--warn-soft); color: var(--warn); border: 1px solid rgba(200,154,58,0.3); }
.dr-row .docs-cat { max-width: 200px; }

/* Return drivers — profit bridge (Analysis · Pro Forma) */
.rd-wrap { margin-top: 22px; border-top: 1px solid var(--rule); padding-top: 16px; }
.rd-head { display: flex; align-items: baseline; justify-content: space-between; gap: 12px; flex-wrap: wrap; margin-bottom: 12px; }
.rd-head h4 { margin: 0; font-family: var(--serif); font-size: 16px; color: var(--ink); }
.rd-sub { font-family: var(--mono); font-size: 10.5px; letter-spacing: 0.04em; color: var(--ink-dim); }
.rd-row { display: grid; grid-template-columns: minmax(160px, 1.4fr) 2fr minmax(120px, auto); gap: 12px; align-items: center; padding: 7px 0; }
.rd-row-l { display: flex; flex-direction: column; gap: 1px; }
.rd-label { font-size: 13.5px; color: var(--ink); }
.rd-hint { font-size: 11px; color: var(--ink-dim); }
.rd-bar-wrap { background: var(--paper-3); border-radius: 2px; height: 10px; overflow: hidden; }
.rd-bar { display: block; height: 100%; }
.rd-bar.pos { background: var(--good); }
.rd-bar.neg { background: var(--bad); }
.rd-val { font-family: var(--mono); font-size: 13px; text-align: right; white-space: nowrap; }
.rd-val.pos { color: var(--good); }
.rd-val.neg { color: var(--bad); }
.rd-pct { color: var(--ink-dim); font-size: 11px; }
.rd-split { margin-top: 10px; }
.rd-takeaway { margin-top: 8px; font-size: 13px; color: var(--ink-2); font-style: italic; }
@media (max-width: 720px) { .rd-row { grid-template-columns: 1fr auto; } .rd-bar-wrap { display: none; } }

/* ===== Lease abstracts (Data + Analysis) ===================================
   Render-only styling for the canonical lease block (engine.leases). No layout
   logic lives here — visibility/columns are decided by the engine + the
   dynamic-row rules in project.html. */
.lease-intel { margin-top: 22px; border-top: 1px solid var(--rule); padding-top: 20px; }
.lease-intel-head h3 { font-family: var(--serif); font-weight: 500; font-size: 17px; margin: 0 0 12px; letter-spacing: -0.01em; }
.lease-extract-row { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; margin-bottom: 16px; }
.lease-extract-note { font-family: var(--mono); font-size: 11px; letter-spacing: 0.04em; color: var(--ink-dim); }
/* Eyebrows + sub-section labels match the app's editorial eyebrow (mono, wide
   tracking, uppercase) rather than a bespoke style. */
.lease-derived-eyebrow, .lease-summary-eyebrow {
  font-family: var(--mono); font-size: 10px; font-weight: 500;
  letter-spacing: 0.16em; text-transform: uppercase;
  color: var(--ink-dim); margin: 2px 0 14px;
}
.lease-subhead {
  font-family: var(--mono); font-size: 10px; font-weight: 500;
  letter-spacing: 0.16em; text-transform: uppercase; color: var(--ink-dim);
  margin: 22px 0 10px; padding-top: 14px; border-top: 1px solid var(--rule);
}

/* Provenance dots on merged unit cells. */

/* Lease risk list. */
.lease-risk-list { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 8px; }
.lease-risk { display: flex; gap: 11px; align-items: flex-start; padding: 11px 14px; border: 1px solid var(--rule); border-radius: var(--radius); background: var(--paper-2); }
.lease-risk .lr-sev {
  flex: 0 0 auto; font-family: var(--mono); font-size: 9px; letter-spacing: 0.12em; text-transform: uppercase;
  font-weight: 500; padding: 3px 8px; border-radius: 4px; margin-top: 1px;
}
.lr-sev.bad  { background: rgba(180,60,60,0.12); color: var(--bad, #b43c3c); }
.lr-sev.warn { background: rgba(201,138,58,0.14); color: var(--warn, #c98a3a); }
.lr-sev.info { background: var(--paper-4); color: var(--ink-faint); }
.lease-risk.bad  { border-left: 3px solid var(--bad, #b43c3c); }
.lease-risk.warn { border-left: 3px solid var(--warn, #c98a3a); }
.lr-body { font-size: 13px; line-height: 1.45; }
.lr-detail { font-size: 12px; color: var(--ink-dim); margin-top: 3px; }

.lease-conflict-callout {
  border: 1px solid var(--rule); border-left: 3px solid var(--warn, #c98a3a);
  border-radius: var(--radius); padding: 12px 16px; margin: 4px 0 16px;
  background: var(--paper-2); font-size: 12.5px;
}
.lease-conflict-callout > strong {
  font-family: var(--mono); font-size: 10px; font-weight: 500; letter-spacing: 0.12em;
  text-transform: uppercase; color: var(--warn, #c98a3a); display: block; margin-bottom: 6px;
}
.lease-conflict-callout ul { margin: 0; padding-left: 18px; color: var(--ink-dim); }
.lease-conflict-callout em { color: var(--ink-2); font-style: normal; font-weight: 600; }

.lease-warnings {
  border: 1px dashed var(--rule-strong); border-radius: var(--radius); padding: 12px 16px;
  margin: 4px 0 12px; font-size: 12px; color: var(--ink-dim);
}
.lease-warnings > strong {
  font-family: var(--mono); font-size: 10px; font-weight: 500; letter-spacing: 0.12em;
  text-transform: uppercase; color: var(--ink-2); display: block; margin-bottom: 6px;
}
.lease-warnings ul { margin: 6px 0 0; padding-left: 18px; }

.tbl-editorial tr.is-soon td { background: rgba(201,138,58,0.08); }

/* ===== Lease KPI strip + risk summary + viz (Analysis) ====================
   Matches the deal "glance" tiles: mono uppercase label, serif value. */
.lease-kpi-strip {
  display: grid; grid-template-columns: repeat(6, 1fr);
  border: 1px solid var(--rule); border-radius: var(--radius);
  background: var(--paper-2); overflow: hidden; margin: 4px 0 20px;
}
@media (max-width: 900px) { .lease-kpi-strip { grid-template-columns: repeat(3, 1fr); } }
@media (max-width: 520px) { .lease-kpi-strip { grid-template-columns: repeat(2, 1fr); } }
.lease-kpi {
  padding: 16px 18px; border-right: 1px solid var(--rule); border-bottom: 1px solid var(--rule);
  display: flex; flex-direction: column; gap: 7px; min-width: 0;
}
.lease-kpi .lk-k {
  font-family: var(--mono); font-size: 10px; letter-spacing: 0.16em;
  text-transform: uppercase; color: var(--ink-dim);
}
.lease-kpi .lk-v {
  font-family: var(--serif); font-weight: 500; font-size: 24px; letter-spacing: -0.015em;
  color: var(--ink); line-height: 1; font-variant-numeric: tabular-nums;
}
/* Text-heavy values (e.g. guaranty mix) shrink so they don't blow up the row. */
.lease-kpi.is-text .lk-v {
  font-family: var(--mono); font-size: 12px; letter-spacing: 0.02em; line-height: 1.35;
}
.lease-kpi .lk-sub {
  font-family: var(--mono); font-size: 10px; letter-spacing: 0.04em; color: var(--ink-dim);
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}

.lease-risk-summary { display: flex; gap: 8px; margin-bottom: 12px; }
.lrs-chip { font-family: var(--mono); font-size: 10px; letter-spacing: 0.08em; text-transform: uppercase; padding: 4px 10px; border-radius: 12px; }
.lrs-chip.bad  { background: rgba(180,60,60,0.14); color: var(--bad, #b43c3c); }
.lrs-chip.warn { background: rgba(201,138,58,0.16); color: var(--warn, #c98a3a); }
.lrs-chip.info { background: var(--paper-4); color: var(--ink-dim); }
.lr-count { font-family: var(--mono); font-size: 10px; color: var(--ink-faint); margin-left: 6px; }
.lr-suites { display: inline-flex; flex-wrap: wrap; gap: 4px; margin-left: 8px; vertical-align: middle; }
.lr-chip { font-family: var(--mono); font-size: 9.5px; letter-spacing: 0.02em; padding: 1px 6px; border: 1px solid var(--rule); border-radius: 10px; color: var(--ink-dim); }

.lease-two-col { display: grid; grid-template-columns: 1fr 1fr; gap: 24px; margin: 6px 0; }
@media (max-width: 720px) { .lease-two-col { grid-template-columns: 1fr; } }

/* Canonical lease-status pills — one tone vocabulary shared by the Analysis
   status strip and the Data-tab cards. */
.lease-status-strip { display: flex; flex-wrap: wrap; gap: 8px; margin: 4px 0 14px; }
.lease-status-pill {
  font-family: var(--mono); font-size: 10px; letter-spacing: 0.06em; text-transform: uppercase;
  padding: 4px 10px; border-radius: 12px; border: 1px solid var(--rule);
  color: var(--ink-dim); white-space: nowrap;
}
.lease-status-pill b { font-weight: 700; color: var(--ink-2); }
.lease-status-pill.tone-good { background: rgba(74,143,94,0.12); border-color: rgba(74,143,94,0.3); color: var(--good, #4a8f5e); }
.lease-status-pill.tone-good b { color: var(--good, #4a8f5e); }
.lease-status-pill.tone-warn { background: rgba(201,138,58,0.14); border-color: rgba(201,138,58,0.32); color: var(--warn, #c98a3a); }
.lease-status-pill.tone-warn b { color: var(--warn, #c98a3a); }
.lease-status-pill.tone-bad  { background: rgba(180,60,60,0.14); border-color: rgba(180,60,60,0.34); color: var(--bad, #b43c3c); }
.lease-status-pill.tone-bad b { color: var(--bad, #b43c3c); }
.lease-status-pill.tone-mid  { background: var(--paper-4); }
.lc-status { display: inline-flex; align-items: center; margin-left: 8px; }

/* Critical-date urgency cues + footer. */
.tbl-editorial tr.urg-overdue td { background: rgba(180,60,60,0.07); }
.tbl-editorial tr.urg-urgent td  { background: rgba(201,138,58,0.08); }
.cd-overdue { font-family: var(--mono); font-size: 10px; text-transform: uppercase; letter-spacing: 0.06em; color: var(--bad, #b43c3c); }
.cd-foot { font-family: var(--mono); font-size: 10px; letter-spacing: 0.04em; color: var(--ink-faint); margin-top: 6px; }

/* Rollover stacking bar */
.rollover-chart { display: flex; align-items: flex-end; gap: 8px; height: 150px; padding-top: 16px; }
.rollbar { flex: 1; display: flex; flex-direction: column; align-items: center; justify-content: flex-end; height: 100%; position: relative; }
.rollbar-fill { width: 60%; max-width: 34px; background: var(--mark); border-radius: 3px 3px 0 0; min-height: 2px; transition: height 0.3s; }
.rollbar-val { font-size: 10px; color: var(--ink-2); margin-bottom: 3px; font-variant-numeric: tabular-nums; }
.rollbar-yr { font-size: 10px; color: var(--ink-faint); margin-top: 5px; }

/* Concentration bars */
.conc-chart { display: flex; flex-direction: column; gap: 6px; padding-top: 16px; }
.conc-row { display: grid; grid-template-columns: 130px 1fr 46px; align-items: center; gap: 8px; font-size: 12px; }
.conc-name { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; color: var(--ink-2); }
.conc-suite { font-family: var(--mono); color: var(--ink-faint); font-size: 10px; }
.conc-bar { height: 10px; background: var(--paper-4); border-radius: 5px; overflow: hidden; }
.conc-bar > span { display: block; height: 100%; background: var(--mark); border-radius: 5px; }
.conc-row.is-heavy .conc-bar > span { background: var(--warn, #c98a3a); }
.conc-pct { font-family: var(--mono); text-align: right; font-variant-numeric: tabular-nums; color: var(--ink-2); }
.rollbar-val, .rollbar-yr { font-family: var(--mono); }

/* Guaranty / lease-type chips */
.lease-chip { font-family: var(--mono); font-size: 10px; letter-spacing: 0.02em; padding: 2px 7px; border-radius: 4px; white-space: nowrap; }
.lease-chip.g-good  { background: rgba(74,143,94,0.16);  color: var(--good, #4a8f5e); }
.lease-chip.g-mid   { background: var(--paper-4); color: var(--ink-2); }
.lease-chip.g-weak  { background: rgba(201,138,58,0.16); color: var(--warn, #c98a3a); }
.lease-chip.g-bad   { background: rgba(180,60,60,0.14);  color: var(--bad, #b43c3c); }
.lease-chip.t-nnn   { background: rgba(74,143,94,0.12);  color: var(--good, #4a8f5e); }
.lease-chip.t-mg    { background: var(--paper-4); color: var(--ink-2); }
.lease-chip.t-gross { background: rgba(201,138,58,0.12); color: var(--warn, #c98a3a); }

/* ===== Per-tenant lease cards (Data tab) ================================== */
.lease-cards { display: flex; flex-direction: column; gap: 8px; margin-top: 6px; }
.lease-card { border: 1px solid var(--rule); border-radius: var(--radius); overflow: hidden; background: var(--paper-2); }
.lease-card[open] { border-color: var(--rule-strong); }
.lease-card-head {
  display: flex; align-items: center; gap: 12px; padding: 12px 16px; cursor: pointer;
  list-style: none; flex-wrap: wrap;
}
.lease-card-head::-webkit-details-marker { display: none; }
.lease-card-head::before {
  content: '▸'; color: var(--ink-faint); font-size: 11px; transition: transform 0.15s;
}
.lease-card[open] .lease-card-head::before { transform: rotate(90deg); }
.lc-suite { font-family: var(--mono); font-size: 11px; letter-spacing: 0.04em; color: var(--ink-dim); min-width: 60px; }
.lc-tenant { font-family: var(--serif); font-weight: 500; font-size: 16px; letter-spacing: -0.01em; color: var(--ink); }
.lc-chips { display: inline-flex; gap: 5px; }
.lc-metas { margin-left: auto; display: inline-flex; gap: 14px; flex-wrap: wrap; }
.lc-meta { font-family: var(--mono); font-size: 11px; letter-spacing: 0.02em; color: var(--ink-dim); font-variant-numeric: tabular-nums; }
.lease-card-body {
  padding: 4px 14px 14px; border-top: 1px solid var(--rule);
  display: grid; grid-template-columns: repeat(auto-fit, minmax(230px, 1fr)); gap: 14px 28px;
}
.lease-fg-h {
  font-family: var(--mono); font-size: 10px; letter-spacing: 0.16em; text-transform: uppercase;
  color: var(--ink-dim); margin: 12px 0 7px; border-bottom: 1px solid var(--rule); padding-bottom: 5px;
}
.lease-kvs { margin: 0; }
.lkv { display: grid; grid-template-columns: 42% 58%; gap: 8px; padding: 3px 0; font-size: 12.5px; }
.lkv dt { font-family: var(--mono); font-size: 11px; letter-spacing: 0.02em; color: var(--ink-faint); }
.lkv dd { margin: 0; color: var(--ink-2); }

/* Summary open-items: severity grouping + collapsible info tier */
.oi-tag.cat {
  text-transform: capitalize; color: var(--ink-faint); border-color: var(--rule);
  background: transparent;
}

/* ============================================================
   Analysis v3 (engine-v3 rebuild) — a3-* component set
   ============================================================ */
.a3-empty { color: var(--ink-faint); font-style: italic; padding: 10px 0; }
.a3-dim { color: var(--ink-faint); font-weight: 400; }
.a3-fine { color: var(--ink-faint); font-size: 12px; margin: 8px 0 0; }
.a3-sub { font-family: var(--mono); font-size: 11px; letter-spacing: .08em;
  text-transform: uppercase; color: var(--ink-faint); margin: 14px 0 8px; }
.a3-mono { font-family: var(--mono); font-size: 11.5px; }
.a3-tag { font-family: var(--mono); font-size: 10px; letter-spacing: .08em;
  text-transform: uppercase; color: var(--ink-faint); border: 1px solid var(--rule);
  border-radius: var(--radius); padding: 2px 6px; margin-left: 8px; }

/* Basis bridge — the four-way NOI orientation band */
.a3-bridge { display: flex; align-items: stretch; gap: 0; flex-wrap: wrap; }
.a3-bridge-step { background: var(--paper-2); border: 1px solid var(--rule);
  border-radius: var(--radius); padding: 12px 16px; min-width: 150px; flex: 1; }
.a3-bridge-basis { font-family: var(--mono); font-size: 10.5px; letter-spacing: .08em;
  text-transform: uppercase; color: var(--ink-faint); }
.a3-bridge-noi { font-family: var(--serif); font-size: 24px; margin-top: 4px; }
.a3-bridge-sub { font-size: 11.5px; color: var(--ink-faint); margin-top: 2px; }
.a3-bridge-link { display: flex; align-items: center; padding: 0 10px; }
.a3-bridge-delta { font-family: var(--mono); font-size: 12px; }
.a3-bridge-delta.tone-up { color: var(--good, #7fae7a); }
.a3-bridge-delta.tone-down { color: var(--bad, #c66); }
.a3-bridge-delta.tone-flat { color: var(--ink-faint); }

/* KV cells (returns lead, aggregate strips) */
.a3-returns-lead, .a3-agg-strip { display: grid;
  grid-template-columns: repeat(auto-fit, minmax(140px, 1fr)); gap: 1px;
  background: var(--rule); border: 1px solid var(--rule); border-radius: var(--radius);
  overflow: hidden; margin: 6px 0 12px; }
.a3-kv { background: var(--paper-2); padding: 10px 14px; }
.a3-kv-label { font-family: var(--mono); font-size: 10.5px; letter-spacing: .08em;
  text-transform: uppercase; color: var(--ink-faint); }
.a3-kv-value { font-family: var(--serif); font-size: 21px; margin-top: 3px; }
.a3-kv-sub { font-size: 11.5px; color: var(--ink-faint); margin-top: 2px; }

/* Statement + rosters + CF tables */
.a3-stmt, .a3-roster, .a3-cf, .a3-ties { width: 100%; border-collapse: collapse; font-size: 13px; }
.a3-stmt th, .a3-roster th, .a3-cf th, .a3-ties th { font-family: var(--mono);
  font-size: 10.5px; letter-spacing: .07em; text-transform: uppercase;
  color: var(--ink-faint); text-align: left; padding: 6px 10px;
  border-bottom: 1px solid var(--rule); }
.a3-stmt td, .a3-roster td, .a3-cf td, .a3-ties td { padding: 6px 10px;
  border-bottom: 1px solid var(--rule); }
.a3-stmt .num, .a3-roster .num, .a3-cf .num, .a3-ties .num { text-align: right;
  font-variant-numeric: tabular-nums; }
.a3-stmt .a3-group td { font-family: var(--mono); font-size: 10.5px;
  letter-spacing: .08em; text-transform: uppercase; color: var(--mark);
  padding-top: 14px; border-bottom: none; }
.a3-stmt .a3-total td { border-top: 1px solid var(--rule-strong, var(--rule));
  border-bottom: none; }
.a3-stmt-legend { display: flex; gap: 18px; font-size: 12px; color: var(--ink-faint);
  margin-bottom: 8px; flex-wrap: wrap; }
.a3-has-detail { cursor: pointer; text-decoration: underline dotted; text-underline-offset: 3px; }
.a3-detail td { background: var(--paper-2); }
.a3-detail-row { display: flex; gap: 12px; justify-content: space-between;
  padding: 3px 6px; font-size: 12.5px; }
.a3-note-dot { display: inline-block; width: 5px; height: 5px; border-radius: 50%;
  background: var(--mark); vertical-align: super; }
.a3-vacant td { color: var(--ink-faint); font-style: italic; }

/* Flags */
.a3-flag { border-left: 2px solid var(--rule); padding: 8px 12px; margin: 6px 0;
  background: var(--paper-2); border-radius: 0 var(--radius) var(--radius) 0; }
.a3-flag b { display: block; font-size: 13px; }
.a3-flag span { font-size: 12px; color: var(--ink-faint); }
.a3-flag.tone-bad { border-left-color: var(--bad, #c66); }
.a3-flag.tone-warn { border-left-color: var(--mark); }
.a3-flag.tone-ok { border-left-color: var(--good, #7fae7a); }

/* Pills */
.a3-pills { display: flex; gap: 6px; align-items: center; flex-wrap: wrap; margin: 4px 0 10px; }
.a3-pill { font-family: var(--mono); font-size: 11px; letter-spacing: .06em;
  text-transform: uppercase; background: transparent; color: var(--ink-faint);
  border: 1px solid var(--rule); border-radius: 99px; padding: 4px 12px; cursor: pointer; }
.a3-pill.is-active { color: var(--paper); background: var(--mark); border-color: var(--mark); }
.a3-pill:disabled { opacity: .35; cursor: default; }
.a3-pill-sm { padding: 2px 9px; font-size: 10px; }
.a3-pill-note { font-size: 11px; margin-left: 8px; }

/* Drivers */
.a3-driver { display: grid; grid-template-columns: 240px 1fr 90px; gap: 10px;
  align-items: center; margin: 6px 0; }
.a3-driver-label { font-size: 13px; }
.a3-driver-bar { height: 10px; background: var(--paper-2); border-radius: 99px; overflow: hidden; }
.a3-driver-bar i { display: block; height: 100%; }
.a3-driver-bar i.pos { background: var(--good, #7fae7a); }
.a3-driver-bar i.neg { background: var(--bad, #c66); }
.a3-driver-val { text-align: right; font-variant-numeric: tabular-nums; font-size: 13px; }

/* Rollover event strip */
.a3-rollover { display: flex; flex-direction: column; gap: 6px; margin-top: 6px; }
.a3-roll-year { display: flex; gap: 8px; align-items: flex-start; flex-wrap: wrap; }
.a3-roll-y { font-family: var(--mono); font-size: 11px; color: var(--mark);
  min-width: 32px; padding-top: 5px; }
.a3-roll-ev { background: var(--paper-2); border: 1px solid var(--rule);
  border-radius: var(--radius); padding: 4px 10px; font-size: 12.5px; }
.a3-roll-ev.is-leaseup { border-style: dashed; }

/* Sensitivity */
.a3-sens { border-collapse: collapse; margin-top: 8px; }
.a3-sens th, .a3-sens td { padding: 6px 12px; font-size: 12.5px;
  font-variant-numeric: tabular-nums; border: 1px solid var(--rule); }
.a3-sens td { background: color-mix(in oklab,
  var(--bad, #c66) calc((1 - var(--t)) * 32%), var(--paper-2)); }
.a3-sens td { background: color-mix(in oklab,
  var(--good, #7fae7a) calc(var(--t) * 26%),
  color-mix(in oklab, var(--bad, #c66) calc((1 - var(--t)) * 26%), var(--paper-2))); }
.a3-sens td.is-base { outline: 2px solid var(--mark); outline-offset: -2px; }
.a3-sens-corner { font-size: 10px; }

/* Sources & uses */
.a3-su { display: grid; grid-template-columns: 1fr 1fr; gap: 22px; }
.a3-su-line { display: grid; grid-template-columns: 1fr 56px 120px; gap: 8px;
  padding: 5px 0; border-bottom: 1px solid var(--rule); font-size: 13px; }
.a3-su-line i { color: var(--ink-faint); text-align: right; font-style: normal; }
.a3-su-line b { text-align: right; font-variant-numeric: tabular-nums; }
.a3-su-total { border-bottom: none; border-top: 1px solid var(--rule-strong, var(--rule)); }

/* KV rows (loan panel, invariants, provenance) */
.a3-kvlist { margin: 4px 0; }
.a3-kvrow { display: grid; grid-template-columns: minmax(180px, 1fr) auto minmax(0, 1.2fr);
  gap: 12px; padding: 6px 0; border-bottom: 1px solid var(--rule);
  font-size: 13px; align-items: baseline; }
.a3-kvrow b { text-align: right; font-variant-numeric: tabular-nums; white-space: nowrap; }
.a3-kvrow i { font-style: normal; font-size: 12px; }
.a3-kvrow.is-binding { background: var(--paper-2); }
.a3-kvrow.is-binding em { font-family: var(--mono); font-size: 10px; color: var(--mark);
  text-transform: uppercase; font-style: normal; margin-left: 6px; }
.a3-kvrow.tone-bad b { color: var(--bad, #c66); }
.a3-prov .a3-kvrow { grid-template-columns: minmax(220px, 1.4fr) 90px 1fr; }
.a3-src-extracted { color: var(--good, #7fae7a); }
.a3-src-user { color: var(--mark); }
.a3-src-default { color: var(--ink-faint); }
.a3-src-synthetic { color: var(--bad, #c66); }

/* Badges */
.a3-badge { font-family: var(--mono); font-size: 10px; letter-spacing: .08em;
  padding: 2px 7px; border-radius: 99px; border: 1px solid var(--rule);
  text-transform: uppercase; }
.a3-badge.ok { color: var(--good, #7fae7a); border-color: var(--good, #7fae7a); }
.a3-badge.bad { color: var(--bad, #c66); border-color: var(--bad, #c66); }
.a3-badge.warn { color: var(--mark); border-color: var(--mark); }
.a3-badge.dim { color: var(--ink-faint); }

/* Math-audit popover (registry transcription) */
.a3-audit { position: absolute; z-index: 1200; width: 300px; background: var(--paper-2);
  border: 1px solid var(--rule-strong, var(--rule)); border-radius: var(--radius);
  padding: 12px 14px; box-shadow: 0 8px 30px rgba(0,0,0,.5); }
.a3-audit-title { font-size: 13px; margin-bottom: 4px; }
.a3-audit-title i { color: var(--ink-faint); font-style: normal; font-size: 11px; }
.a3-audit-formula { font-family: var(--mono); font-size: 11.5px; color: var(--mark);
  margin-bottom: 8px; }
.a3-audit-dep { display: flex; justify-content: space-between; font-size: 12px;
  padding: 2px 0; color: var(--ink-faint); }
.a3-audit-dep b { color: var(--ink); font-variant-numeric: tabular-nums; }
.a3-audit-result { border-top: 1px solid var(--rule); margin-top: 4px; padding-top: 5px; }
[data-audit] { cursor: help; }

.a3-details summary { font-family: var(--mono); font-size: 11px; letter-spacing: .07em;
  text-transform: uppercase; color: var(--ink-faint); cursor: pointer; margin: 10px 0 6px; }

@media (max-width: 760px) {
  .a3-su { grid-template-columns: 1fr; }
  .a3-driver { grid-template-columns: 1fr; gap: 4px; }
  .a3-bridge { flex-direction: column; }
  .a3-bridge-link { padding: 4px 0 4px 18px; }
}

/* Data tab: disabled / "Coming soon" cards (e.g. Tenant sales reports) */
.data-card.is-disabled { opacity: .62; cursor: default; }
.data-card.is-disabled:hover { transform: none; border-color: var(--rule); }
.badge.badge-soon { color: var(--ink-faint); border: 1px dashed var(--rule);
  background: transparent; font-family: var(--mono); font-size: 9.5px;
  letter-spacing: .1em; text-transform: uppercase; padding: 2px 8px;
  border-radius: 99px; }

/* ===== Analysis v3 presentation pass (July 2026) ===== */
.a3-sec-sub { font-size: 12.5px; color: var(--ink-dim); margin: 2px 0 16px; max-width: 74ch; line-height: 1.55; }
.a3-delta { font-family: var(--mono); font-size: 10.5px; padding: 1px 6px; border-radius: 999px; white-space: nowrap; }
.a3-delta.tone-up { color: var(--good); background: var(--good-soft); }
.a3-delta.tone-down { color: var(--bad); background: var(--bad-soft); }
.a3-delta.tone-flat { color: var(--ink-faint); }
.a3-eyebrow { font-family: var(--mono); font-size: 10.5px; letter-spacing: .12em; text-transform: uppercase;
  color: var(--ink-dim); margin: 4px 0 8px; }

/* charts */
.a3-chart { width: 100%; max-width: 780px; height: auto; display: block; margin: 6px 0 4px; }
.a3-ch-line { fill: none; stroke: var(--mark); stroke-width: 1.8; }
.a3-ch-area { fill: var(--mark); opacity: .12; }
.a3-ch-dot { fill: var(--paper); stroke: var(--mark); stroke-width: 1.5; }
.a3-ch-xl { font-family: var(--mono); font-size: 10px; fill: var(--ink-faint); }
.a3-ch-al { font-family: var(--mono); font-size: 11px; fill: var(--ink-2); }
.a3-bars { display: flex; gap: 14px; align-items: flex-end; margin: 8px 0 4px; }
.a3-bar { display: flex; flex-direction: column; align-items: center; gap: 4px; min-width: 44px; }
.a3-bar i { display: block; width: 100%; max-width: 64px; background: var(--mark); opacity: .75; border-radius: 2px 2px 0 0; }
.a3-bar.tone-warn i { background: var(--warn); }
.a3-bar.tone-bad i { background: var(--bad); }
.a3-bar-v { font-family: var(--mono); font-size: 10.5px; color: var(--ink-2); }
.a3-bar-l { font-family: var(--mono); font-size: 10px; color: var(--ink-faint); letter-spacing: .04em; }

/* composition / stack bars */
.a3-stack-wrap { margin: 18px 0 4px; }
.a3-stack { display: flex; height: 12px; border-radius: 3px; overflow: hidden; background: var(--paper-2); }
.a3-stack-seg { display: block; height: 100%; }
.a3-stack-seg.s0, .a3-stack-legend i.s0 { background: var(--good); }
.a3-stack-seg.s1, .a3-stack-legend i.s1 { background: var(--mark); }
.a3-stack-seg.s2, .a3-stack-legend i.s2 { background: #a8845c; }
.a3-stack-seg.s3, .a3-stack-legend i.s3 { background: #7d8a6a; }
.a3-stack-seg.s4, .a3-stack-legend i.s4 { background: #9a6a55; }
.a3-stack-seg.s5, .a3-stack-legend i.s5 { background: #6a7d8a; }
.a3-stack-seg.s6, .a3-stack-legend i.s6 { background: #8a6a7d; }
.a3-stack-seg.s7, .a3-stack-legend i.s7 { background: #b09a55; }
.a3-stack-seg.s8, .a3-stack-legend i.s8 { background: #62707a; }
.a3-stack-legend { display: flex; flex-wrap: wrap; gap: 4px 16px; margin-top: 7px; font-size: 11.5px; color: var(--ink-dim); }
.a3-stack-legend span { display: inline-flex; align-items: center; gap: 6px; }
.a3-stack-legend i { width: 9px; height: 9px; border-radius: 2px; display: inline-block; }
.a3-stack-legend i.cs-debt { background: var(--mark); }
.a3-stack-legend i.cs-eq { background: var(--good); }
.a3-capstack { display: flex; height: 14px; border-radius: 3px; overflow: hidden; margin-top: 2px; }
.a3-capstack .a3-cs-debt { background: var(--mark); }
.a3-capstack .a3-cs-eq { background: var(--good); }

/* value-add bridge cards */
.a3-vab { display: grid; grid-template-columns: repeat(auto-fit, minmax(170px, 1fr)); gap: 12px; margin-top: 20px; }
.a3-vab-card { border: 1px solid var(--rule); border-radius: var(--radius); padding: 13px 15px; background: var(--paper-2); }
.a3-vab-k { font-family: var(--mono); font-size: 10px; letter-spacing: .1em; text-transform: uppercase; color: var(--ink-dim); }
.a3-vab-v { font-size: 21px; margin-top: 5px; font-variant-numeric: tabular-nums; color: var(--ink); }
.a3-vab-sub { font-size: 11.5px; color: var(--ink-faint); margin-top: 3px; }

/* statement extras */
.a3-stmt .a3-col-note { font-size: 11.5px; color: var(--ink-dim); max-width: 150px; }
.a3-stmt .a3-col-delta { width: 84px; }
.a3-stmt-missing td { color: var(--warn); font-size: 12.5px; padding: 12px 10px; background: var(--warn-soft); }

/* returns */
.a3-callout { font-size: 12.5px; color: var(--ink-2); background: var(--paper-2); border: 1px solid var(--rule);
  border-radius: var(--radius); padding: 10px 14px; margin: 4px 0 14px; }
.a3-callout-k { font-family: var(--mono); font-size: 10px; letter-spacing: .12em; text-transform: uppercase;
  color: var(--mark); margin-right: 8px; }
.a3-scen th.is-active, .a3-scen td.is-active { background: color-mix(in srgb, var(--mark) 7%, transparent); }
.a3-drawer { border: 1px solid var(--rule); border-radius: var(--radius); background: var(--paper-2); }
.a3-drawer > summary { cursor: pointer; padding: 12px 16px; font-size: 13px; color: var(--ink-2); list-style: none; }
.a3-drawer > summary::before { content: '▸ '; color: var(--mark); }
.a3-drawer[open] > summary::before { content: '▾ '; }
.a3-drawer > summary::-webkit-details-marker { display: none; }
.a3-drawer > div { padding: 4px 16px 16px; }

/* sizing binding row */
.a3-kvrow.is-binding { background: color-mix(in srgb, var(--mark) 8%, transparent); border-radius: 4px; }
.a3-kvrow.is-binding em { font-style: normal; font-family: var(--mono); font-size: 9.5px; letter-spacing: .1em;
  text-transform: uppercase; color: var(--mark); margin-left: 8px; }
