/* aboo brand layer over tina4css — admin PWA shell, mobile-first.
   tina4css provides btn/card/badge/grid/forms; this adds the app frame + brand tokens. */
/* Brand tokens mapped from the canonical aboo palette (brand/aboo-colors.css).
   --aboo-accent / --aboo-bg / --aboo-fg flip with [data-theme]; we layer surfaces on top. */
:root{
  --brand: var(--aboo-accent);   /* teal #19C4C4 light / #2AE0E0 dark */
  --brand-ink: var(--aboo-ink);  /* #0E2E33 deep teal — drawer, code chips */
  --bg: var(--aboo-bg);          /* #EAF3F2 mist (light) / #0E2E33 (dark) */
  --ink: var(--aboo-fg);         /* text */
  --surface:#ffffff; --muted:#2E575E; --line:#d3e6e4;
  --ok:#15803d; --bad:#b91c1c; --warn:#b45309; --info:#0e7490;
  /* v2 layout metrics (sleek.css): 8px radius, 12px cards; tenant sidebar is 200px (t-shell) */
  --drawer-w:248px; --bar-h:58px; --radius:8px; --radius-lg:12px;
  --brand-faint:rgba(25,196,196,.12); --brand-fainter:rgba(25,196,196,.05);
  --shadow:0 1px 3px rgba(0,0,0,.1); --shadow-lg:0 4px 12px rgba(0,0,0,.1);
  /* mobile bottom nav: bar height, and the padding pages need so content clears it (+ the
     iPhone home-indicator inset, available because index.html sets viewport-fit=cover) */
  --bottom-nav-h:56px; --bottom-nav-space:calc(var(--bottom-nav-h) + env(safe-area-inset-bottom,0px));
}
/* aboo-colors.css lists `:root` in the LIGHT selector after the dark block (equal specificity →
   :root wins), so --aboo-bg/fg/accent never flip. Re-assert the dark values at higher specificity. */
:root[data-theme="dark"]{
  /* depth: drawer (darkest) < content bg < elevated surfaces (cards/app-bar) */
  --bg:#0c2429; --ink:#EAF3F2; --surface:#15414A; --muted:#8fb1b0; --line:#2E575E;
  --brand: var(--aboo-teal-bright);   /* #2AE0E0 bright teal in dark */
}
:root[data-theme="dark"] .drawer{ background:#081e22; }
:root[data-theme="dark"] .form-control{ background:#0c2429; color:var(--ink); border-color:var(--line); }
:root[data-theme="dark"] .form-control::placeholder{ color:#6f9694; }
:root[data-theme="dark"] .cat-code,
:root[data-theme="dark"] .iso-badge{ background:#081e22; color:var(--aboo-teal-bright); }
:root[data-theme="dark"] .row-card:hover,
:root[data-theme="dark"] .kpi{ box-shadow:0 1px 2px rgba(0,0,0,.3); }
*{box-sizing:border-box}
html,body{margin:0;height:100%}
/* v2 typography: the system stack at 16px/1.5 (sleek.css body) — Sora retired */
body{background:var(--bg);color:var(--ink);
  font:16px/1.5 -apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,sans-serif;-webkit-font-smoothing:antialiased}
#app{height:100%}
a{color:var(--brand);text-decoration:none}

/* ---------- brand lockup ---------- */
.brand-lockup{display:flex;align-items:center;gap:8px;font-weight:800;letter-spacing:-.01em}
.brand-dot{width:14px;height:14px;border-radius:50%;background:var(--brand);box-shadow:0 0 0 4px rgba(25,196,196,.25)}
.brand-name{font-size:20px}
.brand-sub{font-size:12px;font-weight:700;text-transform:uppercase;letter-spacing:.12em;opacity:.6;margin-left:2px}

/* ---------- layout ---------- */
.layout{min-height:100%}
.drawer{position:fixed;top:0;left:0;width:var(--drawer-w);height:100%;background:var(--brand-ink);
  color:#cfe9e8;display:flex;flex-direction:column;z-index:40;transition:transform .22s ease;overflow-y:auto}
.drawer-brand{padding:16px 18px;color:#fff;border-bottom:1px solid rgba(255,255,255,.08)}
.nav-list{padding:10px 10px 24px}
.nav-section{font-size:12px;text-transform:uppercase;letter-spacing:.12em;color:#7fb1ad;
  padding:14px 12px 6px;font-weight:700}
.nav-item{display:flex;align-items:center;gap:11px;padding:10px 12px;border-radius:10px;color:#cfe9e8;
  cursor:pointer;font-weight:500;user-select:none}
.nav-item:hover{background:rgba(255,255,255,.06);color:#fff}
.nav-item.active{background:var(--brand);color:var(--aboo-ink);font-weight:600}
.nav-item.soon{opacity:.45;cursor:default}
.nav-item.soon:hover{background:none;color:#cfe9e8}
.nav-ico{width:20px;text-align:center;font-size:15px;opacity:.9}
/* The Reports "∑" reads optically high beside its label — the glyph has no descender like the "p"
   in "Reports", so align-items:center (which aligns ink centres) leaves the title looking a touch
   high. Owner-chosen: nudge the LABEL down 2px (not the icon) so "Reports" sits in the middle of
   the ∑. Scoped to Reports only, via the adjacent sibling of its per-key icon class. */
.nav-ico-reports + .nav-lbl{position:relative;top:2px}
.nav-lbl{flex:1}
.soon-badge{font-size:12px;opacity:.8}

.main{margin-left:var(--drawer-w);min-height:100%;display:flex;flex-direction:column}
.app-bar{position:sticky;top:0;height:var(--bar-h);background:var(--surface);border-bottom:1px solid var(--line);
  display:flex;align-items:center;gap:12px;padding:0 16px;z-index:30}
.app-title-wrap{display:flex;flex-direction:column;line-height:1.1}
.app-company{font-weight:700;font-size:15px;color:var(--ink);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:38ch}
.app-title{font-weight:500;font-size:12px;color:var(--muted);text-transform:uppercase;letter-spacing:.04em}
.app-user{display:flex;align-items:center;gap:10px;margin-left:auto}
.user-name{font-size:13px;color:var(--muted);max-width:140px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
/* Admin/Member role badge next to the signed-in name (owner 2026-09-10 — "tells you if you are an
   admin or normal user"). Sits on the header band; admin = brand pill, member = subtle neutral. */
.role-badge{display:inline-flex;align-items:center;font-size:12px;font-weight:700;letter-spacing:.03em;text-transform:uppercase;padding:1px 7px;border-radius:999px;line-height:1.3;white-space:nowrap;flex:0 0 auto}
.role-admin{background:var(--brand);color:#fff}
/* Owner badge: a fixed amber pill (Andre 2026-09-14 — the old var(--ink) was near-black in light
   and white-on-white in DARK, unreadable). Amber-700 + white reads on both themes, distinct from
   the teal admin badge. */
.role-owner{background:#b45309;color:#fff}
.role-member{background:rgba(120,140,140,.22);color:var(--muted)}
/* tenant header: global "+ New" create menu + Approvals/Expenses notification shortcuts */
.t-newmenu-wrap{position:relative;display:inline-flex}
.t-new-btn{display:inline-flex;align-items:center;gap:5px;background:var(--brand);color:var(--aboo-ink,#04312e);
  border:0;border-radius:9px;padding:6px 12px;font-size:13px;font-weight:700;cursor:pointer;white-space:nowrap;line-height:1.2}
.t-new-btn:hover{filter:brightness(1.06)}
.t-new-caret{font-size:12px;opacity:.85}
.t-menu-backdrop{position:fixed;inset:0;z-index:60}
.t-newmenu-pop{position:absolute;top:calc(100% + 6px);left:0;z-index:61;min-width:196px;
  background:var(--surface,#fff);border:1px solid var(--line,#ddd);border-radius:10px;
  box-shadow:0 10px 30px rgba(0,0,0,.18);padding:6px;display:flex;flex-direction:column}
.t-newmenu-cap{font-size:12px;text-transform:uppercase;letter-spacing:.04em;color:var(--muted,#777);font-weight:700;padding:7px 10px 2px}
.t-newmenu-item{text-align:left;background:none;border:0;border-radius:6px;padding:8px 10px;font-size:13px;color:var(--ink);cursor:pointer;width:100%}
.t-newmenu-item:hover{background:var(--brand-faint,rgba(25,196,196,.12))}
.t-notif{position:relative;appearance:none;border:1px solid var(--line);background:var(--surface);color:var(--ink);
  border-radius:9px;padding:5px 9px;cursor:pointer;font-size:15px;line-height:1}
.t-notif:hover{border-color:var(--muted,#999)}
.t-notif-badge{position:absolute;top:-7px;right:-7px;background:var(--bad,#dc2626);color:#fff;
  font-size:12px;font-weight:800;min-width:18px;height:18px;line-height:18px;border-radius:9px;padding:0 4px;text-align:center}
.nav-badge{margin-left:auto;background:var(--bad,#dc2626);color:#fff;font-size:12px;font-weight:800;
  min-width:19px;height:19px;line-height:19px;border-radius:10px;padding:0 5px;text-align:center}
.nav-item.active .nav-badge{background:#fff;color:var(--bad,#dc2626)}
/* NOTE: the app-bar hamburger is gone. On mobile the menu is the bottom bar (its "More" tab opens
   this drawer); on desktop the drawer is always visible. Nothing left for a top-left ☰ to do. */
.content{padding:18px 16px 64px;flex:1}
.scrim{display:none;position:fixed;inset:0;background:rgba(15,23,42,.45);z-index:35}

/* mobile */
@media (max-width:767px){
  .drawer{transform:translateX(-100%)}
  .layout.nav-open .drawer{transform:translateX(0)}
  .layout.nav-open .scrim{display:block}
  .main{margin-left:0}
  .cb-summary{flex-wrap:wrap;gap:8px;position:static}
  .cb-summary-staged{flex-wrap:wrap;gap:8px}
}

/* ---------- page ---------- */
.page{max-width:920px;margin:0 auto}
.page-head{margin:2px 0 16px}
/* keep the title + "+ Add" action in reach while scrolling long grids (#9) */
.page-head.with-action{display:flex;align-items:flex-start;justify-content:space-between;gap:12px;
  position:sticky;top:var(--bar-h);z-index:20;background:var(--bg);padding:10px 0;margin:0 0 12px}
.page-title{font-size:22px;margin:0 0 2px}
.page-sub{color:var(--muted);font-size:13px;display:flex;align-items:center;gap:8px}
.muted-block{color:var(--muted);text-align:center;padding:42px 0}
.count-line{font-size:12px;color:var(--muted);margin:0 2px 10px}
.toolbar{display:flex;gap:8px;margin:6px 0 12px;flex-wrap:wrap}
.toolbar .form-control{flex:1 1 200px}
.per-select{flex:0 0 130px;max-width:140px}

/* ---------- list pager (Prev · page numbers · Next · range) — top & bottom of lists ---------- */
.pager{display:flex;align-items:center;justify-content:center;gap:6px;flex-wrap:wrap;margin:12px 2px}
.pager-hidden{display:none}
.pager-info{font-size:12.5px;color:var(--muted);margin-left:6px}
.pager-btn{background:var(--surface);color:var(--brand);border:1px solid var(--line);
  border-radius:var(--radius);padding:7px 14px;font-weight:600;cursor:pointer}
.pager-btn:hover:not(:disabled){background:var(--brand);color:#fff;border-color:var(--brand)}
.pager-btn:disabled{opacity:.4;cursor:not-allowed;color:var(--muted);background:var(--surface)}
.pager-num{min-width:36px;text-align:center;background:var(--surface);color:var(--ink);
  border:1px solid var(--line);border-radius:var(--radius);padding:7px 10px;font-weight:600;cursor:pointer}
.pager-num:hover{border-color:var(--brand);color:var(--brand)}
.pager-num.active{background:var(--brand);color:#fff;border-color:var(--brand);cursor:default}
.pager-gap{color:var(--muted);padding:0 2px;user-select:none}

/* ---------- KPI dashboard ---------- */
.kpi-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:12px}
.kpi{border:1px solid var(--line);border-radius:var(--radius);background:var(--surface);
  border-left:4px solid var(--line);box-shadow:0 1px 2px rgba(15,23,42,.04)}
.kpi .card-body{padding:14px 16px}
.kpi-label{font-size:12.5px;color:var(--muted);font-weight:600}
.kpi-val{font-size:30px;font-weight:800;line-height:1.1;margin:6px 0 4px;letter-spacing:-.02em}
.kpi-sub{font-size:12.5px;color:var(--muted)}
.kpi-sub.pending{color:var(--warn)}
.kpi.accent-primary{border-left-color:var(--brand)}
.kpi.accent-success{border-left-color:var(--ok)}
.kpi.accent-danger{border-left-color:var(--bad)}
.kpi.accent-info{border-left-color:var(--info)}
.kpi.accent-dark{border-left-color:var(--brand-ink)}

/* ---------- ledger categories ---------- */
.cat-root{margin:0 0 16px}
.cat-root-head{display:flex;align-items:baseline;gap:8px;padding:0 2px 7px}
.cat-root-head h2{font-size:14px;margin:0;text-transform:uppercase;letter-spacing:.05em}
.cat-stmt{font-size:12.5px;color:var(--muted)}
.cat-cards{display:flex;flex-direction:column;gap:8px}
.cat-card{display:flex;align-items:center;gap:12px;background:var(--surface);border:1px solid var(--line);
  border-radius:var(--radius);padding:11px 14px}
.cat-code{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-weight:700;font-size:12.5px;
  background:var(--brand-ink);color:#fff;padding:3px 8px;border-radius:8px;min-width:48px;text-align:center}
.cat-name{flex:1;font-weight:600}
.cat-edit{padding:2px 9px;line-height:1.4}

/* ---------- list rows (clickable) ---------- */
.row-list{display:flex;flex-direction:column;gap:8px}
.row-card.inactive{opacity:.55}
.row-card.is-root{cursor:default;border-left:3px solid var(--brand)}
.trans-key{flex:0 0 auto;max-width:42%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
  font-family:SFMono-Regular,Menlo,monospace;font-size:12px;color:var(--brand);
  background:var(--bg);border:1px solid var(--line);padding:3px 9px;border-radius:7px}
.row-card{display:flex;align-items:center;gap:12px;background:var(--surface);border:1px solid var(--line);
  border-radius:var(--radius);padding:12px 14px;cursor:pointer;transition:border-color .12s,box-shadow .12s}
.row-card:hover{border-color:var(--brand);box-shadow:0 2px 10px rgba(79,70,229,.12)}
.iso-badge{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-weight:700;font-size:12px;
  background:var(--brand-ink);color:#fff;padding:4px 9px;border-radius:8px;min-width:42px;text-align:center}
.row-main{flex:1;display:flex;flex-direction:column;min-width:0}
.row-main b{font-weight:600}
.row-sub{font-size:12px;color:var(--muted)}
.row-chevron{color:var(--muted);font-size:22px;line-height:1}
/* billing status pill on a company row (green = active, per the colour convention) */
.row-status{font-size:12px;font-weight:600;padding:4px 10px;border-radius:999px;white-space:nowrap}
.row-status.ok{background:color-mix(in srgb,#16a34a 16%,transparent);color:#16a34a}

/* ---------- DEMO badge ----------
   The demo company is a sandbox. Everything it produces must be impossible to mistake for the real
   thing, so the badge is deliberately LOUD and does not reuse .row-status / .badge (both of which
   read as ordinary metadata): amber, uppercase, letter-spaced, with a solid border. Amber is the
   convention's "V" colour — attention, not error. */
.demo-badge{display:inline-flex;align-items:center;gap:5px;flex:0 0 auto;
  font-size:12px;font-weight:800;letter-spacing:.09em;text-transform:uppercase;white-space:nowrap;
  padding:3px 9px;border-radius:6px;line-height:1.4;
  color:#92400e;background:color-mix(in srgb,#f59e0b 26%,transparent);border:1px solid #f59e0b;
  /* align-self, not just flex, because .row-main is a COLUMN flex container: `flex:0 0 auto`
     governs the main (vertical) axis there, and the default `align-items:stretch` then blew the
     badge out to the full row width. Measured at 375px before this line: 313px wide. */
  align-self:flex-start}
:root[data-theme="dark"] .demo-badge{color:#fde68a;background:color-mix(in srgb,#f59e0b 22%,transparent)}
/* in the app bar (a ROW flex) it sits beside the title and should stay vertically centred */
.app-bar .demo-badge{margin-left:10px;align-self:center}
/* on a row card it sits on the name's line, not under it */
.row-main > b + .demo-badge{margin:3px 0 1px}
.demo-note{font-size:12px;color:var(--muted);line-height:1.35}

/* dashboard quick links (#2) */
.quick-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(240px,1fr));gap:10px;margin:0 0 20px}
.quick-card{display:flex;align-items:center;gap:12px;text-align:left;background:var(--surface);
  border:1px solid var(--line);border-radius:var(--radius);padding:14px;cursor:pointer;
  transition:border-color .12s,box-shadow .12s}
.quick-card:hover{border-color:var(--brand);box-shadow:0 2px 10px rgba(79,70,229,.12)}
.quick-ico{font-size:20px;color:var(--brand);line-height:1}
.quick-text{flex:1;display:flex;flex-direction:column;min-width:0}
.quick-sub{font-size:12px;color:var(--muted)}

/* flash the just-added / just-edited row so the user sees where it went */
@keyframes rowflash{0%{background:rgba(56,178,172,.28)}100%{background:transparent}}
.row-card.row-hl,.cat-card.row-hl,.tier.row-hl{animation:rowflash 1.8s ease-out}
/* pane switch (e.g. Debtors ↔ Creditors) — a quick fade-rise on the fresh pane */
@keyframes pane-in{from{opacity:0;transform:translateY(6px)}to{opacity:1;transform:none}}
.pane-in{animation:pane-in .22s ease}
@media (prefers-reduced-motion: reduce){.pane-in{animation:none}}

/* inline delete (no window.confirm) — ONE small trash icon; in-place "Delete? Yes/No" when armed. */
.btn-row-del{appearance:none;border:1px solid transparent;background:none;cursor:pointer;line-height:1;
  display:inline-flex;align-items:center;justify-content:center;width:28px;height:28px;padding:0;border-radius:7px;
  font-size:14px;color:var(--muted);transition:color .12s,background .12s,border-color .12s}
.btn-row-del .del-ico{font-size:14px;filter:none;display:inline-flex;align-items:center}
.btn-row-del .del-lbl{display:none}
.btn-row-del:hover{color:var(--bad);border-color:var(--bad);background:rgba(185,28,28,.10)}

/* ── Andre "basics": figures tabular + right-aligned, app-wide ─────────────────
   tabular-nums is harmless on non-digits, so apply it broadly; the right-align
   utilities are additive (screens already right-align via scoped rules — these just
   make .num/.text-right/.ta-r/td.r work everywhere, so no numeric column is missed). */
body,input,select,textarea,button,table,.dash-kpi-val{font-variant-numeric:tabular-nums}
.text-right,.ta-r,.num,.money,.currency{text-align:right}
td.text-right,th.text-right,td.ta-r,th.ta-r,td.num,th.num,td.r,th.r,td.money,th.money,td.currency,th.currency{text-align:right}
.num,.money,.currency{font-variant-numeric:tabular-nums;white-space:nowrap}
/* Owner (2026-09-17): every price / currency INPUT is right-aligned by default so the
   decimal point stays under the column heading — same rule for a bare <input type="number">
   and for an inputmode="decimal" text input. Explicit .text-left on the field opts out on
   the rare non-money numeric input (e.g. a page count). */
input[type="number"],input[inputmode="decimal"],input[inputmode="numeric"].money-in{text-align:right}
input.text-left{text-align:left}
.btn-row-del:hover .del-ico{filter:none}
.confirm-inline{display:inline-flex;align-items:center;gap:7px}
.confirm-q{font-size:13px;font-weight:600;color:var(--bad)}
/* delete blocked → show why, inline on the row (#34) */
.confirm-err{flex-wrap:wrap;max-width:320px;text-align:right}
.confirm-errmsg{font-size:12px;color:var(--bad);line-height:1.35}
/* blocked-delete message shown beside the name so the row's action buttons stay put */
.row-err{flex:1 1 auto;min-width:120px;font-size:12px;color:var(--bad);line-height:1.35}
.row-card.row-blocked .row-main{flex:0 0 auto}
/* required-field validation highlight (#10) */
.form-control.is-invalid{border-color:var(--bad)}
.form-control.is-invalid:focus{border-color:var(--bad);box-shadow:0 0 0 3px rgba(185,28,28,.15)}
.field-required{color:var(--bad);font-size:12px;margin:-4px 0 8px}
/* forgot-password link under the login password field */
.login-forgot{text-align:right;font-size:13px}
.login-forgot a{color:var(--brand);cursor:pointer}
/* email templates (per-country) */
.tpl-card{cursor:pointer}
.tpl-vars{display:flex;flex-wrap:wrap;align-items:center;gap:6px;margin:0 0 6px}
.tpl-vars-lbl{font-size:12px;color:var(--muted)}
.tpl-var{appearance:none;border:1px solid var(--line);background:var(--bg,#f8fafc);color:var(--ink);
  font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:12px;padding:2px 8px;
  border-radius:6px;cursor:pointer}
.tpl-var:hover{border-color:var(--brand);color:var(--brand)}
.tpl-body{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:12.5px;line-height:1.5}
.tpl-preview-head{display:flex;align-items:center;gap:12px;margin:2px 0 6px}
.tpl-preview-wrap{border:1px solid var(--line);border-radius:10px;overflow:hidden;margin:0 0 10px}
.tpl-preview{width:100%;height:280px;border:0;background:#eef2f3;display:block}
.btn-danger-text{color:var(--bad);border-color:var(--bad)}
/* tenant home / onboarding (no admin drawer) */
.tenant-main{margin-left:0}
/* Tenant drawer company context (v2 left-nav header: back-to-companies + company name) */
.drawer-co{padding:10px 14px 6px;border-bottom:1px solid rgba(255,255,255,.08)}
.drawer-back{background:none;border:none;color:#cfe9e8;font-size:12.5px;font-weight:600;cursor:pointer;padding:2px 0}
.drawer-back:hover{color:#fff}
.drawer-co-name{color:#fff;font-weight:700;font-size:14px;margin-top:2px;line-height:1.25}
.onboard-wrap{max-width:520px;margin:32px auto;padding:0 16px}
.onboard-card{width:100%}
.onboard-title{font-size:22px;font-weight:800;margin:0 0 4px}
.onboard-page{max-width:720px;margin:0 auto}
/* regime reporting-fields editor rows */
.rg-field-row{display:flex;gap:8px;align-items:center;margin-bottom:8px}
.rg-field-row .form-control{flex:1;margin:0}
/* idle auto-logout warning (#1) */
.idle-overlay{z-index:1200}
.idle-card{max-width:400px}
.idle-msg{margin:4px 0 16px;color:var(--ink);line-height:1.5}
.btn-confirm-yes,.btn-confirm-no{appearance:none;border:1px solid var(--line);border-radius:8px;
  padding:4px 12px;font-size:13px;font-weight:600;cursor:pointer;background:var(--surface);color:var(--ink)}
.btn-confirm-yes{background:var(--bad);border-color:var(--bad);color:#fff;min-width:44px}
.btn-confirm-yes:hover{filter:brightness(.93)}
.btn-confirm-yes:disabled{opacity:.6;cursor:default}
.btn-confirm-no:hover{border-color:var(--muted)}
/* Journal post is a positive action, not a destructive delete — its confirm strip is GREEN, not the shared red (Andre 2026-09-17) */
.confirm-inline.confirm-go .confirm-q{color:var(--ok)}
.confirm-inline.confirm-go .btn-confirm-yes{background:var(--ok);border-color:var(--ok)}

/* ---------- detail: back link, tabs, fields ---------- */
.back-link{display:inline-block;color:var(--muted);font-size:13px;cursor:pointer;margin:0 0 6px}
.back-link:hover{color:var(--brand)}
.tabbar{display:flex;gap:4px;border-bottom:1px solid var(--line);margin:4px 0 16px;overflow-x:auto}
.tab{appearance:none;background:none;border:none;border-bottom:2px solid transparent;color:var(--muted);
  font-size:14px;font-weight:600;padding:9px 12px;cursor:pointer;white-space:nowrap}
.tab:hover{color:var(--ink)}
.tab.active{color:var(--brand);border-bottom-color:var(--brand)}
.detail-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:10px}
.field{background:var(--surface);border:1px solid var(--line);border-radius:var(--radius);padding:12px 14px}
.field-label{font-size:12.5px;color:var(--muted);font-weight:600;text-transform:uppercase;letter-spacing:.04em}
.field-val{font-size:15px;font-weight:600;margin-top:3px}
.hint{margin-top:14px;font-size:12.5px;color:var(--muted);background:#e3f2f1;border-radius:10px;padding:10px 12px}

/* tina4: tina4-css sets .badge{font-size:0.75em}, so a badge inherits 75% of whatever it sits in —
   measured at 9.75px inside a 13px .page-sub and 11.25px inside body copy. Relative sizing means
   there is no floor, so badges get illegible wherever the context is small. Pin an absolute
   readable size; the em-based default is part of the upstream write-up
   (plan/upstream-tina4-css-touch-targets.md). */
.badge{font-size:12px}
/* tina4css button/badge primaries → aboo teal (dark text for contrast on the bright teal) */
.btn-primary{background:var(--brand);border-color:var(--brand);color:var(--aboo-ink)}
.btn-primary:hover{background:var(--brand);border-color:var(--brand);filter:brightness(.94)}
.badge-primary{background:var(--brand);color:var(--aboo-ink)}
.brand-dot{background:var(--brand)}
/* outline / secondary button — theme-aware (tina4css default has dark text invisible on dark) */
.btn-outline{background:transparent;border:1px solid var(--line);color:var(--ink)}
.btn-outline:hover{background:rgba(127,160,160,.14);border-color:var(--muted);color:var(--ink)}
/* comfortable, consistent modal actions */
.form-actions .btn{padding:9px 18px;border-radius:10px;font-weight:600;min-width:96px}
.muted-sub{font-size:12.5px;color:var(--muted)}

/* ---------- pricing tiers ---------- */
.tier-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(190px,1fr));gap:12px}
.tier{border:1px solid var(--line);border-radius:var(--radius);background:var(--surface)}
.tier.inactive{opacity:.55}
.tier-head{display:flex;flex-direction:column;align-items:flex-start;gap:8px}
.tier-name{font-weight:700;font-size:15px}
.tier-head-actions{display:inline-flex;align-items:center;gap:6px;flex-wrap:nowrap}
.tier-code{font-size:12.5px;color:var(--muted);letter-spacing:.04em;text-transform:uppercase;margin-top:1px}
.tier-price{font-size:22px;font-weight:800;margin:8px 0 0;color:var(--brand)}
.tier-per{font-size:12px;font-weight:600;color:var(--muted)}
.tier-year{font-size:12.5px;color:var(--muted);margin-top:1px}
.tier-caps{font-size:12px;color:var(--muted);margin-top:8px}
.tier-badges{margin-top:8px;display:flex;align-items:center;gap:6px;flex-wrap:wrap}

/* form layout helpers (side-by-side fields + left-aligned destructive action) */
.form-row{display:flex;gap:10px}
.form-col{flex:1;min-width:0}
.form-actions-spacer{flex:1}
.tier-delete{color:var(--bad);border-color:var(--bad)}
.tier-delete:hover{background:var(--bad);color:#fff}

/* ---------- account add/edit form + modal ---------- */
.tab-actions{display:flex;align-items:center;justify-content:space-between;gap:10px;margin:0 0 12px}
.tab-actions-right{display:flex;align-items:center;gap:8px}
.tab-actions-right .per-select{flex:0 0 120px}
.ledger-search{margin:0 0 12px}
.modal-overlay{position:fixed;inset:0;background:rgba(15,23,42,.55);display:flex;align-items:flex-start;
  justify-content:center;z-index:50;padding:24px 16px;overflow-y:auto}
.modal-card{background:var(--surface);color:var(--ink);border-radius:16px;width:100%;max-width:440px;
  padding:20px 22px;box-shadow:0 24px 60px rgba(0,0,0,.4)}
.modal-wide{max-width:620px}
/* oversight grants list inside the admin modal (#8) — scrolls when an admin oversees many */
.grants-list{margin-top:8px;max-height:min(46vh,340px);overflow-y:auto}
/* default-codes picker — scrollable checklist of the country chart */
.code-picker{max-height:48vh;overflow-y:auto;border:1px solid var(--line);border-radius:10px;
  background:var(--bg);padding:4px}
.code-row{display:flex;align-items:center;gap:10px;padding:7px 10px;border-radius:8px;cursor:pointer;font-size:14px}
.code-row:hover{background:var(--surface)}
.code-row.on{background:color-mix(in srgb, var(--brand) 14%, transparent)}
.code-row .cat-code{flex:0 0 auto}
.code-name{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.code-desc{flex:1;min-width:0;height:30px;padding:3px 8px;font-size:13px}
.modal-head{display:flex;align-items:center;justify-content:space-between;margin-bottom:14px}
.modal-head h3{margin:0;font-size:18px}
.modal-x{appearance:none;border:none;background:none;font-size:18px;color:var(--muted);cursor:pointer;line-height:1}
.form-check{display:flex;align-items:center;gap:8px;font-size:14px;margin:8px 0;cursor:pointer}
.form-note{font-size:13px;color:var(--muted);margin:-2px 0 10px}
.form-actions{display:flex;justify-content:flex-end;gap:8px;margin-top:16px}
.cat-card.inactive{opacity:.55}
.tag-off{font-size:12px;background:#fee2e2;color:var(--bad);padding:1px 6px;border-radius:999px;margin-left:8px;font-weight:600}
.tag-on{font-size:12px;background:#dcfce7;color:#15803d;padding:1px 6px;border-radius:999px;font-weight:600}

/* ---------- theme toggle ---------- */
.theme-toggle{appearance:none;border:1px solid var(--line);background:var(--surface);color:var(--ink);
  border-radius:9px;padding:5px 9px;cursor:pointer;font-size:15px;line-height:1}

/* ---------- dark mode (brand) — token mapping handles bg/ink/surface; these are tweaks ---------- */
:root[data-theme="dark"] .hint{background:#123339}
:root[data-theme="dark"] .tag-off{background:#3b1414}
:root[data-theme="dark"] .tag-on{background:#14321c;color:#4ade80}
:root[data-theme="dark"] .row-card:hover{box-shadow:0 2px 10px rgba(0,0,0,.4)}

/* ---------- login ---------- */
.login-wrap{min-height:100%;display:flex;align-items:center;justify-content:center;padding:20px;
  background:radial-gradient(1200px 600px at 50% -10%,#1a4d54 0%,#0E2E33 55%,#07191c 100%)}
/* The login card is a fixed white card on the teal gradient — theme-independent (don't inherit
   dark-mode text colours, or it goes invisible on white). */
/* theme toggle floating on the gradient (light styling so it shows on the dark backdrop) */
.login-toggle{position:fixed;top:16px;right:16px;z-index:2;background:rgba(255,255,255,.12);
  border-color:rgba(255,255,255,.25);color:#EAF3F2}
/* login card adapts to the theme (white card / dark text in light; dark card / light text in dark) */
.login-card{width:100%;max-width:380px;border:1px solid var(--line);border-radius:18px;
  box-shadow:0 24px 60px rgba(0,0,0,.45);background:var(--surface);color:var(--ink)}
.login-card .card-body{padding:28px 26px 30px}
.login-card .brand-name{color:var(--ink)}
.login-title{font-size:22px;margin:6px 0 0;color:var(--ink)}
.login-hint{font-size:13px;color:var(--muted)}
/* dev-only surface switch on the login (never rendered in a production build) */
.login-devhint{font-size:12px;color:var(--muted);border:1px dashed var(--line);border-radius:8px;padding:6px 10px}
.login-devhint a{color:var(--brand);cursor:pointer;text-decoration:underline}
.login-remember{margin:2px 0 14px;color:var(--muted)}
.login-card .btn-primary{background:var(--brand);border-color:var(--brand);color:var(--aboo-ink)}
/* Companies / Admin sign-in choice (#8) — segmented, mirrors .signup-kind */
.login-kind{display:flex;gap:8px;margin:0 0 16px}
.login-kind-btn{flex:1;padding:9px 12px;border:1px solid var(--line);border-radius:10px;
  background:var(--surface);color:var(--muted);font-size:13.5px;font-weight:600;cursor:pointer;
  transition:border-color .15s,background .15s,color .15s}
.login-kind-btn:hover{border-color:var(--brand)}
.login-kind-btn.on{border-color:var(--brand);color:var(--ink);
  background:color-mix(in srgb,var(--brand) 12%,transparent)}
.form-label{display:block;font-size:12.5px;font-weight:600;color:var(--muted);margin:0 0 5px}
/* ---------- sign-up ---------- */
.login-card{max-width:420px}
.login-alt{font-size:13px;color:var(--muted);text-align:center;margin:0}
.login-alt a{color:var(--brand);cursor:pointer;font-weight:600}
.signup-kinds{display:flex;gap:10px}
.signup-kind{flex:1;display:flex;flex-direction:column;gap:2px;align-items:flex-start;text-align:left;
  padding:11px 13px;border:1px solid var(--line);border-radius:12px;background:var(--surface);
  color:var(--ink);cursor:pointer;transition:border-color .15s,background .15s}
.signup-kind:hover{border-color:var(--brand)}
.signup-kind.active{border-color:var(--brand);background:color-mix(in srgb,var(--brand) 12%,transparent)}
.signup-kind-label{font-weight:700;font-size:14px}
.signup-kind-sub{font-size:13px;color:var(--muted)}
.signup-done{text-align:center}
.signup-done .brand-lockup{justify-content:center}
.signup-tick{width:56px;height:56px;margin:14px auto 4px;border-radius:50%;display:flex;align-items:center;
  justify-content:center;font-size:28px;color:#fff;background:var(--brand)}

/* ---------- data import (CSV -> chart of accounts) ---------- */
/* Phases are shown/hidden with [hidden] so the file input never sits in a reactive block. */
.import-phase[hidden]{display:none}
.import-counts{display:flex;flex-wrap:wrap;gap:8px;margin:0 0 10px}
.import-rows{margin:10px 0 4px}
/* Mobile-first: each row stacks, then becomes one line from tablet up. */
.import-row{flex-wrap:wrap;cursor:default;align-items:flex-start;gap:8px}
.import-row .row-main{flex:1 1 100%}
.import-row .form-control{flex:1 1 140px;min-width:0;font-size:13px;padding:6px 9px;margin:0}
.import-row.row-warn{border-left:3px solid var(--warn,#d97706)}
.import-row:hover{border-color:var(--line);box-shadow:none}
.import-errors{margin:6px 0 0;padding-left:20px;font-size:13px}
.import-offer{border-top:1px solid var(--line);margin:14px 0 4px;padding-top:14px}
@media (min-width:720px){
  .import-row{flex-wrap:nowrap;align-items:center}
  .import-row .row-main{flex:1 1 auto}
  .import-row .import-action{flex:0 0 150px}
  .import-row .import-target{flex:0 0 96px}
  .import-row .import-category{flex:0 0 190px}
}

/* ---------- bottom navigation (MOBILE) ----------
   Product decision 2026-07-23 (Andre): on a phone the menu belongs under the thumb — a top-left
   hamburger is the hardest one-handed target on a modern handset. So below the breakpoint the
   bottom bar IS the navigation and the drawer only appears when its "More" tab asks for it; from
   767px up the bar disappears and the drawer is the static desktop sidebar.
   The SAME max-width:767px query the drawer already uses — deliberately not a new breakpoint. */
.bottom-nav{display:none}
.form-actions-center{justify-content:center}
@media (max-width:767px){
  .bottom-nav{display:flex;align-items:stretch;position:fixed;left:0;right:0;bottom:0;z-index:45;
    background:var(--surface);border-top:1px solid var(--line);box-shadow:0 -2px 10px rgba(15,23,42,.07);
    /* iPhone home indicator — without this the tabs sit under it and are unhittable */
    padding-bottom:env(safe-area-inset-bottom,0px)}
  .bn-item{flex:1 1 0;min-width:0;min-height:var(--bottom-nav-h);display:flex;flex-direction:column;
    align-items:center;justify-content:center;gap:3px;padding:8px 4px;appearance:none;border:none;
    background:none;color:var(--muted);font:inherit;cursor:pointer}
  .bn-item.active{color:var(--brand)}
  .bn-ico{font-size:18px;line-height:1}
  .bn-lbl{font-size:12px;font-weight:600;line-height:1.1;max-width:100%;
    overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
  .bn-confirm{flex:1;display:flex;align-items:center;justify-content:center;gap:10px;
    min-height:var(--bottom-nav-h);padding:8px 14px}
  .bn-confirm-q{font-size:14px;font-weight:600;color:var(--bad)}
  /* content must clear the bar — otherwise the last row of every list hides behind it */
  .content{padding-bottom:calc(24px + var(--bottom-nav-space))}
  .drawer{padding-bottom:var(--bottom-nav-space)}
  .modal-overlay{padding-bottom:calc(24px + var(--bottom-nav-space))}
  /* the tenant screens' session actions now live in the bottom bar — don't show them twice.
     (Admin keeps its app-bar "Sign out": its bar's five slots are all navigation.) */
  .tenant-main .app-user .btn,
  .tenant-main .app-user .confirm-inline{display:none}
}

/* ---------- touch targets: >= 44px on touch devices (WCAG 2.5.5 / Apple HIG) ----------
   tina4: LOCAL OVERRIDE of tina4-css. public/css/tina4.min.css ships
     .btn         { padding:.375rem .75rem; font-size:1rem; line-height:1.5 }
     .form-control{ padding:.375rem .75rem; font-size:1rem; line-height:1.5;
                    min-height:calc(1.5em + .75rem + 2px) }
   which renders 38px — under the 44px touch minimum. That is a Bootstrap-derived default that
   predates touch guidance, and it fails on EVERY tina4 app, not just aboo, so the real fix belongs
   upstream in tina4-css (CLAUDE.md rule #7). The case is written up in
   plan/upstream-tina4-css-touch-targets.md. DO NOT edit or fork public/css/tina4.min.css.
   TEMPORARY: delete this block once a tina4-css release ships touch-sized controls.
   Scoped to (pointer: coarse) so mouse/trackpad density on desktop is untouched. */
@media (pointer: coarse){
  .btn,.form-control,.theme-toggle,.pager-btn,.pager-num,.tab,.quick-card,.cat-edit,
  .btn-confirm-yes,.btn-confirm-no,.btn-row-del,.tpl-var,.modal-x,.nav-item,.code-row,
  .form-check,.signup-kind{min-height:44px}
  .btn{padding-top:10px;padding-bottom:10px}
  .btn-sm{padding-top:9px;padding-bottom:9px;font-size:14px}
  /* 16px is also what stops iOS Safari zooming the page when a field takes focus */
  .form-control{padding-top:10px;padding-bottom:10px;font-size:16px}
  .import-row .form-control{min-height:44px;padding:10px 9px;font-size:16px}
  .theme-toggle{min-width:44px;padding:8px 11px;font-size:17px}
  .modal-x{min-width:44px}
  .pager-num{min-width:44px}
  .form-check input[type=checkbox]{width:22px;height:22px}
  /* inline text links measured 16.5px tall — the smallest real targets on the public screens */
  .login-forgot a,.login-alt a,.back-link{display:inline-flex;align-items:center;min-height:44px}
}

/* ---------------------------------------------------------------------------------------------
   MOBILE STACKING — must live at the END of this file.
   These override base rules (.row-main{flex:1} at ~line 149, .app-title{flex:1} at ~line 65) which
   have the SAME specificity, so they only win by coming later. An earlier @media block silently
   loses — measured: flex-wrap took effect but .row-main stayed on the buttons' line.

   The bug being fixed (measured on staging at 375px): .row-card is flex/nowrap, and once the
   touch-target pass grew the action buttons (92px + 197px + gaps inside a 343px card) the flex:1
   .row-main was squeezed to width:0, so the company name painted straight over the buttons.

   NOTE this class of bug does NOT surface as horizontal overflow — scrollWidth stayed exactly ==
   the viewport, because the elements collide INSIDE the viewport instead of spilling outside it.
   The no-overflow tests all passed while the screen was visibly broken.
   --------------------------------------------------------------------------------------------- */
@media (max-width:767px){
  /* Row cards: title on its own line, actions wrapping beneath it. */
  .row-card{flex-wrap:wrap}
  .row-card > .row-main{flex:1 0 100%}
  .row-card > .btn{flex:1 1 auto}

  /* App bar: brand + title + user could not share 375px and .app-user's right edge landed past the
     viewport edge. The bottom nav already says which screen you are on, so the middle title goes. */
  .app-bar .app-title{display:none}
  .app-bar .app-user{min-width:0;flex:0 1 auto}

  /* The ACTION must never be the thing that shrinks — the NAME is what may ellipsise.

     Kept as a DEFENSIVE rule, and the comment says so honestly rather than claiming a repro it
     does not have. A report described the app-bar "Sign out" as collapsed to 0x0 at 375px and
     blamed the `min-width:0` above for letting the flex algorithm crush the last child. Measured
     against this stylesheet in a real browser (Chromium, 375px AND 320px, long and short user
     names), with these two rules present and again with them reverted, the button measured
     78x31 every single time. The crush does not reproduce here.

     What DOES measure 0x0 at 375px is the TENANT bar's "Sign out", and the cause is
     `display:none` from the deliberate `.tenant-main .app-user .btn` rule ~50 lines above — the
     tenant's session actions moved to the bottom nav, which really does carry a 188x56 "Sign out"
     tab. Measured tenant bar at 375px: brand 16..91, .app-title display:none, .app-user at
     x=103, "Sign out" display:none 0x0 — which matches the report exactly. So that is intent,
     not breakage. (Admin keeps its app-bar button, and needs it: the admin drawer and bottom nav
     have no sign-out of their own. Measured visible at both 375px and 320px.)

     These two lines stay because they make the intent explicit and cost nothing: whatever the
     available width, pin the button and let the name be the flexible item. */
  .app-bar .app-user > .btn{flex:0 0 auto;white-space:nowrap}
  .app-bar .user-name{flex:0 1 auto;min-width:0;max-width:92px}

  /* The DEMO badge must survive the same squeeze — it is a safety label, not decoration. */
  .app-bar .demo-badge{margin-left:6px}

  /* Page heading and its primary action, stacked so neither gets crushed. */
  .page-head.with-action{flex-wrap:wrap}
  .page-head.with-action > :first-child{flex:1 0 100%}
}

/* ---------------------------------------------------------------------------------------------
   APP BAR — the action must never shrink or wrap, at ANY width. GLOBAL, deliberately NOT inside a
   media query.

   Reported with a screenshot: "Sign out" wrapped onto two lines and clipped at the right edge.
   The earlier fix for this lived inside @media (max-width:767px), so it did nothing in the band
   just above the breakpoint — measured at 820px: .app-title{flex:1 1 0%} claimed 444px and the
   user block was squeezed until the button wrapped. Chasing that with another breakpoint would
   just move the failure, so the rule is stated once, unconditionally:

     the TITLE is the flexible item and truncates; the ACTION is fixed and stays whole.

   .app-title needs min-width:0 because a flex item's default min-width:auto refuses to shrink
   below its content — without it the title pushes the button out instead of ellipsising.
   --------------------------------------------------------------------------------------------- */
.app-bar .app-user{flex:0 0 auto}
.app-bar .app-user > .btn{flex:0 0 auto;white-space:nowrap}
.app-bar .app-title{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}

/* ---------------------------------------------------------------------------------------------
   CHART OF ACCOUNTS — read-only chart screen (src/tenant/chart.js).

   MUST STAY AT THE END OF THIS FILE. `.chart-row > .row-main` and the MOBILE STACKING block's
   `.row-card > .row-main{flex:1 0 100%}` have IDENTICAL specificity (two classes + a child
   combinator), so these rules only win by coming later — exactly the trap documented in the
   MOBILE STACKING header above. Appending anything after this block is fine; MOVING this block
   above MOBILE STACKING silently reverts the phone layout.

   The generic mobile rule would give each account row three stacked lines (code, name, nothing),
   wasting a third of a phone screen on an 86-row list. The chart wants the CODE and the NAME on
   the SAME line — the code is the mapping key, so it is the thing being scanned — with the
   classification wrapping underneath it. Hence the override.
   --------------------------------------------------------------------------------------------- */
.chart-count{font-size:13px;color:var(--muted);font-weight:600;margin:0 2px 12px}
.chart-groups{display:flex;flex-direction:column;gap:18px}
.chart-group-head{display:flex;align-items:baseline;gap:8px;padding:0 2px 7px;flex-wrap:wrap}
.chart-group-head h2{font-size:14px;margin:0;text-transform:uppercase;letter-spacing:.05em}
.chart-group-root{font-size:12.5px;color:var(--muted)}
.chart-group-n{margin-left:auto;font-size:12px;color:var(--muted);font-variant-numeric:tabular-nums}
/* The CODE is the mapping key — mono, boxed and the first thing the eye lands on. */
.chart-code{flex:0 0 auto;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-weight:700;
  font-size:13px;background:var(--brand-ink);color:#fff;padding:4px 9px;border-radius:8px;
  min-width:54px;text-align:center;font-variant-numeric:tabular-nums}
.chart-vat{flex:0 0 auto;margin-left:auto;align-self:center;font-size:12px;font-weight:600;color:var(--brand);background:var(--surface-2,rgba(0,0,0,.04));border:1px solid var(--line);border-radius:6px;padding:1px 7px;white-space:nowrap}
.chart-row{cursor:default}
.chart-row:hover{border-color:var(--line);box-shadow:none}
/* A system-role account (retained earnings, year-end contra, FX, rounding, suspense) is one an
   import must never remap — flagged so it reads as special, not as an ordinary account. */
.chart-row.chart-system{border-left:3px solid var(--brand)}
.chart-row.inactive .chart-code{background:var(--muted)}

@media (max-width:767px){
  /* Code and name share line 1; the classification wraps beneath. See the header above for why
     this must not be hoisted anywhere earlier in the file. */
  .chart-row{flex-wrap:wrap;align-items:flex-start;gap:10px}
  .chart-row > .chart-code{flex:0 0 auto}
  /* flex-basis MUST be 0, not auto. Measured in Chromium at 375px with `flex:1 1 auto`: flex line
     breaking uses each item's HYPOTHETICAL main size (here the name's max-content width) BEFORE
     any shrinking, so a long account name — "Machinery and Equipment - Cost" — pushed .row-main
     onto its own line and the code sat alone above it, making that one row twice as tall as its
     neighbours. Basis 0 means it always fits beside the code and then grows into the space. */
  .chart-row > .row-main{flex:1 1 0;min-width:0}
  .chart-group-n{margin-left:0}
}
/* ── tenant bank screens (feature/bank-accounts) ─────────────────────── */
.btn-back{border:0;background:none;color:var(--ink);font-size:22px;line-height:1;padding:4px 10px;cursor:pointer;border-radius:8px}
.btn-back:hover{background:var(--surface-2,rgba(0,0,0,.06))}
.tshell-title{display:flex;flex-direction:column;min-width:0}
.tshell-co{font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.tshell-screen{font-size:12px;color:var(--muted,#777)}
.row-actions{display:flex;align-items:center;gap:8px;flex:0 0 auto}
/* company picker: pop a company out into its own window (icon + label on one line) */
.co-popout{display:inline-flex;align-items:center;gap:6px;white-space:nowrap}
.row-open{color:var(--muted,#999);font-size:20px;padding-left:2px}
.co-card{cursor:pointer}
.co-backbar{margin:0 0 12px}
.icon-btn{border:0;background:none;cursor:pointer;font-size:15px;padding:4px 6px;border-radius:8px;line-height:1}
.icon-btn:hover{background:var(--surface-2,rgba(0,0,0,.06))}
.chip-btn{border:1px solid var(--line);background:var(--surface);color:var(--ink);border-radius:999px;padding:3px 10px;font-size:12px;cursor:pointer;font-weight:600}
.chip-btn:hover{border-color:var(--brand)}
/* Reminder day-tier editor (Settings → Reminders): inline caption + removable day pills + a number
   "Add" box (owner: needs an interface, not hand-entered text). No on/off toggle — adding a day means
   you want it as a reminder (owner 2026-09-15); the ✕ removes a tier. */
.remday-field{display:flex;flex-wrap:wrap;align-items:center;gap:8px;margin:6px 0 2px}
.remday-cap{font-size:13px;font-weight:600;color:var(--muted)}
.remday-chip{display:inline-flex;align-items:center;gap:4px;background:var(--surface);border:1px solid var(--brand);color:var(--brand);border-radius:999px;padding:4px 5px 4px 12px;font-weight:700;font-size:13px;line-height:1}
.remday-x{display:inline-flex;align-items:center;justify-content:center;width:18px;height:18px;border:0;border-radius:999px;background:transparent;color:var(--brand);cursor:pointer;font-size:13px;line-height:1;padding:0}
.remday-x:hover{background:var(--brand);color:#fff}
/* margin-left:auto right-aligns the add group so BOTH day-tier rows' "+ Add" line up (owner 2026-09-15) */
.remday-add{display:inline-flex;align-items:center;gap:6px;margin-left:auto}
.remday-in{width:110px;box-sizing:border-box;text-align:left}
.remday-add-btn{white-space:nowrap}
/* Documents: Dashboard button sits on its own row above the Debtors/Creditors strip (owner 2026-09-15) */
.doc-dash-row{display:flex;justify-content:flex-end;margin-bottom:8px}
.amt-in{color:var(--ok,#15803d)}
.amt-out{color:var(--bad)}
.form-control-sm{padding:4px 8px;font-size:13px}
.alert-ok{border:1px solid var(--ok,#15803d);color:var(--ok,#15803d);border-radius:10px;padding:6px 12px;background:var(--surface)}
.alert-warn{border:1px solid #b45309;color:#b45309;border-radius:10px;padding:6px 12px;background:var(--surface)}
.check-line{display:flex;gap:8px;align-items:center;font-size:14px;margin:6px 0}
/* rules form */
.rule-form{display:grid;grid-template-columns:1fr;gap:8px}
.rule-form-err{grid-column:1 / -1}
.rule-edit-form{display:flex;flex-direction:column;gap:8px}
.rule-edit-actions{display:flex;justify-content:flex-end;gap:8px;margin-top:2px}
@media (min-width:760px){.rule-form{grid-template-columns:2fr 1fr 1fr 2fr auto}}

/* ── the cashbook — live-parity single page (feature/bank-accounts) ────── */
/* live v2 works on a 1200px surface — the summary strip needs it to hold one line */
.page.cb-page{max-width:1200px}
.page.page-wide{max-width:1200px}
.cb-page .mono{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-variant-numeric:tabular-nums}
.cb-page .text-right{text-align:right}
.cb-page .fw-700{font-weight:700}
.t-in{color:var(--ok,#15803d)}
.t-out{color:var(--bad)}
.t-label{color:var(--muted,#777)}
/* Signed financial figures: positive is green, negative is red, zero stays neutral. `totalTone()`
   supplies these classes to balances, totals, and line amounts across the tenant application. */
.tot-pos{color:var(--ok,#15803d) !important}
.tot-neg{color:var(--bad,#b91c1c) !important}
.t-val{font-weight:600}
/* statement-import notice (no AI key / extraction error) — persistent, above the drop cards */
.cb-keynotice{display:flex;align-items:center;gap:10px;flex-wrap:wrap;background:var(--surface);
  border:1px solid var(--warn);border-left:4px solid var(--warn);border-radius:var(--radius,8px);
  padding:10px 12px;margin:6px 0 4px;font-size:13px;color:var(--ink)}
.cb-keynotice-key{border-color:var(--info);border-left-color:var(--info)}
.cb-keynotice-icon{font-size:16px;line-height:1}
.cb-keynotice-msg{flex:1 1 220px;min-width:0}
.cb-keynotice-cta{flex:0 0 auto;white-space:nowrap}
.cb-keynotice-x{flex:0 0 auto;background:none;border:0;color:var(--muted);font-size:15px;line-height:1;
  cursor:pointer;padding:2px 4px;border-radius:6px}
.cb-keynotice-x:hover{color:var(--ink);background:rgba(128,128,128,.14)}
/* inline "Set up API key" link inside a keynotice (document scan dropzone) */
.cb-keynotice-link{flex:0 0 auto;white-space:nowrap;font-weight:700;color:var(--brand,#0b7);text-decoration:underline;cursor:pointer}
.scan-keynotice{margin:0 0 10px}
/* AI-assist bar: proactive no-key note + set-up link (shown when no AI key is configured) */
.ai-bar-nokey{font-size:12.5px;color:var(--warn,#b45309);flex:1 1 100%}
.ai-bar-setup{font-weight:700;color:var(--brand,#0b7);text-decoration:underline;cursor:pointer;margin-left:4px}
/* account cards strip */
.cb-cards{display:flex;gap:10px;overflow-x:auto;-webkit-overflow-scrolling:touch;padding:8px 2px 6px}
.cb-card{flex:0 0 auto;min-width:160px;max-width:210px;background:var(--surface);border:2px solid var(--line);border-radius:12px;padding:10px 12px;cursor:pointer;position:relative;transition:border-color .15s,box-shadow .15s;display:flex;flex-direction:column;gap:2px}
.cb-card-top{display:flex;align-items:flex-start;justify-content:space-between;gap:6px}
.cb-card:hover{border-color:var(--muted,#999)}
.cb-card.active{border-color:var(--brand);box-shadow:0 0 0 1px var(--brand)}
.cb-card-drag{border-color:var(--brand);box-shadow:0 0 0 2px var(--brand);background:var(--surface-2,rgba(0,180,160,.06))}
.cb-card-add{border-style:dashed;color:var(--muted,#777)}
.cb-card-name{font-weight:600;font-size:13px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;flex:1 1 auto;min-width:0}
.cb-card-acct{font-size:12px;color:var(--muted,#777);margin-top:2px}
.cb-card-bal{font-size:14px;font-weight:700;margin-top:4px;text-align:right;white-space:nowrap}
.cb-card-badge{position:absolute;top:-8px;right:-8px;background:var(--brand);color:#fff;font-size:12px;font-weight:700;padding:2px 7px;border-radius:10px;min-width:20px;text-align:center;z-index:2}
.cb-pwd-icon{position:absolute;top:6px;right:6px;border:0;background:none;cursor:pointer;font-size:12px;opacity:.5;padding:2px}
.cb-pwd-icon:hover{opacity:1}
.cb-pwd-row{display:flex;gap:4px;margin-top:6px}
.cb-pwd-input{font-size:12px;padding:3px 6px;border:1px solid var(--line);border-radius:6px;background:var(--surface);color:var(--ink);width:100%;min-width:0}
.cb-pwd-save{background:var(--brand);color:#fff;border:0;border-radius:6px;padding:2px 8px;cursor:pointer;flex:0 0 auto}
.cb-addform{display:grid;grid-template-columns:1fr;gap:8px;padding:0;margin:2px 2px 10px}
.cb-in-gl{background:var(--hover,rgba(25,196,196,.08));cursor:default}
@media (min-width:760px){.cb-addform{grid-template-columns:3fr 1fr 3fr 2fr 1.5fr auto}}
/* Bank-account add row (owner 2026-09-15 "currency and add button must be same size as others"): the
   text inputs, the native <select> and the Add button otherwise resolve to three different heights
   (.cb-in 32px vs body.vt select 38px vs the button's own padding). Force EVERY control in the row to
   one identical height + border-box so the whole row lines up regardless of which base rule wins —
   this selector out-ranks .cb-in, body.vt select and body.vt .btn alike. */
body.vt .cb-addform .cb-in,
body.vt .cb-addform select.cb-in,
body.vt .cb-addform .btn{height:34px;min-height:34px;box-sizing:border-box}

/* Guided "new bank account" wizard (4 steps): overrides the flat add-row grid above */
.cb-wizard{display:block;max-width:520px;border:1px solid var(--line);border-radius:12px;
  padding:14px;background:var(--surface)}
.cb-wiz-head{display:flex;align-items:center;justify-content:space-between;margin-bottom:12px}
.cb-wiz-steps{display:flex;gap:8px}
.cb-wiz-dot{width:24px;height:24px;border-radius:50%;display:flex;align-items:center;
  justify-content:center;font-size:12px;font-weight:700;background:var(--hover,rgba(25,196,196,.08));color:var(--muted,#777)}
.cb-wiz-dot.active{background:var(--brand);color:#fff}
.cb-wiz-dot.done{background:var(--ok);color:#fff}
.cb-wiz-x{border:0;background:none;cursor:pointer;font-size:15px;color:var(--muted,#777);line-height:1}
.cb-wiz-body{display:flex;flex-direction:column;gap:10px}
.cb-wiz-lbl{display:flex;flex-direction:column;gap:4px;font-size:12px;color:var(--muted,#777)}
.cb-wiz-lbl .cb-in{width:100%}
.cb-wiz-nav{display:flex;justify-content:flex-end;gap:8px;margin-top:8px}
.cb-wiz-back{margin-right:auto}
.cb-wiz-glmode{display:flex;flex-direction:column;gap:8px;margin-bottom:8px}
.cb-wiz-radio{display:flex;align-items:center;justify-content:flex-start;gap:8px;font-size:13px;color:var(--ink);cursor:pointer;white-space:normal}
.cb-wiz-radio input{flex:0 0 auto;width:auto;margin:0}
.cb-wiz-pills{display:flex;flex-wrap:wrap;gap:8px;margin-bottom:12px}
.cb-pill{flex:1 1 auto;min-width:0;padding:9px 14px;border:1px solid var(--line);border-radius:999px;
  background:var(--surface);color:var(--ink);font-size:13px;font-weight:500;line-height:1.3;
  text-align:center;cursor:pointer;transition:background .12s,border-color .12s,color .12s;white-space:normal}
.cb-pill:hover{border-color:var(--brand);background:var(--brand-faint)}
.cb-pill.is-on,.cb-pill.is-on:hover{background:var(--brand);border-color:var(--brand);color:#fff}
.cb-wiz-hint{font-size:12px;color:var(--muted,#777);line-height:1.5}
.cb-wiz-confirm{display:flex;flex-direction:column;gap:2px}
.cb-wiz-crow{display:flex;justify-content:space-between;gap:12px;font-size:13px;
  border-bottom:1px solid var(--line);padding:5px 0}
.cb-wiz-crow span{color:var(--muted,#777)}
.cb-wiz-note{font-size:12px;color:var(--brand);font-weight:600;margin-top:8px}

/* Wrong-account-drop confirm (reuses .cb-stmt-overlay for the backdrop) */
.cb-confirm-modal{background:var(--surface);color:var(--ink);border-radius:12px;
  width:min(440px,94vw);box-shadow:0 18px 50px rgba(0,0,0,.35);padding:18px;
  display:flex;flex-direction:column;gap:12px}
.cb-confirm-head{font-weight:700;font-size:15px;display:flex;align-items:center;gap:8px}
.cb-mismatch-icon{color:#c9922b;font-size:18px}
.cb-confirm-body{font-size:13px;color:var(--ink);line-height:1.55}
.cb-confirm-actions{display:flex;justify-content:flex-end;gap:8px}

/* sticky summary strip */
/* live: the whole strip is ONE line on desktop (nowrap, 1200px surface); mobile wraps */
/* sticks just BELOW the top nav (not at top:0, which collided with it) and one z-layer under it,
   so the Post-to-Ledger bar stays visible while the register scrolls under the nav */
.cb-summary{display:flex;align-items:center;gap:12px;background:var(--surface);border:1px solid var(--line);border-radius:10px;padding:8px 12px;margin-bottom:8px;position:sticky;top:var(--topbar-h, 62px);z-index:9}
.cb-summary>.btn,.cb-summary .confirm-inline{white-space:nowrap;flex-shrink:0}
.cb-summary-bal{display:flex;flex-direction:column}
.cb-summary-label{font-size:12px;text-transform:uppercase;letter-spacing:.03em;color:var(--muted,#777)}
.cb-summary-value{font-size:16px;font-weight:700}
/* live: IN / OUT / Projected are ONE inline trio — each pair never splits, and the
   group only wraps as a whole (base has no wrap; phones wrap like live's mobile rule) */
.cb-summary-staged{display:flex;gap:12px;flex:1;justify-content:center;font-size:13px}
.cb-summary-staged>span{white-space:nowrap}
.cb-fetch-mail{margin-left:auto}   /* keep the email-fetch button at the far right of the strip */
.cb-unalloc-badge{display:inline-flex;align-items:center;gap:4px;background:rgba(245,158,11,.12);color:#b45309;font-size:12px;font-weight:700;padding:4px 10px;border-radius:8px;cursor:pointer;border:1px solid transparent;white-space:nowrap}
.cb-unalloc-badge:hover{background:rgba(245,158,11,.2)}
.cb-unalloc-badge.on{border-color:#b45309}
/* mode row */
.cb-mode-row{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-bottom:8px}
.cb-mode-toggle{display:inline-flex;border:1px solid var(--line);border-radius:999px;overflow:hidden}
.cb-mode-btn{border:0;background:var(--surface);color:var(--muted,#777);padding:5px 16px;font-size:13px;cursor:pointer}
.cb-mode-btn.active{background:var(--brand);color:#fff}
.cb-mode-spacer{flex:1}
.cb-auto-search{max-width:260px}
/* panels (import / reconcile) */
.cb-panel{border:1px solid var(--line);border-radius:12px;background:var(--surface);padding:12px;margin-bottom:10px;display:grid;gap:8px}
.cb-panel-title{font-weight:600;font-size:14px}
.cb-panel-hint{font-size:12px;color:var(--muted,#777);margin:0}
.recon-grid{display:flex;gap:14px;flex-wrap:wrap;font-size:13px}
.recon-list{border-top:1px dashed var(--line);padding-top:8px}
.recon-row{font-size:12px;padding:2px 0}
/* tabs */
.cb-tabs{display:flex;border-bottom:2px solid var(--line);margin-bottom:8px}
.cb-tab{padding:8px 18px;font-size:14px;font-weight:600;color:var(--muted,#777);background:none;border:0;border-bottom:4px solid transparent;margin-bottom:-2px;cursor:pointer;
  transition:color .15s,border-bottom-color .15s}
/* default active state for every tab bar (scoped bars below override the colour) — bolder text so
   the selected tab is obvious, not just a thin underline (owner 2026-09-08) */
.cb-tab.active{border-bottom-color:var(--aboo-accent,#19C4C4);color:var(--ink);font-weight:800}
/* the active tab's count badge picks up the tab colour so the whole tab reads as "on" */
.cb-tab.active .cb-tab-badge{background:color-mix(in srgb, currentColor 16%, transparent);color:currentColor}
.cb-tab-dep.active{border-bottom-color:var(--ok,#15803d);color:var(--ok,#15803d)}
.cb-tab-pay.active{border-bottom-color:var(--bad);color:var(--bad)}
.cb-tab-badge{display:inline-block;font-size:12px;background:var(--surface-2,rgba(0,0,0,.06));color:var(--muted,#666);padding:1px 7px;border-radius:8px;margin-left:4px;font-weight:700}
/* bulk bar */
.cb-bulk-bar{display:flex;align-items:center;gap:8px;flex-wrap:wrap;padding:6px 12px;background:var(--surface);border:1px dashed var(--line);border-radius:8px;margin-bottom:8px;font-size:13px}
.cb-bulk-sel{max-width:260px}
.btn-danger{background:var(--bad);border-color:var(--bad);color:#fff}
/* sortable column headers (reports List of Accounts + cashbook/journal registers) — click to sort asc/desc */
th.sort-th{cursor:pointer;user-select:none;white-space:nowrap}
th.sort-th:hover{color:var(--brand)}
th.sort-th:focus-visible{outline:2px solid var(--brand);outline-offset:-2px}
th.sort-th.sort-active{color:var(--brand)}
.sort-ind{font-size:12px;opacity:.85}
/* quick-add form */
.cb-form{background:var(--surface);border:1px solid var(--line);border-radius:10px;padding:8px;margin-bottom:10px}
.cb-row{display:flex;gap:6px;align-items:center;flex-wrap:wrap}
.cb-in{padding:5px 8px;font-size:13px;height:32px}
select.cb-in{height:32px}
.cb-w-date{flex:0 0 130px}
.cb-w-ref{flex:0 0 90px}
.cb-w-desc{flex:2 1 140px}
.cb-w-tax{flex:0 0 150px}
.cb-w-amt{flex:0 0 100px}
.cb-w-cost{flex:0 0 70px}
.cb-add{height:32px}
.cb-gl-wrap{flex:1 1 150px;position:relative;min-width:120px;max-width:240px}
.cb-gl-wrap .cb-in{width:100%}
.cb-dest-pills{display:flex;gap:3px;flex:0 0 auto}
.cb-dest-pill{padding:3px 10px;border:1px solid var(--line);border-radius:12px;font-size:12px;font-weight:600;cursor:pointer;background:var(--surface);color:var(--muted,#777);white-space:nowrap}
.cb-dest-pill:hover{border-color:var(--muted,#999)}
.cb-dest-pill.active[data-dest="G"]{background:var(--brand);color:#fff;border-color:var(--brand)}
.cb-dest-pill.active[data-dest="D"]{background:var(--ok,#15803d);color:#fff;border-color:var(--ok,#15803d)}
.cb-dest-pill.active[data-dest="C"]{background:var(--bad);color:#fff;border-color:var(--bad)}
.cb-dest-pill.active[data-dest="V"]{background:#b45309;color:#fff;border-color:#b45309}
.cb-form-options{display:flex;align-items:center;gap:14px;flex-wrap:wrap;margin-top:6px}
.cb-vat-inline{font-size:12px;color:var(--muted,#777)}
.cb-diesel-inline{display:inline-flex;align-items:center;gap:6px;font-size:12px;color:var(--muted,#777)}
.cb-diesel-inline .cb-in{max-width:110px}
.alloc-rule-check{margin-left:4px;font-weight:700}
/* tables */
.table-wrap{overflow-x:auto}
.cb-table{width:100%;border-collapse:collapse;font-size:13px;background:var(--surface);border:1px solid var(--line);border-radius:10px}
.cb-table th{font-size:12px;text-transform:uppercase;letter-spacing:.03em;color:var(--muted,#777);text-align:left;padding:8px;border-bottom:1px solid var(--line)}
.cb-table th.text-right{text-align:right}
.cb-table td{padding:7px 8px;border-bottom:1px solid var(--line);vertical-align:middle}
/* Reusable switch toggle (v2 iOS-style, aboo teal) — used across the books screens */
.switch{position:relative;display:inline-flex;align-items:center;gap:8px;cursor:pointer;font-size:13px;color:var(--ink);user-select:none}
.switch input{position:absolute;opacity:0;width:0;height:0}
.switch-track{width:34px;height:19px;border-radius:999px;background:var(--line);transition:background .15s;flex:0 0 auto;position:relative}
.switch-track::after{content:'';position:absolute;top:2px;left:2px;width:15px;height:15px;border-radius:50%;background:#fff;transition:transform .15s;box-shadow:0 1px 2px rgba(0,0,0,.25)}
.switch input:checked + .switch-track{background:var(--brand)}
.switch input:checked + .switch-track::after{transform:translateX(15px)}
.switch input:focus-visible + .switch-track{outline:2px solid var(--brand);outline-offset:2px}

/* Journals (§2) capture form + staged table — v2 compact density */
.jrn-form{display:flex;flex-direction:column;gap:8px}
.jrn-row{display:flex;flex-wrap:wrap;gap:8px}
.jrn-meta{display:flex;flex-wrap:wrap;gap:8px;align-items:center}
.jrn-meta .jrn-ref{max-width:130px}
.jrn-meta .jrn-amt{max-width:120px}
.jrn-meta .jrn-tax{max-width:140px}
/* Low-chrome debit/credit columns (owner 2026-09-17: "too much real estate"): the coloured
   DEBIT/CREDIT header tags carry the side distinction, so drop the box — border, background,
   radius and padding — leaving a tight, compact stack of fields. */
.jrn-side{flex:1 1 300px;min-width:0;display:flex;flex-direction:column;gap:5px}
.jrn-side-hd{display:flex;align-items:center;justify-content:space-between;gap:8px}
.jrn-side-tag{font-size:12px;font-weight:800;letter-spacing:.04em;border-radius:4px;padding:2px 8px;color:#fff}
.jrn-dr{background:var(--ok,#15803d)}
.jrn-cr{background:var(--bad,#b91c1c)}
.jrn-dests{display:inline-flex;gap:4px}
.jrn-dest{width:24px;height:24px;border:1px solid var(--line);background:var(--surface);border-radius:50%;
  font-size:12px;font-weight:700;color:var(--muted,#777);cursor:pointer;line-height:1}
.jrn-dest.active{background:var(--brand);border-color:var(--brand);color:#fff}
.jrn-hide{display:none}
.jrn-actions{display:flex;align-items:center;gap:18px;flex-wrap:wrap}
.jrn-spacer{flex:1 1 auto}
.jrn-postbar{display:flex;justify-content:flex-end;margin:10px 0}
.jrn-staged-head{display:flex;align-items:center;gap:8px;margin:2px 0 8px}
.jrn-staged-title{font-weight:700;font-size:14px}
.jrn-staged-head .btn{margin-left:auto}
.jrn-acct{font-size:12.5px}
.jrn-edit-row{background:color-mix(in srgb,var(--brand,#12b5a5) 6%,var(--surface))}
.jrn-edit-in{padding:4px 6px;font-size:13px;height:auto;width:100%}
.jrn-edit-contra{margin-top:4px;font-size:12px}
.jrn-edit-act{white-space:nowrap;display:flex;gap:6px;align-items:center;flex-wrap:wrap}
.jrn-edit-err{font-size:12px}
.jrn-edit-btn{color:var(--brand,#12b5a5)}
.jrn-total td{border-top:2px solid var(--line);border-bottom:none}
.jrn-lbl{font-size:12px;text-transform:uppercase;letter-spacing:.03em;color:var(--muted,#777);font-weight:700}

/* Contacts (§3) — aging cards, list toolbar, detail + edit. Cards sit as one compact row
   on desktop (5 buckets at ~130px each), stack into a 3-col grid on tablet and a 2-col
   grid on phone so an empty balance doesn't waste half the screen on air. */
.aging-cards{display:grid;grid-template-columns:repeat(5, minmax(0, 1fr));gap:8px;margin:10px 0}
.aging-card{border:1px solid var(--line);border-radius:10px;padding:8px 12px;background:var(--surface);min-width:0}
@media (max-width:900px){ .aging-cards{grid-template-columns:repeat(3, minmax(0, 1fr))} }
@media (max-width:520px){ .aging-cards{grid-template-columns:repeat(2, minmax(0, 1fr))} }
.aging-lbl{font-size:12px;text-transform:uppercase;letter-spacing:.03em;color:var(--muted,#777);font-weight:700}
.aging-val{font-size:15px;font-weight:700;margin-top:2px;font-variant-numeric:tabular-nums}
.aging-card-btn{cursor:pointer;text-align:left;font:inherit;transition:border-color .12s,background .12s}
.aging-card-btn:hover{border-color:var(--brand,#12b5a5)}
.aging-card-btn.active{border-color:var(--brand,#12b5a5);background:color-mix(in srgb,var(--brand,#12b5a5) 12%,var(--surface))}
.aging-card-btn.active .aging-lbl{color:var(--brand,#12b5a5)}
.ct-toolbar{display:flex;align-items:center;gap:14px;flex-wrap:wrap;margin:8px 0}
.ct-search{max-width:320px}
.ct-tabs{margin:6px 0}
.ct-section-lbl{display:flex;align-items:center;justify-content:space-between;gap:8px;font-size:12px;text-transform:uppercase;letter-spacing:.04em;color:var(--muted,#777);font-weight:700;margin:14px 0 6px}
.ct-sort{display:inline-flex;align-items:center;gap:6px;text-transform:none;font-weight:600}
.ct-sort-sel{width:auto;padding:2px 6px;font-size:12px}
.ct-row .row-open{margin-left:8px}
.ct-off{opacity:.55}
.ct-new-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:8px}
.ct-new-actions{display:flex;align-items:center;gap:8px;margin-top:10px;flex-wrap:wrap}
/* Customer/supplier chooser in the inline +New form (issue #62) */
.ct-type-choose{display:flex;align-items:center;flex-wrap:wrap;gap:10px;margin-bottom:12px}
.ct-type-lbl{font-size:13px;font-weight:600;color:var(--muted,#777)}
.ct-type-segs{flex:0 0 auto}
.ct-type-hint{color:var(--muted,#777);font-size:12px}
/* Team / Users screen (v2 Settings→Users parity) */
.team-new-grid{display:grid;grid-template-columns:2fr 1fr 1fr 1.4fr;gap:8px}
.team-new-hint{display:block;color:var(--muted,#777);font-size:12px;margin-top:8px}
.team-tbl td{vertical-align:top}
.team-who{display:flex;align-items:center;gap:6px}
.team-you{font-size:12px;font-weight:700;text-transform:uppercase;letter-spacing:.03em;color:var(--brand);border:1px solid var(--brand);border-radius:999px;padding:0 6px;line-height:1.5}
.team-email{font-size:12px;margin-top:2px}
.team-role-sel{min-width:160px;max-width:220px}
.team-role-fixed{font-weight:600}
.team-locked{cursor:default}
.team-link-card{border-left:3px solid var(--brand)}
.team-link-head{font-weight:700;margin-bottom:2px}
.team-link-row{display:flex;align-items:center;gap:8px;margin-top:8px}
.team-link-input{flex:1 1 auto;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:12px}
.team-link-actions{margin-top:10px}
@media (max-width:720px){.team-new-grid{grid-template-columns:1fr}}
/* Contact-detail header sits flush on the page — no card / panel wrapping (owner Andre
   2026-09-17: "Get rid of the panel at the top", "Its padding too much"). Compact vertical
   rhythm; the balance still hugs the right on desktop. */
.ct-detail-head{padding:0;background:transparent;border:0;box-shadow:none;margin-bottom:12px}
.ct-detail-top{display:flex;align-items:flex-start;justify-content:space-between;gap:12px;flex-wrap:wrap}
.ct-detail-name{font-size:20px;margin:0;display:flex;align-items:center;gap:8px}
.ct-detail-sub{font-size:12.5px;color:var(--muted,#777);margin-top:2px}
.ct-detail-bal{text-align:right;font-size:20px;font-weight:800;font-variant-numeric:tabular-nums}
.ct-bal-lbl{display:block;font-size:12px;font-weight:600;color:var(--muted,#777);text-transform:uppercase}
.ct-actions{display:flex;align-items:center;gap:6px;flex-wrap:wrap;margin-top:10px}
/* "New ▾" document dropdown in the contact action row */
.ct-new-dd{position:relative;display:inline-flex}
.ct-new-btn{display:inline-flex;align-items:center;gap:5px}
.ct-new-caret{font-size:10px;opacity:.85}
.ct-new-backdrop{position:fixed;inset:0;z-index:40}
.ct-new-menu{position:absolute;top:calc(100% + 4px);left:0;z-index:41;min-width:180px;
  background:var(--surface,#fff);border:1px solid var(--line,#e5e7eb);border-radius:10px;
  box-shadow:0 8px 24px rgba(16,24,40,.14);padding:4px;display:flex;flex-direction:column}
.ct-new-menu-head{font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.03em;
  color:var(--muted,#9ca3af);padding:6px 10px 2px}
.ct-new-item{text-align:left;background:none;border:0;cursor:pointer;font-size:13.5px;font-weight:600;
  color:var(--ink,#123);padding:7px 10px;border-radius:7px}
.ct-new-item:hover{background:var(--brand-faint,rgba(11,168,160,.12));color:var(--brand,#0BA8A0)}
/* Hide the History-and-notes section's own "Add note" button on the contact detail —
   the header row already carries an "Add note" button that delegates through this one,
   so exposing both would be a duplicate affordance (owner Andre 2026-09-17). */
.hn-hide-addnote [data-addnote]{display:none}

/* Mobile: tighten the whole contact-detail header (owner Andre 2026-09-17: "space wasting"
   + "get rid of these panels with all the borders — not very efficient"). Drop the outer
   card panel entirely, drop the outlined-button chrome — actions read as a compact row of
   text links, with the primary Edit action alone getting the filled brand button. */
@media (max-width:767px){
  body.vt .ct-detail-head{padding:0;background:transparent;border:0;box-shadow:none}
  body.vt .ct-detail-top{gap:6px}
  body.vt .ct-detail-name{font-size:22px;margin:0}
  body.vt .ct-detail-sub{font-size:12px;margin-top:2px}
  body.vt .ct-detail-bal{text-align:left;font-size:24px;margin-top:6px;width:100%}
  body.vt .ct-bal-lbl{display:inline;font-size:12px;margin-left:6px}
  body.vt .ct-tags{margin-top:6px}
  body.vt .ct-actions{display:flex;flex-wrap:wrap;gap:14px 18px;margin-top:12px;
    padding-top:10px;border-top:1px solid var(--line,#e5e7eb)}
  body.vt .ct-actions>.btn{background:transparent;border:0;box-shadow:none;padding:0;
    font-size:14px;font-weight:600;color:var(--brand,#0BA8A0);width:auto}
  body.vt .ct-actions>.btn:hover{color:var(--ink,#1a1f2e);background:transparent}
  body.vt .ct-actions>.btn:disabled{color:var(--muted,#9ca3af)}
  /* Primary Edit stays as a solid pill so it reads as the main action. */
  body.vt .ct-actions>.btn.btn-primary{margin-left:auto;background:var(--brand,#0BA8A0);
    color:#fff;padding:8px 16px;border-radius:8px}
  body.vt .ct-actions>.btn.btn-primary:hover{background:var(--brand,#0BA8A0);color:#fff;filter:brightness(1.05)}
  body.vt .ct-actions .jrn-spacer{display:none}
}
.ct-back{background:none;border:none;color:var(--brand);cursor:pointer;font-weight:600;padding:0;margin-bottom:8px;font-size:13px}
/* Tighter layout on the contacts screens — less wasted space (owner Andre 2026-09-18:
   "reduce the padding on these screens … wasting too much space"). Scoped to .ct-page so
   the rest of the tenant surface is untouched. */
body.vt .page.ct-page{padding:6px 8px 24px}
body.vt .ct-page .card{padding:6px 8px;margin-bottom:8px}
.ct-page .ct-edit-sec{margin:6px 0 4px}
.ct-edit-sec{font-size:12px;text-transform:uppercase;letter-spacing:.04em;color:var(--muted,#777);font-weight:700;margin:12px 0 6px;border-bottom:1px solid var(--line);padding-bottom:4px}
.ct-edit-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:8px}
.ct-field{display:flex;flex-direction:column;gap:3px;min-width:0}
.ct-field-full{grid-column:1 / -1}
.ct-edit-grid-2{grid-template-columns:repeat(2,1fr)}
@media (max-width:640px){.ct-edit-grid-2{grid-template-columns:1fr}}
.ct-edit-disabled{margin-top:8px}

/* ── Multiple contact addresses (migration 124) ─────────────────────────────── */
.ct-addr-sec{display:flex;align-items:center;justify-content:space-between;gap:12px}
.ct-addr-add{flex:0 0 auto}
.ct-addr-wrap{margin-top:8px}
.ct-addr-empty{font-size:13px;padding:4px 0 8px}
.ct-addr-list{display:flex;flex-direction:column;gap:8px;margin-bottom:10px}
.ct-addr-card{display:flex;align-items:flex-start;justify-content:space-between;gap:12px;
  border:1px solid var(--line,#e5e7eb);border-radius:10px;padding:10px 12px;background:var(--surface,#fff)}
.ct-addr-main{min-width:0;flex:1 1 auto}
.ct-addr-badges{display:flex;align-items:center;gap:6px;flex-wrap:wrap;margin-bottom:3px}
.ct-addr-badge{font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.03em;
  border-radius:999px;padding:1px 8px}
.ct-addr-badge.billing{background:var(--brand-faint,rgba(11,168,160,.14));color:var(--brand,#0BA8A0)}
.ct-addr-badge.delivery{background:rgba(139,92,246,.14);color:#7c3aed}
.ct-addr-label{font-size:12.5px;font-weight:600;color:var(--muted,#6b7280)}
.ct-addr-lines{font-size:13.5px;color:var(--ink,#123);line-height:1.4}
.ct-addr-actions{display:flex;flex-wrap:wrap;gap:10px;flex:0 0 auto;align-items:center}
.ct-addr-actions .btn-link{font-size:12.5px;font-weight:600;background:none;border:0;cursor:pointer;
  color:var(--brand,#0BA8A0);padding:0}
.ct-addr-actions .btn-link:hover{text-decoration:underline}
.ct-addr-actions .btn-link.danger{color:var(--bad,#dc2626)}
.ct-addr-delete{margin-left:auto;display:inline-flex;align-items:center}
.ct-addr-form{border:1px dashed var(--line,#cbd5e1);border-radius:10px;padding:12px;
  background:var(--surface-2,#f8fafc);margin-top:6px}
.ct-addr-form-head{font-weight:700;font-size:13px;margin-bottom:8px}
.ct-addr-notes{margin-top:8px}
.ct-addr-toggles{display:flex;flex-wrap:wrap;gap:14px 24px;margin-top:10px}
.ct-addr-form-actions{display:flex;gap:8px;margin-top:12px}
@media (max-width:767px){
  .ct-addr-card{flex-direction:column;gap:8px}
  .ct-addr-actions{gap:14px}
}
.ct-notes{margin-top:8px}
.ct-note-add{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin-bottom:10px}
.ct-note-add > .form-control{flex:1 1 240px;min-width:0}
.ct-note-due{flex:0 0 auto;max-width:160px}
.ct-task-badge{display:inline-block;font-size:12px;font-weight:700;background:var(--brand);color:#fff;border-radius:4px;padding:1px 6px;margin-right:4px}
.cb-row-unalloc td:first-child{box-shadow:inset 3px 0 0 #b45309}
.cb-row-in td:first-child{box-shadow:inset 3px 0 0 var(--ok,#15803d)}
.cb-row-out td:first-child{box-shadow:inset 3px 0 0 var(--bad)}
.cb-th-sel{width:28px}
.cb-td-date{white-space:nowrap}
.cb-td-amt{white-space:nowrap}
.cb-dup{color:#b45309;cursor:help}
.cb-gap{border:1px solid #b45309;color:#b45309;background:none;border-radius:999px;padding:1px 7px;font-size:12px;cursor:pointer;white-space:nowrap}
.cb-gap:hover{background:#b45309;color:#fff}
.cb-dup-ask{display:flex;align-items:center;justify-content:space-between;gap:10px;flex-wrap:wrap;margin-bottom:10px}
.cb-dup-ask-actions{display:flex;gap:6px;flex-wrap:wrap}
.cb-dest-tag{display:inline-block;font-size:12px;font-weight:700;border-radius:4px;padding:1px 6px;color:#fff}
.cb-dest-g{background:var(--brand)}
.cb-dest-d{background:var(--ok,#15803d)}
.cb-dest-c{background:var(--bad)}
.cb-dest-v{background:#b45309}
.alloc-btn{border:1px dashed #b45309;color:#b45309;background:none;border-radius:999px;padding:3px 10px;font-size:12px;cursor:pointer;white-space:nowrap}
.alloc-btn:hover{background:rgba(245,158,11,.1)}
.alloc-btn-matched{border:1px solid var(--ok,#15803d);color:var(--ok,#15803d);background:none;border-radius:999px;padding:3px 10px;font-size:12px;cursor:pointer;white-space:nowrap}
.cb-gl-desc{font-size:12px;color:var(--muted,#777);margin-left:4px}
.cb-clear-btn{border:0;background:none;color:var(--muted,#999);cursor:pointer;font-size:12px;padding:2px 4px}
.cb-clear-btn:hover{color:var(--bad)}
.cb-flip{border:0;background:none;cursor:pointer;font-size:13px;color:var(--muted,#777);padding:2px 5px}
.cb-flip:hover{color:var(--brand)}
/* "See this line on the statement" — locate button + source viewer modal (v2 parity) */
.cb-locate{border:0;background:none;cursor:pointer;font-size:13px;color:var(--muted,#777);padding:2px 5px}
.cb-locate:hover{color:var(--brand)}
.cb-stmt-overlay{position:fixed;inset:0;background:rgba(0,0,0,.55);z-index:500;display:flex;align-items:center;justify-content:center;padding:24px}
.cb-stmt-modal{background:var(--surface);color:var(--ink);border-radius:12px;width:min(900px,96vw);max-height:92vh;display:flex;flex-direction:column;box-shadow:0 18px 50px rgba(0,0,0,.35);overflow:hidden}
.cb-stmt-head{display:flex;align-items:center;gap:10px;padding:12px 16px;border-bottom:1px solid var(--line)}
.cb-stmt-title{font-size:14px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:60%}
.cb-stmt-page{font-size:12px;color:var(--muted)}
.cb-stmt-nav{display:inline-flex;align-items:center;gap:8px}
.cb-stmt-pg{width:28px;height:28px;display:inline-flex;align-items:center;justify-content:center;border:1px solid var(--line);border-radius:6px;background:var(--surface);color:var(--ink);font-size:17px;line-height:1;cursor:pointer;padding:0}
.cb-stmt-pg:hover:not(:disabled){border-color:var(--brand);color:var(--brand)}
.cb-stmt-pg:disabled{opacity:.4;cursor:default}
.cb-stmt-body{padding:14px 16px;overflow:auto}
.cb-stmt-locating{padding:36px 12px;text-align:center;color:var(--muted);font-size:14px}
.cb-stmt-err{margin:8px 0}
.cb-stmt-img-wrap{position:relative;display:block;margin:0 auto;max-width:100%}
.cb-stmt-img{display:block;width:100%;height:auto;border:1px solid var(--line);border-radius:6px}
.cb-stmt-hl{position:absolute;left:0;width:100%;top:var(--hl-top,0);height:var(--hl-h,0);background:rgba(220,38,38,.22);border-top:2px solid var(--bad);border-bottom:2px solid var(--bad);pointer-events:none;border-radius:2px}
.cb-stmt-noline{margin-top:10px;font-size:12.5px;color:var(--muted);text-align:center}
.del-btn{border:0;background:none;color:var(--muted,#999);cursor:pointer;font-size:13px;padding:2px 5px}
.del-btn:hover{color:var(--bad)}
.cb-td-act{white-space:nowrap;text-align:right}
/* register row actions moved inline into the Description cell (Balance is now the last column) */
/* 🔎 anchors LEFT in a fixed slot; edit/flip/delete (or ✓✕ / 🔒) pushed to the RIGHT edge (next to
   Received) via margin-left:auto — so the 🔎 lines up across posted, unposted and edit rows even
   though posted rows carry only the 🔎. */
.cb-row-actions{display:flex;align-items:center;gap:6px;white-space:nowrap}
.cb-act-edit{margin-left:auto;display:inline-flex;align-items:center;gap:6px}
.cb-td-act2{text-align:right;white-space:nowrap;padding-left:8px}
/* edit-mode confirm/cancel — far right of the row (last column) */
.cb-edit-actions{display:inline-flex;align-items:center;gap:6px;justify-content:flex-end;white-space:nowrap}
.cb-src{font-size:12px;font-weight:700;color:var(--muted,#777)}
.cb-src-auto{background:var(--brand);color:#fff;border-radius:4px;padding:1px 6px}
.cb-edit-pair{display:flex;gap:6px}
.cb-edit-ok{border:0;background:var(--ok,#15803d);color:#fff;border-radius:6px;padding:3px 9px;cursor:pointer}
.cb-edit-no{border:0;background:none;color:var(--muted,#777);cursor:pointer;padding:3px 6px}
/* floating layer: typeahead + allocation popover */
.cb-float-root .cb-dropdown,.cb-float-root .alloc-pop{background:var(--surface);border:1px solid var(--line);border-radius:10px;box-shadow:0 6px 18px rgba(0,0,0,.15)}
.cb-dropdown{min-width:320px;max-width:380px;max-height:220px;overflow-y:auto}
.cb-drop-item{display:flex;justify-content:space-between;gap:10px;align-items:center;padding:7px 10px;cursor:pointer;border-bottom:1px solid var(--surface-2,rgba(0,0,0,.05));font-size:13px}
.cb-drop-item:last-child{border-bottom:none}
.cb-drop-item:hover,.cb-drop-item.highlighted{background:var(--surface-2,rgba(0,0,0,.06))}
.qi-drop-item.highlighted{background:var(--surface-2,rgba(0,0,0,.06))}
/* batch: live search rows, inline line edit, per-run skip */
.bt-cust-off{opacity:.6}
.bt-line-click{cursor:pointer}
.bt-line-click:hover{background:var(--hover,rgba(25,196,196,.06))}
.bt-line-edit{display:flex;gap:6px;align-items:center;flex-wrap:wrap;padding:6px 0;border-top:1px solid var(--line,#eee)}
.bt-line-edit .form-control{flex:1;min-width:140px}
.bt-edit-num{flex:0 0 90px !important;min-width:70px !important}
.bt-member.bt-excluded{opacity:.55;border-left:3px solid var(--line,#cdd)}
.cb-drop-muted{color:var(--muted,#999);cursor:default}
.cb-drop-new{color:var(--brand,#0a7f7f);font-weight:600}
.cb-drop-new:hover{background:var(--surface-2,rgba(0,0,0,.06))}
.cb-drop-bal{font-size:12px;color:var(--muted,#777);white-space:nowrap}
.alloc-pop{width:340px;max-width:calc(100vw - 16px);padding:10px;display:grid;gap:8px}
.alloc-pop-head{font-weight:600;font-size:13px;display:flex;align-items:center;gap:6px}
.alloc-back{border:0;background:none;cursor:pointer;font-size:14px;padding:0 4px;color:var(--brand)}
.alloc-dest-row{display:flex;gap:4px;align-items:center;flex-wrap:wrap}
.alloc-dest-label{font-size:12px;color:var(--muted,#777)}
.alloc-sugg{display:grid;gap:2px}
.alloc-nosugg{font-size:12px;padding:2px}
.alloc-results{max-height:180px;overflow-y:auto}
.alloc-opts{display:flex;gap:14px;flex-wrap:wrap}
.alloc-opts .check-line{margin:0;font-size:12px}
/* toast */
.cb-toast{position:fixed;bottom:18px;left:50%;transform:translateX(-50%);background:var(--ink);color:var(--surface);padding:9px 18px;border-radius:10px;font-size:13px;z-index:400;box-shadow:0 6px 18px rgba(0,0,0,.25)}
.cb-toast-warn{background:#b45309;color:#fff}
.cb-toast-err{background:var(--bad);color:#fff}
.cb-toast-action{margin-left:10px;border:0;background:none;color:#7dd3fc;font-weight:700;cursor:pointer;font-size:13px;text-decoration:underline}
.cb-toast-action:hover{color:#bae6fd}
/* shared app-wide notice stack (shared/notice.js) — success/failure voice + Gmail-style Undo */
.notice-stack{position:fixed;bottom:20px;left:50%;transform:translateX(-50%);z-index:500;
  display:flex;flex-direction:column;gap:8px;align-items:center;pointer-events:none;max-width:92vw}
.app-notice{pointer-events:auto;display:flex;align-items:center;gap:14px;background:var(--surface);
  color:var(--ink);border:1px solid var(--line);border-left:4px solid var(--muted);
  border-radius:var(--radius);padding:10px 16px;font-size:13px;box-shadow:var(--shadow-lg);
  animation:notice-in .18s ease-out}
.app-notice.is-ok{border-left-color:var(--ok)}
.app-notice.is-info{border-left-color:var(--info)}
.app-notice.is-bad{border-left-color:var(--bad)}
.notice-msg{flex:1}
.notice-undo{appearance:none;background:none;border:none;cursor:pointer;font-weight:700;font-size:13px;
  color:var(--brand);padding:0;text-decoration:underline;white-space:nowrap}
.notice-undo:hover{opacity:.8}
.app-notice.is-leaving{opacity:0;transform:translateY(6px);transition:opacity .35s,transform .35s}
@keyframes notice-in{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}
/* head row: title left, Auto|Manual top-right (live) + email intake row */
.cb-head-row{display:flex;align-items:center;justify-content:space-between;gap:10px;flex-wrap:wrap}
.cb-head-actions{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.cb-intake-row{display:flex;align-items:center;gap:6px;font-size:12px;color:var(--muted,#777);margin:2px 0 4px;flex-wrap:wrap}
.cb-intake-addr{background:var(--surface);border:1px solid var(--line);border-radius:6px;padding:2px 8px;color:var(--ink)}
.cb-actions-row{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-bottom:8px}
/* card icons: rules + pdf password — bottom-left (per Bank Accounts changes) */
.cb-card-icons{display:flex;gap:4px;flex:0 0 auto;margin-top:1px}
.cb-card-icon{border:0;background:none;cursor:pointer;font-size:12px;opacity:.55;padding:1px 2px;line-height:1}
.cb-card-icon:hover{opacity:1}
.cb-pwd-icon{position:static;opacity:1}
/* live toggle switches (Inc. Ref no / Keep Description) */
.cb-switch{display:inline-flex;align-items:center;gap:7px;font-size:13px;cursor:pointer;color:var(--muted,#777)}
.cb-switch input{position:absolute;opacity:0;width:0;height:0}
.cb-slider{width:32px;height:18px;background:var(--line);border-radius:999px;position:relative;transition:background .15s;flex:0 0 auto}
.cb-slider::after{content:"";position:absolute;top:2px;left:2px;width:14px;height:14px;background:#fff;border-radius:50%;transition:left .15s}
.cb-switch input:checked + .cb-slider{background:var(--brand)}
.cb-switch input:checked + .cb-slider::after{left:16px}
/* auto toolbar + anomaly banner + source badges + AI chip */
.cb-auto-toolbar{display:flex;align-items:center;gap:12px;flex-wrap:wrap;margin-bottom:8px}
.cb-date-filter{display:inline-flex;align-items:center;gap:6px;font-size:13px;color:var(--muted,#789);white-space:nowrap}
.cb-date-filter .cb-date-in{width:auto;font-size:13px}
/* Align every control in the register filter toolbar to ONE height. The add-account row already
   forces this (see .cb-addform ~L761) because .cb-in is 32px while the sleek-date wrapper and
   body.vt selects render taller; the register toolbar was simply missed, so the From/To date
   fields sat taller than the search box (owner 2026-09-19: "date inputs do not align properly").
   Two classes deep so this out-ranks .cb-in / .form-control on both pointer types. */
.cb-auto-toolbar .cb-auto-search,
.cb-auto-toolbar .cb-date-in,
.cb-auto-toolbar .cb-date-in .sleek-date-in{
  height:32px;min-height:32px;padding-top:0;padding-bottom:0;line-height:normal;
  box-sizing:border-box;font-size:13px}
/* The <sleek-date> ELEMENT must match the INPUT height (both 32px, the app-wide control height):
   its calendar button is absolutely positioned at top:50% of the ELEMENT, so if the element stayed
   32px while the input was taller the icon centred too high (owner: "the icons are messed up").
   All three controls (search, both date fields) now share the one height. */
@media (pointer: coarse){
  .cb-auto-toolbar .cb-auto-search,
  .cb-auto-toolbar .cb-date-in,
  .cb-auto-toolbar .cb-date-in .sleek-date-in{height:40px;min-height:40px;font-size:15px}
}
.cb-outby{background:rgba(245,158,11,.12);color:#b45309;border-radius:8px;padding:4px 10px;font-size:12px;font-weight:600}
.cb-src-manual{background:var(--surface-2,rgba(0,0,0,.12));color:var(--muted,#777);border-radius:4px;padding:1px 6px}
.cb-src-auto{background:#7c5cff;color:#fff}
/* ask bar (live: full-width above the title) + answer panel + banner helper */
.cb-ask-wrap{margin-bottom:6px}
.cb-ask-row{display:flex;gap:8px;align-items:center}
.cb-ask-input{flex:1;height:38px;border-radius:10px}
.cb-ask-send{height:38px;width:44px;border:0;border-radius:10px;background:var(--brand);color:#fff;font-size:15px;cursor:pointer;flex:0 0 auto}
.cb-ask-send:disabled{opacity:.6}
.cb-ask-answer{position:relative;background:var(--surface);border:1px solid var(--line);border-radius:12px;padding:12px 34px 10px 12px;margin-top:8px}
.cb-ask-close{position:absolute;top:8px;right:8px;border:0;background:none;color:var(--muted,#999);cursor:pointer;font-size:13px}
.cb-ask-text{font-size:13px;line-height:1.5;white-space:pre-wrap}
.cb-ask-chips{display:flex;gap:8px;flex-wrap:wrap;margin-top:10px}
.cb-ask-help{border:0;border-radius:8px;background:var(--brand);color:#fff;font-size:12px;font-weight:600;padding:5px 12px;cursor:pointer;white-space:nowrap}
.cb-dest-tag.cb-dest-g{background:none;color:var(--muted,#777);border:1px solid var(--line)}
.cb-alloc-line{display:inline-flex;align-items:center;gap:6px;margin-top:3px;flex-wrap:wrap}
.cb-ai-chip{border:1px solid #7c5cff;color:var(--ink);background:none;border-radius:999px;padding:2px 9px;font-size:12px;cursor:pointer;white-space:nowrap}
.cb-ai-chip:hover{background:rgba(124,92,255,.12)}
.cb-ai-tag{background:#7c5cff;color:#fff;border-radius:4px;padding:0 4px;font-size:12px;font-weight:700}
/* a LEARNED suggestion — from how this company booked the same merchant + branch (the evidence "✓ 38/38"
   in the tag, the reason on hover) — reads as the confident green of "ok", not the AI purple of a guess */
.cb-learned-chip{border-color:var(--ok)}
.cb-learned-chip:hover{background:color-mix(in srgb, var(--ok) 12%, transparent)}
.cb-learned-chip .cb-ai-tag{background:var(--ok)}

/* ── bank-import preview (the live /bank-import panel, in-page) ─────────── */
.cb-prev-controls{display:flex;gap:8px;flex-wrap:wrap;margin-top:8px}
.cb-prev-controls select{max-width:340px}
.cb-stagelist{margin-top:10px;padding:10px 12px;border:1px dashed var(--line);border-radius:8px;
  color:var(--muted);font-size:12.5px;display:grid;gap:3px}
.cb-stage-run{color:var(--ink);font-weight:600}
.cb-prev-head{margin-top:10px;padding:9px 12px;border:1px solid var(--line);
  border-radius:8px;background:var(--surface-2, var(--surface))}
.cb-prev-head-main{display:flex;gap:10px;flex-wrap:wrap;align-items:baseline}
.cb-prev-head-sub{color:var(--muted);font-size:12px;margin-top:2px}
.cb-prev-acct{color:var(--ink);font-weight:600}
.cb-prev-new{background:#16a34a;color:#fff;border-radius:4px;padding:0 5px;font-size:12px;font-weight:700}
.cb-prev-warn{color:#b45309}
.cb-prev-counts{display:flex;gap:12px;align-items:center;flex-wrap:wrap;margin:10px 0 4px;font-size:12.5px}
.cb-prev-counts .cb-w-ref{max-width:150px}
.cb-ai-accept{border-color:#7c5cff;color:#7c5cff}
.cb-prev-tocol{font-size:12px;color:var(--muted);white-space:nowrap}
.cb-prev-foot{display:flex;gap:8px;align-items:center;margin-top:10px}
.cb-stage-item{padding-left:4px}
.cb-stage-done{color:#16a34a}
.cb-stage-current{color:var(--ink);font-weight:600}
.cb-stage-cancel{margin-left:10px}
/* several imports at once: a heading + one boxed row per job so no drop looks cancelled */
.cb-stage-multi{color:var(--ink);font-weight:700;font-size:12.5px}
.cb-stage-job{display:grid;gap:3px}
.cb-stage-job-multi{padding:7px 9px;border:1px solid var(--line);border-radius:7px;
  background:var(--surface-2, var(--surface))}
.cb-stage-job-multi + .cb-stage-job-multi{margin-top:2px}
.cb-stage-label{font-weight:700;color:var(--ink);max-width:240px;overflow:hidden;
  text-overflow:ellipsis;white-space:nowrap;display:inline-block;vertical-align:bottom}
.cb-imports-list{margin-top:10px;border:1px solid var(--line);border-radius:8px;padding:8px 10px}
.cb-imports-head{display:flex;align-items:center;margin-bottom:4px}
.cb-import-row{display:flex;gap:10px;align-items:center;flex-wrap:wrap;padding:5px 0;
  border-top:1px dashed var(--line);font-size:12.5px}
.cb-import-row .cb-w-ref{max-width:120px}
/* a failed extraction is surfaced loudly on its row — never a silent "0 transactions" */
.cb-import-failed{background:var(--warn-bg,rgba(180,83,9,.08));border-radius:6px;padding-left:6px;padding-right:6px}
.cb-import-err{color:var(--warn,#b45309);font-weight:600}
.cb-ai-form{margin-top:10px;padding:10px 12px;border:1px solid var(--line);border-radius:8px}
.cb-ai-form .cb-row{display:flex;gap:8px;flex-wrap:wrap}
.cb-ai-form .cb-in{max-width:240px}

/* ── sleek-date — smart date input (live sleek-date.js parity) ─────────────── */
sleek-date{position:relative;display:block;min-width:0}
/* The calendar button centres on the ELEMENT (top:50%), so the element MUST be the same height as
   its input everywhere, or the icon floats. `.cb-in` pins the <sleek-date> element to a fixed
   32px, but the input can be taller (touch min-height, a filter row), so let the element follow
   the input height instead (owner 2026-09-19: "the calendar icons are still out"). The input is a
   block so the element wraps it exactly with no inline descender gap. */
sleek-date.cb-in,sleek-date.cb-date-in,sleek-date.cb-wiz-opening-date,sleek-date.cb-w-date{
  height:auto;min-height:0;padding:0}   /* padding belongs on the INPUT, not the wrapper — otherwise
  the element's 8px side padding insets the input but not the absolute calendar icon, so the icon
  rolls over the input's right border (owner 2026-09-19: "icon is rolling over the right line") */
sleek-date .sleek-date-in{width:100%;padding-right:26px;box-sizing:border-box;display:block}
.sleek-date-cal-btn{position:absolute;right:3px;top:50%;transform:translateY(-50%);background:none;
  border:none;cursor:pointer;color:var(--muted,#777);padding:2px;border-radius:4px;
  display:flex;align-items:center;justify-content:center;z-index:1}
.sleek-date-cal-btn:hover{color:var(--aboo-accent,#19C4C4);background:var(--surface-2,rgba(0,0,0,.06))}
.sleek-cal{position:absolute;top:100%;left:0;z-index:400;background:var(--surface,#fff);
  border:1px solid var(--line,#d3e6e4);border-radius:8px;box-shadow:0 8px 24px rgba(0,0,0,.18);
  padding:8px;width:240px;margin-top:4px}
.sleek-cal-hdr{display:flex;justify-content:space-between;align-items:center;margin-bottom:6px}
.sleek-cal-title{font-size:13px;font-weight:600;color:var(--ink)}
.sleek-cal-nav{background:none;border:none;cursor:pointer;font-size:19px;color:var(--muted,#777);
  padding:0 6px;line-height:1;border-radius:4px}
.sleek-cal-nav:hover{color:var(--aboo-accent,#19C4C4);background:var(--surface-2,rgba(0,0,0,.06))}
.sleek-cal-grid{display:grid;grid-template-columns:repeat(7,1fr);gap:1px}
.sleek-cal-dh{font-size:12px;color:var(--muted,#777);text-align:center;padding:2px 0;font-weight:600}
.sleek-cal-day{font-size:12px;text-align:center;padding:5px 0;border-radius:4px;cursor:pointer;color:var(--ink)}
.sleek-cal-day:hover{background:var(--surface-2,rgba(0,0,0,.06))}
.sleek-cal-blank{cursor:default}
.sleek-cal-blank:hover{background:none}
.sleek-cal-today{font-weight:700;color:var(--aboo-accent,#19C4C4)}
.sleek-cal-sel{background:var(--aboo-accent,#19C4C4) !important;color:#04252a !important;font-weight:700}
.sleek-cal-out{color:var(--muted,#777);opacity:.35;cursor:not-allowed}
.sleek-cal-out:hover{background:none}
.sleek-date-error{border-color:var(--bad,#b91c1c) !important}

/* ── coverage-audit parity additions (fix-all pass) ───────────────────────── */
/* control-account tags on popover rows (live [D]/[C]/[S]/[V]) */
.cb-ctl-tag{display:inline-block;min-width:14px;text-align:center;border-radius:3px;padding:0 3px;font-size:12px;font-weight:700;color:#fff;vertical-align:1px}
.cb-ctl-d{background:#15803d}
.cb-ctl-c{background:#b91c1c}
.cb-ctl-s{background:#6b7280}
.cb-ctl-v{background:#b45309}
/* archived contacts: dimmed with a Disabled tag but selectable (live) */
.cb-contact-off{opacity:.55;border-left:2px solid var(--bad,#b91c1c)}
.cb-off-tag{font-size:12px;font-weight:700;color:var(--bad,#b91c1c);border:1px solid var(--bad,#b91c1c);border-radius:3px;padding:0 3px;vertical-align:1px}
/* preview match-tier badges (live colour-coded provenance) */
.cb-match-badge{border-radius:4px;padding:0 4px;font-size:12px;font-weight:700;color:#fff;background:#6b7280;white-space:nowrap}
.cb-badge-contact{background:#15803d}
.cb-badge-exact{background:#0e7490}
.cb-badge-starts_with{background:#0369a1}
.cb-badge-fuzzy{background:#7c3aed}
.cb-badge-manual{background:#6b7280}
.cb-badge-ai{background:#7c5cff}
/* per-row source-file badge when several imports are loaded (live) */
.cb-file-badge{font-size:12px;color:var(--muted,#777);border:1px solid var(--line,#ddd);border-radius:3px;padding:0 3px;white-space:nowrap}
/* preview D/P totals footer (live table footers) */
.cb-prev-total td{border-top:2px solid var(--line,#ddd);padding-top:6px}
/* drag-drop upload zone (live drop highlight) */
.cb-dropzone{border:1px dashed transparent;border-radius:8px;transition:border-color .15s, background .15s}
.cb-drag-over{border-color:var(--aboo-accent,#19C4C4);background:var(--surface-2,rgba(25,196,196,.08))}
/* stalled-job retry panel (live "Retry Import" after 3 quiet minutes) */
.cb-stage-stall{margin-top:8px;padding:8px;border:1px solid var(--bad,#b91c1c);border-radius:6px;font-size:12px;display:flex;align-items:center;gap:8px;color:var(--ink)}

/* ── number/table utilities on tenant (.page) screens ─────────────────────────
   The .mono/.text-right/.fw-700 helpers were scoped to .cb-page only; the tenant
   books screens (journals, contacts, documents) render inside .page, so scope the
   same helpers to any .cb-table cell — right-aligns money columns everywhere. */
.cb-table .mono{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-variant-numeric:tabular-nums}
.cb-table td.text-right{text-align:right}
.cb-table .fw-700{font-weight:700}
.cb-table .muted{color:var(--muted,#777)}

/* ── Documents / Invoicing (§4) ───────────────────────────────────────────────*/
.doc-table .doc-row{cursor:pointer}
.doc-table .doc-row:hover{background:var(--surface-2,rgba(0,0,0,.04))}
.doc-badge{display:inline-block;min-width:34px;text-align:center;border-radius:4px;padding:1px 5px;font-size:12px;font-weight:700;color:#fff;background:#6b7280;letter-spacing:.02em}
.doc-inv{background:#0e7490}.doc-quo{background:#6b7280}.doc-ord{background:#0369a1}
.doc-crn{background:#b45309}.doc-pord{background:#7c3aed}.doc-grv{background:#15803d}.doc-rts{background:#b91c1c}
.doc-status{display:inline-block;border-radius:999px;padding:1px 9px;font-size:12px;font-weight:700;text-transform:capitalize;border:1px solid var(--line,#ddd);color:var(--muted,#777)}
.doc-draft{color:#b45309;border-color:#b45309}
.doc-posted,.doc-issued{color:#15803d;border-color:#15803d}
/* +New — a menu anchored to the button (owner 2026-08-24: list from the button, not on the page) */
.doc-new-wrap{position:relative;display:inline-flex}
.doc-new-scrim{position:fixed;inset:0;z-index:59}
.doc-new-drop{position:absolute;top:calc(100% + 6px);right:0;z-index:60;min-width:210px;
  background:var(--surface);border:1px solid var(--line);border-radius:8px;
  box-shadow:0 10px 28px rgba(0,0,0,.16);padding:6px;display:flex;flex-direction:column;gap:2px}
.doc-new-item{display:block;width:100%;text-align:left;padding:8px 12px;border:0;background:none;
  color:var(--ink);font-size:.85rem;font-weight:500;border-radius:6px;cursor:pointer;white-space:nowrap}
.doc-new-item:hover{background:var(--brand-faint);color:var(--brand)}
.doc-filter{max-width:180px}
.doc-ed-head{display:flex;align-items:center;gap:12px;margin-bottom:10px}
.doc-ed-back{margin-bottom:2px}
.doc-ed-back .doc-back{padding-left:0}
.doc-ed-form{display:flex;flex-direction:column;gap:12px}
.doc-customer{min-width:240px;flex:1 1 240px;max-width:360px}
.doc-addline{display:flex;flex-wrap:wrap;gap:8px;align-items:center;padding:10px;border:1px dashed var(--line,#ddd);border-radius:8px;background:var(--surface-2,rgba(0,0,0,.02))}
.doc-addline .doc-desc{flex:2 1 200px;min-width:160px}
.doc-addline .doc-qty,.doc-addline .doc-price,.doc-addline .doc-disc{flex:0 0 88px;width:88px}
.doc-addline .doc-vat{flex:0 0 100px;width:100px}
.doc-addline .doc-gl{flex:1 1 200px;min-width:160px}
.doc-addbtn{flex:0 0 auto}
.doc-lines{margin-top:2px}
.doc-totals{display:flex;flex-direction:column;gap:4px;align-items:flex-end;font-size:13px;padding-top:4px}
.doc-totals>div{display:flex;gap:24px;min-width:220px;justify-content:space-between}
.doc-totals>div>span:first-child{color:var(--muted,#777)}
.doc-total-grand{font-weight:700;font-size:15px;border-top:1px solid var(--line,#ddd);padding-top:6px;margin-top:2px;color:var(--ink)}
.doc-ed-actions{display:flex;align-items:center;gap:8px;flex-wrap:wrap;border-top:1px solid var(--line,#ddd);padding-top:12px}
.doc-posted-note{color:var(--ok,#15803d);font-weight:600;font-size:13px}
/* inline-editable line grid (v2 parity) */
.doc-lines th{white-space:nowrap}
.doc-lines td{vertical-align:top;padding:4px 6px}
.doc-cell-desc,.doc-cell-num,.doc-cell-sel,.doc-cell-gl{padding:4px 6px;font-size:13px;height:auto}
.doc-cell-item{min-width:220px}
.doc-cell-desc{width:100%}
.doc-cell-item .doc-cell-sel{margin-bottom:3px;width:100%}
.doc-cell-num{width:78px;text-align:right}
.doc-cell-sel{min-width:78px}
.doc-cell-gl{min-width:150px;max-width:220px}
.doc-addrow{margin:8px 0 2px}
.doc-srcref{font-size:12px;color:var(--muted,#777);border:1px solid var(--line,#ddd);border-radius:999px;padding:1px 9px}
/* print (Print button = browser save-as-PDF; reuses the on-screen doc) */
.doc-print-head{display:none}
.doc-print-co{font-size:20px;font-weight:700}
.doc-print-meta{font-size:13px;color:#333;margin-top:2px}
@media print{
  .drawer,.app-bar,.scrim,.bottom-nav,.tabbar,.doc-noprint,.rp-noprint{display:none !important}
  .main{margin:0 !important}.content{padding:0 !important}
  .doc-print-head{display:block;margin-bottom:12px}
  .rp-printhead{display:block;font-size:18px;font-weight:700;margin-bottom:12px;color:#000}
  .card{border:none !important;box-shadow:none !important}
  .doc-lines td input,.doc-lines td select{border:none !important;padding:2px !important;-webkit-appearance:none;appearance:none;background:none}
}

/* ── Reports (§5) ─────────────────────────────────────────────────────────────*/
.num-neg{color:var(--bad,#b91c1c)}
.rp-group{margin-bottom:18px}
.rp-group-lbl{font-size:12px;text-transform:uppercase;letter-spacing:.04em;color:var(--muted,#777);font-weight:700;margin:0 0 8px}
.rp-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(230px,1fr));gap:12px}
.rp-card{border:1px solid var(--line,#ddd);border-radius:10px;padding:14px;background:var(--surface);cursor:pointer;transition:border-color .12s,box-shadow .12s}
.rp-card:hover{border-color:var(--aboo-accent,#19C4C4);box-shadow:0 1px 8px rgba(0,0,0,.06)}
.rp-card-name{font-weight:700;font-size:15px;color:var(--ink);display:flex;align-items:center;justify-content:space-between;gap:6px}
.rp-card-desc{font-size:12.5px;color:var(--muted,#777);margin-top:5px;line-height:1.35}
.rp-soon{opacity:.6;cursor:default}
.rp-soon:hover{border-color:var(--line,#ddd);box-shadow:none}
.rp-soon-tag{font-size:12px;font-weight:700;text-transform:uppercase;letter-spacing:.03em;color:var(--muted,#777);border:1px solid var(--line,#ddd);border-radius:999px;padding:0 7px}
.rp-filters{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin:4px 0 14px}
.rp-flabel{font-size:12px;color:var(--muted,#777);font-weight:600}
.rp-search{max-width:280px}
.rp-acct{min-width:280px;max-width:420px}
.cb-tabs.rp-party{margin-bottom:0}
.cb-tabs.rp-party .cb-tab.active{border-bottom-color:var(--aboo-accent,#19C4C4);color:var(--ink)}
.rp-table td,.rp-table th{padding:6px 10px}
.rp-table .rp-section td{background:var(--surface-2,rgba(0,0,0,.04));font-weight:700;text-transform:uppercase;font-size:12px;letter-spacing:.03em;color:var(--muted,#666);padding-top:9px}
.rp-table .rp-subtotal td{border-top:1px solid var(--line,#ddd)}
.rp-table .rp-total td{border-top:2px solid var(--ink,#222);font-size:14px}
.rp-note{margin-top:10px;font-size:13px;font-weight:600}
.rp-ok{color:var(--ok,#15803d)}
.rp-bad{color:var(--bad,#b91c1c)}
.rp-gl-head{font-size:13px;font-weight:600;color:var(--ink);margin-bottom:8px}
.rp-actions{display:flex;gap:8px;align-items:center}
.rp-printhead{display:none}
.rp-recon-summary{max-width:420px;margin:6px 0 18px;border:1px solid var(--line,#ddd);border-radius:10px;overflow:hidden}
.rp-recon-summary>div{display:flex;justify-content:space-between;gap:16px;padding:10px 14px;font-size:14px;border-bottom:1px solid var(--line,#eee)}
.rp-recon-summary>div:last-child{border-bottom:none}
.rp-recon-summary span:first-child{color:var(--muted,#777)}
.rp-recon-diff{font-weight:700;background:var(--surface-2,rgba(0,0,0,.03))}
.rp-recon-diff.rp-ok span:last-child{color:var(--ok,#15803d)}
.rp-recon-diff.rp-bad span:last-child{color:var(--bad,#b91c1c)}

/* ── Dashboard (§6) ───────────────────────────────────────────────────────────*/
.dash{display:flex;flex-direction:column;gap:16px}
.dash-ai{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.dash-ai-input{flex:1 1 320px;min-width:200px}
.dash-ai-note{font-size:12px;color:var(--muted,#777)}
.dash-ai-wrap{display:flex;flex-direction:column;gap:10px;margin-bottom:4px}
.dash-ai-out{display:flex;flex-direction:column;gap:8px}
.dash-ai-bar{display:flex;align-items:center;justify-content:space-between;gap:8px}
.dash-ai-count{font-size:12px;color:var(--muted,#777)}
.dash-ai-clear{background:transparent;border:none;color:var(--muted,#777);font-size:12px;cursor:pointer;padding:2px 4px;text-decoration:underline}
.dash-ai-clear:hover{color:var(--bad,#b91c1c)}
.dash-ai-scroll{display:flex;flex-direction:column;gap:8px;max-height:340px;overflow-y:auto;padding-right:4px}
.dash-ai-msg{display:flex;flex-direction:column;gap:6px;max-width:100%}
.dash-ai-user{align-items:flex-end}
.dash-ai-assistant,.dash-ai-error{align-items:flex-start}
.dash-ai-bubble{padding:8px 12px;border-radius:12px;font-size:14px;line-height:1.45;white-space:pre-wrap;max-width:85%;word-wrap:break-word}
.dash-ai-user .dash-ai-bubble{background:var(--aboo-accent,#19C4C4);color:#062a2a;border-bottom-right-radius:4px}
.dash-ai-assistant .dash-ai-bubble{background:rgba(128,128,128,.15);color:var(--ink);border-bottom-left-radius:4px}
.dash-ai-error .dash-ai-bubble{background:rgba(185,28,28,.12);color:var(--bad,#b91c1c)}
.dash-ai-typing{letter-spacing:3px;opacity:.6}
.dash-ai-sug{display:flex;flex-wrap:wrap;gap:6px}
.dash-ai-chip{background:transparent;border:1px solid var(--line,#d3e6e4);color:var(--ink);border-radius:999px;padding:5px 12px;font-size:13px;cursor:pointer}
.dash-ai-chip:hover{border-color:var(--aboo-accent,#19C4C4);color:var(--aboo-accent,#19C4C4)}
.dash-ai-card{max-width:100%;overflow-x:auto;border:1px solid var(--line,#d3e6e4);border-radius:10px;padding:6px 8px;background:var(--surface,#fff)}
.dash-ai-card table{width:100%}
.dash-ai-card-h{font-weight:600;font-size:14px;padding:2px 4px 6px}
.dash-ai-aging{display:flex;flex-wrap:wrap;gap:10px;font-size:13px;padding:2px 4px}
.dash-ai-aging strong{margin-left:auto}
.dash-ai-empty{color:var(--muted,#777);font-size:13px;font-style:italic}
.cb-recon-ai{border-left:3px solid var(--aboo-accent,#19C4C4);background:rgba(128,128,128,.08);padding:8px 12px;border-radius:6px;font-size:13px;line-height:1.45;margin:8px 0;white-space:pre-wrap}
.dash-attention{display:flex;align-items:center;gap:12px;background:var(--warn-bg,rgba(180,83,9,.1));border:1px solid var(--warn,#b45309);border-radius:10px;padding:10px 14px;cursor:pointer;font-size:14px;color:var(--ink)}
.dash-att-badge{background:var(--warn,#b45309);color:#fff;font-weight:700;border-radius:999px;padding:2px 10px;font-size:13px}
.dash-att-go{margin-left:auto;color:var(--warn,#b45309);font-weight:600}
.dash-kpis{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:12px}
.dash-kpi{border:1px solid var(--line,#ddd);border-radius:10px;padding:12px 14px;background:var(--surface)}
.dash-kpi-lbl{font-size:12px;text-transform:uppercase;letter-spacing:.03em;color:var(--muted,#777);font-weight:700}
.dash-kpi-val{font-size:22px;font-weight:700;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-variant-numeric:tabular-nums;color:var(--ink);margin-top:4px}
.dash-kpi-sub{font-size:12px;color:var(--muted,#777);margin-top:2px}
.dash-panels{display:grid;grid-template-columns:repeat(auto-fit,minmax(320px,1fr));gap:16px}
.dash-panel-head{display:flex;align-items:center;justify-content:space-between;margin-bottom:8px}
.dash-panel-title{font-size:15px;font-weight:700;color:var(--ink);margin:0}
.dash-pnl{display:grid;grid-template-columns:1fr 1fr;gap:18px}
.dash-pnl-title{font-size:12px;text-transform:uppercase;letter-spacing:.03em;color:var(--muted,#777);font-weight:700;margin-bottom:6px}
.dash-pnl-row{display:flex;justify-content:space-between;font-size:13px;padding:3px 0}
.dash-pnl-row>span:first-child{color:var(--muted,#777)}
.dash-pnl-net{border-top:1px solid var(--line,#ddd);margin-top:4px;padding-top:6px;font-weight:700}
.dash-pnl-net>span:first-child{color:var(--ink)}
/* P&L this-year-vs-last-year: the figure + a small delta chip on one line (dashboard redesign 2026-09-19) */
.dash-pnl-fig{display:inline-flex;align-items:baseline;gap:8px;white-space:nowrap}
.dash-delta{font-size:12px;font-weight:700;letter-spacing:.01em}
.dash-delta.good{color:var(--good,#16a34a)}
.dash-delta.bad{color:var(--bad,#dc2626)}
.dash-delta.flat{color:var(--muted,#777)}
/* Turnover + VAT quick-read bars (built in JS, widths stamped imperatively) */
.dash-bars-title{font-size:12px;text-transform:uppercase;letter-spacing:.03em;color:var(--muted,#777);font-weight:700;margin:14px 0 6px}
.dash-bars{display:flex;flex-direction:column;gap:8px;margin-bottom:10px}
.dash-bar-row{display:grid;grid-template-columns:minmax(90px,34%) 1fr auto;align-items:center;gap:10px;font-size:13px}
.dash-bar-label{color:var(--muted,#777)}
.dash-bar-track{position:relative;height:12px;background:var(--line,#eee);border-radius:6px;overflow:hidden}
.dash-bar-fill{display:block;height:100%;width:0;border-radius:6px;background:var(--brand,#4f46e5)}
.dash-bar-fill.bar-muted{background:var(--muted,#9ca3af)}
.dash-bar-fill.bar-warn{background:var(--warn,#f59e0b)}
.dash-bar-fill.neg{background:var(--bad,#dc2626)}
.dash-bar-val{font-weight:700;color:var(--ink);text-align:right}
/* Setup guide — Xero-style onboarding checklist (dashboard) */
.setup-guide{margin-bottom:16px}
.setup-head{display:flex;align-items:baseline;gap:10px;flex-wrap:wrap}
.setup-count{color:var(--muted);font-size:13px}
.setup-head .setup-hide{margin-left:auto}
.setup-cards{display:grid;grid-template-columns:repeat(auto-fit,minmax(210px,1fr));gap:12px;margin-top:12px}
.setup-card{background:var(--surface-2);border:1px solid var(--line);border-radius:10px;padding:12px 14px;text-align:left;cursor:pointer;display:flex;flex-direction:column;gap:6px}
.setup-card:hover{border-color:var(--brand)}
.setup-card.done{opacity:.62}
.setup-card-title{font-weight:600;color:var(--brand);display:flex;align-items:center;gap:6px}
.setup-card-desc{color:var(--muted);font-size:12.5px;line-height:1.45;flex:1}
.setup-meter{height:5px;border-radius:3px;background:var(--line);overflow:hidden}
.setup-meter>i{display:block;height:100%;background:var(--brand);border-radius:3px}
.setup-card.done .setup-meter>i{background:var(--ok)}
.setup-pct{font-size:12px;color:var(--muted)}
.setup-showbtn-host{display:inline-flex}
/* Document scan (OCR) — dropzone + dashboard chooser */
.scan-card{display:flex;flex-direction:column;gap:8px}
.dropzone{border:2px dashed var(--line);border-radius:12px;padding:22px 16px;text-align:center;color:var(--muted);cursor:pointer}
.dropzone.over{border-color:var(--brand);color:var(--brand);background:var(--surface-2)}
.dropzone-title{font-weight:600;color:var(--ink);margin-bottom:4px}
.dropzone-hint{font-size:12.5px}
.scan-status{font-size:12.5px}
.scan-result{font-size:12.5px;color:var(--ok);background:var(--surface-2);border:1px solid var(--line);border-radius:8px;padding:8px 10px}
.scan-note{font-size:12px;margin-top:8px}
.scan-segs{display:flex;gap:6px;flex-wrap:wrap;margin:10px 0 12px}
.scan-seg{font-family:inherit;font-size:12.5px;font-weight:650;border:1px solid var(--line);background:var(--surface);color:var(--muted);border-radius:999px;padding:5px 12px;cursor:pointer}
.scan-seg:hover{border-color:var(--brand)}
.scan-seg.on{background:var(--brand);border-color:var(--brand);color:var(--brand-ink)}
.scan-chooser{margin-top:16px}
/* Bill-screen dropzone: give it a little breathing room under the page head */
.doc-page .scan-card{margin-bottom:14px}
/* Column chart (Sales by month) — imperative div bars, heights stamped after build */
.chart-scroll{overflow-x:auto;overflow-y:hidden;padding-bottom:2px}
.chart-col-plot{display:flex;align-items:flex-end;gap:8px;min-width:min-content;padding:6px 2px 0}
.chart-col-item{flex:1 1 0;min-width:64px;display:flex;flex-direction:column;gap:4px}
.chart-col-track{height:150px;display:flex;flex-direction:column;justify-content:flex-end;gap:3px}
.chart-col-value{flex:0 0 auto;font-size:12px;line-height:1.1;color:var(--muted);text-align:center;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.chart-col-bar{flex:0 0 auto;min-height:3px;border-radius:5px 5px 2px 2px;background:var(--brand)}
.chart-col-bar-zero{background:var(--line)}
.chart-col-bar[role="button"]{cursor:pointer}
.chart-col-bar[role="button"]:hover{filter:brightness(1.12)}
.chart-col-bar:focus-visible{outline:2px solid var(--brand);outline-offset:2px}
.chart-col-label{font-size:12px;color:var(--muted);text-align:center;white-space:nowrap}
.chart-empty{color:var(--muted);font-size:12px;padding:10px 0}
/* Needs-Attention inline triage (Wave B) */
.dash-tri{border-color:var(--warn,#b45309)}
.dash-tri-count{display:inline-block;background:var(--warn,#b45309);color:#fff;font-size:13px;font-weight:700;border-radius:999px;padding:1px 9px;margin-left:6px;vertical-align:1px}
.dash-tri-list{display:flex;flex-direction:column;gap:10px;margin-top:8px}
.dash-tri-card{border:1px solid var(--line,#ddd);border-radius:10px;padding:10px 12px;background:var(--surface);transition:opacity .12s}
.dash-tri-card.is-busy{opacity:.5;pointer-events:none}
.dash-tri-top{display:flex;justify-content:space-between;gap:12px;align-items:baseline}
.dash-tri-meta{font-size:12px;color:var(--muted,#777)}
.dash-tri-amt{font-weight:700;font-size:14px}
.dash-tri-desc{font-size:14px;color:var(--ink);margin:3px 0 8px;font-weight:600}
.dash-tri-actions{display:flex;gap:8px;flex-wrap:wrap;align-items:center}
.dash-tri-gl{min-width:210px;flex:1 1 210px;max-width:360px}
.dash-tri-btn{padding:5px 12px;font-size:13px}
.dash-tri-btn.active{border-color:var(--aboo-accent,#19C4C4);color:var(--aboo-accent,#19C4C4)}
.dash-tri-con{margin-top:8px}
.dash-tri-con select{min-width:260px;max-width:400px}
.dash-tri-more{font-size:12.5px;margin-top:10px}
.dash-tri-more .btn-link{padding:0;font-size:12.5px;vertical-align:baseline}

/* ── Dashboard "Bank inbox" — cross-account unallocated-lines worklist (seamless flow) ── */
.bank-inbox-groups{display:flex;flex-direction:column;gap:14px;margin-top:8px}
.bank-inbox-group{display:flex;flex-direction:column;gap:8px}
.bank-inbox-grp-head{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.bank-inbox-acct{font-weight:700;font-size:14px;color:var(--ink,#123)}
.bank-inbox-grp-head .dash-tri-count{margin-left:0}
/* One shared FIXED column layout across every account's table so the columns line up strictly across
   accounts (owner 2026-09-17). Long ref/description WRAP to a second line instead of widening a column. */
.bank-inbox-table{table-layout:fixed;width:100%}
.bank-inbox-table col.bic-sel{width:36px}
.bank-inbox-table col.bic-date{width:96px}
.bank-inbox-table col.bic-ref{width:92px}
.bank-inbox-table col.bic-act{width:118px}
.bank-inbox-table col.bic-amt{width:120px}
.bank-inbox-table col.bic-src{width:92px}
.bank-inbox-table col.bic-bal{width:132px}
.bank-inbox-table.cb-table td.cb-td-ref,.bank-inbox-table.cb-table td.cb-td-desc{white-space:normal;word-break:break-word;overflow-wrap:anywhere}
/* 🔎 slot is always reserved (hidden when a line has no statement image) so ✎ ⇄ ✕ land at the SAME
   x on every row and every account — one continuous action column (owner 2026-09-17). */
.bank-inbox-table .cb-locate-off{visibility:hidden;pointer-events:none}
/* the Auto/Manual source badge never wraps mid-word (owner 2026-09-17) */
.bank-inbox-table .cb-src{display:inline-block;white-space:nowrap}
.bank-inbox-flag{display:inline-flex;align-items:center;gap:3px;font-size:12px;font-weight:700;
  color:var(--warn,#b45309);background:rgba(180,83,9,.10);border-radius:6px;padding:1px 6px}
.bank-inbox-more{margin-top:2px}
.bank-inbox-ok{margin:0 0 8px}
/* account selector strip — mirrors the cashbook Bank Accounts cards; one account shown at a time */
.bank-inbox-cards{margin:2px 0 12px}
.bank-inbox-card{min-width:130px;max-width:200px;gap:4px}
.bank-inbox-card .cb-card-badge{background:var(--warn,#b45309)}
.bank-inbox-card.active .cb-card-badge{background:var(--brand)}
/* allocated-row success — v2 bank_import parity (green faint + ✓, hold, THEN the row drops).
   fixed green matches the sibling .dash-tri-done / .alloc-pill-rule success styling below. */
.bank-inbox-ok-row{border-color:#0a8f5b;background:rgba(10,143,91,.10);animation:bank-inbox-ok .5s ease-out}
@keyframes bank-inbox-ok{0%{background:rgba(10,143,91,.30)}100%{background:rgba(10,143,91,.10)}}
.bank-inbox-ok-tick{display:inline-flex;align-items:center;gap:4px;font-weight:800;font-size:12.5px;color:#0a8f5b}

/* ── Settings (§7) ────────────────────────────────────────────────────────────*/
.set-tabs{margin-bottom:14px}
.set-tabs .cb-tab.active{border-bottom-color:var(--aboo-accent,#19C4C4);color:var(--ink)}
.set-card{max-width:780px}
.set-form{display:flex;flex-direction:column;gap:14px}
.set-row{display:flex;flex-direction:column;gap:4px}
.set-lbl{font-size:12px;font-weight:600;color:var(--muted,#777)}
.set-grid2{display:grid;grid-template-columns:1fr 1fr;gap:14px}
.set-toggles{display:flex;flex-direction:column;gap:10px;padding-top:2px}
.set-actions{display:flex;align-items:center;gap:12px;border-top:1px solid var(--line,#ddd);padding-top:14px}
.set-note{font-size:13px;color:var(--ok,#15803d);font-weight:600}
.set-form-title{font-size:14px;font-weight:700;color:var(--ink)}
/* API Keys tab: AI-provider section header/badge + key row + threshold slider (staging parity) */
.set-section{margin:6px 0 2px}
.set-section:not(:first-child){margin-top:24px;padding-top:18px;border-top:1px solid var(--line,#ddd)}
.set-section-title{font-size:15px;font-weight:800;color:var(--ink);margin:0}
.set-section-note{font-size:13px;color:var(--muted,#777);margin:4px 0 0;line-height:1.5;max-width:780px}
.set-key-row{display:flex;gap:8px;align-items:stretch}
.set-key-row .form-control{flex:1 1 auto}
/* AI-key action buttons (Change key / Disable AI / Enable AI / Show / Cancel) — equal width AND the
   same height as the key input (32px), so they don't sit "thicker" than the field next to them. */
.set-key-row .set-key-act{flex:0 0 auto;min-width:112px;height:32px;display:inline-flex;
  align-items:center;justify-content:center;text-align:center;line-height:1}
.set-range{width:100%;accent-color:var(--aboo-accent,var(--brand))}
.set-badge{display:inline-block;font-size:12px;font-weight:700;padding:1px 8px;border-radius:10px;margin-left:8px;vertical-align:1px}
.set-badge-ok{background:var(--brand-faint,#d1fae5);color:var(--ok)}
.set-badge-warn{background:#fef3c7;color:var(--warn)}
.set-hr{border:none;border-top:1px solid var(--line);margin:16px 0 4px}
.set-stack{display:flex;flex-direction:column;gap:16px}
.set-help{font-size:12.5px;color:var(--muted,#777);margin:0;line-height:1.5}
.fx-add{display:flex;flex-direction:column;gap:14px}
.fx-rates{width:100%;border-collapse:collapse;font-size:13px}
.fx-rates th{text-align:left;font-size:12px;text-transform:uppercase;letter-spacing:.04em;color:var(--muted,#777);font-weight:700;padding:6px 8px;border-bottom:1px solid var(--line,#ddd)}
.fx-rates td{padding:6px 8px;border-bottom:1px solid var(--line,#eee);color:var(--ink)}
.fx-rates .fx-num{text-align:right;font-variant-numeric:tabular-nums}
.fx-scope{display:inline-block;font-size:12px;font-weight:600;padding:1px 8px;border-radius:10px;background:var(--brand-fainter);color:var(--muted)}
.fx-scope-own{background:var(--brand-faint);color:var(--aboo-accent);font-weight:700}
.fx-reval{margin-top:2px}
.set-coa-bar{margin-bottom:10px}
.set-typef{max-width:190px}
.set-re{display:flex;align-items:center;gap:10px;flex-wrap:wrap}
.set-re .set-lbl{margin:0}
.set-re-sel{min-width:260px;max-width:380px}
.set-coa .set-stmt{display:inline-block;font-size:12px;font-weight:700;border-radius:3px;padding:0 4px;margin-left:4px;vertical-align:1px;color:#fff}
.set-coa .set-BS{background:#0369a1}
.set-coa .set-IS{background:#7c3aed}
.set-acts{white-space:nowrap;display:flex;align-items:center;gap:6px;justify-content:flex-end}
.btn-icon{border:1px solid var(--line,#ddd);background:var(--surface);border-radius:6px;cursor:pointer;font-size:13px;padding:2px 7px;color:var(--ink)}
.btn-icon:hover{border-color:var(--aboo-accent,#19C4C4)}
.set-coa-count{font-size:12px;color:var(--muted,#777);margin-top:8px}
.set-vat-note{text-align:left;padding:10px 0}

/* Branding tab (§7 Settings → Branding) */
.bt-color-row{display:flex;align-items:center;gap:8px}
.bt-swatch{width:44px;height:38px;padding:2px;border:1px solid var(--line,#ddd);border-radius:6px;background:var(--surface);cursor:pointer;flex:0 0 auto}
.bt-hex{flex:1 1 auto}
.bt-area{min-height:70px;resize:vertical;font-family:inherit}
.bt-logo-prev{max-height:64px;max-width:220px;margin-top:8px;border:1px solid var(--line,#ddd);border-radius:6px;padding:6px;background:var(--surface);object-fit:contain}
.bt-remit-title{border-top:1px solid var(--line,#ddd);padding-top:14px;margin-top:2px}

/* API Keys tab (§7 Settings → API Keys) */
.ak-secret{border:1px solid var(--aboo-accent,#19C4C4);background:var(--accent-weak,rgba(25,196,196,.08));border-radius:8px;padding:12px 14px;margin-bottom:14px}
.ak-secret-title{font-size:13px;font-weight:600;color:var(--ink);margin-bottom:8px}
.ak-secret-row{display:flex;align-items:center;gap:10px;flex-wrap:wrap}
.ak-secret-code{flex:1 1 auto;min-width:220px;font-family:monospace;font-size:13px;background:var(--surface);border:1px solid var(--line,#ddd);border-radius:6px;padding:8px 10px;color:var(--ink);word-break:break-all;user-select:all}
.ak-copy{flex:0 0 auto}
.ak-env{display:inline-block;font-size:12px;font-weight:700;text-transform:uppercase;letter-spacing:.02em;border-radius:3px;padding:1px 6px;color:#fff}
.ak-env-live{background:#0369a1}
.ak-env-test{background:#a16207}
.ak-st-active{color:var(--ok,#15803d);font-weight:600;font-size:12px}
.ak-st-revoked{color:var(--muted,#777);font-weight:600;font-size:12px}
.ak-revoked{opacity:.55}
/* MCP key permission checklist */
.mcp-scopes{display:grid;grid-template-columns:repeat(auto-fill,minmax(240px,1fr));gap:6px;margin-top:6px}
.mcp-scope{display:flex;align-items:baseline;gap:8px;padding:8px 10px;border:1px solid var(--line,#ddd);border-radius:8px;cursor:pointer;background:var(--surface)}
.mcp-scope:hover{border-color:var(--aboo-accent,#19C4C4)}
.mcp-scope input{margin:0;flex:0 0 auto;align-self:center}
.mcp-scope-code{font-family:monospace;font-size:12px;font-weight:700;color:var(--ink);flex:0 0 auto}
.mcp-scope-lbl{font-size:12px;color:var(--muted,#777)}
@media (max-width:560px){.mcp-scopes{grid-template-columns:1fr}}

/* Communications tab (§7 Settings → Communications) */
.cm-subtabs{margin-bottom:14px}
.cm-body{min-height:120px}
/* Branding, comms and reminders share one tab — separate the comms block from the branding form's
   Save button above it so they don't collide (owner 2026-09-15 "buttons are squished together"). */
.set-comms-block{margin-top:22px;padding-top:18px;border-top:1px solid var(--line)}
.cm-tokens{font-size:12px}
.cm-subj{max-width:280px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.cm-kind{display:inline-block;font-size:12px;font-weight:700;text-transform:uppercase;letter-spacing:.02em;border-radius:3px;padding:1px 6px;background:var(--chip-bg,rgba(25,196,196,.12));color:var(--aboo-accent,#0d9488)}
.cm-sys{opacity:.72}
.cm-st{display:inline-block;font-size:12px;font-weight:700;border-radius:3px;padding:1px 7px}
.cm-st-queued{background:#e0e7ff;color:#3730a3}
.cm-st-sending{background:#fef3c7;color:#92400e}
.cm-st-sent{background:#dcfce7;color:#166534}
.cm-st-failed,.cm-st-bounced{background:#fee2e2;color:#991b1b}

/* Import tab (§7 Settings → Import) */
.imp-textarea{min-height:130px;font-family:monospace;font-size:13px;resize:vertical;white-space:pre}
.imp-or{text-align:center;color:var(--muted,#777);font-size:12px;margin:2px 0}
.imp-filebtn{display:inline-block;cursor:pointer;position:relative;overflow:hidden}
.imp-file{position:absolute;left:0;top:0;opacity:0;width:100%;height:100%;cursor:pointer}
.imp-maps{display:grid;grid-template-columns:1fr 1fr;gap:10px 14px}
.imp-map{display:flex;flex-direction:column;gap:4px}
.imp-deftype-row{max-width:360px}
.imp-preview{margin-top:6px}
.imp-preview .cb-table th,.imp-preview .cb-table td{white-space:nowrap;max-width:180px;overflow:hidden;text-overflow:ellipsis}
.imp-result{font-size:15px;font-weight:600;color:var(--ok,#15803d)}
.imp-errs{margin:6px 0 0;padding-left:18px;color:var(--bad,#b91c1c);font-size:13px}

/* Email-a-document panel (§4 Documents → ✉ Email) */
.doc-email-panel{border-top:1px solid var(--line,#ddd);margin-top:12px;padding-top:12px}
.doc-email-row{display:flex;align-items:center;gap:8px;margin-top:6px;flex-wrap:wrap}
.doc-email-row .form-control{flex:1 1 auto;max-width:340px}
.doc-email-note{margin-top:8px;font-size:13px;font-weight:600;color:var(--ink)}

/* Service items — categories + items over the new pricing model (plan/pricing-redesign.md).
   Two sub-tabs, each with a toolbar + list + slide-out form. */
.inv-page{display:flex;flex-direction:column;gap:14px}
.inv-subtabs{margin-bottom:8px;border-bottom:1px solid var(--line,#e5e7eb);display:flex;gap:2px}
.inv-subtabs .cb-tab{display:inline-flex;align-items:center;gap:6px;padding:9px 14px;background:transparent;border:none;border-bottom:2px solid transparent;color:var(--muted,#6b7280);font-size:14px;font-weight:600;cursor:pointer}
.inv-subtabs .cb-tab.active{border-bottom-color:var(--aboo-accent,#0BA8A0);color:var(--ink,#1a1f2e)}
.inv-toolbar{display:flex;align-items:center;gap:12px;flex-wrap:wrap}
.inv-ccy-filter{display:flex;align-items:center;gap:8px;margin:0}
.inv-ccy-filter span{font-size:12px;color:var(--muted,#6b7280);font-weight:600;text-transform:uppercase;letter-spacing:.02em}
.inv-ccy-filter select{padding:6px 10px;font-size:13px;min-width:120px}

/* List rows — clickable, each shows its per-currency prices inline. On mobile the row
   stacks (name + sub on top, prices row + delete below) so long names don't fight the
   price chips for width. */
.inv-list{display:flex;flex-direction:column;gap:6px}
.inv-row{display:flex;align-items:center;gap:14px;padding:12px 14px;background:var(--surface,#fff);border:1px solid var(--line,#e5e7eb);border-radius:10px;cursor:pointer;transition:background .12s,border-color .12s}
.inv-row:hover{background:var(--hover,#f9fafb);border-color:var(--aboo-accent,#0BA8A0)}
.inv-row-main{flex:1;min-width:0}
.inv-row-name{font-size:14px;font-weight:600;color:var(--ink,#1a1f2e)}
.inv-row-sub{font-size:12px;margin-top:2px}
.inv-row-prices{display:flex;flex-wrap:wrap;gap:4px;max-width:55%;justify-content:flex-end}
@media (max-width:767px){
  .inv-row{flex-direction:column;align-items:stretch;gap:10px;padding:12px}
  .inv-row-main{width:100%}
  .inv-row-name{white-space:normal}
  .inv-row-prices{max-width:100%;justify-content:flex-start;margin-top:2px}
  .inv-row .btn-row-del{align-self:flex-end;margin-top:-40px}
}

/* Form panel — appears in place of the list once a row / Add is clicked */
.inv-form{background:var(--surface,#fff);border:1px solid var(--line,#e5e7eb);border-radius:12px;padding:18px 20px;display:flex;flex-direction:column;gap:14px}
.inv-form-head{display:flex;align-items:flex-start;justify-content:space-between;gap:12px;padding-bottom:10px;border-bottom:1px solid var(--line,#e5e7eb)}
.inv-form .grid2{display:grid;grid-template-columns:1fr 1fr;gap:12px}
.inv-form .fld{display:flex;flex-direction:column;gap:4px}
.inv-form .fld>span{font-size:12px;font-weight:600;color:var(--muted,#6b7280);text-transform:uppercase;letter-spacing:.02em}

/* Prices grid inside the form — currency chip, rate, unit, tax, remove */
.inv-prices{display:flex;flex-direction:column;gap:8px;padding:14px;background:var(--muted-bg,#f9fafb);border:1px solid var(--line,#f3f4f6);border-radius:10px}
.inv-prices-head{display:flex;align-items:baseline;justify-content:space-between;font-size:12px;font-weight:700;text-transform:uppercase;letter-spacing:.02em;color:var(--ink,#1a1f2e)}
.inv-price-header{display:grid;grid-template-columns:110px 140px 120px 1fr;gap:8px;font-size:10px;font-weight:700;letter-spacing:.06em;text-transform:uppercase;color:var(--muted,#9ca3af);padding:0 4px}
.inv-price-row{display:grid;grid-template-columns:110px 140px 120px 1fr;gap:8px;align-items:center}
.inv-prices.no-tax .inv-price-header,.inv-prices.no-tax .inv-price-row{grid-template-columns:110px 1fr 140px}
.inv-price-row.is-override .form-control{border-color:#fbbf24;background:#fffbeb}
.inv-price-ccy{font-size:13px;display:flex;align-items:center;gap:4px}
.inv-price-tag{font-size:10px;font-weight:700;letter-spacing:.06em;text-transform:uppercase;padding:3px 8px;border-radius:999px}
.inv-price-tag.inherit{background:#ecfdf5;color:#047857}
.inv-price-tag.override{background:#fef3c7;color:#92400e}

/* Mobile: the 4-column grid doesn't fit at 375px. Stack each row as
     [ Currency label + BASE ]
     [ Rate                   Unit  ]
     [ Tax (full width)              ]
   and stack the section head (title + hint) so they don't overlap. */
@media (max-width: 720px){
  .inv-prices{padding:10px}
  .inv-prices-head{flex-direction:column;align-items:flex-start;gap:4px}
  .inv-price-header{display:none}
  .inv-price-row{grid-template-columns:1fr 1fr;grid-auto-flow:row dense;row-gap:6px;column-gap:8px;padding:8px 0;border-bottom:1px solid var(--line,#f3f4f6)}
  .inv-price-row:last-child{border-bottom:0}
  .inv-price-ccy{grid-column:1 / -1;font-size:14px}
  .inv-price-row input[type="text"],
  .inv-price-row input[inputmode="decimal"]{grid-column:1 / 2}
  .inv-price-row input:not([type="text"]):not([inputmode="decimal"]){grid-column:2 / 3}
  .inv-price-row select{grid-column:1 / -1}
  .inv-prices.no-tax .inv-price-row{grid-template-columns:1fr 1fr}
}


/* Quick Invoice (§4 A6) — rapid line capture */
.doc-head-actions{display:flex;gap:8px;align-items:center;flex-wrap:wrap}
.qi-sub{margin:2px 0 0;font-size:12px}
.qi-daterow{display:flex;align-items:center;gap:10px;margin-bottom:12px}
.qi-daterow .muted{font-size:12px}
.qi-date{max-width:180px}
.qi-entry{padding:14px}
.qi-fields{display:flex;gap:10px;flex-wrap:wrap;align-items:flex-end}
.qi-f{display:flex;flex-direction:column;gap:4px;position:relative;min-width:0}
.qi-f label{font-size:12px;font-weight:600;color:var(--muted,#666);display:flex;justify-content:space-between;gap:8px}
.qi-f-cust{flex:2 1 190px}
.qi-f-item{flex:2 1 190px}
.qi-f-qty{flex:0 0 74px}
.qi-f-price{flex:0 0 104px}
.qi-f-disc{flex:0 0 74px}
.qi-f-add{flex:0 0 auto}
.qi-add{min-width:64px}
.qi-newlink{color:var(--aboo-accent,#19C4C4);cursor:pointer;font-weight:600;font-size:12px}
.qi-newlink:hover{text-decoration:underline}
.qi-desc{margin-top:10px}
.qi-upper{text-transform:uppercase}
.qi-err{margin-top:10px}
.qi-note{margin-top:10px;color:var(--aboo-accent,#0a8f8f);font-size:13px;font-weight:600}
/* search dropdowns */
.qi-drop{position:absolute;left:0;right:0;top:100%;margin-top:2px;background:var(--surface,#fff);
  border:1px solid var(--line,#ddd);border-radius:8px;box-shadow:0 6px 18px rgba(0,0,0,.12);
  max-height:230px;overflow-y:auto;z-index:60}
.qi-drop-item{display:flex;align-items:center;gap:8px;flex-wrap:wrap;padding:8px 11px;cursor:pointer;
  border-bottom:1px solid var(--line,#eee);font-size:13px}
.qi-drop-item:last-child{border-bottom:none}
.qi-drop-item:hover{background:var(--hover,rgba(25,196,196,.08))}
.qi-drop-code{font-size:12px;margin-left:auto}
.qi-drop-price{font-size:12px}
.qi-drop-new{color:var(--aboo-accent,#0a8f8f);font-weight:700}
/* batch tables */
.qi-batch{padding:14px;margin-top:14px}
.qi-batch-head{display:flex;align-items:center;justify-content:space-between;gap:10px;margin-bottom:10px}
.qi-batch-head h3{margin:0;font-size:15px}
.qi-pill{display:inline-block;font-size:12px;font-weight:700;border-radius:999px;padding:2px 10px;color:#fff}
.qi-pill-warn{background:#d97706}
.qi-pill-info{background:#0369a1}
.qi-table td,.qi-table th{padding:7px 9px}
.qi-row{cursor:pointer;transition:background .12s}
.qi-row:hover{background:var(--hover,rgba(25,196,196,.06))}
.qi-edit-row td{padding:3px 6px;vertical-align:middle}
.qi-ein{padding:5px 7px;font-size:13px}
.qi-enum{width:74px;text-align:right;font-family:var(--mono,monospace)}
.qi-acts{white-space:nowrap;display:flex;gap:5px;justify-content:flex-end}
.qi-ok{color:#fff;background:var(--aboo-accent,#19C4C4);border-color:var(--aboo-accent,#19C4C4)}
.qi-del:hover{border-color:var(--bad,#dc2626);color:var(--bad,#dc2626)}
.qi-batch-actions{display:flex;gap:8px;margin-top:12px;flex-wrap:wrap}
.qi-empty{padding:26px 16px;text-align:center;margin-top:14px}
/* inline new-record forms */
.qi-newform{padding:14px;margin-top:12px;border:1px solid var(--aboo-accent,#19C4C4)}
.qi-newform-head{display:flex;align-items:center;justify-content:space-between;margin-bottom:10px}
.qi-newform-head h3{margin:0;font-size:14px}
.qi-newform-body{display:flex;gap:10px;flex-wrap:wrap;align-items:flex-end}
@media (max-width:640px){
  .qi-fields .qi-f{flex:1 1 100%}
  .qi-f-qty,.qi-f-price,.qi-f-disc{flex:1 1 45%}
  .hide-sm{display:none !important}
}

/* Contacts → Documents tab (a contact's own documents) */
.ct-doc-row{cursor:pointer;transition:background .12s}
.ct-doc-row:hover{background:var(--hover,rgba(25,196,196,.06))}
.ct-doc-st{display:inline-block;font-size:12px;font-weight:700;text-transform:uppercase;letter-spacing:.02em;
  border-radius:999px;padding:1px 8px;color:#fff}
.ct-doc-st-draft{background:#64748b}
.ct-doc-st-issued{background:#0369a1}
.ct-doc-st-posted{background:#0a8f5b}
.ct-doc-st-void{background:#b91c1c}

/* Contact tags (chips) */
.ct-tags{display:flex;flex-wrap:wrap;align-items:center;gap:6px;margin-top:8px}
.ct-tag{display:inline-flex;align-items:center;gap:5px;font-size:12px;font-weight:600;
  background:var(--hover,rgba(25,196,196,.12));color:var(--ink,#123);border:1px solid var(--line,#dde);
  border-radius:999px;padding:2px 6px 2px 10px}
.ct-tag-x{border:none;background:transparent;color:var(--muted,#789);cursor:pointer;font-size:12px;
  line-height:1;padding:0 2px;border-radius:50%}
.ct-tag-x:hover{color:var(--bad,#dc2626);background:var(--line,#eee)}
.ct-tag-addform{display:inline-flex;margin:0}
.ct-tag-input{border:1px dashed var(--line,#cdd);background:transparent;border-radius:999px;
  padding:2px 10px;font-size:12px;color:var(--ink);width:96px;outline:none}
.ct-tag-input:focus{border-style:solid;border-color:var(--aboo-accent,#19C4C4);width:130px}

/* Batch Invoicing (§9 A6b) */
.bt-card{display:flex;align-items:center;justify-content:space-between;gap:12px;cursor:pointer}
.bt-name{font-weight:600}
.bt-sub{font-size:12px;margin-top:2px}
.bt-go{color:var(--muted,#789);font-size:20px}
.bt-newform{padding:14px;margin-bottom:14px}
.bt-newform-body{display:flex;gap:10px;flex-wrap:wrap;align-items:flex-end}
.bt-addmember,.bt-addline{padding:14px;margin-top:14px}
.bt-tagrow{display:flex;gap:8px}
.bt-runrate,.qi-f-runrate{flex:0 0 150px;display:flex;flex-direction:column;gap:4px}
.bt-members{display:flex;flex-direction:column;gap:10px;margin-top:14px}
/* Member cards are a single-select list: click one to edit its lines in the grid below. The SELECTED
   card gets a clear brand treatment — left accent bar, brand border, tinted fill, lift + brand name —
   because the old `.active` class had no styling at all, so a click gave no feedback (owner 2026-09-09).
   Tokens only (works in admin aboo.css :root AND tenant body.vt). */
.bt-member{padding:12px 14px;cursor:pointer;border-left:3px solid transparent;
  transition:border-color .15s,background .15s,box-shadow .15s}
.bt-member:hover:not(.active):not(.bt-excluded){border-left-color:var(--line);
  background:color-mix(in srgb,var(--ink) 4%,transparent)}
.bt-member:focus-visible{outline:2px solid var(--brand);outline-offset:2px}
.bt-member.active{border-color:var(--brand);border-left-color:var(--brand);
  background:color-mix(in srgb,var(--brand) 12%,transparent);
  box-shadow:0 2px 10px color-mix(in srgb,var(--brand) 20%,transparent)}
.bt-member.active .bt-member-name{color:var(--brand)}
.bt-member-editing{color:var(--brand);font-weight:600}
.bt-member.bt-paused{opacity:.6}
.bt-member-head{display:flex;align-items:center;justify-content:space-between;gap:10px}
.bt-member-name{font-weight:600;display:flex;align-items:center;gap:8px}
.bt-member-code{font-size:12px;font-weight:400}
.bt-pausetag{font-size:12px;font-weight:700;text-transform:uppercase;background:#d97706;color:#fff;border-radius:999px;padding:1px 7px}
.bt-member-act{display:flex;align-items:center;gap:8px}
.bt-member-total{font-weight:600}
.bt-wontbill{color:var(--warn,#92651a);font-size:12.5px;margin-top:2px}
/* Editor: members list stacked ABOVE a FULL-WIDTH line grid. The grid needs the whole width for its
   Item / Description / Qty / Price / Tax / Account / Kind / Period columns — exactly like the
   documents editor. An earlier side-by-side split squeezed the grid to ~60% and cut inputs off and
   clipped the dropdowns, so members now sit in a compact band on top and the grid spans full width. */
.bt-editor-cols{display:grid;grid-template-columns:1fr;gap:14px;margin-top:14px}
.bt-editor-cols .bt-addmember,.bt-editor-cols .bt-addline{margin-top:0}
/* The members card now spans full width because each selected member expands its OWN line grid
   INLINE (golden rule #7); the grid needs the whole width for its 9 columns, so no max-width cap. */
/* Multi-select bulk-action bar + per-member checkbox */
.bt-bulkbar{display:flex;align-items:center;flex-wrap:wrap;gap:8px;margin-top:12px;padding:8px 12px;border-radius:10px;
  background:color-mix(in srgb,var(--brand) 10%,transparent);border:1px solid var(--brand)}
.bt-bulk-n{font-weight:700;margin-right:2px}
.bt-bulk-warn{font-weight:600;color:var(--bad)}
.bt-member-lead{display:flex;align-items:center;gap:9px;min-width:0}
.bt-member-check{display:inline-flex;align-items:center;margin:0;cursor:pointer}
.bt-member-check input{width:16px;height:16px;cursor:pointer}
.bt-lines{margin-top:8px;display:flex;flex-direction:column;gap:4px}
.bt-line{display:flex;align-items:center;gap:10px;padding:4px 0;border-top:1px solid var(--line,#eee)}
.bt-line-desc{flex:1;min-width:0}
.bt-line-when{font-size:12px;color:var(--muted,#789);margin-left:6px}
.bt-line-qty{color:var(--muted,#789);font-size:12px}
.bt-line-amt{font-weight:600;min-width:80px;text-align:right}
.bt-noline{font-size:12px;margin-top:6px}
.bt-empty{margin-top:14px}
.bt-del:hover{border-color:var(--bad,#dc2626);color:var(--bad,#dc2626)}
.bt-run-row{display:flex;align-items:flex-end;gap:10px;flex-wrap:wrap}
.bt-run-hint{font-size:12px}
.bt-link{color:var(--aboo-accent,#0a8f8f);cursor:pointer;font-weight:700}
.bt-link:hover{text-decoration:underline}
/* Batch run page (v2 batch/run.twig) */
.bt-runpage .bt-runhead{margin-bottom:12px}
.bt-run-bank{min-width:200px}
.bt-run-spacer{flex:1 1 auto}
.bt-run-notes{font-size:12px;margin-top:8px}
.bt-run-summary{display:flex;gap:10px;flex-wrap:wrap;align-items:center;margin-top:12px}
.bt-run-lines{background:var(--muted)}
.bt-run-total{background:var(--brand);font-size:13px}   /* the estimated total — the headline figure of the run */
.bt-run-actions{flex-wrap:wrap;gap:8px}
.bt-run-pills{margin:2px 0 10px}
.bt-run-line{flex-wrap:wrap}
.bt-run-desc{flex:1 1 220px;min-width:160px}
.bt-run-removed{opacity:.65;font-size:13px;justify-content:space-between;flex-wrap:wrap}
.bt-run-adhoc{background:var(--hover,rgba(25,196,196,.06));border-radius:8px;padding:6px 8px}
.bt-adhoc-tag{font-size:12px;font-weight:700;text-transform:uppercase;color:var(--aboo-accent,#0a8f8f);white-space:nowrap}
.bt-keep{font-size:12px;white-space:nowrap;display:flex;align-items:center;gap:4px;cursor:pointer}
.bt-debit-badge{font-size:12px;font-weight:700;background:var(--aboo-accent,#0a8f8f);color:#fff;border-radius:999px;padding:1px 8px;white-space:nowrap}
.bt-run-addadhoc{display:flex;align-items:center;gap:10px;margin-top:8px;font-size:12px}
.bt-complete{margin-top:6px}
.bt-complete-title{font-size:18px;font-weight:700;color:var(--good,#16a34a);margin-bottom:10px}
.bt-complete-grid{display:flex;flex-direction:column;gap:6px;max-width:420px}
.bt-complete-row{display:flex;justify-content:space-between;gap:12px;font-size:14px;border-bottom:1px solid var(--line,#eee);padding-bottom:6px}
.bt-complete-errs{margin-top:10px;display:flex;flex-direction:column;gap:4px}
.bt-complete-actions{display:flex;gap:10px;flex-wrap:wrap;margin-top:14px}
.bt-complete-actions-right{justify-content:flex-end;align-items:center}   /* golden rule: right-aligned run-export/return actions, uniform .btn height */
/* Assets screen */
.as-head-actions{display:flex;gap:8px;flex-wrap:wrap}
.as-toolbar{display:flex;gap:8px;flex-wrap:wrap;align-items:center;margin-bottom:8px}
.as-search{flex:1 1 220px;min-width:180px}
.as-catsel{flex:0 1 220px}
.as-pills{margin:2px 0 10px}
.as-table tbody tr.as-row{cursor:pointer}
.as-table tbody tr.as-row:hover{background:var(--hover,rgba(25,196,196,.06))}
.as-row-act{white-space:nowrap}
.as-dispose{display:inline-flex;gap:6px;align-items:center;flex-wrap:wrap}
.as-d-in{width:150px;display:inline-block}
.as-form{max-width:900px;margin-bottom:14px}
.as-form-actions{display:flex;gap:10px;flex-wrap:wrap;margin-top:12px}
.as-notes{margin-top:10px}
.as-sched{margin-top:16px}
.as-cat-code{font-size:12px}
.as-cat-act{white-space:nowrap;display:flex;gap:6px;align-items:center}
.as-cat-formtitle{margin-top:14px}
.as-depr-result{margin-top:12px}
.as-depr-done{margin-top:10px;padding:10px 12px;background:var(--hover,rgba(25,196,196,.1));border-radius:8px;font-size:13px;font-weight:600}
.as-disp-note{margin-top:10px}
.as-toast{position:sticky;top:0;z-index:5;margin-bottom:10px;padding:8px 12px;background:var(--brand,#19c4c4);color:var(--aboo-ink,#08312f);border-radius:8px;font-weight:600;font-size:13px}
.bt-runs{padding:14px;margin-top:14px}
.bt-runs-head h3{margin:0 0 8px;font-size:15px}
.bt-run-st{display:inline-block;font-size:12px;font-weight:700;text-transform:uppercase;border-radius:999px;padding:1px 8px;color:#fff}
.bt-run-st-completed{background:#0a8f5b}
.bt-run-st-running{background:#0369a1}
.bt-run-st-failed{background:#b91c1c}
.bt-run-st-draft{background:#64748b}

/* v2-parity sweep: outstanding-import review flags on the account cards */
.cb-card-review{outline:2px solid var(--bad,#dc2626);outline-offset:1px}
/* status ribbon along the card's bottom edge — flows below the balance so it never overlaps it
   or the icons (was absolute bottom-left → collided with both) */
.cb-review-flag,.cb-imp-badge{display:block;margin:8px -12px -10px;padding:4px 10px;
  border-radius:0 0 10px 10px;font-size:12px;font-weight:700;color:#fff;text-align:center;
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis;pointer-events:none}
.cb-review-flag{background:var(--bad,#dc2626)}
/* per-card statement-import badge (several cards can import at once) */
.cb-imp-badge{background:var(--aboo-accent,#19C4C4)}
.cb-card{position:relative}
/* review: work one account's import at a time */
.cb-prev-accts{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin:8px 0}
.cb-prev-accts .cb-panel-hint{margin:0}
/* the SELECTED statement-sort chip must read at a glance: filled accent, bold, a soft ring
   and a lift so "you are on OVK / All" is unmistakable (owner 2026-09-08). */
.chip-btn.chip-on{background:var(--aboo-accent,#19C4C4);border-color:var(--aboo-accent,#19C4C4);
  color:#fff;font-weight:800;box-shadow:0 0 0 3px color-mix(in srgb, var(--aboo-accent,#19C4C4) 28%, transparent)}
.chip-btn.chip-on:hover{border-color:var(--aboo-accent,#19C4C4)}
/* AI answer: persistent clickable solutions */
.cb-ask-solutions{margin-top:10px;display:flex;flex-direction:column;gap:6px;align-items:flex-start}
.cb-sol-head{font-size:12px;color:var(--muted,#789);font-weight:600}
.cb-sol-pill{display:inline-flex;align-items:center;gap:6px;max-width:100%;text-align:left;
  border:1px solid var(--line,#dde);background:var(--surface,#fff);color:var(--ink,#123);
  border-radius:8px;padding:5px 10px;font-size:13px;cursor:pointer;transition:border-color .12s}
.cb-sol-pill:hover{border-color:var(--aboo-accent,#19C4C4)}
.cb-sol-allocate{border-left:3px solid var(--aboo-accent,#19C4C4)}
.cb-sol-add{border-left:3px solid #0a8f5b}
.cb-sol-edit{border-left:3px solid #d97706}
.cb-sol-delete{border-left:3px solid var(--bad,#dc2626)}
.cb-sol-done{opacity:.55;text-decoration:line-through;cursor:default}
.cb-sol-done:hover{border-color:var(--line,#dde)}
.page-back{margin-bottom:4px}

/* dashboard Needs-Attention — v2 triage cards */
.dash-tri-io{font-size:12px;font-weight:800;letter-spacing:.04em;border-radius:4px;padding:1px 7px;color:#fff}
.dash-tri-io.io-in{background:#0a8f5b}
.dash-tri-io.io-out{background:var(--bad,#dc2626)}
.dash-tri-xcount{font-weight:700;font-size:12px;color:var(--muted,#789)}
.dash-tri-banks{font-size:12px;color:var(--muted,#789);flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.dash-tri-top{display:flex;align-items:center;gap:8px}
.dash-tri-pills{display:flex;align-items:center;gap:6px;flex-wrap:wrap;margin-top:8px}
/* Bank inbox: the GL search sits FIRST (left) at a FIXED width so every row's search is the
   same size whether or not an AI suggestion chip follows it (owner 2026-09-16). */
.bank-inbox-gl-search{flex:0 1 340px;max-width:100%}
/* Bank inbox dest tabs (General · Debtors · Creditors · VAT, v2 parity) — a wrapping row of the
   shared .cb-dest-pill above each line's General GL picker. Only shown when >1 dest exists. */
.bank-inbox-dest-row{display:flex;gap:4px;flex-wrap:wrap;margin:8px 0 0}
.alloc-pill-sug{display:inline-flex;align-items:center;gap:6px;border:1px solid var(--line,#dde);
  background:var(--surface,#fff);color:var(--ink,#123);border-radius:8px;padding:4px 10px;
  font-size:13px;cursor:pointer;text-align:left;max-width:100%}
.alloc-pill-sug:hover{border-color:var(--aboo-accent,#19C4C4)}
.alloc-pill-rule{border-color:#0a8f5b;background:rgba(10,143,91,.07)}
.alloc-pill-more{border-style:dashed;color:var(--muted,#789)}
.dash-tri-busy{font-size:12px;color:var(--muted,#789)}
.dash-tri-done{display:flex;align-items:center;justify-content:space-between;gap:10px;
  border-color:#0a8f5b;background:rgba(10,143,91,.08);animation:tri-done-in .25s ease}
.dash-tri-done-msg{font-weight:600;color:#0a8f5b;font-size:13px}
@keyframes tri-done-in{from{opacity:.4;transform:translateY(-2px)}to{opacity:1;transform:none}}
.dash-alldone{padding:14px 16px;border:1px solid #0a8f5b;border-radius:10px;background:rgba(10,143,91,.08);
  font-weight:700;color:#0a8f5b;margin-bottom:12px}

/* contacts: collapsible Recently added + onboarding + statement doc links */
.ct-rec-toggle{display:flex;align-items:center;gap:8px;width:100%;text-align:left;border:1px solid var(--line,#dde);
  background:var(--surface,#fff);color:var(--ink,#123);border-radius:10px;padding:9px 12px;font-size:13px;
  font-weight:700;cursor:pointer;margin:10px 0 6px}
.ct-rec-caret{display:inline-block;transition:transform .15s;font-weight:700;color:var(--muted,#789)}
.ct-rec-caret.open{transform:rotate(90deg)}
.ct-rec-count{color:var(--muted,#789);font-weight:600}
.ct-rec-preview{color:var(--muted,#789);font-weight:400;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.ct-rec-list{margin-bottom:8px}
.ct-onboard{margin-top:10px;padding:12px;border:1px dashed var(--aboo-accent,#19C4C4);border-radius:10px}
.ct-onboard-title{font-weight:700;margin-bottom:4px}
.ct-onboard-linkrow,.ct-onboard-emailrow{display:flex;gap:8px;align-items:center;margin-top:8px;flex-wrap:wrap}
.ct-onboard-linkrow .form-control,.ct-onboard-emailrow .form-control{flex:1;min-width:220px}
.ct-stmt-ref{border:none;background:none;padding:0;font:inherit;color:var(--aboo-accent,#0a8f8f);
  cursor:pointer;text-decoration:underline}
/* documents: drafts card + notes */
.doc-draft-badge{font-size:12px;font-weight:800;background:#d97706;color:#fff;border-radius:999px;padding:1px 8px;margin-left:6px}
.doc-notes{margin-top:10px}
.doc-notes-text{white-space:pre-wrap;font-size:13px;color:var(--ink,#123);border-left:3px solid var(--line,#dde);padding:4px 10px;margin-top:4px}
/* public onboarding portal */
.portal-page{max-width:760px;margin:0 auto;padding:26px 16px}
.portal-card{background:var(--surface,#fff);border:1px solid var(--line,#dde);border-radius:14px;padding:22px}
.portal-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(220px,1fr));gap:10px;margin-top:14px}
.portal-actions{display:flex;align-items:center;gap:10px;margin-top:16px}

/* reports — v2 parity views */
.rp-filters-col{display:flex;flex-direction:column;gap:6px;margin:4px 0 14px}
.rp-filters-col .rp-filters{margin:0}
/* Trial Balance: Balances (as at) ⇄ Movements (from – to) toggle + the window hint line */
.rp-filters-col .rp-tb-mode{margin:0 0 2px;align-self:flex-start;flex-wrap:wrap}
/* size each toggle button to its label on ONE line (the shared flex:1 squeezed "Movements (from – to)"
   onto two lines); on a narrow phone the pair wraps to a second row instead of overflowing */
.rp-tb-mode .login-kind-btn{flex:0 0 auto;white-space:nowrap;padding:9px 20px}
.rp-tb-window{margin:2px 0 10px;font-size:13px}
.rp-quick{display:flex;align-items:center;gap:6px;flex-wrap:wrap}
.rp-quick-lbl{font-size:12px;color:var(--muted,#777)}
.rp-quick .btn-sm,.rp-fynav .btn-sm{padding:3px 10px;font-size:12.5px}
.rp-fywrap{display:flex;flex-direction:column;gap:4px}
.rp-fynav{display:flex;align-items:center;gap:6px}
.rp-fyyear{font-size:15px;font-weight:700;min-width:52px;text-align:center}
.rp-asat-ro{font-size:14px;color:var(--muted,#777);padding:6px 0}
.rp-cards{display:flex;gap:10px;flex-wrap:wrap;margin:4px 0 14px}
.rp-kpi{border:1px solid var(--line,#ddd);border-radius:10px;padding:10px 16px;background:var(--surface);display:flex;flex-direction:column;gap:2px;min-width:130px}
.rp-kpi-lbl{font-size:12px;color:var(--muted,#777);font-weight:600}
.rp-kpi-val{font-size:16px;font-weight:700}
.rp-ok-t{color:var(--ok,#15803d)}
.rp-bad-t{color:var(--bad,#b91c1c)}
.rp-warn-t{color:var(--warn,#b45309)}
.rp-dim{color:var(--muted,#777);font-size:12.5px}
.rp-bbf td{background:var(--surface-2,rgba(0,0,0,.03))}
.rp-badge{display:inline-block;font-size:12px;font-weight:700;border-radius:999px;padding:0 7px;margin-left:5px;vertical-align:1px}
.rp-badge-bank{background:rgba(37,99,235,.12);color:#2563eb}
.rp-badge-debtor{background:rgba(21,128,61,.12);color:var(--ok,#15803d)}
.rp-badge-creditor{background:rgba(185,28,28,.1);color:var(--bad,#b91c1c)}
.rp-badge-vat{background:rgba(180,83,9,.12);color:var(--warn,#b45309)}
.rp-badge-off{background:rgba(0,0,0,.08);color:var(--muted,#777)}
/* age analysis */
.rp-age-cards .rp-age-kpi{cursor:pointer;transition:border-color .12s}
.rp-age-kpi:hover{border-color:var(--aboo-accent,#19C4C4)}
.rp-age-on{border-color:var(--aboo-accent,#19C4C4);box-shadow:0 0 0 1px var(--aboo-accent,#19C4C4)}
.rp-age-filterlbl{font-size:12.5px;color:var(--muted,#777);margin:-6px 0 10px}
.rp-age-clear{font-size:12.5px;padding:0}
.rp-age-row{cursor:pointer}
.rp-age-row:hover td{background:var(--surface-2,rgba(0,0,0,.03))}
/* income statement — the ruled three-column statement */
.rp-is{background:var(--surface,#fff);border:1px solid var(--line,#ddd);border-radius:10px;padding:20px 26px;max-width:860px}
.rp-is-head{display:flex;justify-content:space-between;border-bottom:2px solid var(--ink,#222);padding-bottom:10px;margin-bottom:16px}
.rp-is-company{font-size:16px;font-weight:700}
.rp-is-title{font-size:12.5px;color:var(--muted,#777);margin-top:2px}
.rp-is-sec{margin-bottom:14px}
.rp-is-sectitle{font-size:12px;font-weight:700;letter-spacing:.05em;color:var(--muted,#666);margin-bottom:4px}
.rp-is-line{display:grid;grid-template-columns:1fr 140px 140px;gap:8px;padding:2px 0;font-size:13.5px;align-items:baseline}
.rp-is-label{padding-left:12px}
.rp-is-sub .rp-is-label,.rp-is-final .rp-is-label{padding-left:0}
.rp-is-amt,.rp-is-total{text-align:right}
.rp-underline{border-top:1px solid var(--ink,#333)}
.rp-dblunderline{border-top:1px solid var(--ink,#333);border-bottom:3px double var(--ink,#333)}
/* balance sheet — two-column layout */
.rp-bs-cols{display:grid;grid-template-columns:1fr 1fr;gap:16px;align-items:stretch}
@media (max-width: 860px){.rp-bs-cols{grid-template-columns:1fr}}
.rp-bs-side{border:1px solid var(--line,#ddd);border-radius:10px;background:var(--surface);overflow:hidden;display:flex;flex-direction:column}
.rp-bs-sidehead{font-size:13px;font-weight:700;text-transform:uppercase;letter-spacing:.04em;padding:10px 14px;background:var(--surface-2,rgba(0,0,0,.04))}
.rp-bs-group{padding:6px 0}
.rp-bs-grouphead{display:flex;justify-content:space-between;gap:10px;padding:6px 14px;font-size:12.5px;font-weight:700;color:var(--muted,#666);background:var(--surface-2,rgba(0,0,0,.02))}
.rp-bs-row{display:grid;grid-template-columns:86px 1fr auto;gap:8px;padding:4px 14px;font-size:13.5px;align-items:baseline}
.rp-bs-code{color:var(--muted,#777);font-size:12.5px}
.rp-bs-amt{text-align:right}
.rp-bs-total{display:flex;justify-content:space-between;gap:10px;padding:10px 14px;font-weight:700;font-size:14px;background:var(--brand);color:var(--aboo-ink);margin-top:auto}
.rp-bs-subtotal{display:flex;justify-content:space-between;gap:10px;padding:7px 14px;font-weight:600;font-size:13px;border-top:1px solid var(--line,#ddd)}
.rp-bs-retained{background:rgba(180,83,9,.07);border-top:1px dashed var(--line,#ddd)}
.rp-bs-retained .rp-bs-desc{font-style:italic}
.rp-bs-empty{padding:14px}
/* GL range mode */
.rp-glpick{max-width:230px}
/* GL account-range: each account is a <tbody> in ONE shared table; this row is its heading */
.rp-gl-grouprow td{background:var(--surface-2,rgba(127,127,127,.08));font-weight:700;font-size:13px;
  padding-top:9px;padding-bottom:9px;border-top:2px solid var(--line)}
.rp-table tbody.rp-gl-tbody:first-of-type .rp-gl-grouprow td{border-top:none}
/* reconciliation + vat tabs */
.rp-vat-tabs{margin-top:16px}
.rp-count{display:inline-block;min-width:20px;text-align:center;font-size:12px;font-weight:700;border-radius:999px;padding:0 6px;background:rgba(0,0,0,.08);margin-left:4px}
.rp-count-warn{background:rgba(180,83,9,.15);color:var(--warn,#b45309)}
.rp-count-info{background:rgba(37,99,235,.13);color:#2563eb}
.rp-match{display:inline-block;font-size:12px;font-weight:700;border-radius:999px;padding:1px 8px}
.rp-match-exact{background:rgba(21,128,61,.12);color:var(--ok,#15803d)}
.rp-match-amount{background:rgba(180,83,9,.12);color:var(--warn,#b45309)}
.rp-tabnote{font-size:12.5px;color:var(--muted,#777);margin:6px 0 8px}

/* ============================================================================
   V2 TENANT SKIN (2026-08-23) — v2's layout, metrics and typography with aboo
   colours. Frame rules are scoped to .t-shell (the tenant layout root) so the
   admin console keeps its own chrome; control/table/type metrics apply where
   the shared classes are used. Reference: sleek-app-v2 src/public/css/sleek.css.
   ========================================================================== */

/* ---- v2 type scale ---- */
.page-title{font-size:1.75rem;font-weight:600;line-height:1.25;letter-spacing:-.01em}
@media (max-width:767px){.page-title{font-size:1.5rem}}
h2{font-size:1.25rem;font-weight:600}
h3{font-size:1.1rem;font-weight:600}

/* ---- t-shell frame: v2 .app layout with aboo colours ---- */
.t-shell{--drawer-w:200px}
.t-shell .drawer{background:var(--surface);color:var(--ink);border-right:1px solid var(--line);
  display:flex;flex-direction:column}
:root[data-theme="dark"] .t-shell .drawer{background:var(--surface)}
.t-shell .nav-list{flex:1;padding:1rem .5rem 0;display:flex;flex-direction:column;gap:.25rem}
.t-shell .nav-item{flex:0 0 auto;flex-direction:row;justify-content:flex-start;gap:.5rem;
  padding:.6rem .75rem;border-radius:var(--radius);color:var(--muted);font-size:.875rem;font-weight:500}
.t-shell .nav-item:hover{background:none;color:var(--brand)}
.t-shell .nav-item.active{background:none;color:var(--brand);font-weight:600}
.t-shell .nav-ico{width:20px;font-size:15px;opacity:.95}
.t-nav-foot{padding:1rem .9rem 1.1rem;border-top:1px solid var(--line);margin-top:auto}
.t-nav-quote{font-size:12px;font-style:italic;color:var(--muted);line-height:1.45}
.t-nav-quote-by{margin-top:4px;font-style:normal;font-size:12px}
.t-nav-version{margin-top:10px;font-size:12px;color:var(--muted);opacity:.8}

/* header band — v2 .app-header (primary band) in aboo brand ink */
.t-shell .app-bar.t-header{background:var(--brand-ink);border-bottom:none;color:#fff;
  height:auto;min-height:var(--bar-h);padding:.65rem 1rem}
.t-header-brand{flex:1;display:flex;flex-direction:column;gap:2px;min-width:0}
.t-logo{font-weight:700;font-size:1.25rem;letter-spacing:-.02em;color:#fff;display:flex;align-items:center;gap:8px}
.t-logo .brand-dot{width:12px;height:12px;box-shadow:0 0 0 3px rgba(25,196,196,.3)}
.t-co-name{appearance:none;border:0;background:none;color:#fff;opacity:.92;font-size:.875rem;
  padding:0;text-align:left;cursor:pointer;display:flex;align-items:center;gap:5px;max-width:100%;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.t-co-name:hover{opacity:1;text-decoration:underline}
.t-co-caret{font-size:.7em;opacity:.7}
.t-shell .t-header .user-name{color:#dfeeed}
/* The header toggles are var(--surface) CHIPS, so their glyph must contrast with the chip, not the
   dark band. #fff made the monochrome 🏛 white-on-white (invisible) in light mode — the 🌙/☀ are
   colour emoji so they showed regardless (owner 2026-08-26). var(--ink) is visible in both themes. */
.t-shell .t-header .theme-toggle{color:var(--ink)}
.t-shell .t-header .btn-outline.t-signout{border-color:rgba(255,255,255,.35);color:#fff;background:transparent}
.t-shell .t-header .btn-outline.t-signout:hover{background:rgba(255,255,255,.12);border-color:#fff;color:#fff}
.t-shell .t-header .confirm-q{color:#fff}

/* the global chat bar — v2 .sleek-chat-bar (sticky under the header) */
.sleek-chat-bar{background:var(--surface);border-bottom:1px solid var(--line);
  padding:.5rem 1rem;position:sticky;top:0;z-index:90;box-shadow:0 1px 3px rgba(0,0,0,.05)}
.sleek-chat-row{display:flex;align-items:center;gap:.5rem;max-width:1200px;margin:0 auto}
.sleek-chat-input{flex:1;height:34px;padding:.3rem .75rem;border:1px solid var(--line);
  border-radius:var(--radius);font-size:.8rem;font-family:inherit;background:var(--bg);color:var(--ink)}
.sleek-chat-input:focus{outline:none;border-color:var(--brand);box-shadow:0 0 0 2px var(--brand-faint);background:var(--surface)}
.sleek-chat-input::placeholder{color:var(--muted);opacity:.75}
.sleek-chat-send{width:34px;height:34px;border-radius:50%;border:0;background:var(--brand);
  color:var(--aboo-ink);font-size:14px;cursor:pointer;flex:0 0 auto;display:flex;align-items:center;justify-content:center}
.sleek-chat-send:hover{filter:brightness(.94)}
.sleek-chat-send:disabled{opacity:.5;cursor:default}
.sleek-chat-panel{background:var(--surface);border-bottom:1px solid var(--line);padding:.6rem 1rem .8rem}
.sleek-chat-panel .dash-ai-scroll{max-width:1200px;margin:0 auto}
.sleek-chat-panel .dash-ai-sugs,.sleek-chat-panel .dash-ai-clear{max-width:1200px;margin:6px auto 0;display:block}
.dash-ai-sugs{display:flex;gap:6px;flex-wrap:wrap}
.dash-ai-sug{border:1px solid var(--line);background:var(--surface);border-radius:999px;
  padding:3px 12px;font-size:12.5px;cursor:pointer;color:var(--ink)}
.dash-ai-sug:hover{border-color:var(--brand);color:var(--brand)}
.dash-ai-text{font-size:13.5px;line-height:1.5}
.dash-ai-typing{color:var(--muted);font-style:italic}

/* content gutter — v2 .app-body: centred 1200px */
.t-shell .content{padding:1rem;flex:1}
.t-shell .page{max-width:1200px;margin:0 auto}
@media (min-width:768px){.t-shell .content{padding:1.5rem}}
.t-shell .page-head.with-action{position:static;background:none;padding:0;margin:2px 0 14px}

/* ---- v2 buttons (metrics; aboo colours) ---- */
.btn{display:inline-flex;align-items:center;justify-content:center;gap:.5rem;
  padding:.5rem 1rem;border:1px solid transparent;border-radius:var(--radius);
  font-size:.875rem;font-weight:500;line-height:1.3;cursor:pointer;transition:all .2s}
.btn-sm{padding:.35rem .75rem;font-size:.8rem;border-radius:var(--radius);min-height:32px}
.btn-lg{padding:.75rem 1.5rem;font-size:1rem}
.btn-primary{background:var(--brand);border-color:var(--brand);color:var(--aboo-ink)}
.btn-primary:hover{background:var(--brand);filter:brightness(.94)}
.btn-light{background:var(--surface);border-color:var(--line);color:var(--ink)}
.btn-light:hover{background:var(--brand-fainter);border-color:var(--brand);color:var(--brand)}
.btn-outline{background:transparent;border:1px solid var(--line);color:var(--brand)}
.btn-outline:hover{background:var(--brand-faint);border-color:var(--brand);color:var(--brand)}
.btn-link{border:0;background:none;color:var(--brand);padding:2px 4px;font-size:.875rem;cursor:pointer}

/* ---- v2 form controls (metrics; aboo colours) ---- */
.form-control{height:32px;padding:.3rem .5rem;font-size:.8rem;line-height:1.4;
  border:1px solid var(--line);border-radius:5px;background:var(--surface);color:var(--ink);
  transition:border-color .2s}
textarea.form-control{height:auto;min-height:64px}
.form-control:focus{outline:none;border-color:var(--brand);box-shadow:0 0 0 2px var(--brand-faint)}
select.form-control,select.cb-in{appearance:none;-webkit-appearance:none;
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%232E575E' stroke-width='2'%3E%3Cpath d='M6 9l6 6 6-6'/%3E%3C/svg%3E");
  background-repeat:no-repeat;background-position:right .4rem center;padding-right:1.6rem;cursor:pointer}
label{font-size:.875rem;font-weight:500}

/* ---- v2 tables (th uppercase band, hover tint) ---- */
.cb-table,.rp-table{font-size:.875rem;border-radius:var(--radius-lg);overflow:hidden}
.cb-table th,.rp-table th{font-size:.75rem;font-weight:600;text-transform:uppercase;
  letter-spacing:.05em;color:var(--muted);padding:.5rem .75rem}
.cb-table td,.rp-table td{padding:.5rem .75rem}
.cb-table tbody tr:hover td,.rp-table tbody tr:hover td{background:var(--brand-fainter)}

/* ---- v2 cards ---- */
.row-card,.kpi,.rp-card,.rp-kpi,.cb-card,.dash-tri-card{border-radius:var(--radius-lg);box-shadow:var(--shadow)}
.row-card:hover,.rp-card:hover{box-shadow:var(--shadow-lg)}

/* ---- v2 badges ---- */
.badge,.rp-badge,.cb-off-tag{padding:.15rem .5rem;border-radius:10px;font-size:12px;font-weight:600}

/* print: hide the frame chrome */
@media print{
  .t-shell .drawer,.t-shell .t-header,.sleek-chat-bar,.sleek-chat-panel,.bottom-nav{display:none!important}
  .t-shell .main{margin-left:0}
}

/* v2 reports landing: flat grid of centred icon cards (index.twig) */
.rp-grid-v2{display:grid;grid-template-columns:repeat(auto-fill,minmax(180px,1fr));gap:14px}
.rp-card-v2{text-align:center;padding:1.4rem 1rem 1.2rem}
.rp-card-ico{font-size:26px;color:var(--brand);margin-bottom:10px;line-height:1}
.rp-card-v2 .rp-card-name{display:block;font-size:.95rem;font-weight:600}
.rp-card-v2 .rp-card-desc{font-size:12px;margin-top:6px}

/* v2 contacts header: title + inline "+ New", type tabs right */
.ct-head-left{display:flex;align-items:center;gap:12px}
.ct-new-btn{margin-top:2px}

/* the bank screen's contextual ask bar wears the SAME v2 chat-strip look (t-shell) */
.t-shell .cb-ask-wrap{background:var(--surface);border:1px solid var(--line);border-radius:var(--radius-lg);
  padding:.5rem .75rem;margin:0 0 14px;box-shadow:0 1px 3px rgba(0,0,0,.05)}
.t-shell .cb-ask-input{height:34px;border-radius:var(--radius);background:var(--bg);font-size:.8rem}
.t-shell .cb-ask-input:focus{background:var(--surface)}
.t-shell .cb-ask-send{height:34px;width:34px;border-radius:50%;background:var(--brand);color:var(--aboo-ink);font-size:14px}

/* alignment fixes (2026-08-23 audit): amounts never wrap; the Add-tag button stays one line */
.cb-table td.mono,.rp-table td.mono,.cb-table td.text-right,.rp-table td.text-right{white-space:nowrap}
.bt-tagrow .btn{white-space:nowrap;flex:0 0 auto;height:32px;padding-top:.3rem;padding-bottom:.3rem}
.bt-tagrow select{flex:1;min-width:0}

/* v2 sticky chrome: the header band stays pinned, the chat bar sticks just under it */
.t-shell{--t-head-h:74px}
.t-shell .app-bar.t-header{position:sticky;top:0;z-index:100;height:var(--t-head-h)}
.t-shell .sleek-chat-bar{top:var(--t-head-h)}

/* settings → Translations tab (v2 parity: per-key editor, overridden rows highlighted) */
.set-trans-bar{display:flex;gap:12px;align-items:flex-end;flex-wrap:wrap;margin:10px 0}
.set-trans-lbl{display:flex;flex-direction:column;gap:4px;font-size:12px;color:var(--muted,#64748b)}
.set-trans-lbl .form-control{min-width:160px}
.set-trans-search{flex:1;min-width:220px}
.set-trans-count{font-size:12px;white-space:nowrap;padding-bottom:8px}
.set-trans-wrap{max-height:62vh;overflow:auto}
.set-trans-table thead th{position:sticky;top:0;background:var(--surface,#fff);z-index:1}
.set-trans-table td{vertical-align:middle}
.set-trans-key{font-size:12px;word-break:break-all;max-width:180px}
.set-trans-val{min-width:180px}
.set-trans-over td{background:color-mix(in srgb, var(--aboo-accent,#19C4C4) 8%, transparent)}
.set-trans-act{white-space:nowrap;text-align:center}
.set-note{margin:6px 0;font-size:12px;color:var(--aboo-accent-ink,#0F766E)}

/* Company Details — FY start day+month pair */
.set-fy-row{display:flex;gap:8px}
.set-fy-row .set-fy-day{max-width:90px;flex:0 0 auto}
.set-fy-row select{flex:1}
/* #26 active-currency checklist (Settings ▸ Ledger display) */
/* #26 Currencies card (v2-parity Settings table): toggle the currencies the company uses */
.cur-card .cur-head{display:flex;align-items:baseline;justify-content:space-between;gap:12px;flex-wrap:wrap}
.cur-card .cur-sub{color:var(--muted);font-size:13px}
.cur-table{width:100%;margin-top:10px}
.cur-table td,.cur-table th{vertical-align:middle}
.cur-table .cur-sym{color:var(--muted)}
.cur-table td.ta-r,.cur-table th.ta-r{text-align:right}
.cur-pill{display:inline-flex;align-items:center;justify-content:center;min-width:80px;border:1px solid var(--line);border-radius:999px;padding:5px 14px;font-size:12px;font-weight:600;line-height:1;background:var(--surface);color:var(--muted)}
.cur-pill.toggle{cursor:pointer;transition:border-color .12s,color .12s}
.cur-pill.toggle:hover{border-color:var(--ok);color:var(--ok)}
.cur-pill.toggle.active{color:var(--ok);border-color:var(--ok)}
.cur-pill.base{color:var(--ok);border-color:var(--ok);background:color-mix(in srgb, var(--ok) 14%, transparent);cursor:default}
.cur-tag{display:inline-flex;align-items:center;border-radius:999px;padding:2px 10px;font-size:12px;font-weight:600;letter-spacing:.02em}
.cur-tag.base{color:var(--ok);background:color-mix(in srgb, var(--ok) 14%, transparent)}
.cur-note{margin-top:8px}
/* #1 document editor: re-denominate entry hint next to the locked currency field */
.cur-hint{display:block;margin-top:4px;font-size:12px;line-height:1.35;color:var(--muted);max-width:42ch}

/* Governance — financial-year lock cards */
.gov-list{display:flex;flex-direction:column;gap:10px;max-width:860px}
.gov-card.gov-locked{border-left:3px solid var(--bad)}
.gov-row{display:flex;align-items:center;gap:14px;flex-wrap:wrap}
.gov-year{display:flex;align-items:center;gap:8px;min-width:150px}
.gov-fy{font-weight:700;font-size:15px}
.gov-lock{font-size:16px}
.gov-lock-red{filter:hue-rotate(310deg) saturate(3)}
.gov-badge{font-size:12px;font-weight:700;color:var(--accent);border:1px solid var(--accent);border-radius:999px;padding:1px 8px}
/* partly-locked year: some periods locked but the year isn't fully locked (usually a leftover from a
   financial-year relabel) — surfaced amber so the owner can spot it and Unlock to clear (2026-08-26) */
.gov-card.gov-partial{border-left:3px solid #f59e0b}
.gov-lock-partial{filter:sepia(1) saturate(5) hue-rotate(3deg)}
.gov-badge-warn{color:#b45309;border-color:#f59e0b;background:rgba(245,158,11,.14)}
:root[data-theme="dark"] .gov-badge-warn{color:#fbbf24}
.gov-range{color:var(--muted);font-size:12.5px}
.gov-counts{font-size:12.5px}
.gov-act{margin-left:auto;display:flex;align-items:center;gap:8px}
.gov-arm{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.gov-reason-in{min-width:230px}
.gov-lockinfo{display:flex;align-items:center;gap:10px}
.gov-reason{font-size:12.5px;font-style:italic}
.gov-note{background:var(--surface);border:1px solid var(--line);border-left:3px solid var(--accent);border-radius:8px;padding:9px 13px;margin-bottom:12px;font-size:13px}
/* locked-year / locked-return indicator pill (red, unmistakable) */
.gov-badge-locked{color:var(--bad);border-color:var(--bad);background:rgba(220,38,38,.10)}
:root[data-theme="dark"] .gov-badge-locked{color:#f87171}
.gov-close-opt{display:flex;align-items:center;gap:6px;font-size:12.5px;color:var(--muted)}
.gov-close-opt input{margin:0}
/* VAT returns tab */
.gov-tabs{margin-bottom:14px}
.gov-vat{display:flex;flex-direction:column;gap:14px;max-width:860px}
.gov-vat-h{margin:0 0 2px}
.gov-vat-period{display:flex;align-items:flex-end;gap:12px;flex-wrap:wrap;margin:10px 0}
.gov-vat-lbl{display:flex;flex-direction:column;gap:4px;font-size:12.5px;color:var(--muted)}
.gov-vat-lbl input{min-width:150px}
.gov-vat-hint{font-size:13px}
.gov-vat-totals{display:flex;gap:22px;flex-wrap:wrap;margin:8px 0}
.gov-vat-fig{display:flex;flex-direction:column;gap:2px;font-size:13px}
.gov-vat-fig .mono{font-size:15px;font-weight:700}
.gov-vat-net .mono{color:var(--accent)}
.gov-vat-adj strong{font-size:13px}
.gov-vat-adjlist{margin:6px 0 0;padding-left:18px;font-size:12.5px}
.gov-vat-adjlist li{margin:2px 0}
.gov-vat-file{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-top:10px}
.gov-vat-ref{min-width:230px}
.page-sub{color:var(--muted);font-size:13px;margin-top:4px;max-width:640px}
.t-gov-btn{font-size:15px}
/* row locks (journals + bank register). Only a row in a LOCKED financial year shows a lock now —
   a merely-posted row shows nothing (owner 2026-08-26). The lock is unmistakable: a bright-red ring
   around the padlock, with a help cursor so the "…see Financial Years" tooltip is discoverable. */
.row-lock{font-size:13px;cursor:default}
.row-lock-red{display:inline-flex;align-items:center;justify-content:center;width:26px;height:26px;
  border-radius:50%;border:2px solid #e11d48;background:rgba(225,29,72,.15);
  font-size:13px;line-height:1;cursor:help}
.row-lock-grey{opacity:.55}   /* retained for any legacy caller; registers no longer emit it */

/* Register — the statement forever */
.cb-row-posted{opacity:.78}
.cb-row-posted:hover{opacity:1}
/* Opening-balance anchor row at the oldest end of the register — every running balance builds on it */
.cb-row-opening{background:var(--brand-faint,rgba(25,196,196,.07));border-top:2px solid var(--line)}
.cb-row-opening td{font-style:italic;color:var(--muted)}
.cb-row-opening .cb-td-desc b{font-style:normal;color:var(--ink)}
/* "Posted · N" divider between unposted (staged) rows and posted rows in the registers (v2 parity) */
.cb-postsep-td{background:var(--surface-2,rgba(127,127,127,.10));color:var(--muted);
  font-size:12px;font-weight:700;text-transform:uppercase;letter-spacing:.06em;padding:6px 10px;
  border-top:1px solid var(--line)}
.cb-table tbody tr.cb-postsep:hover td{background:var(--surface-2,rgba(127,127,127,.10))}
.cb-reg-end{text-align:center;padding:10px 0 16px;font-size:12.5px}
.cb-recon{font-size:12.5px;font-weight:700;border-radius:999px;padding:3px 10px;white-space:nowrap}
.cb-recon-ok{color:var(--ok, #178a4c);border:1px solid currentColor}
.cb-recon-off{color:var(--warn, #b7791f);border:1px solid currentColor}
.cb-card-cur{font-weight:700;color:var(--accent);margin-left:4px}
/* Allocation rules — flush search bar over the list */
.rule-search-bar{margin:0 0 10px}
.rule-search-bar .form-control{width:100%}
/* Dashboard drill-through — every bank figure is one click from its account */
.dash-kpi-link,.dash-row-link{cursor:pointer}
.dash-kpi-link:hover{border-color:var(--accent)}
.dash-row-link:hover td{background:var(--surface-2, rgba(127,127,127,.08))}
.dash-row-go{color:var(--accent);font-weight:700}
/* "‹ Back to dashboard" — shown only on a screen reached directly from the dashboard */
.dash-back{display:inline-block;margin:0 0 12px;padding:4px 8px;font-weight:600}
.dash-back:hover{text-decoration:underline}
/* Journals — the register forever */
.jrn-reg{margin-top:26px}
.jrn-chip-staged{font-size:12px;font-weight:700;color:var(--accent);border:1px solid currentColor;border-radius:999px;padding:2px 8px;white-space:nowrap}
/* Admin platform grids (companies) */
.adm-grid td{vertical-align:middle}
.adm-owner-mail{display:block;font-size:12px}
/* W9: clickable rows, filter chips + the company detail drawer */
.adm-row{cursor:pointer}
.adm-chips{display:flex;flex-wrap:wrap;align-items:center;gap:6px;margin:0 0 14px}
.adm-chip-demo{margin-left:auto}
.adm-chip-gap{width:1px;align-self:stretch;background:var(--line);margin:2px 6px}
.adm-detail-owner{padding:0 0 12px;border-bottom:1px solid var(--line);margin-bottom:12px}
.adm-detail-kv{display:flex;flex-direction:column;gap:8px;margin-bottom:16px}
.adm-kv-row{display:flex;justify-content:space-between;gap:16px;align-items:baseline}
.adm-kv-k{color:var(--muted);font-size:13px}
.adm-kv-v{font-weight:600;text-align:right}
/* VAT-flag teeth in the cashbook: hide tax UI when the company is not VAT registered */
.cb-hide{display:none}

/* ===== Version badge + release notes — styled exactly like live v2 (Andre 2026-09-02) =====
   v2 (sleek.scss .version-badge): monospace, muted at 60% opacity, hover → 100% + primary;
   sidebar variant = last nav row with a top border (desktop), inline variant next to the
   wordmark (mobile). One deviation: v2's 0.6rem ≈ 9.6px is below our 12px a11y floor, so the
   size is 12px — everything else matches. The modal mirrors v2's changelog modal (560px card,
   blurred overlay, primary version headings with separators, whole history scrollable). */
.ver-badge{appearance:none;border:0;background:none;padding:0;cursor:pointer;
  font-family:"SF Mono",Monaco,Consolas,monospace;font-size:12px;letter-spacing:.02em;
  color:var(--muted);opacity:.6;transition:opacity .15s}
.ver-badge:hover{opacity:1;color:var(--brand)}
/* admin drawer foot — the "What's new" badge sits at the bottom of the dark brand-ink sidebar;
   its default --muted colour is for the light tenant drawer, so lighten it here for legibility. */
.drawer-foot{margin-top:auto;padding:12px 18px 16px;border-top:1px solid rgba(255,255,255,.08)}
.drawer-foot .ver-badge{color:#cfe9e8;opacity:.6}
.drawer-foot .ver-badge:hover{opacity:1;color:#fff}
.t-nav-version{margin-top:10px;padding:.4rem 0 0;border-top:1px solid var(--line)}
.ver-inline{margin-left:6px;vertical-align:middle}
.ver-inline .ver-badge{color:#fff;opacity:.5}
.ver-inline .ver-badge:hover{opacity:1;color:#fff}
@media (min-width:1024px){.ver-inline{display:none}}
.home-version{margin-top:14px;text-align:center}
.ver-modal{max-width:560px;width:92vw;max-height:80vh;display:flex;flex-direction:column}
.ver-overlay{backdrop-filter:blur(2px)}
.ver-running{font-size:12px;color:var(--muted);margin-bottom:8px}
.ver-scroll{overflow-y:auto;min-height:0}
.ver-rel{margin-bottom:14px}
.ver-rel-head{display:flex;align-items:baseline;gap:8px;flex-wrap:wrap;
  border-bottom:1px solid var(--line);padding-bottom:6px;margin-bottom:8px}
.ver-rel-no{font-weight:700;color:var(--brand);font-size:14px}
.ver-rel-title{font-weight:600;color:var(--ink);font-size:13px}
.ver-rel-date{color:var(--muted);font-size:12px;margin-left:auto}
.ver-rel-notes{margin:8px 0 0;padding-left:18px;color:var(--ink);font-size:13px;line-height:1.6}
.ver-rel-notes li{margin-bottom:4px}

/* ===== Admin: Migrations health tab ===== */
.mig-verdict{border-radius:var(--radius);padding:10px 14px;margin-bottom:12px;font-size:13px;font-weight:600}
.mig-verdict-ok{background:rgba(21,128,61,.12);color:var(--ok,#15803d)}
.mig-verdict-bad{background:rgba(200,40,40,.12);color:var(--bad)}
.mig-counts{display:flex;gap:16px;flex-wrap:wrap;margin-bottom:10px;font-size:13px;color:var(--muted)}
.mig-count b{color:var(--ink)}
.mig-count-bad b{color:var(--bad)}
.mig-pill{display:inline-block;font-size:12px;font-weight:600;border-radius:10px;padding:2px 9px;white-space:nowrap}
.mig-ok{background:rgba(21,128,61,.14);color:var(--ok,#15803d)}
.mig-fail{background:rgba(200,40,40,.16);color:var(--bad)}
.mig-warn{background:rgba(180,83,9,.14);color:var(--warn,#b45309)}
.mig-skip{background:rgba(120,120,120,.14);color:var(--muted)}
.mig-verdict-warn{background:rgba(180,83,9,.12);color:var(--warn,#b45309)}
.mig-row-bad td{background:rgba(200,40,40,.06)}
.mig-orphan{color:var(--muted);font-size:12px}
.mig-table td{font-size:13px}
/* ========================================================================
   Documents (Sales & Purchases) — invoiceTest port. Uses brand tokens only
   (--surface/--ink/--line/--muted/--bad/--brand…) so dark mode is automatic.
   ======================================================================== */
/* nav section headers */
.nav-section{font-size:12px;letter-spacing:.06em;text-transform:uppercase;color:var(--muted);
  padding:14px 16px 4px;font-weight:600}
/* list page */
.doc-page{max-width:1100px}
.doc-strip{display:flex;gap:12px;margin:8px 0 14px;flex-wrap:wrap}
.doc-strip-card{flex:1 1 160px;background:var(--surface);border:1px solid var(--line);
  border-radius:var(--radius);padding:10px 14px}
.doc-strip-card.ds-bad{border-color:var(--bad)}
.ds-lbl{font-size:12px;color:var(--muted)}
.ds-val{font-size:20px;font-weight:700;color:var(--ink);margin-top:2px}
.ds-bad .ds-val{color:var(--bad)}
/* A5: money-strip buckets are real <button>s (keyboard-accessible click-to-filter chips) — same
   clickable-card affordance as contacts.js's .aging-card-btn (border-on-hover, brand-tinted when
   the bucket's tab is active; the overdue bucket keeps its red ds-bad cue even while active). */
.doc-strip-card-btn{cursor:pointer;text-align:left;font:inherit;
  transition:border-color .12s,background .12s}
.doc-strip-card-btn:hover{border-color:var(--brand,#12b5a5)}
.doc-strip-card-btn:focus-visible{outline:2px solid var(--brand,#12b5a5);outline-offset:2px}
.doc-strip-card-btn.active{border-color:var(--brand,#12b5a5);
  background:color-mix(in srgb,var(--brand,#12b5a5) 12%,var(--surface))}
.doc-strip-card-btn.active .ds-lbl{color:var(--brand,#12b5a5)}
.doc-strip-card-btn.ds-bad.active{border-color:var(--bad);
  background:color-mix(in srgb,var(--bad) 12%,var(--surface))}
.doc-strip-card-btn.ds-bad.active .ds-lbl{color:var(--bad)}
.doc-toolbar{display:flex;gap:10px;flex-wrap:wrap;align-items:center;margin-bottom:10px}
.doc-search{flex:1 1 260px;min-width:200px}
.doc-sort{flex:0 0 auto;width:auto}
.doc-tabs{display:flex;gap:6px;flex-wrap:wrap;margin-bottom:12px;border-bottom:1px solid var(--line);padding-bottom:2px}
.doc-tab{background:none;border:0;border-bottom:2px solid transparent;padding:7px 12px;
  font-size:13px;color:var(--muted);cursor:pointer;display:flex;align-items:center;gap:6px}
.doc-tab:hover{color:var(--ink)}
.doc-tab.active{color:var(--brand);border-bottom-color:var(--brand);font-weight:600}
.doc-tab-n{font-size:12px;background:var(--brand-faint);color:var(--brand-ink);
  border-radius:9px;padding:1px 7px;min-width:18px;text-align:center}
.doc-tab.active .doc-tab-n{background:var(--brand);color:#fff}
/* Hub tab strip — a pill row that switches sub-screens at the top of a hub (Documents' type
   families grouped Debtors/Creditors; Notifications' Approvals/Expenses). Sits ABOVE each
   sub-screen's own underline tabs (.doc-tabs) so the two levels read as distinct. Scrolls
   sideways on a phone (mobile-first). */
.hub-tabs{display:flex;flex-wrap:wrap;align-items:center;gap:8px 16px;margin:0 0 14px;
  padding-bottom:12px;border-bottom:1px solid var(--line)}
.hub-tab-grp{display:flex;align-items:center;gap:6px;flex-wrap:wrap}
.hub-tab-cap{font-size:12px;text-transform:uppercase;letter-spacing:.04em;color:var(--muted);
  font-weight:600;margin-right:2px}
.hub-tab{background:var(--surface);border:1px solid var(--line);border-radius:999px;
  padding:6px 14px;font-size:13px;color:var(--ink);cursor:pointer;white-space:nowrap;
  display:inline-flex;align-items:center;gap:7px}
.hub-tab:hover{border-color:var(--brand);color:var(--brand)}
.hub-tab.active{background:var(--brand);border-color:var(--brand);color:#fff;font-weight:600}
.hub-tab-n{font-size:12px;background:var(--brand-faint);color:var(--brand-ink);
  border-radius:9px;padding:1px 7px;min-width:18px;text-align:center}
.hub-tab.active .hub-tab-n{background:#fff;color:var(--brand)}
/* Notification count DOTS — Approvals GREEN / Expenses RED, count centred (owner 2026-09-06).
   Shared by the app-bar shortcuts and the Notifications hub-tab counters so both read the same. */
.notif-dot{display:inline-flex;align-items:center;justify-content:center;min-width:20px;height:20px;
  padding:0 6px;border-radius:999px;font-size:12px;font-weight:800;color:#fff;line-height:1}
.notif-dot.appr{background:var(--ok,#15803d)}
.notif-dot.exp{background:var(--bad,#b91c1c)}
/* keep the dot's own colour on an active (brand-filled) tab — don't invert it to white-on-white */
.hub-tab.active .notif-dot{color:#fff}
@media (max-width:640px){
  .hub-tabs{flex-wrap:nowrap;overflow-x:auto;-webkit-overflow-scrolling:touch;gap:6px 12px}
  .hub-tab-grp{flex-wrap:nowrap}
}
/* ── Documents ARROW RIBBON type-tabs (owner 2026-09-09) ──────────────────────────────────────────
   The 7 document families as one connected stepper of right-pointing rounded chevrons; a single brand
   block slides to the family you pick. DELIBERATELY separate from .hub-tab (which is shared with the
   Approvals/Expenses hub in tshell.js and stays a pill). Colours are the SAME tokens the old pills used
   — --brand fill + #fff text active, --surface idle, --ink label, --muted captions — so it reads
   identical to before in both themes and every white-label. The slide is a transform/width/clip-path
   transition; the arrows are pure CSS clip-path. --pt (14px) must match RIB_CLIP in documents.js. */
.doc-tabhead{display:flex;align-items:center;gap:12px;flex-wrap:nowrap;margin:0 0 10px}
.doc-tabhead .doctabs{flex:0 0 auto;margin:0 0 0 auto;min-width:340px;overflow:visible;padding:0}
.doc-tabhead .doctabs::-webkit-scrollbar{display:none;height:0}
.doc-tabhead .doctabs-caps{display:none}
.doc-tabhead .doc-newbtn,.doc-tabhead .doc-search-inline{flex:0 0 auto}
.doc-tabhead .doc-search-inline{flex:1 1 200px;min-width:100px;max-width:360px}

/* Search inputs get a magnifying-glass icon on the left so it's obviously a search
   (owner Andre 2026-09-17: "fix the search — must indicate that it is a search").
   Higher specificity than the `body.vt input { background: ... }` rule in vt.css so
   the shorthand doesn't wipe out `background-image`. */
body.vt input.search,body.vt input.doc-search-inline,input.search,input.doc-search-inline{
  background-image:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='%236b7280' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='11' cy='11' r='8'/%3E%3Cpath d='m21 21-4.3-4.3'/%3E%3C/svg%3E") !important;
  background-repeat:no-repeat !important;background-position:10px center !important;padding-left:34px !important}

/* Mobile: stack the toolbar (search full-width on top, add button full-width below, then
   segs row scrolling horizontally). Fields align left-edge to left-edge, right-edge to
   right-edge — no more the search + add + tabs fighting on one line. */
@media (max-width:767px){
  .doc-tabhead{flex-direction:column;align-items:stretch;gap:8px;margin:0 0 10px}
  .doc-tabhead>*{flex:0 0 auto;width:100%;height:auto;margin:0;max-width:100%;min-width:0;box-sizing:border-box}
  /* Explicitly reset the flex-basis on the search + newbtn — desktop sets flex-basis:200px
     which becomes a 200px HEIGHT in this column-flex parent (search input turns into a slab). */
  .doc-tabhead .doc-search-inline{order:1;flex:0 0 auto;width:100%;max-width:100%;height:34px}
  .doc-tabhead .doc-newbtn{order:2;flex:0 0 auto;text-align:center;justify-content:center;width:100%}
  .doc-tabhead .doctabs,.doc-tabhead .segs{order:3;overflow-x:auto;-webkit-overflow-scrolling:touch;scrollbar-width:none;display:flex;gap:6px;padding:0}
  .doc-tabhead .doctabs::-webkit-scrollbar,.doc-tabhead .segs::-webkit-scrollbar{display:none}
  .doc-tabhead .segs .seg,.doc-tabhead .doctabs .doctab{flex:0 0 auto;white-space:nowrap}
}

/* Balance cell — one line per side (they owe / you owe), colour-coded so the money
   direction reads at a glance: green when the money is coming IN (customer owes us),
   red when it's going OUT (we owe a supplier). */
.ct-bal-line{font-size:13px;line-height:1.35}
.ct-bal-line b{font-variant-numeric:tabular-nums;margin-left:4px}
.ct-bal-them{color:var(--ok,#047857)}
.ct-bal-us{color:var(--bad,#b91c1c)}

/* Quick-action chips inside the contact card — tap to dial / tap to email. On desktop
   they render inline under the code line (owner Andre 2026-09-17: "Where is the email /
   telephone / contact on this screen?"). On mobile they stretch card-edge to card-edge
   as a stacked column so long emails don't truncate. */
.ct-quick-actions{display:flex;flex-wrap:wrap;gap:6px;margin-top:6px}
.ct-quick{display:inline-flex;align-items:center;gap:6px;padding:5px 10px;border-radius:8px;font-size:12.5px;font-weight:600;text-decoration:none;background:var(--brand-faint,rgba(11,168,160,.12));color:var(--brand,#0BA8A0);max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.ct-quick:hover{background:rgba(11,168,160,.2)}

/* The contact NAME + role pill are both clickable → contact detail (owner Andre 2026-09-17:
   "Contact pills should be clickable and go to the contacts full detail"). */
.ct-name-link{cursor:pointer;color:var(--ink,#1a1f2e)}
.ct-name-link:hover{color:var(--brand,#0BA8A0);text-decoration:underline}
.tag-link{cursor:pointer;background:none;border:none;padding:0;font:inherit;color:inherit;letter-spacing:inherit}
.tag-link:hover{filter:brightness(1.08);text-decoration:underline}
/* Role pill sits on the line UNDER the name, BEFORE the account no (owner Andre 2026-09-18:
   "move the Supplier / Customer tag to be before the Account No on the next line"). */
.ct-sub-row{display:flex;align-items:center;gap:8px;margin-top:3px;flex-wrap:wrap}
.ct-sub-row .contact-tags,.ct-sub-row .cell-sub{margin-top:0}

/* Onboarding toggle inside the Add contact form — sits below the name/email row, on by
   default. The sub-hint switches copy based on whether an email address is present. */
.ct-onboard-toggle{display:flex;flex-wrap:wrap;align-items:center;gap:10px;margin-top:10px;font-size:13px;color:var(--ink,#1a1f2e)}
.ct-onboard-toggle .muted{flex-basis:100%;font-size:12px;color:var(--muted,#6b7280)}

/* Mobile contacts table → card layout. Columns are now [1] Contact, [2] Balance, [3] Actions.
   Contact person / Terms / Tax / VAT are all gone from the list — they belong on the detail
   screen. Each row becomes a stacked card with tap-to-call and tap-to-email chips. */
@media (max-width:767px){
  /* Kill the outer .tbl-wrap chrome — the cards ARE the container on mobile. */
  .ct-list-wrap,body.vt .tbl-wrap:has(.ct-list){border:0;background:transparent;overflow:visible;border-radius:0}
  .ct-list{border:0;background:transparent}
  .ct-list thead{display:none}
  .ct-list tbody{display:flex;flex-direction:column;gap:8px}
  /* Straight vertical stack — simpler than a grid area map: name row (with actions floating
     right), then pills below name aligned left, then code + balance, then the full-width
     quick-action chips at the bottom. */
  .ct-list tr{display:block;position:relative;padding:12px 14px;background:var(--surface,#fff);border:1px solid var(--line,#e5e7eb);border-radius:10px}
  .ct-list tr>td{display:block;border:0;padding:0;text-align:left}
  .ct-list td:nth-child(1){padding-right:70px}    /* leave room for actions in the top-right */
  .ct-list td:nth-child(1) b{display:block;font-size:15px;font-weight:600;color:var(--ink,#1a1f2e)}
  .ct-list td:nth-child(1) .contact-tags{display:flex;gap:6px;margin-top:4px;justify-content:flex-start}
  .ct-list td:nth-child(1) .cell-sub{display:block;margin-top:4px;color:var(--muted,#6b7280);font-size:12px}
  .ct-list td:nth-child(2){margin-top:6px;font-size:13px}
  .ct-list td:nth-child(3){position:absolute;top:12px;right:14px;padding:0;text-align:right}
  .ct-list .ct-quick-actions{display:flex;flex-direction:column;gap:6px;margin-top:8px;width:100%}
  .ct-list .ct-quick{width:100%;box-sizing:border-box}
}
.doctabs{margin:0 0 14px;overflow-x:auto;overflow-y:hidden;padding:4px 0}
.doctabs::-webkit-scrollbar{height:6px}
.doctabs::-webkit-scrollbar-thumb{background:var(--line);border-radius:6px}
.doctabs-inner{width:max-content;min-width:100%}
.doctabs-caps{position:relative;height:15px;margin-bottom:5px}
.doctabs-caps:not(.ready) .doctabs-cap{visibility:hidden}   /* hide until JS aligns them (no flash) */
.doctabs-cap{position:absolute;top:0;font-size:12px;text-transform:uppercase;letter-spacing:.04em;
  color:var(--muted);font-weight:700;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.doctabs-ribbon{position:relative;isolation:isolate;display:flex;align-items:center;width:max-content;
  --pt:14px;--rh:40px}
.doctabs-ind{position:absolute;left:0;top:0;height:var(--rh);width:0;transform:translateX(0);z-index:0;
  pointer-events:none;background:var(--brand);
  transition:transform .42s cubic-bezier(.52,.02,.16,1),width .42s cubic-bezier(.52,.02,.16,1),
    clip-path .42s cubic-bezier(.52,.02,.16,1)}
.doctabs-ind.no-anim{transition:none}
.doctab{position:relative;height:var(--rh);border:0;background:transparent;cursor:pointer;
  font-family:inherit;font-size:13px;font-weight:500;color:var(--ink);white-space:nowrap;
  display:inline-flex;align-items:center;padding:0 16px 0 26px;transition:color .28s ease}
.doctab-lbl{position:relative;z-index:1}
.doctab::before{content:"";position:absolute;inset:0;z-index:-1;background:var(--surface);transition:background .28s ease,filter .28s ease}
.doctab.cl-left{padding-left:18px}
.doctab.cl-right{padding-right:22px}
.doctab + .doctab{margin-left:-13px}
.doctab.cl-left::before{clip-path:polygon(0 0, calc(100% - var(--pt)) 0, 100% 38%, 100% 62%, calc(100% - var(--pt)) 100%, 0 100%, 0 62%, 0 38%)}
.doctab.cl-full::before{clip-path:polygon(0 0, calc(100% - var(--pt)) 0, 100% 38%, 100% 62%, calc(100% - var(--pt)) 100%, 0 100%, var(--pt) 62%, var(--pt) 38%)}
.doctab.cl-right::before{clip-path:polygon(0 0, 100% 0, 100% 38%, 100% 62%, 100% 100%, 0 100%, var(--pt) 62%, var(--pt) 38%)}
.doctab:hover:not(.active){color:var(--brand)}
.doctab:hover:not(.active)::before{filter:brightness(.96)}
.doctab.active{color:#fff;font-weight:600}
.doctab.active::before{background:var(--brand)}   /* static fallback when JS can't measure (jsdom / detached) */
.doctab:focus-visible{outline:2px solid var(--brand);outline-offset:1px;border-radius:6px}
/* #28 (Callan 2026-09-14): Debtors LEFT, Creditors RIGHT. On a wide hub the ribbon fills the row so
   the Creditors run (`.doctab-split` = its first tab) is pushed to the right edge; on narrow screens
   the ribbon stays max-content and scrolls as one continuous run (no split). */
@media (min-width:760px){
  .doctabs-inner,.doctabs-ribbon{width:100%}
  .doctab.doctab-split{margin-left:auto}
}
@media (max-width:640px){
  .doctabs-ribbon{--rh:38px}
  .doctab{font-size:12.5px}
}
@media (prefers-reduced-motion:reduce){
  .doctabs-ind{transition:none}
}
/* list rows */
.doc-list .doc-row{display:grid;grid-template-columns:120px 1fr 110px 130px 150px 18px;
  align-items:center;gap:10px}
.doc-c-no{font-size:13px;font-weight:600}
.doc-c-contact{display:flex;flex-direction:column;min-width:0}
.doc-c-contact .row-sub{font-size:12px;color:var(--muted)}
.doc-c-date{font-size:13px;color:var(--muted)}
.doc-c-total{text-align:right;font-weight:600;display:flex;flex-direction:column}
.doc-c-total .row-sub{font-size:12px;color:var(--muted);font-weight:400}
@media(max-width:720px){.doc-list .doc-row{grid-template-columns:1fr auto;grid-auto-rows:min-content}
  .doc-c-date,.doc-c-status{display:none}}
/* status pills */
.st-pill{display:inline-block;font-size:12px;font-weight:600;border-radius:10px;padding:2px 9px;
  white-space:nowrap}
.st-draft{background:var(--line);color:var(--ink)}
.st-issued{background:var(--brand-faint);color:var(--brand-ink)}
.st-posted{background:#e8eef6;color:#2b5aa0}
.st-partial{background:#fff2d6;color:#8a5a00}
.st-overdue{background:#fbe0e0;color:var(--bad)}
.st-paid{background:#e0f3e6;color:#1a7a3c}
.st-void,.st-cancelled{background:var(--line);color:var(--muted);text-decoration:line-through}
:root[data-theme=dark] .st-posted{background:#22364d;color:#a9c7ef}
:root[data-theme=dark] .st-partial{background:#3d3016;color:#e7c07a}
:root[data-theme=dark] .st-overdue{background:#40201f;color:#f0a0a0}
:root[data-theme=dark] .st-paid{background:#1c3a28;color:#88d3a2}
/* empty state */
.doc-empty{text-align:center;padding:48px 20px;color:var(--muted)}
.doc-empty-ico{font-size:36px;opacity:.6}
.doc-empty-title{font-size:16px;margin:8px 0 14px;color:var(--ink)}
/* detail two-column */
.detail-cols{display:grid;grid-template-columns:1fr 320px;gap:20px;align-items:start}
.detail-main{min-width:0}
.detail-side{position:sticky;top:12px;display:flex;flex-direction:column;gap:14px}
@media(max-width:900px){.detail-cols{grid-template-columns:1fr}.detail-side{position:static}}
.doc-detail-head{align-items:flex-start}
.doc-detail-headmain{display:flex;flex-direction:column;gap:2px}
/* banners */
.doc-banner{border-radius:var(--radius);padding:10px 14px;margin-bottom:12px;font-size:13px;
  display:flex;align-items:center;gap:8px}
.doc-banner-draft{background:var(--brand-faint);color:var(--brand-ink)}
/* A8: list-screen dashboard-KPI focus deep-link banner (documents.js) — same .doc-banner
   chassis as document_detail.js's draft/overdue/paid banners above, brand-tinted like
   doc-banner-draft (a neutral "you're viewing a subset" cue, not a warning). */
.doc-focus-banner{background:var(--brand-faint);color:var(--brand-ink)}
.doc-banner-bad{background:#fbe0e0;color:var(--bad)}
.doc-banner-void{background:var(--line);color:var(--muted)}
.doc-banner-confirm{background:#fff2d6;color:#8a5a00}
/* paper */
.doc-paper{background:var(--surface);border:1px solid var(--line);border-radius:var(--radius-lg);
  padding:26px 28px}
.doc-paper-head{display:flex;justify-content:space-between;align-items:flex-start;margin-bottom:20px}
.doc-paper-co{font-size:18px;font-weight:700;color:var(--ink)}
.doc-paper-meta{text-align:right}
.doc-paper-type{font-size:13px;text-transform:uppercase;letter-spacing:.05em;color:var(--muted)}
.doc-paper-no{font-size:18px;font-weight:700;color:var(--brand)}
.doc-paper-parties{display:flex;justify-content:space-between;gap:20px;margin-bottom:18px;flex-wrap:wrap}
.doc-paper-lbl{font-size:12px;text-transform:uppercase;letter-spacing:.04em;color:var(--muted);margin-right:4px}
.doc-paper-party{font-size:15px;font-weight:600;color:var(--ink);margin-top:2px}
.doc-paper-dates{font-size:13px;color:var(--ink);text-align:right;line-height:1.7}
.doc-lines-tbl{width:100%;border-collapse:collapse;margin:10px 0}
.doc-lines-tbl th{font-size:12px;text-transform:uppercase;letter-spacing:.03em;color:var(--muted);
  text-align:left;padding:6px 8px;border-bottom:1px solid var(--line)}
.doc-lines-tbl td{padding:8px;border-bottom:1px solid var(--line);font-size:13px;vertical-align:top}
.doc-lines-tbl .r{text-align:right}
.doc-line-acct{display:block;font-size:12px;color:var(--muted)}
.doc-totals{margin-top:14px;margin-left:auto;width:260px}
.doc-total-row{display:flex;justify-content:space-between;padding:4px 0;font-size:13px;color:var(--ink)}
.doc-total-grand{border-top:2px solid var(--line);margin-top:4px;padding-top:8px;font-size:16px;font-weight:700}
.doc-paper-notes{margin-top:18px;padding-top:12px;border-top:1px solid var(--line);font-size:13px;color:var(--ink)}
/* rail cards */
.rail-card{background:var(--surface);border:1px solid var(--line);border-radius:var(--radius);padding:16px}
.rail-card-title{font-size:12px;text-transform:uppercase;letter-spacing:.04em;color:var(--muted);margin-bottom:10px}
.bal-rows{display:flex;flex-direction:column;gap:6px}
.bal-row{display:flex;justify-content:space-between;font-size:13px;color:var(--ink)}
.bal-out{border-top:1px solid var(--line);margin-top:4px;padding-top:8px;font-weight:700;font-size:15px}
.bal-payments{margin:12px 0;border-top:1px dashed var(--line);padding-top:10px;display:flex;flex-direction:column;gap:6px}
.bal-pay{display:flex;justify-content:space-between;font-size:12px;gap:8px}
.bal-pay-main{display:flex;flex-direction:column;color:var(--ink)}
.bal-pay-amt{display:flex;align-items:center;gap:6px;color:var(--ink);white-space:nowrap}
.bal-pay-x{border:0;background:none;color:var(--muted);cursor:pointer;font-size:12px}
.bal-pay-x:hover{color:var(--bad)}
.btn-block{display:block;width:100%;margin-top:12px}
/* pay form */
.pay-form{margin-top:12px;border-top:1px solid var(--line);padding-top:12px}
.pay-grid{display:grid;grid-template-columns:1fr 1fr;gap:8px}
.pay-f{display:flex;flex-direction:column;gap:3px;font-size:12px;color:var(--muted)}
.pay-actions{display:flex;justify-content:flex-end;gap:8px;margin-top:10px}
.pay-hint{font-size:12px;color:var(--muted);margin-top:8px;line-height:1.4}
.pay-adjust{display:flex;flex-direction:column;gap:6px;margin-top:8px}
.rc-summary{display:flex;justify-content:flex-end;gap:24px;margin-top:10px;font-size:14px}
.rc-summary b{color:var(--ink)}
.rc-summary .rc-bad{color:var(--bad)}
.rc-alloc-in{max-width:140px;text-align:right;margin-left:auto}
.rc-alloc thead th.r,.rc-alloc td.r{text-align:right}
.rail-related{font-size:13px;color:var(--ink)}
/* editor */
.doc-editor{position:relative}
.autosave-note{position:absolute;right:0;top:-30px;font-size:12px;color:var(--ok,#1a7a3c)}
.edit-head-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:12px;margin-bottom:16px}
.ed-f{display:flex;flex-direction:column;gap:4px;font-size:12px;color:var(--muted)}
@media(max-width:820px){.edit-head-grid{grid-template-columns:1fr 1fr}}
.doc-edit-tbl{width:100%;border-collapse:collapse}
.doc-edit-tbl th{font-size:12px;text-transform:uppercase;color:var(--muted);text-align:left;
  padding:4px 6px;border-bottom:1px solid var(--line)}
.doc-edit-tbl th.r{text-align:right}
.doc-edit-tbl td{padding:3px 4px;vertical-align:middle}
/* Batch line grid: trim the tenant body.vt 8px control padding to 4px inside the fixed 32px
   height so descenders (the "g" in "Recurring") aren't clipped — `.doc-edit-tbl` out-specifies
   `body.vt input,body.vt select`. vertical-align:middle above centres every cell so the
   remove-✕ lines up with the row's inputs. */
.doc-edit-tbl .form-control,.doc-edit-tbl .ss-input{padding-top:4px;padding-bottom:4px;line-height:1.3}
.edln-item{min-width:150px}.edln-acct{min-width:150px}.edln-tax{min-width:110px}
.edln-n input,.edln-d input{width:90px}
.edln-del{border:0;background:none;color:var(--muted);cursor:pointer;font-size:14px;padding:6px}
.edln-del:hover{color:var(--bad)}
.ed-addline{margin:8px 0 4px}
.edit-foot{display:grid;grid-template-columns:1fr 300px;gap:20px;margin-top:16px;align-items:start}
.ed-notes{display:flex;flex-direction:column;gap:4px;font-size:12px;color:var(--muted)}
.edit-totals{background:var(--surface);border:1px solid var(--line);border-radius:var(--radius);padding:12px 16px}
@media(max-width:820px){.edit-foot{grid-template-columns:1fr}}
.edit-err{margin-top:12px}
.edit-actions{display:flex;align-items:center;justify-content:flex-end;gap:10px;margin-top:18px;border-top:1px solid var(--line);padding-top:14px}
/* actions menu (floatroot) */
.actions-menu{background:var(--surface);border:1px solid var(--line);border-radius:var(--radius);
  box-shadow:var(--shadow-lg,0 8px 24px rgba(0,0,0,.18));min-width:180px;padding:6px;z-index:60}
.actions-item{display:block;width:100%;text-align:left;background:none;border:0;padding:8px 12px;
  font-size:13px;color:var(--ink);cursor:pointer;border-radius:6px}
.actions-item:hover{background:var(--brand-faint)}
.actions-item.danger{color:var(--bad)}
.actions-item:disabled{color:var(--muted);cursor:default}
.actions-sep{height:1px;background:var(--line);margin:4px 0}

/* ===== Document detail additions (detail-page port wave 2026-09-02) ===== */
.doc-pay-rows{display:flex;flex-direction:column;gap:4px;margin-top:6px;font-size:13px}
.banner-reason{margin:0 8px;width:220px;max-width:100%}
.lifec{display:flex;flex-wrap:wrap;gap:14px;margin-top:8px;font-size:12px;color:var(--muted)}
.lifec-step{display:flex;align-items:center;gap:4px}
.lifec-step.done{color:var(--ink)}
.lifec-step.now{font-weight:700;color:var(--brand)}
.lifec-step small{color:var(--muted);font-weight:400;margin-left:2px}
.investigate{margin-top:14px;border-top:1px solid var(--line);padding-top:10px}
.investigate-summary{cursor:pointer;font-size:13px;font-weight:600;color:var(--ink);display:flex;align-items:center;gap:6px}
.investigate-summary:hover{color:var(--brand)}
.jrn-table{width:100%;border-collapse:collapse;margin-top:8px}
.jrn-table th{font-size:12px;text-transform:uppercase;color:var(--muted);text-align:left;padding:4px 8px;border-bottom:1px solid var(--line)}
.jrn-table td{padding:4px 8px;font-size:13px;border-bottom:1px solid var(--line)}
.jrn-table tfoot td{font-weight:700;border-top:2px solid var(--line);border-bottom:none}
.jrn-table .r{text-align:right}
.jrn-bal{margin-top:6px;font-size:12px;font-weight:600}
.jrn-bal-ok{color:var(--ok,#15803d)}
.jrn-bal-bad{color:var(--bad)}
.hist-card{margin-top:14px}
.grid-count{font-size:12px;background:var(--brand-faint);color:var(--brand-ink);border-radius:999px;padding:1px 7px;margin-left:6px}
/* History and notes (documents-parity sweep Wave C2) — mirrors .investigate's foot-of-paper
   look for visual cohesion with the "Investigate accounting" section right above it. */
.hn-card{margin-top:14px;border-top:1px solid var(--line);padding-top:10px}
.hn-head{display:flex;align-items:center;gap:12px}
.hn-toggle{display:inline-flex;align-items:center;gap:6px;cursor:pointer;user-select:none;font-size:13px;font-weight:600;color:var(--ink)}
.hn-toggle:hover{color:var(--brand)}
.hn-chev{color:var(--muted);font-size:12px;width:10px}
.hn-head .btn{margin-left:auto}
.hn-compose{margin-top:12px}
.hn-compose textarea{width:100%;box-sizing:border-box}
.hn-followup{display:flex;flex-direction:column;gap:4px;margin-top:8px;max-width:220px;font-size:12.5px}
.hn-followup>span{font-weight:600;color:var(--ink,#123)}
.hn-followup sleek-date{max-width:200px}
.hn-toolbar{margin-top:10px}
.hn-table{margin-top:8px}
.hn-table th.srt{cursor:pointer}
.hn-table th.srt:hover{color:var(--brand)}
.hn-date{white-space:nowrap}
.hn-action{font-weight:600}
.hn-action.hn-bad{color:var(--bad)}
.hn-action.hn-ok{color:var(--ok)}
.hn-intro{margin:10px 0 2px;font-size:12.5px;color:var(--muted)}
.send-check{flex-direction:row;align-items:center;gap:6px}
.send-check input{margin:0}
/* C4 — live email preview in the compose-send modal. Emails are light-themed HTML, so the preview
   surface stays white in dark mode too (matches what the recipient actually sees). */
.mailc-hint{display:block;font-size:12px;color:var(--muted);margin-top:3px}
.mailc-preview-label{font-size:12px;color:var(--muted);margin:10px 0 4px}
.mailc-preview{max-height:240px;overflow:auto;border:1px solid var(--line);border-radius:8px;
  background:#fff;color:#1e293b;padding:12px 14px}
.mailc-subj{font-weight:700;font-size:13px;color:#0f172a;margin-bottom:8px;
  padding-bottom:8px;border-bottom:1px solid #e2e8f0}
.mailc-msg{font-size:13px;line-height:1.5;white-space:normal;overflow-wrap:anywhere}
.mailc-muted{color:#94a3b8}
.mailc-chips{display:flex;flex-wrap:wrap;gap:6px;margin-top:12px}
.mailc-chip{font-size:12px;background:#f1f5f9;color:#334155;border:1px solid #e2e8f0;
  border-radius:6px;padding:2px 8px}
/* C5 — customer share-link card (in the document detail rail) */
.share-body{display:flex;flex-direction:column;gap:8px}
.share-input{font-size:12px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace}
.share-actions{display:flex;gap:8px}
.share-actions .btn{flex:1}
.share-hint{font-size:12.5px}
.share-status{font-size:12.5px}
.share-stat.share-ok{color:var(--ok,#15803d)}
.share-stat.share-bad{color:var(--bad)}
.share-stat.share-muted{color:var(--muted)}
.doc-banner-warn{background:rgba(180,83,9,.12);color:var(--warn,#b45309)}
.doc-banner-paid{background:rgba(21,128,61,.12);color:var(--ok,#15803d)}
.doc-banner-info{background:var(--brand-fainter,rgba(37,99,235,.10));color:var(--brand-ink,var(--ink));display:flex;align-items:center;gap:8px}

/* ============================================================
   Documents LIST — power-kit additions (documents.js list-UX pass).
   ============================================================ */
.doc-toolbar{position:relative}
.doc-toolbar-btns{display:flex;gap:8px;align-items:center;flex-wrap:wrap}
.doc-toolbar-btns .btn.active{background:var(--brand);color:#fff;border-color:var(--brand)}
.doc-colpop{position:absolute;top:100%;right:0;margin-top:4px;min-width:200px}
.doc-colpop-item{display:flex;align-items:center;gap:8px;padding:6px 8px;font-size:13px;cursor:pointer;border-radius:6px}
.doc-colpop-item:hover{background:var(--brand-faint)}
.doc-colpop-foot{border-top:1px solid var(--line);margin-top:4px;padding-top:6px;text-align:right}
/* Documents LIST — advanced filters panel (A1: date range+basis, amount range, contact). */
.doc-filters-toggle.active{background:var(--brand);color:#fff;border-color:var(--brand)}
.doc-filters-panel{display:flex;gap:18px;flex-wrap:wrap;align-items:flex-end;width:100%;
  background:var(--surface);border:1px solid var(--line);border-radius:var(--radius);
  padding:12px 14px;margin:2px 0 12px}
.doc-filter-field{display:flex;flex-direction:column;gap:4px;min-width:0}
.doc-filter-lbl{font-size:12px;color:var(--muted);font-weight:600}
.doc-filter-basis{display:flex;gap:4px;margin-bottom:2px}
.doc-basis-btn{background:none;border:1px solid var(--line);border-radius:999px;padding:2px 10px;
  font-size:12px;color:var(--muted);cursor:pointer}
.doc-basis-btn.active{background:var(--brand);border-color:var(--brand);color:#fff;font-weight:600}
.doc-filter-range{display:flex;align-items:center;gap:6px}
.doc-filter-date,.doc-filter-amt{width:150px}
.doc-filter-contact{width:200px}
.doc-filter-sep{color:var(--muted);font-size:12px}
.doc-filter-actions{margin-left:auto;display:flex;align-items:flex-end}
@media(max-width:720px){
  .doc-filters-panel{flex-direction:column;align-items:stretch}
  .doc-filter-date,.doc-filter-amt,.doc-filter-contact{width:100%}
  .doc-filter-actions{margin-left:0}
}
.doc-view-chips{display:flex;gap:6px;flex-wrap:wrap;margin:-4px 0 12px}
.doc-view-chip{display:inline-flex;align-items:center;gap:4px;border:1px dashed var(--line);
  border-radius:14px;padding:3px 6px 3px 10px;font-size:12.5px;background:var(--surface)}
.doc-view-chip.active{border-color:var(--brand);border-style:solid}
.doc-view-btn{appearance:none;border:0;background:none;color:var(--ink);font-size:12.5px;
  font-weight:600;cursor:pointer;padding:2px 0}
.doc-view-chip.active .doc-view-btn{color:var(--brand)}
.doc-view-x{appearance:none;border:0;background:none;color:var(--muted);cursor:pointer;
  font-size:12px;padding:2px 6px;line-height:1;border-radius:999px}
.doc-view-x:hover{color:var(--bad);background:rgba(185,28,28,.10)}
/* The remove-view ✕ shows faintly on every saved-view chip so it's discoverable (not only on the
   active one), brightens on hover/focus, and stays fully visible on touch where there is no hover. */
.seg-view .doc-view-x{opacity:.5;margin-left:1px;transition:opacity .12s,color .12s,background .12s}
.seg-view:hover .doc-view-x,.seg-view:focus-within .doc-view-x,.seg-view.on .doc-view-x{opacity:1}
@media (hover:none){.seg-view .doc-view-x{opacity:1}}
.doc-view-save{cursor:pointer;color:var(--muted)}
.doc-view-save:hover{color:var(--brand);border-color:var(--brand)}
.doc-tbl-scroll{max-height:calc(100vh - 320px);overflow:auto;border-radius:var(--radius);
  border:1px solid var(--line)}
.doc-tbl{border:0;border-radius:0}
.doc-tbl thead th{position:sticky;top:0;background:var(--surface);z-index:5}
.doc-tbl tbody tr.kb-focus{outline:2px solid var(--brand);outline-offset:-2px}
/* NOTE: never display:flex on a <td> — it stops being a table-cell, no longer stretches to the
   row height, and its bottom border drifts off the row line (owner-reported misaligned rules). */
.doc-td-actions{text-align:right;white-space:nowrap;vertical-align:middle}
.doc-td-actions .btn,.doc-td-actions .btn-row-del,.doc-td-actions .confirm-inline{vertical-align:middle}
.doc-td-actions>*+*{margin-left:6px}
.clickable{cursor:pointer}
.row-sub.sub-bad{color:var(--bad)}
.row-sub.sub-warn{color:var(--warn,#b45309)}
/* A6: Sent/Viewed micro-line under a list row's status pill (ported from invoiceTest's sentLine).
   12px = the a11y floor, same as .row-sub above. */
.sent-line{font-size:12px;color:var(--muted);margin-top:3px;white-space:nowrap;cursor:default}
.sent-line.sl-ok{color:var(--ok)}
.sent-line.sl-warn{color:var(--warn)}
.sent-line.sl-bad{color:var(--bad);font-weight:650}
.doc-bulk-bar{margin-top:8px}
.doc-empty-sub{font-size:13px;color:var(--muted);margin:-6px 0 14px;max-width:360px;
  margin-left:auto;margin-right:auto}
.peek-overlay{position:fixed;inset:0;background:rgba(15,23,42,.45);z-index:110;
  display:flex;justify-content:flex-end}
.peek-panel{width:100%;max-width:430px;background:var(--surface);color:var(--ink);
  height:100%;overflow-y:auto;padding:20px 22px;box-shadow:-8px 0 30px rgba(0,0,0,.25);
  animation:peek-in .18s ease}
@keyframes peek-in{from{transform:translateX(24px);opacity:.4}to{transform:none;opacity:1}}
@media (prefers-reduced-motion: reduce){.peek-panel{animation:none}}
.peek-head{display:flex;align-items:center;justify-content:space-between;gap:10px;margin-bottom:4px}
.peek-title{font-size:17px;font-weight:700;margin-right:8px}
.peek-x{appearance:none;border:0;background:none;font-size:18px;color:var(--muted);cursor:pointer;
  line-height:1;padding:4px}
.peek-sub{font-size:13px;color:var(--muted);margin-bottom:16px}
.peek-meta{display:flex;flex-direction:column;gap:8px;border-top:1px solid var(--line);
  border-bottom:1px solid var(--line);padding:12px 0;margin-bottom:16px}
.peek-row{display:flex;justify-content:space-between;font-size:13px}
.peek-lbl{color:var(--muted)}
.peek-val{font-weight:600;color:var(--ink)}
/* C3 — the peek activity timeline (source parity). Vertical list, icon · label/sub · when. */
.peek-events{margin:0 0 16px}
.peek-ev{display:flex;gap:10px;padding:8px 2px;border-top:1px solid var(--line);font-size:12.5px}
.peek-ev:first-child{border-top:none}
.peek-ev-ico{flex:0 0 20px;text-align:center}
.peek-ev-body{flex:1 1 auto;min-width:0}
.peek-ev-label{font-weight:600;color:var(--ink)}
.peek-ev-sub{color:var(--muted);margin-top:1px;overflow-wrap:anywhere}
.peek-ev-when{flex:0 0 auto;color:var(--muted);font-size:12px;white-space:nowrap}
.peek-ev-bad .peek-ev-label{color:var(--bad)}
.peek-events-empty{color:var(--muted);font-size:12.5px;padding:8px 2px;margin-bottom:12px}
.peek-foot{display:flex;flex-direction:column;gap:8px}
.kb-sheet-row{display:flex;justify-content:space-between;align-items:center;gap:12px;
  padding:7px 0;border-bottom:1px solid var(--line);font-size:13px}
.kb-sheet-row:last-child{border-bottom:0}
.kb-key{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;background:var(--bg,#f8fafc);
  border:1px solid var(--line);border-radius:6px;padding:2px 9px;font-weight:600;font-size:12.5px}
.doc-page.dense .doc-tbl th{padding:5px 8px}
.doc-page.dense .doc-tbl td{padding:5px 8px;font-size:12px}
.doc-page.dense .doc-tbl-scroll{max-height:calc(100vh - 260px)}
@media(max-width:720px){
  .doc-tbl-scroll{max-height:none;border:0}
  .doc-tbl thead{display:none}
  .doc-tbl,.doc-tbl tbody,.doc-tbl tr{display:block;width:100%}
  .doc-tbl tr{border:1px solid var(--line);border-radius:var(--radius);margin-bottom:8px;
    padding:8px 12px;background:var(--surface)}
  .doc-tbl td{display:flex;justify-content:space-between;align-items:center;gap:10px;
    padding:5px 0;border:0;min-height:32px}
  .doc-tbl td[data-label]::before{content:attr(data-label);font-size:12px;
    text-transform:uppercase;letter-spacing:.03em;color:var(--muted);font-weight:600}
  .doc-tbl td.cb-th-sel,.doc-tbl td.doc-td-actions{justify-content:flex-end}
  .doc-tbl .cb-th-sel input[type=checkbox]{width:20px;height:20px}
  .doc-bulk-bar{position:sticky;bottom:0;z-index:15;box-shadow:0 -2px 10px rgba(0,0,0,.10)}
  .peek-panel{max-width:100%}
}

/* ===== Document editor additions (editor port wave 2026-09-02) ===== */
.ctc-filter{font-size:12px}
.edln-move:hover{color:var(--brand)}
/* Normal table-cell (NOT display:flex — a flex td doesn't stretch to the row height, so the ✕
   floated to the row top). vertical-align:middle on .doc-edit-tbl td now centres it. */
.edln-x{text-align:center;white-space:nowrap}
.doc-numprev{margin:-8px 0 12px}
/* .mono/.text-right were scoped to .cb-page/.cb-table only — Documents tables never got them,
   so money rendered left-aligned & proportional there. Additive widening: */
.doc-page .mono, .doc-edit-tbl .mono, .doc-lines-tbl .mono{
  font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-variant-numeric:tabular-nums}
.doc-edit-tbl td.text-right, .doc-lines-tbl td.text-right{text-align:right}
@media(max-width:820px){
  .doc-edit-tbl thead{display:none}
  .doc-edit-tbl, .doc-edit-tbl tbody, .doc-edit-tbl tr, .doc-edit-tbl td{display:block;width:100%}
  .doc-edit-tbl tr{border:1px solid var(--line);border-radius:var(--radius);padding:8px;margin-bottom:10px}
  .doc-edit-tbl td{padding:4px 0}
  .doc-edit-tbl td[data-th]::before{content:attr(data-th);display:block;font-size:12px;
    text-transform:uppercase;color:var(--muted);margin-bottom:2px}
  .edln-n input, .edln-d input{width:100%}
  .edln-x{text-align:left;margin-top:4px}
  .edit-totals{position:sticky;bottom:0;z-index:5;box-shadow:0 -4px 10px rgba(0,0,0,.08)}
}

/* ===== Bug reporting: tenant widget + admin triage (wave 2026-09-02) ===== */
.bug-fab{position:fixed;right:20px;bottom:20px;width:44px;height:44px;border-radius:50%;
  background:var(--bad);color:#fff;border:0;font-size:20px;line-height:1;cursor:pointer;
  box-shadow:0 4px 14px rgba(0,0,0,.25);z-index:900}
.bug-fab:hover{filter:brightness(.94)}
@media (max-width:768px){
  .bug-fab{display:inline-flex;align-items:center;justify-content:center;right:12px;
    bottom:calc(60px + env(safe-area-inset-bottom, 0px) + 10px);width:34px;height:34px;
    border-radius:8px;font-size:16px;box-shadow:0 3px 10px rgba(0,0,0,.22);z-index:900}
}
.bug-fab-inline{background:none;border:0;color:#fff;opacity:.85;font-size:16px;line-height:1;
  cursor:pointer;padding:6px;min-width:32px;min-height:32px}
.bug-fab-inline:hover{opacity:1}
@media (min-width:769px){ .bug-fab-inline{display:none} }
.bug-thumb{display:block;max-width:100%;border:1px solid var(--line);border-radius:var(--radius);margin:0 0 12px}
.bug-thumb-none{font-size:12.5px;color:var(--muted);margin:0 0 12px}
.bug-success{font-size:14px;font-weight:600;color:var(--ok,#15803d);padding:16px 0;text-align:center}
.bug-pill{display:inline-block;font-size:12px;font-weight:600;border-radius:10px;padding:2px 9px;white-space:nowrap}
.bug-pri-low{background:rgba(46,87,94,.12);color:var(--muted)}
.bug-pri-normal{background:rgba(14,46,51,.08);color:var(--ink)}
.bug-pri-high{background:rgba(180,83,9,.14);color:var(--warn,#b45309)}
.bug-pri-urgent{background:rgba(185,28,28,.14);color:var(--bad)}
.bug-st-open{background:rgba(180,83,9,.14);color:var(--warn,#b45309)}
.bug-st-progress{background:var(--brand-faint);color:var(--brand-ink)}
.bug-st-closed{background:rgba(21,128,61,.14);color:var(--ok,#15803d)}
.bug-row{cursor:pointer}
.bug-row:hover{background:var(--surface-2,rgba(0,0,0,.04))}
.bug-cam{margin-left:6px}
.bug-detail .mono{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-variant-numeric:tabular-nums}
.bug-desc{white-space:pre-wrap}
.bug-shot-wrap{margin:0 0 16px}
.bug-shot-thumb{max-width:320px;max-height:220px;border:1px solid var(--line);border-radius:var(--radius);
  cursor:zoom-in;display:block}
.bug-console-pre{font-size:12.5px;background:var(--surface-2,rgba(0,0,0,.04));border:1px solid var(--line);
  border-radius:var(--radius);padding:10px 12px;max-height:220px;overflow:auto;white-space:pre-wrap;word-break:break-word}
.bug-comment{border-bottom:1px solid var(--line);padding:8px 0}
.bug-comment:last-child{border-bottom:0}
.bug-comment-head{display:flex;gap:8px;align-items:baseline;font-size:13px}
.bug-comment-body{font-size:13.5px;margin-top:2px;white-space:pre-wrap}
.bug-zoom{position:fixed;inset:0;background:rgba(15,23,42,.85);display:flex;align-items:center;
  justify-content:center;z-index:1000;cursor:zoom-out;padding:24px}
.bug-zoom-img{max-width:95vw;max-height:95vh;border-radius:6px;box-shadow:var(--shadow-lg,0 8px 24px rgba(0,0,0,.35))}

/* == Billing console (admin/billing.js) — subs list, detail panel, tiers catalogue ============= */
.bl-tabs{margin-bottom:14px}
.bl-detail-badges{display:flex;gap:8px;flex-wrap:wrap;align-items:center;margin:6px 0 12px}
.bl-ends{border:1px solid var(--warn,#b45309);color:var(--warn,#b45309);background:transparent}
.bl-actions{display:flex;gap:8px;flex-wrap:wrap;margin:12px 0 18px}
.bl-section{margin-top:18px}
.bl-section-title{font-size:14px;font-weight:700;color:var(--muted);text-transform:uppercase;
  letter-spacing:.04em;margin:0 0 8px}
/* cancel-mode radio cards (period end vs immediate) */
.bl-radio-group{display:flex;flex-direction:column;gap:8px;margin-bottom:12px}
.bl-radio-card{display:flex;gap:10px;align-items:flex-start;padding:10px 12px;cursor:pointer;
  border:1px solid var(--line);border-radius:var(--radius);background:var(--surface)}
.bl-radio-card.active{border-color:var(--aboo-accent,#19C4C4);
  box-shadow:0 0 0 1px var(--aboo-accent,#19C4C4) inset}
.bl-radio-card input[type="radio"]{margin-top:3px}
.bl-radio-card-body{display:flex;flex-direction:column;gap:2px}
.bl-radio-card-title{font-size:14px;font-weight:600;display:flex;gap:8px;align-items:center;flex-wrap:wrap}
.bl-radio-card-sub{font-size:12.5px;color:var(--muted)}
/* tiers catalogue */
.bl-tier-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(240px,1fr));gap:12px}
.bl-tier-card{border:1px solid var(--line);border-radius:var(--radius);background:var(--surface);
  padding:14px;display:flex;flex-direction:column;gap:8px}
.bl-tier-head{display:flex;gap:8px;align-items:center;flex-wrap:wrap;font-size:15px}
.bl-tier-code{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;letter-spacing:.03em}
.bl-tier-price{font-size:14px;font-weight:600}
.bl-tier-desc{font-size:12.5px;color:var(--muted)}
.bl-tier-actions{display:flex;gap:8px;margin-top:auto}
.bl-tier-form-grid{display:grid;grid-template-columns:1fr 1fr;gap:0 12px}
@media (max-width:560px){ .bl-tier-form-grid{grid-template-columns:1fr} }

/* == Support-access impersonation (shared/impersonate.js) ====================================== */
:root{ --imp-h:37px }
.impersonate-banner{position:fixed;top:0;left:0;right:0;z-index:120;height:var(--imp-h);
  display:flex;align-items:center;justify-content:center;gap:14px;flex-wrap:nowrap;
  background:#fde68a;color:var(--aboo-ink,#0E2E33);padding:0 16px;font-size:13px;font-weight:600;
  box-shadow:0 2px 6px rgba(0,0,0,.15)}
:root[data-theme="dark"] .impersonate-banner{background:#b45309;color:#fff7ed}
.imp-banner-text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.imp-banner-text b{font-weight:700}
.imp-exit-btn{flex:0 0 auto;background:rgba(14,46,51,.12);border:1px solid rgba(14,46,51,.35);color:inherit}
:root[data-theme="dark"] .imp-exit-btn{background:rgba(0,0,0,.22);border-color:rgba(0,0,0,.4)}
/* while a grant is live the whole frame drops below the banner: flow content via padding, the
   fixed drawer + sticky app bar via their own top offsets (both shells share these classes) */
.layout.imp-on{padding-top:var(--imp-h)}
.layout.imp-on .drawer{top:var(--imp-h);height:calc(100% - var(--imp-h))}
.layout.imp-on .app-bar{top:var(--imp-h)}

/* == admin/users.js — sortable users table ===================================================== */
.user-table tbody tr{cursor:pointer}
.user-table tbody tr:hover{background:var(--brand-faint,rgba(0,0,0,.03))}
tr.user-row.row-hl{animation:rowflash 1.8s ease-out}

/* == admin/user_detail.js — identity + support-access cards ==================================== */
.id-sub{font-size:12px;font-weight:500;word-break:break-all}
.imp-active-list{display:flex;flex-direction:column;gap:6px;margin-bottom:10px}
.imp-active-row{display:flex;align-items:center;gap:8px;flex-wrap:wrap;font-size:13px;
  padding:8px 10px;border:1px solid var(--line);border-radius:var(--radius);background:var(--surface)}
.imp-control-row{display:flex;gap:8px;align-items:center;flex-wrap:wrap;margin:10px 0}
.imp-control-row .form-control{flex:1 1 220px}

/* == tenant/settings.js — Support access code ================================================== */
.support-code-box{border:1px solid var(--aboo-accent,#19C4C4);
  background:var(--accent-weak,rgba(25,196,196,.08));border-radius:8px;padding:16px;
  margin-bottom:12px;text-align:center}
.support-code{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:28px;
  font-weight:700;letter-spacing:.25em;color:var(--ink);user-select:all}
.support-code-expiry{font-size:12px;color:var(--muted);margin-top:8px}

/* == Batch invoicing — recurrence + friendly tokens (tenant/batches.js additions) ============== */
.bt-token-chips{display:flex;gap:6px;flex-wrap:wrap;margin-bottom:6px}
.bt-token-select{width:auto;max-width:100%;font-size:12px}
/* Notes token pills (owner 2026-09-19): clickable chips that insert [MONTH]/[YEAR] at the caret
   in the notes textarea (see insertToken). Replaces the old "+ Insert a token…" select. Notes are
   still stored/rendered as PLAIN TEXT with token substitution, so this is presentation-only. */
.bt-token-pills{display:flex;align-items:center;gap:6px;flex-wrap:wrap;margin-bottom:6px}
.bt-token-pills-lead{font-size:12px;color:var(--muted)}
.bt-token-pill{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:12px;
  line-height:1;padding:5px 9px;border-radius:999px;cursor:pointer;
  border:1px solid var(--brand,#19C4C4);background:var(--brand-faint,color-mix(in srgb,var(--brand) 12%,transparent));
  color:var(--brand-ink,var(--brand,#0a8f8f));transition:background .12s,color .12s}
.bt-token-pill:hover{background:var(--brand,#19C4C4);color:#04252a}
.bt-token-preview{margin-top:4px;font-size:12.5px}
.bt-token-preview-lead{font-weight:600;color:var(--ink)}
/* Keep the date + end-mode (+ optional until-date / after-N) on ONE line. flex-wrap:wrap stacked
   them when 130+130 didn't fit the cell → every row grew to ~90px and threw the ✕ + dividers out.
   nowrap + non-shrinking controls keep the row a single ~40px line; the cell (and the h-scroll
   table) widen to fit when the "Until…/After…" control appears. */
.bt-period-row{display:flex;gap:6px;align-items:center;flex-wrap:nowrap}
.bt-period-row .form-control{width:120px;flex:0 0 auto}
.bt-period-row sleek-date{width:122px;flex:0 0 auto}
.edln-kind{min-width:120px}
.edln-period{min-width:252px}
.edln.bt-line-retired{opacity:.5}
.edln.bt-line-retired td{text-decoration:line-through;text-decoration-color:var(--muted)}
.edln.bt-line-retired input,.edln.bt-line-retired select{text-decoration:line-through;color:var(--muted)}
/* S17: "After N runs" end mode + run history + next-run estimate */
.bt-period-row .bt-runs-n{width:76px}
.bt-runs-used{white-space:nowrap}
.bt-runs-done{color:var(--bad)}
.bt-next-est{margin:-6px 0 10px}
.bt-runs{margin-top:12px}
.bt-run-docs td{padding:6px 10px;background:rgba(25,196,196,.05)}
.bt-run-doclist{display:flex;flex-direction:column;gap:2px;align-items:flex-start}
.bt-run-doc{padding:2px 0}

/* ── batch line editor: INLINE inside the selected member card (golden rule #7) + uniform control
   height & baseline (golden rule #9) + date-popup clipping fix (owner 2026-09-19) ─────────────── */
/* One shared control height for every control that shares a row. Scoped in USE to the batch line
   rows below (never applied to global .form-control/.btn — too risky app-wide). */
:root{--control-h:34px}
/* The line grid, expanded in place under the member's head/summary. */
.bt-member-lines{margin-top:12px;border-top:1px solid var(--line);padding-top:12px;cursor:default}
.bt-member-lines .doc-edit-tbl{width:100%}
.bt-member-lines .ed-addline{margin:10px 0 2px}
.bt-line-tokens{margin:2px 0 12px}
/* Template schedule: next-run date + auto-run toggle in the details form (owner 2026-09-19). A
   comfortable two-column row that stacks on narrow screens; the date input rides .form-control so
   it shares the form's control height. */
.bt-schedule{display:flex;flex-wrap:wrap;gap:16px 28px;align-items:flex-start}
.bt-sched-date{min-width:200px}
.bt-sched-date input[type=date]{max-width:220px}
.bt-sched-auto{display:flex;flex-direction:column;gap:4px}
.bt-sched-hint{color:var(--muted);font-size:12px;max-width:340px}
@media(max-width:560px){.bt-schedule{flex-direction:column;gap:14px}}
/* Date-picker popup fix: <sleek-date> appends its .sleek-cal calendar INSIDE itself (position:
   absolute) rather than portalling to <body>, so any scroll ancestor whose overflow != visible
   clips it. The global .table-wrap sets overflow-x:auto, which per spec forces overflow-y to auto
   as well — that hid the Period calendar. We (a) scope the batch grid wrap to overflow:visible so
   the popup escapes, and (b) give the line table `table-layout:fixed;width:100%` so it NEVER
   exceeds its container — with no horizontal overflow there is nothing for an ancestor to clip
   (and no ragged right edge / page scroll), so the date popup shows in full. The searchSelect
   popups are already safe (position:fixed, body-appended). */
.edit-lines.bt-lines-wrap{overflow:visible}
.edln-period-cell .sleek-cal{z-index:500}
/* Fixed layout keeps every line within the card width; inputs are width:100% so they fill each
   cell. Item/Description/Tax/Account get the readable share; Qty/Price stay compact; the ✕ is a
   thin fixed column. On wide screens the columns spread proportionally; they never overflow. */
.bt-line-tbl{table-layout:fixed;width:100%}
.bt-line-tbl th.edln-item{width:16%}
.bt-line-tbl th.edln-desc{width:20%}
.bt-line-tbl th.edln-n{width:8%}
.bt-line-tbl th.edln-tax{width:13%}
.bt-line-tbl th.edln-acct{width:18%}
.bt-line-tbl th.edln-kind{width:10%}
.bt-line-tbl th.edln-x{width:5%}
/* Fixed columns only contain the table if the controls can shrink into them: inputs, selects and
   searchSelect wrappers fill their cell and may shrink below their intrinsic min-width. */
.bt-line-tbl td .form-control,.bt-line-tbl td .ss,.bt-line-tbl td .ss-input,
.bt-line-tbl td select,.bt-line-tbl td sleek-date{width:100%;min-width:0}
/* Comfortable cell spacing (decent, not excessive — golden rule): more breathing than the dense
   documents grid, with clear vertical separation between the two rows of one line and between lines. */
.bt-member-lines .doc-edit-tbl td{padding:6px 8px}
.edln-main > td{padding-top:12px}
.edln-period-row > td{padding-top:2px;padding-bottom:14px;border-bottom:1px solid var(--line)}
.edln-period-cell{padding-left:18px}   /* subtle indent → the period reads as this line's 2nd row */
/* Second-row period controls, each with a small inline From / Until label above it. */
.bt-period-row{display:flex;gap:14px;align-items:flex-end;flex-wrap:wrap}
.bt-period-fld{display:flex;flex-direction:column;gap:3px;margin:0}
.bt-period-lbl{font-size:12px;color:var(--muted);white-space:nowrap}
.bt-period-row sleek-date{width:150px;flex:0 0 auto}
.bt-period-row .bt-endmode{width:160px;flex:0 0 auto}
.bt-period-row .bt-runs-n{width:96px;flex:0 0 auto}
/* Uniform control height + one vertical baseline across every control in a batch line row: the
   text inputs, number steppers, native <select>s, the searchSelect .ss-input and the <sleek-date>
   inner input all pin to --control-h with border-box sizing so none renders taller/shorter. */
.edln .form-control,.edln .ss-input,.edln select,.edln .btn,
.edln sleek-date .sleek-date-in,
.bt-period-row .form-control,.bt-period-row .ss-input,.bt-period-row select,
.bt-period-row sleek-date .sleek-date-in{height:var(--control-h);box-sizing:border-box}
.edln td{vertical-align:middle}
/* Mobile (≤820px, card-per-cell): pull the period row up under its line's fields so the two rows
   still read as one line rather than two separate bordered cards. */
@media(max-width:820px){
  .bt-member-lines .edln-period-row > td{border-bottom:0;padding-top:4px}
  .bt-member-lines .edln-period-cell{padding-left:0}
  .bt-member-lines .bt-period-row sleek-date,
  .bt-member-lines .bt-period-row .bt-endmode,
  .bt-member-lines .bt-period-row .bt-runs-n{width:100%}
}

/* == public customer document page (/d/{token}) — public_doc.js ================================ */
.pd-page{max-width:860px;margin:0 auto;padding:18px 12px 40px}
.pd-wrap{display:flex;flex-direction:column;gap:12px}
.pd-card{background:var(--surface,#fff);border:1px solid var(--line,#d3e6e4);border-radius:var(--radius-lg,12px);padding:18px}
.pd-loading{color:var(--muted,#2E575E);text-align:center;padding:42px 18px;font-size:14px}
.pd-invalid{text-align:center;padding:44px 18px}
.pd-invalid-icon{font-size:34px;margin-bottom:10px}
.pd-invalid-title{font-size:19px;margin:0 0 8px;color:var(--ink,#0E2E33)}
.pd-invalid-sub{font-size:13px;color:var(--muted,#2E575E);margin:0 0 4px}
/* slim action bar */
.pd-bar{display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap;background:var(--surface,#fff);border:1px solid var(--line,#d3e6e4);border-radius:var(--radius-lg,12px);padding:12px 16px}
.pd-org-name{font-weight:700;font-size:15px;color:var(--ink,#0E2E33)}
.pd-doc-id{font-size:13px;color:var(--muted,#2E575E);display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.pd-doc-no{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace}
.pd-bar-actions{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.pd-pill{display:inline-block;font-size:12px;font-weight:700;letter-spacing:.04em;border-radius:999px;padding:2px 10px}
.pd-pill-paid{background:rgba(21,128,61,.14);color:var(--ok,#15803d)}
.pd-pill-draft{background:var(--line,#d3e6e4);color:var(--muted,#2E575E)}
/* banners */
.pd-banner{border-radius:var(--radius,8px);padding:10px 14px;font-size:13px}
.pd-banner-ok{background:rgba(21,128,61,.12);color:var(--ok,#15803d)}
.pd-banner-bad{background:rgba(185,28,28,.1);color:var(--bad,#b91c1c)}
.pd-banner-void{background:var(--line,#d3e6e4);color:var(--muted,#2E575E)}
/* approve / decline card */
.pd-decide-title{font-weight:700;font-size:15px;color:var(--ink,#0E2E33);margin-bottom:2px}
.pd-decide-sub{font-size:13px;color:var(--muted,#2E575E);margin-bottom:12px}
.pd-field{display:block;margin-bottom:10px}
.pd-lbl{font-size:12px;color:var(--muted,#2E575E);text-transform:uppercase;letter-spacing:.03em}
.pd-field .pd-lbl{display:block;margin-bottom:4px}
.pd-err{font-size:13px;color:var(--bad,#b91c1c);margin:6px 0}
/* public invoice — "Amount to pay now" card (partial payment) */
.pd-pay-card{border:1px solid var(--line);border-radius:12px;padding:14px 16px;margin:10px 0;background:var(--surface-2)}
.pd-pay-title{font-weight:700;color:var(--ink);margin-bottom:8px}
.pd-pay-row{display:flex;align-items:center;gap:10px;flex-wrap:wrap}
.pd-pay-lbl{font-size:13px;color:var(--muted)}
.pd-pay-input{max-width:180px;text-align:right}
.pd-pay-hint{font-size:12.5px;color:var(--muted);margin-top:8px}
.pd-pay-err{margin-top:8px}
.pd-decide-actions{display:flex;justify-content:flex-end;gap:10px;margin-top:4px;flex-wrap:wrap}
/* the paper */
.pd-paper{padding:22px}
.pd-paper-head{display:flex;justify-content:space-between;gap:18px;flex-wrap:wrap;margin-bottom:18px}
.pd-org-co{font-weight:700;font-size:17px;color:var(--ink,#0E2E33);margin-bottom:4px}
.pd-org-line{font-size:13px;color:var(--muted,#2E575E);line-height:1.5}
.pd-meta{text-align:right;min-width:180px}
.pd-meta-type{font-size:12px;text-transform:uppercase;letter-spacing:.08em;color:var(--muted,#2E575E)}
.pd-meta-no{font-size:17px;font-weight:700;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;margin-bottom:6px}
.pd-meta-row{font-size:13px;color:var(--ink,#0E2E33)}
.pd-meta-row .pd-lbl{margin-right:6px}
.pd-billto{margin-bottom:14px}
.pd-billto-name{font-weight:600;font-size:14px;color:var(--ink,#0E2E33)}
/* lines table — scrolls inside its own wrapper on phones, never the page body */
.pd-tbl-wrap{overflow-x:auto;-webkit-overflow-scrolling:touch;margin:4px 0}
.pd-lines{width:100%;border-collapse:collapse;min-width:520px}
.pd-lines th{font-size:12px;text-transform:uppercase;letter-spacing:.03em;color:var(--muted,#2E575E);text-align:left;padding:8px;border-bottom:2px solid var(--line,#d3e6e4)}
.pd-lines td{font-size:13px;padding:9px 8px;border-bottom:1px solid var(--line,#d3e6e4);vertical-align:top}
.pd-lines .r{text-align:right;white-space:nowrap}
/* totals */
.pd-totals{margin-top:14px;margin-left:auto;width:280px;max-width:100%;display:flex;flex-direction:column;gap:5px}
.pd-tot-row{display:flex;justify-content:space-between;gap:24px;font-size:13px}
.pd-tot-row>span:first-child{color:var(--muted,#2E575E)}
.pd-tot-grand{font-size:14px;font-weight:600;border-top:1px solid var(--line,#d3e6e4);padding-top:6px}
.pd-tot-grand>span:first-child{color:var(--ink,#0E2E33)}
.pd-tot-balance{font-size:15px;font-weight:700}
.pd-tot-balance>span:first-child{color:var(--ink,#0E2E33)}
/* how to pay */
.pd-paybox-title{font-weight:700;font-size:14px;color:var(--ink,#0E2E33);margin-bottom:8px}
.pd-pay-rows{display:flex;flex-direction:column;gap:5px}
.pd-pay-row{display:flex;gap:14px;font-size:13px;align-items:baseline}
.pd-pay-row .pd-lbl{min-width:110px}
.pd-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace}
.pd-pay-note{font-size:12px;color:var(--muted,#2E575E);margin-top:10px}
/* footer */
.pd-foot{text-align:center;font-size:12px;color:var(--muted,#2E575E);margin-top:6px}
.pd-foot-brand{font-weight:700}
/* phones: stack the paper head, full-width actions */
@media (max-width:560px){
  .pd-page{padding:10px 8px 32px}
  .pd-paper{padding:16px 14px}
  .pd-paper-head{flex-direction:column;gap:10px}
  .pd-meta{text-align:left;min-width:0}
  .pd-totals{width:100%}
  .pd-bar-actions{width:100%}
  .pd-bar-actions .btn{flex:1;text-align:center}
}

/* == Approvals (queue screen + editor submit + detail approval banner) ========================= */
.apv-toolbar{display:flex;justify-content:flex-end;margin-bottom:10px}
.apv-tbl .apv-td-actions{text-align:right;white-space:nowrap;width:1%}
.apv-type{display:inline-block;font-size:12px;font-weight:700;background:var(--brand-faint);
  color:var(--brand-ink);border-radius:6px;padding:1px 6px;margin-right:6px}
.apv-st{display:inline-block;font-size:12px;font-weight:600;border-radius:10px;padding:2px 9px;white-space:nowrap}
.apv-st-pending{background:#fff2d6;color:#8a5a00}
.apv-st-approved{background:#e0f3e6;color:#1a7a3c}
.apv-st-rejected{background:#fbe0e0;color:var(--bad)}
.apv-st-withdrawn{background:var(--line);color:var(--muted)}
:root[data-theme=dark] .apv-st-pending{background:#3d3016;color:#e7c07a}
:root[data-theme=dark] .apv-st-approved{background:#1c3a28;color:#88d3a2}
:root[data-theme=dark] .apv-st-rejected{background:#40201f;color:#f0a0a0}
.apv-row-actions,.apv-reject{display:inline-flex;gap:6px;align-items:center;flex-wrap:wrap;justify-content:flex-end}
.apv-reject .form-control{width:220px;min-width:150px;font-size:13px}
.apv-reason-sub,.apv-row-err{white-space:normal;text-align:right;max-width:280px;margin-top:4px;margin-left:auto}
.apv-banner{flex-wrap:wrap}
.apv-banner .apv-banner-msg{flex:1 1 260px}
.apv-banner .apv-reason-input{flex:1 1 180px;width:auto;min-width:150px;font-size:13px}
.apv-banner-err{flex-basis:100%;font-size:12px;color:var(--bad)}

/* == Global search / Ctrl+K palette (documents parity sweep A7) =============================
   Reuses .modal-overlay/.modal-card/.modal-wide (see openBulkPaymentModal in documents.js for
   the same plain-DOM technique) — these rules only add the palette's own input/results chrome.
   All colours ride the existing brand tokens, so light/dark need no extra overrides here. */
.gsearch-card{padding:0;max-width:580px;width:100%;overflow:hidden;display:flex;flex-direction:column;max-height:74vh}
.gsearch-inputrow{display:flex;align-items:center;gap:8px;padding:14px 16px;border-bottom:1px solid var(--line)}
.gsearch-input{flex:1;border:none;background:transparent;color:var(--ink);font-size:16px;padding:4px 0;height:auto;border-radius:0}
.gsearch-input:focus{outline:none;box-shadow:none}
.gsearch-hint{padding:0 16px 12px;font-size:12px;color:var(--muted)}
.gsearch-results{flex:1;min-height:0;overflow-y:auto;padding:6px}
.gsearch-group{margin:4px 0}
.gsearch-group-title{font-size:12px;font-weight:600;text-transform:uppercase;letter-spacing:.04em;
  color:var(--muted);padding:8px 10px 4px}
.gsearch-row{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:9px 10px;
  border-radius:8px;cursor:pointer}
.gsearch-row:hover{background:var(--bg)}
.gsearch-row.kb-focus{background:var(--brand-faint)}
.gsearch-row-main{font-size:14px;color:var(--ink);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.gsearch-row-sub{font-size:12px;color:var(--muted);white-space:nowrap;flex:0 0 auto}
@media (max-width:560px){
  .gsearch-row{flex-direction:column;align-items:flex-start;gap:2px}
  .gsearch-row-sub{white-space:normal}
}

/* == Attachments (shared card — documents parity sweep C1: doc + contact attachments) ========== */
.attach-card{margin-top:14px}
.attach-drop{display:flex;align-items:center;gap:10px;flex-wrap:wrap;border:1.5px dashed var(--line);
  border-radius:var(--radius);padding:14px;margin-bottom:12px;transition:border-color .15s,background-color .15s}
.attach-drop.is-dragover{border-color:var(--brand);background:var(--brand-faint)}
.attach-drop-hint{font-size:13px;color:var(--muted)}
/* visually-hidden but still focusable/AT-reachable — the real <button> beside it drives the click */
.attach-file-input{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;
  clip:rect(0,0,0,0);white-space:nowrap;border:0}
.attach-empty{padding:18px 0}

/* ── Recurring invoices (documents parity Wave E1 — recurring.js) ── */
.head-actions{display:flex;gap:8px;align-items:center;flex-wrap:wrap}
.rec-tbl td{vertical-align:top}
.rec-notes{font-size:12px;color:var(--muted);margin-top:2px;max-width:22rem}
.rec-sub{font-size:12px;color:var(--muted);margin-top:2px}
.rec-type{font-size:12px;font-weight:600;color:var(--brand-ink);background:var(--brand-faint);
  border-radius:8px;padding:2px 8px;white-space:nowrap}
.rec-actions{white-space:nowrap}
.rec-actions .btn{margin-left:4px}
.rec-row.rec-ended{opacity:.72}
/* create/edit modal */
.rec-modal{max-width:760px}
.rec-grid{display:grid;grid-template-columns:1fr 1fr;gap:10px;margin-bottom:6px}
.rec-f-wide{grid-column:1 / -1}
.rec-lines-h{font-size:14px;margin:12px 0 6px;color:var(--ink)}
.rec-lines-tbl th,.rec-lines-tbl td{padding:4px 6px}
.rec-lines-tbl .form-control{min-width:0}
.rec-lines-foot{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-top:8px}
.rec-est{font-size:13px;color:var(--muted)}
.rec-est b{color:var(--ink)}
@media(max-width:640px){.rec-grid{grid-template-columns:1fr}}
/* reminders settings (X2 — settings.js Reminders tab) */
.rem-run-summary{font-size:13px;color:var(--ink);background:var(--brand-faint);border-radius:var(--radius);padding:10px 12px}
.rem-run-skip{font-size:12px;color:var(--muted);margin-top:4px}
/* reminder rail card (X2b — document_detail.js) */
.rem-state{font-size:13px;color:var(--ink);margin-bottom:8px}
.rem-state.rem-muted{color:var(--muted)}
.rem-hint{font-size:12px;color:var(--muted);margin-top:6px;line-height:1.4}
/* muted row indicator (X2b — documents.js list) */
.doc-muted-flag{font-size:12px;color:var(--muted);white-space:nowrap}
/* inline new-contact quick-add (F1 — document_editor.js) */
.ed-f-lbl{display:flex;align-items:center;justify-content:space-between;gap:8px}
.ed-newcontact{background:none;border:0;color:var(--brand);font-size:12px;font-weight:600;cursor:pointer;padding:0}
.ed-newcontact:hover{text-decoration:underline}
.nc-modal{max-width:440px}
/* saved document templates (F3 — document_editor.js) */
.ed-line-tools{display:flex;gap:8px;flex-wrap:wrap;margin-top:6px}
.tpl-modal{max-width:520px}
.tpl-list{display:flex;flex-direction:column;gap:6px;margin-bottom:14px;max-height:340px;overflow:auto}
.tpl-row{display:flex;align-items:center;gap:8px;padding:6px 8px;border:1px solid var(--line);border-radius:8px}
.tpl-name{flex:1;font-size:13px;color:var(--ink)}
.tpl-del{color:var(--bad)}
.tpl-empty{font-size:13px;color:var(--muted);padding:8px 0}
.tpl-savenew{border-top:1px solid var(--line);padding-top:12px;display:flex;gap:8px;align-items:flex-end}
.tpl-savenew .pay-f{flex:1}

/* ---------- search-selector (shared/searchselect.js) base skin ----------
   vt.css styles .ss under body.vt for the tenant app; the company picker / onboarding form strips
   body.vt (aboo-skinned), so the popup needs this base. The inputs there ride .form-control (the
   screens pass className) — only the .ss wrapper and the body-appended popup are skinned here.
   Under body.vt the vt.css rules out-rank these, so the tenant app is unaffected. */
.ss{position:relative;display:block}
.ss-input{cursor:text;padding-right:24px}
/* dropdown chevron (owner 2026-09-14: "dropdowns need a visible chevron") — a non-interactive
   glyph pinned to the right of the box; pointer-events:none so a click still opens the popup. */
.ss-caret{position:absolute;top:0;right:9px;height:100%;display:flex;align-items:center;
  pointer-events:none;color:var(--muted,#6b7a7a);font-size:12px;line-height:1}
.ss-list{position:fixed;z-index:1300;margin:0;padding:4px;list-style:none;max-height:264px;overflow-y:auto;overflow-x:hidden;
  background:var(--surface);border:1px solid var(--aboo-accent);border-radius:8px;box-shadow:0 12px 34px rgba(0,0,0,.25)}
.ss-opt{display:flex;align-items:baseline;justify-content:space-between;gap:12px;padding:7px 10px;border-radius:6px;
  font-size:13.5px;color:var(--ink);cursor:pointer}
.ss-opt .ss-lab{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.ss-opt .ss-sub{color:var(--muted);font-size:12px;flex-shrink:0;white-space:nowrap}
.ss-opt.active{background:var(--aboo-accent);color:#06282d}
.ss-opt.sel:not(.active){background:rgba(25,196,196,.14)}
.ss-opt.is-empty{color:var(--muted);cursor:default;justify-content:flex-start}

/* ── Journals rework (Andre 2026-09-17): projected per-account balance + one clean inline editor ──
   Appended (never edits the protected "basics"/.btn-row-del blocks near the top). */
/* The projected new balance shown under each debit/credit account name. A number → right-aligned +
   tabular (the "basics" gate), muted and small so the account name still leads the cell. */
.jrn-acct .jrn-acct-name{display:block}
.jrn-proj{display:block;margin-top:2px;font-size:12px;color:var(--muted);text-align:left;
  font-variant-numeric:tabular-nums;white-space:nowrap;font-weight:600}
/* money direction: debit leg = money entering (green), credit leg = money exiting (red).
   .jrn-proj already sets color, so these carry higher specificity to win regardless of order. */
.jrn-proj.t-in{color:var(--ok)}
.jrn-proj.t-out{color:var(--ok)}
/* the account cells carry a second line (the projected balance), so cb-table's default
   vertical-align:middle would drop DATE/description/ref/amount to the row's centre. Top-align
   every display-row cell so all first lines sit on ONE horizontal line with the account name.
   The inline edit row keeps its own middle alignment. */
.jrn-table tbody tr:not(.jrn-edit-row) > td{vertical-align:top}
/* ONE clean inline edit row on a SINGLE line, aligned to the display columns. Editable GL pickers
   for both legs; the two descriptions and the amount+tax sit side-by-side (never stacked). */
.jrn-edit-row td{vertical-align:middle}
.jrn-edit-date{max-width:140px}
.jrn-edit-in{width:100%;padding:5px 7px;font-size:13px;height:auto}
.jrn-edit-inline{display:flex;gap:5px;align-items:center;min-width:0}
.jrn-edit-inline .jrn-edit-in{flex:1 1 0;min-width:0}
/* amount + tax share the AMOUNT column: right-aligned as a group so the amount sits UNDER the
   right-aligned "Amount" header, with the compact tax tucked to its left. */
.jrn-edit-amtcell{justify-content:flex-end}
.jrn-edit-inline .jrn-edit-amt{flex:0 0 84px}
.jrn-edit-inline .jrn-edit-tax{flex:0 0 96px}
.jrn-edit-fixed{color:var(--muted);font-size:12.5px}
/* Actions cell: keep it a NORMAL table-cell so vertical-align centres the ✓/✕ pair on the input
   centreline — a display:flex <td> (the shared .jrn-edit-act default) top-aligned them. The pair is
   a nowrap inline-flex so ✓ and ✕ stay side-by-side. */
.jrn-edit-row td.jrn-edit-act{display:table-cell;vertical-align:middle;text-align:right;white-space:nowrap}
.jrn-edit-btns{display:inline-flex;gap:6px;flex-wrap:nowrap;align-items:center;vertical-align:middle}
.jrn-edit-act .jrn-edit-err{display:block;text-align:right;margin-top:2px}
.jrn-edit-ok{color:var(--ok,#15803d)}
.jrn-edit-cancel{color:var(--muted)}
/* Capture-form tax picker (searchSelect) — sized like the other meta fields, hidden until VAT-on. */
.jrn-meta .jrn-tax-cell{flex:0 1 180px;max-width:180px;min-width:0}
.jrn-tax-cell .ss{width:100%}

/* ── Invoice branding + remittance (Feature 1.2 / 1.3) ───────────────────────────────────────
   Logo upload (dropzone) + a per-company brand-colour accent on documents, plus the country-aware
   remittance block. The accent is passed as the --doc-accent custom property on the document root
   (set as a token in markup, consumed ONLY via these classes — no hard-coded colours in markup).
   It is used for rules/borders + bold headings, so it stays legible in light and dark. */

/* logo upload control — Settings → Branding */
.bt-logo-drop{margin-top:4px;padding:16px}
.bt-logo-drop.over{border-color:var(--brand);color:var(--brand);background:var(--surface-2)}
.bt-logo-file{display:none}
.bt-logo-prev-row{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin-top:8px}
.bt-logo-url{width:100%;margin-top:8px}
/* Uploaded logo previews INSIDE the drop box, scaled proportionally (owner 2026-09-19:
   "after uploading the logo put it in the upload box so you can see things properly"). */
.bt-logo-drop-img{display:block;max-width:100%;max-height:120px;margin:0 auto 8px;object-fit:contain}
.bt-logo-actions{display:flex;justify-content:flex-start;margin-top:8px}

/* logo on the document paper (on-screen detail + public page) */
.doc-paper-logo{display:block;max-height:52px;max-width:240px;object-fit:contain;margin-bottom:8px}
.pd-org-logo{display:block;max-height:56px;max-width:240px;object-fit:contain;margin-bottom:10px}

/* brand-colour accent — on-screen document detail */
.doc-paper-branded .doc-paper-head{border-bottom:2px solid var(--doc-accent,var(--brand));padding-bottom:12px}
.doc-paper-branded .doc-paper-type{color:var(--doc-accent,var(--brand))}
.doc-paper-branded .doc-lines-tbl thead th{border-bottom:2px solid var(--doc-accent,var(--brand))}
.doc-paper-branded .doc-total-grand{border-top-color:var(--doc-accent,var(--brand));color:var(--doc-accent,var(--brand))}
.doc-paper-branded .doc-paybox{border-left:3px solid var(--doc-accent,var(--brand));padding-left:12px}

/* brand-colour accent — public / shared document */
.pd-branded .pd-paper-head{border-bottom:2px solid var(--doc-accent,var(--brand));padding-bottom:12px}
.pd-branded .pd-meta-type{color:var(--doc-accent,var(--brand))}
.pd-branded .pd-lines thead th{border-bottom:2px solid var(--doc-accent,var(--brand))}
.pd-branded .pd-tot-grand{border-top-color:var(--doc-accent,var(--brand))}
.pd-branded .pd-paybox-title{color:var(--doc-accent,var(--brand))}
.pd-branded .pd-paybox{border-left:3px solid var(--doc-accent,var(--brand))}

/* ── Universal document editor (quotes/invoices/… + purchases) ─────────────────────────────── */
.de-head{display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap;margin:2px 0 8px}
.de-title{font-size:22px;margin:0}
.de-card{margin-bottom:10px}
.de-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:8px 12px}
/* Never let a picker/input push a grid track wider than the card (mobile overflow guard). */
.de-grid,.de-grid>*,.de-addparty-form,.de-addparty-form .de-grid>*{min-width:0}
.de-page .ss,.de-page .ss-input,.de-page .form-control{box-sizing:border-box;max-width:100%}
/* ONE uniform metric for every single-line control in the editor — text inputs, searchSelects,
   and <sleek-date> — so selects, date boxes and inputs all share the same height/padding/margin
   (owner Andre 2026-09-18: "everything uniform"). Textareas keep their own height. */
.de-page .form-control,.de-page .ss-input,.de-page .sleek-date-in{height:38px;box-sizing:border-box;padding:0 10px;margin:0;font-size:14px}
.de-page textarea.form-control{height:auto;padding:8px 10px}
.de-page .ss-input{padding-right:26px}   /* room for the caret */
/* Customer + reference sit side by side on desktop (2-col grid), stack on mobile. */
.de-ccy{font-weight:700;padding-top:4px}
.de-lines-head{display:flex;align-items:baseline;gap:10px;flex-wrap:wrap;margin-bottom:6px}
.de-lines-hint{font-size:12px}
.de-lines-wrap{overflow-x:auto}
.de-lines{width:100%;border-collapse:collapse}
body.vt .de-lines thead th{font-size:11px;text-transform:uppercase;letter-spacing:.03em;color:var(--muted,#6b7280);font-weight:700;text-align:left;padding:4px 6px;border-bottom:1px solid var(--line,#e5e7eb);background:transparent}
body.vt .de-lines td{padding:4px 6px;vertical-align:middle}
/* First column gets a small consistent left inset (header + cell aligned). */
body.vt .de-lines th:first-child,body.vt .de-lines td:first-child{padding-left:4px}
.de-lines .de-c-qty,.de-lines .de-c-price,.de-lines .de-c-disc,.de-lines .de-c-total{text-align:right}
.de-lines .de-c-qty{width:58px}
.de-lines .de-c-price{width:94px}
.de-lines .de-c-disc{width:70px}
.de-lines .de-c-total{width:100px}
.de-lines th.de-c-total{padding-right:6px}
/* Numeric + total inputs fill their column, right-aligned. Heights/padding from the uniform rule. */
.de-lines .de-c-qty .form-control,.de-lines .de-c-price .form-control,.de-lines .de-c-disc .form-control,.de-lines .de-c-total .form-control{width:100%;text-align:right}
.de-lines .de-c-vat{width:92px}
.de-lines .de-c-x{width:30px;text-align:center}
.de-item-wrap{display:flex;gap:6px;align-items:flex-start}
.de-item-wrap .ss{flex:1 1 55%;min-width:0}
.de-item-wrap .de-desc{flex:1 1 45%;margin-top:0}
.de-desc{font-size:12.5px}
@media (max-width:767px){body.vt .de-item-wrap{flex-direction:column}body.vt .de-item-wrap .de-desc{margin-top:4px}}
.btn-row-del{background:none;border:0;color:var(--muted,#9ca3af);cursor:pointer;padding:4px}
.btn-row-del:hover{color:var(--bad,#dc2626)}
.de-addline{margin-top:8px}
.de-foot{display:grid;grid-template-columns:1fr 300px;gap:10px;align-items:start}
.de-totals{align-self:start}
.de-tot-row{display:flex;justify-content:space-between;padding:3px 0;font-size:14px}
.de-tot-grand{border-top:1px solid var(--line,#e5e7eb);margin-top:4px;padding-top:8px;font-size:16px;font-weight:800}
.de-actions{display:flex;align-items:center;gap:8px;margin-top:10px}
.de-send-toggle{display:inline-flex;align-items:center;gap:8px;font-size:13px;margin-right:8px;white-space:nowrap}
/* Posted document: locked — pickers/rows non-interactive. */
.de-readonly .ss,.de-readonly .btn-row-del,.de-readonly .sleek-date-cal-btn{pointer-events:none;opacity:.75}
.de-attach-head{font-weight:700;font-size:13px;margin-bottom:8px}
.de-attach-btn{display:inline-flex;align-items:center;cursor:pointer}
.de-attach-list{display:flex;flex-direction:column;gap:4px;margin:8px 0}
.de-attach-row{display:flex;align-items:center;justify-content:space-between;gap:10px;font-size:13px;padding:4px 8px;border:1px solid var(--line,#e5e7eb);border-radius:6px}
.de-attach-row .btn-link.danger{background:none;border:0;cursor:pointer;color:var(--bad,#dc2626);font-weight:600;font-size:12.5px}
.de-attach-hint{font-size:12px}
/* Compact the shared attachmentsCard when embedded in the editor — no nested card chrome, a slim
   drop strip (owner Andre 2026-09-18: "attachments area is way too bulky"). */
.de-attach{padding:8px 12px}
.de-attach .attach-card{border:0;background:transparent;margin:0;padding:0;box-shadow:none}
.de-attach .attach-card .card-body{padding:0}
.de-attach .attach-drop{padding:6px 10px;min-height:0}
/* The drop strip already says "drag files / choose" — drop the redundant empty box. */
.de-attach .attach-empty{display:none}
.de-attach .muted-block{padding:6px 10px}
.de-attach .rail-card-title{margin:0 0 4px;font-size:13px}
.de-attach .row-list{margin-top:6px}
.de-addparty{grid-column:1 / -1;margin-top:2px}
.de-addparty-form{border:1px dashed var(--brand,#0BA8A0);border-radius:10px;padding:12px;background:var(--surface-2,#f8fafc)}
.de-addparty-head{font-weight:700;font-size:13px;margin-bottom:8px}
.de-addparty-actions{display:flex;justify-content:flex-end;align-items:center;gap:8px;margin-top:10px}
.de-addparty-actions .row-err{margin-right:auto}

/* Mobile: header one column, and each line becomes a labeled card. */
@media (max-width:767px){
  body.vt .de-grid{grid-template-columns:1fr}
  body.vt .de-foot{grid-template-columns:1fr}
  body.vt .de-lines,body.vt .de-lines tbody{display:block}
  body.vt .de-lines thead{display:none}
  body.vt .de-lines tr{display:block;border:1px solid var(--line,#e5e7eb);border-radius:10px;padding:8px;margin-bottom:8px;position:relative}
  body.vt .de-lines td{display:flex;align-items:center;gap:8px;padding:4px 0;border:0}
  body.vt .de-lines td[hidden]{display:none}
  body.vt .de-lines td::before{content:attr(data-label);flex:0 0 84px;font-size:11px;text-transform:uppercase;letter-spacing:.03em;color:var(--muted,#6b7280);font-weight:700}
  body.vt .de-lines .de-c-item{display:block}
  body.vt .de-lines .de-c-item::before{display:block;margin-bottom:4px}
  body.vt .de-lines .de-c-qty,body.vt .de-lines .de-c-price,body.vt .de-lines .de-c-disc,body.vt .de-lines .de-c-vat,body.vt .de-lines .de-c-acct,body.vt .de-lines .de-c-total{width:auto}
  body.vt .de-lines .de-c-x{position:static;display:flex;justify-content:flex-end;padding:6px 0 0;margin-top:4px;border-top:1px solid var(--line,#eef1f4)}
  body.vt .de-lines .de-c-x::before{display:none}
  body.vt .de-lines .de-c-x .btn-row-del{display:inline-flex;align-items:center;gap:6px;color:var(--bad,#dc2626);font-weight:600;font-size:13px}
  body.vt .de-lines .form-control{flex:1 1 auto;min-width:0}
}

/* Sales & Purchases document list — search + family tabs toolbar (contacts-landing parity). */
.doc-toolbar{display:flex;align-items:center;gap:12px;flex-wrap:wrap;margin-bottom:12px}
.doc-toolbar .search{flex:1 1 240px;max-width:360px}
.doc-list tr.clickable{cursor:pointer}
.doc-list tr.clickable:hover{background:var(--hover,rgba(0,0,0,.03))}
/* Same horizontal padding on every cell so the footer total lines up under the Total column. */
.doc-list th,.doc-list td{padding-left:8px;padding-right:8px}
.doc-list tfoot .doc-list-total td{font-weight:800;border-top:2px solid var(--line,#e5e7eb);padding-top:10px;padding-bottom:6px}
.doc-type-sub{display:block;font-size:11px;color:var(--muted,#6b7280);text-transform:uppercase;letter-spacing:.02em}

/* Statements & Reconciliation grid (src/tenant/statements.js) — reuses .cb-table for the frame,
   .cb-recon/-ok/-off for the Ties badge, .t-in/.t-out for money colour, .alert-warn for the gap. */
.stmt-scroll{overflow-x:auto;-webkit-overflow-scrolling:touch}
.stmt-table{min-width:680px}
.stmt-table td{padding:4px 8px}
.stmt-table td.stmt-2line{line-height:1.2;padding-top:4px;padding-bottom:4px}
.stmt-table td.stmt-2line .stmt-led{font-size:13px;margin-top:1px}
.stmt-table td.stmt-td-period .stmt-date{font-size:13px;line-height:1.2}
.stmt-table td.stmt-td-period .stmt-txns{display:inline-block;margin-top:1px}
.stmt-table .stmt-ref-input{width:5.5rem;padding:3px 6px;font-size:12.5px;font-weight:700}
/* Ref cell: the BS tag input + its "⬇ PDF" (download the original imported file) side by side on
   ONE control height (golden rule #9). Three classes so it outranks the tenant `body.vt .btn`. The
   button is deliberately not .btn-sm: that class's later min-height:32px would undercut the 44px
   touch minimum the input beside it gets on (pointer: coarse), splitting the row's heights. */
.stmt-table .stmt-ref-cell{display:flex;align-items:center;gap:6px}
.stmt-table .stmt-ref-cell .stmt-ref-input,
.stmt-table .stmt-ref-cell .stmt-dl{height:var(--control-h);box-sizing:border-box;margin:0}
.stmt-table .stmt-ref-cell .stmt-dl{padding:0 9px;font-size:12.5px;font-weight:650;line-height:1;
  white-space:nowrap;flex:0 0 auto}
.stmt-table .stmt-ref-cell .stmt-dl:disabled{opacity:.55;cursor:progress}
.stmt-table td.stmt-num{white-space:nowrap}
.stmt-table .stmt-txns{font-size:12px;margin-left:4px}
.stmt-table .stmt-computed{font-size:12px}
.stmt-table td.stmt-ledger .stmt-ledger-tie{margin-left:6px}
.stmt-table td.stmt-ledger .cb-recon{padding:1px 6px;font-size:12px}
.stmt-table tr.stmt-row-off td{background:rgba(180,83,9,.06)}
.stmt-table tr.stmt-gap-banner td{padding:6px 8px;background:transparent}
.stmt-table tr.stmt-gap-banner:hover td{background:transparent}

/* Bad-data shortlist — suspect lines with one-click "fix pills" (owner 2026-09-21) */
.stmt-bad{border:1px solid var(--warn);border-radius:10px;background:color-mix(in srgb, var(--warn) 7%, var(--surface));
  padding:10px 12px;margin:0 0 14px}
.stmt-bad-hd{font-weight:800;color:var(--warn);margin-bottom:8px;display:flex;align-items:baseline;gap:10px;flex-wrap:wrap}
.stmt-bad-sub{font-size:12.5px;font-weight:500}
.stmt-bad-list{display:flex;flex-direction:column;gap:8px}
.stmt-bad-row{background:var(--surface);border:1px solid var(--line);border-radius:8px;padding:8px 10px}
.stmt-bad-line{display:flex;align-items:baseline;gap:8px;flex-wrap:wrap;font-size:13.5px}
.stmt-bad-ref{font-weight:800}
.stmt-bad-descr{color:var(--ink);flex:1 1 140px;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.stmt-bad-amt{font-weight:700}
.stmt-bad-amt.t-in{color:var(--ok)} .stmt-bad-amt.t-out{color:var(--bad)}
.stmt-bad-posted{font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.03em;
  color:var(--muted);border:1px solid var(--line);border-radius:999px;padding:1px 7px}
.stmt-bad-reason{font-size:12.5px;color:var(--muted);margin:3px 0 7px}
.stmt-bad-pills{display:flex;gap:7px;flex-wrap:wrap}
.stmt-bad-edit{display:flex;gap:7px;align-items:center;flex-wrap:wrap}
.stmt-bad-dateinput{width:11rem}
/* pills — compact action chips */
.pill{appearance:none;cursor:pointer;font-size:12.5px;font-weight:700;border-radius:999px;
  padding:5px 12px;border:1px solid var(--line);background:var(--surface);color:var(--ink);white-space:nowrap}
.pill:hover{border-color:var(--brand)}
.pill:disabled{opacity:.5;cursor:not-allowed}
.pill-primary{background:var(--brand);border-color:var(--brand);color:#fff}
.pill-ghost{background:transparent}
.pill-danger-ghost{color:var(--bad);border-color:color-mix(in srgb, var(--bad) 40%, var(--line))}
.pill-danger{background:var(--bad);border-color:var(--bad);color:#fff}

/* VAT re-stamp offer after a default-code change (Settings → CoA) */
.set-restamp-offer{display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap}
.set-restamp-actions{display:flex;gap:8px;flex:0 0 auto}

/* Register reconciliation strip — opening → book → statement → reconciled, always visible so the
   user can SEE the account ties (opening balance is a journal, not a listed line) */
.cb-recon-strip{display:flex;align-items:center;flex-wrap:wrap;gap:8px 18px;padding:8px 12px;margin:0 0 8px;
  border-radius:8px;font-size:13px;background:color-mix(in srgb, var(--brand) 8%, transparent);
  border:1px solid var(--line);color:var(--ink)}
.cb-recon-cell{display:flex;flex-direction:column;line-height:1.2}
.cb-recon-cell label{font-size:12px;font-weight:600;text-transform:uppercase;letter-spacing:.04em;color:var(--muted,#777)}
.cb-recon-cell small{font-size:12px;color:var(--muted,#777)}
.cb-recon-arrow{color:var(--muted,#999);font-size:15px}
.cb-recon-strip .cb-recon{margin-left:auto}
.rp-table .rp-group-hd td{background:var(--surface-2,#f1f5f9);border-top:2px solid var(--line,#e2e8f0);padding:7px 8px;font-weight:700}
.rp-table tr.rp-drill{cursor:pointer}
.rp-table tr.rp-drill:hover td{background:var(--surface-2,#f1f5f9)}
.rp-is-line.rp-drill,.rp-bs-row.rp-drill{cursor:pointer}
.rp-is-line.rp-drill:hover,.rp-bs-row.rp-drill:hover{background:var(--surface-2,#f1f5f9)}
