/* Origin MA — stylesheet. MA (Mortgage Automator) genre, lifted from
   design/ma-prototype.html (Marco-approved look). No external assets/fonts.
   Governed by design/design-system.md — the binding PB+OB design doc; new classes
   land there (genre inventory) in the same session they land here. */
:root{
  --topbar:#1b2740; --topbar-ink:#eef2f7; --topbar-line:#2c3a54;
  --accent:#00a99d; --accent-deep:#008e84; --accent-ink:#ffffff; --accent-tint:#e5f6f4;
  --bg:#f4f6f8; --card:#ffffff;
  --ink:#24303e; --ink-soft:#5b6b7b; --ink-faint:#93a1b0;
  --line:#dde3e9; --line-soft:#eaeef2;
  --pos:#1d8a5f; --warn:#d97706; --neg:#b91c1c;
  --radius:6px;
  --shadow-sm:0 1px 2px rgba(27,39,64,.06),0 1px 3px rgba(27,39,64,.05);
  --shadow-md:0 2px 8px rgba(27,39,64,.08),0 8px 24px rgba(27,39,64,.06);
}
*{box-sizing:border-box}
html,body{margin:0;height:100%}
body{
  background:var(--bg); color:var(--ink);
  font:13px/1.5 -apple-system,"Segoe UI",system-ui,Roboto,sans-serif;
  -webkit-font-smoothing:antialiased;
}
.num{font-variant-numeric:tabular-nums}
.r{text-align:right}
.neg{color:var(--ink-faint)}
.muted{color:var(--ink-faint)}
.mb{margin-bottom:14px}
.mt{margin-top:12px}
.ml-auto{margin-left:auto}
a{color:var(--accent-deep);text-decoration:none}
a:hover{text-decoration:underline}
button{font-family:inherit}
[hidden]{display:none !important}
/* Date fields open the calendar on click anywhere in the field (see app.js showPicker handler). */
input[type="date"]{cursor:pointer}
/* Inline per-row save indicator (e.g. Expected Repayment on the Funded list). */
.erd-status{margin-left:6px;font-size:11px;font-weight:700}
.erd-status.ok{color:var(--good,#1a7f4b)}
.erd-status.err{color:var(--neg)}
/* Funded return-type filter row: pref partition (left) · subtle divider · Debt (right). */
.rc-row{display:flex;align-items:center;gap:10px;flex-wrap:wrap}
.rc-divider{width:1px;height:18px;background:var(--line);display:inline-block;margin:0 4px}
/* Combo virtual-merge banner on the loan file header. */
.combo-banner{font-size:12px;color:var(--ink-soft);background:var(--line-soft);border:1px solid var(--line);
  border-radius:6px;padding:6px 10px;margin-bottom:10px}

/* ---------- buttons ---------- */
.btn{
  height:30px;padding:0 13px;border-radius:6px;border:1px solid var(--line);
  background:var(--card);color:var(--ink);font-size:12.5px;font-weight:600;cursor:pointer;
  display:inline-flex;align-items:center;gap:6px;text-decoration:none;
}
.btn:hover{background:var(--line-soft);text-decoration:none}
.btn.primary{background:var(--accent);border-color:var(--accent);color:var(--accent-ink)}
.btn.primary:hover{background:var(--accent-deep)}
.btn.sm{height:26px;padding:0 10px;font-size:12px}
.btn.block{width:100%;justify-content:center;margin-top:6px}
.btn:disabled{opacity:.55;cursor:default}
.linkbtn{border:0;background:none;color:var(--accent-deep);cursor:pointer;font:inherit;font-size:12px;padding:0}
.linkbtn:hover{text-decoration:underline}

/* ---------- top bar ---------- */
.topbar{
  position:fixed;top:0;left:0;right:0;height:48px;z-index:60;
  background:var(--topbar);color:var(--topbar-ink);
  display:flex;align-items:center;gap:18px;padding:0 16px;border-bottom:1px solid var(--topbar-line);
}
.brand{display:flex;align-items:center;gap:10px;min-width:180px}
.dotgrid{display:grid;grid-template-columns:repeat(3,4px);gap:3px}
.dotgrid i{width:4px;height:4px;border-radius:50%;background:var(--accent);display:block}
.dotgrid i:nth-child(2),.dotgrid i:nth-child(6){background:#7fd6cf}
.wordmark{font-size:15px;letter-spacing:.14em;font-weight:700}
.wordmark span{color:var(--accent);font-weight:800}
.search{flex:1;max-width:520px;position:relative}
.search svg{position:absolute;left:9px;top:50%;transform:translateY(-50%);opacity:.55;pointer-events:none}
.search input{width:100%;height:32px;border:0;border-radius:16px;padding:0 12px 0 30px;background:#26344d;color:var(--topbar-ink);font-size:12.5px;outline:none}
.search input::placeholder{color:#8aa0bf}
.search-menu{position:absolute;top:38px;left:0;right:0;background:var(--card);border:1px solid var(--line);border-radius:8px;box-shadow:var(--shadow-md);padding:5px;display:none;max-height:60vh;overflow:auto;z-index:70}
.search-menu.show{display:block}
.search-row{display:flex;align-items:baseline;gap:8px;width:100%;text-align:left;border:0;background:none;cursor:pointer;padding:7px 9px;border-radius:6px;font:inherit;color:var(--ink)}
.search-row:hover{background:var(--line-soft)}
.sr-no{font-weight:700;color:var(--ink-faint);font-variant-numeric:tabular-nums}
.sr-name{font-weight:600}
.sr-sub{margin-left:auto;color:var(--ink-faint);font-size:11.5px}
.search-empty{padding:10px 12px;color:var(--ink-faint);font-size:12.5px}
.topbar-right{margin-left:auto;display:flex;align-items:center;gap:6px;position:relative}
.iconbtn{width:32px;height:32px;border:0;background:transparent;color:var(--topbar-ink);border-radius:6px;display:grid;place-items:center;cursor:pointer;opacity:.85;position:relative}
.iconbtn:hover{background:#26344d;opacity:1}
.iconbtn.dark{color:var(--ink)}
.iconbtn.dark:hover{background:var(--line-soft)}
.badge-dot{position:absolute;top:6px;right:7px;width:6px;height:6px;border-radius:50%;background:var(--accent);border:1px solid var(--topbar)}
.userchip{display:flex;align-items:center;gap:8px;padding:3px 8px 3px 4px;border-radius:16px;cursor:pointer}
.userchip:hover{background:#26344d}
.avatar{width:26px;height:26px;border-radius:50%;background:var(--accent);color:#053c38;display:grid;place-items:center;font-weight:700;font-size:11px}
.userchip .em{font-size:12px;color:#c6d3e6}
.user-menu{position:absolute;top:40px;right:0;background:var(--card);border:1px solid var(--line);border-radius:8px;box-shadow:var(--shadow-md);padding:5px;display:none;z-index:70}
.user-menu.show{display:block}
.menu-item{display:block;width:100%;text-align:left;border:0;background:none;cursor:pointer;padding:7px 14px;border-radius:6px;font:inherit;font-size:12.5px;color:var(--ink);white-space:nowrap}
.menu-item:hover{background:var(--line-soft)}

/* ---------- rail ---------- */
.rail{position:fixed;top:48px;left:0;bottom:0;width:132px;z-index:40;background:var(--card);border-right:1px solid var(--line);padding:8px 0 44px;overflow-y:auto}
/* firm mark pinned bottom-left, constant across the product tabs; sits above
   the rail's scrolling content (rail reserves 44px of bottom padding for it) */
.rail-brand{position:fixed;left:0;bottom:0;width:132px;z-index:41;background:var(--card);border-top:1px solid var(--line-soft);border-right:1px solid var(--line);padding:11px 12px}
.rail-brand img{display:block;height:13px;width:auto;opacity:.42}
.rail-link{display:flex;align-items:center;gap:9px;padding:8px 12px;margin:1px 6px;border-radius:6px;color:var(--ink-soft);font-size:12.5px;font-weight:500;cursor:pointer}
.rail-link svg{flex:none;opacity:.8}
.rail-link:hover{background:var(--line-soft);text-decoration:none;color:var(--ink)}
.rail-link.on{background:var(--accent-tint);color:var(--accent-deep);font-weight:600}
.rail-link.on svg{opacity:1}
.rail .sep{height:1px;background:var(--line-soft);margin:7px 12px}

/* ---------- tab strip ---------- */
.tabstrip{position:fixed;top:48px;left:132px;right:0;height:40px;z-index:30;background:var(--card);border-bottom:1px solid var(--line);display:flex;align-items:stretch;padding:0 6px;overflow-x:auto}
.tab{display:flex;align-items:center;gap:8px;padding:0 12px;height:100%;border-right:1px solid var(--line-soft);color:var(--ink-soft);font-size:12.5px;cursor:pointer;white-space:nowrap;position:relative;max-width:230px}
.tab:hover{background:var(--line-soft)}
.tab.on{color:var(--ink);font-weight:600;box-shadow:inset 0 -2px 0 var(--accent)}
.tab .tab-label{overflow:hidden;text-overflow:ellipsis}
.tab .x{width:16px;height:16px;border-radius:4px;display:grid;place-items:center;opacity:.55;font-size:15px;line-height:1}
.tab .x:hover{background:#00000012;opacity:1}
.tab.home{font-weight:600}

/* ---------- main ---------- */
.main{position:fixed;top:88px;left:132px;right:0;bottom:0;overflow-y:auto}
.pad{padding:18px 22px 80px}
.pad-sm{padding:10px 14px 0}
.pagehead{display:flex;align-items:flex-end;justify-content:space-between;gap:16px;margin-bottom:14px;flex-wrap:wrap}
.pagehead h1{font-size:18px;font-weight:650;margin:0}
.pagehead .sub{color:var(--ink-faint);font-size:12px;margin-top:3px}
.head-actions{display:flex;gap:8px}

/* ---------- kanban ---------- */
/* board pages: .pad-board (on the .pad) fills the panel and hands the kanban BOTH scrollbars,
   so the horizontal bar sits pinned at the bottom of the visible panel instead of below the
   tallest column (where it lived off-screen). Columns taller than the panel scroll inside. */
.pad-board{height:100%;display:flex;flex-direction:column;padding-bottom:14px}
.pad-board .kanban{flex:1;min-height:0;overflow:auto}
.kanban{display:flex;gap:12px;align-items:flex-start;overflow-x:auto;padding-bottom:8px}
.kcol{flex:0 0 264px;background:#eef1f4;border:1px solid var(--line);border-radius:8px;padding:8px}
.kcol-h{padding:4px 6px 8px}
.kcol-h .name{font-size:11px;font-weight:700;letter-spacing:.06em;text-transform:uppercase;color:var(--ink-soft)}
.kcol-h .meta{display:flex;justify-content:space-between;margin-top:4px;font-size:11px;color:var(--ink-faint)}
.kcol-h .count{display:inline-block;min-width:18px;padding:1px 6px;background:var(--card);border:1px solid var(--line);border-radius:10px;text-align:center;font-weight:700;color:var(--ink-soft)}
.kcol-body{min-height:40px;border-radius:6px;transition:background .12s}
.kcol-body.drop-hot{background:var(--accent-tint);outline:2px dashed var(--accent);outline-offset:-2px}
.kcol-empty{color:var(--ink-faint);text-align:center;padding:8px;font-size:12px}
.kcard{background:var(--card);border:1px solid var(--line);border-radius:7px;padding:10px 11px;margin-bottom:8px;cursor:grab;box-shadow:var(--shadow-sm)}
.kcard:hover{border-color:var(--accent);box-shadow:var(--shadow-md)}
.kcard.dragging{opacity:.5}
.kcard .title{font-size:12.5px;font-weight:600;margin-bottom:2px}
.kcard .title b{color:var(--ink-faint);font-weight:600}
.kcard .addr{font-size:11.5px;color:var(--ink-faint);margin-bottom:8px}
.kcard .econ{font-size:12px}
.kcard .econ .rate{color:var(--accent-deep);font-weight:600}
.kcard .econ2{display:flex;justify-content:space-between;align-items:center;margin-top:7px}
.kcard .fac{font-size:11.5px;color:var(--ink-soft)}
.daybadge{font-size:10.5px;font-weight:700;padding:2px 7px;border-radius:10px;background:var(--line-soft);color:var(--ink-soft);white-space:nowrap;text-transform:capitalize}
.daybadge.warn{background:#fde9d6;color:var(--warn)}
.daybadge.hot{background:#f9dede;color:var(--neg)}
.daybadge.repnum{font-variant-numeric:tabular-nums;text-transform:none}
/* Inline-editable report cells (of_dashboard): quiet affordance, no loud fills. */
.repedit-cell{cursor:pointer}
.repedit{border-bottom:1px dotted transparent}
.repedit-cell:hover .repedit{border-bottom-color:var(--ink-faint)}
.repedit-input{font:inherit;font-size:12px;font-variant-numeric:tabular-nums;width:100%;min-width:88px;box-sizing:border-box;height:26px;padding:0 6px;border:1px solid var(--accent);border-radius:5px;background:var(--card);color:var(--ink)}

/* ---------- cards + tables ---------- */
.card{background:var(--card);border:1px solid var(--line);border-radius:8px;box-shadow:var(--shadow-sm);margin-bottom:14px;overflow:hidden}
/* a card that hosts an inline typeahead: its menu must escape the card box (the same reason the
   JE/batch grids skip .tablewrap). Use with an UNWRAPPED table — a .tablewrap inside would clip
   the menu again. */
.card.menus{overflow:visible}
.card-h{padding:11px 14px;border-bottom:1px solid var(--line-soft);display:flex;align-items:center;justify-content:space-between;gap:10px}
.card-h h2{font-size:13px;font-weight:700;margin:0;letter-spacing:.02em}
.subcard-h{border-top:1px solid var(--line-soft)}
.subcard-h h2{font-size:11.5px;color:var(--ink-soft)}
.subhead{padding:9px 14px 4px;font-size:11px;text-transform:uppercase;letter-spacing:.05em;color:var(--ink-faint);font-weight:700}
.tablewrap{overflow-x:auto}
table{width:100%;border-collapse:collapse;font-size:12.5px}
thead th{text-align:left;font-size:11px;font-weight:700;letter-spacing:.03em;text-transform:uppercase;color:var(--ink-faint);padding:8px 12px;border-bottom:1px solid var(--line);position:sticky;top:0;background:var(--card);white-space:nowrap}
tbody td{padding:8px 12px;border-bottom:1px solid var(--line-soft);vertical-align:top}
tbody tr:hover{background:#f8fafb}
tbody tr.archived{opacity:.72;font-style:italic}
tfoot td{padding:9px 12px;font-weight:700;border-top:2px solid var(--line);background:#f8fafb}
.mono-link{color:var(--accent-deep);font-weight:600;cursor:pointer}
.mono-link:hover{text-decoration:underline}

/* ---------- tiles ---------- */
.tiles{display:flex;gap:12px;flex-wrap:wrap;margin-bottom:14px}
.tile{background:var(--card);border:1px solid var(--line);border-radius:8px;padding:12px 15px;min-width:170px;flex:1;box-shadow:var(--shadow-sm)}
.tile .k{font-size:11px;text-transform:uppercase;letter-spacing:.05em;color:var(--ink-faint);font-weight:600}
.tile .v{font-size:20px;font-weight:700;margin-top:5px}
.tile .v.small{font-size:16px}

/* ---------- chips + tags ---------- */
.chips{display:flex;gap:7px;flex-wrap:wrap;align-items:center}
.subnav{margin-bottom:12px}
/* a chip may be a <span> (filter) or a <button> (a link chip that navigates) — font-family:inherit
   keeps the button form identical to the span form */
.chip{font-family:inherit;font-size:11.5px;font-weight:600;padding:3px 10px;border-radius:13px;cursor:pointer;background:var(--card);border:1px solid var(--line);color:var(--ink-soft);display:inline-flex;gap:6px;align-items:center}
.chip:hover{border-color:var(--accent)}
.chip.on{background:var(--accent-tint);border-color:var(--accent);color:var(--accent-deep)}
.chip .n{color:var(--ink-faint);font-weight:700}
.chip.on .n{color:var(--accent-deep)}
.chip.flag{background:#fff}
.chipbar{display:flex;gap:16px;flex-wrap:wrap;margin-bottom:12px}
.chipbar-k{font-size:11px;color:var(--ink-faint);font-weight:600;text-transform:uppercase;margin-bottom:6px}
.tag{font-size:10.5px;font-weight:700;padding:2px 7px;border-radius:4px;text-transform:uppercase;letter-spacing:.03em;background:#f1f3f5;color:var(--ink-soft)}
.tag.pref{background:var(--accent-tint);color:var(--accent-deep)}
.tag.cur{background:#eaf2ff;color:#2563a8}
.tag.debt{background:#f0ecfb;color:#6d51c4}
.tag.ns{background:#f1f3f5;color:var(--ink-soft)}
.pill-status{font-size:11px;font-weight:700;padding:3px 10px;border-radius:12px;background:var(--accent-tint);color:var(--accent-deep)}
.pill-status.warn{background:#fde9d6;color:var(--warn)}

/* ---------- loan file ---------- */
.loanwrap{display:flex;align-items:flex-start;gap:0}
.secnav{position:sticky;top:0;flex:0 0 178px;align-self:flex-start;padding:6px 8px 6px 0}
.secnav a{display:block;padding:6px 10px;border-radius:6px;font-size:12px;color:var(--ink-soft);cursor:pointer;border-left:2px solid transparent;margin-bottom:1px}
.secnav a:hover{background:var(--line-soft);text-decoration:none;color:var(--ink)}
.secnav a.on{background:var(--accent-tint);color:var(--accent-deep);font-weight:600;border-left-color:var(--accent)}
.loanbody{flex:1;min-width:0;padding-left:16px;border-left:1px solid var(--line)}
.loanhead{background:var(--card);border:1px solid var(--line);border-radius:8px;padding:14px 16px;margin-bottom:16px;box-shadow:var(--shadow-sm)}
.loanhead .top{display:flex;align-items:center;gap:12px;flex-wrap:wrap}
.loanhead h1{font-size:17px;font-weight:700;margin:0}
.loanhead .lno{color:var(--ink-faint);font-weight:600}
.loanhead .keyfigs{display:flex;gap:26px;flex-wrap:wrap;margin-top:12px}
.keyfig .k{font-size:10.5px;text-transform:uppercase;letter-spacing:.04em;color:var(--ink-faint);font-weight:600}
.keyfig .v{font-size:13.5px;font-weight:700;margin-top:2px;font-variant-numeric:tabular-nums}
.loanhead .actions{margin-left:auto;display:flex;gap:8px}
.file-flag{max-width:150px}
.section{scroll-margin-top:14px;margin-bottom:18px}
.dl{display:grid;grid-template-columns:repeat(2,1fr)}
.dl .row{display:flex;justify-content:space-between;gap:14px;padding:8px 14px;border-bottom:1px solid var(--line-soft)}
.dl .row .k{color:var(--ink-soft)}
.dl .row .v{font-weight:600;font-variant-numeric:tabular-nums;text-align:right}
.note-line{padding:9px 14px;font-size:11.5px;color:var(--ink-faint);background:#f8fafb}
/* the quiet second line under a table cell's primary value ("also on Sweetzer") */
.subline{font-size:11px;font-weight:400;color:var(--ink-faint);margin-top:2px}
.empty{padding:22px 14px;text-align:center;color:var(--ink-faint);font-size:12.5px}
.empty.err-state{color:var(--neg)}

/* balance header + ledger tools */
.balcards{display:flex;gap:12px;flex-wrap:wrap;padding:14px}
.balcard{flex:1;min-width:150px;border:1px solid var(--line);border-radius:7px;padding:11px 13px;background:#fbfcfd}
.balcard .k{font-size:11px;text-transform:uppercase;letter-spacing:.04em;color:var(--ink-faint);font-weight:600}
.balcard .v{font-size:18px;font-weight:700;margin-top:5px;font-variant-numeric:tabular-nums}
.balcard.accent{background:var(--accent-tint);border-color:#bfe7e3}
.ledger-actions{display:flex;gap:8px;flex-wrap:wrap;padding:0 14px 10px}
.ledgertools{display:flex;align-items:center;gap:10px;flex-wrap:wrap;padding:0 14px 12px}
.filter-bar{padding:12px 14px}
.pills{display:inline-flex;background:var(--line-soft);border-radius:7px;padding:2px}
.pills button{border:0;background:transparent;color:var(--ink-soft);font-size:12px;font-weight:600;padding:5px 12px;border-radius:5px;cursor:pointer}
.pills button.on{background:var(--card);color:var(--ink);box-shadow:var(--shadow-sm)}
.sheet-tabs{margin-bottom:2px}
.asof{display:flex;align-items:center;gap:6px;font-size:12px;color:var(--ink-soft)}
input[type=date],input[type=text].inp,select.inp,.inp{height:28px;border:1px solid var(--line);border-radius:6px;padding:0 8px;font:inherit;font-weight:400;font-size:12px;color:var(--ink);background:var(--card)}
.info-cell{position:relative}
.info-btn{border:0;background:transparent;cursor:pointer;color:var(--ink-faint);padding:0 0 0 5px;vertical-align:middle}
.info-btn:hover{color:var(--accent-deep)}
.kindcell{display:inline-flex;align-items:center;gap:6px}
.kdot{width:7px;height:7px;border-radius:2px;flex:none;background:var(--ink-faint)}
.kdot.principal{background:#6d51c4}.kdot.interest{background:var(--accent)}.kdot.fee{background:var(--warn)}.kdot.other{background:var(--ink-faint)}
.banner{margin:0 14px 12px;padding:9px 12px;border-radius:6px;background:#fff7ec;border:1px solid #f5deb8;color:#8a5a12;font-size:12px;display:flex;align-items:center;justify-content:space-between;gap:10px;flex-wrap:wrap}
.banner.suggest{background:var(--accent-tint);border-color:#bfe7e3;color:var(--accent-deep)}

/* payoff */
.payoff-form{display:flex;gap:16px;flex-wrap:wrap;align-items:flex-end;padding:14px}
.ffield{display:flex;flex-direction:column;gap:5px}
.ffield label{font-size:11px;font-weight:600;color:var(--ink-soft);text-transform:uppercase;letter-spacing:.03em}
.radio-row{display:flex;gap:6px}
.radio-row .r-opt{padding:5px 11px;border:1px solid var(--line);border-radius:6px;font-size:12px;cursor:pointer;color:var(--ink-soft)}
.radio-row .r-opt.on{background:var(--accent-tint);border-color:var(--accent);color:var(--accent-deep);font-weight:600}
.chkline{display:flex;align-items:center;gap:7px;font-size:12.5px;color:var(--ink-soft);text-transform:none;letter-spacing:0}
.po-actions{display:flex;gap:8px;margin-left:auto;align-items:flex-end}
.po-actions.mt{margin:12px 14px;justify-content:flex-end}

/* reports */
.repgroup{margin-bottom:16px}
.repgroup h3{font-size:11px;text-transform:uppercase;letter-spacing:.06em;color:var(--ink-faint);font-weight:700;margin:0 0 8px}
.star{cursor:pointer;font-size:15px;line-height:1;color:var(--ink-faint);background:none;border:0;padding:0}
.star.on{color:#e2a233}
.reptable td .rname{font-weight:600;color:var(--ink)}
.reptable td .rdesc{color:var(--ink-faint);font-size:11.5px;margin-top:2px}
/* Whole report row is clickable (runs the report); hover highlight is kept as-is. */
.reptable tr.rep-row{cursor:pointer}
/* Keyboard-reachable row (tabindex+role, Enter/Space): show WHERE focus is. Scoped, never global. */
.reptable tr.rep-row:focus-visible{outline:2px solid var(--accent);outline-offset:2px}
.rsoft{color:var(--ink-soft)}
/* Keyboard-reachable INV table rows (tabindex + role, Enter/Space through ui.js onActivate):
   the pointer affordance and a scoped focus ring, listed by the data-* hook each page uses —
   never a global tr rule. */
tr[data-c],tr[data-group],tr[data-acct],tr[data-batch],tr[data-draft],tr[data-up],
tr[data-acctrow],tr[data-jrn]{cursor:pointer}
tr[data-c]:focus-visible,tr[data-group]:focus-visible,tr[data-acct]:focus-visible,
tr[data-batch]:focus-visible,tr[data-draft]:focus-visible,tr[data-up]:focus-visible,
tr[data-acctrow]:focus-visible,tr[data-jrn]:focus-visible{
  outline:2px solid var(--accent);outline-offset:-2px}

/* registry cards */
.cardgrid{display:flex;gap:12px;flex-wrap:wrap}
.rollcard{background:var(--card);border:1px solid var(--line);border-radius:8px;box-shadow:var(--shadow-sm);padding:14px 16px;min-width:230px;flex:1;cursor:pointer}
.rollcard:hover{border-color:var(--accent);box-shadow:var(--shadow-md)}
/* Keyboard-reachable card (tabindex+role, Enter/Space): show WHERE focus is. Scoped, never global. */
.rollcard:focus-visible{outline:2px solid var(--accent);outline-offset:2px}
.rollcard.wide{flex:1 1 340px}
.rc-name{font-weight:700;font-size:13.5px}
.rc-sub{color:var(--ink-faint);font-size:11.5px;margin-top:3px}
.rc-figs{margin-top:10px}
.rc-figs .k{font-size:10.5px;text-transform:uppercase;color:var(--ink-faint);font-weight:600;display:block}
.rc-figs .v{font-size:16px;font-weight:700}
.rc-figs2{display:grid;grid-template-columns:repeat(3,1fr);gap:10px;margin-top:12px}
.rc-fig .k{font-size:10px;text-transform:uppercase;color:var(--ink-faint);font-weight:600;display:block}
.rc-fig .v{font-size:13.5px;font-weight:700}
.detail-head{margin-bottom:12px}
.setcols{display:grid;grid-template-columns:1fr 1fr;gap:14px}
.chip-loan{display:inline-block;margin:2px 4px 2px 0}

/* ---------- modal + forms ---------- */
.overlay{position:fixed;inset:0;background:rgba(27,39,64,.42);z-index:100;display:none;align-items:flex-start;justify-content:center;padding:40px 16px;overflow:auto}
.overlay.show{display:flex}
.modal{background:var(--card);border-radius:10px;box-shadow:var(--shadow-md);width:100%;max-width:520px;overflow:hidden}
.modal.wide{max-width:880px}
.modal-h{padding:13px 18px;border-bottom:1px solid var(--line);display:flex;align-items:center;justify-content:space-between}
.modal-h h2{font-size:14px;margin:0;font-weight:700}
.modal-foot{border-top:1px solid var(--line);border-bottom:0;justify-content:flex-end;gap:8px}
.modal-body{padding:16px 18px}
.modal-b{display:flex;gap:0;max-height:70vh}
.form-grid{display:grid;grid-template-columns:1fr 1fr;gap:12px}
.form-grid.edit-grid,.modal-body.form-grid{margin:0}
.fld{display:flex;flex-direction:column;gap:5px;font-size:11.5px;color:var(--ink-soft);font-weight:600}
.fld span{text-transform:none}
.fld input[type=text],.fld input[type=email],.fld input[type=date],.fld select{height:30px;border:1px solid var(--line);border-radius:6px;padding:0 9px;font:inherit;font-weight:400;font-size:13px;color:var(--ink);background:#f8fafc}
.fld input[type=checkbox]{width:16px;height:16px}
.fld input:disabled,.fld select:disabled{background:var(--line-soft);color:var(--ink-faint);cursor:not-allowed;opacity:.7}
.fld textarea{border:1px solid var(--line);border-radius:6px;padding:6px 9px;font:inherit;font-weight:400;font-size:13px;color:var(--ink);background:#f8fafc;resize:vertical;min-height:52px}
.form-grid .wide{grid-column:1/-1}
.fld.wide{grid-column:1/-1}
.combo-rates{grid-column:1/-1;display:grid;grid-template-columns:1fr 1fr;gap:10px 14px}
.po-fee-editor-box{border:1px solid var(--line-soft);border-radius:var(--radius);padding:10px 12px;margin-top:12px}
.preview-note{font-size:11.5px;color:var(--ink-faint);margin-bottom:6px}
.fld.inline{flex-direction:row;align-items:center;gap:8px}
.fld.inline .fld-hint{margin:0}
th.chk{width:26px}
tr.rowneeds td{background:#fff7ec} /* needs-attention row (review/import queues; banner amber) — NOT keyboard focus (tr.rowfocus) */
.edit-grid{padding:14px}
/* party-name typeahead (Add Party modal) — reuses the search-menu genre, anchored to its input */
.ta-wrap{position:relative;display:block}
.ta-wrap>input{width:100%}
.ta-menu{position:absolute;top:100%;left:0;right:0;margin-top:3px;background:var(--card);border:1px solid var(--line);border-radius:6px;box-shadow:var(--shadow-md);padding:4px;display:none;max-height:210px;overflow:auto;z-index:80}
.ta-menu.show{display:block}
.ta-row{display:flex;align-items:baseline;gap:8px;width:100%;text-align:left;border:0;background:none;cursor:pointer;padding:6px 9px;border-radius:5px;font:inherit;font-size:12.5px;color:var(--ink)}
.ta-row:hover,.ta-row.active{background:var(--line-soft)}
.ta-row .ta-name{font-weight:600}
.ta-row .ta-sub{margin-left:auto;color:var(--ink-faint);font-size:11px}
.ta-create{border-top:1px solid var(--line-soft);margin-top:2px;padding-top:7px}
.ta-create .ta-name{color:var(--accent-deep)}
.mergecol{flex:1;padding:14px 16px;overflow-y:auto;border-right:1px solid var(--line)}
.mergecol-h{font-size:11px;text-transform:uppercase;letter-spacing:.05em;color:var(--ink-faint);font-weight:700;margin-bottom:6px}
.previewcol{flex:1;padding:16px;background:#eef1f4;overflow-y:auto}
.doc-frame{width:100%;height:420px;border:1px solid var(--line);border-radius:4px;background:#fff}
.merge-row{display:flex;align-items:center;gap:8px;padding:7px 0;border-bottom:1px solid var(--line-soft)}
.merge-row .ml{flex:0 0 130px;font-size:11.5px;color:var(--ink-soft)}
.merge-row .mv{flex:1;font-size:12.5px;font-weight:600;font-variant-numeric:tabular-nums;outline:none;padding:2px 4px;border-radius:4px}
.merge-row .mv:focus{background:var(--accent-tint)}
.merge-row .edited{width:6px;height:6px;border-radius:50%;background:var(--warn);flex:none}
.merge-row .edited-spacer{width:6px;flex:none}
.merge-row .reset{border:0;background:none;cursor:pointer;color:var(--ink-faint);font-size:13px}

/* documents */
.doc-toolbar{display:flex;align-items:center;gap:10px;padding:12px 14px;flex-wrap:wrap}
.gen-menu-wrap{position:relative}
.gen-menu{position:absolute;top:32px;left:0;background:var(--card);border:1px solid var(--line);border-radius:8px;box-shadow:var(--shadow-md);padding:5px;display:none;z-index:50;min-width:170px}
.gen-menu.show{display:block}
.dropzone{margin:12px 14px;border:2px dashed var(--line);border-radius:8px;padding:18px;text-align:center;color:var(--ink-faint);font-size:12.5px}
.dropzone.hot{border-color:var(--accent);background:var(--accent-tint);color:var(--accent-deep)}
.dz-inner{display:flex;align-items:center;justify-content:center;gap:10px;flex-wrap:wrap}
.dz-browse{color:var(--accent-deep);cursor:pointer;font-weight:600}

/* popover */
.popover{position:fixed;z-index:120;background:var(--topbar);color:var(--topbar-ink);border-radius:7px;padding:11px 13px;width:262px;box-shadow:var(--shadow-md);font-size:11.5px;display:none}
.popover.show{display:block}
.popover h5{margin:0 0 7px;font-size:11px;letter-spacing:.05em;text-transform:uppercase;color:#9fd8d2}
.popover .pr{display:flex;justify-content:space-between;padding:2px 0;font-variant-numeric:tabular-nums}
.popover .pr .l{color:#b7c4d6}
.popover .peq{margin-top:7px;padding-top:7px;border-top:1px solid var(--topbar-line);display:flex;justify-content:space-between;font-weight:700}

/* toast — the stack owns the corner; each .toast is one message (newest last = nearest the corner) */
.toast-stack{position:fixed;bottom:16px;right:16px;z-index:130;display:flex;flex-direction:column;align-items:flex-end;gap:8px;pointer-events:none}
.toast{background:var(--topbar);color:#fff;padding:10px 14px;border-radius:7px;font-size:12.5px;box-shadow:var(--shadow-md);opacity:0;transform:translateY(8px);transition:.2s;pointer-events:none;max-width:360px}
.toast.show{opacity:1;transform:none}
.toast.error{background:var(--neg)}

/* ---------- standalone / auth ---------- */
.standalone{min-height:100vh;display:flex;align-items:center;justify-content:center;padding:24px}
.auth-card{background:var(--card);border-radius:10px;box-shadow:var(--shadow-md);padding:30px 34px;width:360px;max-width:calc(100vw - 32px)}
.auth-brand{display:flex;align-items:center;gap:10px;justify-content:center;margin-bottom:18px}
.auth-card h1{font-size:16px;margin:0 0 18px;text-align:center;font-weight:600}
.auth-card label{display:block;font-size:12px;color:var(--ink-soft);margin-bottom:6px}
.auth-card input[type=email]{width:100%;padding:9px 11px;border:1px solid var(--line);border-radius:6px;font-size:14px;background:#f8fafc;margin-bottom:6px}
.auth-card input[type=email]:focus{outline:2px solid var(--accent);background:#fff}
.auth-card .btn{background:var(--accent);border-color:var(--accent);color:var(--accent-ink)}
.quiet{color:var(--ink-faint);font-size:12px;text-align:center;margin-top:14px}
.msg{text-align:center;font-size:14px;color:var(--ink);line-height:1.6}
.msg.left{text-align:left}
.err{color:var(--neg);font-size:13px;text-align:center;margin-top:10px}

/* ---------- Batch C: streamlined GUI ---------- */
/* create-file modal + field hints — cap at the real viewport room (overlay padding 80px +
   modal header/footer ≈ 120px), so the form only scrolls when the window is genuinely short */
.create-form{max-height:calc(100vh - 200px);overflow:auto}
.fld-hint{font-weight:400;font-size:11px;color:var(--ink-faint);text-transform:none}
/* a repeating column of inputs inside one .fld (e.g. an investor's account names) */
.fld-stack{display:flex;flex-direction:column;gap:6px}
/* inline field errors (design-system §4.9) — set via ui.js setFieldError only, never by hand */
.fld-err{font-weight:600;font-size:11px;color:var(--neg);text-transform:none}
.fld input.fld-bad,.fld select.fld-bad,.fld textarea.fld-bad,input.fld-bad,select.fld-bad,textarea.fld-bad{border-color:var(--neg);background:#fdf5f5}
div.fld-bad,span.fld-bad{outline:1px solid var(--neg);outline-offset:3px;border-radius:4px}

/* loan header: OWED TODAY headline beside the key figures */
.loanhead .headgrid{display:flex;align-items:flex-end;gap:34px;flex-wrap:wrap;margin-top:12px}
.owed-head .k{font-size:10.5px;text-transform:uppercase;letter-spacing:.04em;color:var(--ink-faint);font-weight:600}
.owed-head .v{font-size:26px;font-weight:800;margin-top:2px;font-variant-numeric:tabular-nums;color:var(--ink)}
.owed-head .sub{font-size:11.5px;color:var(--ink-faint);margin-top:2px}
.owed-head.paid .v{font-size:18px;color:var(--accent-deep)}
.loanhead .headgrid .keyfigs{margin-top:0}

/* ledger — borrower story */
.ledger-tbl .memo-label{font-style:italic;color:var(--ink-soft)}
tbody tr.ledger-memo td{background:#f8fafb}
tr.ledger-reversed .strike{text-decoration:line-through;color:var(--ink-faint)}
tr.ledger-raw{display:none}
tr.ledger-raw.show{display:table-row}
tr.ledger-raw td{background:#f4f6f8;padding:0}
.raw-wrap{padding:8px 12px;display:flex;flex-direction:column;gap:4px}
.raw-line{display:flex;gap:14px;align-items:baseline;font-size:11.5px;color:var(--ink-soft)}
.raw-line .raw-kind{color:var(--ink-faint);min-width:150px}
.raw-line .raw-desc{flex:1;color:var(--ink-soft)}
.raw-line .num.r{margin-left:auto;text-align:right}
.ledgertools .chkline.allrows{font-size:12px}

/* ledger bottom bar — quick payoff calculator */
.ledger-bottom{border-top:1px solid var(--line-soft);padding:11px 14px;background:#f8fafb}
.owed-line{display:flex;align-items:center;gap:8px;flex-wrap:wrap;font-size:12.5px;color:var(--ink-soft)}
.owed-line .ol-k{font-weight:700;color:var(--ink-faint);text-transform:uppercase;font-size:10.5px;letter-spacing:.04em}
.owed-line .ol-v{font-weight:800;color:var(--ink);font-size:15px}
.owed-line .ol-sep{color:var(--ink-faint)}
.owed-line input[type=date]{height:26px}

/* Batch D3/D4 additions (list-pages flattening + friction) */
.daybadge.ok{background:#e6f4ea;color:#1a7f37}          /* B13: sent-result tag */
.daybadge.ready{background:var(--accent-tint);color:var(--accent-deep)}  /* B6: ready-to-fund cue */
.kcard .kready{margin-top:5px}
.grouprow td{background:var(--line-soft);color:var(--ink-faint);font-weight:700;font-size:11px;text-transform:uppercase;letter-spacing:.04em}  /* B11: investor account group row */
.search-row.active{background:var(--line-soft)}          /* B15: keyboard-highlighted search row */
.search-menu .search-head{padding:5px 9px 3px;font-size:10.5px;font-weight:700;text-transform:uppercase;letter-spacing:.05em;color:var(--ink-faint)}

/* ---- OriginBooks (token-only additions, per design/design-system.md OB inventory) ---- */
/* product segmented control — dark .pills variant, 28px (spec E.1) */
.prodseg{display:inline-flex;background:#26344d;border-radius:7px;padding:2px;flex:none}
.prodseg button{border:0;background:transparent;color:#8aa0bf;font-size:12px;font-weight:600;padding:4px 12px;border-radius:5px;cursor:pointer;line-height:1.4}
.prodseg button.on{background:var(--card);color:var(--ink);box-shadow:var(--shadow-sm)}
/* company chip + switcher (spec E.3) — 10 muted slots derived from existing token hues */
.co-chip{display:inline-flex;align-items:center;justify-content:center;height:18px;min-width:24px;padding:0 5px;border-radius:5px;font-size:10px;font-weight:800;letter-spacing:.04em;color:#fff;background:var(--ink-soft);flex:none}
.co-chip.c0{background:#0f7f77}.co-chip.c1{background:#3b4d6b}.co-chip.c2{background:#3f6ea5}
.co-chip.c3{background:#7a63b8}.co-chip.c4{background:#3d8a68}.co-chip.c5{background:#b47a2a}
.co-chip.c6{background:#a35b5b}.co-chip.c7{background:#5b6b7b}.co-chip.c8{background:#4f8f8a}
.co-chip.c9{background:#746b8f}
.co-wrap{position:relative;flex:none}
.co-btn{display:flex;align-items:center;gap:7px;height:32px;padding:0 10px;border:0;border-radius:6px;background:transparent;color:var(--topbar-ink);font:inherit;font-size:12.5px;font-weight:600;cursor:pointer;max-width:250px}
.co-btn:hover{background:#26344d}
.co-btn .co-name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.co-btn .caret{opacity:.6;font-size:9px}
.co-menu{left:0;right:auto;min-width:300px}
.co-filter{width:100%;height:28px;border:1px solid var(--line);border-radius:6px;padding:0 8px;font:inherit;font-size:12.5px;margin-bottom:4px;background:#f8fafc;color:var(--ink);outline:none}
.co-filter:focus{border-color:var(--accent)}
/* rail + New (spec E.2) */
.rail-newwrap{position:relative;padding:0 6px;margin-bottom:6px}
.rail-newbtn{display:flex;align-items:center;justify-content:center;gap:6px;width:100%;height:30px;border:0;border-radius:6px;background:var(--accent);color:var(--accent-ink);font-size:12.5px;font-weight:700;cursor:pointer}
.rail-newbtn:hover{background:var(--accent-deep)}
.rail-newbtn:disabled{opacity:.55;cursor:default}
.rail-newwrap .gen-menu{left:6px;right:6px;top:34px;min-width:0}
/* JE grid (spec E.4) — focused cell outlined with --accent; amounts right-aligned tabular */
.jegrid{padding:4px 14px 12px}
.jegrid .jg-head,.jegrid .jg-row,.jegrid .jg-tot{display:grid;grid-template-columns:26px minmax(170px,1.5fr) 108px 108px minmax(90px,.8fr) minmax(90px,.8fr) minmax(120px,1.1fr) 26px;align-items:center}
.jegrid.splits .jg-head,.jegrid.splits .jg-row{grid-template-columns:26px minmax(170px,1.5fr) minmax(90px,.9fr) minmax(120px,1.2fr) 120px 26px}
.jegrid.splits.withname .jg-head,.jegrid.splits.withname .jg-row{grid-template-columns:26px minmax(170px,1.4fr) minmax(90px,.8fr) minmax(90px,.8fr) minmax(120px,1.1fr) 120px 26px}
.jegrid .jg-head>div{font-size:10.5px;font-weight:700;text-transform:uppercase;letter-spacing:.04em;color:var(--ink-faint);padding:7px 5px;border-bottom:1px solid var(--line)}
.jegrid .jg-row>div{padding:2px 2px;border-bottom:1px solid var(--line-soft)}
.jegrid input{width:100%;height:28px;border:1px solid transparent;border-radius:5px;padding:0 6px;font:inherit;font-size:12.5px;background:transparent;color:var(--ink)}
.jegrid input:hover{border-color:var(--line)}
.jegrid input:focus{outline:none;border-color:var(--accent);background:var(--card);box-shadow:0 0 0 2px var(--accent-tint)}
.jegrid .jg-n{color:var(--ink-faint);font-size:11.5px;text-align:center}
.jegrid .amt input{text-align:right;font-variant-numeric:tabular-nums}
.jegrid .jg-x{text-align:center}
.jegrid .jg-tot{padding:8px 5px;font-weight:700;border-top:2px solid var(--line)}
.jegrid .jg-tot .lbl{grid-column:1/3}
.jegrid .jg-tot .pillcell{grid-column:5/-1;display:flex;align-items:center;gap:12px;padding-left:8px}
.jegrid.splits .jg-tot{grid-template-columns:26px minmax(170px,1.5fr) 120px 1fr}
.jegrid.splits .jg-tot .lbl{grid-column:1/3}
.jegrid.splits .jg-tot .pillcell{grid-column:4/-1}
.bal-pill{font-size:11px;font-weight:700;padding:3px 10px;border-radius:12px;white-space:nowrap}
.bal-pill.ok{background:#e3f4ec;color:var(--pos)}
.bal-pill.off{background:#fde9d6;color:var(--warn)}
/* status vocabulary: DRAFT amber tag · REVERSED ns+strike · RECONCILED green ✓R · padlock */
.tag.warn{background:#fde9d6;color:var(--warn)}
/* Test files: loud on purpose — nobody should mistake one for a real deal. */
.tag.test{background:#fbe3e4;color:#b3413f}
.rec-flag{color:var(--pos);font-weight:700;font-size:11px}
.lockcell{color:var(--ink-faint);display:inline-flex;align-items:center;gap:3px;vertical-align:baseline}
/* CoA tree */
.tree-caret{border:0;background:none;cursor:pointer;color:var(--ink-faint);width:16px;padding:0;font-size:9px;display:inline-block;text-align:center;flex:none}
.coa-name{display:inline-flex;align-items:center;gap:5px}
/* dashboards + lists */
.tile .v.warn{color:var(--warn)}
.warn-txt{color:var(--warn)}
th.sortable{cursor:pointer;user-select:none}
th.sortable.on{color:var(--accent-deep)}
/* books empty-state flourish (first-run + phase pages) */
.ob-hero{padding:44px 20px;text-align:center}
.ob-hero svg{color:var(--ink-faint);opacity:.65}
.ob-hero .h{font-size:15px;font-weight:700;margin:10px 0 4px}
.ob-hero .s{color:var(--ink-faint);font-size:12.5px;max-width:460px;margin:0 auto 16px;line-height:1.6}
/* company color swatches (settings modal) */
.swatches{display:flex;gap:6px;flex-wrap:wrap}
.swatches .co-chip{cursor:pointer;height:22px;min-width:30px}
.swatches .co-chip.sel{outline:2px solid var(--ink);outline-offset:1px}
/* bank-rec matcher (B5 UI; classes reserved in the design-system inventory) */
.rec-cols{display:grid;grid-template-columns:1fr 1fr;gap:14px}
.diff-ok{background:#e3f4ec !important;border-color:#bfe7d0 !important;color:var(--pos)}
td.datecell{white-space:nowrap}
.bal-pill.idle{background:var(--line-soft);color:var(--ink-soft)}
.bal-link{color:inherit;cursor:pointer}
.bal-link:hover{color:var(--accent-deep);text-decoration:underline}

/* ---- OB B2: report run rows (universal row model, contract §11) ---- */
.rep-foot{padding:9px 14px;font-size:11.5px;color:var(--ink-faint);border-top:1px solid var(--line-soft)}
tr.rr-header td{font-weight:700;color:var(--ink)}
tr.rr-subtotal td{font-weight:700;border-top:1px solid var(--line)}
tr.rr-computed td{font-weight:700;color:var(--accent-deep)}
tr.rr-blank td{border:0;height:10px;padding:0}
tr.rr-acct{cursor:pointer}
/* consolidated-run company multi-select (dim until picked; none picked = all) */
.co-picks{display:inline-flex;gap:5px;flex-wrap:wrap;align-items:center}
.co-picks .co-chip{cursor:pointer;opacity:.4}
.co-picks .co-chip.sel{opacity:1;outline:2px solid var(--ink);outline-offset:1px}
/* OB B2: comments queue + rail badge + keyboard row focus (spec 4b.2/4b.4) */
.rail-badge{margin-left:auto;background:var(--warn);color:#fff;font-size:10px;font-weight:700;border-radius:9px;padding:1px 6px;line-height:1.5}
tr.rowfocus td{background:var(--accent-tint)}
.cmt-body{padding:10px 14px;white-space:pre-wrap;font-size:12.5px;color:var(--ink);border-top:1px solid var(--line-soft)}
/* OB B2: settings — one-time API-key reveal; topbar READ-ONLY tag */
.keyplain{margin:10px 14px;padding:9px 12px;background:#f8fafb;border:1px dashed var(--line);border-radius:6px;word-break:break-all;font-weight:600}
.ro-tag{flex:none}

/* ---- feelines: the shared fee editor (closing fees at funding + payoff negotiation) ---- */
.feelines{display:flex;flex-direction:column;gap:6px;margin:6px 0}
.feeline-row{display:grid;grid-template-columns:1fr 130px 22px;gap:8px;align-items:center}
.feeline-row .fee-name,.feeline-row .fee-amt{width:100%}
.feeline-row .fee-amt{text-align:right}
.feeline-row .fee-del{justify-self:center}
/* A fee line that can't be used — priced but unnamed, or an unparseable amount — is EXCLUDED from
   the quote/closing list. Outline it loudly so it is never dropped silently. */
.feeline-row.fee-invalid input.inp{border-color:var(--neg);background:#fdf5f5}
.feeline-row.fee-invalid input.inp:focus{outline:none;box-shadow:0 0 0 2px rgba(185,28,28,.15)}

/* ---- OB B5: bank rec workspace + review queues (spec §E.4; .rec-cols/.diff-ok reserved above) ---- */
/* The DIFFERENCE balcard is amber until it hits exactly $0.00, when .diff-ok takes over. */
.balcard.diff-pending{background:#fff7ec;border-color:#f5deb8;color:var(--warn)}
.balcard.diff-ok .k{color:var(--pos);opacity:.8}
/* Two-column matcher: each column owns its own scroll so a long statement never drags the page. */
.rec-cols>.card{margin:0;min-width:0}
.rec-cols .tablewrap{max-height:520px;overflow:auto}
.rec-desc{overflow-wrap:anywhere}
.rec-sug{font-size:11.5px;color:var(--ink-faint);margin-top:2px}
.rec-acts{white-space:nowrap}
.rec-acts .btn{margin-left:4px}
tr.rec-done td{color:var(--ink-soft)}
tr.rec-toggle td{background:var(--line-soft);padding:6px 10px}
tr.rec-prev td{background:#f8fafb;padding:0}
tr.rec-prev .dl{grid-template-columns:1fr}
/* One column below the tablet breakpoint — side-by-side matching needs the width. */
@media (max-width:1100px){.rec-cols{grid-template-columns:1fr}}
