  /* ==== Books — ONE stylesheet (2026-07-20 spacing/flow pass) ====
     Three stacked reskin waves ("workspace shell" + "v4 calm reading") were
     flattened into the single sheet below: every rule here is the cascade
     WINNER of the old stack, nudged onto the 4px space scale (4/8/12/16/24/
     32/48). Laws kept from the old waves are quoted where they bind.
     Provably-dead layers removed: the retired in-page search (#gSearch/#gDrop/
     .gwrap markup gone 2026-07-17; its whole JS IIFE — dead since the same
     pass, unreachable behind `if(!input||!drop) return` — deleted outright
     2026-07-27, SAITAMA SD8), .bhead h2/.grow, td .okc,
     .drows, .obar, .assistant-panel. Print is LAST so paper wins again. */

  body{background:var(--bg);color:var(--text);font-family:ui-sans-serif,-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif}

  /* ---- shell: rail + main ---- */
  .bwrap{display:grid;grid-template-columns:232px minmax(0,1fr);gap:0;align-items:flex-start;max-width:1560px;margin:0 auto;padding:0 28px 84px}
  .bnav{min-width:0;position:sticky;top:78px;max-height:calc(100vh - 96px);overflow:auto;padding:24px 16px 40px;background:var(--surface);border:1px solid var(--line);border-radius:var(--r-lg);box-shadow:var(--shadow-sm)}
  /* the head holds only the mobile off-canvas dismiss; on desktop the top bar
     already says Books, so there is no rail header at all */
  .bnav-head{display:none;align-items:center;justify-content:flex-end;min-height:42px;margin:0 0 12px}
  .bnav-close{display:none;width:38px;height:38px;border:1px solid var(--line);border-radius:var(--r-sm);background:var(--surface);color:var(--text);font:inherit;font-size:20px;cursor:pointer}
  .bnav .grp{margin:0 0 16px}
  /* group titles are plain signposts, never controls: nothing in this rail
     opens, closes, or has to be guessed at (see renderNav's Tokyo-rail note) */
  .bnav .gt{color:var(--dim);font-size:11px;font-weight:600;letter-spacing:.07em;text-transform:uppercase;padding:6px 12px 2px;margin:0;cursor:default;list-style:none;display:flex;align-items:center}
  .bnav a{display:flex;align-items:center;gap:8px;min-height:36px;padding:8px 12px;border-radius:var(--r-sm);border:1px solid transparent;color:var(--text);text-decoration:none;font-size:14px;line-height:1.25}
  /* the one honest door to the long tail — quieter than a real errand */
  .bnav a.nav-more{color:var(--muted);font-size:13px}
  .bnav a.nav-more::after{content:"→";margin-left:auto;color:var(--dim)}
  .bnav a:hover{background:var(--bg-2)}
  /* active view = a quiet left-rule + weight, never a pill — the top bar's
     active tab is the only "where am I" pill in the whole app */
  .bnav a.on{border-left:2px solid var(--brand);border-radius:0;font-weight:680}
  .bnav a .n{margin-left:auto;color:var(--dim);font-size:13px;font-variant-numeric:tabular-nums}
  .bnav a .lk{margin-left:auto;font-size:13px}
  /* ==== "Everything else": the full map, one page, grouped by job ==== */
  .ix-find{margin:0 0 22px;max-width:420px}
  .ix-find input{width:100%;min-height:42px;padding:10px 14px;border:1px solid var(--line);border-radius:var(--r-md);background:var(--surface);color:var(--text);font:inherit;font-size:15px}
  .ix-find input:focus{outline:none;border-color:var(--brand)}
  /* grid, deliberately, not CSS columns: columns balance by height and throw
     the six sections out of reading order (you'd hunt for "Chase the money"
     below the fold). A grid keeps them left-to-right in the order written. */
  .ix-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(268px,1fr));gap:30px 34px;align-items:start}
  .ix-g h3{font-family:var(--serif);font-weight:400;font-size:19px;margin:0;letter-spacing:0}
  .ix-g .ix-sub{color:var(--muted);font-size:13px;margin:2px 0 10px;line-height:1.35}
  a.ix-i{display:block;padding:7px 10px;margin:0 -10px;border-radius:var(--r-sm);text-decoration:none;color:var(--text)}
  a.ix-i:hover{background:var(--bg-2)}
  /* the filter sets [hidden]; a.ix-i's own display:block outranks the browser's
     [hidden]{display:none}, so say it here or nothing ever hides */
  a.ix-i[hidden],.ix-g[hidden]{display:none}
  .ix-t{display:block;font-size:14px;font-weight:600;line-height:1.3}
  .ix-t .lk{margin-left:6px;font-size:11px;color:var(--dim);font-weight:500}
  .ix-d{display:block;color:var(--muted);font-size:12.5px;line-height:1.4;margin-top:1px}
  .ix-foot,.ix-none{color:var(--muted);font-size:13px;margin-top:26px;max-width:62ch;line-height:1.5}
  .bnav .sv-x{margin-left:auto;color:var(--dim);cursor:pointer;font-size:13px;padding:0 2px}
  .bnav .sv-x:hover{color:var(--danger)}
  .bmain{min-width:0;width:100%;padding:32px 0 0 32px}

  /* ---- page header + the sticky context bar ---- */
  .bhead{display:grid;grid-template-columns:minmax(0,1fr) minmax(390px,500px);align-items:end;gap:24px;margin:0;padding-bottom:32px}
  .btitle{min-width:0}
  .btitle-row{display:flex;align-items:center;gap:12px}
  .bhead h1{margin:0;color:var(--text);font-size:32px;font-weight:600;letter-spacing:-.035em;line-height:1.1}
  .bhead .sub{display:block;margin-top:8px;color:var(--muted);font-size:16px;line-height:1.45}
  /* the context bar (Community) stays with you while the page scrolls —
     pinned just under the shell nav, on a solid surface */
  .bhead-controls{display:flex;align-items:center;gap:12px;position:sticky;top:64px;z-index:30;background:var(--bg-2);padding:12px 0;margin:-12px 0 0;border-bottom:1px solid var(--line)}
  .field-label{display:grid;gap:8px;color:var(--muted);font-size:14px;font-weight:600}
  #propScope{width:100%;min-height:44px;padding:9px 12px;border:1px solid var(--line);border-radius:var(--r-sm);background:var(--surface);color:var(--text);font:inherit;font-size:15px;font-weight:550}
  .bnav-toggle{display:none;align-items:center;justify-content:center;min-height:42px;padding:8px 12px;border:1px solid var(--line);border-radius:var(--r-md);background:var(--surface);color:var(--text);font:inherit;font-size:14px;font-weight:600;cursor:pointer}
  .bnav-backdrop{display:none;position:fixed;inset:0;z-index:54;background:rgba(6,12,24,.48);backdrop-filter:blur(3px)}
  .bnav-backdrop.open{display:block}
  .print-head{display:none}

  /* ---- ONE control plane (2026-07-17 law) — every toolbar control: 40px,
     r-sm, 14px. Groups (.tg) wrap as units so nothing orphans. The toolbar is
     a ROW on the canvas, not a box around boxes — the table below is the one
     card (box-in-box kills the premium feel). ---- */
  .btools{display:flex;flex-wrap:wrap;align-items:center;gap:var(--sp-3);margin:0 0 16px;padding:2px 2px 0}
  .btools:empty{display:none}
  .tg{display:flex;align-items:center;gap:var(--sp-2);flex-wrap:wrap;min-width:0}
  .tg-find{flex:1 1 240px;max-width:360px}
  .tg-spacer{flex:1 1 auto;min-width:0}
  .bsearch{width:100%;min-height:40px;padding:10px 12px;background:var(--surface);border:1px solid var(--line);border-radius:var(--r-sm);font:inherit;font-size:14px;color:var(--text)}
  .chip,.bexport{display:inline-flex;align-items:center;justify-content:center;gap:8px;min-height:36px;padding:8px 12px;border:1px solid var(--line);background:var(--surface);color:var(--muted);border-radius:var(--r-sm);font:inherit;font-size:13px;font-weight:620;cursor:pointer;text-decoration:none}
  .bexport{min-height:40px;padding:10px 12px;font-size:14px;color:var(--text)}
  .chip:hover,.bexport:hover{border-color:var(--accent);color:var(--text)}
  .chip.on{background:var(--brand);border-color:var(--brand);color:var(--brand-ink)}
  .chip.warnc.on{background:var(--danger);border-color:var(--danger);color:var(--brand-ink)}
  .chip .c{color:var(--dim,var(--muted));font-size:12px;margin-left:2px;font-variant-numeric:tabular-nums}
  .chip.on .c{color:color-mix(in srgb,var(--brand-ink) 75%,transparent)}
  .btools .chip{min-height:40px;font-size:14px}
  .fsel,.fdate,.fnum{min-height:40px;padding:10px 12px;background:var(--surface);border:1px solid var(--line);border-radius:var(--r-sm);font:inherit;font-size:14px;color:var(--text)}
  .fsel{max-width:200px}
  .fnum{width:96px}
  .fgrp{display:inline-flex;align-items:center;gap:8px}
  .fl{color:var(--muted);font-size:13px;font-weight:650}
  .bsearch:focus,.fsel:focus,.fdate:focus,.fnum:focus{outline:2px solid var(--accent);outline-offset:2px;border-color:var(--accent)}
  .ledger-note{margin:16px 0 12px;font-size:14px;color:var(--muted)}

  /* ---- honesty strips: shown when the view's sync is incomplete ---- */
  .cover{display:flex;gap:8px;align-items:center;background:color-mix(in srgb,var(--gate) 12%,transparent);border:1px solid color-mix(in srgb,var(--gate) 45%,transparent);color:var(--text);border-radius:var(--r-md);padding:12px 14px;font-size:14px;line-height:1.45;margin:0 0 12px}
  .cover b{font-variant-numeric:tabular-nums}
  .unaudited{display:block;background:color-mix(in srgb,var(--gate) 12%,transparent);border:1px solid color-mix(in srgb,var(--gate) 45%,transparent);border-radius:var(--r-md);padding:12px 14px;font-size:14px;line-height:1.45;margin:0 0 12px}
  .books-verified{display:block;background:color-mix(in srgb,var(--ok) 12%,transparent);border:1px solid color-mix(in srgb,var(--ok) 45%,transparent);border-radius:var(--r-md);padding:12px 14px;font-size:14px;line-height:1.45;margin:0 0 12px;color:var(--text)}
  .books-discrepancy{display:block;background:color-mix(in srgb,var(--danger) 12%,transparent);border:1px solid color-mix(in srgb,var(--danger) 45%,transparent);border-radius:var(--r-md);padding:12px 14px;font-size:14px;line-height:1.45;margin:0 0 12px;color:var(--text)}
  /* ---- scope chips: a calm FACT about what the switcher is doing on this view,
     visually distinct from the amber .cover caution/sync banners so the two stop
     reading as identical beige twins. .scopechip = this list is narrowed to the
     picked community; .portfolio = this list has no per-community identity. ---- */
  .scoperow{margin:0 0 12px}
  .scopechip{display:inline-flex;align-items:center;gap:6px;font-size:12.5px;font-weight:650;padding:5px 11px;border-radius:999px;background:color-mix(in srgb,var(--accent) 13%,transparent);border:1px solid color-mix(in srgb,var(--accent) 34%,transparent);color:var(--text);line-height:1.3}
  .scopechip::before{content:"◍";font-size:11px;opacity:.75}
  .scopechip.portfolio{background:color-mix(in srgb,var(--muted) 13%,transparent);border-color:color-mix(in srgb,var(--muted) 30%,transparent);color:var(--muted);font-weight:600}
  .scopechip.portfolio::before{content:"⊞";opacity:.7}

  /* ---- pulse strip (task center) ---- */
  .pulse{display:grid;gap:12px;grid-template-columns:repeat(auto-fit,minmax(128px,1fr));margin:0 0 16px}
  .pulse .p{min-height:86px;background:var(--surface);border:1px solid var(--line);border-radius:var(--r-md);padding:16px;box-shadow:var(--shadow-sm);cursor:pointer;transition:border-color .15s}
  .pulse .p:hover{border-color:var(--accent)}
  .pulse .p .v{font-size:24px;font-weight:600;letter-spacing:-.02em}
  .pulse .p .l{color:var(--muted);font-size:13px;margin-top:2px}
  .pulse .p.bad .v{color:var(--danger)}

  /* ---- overview (business at a glance) ---- */
  .ov{display:grid;gap:12px;grid-template-columns:repeat(auto-fit,minmax(185px,1fr));padding:16px}
  .ov .kpi{background:var(--bg-2);border:0;border-radius:var(--r-md);padding:16px;cursor:pointer;transition:transform .12s var(--ease)}
  .ov .kpi:hover{transform:translateY(-2px)}
  .ov .kpi .v{font-size:24px;font-weight:600;letter-spacing:-.02em;overflow-wrap:anywhere}
  .ov .kpi .k{color:var(--muted);font-size:13px;margin-top:4px}
  .ov .kpi.alert .v{color:var(--danger)}
  .ov .kpi .chip2{display:inline-block;font-size:13px;font-weight:600;line-height:1.35;padding:4px 9px;border-radius:var(--r-pill);border:1px solid var(--accent);color:var(--accent)}
  .ov-health{padding:0 16px 16px;color:var(--muted);font-size:13px}
  .ov-health b{color:var(--text)}
  /* charts (dataviz standard: thin marks on a real baseline, selective
     labels, hover tooltip; the in-progress month wears texture, never a
     fake short bar presented as history) */
  .trend{padding:20px 20px 16px}
  .trend .tt{font-size:13px;font-weight:600;letter-spacing:.6px;text-transform:uppercase;color:var(--muted);margin:0 0 10px}
  .trend .bars{display:flex;align-items:flex-end;gap:10px;height:132px;position:relative;padding-bottom:1px}
  .trend .bars::after{content:"";position:absolute;left:0;right:0;bottom:22px;height:1px;background:var(--line)}
  .trend .bar{flex:1;display:flex;flex-direction:column;justify-content:flex-end;align-items:center;gap:5px;cursor:default;position:relative;z-index:1}
  .trend .bar i{display:block;width:100%;max-width:26px;background:var(--brand);border-radius:4px 4px 0 0;min-height:3px}
  .trend .bar.hv i{background:var(--brand-strong)}
  .trend .bar.now i{background:repeating-linear-gradient(135deg,var(--brand) 0 4px,color-mix(in srgb,var(--brand) 35%,transparent) 4px 8px)}
  .trend .bar.heavy i{background:var(--brand-strong)}
  .trend .bar span{font-size:13px;color:var(--dim);white-space:nowrap;line-height:1.3;text-align:center}
  .trend .bar span em{display:block;font-style:normal;font-size:11px;font-weight:600;letter-spacing:.04em;color:var(--warn);text-transform:uppercase}
  .trend .bar b{font-size:13px;font-weight:650;color:var(--muted);white-space:nowrap;font-variant-numeric:tabular-nums;visibility:hidden}
  .trend .bar.lab b{visibility:visible}
  .trend .tn{color:var(--dim);font-size:13px;margin-top:8px}
  .trend .insight{color:var(--text);font-size:14px;line-height:1.55;margin-top:10px;max-width:72ch}
  .trend .insight b{font-variant-numeric:tabular-nums}
  #ovTip{position:fixed;z-index:120;background:var(--brand-strong);color:var(--brand-ink);padding:6px 11px;border-radius:8px;
    font-size:13px;font-weight:650;pointer-events:none;display:none;white-space:nowrap;box-shadow:var(--shadow-md)}
  /* week brief */
  .brief{padding:4px 16px 16px}
  .brief .tt{font-size:13px;font-weight:600;letter-spacing:.6px;text-transform:uppercase;color:var(--muted);margin:12px 0 8px}
  .brief .bl{display:flex;gap:8px;align-items:baseline;padding:8px 2px;border-bottom:1px solid var(--line);font-size:13.5px;cursor:pointer}
  .brief .bl:hover{color:var(--accent)}
  .brief .bl:last-child{border-bottom:0}
  .brief .bl .n{font-weight:600;font-variant-numeric:tabular-nums;min-width:44px;text-align:right}

  /* ==== THE OVERVIEW, recomposed (Beauty Mandate flagship, 2026-07-20) ====
     The constitution's first executed screen: warm paper ground, two voices
     (serif interprets, sans works), one lead, verdict sentences, un-boxed
     sections. Scoped under body.ov-page so the other Books views keep their
     current skin until their own pass. Bar to beat: design/overview-mock.html */
  /* The quiet warm rail + serif voice apply to ALL Books views (2026-07-20
     full rollout — one coherent skin, not a warm island). */
  .bnav{background:transparent;border:0;box-shadow:none}
  .bnav a{border-left:2px solid transparent;border-radius:0;color:var(--muted);min-height:34px}
  .bnav a:hover{background:transparent;color:var(--text)}
  .bnav a.on{background:transparent;box-shadow:none;color:var(--text);font-weight:600;border-left-color:var(--gold)}
  .bnav .gt{color:var(--dim);font-weight:600}
  .bnav .grp+.grp .gt{margin-top:10px}
  .bhead h1{font-family:var(--serif);font-weight:400;letter-spacing:0}
  .field-label{color:var(--muted);font-weight:500}
  /* overview-only: the lead replaces the standard title block and the content
     sits directly on the paper (no working card) */
  body.ov-page .bhead h1,body.ov-page .bhead .sub{display:none}
  body.ov-page .bhead{padding-bottom:0;grid-template-columns:minmax(0,1fr) minmax(300px,380px);align-items:start}
  body.ov-page .bhead-controls{background:var(--bg);border-bottom:0;position:static;padding:0}
  body.ov-page .bnav{padding-top:64px}
  body.ov-page .tblc{background:transparent;border:0;box-shadow:none;border-radius:0;overflow:visible}
  body.ov-page .bwrap{max-width:1640px}
  /* Overview chart-local palette. These are PAGE-SCOPED names (never shadow a
     shared token, so they don't affect --accent/--bg/--text coherence). Coherence
     pass: --ovx-bar-muted was a hand-picked warm gray identical in intent and value
     to the shared hairline --line-2, so it now derives from the constitution and
     tracks light/dark automatically. The other three have no exact shared equal —
     the navy data-bar ink, the soft-brass avg/partial hatch, and the softened
     editorial ink for verdict prose + tag labels — so they stay as tuned chart
     locals, kept theme-complete (light + system-dark + manual-dark). */
  :root{--ovx-bar:#2c3d54;--ovx-bar-muted:var(--line-2);--ovx-brass-soft:#c8b088;--ovx-ink80:#3d4a5c}
  @media (prefers-color-scheme: dark){ :root:not([data-theme="light"]){--ovx-bar:#8fa7c4;--ovx-brass-soft:#9a8a66;--ovx-ink80:#c9c3b8} }
  :root[data-theme="dark"]{--ovx-bar:#8fa7c4;--ovx-brass-soft:#9a8a66;--ovx-ink80:#c9c3b8}
  .ovx{display:grid;grid-template-columns:minmax(0,1fr) 336px;gap:56px;font-size:15px;color:var(--text);font-variant-numeric:tabular-nums}
  .ovx a{color:inherit;text-decoration:none}
  .ovx .serif{font-family:Georgia,'Times New Roman',serif;font-weight:400}
  .ovx .lead .lead-h{font-family:Georgia,serif;font-weight:400;font-size:38px;line-height:1.15;letter-spacing:0;margin:0 0 6px;color:var(--text)}
  .ovx .lead .promise{color:var(--muted);max-width:34rem}
  .ovx .vitals{display:flex;gap:52px;margin-top:32px;flex-wrap:wrap}
  .ovx .vital{cursor:pointer}
  .ovx .vital .fig{font-family:Georgia,serif;font-size:34px;line-height:1.1;letter-spacing:-.01em}
  .ovx .vital .fig.red{color:var(--danger)}
  .ovx .vital .cap{color:var(--muted);font-size:14px;margin-top:5px;max-width:13rem}
  .ovx .vital .cap.cyc-calm{color:var(--dim);font-size:13px;margin-top:3px}
  /* the lease→home bridge: fine print that reconciles "948 active leases" to
     "882 homes", the finer split on its hover/tap receipt */
  .ovx .vital .cap.brg{color:var(--dim);font-size:13px;margin-top:3px;line-height:1.4;max-width:15rem}
  .ovx .vital .cap.brg.hasrcpt{cursor:help}
  .ovx .vital .held{color:var(--dim);font-size:14px;max-width:13rem}
  /* D2 provenance receipt. State 1 (validated): the number stays CLEAN — no
     badge, no color, no stamp — only a quiet hover/tap receipt (the number is
     the affordance, one interaction learned once). State 3 (stale): the one
     case the calm surface goes loud, a plain-English actionable caption. */
  .ovx .fig.hasrcpt{cursor:help}
  .ovx .rcpt-stale{color:var(--warn);font-size:13px;margin-top:6px;max-width:15rem;line-height:1.35}
  .ovx .age-fig .pct.hasrcpt{cursor:help}
  .ovx section{margin-top:72px}
  .ovx .sec-head{display:flex;align-items:baseline;gap:14px;margin-bottom:6px}
  .ovx .sec-head h2{font-family:Georgia,serif;font-weight:400;font-size:22px;margin:0}
  .ovx .sec-head .when{color:var(--dim);font-size:13px}
  .ovx .verdict{font-family:Georgia,serif;font-size:17px;line-height:1.55;color:var(--ovx-ink80);max-width:38rem;margin-top:18px}
  .ovx .verdict b{font-weight:600;color:var(--text)}
  .ovx .aside-note{color:var(--dim);font-size:13px;margin-top:8px;max-width:38rem}
  /* Money-scope-labels: one calm always-visible line under each money headline
     saying WHICH pipeline/scope it measures, so no two screens read as the same
     fact. Muted, small, never loud — the receipt (source + as-of) stays on hover. */
  .ovx .scope-line{color:var(--muted);font-size:13px;line-height:1.5;margin-top:6px;max-width:46rem}
  .ovx .chart{margin-top:22px}
  .ovx .cbars{position:relative;display:flex;align-items:flex-end;gap:14px;height:200px;border-bottom:1px solid var(--line)}
  .ovx .cbars .avg{position:absolute;left:0;right:0;border-top:1px dashed var(--ovx-brass-soft)}
  .ovx .cbars .avg em{position:absolute;right:0;top:-18px;font-style:normal;font-size:12px;color:var(--gold);background:var(--bg);padding-left:6px}
  .ovx .ccol{flex:1;display:flex;flex-direction:column;justify-content:flex-end;align-items:center;height:100%;position:relative;min-width:0}
  .ovx .ccol .cbar{width:100%;max-width:38px;background:var(--ovx-bar);border-radius:2px 2px 0 0;min-height:2px}
  .ovx .ccol .cbar.partial{background:repeating-linear-gradient(-45deg,var(--ovx-brass-soft) 0 4px,transparent 4px 8px);border:1px solid var(--gold);border-bottom:none}
  .ovx .ccol .cbar.mut{background:var(--ovx-bar-muted)}
  .ovx .ccol .cbar.heavy{background:var(--gold)}
  .ovx .ccol .cbar.cliff{background:var(--text)}
  .ovx .ccol .tag{position:absolute;left:50%;transform:translateX(-50%);font-size:12px;color:var(--ovx-ink80);white-space:nowrap;font-weight:600}
  .ovx .ccol .tag.brass{color:var(--gold)}
  .ovx .ccol .tag.quiet{color:var(--muted);font-weight:400}
  .ovx .xlab{display:flex;gap:14px;margin-top:7px}
  .ovx .xlab span{flex:1;text-align:center;font-size:12px;color:var(--dim);white-space:nowrap;min-width:0;overflow:hidden;text-overflow:ellipsis}
  .ovx .xlab span.seam{color:var(--muted)}
  .ovx .xlab span.now{color:var(--gold);font-weight:600}
  .ovx .age-fig{font-family:Georgia,serif;font-size:28px;line-height:1.3;max-width:36rem;margin-top:18px}
  .ovx .age-fig .pct{font-size:34px}
  .ovx .agebar{display:flex;height:10px;border-radius:3px;overflow:hidden;margin-top:22px;max-width:38rem;background:var(--line)}
  .ovx .agebar i{display:block;height:100%}
  .ovx .age-legend{display:flex;gap:26px;margin-top:9px;font-size:13px;color:var(--muted);max-width:38rem;flex-wrap:wrap}
  .ovx .age-legend .k{display:inline-block;width:9px;height:9px;border-radius:2px;margin-right:6px}
  .ovx .plate{padding-top:70px}
  .ovx .plate h2,.ovx .glance h2{font-family:Georgia,serif;font-weight:400;font-size:20px;margin:0 0 3px}
  .ovx .plate .psub{color:var(--dim);font-size:13px;margin-bottom:10px}
  .ovx .plate ul{list-style:none;margin:0;padding:0}
  .ovx .plate li{display:flex;gap:14px;align-items:baseline;padding:14px 0;border-top:1px solid var(--line);cursor:pointer}
  .ovx .plate li:first-child{border-top:none}
  .ovx .plate li:hover .t{color:var(--text)}
  .ovx .plate .n{font-family:Georgia,serif;font-size:22px;min-width:52px;text-align:right;line-height:1.2}
  .ovx .plate .t{color:var(--ovx-ink80);font-size:14px;line-height:1.45;min-width:0}
  .ovx .plate .t small{display:block;color:var(--dim);font-size:13px;margin-top:2px}
  .ovx .plate .t .hop{color:var(--gold);font-weight:600}
  .ovx .plate .go{margin-left:auto;color:var(--dim)}
  .ovx .glance{margin-top:54px}
  .ovx .glance .pair{display:flex;justify-content:space-between;align-items:baseline;padding:11px 0;border-top:1px solid var(--line);cursor:pointer}
  .ovx .glance .pair:first-child{border-top:none}
  .ovx .glance .pair:hover dt{color:var(--text)}
  .ovx .glance dt{color:var(--muted);font-size:14px;margin:0}
  .ovx .glance dd{font-family:Georgia,serif;font-size:18px;margin:0}
  .ovx .glance dd .held2{font-family:inherit;font-size:13px;color:var(--dim)}
  .ovx .colophon{grid-column:1/-1;margin-top:72px;padding-top:18px;border-top:1px solid var(--line);color:var(--dim);font-size:12px;line-height:1.7;max-width:52rem}
  .ovx .colophon b{color:var(--muted);font-weight:600}
  .ovx .unlock{color:var(--muted);font-size:14px;margin-top:14px;max-width:38rem}
  @media (max-width:1150px){ .ovx{grid-template-columns:1fr;gap:0} .ovx .plate{padding-top:56px}
    /* grid items default min-width:auto — one wide child inflates the 1fr track
       past the viewport and the whole page scrolls sideways; pin them down */
    .ovx>*{min-width:0;max-width:100%}
    .ovx .ovx-main{overflow-x:clip}
  }
  @media (max-width:1000px){
    /* the overview-only header rule (body.ov-page .bhead, above) out-specifies
       the general mobile single-column collapse, so on Books · Overview the
       Community control kept a phantom minmax(300px,380px) second track next
       to the (hidden) title column and a -12px top margin dragged it up into
       the header's airspace — cramped right under the tab bar. Collapse it
       like every other view at this width and drop the overhang. */
    body.ov-page .bhead{grid-template-columns:1fr;align-items:start}
    body.ov-page .bhead-controls{margin-top:0}
  }
  @media (max-width:700px){ .ovx .vitals{gap:28px} .ovx .lead .lead-h{font-size:30px} .ovx section{margin-top:56px}
    /* phone: money figures shrink instead of dragging the page sideways; the
       page body never scrolls horizontally — wide tables scroll inside .tscroll */
    .ovx .vital{min-width:0;max-width:100%}
    .ovx .vital .fig{font-size:clamp(22px,8.5vw,34px);overflow-wrap:anywhere}
    .vbrief .fig{font-size:clamp(20px,7.5vw,30px);overflow-wrap:anywhere}
    .vbrief .cap{display:block;margin-left:0;margin-top:4px}
    .bmain,.ovx{overflow-x:clip}
    .cm-facts{grid-template-columns:repeat(auto-fit,minmax(96px,1fr))}
    /* the chart's last bar (this month, "so far") centers its value tag over
       its own column — on a 390px viewport that column sits near the right
       edge, so half the (longer, " so far") label ran past the section and
       got clipped invisible by the overflow-x:clip above. Anchor it to the
       column's own right edge instead of centering it. */
    .ovx .ccol:last-child .tag{left:auto;right:0;transform:none}
  }

  /* ---- the view brief: every work view answers its question FIRST (Article
     IV) — a serif lead computed from the view's own live data, above the
     evidence table. Painted by paintBrief(); empty when nothing honest to say. */
  .vbrief{margin:8px 0 20px}
  .vbrief .fig{font-family:var(--serif);font-size:30px;line-height:1.15}
  .vbrief .fig.red{color:var(--danger)}
  .vbrief .cap{color:var(--muted);font-size:15px;margin-left:6px}
  .vbrief .note{font-family:var(--serif);font-size:16.5px;color:var(--ovx-ink80);margin-top:8px;max-width:60ch}
  .vbrief .scope{color:var(--muted);font-size:13px;line-height:1.5;margin-top:8px;max-width:64ch}
  /* RED discipline: the same-cycle split reads in calm ink, never competing
     with the aged/actionable red headline. One red statement per screen. */
  .vbrief .note .cyc-calm{color:var(--muted)}
  .vbrief .note .cyc-total{color:var(--dim)}
  .vbrief .fig.hasrcpt{cursor:help}
  .vbrief .rcpt-stale{color:var(--warn);font-size:13px;margin-top:6px;max-width:44ch;line-height:1.35}

  /* ---- statements ---- */
  .fin{padding:6px 0}
  .fin .fin-sec{padding:12px 16px 4px;font-size:13px;font-weight:600;letter-spacing:.6px;text-transform:uppercase;color:var(--muted)}
  .fin .fin-row{display:flex;justify-content:space-between;gap:16px;padding:8px 16px;border-bottom:1px solid var(--line);font-size:13.5px;cursor:pointer}
  .fin .fin-row:hover{background:var(--bg-2)}
  .fin .fin-row .fa{font-variant-numeric:tabular-nums;font-weight:640}
  .fin .fin-tot{display:flex;justify-content:space-between;gap:16px;padding:12px 16px;font-weight:600;border-top:2px solid var(--line);font-size:14px}
  /* K2 — the reconciliation that ties Vendor Spend up to the Expenses total */
  .vs-recon{margin:14px 2px 2px;padding:12px 14px;border:1px solid var(--line);border-radius:8px;background:var(--bg-2);font-size:13.5px}
  .vs-recon-h{font-weight:640;margin-bottom:6px;color:var(--muted)}
  .vs-recon-r{display:flex;justify-content:space-between;gap:16px;padding:4px 0;font-variant-numeric:tabular-nums}
  .vs-recon-r span:last-child{white-space:nowrap}
  .vs-recon-tot{border-top:1px solid var(--line);margin-top:4px;padding-top:8px}
  .fin .fin-noi{background:color-mix(in srgb,var(--brand) 8%,transparent)}
  /* internal management-fee transfer: quiet inline tag + a plain-English note */
  .fin .fin-int{display:inline-block;margin-left:8px;padding:1px 7px;border:1px solid var(--line);border-radius:10px;font-size:11px;font-weight:600;letter-spacing:.2px;text-transform:none;color:var(--muted);vertical-align:middle;cursor:help}
  .fin .fin-washnote{margin:10px 16px 0;padding:11px 14px;border-left:3px solid var(--line-2);background:var(--bg-2);border-radius:0 8px 8px 0;font-size:13px;line-height:1.55;color:var(--muted);max-width:720px}
  .stmt-note{margin:4px 16px 12px;padding:12px 16px;border-left:3px solid var(--line-2);background:var(--bg-2);border-radius:0 8px 8px 0;font-size:14px;line-height:1.6;color:var(--muted);max-width:720px}

  /* ---- owner-statement category drill (job-walk #5): a category row opens the
     transactions behind it in place, quietly — one lead, no new wall ---- */
  table.rmz tr[data-catrow]{cursor:pointer}
  table.rmz tr[data-catrow]:hover td{background:var(--bg-2)}
  .cat-chev{display:inline-block;width:.8em;color:var(--muted);transition:transform .12s ease;font-size:11px;transform:translateY(-1px)}
  tr[data-catrow][aria-expanded="true"] .cat-chev{transform:rotate(90deg) translateX(-1px)}
  tr.cat-detail>td{padding:0 0 4px !important;background:color-mix(in srgb,var(--brand) 4%,transparent)}
  .cat-txns{margin:0}
  .cat-txns .cat-inner{padding:2px 10px 8px}
  table.cat-tt{width:100%;border-collapse:collapse;font-size:13px}
  table.cat-tt th{text-align:left;color:var(--muted);font-weight:600;font-size:12px;padding:6px 10px;border-bottom:1px solid var(--line);white-space:nowrap}
  table.cat-tt th.num{text-align:right}
  table.cat-tt td{padding:6px 10px;border-bottom:1px solid var(--line);vertical-align:top;line-height:1.4}
  table.cat-tt td.num{text-align:right;font-variant-numeric:tabular-nums;white-space:nowrap}
  table.cat-tt td.memo{color:var(--muted);max-width:260px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
  table.cat-tt tr:last-child td{border-bottom:0}
  .cat-tie{display:flex;justify-content:space-between;gap:12px;align-items:baseline;padding:8px 10px 2px;font-size:12.5px;font-weight:640}
  .cat-tie .ok{color:var(--ok)}
  .cat-tie .bad{color:var(--danger)}

  /* ---- the one work table ---- */
  .tblc{background:var(--surface);border:1px solid var(--line);border-radius:16px;box-shadow:var(--shadow-sm);overflow:hidden}
  /* horizontal pan only where tables can actually overflow — an always-on
     overflow container silently kills page-level sticky headers */
  .tscroll{overflow-x:visible;max-width:100%;overscroll-behavior-x:contain;background:var(--surface)}
  /* sticky headers while scrolling long tables */
  .tblc thead th{position:sticky;top:0;z-index:1}
  table.rmz{width:100%;border-collapse:collapse;font-size:14px;background:var(--surface);color:var(--text)}
  table.rmz th{text-align:left;background:var(--surface);color:var(--muted);font-weight:600;font-size:13px;padding:12px 14px;border-bottom:1px solid var(--line-2);white-space:nowrap;cursor:pointer;user-select:none}
  table.rmz th:hover{color:var(--text)}
  table.rmz th.num{text-align:right}
  table.rmz th .ar{opacity:.9;margin-left:3px}
  table.rmz td{padding:12px 14px;border-bottom:1px solid var(--line);vertical-align:top;max-width:340px;overflow:hidden;text-overflow:ellipsis;white-space:normal;line-height:1.45;color:var(--text)}
  table.rmz tr:last-child td{border-bottom:0}
  /* RED discipline: same-cycle ("paying monthly — no action") rows carry no
     alarm — they render at calm secondary weight so the eye reserves full ink
     for aged/actionable debt. Their dollars are also kept out of the red
     headline total (briefFor). Hover still lifts them to full for working. */
  table.rmz tbody tr.row-calm td{color:var(--muted);opacity:.55}
  table.rmz tbody tr.row-calm:hover td{opacity:1}
  table.rmz tr[data-cid],table.rmz tr[data-did],table.rmz tr[data-tdid],table.rmz tr[data-gltid],table.rmz tr[data-obtxn],table.rmz tr[data-hopnav]{cursor:pointer}
  table.rmz tr[data-cid]:hover td,table.rmz tr[data-did]:hover td,table.rmz tr[data-tdid]:hover td,table.rmz tr[data-gltid]:hover td,table.rmz tr[data-obtxn]:hover td,table.rmz tr[data-hopnav]:hover td{background:var(--bg-2)}
  .col-grp table.rmz th{position:static;top:auto}
  td.num{text-align:right;font-variant-numeric:tabular-nums}
  td .bad{color:var(--danger);font-weight:640}
  .pill{display:inline-block;font-size:12.5px;font-weight:600;padding:3px 8px;border-radius:5px;border:0;background:var(--bg-2);color:var(--muted);white-space:normal}
  .pill.g{background:color-mix(in srgb,var(--ok) 14%,transparent);color:var(--ok);border-color:transparent}
  .pill.r{background:color-mix(in srgb,var(--danger) 13%,transparent);color:var(--danger);border-color:transparent}
  .pill.y{background:color-mix(in srgb,var(--gate) 16%,transparent);color:var(--gate);border-color:transparent}
  .pill.b{background:color-mix(in srgb,var(--accent) 13%,transparent);color:var(--accent);border-color:transparent}
  /* RED-DISCIPLINE age-escalation (Genius Panel debt critique, view:maintqueue):
     the SAME 48h+ rule + look Today's front door and internal:office already
     apply (office.html .queue-row.emergency-escalated / .emergency-escalated-
     badge) — one rule everywhere, not a third visual language. A 26-day-old
     emergency used to sit at identical weight as a 5-minute-old one; this row
     tint + loud badge give the age its due weight. */
  table.rmz tbody tr.mq-escalated td{background:color-mix(in srgb,var(--danger) 9%,transparent)}
  table.rmz tbody tr.mq-escalated:hover td{background:color-mix(in srgb,var(--danger) 15%,transparent)}
  .mq-esc-badge{display:flex;align-items:center;gap:9px;flex-wrap:wrap;margin-top:6px;padding:6px 9px;border-radius:7px;background:var(--danger);color:#fff;font-size:12.5px;font-weight:650}
  .mq-esc-badge a{color:#fff;text-decoration:underline}
  /* Scan-first queue (L5-1): the queue renders worst-first but only a first
     page of rows; the rest stay one tap away behind "Show more" so the whole
     open queue is never an unpaginated wall. Hidden rows keep their place in
     the sorted DOM (and in the CSV), just cost no height until revealed. */
  #vBody table.mq-rows tbody tr.mq-hidden{display:none}
  .mq-more{margin:16px 0 2px;display:flex;justify-content:center}
  .mq-more .dim{font-size:13px}
  .critical-tags{display:flex;flex-wrap:wrap;gap:4px;margin-top:8px}
  .critical-tags .pill{font-size:13px}
  /* K3 — the ‡ Trust flag: a small, calm double-dagger a human can tap to see
     WHY Trust doubts this figure. Never loud (it isn't an alarm, it's a
     provenance caveat), but always visible and always one tap from the check. */
  .tflag{color:var(--gate);font-weight:600;text-decoration:none;cursor:help;padding:0 2px;border-radius:3px}
  .tflag:hover,.tflag:focus{background:color-mix(in srgb,var(--gate) 16%,transparent);outline:none}
  table.rmz tbody tr.row-flagged td.num b{border-bottom:1.5px dotted var(--gate)}
  a.dl{color:var(--accent);text-decoration:none;font-size:13px;font-weight:640;white-space:nowrap}
  a.dl:hover{text-decoration:underline}
  /* footer / pager */
  .tfoot{display:flex;align-items:center;flex-wrap:wrap;gap:12px;padding:12px 14px;border-top:1px solid var(--line);color:var(--muted);font-size:13px}
  .tfoot .pg{margin-left:auto;display:flex;gap:8px;align-items:center}
  .tfoot button{min-height:38px;border:1px solid var(--line);background:var(--surface);color:var(--text);border-radius:var(--r-sm);padding:6px 12px;font:inherit;font-size:13px;cursor:pointer}
  .tfoot button:disabled{opacity:.4;cursor:default}
  .rfoot{display:flex;flex-wrap:wrap;gap:16px;padding:12px 14px;border-top:1px solid var(--line);color:var(--muted);font-size:13px}
  .empty{padding:48px 24px;color:var(--muted);text-align:center;font-size:14px;line-height:1.55}
  .lockp{padding:48px 24px;text-align:center;color:var(--muted);font-size:14px;line-height:1.55}
  .lockp .big{font-size:28px}

  /* ---- applications pipeline board (2026-07-21) ---- */
  .pipe-board{display:grid;grid-template-columns:repeat(5,minmax(0,1fr));gap:20px;margin-top:4px}
  .pipe-col{min-width:0}
  .pipe-head{display:flex;align-items:baseline;justify-content:space-between;gap:8px;padding-bottom:8px;border-bottom:2px solid var(--text)}
  .pipe-head h4{margin:0;font-size:14px;font-weight:650}
  .pipe-count{color:var(--muted);font-size:13px;font-variant-numeric:tabular-nums;white-space:nowrap}
  .pipe-cards{display:flex;flex-direction:column}
  .pipe-card{padding:11px 0;border-bottom:1px solid var(--line)}
  .pipe-cards .pipe-card:last-child{border-bottom:0}
  .pipe-name{font-size:14px;font-weight:640;overflow-wrap:anywhere}
  .pipe-meta{color:var(--muted);font-size:13px;margin-top:2px;line-height:1.4;overflow-wrap:anywhere}
  .pipe-age{font-size:13px;margin-top:3px;color:var(--muted)}
  .pipe-src{display:block;margin-top:4px;font-size:12px;color:var(--dim)}
  .pipe-actions{margin-top:7px;display:flex;gap:6px;flex-wrap:wrap}
  .pipe-actions .chip{min-height:30px;padding:5px 10px;font-size:12.5px}
  .pipe-empty{color:var(--muted);font-size:13px;padding:9px 0}
  /* ours-first grouping inside a column: our own live applications always sit
     above the years-old Buildium mirror, each under its own labelled band */
  .pipe-grp{display:flex;align-items:center;gap:8px;font-size:11.5px;font-weight:600;letter-spacing:.04em;text-transform:uppercase;color:var(--dim);padding:10px 0 2px}
  .pipe-grp.ours{color:var(--ok)}
  .pipe-grp .dot{width:6px;height:6px;border-radius:50%;background:currentColor;flex:0 0 auto}
  .pipe-more{color:var(--dim);font-size:12.5px;padding:8px 0 2px;font-style:italic}
  .pipe-income{font-size:13px;margin-top:3px;font-variant-numeric:tabular-nums}
  .pipe-income b{font-weight:640}
  .pipe-eyes{color:var(--dim);font-size:11.5px}
  .pipe-next{font-size:12.5px;margin-top:4px;color:var(--accent);font-weight:600}
  .pipe-age.idle{color:var(--warn);font-weight:640}
  .pipe-age.idle::before{content:"● ";font-size:10px;vertical-align:1px}
  .pipe-headline{display:flex;flex-wrap:wrap;gap:8px 18px;align-items:baseline;margin-bottom:10px}
  .pipe-headline .big{font-size:20px;font-weight:600;letter-spacing:-.01em}
  .pipe-headline .ours .big{color:var(--ok)}
  .pipe-headline .lbl{color:var(--muted);font-size:13px}
  .apphist{margin-top:4px}
  .apphist .h-row{display:flex;gap:10px;padding:6px 0;border-bottom:1px solid var(--line);font-size:13px}
  .apphist .h-row:last-child{border-bottom:0}
  .apphist .h-when{color:var(--dim);white-space:nowrap;font-variant-numeric:tabular-nums}
  @media screen and (max-width:1150px){ .pipe-board{grid-template-columns:1fr 1fr} }
  @media screen and (max-width:640px){ .pipe-board{grid-template-columns:1fr} }

  /* ---- collections: community groups ---- */
  .col-grp{border-bottom:1px solid var(--line);background:var(--surface)}
  .col-grp:last-of-type{border-bottom:0}
  .col-grp>summary{list-style:none;cursor:pointer;display:flex;align-items:center;gap:12px;min-height:58px;padding:12px 16px}
  .col-grp>summary::-webkit-details-marker{display:none}
  .col-grp>summary b{font-size:16px;font-weight:600;letter-spacing:-.01em}
  .col-grp>summary .chev{color:var(--dim);font-size:13px;transition:transform .15s}
  .col-grp>summary .pill{margin-left:0}
  .col-grp[open]>summary .chev{transform:rotate(90deg)}
  .col-bar{display:inline-flex;width:64px;height:5px;border-radius:var(--r-pill);overflow:hidden;background:var(--bg-2);margin-left:auto}
  .col-bar i{display:block;height:100%}
  .col-sub{font-size:15px;font-weight:600;font-variant-numeric:tabular-nums;min-width:92px;text-align:right}
  .col-grp table.rmz{border-top:1px solid var(--line)}
  /* compliance scan-first index — honest summary + nested lease-form taps */
  .cmp-summary{padding:16px 16px 14px;border-bottom:1px solid var(--line)}
  .cmp-sum-nums{font-size:15px;color:var(--muted)}
  .cmp-sum-nums b{font-size:30px;font-weight:600;letter-spacing:-.02em;color:var(--text);margin-right:6px}
  .cmp-sum-sub{font-size:13px;margin-top:4px}
  .cmp-sum-note{font-size:13px;margin-top:8px;line-height:1.5;max-width:70ch}
  .cmp-sum-hint{font-size:13px;margin-top:8px;font-style:italic}
  .tpl-grp{border-top:1px solid var(--line);background:var(--bg-2)}
  .tpl-grp:first-of-type{border-top:0}
  .tpl-grp>summary{list-style:none;cursor:pointer;display:flex;align-items:center;gap:10px;min-height:46px;padding:10px 16px 10px 28px}
  .tpl-grp>summary::-webkit-details-marker{display:none}
  .tpl-grp>summary b{font-size:14px;font-weight:680}
  .tpl-grp>summary .chev{color:var(--dim);font-size:12px;transition:transform .15s}
  .tpl-grp[open]>summary .chev{transform:rotate(90deg)}
  .tpl-grp>summary .col-sub{min-width:70px;font-size:13px;font-weight:640}
  .tpl-grp .cm-row{padding-left:28px}

  /* ---- record card modal (traversal: anything hoppable looks like a link) ---- */
  .cm-back{position:fixed;inset:0;background:rgba(6,12,24,.5);backdrop-filter:blur(4px);display:none;place-items:center;z-index:60;padding:20px}
  .cm-back.open{display:grid}
  .cm{background:var(--surface);border:1px solid var(--line);border-radius:var(--r-lg);box-shadow:var(--shadow-lg);width:min(720px,96vw);max-height:88vh;overflow:auto}
  .cm-head{display:flex;align-items:center;gap:12px;padding:16px 24px;border-bottom:1px solid var(--line);position:sticky;top:0;background:var(--surface)}
  .cm-head .k{font-size:13px;font-weight:600;text-transform:uppercase;letter-spacing:.5px;color:var(--brand-ink);background:var(--brand);padding:4px 10px;border-radius:var(--r-pill)}
  .cm-head b{font-size:18px;flex:1}
  .cm-x{min-height:38px;border:1px solid var(--line);background:var(--surface);color:var(--text);border-radius:var(--r-sm);padding:6px 12px;font-size:14px;cursor:pointer}
  .cm-crumb{padding:8px 24px 0;color:var(--dim);font-size:13px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
  .cm-body{padding:16px 24px}
  .cm-sec{margin:0 0 16px}
  .cm .rmz-state{border:0;background:var(--bg-2)}
  /* card sections: ONE uppercase kicker per card maximum (the lead carries
     it); working sections are calm sentence case — the 13-identical-caps
     stack was the "sections are half-assed" complaint (audit rows 2/3) */
  .cm-sec h4{margin:0 0 8px;font-size:13.5px;font-weight:640;text-transform:none;letter-spacing:0;color:var(--muted)}
  .cm-lead{font-family:var(--serif);font-weight:400;font-size:24px;line-height:1.25;margin:2px 0 2px}
  .cm-leadline{color:var(--muted);font-size:14px;margin-bottom:14px}
  .cm-leadline.bad{color:var(--danger)}
  .cm-attn{border-left:3px solid var(--danger);padding:8px 12px;margin:0 0 16px;font-size:14px;line-height:1.6}
  .cm-attn b{color:var(--danger)}
  .cm-facts{display:grid;grid-template-columns:repeat(auto-fit,minmax(110px,1fr));gap:12px}
  .cm-fact{background:var(--bg-2);border:1px solid transparent;border-radius:var(--r-sm);padding:12px}
  /* L3-6: in DARK the tile fill (--bg-2) sits only ~5 levels off the card
     surface (--surface), so transparent-bordered tiles nearly vanish. A hairline
     restores the tile boundary in dark only — light keeps its borderless calm. */
  @media (prefers-color-scheme:dark){ :root:not([data-theme="light"]) .cm-fact{border-color:var(--line)} }
  :root[data-theme="dark"] .cm-fact{border-color:var(--line)}
  .cm-fact .v{font-size:17px;font-weight:600}
  .cm-fact .l{color:var(--muted);font-size:13px;margin-top:2px}
  .cm-row{display:flex;justify-content:space-between;gap:12px;padding:8px 0;border-bottom:1px solid var(--line);font-size:14px}
  .cm-row:last-child{border-bottom:0}
  .cpy{border:0;background:none;color:var(--dim);cursor:pointer;font-size:13px;padding:2px 6px;border-radius:4px;vertical-align:middle}
  .cpy:hover{color:var(--accent);background:var(--bg-2)}
  .cm-money{font-variant-numeric:tabular-nums;font-weight:640}
  .cm-neg{color:var(--ok)}.cm-pos{color:var(--danger)}
  .cm-desc{white-space:pre-wrap;font-size:14px;line-height:1.55}
  .hop{cursor:pointer;color:var(--accent)}
  .hop:hover{text-decoration:underline}
  .cm-fact.hopf{cursor:pointer;transition:border-color .12s}
  .cm-fact.hopf:hover{border-color:var(--accent)}
  .cm-fact.hopf .v{color:var(--accent)}
  .cm-row.hopr{cursor:pointer;border-radius:6px}
  .cm-row.hopr:hover{background:var(--bg-2)}

  /* ---- product dialogs replace browser prompts for workspace preferences ---- */
  .b-dialog{width:min(560px,calc(100vw - 28px));padding:0;border:1px solid var(--line);border-radius:var(--r-lg);background:var(--surface);color:var(--text);box-shadow:var(--shadow-lg)}
  .b-dialog::backdrop{background:rgba(6,12,24,.52);backdrop-filter:blur(4px)}
  .b-dialog-head{padding:24px 24px 16px}
  .b-dialog-head h2{margin:0 0 8px;font-size:22px}
  .b-dialog-head p{margin:0;color:var(--muted);font-size:14px;line-height:1.5}
  .b-dialog-body{padding:8px 24px 24px}
  .b-dialog-input{width:100%;min-height:44px;margin-top:8px;padding:10px 12px;border:1px solid var(--line);border-radius:var(--r-md);background:var(--surface);color:var(--text);font:inherit;font-size:15px}
  .b-dialog-options{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px;margin-top:8px}
  .b-dialog-option{display:flex;align-items:center;gap:8px;min-height:42px;padding:8px 12px;border:1px solid var(--line);border-radius:var(--r-sm);font-size:14px}
  .b-dialog-option input{width:18px;height:18px;accent-color:var(--accent)}
  .b-dialog-actions{display:flex;justify-content:flex-end;gap:8px;padding:16px 24px 24px;border-top:1px solid var(--line)}
  .b-dialog-actions button{min-height:42px;padding:8px 16px;border:1px solid var(--line);border-radius:var(--r-md);background:var(--surface);color:var(--text);font:inherit;font-size:14px;font-weight:600;cursor:pointer}
  .b-dialog-actions .primary{border-color:var(--brand);background:var(--brand);color:var(--brand-ink)}

  /* ---- responsive ---- */
  @media screen and (max-width:1200px){ .tscroll{overflow-x:auto} }
  @media(max-width:1000px){
    .bwrap{display:block;padding:0 24px 76px}
    /* the rail becomes the Contents drawer */
    /* On mobile the rail becomes a floating drawer OVER the page, so it must be
       opaque again — the desktop "warm rail" made .bnav transparent, which left
       the page bleeding straight through the drawer and made it unreadable. */
    .bnav{position:fixed;z-index:55;inset:0 auto 0 0;width:min(340px,88vw);max-height:none;border-radius:0 20px 20px 0;padding:20px 16px 40px;transform:translateX(-105%);transition:transform .2s var(--ease);box-shadow:var(--shadow-lg);background:var(--surface);border-right:1px solid var(--line)}
    .bnav.open{transform:translateX(0)}
    .bnav-head{display:flex;position:sticky;top:0;z-index:2;background:var(--surface)}
    .bnav-close,.bnav-toggle{display:inline-flex}
    .bnav a{white-space:normal}
    .bmain{padding:24px 0 0}
    .bhead{grid-template-columns:1fr;gap:16px}
  }
  @media screen and (max-width:900px){
    .bhead-controls{top:56px}
    table.rmz.mobile-ledger,table.rmz.mobile-ledger tbody,table.rmz.mobile-ledger tr,table.rmz.mobile-ledger td{display:block;width:100%}
    table.rmz.mobile-ledger thead{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}
    table.rmz.mobile-ledger tr{padding:12px 14px;border-bottom:1px solid var(--line)}
    table.rmz.mobile-ledger tr:last-child{border-bottom:0}
    table.rmz.mobile-ledger td{display:grid;grid-template-columns:minmax(120px,.65fr) minmax(0,1.35fr);gap:14px;align-items:start;max-width:none;padding:6px 0;border:0;white-space:normal;overflow:visible;text-overflow:clip;text-align:left}
    table.rmz.mobile-ledger td>*:nth-child(n+2){grid-column:2}
    table.rmz.mobile-ledger td::before{content:attr(data-label);color:var(--muted);font-size:13px;font-weight:600;line-height:1.45}
    table.rmz.mobile-ledger td:empty{display:none}
    /* statement section rows become full-width group headers, not ragged strips */
    table.rmz.mobile-ledger tr.stmt-sec{padding:14px 14px 4px;border-bottom:0}
    table.rmz.mobile-ledger tr.stmt-sec th{display:block;width:100%;padding:0;border:0;white-space:normal;text-align:left}
    /* the category-drill detail row (job-walk #5) is a full-width panel, NOT a
       label:value cell — opt it out of the mobile grid so its transaction
       sub-table scrolls in its own .tscroll instead of being squeezed */
    table.rmz.mobile-ledger tr.cat-detail{padding:0;border-bottom:0}
    table.rmz.mobile-ledger tr.cat-detail td{display:block;grid-template-columns:none;gap:0;padding:0}
    table.rmz.mobile-ledger tr.cat-detail td::before{content:none}
    table.rmz.mobile-ledger tr.stmt-sec th:empty{display:none}
    /* Contact-card rows (Genius Panel #10/#20, tenants first): the tenant
       roster is a directory, not a form — one bold name, a muted
       "email · phone" subline, small trailing meta. Same cells, same order,
       same click-through to the full card; only the mobile layout changes.
       `role` on <td> (set once per view in the VIEWS table above) drives
       this — no field, sort, or permission is touched. */
    table.rmz.contact-rows tr{display:flex;flex-wrap:wrap;align-items:baseline;column-gap:8px;row-gap:2px;padding:14px 16px}
    table.rmz.contact-rows td{display:block;width:auto;max-width:100%;padding:0;grid-template-columns:none}
    table.rmz.contact-rows td::before{content:none}
    table.rmz.contact-rows td[data-role="name"]{order:1;flex:1 1 100%;font-size:15.5px;font-weight:640;color:var(--text);line-height:1.4}
    table.rmz.contact-rows td[data-role="sub"]{order:2;font-size:13.5px;color:var(--muted);line-height:1.5;overflow-wrap:anywhere}
    table.rmz.contact-rows td[data-role="sub"]:empty{display:none}
    table.rmz.contact-rows td[data-role="sub"]:not(:empty)+td[data-role="sub"]:not(:empty)::before{content:"· ";color:var(--muted)}
    table.rmz.contact-rows td[data-role="chip"]{order:3;flex:0 0 auto}
    table.rmz.contact-rows td[data-role="meta"]{order:4;flex:1 1 100%;font-size:12.5px;color:var(--muted)}
    table.rmz.contact-rows td[data-role="meta"]:not(:empty)::before{content:"Since ";color:var(--muted)}
    /* balances scan-first rows — resident · amount (line 1), unit·community · aging chip (line 2).
       Same table, same click-through to the lease card; only the phone layout changes.
       Undecorated cells (the 4 aging buckets + "what it's for") are hidden here — they live
       one tap down in the card, never dropped from the data or the desktop table. */
    table.rmz.balance-rows tbody tr{display:flex;flex-wrap:wrap;align-items:baseline;column-gap:8px;row-gap:2px;padding:11px 16px}
    table.rmz.balance-rows tbody td{display:block;width:auto;max-width:100%;padding:0;border:0;grid-template-columns:none;overflow:visible;white-space:normal;text-overflow:clip;font-size:inherit}
    table.rmz.balance-rows tbody td::before{content:none}
    table.rmz.balance-rows tbody td:not([data-role]){display:none}
    table.rmz.balance-rows tbody td[data-role="name"]{order:1;flex:1 1 auto;min-width:0;font-size:15px;font-weight:640;color:var(--text);line-height:1.3;overflow-wrap:anywhere}
    table.rmz.balance-rows tbody td[data-role="amt"]{order:2;flex:0 0 auto;margin-left:auto;text-align:right;font-size:15.5px;font-weight:600;line-height:1.3;white-space:nowrap}
    table.rmz.balance-rows tbody td[data-role="sub"]{order:3;flex:0 0 auto;font-size:12.5px;color:var(--muted);line-height:1.35;overflow-wrap:anywhere}
    table.rmz.balance-rows tbody td[data-role="sub"]:empty{display:none}
    table.rmz.balance-rows tbody td[data-role="sub"]:not(:empty)+td[data-role="sub"]:not(:empty)::before{content:"· ";color:var(--dim)}
    table.rmz.balance-rows tbody td[data-role="chip"]{order:4;flex:0 1 auto;margin-left:auto;text-align:right;line-height:1.3}
    table.rmz.balance-rows tbody td[data-role="chip"]:empty{display:none}
    /* the phone row keeps the amount inline; the aging + status pills sit at the
       end of the meta line — never grow to a full row of their own */
    table.rmz.balance-rows tbody td[data-role="chip"] .pill{font-size:11.5px}
    /* maintenance queue scan rows (L5-1): the 340px-cell table folded every
       request into a ~490px stacked block (~118,000px for the whole queue on a
       phone). The SAME rows, same worst-first order, same click-through to the
       task/lease now collapse to a compact card — severity pill + request on
       line 1, where · who on line 2, age · status on line 3, the escalation
       call-badge kept loud. Nothing is dropped from the data or the desktop
       table; role tags only matter under this query. */
    table.rmz.mq-rows tbody tr{display:flex;flex-wrap:wrap;align-items:baseline;column-gap:8px;row-gap:3px;padding:11px 16px}
    table.rmz.mq-rows tbody td{display:block;width:auto;max-width:100%;padding:0;border:0;overflow:visible;white-space:normal;text-overflow:clip;font-size:inherit}
    table.rmz.mq-rows tbody td::before{content:none}
    table.rmz.mq-rows tbody td:not([data-role]){display:none}
    table.rmz.mq-rows tbody td[data-role="pri"]{order:1;flex:0 0 auto;line-height:1.3}
    table.rmz.mq-rows tbody td[data-role="name"]{order:2;flex:1 1 auto;min-width:0;font-size:14.5px;font-weight:600;color:var(--text);line-height:1.35;overflow-wrap:anywhere}
    table.rmz.mq-rows tbody td[data-role="sub"]{order:3;flex:0 0 auto;font-size:12.5px;color:var(--muted);line-height:1.35;overflow-wrap:anywhere}
    table.rmz.mq-rows tbody td[data-role="sub"]:empty{display:none}
    table.rmz.mq-rows tbody td[data-role="sub"]:not(:empty)+td[data-role="sub"]:not(:empty)::before{content:"· ";color:var(--dim)}
    table.rmz.mq-rows tbody td[data-role="meta"]{order:4;flex:0 0 auto;font-size:12.5px;color:var(--muted);white-space:normal}
    table.rmz.mq-rows tbody td[data-role="meta"]:empty{display:none}
    table.rmz.mq-rows tbody td[data-role="meta"]:not(:empty)+td[data-role="meta"]:not(:empty)::before{content:"· ";color:var(--dim)}
    table.rmz.mq-rows tbody td[data-role="act"]{order:5;flex:0 0 auto;margin-left:auto}
    table.rmz.mq-rows tbody td[data-role="act"]:empty{display:none}
    table.rmz.mq-rows tbody td[data-role="pri"] .pill{font-size:11.5px}
    .col-grp>summary{display:grid;grid-template-columns:auto minmax(0,1fr) auto;align-items:center;gap:8px 12px}
    .col-grp>summary .chev{grid-column:1}
    .col-grp>summary b{grid-column:2;min-width:0}
    .col-grp>summary .pill{grid-column:3;justify-self:end}
    .col-grp>summary .col-sub{grid-column:2 / -1;min-width:0;text-align:left;font-size:13px;line-height:1.45}
    .col-grp>summary .col-bar{display:none}
  }
  @media screen and (max-width:700px){
    .bwrap{padding:0 16px 68px}
    .bmain{padding-top:16px}
    .bhead{gap:16px;padding-bottom:16px}
    .bhead h1{font-size:28px}
    #propScope{min-width:0}
    .btools{align-items:stretch}
    .tg-find{flex-basis:100%;max-width:none}
    .tg-spacer{display:none}
    .fgrp{width:100%;flex-wrap:wrap}
    .pulse{grid-template-columns:repeat(2,minmax(0,1fr))}
    .pulse .p{min-height:78px}
    .col-grp>summary{padding:12px}
    table.rmz.mobile-ledger tr{padding:16px 14px}
    table.rmz.mobile-ledger td{grid-template-columns:minmax(112px,.72fr) minmax(0,1.28fr);gap:12px;padding:8px 0;font-size:15px}
    table.rmz.mobile-ledger td::before{font-size:13px;font-weight:600}
    .b-dialog-options{grid-template-columns:1fr}
    .cm-back{padding:0;align-items:end}
    .cm{width:100%;max-height:92vh;border-radius:20px 20px 0 0}
    .cm-head,.cm-body{padding-left:16px;padding-right:16px}
    .cm-crumb{padding-left:16px;padding-right:16px}
  }

  /* ---- crossref findings ledger ("what the sweep noticed") — one hairline
     row per finding, arithmetic behind a details toggle, three quiet verdict
     actions that post in place. Section heads reuse the serif h2 the
     buildiumsettings view established; the page's one lead lives in the
     shared #vBrief slot, not here. ---- */
  .xr-sec{margin:0 0 8px}
  .xr-rows{border-top:1px solid var(--line)}
  .xr-row{padding:14px 0;border-bottom:1px solid var(--line);font-variant-numeric:tabular-nums}
  .xr-d summary{cursor:pointer;list-style:none;font-size:14.5px;font-weight:600;color:var(--text);line-height:1.45}
  .xr-d summary::-webkit-details-marker{display:none}
  .xr-d summary::before{content:"▸";display:inline-block;width:14px;color:var(--muted);font-size:11px}
  .xr-d[open] summary::before{content:"▾"}
  .xr-math{margin:10px 0 0 14px;padding:10px 14px;background:var(--bg-2);border-radius:var(--r-sm)}
  .xr-math ul{margin:0;padding-left:16px;font-size:13.5px;color:var(--muted);line-height:1.65}
  .xr-math li{margin:0 0 4px}
  .xr-math li:last-child{margin-bottom:0}
  .xr-actions{margin:10px 0 0 14px;display:flex;gap:8px;flex-wrap:wrap;align-items:center;min-height:20px}
  .xr-act{display:inline-flex;align-items:center;background:var(--surface);border:1px solid var(--line);border-radius:999px;padding:5px 12px;font:inherit;font-size:12.5px;font-weight:620;color:var(--muted);cursor:pointer;white-space:nowrap;transition:background .12s,border-color .12s,color .12s}
  .xr-act:hover{background:var(--bg-2);border-color:var(--accent);color:var(--text)}
  .xr-act:focus-visible{outline:2px solid var(--accent);outline-offset:2px}
  .xr-act[data-xr-act="real"]:hover{border-color:var(--danger);color:var(--danger)}
  .xr-act[data-xr-act="known"]:hover,.xr-act[data-xr-act="not-real"]:hover{border-color:var(--ok);color:var(--ok)}
  .xr-done{margin-top:12px}
  .xr-done summary{cursor:pointer;list-style:none;font-size:13px;color:var(--muted)}
  .xr-done summary::-webkit-details-marker{display:none}
  .xr-donelist{margin:10px 0 0;padding:0;list-style:none}
  .xr-donelist li{display:flex;justify-content:space-between;align-items:baseline;gap:16px;padding:8px 0;border-top:1px solid var(--line);font-size:13.5px;color:var(--muted);font-variant-numeric:tabular-nums}
  .xr-donelist li:first-child{border-top:0}
  .xr-clear{padding-top:4px}
  /* a deep-link from Ctrl-K landed here — one brass touch, the house's "look
     here" signal (Article III.3), removed after arrival; no loop, no pulse */
  .xr-row.xr-arrived{background:color-mix(in srgb,var(--accent) 10%,transparent);margin:0 -14px;padding-left:14px;padding-right:14px;border-radius:var(--r-sm)}

  /* ---- make-ready PULL-LINE (Lane 1): each empty home is one card on a
     visible line from move-out to leased. A card is an interactive unit — the
     one box exemption Article II.4 allows. Silence is default; brass marks the
     one next action; red lives only in the lead. ---- */
  /* a card IS the box here — strip the report's outer .tblc frame so the two
     don't nest (Article II.4). The pull-line sits straight on the warm canvas. */
  body.mr-page .tblc{background:transparent;border:0;box-shadow:none;border-radius:0;overflow:visible}
  body.mr-page #vFoot{padding-left:0;padding-right:0}
  .mrl-lead{margin:8px 0 6px;font-family:var(--serif);font-weight:400;font-size:31px;line-height:1.12;color:var(--text)}
  .mrl-sub{margin:0 0 4px;font-size:14.5px;line-height:1.5;color:var(--muted);max-width:74ch}
  .mrl-sub .risk{color:var(--danger)}
  .mrl-sub b{font-weight:600;color:var(--text)}
  .mrl-divider{display:flex;align-items:baseline;gap:12px;margin:32px 0 12px;color:var(--muted);font-size:13px}
  .mrl-divider::after{content:"";flex:1;height:1px;background:var(--line)}
  .mrl-list{display:flex;flex-direction:column;gap:12px;margin-top:16px}
  .mrl-card{background:var(--surface);border:1px solid var(--line);border-radius:var(--r-md);box-shadow:var(--shadow-sm);padding:14px 16px;transition:border-color .15s}
  .mrl-card:hover{border-color:var(--accent)}
  .mrl-card.done{opacity:.82}
  .mrl-top{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:16px 20px;align-items:start}
  .mrl-who{min-width:0}
  .mrl-unit{font-size:16px;font-weight:600;color:var(--text)}
  .mrl-comm{color:var(--muted);font-size:13.5px;margin-top:1px}
  .mrl-money{text-align:right;font-variant-numeric:tabular-nums;white-space:nowrap}
  .mrl-money .big{font-size:20px;font-weight:600;color:var(--text)}
  .mrl-money .rate{color:var(--muted);font-size:13px;margin-top:2px}
  .mrl-money .rate.dimq{color:var(--dim)}
  /* the stage rail: one segmented bar per card (a single visual, not pills) */
  .mrl-rail{display:flex;align-items:center;gap:14px;margin:12px 0 2px;flex-wrap:wrap}
  .mrl-seg{display:flex;gap:4px}
  .mrl-seg i{width:26px;height:5px;border-radius:3px;background:var(--line-2)}
  .mrl-seg i.on{background:var(--muted)}
  .mrl-seg i.cur{background:var(--gold)}
  .mrl-stage{font-size:13.5px;color:var(--text)}
  .mrl-stage .none{color:var(--dim)}
  .mrl-src{color:var(--dim);font-size:12px}
  .mrl-facts{margin-top:10px;color:var(--muted);font-size:13px;line-height:1.5}
  .mrl-facts .sep{color:var(--line-2);margin:0 7px}
  .mrl-facts .stuck{color:var(--gold);font-weight:600}
  .mrl-facts .arr{color:var(--ok)}
  .mrl-act{display:flex;align-items:center;justify-content:space-between;gap:16px;margin-top:12px;padding-top:11px;border-top:1px solid var(--line)}
  .mrl-next{font-size:13.5px;color:var(--gold);font-weight:600}
  .mrl-next .lab{color:var(--muted);font-weight:400}
  .mrl-log{flex:none}
  .mrl-strip{margin-top:12px}
  .mrl-strip .row{display:flex;gap:10px;flex-wrap:wrap;align-items:end}
  .mrl-strip label{font-size:13px;color:var(--muted);display:flex;flex-direction:column;gap:5px}
  .mrl-strip select,.mrl-strip input{min-height:38px;padding:7px 10px;font:inherit;font-size:14px;border:1px solid var(--line);border-radius:var(--r-sm);background:var(--surface);color:var(--text)}
  .mrl-strip .note{flex:1;min-width:180px}
  .mrl-strip .msg{font-size:13px;color:var(--muted);margin-top:8px}
  .mrl-hist{margin-top:10px;font-size:12.5px;color:var(--dim);line-height:1.5}
  .mrl-hist b{font-weight:600;color:var(--muted)}
  @media(max-width:640px){
    .mrl-top{grid-template-columns:1fr}
    .mrl-money{text-align:left}
    .mrl-act{flex-direction:column;align-items:stretch}
  }

  /* ---- print: deliberate paper CSS, LAST so it always wins the cascade
     (the old waves had silently overridden half of it) — words + numbers,
     no interactive chrome ---- */
  @media print{
    @page{size:landscape;margin:.45in}
    .bnav,.rmz-top,.bhead,.bnav-backdrop,.b-dialog,.btools,#propScope,.bexport,.chip,.tfoot .pg,.col-bar,.xr-actions{display:none !important}
    body{background:#fff;color:#000}
    .bwrap{display:block;max-width:none;padding:0}
    .bmain{width:100%;padding:0}
    .print-head{display:flex;justify-content:space-between;gap:20px;margin:0 0 16px;padding:0 0 12px;border-bottom:2px solid #111;font-size:11pt}
    .cover,.unaudited{border-color:#999;background:#f5f5f5}
    .trend .bars,.ov .kpi{break-inside:avoid}
    tr{page-break-inside:avoid}
    .tblc{border:0;border-radius:0;box-shadow:none;overflow:visible}
    .tscroll{overflow:visible;background:#fff}
    table.rmz{font-size:9pt;background:#fff;color:#000}
    table.rmz thead{display:table-header-group}
    table.rmz th{position:static;padding:6px 8px;font-size:8pt;color:#222;background:#fff;border-bottom:1.5px solid #111}
    table.rmz td{padding:4px 6px;white-space:normal;color:#000;font-size:8.5pt}
    .rfoot,.tfoot{padding:10px 0;border-top:1.5px solid #111;color:#222}
    .stmt-note{background:none;color:#333}
  }

/* contents page: groups show three doors, the rest fold */
.ix-more{background:none;border:0;padding:6px 0 0;font:inherit;font-size:13.5px;color:var(--accent);cursor:pointer;display:block}
