/* ——— Siite base tokens ———
   Merged from SEVEN competing :root blocks in which 17 tokens held different
   values — --radius-sm was 10px, 6px and 8px depending on where the cascade
   landed. Every value here is the one that ALREADY WON, so this change is
   invisible by design: it makes the system honest without restyling anything.

   --action-blue is deliberately NOT here. It is declared on
   body:not(.login-mode), which is more specific than :root and wins anyway.

   Audit LD29 (20 Oct): the two later :root blocks (elevation + radii, and
   motion) are merged in here, brace-balanced, so this is the ONLY place a
   token is defined. Where they disagreed, the later block's value is the one
   that was already winning and is the one kept. --shadow, the accidental
   fourth elevation, is now an alias of --elev-2.
*/
:root{--stat-value:var(--text-3xl);--control-sm:44px;--control-md:44px;--control-lg:56px;--tab-bar-h:calc(60px + env(safe-area-inset-bottom, 0px));
  --bad:var(--status-critical);
  --bad-bg:var(--status-critical-surface);
  --bg:#f4f7fb;
  --blue:#163a5f;
  --blue-2:#245f8f;
  --blue-3:#31749f;
  --blue-deep:#102a44;
  --blueprint:#1f6fa8;
  --border-default:#dce4ee;
  --border-strong:#c3d0e0;
  --border-subtle:#eef2f7;
  --border-width:1px;
  --danger-bg:var(--status-critical-surface);
  /* Elevation: three levels - resting, raised, overlay. Every older shadow
     name points at one of them. */
  --elev-0:none;--elev-1:0 1px 2px rgba(16,42,68,.05);
  --elev-2:0 1px 2px rgba(16,42,68,.05),0 6px 16px rgba(16,42,68,.06);
  --elev-3:0 2px 6px rgba(16,42,68,.07),0 18px 40px rgba(16,42,68,.10);
  --elevation-0:var(--elev-0);
  --elevation-1:var(--elev-1);
  --elevation-2:var(--elev-2);
  --elevation-3:var(--elev-3);
  --elevation-4:var(--elev-3);
  --focus-offset:2px;
  /* Visual 453 (Jim, 22 Oct): the focus ring and accents are the website
     orange. The ring keeps a white halo, which is what makes it readable on a
     rust button (ring on rust alone is 1.64:1). */
  --accent:#D85F32;
  --focus-colour:var(--accent);
  --focus-outline:2px solid var(--focus-colour);
  --focus-ring:0 0 0 5px rgba(255,255,255,.9);
  /* Visual 453: the call-to-action is the jbpdevelopments.com button rust
     (#A6421F, white text 6.14:1), darker on hover (7.75:1). One per view. */
  --cta:#A6421F;
  --cta-hover:#8E3719;
  --cta-ink:#fff;
  /* Visual 453: the clock button is gold on every screen. Sand to clock in
     (navy text 6.86:1), the website gold while clocked in (9.85:1). Both sit
     on white, so both carry the deep-gold edge (4.0:1 against white). Never
     red, never amber. */
  --clock:#C3AF90;
  --clock-edge:#9a7b33;
  --clock-ink:#102a44;
  --clock-live:#F1D08D;
  --clock-live-ink:#102a44;
  --fs-min:12px;
  --good:var(--status-ok);
  --good-bg:#e4f2ea;
  --info-bg:#eef6ff;
  --ink:#132033;
  /* Visual 459: four line heights - none (figures, icons), tight (headings,
     chips), snug (dense UI: tables, rows, labels) and normal (reading text). */
  --leading-none:1;
  --leading-snug:1.4;
  --leading-normal:1.55;
  --leading-relaxed:1.7;
  --leading-tight:1.25;
  --limestone:#f7f4ee;
  --line:#dce4ee;
  --line-soft:#eaf0f6;
  --muted:#4e5a68;
  --navy:#163a5f;
  --navy-800:#123757;
  --navy-900:#0d2b49;
  --neutral-bg:#f2f5f8;
  --page-max:1540px;
  --panel:#fff;
  /* One roundness scale, the brief's 0/4/8/12/16/999. Audit LD18: --r-xs was
     6px and --r-lg 18px, putting 735 corners off the scale. */
  --r-xs:4px;
  --r-sm:8px;
  --r-md:12px;
  --r-lg:16px;
  --r-pill:999px;
  --radius-xs:var(--r-xs);
  --radius-sm:var(--r-sm);
  --radius-md:var(--r-md);
  --radius-lg:var(--r-md);
  --radius-xl:var(--r-lg);
  --radius:var(--r-md);
  --sand:#c3af90;
  /* Brand 332: JBP's own colours (logo pack, October 2026), for what Siite shows or prints under JBP's name. Not the app's palette. */
  --jbp-navy:#1E2A39;--jbp-gold:#AA8C57;--jbp-muted:var(--muted);--jbp-line:#DCD9D2;
  --sand-deep:#9a7b33;
  --sand-tint:#f7f2e7;
  --shadow:var(--elev-2);
  --shadow-board:var(--elev-2);
  --shadow-card:var(--elev-2);
  --shadow-lift:var(--elev-2);
  --shadow-md:var(--elev-3);
  --shadow-sm:var(--elev-2);
  --shadow-soft:var(--elev-2);
  --shadow-xs:var(--elev-1);
  --soft:#eaf1f8;
  --space-1:4px;
  --space-10:40px;
  --space-12:48px;
  --space-2:8px;
  --space-3:12px;
  --space-4:16px;
  --space-5:20px;
  --space-6:24px;
  --space-7:28px;
  --space-8:32px;
  --status-critical:#a63636;
  --status-critical-surface:#fdf0f0;
  --status-info:#245f8f;
  --status-info-surface:#eef4fa;
  --status-neutral:#4e5a68;
  --status-neutral-surface:#f2f5f9;
  --status-ok:#1d7a4d;
  --status-ok-surface:#eef8f2;
  --status-warning:#a8721f;
  --status-warning-surface:#fff8ec;
  --success-bg:var(--status-ok-surface);
  --surface:#ffffff;
  --surface-base:#f4f7fb;
  --surface-inverse:#132033;
  --surface-overlay:rgba(255,255,255,.86);
  --surface-raised:#ffffff;
  --surface-scrim:rgba(15,26,42,.42);
  --surface-soft:var(--bg);
  --surface-sunken:#eef2f7;
  --text-2xl:24px;
  --text-3xl:30px;
  --text-base:14px; /* Audit LD12: the brief's 14px base (was 15) */
  --text-lg:17px;
  --text-sm:13px;
  --text-xl:20px;
  --text-xs:12px;
  --transition-base:180ms ease;
  --transition-fast:120ms ease;
  --transition-slow:260ms ease;
  /* Motion: two durations, two easings (see the Motion notes further down). */
  --motion:150ms;
  --motion-slow:240ms;
  --ease-out:cubic-bezier(.22,1,.36,1);
  --ease-in-out:cubic-bezier(.4,0,.2,1);
  --ui-gap:16px;
  --ui-radius:var(--r-lg);
  --warn:var(--status-warning);
  /* Audit LD20/LM-25: --warn (#a8721f) is a fill and border colour; as TEXT
     on white or the warning tint it fails AA (3.9:1). Warn text uses this. */
  --warn-ink:#7a4d00;
  --warn-bg:#fbf1df;
  --warning-bg:var(--status-warning-surface);
  --weight-bold:700;
  --weight-medium:600;
  --weight-normal:400;
  /* Calm 469 (R2B-01): ONE stacking scale, low to high. Every drawer opened
     UNDER the sticky header (drawer 60, header a hard-coded 90), so its title
     and Close were hidden and a press on Close hit the menu button. The order
     is now a rule: page < menus < header < phone tab bar < scrim < drawer /
     sheet < full-screen viewers < dialog < toast. A drawer's scrim dims the
     header and the tab bar; Close is never under anything. */
  --z-base:0;
  --z-sticky:9;
  --z-nav:20;
  --z-overlay:70;
  --z-menu:var(--z-overlay);
  --z-header:90;
  --z-palette:100;
  --z-tabbar:1000;
  --z-scrim:1290;
  --z-drawer:1300;
  --z-viewer:2000;
  --z-dialog:9100;
  --z-toast:9200;
  /* Calm 469 (Apple feel #20): one open/close timing for drawers, sheets and search. */
  --motion-sheet:180ms;
  /* Programme 460: one crew palette (area chart, Gantt stripe, legend) - no red, which means "drives the finish". */
  --crew-1:#2e79aa;--crew-2:#2e8b57;--crew-3:#6d28d9;--crew-4:#a8721f;
  --crew-5:#0f766e;--crew-6:#163a5f;--crew-7:#5b6b7c;--crew-8:#9aa7b4;
  --p460-blocker:#b45309;--p460-blocker-band:rgba(180,83,9,.14);
  --p460-area-bg:#f7f2e7;--p460-span:#e4d6bc;
}
*{box-sizing:border-box}
html,body{max-width:100%}
/* Audit LM-01: overflow-x:hidden on BOTH html and body made body its own
   scroll container, one that never scrolls, so every position:sticky element
   (the header with Clock in, the Submit bar, the message box) stuck to body
   and scrolled away with the page. The viewport keeps the sideways clip on a
   phone, and body uses clip, which hides overflow WITHOUT becoming a
   scroller. Above phone width nothing is clipped, so a wide table can still
   scroll the page sideways (25 Sep). */
@media(max-width:760px){html{overflow-x:hidden}body{overflow-x:clip}}
.sr-only{position:absolute!important;width:1px!important;height:1px!important;padding:0!important;margin:-1px!important;overflow:hidden!important;clip:rect(0,0,0,0)!important;white-space:nowrap!important;border:0!important}
body{margin:0;background:var(--bg);color:var(--ink);display:flex;min-height:100vh;font-size:var(--text-base);line-height:var(--leading-normal);font-variant-numeric:tabular-nums}
.sidebar{width:236px;background:linear-gradient(180deg,#102f4f,#0b2239);color:white;padding:var(--space-6) var(--space-4);display:flex;flex-direction:column;gap:var(--space-6);position:fixed;left:0;top:0;bottom:0;z-index:10}
body.sidebar-collapsed .sidebar{transform:translateX(-100%)}
.brand{display:flex;gap:var(--space-4);align-items:center;padding:var(--space-1) var(--space-1) var(--space-5);border-bottom:1px solid rgba(255,255,255,.14)}
.logo{width:50px;height:50px;border-radius:var(--r-md);background:white;color:var(--blue);display:grid;place-items:center;font-size:var(--text-2xl);font-weight:700;box-shadow:var(--shadow-soft)}
/* Audit LD07: no browser-default #0000ee links; zero specificity so every component's own link colour still wins */:where(a){color:var(--blue-2)}/* Audit LD22 (third pass): an unstyled <summary> was a 21px press (hub Documents' 28 folders, Ledger and Materials "Details", Marketplace "Sell something", Time Clock, Programme). Every disclosure gets the 44px floor here; zero specificity, so a component's own summary styling still wins. */:where(summary){min-height:var(--control-md);box-sizing:border-box;cursor:pointer}:where(summary:not([class])){padding-block:var(--space-3)}h1,h2,h3,p{margin:0}/* Audit LD06: headings are 600, set once here (12 later 700s deleted). Audit LD05: without this a <strong> in a 600/700 parent resolved to 900. */h1,h2,h3,h4,h5,h6{font-weight:600}b,strong{font-weight:600}/* Visual 459: a heading with no size of its own lands on the type scale (the browser's 1.5em / 1.17em gave 21px and 16.38px). Zero-class selectors, so every component's own size still wins. */h1{font-size:var(--text-2xl)}h2{font-size:var(--text-xl)}h3{font-size:var(--text-lg)}h4,h5,h6{font-size:var(--text-base)}.brand h1{font-size:var(--text-2xl);letter-spacing:-.04em}.brand p{font-size: var(--text-sm);opacity:.75;margin-top:1px}
nav{display:flex;flex-direction:column;gap:8px}.nav-group{margin:var(--space-2) var(--space-2) 0;color:rgba(255,255,255,.48);font-size: var(--text-xs);font-weight:600;text-transform:uppercase;letter-spacing:.12em}.nav-group:first-child{margin-top:0}.nav{border:0;text-align:left;padding:var(--space-3) var(--space-4);border-radius:var(--r-md);background:transparent;color:rgba(255,255,255,.77);font-weight:700;cursor:pointer;font-size:var(--text-base)}.nav:hover,.nav.active,.nav[aria-current="page"]{background:rgba(255,255,255,.12);color:white}.side-footer{margin-top:auto;background:rgba(255,255,255,.08);padding:var(--space-4);border-radius:var(--r-md);display:flex;flex-direction:column;gap:var(--space-1);font-size: var(--text-sm)}.side-footer span{opacity:.7}
main{padding:var(--space-7);min-height:100vh}/* Calm 469 (R2B-18): the margin slides only while a person toggles the sidebar (body.sidebar-moving); on sign-in it was animated and counted as the whole page shifting. */body.sidebar-moving main{transition:margin-left var(--motion-slow) var(--ease-out),width var(--motion-slow) var(--ease-out)}.topbar{display:flex;justify-content:space-between;align-items:center;margin:calc(var(--space-7) * -1) calc(var(--space-7) * -1) var(--space-6);padding:var(--space-7);gap:var(--space-4);position:sticky;top:0;z-index:9;background:rgba(244,247,251,.98);border-bottom:1px solid rgba(220,228,238,.8)}.topbar-left{display:flex;align-items:center;gap:var(--space-4);min-width:0}.topbar-brand{display:flex;align-items:center;gap:var(--space-2);min-width:190px}.topbar-logo{width:38px;height:38px;border-radius:var(--r-md);background:var(--blue);color:white;display:grid;place-items:center;font-size:var(--text-xl);font-weight:700}.topbar-brand strong,.topbar-brand span{display:block;line-height:var(--leading-none)}.topbar-brand strong{font-size:var(--text-lg);letter-spacing:-.03em}.topbar-brand span{font-size: var(--text-xs);color:var(--muted);font-weight:700}.eyebrow{text-transform:uppercase;font-size: var(--text-xs);font-weight:600;letter-spacing:.14em;color:var(--muted);margin-bottom:4px}.topbar h2{font-size: var(--text-2xl);font-weight:600;letter-spacing:-.03em}.actions,.button-row,.toolbar{display:flex;gap:var(--space-2);align-items:center}.actions{margin-left:auto}.button-row{margin-top:12px;flex-wrap:wrap}.wrap{flex-wrap:wrap}.badge{background:#eef4fa;color:var(--blue);border:1px solid #dbe4ec;padding:var(--space-2) var(--space-3);border-radius:var(--r-pill);font-size: var(--text-xs);font-weight:600}.badge.live{background:var(--status-ok-surface);color:var(--good);border-color:#b3e4c7}.badge.warn{background:var(--status-warning-surface);color:var(--warn-ink);border-color:#f1d08d}
button{border:0;background:var(--blue);color:white;border-radius:var(--r-sm);padding:var(--space-2) var(--space-4);font-weight:600;cursor:pointer;box-shadow:var(--shadow-soft)}button:hover{filter:brightness(1.04)}button.secondary{background:white;color:var(--blue);border:1px solid var(--line);box-shadow:none}button.danger{background:var(--bad)}/* Visual 459 (V3 §4): the dead button.stop rule is gone - no control carries .stop since clocking out became the gold siiteClockButton (Visual 453). *//* Audit LM-11: text-field styling (padding, 44px height, pale border) is for text fields; it was turning every checkbox into a 21x44 pill. :where() keeps the specificity unchanged. */input:where(:not([type=checkbox],[type=radio])),select,textarea{border:1px solid #dbe4ec;border-radius:var(--r-sm);padding:var(--space-3) var(--space-3);background:white;color:var(--ink);font:inherit;min-height:var(--control-md)}input:focus,select:focus,textarea:focus{outline:2px solid rgba(36,95,143,.18);border-color:#8fb6d5}textarea{width:100%;margin-top:var(--space-4);line-height:var(--leading-snug)}.view{display:none}.view.active{display:block}.alert{background:var(--status-warning-surface);border:1px solid #eedec0;border-left:4px solid var(--warn);color:#5d4a1a;padding:var(--space-4) var(--space-4);border-radius:var(--r-sm);margin-bottom:var(--space-4)}.cards{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:var(--space-4);margin-bottom:var(--space-4)}.card{background:var(--panel);border:1px solid var(--line);border-radius:var(--radius);padding:var(--space-4);box-shadow:var(--shadow)}.card .label{color:var(--muted);font-size: var(--text-xs);font-weight:600;text-transform:uppercase;letter-spacing:.1em}.card .value{font-size: var(--text-2xl);font-weight:600;letter-spacing:-.04em;margin-top:var(--space-2)}.card small{display:block;color:var(--muted);margin-top:var(--space-2)}.grid{display:grid;gap:var(--space-4);margin-bottom:var(--space-4)}.grid.two{grid-template-columns:1fr 1fr}.panel{background:white;border:1px solid var(--line);border-radius:var(--radius);padding:var(--space-5);box-shadow:var(--shadow);margin-bottom:var(--space-4)}.panel-title{display:flex;justify-content:space-between;gap:var(--space-4);align-items:flex-start;margin-bottom:var(--space-4)}.panel-title h3{font-size:var(--text-lg);letter-spacing:-.02em}.panel-title span,.muted{color:var(--muted);font-size: var(--text-sm)}.bars{display:flex;flex-direction:column;gap:14px}.bar-row{display:grid;grid-template-columns:150px 1fr 110px;gap:12px;align-items:center}.bar-label{font-weight:700;font-size:var(--text-base)}.bar-track{height:13px;background:var(--soft);border-radius:var(--r-pill);overflow:hidden}.bar-fill{height:100%;background:linear-gradient(90deg,var(--blue),var(--blue-2));border-radius:var(--r-pill)}.bar-value{text-align:right;font-weight:700}.donut-wrap{display:grid;grid-template-columns:170px 1fr;gap:20px;align-items:center}.donut{width:160px;height:160px;border-radius:50%;background:conic-gradient(var(--blue) 0deg,var(--blue) 180deg,var(--blue-2) 180deg,var(--blue-2) 300deg,#b9c7d6 300deg,#b9c7d6 360deg);position:relative}.donut:after{content:"";position:absolute;inset:28px;background:white;border-radius:50%}.legend{display:flex;flex-direction:column;gap:var(--space-2)}.legend span{display:flex;justify-content:space-between;border-bottom:1px dashed var(--line);padding-bottom:8px;font-size:var(--text-base)}.clean-list{display:flex;flex-direction:column;gap:var(--space-3);list-style:none;padding:0;margin:0}.clean-list li{background:#f8fafc;border:1px solid #e6edf5;border-radius:var(--r-md);padding:var(--space-3) var(--space-4)}.toolbar{margin-bottom:16px}.toolbar input{min-width:260px}tr:hover td{background:var(--panel)}.pill{display:inline-flex;border-radius:var(--r-pill);padding:var(--space-1) var(--space-2);font-size: var(--text-xs);font-weight:600;background:var(--line);color:var(--muted)}.pill.good{background:var(--status-ok-surface);color:var(--good)}.pill.warn{background:var(--status-warning-surface);color:var(--warn-ink)}.pill.bad{background:var(--status-critical-surface);color:var(--bad)}.project-grid{display:grid;grid-template-columns:repeat(3,minmax(230px,1fr));gap:16px}.project-card{background:white;border:1px solid var(--line);border-radius:var(--radius);padding:18px;box-shadow:var(--shadow)}.project-card h3{font-size:var(--text-xl);margin-bottom:4px}.project-card .meta{color:var(--muted);font-size: var(--text-sm);margin-bottom:14px}.numbers{display:grid;grid-template-columns:1fr 1fr;gap:10px}.numberbox{background:#f7fafc;border:1px solid #e7edf4;border-radius:var(--r-md);padding:var(--space-3)}.numberbox span{display:block;color:var(--muted);font-size: var(--text-xs);font-weight:600;text-transform:uppercase;letter-spacing:.1em}.numberbox strong{display:block;font-size:var(--text-lg);margin-top:4px}/* Audit P3V-08 (third pass): minmax(0,1fr), and children that may shrink - a 1fr column grows to its longest select option (429px of a 390 screen on Documents' upload form). */.form-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:var(--space-2);margin-top:var(--space-4)}.form-grid > *{min-width:0}.form-grid > :is(select,input,textarea){max-width:100%}.form-grid button{grid-column:1/-1}.kanban{display:grid;grid-template-columns:repeat(3,1fr);gap:16px}.lane{background:#eef4fa;border:1px solid var(--line);border-radius:var(--r-md);padding:var(--space-4);min-height:260px}.lane h3{margin-bottom:var(--space-3)}.task{background:white;border:1px solid var(--line);border-radius:var(--r-md);padding:var(--space-3);margin-bottom:var(--space-2)}.task strong{display:block}.task small{display:block;color:var(--muted);margin-top:var(--space-2)}.task-actions{display:flex;gap:var(--space-2);margin-top:var(--space-2)}.task-actions button{padding:var(--space-2) var(--space-2);font-size: var(--text-xs)}.manifest{display:flex;flex-direction:column;gap:var(--space-2)}.source{border:1px solid #e1e9f2;background:var(--bg);border-radius:var(--r-md);padding:13px}.source strong{display:block}.source code{font-size: var(--text-xs);color:#43586d;word-break:normal;overflow-wrap:break-word}.codebox{white-space:pre-wrap;background:#0e2238;color:#dcecff;border-radius:var(--r-md);padding:14px;min-height:120px;overflow:auto}.architecture{display:flex;align-items:stretch;justify-content:space-between;gap:var(--space-2)}.architecture div{flex:1;background:#f7fafc;border:1px solid var(--line);border-radius:var(--r-md);padding:var(--space-4);font-weight:700;text-align:center}.architecture small{display:block;color:var(--muted);font-weight:600;margin-top:var(--space-1)}.architecture span{display:grid;place-items:center;color:var(--blue);font-size:var(--text-2xl);font-weight:700}@media(max-width:1100px){.sidebar{position:static;width:100%;height:auto}.sidebar nav{display:grid;grid-template-columns:repeat(2,1fr)}body{display:block}.grid.two,.project-grid,.kanban{grid-template-columns:1fr}.topbar{align-items:flex-start;gap:var(--space-4);flex-direction:column}.donut-wrap{grid-template-columns:1fr}.architecture{flex-direction:column}.architecture span{transform:rotate(90deg)}}

button:focus{outline:none}
button:focus-visible{outline:2px solid var(--focus-colour);outline-offset:3px;box-shadow:var(--shadow-card)}
button.secondary:focus-visible,.menu-toggle:focus-visible{outline:2px solid var(--focus-colour);outline-offset:3px;box-shadow:var(--shadow-card)}
.link-card:after{content:"Open";position:absolute;right:14px;top:14px;border-radius:var(--r-pill);background:#eef4fa;color:var(--blue);font-size: var(--text-xs);font-weight:700;padding:var(--space-1) var(--space-2);opacity:0;transition:opacity var(--motion) var(--ease-out)}
.link-card:hover:after,.link-card:focus-visible:after{opacity:1}
.evidence-actions{margin-top:12px}
.evidence-open-link{display:inline-flex;align-items:center;justify-content:center;min-height:var(--control-sm);border:1px solid var(--line);border-radius:var(--r-md);padding:var(--space-2) var(--space-3);background:white;color:var(--blue);font-size: var(--text-sm);font-weight:700;text-decoration:none}
.evidence-open-link:hover{border-color:#9ebbd4;background:var(--bg)}

.crm-stage-list,.crm-action-list{display:grid;gap:12px}
/* Audit LD23: stat grids auto-fit, so a row never leaves one tile stranded on its own. */
.crm-kpi-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:12px}
.crm-kpi-card{background:var(--bg);border:1px solid #e6edf5;border-radius:var(--r-md);padding:14px;display:grid;gap:5px}
.crm-kpi-card span{color:var(--muted);font-size: var(--text-xs);font-weight:600;text-transform:uppercase;letter-spacing:.1em}
.crm-kpi-card strong{font-size:var(--text-2xl);letter-spacing:-.03em}
.crm-kpi-card small{color:var(--muted);font-weight:700;line-height:var(--leading-tight)}
.crm-stage-row{display:grid;grid-template-columns:minmax(160px,1fr) 2fr minmax(130px,.7fr);gap:14px;align-items:center;background:var(--bg);border:1px solid #e6edf5;border-radius:var(--r-md);padding:13px}
.crm-stage-row strong{display:block}
.crm-stage-row small{display:block;color:var(--muted);font-weight:700;margin-top:3px}
.crm-stage-track{height:12px;background:#e7eef6;border-radius:var(--r-pill);overflow:hidden}
.crm-stage-track span{display:block;height:100%;background:linear-gradient(90deg,var(--blue),#34a0a4);border-radius:var(--r-pill)}
.crm-stage-money{font-weight:700;text-align:right}
.crm-stage-money small{font-weight:700}
.crm-action-list .review-item{box-shadow:none}
/* Bulk-archive preview: the reviewer reads every candidate and its reason, and
   unticks anything that should stay. An excluded row stays legible rather than
   disappearing, so the count and the list always agree. */
.crm-archive-preview .crm-action-list{max-height:420px;overflow-y:auto}
.crm-archive-row{display:grid;grid-template-columns:auto 1fr;gap:10px;align-items:start;cursor:pointer}
.crm-archive-row input{margin-top:4px;width:18px;height:18px}
.crm-archive-row>span{display:grid;gap:4px}
.crm-action-list .review-item.muted{opacity:.55}
.crm-action-list .review-item.muted strong{text-decoration:line-through}
.crm-call-review{display:grid;gap:14px}
.crm-call-summary{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px}
.crm-call-filters{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:12px}
.crm-call-filters label{display:grid;gap:6px;min-width:0}
.crm-call-filters input,.crm-call-filters select{width:100%;min-width:0}
@media(max-width:760px){.crm-call-filters{grid-template-columns:1fr}}
.crm-call-summary-card{background:var(--bg);border:1px solid #e6edf5;border-radius:var(--r-md);padding:14px;display:grid;gap:5px}
.crm-call-summary-card span,.crm-call-note aside span{color:var(--muted);font-size: var(--text-xs);font-weight:600;text-transform:uppercase;letter-spacing:.1em}
.crm-call-summary-card strong{font-size:var(--text-2xl);letter-spacing:-.03em}
.crm-call-summary-card small{color:var(--muted);font-weight:700;line-height:var(--leading-tight)}
.crm-call-director-note{background:#f7fafc;border:1px solid var(--line);border-radius:var(--r-md);padding:14px;color:#30475f;font-weight:700;line-height:var(--leading-snug)}
.crm-call-director-note p+p{margin-top:6px}
.crm-call-note-list{display:grid;gap:12px}
.crm-call-note{display:grid;grid-template-columns:minmax(0,1.3fr) minmax(260px,.7fr);gap:14px;background:white;border:1px solid var(--line);border-radius:var(--r-md);padding:14px;box-shadow:var(--shadow-soft)}
.crm-call-note strong{display:block;margin-top:8px;font-size:var(--text-base)}
.crm-call-note small{display:block;color:var(--muted);font-weight:700;line-height:var(--leading-snug);margin-top:4px}
.crm-call-note p{color:#40556b;line-height:var(--leading-snug);margin-top:8px}
.crm-call-note aside{background:var(--status-warning-surface);border:1px solid #f1d08d;border-radius:var(--r-md);padding:var(--space-3)}
.crm-call-note aside p{color:#5d4309;font-weight:700}
@media(max-width:760px){.crm-stage-row,.crm-call-summary,.crm-call-note{grid-template-columns:1fr}.crm-stage-money{text-align:left}}


.task.warning{border-color:#f0c36d;background:#fff8e7}
.task.danger{border-color:#df8d8d;background:#fff0f0}
.task.complete{background:#f1f6f2;border-color:#bfd9c9;opacity:.78}
.task.complete strong{text-decoration:line-through;color:#53625a}
.task-head{display:flex;align-items:center;justify-content:space-between;gap:var(--space-2);margin-bottom:var(--space-2)}
/* Audit LM-18: Mark complete is a 24px box in a 44px-tall label, not a 13px native tick. */
.task-check{display:flex;align-items:center;gap:8px;min-height:var(--control-sm);color:var(--muted);font-size: var(--text-xs);font-weight:600;cursor:pointer}
.task-check input{width:24px;height:24px;min-height:0;margin:0;accent-color:var(--good)}
.due-pill{display:inline-flex;border-radius:var(--r-pill);padding:var(--space-1) var(--space-2);background:var(--line);color:var(--muted);font-size: var(--text-xs);font-weight:700;white-space:nowrap}
.due-pill.warning{background:var(--status-warning-surface);color:#835300}
.due-pill.danger{background:var(--status-critical-surface);color:var(--bad)}
.due-pill.complete{background:var(--status-ok-surface);color:var(--good)}
.task-preview{display:flex;justify-content:space-between;align-items:center;gap:10px}
.task-preview.warning{background:#fff8e7;border-color:#f0c36d}
.task-preview.danger{background:#fff0f0;border-color:#df8d8d}
.task-done{padding:7px 9px;font-size: var(--text-xs);white-space:nowrap}
.empty-lane{padding:var(--space-2) 2px}
.task-actions{flex-wrap:wrap}
.task-bulk-panel,.task-notification-panel{border-top:4px solid #d8e7f4}
.task-bulk-controls{display:grid;grid-template-columns:repeat(3,minmax(170px,1fr)) auto;gap:var(--space-2);align-items:end}
.task-bulk-controls .field{margin:0}
.task-bulk-controls button{min-height:var(--control-md)}
.task-notification-list{display:grid;gap:var(--space-2)}
.task-notification-item{display:grid;grid-template-columns:1fr auto;gap:12px;align-items:center;padding:13px 14px;border:1px solid var(--line);border-radius:var(--r-md);background:var(--panel)}
.task-notification-item.unread{border-left:4px solid var(--blue);background:#f3f8fc}
.task-notification-item h4{margin:0 0 4px}
.task-notification-item p,.task-notification-item small{margin:0;color:var(--muted)}
.task-notification-actions{display:flex;gap:8px;flex-wrap:wrap;justify-content:flex-end}
.task-bulk-select{display:flex;align-items:center;gap:var(--space-2);font-size: var(--text-xs);font-weight:700;color:var(--muted)}
.task-bulk-select input{min-height:auto}
.task-checklist{display:grid;gap:9px;margin:14px 0}
.task-checklist-row{display:grid;grid-template-columns:auto 1fr auto;gap:10px;align-items:center;padding:10px 12px;border:1px solid var(--line);border-radius:var(--r-md);background:var(--panel)}
.task-checklist-row.done{background:#eff9f3;border-color:#bfe2ca}
.task-checklist-row label{display:grid;grid-template-columns:auto 1fr;gap:10px;align-items:center;grid-column:1 / 3;margin:0}
.task-checklist-row input{min-height:auto;accent-color:var(--good)}
.task-checklist-row button{padding:6px 9px}
.task-checklist-progress{display:flex;align-items:center;justify-content:space-between;gap:10px;margin-bottom:8px}
.task-checklist-progress strong{font-size:var(--text-base)}
.task-checklist-progress span{color:var(--muted);font-size: var(--text-sm)}
.task-create-panel .panel-title{margin-bottom:10px}
.task-create-panel{border-top:4px solid #d8e7f4}
.task-form-grid{grid-template-columns:repeat(4,minmax(160px,1fr))}
.task-form-grid .wide{grid-column:1/-1}
.task-title-button{display:block;width:100%;padding:0;margin:0 0 2px;background:transparent;color:var(--ink);box-shadow:none;border:0;text-align:left;font-size: var(--text-base);font-weight:600;line-height:var(--leading-tight)}
.task-title-button:hover{filter:none;color:var(--blue)}
.task-title-button.selected{color:var(--blue)}
.task-list-page.hidden,.task-record-page.hidden{display:none}
.record-page-header{display:flex;align-items:center;justify-content:space-between;gap:16px;background:white;border:1px solid var(--line);border-radius:var(--r-md);padding:16px 18px;margin-bottom:18px;box-shadow:var(--shadow)}
.record-title-block{flex:1;min-width:220px}
.record-title-block h3{font-size:var(--text-2xl);letter-spacing:-.03em;margin:2px 0 4px}
.record-title-block p{color:var(--muted);font-weight:700;margin:0}
.record-header-actions{display:flex;align-items:center;justify-content:flex-end;gap:10px;flex-wrap:wrap}
.task-record-shell .task-detail-panel{margin-bottom:0}
.task-record-shell .task-detail-panel>.panel-title{display:none}
.task-detail-panel{border-color:#cddceb}
.task-detail-grid{display:grid;grid-template-columns:repeat(3,minmax(160px,1fr));gap:10px;margin-bottom:14px}
.task-detail-grid div{background:#f7fafc;border:1px solid #e7edf4;border-radius:var(--r-md);padding:var(--space-3)}
.task-detail-grid strong{display:block;font-size: var(--text-xs);text-transform:uppercase;color:var(--muted);letter-spacing:.1em;margin-bottom:5px}
.task-detail-grid span{display:block;font-weight:700;color:var(--ink);word-break:break-word}
.task-message{background:#f8fafc;border:1px solid #e6edf5;border-radius:var(--r-md);padding:13px;margin:12px 0}
.task-message strong{display:block;margin-bottom:5px}
.task-message p{margin:0;color:#31475d;line-height:var(--leading-snug)}
.task-evidence-block{margin:16px 0;border:1px solid #e3ebf4;border-radius:var(--r-md);background:var(--panel);padding:var(--space-3)}
.task-evidence-list{grid-template-columns:repeat(auto-fit,minmax(190px,1fr))}
.task-evidence-card{border:1px solid #e3ebf4;border-radius:var(--r-md);background:white;padding:11px;display:grid;gap:7px}
.task-evidence-card h4{margin:0;font-size:var(--text-base);color:var(--ink)}
.task-evidence-card p{margin:0;color:var(--muted);font-weight:700}

.task-filter-row{display:grid;grid-template-columns:repeat(4,minmax(170px,1fr));gap:var(--space-2);align-items:center}
.lane h3{display:flex;align-items:center;justify-content:space-between;gap:var(--space-2)}
.lane h3 small{background:white;border:1px solid var(--line);border-radius:var(--r-pill);padding:var(--space-1) var(--space-2);color:var(--muted);font-size: var(--text-xs);font-weight:700}
.task-linked-drawings p{display:flex;gap:8px;align-items:center;flex-wrap:wrap;margin-top:6px}
.task-closeout-box{margin:16px 0;border:1px solid var(--line);border-radius:var(--r-md);background:var(--bg);padding:14px}
.task-closeout-box textarea{margin-top:0}
.task-closeout-grid{display:grid;grid-template-columns:1fr 1fr;gap:10px;margin:10px 0}
.task-closeout-box button{margin-top:6px}

.task-file-drop{border:1px dashed #b9cbe0;background:#f7fafc;border-radius:var(--r-md);padding:14px;display:grid;gap:7px;color:#31475d}
.task-file-drop.wide{grid-column:1/-1}
.task-file-drop.dragging{background:#eaf4ff;border-color:var(--blue-2);box-shadow:var(--shadow-card)}
.task-file-drop strong{color:var(--ink);font-size: var(--text-base)}
.task-file-drop span,.task-file-drop small{color:var(--muted);font-weight:700;line-height:var(--leading-snug)}
.task-file-drop input{background:white;border-style:solid;padding:9px;min-height:auto}
@media(max-width:1100px){.task-filter-row,.task-closeout-grid{grid-template-columns:1fr}.record-page-header{align-items:stretch;flex-direction:column}.record-header-actions{justify-content:flex-start}.record-header-actions button{width:100%}}
@media(max-width:1100px){.task-bulk-controls{grid-template-columns:1fr}.task-notification-item{grid-template-columns:1fr}.task-notification-actions{justify-content:flex-start}}
.task-comms{margin-top:18px}
.task-comms textarea{margin-top:0}
.task-communication-list article{background:#f8fafc;border:1px solid #e6edf5;border-radius:var(--r-md);padding:13px;margin-bottom:10px}
.task-communication-list h4{margin:8px 0 4px;font-size: var(--text-base)}
.task-communication-list p{margin:0 0 6px;color:#31475d;line-height:var(--leading-snug)}
@media(max-width:1100px){.form-grid,.task-form-grid,.task-detail-grid,.prestart-grid,.source-status-grid{grid-template-columns:minmax(0,1fr)}.task-form-grid .wide{grid-column:1}.task-detail-panel .button-row{align-items:stretch}.task-detail-panel .button-row button{width:100%}}
.login-mode .sidebar,.login-mode .topbar{display:none}
.login-mode .sidebar-scrim,body[data-auth-state="restoring"] .sidebar-scrim{display:none!important}
.login-mode main{margin-left:0;width:100%;display:grid;place-items:center;padding:28px}
.login-page{width:min(440px,100%);margin:auto;padding-top:env(safe-area-inset-top, 0px)} /* Offline 483 (R2D-14): clear of the status bar in a home-screen Siite */
.login-card{background:white;border:1px solid var(--line);border-radius:var(--r-md);box-shadow:var(--shadow);padding:28px}
.login-logo{width:54px;height:54px;border-radius:var(--r-md);background:var(--blue);color:white;display:grid;place-items:center;font-size:var(--text-3xl);font-weight:700;margin-bottom:18px}
.login-card h3{font-size:var(--text-2xl);letter-spacing:-.03em;margin-bottom:8px}
.auth-controls{display:flex;gap:10px;align-items:center;flex-wrap:wrap;margin-top:18px}
.auth-controls input{width:100%;min-width:180px}
.auth-controls button{flex:1;min-width:130px}
/* Visual 453: the sign-in button is the call-to-action, in the website rust. */
.auth-controls #signIn{background:var(--cta);color:var(--cta-ink)}
.auth-controls #signIn:hover{background:var(--cta-hover);filter:none}
.password-field{position:relative;width:100%;display:flex;align-items:center}
.password-field input{padding-right:86px}
.password-field button{position:absolute;right:6px;min-width:0;flex:0;padding:7px 10px;border-radius:var(--r-sm)}
.user-menu{position:relative}
.user-button{width:42px;height:42px;border-radius:50%;padding:0;display:grid;place-items:center;background:var(--blue);box-shadow:none}
.user-dropdown{position:absolute;right:0;top:50px;width:240px;max-height:calc(100dvh - 82px);background:white;border:1px solid var(--line);border-radius:var(--r-md);box-shadow:var(--shadow);padding:14px;z-index:20;overflow-y:auto;overscroll-behavior:contain;scrollbar-gutter:stable}
.user-dropdown strong,.user-dropdown span{display:block}
.user-dropdown button{width:100%;margin-top:12px}
.hidden{display:none!important}
.toast-host{position:fixed;right:22px;bottom:22px;z-index:var(--z-toast);display:grid;gap:var(--space-2);width:min(420px,calc(100vw - 32px));max-height:calc(100dvh - 44px);overflow-y:auto;overscroll-behavior:contain;scrollbar-gutter:stable;pointer-events:none}
.toast{pointer-events:auto;background:var(--panel);border:1px solid var(--line);border-left:5px solid var(--blue);border-radius:var(--radius);box-shadow:var(--shadow);padding:var(--space-4) 52px var(--space-4) var(--space-4);position:relative;color:var(--ink);font-weight:700;line-height:var(--leading-snug)}
.toast.success{border-left-color:var(--good)}
.toast.error{border-left-color:var(--bad);background:var(--status-critical-surface);border-color:#efc6c6}
.toast.info{border-left-color:var(--blue)}
/* 2 Sep audit: 100 warning toasts painted identical to neutral ones - a
   must-see warning now looks like one. */
.toast.warning{border-left-color:var(--warn, var(--warn));background:var(--status-warning-surface);border-color:#ecd9ae}
/* Audit LM-29: the dismiss x is a 44px target (it was 28px wide). */
.toast button{position:absolute;right:2px;top:2px;width:var(--control-md);height:var(--control-md);border-radius:var(--r-pill);padding:0;background:transparent;color:var(--muted);box-shadow:none;border:0;font-size:var(--text-lg);line-height:var(--leading-none)}
.toast button:hover{background:var(--line);filter:none;color:var(--ink)}
.toast .toast-action{position:static;width:auto;height:auto;margin-top:10px;padding:var(--space-2) var(--space-3);border:1px solid var(--line);border-radius:var(--r-xs);background:#fff;color:var(--navy);font-size: var(--text-sm);line-height:var(--leading-tight)}
.toast .toast-action:hover{background:#edf4fa;color:var(--navy)}
.toast .toast-dismiss{position:absolute;right:2px;top:2px}
/* Square close buttons (notifications drawer and the like): 44 x 44, a real
   glyph size, not a 36px sliver around a tiny x. Audit LM-29. */
.icon-button{display:inline-grid;place-items:center;min-width:var(--control-md);min-height:var(--control-md);padding:0;font-size:var(--text-xl);line-height:var(--leading-none)}

/* Audit P3V-07 (third pass): the bell is the shared line icon (siiteIcon
   'bell') in a fixed 44px box, with the unread count as a badge pinned to the
   button's corner. The CSS-drawn bell (a ::before body and an ::after clapper)
   collapsed to a 4px bar whenever a count was showing, and its clapper was
   positioned against the topbar (the button was position:static), so it
   landed under Clock in as a stray mark on every phone screen. One look at
   every width; the word "Notifications" stays for screen readers. */
body:not(.login-mode) .topbar .notification-button{position:relative;display:inline-grid;place-items:center;width:var(--control-md);min-width:var(--control-md);height:var(--control-md);min-height:var(--control-md);padding:0;overflow:visible;color:var(--blue)}
.notification-button .notification-bell{display:grid;place-items:center;width:20px;height:20px;pointer-events:none}
.notification-button .notification-label{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}
.notification-button .notification-count{position:absolute;top:2px;right:2px;min-width:18px;height:18px;padding:0 5px;line-height:18px;font-size:var(--text-xs);pointer-events:none}
.notification-count{display:inline-grid;place-items:center;min-width:22px;height:22px;padding:0 6px;border-radius:var(--r-pill);background:var(--bad);color:#fff;font-size: var(--text-xs);font-weight:700}
.notification-scrim{position:fixed;inset:0;z-index:1230;background:rgba(9,27,46,.28);backdrop-filter:blur(2px)}
.notification-drawer{position:fixed;top:0;right:0;bottom:0;z-index:1240;display:grid;grid-template-rows:auto auto auto minmax(0,1fr);width:min(470px,96vw);height:100dvh;background:#f5f8fb;border-left:1px solid var(--line);box-shadow:var(--shadow);overflow:hidden}
.notification-drawer-header{display:flex;align-items:center;justify-content:space-between;gap:16px;padding:var(--space-5);border-bottom:1px solid var(--line);background:#fff}
.notification-drawer-header h3,.notification-drawer-header p{margin:0}
.notification-drawer-actions{display:flex;gap:8px;flex-wrap:wrap;padding:var(--space-3) var(--space-5);border-bottom:1px solid var(--line);background:#fff}
.notification-permission-status{padding:10px 20px;border-bottom:1px solid var(--line);font-size: var(--text-xs);font-weight:700;line-height:var(--leading-snug);background:#f7f9fc;color:var(--muted)}
.notification-permission-status.good{background:#effaf4;color:var(--good)}
.notification-permission-status.warn{background:#fff9ed;color:#7d5511}
.notification-permission-status.bad{background:#fff1f1;color:var(--bad)}
.notification-drawer-list{min-height:0;overflow-y:auto;overscroll-behavior:contain;padding:var(--space-3)}
.notification-drawer-item{margin-bottom:10px;padding:var(--space-3);border:1px solid var(--line);border-radius:var(--r-sm);background:#fff}
.notification-drawer-item.unread{border-left:4px solid var(--blue);background:#f8fcff}
.notification-open{display:grid;grid-template-columns:10px minmax(0,1fr);gap:10px;width:100%;padding:0;border:0;background:transparent;color:var(--ink);text-align:left;box-shadow:none}
.notification-open:hover{background:transparent;filter:none;color:var(--ink)}
.notification-open span:last-child{display:grid;gap:4px}
.notification-open strong,.notification-open small,.notification-open time{display:block}
.notification-open small{color:var(--muted);font-weight:600;line-height:var(--leading-snug)}
.notification-open time{color:var(--muted);font-size: var(--text-xs);font-weight:700}
.notification-severity{width:8px;height:8px;margin-top:6px;border-radius:50%;background:var(--blue)}
.notification-severity.high{background:var(--bad)}
.notification-item-actions{display:flex;gap:8px;justify-content:flex-end;margin-top:10px}
.notification-empty{display:grid;place-items:center;align-content:center;gap:6px;min-height:240px;padding:30px;text-align:center;color:var(--muted)}
.notification-empty strong{color:var(--ink);font-size:var(--text-lg)}
body.notification-centre-open{overflow:hidden}

@media(max-width:760px){
  .notification-drawer{width:100vw;border-left:0}
  .notification-drawer-header{padding:var(--space-4)}
  .notification-drawer-actions{padding:10px 16px}
  .notification-drawer-list{padding:10px}
}
.build-update-toast{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:12px;align-items:center;padding:14px 46px 14px 15px}
.build-update-toast>div{display:grid;gap:3px}
.build-update-toast strong{color:var(--blue);font-size:var(--text-base)}
.build-update-toast span{color:var(--muted);font-size: var(--text-xs);line-height:var(--leading-snug)}
.build-update-toast .build-update-action{position:static;width:auto;height:auto;border-radius:var(--r-sm);padding:9px 12px;background:var(--blue);color:#fff;font-size: var(--text-xs);white-space:nowrap}
.build-update-toast .build-update-action:hover{background:#174f7e;color:#fff}
.build-update-toast .build-update-dismiss{position:absolute;right:8px;top:8px}
@media(max-width:760px){.build-update-toast{grid-template-columns:1fr}.build-update-toast .build-update-action{width:100%}}
.bad-text{color:var(--bad)!important}
.sync-warning{width:100%;background:#fff8e7;border:1px solid #f1d08d;color:#684500;border-radius:var(--r-md);padding:13px 15px;margin:-8px 0 18px;font-weight:700;line-height:var(--leading-snug);overflow-wrap:anywhere}
/* Offline 483 (R2D-10): a long unbroken word (a web address in an error) wraps instead of widening the sign-in card past the screen. */
#authStatus{overflow-wrap:anywhere;min-width:0}
.login-mode .sync-warning{width:min(440px,100%);min-width:0;margin:0 auto 18px;white-space:normal;overflow-wrap:anywhere}
/* Audit LD36: an urgent failure carries its own error card, so the amber strip steps aside. */
.sync-warning:has(> .siite-empty){background:none;border:0;padding:0;font-weight:400;color:inherit}
.data-mode-panel{display:flex;flex-wrap:wrap;gap:10px 14px;align-items:center;width:100%;border-radius:var(--r-md);padding:12px 15px;margin:-8px 0 18px;border:1px solid #dce6f1;background:white;color:var(--ink);box-shadow:var(--shadow-soft)}
.data-mode-panel strong{color:var(--blue);margin-right:auto}
.data-mode-panel span{font-size: var(--text-sm);color:var(--muted);font-weight:700}
.data-mode-panel.good{border-color:#b3e4c7;background:#f4fbf7}
.data-mode-panel.warn{border-color:#f1d08d;background:var(--status-warning-surface)}
.data-mode-panel.bad{border-color:#efc6c6;background:var(--status-critical-surface)}
.data-mode-actions{display:flex;align-items:center;gap:10px;flex-wrap:wrap;width:100%;padding-top:10px;margin-top:2px;border-top:1px solid rgba(16,47,79,.12)}
.data-mode-actions div{display:flex;flex-direction:column;gap:3px;min-width:240px;flex:1}
.data-mode-actions strong{margin:0;color:var(--ink);font-size:var(--text-base)}
.data-mode-actions button{padding:9px 12px;border-radius:var(--r-md);font-size: var(--text-sm);white-space:nowrap}
.data-health-banner{display:grid;gap:var(--space-2);border:1px solid var(--line);border-radius:var(--r-md);background:white;padding:var(--space-4);margin-bottom:var(--space-4)}
.data-health-banner.good{border-color:#b3e4c7;background:#f4fbf7}
.data-health-banner.warn{border-color:#f1d08d;background:var(--status-warning-surface)}
.data-health-banner.bad{border-color:#efc6c6;background:var(--status-critical-surface)}
.data-health-banner strong{display:block;color:var(--blue);font-size:var(--text-base)}
.data-health-banner span{color:var(--muted);font-weight:700;font-size: var(--text-sm)}
.data-health-meta{display:flex;gap:var(--space-2) var(--space-4);flex-wrap:wrap}
.data-health-banner ul{margin:0;padding-left:var(--space-4);color:#684500;font-weight:700;line-height:var(--leading-snug)}
.menu-toggle{width:42px;height:42px;padding:0;display:grid;place-items:center;gap:0}
.menu-toggle span{display:block;width:18px;height:2px;background:var(--blue);border-radius:var(--r-pill)}
.dashboard-command{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:var(--space-4);align-items:center;background:linear-gradient(135deg,#102f4f,#17466f);color:white;border-radius:var(--r-md);padding:var(--space-4) var(--space-5);box-shadow:var(--shadow);margin-bottom:var(--space-4)}
.dashboard-command h3{font-size:var(--text-2xl);letter-spacing:-.02em;margin:2px 0 var(--space-2);color:white}
.dashboard-command p{max-width:760px;color:#dce8f3;font-weight:700;line-height:var(--leading-snug)}
.dashboard-command .eyebrow{color:#b7d2e8}
.dashboard-command-actions{display:flex;gap:var(--space-2);flex-wrap:wrap;justify-content:flex-end}
.dashboard-command-actions button{white-space:nowrap;min-height:var(--control-md);padding:var(--space-2) var(--space-4)}
.dashboard-command-actions .secondary{background:white;color:var(--blue)}
.dashboard-readiness{margin-bottom:18px}
.dashboard-priority-grid{display:grid;grid-template-columns:1.1fr .9fr;gap:var(--space-4);align-items:start;margin-bottom:var(--space-4)}
.dashboard-trust-and-pulse{display:grid;grid-template-columns:minmax(280px,.75fr) minmax(420px,1.25fr);gap:16px;align-items:start;margin-bottom:18px}
.dashboard-pulse-panel .cards{margin:0}
.dashboard-pulse-cards{grid-template-columns:repeat(3,minmax(150px,1fr))}
.dashboard-module-grid{display:grid;grid-template-columns:repeat(2,minmax(320px,1fr));gap:var(--space-4);margin-bottom:var(--space-4)}
.dashboard-module-card .cards{gap:var(--space-2);margin:0} /* columns: the auto-fit rule below (Audit LD23) */
.dashboard-module-card .card{min-height:108px;padding:var(--space-4)}
.dashboard-detail-grid{margin-bottom:var(--space-4)}
.dashboard-detail-grid:last-child{margin-bottom:0}
.topbar{background:linear-gradient(180deg,#102f4f,#0d2b49)!important;color:white;border-bottom:1px solid rgba(255,255,255,.16)!important;box-shadow:var(--shadow)}
.topbar .eyebrow,.topbar h2,.topbar-brand strong,.topbar-brand span{color:white}
.topbar-brand span{opacity:.78}
.topbar-logo{background:white;color:var(--blue)}
.topbar .actions{gap:var(--space-2)}
.topbar .badge{background:rgba(255,255,255,.12);border-color:rgba(255,255,255,.22);color:white;box-shadow:none;max-width:210px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.topbar button.secondary,.topbar .menu-toggle{background:white;color:var(--blue);border-color:rgba(255,255,255,.34);box-shadow:var(--shadow-soft)}
.topbar button.secondary{padding:var(--space-2) var(--space-3)}
.topbar .menu-toggle span{background:var(--blue)}
.topbar .user-button{background:white;color:var(--blue)}
@media(max-width:1100px){
  body{display:flex}
  .sidebar{position:fixed;left:0;top:142px;bottom:0;width:286px;height:auto;transform:translateX(0);transition:transform var(--motion-slow) var(--ease-out);z-index:20}
  .sidebar nav{display:flex;grid-template-columns:none}
  .sidebar .nav{padding:var(--space-3) var(--space-4);font-size:var(--text-base)}
  .side-footer{margin-top:auto}
  main{padding:var(--space-6)}
  .topbar{margin:calc(var(--space-6) * -1) calc(var(--space-6) * -1) var(--space-7);padding:var(--space-4) var(--space-6);top:0;z-index:40}
  .topbar{flex-direction:row;align-items:flex-start}
  .topbar-left{flex-direction:column;align-items:flex-start;gap:var(--space-2)}
  .topbar-brand{min-width:0}
  .actions{margin-left:auto;justify-content:flex-end;flex-wrap:wrap}
  /* Audit P3V-06 (third pass): the menu button is in the header row, last,
     at every width up to 1100px - as it already was on phones. Fixed at
     right:24px it sat over the user menu at 768 and 1100 (elementFromPoint on
     the user button returned the menu button). */
  .menu-toggle{order:99}
}
.upload-row{display:flex;gap:var(--space-2);align-items:center;flex-wrap:wrap;margin-top:var(--space-4)}
.upload-row input{min-width:260px}
@media(max-width:1100px){.auth-controls input,.upload-row input{width:100%;min-width:0}.user-dropdown{left:0;right:auto}}
.ledger-intro{margin-bottom:16px}
.ledger-toolbar{align-items:stretch}
.ledger-toolbar input{flex:1 1 280px}
.ledger-toolbar select{min-width:190px}
.ledger-cards .card:nth-child(4){border-color:#f1d08d;background:var(--status-warning-surface)}
.ledger-alert{display:grid;gap:8px}
.ledger-alert ul{margin:0;padding-left:18px}
.ledger-analysis{align-items:start}
.ledger-review-list{display:grid;gap:10px}
.ledger-review-item{display:flex;justify-content:space-between;gap:14px;align-items:flex-start;background:var(--status-critical-surface);border:1px solid #f0cece;border-radius:var(--r-md);padding:13px}
.ledger-review-item h4{font-size: var(--text-base);margin:8px 0 4px}
.ledger-review-item p{font-size: var(--text-sm);color:#40556b;line-height:var(--leading-snug)}
.ledger-review-item small{display:block;color:var(--muted);font-weight:700;margin-top:6px}
.ledger-review-item strong{white-space:nowrap;color:var(--bad)}
.review-item{display:grid;gap:var(--space-2);background:#fff; border:1px solid var(--line);border-radius:var(--r-md);padding:var(--space-3);box-shadow:var(--shadow-soft)}
.review-item strong{font-size: var(--text-base)}
/* V1-23 (Visual 456): a status chip in a review card is its own size, never stretched across the card. */
.review-item > .pill,.workforce-ai-item > .pill{justify-self:start;max-width:100%}
.review-item small{color:var(--muted);font-weight:700;line-height:var(--leading-snug)}
.source-status-panel{background:var(--panel);border:1px solid var(--line);border-radius:var(--r-md);padding:var(--space-4);margin-bottom:var(--space-4);box-shadow:var(--shadow)}
.source-status-panel .panel-title{border-bottom:1px solid var(--line);padding-bottom:var(--space-2);margin-bottom:var(--space-4)}
.source-status-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(210px,1fr));gap:var(--space-2)}
.source-status-card{border:1px solid var(--line);border-radius:var(--r-md);padding:var(--space-3);background:var(--bg);display:grid;gap:var(--space-2);min-height:128px}
.source-status-card.good{border-color:#bfe2cc;background:#f5fff8}
.source-status-card.warn{border-color:#f1d08d;background:var(--status-warning-surface)}
.source-status-card.bad{border-color:#efcfcf;background:var(--status-critical-surface)}
.source-status-card.neutral{border-color:#d8e2ec;background:var(--bg)}
.source-status-card strong{font-size: var(--text-sm);color:var(--ink);line-height:var(--leading-tight);overflow-wrap:anywhere}
.source-status-card small{color:var(--muted);font-size: var(--text-xs);line-height:var(--leading-tight)}
.source-card-head{display:flex;flex-direction:column;gap:6px;align-items:flex-start}
.source-card-head strong{overflow-wrap:break-word;word-break:normal}
.data-confidence-badge{display:inline-flex;align-items:center;border-radius:var(--r-pill);padding:var(--space-1) var(--space-3);font-size: var(--text-xs);font-weight:700;white-space:normal;line-height:var(--leading-snug);max-width:100%;background:var(--line);color:var(--muted)}
.data-confidence-badge.good{background:var(--status-ok-surface);color:var(--good)}
.data-confidence-badge.warn{background:var(--status-warning-surface);color:var(--warn-ink)}
.data-confidence-badge.bad{background:var(--status-critical-surface);color:var(--bad)}
.data-confidence-badge.neutral{background:var(--line);color:var(--muted)}
.data-trust-summary{display:grid;grid-template-columns:repeat(auto-fit,minmax(170px,1fr));gap:var(--space-2);margin-bottom:var(--space-4)}
.data-trust-warning{display:grid;gap:4px}
.report-source-list h4{margin:12px 0 8px}
.ledger-empty-state{display:grid;gap:10px;text-align:left}
.ledger-empty-state strong{color:var(--ink);font-size:var(--text-base)}
.ledger-empty-state span,.ledger-empty-state small{color:var(--muted);font-weight:700}
.table-empty{padding:var(--space-4);color:var(--muted);font-weight:700;background:var(--bg);border-radius:var(--r-md)}
.attachment-gallery{display:grid;grid-template-columns:repeat(auto-fill,minmax(210px,1fr));gap:12px}
.attachment-card{border:1px solid var(--line);border-radius:var(--r-md);background:#fff;overflow:hidden;display:grid;box-shadow:var(--shadow-soft)}
.attachment-preview{min-height:150px;background:var(--line);display:grid;place-items:center}
.attachment-preview img,.attachment-preview video{width:100%;height:190px;object-fit:cover;display:block;background:var(--line)}
.attachment-file-icon{display:grid;place-items:center;width:72px;height:72px;border-radius:var(--r-md);background:var(--blue);color:#fff;font-size:var(--text-lg);font-weight:700;letter-spacing:.08em}
.attachment-card-body{display:grid;gap:7px;padding:var(--space-3)}
.attachment-card-body strong{font-size:var(--text-base);color:var(--ink);line-height:var(--leading-tight);word-break:break-word}
.attachment-card-body small{color:var(--muted);font-weight:700}
@media(max-width:1100px){.source-status-grid,.prestart-grid,.prestart-checklist-grid{grid-template-columns:1fr}}
.exception-group{display:grid;gap:8px;border:1px solid var(--line);border-radius:var(--r-md);padding:var(--space-3);background:var(--panel)}
.exception-group-head{display:flex;justify-content:space-between;align-items:center;gap:10px}
.exception-group-head strong{font-size:var(--text-base);color:var(--ink)}
.exception-triage{display:flex;gap:8px;align-items:center;flex-wrap:wrap;margin-bottom:10px}
.exception-triage small{color:var(--muted);font-weight:700}
.inline-action{display:inline-flex;width:max-content;border:1px solid var(--line);border-radius:var(--r-pill);padding:5px 9px;background:white;color:var(--blue);font-size: var(--text-xs);font-weight:700}
.commercial-triage-item{gap:10px}
.commercial-triage-item.muted-item{opacity:.72;background:#f7f8fa}
.review-item-head{display:flex;gap:10px;align-items:center;flex-wrap:wrap}
.commercial-triage-controls{display:grid;grid-template-columns:repeat(auto-fit,minmax(140px,1fr));gap:10px;align-items:end;margin-top:4px}
.commercial-triage-controls label{display:grid;gap:5px;margin:0;min-width:0}
.commercial-triage-controls span{font-size: var(--text-xs);font-weight:600;text-transform:uppercase;letter-spacing:.1em;color:var(--muted)}
.commercial-triage-controls input,.commercial-triage-controls select{min-height:var(--control-md);min-width:0;width:100%}
.commercial-review-readiness{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:10px;margin:0 0 14px}
.commercial-review-readiness>.row-actions{grid-column:1/-1}
.report-delivery-history{margin-top:10px;border:1px solid var(--line);border-radius:var(--r-sm);background:#fff;overflow:hidden}
.report-delivery-history summary{display:flex;justify-content:space-between;gap:12px;padding:12px 14px;cursor:pointer}
.today-support-panel summary{list-style:none;display:flex;justify-content:space-between;align-items:center;gap:var(--space-4);cursor:pointer;min-height:var(--control-md)}
.today-support-panel summary::-webkit-details-marker{display:none}
.today-support-panel summary>span:first-child{display:flex;flex-direction:column;gap:2px}
.today-support-panel summary strong{font-size: var(--text-base);font-weight:600;letter-spacing:-.01em}
.today-support-panel summary small{color:var(--muted);font-size: var(--text-xs)}
.today-support-panel summary>span:last-child{font-weight:600;color:var(--blue-2);white-space:nowrap}
/* Calm 469 (R2B-18): "Site tools" has ONE span, so the figure rule above (nowrap, blue) caught its title and line, and at 390 the line ran off the right edge. A lone span is the title block. */
.today-support-panel summary>span:only-child{white-space:normal;min-width:0;flex:1 1 auto;color:inherit;font-weight:inherit}
.today-support-panel summary:after{content:"▾";color:var(--muted);margin-left:6px;transition:transform var(--motion) var(--ease-out)}
.today-support-panel[open] summary:after{transform:rotate(180deg)}
.report-delivery-history summary span{color:var(--muted);font-size: var(--text-xs)}
.report-delivery-history .table-wrap{border:0;border-top:1px solid var(--line);border-radius:0}
.report-delivery-ledger td small{display:block;color:var(--muted)}
.row-actions{display:flex;gap:8px;align-items:center;flex-wrap:wrap}
.prestart-panel{border-color:#ead39a;background:#fffdf7}
.prestart-grid{display:grid;grid-template-columns:repeat(3,minmax(190px,1fr));gap:10px}
.prestart-item{display:grid;gap:6px;border:1px solid var(--line);border-radius:var(--r-md);padding:var(--space-3);background:white}
.prestart-item.good{border-color:#bfe2cc;background:#f6fff9}
.prestart-item.warn{border-color:#f1d08d;background:var(--status-warning-surface)}
.prestart-item strong{font-size: var(--text-xs);text-transform:uppercase;letter-spacing:.1em;color:var(--muted)}
.prestart-item span{font-weight:700;color:var(--ink)}
.prestart-item small{color:var(--muted);line-height:var(--leading-snug)}
.prestart-item button{width:max-content;padding:7px 10px;font-size: var(--text-xs)}
.prestart-checklist-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:var(--space-4)}
.prestart-checklist-column{min-width:0;border:1px solid var(--line);border-radius:var(--r-md);background:var(--bg);padding:var(--space-4);display:grid;gap:var(--space-3)}
.prestart-checklist-head{display:flex;justify-content:space-between;gap:12px;align-items:flex-start}
.prestart-checklist-head h4{font-size:var(--text-base);color:var(--ink)}
.prestart-checklist-head span{color:var(--muted);font-size: var(--text-xs);font-weight:700}
.prestart-checklist-items{display:grid;gap:var(--space-2)}
.prestart-checklist-item{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:var(--space-2);align-items:start;min-width:0;border:1px solid #e3ebf4;border-radius:var(--r-md);background:white;padding:var(--space-3)}
.prestart-checklist-item.good{border-color:#bfe2cc;background:#f6fff9}
.prestart-checklist-item.warn{border-color:#f1d08d;background:var(--status-warning-surface)}
.prestart-checklist-item strong{display:block;font-size: var(--text-sm);color:var(--ink)}
.prestart-checklist-item small{display:block;margin:var(--space-1) 0 var(--space-2);color:var(--muted);line-height:var(--leading-snug)}
.prestart-checklist-item button{padding:var(--space-2) var(--space-2);font-size: var(--text-xs);white-space:nowrap}
.po-card{display:flex;justify-content:space-between;gap:14px;align-items:flex-start;border:1px solid var(--line);border-radius:var(--r-md);background:var(--panel);padding:14px}
.po-card h4{margin:7px 0 5px;color:var(--ink)}
.po-card p{color:var(--muted);line-height:var(--leading-snug);margin-bottom:7px}
.po-card small{display:block;color:var(--muted);font-weight:700}
/* 4 Sep (Jim: "buttons still look bad"): the action column wrapped differently on every card. One fixed column, equal buttons, never wrapping mid-word. */
.po-card>div:first-child{min-width:0;flex:1 1 auto}
.po-card .button-row.compact-buttons{flex:0 0 auto;display:grid;grid-template-columns:repeat(3,minmax(96px,auto));gap:8px;align-items:start;align-self:flex-start}
.po-card .button-row.compact-buttons button{white-space:nowrap;width:100%;margin:0}
@media(max-width:1100px){.po-card .button-row.compact-buttons{grid-template-columns:repeat(3,1fr);width:100%}}
.daily-programme-progress{display:grid;gap:10px;padding:14px;border:1px solid var(--line);border-radius:var(--r-md);background:var(--panel);margin:12px 0}
.daily-programme-progress h5{margin:0}
.daily-progress-row{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:10px;align-items:center;padding:8px 0;border-top:1px solid var(--line)}
.daily-progress-name{display:grid;gap:2px;min-width:0}
.daily-progress-controls{display:flex;gap:6px;align-items:center;flex-wrap:wrap;justify-content:flex-end}
.daily-progress-controls input{width:74px;min-height:var(--control-md)}
/* Written at the house specificity: `body:not(.login-mode) button.secondary`
   outranked the plain rule, so a chosen figure never showed as chosen. */
body:not(.login-mode) .daily-progress-controls button.active,body:not(.login-mode) .daily-progress-chips button.active{background:var(--blue);color:#fff;border-color:var(--blue)}
.daily-progress-detail{grid-column:1/-1;display:grid;gap:10px;padding:10px 12px;border-radius:var(--r-sm);background:var(--sand-tint)}
.daily-progress-detail[hidden]{display:none}
tr.price-book-focus>td{background:var(--sand-tint)}
.daily-progress-ask{display:grid;gap:6px}
.daily-progress-ask>span{font-size: var(--text-xs);font-weight:600;letter-spacing:.1em;text-transform:uppercase;color:var(--muted)}
.daily-progress-chips{display:flex;flex-wrap:wrap;gap:6px}
.daily-progress-chips button{min-height:var(--control-md)}
.daily-progress-quantity{display:flex;flex-wrap:wrap;gap:6px;align-items:center}
.daily-progress-quantity input{width:110px;min-height:var(--control-md)}
.daily-progress-quantity select{min-height:var(--control-md)}
@media(max-width:760px){.daily-progress-row{grid-template-columns:1fr}.daily-progress-controls{justify-content:flex-start}}
.files-workspace{display:grid;grid-template-columns:220px minmax(0,1fr);gap:14px;margin-bottom:14px}
.files-rail{display:grid;gap:6px;align-content:start;border:1px solid var(--line);border-radius:var(--r-md);background:var(--panel);padding:10px}
.files-rail-item{display:grid;gap:2px;text-align:left;border:1px solid transparent;border-radius:var(--r-sm);padding:8px 10px;background:transparent;color:inherit;cursor:pointer}
.files-rail-item small{color:var(--muted)}
.files-rail-item.active{border-color:var(--blue);background:var(--accent-soft, #eaf1f8)}
.files-pane{min-width:0;display:grid;gap:10px}
.files-toolbar{display:flex;justify-content:space-between;align-items:flex-end;gap:10px;flex-wrap:wrap}
.files-toolbar h3{margin:0}
.files-toolbar button.active{background:var(--blue);color:#fff}
.files-row{display:flex;justify-content:space-between;align-items:center;gap:10px;padding:8px 10px;border:1px solid var(--line);border-radius:var(--r-sm);background:var(--panel);margin-bottom:6px}
.files-row-main{display:grid;gap:2px;min-width:0}
.files-row-main small{color:var(--muted)}
@media(max-width:760px){.files-workspace{grid-template-columns:1fr}.files-rail{display:flex;overflow-x:auto;gap:8px}.files-rail-item{min-width:150px}}
.workforce-contact{display:block}
.workforce-contact a{margin-right:6px}
.compact-records article{border:1px solid var(--line);border-radius:var(--r-md);background:var(--bg);padding:var(--space-3)}
.dar-card{display:flex;justify-content:space-between;gap:14px;align-items:flex-start;border:1px solid var(--line);border-radius:var(--r-md);background:var(--panel);padding:14px}
.dar-card.red{border-color:#e4a4a4;background:var(--status-critical-surface)}
.dar-card.amber{border-color:#f1d08d;background:var(--status-warning-surface)}
.dar-card.green{border-color:#bfe2cc;background:#f6fff9}
.dar-card h4{margin:7px 0 5px;color:var(--ink)}
.dar-card p{color:#31475d;line-height:var(--leading-snug);margin-bottom:7px}
.dar-card small{display:block;color:var(--muted);font-weight:700}
.dar-filters select{min-width:180px}
@media(max-width:760px){.po-card{display:grid}.po-card .button-row{justify-content:flex-start}}
.map-panel{overflow:hidden}
.map-panel .panel-title{align-items:flex-start}
.map-frame{width:100%;height:340px;border:1px solid var(--line);border-radius:var(--r-md);overflow:hidden;background:var(--line)}
.map-frame iframe{width:100%;height:100%;border:0;display:block}
.inline-choice-button{padding:7px 10px;font-size: var(--text-xs);box-shadow:none}
/* Offline 483 (R2D-05): sized to the VISIBLE viewport (--siite-vvh and --siite-vv-top, kept by siiteTrackVisualViewport in app.js), so an iPhone keyboard shrinks the sheet instead of covering its confirm row and photo buttons. Without the variables it is exactly 100dvh, as before. */
.choice-overlay{position:fixed;inset:0;top:var(--siite-vv-top,0px);bottom:auto;height:var(--siite-vvh,100dvh);background:rgba(9,31,52,.45);z-index:var(--z-dialog);display:flex;align-items:flex-start;justify-content:center;padding:22px;overflow-y:auto;overscroll-behavior:contain;-webkit-overflow-scrolling:touch}
.choice-sheet{width:min(520px,100%);max-height:calc(var(--siite-vvh,100dvh) - 44px);margin:auto;background:white;border:1px solid var(--line);border-radius:var(--r-md);padding:18px;box-shadow:var(--shadow);overflow-y:auto;overscroll-behavior:contain;-webkit-overflow-scrolling:touch;scrollbar-gutter:stable}
.dialog-form{display:grid;gap:12px;margin-top:14px}
.dialog-field{display:grid;gap:var(--space-2)}
.dialog-field span{font-size: var(--text-sm);font-weight:700;color:#354c63}
.dialog-field input,.dialog-field textarea,.dialog-field select{width:100%;margin:0}
/* Audit LM-22: a dialog whose job is a primary site action (Send report) gets the 52px site target. */
body:not(.login-mode) button.site-primary-action{min-height:52px;padding-inline:22px}
/* Audit LM-13: read-only text in a dialog (the RAMS to sign) reads as a document in the sheet's own scroll. */
.dialog-display-text{white-space:pre-wrap;overflow-wrap:anywhere;padding:var(--space-3);border:1px solid var(--line);border-radius:var(--r-sm);background:var(--bg);color:var(--ink);font-size:var(--text-base);line-height:var(--leading-normal)}
/* Audit LM-12: a declaration tick-box ("I have read the RAMS") sits beside its
   words on one line, a 24px box tied to the sentence it confirms, instead of
   a full-width control centred above the text. */
.dialog-field:has(> input[type=checkbox]){grid-template-columns:auto 1fr;align-items:start;column-gap:12px;min-height:var(--control-md);cursor:pointer}
.dialog-field > input[type=checkbox]{width:24px;height:24px;min-height:0;margin:2px 0 0;accent-color:var(--blue)}
/* Audit P3V-28 (third pass): a multi-choice is a list of tick boxes - 24px
   boxes, each row a 44px label - never a Cmd-click <select multiple>. */
.dialog-check-list{border:0;padding:0;margin:0;min-width:0}
.dialog-check-list > legend{padding:0;margin-bottom:6px;font-weight:600}
.dialog-check-options{display:grid;gap:2px;max-height:min(50vh,360px);overflow-y:auto;border:1px solid var(--line);border-radius:var(--r-sm);padding:4px 8px;background:#fff}
.dialog-check-option{display:flex;align-items:center;gap:10px;min-height:var(--control-md);cursor:pointer}
.dialog-check-option > input[type=checkbox]{width:24px;height:24px;min-height:0;margin:0;flex:none;accent-color:var(--blue)}
/* V1-22 (Visual 456): a tick-box option inside a .field reads as a sentence, not a caps label. */
.field .dialog-check-option > span{color:var(--ink);font-size:var(--text-sm);font-weight:500;text-transform:none;letter-spacing:0}
.dialog-field:has(> input[type=checkbox]) > .field-error{grid-column:1 / -1}
.dialog-field textarea{min-height:96px}
.field-error{color:var(--bad);font-size: var(--text-xs);font-weight:700}
.dialog-actions{position:sticky;bottom:-18px;z-index:2;display:flex;justify-content:flex-end;gap:10px;flex-wrap:wrap;margin:16px -18px -18px;padding:14px 18px max(18px,env(safe-area-inset-bottom));background:linear-gradient(180deg,rgba(255,255,255,.82),#fff 22%);border-top:1px solid var(--line)}
.siite-doc-editor-overlay{position:fixed;inset:0;height:100dvh;background:rgba(9,31,52,.45);z-index:calc(var(--z-dialog) - 1);display:flex;align-items:flex-start;justify-content:center;padding:var(--space-4);overflow-y:auto;overscroll-behavior:contain;-webkit-overflow-scrolling:touch}
.siite-doc-editor{width:min(900px,100%);max-height:calc(100dvh - 32px);margin:auto;background:white;border:1px solid var(--line);border-radius:var(--r-md);padding:var(--space-4);box-shadow:var(--shadow);display:flex;flex-direction:column;gap:var(--space-2)}
.siite-doc-editor-head{display:flex;align-items:baseline;justify-content:space-between;gap:var(--space-2)}
.siite-doc-editor-head h3{margin:0}
.siite-doc-editor-body{overflow:auto;flex:1;min-height:160px;min-width:0}
.siite-doc-editor .siite-doc-editor-actions{display:flex;justify-content:flex-end;flex-wrap:wrap}
.siite-doc-editor-actions button,.siite-native-format button{min-height:var(--control-md)}
.siite-native-format{display:flex;flex-wrap:wrap;gap:var(--space-2)}
.siite-native-rich{min-height:40dvh;padding:var(--space-4);line-height:var(--leading-normal);outline:none;overflow-wrap:anywhere;border:1px solid var(--line);border-radius:var(--r-sm)}
.siite-native-rich table{border-collapse:collapse;width:100%;table-layout:fixed}
.siite-native-rich td,.siite-native-rich th{border:1px solid var(--line);padding:var(--space-2);overflow-wrap:anywhere}
@media(max-width:760px){.siite-doc-editor-overlay{padding:var(--space-2)}.siite-doc-editor{padding:var(--space-3);max-height:calc(100dvh - 16px)}.siite-doc-editor-head{align-items:flex-start;flex-direction:column;gap:var(--space-1)}.siite-native-format{flex-wrap:nowrap;overflow:auto;flex-shrink:0}.siite-native-format button{width:auto;flex:none}.siite-doc-editor .siite-doc-editor-actions{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:var(--space-2)}.siite-doc-editor-actions button{width:auto;flex:1 1 calc(50% - 6px)}}
.siite-sheet-tools{display:flex;flex-wrap:wrap;align-items:end;gap:var(--space-2)}
.siite-sheet-tools label{flex:1;min-width:120px;margin:0}
.siite-sheet-tools>button{width:auto;flex:none;min-height:var(--control-md)}
.siite-sheet-tools select{width:100%;min-height:var(--control-md);margin:0}
.siite-sheet-paging{display:grid;grid-template-columns:auto 1fr auto;gap:var(--space-2);align-items:center}
.siite-sheet-paging button{min-height:var(--control-md);padding:var(--space-2);font-size:var(--text-xs)}
.siite-sheet-paging small{text-align:center}
.siite-sheet-help summary{cursor:pointer;min-height:var(--control-md);display:flex;align-items:center;color:var(--muted)}
.siite-sheet-result{display:block;padding:0 var(--space-2);color:var(--muted);font-size:var(--text-xs);overflow-wrap:anywhere}
.siite-sheet-table{border-collapse:collapse;min-width:100%}
.siite-sheet-table th{background:#f0f4f8;border:1px solid var(--line);padding:0;font-size: var(--text-xs);color:#354c63;min-width:34px;text-align:center}
.siite-sheet-table td{border:1px solid var(--line);padding:0}
.siite-sheet-table input{width:100%;min-width:110px;border:0;border-radius:0;margin:0;padding:var(--space-2) var(--space-2);font-size: var(--text-sm);background:transparent}
.siite-sheet-table thead input{font-weight:700;background:#f0f4f8;text-align:center;min-width:110px}
.siite-sheet-table input:focus{outline:2px solid var(--blue);outline-offset:-2px}
.siite-doc-textarea{width:100%;min-height:min(52dvh,420px);resize:vertical;font-size: var(--text-base);line-height:var(--leading-normal)}
.siite-doc-toolbar{display:flex;gap:var(--space-2);align-items:center;margin:var(--space-2) 0}
.siite-doc-toolbar input{flex:1;min-width:0;margin:0}
.siite-doc-row{align-items:center}
.siite-doc-row input[type=checkbox]{width:18px;height:18px;margin:0;flex:none}
.siite-doc-search-hit>small{display:block;margin:var(--space-2) 0 0;color:var(--muted)}
.siite-doc-bulk-bar{position:sticky;bottom:8px;z-index:3;display:flex;align-items:center;justify-content:space-between;gap:var(--space-2);margin-top:var(--space-2);padding:var(--space-2) var(--space-4);border:1px solid var(--line);border-radius:var(--r-sm);background:#fff;box-shadow:var(--shadow)}
.siite-doc-drop-armed{outline:2px dashed var(--blue);outline-offset:-2px;background:#eef5fc}
.siite-doc-preview{width:min(1000px,100%)}
.siite-doc-preview-img{max-width:100%;height:auto;display:block;margin:auto}
.siite-doc-preview-frame{width:100%;height:min(72dvh,760px);border:0;display:block}
.cvr-block-title{margin:14px 0 6px;color:#1d4f7c;font-size: var(--text-sm)}
.cvr-gap-inline{color:var(--warn-ink);font-weight:700}
.cvr-gap-list li{color:#5b4a2f}
.live-cvr-panel .clean-list li{line-height:var(--leading-normal)}
.qr-print-dialog{width:min(620px,100%);padding:18px}
.qr-print-sheet{border:3px solid var(--blue);border-radius:var(--r-md);background:#fff;padding:28px;display:grid;justify-items:center;gap:12px;text-align:center;color:var(--ink)}
.qr-print-brand{display:flex;align-items:center;gap:10px;justify-self:start;text-align:left}
.qr-print-brand>span{display:grid;place-items:center;width:48px;height:48px;border-radius:var(--r-md);background:var(--blue);color:#fff;font-size:var(--text-2xl);font-weight:700}
.qr-print-brand div{display:grid;gap:1px}.qr-print-brand strong{font-size: var(--text-xl)}.qr-print-brand small{color:var(--muted);font-weight:700}
.qr-print-kicker{margin:8px 0 0;color:var(--blue-2);font-size: var(--text-xs);font-weight:700;letter-spacing:.14em}
.qr-print-sheet h2{margin:0;font-size: var(--text-3xl);line-height:var(--leading-none);letter-spacing:0}
.qr-print-code{margin:0;color:var(--muted);font-size: var(--text-lg);font-weight:700}
.qr-print-code-image{display:grid;place-items:center;padding:var(--space-3);background:#fff;border:1px solid var(--line);border-radius:var(--r-md)}
.qr-print-code-image svg{display:block;width:min(280px,62vw);height:min(280px,62vw)}
.qr-print-instructions{display:grid;gap:5px;max-width:430px}.qr-print-instructions strong{font-size: var(--text-xl)}.qr-print-instructions span{color:var(--muted);font-weight:600;line-height:var(--leading-snug)}
.qr-print-location{margin:2px 0 0;font-weight:700;line-height:var(--leading-snug)}
.qr-print-audit{width:100%;border-top:1px solid var(--line);padding-top:10px;color:var(--muted);font-size:var(--text-xs);word-break:break-all;text-align:left}
.qr-print-audit summary{cursor:pointer;font-size:var(--text-xs);font-weight:700;text-align:center}.qr-print-audit code,.qr-print-audit small{display:block;margin-top:5px}
.qr-print-actions{position:sticky;bottom:-18px;display:flex;justify-content:flex-end;gap:10px;flex-wrap:wrap;margin:16px -18px -18px;padding:14px 18px max(18px,env(safe-area-inset-bottom));background:#fff;border-top:1px solid var(--line)}
@media(max-width:760px){.qr-print-dialog{padding:var(--space-3)}.qr-print-sheet{padding:20px 14px}.qr-print-sheet h2{font-size:var(--text-2xl)}.qr-print-actions button{flex:1 1 100%}}
@media print{
  body.printing-site-qr{background:#fff!important}
  body.printing-site-qr>*:not(.qr-print-overlay){display:none!important}
  body.printing-site-qr .qr-print-overlay{position:static!important;display:block!important;height:auto!important;min-height:0!important;padding:0!important;background:#fff!important;overflow:visible!important}
  body.printing-site-qr .qr-print-dialog{width:100%!important;max-width:none!important;max-height:none!important;margin:0!important;padding:0!important;border:0!important;border-radius:0!important;box-shadow:none!important;overflow:visible!important}
  body.printing-site-qr .qr-print-sheet{width:176mm;min-height:248mm;margin:0 auto;padding:16mm 14mm;border:3px solid #163a5f;border-radius:0;align-content:start;gap:6mm;box-sizing:border-box;break-inside:avoid;-webkit-print-color-adjust:exact;print-color-adjust:exact}
  body.printing-site-qr .qr-print-code-image svg{width:92mm;height:92mm}
  body.printing-site-qr .qr-print-audit{margin-top:auto}
  body.printing-site-qr .qr-print-actions{display:none!important}
}
.map-choice-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px}
.map-choice-grid button{min-height:52px}
.map-choice-grid button:nth-last-child(1):nth-child(odd){grid-column:1/-1}
.map-choice-inline{position:relative;display:inline-block;max-width:100%;vertical-align:top}
.map-choice-inline summary{list-style:none;display:inline-flex;align-items:center;justify-content:center;gap:6px;border-radius:var(--r-md);padding:10px 14px;font-weight:700;cursor:pointer}
.map-choice-inline summary::-webkit-details-marker{display:none}
.map-choice-inline summary.secondary{background:white;color:var(--blue);border:1px solid var(--line);box-shadow:none}
.map-choice-menu{position:absolute;right:0;top:calc(100% + 8px);z-index:60;min-width:210px;max-height:min(420px,calc(100dvh - 96px));background:white;border:1px solid var(--line);border-radius:var(--r-md);padding:var(--space-2);box-shadow:var(--shadow);display:grid;gap:5px;overflow-y:auto;overscroll-behavior:contain;scrollbar-gutter:stable}
/* Audit F4V-09: flipped by placeMapChoiceMenu when opening leftwards would
   cross the page's left edge (Projects cards, 761-1440px). */
.map-choice-inline.map-choice-opens-right > .map-choice-menu{left:0;right:auto;max-width:calc(100vw - 16px)}
.map-choice-menu a{display:block;color:var(--ink);text-decoration:none;font-weight:700;border-radius:var(--r-md);padding:10px 11px;background:var(--bg);border:1px solid transparent}
.map-choice-menu a:hover{border-color:var(--line);background:#eef6ff;color:var(--blue)}
@media(max-width:760px){.map-frame{height:280px}.map-panel .panel-title{display:grid}.map-panel .button-row{width:100%}.map-panel .button-row button{flex:1}}
/* Audit LM-20: on a phone the menu opened off the right edge and the hero's
   RAG pills painted over it. It is now a sheet fixed to the bottom of the
   screen, above the tab bar and everything else. */
@media(max-width:760px){.map-choice-menu{position:fixed;left:8px;right:8px;top:auto;bottom:calc(var(--tab-bar-h) + 8px);width:auto;min-width:0;max-height:min(70dvh,460px);z-index:1200;box-shadow:var(--elev-3, var(--elev-2))}.map-choice-menu a{min-height:var(--control-md);display:flex;align-items:center}}
@media(max-width:760px){.map-choice-grid{grid-template-columns:1fr}.choice-overlay{padding:10px 10px 0}.choice-sheet{align-self:auto;margin:auto 0 0;max-height:calc(var(--siite-vvh,100dvh) - 10px);border-radius:var(--r-lg) var(--r-lg) 0 0;padding-bottom:max(18px,env(safe-area-inset-bottom))}.toast-host{left:12px;right:12px;bottom:12px;width:auto}.toast{border-radius:var(--r-md)}}
.dev-panel summary{cursor:pointer;list-style:none}
.dev-panel summary::-webkit-details-marker{display:none}
.ledger-breakdown{display:grid;gap:16px}
.ledger-mini-table h4{font-size:var(--text-base);margin:0 0 8px;color:var(--blue);text-transform:uppercase;letter-spacing:.1em}
.compact-table{min-width:0;font-size: var(--text-xs)}
.compact-table th,.compact-table td{padding:var(--space-2)}
.ledger-table-panel td strong{display:block;font-size: var(--text-sm)}
.ledger-table-panel td small{display:block;color:var(--muted);font-size: var(--text-xs);font-weight:700;margin-top:var(--space-1)}
.sidebar{overflow-y:auto;overscroll-behavior:contain;-webkit-overflow-scrolling:touch;scrollbar-gutter:stable}
.form-grid textarea{grid-column:1/-1;margin-top:0}
.app-content{width:100%}
.field{display:flex;flex-direction:column;gap:var(--space-2)}
.field span{color:var(--muted);font-size:var(--text-xs);font-weight:600;text-transform:uppercase;letter-spacing:.12em}
.field input,.field textarea,.field select{width:100%;border-radius:var(--r-md)}
.field.wide{grid-column:1/-1}
.form-sections{display:grid;grid-template-columns:repeat(2,minmax(260px,1fr));gap:14px;margin:18px 0}
.check-panel{border:1px solid var(--line);border-radius:var(--r-md);background:var(--bg);padding:14px;display:grid;gap:9px}
.check-panel legend{padding:0 6px;color:var(--blue);font-weight:700}
.check-panel label{display:flex;align-items:center;gap:10px;background:white;border:1px solid #e3ebf4;border-radius:var(--r-md);padding:10px 11px;font-weight:700;cursor:pointer}
.check-panel label:hover{border-color:var(--line);background:var(--panel)}
.check-panel label:has(input:checked){border-color:var(--line);background:#eef6ff;color:var(--blue)}
.check-panel input[type="checkbox"]{-webkit-appearance:none;appearance:none;width:24px;height:24px;min-height:0;border:2px solid #6f8197;border-radius:var(--r-sm);padding:0;display:grid;place-items:center;flex:0 0 auto}
.check-panel input[type="checkbox"]:checked{background:var(--blue);border-color:var(--blue)}
.check-panel input[type="checkbox"]:checked:after{content:"";width:9px;height:5px;border-left:2px solid white;border-bottom:2px solid white;transform:rotate(-45deg);margin-top:-2px}
.file-field{background:var(--bg);border:1px dashed #b8cadd;border-radius:var(--r-md);padding:13px}
.file-field input{background:white}
@media(max-width:1100px){.form-sections{grid-template-columns:1fr}}
.director-summary,.exception-list{display:grid;gap:var(--space-2)}
.portfolio-row,.exception-row{width:100%;display:grid;grid-template-columns:auto minmax(210px,1.2fr) minmax(120px,.55fr) auto minmax(120px,.45fr);gap:var(--space-3);align-items:center;background:#fff;color:var(--ink);border:1px solid #e3ebf4;border-radius:var(--r-md);box-shadow:var(--shadow-soft);text-align:left;padding:var(--space-3) var(--space-4);transition:background var(--motion) var(--ease-out),border-color var(--motion) var(--ease-out),box-shadow var(--motion) var(--ease-out),transform var(--motion) var(--ease-out)}
.portfolio-row small,.exception-row small{color:var(--muted);font-weight:700;line-height:var(--leading-tight)}
.portfolio-row:hover,.exception-row:hover{background:var(--panel);border-color:var(--line);box-shadow:var(--shadow-soft)}
.portfolio-project-title{display:grid;gap:2px;min-width:0}
.portfolio-project-title strong{font-size: var(--text-base);line-height:var(--leading-tight);overflow-wrap:anywhere}
.portfolio-project-title small{font-size: var(--text-xs);text-transform:uppercase;letter-spacing:.1em}
.portfolio-stage{justify-self:start;background:#f3f7fb;border:1px solid var(--line);border-radius:var(--r-pill);padding:var(--space-2) var(--space-2);text-transform:uppercase;font-size: var(--text-xs);letter-spacing:.1em;color:var(--muted)!important;white-space:nowrap}
.portfolio-net{justify-self:end;display:grid;gap:2px;text-align:right;white-space:nowrap}
.portfolio-net b{font-size:var(--text-base);color:#122840;font-variant-numeric:tabular-nums}
.portfolio-net small{font-size: var(--text-xs);text-transform:uppercase;letter-spacing:.1em}
.exception-row{grid-template-columns:90px minmax(180px,.9fr) minmax(220px,1.4fr)}
.exception-row span{font-size: var(--text-xs);font-weight:600;text-transform:uppercase;letter-spacing:.1em;color:var(--blue)}
.project-dot{width:14px;height:14px;border-radius:50%;display:inline-block;background:#9aa8b6;box-shadow:var(--shadow-card)}
.project-dot.green{background:var(--good);box-shadow:var(--shadow-card)}
.project-dot.amber,.project-dot.warn{background:var(--warn);box-shadow:var(--shadow-card)}
.project-dot.red{background:var(--bad);box-shadow:var(--shadow-card)}
.project-dot.grey{background:#9aa8b6}
.rag-strip,.project-hero-rag{display:flex;gap:8px;flex-wrap:wrap}
.rag{display:inline-flex;align-items:center;gap:var(--space-2);border-radius:var(--r-pill);padding:var(--space-2) var(--space-2);background:var(--line);color:var(--muted);font-size: var(--text-xs);font-weight:600;text-transform:uppercase;letter-spacing:.1em}
.rag b{color:inherit;opacity:.75}
/* On dark heroes the pale tints wash out - use glass pills with a colour dot */
.project-hero-rag .rag{background:rgba(255,255,255,.12);color:#fff;border:1px solid rgba(255,255,255,.16);letter-spacing:.06em;font-size:var(--text-xs);padding:6px 12px}
.project-hero-rag .rag b{color:rgba(255,255,255,.72);font-weight:600}
.project-hero-rag .rag:before{content:"";width:8px;height:8px;border-radius:var(--r-pill);background:#9aa7b4;flex:0 0 auto}
.project-hero-rag .rag.amber:before{border-radius:1px;transform:rotate(45deg)}
.project-hero-rag .rag.red:before{border-radius:1px}
.rag-strip .rag:before{content:"";width:7px;height:7px;border-radius:var(--r-pill);background:currentColor;opacity:.8;flex:0 0 auto}
.rag-strip .rag.amber:before{border-radius:1px;transform:rotate(45deg)}
.rag-strip .rag.red:before{border-radius:1px}
.project-hero-rag .rag.green:before{background:#4ade80}
.project-hero-rag .rag.amber:before{background:#fbbf24}
.project-hero-rag .rag.red:before{background:#f87171}
.rag.green{background:var(--status-ok-surface);color:var(--good)}
.rag.amber{background:var(--status-warning-surface);color:#7a4d00}/* 2 Sep UX: 6.5:1, matching .pill.warn - the parallel component the last fix missed */
.rag.red{background:var(--status-critical-surface);color:var(--bad)}
.rag.grey{background:var(--line);color:#536274}
.project-list-intro{display:flex;align-items:flex-end;justify-content:space-between;gap:18px;background:white;border:1px solid var(--line);border-radius:var(--r-md);padding:18px;margin-bottom:16px;box-shadow:var(--shadow)}
.project-list-intro h3{font-size:var(--text-2xl);letter-spacing:-.03em}
.project-list-intro span{color:var(--muted);font-weight:700;max-width:520px;text-align:right}
.project-card-head{display:flex;justify-content:space-between;gap:14px;align-items:flex-start;margin-bottom:12px}
.project-areas{display:grid;gap:var(--space-6)}
/* Audit LD24: auto-FILL, so one project in a stage is a one-third card, not a full-width slab. */
.project-area .project-grid{grid-template-columns:repeat(auto-fill,minmax(300px,1fr));align-items:stretch}
.project-operating-card{display:flex;flex-direction:column;gap:13px;min-width:0;height:100%}
.project-operating-card .numbers{grid-template-columns:repeat(2,minmax(0,1fr));gap:9px}
.project-operating-card .numberbox{min-width:0;padding:11px;border-radius:var(--r-md)}
.project-operating-card .numberbox span{font-size: var(--text-xs);line-height:var(--leading-tight)}
.project-operating-card .numberbox strong{font-size:var(--text-base);overflow-wrap:anywhere}
.project-card-footer{display:flex;justify-content:space-between;align-items:flex-start;gap:12px;border-top:1px solid var(--line);padding-top:13px;color:var(--muted);font-size: var(--text-sm);font-weight:700;flex-wrap:wrap}
.project-card-footer>span{min-width:0;overflow-wrap:anywhere}
.project-card-footer button{padding:9px 12px}
.project-card-footer .button-row{margin:0}
.compact-buttons{gap:var(--space-2)}
.compact-buttons button{white-space:nowrap}
.checkbox-pill-row{
  display:flex;
  flex-wrap:wrap;
  gap:8px;
  align-items:center;
}
.checkbox-pill{
  display:inline-flex;
  align-items:center;
  gap:7px;
  min-height:var(--control-md);
  padding:var(--space-2) var(--space-3);
  border:1px solid var(--line);
  border-radius:var(--r-md);
  background:#fff;
  color:var(--ink);
  font-weight:700;
  box-shadow:var(--shadow-soft);
}
.checkbox-pill input{
  width:18px;
  height:18px;
  accent-color:var(--navy);
}
.programme-calendar-panel{
  border-left:4px solid var(--blueprint);
}
.project-setup-panel{margin-bottom:18px}
.project-setup-form{margin-top:0}
.project-area{margin-bottom:22px}
.project-area-head{display:flex;justify-content:space-between;gap:16px;align-items:flex-start;margin-bottom:12px;border-bottom:1px solid var(--line);padding-bottom:12px}
.project-area-head h3{font-size:var(--text-xl);letter-spacing:-.02em}
.project-area-head p{color:var(--muted);font-size:var(--text-base);margin-top:4px;max-width:720px}
.project-detail-grid{margin-bottom:18px}
.commercial-review-grid{grid-template-columns:repeat(auto-fit,minmax(140px,1fr))}
.commercial-review-sections{align-items:start}
.register-block{background:var(--bg);border:1px solid #e3ebf4;border-radius:var(--r-md);padding:var(--space-4)}
.project-hero{display:flex;justify-content:space-between;gap:18px;align-items:flex-end;background:linear-gradient(135deg,#102f4f,#183d62);color:white;border-radius:var(--r-lg);padding:var(--space-6);margin-bottom:18px;box-shadow:var(--shadow)}
.project-hero .eyebrow,.project-hero p{color:rgba(255,255,255,.78)}
.project-hero h3{font-size:var(--text-3xl);letter-spacing:-.04em;margin:4px 0 7px}
.project-hero .rag{background:rgba(255,255,255,.13);color:white;border:1px solid rgba(255,255,255,.2)}
.back-link{margin-bottom:18px}
.project-tab-panel p{font-size: var(--text-base);line-height:var(--leading-normal)}
.module-grid{display:grid;grid-template-columns:repeat(2,minmax(180px,1fr));gap:10px}
.module-grid .module-tile{border:1px solid #e3ebf4;background:var(--bg);border-radius:var(--r-md);padding:var(--space-3);box-shadow:none;text-align:left;color:var(--ink);display:block;min-height:74px}
.module-grid .module-tile:hover{border-color:var(--line);background:#eef6ff;filter:none}
.module-grid strong{display:block;color:var(--ink)}
.module-grid span{display:block;color:var(--blue);font-size: var(--text-xs);font-weight:600;text-transform:uppercase;letter-spacing:.1em;margin-top:5px}
@media(max-width:1100px){
  .portfolio-row,.exception-row{grid-template-columns:auto 1fr}
  .portfolio-row .portfolio-project-title,.portfolio-row .portfolio-stage,.portfolio-row .rag,.portfolio-row .portfolio-net,.exception-row small{grid-column:2}
  .portfolio-stage{justify-self:start}
  .portfolio-net{justify-self:start;text-align:left}
  .project-list-intro,.project-hero{align-items:flex-start;flex-direction:column}
  .project-list-intro span{text-align:left}
  .module-grid{grid-template-columns:1fr}
  .commercial-triage-controls{grid-template-columns:1fr}
  .commercial-review-readiness{grid-template-columns:1fr 1fr}
}
@media(max-width:760px){
  main{padding:var(--space-4)}
  .topbar{margin:calc(var(--space-4) * -1) calc(var(--space-4) * -1) var(--space-5);padding:var(--space-4)}
  .topbar-left{gap:var(--space-2)}
  .topbar h2{font-size:var(--text-2xl);line-height:var(--leading-none)}
  .actions,.toolbar,.button-row{max-width:100%;flex-wrap:wrap}
  .toolbar{display:grid;grid-template-columns:1fr}
  .toolbar input,.toolbar select,.toolbar button{width:100%;min-width:0}
  .sync-warning{margin:-4px 0 16px;overflow-wrap:anywhere}
  .project-list-intro{padding:15px}
  .project-list-intro h3{font-size:var(--text-xl)}
  .project-areas{gap:var(--space-4)}
  .project-area{margin-bottom:0}
  .project-area-head{flex-direction:column;gap:10px}
  .project-area .project-grid{grid-template-columns:1fr}
  .project-card{padding:15px}
  .project-card-head{gap:10px}
  .project-card h3{font-size:var(--text-lg);line-height:var(--leading-tight)}
  .project-operating-card .numbers{grid-template-columns:repeat(2,minmax(0,1fr))}
  .project-card-footer{display:grid;grid-template-columns:1fr}
  .compact-buttons{display:grid;grid-template-columns:1fr 1fr;width:100%}
  .compact-buttons button{width:100%;padding:var(--space-2) var(--space-2)}
}
.forms-shell{display:grid;gap:16px}
.breadcrumb{display:flex;flex-direction:row;align-items:center;gap:6px;flex-wrap:wrap;margin:0 0 12px;color:var(--muted);font-size: var(--text-sm);font-weight:500;justify-content:flex-start}
/* Audit LD35: text links with a 44px press height, no border or fill. */
.breadcrumb a{display:inline-flex;align-items:center;min-height:var(--control-sm);color:var(--blue-2);text-decoration:none;font-weight:600}
.breadcrumb a:hover{text-decoration:underline;text-underline-offset:3px}
.breadcrumb strong{color:var(--ink);font-weight:600}
/* Audit LM-06: the new-form header was white text on a background a later
   rule had turned white (contrast 1.0 - title, description and chosen form
   all invisible). It is one light card now, ink on white, defined here. */
.form-workspace-head{display:flex;justify-content:space-between;gap:18px;align-items:stretch;background:var(--panel);color:var(--ink);border:1px solid var(--line);border-radius:var(--r-md);padding:var(--space-5);margin-bottom:16px;box-shadow:var(--shadow-card)}
.form-workspace-head h3{font-size:var(--text-2xl);letter-spacing:-.03em;margin-bottom:5px}
.form-context-card{min-width:230px;background:var(--surface-sunken);border:1px solid var(--line);border-radius:var(--r-md);padding:14px;display:grid;align-content:center;gap:4px}
.form-context-card strong{font-size:var(--text-base)}
.form-context-card span{color:var(--muted);font-size: var(--text-sm);font-weight:400}
.forms-head{display:flex;justify-content:space-between;gap:18px;align-items:flex-start}
.forms-head h3{font-size:var(--text-2xl);letter-spacing:-.03em;margin-bottom:5px}
.rams-library-panel{display:flex;justify-content:space-between;gap:16px;align-items:flex-start;background:var(--bg);border:1px solid var(--line);border-radius:var(--r-md);padding:18px;margin-bottom:14px;box-shadow:var(--shadow-soft)}
.rams-library-panel h3{font-size:var(--text-xl);margin:3px 0 6px}
.rams-library-panel p{color:var(--muted);font-weight:400;line-height:var(--leading-snug)}
.rams-library-stats{display:flex;gap:10px;align-items:center;flex-wrap:wrap;justify-content:flex-end;min-width:260px}
.rams-library-stats .kpi-card{flex:1 1 170px;min-height:0}
.template-find-label{margin:0 0 var(--space-2);font-size:var(--text-xs);font-weight:600;text-transform:uppercase;letter-spacing:.13em;color:var(--muted)}
/* Audit LD24/LD25: ONE filter bar and result bar (the prototype's .filters
   and .resultbar), shared by Projects and Forms: search, then chips with
   counts, then a quiet line saying how many are shown. */
.siite-filter-bar{display:flex;gap:var(--space-2);align-items:center;flex-wrap:wrap;background:var(--panel);border:1px solid var(--line);border-radius:var(--r-md);padding:var(--space-3) var(--space-3);margin:0}
.siite-filter-bar input[type=search]{flex:1 1 260px;min-width:0}
.siite-filter-chips{display:flex;gap:var(--space-2);flex-wrap:wrap}
body:not(.login-mode) .siite-filter-chip{display:inline-flex;align-items:center;gap:var(--space-2);min-height:var(--control-sm);padding:var(--space-2) var(--space-3);border:1px solid var(--line);border-radius:var(--r-pill);background:var(--panel);color:var(--muted);font-size:var(--text-sm);font-weight:600;box-shadow:none}
body:not(.login-mode) .siite-filter-chip:hover{border-color:var(--blue-2);color:var(--ink)}
body:not(.login-mode) .siite-filter-chip.active{background:var(--blue);border-color:var(--blue);color:#fff}
.chip-count{font-style:normal;font-size:var(--text-xs);font-weight:600;background:var(--line);color:var(--ink);border-radius:var(--r-pill);min-width:20px;height:20px;display:inline-flex;align-items:center;justify-content:center;padding:0 var(--space-2)}
.siite-filter-chip.active .chip-count{background:rgba(255,255,255,.22);color:#fff}
.siite-result-bar{display:flex;justify-content:space-between;align-items:center;gap:var(--space-2);flex-wrap:wrap;padding:var(--space-2) var(--space-4);margin:0 0 var(--space-4);border:1px solid var(--line);border-top:0;border-radius:0 0 var(--r-md) var(--r-md);background:var(--bg);font-size:var(--text-sm);color:var(--muted)}
.siite-result-bar b{color:var(--ink);font-weight:600}
.siite-filter-bar + .siite-result-bar{margin-top:-1px}
.siite-filter-bar:has(+ .siite-result-bar){border-radius:var(--r-md) var(--r-md) 0 0}
/* Forms: tiles, then groups that fold, then compact cards (prototype .fcard). */
.form-home-kpis{display:grid;grid-template-columns:repeat(auto-fit,minmax(max(140px,calc((100% - 36px) / 4)),1fr));gap:12px;margin:0 0 16px}
/* Audit LD25 / LM-31 (third pass): at 320 the folded groups were 330px in a
   234px column - the pick grid's 300px minimum set the min-content of every
   group above it. Every level now says it may shrink (minmax(0,1fr),
   min-width:0, a minimum that is never wider than its row), so the card's
   "Fill" pill stays on screen and the name wraps instead. */
.form-template-groups{display:grid;grid-template-columns:minmax(0,1fr);gap:var(--space-2)}
.form-template-group{min-width:0;border:1px solid var(--line);border-radius:var(--r-md);background:var(--panel)}
.form-template-group > summary{display:flex;align-items:center;justify-content:space-between;gap:var(--space-2);min-height:var(--control-md);padding:var(--space-2) var(--space-4);cursor:pointer;list-style:none;font-size:var(--text-xs);font-weight:600;letter-spacing:.13em;text-transform:uppercase;color:var(--muted)}
.form-template-group > summary::-webkit-details-marker{display:none}
.form-template-group > summary::after{content:"▾";margin-left:auto;font-size:var(--text-sm)}
.form-template-group[open] > summary::after{content:"▴"}
.form-template-group > .rams-library-panel{margin:0 14px 10px}
.form-pick-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(min(300px,100%),1fr));gap:var(--space-2);padding:0 var(--space-4) var(--space-4)}
body:not(.login-mode) .form-pick-card{display:flex;align-items:center;gap:var(--space-3);width:100%;min-width:0;min-height:64px;padding:var(--space-3) var(--space-4);border:1px solid var(--line);border-radius:var(--r-md);background:var(--panel);color:var(--ink);text-align:left;box-shadow:none}
body:not(.login-mode) .form-pick-card:hover{border-color:var(--blue-2)}
.form-pick-icon{flex:0 0 auto;display:grid;place-items:center;width:40px;height:40px;border-radius:var(--r-md);background:var(--bg);color:var(--blue-2)}
.form-pick-body{flex:1 1 auto;min-width:0;display:grid;gap:2px}
.form-pick-body b{font-size:var(--text-base);font-weight:600}
.form-pick-body small{color:var(--muted);font-size:var(--text-xs);font-weight:400;overflow:hidden;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical}
.form-pick-body .form-pick-meta{-webkit-line-clamp:1}
.template-source{display:block;color:var(--muted);font-weight:700;line-height:var(--leading-snug);margin-top:8px}
.button-link{display:inline-flex;align-items:center;justify-content:center;border-radius:var(--r-md);padding:9px 12px;text-decoration:none;font-weight:700;border:1px solid var(--line);background:white;color:var(--blue)}
.template-meta{display:flex;justify-content:space-between;color:var(--muted);font-size: var(--text-xs);font-weight:600;text-transform:uppercase;letter-spacing:.1em}
.form-builder-layout{display:grid;grid-template-columns:260px 1fr;gap:16px;align-items:start}
.template-picker{background:var(--bg);border:1px solid var(--line);border-radius:var(--r-md);padding:14px;display:grid;gap:10px;position:sticky;top:18px}
.template-picker-head{display:flex;justify-content:space-between;gap:10px;align-items:center;margin-bottom:2px}
.template-picker h4{margin:0}
.template-picker-head span{color:var(--muted);font-size: var(--text-xs);font-weight:600;text-transform:uppercase;letter-spacing:.1em}
.template-picker button{background:white;color:var(--ink);border:1px solid #e3ebf4;box-shadow:none;text-align:left;display:flex;flex-direction:column;gap:4px}
.template-picker button.active{background:var(--blue);color:white;border-color:var(--blue)}
.template-picker small{opacity:.72}
/* Forms 280: the picker is a details element so it can fold away on a phone. */
details.template-picker{display:block}
details.template-picker > summary{cursor:pointer;list-style:none}
details.template-picker > summary::-webkit-details-marker{display:none}
details.template-picker:not([open]) > summary h4::after{content:" ▾";color:var(--muted)}
details.template-picker > button{width:100%;margin-top:10px}
.template-choice strong{font-size:var(--text-base)}
.template-choice span{font-size: var(--text-xs);color:var(--muted);font-weight:700}
.template-choice.active span{color:rgba(255,255,255,.76)}
.form-readiness{background:white;border:1px solid var(--line);border-radius:var(--r-md);padding:var(--space-4);box-shadow:var(--shadow-soft);margin-bottom:14px;display:grid;gap:14px}
.form-readiness h4{font-size:var(--text-lg);line-height:var(--leading-tight);margin:0 0 4px}
.form-readiness p{color:var(--muted);font-size:var(--text-base);line-height:var(--leading-snug)}
.readiness-metrics{display:grid;grid-template-columns:repeat(4,1fr);gap:9px}
.readiness-metrics span{background:var(--bg);border:1px solid #e3ebf4;border-radius:var(--r-md);padding:11px;color:var(--muted);font-size: var(--text-xs);font-weight:600;text-transform:uppercase;letter-spacing:.1em}
.readiness-metrics strong{display:block;color:var(--ink);font-size:var(--text-xl);margin-bottom:2px}
.form-progress{display:grid;gap:7px}
.progress-head{display:flex;justify-content:space-between;color:var(--muted);font-size: var(--text-sm);font-weight:700}
.progress-track{height:10px;border-radius:var(--r-pill);background:#e8eef5;overflow:hidden}
.progress-track span{display:block;height:100%;background:linear-gradient(90deg,var(--good),#4fa66f);border-radius:var(--r-pill)}
.dynamic-form-wrap{min-width:0}
.dynamic-form-head{display:flex;justify-content:space-between;gap:12px;align-items:flex-start;background:white;border:1px solid var(--line);border-radius:var(--r-md);padding:18px;margin-bottom:14px}
.dynamic-form-head h4{font-size:var(--text-2xl);letter-spacing:-.03em;margin-bottom:5px}
/* Visual 459: minmax(0,1fr) (the P3V-08 rule) - an auto column grew to the day's form's widest field and pushed the diary's first card past a 320px screen. */
.form-sections-stack{display:grid;grid-template-columns:minmax(0,1fr);gap:var(--space-4)}
.schema-section{border:1px solid var(--line);border-radius:var(--r-md);background:var(--bg);padding:var(--space-4);display:grid;gap:12px}
.schema-section legend{padding:0 8px;color:var(--blue);font-weight:700}
.schema-field{display:grid;gap:8px;background:white;border:1px solid #e5edf5;border-radius:var(--r-md);padding:13px}
.schema-field>span{font-size: var(--text-sm);font-weight:700;color:#354c63}
.schema-field em{font-style:normal;color:var(--bad);font-size: var(--text-xs);margin-left:6px}
.schema-field.risky{border-color:#e8b56b;background:var(--status-warning-surface)}
.schema-field input,.schema-field textarea,.schema-field select{width:100%;margin:0;border-radius:var(--r-md)}
.schema-field small{color:var(--muted);font-weight:700}
.schema-file-control{border:1px dashed #b8cadd;background:var(--bg);border-radius:var(--r-md);padding:var(--space-3);display:grid;gap:8px}
.schema-file-control input{background:white}
/* Audit V2-12 (Visual 454): multi-choice answers are a 2-column chip grid on
   every width - 12 weather or incident options were 12 full-width 70px tiles
   (about 900px each) on a phone. */
.schema-options{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px}
/* Audit LM-11: one rule set for checklist options (the !important layer that
   fought the selected tint is gone). The box is a 24px square with an edge
   that reads outdoors (about 4:1, it was 1.3:1); the whole label is the 44px+
   press target. */
.schema-options label{display:flex;align-items:center;gap:10px;min-height:var(--control-md);border:1px solid var(--line);border-radius:var(--r-md);padding:var(--space-3);background:var(--panel);font-weight:600;cursor:pointer}
.schema-options label:hover{border-color:#9fbfd9;background:#f3f8fd}
.schema-options label.selected,.schema-options label:has(input:checked){background:#eef6ff;border-color:var(--blue);color:var(--blue)}
.schema-options input{-webkit-appearance:none;appearance:none;width:24px;height:24px;min-height:0;margin:0;border:2px solid #6f8197;border-radius:var(--r-xs);padding:0;display:grid;place-items:center;flex:0 0 auto;background:#fff}
.schema-options.yesno input{border-radius:50%}
.schema-options input:checked{background:var(--blue);border-color:var(--blue)}
.schema-options input:checked:after{content:"";width:9px;height:5px;border-left:2px solid white;border-bottom:2px solid white;transform:rotate(-45deg);margin-top:-2px}
.repeat-group{display:grid;gap:10px}
.repeat-row{display:grid;grid-template-columns:repeat(3,1fr);gap:9px;background:var(--bg);border:1px solid #e3ebf4;border-radius:var(--r-md);padding:10px}
.repeat-row label{display:grid;gap:5px}
.repeat-row span{font-size: var(--text-xs);font-weight:600;color:var(--muted);text-transform:uppercase;letter-spacing:.1em}
.sticky-submit{position:sticky;bottom:12px;background:rgba(255,255,255,.95);border:1px solid var(--line);border-radius:var(--r-md);box-shadow:var(--shadow);padding:var(--space-3);margin-top:14px;display:flex;gap:10px;justify-content:flex-end;z-index:5}
.state-row{border-radius:var(--r-md);border:1px solid #e5ebf2;background:white;box-shadow:var(--shadow-card);padding:var(--space-3) var(--space-4);display:grid;gap:var(--space-1);margin-bottom:var(--space-3)}
.state-row strong{font-size: var(--text-base)}
.state-row span,.state-row li{color:var(--muted);font-size:var(--text-base)}
.loading-state{border-color:var(--line);background:#f4f9ff}
.empty-state{background:var(--bg)}
.permission-state{border-color:#f1d08d;background:#fff8e7}
.route-state-panel{max-width:100%;overflow:hidden}
.permission-matrix-mini{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:10px;margin:16px 0 6px}
.permission-matrix-mini span{display:grid;gap:5px;min-width:0;border:1px solid #e2eaf2;border-radius:var(--r-md);background:#f7fafc;padding:var(--space-3)}
.permission-matrix-mini strong{color:var(--muted);font-size:var(--text-xs);font-weight:600;letter-spacing:.1em;text-transform:uppercase}
.permission-matrix-mini em{font-style:normal;color:var(--ink);font-weight:600;line-height:var(--leading-snug);overflow-wrap:anywhere}
@media(max-width:760px){.permission-matrix-mini{grid-template-columns:1fr}.route-state-panel .button-row{display:grid;grid-template-columns:1fr}.route-state-panel .button-row button{width:100%}}
.warning-state{border-color:#f1d08d;background:#fff8e7}
.error-state{border-color:#df8d8d;background:#fff0f0}
.locked-state{border-color:#b8d8c4;background:#f2fbf5}
.review-panel,.submission-detail{display:grid;gap:14px}
.action-preview{display:grid;gap:12px}
.action-prompt,.linked-action{background:white;border:1px solid #e3ebf4;border-radius:var(--r-md);padding:var(--space-4)}
.action-prompt h4,.linked-action h4{margin:0 0 var(--space-2);font-size:var(--text-base)}
.compact{grid-template-columns:repeat(4,minmax(130px,1fr));margin-top:12px}
.review-answers{display:grid;gap:8px}
.review-answers div{display:grid;grid-template-columns:220px 1fr;gap:10px;border:1px solid #e3ebf4;border-radius:var(--r-md);background:white;padding:11px}
.review-answers span{color:var(--muted)}
/* Inline action capture that opens under a risky Yes/No/N-A answer: owner, due
   date, status and an evidence link, on the question itself. Amber to match the
   .schema-field.risky the control sits beneath. */
.field-action-capture{margin:-4px 0 4px;padding:13px;border:1px solid #e8b56b;border-left:4px solid var(--warn);border-radius:var(--r-md);background:var(--status-warning-surface)}
.field-action-capture[hidden]{display:none}
.field-action-note{margin:0;font-size:var(--text-sm);color:#5d4a1a}
.field-action-capture .field-wide,.action-prompt .field-wide{grid-column:1/-1}
.share-panel{border:1px solid #d8e4ef;background:var(--bg);border-radius:var(--r-md);padding:var(--space-4);margin:14px 0}
.attention-list{display:grid;gap:var(--space-2)}
.attention-row{display:grid;grid-template-columns:auto 180px 1fr;gap:12px;align-items:center;width:100%;text-align:left;background:white;color:var(--ink);border:1px solid var(--line);box-shadow:none}
.attention-row.bad{border-color:#efc6c6;background:#fffafa}
.attention-row.warn{border-color:#f1d08d;background:#fffdf7}
.attention-row small{color:var(--muted)}
/* "Your list today" - the per-person daily to-do list. Row layout is explicit
   about the trailing button because Siite's global button style is 42px tall
   with a shadow, which otherwise stretches each row out of shape. */
/* States who can read the open channel, immediately above the composer, so the
   audience is known before anything is typed. Site channels are tinted amber
   because that is the one where saying the wrong thing has consequences. */
/* Emoji picker and reactions. Buttons reset explicitly because the global button
   style is 42px with a shadow, which would turn a 16-emoji grid into a wall. */
.emoji-picker{display:flex;flex-wrap:wrap;gap:4px;padding:var(--space-2);margin:0 0 8px;border:1px solid var(--line);border-radius:var(--r-md);background:var(--panel)}
.emoji-picker button{all:unset;cursor:pointer;font-size:var(--text-xl);line-height:var(--leading-none);padding:6px;border-radius:var(--r-sm)}
.emoji-picker button:hover,.emoji-picker button:focus-visible{background:#e8f1fa;outline:none}
.message-reactions{display:flex;flex-wrap:wrap;gap:4px;margin-top:6px}
.message-reactions button{all:unset;cursor:pointer;font-size: var(--text-sm);line-height:var(--leading-none);padding:3px 8px;border-radius:var(--r-pill);border:1px solid var(--line);background:white}
.message-reactions button.mine{border-color:#8ab4e0;background:#e8f1fa}
.message-reactions button:hover,.message-reactions button:focus-visible{border-color:#8ab4e0;outline:none}
.emoji-toggle{font-size:var(--text-base)}
/* Header and audience banner share one grid row. `.message-conversation` is a
   three-row grid (header / timeline / composer); adding a fourth child handed the
   flexible middle row to this banner and squashed the message list to nothing.
   Anything new above the timeline belongs inside this wrapper, not beside it. */
/* Siite access list. Row buttons are sized explicitly because the global button
   style is 42px with a shadow and would stretch every row. */
.access-list{display:grid;gap:8px;margin-bottom:18px}
.access-list-heading{margin:12px 0 2px}
.access-row{display:flex;justify-content:space-between;align-items:center;gap:12px;border:1px solid var(--line);border-radius:var(--r-md);background:white;padding:10px 13px}
.access-row>span{display:grid;gap:2px;min-width:0}
.access-row>span.access-row-actions{display:flex;gap:6px;align-items:center;flex-wrap:wrap;justify-content:flex-end}
/* Explains an empty workspace rather than leaving the page silently blank. */
.notice-panel{border-left:4px solid var(--warn);background:#fdf8ec}
.notice-panel .eyebrow{color:#8a6508}
.access-row b{font-weight:700;color:var(--ink)}
.access-row small{color:var(--muted)}
.access-row-inactive{background:#fbfcfd;opacity:.75}
.access-row button{height:auto;min-height:0;padding:7px 13px;box-shadow:none;white-space:nowrap;flex:0 0 auto}
.access-add{border-top:1px solid var(--line);padding-top:14px}
.access-add h4{margin:0 0 10px;font-size:var(--text-base)}
.access-link-row{display:flex;gap:8px;align-items:center;margin-top:8px;flex-wrap:wrap}
.access-link-row input{flex:1 1 260px;margin:0;font-family:ui-monospace,Menlo,monospace;font-size: var(--text-xs)}
.access-link-row button{height:auto;min-height:0;padding:8px 14px;box-shadow:none;white-space:nowrap}
.message-conversation-top{display:block;min-width:0}
.message-audience{margin:0;padding:var(--space-2) var(--space-4);font-size: var(--text-xs);color:#41576d;background:#f2f7fb;border-top:1px solid var(--line);border-bottom:1px solid var(--line)}
.message-audience-site{background:var(--status-warning-surface);color:#7a5a12;border-color:#f1d08d}
.message-project-contacts{border-bottom:1px solid var(--line);background:var(--bg)}
.message-project-contacts summary{display:flex;align-items:center;gap:var(--space-2);padding:var(--space-2) var(--space-4);color:var(--navy);font-weight:700;cursor:pointer}
.message-project-contacts summary span{display:inline-grid;place-items:center;min-width:24px;height:24px;border-radius:var(--r-pill);background:#dbeafe;color:#1d4f7c;font-size: var(--text-xs)}
.message-project-contact-list{display:grid;gap:8px;max-height:230px;overflow-y:auto;padding:0 16px 14px}
.message-project-contact-list article{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:10px 12px;border:1px solid var(--line);border-radius:var(--r-xs);background:#fff}
.message-project-contact-list article small{display:block;margin-top:2px;color:var(--muted)}
.approved-boq-panel:not(:empty){border-top:1px solid var(--line);margin-top:var(--space-4);padding-top:var(--space-3)}
.valuation-draft{border:1px solid #cfe0f0;border-radius:var(--r-md);background:#f9fcff;padding:14px;margin-bottom:14px}
.valuation-warnings{margin:0 0 12px;padding:10px 12px 10px 28px;border-radius:var(--r-sm);background:#fffdf7;border:1px solid #f1d08d;color:#7a5a12}
.valuation-warnings li{margin:3px 0}
.valuation-summary{width:100%;border-collapse:collapse;margin:8px 0}
.valuation-summary td{padding:6px 8px;border-bottom:1px solid var(--line)}
.valuation-summary td:last-child{text-align:right;font-variant-numeric:tabular-nums}
.valuation-total td{border-top:2px solid var(--ink);border-bottom:none;font-size: var(--text-base);padding-top:9px}
.labour-history-table{width:100%;border-collapse:collapse;margin:8px 0;font-size: var(--text-sm)}
.labour-history-table th{text-align:left;padding:6px 8px;border-bottom:2px solid var(--line);color:var(--muted);font-size: var(--text-xs);text-transform:uppercase;letter-spacing:.1em}
.labour-history-table td{padding:6px 8px;border-bottom:1px solid var(--line);font-variant-numeric:tabular-nums}
.labour-history-table td:first-child{font-variant-numeric:normal;font-weight:700}
.labour-unallocated td{background:#fffafa}
.my-day-panel{margin:0 0 16px}
/* Siite Market. The aggregate warning is styled to carry weight because it is the
   only part of this feature a manager needs to act on - the questions below it are
   how the warning gets generated, not the output. */
.siite-market-panel{margin:0 0 var(--space-4)}
.market-warnings{border:1px solid #f1d08d;background:#fffdf7;border-radius:var(--r-md);padding:12px 14px;margin-bottom:14px}
.market-warnings h4{margin:0 0 8px;font-size:var(--text-base);color:#7a5a12}
.market-warning{margin:0 0 6px;line-height:var(--leading-normal);color:#7a5a12}
.market-warning:last-child{margin-bottom:0}
.market-question{border:1px solid var(--line);border-radius:var(--r-md);padding:12px 14px;margin-bottom:10px;background:var(--panel)}
.market-question-text{margin:0 0 10px;line-height:var(--leading-normal)}
.market-choices{display:flex;flex-wrap:wrap;gap:8px}
/* Deliberately generous targets - most answers will come from a phone on site,
   often one-handed and in gloves. */
.market-choice{min-height:var(--control-md);padding:8px 14px;flex:1 1 auto;min-width:110px}
.market-accuracy{margin:10px 0 0;font-size:var(--text-base)}
.market-withheld{margin-top:10px;font-size:var(--text-base)}
.market-withheld summary{cursor:pointer;color:var(--muted)}
.market-withheld p{margin:6px 0 0}
.market-admin{display:flex;flex-wrap:wrap;gap:8px;margin-top:12px;padding-top:12px;border-top:1px solid var(--line)}
/* Diary quality audit. Colour-coded because the question it answers - is this
   data good enough to build commercial analysis on - should be readable at a
   glance, not decoded from a table. */
.diary-audit{border:1px solid var(--line);border-radius:var(--r-md);background:var(--panel);padding:14px;margin-bottom:14px}
.diary-audit-verdict{margin:0 0 12px;padding:10px 12px;border-radius:var(--r-sm);font-weight:700;line-height:var(--leading-normal)}
.diary-audit-verdict.good{background:#eef8f0;color:var(--good);border:1px solid #bfe0c8}
.diary-audit-verdict.warn{background:#fffdf7;color:#7a5a12;border:1px solid #f1d08d}
.diary-audit-verdict.bad{background:#fffafa;color:#8a2f2f;border:1px solid #efc6c6}
.diary-audit-project{border-top:1px solid var(--line);padding:10px 0}
.diary-audit-head{display:flex;justify-content:space-between;align-items:center;gap:10px}
.diary-audit-fields{display:flex;flex-wrap:wrap;gap:5px;margin-top:7px}
.diary-audit-field{font-size: var(--text-xs);padding:3px 8px;border-radius:var(--r-pill);border:1px solid var(--line);background:white;cursor:help}
.diary-audit-field.good{border-color:#bfe0c8;background:#f3faf5}
.diary-audit-field.warn{border-color:#f1d08d;background:#fffdf7}
.diary-audit-field.bad{border-color:#efc6c6;background:#fffafa}
/* AI summary sits above the list and is visibly a different kind of thing: an
   opinion, not a record. Tinted and labelled so the two are never confused. */
.my-day-narrative{border:1px solid #cfe0f0;border-left:3px solid #4a7fb5;border-radius:var(--r-md);background:#f7fbff;padding:11px 14px;margin-bottom:12px}
.my-day-narrative p{margin:0}
.my-day-narrative p+p{margin-top:6px;color:var(--ink);line-height:var(--leading-normal)}
.my-day-narrative-label{font-size: var(--text-xs);text-transform:uppercase;letter-spacing:.1em;font-weight:600;color:#4a7fb5}
.my-day-index{display:inline-block;min-width:18px;font-variant-numeric:tabular-nums;color:var(--muted);font-weight:700}
.my-day-item{display:flex;justify-content:space-between;align-items:center;gap:var(--space-3);border:1px solid var(--line);border-radius:var(--r-md);background:white;padding:var(--space-3) var(--space-3)}
.my-day-item>span{display:grid;gap:var(--space-1);min-width:0}
.my-day-item b{font-weight:700;color:var(--ink)}
.my-day-item small{color:var(--muted)}
.my-day-item .pill{justify-self:start}
.my-day-item button{height:auto;min-height:0;padding:var(--space-2) var(--space-3);box-shadow:none;white-space:nowrap;flex:0 0 auto}
/* Health 306: error causes not seen for a week sit folded under this week's. */
.client-errors-older{margin-top:12px}
.client-errors-older>summary{cursor:pointer;color:var(--blue-2);font-weight:600;padding:12px 2px}
/* To-do 299: the lines after the first ten are folded, not withheld. */
.my-day-more .my-day-item{margin-top:10px}
.my-day-more>summary{cursor:pointer;color:var(--blue-2);font-weight:600;padding:12px 2px}
.action-card{border:1px solid #dce7f1;background:white;border-radius:var(--r-md);padding:15px;box-shadow:var(--shadow-soft)}
.action-card.danger{border-color:#efc6c6;background:#fffafa}
.action-card.warning{border-color:#f1d08d;background:#fffdf7}
.action-card-head{display:flex;justify-content:space-between;gap:var(--space-2);align-items:center;margin-bottom:var(--space-2)}
.action-meta{display:grid;grid-template-columns:repeat(3,minmax(150px,1fr));gap:8px;margin:12px 0 0}
.action-meta div{border:1px solid #e7eef6;border-radius:var(--r-md);padding:9px;background:var(--panel)}
.action-meta dt{font-size: var(--text-xs);text-transform:uppercase;font-weight:600;color:var(--muted);letter-spacing:.1em}
.action-meta dd{margin:3px 0 0;font-weight:700;color:var(--ink)}
.closeout-strip{display:grid;grid-template-columns:120px 1fr;gap:10px;align-items:center;margin-top:12px;border-radius:var(--r-md);background:#eef4fa;padding:10px 12px;color:#31475d}
/* Audit P3V-09 (third pass): every column may shrink, and the evidence is the shared Take photo / Add a file control. */
.action-card{min-width:0}
.action-closeout-form{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,260px) auto;gap:10px;align-items:end;margin-top:12px;border-top:1px solid #e6eef6;padding-top:12px}
.action-closeout-form > *{min-width:0}
.action-closeout-evidence{display:grid;gap:4px}
.action-closeout-form textarea,.action-closeout-form input{margin:0;border-radius:var(--r-md)}
.action-closeout-form button{white-space:nowrap}
.record-list{display:grid;gap:var(--space-2)}
/* Platform 433: a long list draws a page at a time; this row says how many of how many and offers the next page. */
.list-show-more{display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap;padding:10px 0}
.list-show-more button{min-height:var(--control-sm)}
/* Visual 453 (V2 P1, V3-10, V1-01): .record-row was a fixed 4-column grid
   (auto 1fr 1.2fr auto) used by ten lists holding two, three or four
   children, so a summary got 78px and ran one word per line, and a
   two-child row ran its label and status together. It is the record-row
   shape now (siiteRecordRow): chips and the title on the first line, the
   summary clamped to two lines underneath, the action on the right, and the
   whole row free to wrap at any width. */
.record-row{width:100%;display:flex;flex-wrap:wrap;align-items:center;gap:4px 12px;min-width:0;background:white;color:var(--ink);border:1px solid #e3ebf4;box-shadow:none;text-align:left}
.record-row > *{min-width:0}
.record-row > .pill{flex:0 0 auto}
.record-row > :is(strong,div:first-child){flex:1 1 240px}
.record-row > small{flex:1 1 100%;order:3;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;line-clamp:2;overflow:hidden}
.record-row > span:not(.pill){order:4;color:var(--muted);font-size:var(--text-xs);font-weight:600}
.record-row > :is(.button-row,.inbox-row-acts,button,a){flex:0 0 auto;margin-left:auto}
.record-row small{color:var(--muted);font-weight:700}
.linked-action small{display:block;color:var(--muted);font-weight:700;margin-top:8px}
.register-block{background:var(--bg);border:1px solid #e3ebf4;border-radius:var(--r-md);padding:var(--space-4)}
.evidence-list{grid-template-columns:repeat(2,minmax(220px,1fr))}
.evidence-card{display:grid;gap:6px}
.evidence-card h4{word-break:break-word}
.drawing-register-panel{margin:var(--space-4) 0}
.drawing-remove-button{color:var(--bad);border-color:#eccfcf}
.drawing-remove-button:hover{background:var(--status-critical-surface)}
/* Audit LD03: every tile in the Drawings / AI QS switcher carries the
   .workspace-switch class, so the three tiles render one way (the class-less
   one used to be filled slate with an unreadable 1.05:1 subtitle). */
.drawing-workspace-nav{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:var(--space-2);margin:var(--space-4) 0 var(--space-4);padding:var(--space-2);background:var(--surface-sunken);border:1px solid var(--line);border-radius:var(--r-sm)}
.drawing-workspace-nav .workspace-switch{display:grid;gap:var(--space-1);min-height:68px;padding:var(--space-3) var(--space-4);text-align:left;background:var(--panel);color:var(--ink);border:1px solid transparent;box-shadow:none}
.drawing-workspace-nav .workspace-switch span{font-size: var(--text-xs);color:var(--muted);font-weight:400}
.drawing-workspace-nav .workspace-switch.active{background:var(--blue);color:#fff;border-color:var(--blue)}
.drawing-workspace-nav .workspace-switch.active span{color:#dce8f2}
.drawing-workflow-strip,.programme-workflow-strip{display:grid;grid-template-columns:repeat(5,minmax(0,1fr));gap:1px;overflow:hidden;border:1px solid #d8e2eb;border-radius:var(--r-sm);background:#d8e2eb}
/* Audit LD21 (third pass): #6a7c8c measured 3.97:1 here; --muted passes. */
.drawing-workflow-strip span,.programme-workflow-strip span{display:flex;align-items:center;gap:8px;min-height:48px;padding:var(--space-2) var(--space-3);background:#f3f6f9;color:var(--muted);font-size: var(--text-xs);font-weight:700}
.drawing-workflow-strip span b,.programme-workflow-strip span b{display:grid;place-items:center;width:24px;height:24px;border-radius:50%;background:#dce5ec;color:#526779}
.drawing-workflow-strip span.active,.programme-workflow-strip span.active{background:#fff;color:#17324c}
.drawing-workflow-strip span.active b,.programme-workflow-strip span.active b{background:#176ca4;color:#fff}
/* Audit F4V-02 (pass 4): an implicit grid column is 'auto', whose minimum is
   the widest thing inside it (the 980px BOQ table, a nowrap header), so at
   768 the whole page scrolled sideways and at 320 the BOQ figures and its
   buttons were cut off. One shrinkable column, and children that may shrink
   (the same pattern as P3V-08 and LD25). */
.drawing-boq-workspace{display:grid;grid-template-columns:minmax(0,1fr);gap:16px}
.drawing-boq-workspace>*,.drawing-boq-summary>*,.aiqs-intake-layout>*,.aiqs-controlled-tools>*{min-width:0}
.aiqs-workflow-choice{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:1px;overflow:hidden;border:1px solid var(--line);border-radius:var(--r-sm);background:var(--line)}
.aiqs-workflow-choice>div{display:grid;grid-template-columns:auto 1fr;gap:4px 10px;align-items:center;padding:14px 16px;background:#fff}
.aiqs-workflow-choice .pill{grid-row:1/3;align-self:start}
.aiqs-workflow-choice strong{color:#153954}
.aiqs-workflow-choice small{color:var(--muted);line-height:var(--leading-snug)}
.formal-tender-panel{display:grid;gap:14px;border-left:4px solid #176ca4}
.tender-particulars-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:1px;overflow:hidden;border:1px solid var(--line);border-radius:var(--r-sm);background:var(--line)}
.tender-particulars-grid>div{display:grid;gap:4px;min-height:72px;padding:11px 12px;background:var(--bg)}
.tender-particulars-grid span{font-size: var(--text-xs);font-weight:600;text-transform:uppercase;letter-spacing:.1em;color:var(--muted)}
.tender-particulars-grid strong{font-size: var(--text-sm);color:#173a58;word-break:break-word}
.tender-analysis-result{display:grid;gap:12px;padding:14px;border:1px solid #b9d9c7;border-radius:var(--r-sm);background:#f7fcf9}
.drawing-boq-summary{display:grid;grid-template-columns:minmax(0,1fr);gap:14px}
.drawing-boq-table-panel{overflow:hidden}
.drawing-boq-table{width:100%;min-width:980px;border-collapse:collapse}
.drawing-boq-table th,.drawing-boq-table td{padding:12px 10px;border-bottom:1px solid #e3eaf0;text-align:left;vertical-align:top}
.drawing-boq-table th{background:#f2f6f9;color:#41586d;font-size: var(--text-xs);text-transform:uppercase;letter-spacing:.1em}
.drawing-boq-table td>small,.drawing-boq-table td strong+small{display:block;margin-top:4px;color:var(--muted)}
.drawing-boq-table .row-actions{display:flex;flex-wrap:wrap;gap:5px;min-width:245px}
.drawing-boq-table .row-actions button{min-height:var(--control-md);padding:6px 9px;font-size: var(--text-xs)}
.ai-boq-review{display:grid;gap:10px;padding:var(--space-3);border:1px solid #edcf88;background:var(--status-warning-surface);border-radius:var(--r-sm)}
.aiqs-workspace-header{display:flex;align-items:flex-end;justify-content:space-between;gap:20px;padding:2px 2px 4px}
.aiqs-workspace-header h2{margin:2px 0 6px;font-size:var(--text-3xl);letter-spacing:0}
.aiqs-workspace-header p{margin:0;max-width:760px;color:var(--muted)}
.aiqs-readiness-score{flex:0 0 150px}
.aiqs-intake-layout{display:grid;grid-template-columns:minmax(0,1.35fr) minmax(280px,.65fr);gap:16px}
.aiqs-intake-panel,.aiqs-control-panel,.aiqs-elemental-panel,.aiqs-deliverables{margin:0}
.aiqs-readiness-list{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:0;margin:0;padding:0;list-style:none;border-top:1px solid var(--line)}
.aiqs-readiness-list li{display:flex;align-items:flex-start;gap:10px;min-width:0;padding:var(--space-3) var(--space-2);border-bottom:1px solid var(--line)}
.aiqs-readiness-list li:nth-child(odd){padding-right:16px;border-right:1px solid var(--line)}
.aiqs-readiness-list li:nth-child(even){padding-left:16px}
.aiqs-readiness-list li>span{display:grid;place-items:center;flex:0 0 24px;width:24px;height:24px;border-radius:50%;font-size: var(--text-xs);font-weight:700}
.aiqs-readiness-list li.ready>span{background:#dff3e7;color:var(--good)}
.aiqs-readiness-list li.missing>span{background:#fff0cf;color:#8a5700}
.aiqs-readiness-list strong,.aiqs-readiness-list small{display:block}
.aiqs-readiness-list small{margin-top:3px;color:var(--muted)}
.aiqs-control-panel dl{display:grid;gap:0;margin:0}
.aiqs-control-panel dl>div{display:flex;justify-content:space-between;gap:18px;padding:10px 0;border-bottom:1px solid var(--line)}
.aiqs-control-panel dt{color:var(--muted)}
.aiqs-control-panel dd{margin:0;font-weight:700;color:#123b63;text-align:right}
.aiqs-element-table{width:100%;border-collapse:collapse}
.aiqs-element-table th,.aiqs-element-table td{padding:11px 10px;border-bottom:1px solid var(--line);text-align:left}
.aiqs-element-table th{font-size: var(--text-xs);text-transform:uppercase;letter-spacing:.1em;color:#52687b;background:#f3f6f8}
.aiqs-deliverable-list{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));border-top:1px solid var(--line)}
.aiqs-deliverable-list>div{display:grid;align-content:start;gap:8px;min-width:0;padding:var(--space-4)}
.aiqs-deliverable-list>div+div{border-left:1px solid var(--line)}
.aiqs-deliverable-list strong{font-size: var(--text-base);color:#132c45}
.aiqs-deliverable-list span{min-height:48px;color:var(--muted);font-size: var(--text-xs)}
.aiqs-deliverable-list button{justify-self:start}
.aiqs-findings-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px}
.aiqs-findings-grid>div{padding:10px 12px;border-left:3px solid #47769c;background:#fff}
.aiqs-findings-grid strong{color:#163c5d}
.aiqs-findings-grid ul{margin:7px 0 0;padding-left:18px}
.aiqs-findings-grid li{margin:4px 0;color:#4f6477;font-size: var(--text-xs)}
.aiqs-controlled-tools{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:16px}
.aiqs-controlled-tools .panel{margin:0}
.aiqs-drop-field{display:grid;gap:5px;padding:var(--space-4);border:1px dashed #86a5bd;border-radius:var(--r-sm);background:#f5f9fc;color:#173b5b;cursor:pointer}
.aiqs-drop-field span{color:var(--muted);font-size: var(--text-xs)}
.aiqs-drop-field input{width:100%;margin-top:8px;padding:var(--space-2);background:#fff}
.compact-check-list{display:grid;gap:7px;margin:0 0 14px;padding-left:20px;color:#496175;font-size: var(--text-xs)}
.ai-pdf-takeoff-review{padding:var(--space-4);background:#f9fbfd;border-color:#b9cfdf}
.aiqs-source-control{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:1px;overflow:hidden;border:1px solid var(--line);border-radius:var(--r-sm);background:var(--line)}
.aiqs-source-control span{display:grid;gap:3px;padding:10px;background:#fff;color:var(--muted);font-size: var(--text-xs);word-break:break-word}
.aiqs-source-control strong{color:#183a58;text-transform:uppercase;letter-spacing:.1em;font-size: var(--text-xs)}
.aiqs-validation-table{min-width:1260px}
.aiqs-validation-table input,.aiqs-validation-table select{width:100%;min-width:100px;margin:0;padding:var(--space-2);border-radius:var(--r-xs)}
.aiqs-validation-table td:nth-child(2) input{min-width:260px}
.aiqs-validation-table td:nth-child(6) input{max-width:130px}
.aiqs-quantity-edit{display:grid;grid-template-columns:minmax(90px,1fr) 74px;gap:6px;min-width:180px}
.aiqs-validation-table .link-button{display:block;margin-top:5px;padding:0;min-height:0;background:transparent;color:#176ca4;box-shadow:none;text-align:left;font-size: var(--text-xs)}
@media(max-width:1100px){.aiqs-intake-layout,.aiqs-controlled-tools{grid-template-columns:minmax(0,1fr)}.aiqs-deliverable-list{grid-template-columns:1fr}.aiqs-deliverable-list>div+div{border-left:0;border-top:1px solid var(--line)}.aiqs-deliverable-list span{min-height:0}.aiqs-source-control{grid-template-columns:repeat(2,minmax(0,1fr))}}
@media(max-width:760px){.aiqs-workspace-header{align-items:stretch;flex-direction:column}.aiqs-readiness-score{flex-basis:auto}.aiqs-readiness-list,.aiqs-findings-grid,.aiqs-source-control,.aiqs-workflow-choice,.tender-particulars-grid{grid-template-columns:1fr}.aiqs-readiness-list li:nth-child(odd),.aiqs-readiness-list li:nth-child(even){padding:var(--space-3) var(--space-1);border-right:0}.drawing-boq-summary .button-row{width:100%}.drawing-boq-summary .button-row button{flex:1 1 100%}}
.superseded-row{background:#fff4f2;color:#7f1d1d}
.drawing-viewer-panel{margin-top:18px}
/* Drawing workspace: the plan is the default; tools remain one tap away. */
.drawing-workspace-panes{display:flex;flex-direction:row;gap:8px;margin:12px 0;position:sticky;top:0;z-index:3;background:var(--panel);padding:8px 0}
.drawing-workspace-panes button{flex:1;min-height:var(--control-md)}
.drawing-viewer-panel .drawing-workspace-panes button[aria-pressed="true"]{background:var(--blue);color:white}
/* 11 Sep review (C1): the pane switch is a phone layout. On a desktop the plan
   and its tools sit side by side, and the quantities review sits in the tools
   column once Quantities is pressed; nothing is hidden by the default pane. */
.drawing-quantities-pane{display:none}
.drawing-viewer-panel[data-workspace-pane="quantities"] .drawing-quantities-pane{display:block}
@media(min-width:761px){.drawing-viewer-panel .drawing-workspace-panes button:not([data-workspace-pane="quantities"]){display:none}}
@media(max-width:760px){
.drawing-viewer-panel[data-workspace-pane="plan"] .drawing-meta{display:none}
.drawing-viewer-panel[data-workspace-pane="plan"] .drawing-viewer-grid{grid-template-columns:minmax(0,1fr)}
.drawing-viewer-panel[data-workspace-pane="quantities"] .drawing-meta>:not(.drawing-quantities-pane){display:none}
.drawing-viewer-panel[data-workspace-pane="tools"] .drawing-meta-details{display:none}
.drawing-viewer-panel[data-workspace-pane="details"] .drawing-tool-shell{display:none}
}
.takeoff-review-row{border-bottom:1px solid var(--line);padding:12px 0}
.takeoff-review-row>button{width:100%;display:flex;justify-content:space-between;gap:12px;min-height:48px;text-align:left}
.takeoff-review-row.selected-row{border-left:3px solid var(--blue);padding-left:8px}
.takeoff-review-warning{color:var(--warn-ink);font-size:var(--text-base);margin:8px 0}
.takeoff-bill-link{display:grid;gap:8px;margin-top:8px}
.drawing-viewer-grid{display:grid;grid-template-columns:minmax(0,1fr) minmax(340px,420px);gap:14px;align-items:start;width:100%;min-width:0}
.drawing-preview-frame,.drawing-preview-image{width:100%;height:100%;min-height:0;border:0;border-radius:0;background:#fff}
.drawing-preview-image{object-fit:contain;display:block}
.drawing-meta{border:1px solid var(--line);border-radius:var(--r-sm);padding:var(--space-3);background:#fff;min-width:0;max-width:100%;position:sticky;top:88px;max-height:calc(100vh - 108px);overflow:auto}
.drawing-measure-stage{position:relative;border:1px solid var(--line);border-radius:var(--r-sm);overflow:auto;background:#dfe7ef;max-height:calc(100vh - 168px);min-height:720px;box-shadow:inset 0 0 0 1px rgba(255,255,255,.6);overflow-anchor:none;scroll-behavior:auto}
.drawing-page-spacer{position:relative;margin:56px 16px 16px}
.drawing-zoom-inner,.drawing-page-layer{position:absolute;top:0;left:0;background:white;transform-origin:top left;display:block;box-shadow:var(--shadow-card)}
.drawing-page-render{position:absolute;inset:0;display:block}
.drawing-pdf-canvas{z-index:1}
.drawing-pdf-status{position:absolute;top:12px;right:12px;left:auto;bottom:auto;z-index:4;max-width:min(520px,calc(100% - 24px));background:rgba(255,255,255,.95);border:1px solid #dce7f1;border-radius:var(--r-sm);padding:9px 11px;color:var(--muted);font-weight:700;box-shadow:var(--shadow-soft);pointer-events:none}
.drawing-pdf-status.error{border-color:#efc6c6;background:var(--status-critical-surface);color:#7f1d1d}
.drawing-pdf-status.warning{border-color:#f1d08d;background:#fffdf4;color:#6b3d00}
.drawing-pdf-fallback{z-index:0}
.drawing-stage-toolbar{position:sticky;top:10px;left:10px;z-index:5;display:inline-flex;align-items:center;gap:6px;margin:10px 0 0 10px;background:rgba(255,255,255,.97);border:1px solid #dce7f1;border-radius:var(--r-md);padding:7px;box-shadow:var(--shadow-soft)}
.drawing-stage-toolbar strong{color:var(--blue);font-size: var(--text-xs);text-transform:uppercase;letter-spacing:.1em;padding:0 5px}
.drawing-stage-toolbar button{min-height:var(--control-md);padding:7px 10px;box-shadow:none}
.drawing-stage-toolbar button.active{background:var(--blue);border-color:var(--blue);color:#fff}
.drawing-stage-toolbar span{color:var(--muted);font-size: var(--text-xs);font-weight:700;white-space:nowrap}
.drawing-tool-rail{position:sticky;top:70px;left:10px;z-index:5;width:84px;display:none;gap:6px;margin:10px 0 0 10px;background:rgba(17,38,65,.94);border:1px solid rgba(255,255,255,.18);border-radius:var(--r-md);padding:7px;box-shadow:var(--shadow-soft)}
.drawing-tool-rail button{min-height:var(--control-md);padding:7px 6px;border-radius:var(--r-sm);background:rgba(255,255,255,.08);border-color:rgba(255,255,255,.18);color:#fff;box-shadow:none;font-size: var(--text-xs);font-weight:700}
.drawing-tool-rail button.active{background:#fff;color:var(--blue);border-color:#fff}
.drawing-tool-rail button:disabled{opacity:.42;color:#d8e3ee;cursor:not-allowed}
.drawing-measure-overlay{position:absolute;inset:0;cursor:crosshair;z-index:2;touch-action:none}
.drawing-measure-overlay.pan-mode{cursor:grab}
.drawing-measure-overlay.pan-mode:active{cursor:grabbing}
.drawing-measure-overlay.select-mode{cursor:default}
.drawing-measure-overlay.annotate-mode{cursor:copy}
.drawing-measure-overlay.pin-mode{cursor:copy}
.drawing-measure-svg{position:absolute;inset:0;width:100%;height:100%;pointer-events:none}
.drawing-measure-svg line{stroke-width:1.15;stroke-linecap:round;filter:drop-shadow(0 1px 1px rgba(0,0,0,.12));vector-effect:non-scaling-stroke}
.drawing-measure-svg .calibration{stroke:#1d6fb8;fill:#1d6fb8}
.drawing-measure-svg .verification{stroke:var(--good);fill:var(--good)}
.drawing-measure-svg .measurement{stroke:var(--warn);fill:var(--warn)}
.drawing-measure-svg .saved-measurement{stroke:var(--bad);fill:var(--bad);stroke-width:1.15;pointer-events:stroke;cursor:pointer}
.drawing-measure-svg .saved-measurement.selected{stroke-width:1.9;filter:drop-shadow(0 0 4px rgba(225,29,72,.32))}
.drawing-measure-svg .saved-measurement.untrusted{stroke:var(--warn);stroke-dasharray:8 7}
.drawing-measure-svg .saved-measurement-hit{stroke:transparent;stroke-width:18;pointer-events:stroke;cursor:pointer;filter:none}
/* Leader from a displaced label back to its line: thin, dashed, quiet — it
   points, it doesn't compete with the measurement itself. */
.drawing-measure-svg .measurement-leader{stroke:rgba(225,29,72,.55);stroke-width:.8;stroke-dasharray:3 3;pointer-events:none;fill:none}
.drawing-measure-svg .measurement-leader.untrusted{stroke:rgba(180,83,9,.55)}
.drawing-measure-svg polygon{vector-effect:non-scaling-stroke}
.drawing-measure-svg .active-area{stroke:var(--warn);stroke-width:1.4;fill:rgba(180,83,9,.08);stroke-dasharray:7 5}
.drawing-measure-svg .saved-measurement-area{stroke:var(--bad);stroke-width:1.5;fill:rgba(225,29,72,.08);pointer-events:fill;cursor:pointer}
.drawing-measure-svg .saved-measurement-area.selected{stroke-width:2.4;fill:rgba(225,29,72,.14);filter:drop-shadow(0 0 4px rgba(225,29,72,.32))}
.drawing-measure-svg .saved-measurement-area.untrusted{stroke:var(--warn);fill:rgba(180,83,9,.08);stroke-dasharray:8 7}
.drawing-measure-svg .measurement-label rect{fill:rgba(255,255,255,.035);stroke:rgba(180,83,9,.18);stroke-width:.6;filter:none}
.drawing-measure-svg .measurement-label text{fill:#5f2600;font-size: var(--text-xs);font-weight:700;text-anchor:middle;dominant-baseline:middle;paint-order:stroke;stroke:rgba(255,255,255,.88);stroke-width:3px;stroke-linejoin:round}
.drawing-measure-svg .saved-measurement-label{pointer-events:auto;cursor:pointer}
.drawing-measure-svg .saved-measurement-label rect{stroke:rgba(225,29,72,.2);fill:rgba(255,255,255,.025)}
/* The rubber band: the pending measurement under the cursor, drawn into its own
   layer so a mousemove never rebuilds the sheet. Dashed, so a line being aimed
   never reads as one already taken. */
.drawing-measure-preview{z-index:1}
.drawing-measure-preview .preview-line{stroke:var(--warn);stroke-width:1.3;stroke-dasharray:7 5;vector-effect:non-scaling-stroke}
.drawing-measure-preview .preview-close{stroke:rgba(180,83,9,.55);stroke-width:1;stroke-dasharray:3 4;vector-effect:non-scaling-stroke}
.drawing-measure-preview .preview-area{fill:rgba(180,83,9,.07);stroke:var(--warn);stroke-width:1.3;stroke-dasharray:7 5;vector-effect:non-scaling-stroke}
.drawing-measure-preview .preview-cursor{fill:var(--warn);stroke:#fff;stroke-width:1;vector-effect:non-scaling-stroke}
.drawing-measure-preview .preview-cursor.on-point{fill:#1d6fb8;stroke-width:1.6}
.drawing-measure-preview .preview-label rect{fill:rgba(255,255,255,.92);stroke:rgba(180,83,9,.35);stroke-width:.7}
/* The real loupe: what is under the finger, magnified, while a point is being
   dragged. Fixed to the viewport so the stage scrolling and the camera
   transform cannot drag it out of position. */
/* The scale-check run strip and the register's scale summary: the shape of the
   job, and a way to work through it. */
.takeoff-read-labels{margin-top:10px;padding:10px 12px;background:var(--bg);border:1px dashed var(--line);border-radius:var(--r-sm);display:grid;gap:8px}
.takeoff-read-labels p{margin:0;font-size:var(--text-xs)}
.drawing-run-strip{position:fixed;left:50%;transform:translateX(-50%);bottom:calc(16px + env(safe-area-inset-bottom));z-index:128;display:flex;align-items:center;gap:10px;flex-wrap:wrap;justify-content:center;max-width:min(680px,94vw);background:var(--navy,#1E2A39);color:#fff;border-radius:var(--r-pill);padding:10px 16px;box-shadow:0 10px 26px rgba(10,24,40,.4);font-size:var(--text-sm);font-weight:600}
.drawing-run-strip button{min-height:var(--control-sm);padding:5px 12px}
.drawing-scale-summary{display:grid;gap:var(--space-2);margin:0 0 var(--space-4);padding:var(--space-3) var(--space-4);background:var(--bg);border:1px solid var(--line);border-radius:var(--r-md)}
.drawing-scale-summary>strong{font-size:var(--text-sm)}
.drawing-scale-stages{display:flex;flex-wrap:wrap;gap:8px}
.drawing-scale-stages .pill{cursor:pointer;border:1px solid transparent}
.drawing-scale-stages .pill.active{outline:2px solid var(--blue);outline-offset:1px}
.drawing-scale-summary p{margin:0}
@media(max-width:760px){.drawing-run-strip{left:var(--space-3);right:var(--space-3);transform:none;max-width:none}}
.drawing-loupe{position:fixed;z-index:130;width:132px;height:132px;border-radius:var(--r-pill);overflow:hidden;border:3px solid rgba(255,255,255,.95);box-shadow:0 10px 26px rgba(10,24,40,.38);background:#fff;display:none;pointer-events:none}
.drawing-loupe.visible{display:block}
.drawing-loupe canvas{display:block;width:132px;height:132px}
.drawing-loupe-cross{position:absolute;inset:0;border-radius:var(--r-pill);box-shadow:inset 0 0 0 1px rgba(17,38,65,.25)}
.drawing-loupe-cross:before,.drawing-loupe-cross:after{content:"";position:absolute;background:rgba(180,83,9,.9)}
.drawing-loupe-cross:before{left:50%;top:18px;width:1px;height:96px;transform:translateX(-50%);background:linear-gradient(to bottom, rgba(180,83,9,.9) 0 38%, transparent 38% 62%, rgba(180,83,9,.9) 62% 100%)}
/* The status block, ranked instead of stacked: the facts in a compact grid so
   the numbers can be found at a glance, and everything that is NOT drawn on the
   current view folded into one line that opens on demand. */
.drawing-result-facts{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:4px 14px;margin:6px 0 0}
.drawing-result-facts>div{display:flex;justify-content:space-between;align-items:baseline;gap:8px;min-width:0;padding:3px 0;border-bottom:1px dotted #dce7f1}
.drawing-result-facts dt{color:var(--muted);font-size:var(--text-xs);font-weight:600;text-transform:uppercase;letter-spacing:.1em;white-space:nowrap}
.drawing-result-facts dd{margin:0;color:var(--ink);font-size:var(--text-sm);font-weight:700;text-align:right;overflow-wrap:anywhere}
.drawing-result-notdrawn{margin-top:8px;background:#eef6fc;border:1px solid #d3e4f2;border-radius:var(--r-sm);padding:6px 8px}
.drawing-result-notdrawn>summary{cursor:pointer;color:#33536e;font-size:var(--text-xs);font-weight:700;list-style:none}
.drawing-result-notdrawn>summary::-webkit-details-marker{display:none}
.drawing-result-notdrawn ul{margin:6px 0 0;padding-left:18px;display:grid;gap:4px}
.drawing-result-notdrawn li{color:#33536e;font-size:var(--text-xs);font-weight:600}
.drawing-tool-finish{grid-column:1/-1;min-height:var(--control-md);font-weight:700;width:100%}
.drawing-fullscreen .drawing-tool-rail .drawing-tool-finish{flex-shrink:0;width:auto;min-width:150px}
.drawing-measure-preview .preview-label text{fill:#5f2600;text-anchor:middle;dominant-baseline:middle;font-size:var(--text-xs);font-weight:700;stroke:none}
.drawing-measure-svg .saved-measurement-label text{fill:var(--bad);paint-order:stroke;stroke:rgba(255,255,255,.9);stroke-width:3px;stroke-linejoin:round}
.drawing-measure-svg .saved-measurement-label.untrusted rect{stroke:rgba(180,83,9,.22);fill:rgba(255,247,237,.035)}
.drawing-measure-svg .saved-measurement-label.untrusted text{fill:#7c2d12}
.drawing-measure-point{position:absolute;z-index:3;width:24px;height:24px;border-radius:var(--r-pill);transform:translate(-50%,-50%);display:grid;place-items:center;padding:0;border:2px solid rgba(255,255,255,.86);color:white;font-size: var(--text-xs);font-weight:700;box-shadow:var(--shadow-card);cursor:pointer}
.drawing-measure-point.calibration{background:rgba(29,111,184,.72)}
.drawing-measure-point.verification{background:rgba(20,122,70,.72)}
.drawing-measure-point.measurement{width:22px;height:22px;background:radial-gradient(circle at center, rgba(255,255,255,.06) 0 45%, rgba(180,83,9,.76) 47% 100%);border:2px solid rgba(180,83,9,.88);color:transparent;box-shadow:var(--shadow-card)}
.drawing-measure-point.measurement::after{content:attr(data-point-label);position:absolute;right:-14px;top:-14px;width:19px;height:19px;border-radius:var(--r-pill);background:var(--warn);color:white;border:2px solid rgba(255,255,255,.88);display:grid;place-items:center;font-size: var(--text-xs);font-weight:700;box-shadow:var(--shadow-card)}
.drawing-measure-point.selected{width:34px;height:34px;background:transparent!important;color:transparent;border:3px solid #ffe08a;outline:2px solid rgba(17,38,65,.75);outline-offset:2px;box-shadow:var(--shadow)}
.drawing-measure-point.selected::after{content:attr(data-point-label);position:absolute;right:-15px;top:-15px;width:22px;height:22px;border-radius:var(--r-pill);background:#112641;color:white;border:2px solid white;display:grid;place-items:center;font-size: var(--text-xs);font-weight:700;box-shadow:var(--shadow-card)}
.drawing-measure-point.measurement.selected{border-color:#ffe08a;background:rgba(255,255,255,.02)!important}
.drawing-measure-point.measurement.selected::after{background:var(--warn)}
.drawing-count-point{position:absolute;z-index:3;width:22px;height:22px;border-radius:var(--r-pill);transform:translate(-50%,-50%);display:grid;place-items:center;padding:0;border:2px solid white;background:var(--bad);color:white;font-size: var(--text-xs);font-weight:700;box-shadow:var(--shadow-card);cursor:pointer}
.drawing-count-point.selected{outline:3px solid #ffe08a;outline-offset:2px}
.drawing-point-loupe{position:absolute;z-index:2;width:96px;height:96px;border-radius:var(--r-pill);transform:translate(-50%,-50%);border:2px solid rgba(255,224,138,.9);background:transparent;box-shadow:var(--shadow-soft);pointer-events:none}
.drawing-point-loupe:before,.drawing-point-loupe:after{content:"";position:absolute;opacity:.9}
.drawing-point-loupe:before{left:50%;top:8px;width:1px;height:80px;transform:translateX(-50%);background:linear-gradient(to bottom, rgba(17,38,65,.7) 0 41%, transparent 41% 59%, rgba(17,38,65,.7) 59% 100%)}
.drawing-point-loupe:after{top:50%;left:8px;width:80px;height:1px;transform:translateY(-50%);background:linear-gradient(to right, rgba(17,38,65,.7) 0 41%, transparent 41% 59%, rgba(17,38,65,.7) 59% 100%)}
.drawing-point-loupe span{position:absolute;inset:27px;border:1px dashed rgba(17,38,65,.48);border-radius:var(--r-pill)}
.drawing-annotation{position:absolute;z-index:2;transform:translate(-50%,-50%);background:rgba(255,255,255,.82);border:3px solid currentColor;border-radius:var(--r-xs);color:#1d6fb8;font-size: var(--text-sm);font-weight:700;line-height:var(--leading-tight);padding:5px;box-shadow:var(--shadow-card);cursor:pointer;display:grid;place-items:center;text-align:center;white-space:normal}
.drawing-annotation span{pointer-events:none}
.drawing-annotation.arrow{width:72px!important;height:28px!important;border-width:0;background:transparent;font-size:var(--text-2xl);text-shadow:0 1px 2px rgba(255,255,255,.9),0 2px 7px rgba(0,0,0,.35)}
.drawing-annotation.box{background:rgba(255,255,255,.08);border-style:dashed}
.drawing-annotation.cloud{border-radius:var(--r-pill);background:rgba(255,255,255,.9)}
.drawing-annotation.selected{outline:4px solid #ffe08a;outline-offset:3px}
.drawing-pin{position:absolute;z-index:3;transform:translate(-50%,-100%);display:grid;grid-template-columns:28px auto;align-items:center;gap:6px;max-width:190px;border:2px solid white;border-radius:var(--r-pill);background:#112641;color:white;padding:4px 9px 4px 4px;box-shadow:var(--shadow-soft);font-size: var(--text-xs);font-weight:700;cursor:pointer}
/* Audit LM-24: a pin is drawn 36x31 but presses as at least 44x44. */
.drawing-pin::before{content:"";position:absolute;left:50%;top:50%;min-width:100%;min-height:100%;width:var(--control-sm);height:var(--control-sm);transform:translate(-50%,-50%)}
.drawing-pin strong{display:grid;place-items:center;width:28px;height:28px;border-radius:var(--r-pill);background:white;color:#112641}
.drawing-pin span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:0;opacity:0;transition:max-width var(--motion) var(--ease-out),opacity var(--motion) var(--ease-out),margin var(--motion) var(--ease-out);margin-left:0}
/* The marker is always visible; the words appear on hover, on selection, or
   when pin labels are switched on. Twenty permanently-labelled pins hide the
   drawing they are pinned to. */
.drawing-pin:hover span,.drawing-pin.selected span,.drawing-pin.labelled span{max-width:150px;opacity:1;margin-left:2px}
.drawing-pin:hover{z-index:6}
.drawing-pin strong{font-size:var(--text-base);line-height:var(--leading-none)}
.drawing-pin.task{background:#1d6fb8}
.drawing-pin.photo{background:var(--good)}
.drawing-pin.file{background:#6b7280}
.drawing-pin.link{background:#6d28d9}
.drawing-pin.selected{outline:4px solid #ffe08a;outline-offset:3px}
.drawing-pin.carried{background:var(--bad);border-color:#fde68a}
.drawing-pin em{font-style:normal;background:#fde68a;color:#78350f;border-radius:var(--r-pill);padding:2px 6px;font-size: var(--text-xs);line-height:var(--leading-none)}
.drawing-tool-shell{display:grid;grid-template-columns:minmax(0,1fr);gap:12px;align-items:start;width:100%;min-width:0;max-width:100%}
.drawing-measure-tool{margin-top:0;border-top:0;padding-top:0;width:100%;min-width:0;max-width:100%}
.drawing-measure-tool h4{margin-bottom:6px}
.drawing-measure-tool input,.drawing-measure-tool select,.drawing-measure-tool button{min-width:0}
.drawing-tool-head{display:grid;grid-template-columns:1fr;gap:10px;align-items:start}
.measure-control-grid{display:grid;grid-template-columns:1fr 1fr;gap:8px;margin-top:10px}
.measure-control-grid button{grid-column:1/-1}
.mode-panel{display:none;margin-top:10px}
.mode-panel.active{display:block}
.always-visible-controls{border:1px solid #e3ebf4;border-radius:var(--r-md);background:var(--panel);padding:var(--space-2)}
.drawing-zone-details{margin-top:10px;border:1px solid #e3ebf4;border-radius:var(--r-md);background:var(--panel);overflow:hidden}
.drawing-zone-details summary{cursor:pointer;list-style:none;padding:10px 12px;color:var(--blue);font-size: var(--text-sm);font-weight:700}
.drawing-zone-details summary::-webkit-details-marker{display:none}
.drawing-zone-details summary:after{content:"+";float:right}
.drawing-zone-details[open] summary:after{content:"-"}
.drawing-zone-details .always-visible-controls{border:0;border-top:1px solid #e3ebf4;border-radius:0;margin-top:0}
.measure-zoom-row{display:grid;grid-template-columns:44px 52px 58px 44px minmax(54px,1fr);gap:7px;align-items:center;margin-top:10px;background:var(--bg);border:1px solid #e3ebf4;border-radius:var(--r-md);padding:var(--space-2)}
.measure-zoom-row.compact{margin-top:0}
.measure-zoom-row button{padding:var(--space-2) var(--space-2);min-height:var(--control-md);white-space:nowrap}
.measure-zoom-row small{grid-column:1/-1;color:var(--muted);font-weight:700;line-height:var(--leading-tight)}
.drawing-tool-button{min-width:0}
.measure-mode-row{display:grid;grid-template-columns:repeat(auto-fit,minmax(92px,1fr));gap:7px;margin-top:10px;background:#eef4fa;border:1px solid #dce7f1;border-radius:var(--r-md);padding:7px}
.measure-mode-row button{min-height:var(--control-md);padding:8px 6px;box-shadow:none;font-size: var(--text-sm);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.measure-mode-row button.active{background:var(--blue);color:white;border-color:var(--blue)}
.drawing-quick-measure button.active{background:var(--blue);border-color:var(--blue);color:white}
.measure-mode-row button:disabled{opacity:.55;cursor:not-allowed;filter:none}
.drawing-quick-scale,.drawing-quick-measure{display:grid;grid-template-columns:auto minmax(82px,1fr) minmax(78px,.65fr) minmax(92px,.8fr) auto;gap:7px;align-items:center;margin-top:10px;border:1px solid #dce7f1;background:var(--panel);border-radius:var(--r-md);padding:var(--space-2)}
.drawing-quick-scale strong{color:var(--blue);font-size: var(--text-xs);text-transform:uppercase;letter-spacing:.1em}
.drawing-quick-scale input,.drawing-quick-scale select,.drawing-quick-measure input{min-height:var(--control-md);padding:8px 10px}
.drawing-quick-scale button,.drawing-quick-measure button{min-height:var(--control-md);padding:8px 10px;white-space:nowrap}
.drawing-quick-measure{grid-template-columns:1fr 1fr;background:#f7fbf8;border-color:#c7dfcf}
.drawing-quick-measure input{grid-column:1/-1}
.drawing-scale-manager{margin-top:10px;border:1px solid #dce7f1;border-left:5px solid var(--warn);background:var(--status-warning-surface);border-radius:var(--r-md);padding:var(--space-3);display:grid;gap:10px;width:100%;min-width:0;max-width:100%}
.drawing-scale-manager.good{border-left-color:var(--good);background:#f7fbf8}
.drawing-scale-manager.bad{border-left-color:var(--bad);background:var(--status-critical-surface)}
.drawing-scale-manager .alert{display:grid;gap:4px;margin-bottom:0}
.drawing-scale-manager-head{display:grid;grid-template-columns:minmax(150px,1fr) auto;gap:10px;align-items:start}
.drawing-scale-manager-head h4{font-size:var(--text-base);margin:2px 0 0}
.drawing-scale-manager-head .button-row{justify-content:flex-end}
.auto-read-banner{display:flex;gap:14px;align-items:center;justify-content:space-between;flex-wrap:wrap;background:linear-gradient(135deg,var(--blue),var(--blue-2));color:#fff;border-radius:var(--r-md);padding:14px 16px}
.auto-read-banner-text{display:grid;gap:2px;min-width:180px;flex:1 1 220px}
.auto-read-banner-text strong{font-size:var(--text-base)}
.auto-read-banner-text span{font-size: var(--text-sm);opacity:.92;line-height:var(--leading-snug)}
.auto-read-cta{flex:0 0 auto;background:#fff;color:var(--blue);border:0;border-radius:var(--r-md);padding:var(--space-3) var(--space-5);font-weight:700;font-size: var(--text-base);min-height:48px;cursor:pointer;box-shadow:var(--shadow-soft)}
.auto-read-cta:hover{background:#f0f6ff}
.auto-read-cta:active{transform:translateY(1px)}
.auto-read-steps{display:grid;gap:8px;margin:6px 0}
.auto-read-step{display:flex;gap:10px;align-items:flex-start;background:var(--soft);border-radius:var(--r-md);padding:10px 12px}
.auto-read-step[data-state="ok"]{background:#f0f8f3}
.auto-read-step[data-state="warn"]{background:#fff7e9}
.auto-read-step[data-state="bad"]{background:#fdeeee}
.auto-read-dot{font-size:var(--text-lg);line-height:var(--leading-tight)}
.auto-read-step small{display:block;color:var(--muted);font-size: var(--text-sm);line-height:var(--leading-snug)}
.auto-read-result{border-radius:var(--r-md);padding:var(--space-4);margin-bottom:12px;display:grid;gap:6px}
.auto-read-result.good{background:#f0f8f3;border:1px solid #bfe3cd}
.auto-read-result.warn{background:#fff7e9;border:1px solid #f0d9a8}
.auto-read-result.bad{background:#fdeeee;border:1px solid #f0c4c4}
.auto-read-result h3{margin:2px 0 0;font-size:var(--text-lg)}
.auto-read-result p{margin:0;color:var(--ink);line-height:var(--leading-snug)}
.scale-status-summary{margin:0;color:var(--ink);font-weight:700;line-height:var(--leading-snug)}
.drawing-scale-details summary{cursor:pointer;color:var(--blue);font-weight:700;font-size: var(--text-sm)}
.drawing-scale-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:8px}
.drawing-scale-grid span{background:white;border:1px solid #e3ebf4;border-radius:var(--r-sm);padding:9px;display:grid;gap:3px}
.drawing-scale-grid strong{font-size: var(--text-sm);color:var(--ink)}
.drawing-scale-grid small{font-size: var(--text-xs);color:var(--muted);font-weight:700}
.drawing-scale-ai-review,.drawing-scale-ai-empty{display:grid;gap:9px;padding:11px;border:1px solid #cfe0ee;border-radius:var(--r-sm);background:#f5f9fc}
.drawing-scale-ai-review-head{display:flex;justify-content:space-between;gap:10px;align-items:flex-start}
.drawing-scale-ai-review-head>div{display:grid;gap:2px}.drawing-scale-ai-review-head small{color:var(--muted);font-weight:700}
.drawing-scale-ai-review p{margin:0;line-height:var(--leading-snug)}
.drawing-scale-ai-facts{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:7px}
.drawing-scale-ai-facts span{display:grid;gap:2px;min-width:0;padding:var(--space-2);border:1px solid #dce7f1;border-radius:var(--r-sm);background:white}
.drawing-scale-ai-facts strong{font-size: var(--text-sm);overflow-wrap:anywhere}.drawing-scale-ai-facts small{font-size: var(--text-xs);color:var(--muted);font-weight:700}
.drawing-scale-ai-review details summary{cursor:pointer;color:var(--blue);font-weight:700}.drawing-scale-ai-review ul{margin:8px 0 0;padding-left:20px}
.drawing-scale-ai-empty{color:var(--muted)}.drawing-scale-ai-empty strong{display:block;color:var(--ink)}
.measure-nudge-pad{display:grid;grid-template-columns:repeat(3,1fr);gap:7px;margin-top:10px}
.measure-nudge-pad select{grid-column:1/-1}
.measure-nudge-pad button{min-height:var(--control-md);padding:8px 9px}
.measure-nudge-pad button:nth-of-type(1){grid-column:2}
.measure-nudge-pad button[data-drawing-delete-selected-point]{grid-column:1/-1}
.drawing-measure-result{display:grid;gap:4px;margin-top:10px;background:var(--bg);border:1px solid #e3ebf4;border-radius:var(--r-md);padding:10px;color:var(--ink)}
.drawing-measure-result span{color:var(--muted);font-weight:700}
.drawing-measure-result .selected-item-status{color:var(--bad);background:#fff1f2;border:1px solid #fecdd3;border-radius:var(--r-sm);padding:6px 8px;font-weight:700}
.drawing-measure-result .selected-item-status.muted-status{color:#33536e;background:#eef6fc;border-color:#d3e4f2}
.drawing-annotation-tool{margin-top:14px;border-top:1px solid var(--line);padding-top:14px}
.drawing-side-lists{display:grid;gap:12px}
.drawing-meta-details{margin-top:12px;border:1px solid #e3ebf4;border-radius:var(--r-md);background:var(--panel);overflow:hidden}
.drawing-meta-details summary{cursor:pointer;padding:11px 12px;font-weight:700;color:var(--blue)}
.drawing-meta-details .clean-list{padding:10px;margin:0}
.drawing-annotation-list{display:grid;gap:8px;margin-top:10px}
.drawing-revision-stack{display:grid;gap:8px;padding:10px}
.revision-stack-row{display:flex;justify-content:space-between;gap:10px;align-items:center;border:1px solid #e3ebf4;background:#fff;border-radius:var(--r-sm);padding:9px}
.revision-stack-row span{display:grid;gap:2px}
.revision-stack-row small{color:var(--muted);font-weight:700}
.revision-stack-row .revision-stack-actions{display:flex;grid-auto-flow:column;align-items:center;justify-content:end;gap:7px}
.drawing-issue-control{display:grid;gap:10px;padding:var(--space-3);border-top:1px solid #e3ebf4;background:#fff}
.drawing-issue-control .panel-title{margin:0}
.drawing-issue-control .panel-title h4{margin:0;color:var(--ink)}
.drawing-issue-control .clean-list{padding:0;margin:0}
.drawing-issue-control .button-row{margin:0}
.drawing-recipient-list{display:grid;grid-template-columns:repeat(auto-fit,minmax(210px,1fr));gap:7px}
.drawing-recipient-list span{display:grid;gap:2px;border:1px solid #dce7f0;background:var(--bg);border-radius:var(--r-sm);padding:8px 9px}
.drawing-recipient-list small{color:var(--muted);font-weight:700}
.drawing-comparison-panel{margin:12px 0;border:1px solid #cedde9;border-radius:var(--r-sm);background:#fff;overflow:hidden}
.drawing-comparison-panel>summary{cursor:pointer;padding:12px 14px;background:#f4f8fb;color:var(--blue);font-weight:700}
.drawing-comparison-controls{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:10px 12px;border-top:1px solid #dce7f0;border-bottom:1px solid #dce7f0}
.drawing-comparison-controls label{display:flex;align-items:center;gap:8px;color:var(--muted);font-size: var(--text-xs);font-weight:700}
.drawing-comparison-controls input[type="range"]{width:150px}
.drawing-comparison-view{padding:var(--space-3);background:#eaf0f5}
.drawing-comparison-view canvas{display:block;width:100%;height:auto;background:#fff;border:1px solid #b9cad8}
.drawing-comparison-side{display:none;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px}
.drawing-comparison-side figure{margin:0;min-width:0}
.drawing-comparison-side figcaption{margin:0 0 6px;color:var(--ink);font-size: var(--text-xs);font-weight:700}
.drawing-comparison-view.side-mode .drawing-comparison-side{display:grid}
.drawing-comparison-view.side-mode .drawing-comparison-overlay{display:none}
.drawing-comparison-view.overlay-mode .drawing-comparison-overlay{display:block}
.drawing-comparison-view.overlay-mode .drawing-comparison-side{display:none}
.drawing-comparison-status{padding:10px 12px;border-top:1px solid #dce7f0;color:var(--muted);font-size: var(--text-xs);font-weight:700;line-height:var(--leading-snug)}
.drawing-comparison-status.error{color:var(--bad);background:var(--status-critical-surface)}
.drawing-schedule-actions{display:flex;justify-content:flex-end;margin-bottom:8px}
.drawing-schedule-subtotals{display:grid;grid-template-columns:repeat(auto-fit,minmax(120px,1fr));gap:7px;margin-bottom:8px}
.drawing-schedule-subtotals span{display:grid;gap:2px;border:1px solid #e3ebf4;background:#fff;border-radius:var(--r-sm);padding:var(--space-2)}
.drawing-schedule-subtotals strong{font-size: var(--text-sm);color:var(--ink)}
.drawing-schedule-subtotals small{color:var(--muted);font-weight:700}
.drawing-schedule-table{display:grid;gap:7px}
.annotation-row{display:grid;grid-template-columns:1fr auto;gap:8px;align-items:center;border:1px solid #e3ebf4;border-radius:var(--r-sm);background:var(--panel);padding:var(--space-2)}
.annotation-row.selected-row{border-color:#f7b4c2;background:#fff7f9;box-shadow:inset 4px 0 0 var(--bad)}
.annotation-row.untrusted-row{border-color:#f1d08d;background:var(--status-warning-surface);box-shadow:inset 4px 0 0 var(--warn)}
.annotation-row span{font-weight:700;font-size: var(--text-sm)}
.annotation-row span small{display:block;color:var(--muted);font-weight:700;margin-top:2px}
.annotation-row.drawing-pin-row{box-shadow:inset 4px 0 0 #1d6fb8}
.annotation-row.drawing-pin-row.photo{box-shadow:inset 4px 0 0 var(--good)}
.annotation-row.drawing-pin-row.file{box-shadow:inset 4px 0 0 #6b7280}
.annotation-row.drawing-pin-row.link{box-shadow:inset 4px 0 0 #6d28d9}
.pin-type-label{display:inline-block!important;width:max-content;margin:0 0 5px 0!important;border-radius:var(--r-pill);padding:3px 7px;background:#eaf3fb;color:#17466f!important;font-size: var(--text-xs)!important;font-weight:600!important;letter-spacing:.1em;text-transform:uppercase}
.pin-type-label.photo{background:#e9f7ef;color:var(--good)!important}
.pin-type-label.file{background:var(--surface-sunken);color:var(--muted)!important}
.pin-type-label.link{background:#f3e8ff;color:#6d28d9!important}
.compact-note{margin:0;font-size: var(--text-xs)}
.button-like{display:inline-flex;align-items:center;justify-content:center;text-decoration:none;min-height:var(--control-md);border-radius:var(--r-sm);padding:var(--space-2) var(--space-2);font-weight:700}
.row-actions{display:flex;gap:6px;align-items:center;justify-content:flex-end;flex-wrap:wrap}
button.subtle{box-shadow:none;border:1px solid transparent}
.danger-text{color:var(--bad)!important}
@media(max-width:1100px){.drawing-viewer-grid{grid-template-columns:minmax(0,1fr)}.drawing-meta{position:static;max-height:none;overflow:visible}.drawing-tool-shell,.drawing-tool-head{grid-template-columns:minmax(0,1fr)}.drawing-measure-stage{max-height:72vh;min-height:560px}.drawing-stage-toolbar{max-width:calc(100% - 20px);flex-wrap:wrap}.drawing-stage-toolbar span{white-space:normal}.measure-mode-row{grid-template-columns:repeat(3,minmax(0,1fr))}.drawing-scale-manager-head{grid-template-columns:1fr}.drawing-scale-manager-head .button-row{justify-content:stretch}.drawing-scale-manager-head .button-row>*{flex:1 1 160px}.drawing-scale-grid{grid-template-columns:1fr 1fr}.drawing-scale-ai-facts{grid-template-columns:1fr 1fr}.drawing-quick-scale,.drawing-quick-measure{grid-template-columns:1fr 1fr}.drawing-quick-scale strong,.drawing-quick-measure input{grid-column:1/-1}.drawing-quick-measure button:last-child{grid-column:1/-1}.drawing-workspace-nav{grid-template-columns:1fr}.drawing-workspace-nav button{min-height:56px}.drawing-workflow-strip,.programme-workflow-strip{display:flex;overflow-x:auto}.drawing-workflow-strip span,.programme-workflow-strip span{flex:0 0 150px}.programme-workflow-strip{position:static}.programme-board-controls{justify-content:stretch}.programme-board-controls label{flex:1 1 180px}.programme-board-controls>button{flex:1 1 auto}.drawing-comparison-controls{align-items:stretch;flex-direction:column}.drawing-comparison-controls label{justify-content:space-between}.drawing-comparison-side{grid-template-columns:1fr}}
@media(max-width:760px){
.drawing-viewer-panel:not([data-workspace-pane="plan"]) .drawing-viewer-grid>div:first-child{display:none}
.drawing-viewer-panel .drawing-meta{max-height:65dvh;overflow:auto}
.drawing-viewer-panel .drawing-workspace-panes{gap:4px}
.drawing-viewer-panel .drawing-workspace-panes button{padding:8px 4px;min-width:0}
/* 11 Sep review (C2): choosing a measure mode switches to the plan pane; the tool rail stays so the measurement can be finished or cancelled. */
}
@media(max-width:760px){.drawing-viewer-panel{padding:var(--space-3);overflow:hidden}.drawing-viewer-panel .panel-title{align-items:stretch}.drawing-viewer-panel .panel-title .button-row{width:100%;display:flex;flex-wrap:wrap;gap:6px}.drawing-viewer-panel .panel-title .button-row>*{width:auto;flex:1 1 auto;min-height:var(--control-md);justify-content:center;text-align:center}.drawing-measure-stage{min-height:68vh;max-height:78vh;border-radius:var(--r-md);-webkit-overflow-scrolling:touch}.drawing-page-spacer{margin:12px}.drawing-stage-toolbar{position:sticky;top:8px;left:8px;width:calc(100% - 16px);max-width:calc(100% - 16px);display:grid;grid-template-columns:repeat(3,minmax(0,1fr));margin:8px;background:rgba(255,255,255,.98)}.drawing-stage-toolbar strong,.drawing-stage-toolbar span{grid-column:1/-1}.drawing-stage-toolbar button{width:100%;min-width:0}.measure-mode-row{grid-template-columns:repeat(2,minmax(0,1fr))}.measure-zoom-row{grid-template-columns:repeat(3,minmax(0,1fr))}.measure-zoom-row small,.measure-zoom-row .pill{grid-column:1/-1}.drawing-quick-scale,.drawing-quick-measure{grid-template-columns:1fr}.drawing-scale-grid,.drawing-scale-ai-facts{grid-template-columns:1fr}.drawing-pdf-status{left:8px;right:8px;max-width:none}.drawing-meta-details summary,.drawing-zone-details summary{min-height:48px;display:flex;align-items:center;justify-content:space-between}}
@media(max-width:760px){.drawing-scale-manager-head .button-row{display:grid;grid-template-columns:1fr;width:100%}.drawing-scale-manager-head .button-row>*{width:100%;min-width:0}.measure-mode-row{grid-template-columns:repeat(2,minmax(0,1fr))}.measure-mode-row button{white-space:normal;text-overflow:clip;line-height:var(--leading-tight)}.drawing-scale-grid,.drawing-scale-ai-facts,.drawing-quick-scale,.drawing-quick-measure{grid-template-columns:1fr}.drawing-quick-scale strong,.drawing-quick-measure input,.drawing-quick-measure button:last-child{grid-column:1}}
.drive-shell{display:grid;gap:16px}
.drive-head{background:var(--bg);border:1px solid #e3ebf4;border-radius:var(--r-md);padding:var(--space-4);display:flex;justify-content:space-between;gap:var(--space-4);align-items:flex-start}
.drive-head p{color:var(--muted);font-weight:700;line-height:var(--leading-snug)}
.drive-section-list{display:grid;gap:var(--space-2)}
.drive-section-row{display:grid;grid-template-columns:auto minmax(220px,1fr) minmax(220px,auto);gap:var(--space-2);align-items:center;border:1px solid #e4edf5;background:white;border-radius:var(--r-md);padding:var(--space-2) var(--space-3)}
.drive-section-row strong,.drive-section-row small{display:block}
.drive-section-row small{color:var(--muted);font-weight:700;margin-top:2px}
.drive-section-row.missing{background:#fff8f4;border-color:#efc6c6}
.drive-section-row.found{background:#f7fbf8;border-color:#c7dfcf}
.drive-section-tree{grid-column:1 / -1;margin-top:2px;font-size: var(--text-sm)}
.drive-section-tree.muted-note{color:var(--muted);font-weight:700;font-size: var(--text-xs)}
.drive-section-tree>summary{cursor:pointer;color:var(--blue);font-weight:700;user-select:none}
.drive-folder-tree{list-style:none;margin:6px 0 2px 6px;padding-left:12px;border-left:2px solid #dbe6f0;display:grid;gap:4px}
.drive-folder-tree li{min-width:0}
.drive-folder-tree summary{cursor:pointer;display:flex;gap:8px;align-items:center;font-weight:700;user-select:none}
.drive-folder-tree .drive-folder-leaf{display:flex;gap:8px;align-items:center;font-weight:700;padding-left:14px}
.drive-folder-tree .evidence-open-link{font-size: var(--text-xs)}
.drive-node-actions{display:inline-flex;gap:6px;flex-wrap:wrap;margin-left:auto}
.drive-node-actions-row{display:flex;justify-content:flex-end;padding:2px 0 4px}
.mini-link{background:none;border:1px solid #dbe6f0;border-radius:var(--r-sm);padding:1px 7px;font-size: var(--text-xs);font-weight:700;color:var(--blue);cursor:pointer}
.mini-link:hover{background:#eef4fa}
.drive-folder-files{list-style:none;margin:4px 0 4px 6px;padding-left:12px;border-left:2px dashed #e4dcc8;display:grid;gap:3px}
.drive-file-row{display:flex;gap:8px;align-items:center;font-weight:700;font-size: var(--text-xs)}
.drive-folder-tree summary .drive-node-actions,.drive-folder-leaf .drive-node-actions{margin-left:8px}
.doc-browser{margin:var(--space-2) 0 var(--space-4)}
.doc-browser-toolbar{display:flex;gap:12px;align-items:center;justify-content:space-between;flex-wrap:wrap;margin-bottom:10px}
.doc-crumbs{display:flex;gap:4px;align-items:center;flex-wrap:wrap;font-weight:700}
.doc-crumb{background:none;border:none;color:var(--blue);cursor:pointer;font-weight:700;padding:2px 4px;border-radius:var(--r-xs)}
.doc-crumb:hover{background:#eef4fa}
.doc-crumb-sep{color:var(--muted)}
.doc-search{min-width:220px;border:1px solid #dbe6f0;border-radius:var(--r-sm);padding:7px 12px;font-weight:700}
.doc-folder-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(180px,1fr));gap:10px;margin:8px 0 14px}
.doc-folder-tile{display:grid;gap:3px;text-align:left;background:white;border:1px solid #e3ebf4;border-radius:var(--r-md);padding:12px 14px;cursor:pointer;box-shadow:var(--shadow-soft)}
.doc-folder-tile:hover{border-color:var(--blue);background:#f7fafd}
.doc-folder-glyph{font-size:var(--text-xl);line-height:var(--leading-none)}
.doc-folder-tile strong{font-size: var(--text-sm)}
.doc-folder-tile small{color:var(--muted);font-weight:700}
.doc-file-list{display:grid;gap:6px}
.doc-file-row{display:flex;gap:10px;align-items:center;background:white;border:1px solid #e8eef5;border-radius:var(--r-sm);padding:var(--space-2) var(--space-3)}
.doc-file-icon{font-size: var(--text-xs);font-weight:700;color:var(--blue);border:1px solid #dbe6f0;border-radius:var(--r-xs);padding:2px 5px;flex-shrink:0}
.doc-file-name{font-weight:700;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0}
.doc-file-row small{color:var(--muted);font-weight:700;flex-shrink:0}
.doc-file-path{color:var(--muted);font-weight:700;margin:-4px 0 2px 34px}
.doc-extra{margin-top:12px}
.doc-extra>summary{cursor:pointer;font-weight:700;color:var(--blue);user-select:none}
@media(max-width:760px){.doc-folder-grid{grid-template-columns:repeat(auto-fill,minmax(140px,1fr))}.doc-browser-toolbar{flex-direction:column;align-items:stretch}.doc-search{min-width:0;width:100%}}
.drive-section-actions{display:flex;gap:8px;align-items:center;justify-content:flex-end;flex-wrap:wrap}
.drive-root-connector{margin-bottom:14px}
.drive-root-form{display:grid;grid-template-columns:minmax(260px,1fr) auto auto;gap:10px;align-items:end}
.drive-root-form .field{min-width:0}
.drive-browser{margin:14px 0;border-radius:var(--r-sm);overflow:hidden}
.drive-browser-toolbar{display:grid;grid-template-columns:minmax(280px,1fr) minmax(170px,220px) auto auto auto;gap:8px;align-items:end;padding:12px 0}
.drive-browser-toolbar .field{min-width:0;margin:0}
.drive-browser-breadcrumbs{display:flex;align-items:center;gap:4px;min-height:var(--control-md);padding:7px 9px;border:1px solid #dbe6f0;background:#f6f9fc;overflow-x:auto;white-space:nowrap}
.drive-browser-breadcrumbs button{min-height:var(--control-md);padding:6px 9px;border:0;background:transparent;color:var(--blue);font-weight:700}
.drive-browser-breadcrumbs button:hover{background:#e8f1f8}
.drive-browser-breadcrumbs span{color:var(--muted);font-weight:700}
.drive-browser-results{padding-top:10px}
.drive-browser-folders{display:grid;grid-template-columns:repeat(auto-fill,minmax(220px,1fr));gap:8px;margin-bottom:10px}
.drive-folder-card{display:grid;gap:3px;min-height:68px;padding:10px 12px;text-align:left;border:1px solid #cad9e6;border-radius:var(--r-sm);background:#f7fafc;color:var(--ink)}
.drive-folder-card:hover{border-color:#3e79a9;background:#edf5fb}
.drive-folder-card strong{font-size:var(--text-base)}
.drive-folder-card small{color:var(--muted);font-size: var(--text-xs);line-height:var(--leading-tight);overflow-wrap:anywhere}
.drive-file-list{border:1px solid #dbe6f0;border-radius:var(--r-sm);overflow:hidden;background:#fff}
.drive-file-row{display:grid;grid-template-columns:96px minmax(0,1fr) auto;gap:12px;align-items:center;min-height:64px;padding:9px 11px;border-bottom:1px solid #e5edf4}
.drive-file-row:last-child{border-bottom:0}
.drive-file-kind{font-size: var(--text-xs);font-weight:600;color:#265f8b;text-transform:uppercase;letter-spacing:.1em}
.drive-file-detail{min-width:0}
.drive-file-detail strong,.drive-file-detail small{display:block}
.drive-file-detail strong{overflow-wrap:anywhere}
.drive-file-detail small{margin-top:3px;color:var(--muted);font-size: var(--text-xs);overflow-wrap:anywhere}
.drive-file-actions{display:flex;gap:7px;align-items:center;justify-content:flex-end}
.drive-file-actions button,.drive-file-actions .evidence-open-link{min-height:var(--control-md)}
.drive-browser-limit{margin:10px 0 0}
@media(max-width:1100px){
  .drive-browser-toolbar{grid-template-columns:minmax(0,1fr) minmax(160px,220px);align-items:end}
  .drive-browser-toolbar>button{width:100%}
}
@media(max-width:760px){
  .drive-browser-toolbar{grid-template-columns:1fr}
  .drive-browser-folders{grid-template-columns:1fr}
  .drive-file-row{grid-template-columns:70px minmax(0,1fr)}
  .drive-file-actions{grid-column:1/-1;justify-content:stretch}
  .drive-file-actions>*{flex:1 1 0;text-align:center}
}
.drive-mapping-card p{color:var(--muted);font-weight:700;margin:var(--space-1) 0 var(--space-2)}
.readiness-strip{display:grid;grid-template-columns:repeat(6,minmax(130px,1fr));gap:10px;margin:0 0 18px}
.readiness-item{background:white;border:1px solid #e3ebf4;border-left:5px solid #6f8ba8;border-radius:var(--r-md);padding:12px 13px;box-shadow:var(--shadow-soft);display:grid;gap:5px}
.readiness-item strong{font-size: var(--text-sm);color:var(--blue)}
.readiness-item span{font-size:var(--text-base);font-weight:700;color:var(--ink)}
.readiness-item small{font-size: var(--text-xs);color:var(--muted);line-height:var(--leading-snug)}
.readiness-item.good{border-left-color:var(--good)}
.readiness-item.warn{border-left-color:var(--warn);background:var(--status-warning-surface)}
.readiness-item.bad{border-left-color:var(--bad);background:var(--status-critical-surface)}
.daily-director-cards .card{border-left:4px solid var(--blue)}
.programme-director-cards .card{border-left:4px solid var(--warn)}
.communication-director-cards .card{border-left:4px solid #6f8ba8}
.communication-shell{display:grid;gap:16px}
.communication-head{background:var(--bg);border:1px solid #e3ebf4;border-radius:var(--r-md);padding:18px}
.quick-capture{display:grid;grid-template-columns:1fr 1fr;gap:10px}
.quick-capture .wide,.quick-capture button,.quick-capture .schema-options{grid-column:1/-1}
.filter-chips{display:flex;gap:8px;flex-wrap:wrap}
.filter-chips button{background:white;color:var(--blue);border:1px solid var(--line);box-shadow:none}
.filter-chips button.active{background:var(--blue);color:white;border-color:var(--blue)}
.active-filter-strip{display:flex;align-items:center;justify-content:space-between;gap:var(--space-3);flex-wrap:wrap;background:#eef6ff;border:1px solid #bed5ec;color:#173d5d;border-radius:var(--r-md);padding:var(--space-3) var(--space-4);margin:calc(var(--space-1) * -1) 0 var(--space-4)}
.active-filter-strip strong{font-size:var(--text-base)}
.active-filter-strip span{display:flex;gap:8px;flex-wrap:wrap}
.active-filter-strip b{background:white;border:1px solid #d5e3f0;border-radius:var(--r-pill);padding:var(--space-2) var(--space-2);font-size: var(--text-xs)}
.feed-timeline{display:grid;gap:12px;position:relative}
.feed-item{display:grid;grid-template-columns:24px 1fr;gap:10px;background:white;border:1px solid #e3ebf4;border-radius:var(--r-md);padding:14px}
.feed-item.urgent{border-color:#e6b1a9;background:#fff7f5}
.feed-line{width:12px;height:12px;border-radius:50%;background:var(--blue);margin-top:6px;box-shadow:var(--shadow-card)}
.feed-item.urgent .feed-line{background:var(--bad);box-shadow:var(--shadow-card)}
.feed-item h4,.comm-card h4{margin:7px 0 5px;font-size:var(--text-base)}
.feed-item p,.comm-card p{color:var(--muted);font-size:var(--text-base);line-height:var(--leading-snug)}
.feed-item small{display:block;color:var(--muted);font-size: var(--text-xs);font-weight:700;margin-top:7px}
.programme-shell{display:grid;gap:16px}
.programme-head{background:var(--bg);border:1px solid #e3ebf4;border-radius:var(--r-md);padding:18px}
.programme-quick-start{display:grid;grid-template-columns:minmax(260px,1fr) auto;gap:22px;align-items:center;border-left:5px solid var(--blue);margin-bottom:16px}
.programme-quick-start h3{font-size:var(--text-xl);margin:2px 0 5px}
.programme-quick-start p:not(.eyebrow){color:var(--muted);line-height:var(--leading-snug);max-width:720px}
.programme-quick-start.is-empty{grid-template-columns:1fr}
.programme-start-options{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:10px}
.programme-start-options button{display:grid;grid-template-columns:34px 1fr;gap:10px;align-items:center;min-height:74px;padding:var(--space-3);text-align:left}
.programme-start-options button b{display:grid;place-items:center;width:30px;height:30px;border-radius:50%;background:rgba(255,255,255,.18)}
.programme-start-options button.secondary b{background:#e7f0f7;color:var(--blue)}
.programme-start-options button span{display:grid;gap:2px;min-width:0}
.programme-start-options button strong{font-size:var(--text-base)}
.programme-start-options button small{font-size: var(--text-xs);line-height:var(--leading-tight);opacity:.82}
.programme-gantt-focus{margin-bottom:16px;overflow:hidden}
.programme-gantt-focus>.panel-title{align-items:flex-start}
.programme-gantt-focus>.panel-title h3{font-size:var(--text-xl);margin:2px 0 4px}
.programme-gantt-focus>.panel-title button{flex:0 0 auto}
.programme-advanced-controls{padding:0;overflow:hidden;margin-top:16px}
.programme-advanced-controls>summary{display:flex;justify-content:space-between;align-items:center;gap:18px;min-height:72px;padding:16px 18px;cursor:pointer;list-style:none;background:#f7fafc}
.programme-advanced-controls>summary::-webkit-details-marker{display:none}
.programme-advanced-controls>summary span{display:grid;gap:3px}
.programme-advanced-controls>summary strong{font-size:var(--text-base);color:var(--ink)}
.programme-advanced-controls>summary small{color:var(--muted)}
.programme-advanced-controls>summary b{color:var(--blue);font-size: var(--text-sm)}
.programme-advanced-controls[open]>summary{border-bottom:1px solid var(--line)}
.programme-advanced-controls[open]>summary b{font-size:0}
.programme-advanced-controls[open]>summary b:after{content:'Hide controls';font-size: var(--text-sm)}
.programme-advanced-content{display:grid;gap:16px;padding:var(--space-4)}
.programme-advanced-content>.panel{margin:0;box-shadow:none}
.programme-status{background:white;border:1px solid var(--line);border-radius:var(--r-md);padding:var(--space-4);margin-bottom:16px;display:grid;gap:14px;box-shadow:var(--shadow-soft)}
.programme-status h4{font-size:var(--text-xl);margin-bottom:4px}
.programme-status p{color:var(--muted);font-size:var(--text-base)}
.programme-summary-grid .card{box-shadow:var(--shadow-soft)}
.gantt-list{display:grid;gap:8px;max-height:62vh;overflow-y:auto;overscroll-behavior:contain;padding-right:6px;scrollbar-gutter:stable}
.gantt-row{display:grid;grid-template-columns:210px 1fr 140px;gap:var(--space-2);align-items:center;padding:2px 0}
.gantt-label{display:grid;gap:var(--space-1);text-align:left;background:transparent;border:0;padding:0;color:inherit;box-shadow:none;cursor:pointer}
.gantt-label:hover strong{text-decoration:underline}
.gantt-label strong{font-size:var(--text-base)}
.gantt-label span,.gantt-row small{color:var(--muted);font-size: var(--text-xs);font-weight:700}
.gantt-track{height:30px;background:#edf3f8;border:1px solid var(--line);border-radius:var(--r-pill);position:relative;overflow:hidden}
.gantt-track span{position:absolute;top:4px;bottom:4px;border-radius:var(--r-pill);background:var(--good);display:flex;align-items:center;justify-content:flex-end;padding-right:8px;color:white;font-size: var(--text-xs);font-weight:700;min-width:42px}
.gantt-track span.amber{background:var(--warn)}
.gantt-track span.red{background:var(--bad)}
.programme-import-preview{background:var(--bg);border:1px solid var(--line);border-radius:var(--r-md);padding:14px;display:grid;gap:10px}
.programme-preview-table{display:grid;gap:8px;max-height:260px;overflow:auto}
.programme-preview-table div{background:white;border:1px solid #e3ebf4;border-radius:var(--r-md);padding:10px;display:grid;gap:4px}
.programme-preview-table strong{font-size:var(--text-base)}
.programme-preview-table span{color:var(--muted);font-size: var(--text-xs);font-weight:700}
.programme-control-pack details{border-top:1px solid var(--line);padding:14px 0}
.programme-control-pack details:first-of-type{margin-top:14px}
.programme-control-pack summary{align-items:center;cursor:pointer;display:flex;justify-content:space-between;gap:16px;list-style:none;min-height:var(--control-md)}
.programme-control-pack summary::-webkit-details-marker{display:none}
.programme-control-pack summary span{color:var(--muted);font-size:var(--text-base)}
.programme-control-pack details[open] summary{margin-bottom:12px}
.programme-capture-summary{margin:8px 0;color:var(--muted);line-height:var(--leading-snug)}
.programme-recovery-notice{display:grid;gap:4px;margin:10px 0;padding:12px 14px;border:1px solid #e7bd68;border-radius:var(--r-xs);background:var(--status-warning-surface);color:#5d4009}
.programme-command-centre{border-left:5px solid var(--blue);padding:18px;margin-bottom:16px}
.programme-command-heading{display:flex;align-items:flex-start;justify-content:space-between;gap:20px;margin-bottom:14px}
.programme-command-heading h3{margin:2px 0 5px;font-size:var(--text-xl)}
.programme-command-heading p:not(.eyebrow){max-width:780px;color:var(--muted);line-height:var(--leading-snug)}
.programme-command-heading>button{flex:0 0 auto;min-height:var(--control-md)}
.programme-command-metrics{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:var(--space-2);padding:var(--space-2) 0 var(--space-4);border-bottom:1px solid var(--line)}
.programme-command-metrics span{display:flex;align-items:center;gap:var(--space-2);min-height:var(--control-md);padding:var(--space-2) var(--space-2);border:1px solid var(--line);border-radius:var(--r-xs);background:var(--surface-soft);color:var(--muted);font-size:var(--text-base)}
.programme-command-metrics span strong{color:var(--ink);font-size:var(--text-lg)}
.programme-command-metrics span.bad{background:#fff2f2;border-color:#efb7b7}
.programme-command-metrics span.warn{background:var(--status-warning-surface);border-color:#e7bd68}
.programme-command-metrics span.good{background:#f0faf5;border-color:#aadfc4}
.programme-control-queue{display:grid}
.programme-control-row{display:grid;grid-template-columns:150px minmax(0,1fr) 152px;gap:var(--space-4);align-items:center;padding:var(--space-4) var(--space-1);border-bottom:1px solid var(--line)}
.programme-control-row:last-child{border-bottom:0}
.programme-control-row.is-covered{opacity:.72;background:#f7fbf9}
.programme-control-priority{display:grid;justify-items:start;gap:6px}
.programme-control-priority small{color:var(--muted)}
.programme-control-copy{min-width:0}
.programme-control-copy strong{font-size:var(--text-lg);color:var(--ink)}
.programme-control-copy p{margin:4px 0;color:var(--muted);line-height:var(--leading-snug)}
.programme-control-copy small{font-weight:700;color:var(--muted)}
.programme-control-actions{display:grid;justify-items:stretch;gap:var(--space-2)}
.programme-control-actions .pill{justify-self:start}
.programme-control-actions button{width:100%;min-height:var(--control-md)}
.programme-command-more{margin:12px 0 0}
@media(max-width:1100px){
  .programme-quick-start{grid-template-columns:1fr}
  .programme-start-options{grid-template-columns:1fr}
  .programme-gantt-focus>.panel-title{display:grid}
  .programme-gantt-focus>.panel-title button{width:100%}
  .programme-command-heading{display:grid}
  .programme-command-heading>button{width:100%}
  .programme-command-metrics{grid-template-columns:repeat(2,minmax(0,1fr))}
  .programme-control-row{grid-template-columns:118px minmax(0,1fr)}
  .programme-control-actions{grid-column:1/-1;grid-template-columns:repeat(2,minmax(0,1fr))}
}
@media(max-width:760px){
  .programme-quick-start{padding:14px;border-left-width:4px}
  .programme-quick-start>.button-row{display:grid;width:100%}
  .programme-quick-start>.button-row button{width:100%}
  .programme-advanced-controls>summary{align-items:flex-start}
  .programme-command-centre{padding:14px;border-left-width:4px}
  .programme-command-metrics{grid-template-columns:1fr}
  .programme-control-row{grid-template-columns:1fr;gap:var(--space-2);padding:var(--space-4) 0}
  .programme-control-actions{grid-column:auto;grid-template-columns:1fr}
}
.programme-control-table{min-width:920px}
.programme-control-table td{max-width:320px;white-space:normal;vertical-align:top}
.warn-list{background:var(--status-warning-surface);border:1px solid #f1d08d;border-radius:var(--r-md);padding:10px 12px}
.programme-task-board{display:grid;gap:var(--space-2);max-height:65vh;overflow-y:auto;overscroll-behavior:contain;padding-right:var(--space-2);scrollbar-gutter:stable}
.programme-task-row{border:1px solid #e3ebf4;background:white;border-left:5px solid var(--good);border-radius:var(--r-md);padding:var(--space-2) var(--space-3);display:grid;grid-template-columns:minmax(220px,.8fr) minmax(320px,1.2fr);gap:var(--space-4);align-items:start}
.programme-task-row.amber{border-left-color:var(--warn);background:var(--status-warning-surface)}
.programme-task-row.red{border-left-color:var(--bad);background:var(--status-critical-surface)}
.programme-task-main{display:grid;gap:var(--space-2)}
.programme-task-main h4{font-size:var(--text-base);margin:0}
.programme-task-main p,.programme-task-main small{color:var(--muted);font-size: var(--text-sm);font-weight:700;line-height:var(--leading-snug)}
.programme-task-controls{display:grid;grid-template-columns:110px 140px minmax(130px,1fr) 110px minmax(180px,1.4fr) auto;gap:8px;align-items:end}
.programme-task-controls .wide{min-width:0}
.programme-logic-panel,.programme-task-detail{margin-bottom:16px}
.programme-task-detail{display:grid;gap:16px}
.programme-task-detail .record-row{text-align:left}
.programme-builder-shell{display:grid;gap:16px}
.programme-workflow-strip{position:sticky;top:78px;z-index:12;box-shadow:var(--shadow-soft)}
.programme-sheet-import{display:grid;grid-template-columns:minmax(240px,1.4fr) minmax(190px,.8fr) auto;gap:10px;align-items:end;padding:14px;border:1px solid var(--line);border-radius:var(--r-sm);background:#f5f8fb}
.programme-sheet-import .field{margin:0}
.programme-sheet-import button{min-height:46px}
.programme-builder-toolbar{display:grid;grid-template-columns:minmax(280px,1fr) minmax(420px,1.25fr);gap:20px;align-items:start}
.programme-builder-toolbar h3{font-size:var(--text-xl);margin:3px 0 7px}
.programme-builder-controls{display:grid;gap:10px}
.programme-builder-controls .field{margin:0}
.programme-builder-primary-actions{align-items:center}
.programme-builder-more{border:1px solid var(--line);border-radius:var(--r-sm);background:#f7fafc}
.programme-builder-more>summary{min-height:var(--control-md);padding:10px 12px;cursor:pointer;color:var(--blue);font-size: var(--text-sm);font-weight:700;list-style:none}
.programme-builder-more>summary::-webkit-details-marker{display:none}
.programme-builder-more[open]>summary{border-bottom:1px solid var(--line)}
.programme-builder-more>.button-row{padding:10px}
.programme-builder-health{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:12px}
.programme-builder-health .card{min-height:104px}
.programme-builder-board{padding:0;overflow:hidden}
.programme-builder-board-head{display:flex;align-items:center;justify-content:space-between;gap:16px;padding:18px 20px;border-bottom:1px solid var(--line)}
.programme-board-controls{display:flex;align-items:end;justify-content:flex-end;gap:8px;flex-wrap:wrap}
.programme-board-controls label{display:grid;gap:4px;min-width:175px}
.programme-board-controls label span{font-size: var(--text-xs);font-weight:600;text-transform:uppercase;letter-spacing:.1em;color:var(--muted)}
.programme-board-controls input,.programme-board-controls select{min-height:var(--control-md);padding:8px 10px;border:1px solid #cedae5;border-radius:var(--r-sm);background:#fff}
.programme-board-controls>button{min-height:var(--control-md)}
.programme-builder-board-head h3{margin:0 0 3px}
.programme-labour-panel td.labour-cell-on{background:#eef4ea;font-variant-numeric:tabular-nums;text-align:center;font-weight:600}
.programme-labour-panel td:not(.labour-cell-on):not(:first-child){text-align:center;color:var(--muted)}
.programme-labour-panel .labour-total-row td{border-top:2px solid var(--line);background:#f4f7fa}
/* Resource loading: numbers are compared down a column, so keep them aligned. */
.programme-resource-panel .res-crew{width:82px;padding:5px 8px;border:1px solid #cbd5e1;border-radius:var(--r-xs);font-size: var(--text-sm);text-align:right;font-variant-numeric:tabular-nums}
.programme-resource-panel td{font-variant-numeric:tabular-nums;vertical-align:middle}
.programme-resource-panel td.res-persondays{font-weight:600;color:var(--ink)}
.programme-builder-scroll{overflow:auto;max-height:72vh;overscroll-behavior:contain;background:#f7fafc}
/* Full-screen read-only programme viewer — the same sheet as the client PDF,
   above the app chrome (topbar is z-90). Esc or Close exits. */
.programme-viewer-overlay{position:fixed;inset:0;z-index:120;background:#eef2f6;display:flex;flex-direction:column}
.programme-viewer-bar{display:flex;justify-content:space-between;align-items:center;gap:12px;padding:10px 20px;background:var(--blue);color:#fff}
.programme-viewer-bar strong{font-size: var(--text-base)}
.programme-viewer-bar .button-row{margin:0}
.programme-viewer-body{flex:1;overflow:auto;overscroll-behavior:contain;padding:22px}
.programme-viewer-body .programme-print-sheet{display:block;background:#fff;border-radius:var(--r-md);box-shadow:var(--shadow-card);max-width:1100px;margin:0 auto;padding:26px 30px}
body.programme-viewer-active{overflow:hidden}
/* The sheet itself (shared by viewer and print) */
.programme-print-sheet{display:none}
.programme-print-sheet h1{font-size: var(--text-xl);margin:0 0 4px}
.programme-print-sheet .programme-sheet-meta{margin:0 0 14px;color:#4e5a68;font-size:var(--text-xs)}
.programme-print-sheet .gantt-list{max-height:none;overflow:visible;padding-right:0}
@media print{
  body.printing-programme > *:not(#programmePrintSheet){display:none !important}
  body.printing-programme #programmePrintSheet.programme-print-sheet{display:block;position:static;width:100%}
  .programme-print-sheet .gantt-row{break-inside:avoid}
}
.programme-builder-grid{display:grid;grid-template-columns:1660px var(--timeline-width);grid-template-rows:52px auto;min-width:max-content}
.programme-builder-table-head{position:sticky;top:0;left:0;z-index:8;display:grid;grid-template-columns:70px 235px 145px 130px 130px 210px 72px 60px 62px 120px 130px 176px;gap:8px;align-items:center;height:52px;padding:0 12px;background:#123655;color:#fff;border-right:1px solid #294d6a;font-size: var(--text-xs);font-weight:600;text-transform:uppercase;letter-spacing:.1em}
.programme-builder-timeline-head{position:sticky;top:0;z-index:7;height:52px;background:#123655;color:#fff;border-bottom:1px solid #294d6a;overflow:hidden}
.programme-builder-timeline-head span{position:absolute;inset-block:0;display:flex;align-items:center;padding-left:8px;border-left:1px solid rgba(255,255,255,.18);font-size: var(--text-xs);font-weight:700;white-space:nowrap}
.programme-builder-task-list{grid-column:1;grid-row:2;background:white;border-right:1px solid var(--line)}
.programme-builder-task-row{display:grid;grid-template-columns:70px 235px 145px 130px 130px 210px 72px 60px 62px 120px 130px 176px;gap:8px;align-items:center;height:76px;padding:var(--space-2) var(--space-3);border-bottom:1px solid #e7edf3;border-left:4px solid transparent}
.programme-builder-task-row.critical{border-left-color:var(--bad);background:#fff9f8}
.programme-builder-task-row.near-critical{border-left-color:var(--warn);background:#fffcf4}
.programme-builder-task-row.read-only input:disabled,.programme-builder-task-row.read-only select:disabled{opacity:1;color:#33485d;background:#f2f6f9;border-color:#e0e8ef;cursor:default}
.programme-builder-task-row input,.programme-builder-task-row select{width:100%;height:42px;min-height:var(--control-md);padding:var(--space-2);border:1px solid #cedae5;border-radius:var(--r-sm);background:#fff;font-size: var(--text-xs)}
.programme-builder-task-name{display:grid;gap:3px;min-width:0}
.programme-builder-task-name input{font-weight:700}
.programme-builder-task-name small{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--muted);font-size: var(--text-xs);font-weight:700}
.programme-builder-row-actions{display:flex;gap:5px;align-items:center}
.programme-builder-row-actions button{min-height:var(--control-md);height:38px;padding:0 10px;font-size: var(--text-xs)}
.programme-builder-row-actions .danger-link{background:transparent;color:var(--bad);border:1px solid #edc5c1;box-shadow:none}
.programme-builder-timeline{grid-column:2;grid-row:2;position:relative;background-color:#f8fbfd;background-image:repeating-linear-gradient(90deg,transparent 0,transparent 13px,#e1e9f0 14px)}
.programme-builder-gantt-row{position:relative;height:76px;border-bottom:1px solid #e7edf3}
/* Programme speed 470 (R2B-02): a 450-activity Gantt is 34,000px of rows
   inside a 72vh scroller. Rows off the screen are skipped by the browser
   (style, layout and paint) until they scroll near the view; their height is
   the row height, so the scroller, the bars and the overlay lines keep their
   places. Every row and every control is in the page from the start. */
.programme-builder-task-row,.programme-builder-gantt-row{content-visibility:auto;contain-intrinsic-size:auto 76px}
.programme-builder-rows-spacer{height:calc(var(--pb-rows-left, 0) * 76px)}
.programme-builder-bar{position:absolute;top:19px;height:31px;min-width:34px;padding:0;border:0;border-radius:var(--r-xs);background:#2472a8;color:#fff;box-shadow:var(--shadow-card);overflow:hidden;text-align:center}
.programme-builder-bar>span{position:absolute;inset:0 auto 0 0;background:#15486f;opacity:.55}
.programme-builder-bar b{position:relative;z-index:1;font-size: var(--text-xs)}
.programme-builder-bar.critical{background:var(--bad)}
.programme-builder-bar.near-critical{background:var(--warn);color:#3e2b00}
.programme-builder-bar.negative-float{background:repeating-linear-gradient(45deg,var(--bad),var(--bad) 6px,#7a0b17 6px,#7a0b17 12px);color:#fff}
.programme-builder-bar.pb-draggable{cursor:grab}
.programme-builder-bar.pb-dragging{cursor:grabbing;opacity:.92;box-shadow:var(--shadow-soft);z-index:5}
.pb-handle{position:absolute;top:0;bottom:0;width:9px;cursor:ew-resize;z-index:2}
.pb-handle::after{content:"";position:absolute;top:50%;transform:translateY(-50%);height:16px;width:3px;border-radius:0px;background:rgba(255,255,255,.85)}
.pb-handle-start{left:0}.pb-handle-start::after{left:2px}
.pb-handle-end{right:0}.pb-handle-end::after{right:2px}
.pb-drag-tip{position:fixed;z-index:1000;display:none;background:#0f2f4a;color:#fff;font-size: var(--text-xs);font-weight:700;padding:var(--space-1) var(--space-2);border-radius:var(--r-xs);pointer-events:none;box-shadow:var(--shadow-card)}
.pb-drag-hint{margin:.2rem 0 .5rem}
.pb-dropline-control{display:flex;flex-direction:column;gap:4px}
.pb-dropline-control input{padding:.35rem .5rem;border:1px solid var(--border,#d1d5db);border-radius:var(--r-sm)}
.programme-gantt-overlay{position:absolute;top:0;left:0;pointer-events:none;z-index:4;overflow:visible}
.programme-gantt-overlay .pb-today{stroke:#e8862b;stroke-width:1.5;stroke-dasharray:4 4}
.programme-gantt-overlay .pb-dropvert{stroke:#123655;stroke-width:2}
.programme-gantt-overlay .pb-dropzig{stroke:#123655;stroke-width:1.5;opacity:.85}
.programme-gantt-overlay .pb-behind{fill:var(--bad,var(--bad))}
.programme-gantt-overlay .pb-ahead{fill:var(--good,var(--good))}
.programme-gantt-overlay .pb-droplabel{fill:#123655;font-size: var(--text-xs);font-weight:700}
.programme-gantt-overlay .pb-drophandle{fill:#123655;pointer-events:auto;cursor:ew-resize}
.programme-gantt-overlay .pb-critlink{stroke:var(--bad,var(--bad));stroke-width:1.6;fill:none;opacity:.9}
.programme-gantt-overlay .pb-critarrow-head{fill:var(--bad,var(--bad))}
.programme-health-panel .programme-health-list{display:grid;gap:8px;margin:8px 0 0;padding:0;list-style:none}
.programme-health-item{display:flex;gap:10px;align-items:flex-start;font-size:var(--text-base)}
.programme-health-item .pill{flex:0 0 auto}
.programme-site-start-row{display:flex;flex-wrap:wrap;align-items:flex-end;gap:12px}
.programme-site-start-row label{display:flex;flex-direction:column;gap:4px;font-size:var(--text-base)}
.programme-site-start-row input{padding:.4rem .55rem;border:1px solid var(--border,#d1d5db);border-radius:var(--r-sm)}
.pb-hours-row{display:flex;align-items:center;gap:6px}
/* One toolbar, not two: the canvas rail duplicates the side-panel modes with
   different names. Keep it on narrow screens where the side panel drops below
   the drawing, and in the fullscreen workspace where the rail is the
   canvas-adjacent toolbar - hiding only the ordinary desktop layout, where the
   side panel now carries every tool. */
@media(min-width:1101px){.drawing-viewer-panel:not(.drawing-fullscreen) .drawing-tool-rail{display:none !important}}
.boq-held-row td{color:var(--warn-ink);font-weight:600}
.boq-alarm-row td{background:#fef2f2;color:var(--bad);border-radius:var(--r-sm)}
.signature-overlay{position:fixed;inset:0;z-index:220;background:rgba(12,22,34,.55);display:flex;align-items:center;justify-content:center;padding:var(--space-4)}
.signature-sheet{background:var(--sheet,#fff);border-radius:var(--r-md);padding:var(--space-5);max-width:660px;width:100%;display:grid;gap:12px}
.signature-sheet canvas{border:1.5px dashed var(--border,#cbd5e1);border-radius:var(--r-sm);touch-action:none;background:#fff;width:100%}
.signature-sheet label{display:grid;gap:4px;font-size:var(--text-sm)}
.transmittal-register{margin-top:14px;border:1px solid var(--border,var(--line));border-radius:var(--r-sm);padding:10px 14px}
.transmittal-register summary{cursor:pointer}
.transmittal-register .table-scroll{margin-top:10px;max-height:420px;overflow:auto}
.drawing-page-picker{display:inline-flex;align-items:center;gap:6px;white-space:nowrap}
.drawing-page-picker button{min-width:28px}
.drawing-guidance-strip{display:flex;flex-direction:column;gap:2px;margin:.5rem 0;padding:.6rem .75rem;border-radius:var(--r-sm);border:1px solid;font-size:var(--text-base)}
.drawing-guidance-strip strong{font-size:var(--text-sm);letter-spacing:.1em;text-transform:uppercase}
.drawing-guidance-strip.is-bad{background:#fef2f2;border-color:#fecaca;color:var(--bad)}
.drawing-guidance-strip.is-warn{background:#fffbeb;border-color:#fde68a;color:var(--bad)}
.drawing-guidance-strip.is-good{background:#f0fdf4;border-color:#bbf7d0;color:var(--good)}
.crm-source-evidence{display:grid;gap:8px;margin:.6rem 0;padding:.7rem .8rem;border:1px solid var(--border,var(--line));border-radius:var(--r-sm);background:#f8fafc}
.crm-source-evidence span{display:block;font-size:var(--text-xs);letter-spacing:.1em;text-transform:uppercase;color:var(--muted,#64748b)}
.crm-source-evidence p{margin:.15rem 0 0;font-size:var(--text-base)}
.crm-source-evidence .button-like.mini{padding:.25rem .6rem;font-size:var(--text-xs)}
.crm-intake-strip{display:flex;flex-wrap:wrap;gap:.5rem;margin-top:.6rem}
.crm-intake-stat{display:inline-flex;align-items:baseline;gap:.35rem;padding:.35rem .7rem;border:1px solid var(--border,var(--line));border-radius:var(--r-pill);background:#f8fafc;font-size:var(--text-sm);color:var(--muted,#64748b)}
.crm-intake-stat strong{font-size:var(--text-lg);color:var(--text,#0f172a)}
.crm-map-canvas{height:560px;width:100%;border-radius:var(--r-md);overflow:hidden;border:1px solid var(--border,var(--line));z-index:0}
.crm-map-legend{display:flex;flex-wrap:wrap;align-items:center;gap:.35rem;margin-top:.6rem;font-size:var(--text-sm)}
.crm-map-dot{display:inline-block;width:11px;height:11px;border-radius:50%;vertical-align:middle}
.crm-map-dot.base{background:var(--bad);border:1px solid var(--bad)}
.crm-map-dot.lead{background:#2f6fd1;border:1px solid #1f4d8f}
.crm-map-dot.promoted{background:var(--good);border:1px solid var(--good)}
/* Selected target: pushed and on the map, but visibly not yet a deal — hollow
   green reads as "on the way to green" without claiming won work. */
.crm-map-dot.target{background:#dcfce7;border:2px solid var(--good)}
.crm-map-popup{display:grid;gap:.3rem;min-width:180px}
.crm-map-popup strong{font-size:var(--text-base);line-height:var(--leading-tight)}
.crm-map-popup .muted{font-size:var(--text-xs)}
.crm-map-popup-actions{display:flex;flex-wrap:wrap;align-items:center;gap:.4rem;margin-top:.2rem}
.crm-map-popup-actions button{padding:.25rem .6rem;font-size:var(--text-xs)}
.programme-site-tasks-panel .table-scroll{max-height:420px;overflow:auto;border:1px solid var(--border,var(--line));border-radius:var(--r-sm)}
.programme-site-tasks-panel table{width:100%;border-collapse:collapse;font-size:var(--text-base)}
.programme-site-tasks-panel th{position:sticky;top:0;background:#0f2c52;color:#fff;text-align:left;padding:.45rem .6rem;font-size:var(--text-xs);letter-spacing:.02em}
.programme-site-tasks-panel td{padding:.4rem .6rem;border-bottom:1px solid var(--border,#eef2f7);vertical-align:top}
.pb-target-note{margin:.35rem 0 0;font-size:var(--text-base);color:var(--muted,#6b7280)}
.pb-target-note.pb-over{color:var(--bad,var(--bad));font-weight:700}
.pb-phase-list{list-style:none;margin:.4rem 0 .6rem;padding:0;display:grid;gap:6px}
.pb-phase-row{display:flex;align-items:center;gap:10px;padding:.4rem .55rem;border:1px solid var(--border,#e5e7eb);border-radius:var(--r-sm)}
.pb-phase-index{display:inline-flex;align-items:center;justify-content:center;width:22px;height:22px;border-radius:50%;background:var(--market-accent,#2563eb);color:#fff;font-size:var(--text-xs);font-weight:700;flex:0 0 auto}
.pb-phase-row strong{flex:1}
.pb-phase-move{display:inline-flex;gap:4px}
.pb-phase-move button{padding:.15rem .5rem}
.pb-phase-ai{display:flex;gap:8px;flex-wrap:wrap;margin:0 0 .6rem}
.pb-phase-ai input{flex:1;min-width:200px;padding:.4rem .55rem;border:1px solid var(--border,#d1d5db);border-radius:var(--r-sm)}
.programme-builder-bar.complete{background:var(--good)}
.programme-builder-bar.milestone{width:18px!important;min-width:18px;height:18px;top:25px;border-radius:0px;transform:rotate(45deg)}
.programme-builder-bar.milestone b,.programme-builder-bar.milestone span{display:none}
.programme-builder-baseline{position:absolute;top:55px;height:5px;border-radius:0px;background:#6d7e8c;opacity:.85}
.programme-builder-empty{display:grid;justify-items:start;gap:12px;padding:22px}
.programme-builder-empty .empty-state{padding:0;text-align:left}
.segmented-control{display:inline-flex;gap:3px;padding:3px;border:1px solid var(--line);border-radius:var(--r-sm);background:#edf3f8}
.segmented-control button{min-height:var(--control-md);padding:0 13px;background:transparent;color:var(--navy);border:0;box-shadow:none}
.segmented-control button.active{background:white;box-shadow:var(--shadow-card)}
.lookahead-list{display:grid;gap:10px}
.lookahead-item{border:1px solid #e3ebf4;background:white;border-radius:var(--r-md);padding:14px;display:grid;gap:7px}
.lookahead-item.blocked{border-color:#f1d08d;background:var(--status-warning-surface)}
.lookahead-item h4{font-size:var(--text-base);margin:0}
.lookahead-item p,.lookahead-item small{color:var(--muted);font-size: var(--text-sm);font-weight:700}
.daily-shell{display:grid;gap:16px}
.daily-head{background:var(--bg);border:1px solid #e3ebf4;border-radius:var(--r-md);padding:18px}
/* Visual 459: the four-up width names its gap token (it hard-coded three 14px gaps; the gap is 16px now). */
.daily-summary-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(max(140px,calc((100% - 3 * var(--space-4)) / 4)),1fr));gap:var(--space-4);margin-bottom:var(--space-4)}
.daily-summary-grid .card{box-shadow:var(--shadow-soft);min-width:0}
.card .value.value-long{font-size: var(--text-base);line-height:var(--leading-snug);font-weight:600;overflow-wrap:anywhere}
/* Visual 453 (V1-04, V3-08): a figure never breaks ("£400,000.0 / 0") and is
   never shrunk to body size for being long. The tile is a size container and
   the figure takes the largest size at which its --figure-chars characters
   fit (about 0.6em each), never above the headline size. */
.kpi-card,.siite-metric{container-type:inline-size}
.card .value.value-figure,.siite-metric-value.value-figure{white-space:nowrap;overflow-wrap:normal;word-break:keep-all;overflow:hidden;text-overflow:clip;font-size:clamp(var(--text-base), calc(100cqi / (var(--figure-chars, 8) * .62)), var(--stat-value));font-variant-numeric:tabular-nums}
.daily-row{grid-template-columns:auto 170px 1fr 140px}
.queue-list{display:grid;gap:10px}
.queue-item,.daily-export-preview div,.daily-calendar .calendar-report{background:white;border:1px solid #e3ebf4;border-radius:var(--r-md);padding:var(--space-3)}
.queue-item{display:grid;gap:4px}
.queue-item span,.daily-export-preview span{color:var(--muted);font-size: var(--text-sm);font-weight:700}
.daily-form-head{border-left:4px solid var(--blue)}
.daily-report-form .schema-section{background:#f9fbfd}
.daily-report-form .schema-section legend{font-size: var(--text-base)}
.daily-report-form .schema-field>span{font-size:var(--text-base)}
.daily-export-preview{display:grid;grid-template-columns:repeat(3,1fr);gap:10px}
.daily-export-preview div{display:grid;gap:5px}
.daily-review-answers{max-height:620px;overflow:auto;padding-right:4px}
.daily-calendar{display:grid;grid-template-columns:repeat(4,minmax(170px,1fr));gap:10px}
.calendar-report{display:grid;gap:5px;border-left:5px solid var(--good)!important}
.calendar-report.amber{border-left-color:var(--warn)!important;background:var(--status-warning-surface)}
.calendar-report.red{border-left-color:var(--bad)!important;background:#fff7f7}
.calendar-report span{color:var(--muted);font-size: var(--text-sm);font-weight:700}
.daily-detail .card .value{text-transform:capitalize}
@media(max-width:1100px){
  .forms-head,.dynamic-form-head,.form-workspace-head{flex-direction:column}
  .form-builder-layout,.compact,.repeat-row,.daily-summary-grid,.commercial-review-grid,.daily-export-preview,.daily-calendar,.gantt-row,.programme-task-row,.programme-task-controls,.evidence-list,.quick-capture,.drive-section-row,.drive-root-form,.readiness-strip{grid-template-columns:1fr}
  .template-picker{position:static}
  .readiness-metrics{grid-template-columns:repeat(2,1fr)}
  .form-context-card{min-width:0}
  /* Audit P3V-11 (third pass): the bar stacked its buttons one per row -
     178px on a form, 124px on the diary, about 29% of a phone screen with the
     tab bar. It is one row now (about 64px): the buttons share the width and
     the primary (Submit) keeps its fill. */
  .sticky-submit{flex-direction:row;flex-wrap:nowrap;padding:var(--space-2);gap:8px}
  body:not(.login-mode) .sticky-submit > button{flex:1 1 0;min-width:0;padding-inline:8px;white-space:normal;line-height:var(--leading-tight);text-align:center;justify-content:center}
  body:not(.login-mode) .sticky-submit > button.primary{flex-grow:1.4}
  .review-answers div{grid-template-columns:1fr}
  .attention-row,.action-meta,.closeout-strip,.action-closeout-form{grid-template-columns:minmax(0,1fr)}
  .action-card-head{align-items:flex-start;flex-direction:column}
  .drive-head{display:grid}
}

/* A9 AI usage & cost */
.ai-usage-capbar{height:10px;border-radius:var(--r-pill);background:#e8eef5;overflow:hidden;margin:4px 0 12px}
.ai-usage-capbar span{display:block;height:100%;background:linear-gradient(90deg,var(--good),#4fa66f);border-radius:var(--r-pill)}
.ai-usage-capbar.warn span{background:linear-gradient(90deg,var(--warn),var(--bad))}
.ai-usage-days{display:flex;gap:8px;flex-wrap:wrap;margin-bottom:12px}
.ai-usage-days span{display:grid;place-items:center;gap:1px;background:var(--bg);border:1px solid #e3ebf4;border-radius:var(--r-md);padding:7px 10px;font-size: var(--text-xs);color:var(--muted);font-weight:700}
.ai-usage-days span b{font-size: var(--text-base);color:var(--blue)}

/* A2 daily report AI review drawer */
.ai-review-drawer{position:fixed;right:18px;bottom:18px;width:min(430px,calc(100vw - 36px));max-height:min(70vh,640px);overflow-y:auto;background:white;border:1px solid var(--line);border-radius:var(--r-md);box-shadow:var(--shadow);padding:var(--space-4);z-index:70;display:grid;gap:12px}
.ai-review-head{display:flex;justify-content:space-between;align-items:flex-start;gap:10px}
.ai-review-head small{display:block;color:var(--muted);font-weight:700}
.ai-review-head button{padding:4px 10px;font-size:var(--text-base);line-height:var(--leading-none)}
.ai-review-summary{background:var(--bg);border-left:4px solid var(--blue);border-radius:var(--r-md);padding:10px 12px}
.ai-review-summary p{margin:0 0 6px;font-size:var(--text-base);line-height:var(--leading-snug)}
.ai-review-summary p:last-child{margin:0}
.ai-review-section{display:grid;gap:9px}
.ai-review-section>strong{color:var(--blue);font-size: var(--text-sm);text-transform:uppercase;letter-spacing:.1em}
.ai-review-item{display:flex;gap:10px;align-items:flex-start;border:1px solid #e3ebf4;border-radius:var(--r-md);background:var(--panel);padding:10px}
.ai-review-item input[type="checkbox"]{margin-top:3px;min-height:auto}
.ai-review-item span{display:grid;gap:3px;font-size: var(--text-sm)}
.ai-review-item small{color:var(--muted);line-height:var(--leading-snug)}
.ai-review-flag{justify-content:space-between}
.ai-review-flag button{white-space:nowrap;padding:7px 10px;font-size: var(--text-xs)}
@media(max-width:760px){.ai-review-drawer{right:10px;left:10px;bottom:10px;width:auto}}

/* A3 Monday director brief */
.monday-brief-narrative{background:var(--bg);border:1px solid #dce6f1;border-left:4px solid var(--blue);border-radius:var(--r-md);padding:14px 16px;margin-bottom:14px}
.monday-brief-narrative p{margin:0 0 8px;line-height:var(--leading-normal);font-size: var(--text-base)}
.monday-brief-narrative p:last-child{margin-bottom:0}

/* A1 ledger allocation copilot */
.ai-suggestion-bulk{display:flex;justify-content:space-between;align-items:center;gap:12px;background:#eef6ff;border:1px solid var(--line);border-radius:var(--r-md);padding:10px 14px;margin-bottom:10px}
.ai-suggestion-bulk span{font-weight:700;color:var(--blue)}
.ai-suggestion-bulk button{padding:var(--space-2) var(--space-3);font-size: var(--text-sm)}

/* BOQ commercial summary (prelims / contingency / fees) */
.boq-commercial-summary{border:1px solid var(--line);border-radius:var(--r-md);background:var(--bg);padding:var(--space-4);margin-top:14px}
.boq-commercial-grid{grid-template-columns:repeat(5,minmax(120px,1fr));margin-top:8px}
/* Audit F4V-02: a two-column cost summary needs no floor; written one step
   stronger than the later .compact-table{min-width:980px} it used to lose to. */
.boq-commercial-summary .boq-cost-table{margin-top:12px;min-width:0}
.boq-cost-table td:last-child{text-align:right;font-weight:700}
.boq-grand-total td{border-top:2px solid var(--blue);background:#eef6ff}
@media(max-width:760px){.boq-commercial-grid{grid-template-columns:1fr}}

/* Data-mode chip (collapsed status panel) */
.login-mode .data-mode-panel{display:none!important}
.data-mode-panel.collapsed{padding:0;border:0;background:transparent;box-shadow:none}
.data-mode-chip{display:inline-flex;align-items:center;gap:9px;background:white;border:1px solid var(--line);border-radius:var(--r-pill);padding:8px 14px;color:var(--ink);font-size: var(--text-sm);font-weight:700;box-shadow:var(--shadow-soft);cursor:pointer}
.data-mode-chip:hover{border-color:var(--line)}
.data-mode-chip strong{color:var(--blue)}
.data-mode-chip span{color:var(--muted);font-weight:700}
.data-mode-chip .chip-more{color:var(--blue-2);text-decoration:underline}
.data-mode-panel.collapsed.warn .data-mode-chip{border-color:#f1d08d;background:var(--status-warning-surface)}
.data-mode-panel.collapsed.bad .data-mode-chip{border-color:#efc6c6;background:var(--status-critical-surface)}
.status-dot{width:10px;height:10px;border-radius:50%;background:#9aa8b6;flex:0 0 auto}
.status-dot.good{background:var(--good)}
.status-dot.warn{background:var(--warn)}
.status-dot.bad{background:var(--bad)}
.data-mode-hide{margin-left:auto;order:99;border-radius:var(--r-sm);padding:6px 10px;font-size: var(--text-xs);box-shadow:none}

/* Director reports */
.report-toolbar select{min-width:230px}
.report-output-panel{padding:0;overflow:hidden}
.report-actions{padding:14px 18px;margin:0;border-bottom:1px solid var(--line);background:var(--bg);flex-wrap:wrap}
.report-view{padding:26px 30px;max-width:840px}
.report-view h2{font-size:var(--text-2xl);letter-spacing:-.03em;margin-bottom:2px}
.report-view .report-meta{color:var(--muted);font-size: var(--text-sm);font-weight:700;margin-bottom:18px;display:flex;gap:14px;flex-wrap:wrap}
.report-view h3{font-size:var(--text-base);color:var(--blue);text-transform:uppercase;letter-spacing:.1em;margin:22px 0 9px;border-bottom:1px solid var(--line);padding-bottom:6px}
.report-view ul{margin:0;padding-left:20px;display:grid;gap:6px}
.report-view li{line-height:var(--leading-snug)}
.report-view table{min-width:0;width:100%;font-size: var(--text-sm);border:1px solid var(--line);border-radius:var(--r-sm)}
.report-view td,.report-view th{padding:8px 10px}
.report-view .report-empty{color:var(--muted);font-weight:700}
@media print{
  body.printing-report .sidebar,
  body.printing-report .topbar,
  body.printing-report .sync-warning,
  body.printing-report .data-mode-panel,
  body.printing-report .report-actions,
  body.printing-report .report-toolbar,
  body.printing-report #reportHint,
  body.printing-report .toast-host,
  body.printing-report #reports > .panel:first-child{display:none!important}
  body.printing-report main{margin:0;width:100%;padding:0}
  body.printing-report .report-output-panel{border:0;box-shadow:none;margin:0}
  body.printing-report .report-view{padding:0;max-width:none}
  body.printing-report .report-view h3{break-after:avoid}
  body.printing-report .report-view table{break-inside:auto}
}

/* Accessibility: respect users who disable animation (vestibular disorders, low-power site devices) */
@media (prefers-reduced-motion: reduce){
  *,*::before,*::after{animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important;scroll-behavior:auto!important}
}

.button-like{display:inline-flex;align-items:center;justify-content:center;border-radius:var(--r-md);padding:var(--space-2) var(--space-4);font-weight:700;text-decoration:none;background:var(--blue);color:white;box-shadow:var(--shadow-soft)}
.button-like.secondary{background:white;color:var(--blue);border:1px solid var(--line);box-shadow:none}
.hseq-command{border-color:#cfe0ee;background:var(--panel)}
.hseq-command-actions{display:flex;gap:10px;flex-wrap:wrap;justify-content:flex-end}
.hseq-readiness-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:12px;margin:16px 0}
.hseq-readiness-card{border:1px solid var(--line);border-radius:var(--r-md);background:white;padding:15px}
.hseq-readiness-card span{display:block;color:var(--muted);font-size: var(--text-xs);font-weight:600;text-transform:uppercase;letter-spacing:.1em}
.hseq-readiness-card strong{display:block;font-size:var(--text-2xl);margin-top:6px;color:var(--ink)}
.hseq-readiness-card small{display:block;color:var(--muted);margin-top:6px;line-height:var(--leading-snug)}
.hseq-readiness-card.warn{border-color:#f1d08d;background:var(--status-warning-surface)}
.hseq-readiness-card.good{border-color:#acdcbc;background:#f2fbf5}
.hseq-readiness-card.bad{border-color:#f0b7b7;background:#fff7f7}
.hseq-office-note{border:1px solid var(--line);background:#f4f8fc;border-radius:var(--r-md);padding:13px 15px;color:#334b62;line-height:var(--leading-snug)}
.hseq-library-layout{align-items:start}
.hseq-gap-list{display:flex;flex-direction:column;gap:10px}
.hseq-gap-item{border:1px solid #e4edf5;border-radius:var(--r-md);padding:13px;background:var(--panel)}
.hseq-gap-item strong{display:block;margin-top:8px}
.hseq-gap-item small{display:block;color:var(--muted);margin-top:5px;line-height:var(--leading-snug)}
.hseq-library-grid{display:grid;grid-template-columns:repeat(2,minmax(280px,1fr));gap:16px;margin-bottom:18px}
.hseq-library-card{background:white;border:1px solid var(--line);border-radius:var(--r-md);padding:18px;box-shadow:var(--shadow)}
.hseq-library-head{display:flex;justify-content:space-between;gap:12px;align-items:flex-start;border-bottom:1px solid var(--line);padding-bottom:12px;margin-bottom:12px}
.hseq-library-head h3{font-size:var(--text-lg);margin-top:8px;letter-spacing:-.02em}
.hseq-library-head>strong{color:#50677d;font-size: var(--text-sm);white-space:nowrap}
.hseq-legal{display:flex;flex-wrap:wrap;gap:7px;margin-bottom:14px}
.hseq-legal span{display:inline-flex;border-radius:var(--r-pill);background:#eef4fa;border:1px solid #dbe8f2;color:var(--blue);padding:5px 9px;font-size: var(--text-xs);font-weight:700}
.hseq-card-columns{display:grid;grid-template-columns:1fr 1fr;gap:14px}
.hseq-library-card h4{font-size: var(--text-sm);text-transform:uppercase;letter-spacing:.1em;color:var(--muted);margin-bottom:8px}
.hseq-mini-list{margin:0;padding:0;list-style:none;display:flex;flex-direction:column;gap:7px}
.hseq-mini-list li{border:1px solid #e7edf4;background:#f8fafc;border-radius:var(--r-sm);padding:8px 10px;color:var(--ink);font-size: var(--text-sm);line-height:var(--leading-snug)}
.hseq-office-info{margin-top:14px}
.hseq-template-shortcuts{display:flex;flex-wrap:wrap;gap:8px;margin-top:10px}
.hseq-template-shortcuts button{font-size: var(--text-xs);padding:8px 10px;box-shadow:none}
.hseq-next-step{margin-top:14px;border-left:4px solid var(--blue);background:#f3f8fd;padding:12px 13px;border-radius:0 var(--r-md) var(--r-md) 0;color:#20384f;font-weight:700;line-height:var(--leading-snug)}
@media(max-width:1100px){.hseq-library-grid,.hseq-card-columns{grid-template-columns:1fr}.hseq-command-actions{justify-content:flex-start}}

/* Skip link: hidden until keyboard-focused */
.skip-link{position:absolute;left:-9999px;top:0;z-index:100;background:var(--blue);color:#fff;padding:var(--space-2) var(--space-4);border-radius:0 0 var(--r-sm) 0;font-weight:600;text-decoration:none}
.skip-link:focus{left:0}

/* ===== UI/UX pass 4 Jul 2026 ===== */

/* Phone-stacked registers: tables rendered via renderTable() restack as cards under 760px.
   Each cell shows its column header via data-label — no sideways scrolling on site phones. */
@media(max-width:760px){
  .programme-builder-toolbar{grid-template-columns:1fr}
  .programme-workflow-strip{position:static;display:flex;overflow-x:auto}
  .programme-workflow-strip span{flex:0 0 150px}
  .programme-sheet-import{grid-template-columns:1fr}
  .programme-builder-health{display:flex;overflow-x:auto;scroll-snap-type:x proximity;padding-bottom:8px}
  .programme-builder-health .card{flex:0 0 190px;scroll-snap-align:start}
  .programme-builder-board-head{align-items:flex-start;flex-direction:column}
  .programme-board-controls{width:100%;justify-content:stretch}
  .programme-board-controls label{flex:1 1 180px}
  .programme-board-controls>button{flex:1 1 auto}
  .programme-builder-scroll{max-height:68vh}
  .programme-builder-grid{grid-template-columns:1450px var(--timeline-width)}
  .programme-builder-table-head,.programme-builder-task-row{grid-template-columns:60px 200px 125px 118px 118px 170px 66px 54px 56px 105px 115px 145px}
  .programme-builder-task-row{height:72px;padding-inline:8px}
  .programme-builder-gantt-row{height:72px}
  .programme-builder-task-row,.programme-builder-gantt-row{contain-intrinsic-size:auto 72px}
  .programme-builder-rows-spacer{height:calc(var(--pb-rows-left, 0) * 72px)}
  .programme-builder-row-actions button{padding-inline:8px}
  
  
  
  
  
  
  
  
  
  
  
}

/* Project location pin and verified site boundary */
.project-setup-form>.wide{grid-column:1/-1}
.site-location-editor{display:grid;gap:14px;border:1px solid #cfddea;border-radius:var(--r-sm);background:var(--bg);padding:var(--space-4);overflow:hidden}
.site-location-editor-head{display:flex;justify-content:space-between;gap:18px;align-items:flex-start}
.site-location-editor-head h4{margin:2px 0 5px;color:var(--ink);font-size:var(--text-xl)}
.site-location-editor-head p{margin:0;max-width:780px;color:var(--muted);font-weight:700;line-height:var(--leading-snug)}
.site-location-map-shell{position:relative;min-height:480px;border:1px solid #b9cddd;border-radius:var(--r-sm);overflow:hidden;background:#dde8f1}
.site-location-map{position:absolute;inset:0;z-index:0;min-height:480px}
.site-location-map .leaflet-control-container{font-size: var(--text-sm)}
.site-location-map .leaflet-tile{max-width:none!important}
.site-map-tools{position:absolute;z-index:500;left:12px;top:12px;display:flex;gap:7px;flex-wrap:wrap;max-width:calc(100% - 24px);padding:var(--space-2);background:rgba(255,255,255,.94);border:1px solid #c8d7e5;border-radius:var(--r-sm);box-shadow:var(--shadow-soft)}
.site-map-tools button{min-height:var(--control-md);padding:8px 11px;background:#fff;color:#183d5e;border-color:#c8d7e5}
.site-map-tools button.active{background:#173f64;color:#fff;border-color:#173f64}
.site-map-pin-icon,.site-map-vertex-icon{background:transparent!important;border:0!important}
.site-map-pin-marker{display:grid;place-items:center;width:34px;height:34px;border:4px solid #fff;border-radius:50% 50% 50% 0;background:#1473b8;color:#fff;font-size:var(--text-base);font-weight:700;box-shadow:var(--shadow-card);transform:rotate(-45deg)}
.site-map-pin-marker span{transform:rotate(45deg)}
.site-map-vertex-marker{display:grid;place-items:center;width:24px;height:24px;border:3px solid #fff;border-radius:50%;background:#e3a21a;color:#173047;font-size: var(--text-xs);font-weight:700;box-shadow:var(--shadow-card)}
.site-map-vertex-marker.selected{width:30px;height:30px;margin:-3px;background:var(--warn);color:#fff;box-shadow:var(--shadow-card)}
.site-boundary-status{border:1px solid #ccdbe8;border-left-width:5px;border-radius:var(--r-sm);background:#fff;padding:11px 13px;color:#35516a;font-weight:700;line-height:var(--leading-snug)}
.site-boundary-status.good{border-left-color:var(--good);background:#f4fbf7}
.site-boundary-status.warn{border-left-color:var(--warn);background:var(--status-warning-surface)}
.site-boundary-status.bad{border-left-color:var(--bad);background:var(--status-critical-surface)}
.site-boundary-actions{gap:8px}
.site-location-note{display:block;color:#60758a;font-weight:700;line-height:var(--leading-snug)}
.site-location-summary{display:flex;align-items:center;gap:10px 14px;flex-wrap:wrap;margin:0 0 12px;padding:10px 12px;border:1px solid #dce6ef;border-radius:var(--r-sm);background:#f7fafc;color:#506a80;font-size: var(--text-xs);font-weight:700}
.labour-site-coordinate-setup.ready{border-color:#abd6c0;background:#f5fbf7}

@media(max-width:760px){
  .site-location-editor{padding:var(--space-3)}
  .site-location-editor-head{display:grid}
  .site-location-map-shell,.site-location-map{min-height:430px}
  .site-map-tools{right:10px;left:10px;top:10px;display:grid;grid-template-columns:repeat(2,minmax(0,1fr));max-width:none}
  .site-map-tools button{width:100%;font-size: var(--text-xs)}
  .site-boundary-actions button{flex:1 1 100%}
}

/* Monday go-live UX pass: clearer hierarchy, compact mobile controls and less connector noise. */
.list-intro-actions{
  display:flex;
  align-items:center;
  justify-content:flex-end;
  gap:12px;
  min-width:0;
}
.list-intro-actions span{
  text-align:right;
}
.task-create-panel{
  margin-bottom:16px;
  scroll-margin-top:96px;
}
.task-create-actions{
  justify-content:flex-start;
}
.task-create-actions button{
  min-width:140px;
}
.quick-create-panel{
  margin-bottom:16px;
  background:#f9fbfd;
}
.labelled-toolbar{
  padding:0!important;
  background:transparent!important;
  border:0!important;
  box-shadow:var(--shadow-card);
  grid-template-columns:minmax(180px,1fr) minmax(230px,1.6fr) minmax(160px,.8fr) minmax(160px,.8fr) auto!important;
  align-items:end!important;
}
.labelled-toolbar .field{
  margin:0;
}
.labelled-toolbar .field > span{
  display:block;
  margin-bottom:6px;
  color:var(--muted);
  font-size: var(--text-xs);
  font-weight:600;
  letter-spacing:.1em;
  text-transform:uppercase;
}
.labelled-toolbar > button{
  min-height:46px;
}
.project-hub-cards{
  margin-top:16px;
}
.project-tab-panel-top{
  scroll-margin-top:154px;
}
.workspace-role-preview{
  display:grid;
  gap:8px;
  min-width:min(520px,100%);
}
.workspace-role-preview > span{
  color:rgba(255,255,255,.72);
  font-size: var(--text-xs);
  font-weight:600;
  letter-spacing:.1em;
  text-transform:uppercase;
}
.source-technical-name{
  color:var(--muted);
  font-size: var(--text-xs)!important;
  overflow-wrap:anywhere;
}
.today-quick-actions{
  grid-template-columns:repeat(4,minmax(0,1fr));
}
.today-action-icon{
  display:inline-grid;
  place-items:center;
  min-width:48px;
  min-height:var(--control-md);
  padding:0 8px;
  border-radius:var(--r-sm);
  background:#e8f1f8;
  color:var(--blue);
  font-size: var(--text-xs)!important;
  font-weight:700;
  letter-spacing:.04em;
}

@media(max-width:1100px){
  .labelled-toolbar{
    grid-template-columns:repeat(2,minmax(0,1fr))!important;
  }
  .labelled-toolbar > button{
    width:100%;
  }
  .list-intro-actions{
    justify-content:flex-start;
  }
  .list-intro-actions span{
    text-align:left;
  }
}

@media(max-width:760px){
  .dashboard-command-actions{
    grid-template-columns:repeat(3,minmax(0,1fr))!important;
  }
  .dashboard-command-actions button{
    min-height:var(--control-md);
    padding:var(--space-2) var(--space-2);
    font-size: var(--text-xs);
  }
  .project-tab-panel-top{
    scroll-margin-top:150px;
  }
  .project-hub-cards{
    grid-template-columns:repeat(2,minmax(0,1fr))!important;
  }
  .project-hub-cards .card{
    padding:var(--space-4);
  }
  .list-intro-actions{
    width:100%;
    display:grid;
    grid-template-columns:1fr auto;
  }
  .list-intro-actions span{
    font-size: var(--text-sm);
  }
  .task-create-actions{
    display:grid;
    grid-template-columns:1fr 1fr;
  }
  .task-create-actions button{
    min-width:0;
    width:100%;
  }
  .labelled-toolbar{
    grid-template-columns:1fr!important;
    padding:0!important;
  }
  .source-status-grid{
    display:flex!important;
    gap:var(--space-2);
    overflow-x:auto;
    padding-bottom:var(--space-2);
    scroll-snap-type:x proximity;
    scrollbar-width:thin;
  }
  .source-status-card{
    flex:0 0 min(78vw,290px);
    max-width:290px;
    min-height:112px;
    scroll-snap-align:start;
  }
  .today-quick-actions{
    grid-template-columns:repeat(2,minmax(0,1fr));
    gap:10px;
  }
  .today-quick{
    min-height:78px;
    padding:var(--space-3);
    align-items:flex-start;
    justify-content:center;
    font-size:var(--text-base);
    text-align:left;
  }
  .workspace-role-preview{
    min-width:0;
  }
}

/* Mobile nav scrim: dims content while the drawer is open; tap to close */
.sidebar-scrim{display:none}
@media(max-width:1100px){
  body:not(.sidebar-collapsed) .sidebar-scrim{display:block;position:fixed;inset:0;background:rgba(13,30,50,.45);z-index:9;backdrop-filter:blur(1px)}
}

/* Feel: consistent micro-interactions (disabled automatically under prefers-reduced-motion) */
button{transition:filter var(--motion) var(--ease-out),transform var(--motion) var(--ease-out),box-shadow var(--motion) var(--ease-out)}
button:active{transform:translateY(1px)}
.nav{transition:background var(--motion) var(--ease-out),color var(--motion) var(--ease-out)}
.card,.panel,.project-card{transition:box-shadow var(--motion-slow) var(--ease-out)}
.card:hover,.project-card:hover{box-shadow:var(--shadow)}
.attention-row,.review-item,.clean-list li{transition:background var(--motion) var(--ease-out)}
input,select,textarea{transition:border-color var(--motion) var(--ease-out),outline-color var(--motion) var(--ease-out)}

/* Session restore: keep sign-in controls available so a slow Firebase restore never traps users */
body.auth-restoring .auth-controls{display:flex}
body.auth-restoring #authStatus{position:relative;padding-left:24px}
body.auth-restoring #authStatus::before{content:"";position:absolute;left:0;top:50%;width:14px;height:14px;margin-top:-7px;border:2px solid var(--line);border-top-color:var(--blue);border-radius:50%;animation:siite-spin .8s linear infinite}
@keyframes siite-spin{to{transform:rotate(360deg)}}
/* Calm 469 (R2B-06): one busy look for a pressed button that is fetching (siiteMarkBusy, siiteBusyWork). */
button[aria-busy="true"]::before{content:"";display:inline-block;width:12px;height:12px;margin-right:var(--space-2);vertical-align:middle;border:2px solid currentColor;border-right-color:transparent;border-radius:50%;animation:siite-spin .8s linear infinite;opacity:.8}

/* Desktop: sidebar already carries the brand — don't repeat it in the topbar */
@media(min-width:1101px){body:not(.sidebar-collapsed) .topbar-brand{display:none}}

/* ===== Today screen (site-manager one-stop view, mobile-first) ===== */
.today-brief{background:#eaf3fb;border-color:#c4dcf0;color:var(--blue);display:grid;gap:4px}
.today-quick-actions{display:grid;grid-template-columns:repeat(3,1fr);gap:12px;margin-bottom:18px}
.today-quick{display:flex;flex-direction:column;align-items:center;gap:8px;padding:18px 10px;font-size: var(--text-base);background:white;color:var(--blue);border:1px solid var(--line);border-radius:var(--radius);box-shadow:var(--shadow);min-height:92px}
.today-quick span{font-size:var(--text-2xl);line-height:var(--leading-none)}
.today-diary-list,.today-task-list{display:flex;flex-direction:column;gap:var(--space-2)}
.today-diary-row{display:flex;align-items:center;gap:var(--space-3);width:100%;text-align:left;background:#f8fafc;color:var(--ink);border:1px solid var(--line);border-radius:var(--r-md);padding:var(--space-4);box-shadow:none;font-weight:700;min-height:56px}
.today-diary-row.bad{border-left:4px solid var(--bad)}
.today-diary-row.warn{border-left:4px solid var(--warn)}
.today-diary-row.good{border-left:4px solid var(--good)}
.today-diary-name{flex:1;font-size: var(--text-base)}
/* Diary 431: who started today's draft and when, under the job name */
.today-diary-name small{display:block;color:var(--muted);font-size:var(--text-sm);font-weight:400;margin-top:var(--space-1)}
.today-diary-action{color:var(--blue);font-size: var(--text-sm);white-space:nowrap}
.today-task{display:flex;justify-content:space-between;align-items:center;gap:var(--space-3);background:#f8fafc;border:1px solid var(--line);border-radius:var(--r-md);padding:var(--space-3) var(--space-4)}
.today-task small{display:block;color:var(--muted);margin-top:var(--space-1)}
.today-task.danger{border-left:4px solid var(--bad)}
.today-task.warning{border-left:4px solid var(--warn)}
@media(max-width:760px){
  .today-quick-actions{grid-template-columns:1fr}
  .today-quick{flex-direction:row;justify-content:flex-start;min-height:64px;font-size:var(--text-base)}
}

@media(max-width:1320px){
  .dashboard-command{grid-template-columns:1fr;align-items:start}
  .dashboard-command-actions{justify-content:flex-start}
  .dashboard-priority-grid,.dashboard-trust-and-pulse,.dashboard-module-grid{grid-template-columns:1fr}
  .dashboard-pulse-cards{grid-template-columns:repeat(2,minmax(150px,1fr))}
}
@media(max-width:760px){
  .dashboard-command{border-radius:var(--r-md);padding:var(--space-4)}
  .dashboard-command h3{font-size:var(--text-2xl)}
  .dashboard-command p{font-size:var(--text-base)}
  .dashboard-command-actions{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));width:100%;gap:8px}
  .dashboard-pulse-cards,.dashboard-module-card .cards{grid-template-columns:1fr}
  .dashboard-command-actions button{flex:0 1 auto;min-width:0;width:100%;padding:var(--space-2) var(--space-2);font-size: var(--text-sm)}
}

/* ===== Role workspace shell ===== */
.workspace-hero{display:flex;justify-content:space-between;gap:18px;align-items:flex-start;background:linear-gradient(135deg,#102f4f,#173f67);color:white;border-radius:var(--r-lg);padding:var(--space-6);box-shadow:var(--shadow);margin-bottom:18px}
.workspace-hero h3{font-size:var(--text-3xl);letter-spacing:-.02em;margin:4px 0 8px}
.workspace-hero p{max-width:760px;color:#dce8f3;font-weight:600;line-height:var(--leading-snug)}
.workspace-hero .eyebrow{color:#b7d2e8}
.workspace-metrics{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:var(--space-3);margin-bottom:var(--space-4)}
.workspace-grid{align-items:start}
.workspace-actions{display:grid;grid-template-columns:repeat(2,minmax(180px,1fr));gap:12px}
.workspace-action-card{display:flex;flex-direction:column;align-items:flex-start;text-align:left;gap:var(--space-2);background:#fff;border:1px solid var(--line);border-radius:var(--r-md);padding:var(--space-4);color:var(--ink);box-shadow:none;min-height:112px}
.workspace-action-card strong{font-size:var(--text-lg);color:#123452}
.workspace-action-card span{color:var(--muted);font-weight:600;line-height:var(--leading-snug)}
.workspace-action-card:hover{border-color:#8db6d8;background:#f6fbff}
.workspace-watch-list{display:grid;gap:10px;margin:0;padding:0;list-style:none}
.workspace-watch-list li{border:1px solid #e3ebf4;background:#f8fbfd;border-radius:var(--r-md);padding:12px 13px;color:#253f59;font-weight:700;line-height:var(--leading-snug)}
.workspace-note{margin-top:14px;border-left:4px solid var(--blue);background:#f2f7fb;border-radius:0 var(--r-md) var(--r-md) 0;padding:13px 14px;display:grid;gap:4px;color:#26445f}
.workspace-note span{color:var(--muted);font-weight:600;line-height:var(--leading-snug)}
@media(max-width:1320px){.workspace-hero{display:grid}}
@media(max-width:760px){
  .workspace-hero{border-radius:var(--r-md);padding:18px}
  .workspace-hero h3{font-size:var(--text-2xl)}
  .workspace-actions{grid-template-columns:1fr}
}

/* ===== JBP-branded report output (screen + print) ===== */
.report-brand{display:grid;justify-items:center;text-align:center;gap:10px;background:white;color:var(--jbp-navy);border:2px solid var(--jbp-navy);border-top:6px solid var(--jbp-gold);border-radius:var(--r-md);padding:22px 24px 18px;margin-bottom:22px;-webkit-print-color-adjust:exact;print-color-adjust:exact}
.report-brand-mark{display:grid;justify-items:center;gap:8px;width:100%}
.report-brand-logo{display:grid;place-items:center;width:min(340px,80vw);height:auto;min-height:60px;background:transparent;color:var(--jbp-navy);font-weight:700;font-size: var(--text-base);letter-spacing:.04em;padding:0}
.report-brand-logo img{display:block;width:100%;height:auto;max-height:96px;object-fit:contain;object-position:center}
.report-brand-mark strong{display:block;font-size:var(--text-base);letter-spacing:.14em;text-transform:uppercase}
.report-brand-mark small{display:block;color:var(--jbp-muted);font-size: var(--text-xs);letter-spacing:.05em;margin-top:3px}
.report-brand-meta{display:flex;justify-content:center;gap:12px;flex-wrap:wrap;font-size: var(--text-xs);color:var(--jbp-muted);letter-spacing:.1em;text-transform:uppercase}
.report-view h2{letter-spacing:-.02em;margin-bottom:4px}
.report-view h3{margin-top:22px;padding-top:14px;border-top:1px solid var(--line);letter-spacing:.02em}
.report-brand-footer{display:flex;justify-content:space-between;gap:14px;margin-top:28px;padding-top:14px;border-top:2px solid var(--jbp-gold);font-size: var(--text-xs);color:var(--muted);letter-spacing:.1em;text-transform:uppercase}
@media print{
  .report-brand{border-radius:0;margin:0 0 18px}
  .report-brand-footer{position:fixed;bottom:0;left:0;right:0;background:white;padding:8px 0}
}
@media(max-width:760px){.report-brand{padding:18px 16px}.report-brand-logo{width:min(280px,86vw);min-height:50px}.report-brand-meta{gap:8px}}

/* AI cost-code suggestions */
.ai-suggestion-list{display:flex;flex-direction:column;gap:10px;margin-bottom:12px}
.ai-suggestion{display:flex;justify-content:space-between;gap:12px;align-items:center;background:#f4f9ff;border:1px solid #cfe3f5;border-left:4px solid var(--blue-2);border-radius:var(--r-md);padding:12px 14px}
.ai-suggestion-body{display:flex;flex-direction:column;gap:3px;min-width:0}
.ai-suggestion-body small{color:var(--muted)}
.ai-suggestion-code{font-size:var(--text-base)}
.ai-suggestion-actions{display:flex;gap:8px;flex-shrink:0}
.ai-suggestion-actions button{padding:var(--space-2) var(--space-3);font-size: var(--text-sm)}
@media(max-width:760px){.ai-suggestion{flex-direction:column;align-items:stretch}}

/* ===== AI Team ===== */
.ai-team-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:var(--space-4)}
.ai-team-card{display:flex;flex-direction:column;align-items:flex-start;gap:var(--space-2);text-align:left;background:white;color:var(--ink);border:1px solid var(--line);border-radius:var(--radius);padding:var(--space-4);box-shadow:var(--shadow);min-height:170px}
.ai-team-card:hover{box-shadow:var(--shadow)}
.ai-team-emoji{font-size:var(--text-2xl);line-height:var(--leading-none)}
.ai-team-card strong{font-size:var(--text-base)}
.ai-team-card small{color:var(--muted);font-weight:500;line-height:var(--leading-snug)}
.ai-team-card .ai-expertise-line{color:#214c70;font-weight:700;background:#eef6fc;border:1px solid #d6e6f2;border-radius:var(--r-pill);padding:var(--space-1) var(--space-2)}
.ai-team-card em{color:var(--blue-2);font-size: var(--text-xs);font-style:normal;font-weight:600}
.ai-chat-head{display:flex;align-items:center;gap:10px;margin-bottom:12px;flex-wrap:wrap}
.ai-chat-head strong{flex:1;font-size:var(--text-base)}
.ai-quick-prompts{display:flex;flex-wrap:wrap;gap:8px;margin:0 0 12px}
.ai-quick-prompts button{font-size: var(--text-sm);padding:9px 12px;border-radius:var(--r-pill);background:#f7fafc}
.ai-chat-head .secondary,.ai-chat-head button{white-space:nowrap}
/* The third column was `auto`, so the long "verified" line sized it to its own
   content (791px of 978) and starved the two fr columns down to 75px and 58px —
   the build version and the model names were crushed into narrow ribbons beside
   empty space. Real minimums for the text, and an actions column that may shrink
   because its contents already wrap. */
.ai-health-strip{display:grid;grid-template-columns:minmax(180px,1.3fr) minmax(140px,1fr) minmax(0,auto);gap:var(--space-2);align-items:center;background:var(--bg);border:1px solid var(--line);border-radius:var(--r-md);padding:var(--space-3) var(--space-4);margin:0 0 var(--space-4);box-shadow:var(--shadow-soft)}
.ai-health-strip span{color:var(--muted);font-size: var(--text-sm);font-weight:700;line-height:var(--leading-snug)}
.ai-health-strip span:first-child{display:flex;flex-direction:column;gap:2px}
.ai-health-strip strong{color:var(--ink)}
.ai-health-actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:var(--space-2);align-items:center}
.ai-health-actions small{flex-basis:100%;text-align:right;color:var(--muted);font-weight:700}
.ai-chat-workspace{position:relative;display:grid;grid-template-rows:minmax(300px,56vh) auto;background:white;border:1px solid var(--line);border-radius:var(--radius);overflow:hidden;margin-bottom:14px;box-shadow:var(--shadow-soft)}
.ai-chat-workspace.dragging{border-color:var(--blue-2);box-shadow:var(--shadow-soft)}
.ai-chat-workspace.dragging::after{content:"Drop files to add them to this AI conversation";position:absolute;inset:12px;z-index:5;display:grid;place-items:center;text-align:center;background:rgba(237,247,255,.94);border:2px dashed var(--blue-2);border-radius:var(--r-md);color:var(--blue);font-size:var(--text-base);font-weight:700;pointer-events:none}
.ai-chat-thread{display:flex;flex-direction:column;gap:10px;background:var(--bg);padding:var(--space-4);min-height:300px;overflow:auto;scrollbar-gutter:stable}
.ai-msg{max-width:82%;padding:12px 15px;border-radius:var(--r-md);font-size:var(--text-base);line-height:var(--leading-normal)}
.ai-msg.user{align-self:flex-end;background:var(--blue);color:white;border-bottom-right-radius:4px}
.ai-msg.assistant{align-self:flex-start;background:#f1f6fb;border:1px solid #dbe7f2;border-bottom-left-radius:4px}
.ai-msg.ai-thinking{color:var(--muted);font-style:italic}
.ai-message-evidence{display:flex;flex-wrap:wrap;gap:5px;margin-top:9px;padding-top:8px;border-top:1px solid rgba(120,145,168,.22)}
.ai-evidence-chip{display:inline-flex;align-items:center;max-width:100%;padding:4px 7px;border:1px solid;border-radius:var(--r-pill);font-size: var(--text-xs);font-weight:700;line-height:var(--leading-tight);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.ai-evidence-chip.attached{background:rgba(255,255,255,.12);border-color:rgba(255,255,255,.34);color:inherit}
.ai-evidence-chip.reviewed{background:#e7f5ec;border-color:#b8ddc6;color:var(--good)}
.ai-evidence-chip.skipped{background:#fff4df;border-color:#efd29c;color:#7d5100}
.ai-chat-input{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:10px;align-items:end;background:white;border-top:1px solid var(--line);padding:var(--space-3)}
.ai-chat-attachments{grid-column:1/-1;display:flex;align-items:center;gap:8px;min-width:0}
.ai-chat-attachments button{min-height:var(--control-md);padding:7px 10px;font-size: var(--text-xs)}
.ai-chat-attachments span{color:var(--muted);font-size: var(--text-xs);font-weight:700;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.ai-chat-attachments strong{margin-left:auto;flex:0 0 auto;background:#e9f5ee;border:1px solid #bfdfcc;border-radius:var(--r-pill);padding:5px 8px;color:var(--good);font-size: var(--text-xs)}
.ai-composer-docs{grid-column:1/-1;display:flex;flex-wrap:wrap;gap:5px;margin-top:-4px}
.ai-composer-docs span{display:inline-flex;max-width:260px;padding:5px 8px;border:1px solid #d6e4ef;border-radius:var(--r-pill);background:#f4f8fb;color:#31506d;font-size: var(--text-xs);font-weight:700;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.ai-chat-input textarea{width:100%;min-height:54px;max-height:180px;margin:0;resize:vertical;border-radius:var(--r-sm)}
.ai-chat-send{display:grid;gap:6px;justify-items:end}
.ai-chat-send small{color:var(--muted);font-size: var(--text-xs);font-weight:700;white-space:nowrap}
.ai-chat-send button{min-width:92px;min-height:var(--control-md)}
.ai-workbench-trigger{background:#1d628f;border-color:#1d628f;color:#fff}
.ai-workbench-panel{display:grid;gap:14px;margin:0 0 14px;padding:var(--space-4);border-left:4px solid var(--blue-2);background:var(--panel)}
.ai-workbench-title{align-items:flex-start;margin:0}
.ai-workbench-title h3{margin:3px 0 4px;font-size:var(--text-xl)}
.ai-workbench-title>div>span:last-child{display:block;color:var(--muted);line-height:var(--leading-snug)}
.ai-workbench-artifact{display:flex;align-items:center;justify-content:space-between;gap:16px;padding:14px;border:1px solid #cfe2f1;border-radius:var(--r-sm);background:#eef7fd}
.ai-workbench-artifact strong{display:block;margin:3px 0;font-size:var(--text-base)}.ai-workbench-artifact p{margin:0;color:var(--muted)}
.ai-workbench-actions{display:flex;gap:8px;flex:0 0 auto}
.ai-workbench-section-head{display:flex;align-items:center;justify-content:space-between;gap:12px}
.ai-workbench-section-head>div{display:grid;gap:2px}.ai-workbench-section-head span{color:var(--muted);font-size: var(--text-sm);font-weight:700}
.ai-workbench-changes{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:9px}
.ai-workbench-change{display:grid;grid-template-columns:auto 1fr;gap:10px;align-items:flex-start;padding:var(--space-3);border:1px solid #dbe7f1;border-radius:var(--r-sm);background:#fff;cursor:pointer}
.ai-workbench-change.selected{border-color:#7fb2d4;background:#f2f9fd;box-shadow:inset 3px 0 #2e79aa}.ai-workbench-change input{margin-top:4px;width:18px;height:18px}
.ai-workbench-change>span{display:grid;gap:5px;min-width:0}.ai-workbench-change>span>strong{font-size:var(--text-base)}.ai-workbench-change small{color:var(--muted);line-height:var(--leading-snug)}
.ai-workbench-change-meta{display:flex;align-items:center;gap:7px;flex-wrap:wrap}.ai-workbench-change-meta b{color:#24577c;font-size: var(--text-xs);text-transform:uppercase;letter-spacing:.1em}.ai-workbench-change-meta .pill{font-size: var(--text-xs)}
.ai-workbench-sources{padding-top:5px;border-top:1px solid #e4edf4;color:#315c7b!important;font-weight:700}
.ai-workbench-notes{padding:var(--space-3);border:1px solid #ead9a7;border-radius:var(--r-sm);background:var(--status-warning-surface)}.ai-workbench-notes ul{margin:7px 0 0;padding-left:20px}
.ai-workbench-footer{display:flex;align-items:center;justify-content:space-between;gap:16px;border-top:1px solid #dfe9f2;padding-top:12px}.ai-workbench-footer small{max-width:760px;color:var(--muted);font-weight:700;line-height:var(--leading-snug)}
.ai-document-panel{background:white;border:1px solid var(--line);border-radius:var(--radius);padding:14px;margin-bottom:12px;box-shadow:var(--shadow-soft)}
.ai-document-actions{display:flex;align-items:baseline;gap:10px;flex-wrap:wrap;margin-bottom:10px}
.ai-document-actions strong{font-size:var(--text-base)}
.ai-document-drop{display:flex;align-items:center;gap:9px;flex-wrap:wrap;background:#f5f8fb;border:1px dashed #bfd2e4;border-radius:var(--r-md);padding:var(--space-3)}
.ai-document-drop.dragging{background:#eaf4ff;border-color:var(--blue-2)}
.ai-document-drop small{flex-basis:100%;color:var(--muted);font-weight:600}
.ai-document-review-actions{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin:10px 0 2px}
.ai-document-review-actions small{flex:1 1 260px;color:var(--muted);font-weight:600;line-height:var(--leading-snug)}
.ai-knowledge-strip{display:grid;grid-template-columns:repeat(6,minmax(110px,1fr)) auto auto;gap:8px;align-items:center;background:var(--bg);border:1px solid var(--line);border-radius:var(--r-md);padding:10px;margin-bottom:10px}
.ai-knowledge-strip span{display:flex;flex-direction:column;gap:2px;background:white;border:1px solid #e3edf6;border-radius:var(--r-md);padding:8px 10px;color:var(--muted);font-size: var(--text-xs);font-weight:700;min-height:52px}
.ai-knowledge-strip strong{color:var(--ink);font-size: var(--text-base)}
.ai-knowledge-strip button{white-space:nowrap;padding:9px 12px}
.ai-knowledge-note{margin:-2px 0 10px;color:var(--muted);font-size: var(--text-sm);font-weight:700;line-height:var(--leading-snug)}
.ai-opportunity-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:10px;margin:10px 0 12px}
.ai-opportunity-card{background:var(--panel);border:1px solid #dfe9f4;border-radius:var(--r-md);padding:14px;box-shadow:var(--shadow-soft)}
.ai-opportunity-card .eyebrow{display:block;color:#2e6d9e;font-size: var(--text-xs);letter-spacing:.1em;text-transform:uppercase;font-weight:600;margin-bottom:6px}
.ai-opportunity-card strong{display:block;color:var(--ink);font-size:var(--text-base);margin-bottom:6px}
.ai-opportunity-card p{margin:0;color:var(--muted);font-weight:600;line-height:var(--leading-snug)}
.ai-opportunity-panel{background:var(--panel);border:1px solid var(--line);border-radius:var(--r-md);padding:var(--space-4);margin-top:var(--space-3);box-shadow:var(--shadow-soft)}
.ai-drive-review-panel{background:var(--bg);border:1px solid #d8e5f0;border-radius:var(--r-sm);padding:14px;margin:12px 0;display:grid;gap:12px}
.ai-drive-review-panel .panel-title{align-items:flex-start}
.ai-drive-review-panel .panel-title h3,.ai-drive-review-panel .panel-title h4{margin:0}
.ai-drive-review-panel .panel-title p{margin:4px 0 0}
.ai-drive-review-stats{display:grid;grid-template-columns:repeat(4,minmax(120px,1fr));gap:8px}
.ai-drive-review-stats span{background:#fff;border:1px solid #dfe9f2;border-radius:var(--r-sm);padding:9px 10px;color:var(--muted);font-size: var(--text-xs);display:flex;flex-direction:column;gap:2px}
.ai-drive-review-stats strong{font-size:var(--text-base);color:var(--ink)}
.ai-drive-review-actions{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.ai-drive-review-run{background:#fff;border:1px solid #dfe9f2;border-radius:var(--r-sm);padding:var(--space-3)}
.ai-drive-review-run ul{margin:8px 0;padding-left:20px}
.ai-drive-reviewed-files{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px;margin-top:10px}
.ai-drive-reviewed-files>div{border-left:3px solid var(--blue);background:var(--bg);padding:10px}
.ai-drive-reviewed-files p{margin:6px 0;color:var(--muted);font-size: var(--text-sm)}
.ai-drive-reviewed-files a{font-weight:700;font-size: var(--text-xs)}
.ai-drive-reviewed-files.detailed{grid-template-columns:1fr}
.ai-drive-reviewed-file{border:1px solid #dfe9f2;border-radius:var(--r-sm);background:#fff;padding:var(--space-3)}
.ai-drive-reviewed-file>summary{display:flex;align-items:flex-start;justify-content:space-between;gap:12px;cursor:pointer;list-style:none}
.ai-drive-reviewed-file>summary::-webkit-details-marker{display:none}
.ai-drive-reviewed-file>summary span:first-child{display:grid;gap:3px}
.ai-drive-reviewed-file>summary small{color:var(--muted);font-weight:700}
.ai-document-findings-grid,.ai-cross-document-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:9px;margin:12px 0}
.ai-document-finding-section{border:1px solid #dfe9f2;border-left:4px solid var(--blue);border-radius:var(--r-sm);background:#f9fcff;padding:10px}
.ai-document-finding-section.critical{border-left-color:var(--bad);background:#fff7f7}
.ai-document-finding-section.warn{border-left-color:var(--warn);background:var(--status-warning-surface)}
.ai-document-finding-section h5,.ai-source-evidence h5{margin:0 0 6px;color:var(--ink);font-size: var(--text-sm)}
.ai-document-finding-section ul{margin:0;padding-left:18px}
.ai-document-finding-section li{margin:4px 0;color:#40576c;font-size: var(--text-sm);line-height:var(--leading-snug)}
.ai-source-evidence{display:grid;gap:7px;margin:12px 0}
.ai-source-evidence>div{display:grid;grid-template-columns:minmax(180px,.8fr) minmax(0,1.4fr);gap:5px 12px;border-left:3px solid #6d91ae;background:#f5f9fc;padding:9px 10px}
.ai-source-evidence strong{font-size: var(--text-xs);color:var(--ink)}
.ai-source-evidence span{font-size: var(--text-sm);color:#40576c}
.ai-source-evidence small{grid-column:2;color:var(--muted);font-style:italic}
.ai-evidence-warning{border-left:4px solid var(--warn);background:#fff8e7;color:#684500;padding:10px;border-radius:var(--r-sm);font-weight:700}
.ai-task-candidates{border-top:1px solid #dfe9f2;padding-top:10px}
.ai-task-candidates>summary{cursor:pointer;font-weight:700;color:var(--ink)}
.ai-task-candidates>div{display:flex;align-items:flex-start;justify-content:space-between;gap:12px;border:1px solid #dfe9f2;border-radius:var(--r-sm);padding:10px;margin-top:8px;background:#fff}
.ai-task-candidates span{display:grid;gap:3px}
.ai-task-candidates small{color:var(--muted);font-weight:700}
.ai-task-candidates p{margin:3px 0;color:#536579;font-size: var(--text-sm)}
.inline-action{display:inline-flex;margin-top:5px}
.ai-opportunity-list{display:grid;grid-template-columns:1fr;gap:var(--space-2);margin-top:var(--space-2)}
.ai-opportunity-row{display:grid;grid-template-columns:minmax(0,1fr) minmax(180px,260px);gap:12px;align-items:start;background:white;border:1px solid #e1ebf4;border-radius:var(--r-md);padding:var(--space-3)}
.ai-opportunity-row strong{display:block;color:var(--ink)}
.ai-opportunity-row small{display:block;color:#2e6d9e;font-weight:700;margin-top:2px}
.ai-opportunity-row p{margin:var(--space-2) 0 0;color:var(--muted);line-height:var(--leading-snug)}
.ai-opportunity-row>span{justify-self:end;text-align:right;color:#46627a;font-weight:700;background:#f3f8fd;border:1px solid #dbe8f3;border-radius:var(--r-pill);padding:var(--space-2) var(--space-2)}
.ai-external-data-panel{display:grid;grid-template-columns:minmax(0,1.2fr) minmax(260px,.8fr);gap:12px;align-items:start;background:#f8fbfd;border:1px solid #dbe8f3;border-radius:var(--r-md);padding:14px;margin:10px 0 12px}
.ai-external-data-panel .eyebrow{display:block;color:#2e6d9e;font-size: var(--text-xs);letter-spacing:.1em;text-transform:uppercase;font-weight:600;margin-bottom:6px}
.ai-external-data-panel strong{display:block;color:var(--ink);font-size: var(--text-base);margin-bottom:6px}
.ai-external-data-panel p{margin:0;color:var(--muted);font-weight:600;line-height:var(--leading-snug)}
.ai-operating-review-panel{background:#fff;border:1px solid #dfe9f4;border-radius:var(--r-md);padding:var(--space-4);margin:var(--space-4) 0;box-shadow:var(--shadow)}
.ai-ops-monitor-panel{background:#fff;border:1px solid #dfe9f4;border-radius:var(--r-md);padding:var(--space-4);margin:var(--space-4) 0;box-shadow:var(--shadow)}
.ai-monitor-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:var(--space-2);margin-top:var(--space-3)}
.ai-monitor-card{display:grid;gap:var(--space-2);background:var(--panel);border:1px solid #dfe9f4;border-radius:var(--r-md);padding:var(--space-3);min-height:142px}
.ai-monitor-card strong{display:block;color:var(--ink);font-size:var(--text-base);margin:var(--space-2) 0 2px}
.ai-monitor-card small{display:block;color:var(--muted);font-weight:700;line-height:var(--leading-snug)}
.ai-monitor-card p{margin:0;color:#40576c;font-weight:700;line-height:var(--leading-snug)}
.ai-operating-actions{display:flex;gap:var(--space-2);flex-wrap:wrap;margin:var(--space-3) 0}
.ai-operating-kpis{display:grid;grid-template-columns:repeat(auto-fit,minmax(170px,1fr));gap:var(--space-2);margin:var(--space-3) 0}
.ai-review-list{display:grid;gap:10px;margin-top:12px}
.ai-review-card{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:14px;align-items:start;border:1px solid #dfe9f4;border-left:5px solid #5b86a8;border-radius:var(--r-md);padding:13px;background:var(--panel)}
.ai-review-card.critical,.ai-review-card.high{border-left-color:var(--bad)}
.ai-review-card.medium{border-left-color:var(--warn)}
.ai-review-card strong{display:block;margin:8px 0 4px;color:var(--ink);font-size:var(--text-base)}
.ai-review-card p{margin:0 0 6px;color:#41576c;line-height:var(--leading-snug);font-weight:600}
.ai-review-card small{color:var(--muted);font-weight:700}
.ai-review-actions{display:flex;gap:8px;justify-content:flex-end;align-items:flex-start}
.labour-productivity-panel{margin:16px 0}
.labour-prod-grid{display:grid;grid-template-columns:repeat(4,minmax(140px,1fr));gap:var(--space-2);margin:var(--space-3) 0}
.labour-prod-grid span{display:flex;flex-direction:column;gap:var(--space-1);background:#f6f9fc;border:1px solid #dfe9f4;border-radius:var(--r-md);padding:var(--space-3)}
.labour-prod-grid strong{font-size:var(--text-xl);color:var(--ink);line-height:var(--leading-none)}
.labour-prod-grid small{color:var(--muted);font-weight:700;line-height:var(--leading-tight)}
.labour-prod-columns{display:grid;grid-template-columns:1.1fr .95fr .95fr;gap:12px;align-items:start}
.labour-prod-columns>div{background:var(--panel);border:1px solid #e2ebf4;border-radius:var(--r-md);padding:var(--space-3);min-height:190px}
.labour-prod-columns h4{margin:0 0 var(--space-2);color:var(--ink);font-size: var(--text-base)}
.labour-prod-list{margin:0;padding-left:var(--space-4);color:#40576c;font-weight:700;line-height:var(--leading-normal)}
.labour-prod-list li+li{margin-top:var(--space-2)}
.labour-prod-row{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:5px 10px;border-top:1px solid #e6eef6;padding:9px 0}
.labour-prod-row:first-of-type{border-top:0;padding-top:0}
.labour-prod-row span{font-weight:700;color:var(--ink);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.labour-prod-row strong{font-size:var(--text-base);color:var(--ink);font-variant-numeric:tabular-nums}
.labour-prod-row small{grid-column:1/-1;color:var(--muted);font-weight:700}
.labour-output-panel{border:1px solid #dfe9f4;background:var(--panel);border-radius:var(--r-md);padding:var(--space-4);margin:var(--space-3) 0}
.labour-output-panel .panel-title{margin:0 0 var(--space-2)}
.labour-output-panel h4{margin:0;color:var(--ink);font-size: var(--text-base)}
.labour-output-panel span:not(.pill){display:block;color:var(--muted);font-weight:700;margin-top:var(--space-1)}
.labour-output-grid{display:grid;grid-template-columns:repeat(3,minmax(180px,1fr));gap:var(--space-2)}
.labour-output-row{display:grid;gap:var(--space-2);border:1px solid #dfe9f4;border-left:5px solid #7a93aa;background:white;border-radius:var(--r-md);padding:var(--space-3)}
.labour-output-row.good{border-left-color:var(--good)}
.labour-output-row.warn{border-left-color:var(--warn)}
.labour-output-row.bad{border-left-color:var(--bad)}
.labour-output-row strong{font-size: var(--text-base);color:var(--ink)}
.labour-output-row small{color:var(--muted);font-weight:700;line-height:var(--leading-snug)}
.labour-output-row em{font-style:normal;color:#40576c;font-weight:700;line-height:var(--leading-snug)}
.labour-time-panel{margin:16px 0;background:var(--panel)}
.labour-permission-banner{display:grid;grid-template-columns:auto auto minmax(0,1fr);gap:var(--space-2) var(--space-2);align-items:center;border:1px solid #dbe8f3;background:var(--bg);border-radius:var(--r-md);padding:var(--space-3) var(--space-3);margin:var(--space-2) 0;color:#40576c}
.labour-permission-banner strong{color:var(--ink)}
.labour-permission-banner small{font-weight:400;line-height:var(--leading-snug)}
.labour-clock-policy{display:flex;flex-wrap:wrap;gap:8px;align-items:center;margin:10px 0 12px;color:var(--muted);font-weight:400}
.labour-clock-policy span:not(.pill){background:#f5f9fd;border:1px solid #dde9f4;border-radius:var(--r-pill);padding:7px 10px}
.labour-time-kpis{display:grid;grid-template-columns:repeat(auto-fit,minmax(170px,1fr));gap:var(--space-2);margin:var(--space-3) 0}
/* Audit LM-07: Clock in is the screen's primary site action - filled, 52px. */
body:not(.login-mode) button.labour-clock-in{min-height:52px;width:100%}
.labour-clock-reference{margin-top:12px}
.labour-time-workspace{display:grid;grid-template-columns:minmax(280px,.9fr) minmax(0,1.1fr);gap:var(--space-4);align-items:start}
.labour-manager-panel{display:flex;justify-content:space-between;gap:12px;align-items:center;border:1px solid #dbe8f3;background:var(--bg);border-radius:var(--r-md);padding:var(--space-3);margin:12px 0}
.labour-manager-panel strong{display:block;color:var(--ink);font-size: var(--text-base)}
.labour-manager-panel small{display:block;color:var(--muted);font-weight:700;margin-top:var(--space-1)}
.labour-signoff-panel,.labour-payroll-panel,.labour-biometric-panel{border:1px solid #dbe8f3;background:var(--bg);border-radius:var(--r-md);padding:var(--space-4);margin:var(--space-3) 0}
.labour-signoff-panel .panel-title{margin:0 0 var(--space-2)}
.labour-signoff-panel h4,.labour-payroll-panel h4{margin:0;color:var(--ink);font-size:var(--text-base)}
.labour-signoff-panel .panel-title span:not(.pill),.labour-payroll-panel p{color:var(--muted);font-weight:400;line-height:var(--leading-snug);margin:var(--space-1) 0 0}
.labour-signoff-list{display:grid;grid-template-columns:repeat(2,minmax(220px,1fr));gap:var(--space-2)}
.labour-signoff-card{display:grid;gap:8px;background:#fff;border:1px solid #dfe9f4;border-left:5px solid #7a93aa;border-radius:var(--r-md);padding:var(--space-3)}
.labour-signoff-card.good{border-left-color:var(--good)}
.labour-signoff-card.warn{border-left-color:var(--warn)}
.labour-signoff-card.bad{border-left-color:var(--bad)}
.labour-signoff-card strong{font-size: var(--text-base);color:var(--ink)}
.labour-signoff-card > small{color:var(--muted);font-weight:700;line-height:var(--leading-snug)}
/* Visual 459: a week opened to "Each man, each day" takes the whole row, so its table fits instead of scrolling inside half a card. */
.labour-signoff-card:has(details.labour-signoff-days[open]){grid-column:1/-1}
.labour-payroll-panel{display:grid;grid-template-columns:minmax(240px,.8fr) minmax(0,1.2fr);gap:var(--space-4);align-items:center}
.labour-recon-grid{display:grid;grid-template-columns:repeat(3,minmax(110px,1fr));gap:8px}
.labour-recon-grid span{display:flex;flex-direction:column;gap:2px;background:white;border:1px solid #dfe9f4;border-radius:var(--r-md);padding:var(--space-2)}
.labour-recon-grid strong{color:var(--ink);font-size:var(--text-lg);line-height:var(--leading-none)}
.labour-recon-grid small{color:var(--muted);font-weight:700;line-height:var(--leading-tight)}
.labour-biometric-panel{display:grid;grid-template-columns:auto auto minmax(0,1fr);gap:var(--space-2) var(--space-2);align-items:center;background:var(--status-warning-surface);border-color:#f1d18b}
.labour-biometric-panel strong{color:#5d3d00}
.labour-biometric-panel small{grid-column:1/-1;color:var(--warn-ink);font-weight:400;line-height:var(--leading-snug)}
.workforce-time-warning{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:var(--space-1) var(--space-3);align-items:center;border:1px solid #f1c56c;background:var(--status-warning-surface);border-radius:var(--r-md);padding:var(--space-3);margin:var(--space-3) 0;color:#6c4a00}
.workforce-time-warning strong{color:#5d3d00}
.workforce-time-warning span{font-weight:700;line-height:var(--leading-snug)}
.workforce-reminder-scheduler{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:12px;align-items:center;border:1px solid #dbe8f3;background:var(--panel);border-radius:var(--r-md);padding:14px;margin:0 0 12px;box-shadow:var(--shadow-soft)}
.workforce-reminder-scheduler strong{display:block;color:var(--ink);font-size:var(--text-base);margin-top:5px}
.workforce-reminder-scheduler small{display:block;color:var(--muted);font-weight:700;line-height:var(--leading-snug);margin-top:3px}
.workforce-ai-qualification-panel{border:1px solid #cfe0ef;background:var(--panel);border-radius:var(--r-md);padding:var(--space-4);margin:0 0 14px;box-shadow:var(--shadow)}
.workforce-ai-qualification-panel .panel-title{margin:0 0 12px}
.workforce-ai-qualification-panel h3{font-size:var(--text-xl);margin:2px 0 0;color:var(--ink)}
.workforce-ai-kpis{display:grid;grid-template-columns:repeat(auto-fit,minmax(170px,1fr));gap:10px;margin:12px 0}
.workforce-ai-list{display:grid;grid-template-columns:repeat(2,minmax(220px,1fr));gap:10px;margin:12px 0}
.workforce-ai-item{display:grid;gap:6px;background:#fff;border:1px solid #dfe9f4;border-left:5px solid var(--warn);border-radius:var(--r-md);padding:var(--space-3)}
.workforce-ai-item.bad{border-left-color:var(--bad);background:#fff7f7}
.workforce-ai-item.warn{border-left-color:var(--warn);background:var(--status-warning-surface)}
.workforce-ai-item.good{border-left-color:var(--good);background:#f7fcf9}
.workforce-ai-item strong{color:var(--ink);font-size: var(--text-base)}
.workforce-ai-item small{color:var(--muted);font-weight:700;line-height:var(--leading-tight)}
.labour-qr-site-panel{border:1px solid #dbe8f3;background:var(--bg);border-radius:var(--r-md);padding:14px;margin:12px 0}
.labour-qr-site-panel .panel-title{margin:0 0 12px}
.labour-qr-site-panel h4{margin:0;color:var(--ink);font-size:var(--text-base)}
.labour-qr-grid{display:grid;grid-template-columns:repeat(3,minmax(180px,1fr));gap:10px}
.labour-qr-tile{display:grid;gap:var(--space-2);background:white;border:1px solid #dfe9f4;border-radius:var(--r-md);padding:var(--space-2);box-shadow:var(--shadow-soft)}
.labour-qr-tile.active{border-color:#5d8fbb;box-shadow:var(--shadow-soft)}
.labour-qr-select{display:grid;gap:7px;justify-items:start;text-align:left;background:transparent;color:var(--ink);border:0;padding:0;box-shadow:none}
.labour-qr-select:hover{filter:none;transform:none}
.labour-qr-code{width:108px;height:108px;display:grid;place-items:center;background:white;border:1px solid #d8e4ef;border-radius:var(--r-md);padding:var(--space-2)}
.labour-qr-code svg{width:92px;height:92px;display:block}
.labour-qr-mark{width:86px;height:86px;display:grid;place-items:center;border:6px solid #102f4f;background:
  linear-gradient(90deg,#102f4f 12px,transparent 12px 22px,#102f4f 22px 34px,transparent 34px 44px,#102f4f 44px 56px,transparent 56px),
  linear-gradient(#102f4f 12px,transparent 12px 22px,#102f4f 22px 34px,transparent 34px 44px,#102f4f 44px 56px,transparent 56px);
  background-color:#fff;border-radius:var(--r-sm);overflow:hidden}
.labour-qr-mark span{background:white;border:1px solid #d8e4ef;border-radius:var(--r-pill);padding:4px 7px;color:#102f4f;font-size: var(--text-xs);font-weight:700;letter-spacing:.04em}
.labour-qr-tile strong{font-size:var(--text-base);color:var(--ink)}
.labour-qr-tile small{color:var(--muted);font-weight:400;line-height:var(--leading-tight)}
.labour-qr-link{word-break:break-all;background:#f5f9fd;border:1px solid #e1ebf4;border-radius:var(--r-sm);padding:6px}
.labour-qr-status{display:grid;grid-template-columns:auto minmax(0,1fr);gap:4px 10px;align-items:center;border:1px solid #dbe8f3;background:var(--bg);border-radius:var(--r-md);padding:11px 12px;margin:10px 0}
.labour-qr-status.good{border-color:#bfe0ce;background:#f7fcf9}
.labour-qr-status.warn{border-color:#f1d18b;background:var(--status-warning-surface)}
.labour-qr-status.bad{border-color:#efc1c1;background:#fff7f7}
.labour-qr-status strong{color:var(--ink);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.labour-qr-status small{grid-column:1/-1;color:var(--muted);font-weight:400}
.labour-clock-location{display:grid;gap:var(--space-1);border:1px solid #dfeaf4;background:var(--bg);border-radius:var(--r-md);padding:var(--space-2);margin:2px 0}
.labour-clock-location small{color:var(--muted);font-weight:400;line-height:var(--leading-snug)}
.labour-site-coordinate-setup{display:grid;gap:12px;border:1px solid #efc1c1;border-left:5px solid var(--bad);background:var(--status-critical-surface);border-radius:var(--r-md);padding:var(--space-3)}
.labour-site-coordinate-setup>div:first-child{display:grid;gap:var(--space-1)}
.labour-site-coordinate-setup strong{color:var(--ink);font-size: var(--text-base)}
.labour-site-coordinate-setup small{color:var(--muted);font-weight:400;line-height:var(--leading-snug)}
.labour-site-coordinate-fields{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:10px}
.labour-site-coordinate-fields .field{margin:0}
.labour-site-coordinate-fields .wide{grid-column:1/-1}
.labour-site-coordinate-fields .button-row{justify-content:flex-start}
/* Audit LD13 / LD21 / F4V-05 (pass 4): Time Clock body copy at body weight in
   the muted token (was 700 in a hand-picked #40576c), the dashed border from
   --line, and the identity box is the shared tick box - 24px, never squeezed
   by its flex row (it was a 7px sliver on a phone) - in a 44px row. */
.labour-clock-evidence{display:grid;gap:var(--space-1);border:1px dashed var(--line);background:var(--panel);border-radius:var(--r-md);padding:var(--space-2);color:var(--muted);font-weight:400}
.labour-clock-evidence label{display:flex;gap:var(--space-2);align-items:center;min-height:var(--control-md);color:var(--ink)}
.labour-clock-evidence input[type=checkbox]{flex:0 0 24px;width:24px;height:24px;min-height:0;margin:0;accent-color:var(--blue)}
.labour-clock-evidence small{color:var(--muted);line-height:var(--leading-snug)}
.labour-clock-card{display:grid;gap:var(--space-2);background:#fff;border:1px solid #dfe9f4;border-left:5px solid #2e6d9e;border-radius:var(--r-md);padding:var(--space-4);box-shadow:var(--shadow-soft)}
.labour-clock-card.live{border-left-color:var(--good);background:var(--panel)}
.labour-clock-card strong{font-size:var(--text-xl);color:var(--ink)}
.labour-clock-card p{margin:0;color:var(--muted);font-weight:400;line-height:var(--leading-snug)}
.labour-clock-card .field{margin:0}
.operative-clock-panel{background:var(--panel);max-width:760px;margin:16px auto}
.operative-clock-hero{display:flex;justify-content:space-between;gap:14px;align-items:flex-start;margin-bottom:14px}
.operative-clock-hero h3{font-size:var(--text-2xl);margin:2px 0 4px;color:var(--ink)}
.operative-clock-hero span{display:block;color:var(--muted);font-weight:700;line-height:var(--leading-snug)}
.operative-clock-state{display:flex;gap:8px;align-items:center;flex-wrap:wrap;justify-content:flex-end}
.operative-clock-card{display:grid;gap:13px;background:white;border:1px solid #dce8f2;border-left:6px solid var(--blue);border-radius:var(--r-md);padding:18px;box-shadow:var(--shadow)}
.operative-clock-card.live{border-left-color:var(--good);background:var(--panel)}
.operative-clock-card strong{font-size:var(--text-2xl);color:var(--ink)}
.operative-clock-card p{margin:0;color:#40576c;font-weight:700;line-height:var(--leading-snug)}
.operative-clock-card .field{margin:0}
.operative-primary{width:100%;min-height:58px;font-size:var(--text-lg);border-radius:var(--r-md)}
.operative-clock-note{display:grid;gap:3px;margin-top:13px;border:1px solid #dfeaf4;background:var(--panel);border-radius:var(--r-md);padding:var(--space-3);color:#40576c}
.operative-clock-note strong{color:var(--ink)}
.operative-clock-note span{font-weight:700;line-height:var(--leading-snug)}
.labour-time-side{display:grid;gap:var(--space-2);background:var(--panel);border:1px solid #e2ebf4;border-radius:var(--r-md);padding:var(--space-4)}
.labour-time-side h4{margin:0;color:var(--ink);font-size: var(--text-base)}
.labour-time-row{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:3px 10px;align-items:center;background:#fff;border:1px solid #e1ebf4;border-radius:var(--r-md);padding:10px}
.labour-time-row.live{border-color:#bfe0ce;background:#f7fcf9}
.labour-time-row span{font-weight:700;color:var(--ink);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.labour-time-row strong{font-variant-numeric:tabular-nums;color:var(--ink)}
.labour-time-row small{grid-column:1/-1;color:var(--muted);font-weight:700;line-height:var(--leading-snug)}
.labour-time-row button{grid-column:1/-1;justify-self:start;margin-top:4px}
.labour-time-details{margin-top:var(--space-4)}
.labour-time-register{display:grid;gap:8px;margin-top:12px}
.labour-time-register-row{display:grid;grid-template-columns:1fr 1fr .85fr 1.4fr auto auto auto auto;gap:10px;align-items:center;background:#fff;border:1px solid #e2ebf4;border-radius:var(--r-md);padding:10px}
.labour-time-register-row strong,.labour-time-register-row span{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.labour-time-register-row span{color:#40576c;font-weight:700}
.today-labour-panel{margin:14px 0}
.today-labour-status{display:grid;grid-template-columns:auto 1fr auto;gap:10px;align-items:center;border:1px solid #dfeaf4;background:var(--bg);border-radius:var(--r-md);padding:11px}
.today-labour-status small{color:var(--muted);font-weight:700;line-height:var(--leading-snug)}
.workforce-create-panel{margin:16px 0;background:var(--panel)}
.workforce-create-panel .task-file-drop{min-height:96px;align-content:center}
.workforce-profile-panel{border-color:#cfe0ef;background:var(--panel)}
.workforce-profile-hero{display:flex;justify-content:space-between;gap:16px;align-items:flex-start;border-bottom:1px solid #e1ebf4;padding-bottom:14px;margin-bottom:14px}
.workforce-profile-hero h3{font-size:var(--text-2xl);margin:4px 0;color:var(--ink)}
.workforce-profile-hero span{display:block;color:var(--muted);font-weight:700;line-height:var(--leading-snug)}
.workforce-profile-actions{display:flex;gap:8px;align-items:center;justify-content:flex-end;flex-wrap:wrap}
/* Contact details sit above the metrics: on site, the number is the thing you
   actually came here for. */
.workforce-profile-contact{display:flex;flex-wrap:wrap;gap:8px 18px;align-items:center;margin:10px 0 0;font-weight:700;font-size: var(--text-sm);color:var(--ink)}
.workforce-profile-contact a{color:var(--ink);text-decoration:underline}
.workforce-profile-kpis{display:grid;grid-template-columns:repeat(5,minmax(120px,1fr));gap:10px;margin:12px 0 16px}
.workforce-profile-kpis span{display:grid;gap:4px;background:#f4f8fc;border:1px solid #dfeaf4;border-radius:var(--r-md);padding:11px}
.workforce-profile-kpis strong{color:var(--ink);font-size:var(--text-lg);line-height:var(--leading-tight);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.workforce-profile-kpis small{color:var(--muted);font-weight:700}
.workforce-profile-grid{align-items:stretch}
.profile-section{background:#fff;border:1px solid #e1ebf4;border-radius:var(--r-md);padding:14px;display:grid;gap:10px;align-content:start}
.profile-section h4{margin:0;color:var(--ink)}
.profile-row{display:flex;justify-content:space-between;gap:10px;align-items:center;border:1px solid #edf3f8;background:var(--panel);border-radius:var(--r-md);padding:10px}
.profile-row span{display:grid;gap:3px;min-width:0}
.profile-row strong{color:var(--ink);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.profile-row small{color:var(--muted);font-weight:700;line-height:var(--leading-snug)}
.profile-notes{display:grid;gap:8px;margin-top:10px}
.profile-notes p{margin:0;color:#40576c;font-weight:700;line-height:var(--leading-snug)}
.profile-notes a{word-break:break-all}
.compact-list li{padding:var(--space-2) var(--space-2)}
.workforce-review{border-left-width:5px}
.workforce-review.bad{border-left-color:var(--bad);background:#fff7f7}
.workforce-review.warn{border-left-color:var(--warn);background:var(--status-warning-surface)}
.workforce-review.good{border-left-color:var(--good);background:#f7fcf9}
.workforce-review .button-row{margin-top:6px}
.workforce-review .mini{padding:7px 10px;min-height:var(--control-md)}
.ai-source-chip-list{display:flex;gap:7px;flex-wrap:wrap;justify-content:flex-end}
.ai-source-chip-list span{background:white;border:1px solid #dbe8f3;border-radius:var(--r-pill);color:#314d67;font-size: var(--text-xs);font-weight:700;padding:6px 9px}
.drive-filing-audit-panel{background:var(--panel);border:1px solid var(--line);border-radius:var(--r-md);padding:var(--space-4);margin:var(--space-3) 0;box-shadow:var(--shadow-soft)}
.drive-filing-audit-panel .panel-title{margin-bottom:8px}
.drive-filing-list{display:grid;gap:10px}
.drive-filing-card{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:14px;align-items:start;background:white;border:1px solid #dce8f2;border-left:4px solid var(--warn);border-radius:var(--r-md);padding:var(--space-3)}
.drive-filing-card.high{border-left-color:var(--bad)}
.drive-filing-card.low{border-left-color:#86a3bc}
.drive-filing-card strong{display:block;margin:5px 0 2px;color:var(--ink)}
.drive-filing-card small{display:block;color:var(--muted);font-weight:700;line-height:var(--leading-snug)}
.drive-filing-card p{margin:6px 0;color:#536579;font-weight:600;line-height:var(--leading-snug)}
.drive-filing-actions{display:flex;align-items:flex-end;justify-content:flex-start;gap:8px;flex-wrap:wrap;min-width:190px}
.drive-filing-actions .secondary,.drive-filing-actions button{padding:8px 10px;font-size: var(--text-xs)}
.ai-document-list{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px;margin-top:10px}
.ai-document-chip{display:flex;align-items:center;justify-content:space-between;gap:10px;border:1px solid var(--line);border-radius:var(--r-md);padding:10px;background:var(--panel)}
.ai-document-chip span{display:flex;flex-direction:column;gap:2px;min-width:0}
.ai-document-chip strong,.ai-document-chip small{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.ai-document-chip small{color:var(--muted);font-size: var(--text-xs);font-weight:600}
.ai-document-chip small.warn-text{color:#8a5700;white-space:normal;overflow:visible;text-overflow:clip;line-height:var(--leading-snug)}
.empty-mini{color:var(--muted);font-weight:600;font-size: var(--text-sm);margin-top:8px}
@media(max-width:1100px){.ai-team-grid{grid-template-columns:repeat(2,1fr)}}
@media(max-width:1100px){.ai-knowledge-strip{grid-template-columns:repeat(2,minmax(120px,1fr))}.ai-knowledge-strip button{width:100%}.ai-opportunity-grid{grid-template-columns:1fr}.ai-opportunity-row,.ai-external-data-panel{grid-template-columns:1fr}.ai-opportunity-row>span{justify-self:start;text-align:left}.ai-source-chip-list{justify-content:flex-start}.ai-monitor-grid{grid-template-columns:repeat(2,minmax(0,1fr))}.ai-operating-kpis,.labour-prod-grid,.labour-time-kpis,.workforce-profile-kpis,.labour-output-grid,.workforce-ai-kpis,.ai-drive-review-stats{grid-template-columns:repeat(2,minmax(120px,1fr))}.labour-prod-columns,.labour-time-workspace,.labour-payroll-panel{grid-template-columns:1fr}.labour-qr-grid,.labour-signoff-list,.workforce-ai-list{grid-template-columns:repeat(2,minmax(160px,1fr))}.labour-time-register-row{grid-template-columns:1fr 1fr}.labour-manager-panel,.today-labour-status,.workforce-reminder-scheduler{grid-template-columns:1fr;display:grid}.labour-manager-panel .button-row{justify-content:flex-start}.ai-review-card{grid-template-columns:1fr}.ai-review-actions{justify-content:flex-start}.workforce-profile-hero,.operative-clock-hero{display:grid}.workforce-profile-actions,.operative-clock-state{justify-content:flex-start}}
@media(max-width:760px){.ai-team-grid{grid-template-columns:1fr}.ai-health-strip{grid-template-columns:1fr}.ai-health-actions{justify-content:stretch}.ai-health-actions button{flex:1}.ai-health-actions small{text-align:left}.ai-msg{max-width:92%}.ai-chat-head>strong{flex:1 1 190px;min-width:180px;white-space:nowrap}.ai-chat-workspace{grid-template-rows:minmax(240px,42vh) auto}.ai-chat-thread{min-height:240px}.ai-chat-input{grid-template-columns:1fr}.ai-chat-attachments span{font-size: var(--text-xs)}.ai-chat-send{display:flex;align-items:center;justify-content:space-between;gap:8px}.ai-chat-send small span{display:none}.ai-chat-send button{min-width:88px}.ai-workbench-artifact,.ai-workbench-footer{align-items:stretch;flex-direction:column}.ai-workbench-actions{display:grid;grid-template-columns:1fr 1fr}.ai-workbench-changes{grid-template-columns:1fr}.ai-workbench-footer button{width:100%}.ai-document-list{grid-template-columns:1fr}.ai-document-drop button{flex:1;min-width:130px}.ai-knowledge-strip{grid-template-columns:1fr}.drive-filing-card{grid-template-columns:1fr}.drive-filing-actions{min-width:0}.drive-filing-actions .secondary,.drive-filing-actions button{flex:1}.ai-monitor-grid,.ai-operating-kpis,.labour-prod-grid,.labour-time-kpis,.labour-qr-grid,.labour-time-register-row,.workforce-profile-kpis,.labour-output-grid,.labour-signoff-list,.labour-recon-grid,.workforce-ai-kpis,.workforce-ai-list,.ai-drive-review-stats,.ai-drive-reviewed-files,.labour-site-coordinate-fields{grid-template-columns:1fr}.labour-site-coordinate-fields .wide{grid-column:1}.labour-site-coordinate-fields .button-row{display:grid}.labour-site-coordinate-fields .button-row button{width:100%}.labour-permission-banner,.labour-biometric-panel{grid-template-columns:1fr}.today-labour-status button{width:100%}.ai-operating-actions button,.ai-review-actions button,.ai-drive-review-actions button{flex:1}.operative-clock-panel{margin:10px 0}.profile-row{display:grid}.operative-clock-hero h3{font-size:var(--text-xl)}}
@media(max-width:760px){.ai-document-review-actions button{flex:1;min-width:130px}.ai-document-findings-grid,.ai-cross-document-grid{grid-template-columns:1fr}.ai-source-evidence>div{grid-template-columns:1fr}.ai-source-evidence small{grid-column:1}.ai-task-candidates>div{align-items:stretch;flex-direction:column}}

/* Auth state machine: CSS-enforced mutual exclusion (trust hardening, 4 Jul 2026) */
body[data-auth-state="signed-in"] #loginPage{display:none!important}
body[data-auth-state="signed-in"] .auth-controls{display:none!important}
body[data-auth-state="signed-out"] #appContent{display:none!important}
body[data-auth-state="restoring"] #appContent{display:none!important}
body[data-auth-state="restoring"] .auth-controls{display:flex!important}

/* Report data-confidence caveat block */
.report-caveat{display:grid;gap:4px;background:#fff8e7;border:1px solid #f1d08d;border-left:4px solid var(--warn);border-radius:var(--r-md);padding:12px 15px;margin:14px 0 6px;font-size: var(--text-xs);color:#684500;-webkit-print-color-adjust:exact;print-color-adjust:exact}
.report-caveat strong{font-size: var(--text-xs);text-transform:uppercase;letter-spacing:.1em}
.report-quality{display:flex;align-items:center;justify-content:space-between;gap:14px;margin:12px 0;padding:10px 14px;border:1px solid #e1b95f;border-left:4px solid var(--warn);border-radius:var(--r-sm);background:#fff9ea;color:#684500;font-size: var(--text-sm)}
.report-quality strong{color:var(--navy)}
.report-quality.ready{border-color:#78c89a;border-left-color:var(--success);background:var(--status-ok-surface);color:var(--good)}
.report-quality span{text-align:right}
@media(max-width:760px){.report-quality{align-items:flex-start;flex-direction:column}.report-quality span{text-align:left}}

/* Command palette */
.command-palette{width:min(560px,92vw);padding:14px}
.command-palette input{width:100%;font-size:var(--text-base);margin-bottom:10px}
.cmd-palette-list{display:flex;flex-direction:column;gap:4px;max-height:50vh;overflow:auto}
.cmd-palette-item{display:flex;justify-content:space-between;align-items:center;gap:12px;width:100%;text-align:left;background:white;color:var(--ink);border:1px solid transparent;border-radius:var(--r-sm);padding:10px 12px;box-shadow:none;font-weight:600}
.cmd-palette-item small{color:var(--muted);font-weight:600}
.cmd-palette-item.active,.cmd-palette-item:hover{background:#eef4fa;border-color:var(--line)}

/* ===== Drawings full-screen workspace (D1) + touch toolbar (D3) ===== */
.drawing-viewer-panel.drawing-fullscreen{position:fixed;inset:0;width:100vw;height:100dvh;max-height:100dvh;z-index:120;margin:0;border-radius:0;overflow:auto;overscroll-behavior:contain;-webkit-overflow-scrolling:touch;scrollbar-gutter:stable both-edges;background:white;padding:16px 18px max(18px,env(safe-area-inset-bottom))}
body.drawing-fullscreen-active{overflow:hidden}
.drawing-fullscreen .drawing-viewer-grid{grid-template-columns:1fr 320px}
.drawing-fullscreen .drawing-tool-rail{display:grid}
@media(max-width:1100px){.drawing-fullscreen .drawing-viewer-grid{grid-template-columns:1fr}}
@media(max-width:760px){
  .drawing-fullscreen .drawing-tool-rail{position:fixed;left:0;right:0;bottom:0;z-index:125;display:flex;overflow-x:auto;gap:8px;background:rgba(16,47,79,.97);padding:10px 12px calc(10px + env(safe-area-inset-bottom));border-radius:var(--r-md) var(--r-md) 0 0}
  .drawing-fullscreen .drawing-tool-rail button{min-height:var(--control-md);min-width:64px;flex-shrink:0;font-size:var(--text-base)}
  .drawing-fullscreen .drawing-tool-rail button.active{background:white;color:var(--blue)}
  .drawing-fullscreen{padding-bottom:80px}
  /* 3 Sep re-audit: the shorthand on .drawing-viewer-panel.drawing-fullscreen beat this padding, and seven stacked header buttons pushed the sheet off screen. */
  .drawing-viewer-panel.drawing-fullscreen{padding-bottom:96px}
  .drawing-viewer-panel.drawing-fullscreen .panel-title .button-row{display:flex;flex-wrap:wrap;gap:6px}
  .drawing-viewer-panel.drawing-fullscreen .panel-title .button-row>*{width:auto;flex:1 1 30%;min-width:0}
}
.drawing-tool-rail .drawing-rail-exit{display:none}
.drawing-fullscreen .drawing-tool-rail .drawing-rail-exit{display:inline-flex}


/* Daily Report evidence links */
.attachment-summary summary{cursor:pointer;color:var(--blue);font-weight:700;list-style:none}
.attachment-summary summary::-webkit-details-marker{display:none}
.attachment-link-list{display:flex;flex-wrap:wrap;gap:7px;margin-top:6px}
.attachment-link-list span{display:inline-flex;align-items:center;border:1px solid var(--line);border-radius:var(--r-sm);padding:7px 9px;background:#f7fafc;color:var(--muted);font-size: var(--text-xs);font-weight:700}
.evidence-gallery-panel{margin-top:14px}
.evidence-gallery-panel .attachment-link-list{gap:9px}
.evidence-gallery-panel .evidence-open-link{justify-content:flex-start}
@media(max-width:760px){.attachment-link-list{flex-direction:column}.attachment-link-list .evidence-open-link{width:100%}}

/* Maintenance / aftercare command centre */
.maintenance-hero {
  display: flex;
  align-items: flex-start;
  justify-content: space-between;
  gap: var(--space-4);
}
.maintenance-hero h3 { margin: 0 0 8px; }
.maintenance-grid { margin-top: 16px; }
.project-shortcuts { align-items: stretch; }
.project-shortcuts button { justify-content: flex-start; }
.maintenance-record-list {
  display: grid;
  gap: 12px;
}
.maintenance-record-card {
  border: 1px solid var(--line);
  border-radius:var(--r-md);
  background: #fff;
  padding: 14px;
  box-shadow:var(--shadow-soft);
}
.record-card-head {
  display: flex;
  justify-content: space-between;
  gap: 12px;
  align-items: flex-start;
}
.record-card-head h4 { margin: 0 0 4px; }
.record-card-head span:not(.pill), .record-sync-line span:last-child { color: var(--muted); font-weight:700; }
.record-meta-grid {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: 8px;
  margin: 12px 0;
}
.record-meta-grid span {
  border: 1px solid var(--line);
  border-radius:var(--r-md);
  background: #f8fafc;
  padding: 9px 10px;
  color: var(--muted);
  font-weight:700;
}
.record-meta-grid strong {
  display: block;
  color: var(--ink);
  font-size: var(--text-xs);
  text-transform: uppercase;
  letter-spacing: .1em;
  margin-bottom: 4px;
}
.record-sync-line {
  display: flex;
  justify-content: space-between;
  gap: 10px;
  align-items: center;
  border-top: 1px solid var(--line);
  padding-top: 10px;
  margin-top: 10px;
}
.register-flow-grid {
  display: grid;
  grid-template-columns: repeat(4, minmax(0, 1fr));
  gap: var(--space-2);
}
.register-flow-grid span {
  display: block;
  border: 1px solid var(--line);
  border-radius:var(--r-md);
  background: #f8fafc;
  padding: 12px;
  color: var(--muted);
  font-weight:700;
}
.register-flow-grid strong {
  display: block;
  color: var(--ink);
  margin-bottom: var(--space-2);
}
@media(max-width:1100px) {
  .maintenance-hero { flex-direction: column; }
  .record-meta-grid, .register-flow-grid { grid-template-columns: 1fr; }
}

/* Director maintenance summary */
.maintenance-director-panel { margin-bottom: 16px; }
.director-maintenance-layout {
  display: grid;
  grid-template-columns: minmax(210px, 300px) minmax(0, 1fr);
  gap: 16px;
  align-items: start;
}
.maintenance-kpi-list {
  display: grid;
  gap: 8px;
}
.maintenance-kpi-list div {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--space-2);
  border: 1px solid var(--line);
  border-radius:var(--r-md);
  background: #f8fafc;
  padding: var(--space-2) var(--space-3);
}
.maintenance-kpi-list span {
  color: var(--muted);
  font-weight:700;
}
.maintenance-kpi-list strong {
  color: var(--ink);
  font-size:var(--text-lg);
  white-space: nowrap;
}
#maintenanceDirectorTable th,
#maintenanceDirectorTable td {
  white-space: nowrap;
}
#maintenanceDirectorTable td:nth-child(2) {
  white-space: normal;
  min-width: 220px;
}
@media(max-width:1100px) {
  .director-maintenance-layout { grid-template-columns: 1fr; }
}

/* Focused project workspaces */
.project-tab-panel-top {
  border-left: 4px solid var(--blue);
}
.focused-workspace-hero {
  margin-bottom: 12px;
}
/* The module's main action sits at the end of its tab row (embedded under
   the page hero), not on a row of its own above it. */
.forms-shell, .daily-shell { display: grid; grid-template-columns: minmax(0, 1fr) auto; column-gap: 12px; }
.forms-shell > *, .daily-shell > * { grid-column: 1 / -1; }
.forms-shell > .module-primary-action, .daily-shell > .module-primary-action { grid-column: 2; grid-row: 1; align-self: end; margin: 0 0 var(--space-2); }
.forms-shell > .module-primary-action + .siite-tabs, .daily-shell > .module-primary-action + .siite-tabs { grid-column: 1; grid-row: 1; }
@media(max-width:760px) {
  .forms-shell > .module-primary-action, .daily-shell > .module-primary-action,
  .forms-shell > .module-primary-action + .siite-tabs, .daily-shell > .module-primary-action + .siite-tabs { grid-column: 1 / -1; grid-row: auto; }
  .forms-shell > .module-primary-action button, .daily-shell > .module-primary-action button { width: 100%; }
}
/* Audit LM-09: on a phone a capture page (a form or diary being filled)
   is one compact header - back, the form's name, the project code - then the
   first question. The project tab strip, the module tabs, the hero's
   description and pills, and the form's second heading step aside; the back
   button returns to all of them. */
@media(max-width:760px) {
  #projectHubContent:has(> .capture-route) > .project-focused-nav,
  #projectHubContent:has(> .capture-route) > .project-tabs-frame,
  #projectHubContent:has(> .capture-route) > .project-subtabs,
  #projectHubContent:has(> .capture-route) .forms-shell > .siite-tabs,
  #projectHubContent:has(> .capture-route) .daily-shell > .siite-tabs,
  #projectHubContent:has(> .capture-route) .form-workspace-head,
  #projectHubContent:has(> .capture-route) .daily-form-head > div:first-child,
  /* Audit LM-09 (third pass): still above the first question on a phone -
     the breadcrumb, the form's purpose / metrics / "LF01 only" block and the
     form's second title (the hero already names it). The progress line,
     any RAMS warning and AI assist stay. */
  #projectHubContent:has(> .capture-route) .breadcrumb,
  #projectHubContent:has(> .capture-route) .form-readiness > div:first-child,
  #projectHubContent:has(> .capture-route) .form-readiness > .readiness-metrics,
  #projectHubContent:has(> .capture-route) .form-readiness > .loading-state,
  #projectHubContent:has(> .capture-route) .dynamic-form-head > div:first-child,
  #projectHubContent:has(> .capture-route) .dynamic-form-head-actions > .pill,
  #projectHubContent:has(> .capture-route) .diary-dictation-head small,
  .capture-route > div:first-child > p:not(.eyebrow),
  .capture-route .project-hero-rag { display: none; }
  .capture-route { padding: 12px 14px; margin-bottom: 10px; }
  .capture-route h3 { font-size: var(--text-lg); margin: 0; }
  .capture-route .back-link { margin-bottom: 6px; }
}
.focused-project-panel {
  padding: 0;
  border: 0;
  background: transparent;
  box-shadow: none;
}
.focused-project-panel > .forms-shell,
.focused-project-panel > .daily-shell {
  border: 1px solid var(--line);
  border-radius:var(--r-md);
  background: #fff;
  padding: var(--space-4);
  box-shadow:var(--shadow);
}
.focused-project-panel .form-builder-layout {
  align-items: start;
}
@media(max-width:760px) {
  .focused-project-panel > .forms-shell,
  .focused-project-panel > .daily-shell { padding: 12px; }
}

.task-summary-cards{grid-template-columns:repeat(auto-fit,minmax(200px,1fr));margin-bottom:16px}
.task-control-box{margin:16px 0;border:1px solid var(--line);border-radius:var(--r-md);background:var(--panel);padding:14px}
.task-control-grid{display:grid;grid-template-columns:repeat(4,minmax(160px,1fr));gap:10px;margin-bottom:10px}
.task-control-box .field span,.task-add-evidence-box .field span{font-weight:600;color:var(--muted);font-size: var(--text-xs);text-transform:uppercase;letter-spacing:.1em}
.task-add-evidence-box{border-color:#cfe0f1;background:#f7fbff}
.task-add-evidence-box .task-file-drop{background:white}
@media(max-width:1100px){.task-control-grid{grid-template-columns:1fr}.task-control-box button,.task-add-evidence-box button{width:100%}}
/* Materials buying intelligence */
.materials-filter-shell{background:var(--bg);border:1px solid var(--line);border-radius:var(--r-md);padding:var(--space-4);margin:var(--space-4) 0 var(--space-4);display:grid;gap:var(--space-4)}
.materials-filter-head,.materials-filter-foot{display:flex;justify-content:space-between;gap:var(--space-4);align-items:center;flex-wrap:wrap}
.materials-filter-head strong{display:block;font-size:var(--text-lg);color:var(--ink)}
.materials-filter-head span,.materials-filter-grid label span{display:block;color:var(--muted);font-size: var(--text-xs);font-weight:600;text-transform:uppercase;letter-spacing:.1em;margin-bottom:var(--space-2)}
.materials-filter-grid{display:grid;grid-template-columns:2fr repeat(5,minmax(150px,1fr));gap:var(--space-2);align-items:end}
.materials-filter-grid input,.materials-filter-grid select{width:100%;min-width:0}
.button-row.tight{margin-top:0}.button-row.tight button{box-shadow:none}
.materials-summary-grid{margin-top:8px}.compact-panel{padding:var(--space-4)}.compact-table table{min-width:620px}.compact-table th,.compact-table td{padding:var(--space-2) var(--space-2);font-size:var(--text-xs)}
/* Grid children must be allowed to shrink below their content's min width,
   otherwise a wide table inside a two-up panel pushes its sibling off-screen
   instead of scrolling inside its own .table-wrap. */
.grid > *{min-width:0}
.link-button{background:transparent;color:var(--blue);border:0;box-shadow:none;padding:0;border-radius:0;text-align:left;font-weight:700;text-decoration:underline;text-underline-offset:3px}.link-button:hover{filter:none;color:var(--blue-2)}
.subtle-details{background:var(--panel)}.subtle-details summary{cursor:pointer;font-weight:700;color:var(--blue);list-style:none}.subtle-details summary::-webkit-details-marker{display:none}.subtle-details summary:after{content:'Open';float:right;background:var(--line);color:var(--muted);border-radius:var(--r-pill);padding:4px 9px;font-size: var(--text-xs)}.subtle-details[open] summary:after{content:'Close'}
@media(max-width:1320px){.materials-filter-grid{grid-template-columns:1fr 1fr}.materials-filter-grid label:first-child{grid-column:1/-1}}
@media(max-width:760px){.materials-filter-grid{grid-template-columns:1fr}.materials-filter-head,.materials-filter-foot{align-items:flex-start;flex-direction:column}.materials-filter-foot a,.materials-filter-head button{width:100%}}


/* Siite visual trust polish pass 2026-07-09 */

body{background:linear-gradient(180deg,#f7f4ee 0,var(--bg) 340px);}
.app-content{display:grid;gap:var(--space-4);}
.sidebar{box-shadow:var(--shadow);}
.brand{padding-bottom:var(--space-6);}
.nav{display:flex;align-items:center;justify-content:flex-start;gap:var(--space-2);min-height:40px;border:1px solid transparent;transition:background var(--motion) var(--ease-out),border-color var(--motion) var(--ease-out),transform var(--motion) var(--ease-out);}
.nav:hover{transform:translateX(2px);border-color:rgba(255,255,255,.12)}
.nav.active,.nav[aria-current="page"]{background:rgba(255,255,255,.16);border-color:rgba(255,255,255,.2);box-shadow:inset 3px 0 0 var(--sand);font-weight:600;color:#fff;}
.nav .ni{width:18px;display:inline-grid;place-items:center;opacity:.85;flex:0 0 auto;} /* Audit LD27 (pass 4): the menu draws the shared line icons, not glyphs */
.nav .ni .siite-icon{width:18px;height:18px;display:block}
.nav .nav-label{flex:1 1 auto;text-align:left;min-width:0;}
.nav .nav-count{margin-left:auto;flex:0 0 auto;background:var(--bad);color:#fff;font-size:var(--text-xs);line-height:var(--leading-none);min-width:18px;height:18px;border-radius:var(--r-pill);display:inline-flex;align-items:center;justify-content:center;font-weight:700;padding:0 var(--space-1);}
.nav .nav-count.hidden{display:none;}
.nav-group{margin-top:var(--space-4);padding-top:var(--space-2);border-top:1px solid rgba(255,255,255,.08)}
.nav-group:first-child{border-top:0;padding-top:0}
.topbar{min-height:132px;align-items:center;}
.topbar .actions{align-self:center;}
.topbar h2{line-height:var(--leading-none);}
.badge,.pill{border:1px solid transparent;letter-spacing:.01em;}
.pill.info{background:var(--info-bg);color:var(--blue)}
.pill.neutral{background:var(--neutral-bg);color:var(--muted)}
button,.button-link,.evidence-open-link{transition:transform var(--motion) var(--ease-out),box-shadow var(--motion) var(--ease-out),background var(--motion) var(--ease-out),border-color var(--motion) var(--ease-out);}
button:hover,.button-link:hover,.evidence-open-link:hover{filter:brightness(1.04)}
button.secondary:hover{background:var(--bg);border-color:var(--line);}
button.mini,.button-link.mini,a.mini{padding:var(--space-2) var(--space-2);border-radius:var(--r-sm);font-size: var(--text-xs);box-shadow:none;}
.card,.panel,.project-card,.source-status-panel{box-shadow:var(--shadow-card);border-color:#e5ebf2;border-radius:var(--r-md);}
.panel{padding:var(--space-5);}
.panel-title{border-bottom:1px solid var(--line);padding-bottom:var(--space-4);}
.panel-title h3{font-size: var(--text-base);font-weight:600;letter-spacing:-.01em;}
.kpi-card{position:relative;overflow:hidden;min-height:98px;border-radius:var(--r-md);background:var(--panel);}
.kpi-card:before{content:"";position:absolute;left:0;right:0;top:0;height:2px;background:var(--line);}
.kpi-card.kpi-good:before{background:var(--good)}
.kpi-card.kpi-warn:before{background:var(--warn)}
.kpi-card.kpi-bad:before{background:var(--bad)}
.kpi-card.kpi-neutral:before{background:#9aa8b6}
.kpi-card .label{font-size: var(--text-xs);color:#607387;}
.kpi-card .value{overflow-wrap:anywhere;}
.kpi-card small{font-weight:700;line-height:var(--leading-snug);}
/* Audit LD23 (third pass): .ledger-cards fixed four columns, so five tiles
   made 4+1 and ten made 4+4+2. It now takes the .cards auto-fit like every
   other stat grid (no column count of its own, at any width). */
.ledger-cards{gap:var(--space-4);}
.ledger-cards.compact{grid-template-columns:repeat(auto-fit,minmax(160px,1fr));}
.ledger-cards .card:nth-child(4){border-color:var(--line);background:var(--panel)}
.money-value{font-variant-numeric:tabular-nums;white-space:nowrap;text-align:right;}
.money-value.negative{color:var(--bad)}
.money-value.positive{color:var(--good)}
.data-confidence-panel{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:18px;align-items:center;border:1px solid var(--line);border-left-width:6px;border-radius:var(--r-md);background:white;padding:18px 20px;box-shadow:var(--shadow-card);margin-bottom:18px;}
.data-confidence-panel.good{border-left-color:var(--good);background:var(--success-bg)}
.data-confidence-panel.warn{border-left-color:var(--warn);background:var(--warning-bg)}
.data-confidence-panel.bad{border-left-color:var(--bad);background:var(--danger-bg)}
.data-confidence-kicker{display:block;color:var(--muted);font-size: var(--text-xs);font-weight:600;text-transform:uppercase;letter-spacing:.1em;margin-bottom:5px;}
.data-confidence-main strong{display:block;font-size:var(--text-lg);color:var(--ink);letter-spacing:-.01em;}
.data-confidence-main p{color:#52677d;font-weight:700;line-height:var(--leading-snug);margin-top:4px;}
.data-confidence-actions{display:flex;gap:10px;align-items:center;justify-content:flex-end;flex-wrap:wrap;}
.data-confidence-panel details{grid-column:1/-1;border-top:1px solid rgba(16,47,79,.1);padding-top:10px;}
.data-confidence-panel summary{cursor:pointer;color:var(--blue);font-weight:700;}
.data-confidence-panel ul{margin:10px 0 0;padding-left:18px;color:#5f4a16;font-weight:700;line-height:var(--leading-snug);}
.source-status-panel{background:var(--panel);}
.source-status-grid{grid-template-columns:repeat(auto-fit,minmax(190px,1fr));}
.source-status-card{min-height:118px;box-shadow:none;}
.source-status-card strong{line-height:var(--leading-tight);}
.data-confidence-badge{width:fit-content;max-width:100%;}
.toolbar,.ledger-toolbar,.materials-filter-shell{background:white;border:1px solid var(--line);border-radius:var(--r-md);padding:var(--space-3);box-shadow:var(--shadow-card);}
.ledger-toolbar{display:grid;grid-template-columns:minmax(240px,1.2fr) repeat(5,minmax(150px,1fr)) auto auto;gap:var(--space-2);align-items:center;}
.ledger-toolbar input,.ledger-toolbar select{min-width:0;width:100%;}
#ledgerActiveFilters{display:flex;gap:var(--space-2);align-items:center;justify-content:space-between;background:#fff;border:1px solid var(--line);border-radius:var(--r-md);padding:var(--space-2) var(--space-3);margin:0 0 var(--space-4);box-shadow:var(--shadow-card);}
#ledgerActiveFilters span{display:flex;gap:var(--space-2);flex-wrap:wrap;}
#ledgerActiveFilters b{background:var(--info-bg);color:var(--blue);border:1px solid #cfe2f2;border-radius:var(--r-pill);padding:var(--space-1) var(--space-2);font-size: var(--text-xs);}




td small{display:block;color:var(--muted);font-size: var(--text-xs);font-weight:400;margin-top:var(--space-1);}
.ledger-table-panel td:nth-child(7),.ledger-table-panel td:nth-child(8),.ledger-table-panel td:nth-child(9),.ledger-table-panel th:nth-child(7),.ledger-table-panel th:nth-child(8),.ledger-table-panel th:nth-child(9){text-align:right;}
.ledger-table-panel .table-wrap{max-height:68vh;}
.ledger-review-list{gap:12px;}
.ledger-review-item{display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:start;background:#fff;border-color:#e9c2c2;border-left:5px solid var(--bad);box-shadow:var(--shadow-card);}
.ledger-review-copy{display:grid;gap:7px;min-width:0;}
.ledger-review-item h4{font-size:var(--text-base);margin:0;color:var(--ink);}
.ledger-review-item p{margin:0;color:#40556b;}
.ledger-review-actions{display:flex;gap:7px;flex-wrap:wrap;margin-top:3px;}
.ledger-breakdown{grid-template-columns:repeat(2,minmax(0,1fr));}
.ledger-mini-table{background:var(--panel);border:1px solid #e5edf5;border-radius:var(--r-md);padding:14px;}
.materials-filter-shell{display:grid;gap:var(--space-3);margin-bottom:var(--space-4);}
.materials-filter-head,.materials-filter-foot{display:flex;align-items:center;justify-content:space-between;gap:var(--space-3);flex-wrap:wrap;}
.materials-filter-head strong{display:block;font-size:var(--text-base);color:var(--ink);}
.materials-filter-head span{display:block;color:var(--muted);font-weight:400;margin-top:var(--space-1);}
.materials-filter-grid{display:grid;grid-template-columns:repeat(6,minmax(150px,1fr));gap:var(--space-2);}
.materials-filter-grid label{display:grid;gap:var(--space-2);}
.materials-filter-grid label span{font-size: var(--text-xs);font-weight:600;text-transform:uppercase;letter-spacing:.1em;color:var(--muted);}
.materials-filter-grid input,.materials-filter-grid select{width:100%;min-width:0;}
.materials-filter-foot .muted{font-weight:400;}
.summary-grid,.commercial-review-grid{gap:var(--space-4);}
.state-row,.empty-state,.error-state{border-radius:var(--r-md);padding:var(--space-4);border:1px solid var(--line);background:var(--panel);display:grid;gap:var(--space-1);}
.error-state{border-color:#e7b6b6;background:var(--danger-bg)}
.state-row strong{font-size:var(--text-base);color:var(--ink)}
.state-row span{color:var(--muted);font-weight:400;line-height:var(--leading-snug)}
@media(max-width:1320px){
  .ledger-toolbar{grid-template-columns:repeat(3,minmax(0,1fr));}
  .materials-filter-grid{grid-template-columns:repeat(3,minmax(0,1fr));}
}
@media(max-width:1100px){
  .data-confidence-panel{grid-template-columns:1fr;}
  .data-confidence-actions{justify-content:flex-start;}
  .ledger-breakdown{grid-template-columns:1fr;}
  .materials-filter-grid{grid-template-columns:1fr;}
}
@media(max-width:760px){
  .topbar{min-height:118px;}
  .ledger-toolbar{grid-template-columns:1fr;}
  #ledgerActiveFilters{display:grid;}
  .ledger-review-item{grid-template-columns:1fr;}
  .money-value{text-align:left;}
  
  
  
  
  
}

/* Siite-wide visual polish pass 2026-07-09 */
main{background:
  radial-gradient(circle at 20% 0%,rgba(31,111,168,.08),transparent 28rem),
  linear-gradient(180deg,#f7f4ee 0,var(--bg) 360px,var(--bg) 100%);
}
/* Fade only, no transform and no fill-mode: an applied transform animation
   makes the view the containing block for position:fixed children, which
   trapped the drawing full-screen workspace 2000px off-screen. */
.view.active{animation:viewFadeIn .18s ease-out;}
@keyframes viewFadeIn{from{opacity:.72}to{opacity:1}}
.panel,.card,.project-card,.lane,.record-page-header,.login-card,.source-status-panel,.data-mode-panel,.data-health-banner,.toolbar,.task-control-box,.task-closeout-box,.hseq-library-card,.ai-document-panel,.programme-status,.daily-head,.programme-head,.forms-shell,.daily-shell{border-color:var(--line);box-shadow:var(--shadow-card);}
/* Audit LD28: tiles are flat white - the brief bans gradients on tiles (this
   rule and ~25 like it were white-to-near-white gradients). */
.panel,.card,.project-card,.lane,.record-page-header,.login-card,.source-status-panel,.data-mode-panel,.data-health-banner,.toolbar{background:var(--panel);}
.panel-title{align-items:flex-start;border-bottom:1px solid var(--line);padding-bottom:var(--space-3);margin-bottom:var(--space-4);}
.panel-title h3{color:#11243a;line-height:var(--leading-tight);}
.panel-title span{font-weight:400;line-height:var(--leading-snug);}
.panel-title .button-row,.panel-title .compact-buttons{margin-top:0;}
.eyebrow{color:#2c6d9e;}
/* Audit LD13: footnotes and body copy read at regular weight; bold is for
   what the eye should land on, not the small print under it. */
.muted{line-height:var(--leading-snug);font-weight:400;}
.badge,.pill,.due-pill{box-shadow:inset 0 0 0 1px rgba(16,47,79,.04);}
.pill{align-items:center;line-height:var(--leading-tight);}
/* Status pills carry a solid edge as well as a tint, so amber and grey never
   read as each other (walkthrough audit, 18 Aug - folded in here from a late
   patch; the warn ink is the --warn-ink token, Audit LD20). */
.pill.good{border:1px solid #a9d9bd;}
.pill.warn{border:1px solid #e0b25c;}
.pill.bad{border:1px solid #e3a3a3;}
.pill.bad:before,.pill.warn:before,.pill.good:before{content:"";width:6px;height:6px;border-radius:var(--r-pill);margin-right:var(--space-2);background:currentColor;opacity:.75;}
/* 2 Sep design system: shape as well as colour - a colour-blind reader tells amber from red by the glyph */
.pill.warn:before{border-radius:1px;transform:rotate(45deg);}
.pill.bad:before{border-radius:1px;}
.button-row.compact-buttons{gap:8px;}
.button-row.compact-buttons button,.button-row.compact-buttons a,.compact-buttons button,.compact-buttons a{min-height:var(--control-md);}
button.danger{background:var(--bad);box-shadow:var(--shadow-soft);}
input,select,textarea{box-shadow:var(--shadow-card);}
textarea{resize:vertical;}
.field span{letter-spacing:.1em;color:#536980;}
.field input,.field textarea,.field select{background:#fff;}
.field input::placeholder,.field textarea::placeholder{color:#98a7b6;}
.form-grid,.task-form-grid,.project-setup-form{gap:12px;}
.clean-list li{background:var(--panel);border-color:#e3ebf4;line-height:var(--leading-snug);}
.state-row,.empty-state,.error-state,.warning-state,.success-state,.table-empty{border-radius:var(--r-md);border:1px solid var(--line);background:var(--panel);}
.success-state{border-color:#b8dec5;background:var(--success-bg);}
.warning-state{border-color:#f2d59a;background:var(--warning-bg);}
.empty-state:before,.table-empty:before{content:"";width:34px;height:4px;border-radius:var(--r-pill);background:#d8e4ef;display:block;margin-bottom:4px;}
.error-state{border-left:5px solid var(--bad);}
.warning-state{border-left:5px solid var(--warn);}
.success-state{border-left:5px solid var(--good);}
.table-empty{display:grid;gap:8px;place-items:start;min-height:82px;}



tr:last-child td{border-bottom:0;}
.stacked-table td:first-child strong,.stacked-table td:first-child a{font-weight:700;color:#122840;}
.cards,.summary-grid,.dashboard-pulse-cards,.daily-summary-grid,.programme-summary-grid,.task-summary-cards,.hseq-readiness-grid,.crm-kpi-grid,.crm-call-summary,.workspace-metrics{gap:var(--space-4);}
.cards .card,.summary-grid .card,.dashboard-pulse-cards .card,.daily-summary-grid .card,.programme-summary-grid .card,.task-summary-cards .card{min-height:122px;}
.dashboard-command,.workspace-hero,.project-hero{position:relative;overflow:hidden;background:
  linear-gradient(135deg,rgba(16,47,79,.98),rgba(24,61,98,.98)),
  radial-gradient(circle at 86% 10%,rgba(183,210,232,.22),transparent 22rem);
}
.dashboard-command:after,.workspace-hero:after,.project-hero:after{content:"";position:absolute;inset:auto -80px -120px auto;width:260px;height:260px;border:1px solid rgba(255,255,255,.08);border-radius:50%;pointer-events:none;}
/* Audit LM-20: z-index here only lifted children over the decorative circle, which the project hero and dashboard header no longer draw. Left on them, it trapped the Maps menu under the tab strip. */
.dashboard-command > *,.project-hero > *{position:relative;}
.workspace-hero > *{position:relative;z-index:1;}
.dashboard-command-actions button,.project-hero button,.workspace-hero button{box-shadow:var(--shadow-soft);}
.dashboard-command{background:linear-gradient(135deg,#102f4f,#173d62);border-radius:var(--r-md);padding:var(--space-4) var(--space-5);margin-bottom:var(--space-4);}
.dashboard-command:after{display:none;}
.dashboard-command h3{font-size:var(--text-2xl);margin:2px 0 var(--space-2);}
.dashboard-command p{font-size: var(--text-base);max-width:760px;}
.dashboard-command-actions{align-items:center;}
.dashboard-command-actions button{min-width:112px;min-height:var(--control-md);border-radius:var(--r-md);}
.dashboard-command-actions .secondary{background:rgba(255,255,255,.94);color:#102f4f;}
.dashboard-readiness .readiness-item{padding:12px 14px;border-radius:var(--r-md);}
.dashboard-readiness .readiness-item small{line-height:var(--leading-snug);}
.dashboard-priority-grid{grid-template-columns:minmax(360px,1fr) minmax(360px,1fr);gap:var(--space-4);}
.dashboard-priority-grid .panel{min-height:0;}
.dashboard-trust-and-pulse{grid-template-columns:minmax(320px,.72fr) minmax(520px,1.28fr);gap:18px;}
.dashboard-pulse-panel .panel-title{margin-bottom:12px;}
.dashboard-pulse-cards .card{min-height:112px;padding:15px;}
.dashboard-pulse-cards .card .label{font-size: var(--text-xs);}
.dashboard-pulse-cards .card small{font-size: var(--text-xs);line-height:var(--leading-tight);}
.dashboard-detail-grid .panel{min-height:0;}
.director-summary,.exception-list{max-height:520px;overflow:auto;padding-right:var(--space-1);scrollbar-width:thin;}
.portfolio-row{grid-template-columns:auto minmax(210px,1.15fr) minmax(120px,.6fr) auto minmax(120px,.45fr);border-radius:var(--r-md);padding:var(--space-3) var(--space-3);}
.exception-row{grid-template-columns:82px minmax(170px,.9fr) minmax(220px,1.4fr);border-radius:var(--r-md);padding:var(--space-3) var(--space-3);}
.dashboard-priority-grid,.dashboard-trust-and-pulse,.dashboard-module-grid,.workspace-grid,.project-detail-grid,.hseq-library-layout,.maintenance-grid{align-items:start;}
.dashboard-module-card,.dashboard-pulse-panel{overflow:hidden;}
.dashboard-module-card .panel-title,.dashboard-pulse-panel .panel-title{margin-bottom:var(--space-4);}
.director-summary article,.exception-list article,.review-item,.queue-item,.feed-item,.rfi-card,.decision-card,.instruction-card,.submission-card,.evidence-card,.maintenance-record-list article,.daily-calendar .calendar-report,.crm-call-note,.ai-suggestion,.task-communication-list article{border-color:#e1e9f2;background:var(--panel);box-shadow:var(--shadow-soft);}
.director-summary article:hover,.exception-list article:hover,.review-item:hover,.queue-item:hover,.feed-item:hover,.rfi-card:hover,.decision-card:hover,.instruction-card:hover,.submission-card:hover,.evidence-card:hover,.maintenance-record-list article:hover,.daily-calendar .calendar-report:hover,.task:hover{border-color:var(--line);box-shadow:var(--shadow-soft);}
.project-area{background:rgba(255,255,255,.48);border:1px solid rgba(223,232,241,.82);border-radius:var(--r-lg);padding:var(--space-4);box-shadow:var(--shadow);}
.project-area-head{border-bottom-color:#e7eef6;}
.project-area-head h3{font-size:var(--text-xl);color:#11243a;}
.project-area-head .badge{background:#fff;}
.project-area-collapsible>summary{cursor:pointer;list-style-position:outside;}
.project-area-collapsible>summary::marker{color:var(--blue);font-size:var(--text-base);}
.project-area-collapsible>summary .project-area-head{display:flex;margin-bottom:0;}
.project-area-collapsible[open]>summary .project-area-head{margin-bottom:12px;}
.project-card{display:grid;gap:12px;align-content:start;min-height:100%;}
.project-card-head h3{letter-spacing:-.03em;}
.project-card .meta{line-height:var(--leading-snug);font-weight:700;}
.numberbox{background:var(--panel);border-color:#e3ebf4;}
.numberbox strong{font-variant-numeric:tabular-nums;}
.project-card-footer{background:var(--panel);margin:2px -2px -2px;padding:13px;border-radius:0 0 var(--r-md) var(--r-md);}
.module-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(190px,1fr));gap:10px;}
.module-grid .module-tile{min-height:82px;display:grid;gap:6px;align-content:center;text-decoration:none;}
.module-grid .module-tile strong{font-size: var(--text-base);color:#122840;}
.module-grid .module-tile span{font-size: var(--text-xs);color:var(--muted);font-weight:700;}
.forms-shell,.daily-shell,.programme-shell{gap:var(--space-4);}
.forms-head,.dynamic-form-head{background:var(--panel);border:1px solid var(--line);border-radius:var(--r-md);padding:18px;box-shadow:var(--shadow-card);}
.form-template-card,.schema-section{border-color:var(--line)!important;background:var(--panel)!important;box-shadow:var(--shadow-soft);}
.schema-section{border-radius:var(--r-md);}
.schema-section legend{background:#fff;border:1px solid var(--line);border-radius:var(--r-pill);padding:var(--space-2) var(--space-3);color:var(--blue);}
.schema-field{border-color:#e4ecf5!important;background:#fff!important;border-radius:var(--r-md);}
.schema-field>span{color:#1d3650!important;font-weight:700!important;}
.checkbox-card,.option-card{border-radius:var(--r-md);border-color:var(--line)!important;background:var(--panel)!important;}
.checkbox-card:hover,.option-card:hover{border-color:#9fbfd9!important;background:#f3f8fd!important;}
/* The chosen state must beat the !important base + :hover above, or a tapped
   Yes/No/N-A shows no feedback: the radio dot is hidden on .yesno (see ~10493),
   so the label background IS the answer. The non-!important highlight at ~936
   was silently overridden here, so site teams could not tell a question had been
   answered (Daily Site Report and Toolbox Talks both). The value was always
   recorded — this is feedback only. */
.daily-head,.programme-head{background:var(--panel);}
.daily-row,.gantt-row,.programme-task-row{box-shadow:var(--shadow-soft);}
.programme-task-row{border-color:var(--line);}
.programme-task-controls input,.programme-task-controls select{min-width:0;}
.task-filter-row,.task-control-grid,.task-closeout-grid{gap:12px;}
.lane{background:#f4f8fc;border-radius:var(--r-md);}
.lane h3{color:#122840;}
.task{border-left:4px solid #ccd9e6;box-shadow:var(--shadow-soft);transition:transform var(--motion) var(--ease-out),border-color var(--motion) var(--ease-out),box-shadow var(--motion) var(--ease-out);}
.task.warning{border-left-color:var(--warn);}
.task.danger{border-left-color:var(--bad);}
.task.complete{border-left-color:var(--good);}
.task-title-button{border-radius:var(--r-sm);}
.task-actions button{min-height:var(--control-md);}
.task-detail-grid div{background:var(--panel);border-color:#e3ebf4;}
.task-file-drop,.ai-document-drop{background:var(--panel);border-color:#b8cfe2;}
.task-file-drop:hover,.ai-document-drop:hover{background:#f4f9ff;border-color:#8fb6d5;}
.record-page-header{background:var(--panel);}
.record-title-block h3{line-height:var(--leading-tight);}
.hseq-command{overflow:hidden;}
.hseq-readiness-card{box-shadow:var(--shadow-soft);}
.hseq-library-card{min-height:100%;}
.hseq-library-head{align-items:flex-start;}
.hseq-mini-list li{background:var(--panel);}
.hseq-next-step{border-left-color:#1f6fa8;background:#eef6ff;}
.report-output-panel{box-shadow:var(--shadow-card);border-color:var(--line);}
.report-toolbar{background:#fff;border:1px solid var(--line);border-radius:var(--r-md);padding:14px;box-shadow:var(--shadow-soft);}
.report-actions{border-radius:var(--r-lg) var(--r-lg) 0 0;background:linear-gradient(180deg,var(--bg),#eef5fb);}
.report-view{background:#fff;margin:0 auto;}
.report-view h2{color:#11243a;}
.report-view h3{color:var(--blue);}
.report-view .muted{line-height:var(--leading-snug);}
.report-view .report-meta span{background:#f4f8fc;border:1px solid #e1e9f2;border-radius:var(--r-pill);padding:6px 10px;color:var(--muted);}
.report-view .table-wrap{box-shadow:none;border-radius:var(--r-md);margin-top:8px;}
.report-view table{border-collapse:separate;border-spacing:0;overflow:hidden;}
.report-view li::marker{color:#1f6fa8;}
.report-caveat{font-size: var(--text-sm);line-height:var(--leading-snug);}
.report-source-list li{line-height:var(--leading-snug);}
.ai-team-grid{gap:var(--space-4);}
.ai-team-card{position:relative;overflow:hidden;}
.ai-team-card:before{content:"";position:absolute;left:0;top:0;bottom:0;width:4px;background:#d8e4ef;}
.ai-team-card:hover:before{background:#1f6fa8;}
.ai-team-emoji{filter:saturate(.82);}
.ai-chat-thread{background:var(--bg);}
.ai-msg.user{background:var(--blue);}
.ai-msg.assistant{background:#fff;border-color:var(--line);}
.context-ai-button{display:inline-flex;align-items:center;gap:var(--space-2);background:#fff;color:#143b60;border:1px solid rgba(255,255,255,.55);box-shadow:var(--shadow-soft);font-weight:700;white-space:nowrap}
.context-ai-button:before{content:"AI";display:grid;place-items:center;width:25px;height:25px;border-radius:50%;background:#143b60;color:#fff;font-size: var(--text-xs);letter-spacing:.04em}
.ai-first-bar{display:flex;align-items:center;justify-content:space-between;gap:16px;margin:14px 22px 0;padding:12px 14px;background:#fff;border:1px solid #cbdbea;border-left:4px solid #1f6fa8;border-radius:var(--r-sm);box-shadow:var(--shadow-soft)}
.ai-first-identity{display:flex;align-items:center;gap:10px;min-width:0}
.ai-first-mark{display:grid;place-items:center;flex:0 0 38px;width:38px;height:38px;border-radius:var(--r-sm);background:#133a5d;color:#fff;font-size: var(--text-xs);font-weight:700;letter-spacing:.06em}
.ai-first-identity>div{display:grid;gap:2px;min-width:0}
.ai-first-identity strong{color:#122b45;font-size: var(--text-base)}
.ai-first-identity span:not(.ai-first-mark){color:#5e7285;font-size: var(--text-xs);font-weight:700;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.ai-first-actions{display:flex;align-items:center;justify-content:flex-end;gap:7px;min-width:0}
.ai-first-actions button{min-height:var(--control-md);padding:8px 11px;font-size: var(--text-xs);white-space:nowrap}
.context-ai-scrim{position:fixed;inset:0;background:rgba(10,28,47,.38);backdrop-filter:blur(2px);z-index:1190}
.context-ai-drawer{position:fixed;top:0;right:0;bottom:0;width:min(500px,94vw);height:100dvh;max-height:100dvh;z-index:1200;background:#f4f7fa;border-left:1px solid #cfdce8;box-shadow:var(--shadow);overflow-y:auto;overflow-x:hidden;overscroll-behavior:contain;-webkit-overflow-scrolling:touch;scrollbar-gutter:stable;padding:18px 18px max(18px,env(safe-area-inset-bottom))}
.context-ai-head{position:sticky;top:-18px;z-index:2;display:flex;align-items:flex-start;justify-content:space-between;gap:14px;background:#f4f7fa;border-bottom:1px solid #d8e3ed;padding:18px 0 14px;margin-bottom:14px}
.context-ai-head>div{display:grid;gap:3px;min-width:0}
.context-ai-head strong{font-size:var(--text-xl);color:#122b45}
.context-ai-head small{color:var(--muted);font-weight:700;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.context-ai-head .icon-btn{flex:0 0 42px;width:42px;height:42px;border-radius:50%;font-size:var(--text-2xl);background:#fff;color:#173d60;border:1px solid #d2deea}
.context-ai-guardrail{display:grid;gap:3px;background:#fff9e9;border:1px solid #efd28a;border-left:4px solid var(--warn);border-radius:var(--r-sm);padding:11px 12px;margin-bottom:12px}
.context-ai-guardrail strong{color:#684806}
.context-ai-guardrail span{color:#6d5a2a;font-size: var(--text-xs);font-weight:700;line-height:var(--leading-snug)}
.context-ai-prompts{display:flex;gap:7px;overflow-x:auto;padding:0 0 10px;scrollbar-width:thin}
.context-ai-prompts button{flex:0 0 auto;white-space:nowrap;font-size: var(--text-xs);padding:8px 10px;background:#fff;color:#204564;border-color:#d2e0eb}
.context-ai-thread{display:flex;flex-direction:column;gap:9px;min-height:min(230px,32dvh);max-height:42dvh;overflow-y:auto;overscroll-behavior:contain;-webkit-overflow-scrolling:touch;scrollbar-gutter:stable;background:#eaf0f6;border:1px solid #d2deea;border-radius:var(--r-md);padding:var(--space-3);margin-bottom:12px}
.context-ai-thread .ai-msg{max-width:92%;font-size: var(--text-sm);padding:10px 12px;border-radius:var(--r-md)}
.context-ai-evidence{display:flex;align-items:center;gap:8px;flex-wrap:wrap;background:#fff;border:1px dashed #acc5d9;border-radius:var(--r-sm);padding:10px;margin-bottom:8px}
.context-ai-evidence button{padding:8px 10px;font-size: var(--text-xs)}
.context-ai-evidence span{color:var(--muted);font-size: var(--text-xs);font-weight:700}
.context-ai-docs{display:flex;gap:6px;overflow-x:auto;margin:0 0 10px}
.context-ai-docs span{flex:0 0 auto;max-width:190px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;background:#fff;border:1px solid #d8e3ed;border-radius:var(--r-pill);padding:6px 9px;color:#31516e;font-size: var(--text-xs);font-weight:700}
.context-ai-input{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:8px;align-items:end;margin-bottom:10px}
.context-ai-input textarea{margin:0;min-height:76px;resize:vertical;background:#fff}
.context-ai-input button{min-height:var(--control-md)}
.context-ai-actions{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px;padding-bottom:max(12px,env(safe-area-inset-bottom))}
.context-ai-actions button{min-height:var(--control-md);font-size: var(--text-xs);padding:9px}
.dynamic-form-head-actions,.task-detail-head-actions{display:flex;align-items:center;justify-content:flex-end;gap:9px;flex-wrap:wrap}
.task-detail-head-actions{flex:0 0 auto}
.ai-knowledge-strip{background:#fff;box-shadow:var(--shadow-card);}
.data-mode-panel,.data-health-banner{margin-bottom:var(--space-4);}
.data-mode-panel strong,.data-health-banner strong{letter-spacing:-.01em;}
.source,.source-status-card{box-shadow:var(--shadow-soft);}
.manifest{gap:var(--space-3);}
.maintenance-hero{background:var(--panel);}
.maintenance-kpi-list div{transition:border-color var(--motion) var(--ease-out),box-shadow var(--motion) var(--ease-out);}
.maintenance-kpi-list div:hover{border-color:var(--line);box-shadow:var(--shadow-soft);}
.map-frame{box-shadow:inset 0 0 0 1px rgba(16,47,79,.05);}
.login-card{box-shadow:var(--shadow);}
.login-logo{box-shadow:var(--shadow-soft);}
@media(max-width:1320px){
  .summary-grid,.daily-summary-grid,.programme-summary-grid{grid-template-columns:repeat(2,minmax(0,1fr));}
  .project-area{padding:var(--space-3);}
  .module-grid{grid-template-columns:repeat(2,minmax(0,1fr));}
}
@media(max-width:760px){
  main{padding:var(--space-4);}
  .panel,.card,.project-card,.lane,.record-page-header,.forms-head,.daily-head,.programme-head{border-radius:var(--r-md);padding:var(--space-4);}
  .panel-title{display:grid;gap:var(--space-2);}
  /* Visual 453 (V3-09, V2-27): stat tiles are two to a row on a phone, not a
     column of full-width tiles 650px long before any content. */
  .summary-grid,.daily-summary-grid,.programme-summary-grid,.form-home-kpis,.siite-status-strip{grid-template-columns:repeat(2,minmax(0,1fr));}
  .module-grid,.crm-call-summary{grid-template-columns:1fr;}
  .project-hero,.dashboard-command,.workspace-hero{border-radius:var(--r-md);padding:var(--space-4);}
  .project-hero h3,.dashboard-command h3,.workspace-hero h3{font-size:var(--text-2xl);}
  .button-row button,.button-row a{flex:1 1 100%;justify-content:center;text-align:center;}
  /* Visual 453 (V3-01): the header clock is not hidden with the other header
     buttons - it shows as a gold icon button on a phone. */
  .topbar .actions button:not(.menu-toggle):not(.notification-button):not(.topbar-clockin),.topbar .actions .badge{display:none;}
  .topbar .actions .context-ai-button{display:inline-flex!important;padding:var(--space-2);width:42px;height:42px;font-size:0;border-radius:50%}
  .topbar .actions .context-ai-button:before{width:24px;height:24px}
>>>

  .ai-first-bar{align-items:stretch;margin:10px 12px 0;padding:11px;gap:10px}
  .ai-first-actions{overflow-x:auto;justify-content:flex-start;padding-bottom:2px}
  .ai-first-actions button{flex:0 0 auto}
  .ai-first-secondary-action{display:none}
  .context-ai-drawer{width:100vw;padding:14px;border-left:0}
  .context-ai-head{top:-14px;padding-top:14px}
  .context-ai-thread{max-height:38vh}
  .context-ai-input{grid-template-columns:1fr}
  .context-ai-actions{grid-template-columns:1fr 1fr}
  .dynamic-form-head-actions{justify-content:flex-start}
  .task-actions button{flex:1 1 calc(50% - 8px);}
  .table-wrap{border-radius:var(--r-md);}
  
  /* Visual 453: ONE phone stack for tables (three competing .stacked-table sets merged here;
     each value is the one that already won). */
  table.stacked-table{min-width:0}
  .stacked-table thead{display:none}
  .stacked-table tbody{display:grid;gap:0}
  .stacked-table tr{overflow:hidden;display:grid;border-bottom:1px solid var(--line);padding:var(--space-2);background:#fff;border:1px solid #e3ebf4;border-radius:var(--r-md);margin:var(--space-2);box-shadow:var(--shadow-soft)}
  .stacked-table td{justify-content:space-between;align-items:baseline;border-bottom:1px solid var(--surface-sunken);display:grid;grid-template-columns:115px minmax(0,1fr);gap:var(--space-2);border:0;padding:var(--space-2) var(--space-1);text-align:left!important}
  .stacked-table td:last-child{border-bottom:0}
  .stacked-table td:empty{display:none}
  .stacked-table td::before{text-align:left;flex-shrink:0;content:attr(data-label);font-size:var(--text-xs);font-weight:600;text-transform:uppercase;letter-spacing:.1em;color:var(--muted)}
  .stacked-table td[data-label=""]::before{content:none}
  .stacked-table tr:hover td{background:white}
  .stacked-table .table-empty{text-align:center}
  .stacked-table{min-width:0}
}

/* Final visual audit pass 2026-07-10 */
main{padding-bottom:44px;}
.topbar{min-height:112px;padding-top:var(--space-5)!important;padding-bottom:var(--space-5)!important;}
.topbar-left{max-width:min(760px,65vw);}
.topbar h2{font-size:var(--text-3xl);overflow-wrap:anywhere;}
.topbar .actions{gap:var(--space-2);}
.topbar .badge{max-width:220px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.project-list-intro,.forms-head,.daily-head,.programme-head,.record-page-header{position:relative;overflow:hidden;}
.project-list-intro:before,.forms-head:before,.daily-head:before,.programme-head:before,.record-page-header:before{content:"";position:absolute;left:0;top:0;bottom:0;width:5px;background:#1f6fa8;opacity:.75;}
.project-list-intro h3,.forms-head h3,.daily-head h3,.programme-head h3,.record-page-header h3{line-height:var(--leading-none);}
.project-list-intro span{line-height:var(--leading-snug);}
.dashboard-command{min-height:126px;}
.dashboard-command-actions{align-content:center;}
.dashboard-command-actions button{min-width:124px;}
.dashboard-priority-grid .panel,.dashboard-module-card,.dashboard-pulse-panel{height:100%;}
.dashboard-module-card .cards,.dashboard-pulse-cards{align-items:stretch;}
.dashboard-module-card .card,.dashboard-pulse-cards .card{display:grid;align-content:start;}
.readiness-strip{display:grid;grid-template-columns:repeat(auto-fit,minmax(210px,1fr));gap:10px;}
.readiness-item{min-width:0;}
.portfolio-row,.exception-row,.attention-row{min-width:0;}
.portfolio-row .rag{justify-self:start;white-space:nowrap;}
.portfolio-stage,.portfolio-net{min-width:0;}
.exception-row small,.attention-row small{overflow-wrap:anywhere;}
.report-toolbar{display:grid;grid-template-columns:minmax(260px,1fr) minmax(220px,.7fr) auto auto;align-items:center;}
.report-toolbar select,.report-toolbar button{width:100%;min-width:0;}
#reportHint{max-width:980px;margin-top:10px;}
.report-actions{position:sticky;top:112px;z-index:4;box-shadow:var(--shadow-soft);}
.report-actions button{min-height:var(--control-md);}
.report-view{max-width:920px;padding:30px 34px;}
.report-view h2{font-size:var(--text-3xl);line-height:var(--leading-none);margin-top:2px;}
.report-view h3{font-size: var(--text-base);}
.report-brand{box-shadow:var(--shadow-soft);}
.report-action-panel{
  display:grid;
  gap:14px;
  margin:18px 0 22px;
  padding:var(--space-4);
  border:1px solid #d7e4ef;
  border-left:5px solid #1f6fa8;
  border-radius:var(--r-md);
  background:var(--bg);
}
.report-action-panel>div:first-child{
  display:grid;
  gap:4px;
}
.report-action-panel>div:first-child strong{
  color:#102f4f;
  font-size:var(--text-lg);
}
.report-action-panel>div:first-child span{
  color:#536980;
  font-weight:700;
  line-height:var(--leading-snug);
}
.report-action-list{
  display:grid;
  grid-template-columns:repeat(auto-fit,minmax(240px,1fr));
  gap:12px;
}
.report-action-list article{
  display:grid;
  gap:8px;
  align-content:start;
  background:white;
  border:1px solid #e1e9f2;
  border-radius:var(--r-md);
  padding:13px;
  box-shadow:var(--shadow-soft);
}
.report-action-list article strong{
  color:#11243a;
  line-height:var(--leading-tight);
}
.report-action-list article small{
  color:#536980;
  font-weight:700;
  line-height:var(--leading-snug);
}
.report-action-list article p{
  color:#40556b;
  line-height:var(--leading-snug);
  margin:0;
}
.report-action-list article button{
  justify-self:start;
  min-height:var(--control-md);
}
.report-actions{
  position:static!important;
  margin-bottom:18px;
  box-shadow:var(--shadow-soft);
}
.report-output-panel{
  scroll-margin-top:24px;
}
.ai-health-strip{border-left:5px solid #1f6fa8;}
.ai-health-strip button{white-space:nowrap;}
.data-mode-panel,.data-health-banner,.sync-warning{position:relative;z-index:1;}

/* Visual 459 (V1-17): every report card the same height (grid-auto-rows:1fr), words from the top, body weight. */
.report-quick-grid{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));grid-auto-rows:1fr;gap:var(--space-3);margin-top:var(--space-4)}
.report-quick-grid button{display:grid;align-content:start;gap:var(--space-2);text-align:left;background:var(--panel);border:1px solid var(--line);border-radius:var(--r-md);padding:var(--space-4);box-shadow:var(--shadow-soft);color:var(--ink);min-height:118px}
.report-quick-grid button:hover{filter:none;border-color:var(--blue-2);box-shadow:var(--shadow)}
.report-quick-grid strong{font-size:var(--text-base);color:var(--blue)}
.report-quick-grid span{font-size: var(--text-sm);line-height:var(--leading-snug);color:var(--muted);font-weight:400}

@media(max-width:1100px){.report-quick-grid{grid-template-columns:repeat(2,minmax(0,1fr))}}
@media(max-width:760px){.report-quick-grid{grid-template-columns:1fr;grid-auto-rows:auto}.report-quick-grid button{min-height:0}}
.toolbar input,.toolbar select,.toolbar button,.button-row button,.button-row a{min-width:0;}
.button-row button,.button-row a{white-space:normal;}
.source-status-grid,.cards,.summary-grid{align-items:stretch;}
.source-status-card,.card{min-width:0;}
.card .value{overflow-wrap:anywhere;}
/* min-width:0 is load-bearing: without it the wrap's minimum resolves to its
   table's content width, so it grows past its panel and paints over the
   neighbouring column instead of scrolling internally. !important because
   browser-extension content styles inject a competing min-width that a plain
   author rule loses to — a scroll wrapper's min-width has only one right value. */
/* Visual 453: the base .table-wrap, merged (the sets above the print rule are merged in their own
   place so print keeps max-height:none; values are the ones that already won). */
.table-wrap{overflow:auto;border:1px solid var(--line);border-radius:var(--r-md);background:#fff;border-color:var(--line);box-shadow:var(--shadow-card);max-width:100%;min-width:0!important;max-height:70vh}
.table-wrap thead th{background:#fff;z-index:1;}
@media print{.table-wrap{max-height:none;overflow:visible}}
@media(max-width:1320px){
  .dashboard-trust-and-pulse,.dashboard-priority-grid{grid-template-columns:1fr;}
  .report-toolbar{grid-template-columns:repeat(2,minmax(0,1fr));}
}
@media(max-width:1100px){
  .topbar{min-height:112px;}
  .topbar-left{max-width:calc(100vw - 116px);}
  .sidebar{top:112px;}
>>>

  .dashboard-module-grid{grid-template-columns:1fr;}
  .report-actions{top:112px;}
}
@media(max-width:760px){
  .topbar{min-height:104px!important;padding:var(--space-4) var(--space-4)!important;}
  .topbar-left{max-width:calc(100vw - 82px);gap:var(--space-2);}
  .topbar-brand strong{font-size:var(--text-base);}
  .topbar-brand span{font-size: var(--text-xs);}
  .topbar h2{font-size:var(--text-2xl);}
>>>

  .sidebar{top:104px;width:min(286px,86vw);}
  .dashboard-command{min-height:0;grid-template-columns:1fr;}
  .dashboard-command-actions{display:grid;grid-template-columns:1fr;}
  .dashboard-command-actions button{width:100%;}
  .readiness-strip{grid-template-columns:1fr;}
  .dashboard-module-card .cards,.dashboard-pulse-cards{grid-template-columns:1fr;}
  .portfolio-row,.exception-row,.attention-row{grid-template-columns:1fr!important;gap:8px;}
  .portfolio-row .project-dot{display:none;}
  .portfolio-row .portfolio-project-title,.portfolio-row .portfolio-stage,.portfolio-row .rag,.portfolio-row .portfolio-net,.exception-row small{grid-column:auto;}
  .portfolio-net{text-align:left;justify-self:start;}
  .report-toolbar{grid-template-columns:1fr;}
  .report-actions{position:static;display:grid;grid-template-columns:1fr 1fr;padding:var(--space-3);}
  .report-actions button{width:100%;}
  .report-view{padding:22px 16px;}
  .report-brand-logo{width:min(220px,80vw);}
}

/* Whole-Siite usability polish pass 2026-07-10 */

main{background:linear-gradient(180deg,#eef4fa 0,#f6f8fb 320px,var(--bg) 100%)}
.app-content{max-width:var(--page-max);margin:0 auto}
.topbar h2:focus{outline:none}
.topbar-left>div:last-child{min-width:0}
button{min-height:var(--control-md)}
button.secondary:hover{background:#f7fbff;border-color:#bed1e4;filter:none}
.button-row button,.toolbar button,.record-header-actions button{white-space:nowrap}
.panel,.card,.project-card,.action-card,.source-status-panel,.record-page-header{box-shadow:var(--shadow-soft);border-color:#dfe7f1}
.panel{padding:var(--space-6);border-radius:var(--r-md)}
.panel-title{align-items:flex-start;border-bottom:1px solid #eef3f7;padding-bottom:var(--space-3);margin-bottom:var(--space-4)}
.panel-title h3{font-size:var(--text-xl);line-height:var(--leading-tight)}
.panel-title span{max-width:46%;text-align:right;line-height:var(--leading-snug)}
.card{border-radius:var(--r-md);min-width:0}
.card .value{overflow-wrap:anywhere}
.kpi-card{position:relative;overflow:hidden}
.kpi-card:before{content:"";position:absolute;inset:0 0 auto;height:4px;background:#c5d5e5}
.kpi-card.kpi-good:before{background:var(--good)}
.kpi-card.kpi-warn:before{background:var(--warn)}
.kpi-card.kpi-bad:before{background:var(--bad)}

.data-mode-panel{box-shadow:var(--shadow-soft);border-radius:var(--r-md);max-width:var(--page-max);margin:-8px auto 18px;padding:11px 14px}
.data-mode-panel.collapsed{padding:0;background:transparent;border:0;box-shadow:none;margin:-10px auto 18px}
.data-mode-chip{display:flex;align-items:center;gap:10px;flex-wrap:wrap;width:100%;min-height:46px;background:#fff;color:var(--ink);border:1px solid var(--line);box-shadow:var(--shadow-soft);border-radius:var(--r-pill);padding:9px 14px;text-align:left}
.data-mode-chip:hover{filter:none;background:var(--panel);border-color:var(--line)}
.data-mode-chip strong{margin:0;color:var(--blue);font-size:var(--text-base)}
.data-mode-chip span{font-size: var(--text-sm);color:var(--muted);font-weight:700}
.data-mode-chip .chip-more{margin-left:auto;color:var(--blue);text-decoration:underline;text-underline-offset:3px}
.status-dot{width:10px;height:10px;border-radius:50%;background:#9aa8b6;box-shadow:var(--shadow-card);flex:0 0 auto}
.status-dot.good{background:var(--good);box-shadow:var(--shadow-card)}
.status-dot.warn{background:var(--warn);box-shadow:var(--shadow-card)}
.status-dot.bad{background:var(--bad);box-shadow:var(--shadow-card)}
.data-mode-panel:not(.collapsed){display:grid;grid-template-columns:repeat(4,minmax(150px,1fr));gap:10px 14px;align-items:start}
.data-mode-panel:not(.collapsed)>strong{grid-column:1/-1;font-size:var(--text-base);margin:0;color:var(--blue)}
.data-mode-panel:not(.collapsed)>span{display:grid;gap:2px;background:rgba(255,255,255,.68);border:1px solid rgba(220,228,238,.8);border-radius:var(--r-md);padding:9px 10px;min-height:48px}
.data-mode-panel .data-mode-hide{grid-column:1/-1;justify-self:end;width:auto;min-height:var(--control-md);padding:7px 12px;box-shadow:none}
.data-mode-actions{grid-column:1/-1;background:rgba(255,255,255,.62);border:1px solid rgba(220,228,238,.85);border-radius:var(--r-md);padding:11px;margin:0}

.dashboard-command{border-radius:var(--r-lg);padding:var(--space-6) var(--space-6);margin-bottom:var(--space-4);box-shadow:var(--shadow-lift);grid-template-columns:minmax(0,1fr) minmax(280px,auto);min-height:0}
.dashboard-command h3{font-size:var(--text-2xl);line-height:var(--leading-none);margin-bottom:var(--space-2)}
.dashboard-command p{font-size: var(--text-base);max-width:860px}
.dashboard-command-actions{display:grid;grid-template-columns:repeat(3,minmax(110px,1fr));gap:var(--space-2);min-width:min(460px,100%)}
.dashboard-command-actions button{width:100%;min-height:var(--control-md);box-shadow:none;white-space:nowrap}
.dashboard-priority-grid,.dashboard-trust-and-pulse,.dashboard-module-grid,.dashboard-detail-grid{gap:var(--space-4)}
.dashboard-priority-grid{grid-template-columns:minmax(0,1fr) minmax(360px,.82fr)}
.dashboard-trust-and-pulse{grid-template-columns:minmax(320px,.72fr) minmax(0,1.28fr)}
.dashboard-module-grid{grid-template-columns:repeat(auto-fit,minmax(360px,1fr))}
.dashboard-pulse-cards{grid-template-columns:repeat(auto-fit,minmax(170px,1fr))}
.dashboard-module-card .cards{grid-template-columns:repeat(auto-fit,minmax(150px,1fr))}

.project-list-intro,.project-hero,.form-workspace-head,.record-page-header{border-radius:var(--r-lg)}
.module-grid{grid-template-columns:repeat(auto-fit,minmax(190px,1fr))}
.toolbar{background:white;border:1px solid var(--line);border-radius:var(--r-md);padding:var(--space-3);box-shadow:var(--shadow-soft);align-items:center;flex-wrap:wrap}
.toolbar input,.toolbar select{flex:1 1 210px;min-width:180px}
.toolbar button{flex:0 0 auto}


.check-panel label{min-height:46px}
.report-view{margin:0 auto;background:white}
.report-actions{gap:10px}
#dashboard,.view.active,#dashboard>*{max-width:100%;min-width:0}
.dashboard-command,.dashboard-priority-grid,.dashboard-trust-and-pulse,.dashboard-module-grid,.dashboard-detail-grid,.readiness-strip{width:100%;max-width:100%;min-width:0}

@media(max-width:1320px){
  .dashboard-priority-grid,.dashboard-trust-and-pulse,.grid.two{grid-template-columns:1fr}
  .panel-title span{max-width:58%}
}
@media(max-width:1100px){
  .topbar{min-height:92px}
  .topbar .actions .badge,#reloadSnapshot{display:none}
  .data-mode-panel:not(.collapsed){grid-template-columns:1fr 1fr}
  .readiness-strip{display:flex;gap:10px;overflow-x:auto;overflow-y:hidden;scroll-snap-type:x proximity;padding-bottom:6px;margin-bottom:14px;contain:inline-size}
  .readiness-item{flex:0 0 285px;max-width:78vw;scroll-snap-align:start;min-height:132px}
  .dashboard-command{grid-template-columns:1fr;padding:var(--space-4)}
  .dashboard-command-actions{grid-template-columns:repeat(3,minmax(0,1fr));min-width:0;width:100%}
  .dashboard-command-actions button{font-size: var(--text-sm);padding:var(--space-2) var(--space-2);white-space:normal}
  .panel-title{display:grid;gap:var(--space-1)}
  .panel-title span{max-width:none;text-align:left}
}
@media(max-width:760px){
  .app-content{max-width:none}
  .topbar{min-height:86px!important}
  .topbar-left{max-width:calc(100% - 58px)}
  .topbar h2{font-size:var(--text-2xl)}
  .topbar .eyebrow{font-size: var(--text-xs);letter-spacing:.1em}
  .data-mode-chip{border-radius:var(--r-md);align-items:flex-start}
  .data-mode-chip .chip-more{margin-left:0;width:100%}
  .data-mode-panel:not(.collapsed){grid-template-columns:1fr}
  .panel,.card,.project-card{padding:var(--space-4);border-radius:var(--r-md)}
  .cards{gap:12px}
  .toolbar{display:grid;grid-template-columns:1fr;padding:var(--space-2)}
  .toolbar input,.toolbar select,.toolbar button{width:100%;min-width:0}
  .dashboard-command h3{font-size:var(--text-2xl)}
  .dashboard-command-actions{grid-template-columns:1fr}
  .project-hero h3{font-size:var(--text-2xl)}
  .project-operating-card .numbers,.numbers{grid-template-columns:1fr}
}
@media(prefers-reduced-motion:reduce){*,*:before,*:after{animation-duration:.001ms!important;animation-iteration-count:1!important;scroll-behavior:auto!important;transition-duration:.001ms!important}}

/* Whole-app UX stabilisation pass 2026-07-10 */

main{
  padding:var(--space-6) var(--space-7) var(--space-10);
}
.app-content{
  display:grid;
  gap:var(--space-4);
}
.topbar{
  min-height:104px;
  margin:calc(var(--space-6) * -1) calc(var(--space-7) * -1) var(--space-5);
  padding:var(--space-5) var(--space-7)!important;
  background:#102f4f!important;
  color:#fff!important;
  border-bottom:0;
}
.topbar .eyebrow,
.topbar h2,
.topbar-brand strong{
  color:#fff;
}
.topbar-brand span{
  color:rgba(255,255,255,.78);
}
.topbar .badge{
  background:rgba(255,255,255,.13);
  color:#fff;
  border-color:rgba(255,255,255,.25);
}
.sidebar{
  box-shadow:var(--shadow);
}
.sidebar nav{
  gap:4px;
}
.sidebar .nav{
  min-height:var(--control-md);
  border-radius:var(--r-md);
  padding:var(--space-2) var(--space-4);
}
.sidebar .nav.active{
  background:rgba(255,255,255,.16);
  box-shadow:inset 0 0 0 1px rgba(255,255,255,.22);
}
.data-mode-panel.collapsed{
  margin:-4px auto 16px;
}
.data-mode-chip{
  min-height:var(--control-md);
  border-radius:var(--r-md);
  box-shadow:var(--shadow-soft);
}
.dashboard-command{
  padding:var(--space-5) var(--space-6);
  border-radius:var(--r-md);
  box-shadow:var(--shadow-board);
}
.dashboard-command h3{
  font-size:var(--text-2xl);
}
.dashboard-command-actions button{
  min-height:var(--control-md);
}
.project-list-intro{
  display:grid!important;
  grid-template-columns:minmax(0,1fr) minmax(260px,auto);
  gap:18px;
  align-items:center;
  padding:18px 20px!important;
}
.project-list-intro h3{
  font-size:var(--text-2xl);
}
.project-list-intro span{
  text-align:right;
  max-width:560px;
}
.panel{
  border-radius:var(--r-md);
  padding:var(--space-5);
}
.card{
  padding:var(--space-4) var(--space-4);
  border-radius:var(--r-md);
}
.panel-title{
  gap:var(--space-3);
}
.panel-title span{
  font-size: var(--text-sm);
}
.toolbar,
.route-controls,
.task-filter-row,
.task-control-grid,
.report-toolbar{
  display:grid!important;
  grid-template-columns:repeat(auto-fit,minmax(180px,1fr));
  gap:var(--space-2);
  align-items:center;
}
.ledger-toolbar{
  display:grid!important;
  grid-template-columns:minmax(240px,1.4fr) repeat(auto-fit,minmax(160px,1fr))!important;
  gap:var(--space-2);
  align-items:center;
}
.toolbar input,
.toolbar select,
.toolbar button,
.route-controls input,
.route-controls select,
.route-controls button,
.task-filter-row input,
.task-filter-row select,
.task-filter-row button,
.task-control-grid input,
.task-control-grid select,
.task-control-grid button,
.report-toolbar select,
.report-toolbar button,
.ledger-toolbar input,
.ledger-toolbar select,
.ledger-toolbar button{
  width:100%;
  min-width:0!important;
  max-width:100%;
}
.toolbar button,
.route-controls button,
.task-filter-row button,
.task-control-grid button,
.report-toolbar button,
.ledger-toolbar button{
  justify-content:center;
  text-align:center;
}
.active-filter-strip{
  display:flex;
  flex-wrap:wrap;
  gap:var(--space-2);
  align-items:center;
}


/* 25 Sep (Commercial 214): a two-column label/value table needs no 760px
   floor, and a wide table inside the valuations panel scrolls within its
   panel rather than pushing the page past the viewport - html and body hide
   horizontal overflow, so at 1000px wide "everything went off to the right". */
.valuation-summary{min-width:0}
.valuation-draft-row,.compact-table{overflow-x:auto;max-width:100%}
/* The top bar's actions wrap rather than carry the menu toggle off the edge
   (Jim, 25 Sep: "where are the collapsible lines?"), and above phone width
   the page may scroll sideways when something is wider than the window -
   hidden overflow was the reason it "went off to the right" unreachably. */
.topbar .actions{flex-wrap:wrap;justify-content:flex-end;min-width:0;row-gap:var(--space-2)}
main{min-width:0}


td small,
.muted{
  line-height:var(--leading-snug);
}
.compact-table,
.ledger-table-panel table{
  min-width:980px;
}
.ledger-table-panel .table-wrap{
  max-height:62vh;
}
.ledger-review-list{
  display:grid;
  gap:10px;
}
.ledger-review-list>*{
  min-width:0;
  overflow-wrap:anywhere;
}
.exception-row,
.attention-row,
.portfolio-row{
  border-radius:var(--r-md);
}
.exception-row{
  grid-template-columns:minmax(140px,.55fr) minmax(0,1fr) auto!important;
  align-items:start;
}
.dashboard-priority-grid .panel .exception-row{
  grid-template-columns:1fr!important;
  gap:9px;
  padding:13px 14px;
}
.dashboard-priority-grid .panel .exception-row span,
.dashboard-priority-grid .panel .exception-row strong,
.dashboard-priority-grid .panel .exception-row small{
  min-width:0;
  overflow-wrap:anywhere;
}
.dashboard-priority-grid .panel .exception-row span:first-child,
.dashboard-priority-grid .panel .exception-row .pill{
  justify-self:start;
}
.dashboard-priority-grid .panel .exception-row small{
  display:block;
  max-width:100%;
}
.director-attention-panel .attention-list{
  display:grid;
  gap:var(--space-2);
}
.director-attention-panel .attention-row{
  display:grid!important;
  grid-template-columns:1fr!important;
  gap:var(--space-2);
  align-items:start;
  text-align:left;
  padding:var(--space-3) var(--space-4);
  overflow:hidden;
}
.director-attention-panel .attention-row .pill,
.director-attention-panel .attention-row span:first-child{
  justify-self:start;
}
.director-attention-panel .attention-row strong,
.director-attention-panel .attention-row small{
  min-width:0;
  max-width:100%;
  overflow-wrap:anywhere;
}
.director-attention-panel .attention-row small{
  display:block;
}
.exception-row small,
.attention-row small{
  font-size: var(--text-xs);
  line-height:var(--leading-tight);
}
.rag,
.badge{
  white-space:normal;
  line-height:var(--leading-tight);
}
/* Visual 453 (V3-06): a status chip never wraps - "Not safe: not issued"
   on two lines made every register row 185px tall. It can never push its
   row wider than the room it has either: at most the width of its parent,
   clipped (the full words are in its title). A few panels that hold
   sentence-length pills still let them wrap (labour, letters, hire). */
.pill{
  white-space:nowrap;
  max-width:100%;
  min-width:0;
  overflow:hidden;
  text-overflow:ellipsis;
  line-height:var(--leading-tight);
}
.crm-deal-board{
  display:grid;
  grid-template-columns:repeat(auto-fit,minmax(220px,1fr));
  gap:14px;
  align-items:start;
}
.crm-stage-column{
  background:#f6f9fc;
  border:1px solid #dbe5ef;
  border-radius:var(--r-md);
  padding:var(--space-3);
  min-width:0;
}
.crm-stage-column header{
  display:flex;
  justify-content:space-between;
  gap:10px;
  align-items:flex-start;
  margin-bottom:10px;
}
.crm-stage-column header strong{
  color:#102944;
  font-size: var(--text-base);
}
.crm-stage-column header span{
  color:#6b7788;
  font-size: var(--text-xs);
  text-align:right;
}
.crm-stage-deals{
  display:grid;
  gap:10px;
}
.crm-deal-card{
  background:#fff;
  border:1px solid #dde8f3;
  border-radius:var(--r-md);
  padding:var(--space-3);
  box-shadow:var(--shadow-soft);
}
.crm-deal-card strong,
.crm-deal-card span,
.crm-deal-card small,
.crm-deal-card p{
  display:block;
  min-width:0;
  overflow-wrap:anywhere;
}
.crm-deal-card strong{
  color:#102944;
  line-height:var(--leading-tight);
}
.crm-deal-card span{
  color:#506174;
  margin-top:4px;
}
.crm-deal-card small{
  color:#7a8796;
  margin-top:6px;
}
.crm-deal-card p{
  margin:8px 0 0;
  color:#30445b;
  font-size: var(--text-sm);
  line-height:var(--leading-snug);
}
.crm-deal-card button{
  margin-top:10px;
  width:100%;
}
.crm-workspace-guide{margin-bottom:12px;}
.crm-tools > summary, .crm-record-status > summary, .crm-saved-history > summary { min-height:var(--control-md); padding:12px 4px; cursor:pointer; font-weight:600; }
.crm-tools[open] > summary, .crm-saved-history[open] > summary { margin-bottom:12px; }
.crm-saved-history { margin:12px 0; }
.crm-workspace-guide > summary{min-height:var(--control-md);padding:12px 4px;cursor:pointer;color:var(--brand);font-weight:600;}
.pipeline-workspace-note{
  display:grid;
  grid-template-columns:repeat(3,minmax(0,1fr));
  gap:10px;
  margin:0 0 16px;
}
.pipeline-workspace-note span{
  display:block;
  padding:12px 14px;
  border:1px solid #dbe7f2;
  border-radius:var(--r-sm);
  background:#f8fbff;
  color:#42566c;
  line-height:var(--leading-snug);
}
.pipeline-workspace-note b{
  color:#102944;
}
.crm-deal-card .crm-contact-command{
  margin-top:10px;
}
.crm-opportunity-control-panel{
  scroll-margin-top:18px;
}
.crm-control-card{
  display:grid;
  gap:16px;
}
.crm-control-heading{
  display:flex;
  justify-content:space-between;
  align-items:flex-start;
  gap:18px;
}
.crm-control-heading h3{
  margin:8px 0 4px;
  color:#102944;
}
.crm-control-heading p,
.crm-control-value span,
.crm-control-grid small,
.crm-readiness span{
  color:#617185;
}
.crm-control-value{
  text-align:right;
}
.crm-control-value strong,
.crm-control-value span{
  display:block;
}
.crm-control-value strong{
  color:#102944;
  font-size:var(--text-2xl);
}
.crm-contact-command{
  display:grid;
  grid-template-columns:minmax(220px, 1fr) auto;
  gap:14px;
  align-items:center;
  padding:14px;
  border:1px solid #dbe7f2;
  border-radius:var(--r-md);
  background:linear-gradient(135deg,#ffffff 0%,#f8fbff 100%);
  box-shadow:0 10px 24px rgba(15,35,60,.06);
}
.crm-contact-command.compact{
  grid-template-columns:1fr;
  gap:8px;
  padding:10px;
  border-radius:var(--r-sm);
  box-shadow:none;
}
.crm-contact-main{
  display:grid;
  gap:5px;
  min-width:0;
}
.crm-contact-main strong,
.crm-contact-main small{
  display:block;
  overflow-wrap:anywhere;
}
.crm-contact-main strong{
  color:#102944;
}
.crm-contact-main small{
  color:#64758a;
  line-height:var(--leading-snug);
}
.crm-contact-actions{
  justify-content:flex-end;
  margin:0;
}
.crm-contact-actions button{
  margin:0;
}
.crm-contact-command.compact .crm-contact-actions{
  display:grid;
  grid-template-columns:repeat(2,minmax(0,1fr));
  gap:7px;
}
.crm-contact-command.compact .crm-contact-actions button{
  width:100%;
  min-height:var(--control-md);
  padding:8px 9px;
  font-size:var(--text-xs);
}
.crm-table-actions{
  display:grid;
  gap:8px;
}
.crm-control-grid{
  display:grid;
  grid-template-columns:repeat(auto-fit,minmax(180px,1fr));
  gap:10px;
}
.crm-control-grid > div{
  border:1px solid #dbe5ef;
  background:#f8fafc;
  padding:var(--space-3);
  border-radius:var(--r-sm);
}
.crm-control-grid span,
.crm-control-grid strong,
.crm-control-grid small{
  display:block;
  overflow-wrap:anywhere;
}
.crm-control-grid span{
  color:#6d7c8e;
  font-size: var(--text-xs);
  text-transform:uppercase;letter-spacing:.1em;
  font-weight:600;
}
.crm-control-grid strong{
  margin-top:5px;
  color:#102944;
}
.crm-readiness{
  display:grid;
  gap:10px;
  border-top:1px solid #dbe5ef;
  padding-top:14px;
}
.crm-readiness > div:first-child strong,
.crm-readiness > div:first-child span{
  display:block;
}
.crm-readiness-checks{
  display:flex;
  flex-wrap:wrap;
  gap:8px;
}
@media(max-width:760px){
  .pipeline-workspace-note{
    grid-template-columns:1fr;
  }
  .crm-control-heading{
    display:grid;
  }
  .crm-control-value{
    text-align:left;
  }
  .crm-contact-command{
    grid-template-columns:1fr;
  }
  .crm-contact-actions{
    justify-content:stretch;
  }
  .crm-contact-actions.button-row.compact-buttons{
    grid-template-columns:1fr 1fr;
  }
}
.crm-enrichment-list{
  display:grid;
  gap:10px;
}
.source-status-card small,
.drive-filing-card small,
.project-card small,
.card small{
  overflow-wrap:anywhere;
}
.login-card{
  border-radius:var(--r-lg);
}
body:not(.sidebar-collapsed) .sidebar-backdrop,
body.sidebar-open .sidebar-backdrop{
  cursor:pointer;
}
@media(max-width:1100px){
  main{
    padding:var(--space-5) var(--space-6) 36px;
  }
  .topbar{
    margin:calc(var(--space-5) * -1) calc(var(--space-6) * -1) var(--space-4);
    padding:var(--space-4) var(--space-6)!important;
  }
  .dashboard-command,
  .project-list-intro{
    grid-template-columns:1fr;
  }
  .project-list-intro span{
    text-align:left;
    max-width:none;
  }
  .dashboard-command-actions{
    width:100%;
    min-width:0;
  }
  .panel-title{
    display:grid;
  }
  .panel-title span{
    max-width:none;
    text-align:left;
  }
}
@media(max-width:760px){
  main{
    padding:var(--space-4);
  }
  .topbar{
    min-height:88px!important;
    margin:calc(var(--space-4) * -1) calc(var(--space-4) * -1) var(--space-4);
    padding:var(--space-4) var(--space-4)!important;
  }
  .topbar h2{
    font-size:var(--text-2xl);
  }
  .data-mode-panel.collapsed{
    margin:0 auto 14px;
  }
  .data-mode-chip{
    border-radius:var(--r-md);
  }
  .dashboard-command{
    padding:var(--space-4);
  }
  .dashboard-command h3{
    font-size:var(--text-2xl);
  }
  .dashboard-command-actions{
    grid-template-columns:1fr;
  }
  /* Visual 453 (V3-09, V2-27): rows of stat tiles are two to a row on a
     phone; five full-width tiles were 650px of scrolling before any content.
     Grids of larger cards stay one to a row. */
  .cards,
  .summary-grid,
  .daily-summary-grid,
  .programme-summary-grid,
  .task-summary-cards,
  .workspace-metrics,
  .dashboard-pulse-cards,
  .dashboard-module-card .cards,
  .crm-kpi-grid,
  .labour-time-kpis,
  .workforce-profile-kpis,
  .form-home-kpis,
  .siite-status-strip{
    grid-template-columns:repeat(2,minmax(0,1fr))!important;
  }
  .hseq-readiness-grid,
  .dashboard-module-grid,
  .dashboard-detail-grid,
  .dashboard-priority-grid,
  .dashboard-trust-and-pulse,
  .module-grid,
  .source-status-grid,
  .data-trust-summary,
  .crm-call-summary,
  .materials-filter-grid,
  .ai-team-grid,
  .labour-prod-grid{
    grid-template-columns:1fr!important;
  }
  .readiness-strip{
    display:grid!important;
    grid-template-columns:1fr!important;
    overflow:visible!important;
    padding-bottom:0;
  }
  .readiness-item{
    flex:auto!important;
    max-width:none!important;
    min-height:0;
  }
  .panel,
  .card,
  .project-card,
  .dashboard-module-card,
  .dashboard-pulse-panel,
  .source-status-card,
  .readiness-item{
    min-width:0;
  }
  .card .value{
    overflow-wrap:anywhere;
  }
  .card small,
  .panel-title span,
  .source-status-card p{
    overflow-wrap:anywhere;
  }
  .toolbar,
  .ledger-toolbar,
  .route-controls,
  .task-filter-row,
  .task-control-grid,
  .report-toolbar{
    grid-template-columns:1fr!important;
    padding:var(--space-2);
  }
  .portfolio-row,
  .exception-row,
  .attention-row{
    grid-template-columns:1fr!important;
    gap:8px;
  }
  .crm-deal-board{
    grid-template-columns:1fr!important;
  }
  .table-wrap{
    border-radius:var(--r-md);
  }
}

/* Final go-live interaction overrides (kept last so older responsive patches cannot undo them). */
.labelled-toolbar .field{
  height:auto!important;
}

.labelled-toolbar .field input,
.labelled-toolbar .field select{
  flex:0 0 auto!important;
  height:46px!important;
  min-height:46px!important;
}
.task-filter-summary{
  margin:0;
  cursor:pointer;
  list-style:none;
  align-items:center;
}
.task-filter-summary::-webkit-details-marker{
  display:none;
}
.task-filter-summary:after{
  content:'Show';
  margin-left:auto;
  color:var(--blue);
  font-size: var(--text-xs);
  font-weight:700;
}
.task-filter-panel[open] .task-filter-summary{
  margin-bottom:16px;
}
.task-filter-panel[open] .task-filter-summary:after{
  content:'Hide';
}

@media(max-width:760px){
  /* Grid children use min-width:auto by default; long form navigation and RAMS
     controls were therefore widening the inner workspace beyond its panel. */
  .forms-shell,
  .daily-shell,
  .programme-shell{
    grid-template-columns:minmax(0,1fr)!important;
    min-width:0!important;
    max-width:100%!important;
  }
  .forms-shell>*,
  .daily-shell>*,
  .programme-shell>*,
  #formsPageContent{
    min-width:0!important;
    max-width:100%!important;
  }
  .rams-library-panel{
    display:grid!important;
    grid-template-columns:minmax(0,1fr)!important;
  }
  .rams-library-stats{
    min-width:0!important;
    width:100%;
    justify-content:flex-start;
  }
  /* Keep operational summaries readable on phones. Earlier carousel rules left
     source cards partly off-screen and made unloaded-source warnings easy to miss. */
  .source-status-grid{
    display:grid!important;
    grid-template-columns:1fr!important;
    overflow:visible!important;
    padding-bottom:0!important;
    scroll-snap-type:none!important;
  }
  .source-status-card{
    flex:1 1 auto!important;
    width:100%!important;
    max-width:none!important;
    min-height:0!important;
  }
  /* AI Assist and the navigation toggle are separate touch targets.
     They used to be position:fixed at hard-coded right offsets while the
     clock-in and notification buttons stayed in normal flow, so all four
     landed in the same 42px band and overlapped. Everything now stays in
     the flex row and the bar itself sticks - see the sticky rule below. */
  .topbar-left{max-width:none!important;}
  .readiness-strip{
    display:grid!important;
    grid-template-columns:1fr!important;
    gap:10px;
    overflow:visible!important;
    padding-bottom:0!important;
    scroll-snap-type:none;
  }
  .readiness-item{
    width:100%!important;
    max-width:none!important;
    min-height:0!important;
  }
  .today-quick-actions{
    grid-template-columns:repeat(2,minmax(0,1fr))!important;
  }
  .today-quick{
    flex-direction:column!important;
    align-items:flex-start!important;
    min-height:88px!important;
  }
  .task-summary-cards{
    display:flex!important;
    grid-template-columns:none!important;
    gap:var(--space-2);
    overflow-x:auto;
    padding-bottom:var(--space-2);
    scroll-snap-type:x proximity;
    scrollbar-width:thin;
  }
  .task-summary-cards .card{
    flex:0 0 185px;
    min-height:120px;
    scroll-snap-align:start;
  }
  .task-filter-panel{
    padding:var(--space-4);
  }
  .task-filter-summary{
    display:flex!important;
    grid-template-columns:none!important;
  }
  .task-filter-summary span{
    display:none;
  }
}

/* Production trust and director decision hierarchy */
.portfolio-section-heading{
  display:flex;
  align-items:center;
  justify-content:space-between;
  gap:var(--space-3);
  padding:2px 2px var(--space-2);
  color:var(--ink);
}
.portfolio-section-heading strong{font-size: var(--text-base);}
.portfolio-section-heading span{color:var(--muted);font-size: var(--text-xs);font-weight:700;}
.portfolio-archive{
  margin-top:12px;
  border:1px solid var(--line);
  border-radius:var(--r-md);
  background:#f7fafc;
  overflow:hidden;
}
.portfolio-archive summary{
  display:flex;
  align-items:center;
  justify-content:space-between;
  gap:var(--space-4);
  padding:var(--space-3) var(--space-4);
  cursor:pointer;
  list-style:none;
  user-select:none;
}
.portfolio-archive summary::-webkit-details-marker{display:none;}
.portfolio-archive summary:focus-visible{outline:2px solid var(--focus-colour);outline-offset:-3px;}
.portfolio-archive summary>span:first-child{display:grid;gap:2px;}
.portfolio-archive summary small{color:var(--muted);font-weight:700;}
.portfolio-archive-rows{display:grid;gap:8px;padding:0 10px 10px;}
.portfolio-archive-rows .portfolio-row{box-shadow:none;background:#fff;}
.portfolio-commercial-caveat{
  margin:12px 2px 0;
  color:var(--muted);
  font-size: var(--text-xs);
  font-weight:700;
  line-height:var(--leading-snug);
}
.data-health-decision-grid{
  display:grid;
  grid-template-columns:minmax(0,1.25fr) minmax(280px,.75fr);
  gap:16px;
  margin-bottom:16px;
}
.data-health-facts{
  display:grid;
  grid-template-columns:repeat(3,minmax(130px,1fr));
  gap:var(--space-2);
  margin-bottom:var(--space-3);
}
.data-health-facts>div{
  display:grid;
  gap:var(--space-1);
  min-width:0;
  padding:var(--space-3);
  border:1px solid #e2eaf3;
  border-radius:var(--r-md);
  background:var(--bg);
}
.data-health-facts span{
  color:var(--muted);
  font-size: var(--text-xs);
  font-weight:600;
  text-transform:uppercase;
  letter-spacing:.1em;
}
.data-health-facts strong{overflow-wrap:anywhere;line-height:var(--leading-tight);}
.data-source-console{margin-bottom:16px;}
.data-source-table-wrap{
  width:100%;
  overflow:auto;
  border:1px solid var(--line);
  border-radius:var(--r-md);
  scrollbar-gutter:stable;
}
.data-source-table{min-width:1040px;margin:0;}
.data-source-table th{top:0;z-index:1;}
.data-source-table td{font-size: var(--text-sm);}
.data-source-table td strong,.data-source-table td small{display:block;}
.data-source-table td small{margin-top:4px;color:var(--muted);font-weight:700;line-height:var(--leading-snug);}
.source-console-actions{display:flex;gap:6px;flex-wrap:wrap;}
.source-console-actions button{min-height:var(--control-md);}
@media(max-width:1100px){
  .data-health-decision-grid,.data-health-facts{grid-template-columns:1fr;}
  .portfolio-archive summary{align-items:flex-start;}
}
@media(max-width:760px){
  .dashboard-command .dashboard-command-actions{
    display:grid!important;
    grid-template-columns:minmax(0,1fr)!important;
    width:100%!important;
    min-width:0!important;
  }
  .dashboard-command .dashboard-command-actions button{
    width:100%!important;
    min-width:0!important;
    white-space:normal!important;
  }
  .toast-host{
    left:12px!important;
    right:12px!important;
    /* 2 Sep UX: the tab bar (z 8500, ~60px + safe area) sat ON TOP of every
       toast and of the diary's sticky submit - the only confirmation a field
       photo or clock-out gets was invisible on phones. */
    bottom:calc(var(--tab-bar-h) + 12px)!important;
    z-index:var(--z-toast)!important;
    width:auto!important;
    max-height:min(42dvh,360px)!important;
  }
  .toast-host>.toast:nth-last-child(n+3){display:none;}
  .data-source-table{min-width:0;}
  .data-source-table thead{display:none;}
  .data-source-table,.data-source-table tbody,.data-source-table tr,.data-source-table td{display:block;width:100%;}
  .data-source-table tr{padding:10px 12px;border-bottom:1px solid var(--line);}
  .data-source-table tr:last-child{border-bottom:0;}
  .data-source-table td{display:grid;grid-template-columns:minmax(96px,.4fr) minmax(0,1fr);gap:10px;padding:7px 0;border:0;}
  .data-source-table td:before{content:attr(data-label);color:var(--muted);font-size: var(--text-xs);font-weight:600;text-transform:uppercase;letter-spacing:.1em;}
  .source-console-actions{justify-content:flex-start;}
}

/* Task workflow and notification maturity */
.task-list-page{
  width:100%;
  overflow:hidden;
}
.task-list-page .lane h3{
  display:flex;
  align-items:center;
  justify-content:space-between;
  gap:8px;
}
.task-list-page .lane h3 small{
  display:grid;
  place-items:center;
  min-width:26px;
  height:26px;
  border-radius:var(--r-pill);
  background:#fff;
  color:var(--muted);
}
.task-inbox-controls{
  display:flex;
  gap:var(--space-2);
  flex-wrap:wrap;
  margin:calc(var(--space-1) * -1) 0 var(--space-3);
}
.task-inbox-controls select{min-width:170px;}
.task-notification-heading{
  display:flex;
  align-items:center;
  gap:8px;
  flex-wrap:wrap;
  margin-bottom:4px;
}
.task-notification-heading h4{margin:0;}
.task-report-panel{border-top:4px solid #c7dbed;}
.task-saved-view-list{display:grid;gap:var(--space-2);}
.task-report-actions{display:flex;align-items:center;gap:8px;}
.task-report-actions input{width:min(260px,38vw);}
.task-saved-view-item{
  display:grid;
  grid-template-columns:minmax(0,1fr) auto;
  gap:14px;
  align-items:center;
  padding:14px;
  border:1px solid var(--line);
  border-radius:var(--r-md);
  background:var(--bg);
}
.task-saved-view-item.is-paused{background:#f7f7f7;opacity:.78;}
.task-saved-view-item h4,.task-saved-view-item p{margin:0 0 4px;}
.task-saved-view-item p,.task-saved-view-item small{color:var(--muted);}
.task-saved-view-actions{display:flex;gap:8px;flex-wrap:wrap;justify-content:flex-end;}
.task-recycle-panel{
  margin-top:18px;
  border-left:4px solid #8b98a8;
}
.task-recycle-panel>summary{
  display:flex;
  align-items:center;
  justify-content:space-between;
  gap:14px;
  padding:16px 18px;
  cursor:pointer;
  color:var(--ink);
  font-weight:700;
}
.task-recycle-panel>summary small{color:var(--muted);font-weight:700}
.task-recycle-list{
  display:grid;
  gap:10px;
  padding:0 18px 18px;
}
.task-recycle-item{
  display:grid;
  grid-template-columns:minmax(0,1fr) auto;
  gap:16px;
  align-items:center;
  padding:14px;
  border:1px solid var(--line);
  border-radius:var(--r-sm);
  background:#f7f9fb;
}
.task-recycle-item h4,.task-recycle-item p{margin:0 0 5px}
.task-recycle-item p,.task-recycle-item small{color:var(--muted)}
.archived-task-record{border-left:4px solid #8b98a8}
.archived-task-meta{
  display:grid;
  grid-template-columns:repeat(3,minmax(0,1fr));
  gap:12px;
  margin:18px 0 0;
}
.archived-task-meta>div{padding:var(--space-3);border:1px solid var(--line);border-radius:var(--r-sm);background:#f7f9fb}
.archived-task-meta dt{font-size: var(--text-xs);font-weight:600;text-transform:uppercase;letter-spacing:.1em;color:var(--muted)}
.archived-task-meta dd{margin:4px 0 0;font-weight:700}
.task-stage-select{
  display:flex;
  flex:1 1 190px;
}
.task-stage-select select{
  width:100%;
  min-height:var(--control-md);
  padding:var(--space-2) var(--space-8) var(--space-2) var(--space-2);
  font-size: var(--text-xs);
  font-weight:700;
  color:var(--blue);
  border-radius:var(--r-sm);
}
.task-bulk-controls{
  grid-template-columns:repeat(5,minmax(150px,1fr)) auto;
}
@media(max-width:1100px){
  .task-bulk-controls{grid-template-columns:repeat(2,minmax(0,1fr));}
  .task-bulk-controls>button{grid-column:1/-1;}
}
@media(max-width:760px){
  .task-report-actions{width:100%;}
  .task-report-actions input{flex:1 1 auto;width:100%;}
  .task-saved-view-item{grid-template-columns:1fr;}
  .task-saved-view-actions{justify-content:flex-start;}
  .task-inbox-controls{display:grid;grid-template-columns:1fr;}
  .task-inbox-controls select{width:100%;min-width:0;}
  .task-bulk-controls{grid-template-columns:1fr;}
  .task-recycle-item{grid-template-columns:1fr;}
  .archived-task-meta{grid-template-columns:1fr;}
}

/* Shared JBP messages */
.messages-page{
  display:grid;
  gap:16px;
  width:100%;
  min-width:0;
}
.messages-page-heading{
  display:flex;
  align-items:flex-end;
  justify-content:space-between;
  gap:16px;
}
.messages-page-heading h2,
.messages-page-heading p{margin:0;}
.messages-page-heading .eyebrow{
  margin-bottom:var(--space-1);
  color:var(--blue);
  font-size: var(--text-xs);
  font-weight:600;
  text-transform:uppercase;
  letter-spacing:.1em;
}
.messages-workspace{
  display:grid;
  grid-template-columns:minmax(240px,300px) minmax(0,1fr);
  height:clamp(520px,calc(100dvh - 300px),760px);
  min-height:520px;
  border:1px solid var(--line);
  border-radius:var(--r-sm);
  overflow:hidden;
  background:#fff;
  box-shadow:var(--shadow-soft);
}
.message-sidebar{
  display:flex;
  min-height:0;
  min-width:0;
  overflow:hidden;
  border-right:1px solid var(--line);
  background:#f4f8fc;
}
.message-sidebar-scroll{
  display:grid;
  flex:1 1 0;
  align-content:start;
  gap:var(--space-2);
  min-height:0;
  /* flex-basis 0 rather than auto, so the track is sized by the container's
     definite height instead of by its own content. With `auto` a long channel
     list (two per project since Office/Site were split) grew past the container
     and was clipped by the parent's overflow:hidden with nothing to scroll. */
  height:100%;
  max-height:100%;
  overflow-x:hidden;
  /* Deliberately `scroll`, not `auto`: `auto` proved unreliable here before and a
     regression check now pins it. Do not change this back. */
  overflow-y:scroll;
  overscroll-behavior:contain;
  scrollbar-gutter:stable;
  -webkit-overflow-scrolling:touch;
  padding:var(--space-4) var(--space-3);
}
.message-sidebar h3{
  margin:var(--space-3) var(--space-2) var(--space-1);
  color:var(--muted);
  font-size: var(--text-xs);
  text-transform:uppercase;
  letter-spacing:.1em;
}
.message-channel{
  position:relative;
  display:grid;
  grid-template-columns:36px minmax(0,1fr) 9px;
  align-items:center;
  gap:var(--space-2);
  width:100%;
  min-height:52px;
  padding:var(--space-2) var(--space-2);
  border:1px solid transparent;
  border-radius:var(--r-sm);
  background:transparent;
  color:var(--ink);
  text-align:left;
}
.message-channel:hover{background:#e7f0f8;}
.message-channel.active{
  border-color:#b9d0e4;
  background:#fff;
  box-shadow:var(--shadow-card);
}
.message-channel strong,
.message-channel small{
  display:block;
  overflow:hidden;
  text-overflow:ellipsis;
  white-space:nowrap;
}
.message-channel small{
  margin-top:2px;
  color:var(--muted);
  font-size: var(--text-xs);
}
.message-channel i{
  width:8px;
  height:8px;
  border-radius:var(--r-pill);
  background:#1682ca;
}
.message-channel-icon,
.message-avatar{
  display:grid;
  place-items:center;
  width:36px;
  height:36px;
  border-radius:var(--r-sm);
  background:var(--blue);
  color:#fff;
  font-size:var(--text-base);
  font-style:normal;
  font-weight:700;
}
.message-avatar{border-radius:var(--r-pill);}
.message-conversation{
  display:grid;
  grid-template-rows:auto minmax(0,1fr) auto;
  min-width:0;
  min-height:0;
  background:#fff;
}
/* The top block (heading + audience + expandable contacts) must never starve
   the thread: it scrolls within itself past 44% of the conversation height. */
.message-conversation-top{max-height:44%;overflow-y:auto;overscroll-behavior:contain}
.message-conversation-heading{
  display:flex;
  align-items:center;
  justify-content:space-between;
  gap:var(--space-3);
  min-height:68px;
  padding:var(--space-3) var(--space-4);
  border-bottom:1px solid var(--line);
}
.message-conversation-heading strong,
.message-conversation-heading span{display:block;}
.message-conversation-heading span{
  margin-top:2px;
  color:var(--muted);
  font-size: var(--text-xs);
}
.message-timeline{
  display:flex;
  flex-direction:column;
  gap:var(--space-2);
  min-height:0;
  max-height:none;
  overflow:auto;
  padding:var(--space-4);
  background:#f7f9fb;
  /* Never smooth: a rebuilt timeline starts at the top, so a smooth restore
     ANIMATES the whole thread top-to-bottom on every live update (Aaron,
     15 Oct: "random scrolling from the beginning to end of the thread"). */
  scroll-behavior:auto;
}
.team-message{
  align-self:flex-start;
  width:min(680px,86%);
  padding:11px 13px;
  border:1px solid #dce5ed;
  border-radius:var(--r-sm);
  background:#fff;
  box-shadow:var(--shadow-card);
}
.team-message.own{
  align-self:flex-end;
  border-color:#bad2e8;
  background:#e9f3fb;
}
.team-message-meta{
  display:flex;
  align-items:center;
  justify-content:space-between;
  gap:10px;
  margin-bottom:5px;
  color:var(--muted);
  font-size: var(--text-xs);
}
.team-message-meta strong{color:var(--blue);}
.team-message-meta-right{display:inline-flex;align-items:center;gap:6px}
.message-ticks{font-size: var(--text-xs);font-weight:700;color:#9db2c4;letter-spacing:-2px}
.message-ticks.part-read{color:#9db2c4}
.message-ticks.read{color:#2d6cdf}
.message-seen-line{margin-top:6px;color:var(--muted);font-size: var(--text-xs);text-align:right}
.message-member-row{display:flex;align-items:center;gap:10px}
.message-member-row small{display:block;color:var(--muted)}
.team-message-body{
  overflow-wrap:anywhere;
  line-height:var(--leading-snug);
}
.team-message-body a{font-weight:700;}
.message-attachment,
.message-task-link{
  display:grid;
  gap:2px;
  width:100%;
  margin-top:9px;
  padding:9px 10px;
  border:1px solid #c7d9e8;
  border-radius:var(--r-xs);
  background:rgba(255,255,255,.75);
  color:var(--blue);
  text-align:left;
  text-decoration:none;
}
.message-attachment small{color:var(--muted);}
.message-inline-action{
  margin-top:8px;
  padding:6px 9px;
  background:transparent;
  color:var(--blue);
  font-size: var(--text-xs);
}
.message-composer{
  position:sticky;
  bottom:0;
  z-index:2;
  display:grid;
  gap:8px;
  padding:12px 16px max(12px,env(safe-area-inset-bottom));
  border-top:1px solid var(--line);
  background:#fff;
}
.message-composer textarea{
  width:100%;
  min-height:58px;
  max-height:160px;
  resize:vertical;
}
.message-composer-controls{
  display:grid;
  grid-template-columns:auto minmax(180px,1fr) auto;
  align-items:center;
  gap:8px;
}
.message-composer-controls select{
  flex:1 1 260px;
  min-width:0;
}
.message-file-button{
  display:inline-flex;
  align-items:center;
  min-height:var(--control-md);
  padding:var(--space-2) var(--space-3);
  border:1px solid var(--line);
  border-radius:var(--r-sm);
  background:#fff;
  color:var(--blue);
  font-weight:700;
  cursor:pointer;
}
.message-file-button input{
  position:absolute;
  width:1px;
  height:1px;
  opacity:0;
  pointer-events:none;
}
.message-empty{
  display:grid;
  place-content:center;
  gap:var(--space-1);
  min-height:220px;
  padding:var(--space-6);
  color:var(--muted);
  text-align:center;
}
.message-empty strong{color:var(--ink);font-size:var(--text-lg);}

@media(max-width:760px){
  .messages-page-heading{align-items:flex-start;}
  .messages-workspace{
    grid-template-columns:1fr;
    height:auto;
    min-height:calc(100dvh - 210px);
  }
  .message-sidebar{
    display:block;
    border-right:0;
    border-bottom:1px solid var(--line);
  }
  .message-sidebar-scroll{
    grid-auto-flow:column;
    grid-auto-columns:minmax(210px,74vw);
    align-items:center;
    height:auto;
    max-height:none;
    overflow-x:auto;
    overflow-y:hidden;
    scrollbar-gutter:auto;
    padding:10px;
  }
  .message-sidebar h3{display:none;}
  .message-conversation{min-height:calc(100dvh - 350px);}
  .message-timeline{max-height:52dvh;padding:var(--space-3);}
  .team-message{width:92%;}
  .message-composer{padding:var(--space-2);}
  .message-composer-controls{grid-template-columns:minmax(0,1fr) auto;}
  .message-composer-controls select{grid-column:1 / -1;grid-row:2;width:100%;}
}

@media(max-width:760px){
  .messages-page-heading{display:grid;grid-template-columns:minmax(0,1fr) auto;}
  .messages-page-heading p:not(.eyebrow){display:none;}
  .message-conversation-heading{padding:var(--space-2) var(--space-3);}
  .message-composer-controls button{justify-self:end;}
}

/* Private Microsoft 365 mailbox with deliberate project evidence filing */
.email-page{
  display:grid;
  gap:16px;
  width:100%;
  min-width:0;
}
.email-setup-panel{
  width:min(760px,100%);
  margin-inline:auto;
}
.email-setup-panel h3{margin-bottom:8px;}
.email-setup-panel p{color:var(--muted);line-height:var(--leading-normal);}
.email-workspace{
  display:grid;
  grid-template-columns:minmax(300px,360px) minmax(0,1fr);
  height:clamp(560px,calc(100dvh - 290px),820px);
  min-height:560px;
  overflow:hidden;
  border:1px solid var(--line);
  border-radius:var(--r-sm);
  background:#fff;
  box-shadow:var(--shadow-soft);
}
.email-sidebar{
  display:grid;
  /* Three children: search row, folder buttons, message list. With only two
     row tracks the folders row collapsed to zero (the implicit auto row took
     the list's full content height, leaving the 1fr track nothing) - "cannot
     change to see my sent items, hidden behind the emails". */
  grid-template-rows:auto auto minmax(0,1fr);
  min-width:0;
  min-height:0;
  border-right:1px solid var(--line);
  background:#f4f8fc;
}
.email-folders{
  display:grid;
  grid-template-columns:repeat(3,1fr);
  gap:var(--space-2);
  padding:var(--space-2);
  border-bottom:1px solid var(--line);
}
.email-folders button{
  min-height:var(--control-md);
  padding:var(--space-2) var(--space-2);
  border:1px solid transparent;
  border-radius:var(--r-xs);
  background:transparent;
  color:var(--blue);
  box-shadow:none;
}
.email-folders button:hover,
.email-folders button.active{
  border-color:#b9d0e4;
  background:#fff;
}
.email-message-list{
  min-height:0;
  overflow-y:auto;
  overscroll-behavior:contain;
  scrollbar-gutter:stable;
}
.email-message-row{
  display:grid;
  gap:3px;
  width:100%;
  padding:13px 14px;
  border:0;
  border-bottom:1px solid #dfe8f0;
  border-radius:0;
  background:transparent;
  color:var(--ink);
  box-shadow:none;
  text-align:left;
}
/* Leaflet's internal panes carry z-index up to 1000 and were stacking above
   dialog overlays (z-index 80) - "request quote hiding behind the map".
   Isolation gives each map its own stacking context so nothing inside one can
   ever compete with page chrome. */
.leaflet-container{isolation:isolate;}
.drawing-diff-sheet{width:min(1700px,96vw);max-height:94vh;overflow:auto;background:#fff;border-radius:var(--r-sm);padding:var(--space-4);}
.drawing-diff-stage{margin-top:10px;}
.drawing-diff-canvases{overflow:auto;border:1px solid var(--line,#d8dee7);border-radius:var(--r-xs);max-height:72vh;background:#fff;}
.drawing-diff-canvases canvas{display:block;max-width:100%;height:auto;}
.drawing-diff-tabs{margin-bottom:10px;}
.email-message-row.unread strong{font-weight:700;}
.email-message-row.unread .email-message-sender{font-weight:700;color:var(--ink,#1c2430);}
.email-unread-dot{display:inline-block;width:8px;height:8px;border-radius:50%;background:#2d6cdf;margin-right:6px;vertical-align:middle;}
.email-search-row{display:flex;gap:var(--space-2);margin-bottom:var(--space-2);}
.email-search-row input{flex:1;min-width:0;padding:var(--space-2) var(--space-2);border:1px solid var(--line,#d8dee7);border-radius:var(--r-xs);font:inherit;}
.email-search-note{font-size: var(--text-xs);color:var(--muted-ink,#5b6675);padding:4px 2px 8px;}
.email-load-more{width:100%;margin-top:10px;}
.email-action-bar{margin:4px 0 12px;flex-wrap:wrap;}
.email-attach-row{display:flex;flex-wrap:wrap;gap:8px;align-items:center;}
.email-detail-attachments{margin:0 0 12px;}
.email-attachment-chip{display:inline-flex;align-items:center;gap:6px;padding:6px 10px;border:1px solid var(--line,#d8dee7);border-radius:var(--r-xs);background:var(--panel,#f6f8fb);font-size: var(--text-sm);cursor:pointer;}
.email-attachment-chip small{color:var(--muted-ink,#5b6675);}
.email-attachment-chip button{border:none;background:none;cursor:pointer;font-size: var(--text-sm);line-height:var(--leading-none);padding:0 2px;color:var(--muted-ink,#5b6675);}
.email-attach-button{cursor:pointer;}
.email-html-frame{width:100%;min-height:420px;height:60vh;border:1px solid var(--line,#d8dee7);border-radius:var(--r-xs);background:#fff;}
.email-message-row:hover,
.email-message-row.active{background:#fff;}
.email-message-row.active{box-shadow:inset 3px 0 0 var(--blue-2);}
.email-message-row strong,
.email-message-row span{
  overflow:hidden;
  text-overflow:ellipsis;
  white-space:nowrap;
}
.email-message-row small{
  color:var(--muted);
  font-size: var(--text-xs);
}
.email-message-row>span:last-child{
  color:var(--muted);
  font-size: var(--text-xs);
}
.email-message-sender{font-weight:700;}
.email-detail{
  min-width:0;
  min-height:0;
  overflow:hidden;
  background:#fff;
}
.email-detail-scroll{
  height:100%;
  overflow-y:auto;
  overscroll-behavior:contain;
  padding:var(--space-5);
}
.email-addresses{
  display:grid;
  grid-template-columns:64px minmax(0,1fr);
  gap:6px 12px;
  margin:0 0 18px;
  padding:12px 14px;
  border:1px solid var(--line);
  border-radius:var(--r-sm);
  background:#f7f9fb;
  font-size: var(--text-sm);
}
.email-addresses dt{color:var(--muted);font-weight:700;}
.email-addresses dd{margin:0;overflow-wrap:anywhere;}
.email-body{
  min-height:180px;
  padding:4px 2px 24px;
  overflow-wrap:anywhere;
  line-height:var(--leading-normal);
}
.email-compose-form .field.wide{grid-column:1/-1;}
.email-compose-form textarea{margin-top:0;resize:vertical;}
.email-detail .register-block{
  margin-top:18px;
  padding:var(--space-4);
  border:1px solid var(--line);
  border-radius:var(--r-sm);
  background:var(--bg);
}

@media(max-width:1100px){
  .email-workspace{
    grid-template-columns:1fr;
    height:auto;
    min-height:calc(100dvh - 210px);
  }
  .email-sidebar{
    grid-template-rows:auto auto auto;
    border-right:0;
    border-bottom:1px solid var(--line);
  }
  .email-message-list{
    display:grid;
    grid-auto-flow:column;
    grid-auto-columns:minmax(250px,78vw);
    max-height:none;
    overflow-x:auto;
    overflow-y:hidden;
  }
  .email-message-row{border-right:1px solid #dfe8f0;}
  .email-detail{min-height:480px;}
}

@media(max-width:760px){
  .email-workspace{border-radius:0;margin-inline:-10px;}
  .email-detail-scroll{padding:14px;}
  .email-compose-form{grid-template-columns:1fr;}
  .email-compose-form .field.wide{grid-column:auto;}
}
.crm-lead-discovery-panel {
  border-left: 4px solid var(--blue, #2f78b7);
}

.crm-lead-source-grid {
  display: grid;
  grid-template-columns: repeat(4, minmax(0, 1fr));
  gap: var(--space-2);
  margin: var(--space-4) 0;
}

.crm-lead-source-card {
  min-height: 98px;
  padding: 14px;
  border: 1px solid var(--line, #dbe4ee);
  border-radius:var(--r-sm);
  background: #fff;
}

.crm-lead-source-card > div {
  display: flex;
  align-items: center;
  gap: 8px;
  margin-bottom: 8px;
}

.crm-lead-source-card strong,
.crm-lead-source-card small {
  display: block;
}

.crm-lead-source-card small {
  color: var(--muted, #637287);
  line-height: var(--leading-snug);
}

.crm-lead-source-card.is-unavailable {
  background: var(--status-warning-surface);
  border-color: #ead7a6;
}

.crm-lead-filter-bar {
  display: grid;
  grid-template-columns: minmax(150px, .7fr) minmax(130px, .55fr) minmax(260px, 2fr);
  gap: var(--space-3);
  padding: var(--space-4);
  margin-bottom: var(--space-4);
  background: #f4f7fa;
  border: 1px solid var(--line, #dbe4ee);
  border-radius:var(--r-sm);
}

.crm-lead-filter-bar label {
  display: grid;
  gap: var(--space-2);
  color: var(--muted, #637287);
  font-size: var(--text-sm);
  font-weight:700;
}

.crm-lead-filter-bar input,
.crm-lead-filter-bar select {
  width: 100%;
  min-height:var(--control-md);
}

/* CRM board tabs and the target-projects workspace.
   Audit, 26 Aug: the CRM was one page holding ten unrelated sections and a
   target list truncated at eight of forty-six. Tabs separate the jobs; the
   target table shows all of them. */

.crm-target-filter-bar {
  display: grid;
  grid-template-columns: minmax(240px, 2fr) repeat(auto-fit, minmax(150px, 1fr));
  gap: 12px;
  padding: 14px;
  margin-bottom: 14px;
  background: #f4f7fa;
  border: 1px solid var(--line, #dbe4ee);
  border-radius: var(--r-sm);
}

.crm-target-filter-bar label {
  display: grid;
  gap: 6px;
  color: var(--muted, #637287);
  font-size: var(--text-sm);
  font-weight: 700;
}

.crm-target-filter-bar input,
.crm-target-filter-bar select {
  width: 100%;
  min-height:var(--control-md);
}

#crmTargetTableStatus {
  margin-bottom: 10px;
  font-size: var(--text-base);
}

.crm-target-pager {
  margin-top: 12px;
}

.crm-target-pager .muted {
  align-self: center;
  padding: 0 8px;
}

.crm-target-detail-card {
  margin-top: 16px;
  padding: 16px;
  border: 1px solid var(--line, #dbe4ee);
  border-left: 4px solid var(--brand, #1f4e79);
  border-radius: var(--r-sm);
  background: #fff;
}

.crm-target-detail-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(210px, 1fr));
  gap: 12px;
  margin: 12px 0;
}

.crm-target-detail-grid > div {
  display: grid;
  gap: 3px;
  padding: 9px 11px;
  background: #f7f9fc;
  border-radius: var(--r-sm);
}

.crm-target-detail-grid span {
  color: var(--muted, #637287);
  font-size: var(--text-xs);
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: .1em;
}

.crm-target-detail-grid strong {
  font-size: var(--text-base);
  overflow-wrap: anywhere;
}

@media(max-width:760px) {
  .crm-target-filter-bar { grid-template-columns: 1fr; }
  #crmTargetTable td { overflow-wrap:anywhere; }
  #crm .table-wrap:has(#crmTargetTable) { max-height:none; }
}

/* Planning-document evidence on a CRM target: what was read, what was not, and
   the readings still waiting for a person to accept them. */
.crm-doc-evidence {
  margin: 14px 0;
  display: grid;
  gap: 10px;
}

.crm-doc-proposals {
  padding: 12px 14px;
  border: 1px solid var(--line, #dbe4ee);
  border-radius: var(--r-sm);
  background: #fffdf6;
}

.crm-doc-proposals h5 {
  margin: 0 0 4px;
  font-size: var(--text-base);
}

.crm-doc-proposals > p.muted {
  margin: 0 0 10px;
  font-size: var(--text-sm);
}

.crm-doc-proposal {
  display: grid;
  grid-template-columns: minmax(0, 1fr) auto;
  gap: 12px;
  align-items: start;
  padding: 10px 0;
  border-top: 1px solid var(--line, #dbe4ee);
}

.crm-doc-proposal p {
  margin: 4px 0;
  overflow-wrap: anywhere;
}

.crm-doc-proposal small {
  display: block;
}

.crm-doc-index summary {
  cursor: pointer;
  font-weight: 700;
  font-size: var(--text-base);
  color: var(--muted, #637287);
}

.crm-doc-row {
  display: grid;
  grid-template-columns: minmax(0, 1fr) auto;
  gap: 12px;
  padding: 6px 0;
  border-bottom: 1px solid var(--line, #dbe4ee);
  font-size: var(--text-base);
}

.crm-doc-row span {
  overflow-wrap: anywhere;
}

@media(max-width:760px) {
  .crm-doc-proposal,
  .crm-doc-row { grid-template-columns: 1fr; }
}

.crm-lead-queue {
  display: grid;
  gap: var(--space-3);
}

.crm-lead-card {
  padding: 13px 14px;
  border: 1px solid var(--line, #dbe4ee);
  border-radius:var(--r-sm);
  background: #fff;
}

.crm-lead-card header {
  display: grid;
  grid-template-columns: minmax(0, 1fr) 80px;
  gap: 12px;
  align-items: start;
}

.crm-lead-card h4 {
  margin: 5px 0 3px;
  font-size: var(--text-lg);
  line-height: var(--leading-tight);
}

.crm-lead-card header p,
.crm-lead-description {
  margin: 0;
  color: var(--muted, #637287);
  line-height: var(--leading-normal);
}

.crm-lead-card-badges {
  display: flex;
  flex-wrap: wrap;
  gap: 6px;
}

.crm-lead-score {
  display: grid;
  place-items: center;
  min-height: 72px;
  border: 1px solid #cad6e3;
  border-radius:var(--r-sm);
  background: #f4f7fa;
}

.crm-lead-score strong {
  font-size: var(--text-2xl);
  line-height: var(--leading-none);
}

.crm-lead-score span {
  color: var(--muted, #637287);
  font-size: var(--text-xs);
  font-weight:600;
  text-transform: uppercase;letter-spacing:.1em;
}

.crm-lead-score.good {
  background: var(--status-ok-surface);
  border-color: #b9dfc8;
  color: var(--good);
}

.crm-lead-score.warn {
  background: #fff8e9;
  border-color: #ecd393;
  color: #7a5600;
}

.crm-lead-score.bad {
  background: #fff1f1;
  border-color: #ecc0c0;
  color: var(--bad);
}

.crm-lead-facts {
  display: grid;
  grid-template-columns: repeat(4, minmax(0, 1fr));
  gap: 6px;
  margin: 10px 0;
}

.crm-lead-facts span {
  min-height: 0;
  padding: 7px 9px;
  font-size: var(--text-xs);
  line-height: var(--leading-snug);
  border-radius:var(--r-xs);
  background: #f6f8fb;
  color: var(--muted, #637287);
  overflow-wrap: anywhere;
}

.crm-lead-facts strong {
  display: block;
  margin-bottom: 2px;
  color: var(--ink, #12233c);
  font-size: var(--text-xs);
  text-transform: uppercase;letter-spacing:.1em;
}

.crm-lead-reasons {
  margin: 14px 0;
  padding: 10px 12px;
  border-radius:var(--r-xs);
  background: #f6f8fb;
}

.crm-lead-reasons summary {
  cursor: pointer;
  font-weight:700;
}

.crm-lead-reasons ul {
  margin: 10px 0 0 18px;
  padding: 0;
}

.crm-lead-reasons li {
  margin: 6px 0;
  line-height: var(--leading-snug);
}

@media(max-width:1100px) {
  .crm-lead-source-grid,
  .crm-lead-facts {
    grid-template-columns: repeat(2, minmax(0, 1fr));
  }
}

@media(max-width:760px) {
  .crm-lead-source-grid,
  .crm-lead-facts,
  .crm-lead-filter-bar {
    grid-template-columns: 1fr;
  }

  .crm-lead-card header {
    grid-template-columns: minmax(0, 1fr) 70px;
  }

  .crm-lead-card .button-row {
    align-items: stretch;
  }

  .crm-lead-card .button-row > button,
  .crm-lead-card .button-row > a {
    flex: 1 1 100%;
  }
}

/* Siite Market — Phase 2 v2 menu page (Polymarket-style, points-led) */
.sm-points-hero { display: flex; flex-direction: column; gap: .5rem; }
.sm-points-figures { display: flex; flex-wrap: wrap; gap: 1.5rem; }
.sm-points-figures > div { display: flex; flex-direction: column; }
.sm-points-figures strong { font-size: var(--text-3xl); line-height: var(--leading-none); }
.sm-points-figures span { font-size: var(--text-sm); color: var(--muted, #6b7280); text-transform: uppercase; letter-spacing: .1em; }
.sm-seasons { margin-top: 1rem; }
.sm-season-row { display: flex; align-items: baseline; gap: .5rem; padding: .3rem 0; flex-wrap: wrap; }
.sm-season-row small { color: var(--muted, #6b7280); }
.sm-market-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); gap: 1rem; margin-top: 1rem; }
/* The open-markets list scrolls inside its own container so the page below
   (site bets, worker of the week) stays reachable without an endless scroll. */
.sm-market-scroll { max-height: 74vh; overflow-y: auto; overscroll-behavior: contain; padding: 0 6px 6px 0; border-bottom: 1px solid var(--line); margin-bottom: 18px; scrollbar-gutter: stable; }
.sm-market-scroll .sm-market-grid { margin-top: 6px; }
.sm-sitebet-scroll { max-height: 58vh; }
.sm-filter { display: flex; flex-wrap: wrap; gap: 8px; align-items: center; background: white; border: 1px solid var(--line); border-radius:var(--r-md); padding: 10px; margin-top: 14px; }
.sm-filter input[type="search"] { flex: 1 1 220px; min-width: 160px; }
.sm-filter select { min-width: 140px; }
.sm-filter-count { margin-left: auto; color: var(--muted); font-size: var(--text-sm); white-space: nowrap; }
.sm-card { display: flex; flex-direction: column; gap: .6rem; }
.sm-card-head { display: flex; justify-content: space-between; align-items: baseline; gap: .5rem; }
.sm-card-head h4 { margin: 0; }
.sm-card-meta { display: flex; flex-wrap: wrap; align-items: center; gap: .4rem; }
.sm-card-q { margin: 0; font-size: var(--text-base); }
.sm-prize-progress strong { color: var(--market-accent, #2563eb); }
.sm-prize-bar { height: 8px; border-radius:var(--r-pill); background: var(--border, #e5e7eb); overflow: hidden; margin: .1rem 0 .25rem; }
.sm-prize-bar > span { display: block; height: 100%; background: var(--market-accent, #2563eb); border-radius:var(--r-pill); }
.sm-truth { border-left: 3px solid var(--warn, var(--warn)); }
.sm-truth-figures { display: flex; flex-wrap: wrap; gap: 1.5rem; margin-bottom: .5rem; }
.sm-truth-figures > div { display: flex; flex-direction: column; }
.sm-truth-figures strong { font-size: var(--text-3xl); line-height: var(--leading-none); }
.sm-truth-figures span { font-size: var(--text-xs); color: var(--muted, #6b7280); text-transform: uppercase; letter-spacing: .1em; }
.sm-truth-bad strong { color: var(--warn-ink); }
.sm-truth-late { list-style: none; margin: .25rem 0; padding: 0; display: grid; gap: .35rem; }
.sm-truth-late li { display: flex; flex-direction: column; padding: .4rem .55rem; border: 1px solid var(--border, #e5e7eb); border-radius:var(--r-sm); }
.sm-late-pct { font-weight:700; color: var(--warn-ink); font-size: var(--text-base); }
.sm-truth-note { font-size: var(--text-xs); font-style: italic; }
.sm-tier { display: inline-flex; align-items: center; gap: .35rem; font-size: var(--text-xs); text-transform: uppercase; letter-spacing: .1em; color: var(--muted, #6b7280); padding: .1rem .45rem; border: 1px solid var(--border, #d1d5db); border-radius:var(--r-pill); }
.sm-pips { display: inline-flex; gap: 2px; }
.sm-pip { width: 6px; height: 6px; border-radius: 50%; background: var(--border, #d1d5db); }
.sm-pip.on { background: var(--market-accent, #2563eb); }
.sm-season-row .sm-tier { margin: 0 .3rem; }
.sm-card-blocked { opacity: .7; }
.sm-stake-field { font-size: var(--text-base); display: flex; align-items: center; gap: .4rem; flex-wrap: wrap; }
.sm-stake-field input { width: 90px; padding: .35rem .5rem; border: 1px solid var(--border, #d1d5db); border-radius:var(--r-sm); }
.sm-outcomes { display: grid; grid-template-columns: 1fr 1fr; gap: .5rem; }
.sm-outcome { display: flex; flex-direction: column; align-items: flex-start; gap: .15rem; padding: .55rem .6rem; border: 1px solid var(--border, #d1d5db); border-radius:var(--r-sm); background: var(--surface, #fff); cursor: pointer; text-align: left; }
.sm-outcome:hover { border-color: var(--market-accent, #2563eb); }
.sm-outcome-backed { background: var(--accent-soft, #eff6ff); border-color: var(--market-accent, #2563eb); }
.sm-outcome-label { font-weight:600; font-size: var(--text-base); }
.sm-outcome-win { font-size: var(--text-base); color: var(--market-accent, #2563eb); font-weight:700; }
.sm-outcome-odds { font-size: var(--text-xs); color: var(--muted, #6b7280); }
.sm-outcome-odds.sm-new { color: var(--warn-ink); }
.sm-your-pos { margin: 0; font-size: var(--text-sm); color: var(--muted, #6b7280); }

/* Siite Market — site-manager deduction panel */
.sm-penalty { margin-top: 1rem; }
.sm-penalty-fields { display: flex; flex-wrap: wrap; gap: .6rem; margin: .5rem 0; }
.sm-penalty-fields .field { flex: 1 1 160px; }

/* Siite Market — points history */
.sm-history { margin-top: 1rem; }
.sm-history-table { width: 100%; border-collapse: collapse; font-size: var(--text-base); }
.sm-history-table th, .sm-history-table td { text-align: left; padding: .35rem .5rem; border-bottom: 1px solid var(--border, #eef0f3); }
.sm-history-table td:last-child { text-align: right; font-weight:600; }
.sm-gain { color: var(--good); }
.sm-loss { color: var(--bad); }

/* Siite Market — reward panel + doers board */
.sm-reward { margin-top: 1rem; border-left: 3px solid var(--good); }
.sm-doers { margin-top: 1rem; }

/* Siite Market — company leaderboard */
.sm-leaderboard { margin-top: 1rem; }

/* Siite Market — long boards scroll internally, "You" row stays findable */
.sm-leaderboard .table-scroll, .sm-doers .table-scroll { max-height: 420px; overflow-y: auto; }

/* Siite Market — admin market control */
.sm-admin { margin-top: 1rem; border-left: 3px solid var(--market-accent, #2563eb); }
.sm-admin-result { margin-top: .5rem; font-size: var(--text-base); }
.sm-admin-result ul { margin: .3rem 0 0 1rem; }

/* Siite Market — binary (Polymarket-style) card + price graph */
.sm-prob { display: flex; align-items: center; justify-content: space-between; gap: .75rem; margin: .25rem 0 .5rem; }
.sm-prob-fig { display: flex; flex-direction: column; line-height: var(--leading-none); }
.sm-prob-fig strong { font-size: var(--text-2xl); }
.sm-prob-fig span { font-size: var(--text-xs); color: var(--muted, #6b7280); text-transform: uppercase; letter-spacing: .1em; }
.sm-prob-good strong { color: var(--good); }
.sm-prob-bad strong { color: var(--bad); }
.sm-spark { width: 130px; height: 38px; color: var(--market-accent, #2563eb); flex: 0 0 auto; }
.sm-spark-empty { font-size: var(--text-xs); color: var(--muted, #9ca3af); }
.sm-binary { grid-template-columns: 1fr 1fr; }
.sm-back.sm-outcome-backed { background: #dcfce7; border-color: var(--good); }
.sm-fade.sm-outcome-backed { background: #fee2e2; border-color: var(--bad); }

/* Siite Market — clearer for/against sides + depth */
.sm-vs-help { font-size: var(--text-xs); color: var(--muted, #6b7280); margin: .2rem 0 .4rem; }
.sm-side-name { font-weight:700; font-size: var(--text-base); letter-spacing: .02em; }
.sm-back .sm-side-name { color: var(--good); }
.sm-fade .sm-side-name { color: var(--bad); }
.sm-outcome-odds { font-size: var(--text-lg); font-weight:700; }
.sm-depth { font-size: var(--text-xs); color: var(--muted, #6b7280); margin: .35rem 0 0; }
.sm-depth-yes { color: var(--good); }
.sm-depth-no { color: var(--bad); }

/* Siite Market — cash out */
.sm-cashout { margin-left: .4rem; padding: .15rem .5rem; font-size: var(--text-xs); border: 1px solid var(--market-accent, #2563eb); border-radius:var(--r-pill); background: var(--surface, #fff); color: var(--market-accent, #2563eb); cursor: pointer; }
.sm-cashout:hover { background: var(--accent-soft, #eff6ff); }
.sm-cashout-taxed { border-color: var(--warn, var(--warn)); color: var(--warn-ink); }
.sm-fee-note { display: block; margin-top: .2rem; font-size: var(--text-xs); color: var(--warn-ink); }

/* Siite Market — site bets (user-created, separate) */
.sm-sitebets { margin-top: 1.5rem; border-top: 3px solid var(--market-accent, #2563eb); }
.sm-sitebet-new { display: flex; flex-wrap: wrap; gap: .5rem; align-items: center; margin: .5rem 0 1rem; }
.sm-sitebet-new input[type="text"], .sm-sitebet-new input:not([type]) { flex: 1 1 260px; padding: .45rem .6rem; border: 1px solid var(--border, #d1d5db); border-radius:var(--r-sm); }
.sm-sitebet-new input[type="number"] { width: 56px; padding: .35rem; border: 1px solid var(--border, #d1d5db); border-radius:var(--r-sm); }
.sm-resolve { display: flex; flex-wrap: wrap; gap: .4rem; align-items: center; margin-top: .5rem; font-size: var(--text-sm); }
.sm-resolve span { color: var(--muted, #6b7280); }
.sm-resolve button { padding: .2rem .5rem; font-size: var(--text-sm); }

.sm-locked { padding: .6rem .8rem; background: var(--surface-alt, #f8fafc); border: 1px dashed var(--border, #d1d5db); border-radius:var(--r-sm); font-size: var(--text-base); color: var(--muted, #6b7280); margin: .5rem 0 1rem; }

/* Siite Market — wanker of the week */
.sm-wotw {
  margin-top: 1.5rem;
  border-top: 4px solid var(--warn);
  background: #fffdf9;
}
.sm-wotw-site {
  margin-top: 1.25rem;
  padding-top: 1.1rem;
  border-top: 1px solid #ead9c1;
}
.sm-wotw-site-heading,
.sm-wotw-site-meta,
.sm-wotw-row,
.sm-wotw-vote {
  display: flex;
  align-items: center;
}
.sm-wotw-site-heading {
  justify-content: space-between;
  gap: 1rem;
  margin-bottom: .75rem;
}
.sm-wotw-site h4 {
  margin: .1rem 0 0;
  font-size: var(--text-lg);
}
.sm-wotw-site-meta {
  flex-wrap: wrap;
  justify-content: flex-end;
  gap: .3rem;
  color: var(--muted, #64748b);
  font-size: var(--text-sm);
  text-align: right;
}
.sm-wotw-last {
  padding-left: .3rem;
}
.sm-wotw-standings {
  border-block: 1px solid #f0e7db;
}
.sm-wotw-row {
  align-items: flex-start;
  gap: .75rem;
  padding: .7rem 0;
}
.sm-wotw-row + .sm-wotw-row {
  border-top: 1px solid #f0e7db;
}
.sm-wotw-row.is-leading strong {
  color: #8a3f09;
}
.sm-wotw-rank {
  flex: 0 0 3.5rem;
  color: var(--warn-ink);
  font-size: var(--text-xs);
  font-weight:700;
  letter-spacing: .08em;
  line-height: 1.6rem;
  text-align: left;
}
.sm-wotw-result {
  min-width: 0;
  flex: 1;
}
.sm-wotw-count {
  margin-left: .55rem;
  color: var(--muted, #64748b);
  font-size: var(--text-sm);
  font-weight:600;
}
.sm-wotw-reasons {
  margin: .3rem 0 0;
  padding-left: 1.05rem;
  color: var(--muted, #64748b);
  font-size: var(--text-sm);
  font-style: italic;
}
.sm-wotw-status {
  margin: .7rem 0 .55rem;
  color: #6b4a2d;
  font-size: var(--text-sm);
}
.sm-wotw-vote {
  align-items: flex-end;
  flex-wrap: wrap;
  gap: .65rem;
}
.sm-wotw-vote label {
  display: grid;
  gap: .3rem;
  min-width: min(100%, 14rem);
  color: #5d4027;
  font-size: var(--text-xs);
  font-weight:600;
  text-transform: uppercase;letter-spacing:.1em;
}
.sm-wotw-vote label span {
  letter-spacing: .04em;
}
.sm-wotw-vote select,
.sm-wotw-vote input {
  min-height: 2.75rem;
  padding: .55rem .65rem;
  border: 1px solid #d8c3a6;
  border-radius:var(--r-sm);
  background: #fff;
  color: var(--ink, #10233f);
  font: inherit;
  text-transform: none;
}
.sm-wotw-vote .sm-wotw-reason {
  flex: 1 1 20rem;
}
.sm-wotw-vote button {
  min-height: 2.75rem;
}
@media(max-width:760px) {
  .sm-wotw-site-heading {
    align-items: flex-start;
    flex-direction: column;
  }
  .sm-wotw-site-meta {
    justify-content: flex-start;
    text-align: left;
  }
  .sm-wotw-vote,
  .sm-wotw-vote label,
  .sm-wotw-vote button {
    width: 100%;
  }
}

/* Data Sync / technical diagnostics are developer-admin only; hide the nav item
   for everyone else instead of bouncing them to the dashboard. */
body:not(.developer-mode) .admin-nav { display: none; }

/* Director report upgrade: Whitelock-pattern hero KPIs, navy section bands and
   zebra tables, shared by the in-app view and the print-ready issue. */
.report-toolbar.no-print{display:flex;align-items:center;gap:12px;margin-bottom:14px}
.report-kpi-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(130px,1fr));gap:10px;margin:14px 0 18px}
.report-kpi{border:1px solid var(--line,#cbd6df);border-top:3px solid #153d64;border-radius:var(--r-sm);padding:10px 12px;background:#fff}
.report-kpi b{display:block;font-size: var(--text-xs);text-transform:uppercase;letter-spacing:.1em;color:#637588}
.report-kpi span{display:block;font-size:var(--text-xl);font-weight:700;color:#102f4f;margin:2px 0}
.report-kpi small{color:#8195a8;font-size: var(--text-xs)}
.report-section{margin:0 0 18px}
.report-section-band{background:#153d64;color:#fff;font-size: var(--text-xs);letter-spacing:.1em;text-transform:uppercase;padding:var(--space-2) var(--space-3);border-radius:var(--r-xs);margin:0 0 10px}
.report-section tr.zebra td{background:#f2f6f9}
@media print{.report-toolbar.no-print{display:none}}

/* Siite operational UI system — approved local preview, 2026-07-31.
   This final layer changes presentation and workflow hierarchy only.
   Feature-specific drawing, programme, commercial and form rules remain intact. */
@media(min-width:1101px){
  body:not(.login-mode) .sidebar{
    width:236px;
    padding:0 var(--space-2) var(--space-4);
    gap:var(--space-4);
    background:#153b61;
    box-shadow:4px 0 18px rgba(17,38,65,.08);
  }
  .sidebar .brand{
    min-height:90px;
    padding:var(--space-4) var(--space-3);
    gap:var(--space-3);
  }
  .sidebar .logo{
    width:42px;
    height:42px;
    border-radius:var(--r-sm);
    font-size: var(--text-xl);
  }
  .sidebar .brand h1{font-size: var(--text-lg);letter-spacing:0}
  .sidebar .brand p{font-size: var(--text-xs)}
  .sidebar nav{
    gap:2px;
    overflow-y:auto;
    overscroll-behavior:contain;
    scrollbar-gutter:stable;
    padding:0 var(--space-1) var(--space-2);
  }
  .sidebar .nav-group{
    margin:18px 12px 6px;
    color:#d6bc8c;
    font-size:var(--text-xs);
    letter-spacing:.12em;
  }
  .sidebar .nav{
    border-radius:var(--r-sm);
    padding:var(--space-2) var(--space-3) var(--space-2) var(--space-3);
    font-size: var(--text-sm);
    font-weight:600;
    position:relative;
  }
  .sidebar .nav:hover{background:rgba(255,255,255,.08)}
  .sidebar .nav.active,
  .sidebar .nav[aria-current="page"]{
    background:rgba(255,255,255,.16);
    box-shadow:none;
  }
  .sidebar .nav.active:before,
  .sidebar .nav[aria-current="page"]:before{
    content:"";
    position:absolute;
    inset:6px auto 6px 0;
    width:3px;
    border-radius:var(--r-xs);
    background:#d6bc8c;
  }
  .sidebar .side-footer{display:none}
  body:not(.login-mode) .topbar{
    min-height:70px;
    margin:calc(var(--space-6) * -1) calc(var(--space-6) * -1) var(--space-5);
    padding:var(--space-3) var(--space-6)!important;
    background:#fff!important;
    color:var(--ink)!important;
    border-bottom:1px solid var(--line);
    box-shadow:0 1px 0 rgba(17,38,65,.02);
  }
  .topbar .topbar-brand{display:none}
  .topbar .eyebrow{display:none}
  .topbar h2{
    color:var(--ink);
    font-size: var(--text-xl);
    letter-spacing:0;
  }
  .topbar .badge{
    background:#f7f9fc;
    color:var(--blue);
    border-color:var(--line);
  }
  .topbar .actions{gap:8px}
  .topbar .actions>button,
  .topbar .actions>.badge{
    min-height:var(--control-sm);
    padding:var(--space-2) var(--space-3);
    border-radius:var(--r-xs);
  }
  .topbar .user-button{
    width:40px;
    height:40px;
  }
  .topbar .menu-toggle{
    width:40px;
    min-width:40px;
    padding:var(--space-2);
  }
}

body:not(.login-mode){
  background:#f4f6f9;
}
.app-content{
  gap:var(--space-4);
}
.ai-first-bar{
  border-radius:var(--r-sm);
  padding:11px 14px;
  margin-bottom:10px;
  box-shadow:none;
}
.ai-first-mark{
  border-radius:var(--r-xs);
}
.ai-first-actions button,
.context-ai-button{
  border-radius:var(--r-xs);
  min-height:40px;
}
.data-mode-panel.collapsed{
  margin:0 0 14px;
}
.data-mode-chip{
  min-height:40px;
  border-radius:var(--r-xs);
  padding:9px 12px;
  box-shadow:none;
}
.panel,
.card,
.project-card,
.record-page-header,
.dashboard-command,
.project-list-intro{
  border-radius:var(--r-sm);
  box-shadow:0 1px 2px rgba(17,38,65,.035);
}
.panel{
  padding:var(--space-4);
  margin-bottom:var(--space-4);
}
.card,
.project-card{
  padding:var(--space-4) var(--space-4);
}
.cards,
.grid,
.project-grid{
  gap:var(--space-3);
  margin-bottom:var(--space-4);
}
.panel-title{
  align-items:center;
  margin-bottom:var(--space-3);
}
.panel-title h3{
  font-size:var(--text-lg);
  letter-spacing:0;
}
button,
button.secondary,
input,
select,
textarea,
.badge,
.pill{
  border-radius:var(--r-xs);
}
button{
  min-height:var(--control-sm);
  box-shadow:none;
}
input:where(:not([type=checkbox],[type=radio])),
select{
  min-height:var(--control-sm);
  padding:var(--space-2) var(--space-3);
}
textarea{
  padding:var(--space-3);
}
.toolbar,
.route-controls,
.task-filter-row,
.task-control-grid,
.report-toolbar{
  padding:var(--space-3);
  border:1px solid var(--line);
  border-radius:var(--r-sm);
  background:#fff;
}




.table-wrap tbody tr:nth-child(even) td{
  background:#fbfcfd;
}
.table-wrap tbody tr:hover td{
  background:#f2f6fa;
}
.project-hero,
.dashboard-command{
  border-radius:var(--r-sm);
}
.record-page-header{
  padding:14px 16px;
}
.record-title-block h3{
  font-size:var(--text-xl);
  letter-spacing:0;
}
.kanban{
  gap:12px;
}
.lane{
  border-radius:var(--r-sm);
  padding:var(--space-3);
}
.task{
  border-radius:var(--r-xs);
  padding:var(--space-3);
}
.form-grid,
.task-form-grid,
.task-detail-grid{
  gap:12px;
}
.task-detail-grid div,
.task-message,
.task-evidence-block,
.task-evidence-card,
.task-closeout-box,
.task-file-drop,
.task-checklist-row{
  border-radius:var(--r-xs);
}
.drawing-workspace,
.programme-builder-shell,
.team-messaging-shell{
  border-radius:var(--r-sm);
}
.modal-card,
.dialog-card,
.notification-drawer,
.context-ai-drawer{
  max-height:calc(100dvh - 32px);
  overflow-y:auto;
  overscroll-behavior:contain;
  scrollbar-gutter:stable;
}

@media(max-width:1100px){
  body:not(.login-mode) main{
    padding:var(--space-4) var(--space-4) var(--space-7);
  }
  body:not(.login-mode) .topbar{
    min-height:68px;
    margin:calc(var(--space-4) * -1) calc(var(--space-4) * -1) var(--space-3);
    padding:var(--space-2) var(--space-4)!important;
  }
  .topbar-left{gap:var(--space-2)}
  .topbar-brand{min-width:0}
  .topbar-brand>div:last-child{display:none}
  .topbar h2{font-size:var(--text-xl);letter-spacing:0}
  .topbar .eyebrow{display:none}
  .actions{gap:var(--space-2)}
  /* Audit P3V-06: the bell stays on tablets and small laptops; it was hidden
     here with every other header button, so notifications could not be
     reached between 761 and 1100px. */
  .actions>button:not(.menu-toggle):not(.user-button):not(.notification-button):not(.topbar-clockin),
  .actions>.badge{display:none}
  .sidebar{
    position:fixed;
    top:0;
    bottom:auto;
    width:min(310px,88vw);
    height:100dvh;
    overflow:hidden;
    padding:var(--space-4) var(--space-4);
    z-index:50;
  }
  .sidebar nav{
    display:flex;
    overflow-y:auto;
    overscroll-behavior:contain;
    scrollbar-gutter:stable;
  }
  .sidebar .nav{
    min-height:var(--control-md);
  }
  .panel{padding:var(--space-4)}
  .toolbar,
  .route-controls,
  .task-filter-row,
  .task-control-grid,
  .report-toolbar{
    grid-template-columns:1fr!important;
  }
  .toolbar>*,
  .route-controls>*,
  .task-filter-row>*,
  .task-control-grid>*,
  .report-toolbar>*{
    width:100%;
    min-width:0;
  }
}

@media(max-width:760px){
  .ai-first-bar{
    align-items:stretch;
    gap:10px;
  }
  .ai-first-actions{
    display:grid;
    grid-template-columns:1fr 1fr;
  }
  .ai-first-actions button:first-child{
    grid-column:1/-1;
  }
  .crm-call-summary{
    grid-template-columns:1fr 1fr;
  }
  .panel-title{
    align-items:flex-start;
    flex-direction:column;
  }
  .record-header-actions,
  .button-row{
    display:grid;
    grid-template-columns:1fr;
    width:100%;
  }
  .record-header-actions button,
  .button-row button{
    width:100%;
  }
}

@media(max-width:760px){
  .crm-call-summary{
    grid-template-columns:1fr;
  }
}

/* 31 Jul 2026: quieter operational shell and progressive disclosure */


body{
  background:var(--bg);
  color:var(--ink);
  letter-spacing:0;
}

.sidebar{
  width:236px;
  padding:var(--space-5) var(--space-4) var(--space-4);
  background:#193f66;
  box-shadow:none;
}

.sidebar .logo{
  width:42px;
  height:42px;
  flex:0 0 42px;
  border:1px solid rgba(255,255,255,.28);
  border-radius:var(--r-sm);
  background:var(--sand);
  color:#163a5f;
  box-shadow:0 2px 8px rgba(8,27,48,.16);
}

.topbar-logo{
  border:1px solid rgba(22,58,95,.12);
  border-radius:var(--r-sm);
  background:var(--sand);
  color:#163a5f;
}

.sidebar-brand{
  margin:0 4px 18px;
  padding:0 8px 20px;
  border-bottom:1px solid rgba(255,255,255,.13);
}

.sidebar .nav-group-label{
  color:#d2b987;
  font-size:var(--text-xs);
  letter-spacing:.14em;
  margin:19px 10px 7px;
}

.sidebar .nav{
  min-height:42px;
  margin:2px 0;
  border-radius:var(--r-xs);
  color:rgba(255,255,255,.76);
  font-size:var(--text-base);
  font-weight:600;
  padding:var(--space-2) var(--space-3);
}

.sidebar .nav:hover{
  background:rgba(255,255,255,.07);
  color:#fff;
}

.sidebar .nav.active{
  background:rgba(255,255,255,.16);
  box-shadow:inset 3px 0 0 var(--sand);
  color:#fff;
}

body:not(.login-mode) .topbar{
  min-height:70px;
  margin:calc(var(--space-6) * -1) calc(var(--space-8) * -1) var(--space-5);
  padding:var(--space-3) var(--space-8);
  background:#fff!important;
  border-bottom:1px solid var(--line);
  box-shadow:none!important;
  color:var(--ink)!important;
}

body:not(.login-mode) .topbar-left{
  flex:1 1 220px;
  min-width:180px;
  max-width:none;
}

body:not(.login-mode) .topbar-left>div:last-child{
  min-width:0;
}

body:not(.login-mode) .topbar .actions{
  flex:0 1 auto;
  justify-content:flex-end;
}

body:not(.login-mode) .topbar #syncBadge,
body:not(.login-mode) .topbar #quickSignOut{
  display:none!important;
}

body:not(.login-mode) .topbar .topbar-brand{
  display:none;
}

body:not(.login-mode) .topbar h1,
body:not(.login-mode) .topbar .page-title{
  color:var(--ink)!important;
  font-size:var(--text-xl);
  line-height:var(--leading-tight);
}

body:not(.login-mode) .topbar p,
body:not(.login-mode) .topbar .eyebrow{
  color:var(--muted)!important;
}

body:not(.login-mode) .topbar button,
body:not(.login-mode) .topbar .button{
  min-height:var(--control-sm);
  border-color:var(--line);
  background:#fff;
  color:var(--ink);
  box-shadow:none;
}

.ai-first-bar{
  min-height:auto;
  margin:0 0 14px;
  padding:11px 14px;
  border:1px solid var(--line);
  border-left:3px solid var(--blue-2);
  border-radius:var(--r-sm);
  background:#fff;
  box-shadow:none;
}

.ai-first-bar h2,
.ai-first-bar h3{
  font-size: var(--text-base);
}

.ai-first-bar p{
  color:var(--muted);
  font-size: var(--text-sm);
}

.ai-first-actions button{
  min-height:var(--control-md);
  padding:var(--space-2) var(--space-3);
  font-size: var(--text-sm);
}

.data-mode-panel{
  min-height:auto;
  margin:0 0 18px;
  padding:9px 13px;
  border-radius:var(--r-sm);
  box-shadow:none;
  font-size: var(--text-sm);
}

.panel,
.card,
.task-card,
.action-card,
.metric-card,
.project-card{
  border-color:var(--line);
  border-radius:var(--r-sm);
  box-shadow:var(--shadow);
}

.panel{
  padding:var(--space-4);
}

.panel-title{
  margin-bottom:var(--space-4);
  padding-bottom:var(--space-3);
}

.panel-title h2,
.panel-title h3{
  font-size:var(--text-lg);
}

.muted,
.helper,
.panel-subtitle{
  color:var(--muted);
}

.dashboard-command{
  margin:0 0 var(--space-4);
  padding:2px 0 var(--space-3);
  background:transparent;
  border:0;
  box-shadow:none;
  color:var(--ink);
}

.dashboard-command::after{
  display:none;
}

.dashboard-command h2,
.dashboard-command h3{
  color:var(--ink);
  font-size:var(--text-2xl);
}

.dashboard-command p,
.dashboard-command .eyebrow{
  color:var(--muted);
}

.dashboard-command .button,
.dashboard-command button{
  background:#fff;
  border:1px solid var(--line);
  color:var(--ink);
}


.dashboard-disclosure{
  margin:0 0 var(--space-4);
  border:1px solid var(--line);
  border-radius:var(--r-sm);
  background:#fff;
  box-shadow:var(--shadow);
}

.dashboard-disclosure>summary{
  display:flex;
  align-items:center;
  justify-content:space-between;
  gap:var(--space-4);
  padding:var(--space-4) var(--space-4);
  color:var(--ink);
  cursor:pointer;
  font-weight:700;
  list-style:none;
}

.dashboard-disclosure>summary small{
  margin-left:auto;
  color:var(--muted);
  font-size: var(--text-sm);
  font-weight:500;
}

.dashboard-disclosure>summary::-webkit-details-marker{
  display:none;
}

.dashboard-disclosure>summary::after{
  content:"+";
  float:right;
  color:var(--muted);
  font-size: var(--text-xl);
  font-weight:400;
}

.dashboard-disclosure[open]>summary::after{
  content:"−";
}

.dashboard-disclosure>*:not(summary){
  margin:0 18px 18px;
}

#dashboard[data-dashboard-focus="overview"] .dashboard-commercial-section,
#dashboard[data-dashboard-focus="overview"] .dashboard-system-section,
#dashboard[data-dashboard-focus="overview"] .dashboard-secondary-section,
#dashboard[data-dashboard-focus="decisions"] .dashboard-delivery-section,
#dashboard[data-dashboard-focus="decisions"] .dashboard-commercial-section,
#dashboard[data-dashboard-focus="decisions"] .dashboard-system-section,
#dashboard[data-dashboard-focus="decisions"] .dashboard-secondary-section,
#dashboard[data-dashboard-focus="delivery"] .dashboard-decision-section,
#dashboard[data-dashboard-focus="delivery"] .dashboard-commercial-section,
#dashboard[data-dashboard-focus="delivery"] .dashboard-system-section,
#dashboard[data-dashboard-focus="delivery"] .dashboard-secondary-section,
#dashboard[data-dashboard-focus="commercial"] .dashboard-decision-section,
#dashboard[data-dashboard-focus="commercial"] .dashboard-delivery-section,
#dashboard[data-dashboard-focus="commercial"] .dashboard-system-section,
#dashboard[data-dashboard-focus="commercial"] .dashboard-secondary-section,
#dashboard[data-dashboard-focus="system"] .dashboard-decision-section,
#dashboard[data-dashboard-focus="system"] .dashboard-delivery-section,
#dashboard[data-dashboard-focus="system"] .dashboard-commercial-section,
#dashboard[data-dashboard-focus="system"] .dashboard-secondary-section,
/* Audit B1: the Siite Market fold shows under Overview only. */
#dashboard[data-dashboard-focus="decisions"] .dashboard-market-section,
#dashboard[data-dashboard-focus="delivery"] .dashboard-market-section,
#dashboard[data-dashboard-focus="commercial"] .dashboard-market-section,
#dashboard[data-dashboard-focus="system"] .dashboard-market-section{
  display:none!important;
}

.dashboard-priority-grid,
.dashboard-module-grid,
.dashboard-delivery-grid,
.dashboard-commercial-grid{
  gap:var(--space-3);
}

.today-hero{
  display:flex;
  align-items:center;
  justify-content:space-between;
  gap:var(--space-5);
  margin-bottom:var(--space-4);
  padding:var(--space-6) var(--space-6);
  border-radius:var(--r-sm);
  background:var(--navy);
  color:#fff;
}

.today-hero h2{
  margin:0 0 var(--space-1);
  color:#fff;
  font-size: var(--text-2xl);
}

body:not(.login-mode) .today-hero p{
  margin:0;
  color:#e4edf5;
}

.today-kpi-grid{
  display:grid;
  grid-template-columns:repeat(4,minmax(0,1fr));
  gap:var(--space-3);
  margin-bottom:var(--space-4);
}

/* Audit LD08/LD10/P3V-23: Today's tiles are card() tiles (the recipe below);
   the hand-built .today-kpi article and its own sizes are gone. */
.today-kpi-grid > .card{margin:0}

.today-action-strip{
  display:flex;
  flex-direction:row!important;
  align-items:center;
  gap:var(--space-2);
  overflow-x:auto;
  margin-bottom:var(--space-4);
  padding:var(--space-2);
  border:1px solid var(--line);
  border-radius:var(--r-sm);
  background:#fff;
}

.today-action-strip button{
  flex:0 0 auto;
  display:inline-flex;
  align-items:center;
  gap:var(--space-2);
  min-height:var(--control-sm);
  box-shadow:none;
}

.today-primary-grid{
  display:grid;
  grid-template-columns:minmax(0,1fr) minmax(0,1fr);
  gap:var(--space-4);
  margin-bottom:var(--space-4);
}

.today-primary-panel{
  min-width:0;
}

.today-support-panel>summary{
  cursor:pointer;
  font-weight:700;
}

.text-button{
  border:0;
  background:transparent;
  color:var(--blue);
  font-size: var(--text-sm);
  font-weight:700;
  padding:var(--space-1);
}

.message-sidebar-filter{
  position:sticky;
  top:0;
  z-index:2;
  flex:0 0 auto;
  padding:var(--space-4) var(--space-3) var(--space-2);
  background:inherit;
}

.message-sidebar-filter label{
  display:block;
  margin:0 0 var(--space-2);
  color:var(--muted);
  font-size:var(--text-xs);
  font-weight:600;
  letter-spacing:.12em;
  text-transform:uppercase;
}

.message-sidebar-filter input{
  width:100%;
  min-height:var(--control-sm);
  padding:var(--space-2) var(--space-3);
  border:1px solid var(--line);
  border-radius:var(--r-xs);
  background:#fff;
}

.message-channel[hidden]{
  display:none!important;
}

.message-sidebar{
  flex-direction:column!important;
}

.message-sidebar-scroll{
  width:100%;
}

.dashboard-disclosure>summary .panel-title,
.dashboard-disclosure>summary .panel-title>div{
  display:flex;
  align-items:baseline;
  gap:8px;
}





/* Visual 453: ONE rule each for the base table, th and td (there were 9, 8 and 6 rule sets
   restyling them across the sheet). Every value is the one that already won the cascade; the
   order of the declarations is the order they used to win in, so the result is unchanged. */
table{border-collapse:collapse;font-variant-numeric:tabular-nums;width:100%;min-width:760px;font-size:var(--text-sm);color:var(--ink)}
th{position:sticky;text-align:left;font-weight:600;border-bottom:1px solid var(--line);white-space:nowrap;top:0;z-index:1;vertical-align:top;padding:var(--space-2) var(--space-3);text-transform:uppercase;background:var(--surface-sunken);color:#536277;font-size:var(--text-xs);letter-spacing:.1em}
td{border-bottom:1px solid var(--line);color:var(--ink);vertical-align:top;line-height:var(--leading-snug);padding:var(--space-2) var(--space-3);border-color:#e8edf3}


input:where(:not([type=checkbox],[type=radio])),
select,
textarea{
  border-color:#d9e1ea;
  border-radius:var(--r-xs);
  background:#fff;
  color:var(--ink);
  box-shadow:none;
}

button,
.button{
  border-radius:var(--r-xs);
  box-shadow:none;
}

@media(max-width:1100px){
  .sidebar{
    width:min(310px,88vw);
  }

  main{
    padding:var(--space-4);
  }

  body:not(.login-mode) .topbar{
    margin:calc(var(--space-4) * -1) calc(var(--space-4) * -1) var(--space-4);
    padding:var(--space-3) var(--space-4);
  }

  body:not(.login-mode) .topbar .topbar-brand{
    display:flex;
  }

  .today-kpi-grid{
    grid-template-columns:repeat(2,minmax(0,1fr));
  }
}

@media(max-width:760px){
  main{
    padding:var(--space-4) var(--space-3) var(--space-10);
  }

  body:not(.login-mode) .topbar{
    margin:calc(var(--space-4) * -1) calc(var(--space-3) * -1) var(--space-4);
  }

  .ai-first-bar{
    padding:10px 11px;
  }

  .dashboard-command h2{
    font-size:var(--text-xl);
  }

  .today-hero{
    align-items:flex-start;
    flex-direction:column;
    padding:var(--space-4);
  }

  .today-primary-grid{
    grid-template-columns:1fr;
  }
}

@media(max-width:760px){
  .today-kpi-grid{
    grid-template-columns:1fr 1fr;
    gap:8px;
  }
}
/* 31 Jul 2026: polished JBP shell and role-tuned density */


small,
.eyebrow,
.nav-group,
.field-label,
.helper-text,
th {
  font-size: var(--text-xs);
}

body:not(.login-mode) .sidebar .brand {
  min-height: 90px;
  padding: var(--space-4) var(--space-3);
  border-bottom: 1px solid rgba(255, 255, 255, 0.12);
}

body:not(.login-mode) .sidebar .brand .logo {
  width: 44px;
  height: 44px;
  flex: 0 0 42px;
  border-radius: var(--radius-md);
  background: var(--sand);
  color: var(--blue);
  box-shadow: none;
}

body:not(.login-mode) .sidebar .nav-group {
  margin: 18px 12px 7px;
  color: var(--sand);
  font-weight: 700;
  letter-spacing: 0.12em;
}

body:not(.login-mode) .sidebar .nav {
  margin: 2px 0;
  padding: var(--space-2) var(--space-3);
  border-radius: var(--radius-md);
}

body:not(.login-mode) .sidebar .nav{border-left:3px solid transparent}
body:not(.login-mode) .sidebar .nav.active,
body:not(.login-mode) .sidebar .nav[aria-current="page"] {
  background: rgba(255, 255, 255, 0.08);
  border-color: transparent;
  border-left-color: var(--sand);
  border-radius:0 var(--r-sm) var(--r-sm) 0;
  box-shadow: none;
  font-weight: 600;
}
body:not(.login-mode) .sidebar .nav:hover{transform:none;background:rgba(255,255,255,.06);border-color:transparent}

body:not(.login-mode) .topbar {
  min-height: 70px;
  padding: var(--space-4) var(--space-6);
  border-bottom: 1px solid #dce4ed;
  background: #fff;
  color: #17273a;
  box-shadow: var(--shadow-xs);
}

body:not(.login-mode) .topbar .eyebrow {
  display: none;
}

body:not(.login-mode) .topbar h2 {
  margin: 0;
  color: #17273a;
  font-size: var(--text-xl);
  line-height: var(--leading-tight);
}

body:not(.login-mode) #aiFirstBar {
  display: none !important;
}

body:not(.login-mode)[data-auth-state="signed-in"] .context-ai-button:not(.hidden) {
  display: inline-grid !important;
  width: 44px;
  min-width: 44px;
  height: 44px;
  place-items: center;
  padding: 0;
  border: 1px solid #d8e1eb;
  border-radius: var(--radius-md);
  background: #fff;
  color: var(--blue);
  box-shadow: var(--shadow-xs);
}

body:not(.login-mode) .context-ai-button::before {
  display: none !important;
}

body:not(.login-mode) .context-ai-button > span[aria-hidden="true"] {
  display: grid;
  width: 28px;
  height: 28px;
  place-items: center;
  border-radius: var(--radius-sm);
  background: var(--blue);
  color: #fff;
  font-size: var(--text-xs);
  font-weight: 700;
}

body:not(.login-mode) .panel,
body:not(.login-mode) .card,
body:not(.login-mode) .project-card,
body:not(.login-mode) .metric-card,
body:not(.login-mode) .table-card,
body:not(.login-mode) .form-card,
body:not(.login-mode) .dashboard-card,
body:not(.login-mode) .surface {
  border-radius: var(--radius-lg);
  box-shadow: var(--shadow-xs);
}

body:not(.login-mode) .page-shell,
body:not(.login-mode) .content {
  background: #f3f6fa;
}

/* Audit V2-11 (Visual 454): a tick box or radio is not a 48px control - its
   LABEL is the target. This rule stretched all 196 diary tick boxes into
   24x48 capsules because it out-ranked the 24px box rule. */
body[data-role-density="capture"] button,
body[data-role-density="capture"] .button,
body[data-role-density="capture"] input:not([type="checkbox"]):not([type="radio"]),
body[data-role-density="capture"] select {
  min-height: 48px;
}

body[data-role-density="capture"] textarea {
  min-height: 112px;
}

body[data-role-density="reconcile"] table {
  font-size: var(--text-sm);
}

body[data-role-density="reconcile"] th,
body[data-role-density="reconcile"] td {
  padding-top: 10px;
  padding-bottom: 10px;
}

body[data-role-density="decide"] .metric-card,
body[data-role-density="decide"] .dashboard-card {
  box-shadow: var(--shadow-sm);
}

@media(max-width:760px) {
  body:not(.login-mode) .topbar {
    min-height: 64px;
    padding: var(--space-2) var(--space-4);
  }

  body:not(.login-mode) .topbar h2 {
    font-size: var(--text-lg);
  }
}

/* Approved Siite work-surface system: consistent hierarchy across every route. */
body:not(.login-mode) .project-hero,
body:not(.login-mode) .project-list-intro,
body:not(.login-mode) .forms-head,
body:not(.login-mode) .daily-head,
body:not(.login-mode) .programme-head,
body:not(.login-mode) .record-page-header,
body:not(.login-mode) .maintenance-hero{
  position:relative;
  display:flex;
  align-items:flex-start;
  justify-content:space-between;
  gap:var(--space-4);
  margin:0 0 var(--space-4);
  padding:var(--space-4) var(--space-5);
  overflow:visible;
  border:1px solid var(--line);
  border-radius:var(--r-md);
  background:#fff;
  color:var(--ink);
  box-shadow:var(--shadow-card);
}
body:not(.login-mode) .project-hero:after,
body:not(.login-mode) .project-list-intro:after,
body:not(.login-mode) .forms-head:after,
body:not(.login-mode) .daily-head:after,
body:not(.login-mode) .programme-head:after,
body:not(.login-mode) .record-page-header:after{display:none}
body:not(.login-mode) .project-hero:before,
body:not(.login-mode) .project-list-intro:before,
body:not(.login-mode) .forms-head:before,
body:not(.login-mode) .daily-head:before,
body:not(.login-mode) .programme-head:before,
body:not(.login-mode) .record-page-header:before{
  content:"";
  position:absolute;
  inset:14px auto 14px 0;
  width:3px;
  border-radius:0 var(--r-xs) var(--r-xs) 0;
  background:var(--sand);
  opacity:1;
}
body:not(.login-mode) .project-hero .eyebrow,
body:not(.login-mode) .project-hero p,
body:not(.login-mode) .project-list-intro p,
body:not(.login-mode) .forms-head p,
body:not(.login-mode) .daily-head p,
body:not(.login-mode) .programme-head p{
  color:var(--muted);
}
body:not(.login-mode) .project-hero h3,
body:not(.login-mode) .project-list-intro h3,
body:not(.login-mode) .forms-head h3,
body:not(.login-mode) .daily-head h3,
body:not(.login-mode) .programme-head h3,
body:not(.login-mode) .record-page-header h3{
  margin:3px 0 5px;
  color:var(--ink);
  font-size:var(--text-xl);
  line-height:var(--leading-tight);
}
body:not(.login-mode) .project-hero .back-link{
  min-height:var(--control-sm); /* Audit LD22: was forced to 32px */
  margin:0 5px 8px 0;
  padding:6px 10px;
  font-size:var(--text-xs);
  box-shadow:none;
}
body:not(.login-mode) .project-hero-rag{
  max-width:520px;
  justify-content:flex-end;
  gap:6px;
  padding-top:3px;
}
body:not(.login-mode) .project-hero-rag .rag{
  padding:5px 9px;
  border:1px solid var(--line);
  background:#f7f9fc;
  color:var(--ink);
  box-shadow:none;
}
body:not(.login-mode) .project-hero-rag .rag b{color:var(--muted)}

/* Audit LD14/LD15/LD22: ONE tab component - the prototype's underline tabs.
   Six treatments used to compete (filled page tabs, 74px hub blocks, sand
   Dashboard pills, a CRM row with no active state, bordered board buttons, an
   off-palette Calendar blue). Every tab row now carries .siite-tabs and draws
   from this block only: muted label, 44px target, the selected tab in navy
   with a sand underline, and aria-selected saying which one is selected.
   Rows never re-order (the order:-1 "active jumps to the front" rules are
   deleted). Written at the button-tier specificity so the tiers cannot fill
   a tab.
   Audit LD14 (third pass): the component sets EVERY layout property it relies
   on. The Dashboard row is a <nav>, and the global nav{flex-direction:column}
   (the sidebar's rule) stacked its tabs into a 250px right-aligned column
   because this block never said "row". */
body:not(.login-mode) .siite-tabs{
  position:relative;
  display:flex;
  flex-direction:row;
  flex-wrap:nowrap;
  justify-content:flex-start;
  align-items:flex-end;
  gap:2px;
  margin:0 0 var(--space-4);
  padding:0;
  border:0;
  border-bottom:1px solid var(--line);
  border-radius:0;
  background:transparent;
  box-shadow:none;
  overflow-x:auto;
  overscroll-behavior-inline:contain;
  scrollbar-width:thin;
}
body:not(.login-mode) .siite-tabs > :is(button,a),
body:not(.login-mode) .siite-tabs > .project-tabs-more > summary{
  display:inline-flex;
  align-items:center;
  gap:var(--space-2);
  flex:0 0 auto;
  min-width:0;
  min-height:var(--control-md);
  height:auto;
  margin:0;
  padding:var(--space-2) var(--space-4);
  border:0;
  border-bottom:2px solid transparent;
  border-radius:var(--r-sm) var(--r-sm) 0 0;
  background:transparent;
  color:var(--muted);
  box-shadow:none;
  font-size:var(--text-sm);
  font-weight:600;
  line-height:var(--leading-tight);
  white-space:nowrap;
  text-decoration:none;
  cursor:pointer;
}
body:not(.login-mode) .siite-tabs > :is(button,a):hover,
body:not(.login-mode) .siite-tabs > .project-tabs-more > summary:hover{
  background:var(--bg);
  color:var(--ink);
  border-bottom-color:transparent;
}
body:not(.login-mode) .siite-tabs > :is(button,a):is(.active,[aria-selected="true"]){
  background:var(--bg);
  color:var(--blue);
  border-bottom-color:var(--sand);
}
body:not(.login-mode) .siite-tabs > :is(button,a):focus-visible{outline:2px solid var(--focus-colour);outline-offset:-2px}
/* A count beside a tab label ("Drafts 3"). */
body:not(.login-mode) .siite-tabs > :is(button,a) > span:not(.siite-tab-note){
  display:inline-grid;
  place-items:center;
  min-width:20px;
  height:20px;
  padding:0 var(--space-2);
  border-radius:var(--r-pill);
  background:var(--line);
  color:var(--ink);
  font-size:var(--text-xs);
  font-weight:600;
}
/* A tab's status ("Needs setup") is said in the More menu and the tooltip,
   not under every label in the strip. */
body:not(.login-mode) .siite-tabs > :is(button,a) > .siite-tab-note{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}
/* A label in front of a tab row ("Show"). */
body:not(.login-mode) .siite-tabs > .siite-tabs-label{align-self:center;margin-right:var(--space-2);color:var(--muted);font-size:var(--text-xs);font-weight:600;text-transform:uppercase;letter-spacing:.13em}

body:not(.login-mode) .project-hub-cards{
  grid-template-columns:repeat(4,minmax(0,1fr));
  gap:12px;
}
body:not(.login-mode) .project-hub-cards .card{
  position:relative;
  min-height:108px;
  padding:var(--space-4) var(--space-4);
  overflow:hidden;
}
body:not(.login-mode) .project-hub-cards .card:before{
  content:"";
  position:absolute;
  inset:0 0 auto;
  height:2px;
  background:#c9b58f;
}
body:not(.login-mode) .project-detail-grid .clean-list li,
body:not(.login-mode) .clean-list li{
  padding:var(--space-2) var(--space-3);
  border-color:var(--line-soft);
  border-radius:var(--r-sm);
  background:#f9fbfd;
  font-size: var(--text-xs);
}
body:not(.login-mode) .module-grid{
  display:grid;
  grid-template-columns:repeat(3,minmax(0,1fr));
  gap:8px;
}
body:not(.login-mode) .module-tile{
  min-height:64px;
  padding:11px 12px;
  border-color:var(--line);
  border-radius:var(--r-sm);
  background:#fff;
  box-shadow:none;
}

/* Keep the task workflow complete without repeating five commands on every card. */
body:not(.login-mode) .task-actions{
  position:relative;
  display:grid;
  grid-template-columns:auto minmax(110px,1fr) 32px;
  align-items:center;
  gap:var(--space-2);
}
body:not(.login-mode) .task-actions > button{min-width:52px}
body:not(.login-mode) .task-actions .task-stage-select{grid-column:auto;min-width:0}
body:not(.login-mode) .task-actions select{min-height:var(--control-sm)}
body:not(.login-mode) .task-more-actions{position:relative}
body:not(.login-mode) .task-more-actions > summary{
  display:grid;
  width:var(--control-sm);
  min-height:var(--control-sm);
  place-items:center;
  border:1px solid var(--line);
  border-radius:var(--r-sm);
  background:#fff;
  color:var(--blue);
  cursor:pointer;
  font-size:var(--text-lg);
  font-weight:700;
  list-style:none;
}
body:not(.login-mode) .task-more-actions > summary::-webkit-details-marker{display:none}
body:not(.login-mode) .task-more-menu{
  position:absolute;
  right:0;
  bottom:38px;
  z-index:20;
  display:grid;
  min-width:138px;
  gap:var(--space-1);
  padding:var(--space-2);
  border:1px solid var(--line);
  border-radius:var(--r-sm);
  background:#fff;
  box-shadow:var(--shadow-md);
}
body:not(.login-mode) .task-more-menu button{width:100%;justify-content:flex-start;text-align:left}

/* Registers, forms and operational pages share one calm density. */
body:not(.login-mode) .toolbar,
body:not(.login-mode) .filter-toolbar,
body:not(.login-mode) .filters,
body:not(.login-mode) .crm-toolbar,
body:not(.login-mode) .programme-toolbar{
  gap:var(--space-2);
  padding:var(--space-2);
  border:1px solid var(--line);
  border-radius:var(--r-sm);
  background:#fff;
  box-shadow:var(--shadow-xs);
}
body:not(.login-mode) .form-section,
body:not(.login-mode) .dynamic-form-section,
body:not(.login-mode) .task-control-box,
body:not(.login-mode) .task-closeout-box,
body:not(.login-mode) .programme-status,
body:not(.login-mode) .maintenance-record-card,
body:not(.login-mode) .crm-deal-card,
body:not(.login-mode) .hseq-library-card{
  border:1px solid var(--line);
  border-radius:var(--r-sm);
  background:#fff;
  box-shadow:none;
}
body:not(.login-mode) .form-section h3,
body:not(.login-mode) .dynamic-form-section h3{font-size: var(--text-base);}
body:not(.login-mode) .empty-state,
body:not(.login-mode) .empty,
body:not(.login-mode) .no-results{
  padding:36px var(--space-4);
  border:1px dashed #d6e0ea;
  border-radius:var(--r-sm);
  background:#fafbfd;
  color:var(--muted);
  text-align:center;
}

@media(max-width:1100px){
  body:not(.login-mode) .project-hub-cards{grid-template-columns:repeat(2,minmax(0,1fr))}
  body:not(.login-mode) .module-grid{grid-template-columns:repeat(2,minmax(0,1fr))}
}
@media(max-width:760px){
  body:not(.login-mode) .project-hero,
  body:not(.login-mode) .project-list-intro,
  body:not(.login-mode) .forms-head,
  body:not(.login-mode) .daily-head,
  body:not(.login-mode) .programme-head,
  body:not(.login-mode) .record-page-header,
  body:not(.login-mode) .maintenance-hero{
    display:block;
    padding:var(--space-4) var(--space-4);
  }
  body:not(.login-mode) .project-hero h3,
  body:not(.login-mode) .project-list-intro h3,
  body:not(.login-mode) .forms-head h3,
  body:not(.login-mode) .daily-head h3,
  body:not(.login-mode) .programme-head h3,
  body:not(.login-mode) .record-page-header h3{font-size: var(--text-xl)}
  body:not(.login-mode) .project-hero-rag{justify-content:flex-start;margin-top:12px}
  body:not(.login-mode) .project-hub-cards{grid-template-columns:1fr 1fr;gap:8px}
  body:not(.login-mode) .project-hub-cards .card{min-height:94px;padding:var(--space-3)}
  body:not(.login-mode) .module-grid{grid-template-columns:1fr}
  body:not(.login-mode) .task-more-menu{position:fixed;right:16px;bottom:16px;min-width:180px}
}

/* Home uses the same calm hierarchy as the approved dashboard. */
.workspace-heading{
  display:flex;
  align-items:flex-end;
  justify-content:space-between;
  gap:20px;
  margin:0 0 18px;
  padding:2px 0 0;
  flex-wrap:wrap;
}
/* Without min-width:0 the title block refuses to shrink, which is what forced
   the tools group past the edge rather than onto a second line. */
.workspace-heading > div:first-child{min-width:0;flex:1 1 320px}
.workspace-heading .eyebrow{
  margin:0 0 5px;
  color:var(--warn-ink);
  font-size:var(--text-xs);
  font-weight:600;
  letter-spacing:.13em;
  text-transform:uppercase;
}
.workspace-heading h3{
  margin:0 0 5px;
  color:var(--ink);
  font-size:var(--text-2xl);
  letter-spacing:0;
}
.workspace-heading p{
  max-width:760px;
  margin:0;
  color:var(--muted);
  font-size:var(--text-base);
  font-weight:450;
  line-height:var(--leading-snug);
}
/* The header is a flex row, and this group was being squeezed narrower than its
   own contents — so "Preview role" started past the container and ran off the
   right of the screen. Stop it shrinking, and let the header wrap instead. */
.workspace-heading-tools{display:flex;align-items:center;gap:10px;flex:0 0 auto;flex-wrap:wrap;justify-content:flex-end}
.workspace-live-status{
  display:inline-flex;
  align-items:center;
  min-height:34px;
  padding:7px 11px;
  border:1px solid #dce5ee;
  border-radius:var(--radius-md);
  background:#fff;
  color:var(--muted);
  font-size: var(--text-xs);
  font-weight:600;
  white-space:nowrap;
}
.workspace-live-status.good{border-color:#b8dec5;color:var(--good);background:#f5fbf7}
.workspace-live-status.warn{border-color:#ead19a;color:#8a5b0c;background:var(--status-warning-surface)}
.workspace-live-status.bad{border-color:#eebbbb;color:var(--bad);background:#fff7f7}
.workspace-role-preview{position:relative}
.workspace-role-preview > summary{
  min-height:var(--control-sm);
  padding:var(--space-2) var(--space-3);
  border:1px solid #dce5ee;
  border-radius:var(--radius-md);
  background:#fff;
  color:var(--ink);
  cursor:pointer;
  font-size: var(--text-xs);
  font-weight:600;
  list-style:none;
}
.workspace-role-preview > summary::-webkit-details-marker{display:none}
.workspace-role-preview-body{
  position:absolute;
  z-index:20;
  top:42px;
  right:0;
  width:min(480px,80vw);
  padding:10px;
  border:1px solid #dce5ee;
  border-radius:var(--radius-lg);
  background:#fff;
  box-shadow:var(--shadow-md);
}
.workspace-role-preview-body > p{
  margin:0 0 10px;
  color:var(--muted);
  font-size: var(--text-xs);
  line-height:var(--leading-snug);
}
/* Audit LD14 (third pass): the role row is the shared .siite-tabs component.
   Inside this 480px popover it may wrap rather than scroll sideways.
   Audit P3V-33: while a preview is in force the summary says so in sand. */
body:not(.login-mode) .workspace-role-preview .siite-tabs.role-switcher{flex-wrap:wrap;margin:0}
/* On a phone the popover opens in the page flow; anchored right it ran off the left edge. */
@media(max-width:760px){.workspace-role-preview-body{position:static;width:auto;margin-top:8px}}
.workspace-role-preview.is-previewing > summary{border-color:var(--sand);background:#f7f2e8}
.workspace-attention{margin:0 0 var(--space-4)}
.workspace-section-heading{display:flex;align-items:end;justify-content:space-between;margin:0 0 var(--space-2)}
.workspace-section-heading h3{margin:0;color:var(--ink);font-size: var(--text-lg);}
.workspace-section-heading p{margin:var(--space-1) 0 0;color:var(--muted);font-size: var(--text-xs)}
.workspace-metrics{gap:var(--space-3);margin:0}
.workspace-grid{grid-template-columns:minmax(0,1.25fr) minmax(300px,.75fr);gap:var(--space-4)}
.workspace-grid > .panel{border-color:#dfe7ef;box-shadow:var(--shadow-xs)}
.workspace-actions{grid-template-columns:repeat(2,minmax(0,1fr));gap:8px}
.workspace-action-card{min-height:78px;padding:var(--space-3) var(--space-4);border-color:#e3eaf2;border-radius:var(--radius-md);gap:var(--space-1)}
.workspace-action-card strong{font-size:var(--text-base);font-weight:700;color:var(--ink)}
.workspace-action-card span{font-size: var(--text-xs);font-weight:400;line-height:var(--leading-snug)}
.workspace-controls{padding:0;overflow:hidden}
.workspace-controls > summary{margin:0;padding:var(--space-4) var(--space-4);cursor:pointer;list-style:none}
.workspace-controls > summary::-webkit-details-marker{display:none}
.workspace-controls > summary:after{content:"+";margin-left:auto;color:var(--muted);font-size:var(--text-lg);font-weight:500}
.workspace-controls[open] > summary:after{content:"−"}
.workspace-controls-body{padding:0 18px 18px;border-top:1px solid var(--line-soft)}
.workspace-controls-body > .panel-title{margin-top:14px}
.workspace-watch-list{gap:7px}
.workspace-watch-list li{padding:10px 11px;border-radius:var(--radius-md);background:#f7f9fc;color:var(--ink);font-size: var(--text-xs);font-weight:600}
@media(max-width:1100px){
  .workspace-grid{grid-template-columns:1fr}
}
@media(max-width:760px){
  .workspace-heading{align-items:flex-start;flex-direction:column}
  .workspace-heading h3{font-size: var(--text-2xl)}
  .workspace-heading-tools{width:100%;justify-content:space-between}
  .workspace-actions{grid-template-columns:1fr}
}

/* =============================================================================
   31 Jul 2026: approved Siite visual system
   The localhost:4321 design is the reference. This layer changes presentation
   only; route logic, records, permissions and operational controls stay intact.
   ============================================================================= */


html{background:var(--bg)}
body{
  background:var(--bg);
  color:var(--ink);
  font-family:Inter,ui-sans-serif,-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif;
  letter-spacing:0;
}
body *{letter-spacing:0}
/* Visual 459: the reset above stops a caps label's tracking reaching the words inside it (a RAG chip's <b>, a summary's <span>), so they read as untracked caps. Inside these caps labels the children keep the label's tracking. */
:is(.rag, .label, .siite-feed-day-divider, .form-template-group > summary, .message-sidebar h3) *{letter-spacing:inherit}
body:not(.login-mode) .sidebar{
  width:234px;
  padding:0 var(--space-2) var(--space-4);
  background:var(--blue);
  border-right:1px solid rgba(255,255,255,.1);
  box-shadow:none;
}
body:not(.login-mode) .sidebar .brand{
  min-height:82px;
  margin:0 calc(var(--space-2) * -1) var(--space-3);
  padding:var(--space-4) var(--space-5);
  gap:var(--space-3);
  border-bottom:1px solid rgba(255,255,255,.12);
}
body:not(.login-mode) .sidebar .logo{
  width:34px;
  min-width:34px;
  height:34px;
  border:0;
  border-radius:var(--r-sm);
  background:var(--sand);
  color:var(--blue);
  box-shadow:none;
  font-size: var(--text-lg);
  font-weight:700;
}
body:not(.login-mode) .sidebar .brand h1{
  margin:0 0 2px;
  color:#fff;
  font-size: var(--text-lg);
  font-weight:600; /* Visual 459: one heading weight */
  line-height:var(--leading-none);
}
body:not(.login-mode) .sidebar .brand p{
  color:rgba(255,255,255,.58);
  font-size:var(--text-xs);
  font-weight:600;
  text-transform:uppercase;
}
body:not(.login-mode) .sidebar nav{padding:0 2px}
body:not(.login-mode) .sidebar .nav-group{
  margin:18px 10px 7px;
  color:var(--sand);
  font-size:var(--text-xs);
  font-weight:600;
  text-transform:uppercase;
}
body:not(.login-mode) .sidebar .nav{
  width:100%;
  min-height:var(--control-sm);
  margin:1px 0;
  padding:var(--space-2) var(--space-3);
  border:0;
  border-radius:var(--r-sm);
  background:transparent;
  color:rgba(255,255,255,.78);
  box-shadow:none;
  font-size: var(--text-sm);
  font-weight:500;
  line-height:var(--leading-tight);
  text-align:left;
}
body:not(.login-mode) .sidebar .nav:hover{
  background:rgba(255,255,255,.07);
  color:#fff;
  transform:none;
}
body:not(.login-mode) .sidebar .nav.active{
  background:rgba(255,255,255,.16);
  color:#fff;
  box-shadow:inset 3px 0 0 var(--sand);
  font-weight:700;
}
body:not(.login-mode) .sidebar .side-footer{
  margin:var(--space-4) var(--space-2) 0;
  padding:var(--space-4) var(--space-2) 0;
  border-top:1px solid rgba(255,255,255,.11);
  color:rgba(255,255,255,.6);
}
/* Audit LD04/LM-04: the one rule for where main sits. It used to carry an
   unconditional margin-left:234px that beat every <=1100px reset, so on a
   tablet or a laptop the hidden drawer still left a 234px blank band. The
   margin now exists only when the sidebar is actually docked: desktop width
   and not collapsed. Eight older margin/width rules for main were deleted. */
body:not(.login-mode) main{
  width:100%;
  margin-left:0;
  min-height:100vh;
  padding:0;
  background:var(--bg);
}
@media(min-width:1101px){
  body:not(.login-mode):not(.sidebar-collapsed) main{margin-left:234px;width:calc(100% - 234px)} /* Visual 459: 234px is the sidebar's width (geometry), not spacing - it stays off the 4/8 scale */
}
body:not(.login-mode) .topbar{
  position:sticky;
  top:0;
  z-index:var(--z-header);
  min-height:64px;
  padding:var(--space-2) var(--space-6);
  border-bottom:1px solid var(--line);
  background:#fff;
  box-shadow:none;
}
body:not(.login-mode) .topbar-left{gap:12px}
body:not(.login-mode) .topbar-brand{display:none}
body:not(.login-mode) .topbar .eyebrow{
  margin:0 0 2px;
  color:var(--muted);
  font-size:var(--text-xs);
  font-weight:500;
  text-transform:none;
}
body:not(.login-mode) .topbar h2{
  margin:0;
  color:var(--ink);
  font-size: var(--text-lg);
  line-height:var(--leading-tight);
}
body:not(.login-mode) .topbar .actions{gap:8px}
body:not(.login-mode) .topbar button,
body:not(.login-mode) .topbar .badge{
  min-height:var(--control-md);
  border-radius:var(--r-sm);
  font-size: var(--text-xs);
}
/* Visual 453 (Jim, 22 Oct) reverses Audit LD34: the header clock is GOLD on
   every screen again (.siite-clock-btn, defined with the other clock states
   further down): sand to clock in, the website gold while clocked in, the
   gold with a dashed edge while a clock-out waits to be confirmed. Never red,
   never amber. Only the header's own size and spacing are set here. */
body:not(.login-mode) .topbar .topbar-clockin{
  display:inline-flex;
  align-items:center;
  gap:var(--space-2);
  font-weight:700;
  padding:0 var(--space-4);
}
body:not(.login-mode) .topbar .topbar-clockin.hidden{display:none}
/* Audit LD27 (third pass): the header's search and clock marks are the
   shared line icons (they were the colour emoji 🔍 and ⏱). */
.topbar-icon{display:inline-grid;place-items:center;width:20px;height:20px;flex:none}
body:not(.login-mode) .topbar .context-ai-button,
body:not(.login-mode) .topbar .menu-toggle{
  width:44px;
  min-width:44px;
  height:44px;
  min-height:var(--control-md);
  border-radius:var(--r-sm);
  box-shadow:none;
}
body:not(.login-mode) .view.active{
  width:min(100%,1500px);
  margin:0 auto;
  padding:var(--space-6) var(--space-6) calc(var(--space-12) + var(--space-6));
}

/* Calm page hierarchy and reusable work surfaces. */
body:not(.login-mode) .view > h2,
body:not(.login-mode) .page-title h2,
body:not(.login-mode) .page-head h2,
body:not(.login-mode) .messages-page-heading h2{
  margin:0 0 4px;
  color:var(--ink);
  font-size:var(--text-2xl);
  line-height:var(--leading-tight);
}
body:not(.login-mode) .view > p,
body:not(.login-mode) .page-title p,
body:not(.login-mode) .page-head p,
body:not(.login-mode) .messages-page-heading p{
  color:var(--muted);
  font-size: var(--text-sm);
  line-height:var(--leading-normal);
}
body:not(.login-mode) .eyebrow{
  color:var(--muted);
  font-size:var(--text-xs);
  font-weight:600;
  text-transform:uppercase;
}
body:not(.login-mode) .panel,
body:not(.login-mode) .card,
body:not(.login-mode) .data-card,
body:not(.login-mode) .section-card,
body:not(.login-mode) details.filter-panel,
body:not(.login-mode) .task-notification-panel,
body:not(.login-mode) .task-report-panel,
body:not(.login-mode) .task-recycle-panel{
  border:1px solid var(--line);
  border-radius:var(--r-md);
  background:var(--panel);
  box-shadow:var(--shadow-card);
}
body:not(.login-mode) .panel,
body:not(.login-mode) .section-card{padding:var(--space-4) var(--space-5)}
body:not(.login-mode) .panel-title{
  margin-bottom:var(--space-4);
  padding-bottom:var(--space-3);
  border-bottom:1px solid var(--line-soft);
}
body:not(.login-mode) .panel-title h3{
  color:var(--ink);
  font-size:var(--text-base);
}
body:not(.login-mode) .panel-title span,
body:not(.login-mode) .panel-title small{color:var(--muted);font-size:var(--text-xs)}
body:not(.login-mode) button,
body:not(.login-mode) .button,
body:not(.login-mode) input,
body:not(.login-mode) select,
body:not(.login-mode) textarea{
  border-radius:var(--r-sm);
  font-family:inherit;
}
body:not(.login-mode) button,
body:not(.login-mode) .button{
  min-height:var(--control-md);
  padding:var(--space-2) var(--space-3);
  box-shadow:none;
  font-size: var(--text-xs);
  font-weight:600;
}
body:not(.login-mode) button:hover,
body:not(.login-mode) .button:hover{transform:none}
/* Audit LD22 (third pass): Dashboard's "Is each job under control?" pills
   carried an inline min-height:32px under every target rule. */
body:not(.login-mode) input:where(:not([type=checkbox],[type=radio])),
body:not(.login-mode) select,
body:not(.login-mode) textarea{
  min-height:var(--control-md);
  border:1px solid var(--line);
  background:#fff;
  color:var(--ink);
  font-size: var(--text-sm);
  box-shadow:none;
}
body:not(.login-mode) input:focus,
body:not(.login-mode) select:focus,
body:not(.login-mode) textarea:focus{
  border-color:#8eabc5;
  box-shadow:0 0 0 3px rgba(36,95,143,.1);
}
body:not(.login-mode) .field > span,
body:not(.login-mode) label > span:first-child{
  color:var(--muted);
  font-size:var(--text-xs);
  font-weight:600;
}
body:not(.login-mode) .pill,
body:not(.login-mode) .badge,
body:not(.login-mode) .status-pill,
body:not(.login-mode) .due-pill{
  border-radius:var(--r-pill);
  font-size:var(--text-xs);
  font-weight:600;
}
body:not(.login-mode) .table-wrap,
body:not(.login-mode) .table-scroll,
body:not(.login-mode) .responsive-table{overflow:auto;-webkit-overflow-scrolling:touch}
body:not(.login-mode) table{font-size: var(--text-xs)}
body:not(.login-mode) th{
  padding:var(--space-2) var(--space-3);
  color:var(--muted);
  font-size:var(--text-xs);
  font-weight:600;
  background:#f7f9fc;
  text-transform:uppercase;letter-spacing:.1em;
}
body:not(.login-mode) td{padding:var(--space-2) var(--space-3);border-color:var(--line-soft)}
body:not(.login-mode) .notice{
  border-radius:var(--r-sm);
  box-shadow:none;
  font-size: var(--text-xs);
}

/* Task control stays complete, but reads as a working board instead of an alert wall. */
body:not(.login-mode) #taskBoard,
body:not(.login-mode) .kanban{
  display:grid;
  grid-template-columns:repeat(4,minmax(270px,1fr));
  gap:12px;
  align-items:start;
  overflow-x:auto;
  padding:2px 2px 12px;
  scroll-snap-type:x proximity;
}
body:not(.login-mode) .lane{
  min-width:270px;
  padding:var(--space-2);
  border:1px solid var(--line);
  border-radius:var(--r-md);
  background:#f7f9fc;
  box-shadow:none;
  scroll-snap-align:start;
}
body:not(.login-mode) .lane > h3{
  display:flex;
  align-items:center;
  justify-content:space-between;
  min-height:28px;
  margin:0 2px var(--space-2);
  color:var(--ink);
  font-size:var(--text-base);
}
body:not(.login-mode) .lane > h3 small{
  display:grid;
  min-width:24px;
  height:24px;
  place-items:center;
  border:1px solid var(--line);
  border-radius:var(--r-pill);
  background:#fff;
  color:var(--muted);
  font-size:var(--text-xs);
}
body:not(.login-mode) .task{
  margin:0 0 var(--space-2);
  padding:var(--space-3);
  border:1px solid var(--line);
  border-left:3px solid #c6d3df;
  border-radius:var(--r-sm);
  background:#fff;
  box-shadow:var(--shadow-xs);
  color:var(--ink);
}
body:not(.login-mode) .task.overdue,
body:not(.login-mode) .task.bad{
  border-color:#e8caca;
  border-left-color:var(--bad);
  background:#fffafa;
}
body:not(.login-mode) .task.warn{border-left-color:var(--warn);background:#fffdf8}
body:not(.login-mode) .task-head{gap:var(--space-2);align-items:center;flex-wrap:wrap}
body:not(.login-mode) .task-check,
body:not(.login-mode) .task-bulk-select{font-size:var(--text-xs);color:var(--muted)}
/* Visual 459 (V3-18): the task title is the card's open button - 44px to press
   with a glove (it was 308x18 on a phone). The extra height replaces the margin. */
body:not(.login-mode) .task-title-button{
  min-height:var(--control-sm);
  margin:var(--space-1) 0;
  padding:0;
  border:0;
  background:transparent;
  color:var(--ink);
  font-size: var(--text-sm);
  font-weight:600;
  line-height:var(--leading-snug);
  text-align:left;
}
body:not(.login-mode) .task > small{
  display:block;
  margin-top:var(--space-1);
  color:var(--muted);
  font-size:var(--text-xs);
  line-height:var(--leading-snug);
}
body:not(.login-mode) .task-actions{
  display:flex;
  gap:var(--space-2);
  margin-top:var(--space-2);
  flex-wrap:wrap;
}
body:not(.login-mode) .task-actions button{
  padding:var(--space-2) var(--space-2);
  font-size:var(--text-xs);
}
body:not(.login-mode) .task-actions .task-stage-select{flex:1 1 100%}
body:not(.login-mode) .task-actions select{width:100%;font-size:var(--text-xs)}
body:not(.login-mode) .empty-lane{padding:var(--space-6) var(--space-2);text-align:center;font-size:var(--text-xs)}

/* Messages use a familiar, quiet two-column workspace. */
body:not(.login-mode) .messages-page-heading{margin-bottom:var(--space-4)}
body:not(.login-mode) .messages-page-heading .eyebrow{margin-bottom:4px}
body:not(.login-mode) .messages-workspace{
  min-height:620px;
  grid-template-columns:280px minmax(0,1fr);
  overflow:hidden;
  border:1px solid var(--line);
  border-radius:var(--r-md);
  background:#fff;
  box-shadow:var(--shadow-card);
}
body:not(.login-mode) .message-sidebar{
  min-height:0;
  border-right:1px solid var(--line);
  background:#f7f9fc;
}
body:not(.login-mode) .message-sidebar-filter{padding:var(--space-3);border-bottom:1px solid var(--line)}
body:not(.login-mode) .message-sidebar-filter label{font-size:var(--text-xs);color:var(--muted)}
body:not(.login-mode) .message-sidebar-scroll{max-height:670px;padding:var(--space-2);overflow-y:auto}
body:not(.login-mode) .message-sidebar h3{margin:var(--space-3) var(--space-2) var(--space-2);color:var(--muted);font-size:var(--text-xs);text-transform:uppercase;letter-spacing:.1em}
body:not(.login-mode) .message-channel{
  min-height:48px;
  margin:2px 0;
  padding:var(--space-2);
  border:1px solid transparent;
  border-radius:var(--r-sm);
  background:transparent;
  box-shadow:none;
}
body:not(.login-mode) .message-channel:hover{background:#fff;border-color:var(--line)}
body:not(.login-mode) .message-channel.active{background:#fff;border-color:#c9d8e6;box-shadow:var(--shadow-xs)}
body:not(.login-mode) .message-channel-icon,
body:not(.login-mode) .message-avatar{border-radius:var(--r-sm);background:var(--blue);color:#fff}
body:not(.login-mode) .message-channel strong{font-size: var(--text-xs)}
body:not(.login-mode) .message-channel small{font-size:var(--text-xs);color:var(--muted)}
body:not(.login-mode) .message-conversation{min-width:0;background:#fff}
body:not(.login-mode) .message-conversation-heading{min-height:62px;padding:var(--space-3) var(--space-4);border-color:var(--line)}
/* No fixed caps: the timeline is the 1fr row of the conversation grid. The
   360/520px caps meant an expanded Project contacts panel pushed the thread
   and composer past the workspace's overflow:hidden - "the slider doesn't
   let me see all the way to the bottom". */
body:not(.login-mode) .message-timeline{padding:var(--space-4);min-height:0;max-height:none;background:#fbfcfe}
body:not(.login-mode) .team-message{max-width:min(74%,680px);border-radius:var(--r-sm);box-shadow:none}
body:not(.login-mode) .message-composer{position:sticky;bottom:0;padding:var(--space-3) var(--space-4);background:#fff;border-top:1px solid var(--line)}
body:not(.login-mode) .message-composer-controls{gap:var(--space-2)}

/* Tabs, filters and programme workspaces follow the same compact rhythm. */
body:not(.login-mode) .tabs,
body:not(.login-mode) .subtabs,
body:not(.login-mode) .programme-tabs{
  gap:4px;
  padding:var(--space-1);
  border:1px solid var(--line);
  border-radius:var(--r-sm);
  background:#fff;
  box-shadow:var(--shadow-xs);
}
body:not(.login-mode) .tabs button,
body:not(.login-mode) .subtabs button,
body:not(.login-mode) .programme-tabs button{
  min-height:var(--control-sm);
  border:0;
  border-radius:var(--r-xs);
  background:transparent;
  color:var(--muted);
  font-size:var(--text-xs);
}
body:not(.login-mode) .tabs button.active,
body:not(.login-mode) .subtabs button.active,
body:not(.login-mode) .programme-tabs button.active{
  background:var(--blue);
  color:#fff;
}
body:not(.login-mode) details.filter-panel{padding:0;overflow:hidden}
body:not(.login-mode) details.filter-panel > summary{min-height:var(--control-md);padding:12px 15px;color:var(--ink);font-size: var(--text-xs)}
body:not(.login-mode) details.filter-panel[open] > summary{border-bottom:1px solid var(--line-soft)}
body:not(.login-mode) .filters,
body:not(.login-mode) .filter-grid{gap:var(--space-2);padding:var(--space-4);background:#fff}
body:not(.login-mode) .gantt,
body:not(.login-mode) .gantt-wrap,
body:not(.login-mode) .programme-grid,
body:not(.login-mode) .programme-table{overflow:auto;-webkit-overflow-scrolling:touch}

/* Dashboard mirrors the approved reference while retaining live role content. */
#dashboard .dashboard-command h3{font-size:var(--text-2xl);}
#dashboard .dashboard-command p{font-size: var(--text-sm)}
#dashboard .dash-chartrow{gap:var(--space-3);margin-bottom:var(--space-4)}
#dashboard .dash-chart{
  padding:var(--space-4) var(--space-5);
  border:1px solid var(--line);
  border-radius:var(--r-md);
  background:#fff;
  box-shadow:var(--shadow-card);
}
#dashboard .dash-chart h4,
#dashboard .dash-chart .eyebrow{font-size:var(--text-xs);color:var(--muted)}
#dashboard .dash-chart-wide{overflow:auto}

@media(max-width:1100px){
  body:not(.login-mode) .messages-workspace{grid-template-columns:230px minmax(0,1fr)}
  body:not(.login-mode) #taskBoard,
  body:not(.login-mode) .kanban{grid-template-columns:repeat(4,280px)}
}

@media(max-width:760px){
  /* Audit LM-17: on a phone the board is a list - one stage under the next,
     no sideways scroll. */
  body:not(.login-mode) #taskBoard,
  body:not(.login-mode) .kanban{grid-template-columns:1fr;overflow-x:visible;scroll-snap-type:none}
  body:not(.login-mode) .lane{min-width:0}
  body:not(.login-mode) main{padding:0}
  /* Offline 483 (R2D-14): with viewport-fit=cover (index.html) a home-screen
     Siite draws under the status bar (black-translucent), so the header keeps
     clear of the Dynamic Island and, sideways, the notch. In Safari's browser
     mode the insets are 0 and nothing moves. */
  body:not(.login-mode) .topbar{min-height:calc(60px + env(safe-area-inset-top, 0px));padding:calc(var(--space-2) + env(safe-area-inset-top, 0px)) max(var(--space-4), env(safe-area-inset-right, 0px)) var(--space-2) max(var(--space-4), env(safe-area-inset-left, 0px))}
  body:not(.login-mode) .topbar h2{font-size:var(--text-base)}

  /* The header buttons sat on top of each other on every page. The title
     block was taking the whole row, squeezing .actions to 100px while it
     held four buttons totalling ~240px — they wrapped INSIDE that box and
     stacked. Give the actions their natural width and make the title the
     thing that shrinks instead. The brand lockup and eyebrow are dropped
     because both repeat inside the menu. */
  body:not(.login-mode) .topbar{gap:var(--space-2);flex-wrap:nowrap;position:sticky;top:0;z-index:41}
  body:not(.login-mode) .topbar-left{flex:1 1 auto;min-width:0;overflow:hidden;gap:0}
  body:not(.login-mode) .topbar-brand,
  body:not(.login-mode) .topbar .eyebrow{display:none}
  body:not(.login-mode) .topbar h2{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:100%}
  body:not(.login-mode) .topbar .actions{flex:0 0 auto;flex-wrap:nowrap;gap:var(--space-2);width:auto}
  body:not(.login-mode) .topbar .actions button{flex:0 0 auto}
  body:not(.login-mode) .view.active{padding:var(--space-4) var(--space-4) calc(var(--space-12) + var(--space-10))}
  body:not(.login-mode) .view > h2,
  body:not(.login-mode) .page-title h2,
  body:not(.login-mode) .page-head h2,
  body:not(.login-mode) .messages-page-heading h2{font-size:var(--text-xl)}
  body:not(.login-mode) .panel,
  body:not(.login-mode) .section-card{padding:var(--space-4)}
  body:not(.login-mode) .messages-workspace{display:block;min-height:0;overflow:visible}
  body:not(.login-mode) .message-sidebar{border-right:0;border-bottom:1px solid var(--line)}
  body:not(.login-mode) .message-sidebar-scroll{display:flex;max-height:none;gap:7px;overflow-x:auto;padding:10px}
  body:not(.login-mode) .message-sidebar-scroll h3{display:none}
  body:not(.login-mode) .message-channel{flex:0 0 190px}
  body:not(.login-mode) .message-timeline{min-height:300px;max-height:48vh}
  body:not(.login-mode) .team-message{max-width:88%}
  #dashboard .dash-chartrow{grid-template-columns:1fr}
}

/* Dashboard charts (ported from agreed prototype) */
.dash-chartrow{display:grid;gap:12px;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));margin-bottom:16px}
.dash-chart{background:var(--panel);border:1px solid #e5ebf2;border-radius:var(--r-md);padding:var(--space-4) var(--space-4);box-shadow:var(--shadow-card)}
.dash-chart h4{font-size: var(--text-xs);letter-spacing:.1em;text-transform:uppercase;color:var(--muted);font-weight:600;margin:0 0 2px}
.dash-chart .cnote{font-size: var(--text-xs);color:var(--muted);margin-bottom:var(--space-2)}
.dash-chart svg{display:block;width:100%;overflow:visible}
.dash-chart .legend{display:flex;flex-direction:column;gap:var(--space-2);font-size: var(--text-xs);color:var(--muted)}
.dash-chart .legend i{width:10px;height:10px;border-radius:var(--r-xs);display:inline-block;margin-right:var(--space-2)}
.dash-heat{display:grid;gap:var(--space-1);align-items:center;font-size: var(--text-xs)}
.dash-heat .hh{font-size: var(--text-xs);color:var(--muted);text-align:center;font-weight:600}
.dash-heat .hl{color:var(--ink);font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;padding-right:var(--space-2)}
.dash-heat .hc{height:26px;border-radius:var(--r-xs);display:flex;align-items:center;justify-content:center;font-weight:700}
.dash-heat .hc.ok{background:#e4f2ea;color:var(--good)}
.dash-heat .hc.miss{background:var(--status-critical-surface);color:var(--bad)}
.dash-heat .hc.draft{background:#f7ecd9;color:var(--warn-ink)}
.dash-heat .hc.na{background:var(--line-soft,#eaf0f6);color:#9aa7b4}
/* Platform 433: every live job is listed; past eight rows the grid scrolls in its card, day headings held at the top. */
.dash-heat-scroll{max-height:300px;overflow-y:auto;overscroll-behavior:contain}
.dash-heat-scroll .dash-heat .hh,.dash-heat-scroll .dash-heat > span:first-child{position:sticky;top:0;z-index:1;background:var(--panel)}
.dash-chart .legend span{display:flex;align-items:center;justify-content:space-between;gap:var(--space-2);border-bottom:1px dashed var(--line-soft,#eaf0f6);padding-bottom:var(--space-1)}
.dash-chart .legend b{font-variant-numeric:tabular-nums}
/* Every informational tile is a link: visible affordance + keyboard focus */
/* Audit LD11: the ONE .link-card rule (two older layers deleted). The brief
   bans hover lifts, so hover is a firmer edge and the raised elevation token,
   never a translateY. */
.link-card{cursor:pointer;position:relative;transition:box-shadow var(--motion) var(--ease-out),border-color var(--motion) var(--ease-out)}
.link-card:hover{border-color:#b9cfe2;box-shadow:var(--elev-2)}
.link-card:focus-visible{outline:2px solid var(--focus-colour);outline-offset:2px}
.diary-prefill-bar{display:flex;justify-content:space-between;align-items:center;gap:14px;flex-wrap:wrap;background:var(--sand-tint);border:1px solid #e4d6bc;border-radius:var(--r-sm);padding:var(--space-3) var(--space-4);margin-bottom:16px}
.diary-prefill-bar strong{display:block;font-size:var(--text-base);color:var(--ink)}
.diary-prefill-bar small{color:var(--muted);font-size: var(--text-xs)}
.diary-prefill-bar button{white-space:nowrap}
/* Audit LD26: the one-tap clock-in is sand, as in the prototype. Written at
   the button-tier specificity, or the quiet default tier turned it white. */
/* Visual 453: the one-tap's colours come from .siite-clock-btn; this sets its size only. */
body:not(.login-mode) button.today-clock-onetap{min-height:52px;padding:14px 24px;font-size: var(--text-base)}
.runaway-clock-banner{display:flex;justify-content:space-between;align-items:center;gap:16px;flex-wrap:wrap;background:var(--bad-bg,var(--status-critical-surface));border:1px solid #efcfcf;border-left:4px solid var(--bad);border-radius:var(--r-sm);padding:14px 18px;margin:0 0 14px}
.runaway-clock-banner strong{display:block;font-size:var(--text-base);color:var(--ink)}
.runaway-clock-banner small{color:var(--muted);font-size: var(--text-xs)}
.runaway-clock-banner button{background:var(--bad);min-height:var(--control-md);white-space:nowrap}

/* =============================================================================
   PROTOTYPE STAT-TILE RECIPE — one look for every KPI/stat family, site-wide.
   Matches the agreed prototype: white tile, 3px accent top bar, uppercase
   letterspaced label, large light number, muted footnote. Scoped to the known
   stat families only (no broad overrides — lesson learned).
   ============================================================================= */
.kpi-card, .today-kpi, .hseq-readiness-card, .crm-kpi-card, .report-kpi, .readiness-item, .numberbox, .siite-metric{
  background:var(--panel);
  border:1px solid #e5ebf2;
  border-radius:var(--r-md);
  padding:var(--space-4) var(--space-4);
  box-shadow:var(--shadow-card);
  position:relative;
  overflow:hidden;
}
.kpi-card:before, .today-kpi:before, .hseq-readiness-card:before,
.crm-kpi-card:before, .report-kpi:before, .readiness-item:before, .numberbox:before, .siite-metric:before{
  content:""; position:absolute; top:0; left:0; right:0; height:3px; background:var(--sand);
}
.kpi-card.kpi-good:before, .today-kpi.good:before, .hseq-readiness-card.good:before, .siite-metric-ok:before{background:var(--good)}
.kpi-card.kpi-warn:before, .today-kpi.warn:before, .hseq-readiness-card.warn:before, .siite-metric-warning:before{background:var(--warn)}
.kpi-card.kpi-bad:before, .today-kpi.bad:before, .hseq-readiness-card.bad:before, .siite-metric-critical:before{background:var(--bad)}
.kpi-card.kpi-neutral:before, .siite-metric-neutral:before{background:#cfdbe6}
/* label */
.kpi-card .label, .today-kpi > span, .hseq-readiness-card > span,
.crm-kpi-card > span, .report-kpi > span, .numberbox > span, .siite-metric-label{
  display:block; color:var(--muted); font-size:var(--text-xs); font-weight:600;
  text-transform:uppercase; letter-spacing:.13em; margin-bottom:var(--space-1);
}
/* System readiness card: strong is the system's name, span is its state. The
   shared kpi rules had these the wrong way round, so the label was set at
   1.85rem and the state at 11px. Same visual weighting as every other card in
   Siite — quiet label, loud answer. */
.readiness-item > strong{
  display:block; color:var(--muted); font-size:var(--text-xs); font-weight:600;
  text-transform:uppercase; letter-spacing:.13em; margin-bottom:4px;
}
.readiness-item > span{
  display:block; color:var(--ink); font-size:var(--text-2xl); font-weight:600;
  letter-spacing:-.02em; line-height:var(--leading-tight); margin:0 0 3px; text-transform:none;
}
/* the number.
   .readiness-item > strong is deliberately NOT in this list: in that card the
   strong is the system's NAME ("Firebase persistence") and the span beneath is
   the answer ("Production live"). Including it made the label 29.6px and the
   status 11px — the only cards in Siite that shout the label and whisper the
   value. They are sized below instead, the right way round. */
.kpi-card .value, .today-kpi > strong, .hseq-readiness-card > strong,
.crm-kpi-card > strong, .report-kpi > strong, .numberbox > strong, .siite-metric-value{
  display:block; font-size:var(--stat-value); font-weight:600; letter-spacing:-.03em;
  line-height:var(--leading-none); color:var(--ink); font-variant-numeric:tabular-nums; margin:0 0 2px;
}
/* footnote */
.kpi-card small, .today-kpi > small, .hseq-readiness-card > small,
.crm-kpi-card > small, .report-kpi > small, .readiness-item > small, .siite-metric-hint{
  display:block; color:var(--muted); font-size: var(--text-xs); font-weight:400; line-height:var(--leading-snug);
}

/* Audit LD10 (third pass): ONE number size for every stat tile, the
   --stat-value token, read only by the recipe rule above. Eleven competing
   rules (Dashboard 24px, hub overview 20px, Today 27px, three phone sizes)
   are deleted. Phones take one step down, in the same token. */
@media(max-width:760px){:root{--stat-value:var(--text-2xl)}}
/* Unset values whisper instead of shouting */
/* Audit LD19: muted, not --muted-soft (#6b7a89 had LESS contrast than the banned #6c7888); --muted-soft is retired. */
.numberbox > strong.value-empty, .kpi-card .value.value-empty, .siite-metric-value.value-empty{font-size: var(--text-base);font-weight:500;color:var(--muted);letter-spacing:0}
/* Audit LD09: a tile with no destination says so - no pointer, no hover lift,
   no focus ring - so only tiles that go somewhere look pressable. */
.kpi-static{cursor:default}

/* Dashboard information hierarchy — the real app, using live permission-scoped data. */
body:not(.login-mode) .data-mode-panel.collapsed{
  display:none;
}
body:not(.login-mode) .sync-badge-button{
  min-height:var(--control-md);
  padding:var(--space-2) var(--space-3);
  border:1px solid #d8e1eb;
  border-radius:var(--radius-md);
  background:#fff;
  color:var(--muted);
  box-shadow:none;
  font-size: var(--text-xs);
  font-weight:600;
}
body:not(.login-mode) .sync-badge-button:hover{
  border-color:#b9cfe2;
  background:#f7f9fc;
  color:var(--ink);
  transform:none;
}
body:not(.login-mode) #reloadSnapshot,
body:not(.login-mode) #quickSignOut{
  display:none !important;
}
#dashboard .dashboard-command{
  align-items:end;
  margin-bottom:var(--space-2);
  padding:2px 0 var(--space-1);
  border:0;
  background:transparent;
  box-shadow:none;
}
#dashboard .dashboard-command .eyebrow{
  display:none;
}
#dashboard .dashboard-command h3{
  margin:0 0 4px;
  font-size:var(--text-2xl);
  letter-spacing:0;
}
#dashboard .dashboard-command p{
  margin:0;
  color:var(--muted);
  font-size:var(--text-base);
}
#dashboard .dashboard-command-actions{
  display:none;
}
/* Calm 469 (R2B-22): the Portfolio's one primary sits in its own slot at the end of the command bar. */
#dashboard .dashboard-command > .siite-page-primary-slot{display:flex;align-items:center;justify-content:flex-end}
/* Audit LD33: the chart row auto-fits (base .dash-chartrow rule), so two
   charts fill the row instead of leaving an empty third slot. */
#dashboard .dash-chartrow{
  gap:var(--space-4);
  margin-bottom:var(--space-4);
}
#dashboard .dash-chart{
  min-width:0;
  padding:var(--space-4) var(--space-5);
  border-color:#dfe7ef;
  box-shadow:var(--shadow-xs);
}
#dashboard .dash-chart-wide{
  grid-column:1/-1;
}
#dashboard .dash-margin-visual{
  display:flex;
  align-items:center;
  justify-content:center;
  gap:var(--space-4);
  min-height:106px;
}
#dashboard .dash-margin-visual svg{
  width:92px;
  flex:0 0 92px;
}
/* Audit LD10 (third pass): the Dashboard's chart numbers are stat numbers
   too - the one --stat-value size, not 27px in one layer and 24px in the
   next. Audit LD08: "Not reconciled" is the absence of a figure and
   whispers like every other unset value. */
#dashboard .dash-margin-visual strong.value-empty{font-size:var(--text-base);font-weight:500;color:var(--muted);letter-spacing:0}
#dashboard .dash-margin-visual strong,
#dashboard .dash-operational-summary .dash-chart > strong{
  display:block;
  color:var(--ink);
  font-size:var(--stat-value);
  font-weight:600;
  font-variant-numeric:tabular-nums;
  line-height:var(--leading-none);
}
#dashboard .dash-margin-visual span{
  display:block;
  max-width:150px;
  margin-top:var(--space-1);
  color:var(--muted);
  font-size: var(--text-xs);
  line-height:var(--leading-snug);
}
#dashboard .dash-empty-chart{
  display:grid;
  min-height:106px;
  place-items:center;
  color:var(--muted);
  font-size: var(--text-xs);
  text-align:center;
}
#dashboard .my-day-panel{
  margin-top:0;
}
#dashboard [hidden]{
  display:none !important;
}

@media(max-width:1100px){
  #dashboard .dash-chart-wide{grid-column:1/-1}
}
@media(max-width:760px){
  #dashboard .dash-chart-wide{grid-column:auto;overflow-x:auto}
  #dashboard .dash-heat{min-width:600px}
  body:not(.login-mode) .sync-badge-button{max-width:130px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
}

/* Keep the two compact top-bar tools on one visual grid. */
body:not(.login-mode) .topbar .actions {
  align-items: center;
}

/* The approved shell aligns the header with the main content column. */
body:not(.login-mode) .topbar {
  width: auto;
  margin-right: 0;
  margin-left: 0;
}

body:not(.login-mode) .topbar .context-ai-button,
body:not(.login-mode) .topbar .menu-toggle {
  width: 44px;
  min-width: 44px;
  height: 44px;
  min-height:var(--control-md);
  margin: 0;
  padding: 0;
  place-items: center;
  align-self: center;
  border: 1px solid #d8e1eb;
  border-radius: var(--radius-md);
  background: #fff;
  box-shadow: var(--shadow-xs);
}

body:not(.login-mode) .topbar .context-ai-button {
  display: inline-grid;
  line-height: var(--leading-none);
}

body:not(.login-mode) .topbar .menu-toggle {
  display: inline-grid;
  grid-template-rows: repeat(3, 2px);
  align-content: center;
  row-gap: 4px;
}

body:not(.login-mode) .topbar .menu-toggle span {
  width: 18px;
  height: 2px;
  margin: 0;
  background: #163a5f;
}

@media(max-width:760px) {
  /* Deliberately NOT position:fixed. Pinning these two to hard-coded right
     offsets is what made them sit on top of the clock-in button and on top
     of the page content while scrolling. The sticky bar keeps them reachable
     without taking them out of the row. */
  body:not(.login-mode) .topbar .actions .context-ai-button {
    position: static;
    margin: 0;
  }
}
/* Audit P3V-06: the same in-flow menu button from 761 to 1100px. */
@media(max-width:1100px) {
  body:not(.login-mode) .topbar .menu-toggle {
    position: static;
    margin: 0;
  }
}

/* Final approved visual-system enforcement.
   Keep this last so older route and mobile rules cannot reintroduce the legacy layout. */
body:not(.login-mode) {
  --action-blue: #3a5877;
}

body:not(.login-mode) .sidebar .nav.active {
  background-color: var(--action-blue);
}

/* Audit LD01: a rule here painted every class-less button filled
   (button:not([class]) - 276 of them across 62 screens, every page tab row a
   wall of filled blocks) and out-specified the button tiers below. It is
   gone; .primary is defined once, in the button hierarchy. */

body:not(.login-mode) .workforce-compliance-controls {
  display: grid;
  grid-template-columns: minmax(0, 1.35fr) minmax(320px, .65fr);
  gap: 16px;
  margin: 0 0 18px;
}

body:not(.login-mode) .workforce-compliance-controls > * {
  min-width: 0;
  margin: 0;
}

body:not(.login-mode) .workforce-compliance-controls .workforce-reminder-scheduler {
  grid-template-columns: minmax(0, 1fr);
  align-content: start;
  align-self: stretch;
}

body:not(.login-mode) .workforce-compliance-controls .button-row {
  justify-content: flex-start;
}

@media(max-width:1100px) {
  body:not(.login-mode) .workforce-compliance-controls {
    grid-template-columns: minmax(0, 1fr);
  }
}


/* Audit LD31: the programme controls are a plain toolbar (version picker on
   the left, Gantt buttons on the right), not an empty card. */
body:not(.login-mode) .programme-toolbar {
  display: flex;
  align-items: end;
  justify-content: flex-end;
  gap: 10px;
  margin: 0 0 12px;
}
body:not(.login-mode) .programme-toolbar .programme-version-picker {
  flex: 1 1 260px;
  max-width: 420px;
  margin: 0 auto 0 0;
}
body:not(.login-mode) .programme-office-review > details > summary { min-height: var(--control-md); display: flex; align-items: center; cursor: pointer; font-weight: 600; }

/* Audit LM-17: the Tasks tool fold. */
.task-tools-disclosure{margin:0 0 var(--space-4)}
.task-tools-disclosure > summary{display:flex;align-items:center;min-height:var(--control-md);padding:var(--space-2) var(--space-4);border:1px solid var(--line);border-radius:var(--r-md);background:var(--panel);cursor:pointer;font-weight:600;list-style:none}
.task-tools-disclosure > summary::-webkit-details-marker{display:none}
.task-tools-disclosure > summary::after{content:"▾";margin-left:auto}
.task-tools-disclosure[open] > summary{margin-bottom:12px}
.task-tools-disclosure[open] > summary::after{content:"▴"}
/* Audit LM-17: a lane is never its own inner scroll (each was a 574px box
   with a sticky title over its first card); the page scrolls, and M-03's
   "show all" keeps long lanes short. */

@media(min-width:1101px) {
  body:not(.login-mode) .project-hub-cards {
    grid-template-columns: repeat(4, minmax(0, 1fr)) !important;
  }
}

@media(min-width:761px) and (max-width: 1100px) {
  body:not(.login-mode) .project-hub-cards {
    grid-template-columns: repeat(2, minmax(0, 1fr)) !important;
  }
}

@media(max-width:760px) {
  body:not(.login-mode) .project-hub-cards {
    grid-template-columns: repeat(2, minmax(0, 1fr)) !important;
    gap: 8px !important;
  }

  body:not(.login-mode) .project-hub-cards .card {
    min-height: 92px;
    padding: var(--space-3);
  }

  body:not(.login-mode) .task-list-intro {
    display: grid;
    grid-template-columns: minmax(0, 1fr);
    gap: 12px;
  }

  body:not(.login-mode) .task-list-intro .button-row,
  body:not(.login-mode) .task-list-intro > button,
  body:not(.login-mode) .task-list-intro > a {
    width: 100%;
  }

  body:not(.login-mode) .programme-toolbar {
    display: grid;
    grid-template-columns: repeat(2, minmax(0, 1fr));
    align-items: end;
  }

  body:not(.login-mode) .programme-toolbar .programme-version-picker {
    grid-column: 1 / -1;
    width: 100%;
    max-width: none;
  }

  body:not(.login-mode) .programme-toolbar > button,
  body:not(.login-mode) .programme-toolbar > a {
    width: 100%;
    min-width: 0;
  }
}

/* External client mode: a signed-in external_viewer sees only the client-safe
   project page. Internal chrome is removed entirely; sign-out lives on the
   page itself and in the user menu. */
body.external-client-mode .sidebar,
body.external-client-mode .sidebar-scrim,
body.external-client-mode .menu-toggle,
body.external-client-mode #contextAiButton,
body.external-client-mode #topbarClockIn,
body.external-client-mode #syncBadge,
body.external-client-mode #reloadSnapshot,
body.external-client-mode #notificationButton {
  display: none !important;
}
body.external-client-mode main {
  margin-left: 0 !important;
  width: 100% !important;
  max-width: 100% !important;
}

/* Activity hub: one overlay per programme activity assembling everything Siite
   knows about it. Sheet scrolls, backdrop click or Esc closes. */
.activity-hub-overlay{position:fixed;inset:0;z-index:var(--z-drawer);background:rgba(15,23,42,.45);display:flex;align-items:flex-start;justify-content:center;padding:4vh 16px;overflow-y:auto}
.activity-hub-sheet{background:var(--surface,#fff);border-radius:var(--r-lg);max-width:980px;width:100%;padding:22px 24px;box-shadow:0 24px 64px rgba(15,23,42,.35);display:flex;flex-direction:column;gap:14px;max-height:92vh;overflow-y:auto}
.activity-hub-header{display:flex;justify-content:space-between;gap:16px;align-items:flex-start;flex-wrap:wrap}
.activity-hub-header h3{margin:2px 0}
.activity-hub-grid .panel{min-width:0}
.activity-hub-grid .panel h4{margin:0}
@media(max-width:760px){.activity-hub-overlay{padding:0}.activity-hub-sheet{border-radius:0;max-height:100vh}}

/* Payment notice letter: on-screen sheet + print isolation (mirrors the
   programme print pattern — body.printing-notice hides everything else). */
.payment-notice-sheet{background:#fff;border:1px solid var(--jbp-line);border-radius:var(--r-sm);padding:30px 34px;font-size:var(--text-base);line-height:var(--leading-normal);color:var(--jbp-navy)}
.payment-notice-sheet .notice-letterhead{display:flex;justify-content:space-between;align-items:center;gap:16px;border-bottom:2px solid var(--jbp-gold);padding-bottom:12px;margin-bottom:16px}
.payment-notice-sheet .notice-letterhead img{display:block;height:34px;width:auto;max-width:60%}
.payment-notice-sheet .notice-letterhead strong{font-size:var(--text-lg)}
.payment-notice-sheet .notice-letterhead span{font-size: var(--text-base);font-weight:600;text-transform:uppercase;letter-spacing:.1em}
.payment-notice-sheet .notice-parties{border-collapse:collapse;margin-bottom:14px}
.payment-notice-sheet .notice-parties td{padding:3px 14px 3px 0;vertical-align:top}
.payment-notice-sheet .notice-parties td:first-child{color:var(--jbp-muted);white-space:nowrap}
.payment-notice-sheet .notice-citation{font-style:italic;color:var(--jbp-muted)}
.payment-notice-sheet .notice-basis-label{font-weight:700;margin-bottom:2px}
.payment-notice-sheet .notice-basis{white-space:normal;border-left:3px solid var(--jbp-line);padding-left:12px}
.payment-notice-sheet .notice-signature{margin-top:26px;border-top:1px solid var(--jbp-line);padding-top:12px}
@media print{
  body.printing-notice > *:not(#paymentNoticeOverlay){display:none !important}
  body.printing-notice #paymentNoticeOverlay{position:static;background:#fff;padding:0;overflow:visible}
  body.printing-notice #paymentNoticeOverlay .button-row{display:none !important}
  body.printing-notice .activity-hub-sheet{box-shadow:none;max-height:none;overflow:visible;padding:0}
  body.printing-notice .payment-notice-sheet{border:none}
}

/* Search Siite: one overlay, every record type. */
.siite-search-sheet{max-width:680px}
/* Calm 469 (Apple feel #20): search opens with the same 180ms ease as drawers and sheets
   (the global reduced-motion rule turns it off). Calm 469 (R2B-01): the overlay is on the
   drawer layer, so on a phone the tab bar no longer sits over the bottom of the sheet. */
#siiteSearchOverlay{animation:siiteScrimIn var(--motion-sheet) var(--ease-out)}
#siiteSearchOverlay .siite-search-sheet{animation:siiteSearchIn var(--motion-sheet) var(--ease-out)}
@keyframes siiteSearchIn{from{transform:translateY(-8px);opacity:.4}to{transform:none;opacity:1}}
.siite-search-sheet input[type="search"]{width:100%;font-size:var(--text-base);padding:var(--space-3) var(--space-4);border-radius:var(--r-sm);border:1px solid #cbd5e1}
#siiteSearchResults{display:flex;flex-direction:column;gap:4px;max-height:56vh;overflow-y:auto}
.siite-search-group{margin:var(--space-2) 0 2px;text-transform:uppercase;letter-spacing:.1em;font-size:var(--text-xs)}
/* M-08: rows are flex children of a scrolling column - without flex-shrink:0
   they compress to fit the viewport and their text overlaps the next row. */
#siiteSearchResults>*{flex:0 0 auto}
.siite-search-hit{display:flex;flex-direction:column;align-items:flex-start;gap:2px;text-align:left;background:none;border:1px solid transparent;border-radius:var(--r-sm);padding:var(--space-2) var(--space-2);cursor:pointer;width:100%;height:auto;white-space:normal}
.siite-search-hit strong,.siite-search-hit small{white-space:normal;overflow-wrap:anywhere;text-align:left}
.siite-search-hit:hover{background:var(--surface-sunken);border-color:var(--line)}
.siite-search-hit small{color:var(--muted)}
/* AI 446: the same box is Tell Siite - a mode switch, the microphone and
   "Draft it" sit with the input; the status says what Siite did or why not. */
.siite-search-modes{margin:0 0 var(--space-2)}
.siite-search-row{display:flex;gap:var(--space-2);align-items:stretch}
.siite-search-row input{flex:1 1 auto;min-width:0}
.siite-tell-mic{flex:0 0 auto;min-width:var(--control-md);min-height:var(--control-md);display:inline-flex;align-items:center;justify-content:center;padding:0 var(--space-2)}
.siite-tell-mic.live{background:var(--status-critical-surface);color:var(--bad);border-color:var(--bad)}
.siite-tell-go{flex:0 0 auto;min-height:var(--control-md)}
.siite-tell-offer{border-color:var(--line);background:var(--surface-sunken)}
/* Search 471: the box never ends in nothing - "Ask Siite" takes the words to the assistant. */
.siite-ask-offer{border-color:var(--line);border-style:dashed;margin-top:var(--space-2)}
.tell-siite-status{padding:var(--space-2) var(--space-3);border-radius:var(--r-sm);border:1px solid var(--line);margin-top:var(--space-2)}
.tell-siite-status p{margin:0 0 var(--space-1)}
.tell-siite-refused,.tell-siite-clarify{background:var(--status-warning-surface);border-color:var(--warn)}
.tell-siite-failed{background:var(--status-critical-surface);border-color:var(--bad)}
.tell-siite-applied{background:var(--status-ok-surface);border-color:var(--good)}
body[data-auth-state="signed-out"] #topbarSearch,
body[data-auth-state="restoring"] #topbarSearch,
body.external-client-mode #topbarSearch{display:none !important}

/* Findability 461: the box finds actions; favourites and recent; the role's top
   actions in every page header; "On this page"; the ring on a found control. */
.siite-action-hit-row{display:flex;align-items:stretch;gap:var(--space-1)}
.siite-action-hit-row>.siite-search-hit{flex:1 1 auto;min-width:0}
.siite-action-hit strong::before{content:"";display:inline-block;width:8px;height:8px;border-radius:50%;background:var(--accent);margin-right:var(--space-2);vertical-align:1px;opacity:.85}
.siite-action-pin,.siite-shortcut-pin{flex:0 0 auto;width:var(--control-md);min-height:var(--control-md);padding:0;background:none;border:1px solid transparent;box-shadow:none;color:var(--muted);font-size:var(--text-lg);line-height:var(--leading-none);border-radius:var(--r-sm)}
.siite-action-pin:hover,.siite-shortcut-pin:hover{background:var(--surface-sunken);border-color:var(--line);filter:none}
.siite-action-pin.is-pinned,.siite-shortcut-pin.is-pinned{color:#b9831f}
.siite-search-hit:focus-visible{outline:2px solid var(--focus-colour);outline-offset:1px;background:var(--surface-sunken)}
.siite-search-tip,.siite-search-about{font-size:var(--text-xs);margin-top:var(--space-2)}
.siite-action-target{outline:3px solid var(--accent)!important;outline-offset:3px;box-shadow:0 0 0 8px rgba(216,95,50,.18)!important;animation:siite-action-ring 1.1s var(--ease-out) 2}
@keyframes siite-action-ring{0%{box-shadow:0 0 0 0 rgba(216,95,50,.35)}100%{box-shadow:0 0 0 12px rgba(216,95,50,0)}}
@media (prefers-reduced-motion:reduce){.siite-action-target{animation:none}}
.siite-page-header-actions .siite-top-action{white-space:nowrap}
.siite-today-shortcuts{display:flex;flex-wrap:wrap;align-items:center;gap:var(--space-2);margin:0 0 var(--space-4)}
.siite-today-shortcuts-title{flex:0 0 auto;white-space:nowrap;font-size:var(--text-xs);font-weight:600;letter-spacing:.1em;text-transform:uppercase;color:var(--muted);margin-right:var(--space-1)}
.siite-shortcut-chip{display:inline-flex;align-items:center;gap:var(--space-2);min-height:var(--control-md);padding:var(--space-1) var(--space-4);border-radius:var(--r-pill);background:#fff;color:var(--ink);border:1px solid var(--line);box-shadow:none;font-weight:500;max-width:100%}
.siite-shortcut-chip small{color:var(--muted);font-weight:600}
.siite-shortcut-chip.is-pinned>span{color:#b9831f}
.siite-shortcut-chip:hover{background:var(--surface-sunken);filter:none}
.siite-shortcut-find{color:var(--muted)}
.siite-shortcut-find .siite-icon{width:16px;height:16px}
.siite-jump-bar{position:sticky;top:var(--siite-jump-top,0px);z-index:8;display:flex;flex-direction:row;flex-wrap:nowrap;align-items:center;width:auto;max-width:100%;gap:var(--space-1);overflow-x:auto;scrollbar-width:none;margin:0 0 var(--space-4);padding:var(--space-2) var(--space-3);background:rgba(244,247,251,.94);-webkit-backdrop-filter:saturate(1.6) blur(12px);backdrop-filter:saturate(1.6) blur(12px);border:1px solid var(--line);border-radius:var(--r-pill)}
.siite-jump-bar::-webkit-scrollbar{display:none}
.siite-jump-title{flex:0 0 auto;font-size:var(--text-xs);font-weight:600;letter-spacing:.1em;text-transform:uppercase;color:var(--muted);padding:0 var(--space-2) 0 var(--space-1)}
.siite-jump-link{flex:0 0 auto;display:inline-flex;align-items:center;min-height:36px;padding:0 var(--space-3);border-radius:var(--r-pill);color:var(--ink);text-decoration:none;font-size:var(--text-sm);font-weight:500;white-space:nowrap}
.siite-jump-link:hover{background:#fff}
.siite-jump-link.is-current{background:#fff;color:var(--ink);box-shadow:0 1px 2px rgba(16,24,40,.08);font-weight:600}
.siite-jump-target{scroll-margin-top:calc(var(--siite-jump-top,0px) + 64px)}
@media (max-width:760px){
  /* A big search on a phone: the box fills the screen, the field is large
     (--text-lg, 17px, so iOS does not zoom) and every result is a full-width 52px row. */
  #siiteSearchOverlay{align-items:stretch;padding:0}
  #siiteSearchOverlay .siite-search-sheet{max-width:none;width:100%;min-height:100%;max-height:none;border-radius:0;padding:max(var(--space-3), env(safe-area-inset-top)) var(--space-4) var(--space-4)}
  .siite-search-sheet input[type="search"],.siite-search-sheet #siiteSearchInput{font-size:var(--text-lg);min-height:52px;padding:var(--space-3) var(--space-4)}
  #siiteSearchResults{max-height:none;flex:1 1 auto}
  .siite-search-hit{min-height:52px;padding:var(--space-2) var(--space-3)}
  #siiteSearchOverlay .siite-search-sheet>.panel-title{flex-direction:row;align-items:center}
  #siiteSearchOverlay .siite-search-sheet>.panel-title>button{width:auto;flex:0 0 auto}
  .siite-jump-bar{margin-inline:calc(-1 * var(--space-1));border-radius:var(--r-md)}
  .siite-today-shortcuts{flex-wrap:nowrap;overflow-x:auto;scrollbar-width:none;padding-bottom:var(--space-1)}
  .siite-shortcut-chip{flex:0 0 auto}
}

/* QS desk inline selects: compact enough for the proposal table. */
.mini-select{font-size: var(--text-xs);padding:2px 4px;border-radius:var(--r-xs);border:1px solid #cbd5e1;max-width:130px;background:#fff}

/* Siite feed: the social-style pulse on the workspace home. */
.siite-feed-panel .siite-feed-list{display:flex;flex-direction:column;gap:2px;max-height:52vh;overflow-y:auto}
.siite-feed-item{display:flex;gap:var(--space-2);align-items:flex-start;text-align:left;background:none;border:1px solid transparent;border-radius:var(--r-sm);padding:var(--space-2) var(--space-2);cursor:pointer;width:100%}
.siite-feed-item:hover{background:#f8fafc;border-color:var(--line)}
.siite-feed-avatar{flex:0 0 34px;height:34px;display:flex;align-items:center;justify-content:center;background:var(--surface-sunken);border-radius:50%;font-size:var(--text-base)}
.siite-feed-body{display:flex;flex-direction:column;gap:1px;min-width:0}
.siite-feed-body small{color:var(--muted);display:block}
.siite-feed-text{cursor:pointer;display:flex;flex-direction:column;gap:1px}
.siite-feed-comments{display:flex;flex-direction:column;gap:2px;margin-top:var(--space-1);border-left:2px solid var(--line);padding-left:var(--space-2)}
.siite-feed-comment-box{display:flex;gap:var(--space-2);margin-top:var(--space-1)}
.siite-feed-comment-box input{flex:1;font-size: var(--text-xs);padding:var(--space-1) var(--space-2);border-radius:var(--r-sm);border:1px solid #cbd5e1}
.siite-feed-comment-toggle{font-size: var(--text-xs);margin-top:2px;align-self:flex-start}
.siite-feed-onsite{display:flex;flex-wrap:wrap;gap:var(--space-2);align-items:center;padding:var(--space-2) 2px;border-bottom:1px solid var(--surface-sunken);margin-bottom:var(--space-2)}
.siite-feed-photo{max-width:260px;max-height:160px;border-radius:var(--r-sm);margin-top:var(--space-2);object-fit:cover;border:1px solid var(--line)}
.siite-feed-actions{display:flex;flex-wrap:wrap;gap:var(--space-2) var(--space-3);align-items:center;margin-top:var(--space-1);min-width:0} /* Audit P3V-05 (third pass): reactions and Comment wrap on a phone instead of running under the panel edge. */
.siite-feed-like{font-size: var(--text-xs)}
.siite-feed-like.liked{font-weight:700}
.siite-feed-delete{color:var(--muted);font-size:var(--text-xs);padding:0 2px}
.siite-feed-delete:hover{color:var(--bad)}
.siite-feed-digest{display:flex;flex-wrap:wrap;gap:var(--space-2);align-items:center;padding:var(--space-1) 2px var(--space-2);font-size: var(--text-xs)}
.siite-feed-digest-chip{background:#eef2ff;color:#3730a3;border-radius:var(--r-pill);padding:var(--space-1) var(--space-2);font-weight:600;font-size: var(--text-xs)}
/* Audit P3V-05 (third pass): the composer sets every layout property it
   needs - it wraps, and its children may shrink (min-width:0) - so on a
   phone the box takes a line of its own and Attach, Dictate and Post sit
   under it instead of running off the right edge. */
.siite-feed-composer{display:flex;flex-wrap:wrap;align-items:center;gap:var(--space-2);margin:2px 0 var(--space-2)}
.siite-feed-composer > *{min-width:0}
.siite-feed-composer > input[type=text]{flex:1 1 240px}
body:not(.login-mode) .siite-feed-composer > button{display:inline-flex;align-items:center;justify-content:center;gap:var(--space-2);flex:0 0 auto;min-width:var(--control-md)}
@media(max-width:760px){
  .siite-feed-composer > select.mini-select{flex:1 1 100%;max-width:none}
  .siite-feed-composer > input[type=text]{flex:1 1 100%}
  body:not(.login-mode) .siite-feed-composer > .siite-feed-post{flex:1 1 auto}
}
.siite-feed-composer input{flex:1;font-size: var(--text-sm);padding:var(--space-2) var(--space-3);border-radius:var(--r-pill);border:1px solid #cbd5e1;background:#f8fafc}
.siite-feed-composer input:focus{background:#fff;border-color:var(--border-strong);outline:none}
.siite-feed-day-divider{display:flex;align-items:center;gap:var(--space-2);margin:var(--space-2) 0 var(--space-1);color:var(--muted);font-size:var(--text-xs);text-transform:uppercase;letter-spacing:.1em}
.siite-feed-day-divider::before,.siite-feed-day-divider::after{content:"";flex:1;height:1px;background:var(--line)}
.siite-feed-reactions{display:flex;flex-wrap:wrap;gap:var(--space-1);align-items:center}
/* Audit LD27 (third pass): a reaction is stored as its emoji (❤️ 👍 🔥 👏),
   so the data is kept; it is drawn in monochrome like every other mark. */
.siite-feed-react{border:1px solid var(--line);background:#f8fafc;border-radius:var(--r-pill);padding:2px var(--space-2);font-size: var(--text-xs);cursor:pointer;line-height:var(--leading-snug)}
/* Audit LD27 (third pass): marks that are stored or chosen as emoji (feed
   reactions, AI Team agents, Marketplace categories) are drawn in monochrome. */
.siite-mono-mark,.ai-team-emoji,.market-filter-icon,.market-photo-fallback,.siite-feed-avatar{font-variant-emoji:text;filter:grayscale(1)}
.siite-feed-react:hover{background:#eef2ff;border-color:#c7d2fe}
.siite-feed-react.mine{background:#eef2ff;border-color:#818cf8;font-weight:700}
.siite-feed-react.ghost{opacity:.45}
.siite-feed-item:hover .siite-feed-react.ghost{opacity:1}
/* Audit B2: reactions under a team message reuse the feed's pills. */
.team-message-reactions{flex-wrap:wrap;margin-top:6px}
.team-message-reactions .siite-feed-react.ghost{opacity:1}
.team-message-react-toggle{font-size: var(--text-xs);color:var(--muted);padding:2px 4px}
.siite-feed-item-post{background:#fdfaf3;border-color:#f1e6cf}
.siite-feed-post-text{display:block;font-size:var(--text-base);margin:var(--space-1) 0 2px;white-space:pre-wrap}
.siite-feed-photo{cursor:zoom-in}
.siite-feed-photogrid{display:grid;grid-template-columns:repeat(2,minmax(0,120px));gap:var(--space-1);margin-top:var(--space-2)}
.siite-feed-photocell{position:relative;cursor:zoom-in;border-radius:var(--r-sm);overflow:hidden;border:1px solid var(--line)}
.siite-feed-photocell img{width:100%;height:90px;object-fit:cover;display:block}
.siite-feed-photomore{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;background:rgba(15,23,42,.55);color:#fff;font-weight:700;font-size:var(--text-base)}
.siite-feed-lightbox{position:fixed;inset:0;z-index:2000;background:rgba(15,23,42,.88);display:flex;align-items:center;justify-content:center;cursor:zoom-out;padding:var(--space-6)}
.siite-feed-lightbox img{max-width:94vw;max-height:92vh;border-radius:var(--r-md);box-shadow:var(--elev-3)}
.siite-feed-composer select{max-width:170px;font-size: var(--text-xs);border-radius:var(--r-pill);border:1px solid #cbd5e1;background:#f8fafc;padding:var(--space-2) var(--space-2)}
.siite-feed-attach-row{display:flex;flex-wrap:wrap;gap:var(--space-2);margin:-2px 0 var(--space-2);font-size: var(--text-xs);align-items:center}
.siite-feed-post-delete{margin-left:var(--space-2)}
.siite-feed-post-text a{color:#1d4ed8;text-decoration:underline;word-break:break-all}
.siite-feed-video{max-width:340px;max-height:220px;border-radius:var(--r-sm);margin-top:var(--space-2);border:1px solid var(--line);background:#000}
.siite-feed-youtube{position:relative;display:inline-block;margin-top:var(--space-2);border-radius:var(--r-sm);overflow:hidden;border:1px solid var(--line);max-width:280px}
.siite-feed-youtube img{width:100%;display:block}
.siite-feed-play{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;font-size:34px;color:#fff;text-shadow:0 2px 10px rgba(0,0,0,.7);background:rgba(15,23,42,.18)}
.siite-feed-youtube:hover .siite-feed-play{background:rgba(15,23,42,.35)}
.siite-money-panel .siite-money-grid{display:grid;grid-template-columns:minmax(0,1.2fr) minmax(0,1fr);gap:var(--space-4)}
@media(max-width:1100px){.siite-money-panel .siite-money-grid{grid-template-columns:1fr}}
.siite-money-table-wrap{overflow-x:auto}
.siite-money-table{width:100%;border-collapse:collapse;font-size:var(--text-xs)}
.siite-money-table th{text-align:right;font-size:var(--text-xs);text-transform:uppercase;letter-spacing:.1em;color:var(--muted);padding:var(--space-2) var(--space-2);border-bottom:1px solid var(--line)}
.siite-money-table th:first-child{text-align:left}
.siite-money-table td{padding:var(--space-2) var(--space-2);text-align:right;border-bottom:1px solid var(--surface-sunken);font-variant-numeric:tabular-nums;white-space:nowrap}
.siite-money-table td:first-child{text-align:left;font-weight:600;color:var(--ink)}
.siite-money-table td.good{color:var(--good);font-weight:600}
.siite-money-table td.warn{color:var(--warn-ink);font-weight:600}
.siite-money-table td.bad{color:var(--bad);font-weight:700}
.siite-money-total td{border-top:2px solid #cbd5e1;font-weight:700;background:#f8fafc}
.siite-money-forecast h4{margin:0 0 var(--space-2);font-size: var(--text-sm)}
.siite-money-forecast-table{margin-top:var(--space-2)}
.siite-money-forecast small{display:block;margin-top:var(--space-2)}
.rfi-answer{background:#f0fdf4;border-left:3px solid var(--good);padding:6px 10px;border-radius:var(--r-xs);margin:6px 0;font-size: var(--text-sm)}
.handover-checklist{display:flex;flex-direction:column;gap:4px}
/* Audit LM-11 / LD22 (third pass): the handover checklist was native 13x13
   boxes in a 36px row. The box rule every checklist follows: 24px box, the
   whole 44px row is the label. */
.handover-item{display:flex;align-items:center;gap:10px;min-height:var(--control-md);padding:7px 10px;border:1px solid var(--line);border-radius:var(--r-sm);cursor:pointer;font-size: var(--text-sm)}
.handover-item > input[type=checkbox]{width:24px;height:24px;min-height:0;margin:0;flex:none;accent-color:var(--blue)}
.handover-item.done{background:#f0fdf4;border-color:#bbe7cc}
.handover-item.done>span{text-decoration:line-through;color:#4b5563}
.handover-item small{margin-left:auto;white-space:nowrap}
.scan-panel .scan-capture{margin-bottom:12px}
.scan-card h4{margin:4px 0 2px}
.scan-viewer-overlay{position:fixed;inset:0;z-index:2100;background:rgba(8,15,25,.92);display:flex;align-items:center;justify-content:center;padding:var(--space-5)}
.scan-viewer-sheet{width:min(1200px,96vw);height:min(760px,90vh);display:flex;flex-direction:column;background:#0b1622;border-radius:var(--r-md);overflow:hidden;box-shadow:0 18px 60px rgba(0,0,0,.55)}
.scan-viewer-bar{display:flex;align-items:center;gap:12px;padding:10px 14px;background:#102132;color:#fff;flex-wrap:wrap}
.scan-viewer-bar .muted{color:#9fb3c8}
.scan-viewer-hint{margin-left:auto;font-size:var(--text-xs);color:#7f97ad}
.scan-viewer-canvas{flex:1;width:100%;display:block;cursor:grab;touch-action:none;background:#0b1622}
.scan-viewer-canvas:active{cursor:grabbing}
.scan-viewer-loading{position:absolute;color:#cfe0ee;font-size: var(--text-sm)}
.scan-holds{margin:4px 0 14px;padding:var(--space-3);border:1px solid var(--line);border-radius:var(--r-md);background:#fbfdff}
.scan-holds .panel-title{margin-bottom:8px}
.scan-holds h4{margin:0;font-size:var(--text-base)}
.scan-hold{border-left:3px solid #cbd5e1}
.scan-hold.warn{border-left-color:var(--warn);background:#fffdf5}
.scan-hold.bad{border-left-color:var(--bad);background:#fff6f5}
.scan-hold.good{border-left-color:var(--good)}
.market-filters{display:flex;flex-wrap:wrap;gap:var(--space-2);margin:var(--space-2) 0 var(--space-3)}
.market-filters button{display:inline-flex;align-items:center;gap:var(--space-2);border:1px solid var(--line);background:#f8fafc;color:#1f3d5c;border-radius:var(--r-pill);padding:var(--space-1) var(--space-3);font-size:var(--text-xs);font-weight:600;cursor:pointer;white-space:nowrap;line-height:var(--leading-normal)}
.market-filter-icon{flex:0 0 auto;font-size:var(--text-base);line-height:var(--leading-none)}
.market-filters button:hover{background:#eef2ff;border-color:#c7d2fe}
.market-filters button.active{background:#1f3d5c;border-color:#1f3d5c;color:#fff;font-weight:600}
.market-compose{margin-bottom:var(--space-4);border:1px solid var(--line);border-radius:var(--r-md);padding:var(--space-2) var(--space-3);background:#fbfdff}
.market-compose summary{cursor:pointer;font-weight:600;font-size:var(--text-sm)}
.market-compose .form-grid{margin-top:10px}
.market-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(230px,1fr));gap:14px}
.market-card{border:1px solid var(--line);border-radius:var(--r-md);overflow:hidden;background:#fff;display:flex;flex-direction:column}
.market-card.sold{opacity:.62}
.market-photo{position:relative;height:150px;background:var(--surface-sunken);display:flex;align-items:center;justify-content:center;cursor:zoom-in;overflow:hidden}
.market-photo img{width:100%;height:100%;object-fit:cover;display:block}
.market-photo-fallback{font-size:40px;opacity:.5}
.market-status{position:absolute;top:8px;left:8px;background:#1f3d5c;color:#fff;font-size:var(--text-xs);font-weight:700;padding:3px 9px;border-radius:var(--r-pill)}
.market-body{padding:10px 12px;display:flex;flex-direction:column;gap:3px}
.market-price{font-size: var(--text-lg);color:var(--ink)}
.market-body h4{margin:0;font-size:var(--text-base)}
.market-body p{margin:2px 0;font-size:var(--text-xs);color:var(--muted)}
.market-actions{display:flex;flex-wrap:wrap;gap:8px;align-items:center;margin-top:6px}
.market-manage{display:flex;gap:8px;margin-left:auto;font-size: var(--text-xs)}
/* Pack 27 (found by the 768-1280 overflow check): the "my own property" box
   took the field's width:100% - a 648px-wide tick box that pushed its own
   sentence 34px off the screen. It is the shared 24px tick box (F4V-05). */
.market-declare{display:flex;flex-direction:row;align-items:center;gap:10px;min-height:var(--control-md);font-size:var(--text-xs);line-height:var(--leading-snug)}
.market-declare input[type=checkbox]{flex:0 0 24px;width:24px;height:24px;min-height:0;margin:0;accent-color:var(--blue)}
.market-declare > span{min-width:0}
.market-hold{display:block;margin-top:4px;color:#8a6100;background:var(--status-warning-surface);border-radius:var(--r-xs);padding:var(--space-1) var(--space-2);font-size:var(--text-xs)}
.market-review{display:flex;flex-direction:column;gap:2px;background:#fff7ed;border:1px solid #f0d9a8;border-radius:var(--r-sm);padding:10px 12px;margin-bottom:12px;font-size:var(--text-xs)}
.market-review span{color:#4b5563}
.payrun-panel .payrun-week{max-width:190px}
.payrun-table{width:100%;border-collapse:collapse;font-size:var(--text-xs);margin-top:8px}
.payrun-table th{text-align:right;font-size:var(--text-xs);text-transform:uppercase;letter-spacing:.1em;color:var(--muted);padding:6px 8px;border-bottom:1px solid var(--line);white-space:nowrap}
.payrun-table th:first-child,.payrun-table th:nth-child(6),.payrun-table th:last-child{text-align:left}
.payrun-table td{padding:6px 8px;text-align:right;border-bottom:1px solid var(--surface-sunken);font-variant-numeric:tabular-nums;white-space:nowrap}
.payrun-table td:first-child{text-align:left;font-weight:600;color:var(--ink)}
.payrun-table td:nth-child(6),.payrun-table td:last-child{text-align:left;white-space:normal}
.payrun-table tr.payrun-blocked td{background:#fff7f6}
.workforce-import-list{display:flex;flex-direction:column;gap:3px;max-height:420px;overflow-y:auto;margin:8px 0}
.workforce-import-row{display:flex;align-items:center;gap:10px;padding:6px 10px;border:1px solid var(--line);border-radius:var(--r-sm);cursor:pointer;font-size: var(--text-sm)}
.workforce-import-row:hover{background:#f8fafc}
.workforce-import-row.is-already{opacity:.55}
.workforce-import-name{font-weight:600;min-width:190px}
.workforce-import-row small{margin-left:auto;text-align:right;white-space:nowrap}
.workforce-import-stale{display:block;margin-top:4px;color:#8a6100;font-weight:600}
.diary-progress-panel .diary-progress-item p{font-style:italic;color:#334155;margin:4px 0}
.diary-progress-item h4{margin:4px 0 2px}
.risk-layout{display:grid;grid-template-columns:minmax(0,1.6fr) minmax(0,240px);gap:16px}
@media(max-width:1100px){.risk-layout{grid-template-columns:1fr}}
.risk-register{display:flex;flex-direction:column;gap:8px;max-height:460px;overflow-y:auto}
.risk-item{border-left:3px solid #cbd5e1}
.risk-item.warn{border-left-color:var(--warn)}
.risk-item.bad{border-left-color:var(--bad)}
.risk-item.good{border-left-color:var(--good)}
.risk-item h4{margin:4px 0 2px}
.risk-side{display:flex;flex-direction:column;gap:12px}
.risk-heat{border-collapse:collapse;width:100%;font-size:var(--text-xs);text-align:center}
.risk-heat th{color:var(--muted);font-weight:600;padding:2px}
.risk-heat td{border:1px solid var(--line);height:34px;background:#f8fafc;font-weight:700;color:#334155}
.risk-heat td.risk-cell.good{background:#eefaf2}
.risk-heat td.risk-cell.warn{background:#fff6e6}
.risk-heat td.risk-cell.bad{background:#fdeceb}
.risk-heat td.risk-cell.has{outline:2px solid #1f3d5c;outline-offset:-2px}
.cost-curve{display:flex;align-items:flex-end;gap:6px;height:170px;margin:10px 0 14px;overflow-x:auto;padding-bottom:4px}
.cost-bar{flex:0 0 46px;display:flex;flex-direction:column;justify-content:flex-end;align-items:center;height:100%;gap:3px}
.cost-bar>span{width:100%;background:linear-gradient(180deg,#3f7fb5,#245f8f);border-radius:var(--r-xs) var(--r-xs) 0 0;min-height:4px}
.cost-bar small{font-size:var(--text-xs);color:var(--muted)}
.cost-bar b{font-size:var(--text-xs);color:var(--ink)}
.lookahead-toggle{display:inline-flex;gap:4px}
.lookahead-toggle button{border:1px solid var(--line);background:#f8fafc;color:#1f3d5c;border-radius:var(--r-pill);padding:var(--space-1) var(--space-3);font-size: var(--text-xs);font-weight:600;cursor:pointer}
.lookahead-toggle button.active{background:#1f3d5c;border-color:#1f3d5c;color:#fff}
.lookahead-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(210px,1fr));gap:14px;margin-top:10px}
.lookahead-grid h4{margin:0 0 6px;font-size: var(--text-sm)}
.lookahead-list{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:5px}
.lookahead-list li{font-size:var(--text-xs);font-weight:600;color:var(--ink);border-left:2px solid #cbd5e1;padding-left:8px}
.lookahead-list li small{display:block;font-weight:400;color:var(--muted)}
.lookahead-blockers{background:#fff6f5;border:1px solid #f2c9c4;border-radius:var(--r-sm);padding:10px 12px;margin:8px 0;font-size:var(--text-xs)}
.lookahead-blockers ul{margin:6px 0 0;padding-left:18px}
.constraint-breach{border-left:3px solid var(--bad);background:#fff6f5}
.constraint-controls{margin-top:10px}
.activity-hub-facts{display:flex;flex-wrap:wrap;gap:12px;font-size:var(--text-xs);margin:0 0 8px}
.activity-hub-facts span strong{display:block;font-size:var(--text-xs);text-transform:uppercase;letter-spacing:.1em;color:var(--muted)}
.activity-hub-facts span.warn{color:#8a6100}
.activity-hub-facts span.bad{color:var(--bad)}
.activity-hub-links{margin-bottom:8px}
.activity-hub-links h5{margin:0 0 3px;font-size:var(--text-xs);text-transform:uppercase;letter-spacing:.1em;color:var(--muted)}
.activity-hub-links button,.activity-hub-links span{display:block;font-size:var(--text-xs);text-align:left;margin-bottom:2px}
/* #13 keep the activity name visible while scrolling the bars */
.gantt-row .gantt-label{position:sticky;left:0;background:var(--surface,#fff);z-index:2}
.gantt-group{display:flex;align-items:center;gap:8px;width:100%;text-align:left;background:var(--surface-sunken);border:1px solid var(--line);border-radius:var(--r-sm);padding:6px 10px;margin-top:6px;cursor:pointer;color:var(--ink)}
.gantt-group:hover{background:#e9eef4}
.gantt-group strong{font-size: var(--text-sm)}
.gantt-group small{margin-left:auto;color:var(--muted);font-size:var(--text-xs)}
.gantt-group-caret{width:12px;color:var(--muted)}
.valuation-table{width:100%;border-collapse:collapse;font-size: var(--text-sm);margin:6px 0}
.valuation-table td,.valuation-table th{padding:6px 8px;border-bottom:1px solid var(--surface-sunken);font-variant-numeric:tabular-nums}
.valuation-table td:nth-child(2),.valuation-table th:nth-child(2){text-align:right;font-weight:600;white-space:nowrap}
.valuation-table td.muted{color:var(--muted);font-size: var(--text-xs);font-weight:400}
.valuation-table tr.valuation-sub td{border-top:1px solid #cbd5e1;font-weight:700;background:#f8fafc}
.valuation-table tr.valuation-total td{border-top:2px solid #1f3d5c;font-weight:700;font-size:var(--text-base)}
.valuation-detail{margin:6px 0 10px;font-size:var(--text-xs)}
.valuation-detail summary{cursor:pointer;font-weight:600}
.nav-badge{margin-left:auto;background:var(--bad);color:#fff;font-size:var(--text-xs);font-weight:700;line-height:var(--leading-none);padding:var(--space-1) var(--space-2);border-radius:var(--r-pill);min-width:20px;text-align:center}
.briefing-panel .briefing-list{display:flex;flex-direction:column;gap:4px}
.briefing-item{display:flex;align-items:center;gap:var(--space-3);padding:var(--space-2) var(--space-2);border:1px solid var(--line);border-radius:var(--r-sm);font-size: var(--text-sm)}
.briefing-item.u1{border-left:3px solid var(--bad);background:#fff6f5}
.briefing-item.u2{border-left:3px solid var(--warn);background:#fffdf5}
.briefing-item.u3{border-left:3px solid #cbd5e1}
.briefing-kind{flex:0 0 108px;font-size:var(--text-xs);text-transform:uppercase;letter-spacing:.1em;color:var(--muted);font-weight:600}
.briefing-text{flex:1;font-weight:600;color:var(--ink)}
.briefing-text small{display:block;font-weight:400;color:var(--muted)}
.briefing-item button{flex:0 0 auto}
.briefing-item{padding:var(--space-2) var(--space-2);font-size:var(--text-xs)}
.briefing-kind{flex:0 0 96px}
.briefing-text{min-width:0;overflow-wrap:anywhere}
/* Audit P3V-10 (third pass): on a phone a three-column row left the text
   about 90px (one word per line, rows 150-190px tall) and pushed Open /
   Complete now off a 320 screen. The row stacks: kind and text share the
   first line, the press is a full-width button under them. */
@media(max-width:760px){
  .briefing-item{flex-wrap:wrap;align-items:flex-start;gap:var(--space-1) var(--space-2)}
  .briefing-kind{flex:0 0 auto}
  .briefing-text{flex:1 1 100%}
  body:not(.login-mode) .briefing-item > button{flex:1 1 100%;display:inline-flex;align-items:center;justify-content:center;min-height:var(--control-md);border:1px solid var(--line);border-radius:var(--r-sm);background:#fff;text-decoration:none}
}
.briefing-more{margin-top:6px;font-size:var(--text-xs)}
.briefing-watch{display:flex;flex-direction:column;gap:1px;margin-top:var(--space-2);padding:var(--space-2) var(--space-2);background:#f8fafc;border:1px solid var(--line);border-radius:var(--r-sm);font-size: var(--text-xs)}
.briefing-watch strong{font-size:var(--text-xs);text-transform:uppercase;letter-spacing:.1em;color:var(--muted)}
.briefing-watch span{color:var(--muted)}
.briefing-watch-head{display:flex;align-items:center;gap:var(--space-2);width:100%;background:none;border:0;padding:0;cursor:pointer;text-align:left;color:inherit}
.briefing-watch-head em{margin-left:auto;font-style:normal;color:var(--muted)}
.briefing-watch .briefing-list{margin-top:8px}
.briefing-list.scrolls{max-height:340px;overflow-y:auto;padding-right:4px}
.briefing-filters{display:flex;flex-wrap:wrap;gap:5px;margin:6px 0 8px}
.briefing-filters button{border:1px solid var(--line);background:#f8fafc;color:#1f3d5c;border-radius:var(--r-pill);padding:3px 10px;font-size:var(--text-xs);font-weight:600;cursor:pointer}
.briefing-filters button.active{background:#1f3d5c;border-color:#1f3d5c;color:#fff}
.recurring-list{max-height:400px;overflow-y:auto}
.recurring-item{border-left:3px solid #cbd5e1}
.recurring-item.warn{border-left-color:var(--warn);background:#fffdf5}
.recurring-item.bad{border-left-color:var(--bad);background:#fff6f5}
.recurring-item h4{margin:4px 0 2px}
.wf-pay-list{display:flex;flex-direction:column;gap:4px;max-height:420px;overflow-y:auto;margin:8px 0}
.wf-pay-row{display:grid;grid-template-columns:minmax(0,1fr) 120px 210px;gap:8px;align-items:center;padding:var(--space-1) var(--space-2);border:1px solid var(--line);border-radius:var(--r-sm)}
.wf-pay-name{font-weight:600;font-size: var(--text-sm);color:var(--ink);min-width:0;display:flex;flex-direction:column;gap:1px}
/* Where a proposed rate came from, so it can be judged rather than trusted. */
.wf-pay-source{font-weight:400;font-style:normal;font-size:var(--text-xs);color:var(--muted);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.wf-pay-row.has-proposal{border-left:3px solid var(--border-strong)}
.wf-pay-row.has-proposal.high{border-left-color:var(--good)}
.wf-pay-row.has-proposal.medium{border-left-color:var(--warn)}
.wf-pay-row input,.wf-pay-row select{font-size:var(--text-xs);padding:5px 8px;border:1px solid #cbd5e1;border-radius:var(--r-xs)}
@media(max-width:760px){.wf-pay-row{grid-template-columns:1fr}}

/* Next steps: verb-first pipeline rows — status, deal + action, buttons. */
.crm-next-list{display:flex;flex-direction:column;gap:var(--space-2);max-height:340px;overflow-y:auto;padding-right:var(--space-1)}
.crm-next-row{display:grid;grid-template-columns:auto minmax(0,1fr) auto;gap:var(--space-2);align-items:center;border:1px solid var(--line);border-radius:var(--r-sm);padding:var(--space-2) var(--space-2);background:white}
.crm-next-row .crm-next-body{min-width:0;line-height:var(--leading-snug);font-size: var(--text-sm)}
@media(max-width:760px){.crm-next-row{grid-template-columns:1fr}.crm-next-row .button-row{justify-content:flex-start}}

/* Learning loop: decision history aggregated into reasons and promote rates. */
.crm-learning-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:16px}
.crm-learning-grid h4{margin:0 0 6px;font-size: var(--text-sm)}
.crm-learning-row{display:flex;justify-content:space-between;gap:var(--space-2);padding:var(--space-1) 0;border-bottom:1px solid var(--line);font-size: var(--text-sm)}
.crm-learning-row:last-child{border-bottom:none}
.crm-learning-insights{margin-top:10px;padding:10px 12px;border:1px solid var(--line);border-radius:var(--r-sm);background:var(--panel-2,#f7f9fb)}
.crm-learning-insights p{margin:2px 0;font-size: var(--text-sm)}

/* Practice relationship view: applications, geography and JBP history. */
.architect-detail{border:1px solid var(--line);border-radius:var(--r-md);padding:14px 16px;margin-bottom:14px;background:var(--panel-2,#f7f9fb)}
.architect-detail-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));gap:16px;margin-top:8px}
.architect-detail-grid h4{margin:8px 0 4px;font-size: var(--text-sm)}

/* Photo timeline: dated evidence grid, newest first. */
.photo-timeline-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(120px,1fr));gap:10px;margin-bottom:14px}
.photo-timeline-grid a{display:flex;flex-direction:column;gap:4px;text-decoration:none;color:var(--ink)}
.photo-timeline-grid img{width:100%;height:96px;object-fit:cover;border-radius:var(--r-sm);border:1px solid var(--line)}
.photo-timeline-doc{display:grid;place-items:center;height:96px;border:1px solid var(--line);border-radius:var(--r-sm);background:var(--soft,#eef2f6);font-size: var(--text-xs);padding:6px;text-align:center}
.photo-timeline-grid small{color:var(--muted);font-size:var(--text-xs)}

/* Recruitment 430: the candidate list - a sortable table on a desk, compact
   cards on a phone - and the candidate page. Replaces the one-card deck. */
.recruit-panel .panel-title{align-items:flex-start}
.recruit-header-actions{flex-wrap:wrap;justify-content:flex-end}
.recruit-more{position:relative}
.recruit-more > summary{list-style:none;cursor:pointer}
.recruit-more > summary::-webkit-details-marker{display:none}
.recruit-more-menu{position:absolute;right:0;top:calc(100% + 6px);z-index:20;display:flex;flex-direction:column;align-items:stretch;gap:var(--space-2);min-width:240px;max-width:calc(100vw - 32px);padding:var(--space-2);background:var(--panel);border:1px solid var(--line);border-radius:var(--r-md);box-shadow:var(--shadow-card)}
.recruit-needs{display:flex;flex-wrap:wrap;gap:6px;align-items:center;margin:0 0 var(--space-3)}
.recruit-needs-label{font-size:var(--text-xs);font-weight:600;text-transform:uppercase;letter-spacing:.1em;color:var(--muted);margin-right:4px}
.recruit-status-chips{margin:0 0 var(--space-3)}
.recruit-filter-bar select{flex:0 1 170px;min-width:0}
.recruit-needed-toggle{display:inline-flex;align-items:center;gap:8px;min-height:var(--control-md);font-size:var(--text-sm);color:var(--ink)}
.recruit-needed-toggle input{flex:0 0 20px;width:20px;height:20px;margin:0}
.recruit-table .rc-status .pill,.recruit-table .rc-trade .pill{white-space:nowrap}
.recruit-table td a{color:var(--blue);text-decoration:none;font-weight:500}
.recruit-table td a:hover{text-decoration:underline}
.recruit-table .rc-name{min-width:130px}
body:not(.login-mode) .recruit-table .siite-data-table :is(td,th).rc-phone-card{display:none}
body:not(.login-mode) .recruit-table .siite-data-table th button.siite-sort{min-height:var(--control-md)}
@media (max-width:760px){
  body:not(.login-mode) .recruit-table .siite-data-table td.rc-phone-card{display:block;order:3;flex:1 1 100%}
  .rc-phone-actions{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:var(--space-2)}
  body:not(.login-mode) .rc-phone-actions > :is(a, button){min-height:var(--control-md);width:100%;min-width:0;padding-inline:6px}
  body:not(.login-mode) .recruit-table button.link-button{min-height:var(--control-md)}
}
/* Visual 455 (V1-27): the candidate table is the shared table now; only the name link keeps its look. */
body:not(.login-mode) .recruit-table button.link-button{min-height:var(--control-sm);padding:0;border:0;border-radius:0;background:transparent;box-shadow:none;text-align:left;color:var(--blue);font-size:var(--text-sm);font-weight:600}
.recruit-photo{width:96px;height:96px;object-fit:cover;border-radius:var(--r-md);border:1px solid var(--line);display:block}
.recruit-contact-actions{flex-wrap:wrap;gap:var(--space-2);margin:0 0 var(--space-4)}
.recruit-hire-note{margin:0 0 var(--space-4)}
.recruit-candidate-grid{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1.25fr);gap:var(--space-4);align-items:start}
.recruit-candidate-col{display:grid;gap:var(--space-4);min-width:0}
@media (max-width:1000px){.recruit-candidate-grid{grid-template-columns:minmax(0,1fr)}}
.recruit-details{display:grid;grid-template-columns:minmax(0,1fr);gap:0;margin:0}
.recruit-details > div{display:grid;grid-template-columns:150px minmax(0,1fr);gap:var(--space-3);padding:8px 0;border-bottom:1px solid var(--line)}
.recruit-details > div:last-child{border-bottom:0}
.recruit-details dt{font-size:var(--text-xs);font-weight:600;text-transform:uppercase;letter-spacing:.1em;color:var(--muted)}
.recruit-details dd{margin:0;color:var(--ink);overflow-wrap:anywhere}
.recruit-doc{display:inline-flex;flex-direction:column;gap:6px;margin:0 var(--space-3) var(--space-3) 0;max-width:180px;vertical-align:top}
.recruit-doc figcaption{font-size:var(--text-xs);color:var(--ink)}
.recruit-note{margin:0 0 var(--space-3);padding:var(--space-2) var(--space-3);border-left:3px solid var(--line);background:var(--bg);border-radius:0 var(--r-sm) var(--r-sm) 0}
.recruit-note p{margin:0 0 4px;white-space:pre-wrap;overflow-wrap:anywhere}
.recruit-note footer{font-size:var(--text-xs)}
.recruit-history{list-style:none;margin:0;padding:0}
.recruit-history li{display:grid;gap:2px;padding:8px 0;border-bottom:1px solid var(--line)}
.recruit-history li:last-child{border-bottom:0}
.recruit-history li span{font-size:var(--text-xs)}
.recruit-history li p{margin:2px 0 0;white-space:pre-wrap;overflow-wrap:anywhere}
@media (max-width:760px){
  .recruit-more-menu{position:static;margin-top:var(--space-2);min-width:0;box-shadow:none}
  .recruit-status-chips{flex-wrap:nowrap;overflow-x:auto;padding-bottom:4px;scrollbar-width:thin}
  .recruit-status-chips > *{flex:0 0 auto}
  .recruit-filter-bar select{flex:1 1 calc(50% - 9px)}
  .recruit-details > div{grid-template-columns:minmax(0,1fr);gap:2px}
  .recruit-contact-actions > *{flex:1 1 calc(50% - var(--space-2))}
}

/* Panel groups: heavy reference panels behind one calm header. */
.panel-group{margin-bottom:var(--space-4)}
.panel-group-header{display:flex;width:100%;justify-content:space-between;align-items:center;gap:var(--space-3);background:white;border:1px solid var(--line);border-radius:var(--radius);padding:var(--space-4) var(--space-4);color:var(--ink);box-shadow:var(--shadow);cursor:pointer;text-align:left;font-size: var(--text-base)}
.panel-group-header:hover{background:#f8fafc;filter:none}
.panel-group-header small{color:var(--muted);font-weight:600;display:block;margin-top:2px;font-size: var(--text-xs)}
.panel-group-chevron{color:var(--muted);font-size: var(--text-base);transition:transform var(--motion) var(--ease-out)}
.panel-group.collapsed .panel-group-chevron{transform:rotate(-90deg)}
.panel-group.collapsed .panel-group-body{display:none}
.panel-group-body{margin-top:var(--space-4)}
.crm-queue-more{display:flex;align-items:center;gap:var(--space-3);flex-wrap:wrap;margin-top:var(--space-4)}

/* Windowed registers: the WHOLE list stays, it just scrolls in its own box
   instead of running for pages. Browser find still reaches rows inside. */
.capped-block{position:relative}
.capped-block > *:first-child{max-height:620px;overflow-y:auto;overflow-x:auto;border:1px solid var(--line);border-radius:var(--r-sm);background:white}
.capped-block.open > *:first-child{max-height:none;overflow:visible;border:0;border-radius:0}
.capped-block-control{display:block;margin:10px auto 0;font-size: var(--text-sm)}


/* Lead-card density: the queue is a triage list, so cards must be scannable
   several to a screen. Nothing is removed - the framing is just tighter. */
.crm-lead-card .state-row{padding:9px 11px;gap:2px}
.crm-lead-card .state-row strong{font-size: var(--text-xs)}
.crm-lead-card .state-row span{font-size:var(--text-xs);line-height:var(--leading-snug)}
.crm-lead-card .crm-lead-description{font-size: var(--text-sm);margin-top:2px}
.crm-lead-card .crm-lead-reasons{margin-top:8px;font-size:var(--text-xs)}
.crm-lead-queue{display:flex;flex-direction:column;gap:var(--space-2)}


/* Dashboard rows: container-responsive, no breakpoints.
   These rows sit inside the two-column dashboard grid, so the row can be 517px
   wide while the VIEWPORT is 1440px - the width media queries never fired and
   five fixed columns (638px of content) overflowed, clipping the RAG pill and
   the net figure mid-word. Seven competing grid-template-columns rules had also
   accumulated on .exception-row; the last collapsed the project-name column to
   0px and printed the name on top of the description. Flex wrap cures both:
   items reflow onto a second line when the CONTAINER is tight, whatever the
   screen is doing. */
.portfolio-row,.exception-row{display:flex;flex-wrap:wrap;align-items:center;gap:var(--space-2) var(--space-3)}
.portfolio-row > *,.exception-row > *{min-width:0}
.portfolio-project-title{flex:1 1 190px}
.portfolio-stage,.portfolio-net{flex:0 0 auto}
.portfolio-net{margin-left:auto;text-align:right}
.exception-row > span:first-of-type{flex:0 0 82px}
.exception-row > strong{flex:0 0 auto;overflow-wrap:anywhere}
.exception-row > small{flex:1 1 250px;overflow-wrap:anywhere}
/* The row is a button - make that legible without adding chrome. */
.portfolio-row:hover,.exception-row:hover{border-color:var(--blue)}


/* Architect register: scrolls in place so 6,337 practices never sprawl. */
.architect-table-scroll{max-height:520px;overflow-y:auto}
.architect-table-scroll thead th{position:sticky;top:0;background:white;z-index:2;box-shadow:0 1px 0 var(--line)}
.architect-toolbar{display:flex;align-items:center;gap:10px;flex-wrap:wrap}
.architect-toolbar input{flex:1 1 220px}


/* Cutouts read as holes punched in the parent area, not as new areas. */
.saved-measurement-cutout{fill:rgba(179,38,30,.16);stroke:var(--bad);stroke-width:1.5;stroke-dasharray:5 3;pointer-events:none}

/* Drawing register previews. A thumbnail in the row means you can find the
   sheet you want without opening three wrong ones first. Hover lifts it to a
   readable size so the title block is legible in place. */
.drawing-register-actions summary{cursor:pointer;min-height:var(--control-md);display:flex;align-items:center;padding:8px;font-weight:600;color:var(--blue)}
.drawing-register-actions[open]{flex-basis:100%}
@media(max-width:760px){
.drawing-register-table,.drawing-register-table tbody{display:block;width:100%;min-width:0}
.drawing-register-table thead{display:none}
.drawing-register-table tbody tr{display:grid;grid-template-columns:1fr 1fr;border:1px solid var(--line);border-radius:var(--r-md);margin:12px 0;padding:10px;background:white}
.drawing-register-table tbody td{display:block;width:auto!important;border:0;min-width:0;overflow-wrap:anywhere;padding:6px}
.drawing-register-table tbody td::before{content:attr(data-label);display:block;font-size:var(--text-xs);color:var(--muted);margin-bottom:4px}
.drawing-register-table tbody td:first-child,.drawing-register-table tbody td:nth-child(3),.drawing-register-table tbody td:last-child{grid-column:1/-1}
.drawing-register-table tbody td:first-child::before,.drawing-register-table tbody td:last-child::before{display:none}
.drawing-register-table .button-row>button{min-height:48px;flex:1}
.drawing-register-table .drawing-thumb{max-width:100%}
}
.drawing-register-table td:first-child{width:250px;padding:10px;vertical-align:top}
.drawing-thumb{display:block;width:230px;min-height:150px;border:1px solid var(--line,#dbe4ec);border-radius:var(--r-xs);background:#fff;overflow:hidden;position:relative}
.drawing-thumb[data-drawing-view]{cursor:pointer}
.drawing-thumb[data-drawing-view]:focus-visible{outline:2px solid var(--focus-colour);outline-offset:2px}
.drawing-thumb img{display:block;width:100%;height:auto;transition:transform var(--motion) var(--ease-out)}
.drawing-thumb.loading{background:repeating-linear-gradient(135deg,#f2f5f8,#f2f5f8 6px,#e8edf2 6px,#e8edf2 12px)}
/* Audit LD21 (third pass): #7a8898 measured 3.43:1; --muted passes. */
.drawing-thumb.unavailable{display:flex;align-items:center;justify-content:center;font-size:var(--text-xs);color:var(--muted);text-align:center;padding:var(--space-1);background:#f7f9fb}
.drawing-thumb:not(.unavailable):not(.loading):hover{position:relative;z-index:40}
.drawing-thumb:not(.unavailable):not(.loading):hover img{position:absolute;top:0;left:0;width:640px;max-width:none;height:auto;box-shadow:0 12px 40px rgba(20,32,46,.35);border:1px solid var(--line,#dbe4ec);border-radius:var(--r-xs);background:#fff}
@media(max-width:760px){
  .drawing-register-table td:first-child{width:110px}
  .drawing-thumb{width:96px;min-height:64px}
  .drawing-thumb:not(.unavailable):not(.loading):hover img{width:280px}
}

/* Documents filed as folders, not one endless list. The mount is a real
   <table>, so folders are tbody groups and rows — nothing else is legal
   inside a table, and anything else gets hoisted out by the parser. */
.document-tree-table{width:100%;border-collapse:collapse}
.document-tree-table thead th{text-align:left;font-size: var(--text-sm);font-weight:600;color:var(--muted,#5b6b7c);padding:6px 4px 12px;border:0}
.document-tree-table .folder-row{cursor:pointer}
.document-tree-table .folder-row:hover > td{background:rgba(36,95,143,.06)}
.document-tree-table .folder-row:focus-visible > td{outline:2px solid var(--blue,#245f8f);outline-offset:-2px}
.document-tree-table .project-row > td{background:#fff;border-top:1px solid var(--line,#dbe4ec);padding:12px 10px;font-size: var(--text-base)}
.document-tree-table .category-row > td{background:#fbfcfd;padding:9px 10px 9px 26px;font-size:var(--text-base);color:var(--muted)}
.document-tree-table .file-row{display:none}
.document-tree-table .file-row.open{display:table-row}
.document-tree-table .file-row > td{padding:8px 10px 8px 40px;font-size: var(--text-sm);border-top:1px solid #eef2f6}
.document-tree-table .category-row,.document-tree-table .file-row{display:none}
.document-tree-table .project-folder.open .category-row{display:table-row}
.document-tree-table .project-folder.open .file-row.open{display:table-row}
.folder-caret{display:inline-block;width:0;height:0;margin-right:9px;vertical-align:middle;border-left:6px solid currentColor;border-top:4px solid transparent;border-bottom:4px solid transparent;opacity:.55;transition:transform var(--motion) var(--ease-out)}
.project-folder.open > .project-row .folder-caret,.category-row.open .folder-caret{transform:rotate(90deg)}
.folder-code,.folder-count,.folder-date{font-size: var(--text-xs);color:var(--muted,#5b6b7c);font-weight:600}
.folder-count{display:inline-block;background:rgba(36,95,143,.10);border-radius:var(--r-pill);padding:2px 9px;white-space:nowrap}
@media(max-width:760px){.document-tree-table .folder-date{display:none}}
.drawing-thumb.retryable{cursor:pointer}
.drawing-thumb.retryable:hover{background:#eef3f8;color:#245f8f}
.file-kind-icon{display:inline-block;margin-right:7px;font-size:var(--text-base);line-height:var(--leading-none);vertical-align:-1px}

/* The diary is 49 fields and nearly seven phone screens tall, with Submit
   5.6 screens down. Someone standing in the rain scrolls, gives up, and stops
   filing diaries — which starves the programme, the delay evidence and the
   valuations. Keep the button on screen. */
@media(max-width:760px){
  /* Sticky is no use here: the button starts five screens below the fold, so
     it only "sticks" once you have already scrolled to it. Fixed to the
     bottom means it is there from the moment the page opens. */
  body:not(.login-mode) #addDiary{
    position:fixed;
    left:12px;
    right:12px;
    bottom:12px;
    width:auto;
    z-index:30;
    padding:var(--space-4);
    font-size:var(--text-base);
    font-weight:700;
    box-shadow:0 8px 28px rgba(20,32,46,.28);
  }
  /* So the last field is never trapped under the bar. */
  body:not(.login-mode) #diaryForm,
  body:not(.login-mode) #diary .panel:last-of-type{padding-bottom:84px}
}

/* Messages ran 1,302px off the side of a phone: the channel strip is a row of
   fixed-width cards, and without min-width:0 a flex/grid child is sized by its
   content, so that row pushed the sidebar, the workspace and the whole page
   open. The result cut the "who can see this channel" line off mid-word —
   exactly the line you need before speaking in front of a client. */
@media(max-width:760px){
  body:not(.login-mode) .messages-page,
  body:not(.login-mode) .messages-workspace,
  body:not(.login-mode) .message-sidebar,
  body:not(.login-mode) .message-conversation,
  body:not(.login-mode) .messages-page-heading{min-width:0;max-width:100%}
  body:not(.login-mode) .message-sidebar-scroll{min-width:0;width:100%;max-width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}
  body:not(.login-mode) .message-sidebar-filter{min-width:0;max-width:100%}
  body:not(.login-mode) .message-sidebar-filter input{width:100%;min-width:0}
}

/* Front doors. Time Clock opened on geofence settings, HSEQ on an admin form,
   Maintenance on director KPIs — so the one thing a site manager came to do was
   below the fold on all three. This is that action, first, and big enough to
   hit with a thumb in gloves. */
.page-front-door{margin:0 0 16px}
.front-door-action{
  display:flex;flex-direction:column;align-items:flex-start;gap:var(--space-1);
  width:100%;padding:var(--space-4) var(--space-5);text-align:left;
  font-size:var(--text-lg);font-weight:700;border-radius:var(--r-md);
}
.front-door-action span{font-size: var(--text-sm);font-weight:500;opacity:.85}
@media(max-width:760px){
  /* Director tiles are still useful, just not the first thing on a phone. */
  body:not(.login-mode) #maintenance{display:flex;flex-direction:column}
  body:not(.login-mode) #maintenanceFrontDoor{order:-1}
  body:not(.login-mode) #maintenanceCards{order:2}
  body:not(.login-mode) #maintenanceWorkspace{order:1}
  .front-door-action{padding:var(--space-5);font-size:var(--text-lg)}
}
.front-door-action.front-door-urgent{
  background:var(--bad,var(--bad));
  border-color:var(--bad,var(--bad));
  color:#fff;
}
.front-door-action.front-door-urgent span{opacity:.92}
.front-door-action.front-door-urgent:hover{filter:brightness(1.06)}

/* ——— Readable on a phone, on site ———
   Siite is read one-handed, outdoors, often by someone who does not want to
   pinch-zoom to find out when a delivery lands. Two problems, both mobile:

   1. iOS Safari ZOOMS THE WHOLE PAGE whenever a focused input is under 16px.
      Inputs here take font:inherit, so they were 14px and every tap on a field
      made the page jump and left it zoomed. 16px is the exact threshold - this
      is a fix, not a preference, and it is why the value is not 15px.
   2. 12px secondary text is where the real reading happens: due dates, owners,
      project codes under a task. That is the smallest type in the app and the
      most consequential.

   Scoped to mobile deliberately. The desktop scale is dense on purpose and the
   tables assume it; widening type there risks reflow for no benefit to the
   person this is aimed at. */
/* Audit LM-05: this said 16px in its comment but used var(--text-base), which
   was 15px - so every field still zoomed. It is a literal 16px now, and it
   covers any touch screen (a tablet wider than 760px zooms the same way) and
   the sign-in page. */
@media(max-width:760px), (pointer:coarse) {
  /* Must mirror the body:not(.login-mode) prefix used elsewhere in this file:
     that :not() carries class-level specificity, so a bare `input` selector
     loses to it no matter how late it appears. */
  body:not(.login-mode) input,
  body:not(.login-mode) select,
  body:not(.login-mode) textarea,
  .login-mode input, .login-mode select, .login-mode textarea { font-size: 16px; }
}
@media(max-width:760px) {
  small, .muted, .task small, .panel-title span { font-size: var(--text-sm); }
  .pill, .due-pill, .badge { font-size: var(--text-xs); }
}

/* Queued writes waiting on a human decision. Deliberately loud: a record that
   is only on one device, because production moved underneath it, is not a
   detail — it is work someone believes is saved and is not. */
.queued-conflict-panel { border-left: 4px solid var(--warn, var(--warn)); }
.queued-conflict-panel li { display: flex; flex-direction: column; gap: 6px; }
.queued-conflict-panel .button-row { margin-top: 4px; }

/* ——— Grouped notifications ———
   The drawer used to be a flat list where one late order appeared five times.
   Groups are quiet by default and open themselves only when something in them
   genuinely needs attention, so the urgent case can never hide behind a
   disclosure triangle. */
.notification-lede { margin: 0 0 10px; padding: 10px 14px; background: #fff6ed; border-radius:var(--r-sm); font-size: var(--text-sm); color: #6b4413; }
.notification-lede strong { font-size: var(--text-base); }
.notification-group { border: 1px solid var(--line); border-radius:var(--r-md); margin-bottom: 10px; overflow: hidden; background: #fff; }
.notification-group.urgent { border-color: #f1c9a8; }
.notification-group-head {
  display: flex; align-items: center; justify-content: space-between; gap: 12px;
  width: 100%; padding: 12px 14px; border: 0; background: transparent;
  text-align: left; cursor: pointer; color: var(--ink);
}
.notification-group-head:hover { background: #f7fafc; }
.notification-group-head strong { display: block; font-size: var(--text-base); }
.notification-group-head small { display: block; color: var(--muted); font-size: var(--text-xs); margin-top: 2px; }
.notification-group-meta { display: flex; align-items: center; gap: 8px; flex-shrink: 0; }
.notification-group-chevron { color: var(--muted); font-size: var(--text-xs); }
.notification-group-body { padding: 0 10px 10px; display: flex; flex-direction: column; gap: 8px; }
.notification-group-body .notification-drawer-item { border: 1px solid #eef2f7; border-radius:var(--r-sm); padding: 10px; }

/* ——— Siite design tokens: layer 2 ———
   NEW NAMES ONLY, appended at the end. Nothing above is redefined and nothing
   is moved, so no existing rule can shift — this file already has seven
   competing :root blocks and 17 tokens with conflicting values, and untangling
   that needs a real CSS parser, not a line scanner. (A line-based attempt on
   7 Aug deleted live rules because one :root block is written on a single
   line; see the render/token notes.)

   These are the vocabulary the shared components get built against, so the
   suite stops reaching for one of 612 loose hex values. */


@media (prefers-reduced-motion: reduce) {
  :root{ --transition-fast:0ms; --transition-base:0ms; --transition-slow:0ms; }
}

/* Grouped notification detail: critical packages and group-level actions.
   Uses the status tokens so severity means the same thing here as everywhere. */
.notification-group-critical { padding: 0 14px 10px; }
.notification-group-critical > span { display:block; font-size: var(--text-xs); font-weight: 600; text-transform: uppercase; letter-spacing: .1em; color: var(--status-critical); margin-bottom: 4px; }
.notification-group-critical ul { margin: 0; padding-left: 16px; font-size: var(--text-sm); color: var(--ink); }
.notification-group-critical li { margin-bottom: 2px; }
.notification-group-critical small { display:block; margin-top: 6px; font-size: var(--text-xs); color: var(--warn-ink); }
.notification-group-actions { display: flex; flex-wrap: wrap; gap: var(--space-2); padding: 0 14px 12px; }
.notification-lede small { display:block; margin-top: 4px; font-size: var(--text-xs); color: var(--muted); font-weight: var(--weight-normal); }
.notification-count.urgent-count { background: var(--status-critical); }

/* ——— Siite shell components ———
   Every value here comes from the token layer. No new hex, no !important:
   these are new class names, so they never need to out-shout anything. */

/* Data status chip — plain English first, internals behind a link. */
.siite-chip {
  display: inline-flex; align-items: center; gap: var(--space-2);
  padding: var(--space-2) var(--space-3); border-radius:var(--r-pill);
  font-size: var(--text-sm); font-weight: var(--weight-medium);
  background: var(--status-neutral-surface); color: var(--status-neutral);
}
.siite-chip.compact { padding: var(--space-1) var(--space-2); font-size: var(--text-xs); }
.siite-chip-dot { width: 8px; height: 8px; border-radius:var(--r-pill); background: currentColor; flex-shrink: 0; }
.siite-chip-ok { background: var(--status-ok-surface); color: var(--status-ok); }
.siite-chip-warning { background: var(--status-warning-surface); color: var(--warn-ink); }
.siite-chip-critical { background: var(--status-critical-surface); color: var(--status-critical); }
.siite-chip-detail {
  border: 0; background: transparent; padding: 0 0 0 var(--space-2);
  color: inherit; font: inherit; text-decoration: underline; cursor: pointer;
  min-height: auto;
}

/* Page header */
.siite-page-header {
  /* Visual 456: minmax(0,1fr) so a long tab row scrolls inside its strip instead of widening the header past a phone screen. */
  /* Job header 489: the title column keeps at least 40% of the row whatever the
     chips beside it hold (they wrap or shorten inside their column); before,
     the chips' column took its full width and the title went to ~0. */
  display: grid; grid-template-columns: minmax(min(40%, 100%), 1fr) minmax(0, auto); gap: var(--space-3) var(--space-4);
  align-items: start; margin-bottom: var(--space-5);
}
.siite-page-header-text h2 { font-size: var(--text-2xl); letter-spacing: -.02em; line-height: var(--leading-tight); }
.siite-page-header-text p { margin: var(--space-1) 0 0; color: var(--muted); font-size: var(--text-sm); max-width: 62ch; }
.siite-page-header-meta { display: flex; align-items: center; gap: var(--space-2); flex-wrap: wrap; justify-content: flex-end; }
/* Calm 469 (R2B-18): the page shifted 0.06-0.10 on load because this chip
   changed from "Reconnecting to live records… View technical details" (two
   lines on a phone) to "Up to date" (one). The chip now keeps one line - the
   words shorten with an ellipsis, the full sentence is in its tooltip - and
   the row's height is reserved, so its arrival or change never moves the page. */
.siite-page-header-meta { min-height: 32px; }
.siite-page-header-meta > [data-siite-data-status] { max-width: 100%; min-width: 0; white-space: nowrap; overflow: hidden; display: inline-flex; }
.siite-page-header-meta > [data-siite-data-status] > .siite-chip-label { min-width: 0; overflow: hidden; text-overflow: ellipsis; }
.siite-page-header-meta > [data-siite-data-status] > .siite-chip-detail { flex: 0 0 auto; min-height: 0; border: 0; background: transparent; box-shadow: none; padding: 0 0 0 var(--space-2); }
.siite-page-header-actions { grid-column: 1 / -1; display: flex; gap: var(--space-2); flex-wrap: wrap; }

/* Status strip */
.siite-status-strip {
  /* Visual 453 (V3-09): auto-fit, at most four to a row (a fifth starts the
     next row), two to a row on a phone (below). */
  display: grid; grid-template-columns: repeat(auto-fit, minmax(max(150px, calc((100% - 3 * var(--space-3)) / 4)), 1fr));
  gap: var(--space-3); margin-bottom: var(--space-5);
}
/* Audit LD10: .siite-metric is drawn by the PROTOTYPE STAT-TILE RECIPE (tile,
   3px top bar, caps label, large light number). Its own off-recipe tile rules
   (left-edge bars, 24px numbers, .08em labels) are deleted. */
.siite-metric-critical .siite-metric-value { color: var(--status-critical); }

/* Section card */
.siite-section {
  background: var(--surface-raised); border: var(--border-width) solid var(--border-subtle);
  border-radius: var(--radius-lg); box-shadow: var(--elevation-1);
  margin-bottom: var(--space-5); overflow: hidden;
}
.siite-section-head {
  display: flex; justify-content: space-between; align-items: flex-start; gap: var(--space-4);
  padding: var(--space-4) var(--space-5); border-bottom: var(--border-width) solid var(--border-subtle);
}
.siite-section-head h3 { font-size: var(--text-lg); letter-spacing: -.01em; }
.siite-section-head span { display: block; color: var(--muted); font-size: var(--text-sm); margin-top: 2px; }
.siite-section-actions { display: flex; gap: var(--space-2); flex-shrink: 0; flex-wrap: wrap; }
.siite-section-body { padding: var(--space-5); }
.siite-section-critical { border-left: 3px solid var(--status-critical); }

/* Action queue */
.siite-action-queue { display: flex; flex-direction: column; gap: var(--space-2); }
.siite-action {
  display: flex; justify-content: space-between; align-items: center; gap: var(--space-4);
  padding: var(--space-3) var(--space-4); border-radius: var(--radius-md);
  background: var(--surface-sunken); border-left: 3px solid var(--status-neutral);
}
.siite-action-critical { background: var(--status-critical-surface); border-left-color: var(--status-critical); }
.siite-action-warning { background: var(--status-warning-surface); border-left-color: var(--status-warning); }
.siite-action-ok { background: var(--status-ok-surface); border-left-color: var(--status-ok); }
.siite-action-text strong { display: block; font-size: var(--text-base); }
.siite-action-text span { display: block; font-size: var(--text-sm); color: var(--muted); margin-top: 2px; }
.siite-action-text small { display: block; font-size: var(--text-xs); color: var(--muted); margin-top: 2px; }
.siite-action-actions { display: flex; gap: var(--space-2); flex-shrink: 0; }
.siite-action-more { margin: var(--space-2) 0 0; font-size: var(--text-sm); color: var(--muted); }

/* Detail drawer */
/* Calm 469 (R2B-01): the host sits on the drawer layer of the one z scale,
   ABOVE the sticky header and the phone tab bar; its scrim dims both. The
   drawer's own header never scrolls away, so Close is always on screen. */
.siite-drawer-host { position: fixed; inset: 0; z-index: var(--z-drawer); }
.siite-drawer-scrim { position: absolute; inset: 0; background: var(--surface-scrim); z-index: 0; animation: siiteScrimIn var(--motion-sheet) var(--ease-out); }
.siite-drawer {
  position: absolute; top: 0; right: 0; bottom: 0; width: min(560px, 100%);
  z-index: 1;
  background: var(--surface-raised); box-shadow: var(--elevation-4);
  display: flex; flex-direction: column;
  animation: siiteDrawerIn var(--motion-sheet) var(--ease-out);
}
.siite-drawer > header { flex: 0 0 auto; }
.siite-drawer > header > button[aria-label="Close"] { min-height: var(--control-sm); min-width: var(--control-sm); flex: 0 0 auto; }
@keyframes siiteDrawerIn { from { transform: translateX(24px); opacity: .6; } to { transform: none; opacity: 1; } }
@keyframes siiteScrimIn { from { opacity: 0; } to { opacity: 1; } }
/* Calm 469 (Apple feel #20): closing eases out over the same 180ms instead
   of vanishing. The closing host has already given up its id, so anything
   looking for an open drawer sees none. */
.siite-drawer-host.is-closing { pointer-events: none; }
.siite-drawer-host.is-closing .siite-drawer { animation: siiteDrawerOut var(--motion-sheet) var(--ease-in-out) forwards; }
.siite-drawer-host.is-closing .siite-drawer-scrim { animation: siiteScrimOut var(--motion-sheet) var(--ease-in-out) forwards; }
@keyframes siiteDrawerOut { from { transform: none; opacity: 1; } to { transform: translateX(24px); opacity: 0; } }
@keyframes siiteScrimOut { from { opacity: 1; } to { opacity: 0; } }
@media (prefers-reduced-motion: reduce) {
  .siite-drawer, .siite-drawer-scrim, .siite-drawer-host.is-closing .siite-drawer, .siite-drawer-host.is-closing .siite-drawer-scrim { animation: none; }
}
.siite-drawer header {
  display: flex; justify-content: space-between; align-items: flex-start; gap: var(--space-4);
  padding: var(--space-5); border-bottom: var(--border-width) solid var(--border-subtle);
}
.siite-drawer header h3 { font-size: var(--text-lg); }
.siite-drawer header span { display: block; color: var(--muted); font-size: var(--text-sm); margin-top: 2px; }
.siite-drawer-body { flex: 1; overflow-y: auto; padding: var(--space-5); }
.siite-drawer footer {
  display: flex; gap: var(--space-2); padding: var(--space-4) var(--space-5);
  border-top: var(--border-width) solid var(--border-subtle); background: var(--surface-sunken);
}

/* On a phone the drawer is a bottom sheet: a 560px side panel is unusable at
   375px, and a thumb reaches the bottom of the screen far more easily. */
@media(max-width:760px) {
  .siite-page-header { grid-template-columns: minmax(0,1fr); }
  .siite-page-header-meta { justify-content: flex-start; }
  .siite-drawer {
    top: auto; left: 0; width: 100%; max-height: 88vh;
    border-radius: var(--radius-lg) var(--radius-lg) 0 0;
    animation: siiteSheetIn var(--motion-sheet) var(--ease-out);
  }
  @keyframes siiteSheetIn { from { transform: translateY(28px); opacity: .6; } to { transform: none; opacity: 1; } }
  .siite-drawer-host.is-closing .siite-drawer { animation: siiteSheetOut var(--motion-sheet) var(--ease-in-out) forwards; }
  @keyframes siiteSheetOut { from { transform: none; opacity: 1; } to { transform: translateY(28px); opacity: 0; } }
  .siite-action { flex-direction: column; align-items: stretch; }
  .siite-action-actions { justify-content: flex-start; }
}

/* ——— Grouped navigation: collapsible sections ———
   The sidebar carries thirty routes. Folding sections is how the list gets
   shorter without taking routes away from anybody.

   These selectors carry `body:not(.login-mode) .sidebar` deliberately. The
   stylesheet has five separate .nav-group rule sets and the winning one is
   written at that specificity, so anything shorter silently loses — the same
   trap that swallowed the mobile input sizing. Match the specificity rather
   than reaching for !important. */
.nav-section{display:flex;flex-direction:column;gap:2px}
.nav-section + .nav-section{margin-top:var(--space-3)}
body:not(.login-mode) .sidebar nav .nav-group{display:flex;align-items:center;gap:var(--space-2);
  width:auto;margin:0 10px;padding:var(--space-2) 0;
  border:0;border-top:1px solid rgba(255,255,255,.08);border-radius:0;
  background:transparent;color:var(--sand);opacity:.82;
  font-size:var(--text-xs);font-weight:600;letter-spacing:.12em;text-transform:uppercase;
  text-align:left;cursor:pointer;box-shadow:none;min-height:var(--control-md);height:44px;line-height:var(--leading-none);
  transition:opacity var(--motion) var(--ease-out)}
body:not(.login-mode) .sidebar .nav-section:first-child .nav-group{border-top:0;padding-top:0}
body:not(.login-mode) .sidebar nav .nav-group:hover,
body:not(.login-mode) .sidebar nav .nav-group:focus-visible{opacity:1;background:transparent;transform:none}
body:not(.login-mode) .sidebar .nav-group-label{flex:1 1 auto;min-width:0}
body:not(.login-mode) .sidebar .nav-group-chevron{flex:0 0 auto;width:8px;height:8px;
  border-right:2px solid currentColor;border-bottom:2px solid currentColor;
  transform:rotate(45deg);margin-bottom:3px;transition:transform var(--motion) var(--ease-out)}
body:not(.login-mode) .sidebar .nav-section-collapsed .nav-group-chevron{transform:rotate(-45deg);margin-bottom:0;margin-top:3px}
/* A folded section still shows what is waiting inside it. Folding must never
   be able to hide a number somebody has to act on. */
body:not(.login-mode) .sidebar .nav-group-count{flex:0 0 auto;background:var(--bad);color:#fff;
  font-size:var(--text-xs);line-height:var(--leading-none);min-width:18px;height:18px;border-radius:var(--r-pill);
  display:inline-flex;align-items:center;justify-content:center;font-weight:700;
  padding:0 5px;letter-spacing:0}
body:not(.login-mode) .sidebar .nav-group-count.hidden{display:none}
.nav-section-items{display:flex;flex-direction:column;gap:2px;overflow:hidden}
.nav-section-collapsed .nav-section-items{display:none}
/* nav's own flex gap would add a second gap on top of the section spacing. */
body:not(.login-mode) .sidebar nav{gap:0}

/* Density: the rail was set for a shorter list than it now carries. */
body:not(.login-mode) .sidebar nav .nav{min-height:var(--control-sm)}

/* The upgraded page headers keep the eyebrow the hand-written blocks carried.
   Losing it would drop a real piece of orientation from eleven pages. */
.siite-page-header .eyebrow{margin:0 0 2px}

/* ——— Top bar ———
   A page that renders its own header already says what it is. Repeating the
   title in a 112px bar above it is the same duplication the Data Health intro
   banner had, only on every route that adopts the shell. The bar stands down
   for those pages and keeps its title everywhere else. */
/* Audit LD16: the page's own header is the title. :has() follows pages that
   paint late (Email, after its status check), which the render-time class
   missed, so the title showed twice. The Dashboard's role header
   (.dashboard-command) is that page's own header too. */
body:is(.page-has-own-header, :has(section.view.active :is(.siite-page-header, .dashboard-command))) .topbar{min-height:0}
body:is(.page-has-own-header, :has(section.view.active :is(.siite-page-header, .dashboard-command))) .topbar-left > div:not(.topbar-brand){display:none}

/* Search is how you reach anything quickly, so it should look like a search
   box rather than a magnifying glass hidden among seven other buttons. */
#topbarSearch{display:inline-flex;align-items:center;gap:var(--space-2);min-width:180px;
  justify-content:flex-start;text-align:left}
#topbarSearch .topbar-search-label{flex:1 1 auto;opacity:.72;font-weight:500}
#topbarSearch .topbar-search-hint{flex:0 0 auto;font-size:var(--text-xs);font-weight:600;opacity:.6;
  border:1px solid currentColor;border-radius:var(--radius-sm);padding:1px var(--space-1);letter-spacing:.02em}
@media(max-width:1100px){
  #topbarSearch{min-width:0}
  #topbarSearch .topbar-search-label,#topbarSearch .topbar-search-hint{display:none}
  /* A section header is a control, and on a phone it has to be thumb-sized.
     32px reads fine on a desktop pointer and is under the 44px touch minimum. */
  body:not(.login-mode) .sidebar nav .nav-group{height:44px}
}

/* ——— Elevation: three levels, not seven ———
   --shadow-xs/soft/card/md/lift/board were six different answers to "is this
   raised?", so two cards side by side could sit at different heights for no
   reason anyone chose. Three levels: resting, raised, overlay. The old names
   remain as aliases so nothing that already uses them breaks — they simply
   stop being independent values. */
/* (The tokens themselves now live in the single :root block at the top of
   this file - Audit LD29.) */

/* ——— Zeros step back ———
   A zero is usually good news, but drawn at the weight of a real figure a page
   of zeros reads as loudly as a page of problems. It stays visible — hiding it
   would remove the reassurance — and stops competing. */
.siite-metric-quiet .siite-metric-value{color:var(--muted);font-weight:600}
.siite-metric.siite-metric-quiet:before{background:var(--line)}

/* ——— Empty states ———
   One shape everywhere, so nothing empty ever looks broken. */
.siite-empty{display:flex;flex-direction:column;align-items:flex-start;gap:var(--space-2);
  padding:var(--space-5) var(--space-4);border:1px dashed var(--line);
  border-radius:var(--r-md);background:transparent;text-align:left}
.siite-empty strong{font-size:var(--text-base);font-weight:600}
.siite-empty p{margin:0;color:var(--muted);max-width:52ch}
.siite-empty button{margin-top:var(--space-1)}
/* Audit LD36: a failure reads as a failure (pale red, solid edge), with the raw
   technical text folded away. */
.siite-empty-error{border:1px solid #efcfcf;border-left:4px solid var(--bad);background:var(--status-critical-surface)}
.siite-empty-details{width:100%;margin-top:var(--space-1);font-size:var(--text-xs);color:var(--muted)}
.siite-empty-details summary{cursor:pointer;min-height:var(--control-md);display:flex;align-items:center;font-weight:600}
.siite-empty-details code{display:block;white-space:pre-wrap;overflow-wrap:anywhere;padding:var(--space-2);background:var(--panel);border:1px solid var(--line);border-radius:var(--r-xs)}
.siite-loading{padding:var(--space-4);border:1px dashed var(--line);border-radius:var(--r-md)}
.siite-loading p{margin:0}
/* Audit P3V-26: a toast's technical text folds under the plain sentence. */
.toast-details{flex-basis:100%;font-size:var(--text-xs);opacity:.85}
.toast-details summary{cursor:pointer;min-height:var(--control-md);display:flex;align-items:center;font-weight:600}
.toast-details code{display:block;white-space:pre-wrap;overflow-wrap:anywhere;max-height:8em;overflow:auto}
/* Audit P3V-21: "Related records" - one row of links to the records joined to
   this one. Chips are links (44px targets), wrap on a phone, never scroll. */
/* Every layout property is set here: the global nav{flex-direction:column} would otherwise stack and centre the chips (pass-3 Pattern 1). */
.related-records{display:flex;flex-direction:row;flex-wrap:wrap;align-items:center;justify-content:flex-start;text-align:left;gap:var(--space-2);margin:var(--space-2) 0;padding:0;min-width:0;width:auto;background:none;border:0;position:static}
.related-records-label{font-size:var(--text-xs);font-weight:600;text-transform:uppercase;letter-spacing:.1em;color:var(--muted)}
.record-chip{display:inline-flex;align-items:center;min-height:var(--control-md);max-width:100%;padding:0 var(--space-3);border:1px solid var(--line);border-radius:var(--r-pill);background:var(--panel);color:var(--blue-2);font-size:var(--text-sm);font-weight:600;text-decoration:none;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.record-chip:hover,.record-chip:focus-visible{border-color:var(--blue-2);text-decoration:underline}
/* Audit LD22 (pass 4): the record links Pack 23 added were 31px (Commercial
   deadlines) and 17px (hub feed titles) tall - a press target, not running
   text, so they get the small control height. */
.deadline-link,.feed-record-link{display:inline-flex;align-items:center;min-height:var(--control-sm);color:var(--blue-2);font-weight:600;text-decoration:none}
.deadline-link:hover,.feed-record-link:hover{text-decoration:underline}
button.deadline-link{background:none;border:0;box-shadow:none;padding:0;min-height:var(--control-md);text-align:left;color:var(--blue-2)}
/* Audit P3V-19: the record a link opened is outlined for a moment. */
.record-focus{outline:3px solid var(--blue-2);outline-offset:3px;border-radius:var(--r-sm);animation:record-focus-fade 4s var(--ease-out) forwards}
@keyframes record-focus-fade{0%,70%{outline-color:var(--blue-2)}100%{outline-color:transparent}}
@media (prefers-reduced-motion:reduce){.record-focus{animation:none}}
/* The older card helper renders most tiles in Siite, so the zero rule has to
   live here too or the change is invisible where it matters most. */
.kpi-card.kpi-quiet .value{color:var(--muted);font-weight:600}
.kpi-card.kpi-quiet{border-top-color:var(--line)}

/* Contact details are content, not navigation. Blue underlined mailto links are
   the most webby thing on any page and read as a directory listing rather than
   a product. */
.panel a[href^="mailto:"],.panel a[href^="tel:"]{color:inherit;text-decoration:none;
  border-bottom:1px solid var(--line);padding-bottom:1px}
.panel a[href^="mailto:"]:hover,.panel a[href^="tel:"]:hover{border-bottom-color:currentColor}

/* ——— Button hierarchy: one loud action, not two hundred ———
   The base rule made a filled navy button the DEFAULT, so every button that
   was not explicitly marked .secondary shouted. Purchase Orders rendered 433
   buttons, 203 of them filled; Workforce 254 with 159 filled. When everything
   is emphasised nothing is, and the page reads as a wall of controls rather
   than a screen with a purpose.

   Three tiers now, and emphasis is opt-in:
     .primary   — the one action this view exists for. Filled.
     (default)  — available and obvious, but quiet. Bordered.
     .secondary — supporting. Ghost, no border until you reach for it.
   .danger stays filled: destructive actions must never be quiet.

   Written at body:not(.login-mode) because that is the specificity the
   existing button rules are written at; anything shorter loses silently. */
body:not(.login-mode) button{
  background:#fff;
  color:var(--ink);
  border:1px solid var(--line);
  box-shadow:none;
}
body:not(.login-mode) button:hover{
  border-color:var(--blue-2);
  filter:none;
}
/* Visual 453 (Jim, 22 Oct): the one call-to-action is the website's button
   rust, not navy. --blue stays for tabs, chips and charts. */
body:not(.login-mode) button.primary{
  background:var(--cta);
  border-color:var(--cta);
  color:var(--cta-ink);
  box-shadow:var(--elev-1);
}
body:not(.login-mode) button.primary:hover{background:var(--cta-hover);border-color:var(--cta-hover);filter:none}
/* Ghost went too far: with no border at all, "Rate a worker" and "Copy apply
   link" sat in a toolbar reading as text rather than something you press. A
   supporting action should be quieter than the default, not invisible — so it
   keeps a faint edge. Three tiers by weight of fill, all still obviously
   controls. */
body:not(.login-mode) button.secondary{
  background:transparent;
  border-color:var(--line);
  color:var(--blue);
  box-shadow:none;
}
body:not(.login-mode) button.secondary:hover{
  background:var(--soft);
  border-color:transparent;
}
/* Visual 453: rust and the delete red are 1.07:1 apart, so a filled red
   button next to the call-to-action read as a second CTA. A full-size .danger
   is OUTLINED red (white, red edge and text) and fills on hover or focus,
   like .danger.mini. Only a dialog's final destructive confirm stays filled
   (.danger-confirm, set by openDialog), and it carries a warning icon. */
body:not(.login-mode) button.danger{
  background:#fff;
  border:1.5px solid var(--bad);
  color:var(--bad);
}
body:not(.login-mode) button.danger:hover,
body:not(.login-mode) button.danger:focus-visible{
  background:var(--bad);
  border-color:var(--bad);
  color:#fff;
}
body:not(.login-mode) button.danger.danger-confirm{
  background:var(--bad);
  border-color:var(--bad);
  color:#fff;
}
/* Audit F4V-08 / F4O-13 (pass 4): the outlined destructive button (PO
   Reject, Withdraw request, Delete task, Delete saved view, CRM Delete
   permanently) was written as button.danger-outline (0,1,1) and lost to
   body:not(.login-mode) button.secondary above, so it rendered as a harmless
   navy secondary. It is written at the house specificity, after .secondary,
   and its hover keeps the red text. */
body:not(.login-mode) button.danger-outline,
body:not(.login-mode) button.danger-outline:hover{
  color:var(--bad);
  border-color:#e9bcbc;
  background:#fff;
}
body:not(.login-mode) button.danger-outline:hover{background:var(--bad-bg)}
/* Audit LD07: a link that is dressed as a button follows the same tiers. The
   tiers above target <button> only, so a.secondary / a.button-link rendered
   as bare underlined text. :where() keeps this at the tier's own weight, so a
   component that styles its own link-buttons (.dv-more-menu, person cards)
   still wins. */
body:not(.login-mode) a:where(.secondary,.button,.button-link,.button-like,.primary){
  display:inline-flex;
  align-items:center;
  justify-content:center;
  gap:var(--space-2);
  min-height:var(--control-md);
  padding:var(--space-2) var(--space-3);
  border:1px solid var(--line);
  border-radius:var(--r-sm);
  background:#fff;
  color:var(--ink);
  font-size:var(--text-xs);
  font-weight:600;
  text-decoration:none;
  box-shadow:none;
}
body:not(.login-mode) a:where(.secondary){background:transparent;color:var(--blue)}
body:not(.login-mode) a:where(.primary){background:var(--cta);border-color:var(--cta);color:var(--cta-ink)}
body:not(.login-mode) a:where(.primary):hover{background:var(--cta-hover);border-color:var(--cta-hover)}
body:not(.login-mode) a:where(.secondary,.button,.button-link,.button-like):hover{border-color:var(--blue-2);background:var(--soft)}
/* The top bar sits on navy, so its buttons invert rather than following the
   page tiers. */
body:not(.login-mode) .topbar button{
  background:#fff;
  color:var(--blue);
  border-color:rgba(255,255,255,.34);
}
body:not(.login-mode) .topbar button.secondary{
  background:#fff;
  color:var(--blue);
  border-color:rgba(255,255,255,.34);
}

/* A row-level destructive action is not the page's headline. Workforce rendered
   FORTY filled red buttons, one per row — destructive emphasis applied forty
   times is just a red wall, and the eye stops reading it as a warning at all.
   Outlined keeps it unmistakably destructive (colour still carries the meaning)
   while letting the row be the context. It fills on hover and focus, at the
   moment you are actually about to use it. Full-size .danger buttons — the ones
   that end a workflow — stay filled. */
body:not(.login-mode) button.danger.mini{
  background:transparent;
  color:var(--bad);
  border-color:var(--bad);
}
body:not(.login-mode) button.danger.mini:hover,
body:not(.login-mode) button.danger.mini:focus-visible{
  background:var(--bad);
  color:#fff;
}

/* ——— Motion ———
   Twenty-five transitions ran at five near-identical durations (.12/.14/.15/
   .16/.18s) on the browser's default easing. Nobody chose that; it accumulated.
   Two durations and two easings now, so movement across the app has one
   character rather than five accidental ones.

   --ease-out decelerates hard: things arrive quickly and settle, which reads as
   responsive rather than floaty. Motion is for state CHANGES a person caused —
   never for content re-appearing, because Siite re-renders whole panels via
   innerHTML and an entrance animation there would replay on every data refresh
   and look broken. */
/* (Motion tokens live in the single :root block at the top - Audit LD29.) */

/* The toast is the app's main feedback — a save, a sync, a refusal — and it
   appeared instantly, which is why saving never felt confirmed. It arrives from
   where it lives (bottom right) and settles. */
@keyframes siiteToastIn{
  from{opacity:0;transform:translate3d(0,12px,0) scale(.98)}
  to{opacity:1;transform:none}
}
.toast{animation:siiteToastIn var(--motion-slow) var(--ease-out) both}

/* A folded section should look folded, not vanish. The 0fr→1fr trick animates
   height without hard-coding one, but it needs the collapsing box to be a
   SINGLE grid child — applied to .nav-section-items directly it defined one
   explicit row while the other six buttons dropped into auto-sized implicit
   rows, so nothing moved. The grid goes on the section instead: header stays
   auto, the items track animates. */
body:not(.login-mode) .sidebar .nav-section{
  display:grid;
  grid-template-rows:auto 1fr;
  transition:grid-template-rows var(--motion) var(--ease-in-out);
}
body:not(.login-mode) .sidebar .nav-section-collapsed{grid-template-rows:auto 0fr}
body:not(.login-mode) .sidebar .nav-section-items{min-height:0;overflow:hidden}
body:not(.login-mode) .sidebar .nav-section-collapsed .nav-section-items{display:flex}

/* Pressing something should feel like pressing it. */
body:not(.login-mode) button{transition:background var(--motion) var(--ease-out),border-color var(--motion) var(--ease-out),transform 90ms var(--ease-out),box-shadow var(--motion) var(--ease-out)}
body:not(.login-mode) button:active{transform:scale(.98)}
.client-photo-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:12px}
.client-photo-grid a{display:grid;gap:7px;color:inherit;text-decoration:none}
.client-photo-grid img{display:block;width:100%;aspect-ratio:4/3;object-fit:cover;border-radius:var(--radius-md);background:#e8e6df}
.client-photo-grid span{font-size:var(--text-sm);font-weight:700}

/* Premium interaction finish: quiet, tactile and consistent across every
   module. These rules intentionally live at the end of the cascade so older
   route-specific styles cannot bring back conflicting control behaviour. */
body{
  font-family:-apple-system,BlinkMacSystemFont,"SF Pro Text",Inter,"Segoe UI",sans-serif;
  -webkit-font-smoothing:antialiased;
  text-rendering:optimizeLegibility;
}
body:not(.login-mode) .topbar{
  background:rgba(255,255,255,.88)!important;
  -webkit-backdrop-filter:saturate(180%) blur(20px);
  backdrop-filter:saturate(180%) blur(20px);
}
body:not(.login-mode) button,
body:not(.login-mode) .button-like,
body:not(.login-mode) .button-link{
  -webkit-tap-highlight-color:transparent;
  touch-action:manipulation;
}
body:not(.login-mode) button:disabled,
body:not(.login-mode) [aria-disabled="true"]{
  opacity:.48;
  cursor:not-allowed;
  filter:none;
  transform:none!important;
  box-shadow:none;
}
body:not(.login-mode) input:hover,
body:not(.login-mode) select:hover,
body:not(.login-mode) textarea:hover{border-color:var(--border-strong)}
body:not(.login-mode) input:focus,
body:not(.login-mode) select:focus,
body:not(.login-mode) textarea:focus{
  outline:0;
  border-color:var(--blue-2);
  box-shadow:0 0 0 4px rgba(36,95,143,.13),var(--shadow-xs);
}
.client-view-page{max-width:1200px;margin:0 auto}
.client-view-hero{padding:var(--space-6)}
.client-view-hero h2{font-size:var(--text-3xl);letter-spacing:-.035em;margin:var(--space-1) 0 var(--space-1)}
.client-view-page .programme-command-metrics>span{border-radius:var(--radius-md);box-shadow:inset 0 0 0 1px rgba(16,42,68,.04)}

@media(max-width:760px){
  /* The page title is repeated immediately below the utility bar. Keeping it
     here squeezed six controls into the same row and left a clipped word under
     the logo. The mobile bar is now one calm, single-height utility strip. */
  body:not(.login-mode) .topbar{
    min-height:68px!important;
    height:68px;
    padding:var(--space-2) var(--space-4)!important;
    gap:var(--space-2);
  }
  body:not(.login-mode) .topbar-left{
    flex:0 0 42px;
    width:42px;
    min-width:42px;
    overflow:visible;
  }
  body:not(.login-mode) .topbar-left>div:not(.topbar-brand){display:none!important}
  body:not(.login-mode) .topbar .topbar-brand{
    display:flex!important;
    min-width:42px;
    width:42px;
    justify-content:flex-start;
  }
  body:not(.login-mode) .topbar-brand>div:last-child{display:none!important}
  body:not(.login-mode) .topbar .actions{gap:var(--space-2);min-width:0}
  body:not(.login-mode) #topbarSearch,
  body:not(.login-mode) .topbar .notification-button,
  body:not(.login-mode) .topbar .context-ai-button,
  body:not(.login-mode) .topbar .menu-toggle{width:44px;min-width:44px;height:44px;min-height:var(--control-md)}
  /* Visual 453 (V3-01, V2-15): on a phone the header clock is a 44px gold
     icon button; its state is spoken from aria-label, and the printed word is
     kept for screen readers only. */
  body:not(.login-mode) #topbarClockIn{min-width:44px;width:44px;height:44px;padding-inline:0;justify-content:center}
  body:not(.login-mode) #topbarClockIn #topbarClockInLabel{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap}
  .client-view-hero{padding:var(--space-4)}
  .client-view-page>.button-row{display:grid;grid-template-columns:1fr}
  .client-view-page>.button-row>*{width:100%}
  body:not(.login-mode) #addDiary{bottom:max(12px,env(safe-area-inset-bottom))}
}
/* Audit LM-16: on a 320px phone (or Display Zoom) the header ran 36px past the
   edge and took the menu button with it, and the menu must always work. The
   clock button keeps its icon and its spoken label (aria-label is set from
   the clock state); only the printed word goes. The header itself is the
   container, so this keys off the room the header has rather than adding a
   page breakpoint. */
body:not(.login-mode) .topbar{container:siite-topbar / inline-size}
@container siite-topbar (max-width:360px){
  body:not(.login-mode) #topbarClockIn{min-width:44px;width:44px;padding-inline:0;justify-content:center}
  body:not(.login-mode) #topbarClockIn #topbarClockInLabel{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap}
}

/* A day on site is a heading and the work under it. */
.site-day{margin-top:var(--space-4)}
.site-day h4{font-size:var(--text-sm);text-transform:uppercase;letter-spacing:.1em;color:var(--muted);margin-bottom:var(--space-2)}
.site-day .clean-list li{display:flex;flex-direction:column;gap:var(--space-1)}

/* Two live issues of one sheet is the failure a drawing register exists to
   prevent, so this reads as a warning rather than a note. */
body:not(.login-mode) [data-duplicate-sheets] { display: grid; gap: var(--space-3, 12px); }
body:not(.login-mode) [data-duplicate-sheets] .duplicate-sheet-row {
  border-left: 3px solid var(--warning, var(--warn));
  padding-left: var(--space-3, 12px);
}
body:not(.login-mode) [data-duplicate-sheets] .duplicate-sheet-title { font-weight: 600; }
body:not(.login-mode) [data-duplicate-sheets] ul { margin: 4px 0 0; padding-left: 18px; }
body:not(.login-mode) [data-duplicate-sheets] li { line-height: var(--leading-normal); }

/* Superseded drawings are the record of what was issued, so they stay
   reachable — but a manager opening the register wants the set they build
   from, and a mixed list is how somebody works off a replaced sheet. */
body:not(.login-mode) .superseded-folder {
  margin-top: var(--space-4, 16px);
  border-top: 1px solid var(--border, rgba(0,0,0,.12));
  padding-top: var(--space-3, 12px);
}
body:not(.login-mode) .superseded-folder > summary {
  cursor: pointer;
  padding: var(--space-2, 8px) 0;
  color: var(--text-muted, #5b6472);
  font-size: var(--text-base);
}
body:not(.login-mode) .superseded-folder > summary:focus-visible {
  outline: 2px solid var(--focus, #2f6feb);
  outline-offset: 2px;
}
body:not(.login-mode) .superseded-folder[open] > summary { margin-bottom: var(--space-2, 8px); }
/* Muted, but never so faint it reads as disabled — these are real records. */
body:not(.login-mode) .superseded-folder .superseded-row { opacity: .78; }

/* A bill is read down its sections, so the section and subtotal rows have to
   carry weight the item rows do not. Taken from the layout of JBP's own bills. */
body:not(.login-mode) .boq-table .boq-section-row td {
  background: var(--surface-2, rgba(0,0,0,.04));
  padding-top: var(--space-3, 12px);
  letter-spacing: .04em;
}
body:not(.login-mode) .boq-table .boq-subtotal-row td {
  border-top: 1px solid var(--border, rgba(0,0,0,.14));
  background: var(--surface-1, rgba(0,0,0,.02));
}
/* Provisional and PC sums are not measured work and must not read as if they were. */
body:not(.login-mode) .boq-table .boq-sum-row td { font-style: italic; }
body:not(.login-mode) .boq-summary { max-width: 520px; margin-left: auto; }
body:not(.login-mode) .boq-summary td:last-child { text-align: right; font-variant-numeric: tabular-nums; }
body:not(.login-mode) .boq-summary .boq-contract-sum td {
  border-top: 2px solid var(--border-strong, rgba(0,0,0,.3));
  font-size: var(--text-lg);
}
body:not(.login-mode) .boq-table td:nth-child(n+4) { font-variant-numeric: tabular-nums; text-align: right; }
body:not(.login-mode) .boq-table th:nth-child(n+4) { text-align: right; }

/* An incomplete bill has to look wrong before anybody reads the total. */
body:not(.login-mode) .boq-completeness { border-left: 4px solid var(--bad, #8a2b2b); }
body:not(.login-mode) .boq-completeness ul { margin: 8px 0 0; padding-left: 20px; }
body:not(.login-mode) .boq-completeness li { line-height: var(--leading-normal); margin-bottom: 6px; }

/* "What is happening" - the director outlook. Three bands: where each job is,
   what starts week by week, and what nobody has arranged. Kept to one column of
   text so it reads as a briefing rather than a dashboard of tiles. */
.outlook-jobs { display: flex; flex-direction: column; gap: var(--space-2); margin-top: var(--space-4); }
.outlook-job {
  display: grid;
  grid-template-columns: minmax(96px, auto) 1fr minmax(0, auto);
  gap: 12px;
  align-items: center;
  width: 100%;
  text-align: left;
  padding: 10px 12px;
  background: var(--surface, #fff);
  border: 1px solid var(--border, #e3e6ea);
  border-radius: var(--r-xs);
  cursor: pointer;
}
.outlook-job:hover { border-color: var(--accent, #1f6feb); }
.outlook-job-title { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
.outlook-job-title small, .outlook-job-people { color: var(--muted, #6b7280); }
.outlook-job-people { text-align: right; white-space: nowrap; }

.outlook-weeks { display: flex; flex-direction: column; gap: var(--space-2); margin-top: var(--space-4); }
.outlook-week { border-left: 3px solid var(--border, #e3e6ea); padding-left: 12px; }
.outlook-week-head { display: flex; align-items: baseline; gap: 10px; }
.outlook-week-head small { color: var(--muted, #6b7280); }
.outlook-week ul { list-style: none; margin: 6px 0 0; padding: 0; display: flex; flex-direction: column; gap: 3px; }
.outlook-week li {
  display: grid;
  grid-template-columns: 58px 1fr minmax(0, 160px);
  gap: 10px;
  align-items: baseline;
  /* Was 0.92em — the 12.88px rounding artifact the UX audit measured (D-09). */
  font-size: var(--text-sm);
}
.outlook-when { color: var(--muted, #6b7280); font-variant-numeric: tabular-nums; }
.outlook-who { color: var(--muted, #6b7280); text-align: right; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }

/* Visual 455: the rolled-up gaps lead the outlook, so they sit above it. */
.outlook-gaps { margin: 0 0 var(--space-4); display: grid; gap: var(--space-2); }
.outlook-underway { margin: 6px 0 0; font-size: var(--text-sm); }
.outlook-gaps ul { margin: 6px 0 0; padding-left: 18px; display: flex; flex-direction: column; gap: 3px; }

@media(max-width:760px) {
  .outlook-job { grid-template-columns: 1fr; gap: 4px; }
  .outlook-job-people { text-align: left; }
  .outlook-week li { grid-template-columns: 52px 1fr; }
  .outlook-who { grid-column: 2; text-align: left; }
}

/* A disabled button that looks pressable IS a button for nothing: you press it,
   nothing happens, and Siite looks broken. Nothing in the app styled the
   disabled state, so every guarded action - approve a pay run with no shifts in
   it, export an empty file - rendered exactly like a live one. Two rails in the
   drawing tool styled their own; everywhere else was left looking live. */
button:disabled,
button[disabled],
.button-like[aria-disabled="true"] {
  opacity: .45;
  cursor: not-allowed;
  filter: grayscale(.4);
  box-shadow: none;
}
button:disabled:hover,
button[disabled]:hover {
  transform: none;
  filter: grayscale(.4);
}

/* Evidence attached to a register item. A photo taken on site is the evidence;
   it should be visible as itself, not as a pasted link to somewhere else. */
.evidence-file-list { display: flex; flex-direction: column; gap: 6px; margin: 10px 0; }
.evidence-file {
  display: flex; align-items: center; gap: 10px;
  padding: 8px 10px;
  border: 1px solid var(--border, #e3e6ea);
  border-radius: var(--r-xs);
  text-decoration: none;
  color: inherit;
}
.evidence-file:hover { border-color: var(--accent, #1f6feb); }
.evidence-file small { margin-left: auto; color: var(--muted, #6b7280); font-variant-numeric: tabular-nums; }

/* A week with 28 activities on it showed six and hid the rest behind a line of
   text - on the week two jobs start. The long weeks scroll in place instead of
   pushing everything below them off the page. */
.outlook-week-scroll {
  max-height: 260px;
  overflow-y: auto;
  padding-right: 6px;
}

/* Client decision register: quantities, product links and internal pricing
   options. An option is OURS - it is tinted and labelled so nobody mistakes it
   for something the client has seen. */
.client-decision-table .decision-quantity input { width: 88px; }
.client-decision-table .decision-quantity small { margin-left: 6px; color: var(--muted, #6b7280); }
.client-decision-table input[type="url"] { width: 100%; margin-top: 4px; font-size: var(--text-xs); }
/* Reports 409: the item cell stacks its controls - each label on its own line,
   no select wider than the cell (the allowance list pushed the table sideways). */
.client-decision-table td label { display: flex; flex-direction: column; gap: 4px; margin-top: 8px; font-size: var(--text-xs); line-height: var(--leading-tight); min-width: 0; }
.client-decision-table td label:has(> input[type="checkbox"]) { flex-direction: row; align-items: flex-start; gap: 8px; }
.client-decision-table td label select, .client-decision-table td label input:not([type="checkbox"]) { width: 100%; max-width: 280px; min-width: 0; }
.client-decision-table td small.decision-contract { display: block; margin-top: 6px; color: var(--muted, #6b7280); }
.client-decision-table td small.pill { display: inline-block; margin-top: 6px; white-space: normal; }
.decision-option-row { background: #f4f7fa; }
.decision-option-row td { border-top: none; }


/* On a phone, two of the four actions on Today sat off the right edge of a
   strip that scrolls sideways with no scrollbar and no fade — so "Raise action"
   and "Labour attendance" were reachable only by a swipe nobody would think to
   try. On site, an action you cannot see is an action that does not exist.
   Below the width where all four fit, they wrap and every one is visible. */
@media(max-width:760px) {
  .today-action-strip {
    flex-wrap: wrap;
    overflow-x: visible;
  }
  .today-action-strip button {
    flex: 1 1 auto;
    justify-content: center;
    min-height:var(--control-md);
  }
}

/* Where a money field on a form is NOT the number anyone sees, the form has to
   say so. Dukes Lane read £172,822.41 on its card and 0 in the edit box, and
   nothing explained that the card comes from the commercial workbook's CVR row
   while the box is a fallback used only when there is no such row. */
.commercial-source-note {
  margin: 4px 0 0;
  padding: 10px 12px;
  border-left: 3px solid var(--warn, var(--warn));
  background: rgba(217, 131, 36, .07);
  border-radius: 0 5px 5px 0;
  line-height: var(--leading-snug);
}

/* A quote's documents sit with the number, not in a separate register: the
   argument nine months from now is about the price AND what it included. */
.quote-files { display: flex; flex-wrap: wrap; gap: var(--space-1, 4px) var(--space-2, 8px); }
.quote-files a { font-size: var(--text-xs); word-break: break-word; }
.quote-file-add { display: inline-flex; align-items: center; gap: var(--space-1, 4px); margin-top: var(--space-1, 4px); }
.quote-file-add input[type="file"] { max-width: 9rem; font-size: var(--text-xs); }

/* Several applications on one site: the popup lists them, newest first. */
.crm-map-application { padding: var(--space-2, 8px) 0; border-top: 1px solid var(--border-subtle, rgba(0,0,0,.08)); }
.crm-map-application:first-of-type { border-top: 0; }

/* A release is ready but must not interrupt work in progress. */
.siite-update-ready {
  /* L-01 (1 Sep usability audit): bottom-centre sat ON TOP of the message
     composer. A corner card blocks nothing. */
  position: fixed; right: var(--space-4, 16px); left: auto; bottom: calc(var(--space-4, 16px) + env(safe-area-inset-bottom, 0px));
  z-index: 9000; display: flex; align-items: center; gap: var(--space-3, var(--space-3));
  max-width: min(94vw, 26rem); padding: var(--space-3, var(--space-3)) var(--space-4, var(--space-4));
  border: 1px solid var(--border-subtle, rgba(0,0,0,.12)); border-radius: var(--radius-md);
  background: var(--surface-raised, #fff); box-shadow: var(--elevation-3, 0 10px 30px rgba(9,20,38,.18));
  font-size: var(--text-sm);
}
.siite-update-ready span { flex: 1 1 auto; }
.siite-update-ready button { flex: 0 0 auto; }
@media(max-width:760px) { .siite-update-ready { flex-wrap: wrap; } .siite-update-ready span { flex-basis: 100%; } }

/* What a price was quoted against. The revision is the argument, not the title. */
.quote-issued-drawings { margin-bottom: var(--space-1, 4px); }
.quote-issued-drawings a { font-size: var(--text-xs); }

/* A quote document, who attached it, and a way to take a wrong one off. */
.quote-file { display: flex; align-items: baseline; gap: var(--space-2, 8px); flex-wrap: wrap; }
.quote-file + .quote-file { margin-top: var(--space-1, 4px); }
.link-button { background: none; border: 0; padding: 0; font-size: var(--text-xs); text-decoration: underline; cursor: pointer; }
.link-button.danger { color: var(--danger, var(--bad)); }

/* Finding one firm in three thousand is a search problem, not a scrolling one. */
.subbie-search { min-width: 16rem; flex: 1 1 14rem; }

/* The subbie map — same footprint rules as the CRM map, on the directory page. */
.subbie-map-block { margin-bottom: 10px; }
.subbie-map-canvas { height: 420px; border-radius: var(--r-xs); border: 1px solid var(--border-color, #d8dde5); }

/* The week ahead on site — big, plain, day by day. */
.site-week-board .site-week-day { display: flex; gap: var(--space-4); padding: var(--space-2) 0; border-top: 1px solid var(--line, #e1e9f2); }
.site-week-board .site-week-day.today { background: #f7fafc; margin: 0 calc(var(--space-2) * -1); padding: var(--space-2) var(--space-2); border-radius: var(--r-xs); }
.site-week-date { min-width: 132px; font-size: var(--text-sm); color: var(--muted, #617386); padding-top: 3px; }
.site-week-day.today .site-week-date { color: var(--blue, #123b63); }
.site-week-entries { display: flex; flex-direction: column; gap: 8px; flex: 1; }
.site-week-entry { display: flex; gap: var(--space-2); align-items: flex-start; }
.site-week-entry .pill { flex: 0 0 auto; min-width: 86px; justify-content: center; }
.site-week-entry-body b { font-size: var(--text-base); }
.site-week-entry-body small { display: block; color: var(--muted, #617386); margin-top: 1px; }
@media(max-width:760px) { .site-week-board .site-week-day { flex-direction: column; gap: var(--space-2); } .site-week-date { min-width: 0; } }

/* How the drawings were read — the measure-twice reconciliation. */
.boq-reconciliation { border: 1px solid var(--line, #e1e9f2); border-radius: var(--r-xs); padding: 14px; margin: 12px 0; display: flex; flex-direction: column; gap: 8px; background: #f8fafc; }



/* Print: a daily report (or any open form) prints as the document alone -
   the shell, navigation and action buttons stay on screen. Browsers'
   print-to-PDF makes every report a PDF with no extra machinery. */
@media print {
  .sidebar, .topbar, .sticky-submit, .toast-host, .toast, nav, .menu-toggle,
  .front-door-action, .page-front-door, button { display: none !important; }
  body, .main-content, .view, .panel { margin: 0 !important; box-shadow: none !important; }
  .panel { border: none !important; }
}

/* Essentials-first daily report: optional sections fold away behind a plain
   summary line, so the form reads as the handful of things that matter. */
.daily-optional-section { border: 1px solid var(--border, #d8dee6); border-radius: var(--r-xs); margin: 10px 0; background: var(--panel, #fff); }
.daily-optional-section > summary { cursor: pointer; padding: 12px 14px; display: flex; flex-direction: column; gap: 2px; list-style: none; }
.daily-optional-section > summary::-webkit-details-marker { display: none; }
.daily-optional-section > summary::before { content: '▸ '; float: left; }
.daily-optional-section[open] > summary::before { content: '▾ '; }
.daily-optional-section > summary small { color: var(--muted-ink, #5b6675); }
.daily-optional-section > .schema-section { border: none; margin: 0; }

/* A field user's navigation: essentials first, everything else one tap away.
   The disclosure reads as a nav item rather than a control bolted beneath one,
   because a person on a phone should not have to work out that it is different. */
.nav-show-all{width:100%;text-align:left;opacity:.72;font-style:normal}
.nav-show-all:hover,.nav-show-all:focus-visible{opacity:1}
/* Nav 442: the short menu (body[data-nav-curated="true"]) is one list in the
   role's own order - the group headers and their boxes step out of the way
   (display:contents) so each item's order applies across the whole menu, and a
   section folded earlier cannot hide a primary item. "More" restores the full
   grouped menu. Written at the sidebar's own specificity (see the trap note
   on the grouped navigation above). */
body[data-nav-curated="true"]:not(.login-mode) .sidebar nav .nav-group{display:none}
body[data-nav-curated="true"]:not(.login-mode) .sidebar .nav-section,
body[data-nav-curated="true"]:not(.login-mode) .sidebar .nav-section-items,
body[data-nav-curated="true"]:not(.login-mode) .sidebar .nav-section-collapsed .nav-section-items{display:contents}
body:not(.login-mode) .sidebar nav .nav-show-all{order:99;display:flex;align-items:center;justify-content:space-between;gap:var(--space-2);margin-top:var(--space-3);border-top:1px solid rgba(255,255,255,.08);border-radius:0;opacity:.86}
body:not(.login-mode) .sidebar nav .nav-show-all .nav-more-count{font-size:var(--text-xs);font-weight:500;color:rgba(255,255,255,.62)}
[data-field-only="true"] .nav-group-label{opacity:.6}
/* Audit B5: director-only controls are not offered to other roles. */
body:not([data-director-tier="true"]) .director-only-controls{display:none !important}

/* Field adoption layer: a site user should open Siite and know what to press
   before the rain hits the screen. Photo/evidence first, clock second, admin
   folded into the finish-the-day action. */
.field-command{
  display:grid;
  grid-template-columns:minmax(0,1fr) minmax(260px,.8fr);
  gap:14px;
  align-items:stretch;
  margin:0 0 18px;
  padding:14px;
  border:1px solid rgba(22,58,95,.16);
  border-radius:var(--r-lg);
  background:#fff;
  box-shadow:var(--shadow);
  overflow:hidden;
}
.field-role-label{margin:0;color:var(--muted);font-size:var(--text-xs);font-weight:600;text-transform:uppercase;letter-spacing:.13em}
/* Audit LD27: one icon style - monochrome line icons in the text colour. */
.siite-icon{display:inline-block;vertical-align:middle;flex:none}
.field-command-body{
  align-self:center;
  display:grid;
  gap:10px;
  color:var(--ink);
  min-width:0;
}
.field-command-body .eyebrow{color:var(--muted)}
.field-command-body h2{
  margin:0;
  max-width:620px;
  font-size:var(--text-2xl);
  line-height:var(--leading-none);
  letter-spacing:-.055em;
}
.field-command-body p:not(.eyebrow){
  max-width:560px;
  margin:0;
  color:var(--muted);
  font-size:var(--text-base);
  font-weight:700;
}
.field-progress{
  width:min(460px,100%);
  height:10px;
  border-radius:var(--r-pill);
  background:#e7eef5;
  overflow:hidden;
}
.field-progress span{
  display:block;
  height:100%;
  border-radius:inherit;
  background:linear-gradient(90deg,var(--navy),#2d6c9f);
}
.field-step-row{
  display:flex;
  flex-wrap:wrap;
  gap:7px;
}
.field-step{
  display:inline-grid;
  grid-template-columns:auto auto;
  gap:2px 7px;
  align-items:center;
  padding:7px 10px;
  border-radius:var(--r-pill);
  background:#f4f8fb;
  border:1px solid #dce7f0;
  color:var(--navy);
}
.field-step i{
  display:grid;
  place-items:center;
  width:18px;
  height:18px;
  border-radius:var(--r-pill);
  background:#e2ebf3;
  font-style:normal;
  font-weight:700;
}
.field-step.done i{background:#dff4e7;color:var(--good)}
.field-step b{font-size:var(--text-xs)}
.field-step small{grid-column:2;color:var(--muted);font-size:var(--text-xs);font-weight:700}
.field-command-actions{
  display:grid;
  gap:10px;
  align-content:center;
}
.field-primary-action,
.field-secondary-action{
  width:100%;
  min-height:76px;
  display:grid;
  grid-template-columns:auto 1fr;
  gap:2px 12px;
  align-items:center;
  text-align:left;
  border-radius:var(--r-md);
  padding:14px 15px;
  box-shadow:var(--shadow-soft);
}
.field-primary-action{
  min-height:96px;
  background:#fff;
  color:#102f4f;
  border-color:#fff;
}
.field-secondary-action{
  background:#f8fbfd;
  color:#173b5b;
  border-color:#d9e5ef;
}
.field-primary-action span,
.field-secondary-action span{
  grid-row:1 / span 2;
  display:grid;
  place-items:center;
  width:44px;
  height:44px;
  border-radius:var(--r-sm);
  background:#eaf2f8;
  font-size:var(--text-xl);
}
.field-primary-action strong,
.field-secondary-action strong{font-size:var(--text-lg)}
.field-primary-action small,
.field-secondary-action small{color:var(--muted);font-weight:500}
/* Audit LM-23: the accident entry is red, like HSEQ's front door. */
.field-secondary-action.field-urgent-action{background:var(--bad);border-color:var(--bad);color:#fff}
.field-secondary-action.field-urgent-action span{background:rgba(255,255,255,.16)}
.field-secondary-action.field-urgent-action small{color:rgba(255,255,255,.9)}
/* Nav 442: the phone's Capture sheet - the same tiles as Today's site block,
   a little shorter so all six fit one sheet. */
.capture-sheet-grid{display:grid;gap:8px;margin:12px 0}
.capture-sheet .field-secondary-action{min-height:60px;padding:10px 12px;box-shadow:none}
.capture-sheet .field-secondary-action strong{font-size:var(--text-base)}
/* Audit LD26: on a desk Today leads with the day's numbers (hero, then the
   KPI tiles, as in the prototype); the capture block follows. A phone keeps
   capture first - that is the site manager's job. */
@media(min-width:1101px){
  #todayContent{display:flex;flex-direction:column}
  #todayContent > .today-hero{order:-2}
  #todayContent > .today-kpi-grid{order:-1}
  /* Nav 442: an office role's Today leads with their work queue, so the
     day's site numbers keep their place further down. */
  #todayContent[data-today-layout="office"] > .today-kpi-grid{order:0}
  #todayContent > *{margin-top:0}
  #todayContent .field-command{grid-template-columns:1fr}
  #todayContent .field-command-actions{grid-template-columns:repeat(auto-fit,minmax(220px,1fr))}
  #todayContent .field-primary-action{min-height:76px}
}

@media(max-width:1100px){
  .field-command{
    grid-template-columns:1fr;
    background:#fff;
  }
  .field-command-actions{grid-template-columns:repeat(3,minmax(0,1fr))}
}
@media(max-width:760px){
  .field-command{
    margin:-6px -2px 16px;
    padding:var(--space-3);
    border-radius:var(--r-md);
    gap:12px;
  }
  .field-command-body h2{font-size:var(--text-2xl)}
  .field-command-body p:not(.eyebrow){font-size:var(--text-sm)}
  .field-step-row{display:grid;grid-template-columns:repeat(2,minmax(0,1fr))}
  .field-step{border-radius:var(--r-sm)}
  .field-command-actions{grid-template-columns:1fr}
  .field-primary-action,.field-secondary-action{min-height:72px;border-radius:var(--r-sm)}
.field-primary-action{min-height:86px}
}

/* Project action command: one scoped set of "what can/should I do on this job"
   directly inside the project, with simpler choices for trades than managers. */
.project-action-command{
  border-left:4px solid var(--sand);
  background:#fff;
}
.project-action-grid{
  display:grid;
  grid-template-columns:repeat(auto-fit,minmax(190px,1fr));
  gap:var(--space-2);
}
.project-action-tile{
  min-height:86px;
  display:grid;
  grid-template-columns:auto 1fr;
  gap:var(--space-1) var(--space-3);
  align-items:center;
  text-align:left;
  background:#fff;
  color:var(--navy);
  border:1px solid var(--line);
  border-radius:var(--r-md);
  box-shadow:var(--shadow-soft);
}
.project-action-tile.primary{
  /* Visual 453: the job's main next step is the rust call-to-action (the clock
     tile is the gold clock button instead). */
  background:var(--cta);
  color:var(--cta-ink);
  border-color:var(--cta);
}
.project-action-tile span{
  grid-row:1 / span 2;
  width:40px;
  height:40px;
  display:grid;
  place-items:center;
  border-radius:var(--r-sm);
  background:#eaf2f8;
  color:var(--navy);
  font-size:var(--text-lg);
}
.project-action-tile.primary span{
  background:rgba(255,255,255,.16);
  color:#fff;
}
.project-action-tile strong{font-size:var(--text-base)}
.project-action-tile small{
  color:var(--muted);
  font-weight:700;
}
.project-action-tile.primary small{color:rgba(255,255,255,.72)}
.project-action-footnote{margin:12px 0 0}

@media(max-width:760px){
  .project-action-grid{grid-template-columns:1fr}
  .project-action-tile{min-height:76px}
}

/* Evidence lightbox - tap a report photo, flick through the set in-app */
.evidence-viewer{position:fixed;inset:0;z-index:4000;background:rgba(9,13,19,.93);display:flex;align-items:center;justify-content:center}
.evidence-viewer-stage{display:flex;align-items:center;justify-content:center;max-width:94vw;max-height:84vh}
.evidence-viewer-stage img,.evidence-viewer-stage video{max-width:94vw;max-height:84vh;object-fit:contain;border-radius:var(--r-md)}
.evidence-viewer-caption{position:absolute;bottom:16px;left:50%;transform:translateX(-50%);color:#fff;background:rgba(0,0,0,.55);padding:6px 14px;border-radius:var(--r-pill);max-width:90vw;text-align:center;font-size:var(--text-sm)}
.evidence-viewer-nav{position:absolute;top:50%;transform:translateY(-50%);background:rgba(0,0,0,.45);color:#fff;border:none;width:46px;height:68px;cursor:pointer;border-radius:var(--r-md);font-size:var(--text-2xl);line-height:var(--leading-none)}
.evidence-viewer-nav.prev{left:10px}
.evidence-viewer-nav.next{right:10px}
.evidence-viewer-nav:hover,.evidence-viewer-close:hover{background:rgba(0,0,0,.7)}
.evidence-viewer-close{position:absolute;top:12px;right:14px;background:rgba(0,0,0,.45);color:#fff;border:none;width:42px;height:42px;border-radius:var(--r-md);cursor:pointer;font-size:var(--text-xl);line-height:var(--leading-none)}
.attachment-zoom{padding:0;border:none;background:none;cursor:zoom-in;display:block;width:100%}
.attachment-zoom img{width:100%;display:block}
.email-triage-panel .email-triage-row{display:flex;justify-content:space-between;align-items:center;gap:12px;padding:10px 0;border-bottom:1px solid var(--line)}
.email-triage-panel .email-triage-row:last-child{border-bottom:none}
.hub-inline-input{width:64px;padding:4px 6px;border:1px solid var(--line);border-radius:var(--r-md);font-weight:700}
.hub-inline-date{width:150px}

/* Document control: inline checkboxes on the upload form */
.checkbox-inline{display:flex;align-items:center;gap:8px;font-size:var(--text-sm);color:var(--muted);padding:6px 0}
.checkbox-inline input{margin:0;width:auto}

/* Display correction for mirror-plotted or upside-down prints: image road.
   PDF sheets correct at canvas paint; a plain image corrects here. */
.drawing-correct-rotate_180{transform:rotate(180deg)}
.drawing-correct-flip_horizontal{transform:scaleX(-1)}
.drawing-correct-flip_vertical{transform:scaleY(-1)}

/* Wide dialog for content review (intro drafts): a letter needs room to read. */
.choice-sheet.wide{max-width:780px;width:min(780px,94vw)}
.choice-sheet.wide textarea{min-height:320px;font-size:var(--text-base)}

/* One press instead of ten on long checkbox groups (inductions, PPE lists). */
.schema-options .schema-select-all{width:auto;align-self:flex-start;margin-bottom:4px;font-size:var(--text-sm)}

/* ——— 1 Sep UX audit batch (verify-ux-audit.mjs pins these) ——— */
/* B-04: every tap answers. Hover does not exist on a phone; :active is the
   entire vocabulary of touch feedback, and Siite had almost none of it. */
button:active, .nav:active, .tab:active, .front-door-action:active, .task-title-button:active,
.link-card:active, .siite-search-hit:active, .cmd-palette-item:active,
.message-file-button:active, .field-primary-action:active, .field-secondary-action:active,
.dash-chart.link-card:active {
  transform: scale(.98);
  filter: brightness(.96);
}
@media (prefers-reduced-motion: reduce){
  button:active, .nav:active, .tab:active, .front-door-action:active, .link-card:active { transform: none; }
}
/* B-04: a disabled control must look disabled, not like a picture of a live one. */
button:disabled, button[disabled] { opacity:.55; cursor:not-allowed; filter:none; transform:none; box-shadow:none; }

/* C-06: the focus ring was white on white cards (1.00:1). Dark ring with a
   light outer stroke reads on both grounds; the dark sidebar keeps a light
   ring with a dark halo. */
button:focus-visible, button.secondary:focus-visible, .menu-toggle:focus-visible,
.nav:focus-visible, a:focus-visible, .tab:focus-visible, summary:focus-visible, input:focus-visible, select:focus-visible, textarea:focus-visible, [role="button"]:focus-visible {
  /* Visual 453: the website orange, with the white halo kept below. */
  outline: 2px solid var(--focus-colour);
  outline-offset: 2px;
  box-shadow: 0 0 0 5px rgba(255,255,255,.9);
}
body:not(.login-mode) .sidebar .nav:focus-visible,
body:not(.login-mode) .sidebar button:focus-visible {
  outline-color: rgba(255,255,255,.92);
  box-shadow: 0 0 0 5px rgba(9,20,38,.5);
}

/* B-03: 44px is the floor for a thumb in gloves. Icons keep their visual
   size; the hit area grows. */
.topbar .actions .context-ai-button,
.topbar .actions .notification-button,
.menu-toggle, .user-button {
  min-width: 44px;
  min-height:var(--control-md);
}
body:not(.login-mode) .sidebar .nav { min-height:var(--control-md); }

/* M-03: a board column must never be its own hidden scroll region - the
   max-height rules that made it one are deleted at source (Audit LM-17). */

/* M-08: search is the best thing in the product and it was hidden behind a
   36px icon. On a phone, Today opens with a full-width search door. */
.today-search-door {
  display: none;
  width: 100%;
  align-items: center;
  gap: var(--space-2);
  margin: 0 0 var(--space-4);
  padding: var(--space-3) var(--space-4);
  background: #fff;
  color: var(--muted);
  border: 1px solid var(--line);
  border-radius: var(--r-pill);
  box-shadow: var(--shadow-soft);
  font-weight: 500;
  text-align: left;
  min-height: 48px;
}
.today-search-door span { flex: 1; }
@media(max-width:760px) {
  .today-search-door { display: flex; }
}

/* A-02: the mobile tab bar. Fixed, labelled, 48px targets, identical on
   every screen. Signed-in phones only. Seven things since 15 Oct (Messages
   and Email added), so the columns follow the buttons rather than a count. */
.mobile-tab-bar { display: none; }
@media(max-width:760px) {
  body[data-auth-state="signed-in"]:not(.external-client-mode) .mobile-tab-bar {
    display: grid;
    grid-auto-flow: column;
    /* Audit LM-15: a column is never narrower than its label at 12px, so
       "Messages" is not cut or squeezed to 9.5px; spare width is shared. */
    grid-auto-columns: minmax(min-content, 1fr);
    container: siite-tabbar / inline-size;
    position: fixed;
    left: 0; right: 0; bottom: 0;
    z-index: var(--z-tabbar);
    background: rgba(255,255,255,.97);
    border-top: 1px solid var(--line);
    /* Offline 483 (R2D-14): clear of the home bar (bottom) and the notch (sides). */
    padding: 4px max(6px, env(safe-area-inset-right, 0px)) calc(4px + env(safe-area-inset-bottom, 0px)) max(6px, env(safe-area-inset-left, 0px));
    box-shadow: 0 -6px 18px rgba(9,20,38,.08);
  }
  body[data-auth-state="signed-in"]:not(.external-client-mode) .sticky-submit{bottom:calc(var(--tab-bar-h) + 12px);z-index:calc(var(--z-tabbar) - 10)}
  body[data-auth-state="signed-in"]:not(.external-client-mode) .offline-bar{bottom:var(--tab-bar-h)}
  body:not(.login-mode) .mobile-tab-bar button {
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    gap: 2px;
    min-height: 52px;
    padding: var(--space-2) 2px;
    background: transparent;
    color: var(--muted);
    border: 0;
    box-shadow: none;
    border-radius: var(--r-sm);
    font-size: var(--text-xs);
    font-weight: 600;
  }
  body:not(.login-mode) .mobile-tab-bar button .mtb-icon { font-size: var(--text-lg); line-height: var(--leading-none); }
  /* Seven to a phone. A label is never cut to "Mess...": the type eases down
     on a narrow phone and a two-word label may take a second line. */
  body[data-auth-state="signed-in"]:not(.external-client-mode) .mobile-tab-bar { padding-inline: 2px; column-gap: 2px; }
  body:not(.login-mode) .mobile-tab-bar button { position: relative; min-width: 0; padding-inline: 0; }
  body:not(.login-mode) .mobile-tab-bar button > span:not(.mtb-icon):not(.mtb-count) { max-width: 100%; white-space: normal; overflow-wrap: normal; text-align: center; line-height: var(--leading-none); font-size: var(--text-xs); letter-spacing: -0.2px; }
  body:not(.login-mode) .mobile-tab-bar .mtb-count { position: absolute; top: 2px; left: calc(50% + 6px); min-width: 18px; height: 18px; padding: 0 4px; border-radius: var(--r-pill); background: var(--bad); color: #fff; font-size: var(--text-xs); font-weight: 700; line-height: 18px; text-align: center; }
  body:not(.login-mode) .mobile-tab-bar .mtb-count.hidden { display: none; }
  /* Nav 442: each role's bar shows its own buttons (applyMobileTabBarForRole
     sets [hidden] and the order). */
  body:not(.login-mode) .mobile-tab-bar button[hidden] { display: none; }
  body:not(.login-mode) .mobile-tab-bar button.active { color: var(--blue); background: #eef4fa; }
  /* Seven 44px tabs with 12px labels need about 330px. On the narrowest
     phones (320px, Display Zoom) Email steps off the bar; it stays in the menu. */
  @container siite-tabbar (max-width: 360px) {
    body:not(.login-mode) .mobile-tab-bar button[data-view="email"] { display: none; }
  }
  /* Audit LM-08 / LM-28: fixed layers step aside for the thing in use. With
     the keyboard up (a text field has focus) the bar covered the box being
     typed in and pushed Send off-screen; with the menu drawer open it painted
     over the drawer's footer. Ticking a checkbox raises no keyboard, so the
     bar stays for those. */
  body[data-auth-state="signed-in"]:not(.external-client-mode):has(input:not([type=checkbox]):not([type=radio]):not([type=button]):not([type=submit]):not([type=file]):focus, textarea:focus, select:focus, [contenteditable="true"]:focus) :is(.mobile-tab-bar, .push-nudge),
  body[data-auth-state="signed-in"]:not(.external-client-mode):not(.sidebar-collapsed) :is(.mobile-tab-bar, .push-nudge) { display: none; }
  /* The message box sits on top of the bar, not under it; with the bar gone
     for the keyboard it drops to the bottom edge. */
  body[data-auth-state="signed-in"]:not(.external-client-mode) .message-composer { bottom: var(--tab-bar-h); }
  body[data-auth-state="signed-in"]:not(.external-client-mode):has(.message-composer :focus) .message-composer { bottom: 0; }
  /* Content and floating chrome clear the bar. */
  body[data-auth-state="signed-in"]:not(.external-client-mode) main {
    padding-bottom: calc(76px + env(safe-area-inset-bottom, 0px));
  }
  body[data-auth-state="signed-in"] .siite-update-ready {
    bottom: calc(76px + env(safe-area-inset-bottom, 0px));
  }
}

/* M-02: the overflow group. Ten tabs lead in a fixed order; the rest sit
   behind an explicit, counted "More" — no invisible off-screen strip.
   Reworked 1 Sep (Jim's screenshot): opening it as an in-grid block grew the
   sticky strip until it filled the viewport. It is now an anchored dropdown —
   the strip never changes height when More opens. */
/* Audit F4V-01 (pass 4): on laptops and tablets (761-1440px) More sat past
   the end of the sideways strip - fully off-screen at 1280 - and its menu ran
   off the right edge. The phone rule below is now the rule at every width:
   the details box dissolves into the strip, its summary sticks to the strip's
   right edge with a solid face, and the menu is positioned by the frame
   around the strip (.project-tabs-frame), which is outside the scroller - so
   the strip no longer has to stop scrolling (overflow:visible) to show it,
   and the menu is anchored inside the screen. */
.project-tabs-frame { position: relative; }
/* Written at the shell's specificity: body:not(.login-mode) .siite-tabs sets
   position:relative and would otherwise win (the LD30 / F4V-08 trap). */
body:not(.login-mode) .project-tabs-frame > .siite-tabs { position: static; }
/* The strip's screen-reader notes are positioned too; keep them inside the
   frame rather than at a tab's far-right scroll position. */
body:not(.login-mode) .project-tabs-frame > .siite-tabs .siite-tab-note { left: 0; top: 0; }
.project-tabs-more { display: contents; }
body:not(.login-mode) .siite-tabs > .project-tabs-more > summary { position: sticky; right: 0; z-index: 3; margin-left: auto; background: var(--bg); }
body:not(.login-mode) .siite-tabs > .project-tabs-more > summary::before { content: ""; position: absolute; top: 0; bottom: 0; right: 100%; width: 28px; background: linear-gradient(90deg, rgba(244,247,251,0), var(--bg)); pointer-events: none; }
.project-tabs-more > summary { list-style: none; }
.project-tabs-more > summary::-webkit-details-marker { display: none; }
.project-tabs-more > summary::after { content: "▾"; }
.project-tabs-more[open] > summary::after { content: "▴"; }
/* Programme speed 470 (R2B-08): the programme's More door carries the count
   of what waits behind it (open import checks, proposed rules). */
/* The frame is the programme shell's grid item: without min-width:0 it grew to the
   strip's full width (the strip scrolls inside it, so it must not). */
.programme-tabs-frame { min-width: 0; }
.programme-tabs-more-count { display: inline-grid; place-items: center; min-width: 20px; height: 20px; padding: 0 var(--space-2); border-radius: var(--r-pill); background: var(--line); color: var(--ink); font-size: var(--text-xs); font-weight: 600; }
.project-tabs-overflow {
  position: absolute;
  right: 0;
  top: calc(100% + 6px);
  z-index: 30;
  min-width: min(430px, 86vw);
  max-width: calc(100vw - 32px);
  max-height: 62vh;
  overflow: auto;
  display: grid;
  grid-template-columns: repeat(2, minmax(160px, 1fr));
  gap: 4px;
  padding: 8px;
  background: #fff;
  border: 1px solid var(--line);
  border-radius: var(--r-md);
  box-shadow: var(--elev-3, var(--elev-2));
}
/* Menu entries: the tab name with its status under it. */
body:not(.login-mode) .project-tabs-overflow > :is(a,button) {
  display: flex; flex-direction: column; align-items: flex-start; gap: 2px;
  min-height: var(--control-md); padding: 8px 12px;
  border: 0; border-radius: var(--r-sm); background: transparent; box-shadow: none;
  color: var(--ink); font-size: var(--text-sm); font-weight: 600; text-align: left; text-decoration: none;
}
body:not(.login-mode) .project-tabs-overflow > :is(a,button):hover { background: var(--bg); }
body:not(.login-mode) .project-tabs-overflow > :is(a,button):is(.active,[aria-selected="true"]) { background: var(--sand-tint); color: var(--blue); }
.project-tabs-overflow .siite-tab-note { color: var(--muted); font-size: var(--text-xs); font-weight: 400; }
@media(max-width:760px) {
  /* 10 Sep (Jim, phone screenshot: "I can't see the drop down menu at all,
     it's off to the right"): the strip scrolls sideways and More sat at the
     far end, off the screen. The sticky More door (above, now every width)
     came from here. Audit LM-30: it used to paint over the tab names it sat
     on; it has a solid face with a fade on its leading edge. On a phone the
     menu spans the frame. */
  .project-tabs-overflow { left: 8px; right: 8px; top: calc(100% + 4px); min-width: 0; max-width: none; grid-template-columns: 1fr 1fr; }
}

/* L-03: HSEQ and Documents open on the register, not a create form. The Add
   panel is one press away behind this door. */
.quick-create-door { margin: 0 0 16px; }
.quick-create-door > summary {
  cursor: pointer;
  list-style: none;
  display: flex;
  align-items: center;
  min-height: 48px;
  padding: 12px 16px;
  background: #fff;
  border: 1px dashed var(--line);
  border-radius: var(--r-md);
  font-weight: 600;
  color: var(--blue);
}
.quick-create-door > summary::-webkit-details-marker { display: none; }
.quick-create-door[open] > summary { border-bottom-left-radius: 0; border-bottom-right-radius: 0; }
.quick-create-door > .panel, .quick-create-door > .grid { margin-top: 0; }

/* C-01/C-02: the short diary. The header folds to one line of known context;
   the rest of the template sits behind one Full report press. */
.daily-context-door > summary,
.daily-full-report-door > summary {
  cursor: pointer;
  list-style: none;
  display: flex;
  flex-direction: column;
  gap: 2px;
  min-height: 48px;
  justify-content: center;
  padding: 12px 16px;
  background: #fff;
  border: 1px solid var(--line);
  border-radius: var(--r-md);
  margin-bottom: 10px;
}
.daily-context-door > summary::-webkit-details-marker,
.daily-full-report-door > summary::-webkit-details-marker { display: none; }
.daily-context-door > summary small,
.daily-full-report-door > summary small { color: var(--muted); font-weight: 500; }
.daily-full-report-door > summary { border-style: dashed; }
.daily-full-report-door[open] > summary { border-bottom-left-radius: 0; border-bottom-right-radius: 0; }

/* L-02: a four-option Yes/No/N-A question filled half a phone screen as
   stacked 75px cards. A segmented control keeps the 44px touch floor in one
   row; the label itself is the state, so the radio circle goes. */
.schema-options.yesno { display: grid; grid-template-columns: repeat(4, 1fr); gap: 6px; }
.schema-options.yesno label {
  justify-content: center;
  text-align: center;
  gap: 0;
  padding: 11px 4px;
  min-height:var(--control-md);
  font-size: var(--text-sm);
  font-weight: 600;
}
.schema-options.yesno input { position: absolute; opacity: 0; width: 0; height: 0; min-height: 0; border: 0; }
@media(max-width:760px) {
  .schema-options.yesno { grid-template-columns: repeat(2, 1fr); }
}

/* Quote levelling: awarded packages and unsuccessful quotes are filed in
   closed sections under the live list, so the page is only as long as the
   decisions still to make. */
.quote-filed { border-top: 1px solid var(--line); margin-top: var(--space-3); }
.quote-filed > summary { cursor: pointer; min-height: var(--control-md); display: flex; align-items: center; flex-wrap: wrap; gap: 10px; font-weight: 700; list-style: none; }
.quote-filed > summary::-webkit-details-marker { display: none; }
/* A flex summary loses the browser's own arrow, and a heading with no arrow
   does not look like something that opens. */
.quote-filed > summary::before { content: "▸"; color: var(--muted); width: 1em; font-size: 1.3em; line-height: var(--leading-none); }
.quote-filed[open] > summary::before { content: "▾"; }

/* C-07: waiting looks like the page arriving, not a bare sentence. The
   skeleton fills the space the content will take; reduced-motion gets a
   static tint. */
.skeleton-panel { display: flex; flex-direction: column; gap: 10px; padding: 4px 0; }
.skeleton-line {
  height: 14px;
  border-radius: var(--r-xs);
  background: linear-gradient(90deg, #e9eef5 25%, #f6f9fc 45%, #e9eef5 65%);
  background-size: 200% 100%;
  animation: skeleton-shimmer 1.2s linear infinite;
}
.skeleton-line.wide { height: 24px; }
.skeleton-line.half { width: 55%; }
.skeleton-line.third { width: 32%; }
@keyframes skeleton-shimmer { from { background-position: 200% 0; } to { background-position: -200% 0; } }
@media (prefers-reduced-motion: reduce) { .skeleton-line { animation: none; } }
/* Calm 469 (R2B-06): siiteSkeleton's shapes - rows (above), tiles, table,
   and an inline cell/line for one figure or one sentence. */
.siite-skel-tiles { display: grid; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); gap: var(--space-3); }
.siite-skel-tile { display: flex; flex-direction: column; gap: var(--space-2); min-height: 88px; padding: var(--space-4); border: 1px solid var(--line); border-radius: var(--r-md); background: var(--surface-raised, #fff); }
.siite-skel-table { display: flex; flex-direction: column; gap: var(--space-2); padding: var(--space-1) 0; }
.siite-skel-row { display: grid; grid-template-columns: 2fr 1fr 1fr 1fr; gap: var(--space-3); align-items: center; min-height: 32px; }
.siite-skel-row.head .skeleton-line { height: 10px; opacity: .7; }
.siite-skel-cell, .siite-skel-line { display: inline-flex; align-items: center; vertical-align: middle; }
.siite-skel-cell .skeleton-line { display: inline-block; width: 3.2em; height: .9em; }
.siite-skel-line .skeleton-line { display: inline-block; width: min(18em, 70vw); height: .9em; }
/* Calm 469 (R2B-07): the compact empty state for a list inside a panel or drawer. */
.siite-empty.siite-empty-compact{padding:var(--space-3) var(--space-4);gap:var(--space-1)}
.siite-empty.siite-empty-compact strong{font-size:var(--text-sm)}
.siite-empty.siite-empty-compact p{font-size:var(--text-sm)}
/* Calm 469 (R2B-01): toasts are the top layer, so while a drawer, sheet or
   dialog is open they move out of its way - on a computer to the bottom
   left, over the dimmed page (a drawer is on the right, a dialog's buttons
   sit at its right); on a phone to the top, above the sheet - never over its
   title, Close, or Save / Create at its foot. */
body:has(.choice-overlay, .activity-hub-overlay, .siite-drawer-host) .toast-host{left:22px;right:auto;width:min(380px, calc(100vw - 44px))}
@media(max-width:760px){body:has(.choice-overlay, .activity-hub-overlay, .siite-drawer-host) .toast-host{top:calc(env(safe-area-inset-top, 0px) + 12px)!important;bottom:auto!important;left:12px!important;right:12px!important;width:auto!important}}
/* Calm 469 (R2B-05): no signal is a fact, not an alarm - calm, with Retry. */
.siite-empty-offline { border: 1px solid var(--line); border-left: 4px solid var(--status-warning); background: var(--status-warning-surface); }
/* Calm 469 (Apple feel #20): the check-tick on a button that just saved. */
.siite-saved-tick { position: relative; }
.siite-saved-tick::after { content: "\2713"; position: absolute; top: -8px; right: -8px; width: 20px; height: 20px; border-radius: 50%; display: grid; place-items: center; background: var(--good); color: #fff; font-size: var(--text-xs); font-weight: 700; line-height: var(--leading-none); animation: siiteTickIn 1.1s var(--ease-out) forwards; pointer-events: none; }
@keyframes siiteTickIn { 0% { transform: scale(.4); opacity: 0; } 15% { transform: scale(1.1); opacity: 1; } 25% { transform: scale(1); } 80% { opacity: 1; } 100% { opacity: 0; } }
@media (prefers-reduced-motion: reduce) { .siite-saved-tick::after { animation: none; } }

/* 2 Sep (Jim's screenshot): the CRM table's Action column was starved to
   ~90px, so the contact buttons physically overlapped their neighbours and
   names wrapped one character per line. The action cell gets real room (the
   wrap scrolls), and button text wraps inside its own button. */
#crmTable{min-width:1340px}
#crmTable td:last-child{min-width:250px}
.crm-contact-command.compact .crm-contact-actions button{
  white-space:normal;
  overflow-wrap:anywhere;
  line-height:var(--leading-tight);
}
.crm-closed-rows{margin-top:12px}
.crm-closed-rows > summary{
  cursor:pointer;
  list-style:none;
  padding:var(--space-3) var(--space-4);
  min-height:var(--control-md);
  display:flex;
  align-items:center;
  background:#fff;
  border:1px dashed var(--line);
  border-radius:var(--r-md);
  color:var(--muted);
  font-weight:600;
}
.crm-closed-rows > summary::-webkit-details-marker{display:none}
.crm-closed-rows[open] > summary{margin-bottom:10px}

/* 2 Sep UX: on a phone the only offline signal was a per-file "Queued" pill -
   the sync badge is display:none under 900px. One persistent slim bar. */
.push-nudge{position:fixed;left:10px;right:10px;bottom:76px;z-index:8400;display:flex;gap:8px;align-items:center;justify-content:center;flex-wrap:wrap;background:var(--blue);color:#fff;font-size:var(--text-sm);padding:8px 12px;border-radius:var(--r-md)}
.push-nudge.hidden,body:has(.choice-overlay) .push-nudge,body.drawing-fullscreen-active .push-nudge{display:none}
/* Audit LD02/LM-14: buttons on the navy bar invert (the on-dark variant).
   "Not now" was navy on navy (1.01:1, invisible) and "Don't ask again" was the
   loudest thing on the bar. Now: Turn on is the one filled (white) action,
   Not now is an outline, Don't ask again is a plain underlined link. All 44px
   (the 36px floor that beat the touch floors is gone). */
body:not(.login-mode) .push-nudge button{min-height:var(--control-md);background:transparent;color:#fff;border:1px solid rgba(255,255,255,.6);box-shadow:none}
body:not(.login-mode) .push-nudge button:hover{background:rgba(255,255,255,.12);border-color:#fff}
body:not(.login-mode) .push-nudge button.primary{background:#fff;color:var(--blue);border-color:#fff}
body:not(.login-mode) .push-nudge button.text-button{border-color:transparent;text-decoration:underline;text-underline-offset:3px}
@media(min-width:761px){.push-nudge{bottom:12px}}
.offline-bar{display:none;position:fixed;left:0;right:0;bottom:0;z-index:8450;background:#31506e;color:#fff;font-weight:700;font-size: var(--text-sm);padding:8px 14px;text-align:center}
body.is-offline .offline-bar{display:block}

/* 2 Sep: form photo fields open the camera; the gallery is a deliberate second choice */
.visually-hidden-file{position:absolute;width:1px;height:1px;opacity:0;overflow:hidden;pointer-events:none}
.file-pick-button{display:inline-flex;align-items:center;justify-content:center;min-height:var(--control-md);padding:8px 14px;border:1px solid var(--line);border-radius:var(--r-sm);background:white;color:var(--blue);font-weight:600;cursor:pointer}
.schema-file-control{position:relative}

/* 2 Sep: the field that failed validation says so where it is */
.schema-field.invalid{border-color:var(--bad);background:var(--status-critical-surface);box-shadow:0 0 0 2px rgba(179,38,30,.12)}

/* 2 Sep (Mark's screenshot): the plan-view card covered half the drawing on a
   phone. On touch devices it starts collapsed to a single Tools button. */
.drawing-toolbar-toggle{display:none}
@media(max-width:760px), (pointer:coarse){
  .drawing-stage-toolbar .drawing-toolbar-toggle{display:inline-flex;min-height:var(--control-md)}
  .drawing-stage-toolbar.collapsed > :not(.drawing-toolbar-toggle){display:none}
  .drawing-stage-toolbar.collapsed{width:auto;padding:6px}
}

/* 2 Sep: the update banner is a slim bar, not a card; on phones it sits above the tab bar */
.siite-update-ready{font-size:var(--text-sm);padding:var(--space-2) var(--space-3);gap:var(--space-2);max-width:min(560px,calc(100vw - 24px))}
.siite-update-ready button{min-height:var(--control-sm);padding:var(--space-2) var(--space-2)}
@media(max-width:760px){body[data-auth-state="signed-in"]:not(.external-client-mode) .siite-update-ready{bottom:calc(var(--tab-bar-h) + 8px)}}

/* 2 Sep: people cards - the contact card each worker was missing */
.person-card-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(260px,1fr));gap:12px}
.person-card{background:var(--panel);border:1px solid var(--line);border-radius:var(--r-md);padding:12px 14px;display:grid;gap:8px;min-width:0}
.person-card-head{display:grid;grid-template-columns:auto 1fr auto;gap:10px;align-items:center}
.person-card-head small{display:block;color:var(--muted);font-size:var(--text-xs)}
.person-avatar{width:36px;height:36px;border-radius:50%;background:var(--soft);color:var(--blue);display:grid;place-items:center;font-weight:700;font-size:var(--text-sm)}
.person-card-actions{display:flex;flex-wrap:wrap;gap:8px}
.person-card-actions a.secondary{display:inline-flex;align-items:center;min-height:var(--control-md);padding:var(--space-2) var(--space-3);border:1px solid var(--line);border-radius:var(--r-sm);background:white;color:var(--blue);font-weight:600;text-decoration:none}
/* Audit V1-08 (Visual 453): 1fr 1fr auto let the two inputs' own width push
   Save past the card (and the page sideways) in a 260px card. */
.person-card-capture{display:grid;grid-template-columns:repeat(2,minmax(0,1fr)) auto;gap:6px;min-width:0}
.person-card-capture > input{min-width:0;width:100%}
@media(max-width:760px){.person-card-capture{grid-template-columns:1fr}}
#workforcePeopleSearch{min-width:220px}

/* 2 Sep: project + programme pages grouped into sections */
.programme-section{scroll-margin-top:90px}
.programme-section-title{font-size:var(--text-lg);margin:18px 0 10px;letter-spacing:-.02em}
.programme-section-details>summary,.project-facts-details>summary{display:flex;justify-content:space-between;align-items:center;gap:12px;cursor:pointer;list-style:none;min-height:var(--control-md)}
.programme-section-details>summary small,.project-facts-details>summary small{display:block;color:var(--muted);font-size:var(--text-xs)}
.programme-section-details>summary b,.project-facts-details>summary b{color:var(--blue);font-size:var(--text-sm)}
.programme-section-details[open]>summary b::after,.project-facts-details[open]>summary b::after{content:' ▴'}
.programme-section-content,.project-facts-content{margin-top:12px}

/* 2 Sep design system: the operative clock panel - one tap, the site named, the state visible */
.today-clock-panel{display:flex;flex-direction:column;gap:var(--space-2);min-width:220px}
.today-clock-panel .today-clock-button{width:100%;min-height:var(--control-lg);font-size:var(--text-base)}
.today-clock-panel small{color:rgba(255,255,255,.78)}
.today-clock-panel .today-clock-site{font-weight:600;color:#fff}
.today-clock-panel .text-button{color:rgba(255,255,255,.85);text-decoration:underline;background:none;border:0;padding:0;box-shadow:none;font-size:var(--text-xs)}

/* 2 Sep night: after a night of releases every phone shows the update bar on
   first open. On the sign-in screen there is no tab bar to lift it above, so
   it sat on "Reset stuck sign-in". Give the card room instead. */
body:not([data-auth-state="signed-in"]) .login-page{padding-bottom:calc(96px + env(safe-area-inset-bottom, 0px))}
@media(max-width:760px){body:not([data-auth-state="signed-in"]) .siite-update-ready{left:var(--space-3);right:var(--space-3);max-width:none}}

/* 3 Sep: full-screen viewer - the stage takes the height it was given, and the
   tool rail reads white on navy whatever the button base styles say */
.drawing-viewer-panel.drawing-fullscreen .drawing-measure-stage{max-height:calc(100dvh - 150px);min-height:calc(100dvh - 150px)}
.drawing-viewer-panel .drawing-tool-rail button,.drawing-viewer-panel .drawing-tool-rail button.secondary{color:#fff;background:rgba(255,255,255,.1);border-color:rgba(255,255,255,.22)}
.drawing-viewer-panel .drawing-tool-rail button.active{background:#fff;color:var(--blue)}
/* the zoom row wraps instead of clipping "Fix orientation" under the zoom pill */
.measure-zoom-row.compact{display:flex;flex-wrap:wrap;gap:var(--space-2);align-items:center}
.measure-zoom-row.compact .pill{margin-left:auto}

/* 3 Sep: accumulating photo picker in dialogs (clock-out evidence) */
.dialog-photo-strip{display:flex;flex-wrap:wrap;gap:var(--space-2);margin:var(--space-2) 0}
.dialog-photo-thumb{position:relative;margin:0;width:72px;height:72px;border-radius:var(--r-sm);overflow:hidden;border:1px solid var(--line);background:var(--surface-base)}
.dialog-photo-thumb img{width:100%;height:100%;object-fit:cover;display:block}
.dialog-photo-thumb button{position:absolute;top:2px;right:2px;min-width:44px;min-height:var(--control-md);padding:0 6px;line-height:var(--leading-none)}
.dialog-file-field .visually-hidden-file{position:absolute;width:1px;height:1px;opacity:0;pointer-events:none}

/* 3 Sep: Raw Planning bulk selection */
.crm-lead-bulk-bar{display:flex;justify-content:space-between;align-items:center;gap:var(--space-2);flex-wrap:wrap;padding:var(--space-2) var(--space-3);border:1px dashed var(--line);border-radius:var(--r-md);margin-bottom:var(--space-3);background:var(--surface-base)}
.crm-lead-bulk-bar.active{border-style:solid;border-color:var(--blue);background:var(--soft)}
.crm-lead-select{display:inline-flex;min-height:var(--control-md);align-items:center;gap:6px;font-size:var(--text-xs);font-weight:600;color:var(--muted);margin-right:var(--space-2)}
.crm-lead-select input{width:20px;height:20px;min-height:20px;margin:0}

.crm-archived-rows summary{cursor:pointer;padding:var(--space-2) 0}

/* 3 Sep 16:45 (Anthony: "this don't move when they fill out the report"): the
   clock-out sheet sat at z-index 80 under the phone tab bar (8500), so its
   Record button and photo field were covered. The sheet now stacks above every
   bar and the tab bar steps aside while a dialog is open. */
.choice-overlay{z-index:var(--z-dialog)}
body:has(.choice-overlay) .mobile-tab-bar{display:none !important}
/* 3 Sep 17:10 (Jim: "there is a leftover bar"): the full-screen drawing workspace sits at z 120 and its
   touch toolbar at 125, both below the tab bar (8500), so the bar stayed painted over the sheet on phones. */
body.drawing-fullscreen-active .mobile-tab-bar{display:none !important}
@media(max-width:760px){.choice-sheet{padding-bottom:max(24px, env(safe-area-inset-bottom))}}

/* 4 Sep: concrete pour plan, readiness and record */
.pour-card{border:1px solid var(--border,#dfe3e8);border-radius:var(--r-md);padding:12px;margin:10px 0;background:var(--surface,#fff)}
.pour-card.warn{border-color:#d9822b}
.pour-card.ready{border-color:#2e8b57}
.pour-card-head{display:flex;align-items:center;gap:10px;flex-wrap:wrap}
.pour-card-head .crm-next-body{flex:1;min-width:160px}
.pour-checks{display:grid;gap:6px;margin:10px 0}
.pour-check{display:flex;align-items:flex-start;gap:10px;text-align:left;padding:9px 10px;border:1px solid var(--border,#dfe3e8);border-radius:var(--r-sm);background:transparent;color:inherit;font:inherit;cursor:pointer}
.pour-check .pour-check-mark{flex:0 0 22px;height:22px;border-radius:50%;border:2px solid #9aa3ad;display:inline-flex;align-items:center;justify-content:center;font-weight:700;font-size:var(--text-base)}
.pour-check.done{background:rgba(46,139,87,.08);border-color:#2e8b57}
.pour-check.done .pour-check-mark{background:#2e8b57;border-color:#2e8b57;color:#fff}
.pour-check small{display:block;opacity:.7;font-size:var(--text-xs)}
.daily-pour-checks{display:grid;gap:6px;margin:8px 0}
.daily-pour-check{display:flex;gap:10px;align-items:flex-start;padding:8px 10px;border:1px solid var(--border,#dfe3e8);border-radius:var(--r-sm)}
.daily-pour-check input{margin-top:3px}
.daily-pour-record{margin-top:10px}

/* 4 Sep: valuation drafts */
.valuation-project{border-top:1px solid var(--border,#dfe3e8);padding:10px 0}
.valuation-project .panel-title{display:flex;align-items:center;gap:10px;flex-wrap:wrap}
.valuation-project .panel-title span{flex:1;min-width:160px}
.valuation-draft-row{border:1px solid var(--border,#dfe3e8);border-radius:var(--r-sm);padding:8px 12px;margin:8px 0}
.valuation-draft-row summary{cursor:pointer}

.workforce-invoiced-rate{display:block;opacity:.85}
.workforce-invoiced-rate.gap{color:#b3261e;font-weight:600}

.today-arrival-prompt{border:1px solid #d9822b;background:rgba(217,130,43,.08);border-radius:var(--r-md);padding:10px 12px;margin-bottom:8px}
/* Clock 436: the leaving-site and confirm-your-finish prompts, the gang
   clock-out, the clean-shift approval and the spoken clock-out answer. */
.today-arrival-prompt .button-row{flex-wrap:wrap}
/* On the navy Today hero the see-through prompt left a secondary button's
   dark text on navy (unreadable); the prompt is a light card there. */
.today-hero .today-arrival-prompt{background:var(--surface-raised);color:var(--ink)}
.today-hero .today-arrival-prompt strong{color:var(--ink)}
.today-arrival-prompt .button-row button{min-height:var(--control-md)}
.today-confirm-prompt{border-color:var(--warn)}
.labour-gang-row{margin:8px 0}
.labour-gang-row button{min-height:var(--control-md);display:inline-flex;align-items:center;gap:6px;white-space:normal;text-align:left}
.labour-clean-panel .clean-list{display:grid;gap:8px;padding:0;margin:8px 0;list-style:none}
.labour-clean-panel .clean-list li{border:1px solid var(--border,#dfe3e8);border-radius:var(--r-sm);padding:8px 10px;overflow-wrap:anywhere}
.labour-clean-panel .clean-list .pill{white-space:normal;max-width:100%}
.labour-clean-panel summary{min-height:var(--control-md);display:flex;align-items:center;cursor:pointer}
.labour-clean-panel .button-row button{min-height:var(--control-md)}
.labour-auto-approve-setting{margin:8px 0}
.labour-auto-approve-setting .dialog-check-option{min-height:var(--control-md)}
.dialog-dictate{min-height:var(--control-md);display:inline-flex;align-items:center;justify-content:center;gap:8px;width:100%;margin:-2px 0 4px}
.dialog-dictate.live{background:var(--bad);color:#fff;border-color:var(--bad)}
/* Clock 440: "My hours", overtime agreed in advance, the clock policy, the
   day-by-day paid table and one-press sign-off of clean weeks. */
.labour-overtime-panel{margin:8px 0}
.labour-overtime-row{flex-wrap:wrap;align-items:center;gap:8px}
.labour-overtime-row button{min-height:var(--control-md);display:inline-flex;align-items:center;gap:var(--space-2)}
.labour-overtime-list{display:grid;gap:8px;padding:0;margin:8px 0;list-style:none}
.labour-overtime-list li{border:1px solid var(--border,#dfe3e8);border-radius:var(--r-sm);padding:8px 10px;overflow-wrap:anywhere}
.labour-overtime-list li button{min-height:var(--control-md)}
.labour-overtime-mine{border-color:var(--blueprint)}
.labour-my-hours{margin:8px 0;padding:0}
.labour-my-hours > summary{min-height:var(--control-md);display:flex;justify-content:space-between;align-items:center;gap:8px;padding:8px 12px;cursor:pointer;flex-wrap:wrap}
.labour-my-hours > summary span:first-child{display:grid}
.labour-my-hours > :not(summary){margin-left:12px;margin-right:12px}
.labour-my-hours .labour-my-days{display:grid;gap:6px;padding:0;margin:6px 12px 8px;list-style:none}
.labour-my-hours .labour-my-days li{border-top:1px solid var(--border,#dfe3e8);padding-top:6px;overflow-wrap:anywhere}
.labour-paid-today{margin:6px 0;overflow-wrap:anywhere}
.today-hero .labour-my-hours{background:var(--surface-raised);color:var(--ink)}
/* The hero's own paragraphs are pale on navy; on this light card they are ink. */
body:not(.login-mode) .today-hero .labour-my-hours p{color:var(--ink)}
.labour-paid-why{display:block;color:var(--muted);overflow-wrap:anywhere}
/* Visual 459: "Each man, each day" is the shared siiteDataTable (compact);
   the status chips wrap inside their fitted column instead of widening it. */
.labour-paid-days{margin:var(--space-2) 0}
body:not(.login-mode) .labour-paid-days .siite-data-table td.siite-col-status{white-space:normal}
.labour-paid-status{display:flex;flex-wrap:wrap;gap:var(--space-1);max-width:18em}
body:not(.login-mode) .labour-paid-days .siite-data-table td.lpd-status{min-width:15em}
body:not(.login-mode) .labour-paid-status .pill{white-space:normal;max-width:100%}
.payrun-table .payrun-days-row td{text-align:left;white-space:normal;font-weight:400}
/* The run table scrolls sideways on a phone; a man's days stay in view. */
@media (max-width:640px){.payrun-days-row details{position:sticky;left:0;max-width:calc(100vw - 72px)}}
/* Inside a pay-run line the run table's right-aligned, no-wrap cells must not reach the day table. */
.payrun-table .labour-paid-days :is(td,th){text-align:left;white-space:normal;font-weight:400}
/* On a phone each day is one compact stacked row: who (or which day) and the
   paid hours on the first line, the day and time on site on the second, then
   the reason in full and the chips. */
@media (max-width:760px){
  body:not(.login-mode) .labour-paid-days .siite-data-table td.siite-cell-key{flex:1 1 0;min-width:0}
  body:not(.login-mode) .labour-paid-days .siite-data-table td.lpd-paid{order:-1;margin-left:auto;min-width:0}
  body:not(.login-mode) .labour-paid-days .siite-data-table td.lpd-why{order:2;flex:1 1 100%}
  body:not(.login-mode) .labour-paid-days .siite-data-table td.lpd-why .siite-clamp{-webkit-line-clamp:unset;line-clamp:unset;display:block}
  body:not(.login-mode) .labour-paid-days .siite-data-table td.lpd-status{order:3;flex:1 1 100%;min-width:0}
  body:not(.login-mode) .labour-paid-days .labour-paid-status{max-width:none}
  body:not(.login-mode) .labour-paid-days .siite-data-table td :is(small,.labour-paid-day){display:inline;margin-left:0}
  body:not(.login-mode) .labour-paid-days .siite-data-table td.lpd-day::after{content:" ·";color:var(--muted)}
}
.labour-signoff-days summary,.payrun-days summary{min-height:var(--control-md);display:flex;align-items:center;cursor:pointer}
.labour-clean-weeks{flex-wrap:wrap;align-items:center;gap:8px;margin:8px 0}
.labour-clean-weeks button{min-height:var(--control-md)}
.labour-clock-policy-editor{margin:8px 0}
.labour-clock-policy-editor .button-row{flex-wrap:wrap;align-items:center;gap:8px}
.labour-clock-policy-editor .button-row button{min-height:var(--control-md)}
.labour-break-note small{display:block;color:var(--muted)}

/* 4 Sep: overcharge recovery */
.overcharge-lines{display:grid;gap:8px;padding:6px 0}
.overcharge-invoice{border:1px solid var(--border,#dfe3e8);border-radius:var(--r-sm);padding:8px 10px}
.overcharge-invoice-head{display:flex;flex-wrap:wrap;gap:8px;align-items:center}
.overcharge-invoice-head .button-row{margin-left:auto}

/* 9 Sep: a route-state panel (not found / permission denied) sits in front of the dashboard's own markup instead of replacing it. */
#dashboard.route-state-active > :not(#routeStatePanel){display:none}

/* 13 Sep: project Photos tab as a photo grid with a viewer (Jim: "like an instagram page"). */
.photo-day{margin:0 0 var(--space-4)}
.photo-day h4{margin:0 0 8px;font-size:var(--text-sm);color:var(--muted);text-transform:uppercase;letter-spacing:.1em}
.photo-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(150px,1fr));gap:6px}
.photo-tile{display:block;position:relative;aspect-ratio:1/1;padding:0;margin:0;border:0;border-radius:var(--r-sm);overflow:hidden;background:var(--soft);box-shadow:none;cursor:zoom-in}
.photo-tile img{width:100%;height:100%;object-fit:cover;display:block;transition:transform .15s ease}
.photo-tile:hover img,.photo-tile:focus-visible img{transform:scale(1.04)}
.photo-tile:focus-visible{outline:2px solid var(--focus-colour);outline-offset:2px}
.photo-tile.pending{display:grid;place-content:center;gap:4px;text-align:center;padding:10px;color:var(--warn-ink);background:var(--status-warning-surface);border:1px dashed var(--warn);cursor:default;font-size:var(--text-xs)}
.photo-tile.pending small{color:var(--ink);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:100%}
.photo-tile-pending-icon{font-size:var(--text-2xl)}
.photo-other-evidence{margin-top:var(--space-4)}
.photo-other-evidence summary{cursor:pointer;padding:10px 0}
.siite-photo-viewer{position:fixed;inset:0;z-index:2000;background:rgba(15,23,42,.94);display:grid;grid-template-columns:56px minmax(0,1fr) 56px;align-items:center;padding:var(--space-4);gap:var(--space-2)}
.siite-photo-viewer figure{margin:0;display:grid;grid-template-rows:minmax(0,1fr) auto;height:100%;min-height:0;justify-items:center;gap:var(--space-2)}
.siite-photo-viewer img{max-width:100%;max-height:100%;object-fit:contain;border-radius:var(--r-md);box-shadow:var(--elev-3)}
.siite-photo-viewer figcaption{color:white;text-align:center;display:grid;gap:2px;font-size:var(--text-sm)}
.siite-photo-viewer figcaption span,.siite-photo-viewer figcaption em{color:#cbd5e1;font-style:normal;font-size:var(--text-xs)}
.siite-photo-viewer figcaption a{color:#93c5fd}
.siite-photo-viewer .photo-viewer-nav{background:rgba(255,255,255,.12);color:white;border:0;border-radius:50%;width:48px;height:48px;font-size:32px;line-height:var(--leading-none);display:grid;place-items:center;box-shadow:none}
.siite-photo-viewer .photo-viewer-nav:disabled{opacity:.25;cursor:default}
.siite-photo-viewer .photo-viewer-close{position:fixed;top:12px;right:12px;background:rgba(255,255,255,.12);color:white;border:0;border-radius:50%;width:44px;height:44px;font-size:28px;line-height:var(--leading-none);box-shadow:none}
@media(max-width:760px){
  .photo-grid{grid-template-columns:repeat(3,1fr);gap:3px}
  .siite-photo-viewer{grid-template-columns:1fr;padding:var(--space-2)}
  .siite-photo-viewer .photo-viewer-nav{display:none}
}

.photo-documents-note{margin-top:var(--space-4)}
.siite-doc-row.auto-filed{opacity:.92}
.siite-doc-row.auto-filed .pill{background:var(--soft);color:var(--muted)}

/* 15 Sep: workbook-fed figures say so, with when the workbook was last read */
.figure-provenance{display:block;font-size:var(--text-xs);color:var(--muted);margin-top:2px;letter-spacing:.01em}
.figure-provenance.stale{color:var(--warn-ink)}
.portfolio-net .figure-provenance{display:inline-block;margin-left:var(--space-2);margin-top:0}

/* 21 Sep: sales scorecard on CRM Activities */
.crm-sales-scorecard{margin-bottom:var(--space-4);min-width:0;max-width:100%}
.crm-target-quick{margin-top:var(--space-2);flex-wrap:nowrap}
.crm-sales-table{width:100%;border-collapse:collapse;font-size:var(--text-sm)}
.crm-sales-table th,.crm-sales-table td{padding:var(--space-1) var(--space-2);border-bottom:1px solid var(--line);text-align:left;white-space:nowrap}
.crm-sales-table td small{color:var(--muted)}
.crm-sales-table .sales-met{color:var(--good)}
.crm-sales-table .sales-short{color:var(--warn-ink)}
/* CRM 315: letters sent and follow-ups register */
.crm-letters-register{min-width:0;max-width:100%}
.crm-letters-filters{margin:var(--space-3) 0}
.crm-letters-filters label[hidden]{display:none}
.crm-letters-count{margin:var(--space-2) 0;color:var(--muted)}
.crm-letters-count strong,.crm-letters-count b{color:var(--ink)}
.crm-letters-table{width:100%;border-collapse:collapse;font-size:var(--text-sm)}
.crm-letters-table th,.crm-letters-table td{padding:var(--space-2);border-bottom:1px solid var(--line);text-align:left;vertical-align:top;white-space:nowrap}
.crm-letters-table th{font-size: var(--text-xs);font-weight:600;text-transform:uppercase;letter-spacing:.1em;color:var(--muted)}
.crm-letters-table td.crm-letters-wrap{white-space:normal;min-width:180px;max-width:360px}
.crm-letters-table td small{display:block;color:var(--muted);font-size: var(--text-xs);white-space:normal}
.crm-letters-table .pill{white-space:normal;text-align:left}
.crm-letters-pager{margin-top:var(--space-3);align-items:center}
/* Letters 480: one row per target, its letters listed under it */
.crm-letter-lines{list-style:none;margin:0;padding:0;display:grid;gap:var(--space-2)}
.crm-letter-lines li{padding-left:var(--space-2);border-left:2px solid var(--line)}
.crm-letter-line-head{display:block;white-space:normal}
.crm-letters-table td small.crm-letters-agent-note{margin-top:var(--space-1);font-style:italic}
.crm-letters-csv-note{margin:0 0 var(--space-2)}
/* Orders 316: hire register and the extension and hire panels on an order */
.hire-register{min-width:0;max-width:100%}
.hire-register-filters{grid-template-columns:repeat(4,minmax(0,1fr));margin-bottom:var(--space-3)}
@media(max-width:1100px){.hire-register-filters{grid-template-columns:repeat(2,minmax(0,1fr))}}
@media(max-width:760px){.hire-register-filters{grid-template-columns:1fr}}
.hire-register-count{margin:var(--space-2) 0;color:var(--muted)}
.hire-register-count strong{color:var(--ink)}
.hire-register-table{width:100%;border-collapse:collapse;font-size:var(--text-sm)}
.hire-register-table th,.hire-register-table td{padding:var(--space-2);border-bottom:1px solid var(--line);text-align:left;vertical-align:top;white-space:nowrap}
.hire-register-table th{font-size: var(--text-xs);font-weight:600;text-transform:uppercase;letter-spacing:.1em;color:var(--muted)}
.hire-register-table td.hire-register-wrap{white-space:normal;min-width:160px;max-width:320px}
.hire-register-table td small{display:block;color:var(--muted);font-size: var(--text-xs);white-space:normal}
.hire-register-table .pill{white-space:normal;text-align:left}
.po-extension-requests .link-button{text-align:left}
.hire-register-table .link-button{min-height:0;padding:0;font-size: var(--text-xs)}
.hire-register-actions{margin-top:var(--space-2)}
.po-extensions-panel .panel-title .pill{white-space:nowrap}
.po-extensions-panel .record-list article small,.po-hire-panel .record-list article small{display:block;color:var(--muted)}
.crm-sales-table .sales-result{border-left:1px solid var(--line)}
.crm-sales-trend p{margin:var(--space-1) 0;font-size:var(--text-xs);color:var(--muted)}
.crm-sales-trend b{color:var(--ink)}
.project-variations-strip span button{margin-left:var(--space-2)}
/* 23 Sep (full audit SIT-010: "Home, Time Clock, Documents and POs clip important content at 390px and 768px"):
   a table wider than its window shows a scroll shadow at whichever edge has more; PO card buttons stack on a phone;
   nothing inside the time panel forces it wider than the screen. */
/* Visual 453: the base .table-wrap, merged (the sets above the print rule are merged in their own
   place so print keeps max-height:none; values are the ones that already won). */
.table-wrap{overflow:auto;max-width:100%;border:1px solid var(--line);box-shadow:var(--shadow-soft);border-radius:var(--r-sm);overscroll-behavior-inline:contain;scrollbar-gutter:stable;background:linear-gradient(to right,#fff 30%,rgba(255,255,255,0)),linear-gradient(to right,rgba(255,255,255,0),#fff 70%) 100% 0,radial-gradient(farthest-side at 0 50%,rgba(9,20,38,.22),rgba(9,20,38,0)),radial-gradient(farthest-side at 100% 50%,rgba(9,20,38,.22),rgba(9,20,38,0)) 100% 0;background-repeat:no-repeat;background-size:40px 100%,40px 100%,14px 100%,14px 100%;background-attachment:local,local,scroll,scroll}
@media(max-width:760px){
  .po-card .button-row.compact-buttons{grid-template-columns:1fr}
  .labour-time-panel,.labour-time-panel *{min-width:0;max-width:100%}
  .labour-time-panel .button-row,.labour-time-panel .toolbar{flex-wrap:wrap}
  .toolbar input{min-width:0;width:100%}
}
.decision-overdue td{background:var(--status-critical-surface)}

/* Commercial 183: stale-source freshness under the last-sync time */
small.warn-text{color:#8a5700;font-weight:600}
.mandatory-source-set .state-row{margin-bottom:8px}

/* Delivery 185: why-at-risk list */
.why-at-risk-list li{display:flex;gap:var(--space-2);align-items:center;flex-wrap:wrap;padding:var(--space-2) 0;border-bottom:1px solid var(--line)}
.why-at-risk-list li:last-child{border-bottom:0}
.why-at-risk-list li a{margin-left:auto;display:inline-flex;align-items:center;min-height:var(--control-sm);min-width:var(--control-sm);padding:0 8px;font-weight:600} /* Audit LD22: 'open' was a 28x17 target */

/* Programme 294: one line of fixes per job above the "Cleared to start?" table. */
.start-readiness-actions{display:grid;gap:6px;margin:0 0 10px}
.start-readiness-actions .button-row{align-items:center;flex-wrap:wrap}
/* Delivery 193: the measuring workspace on a phone — no rail over the register, no tool box floating on the sheet. */
.drawing-viewer-panel:not(.drawing-fullscreen) .drawing-tool-rail{display:none !important}
@media(max-width:760px){
  .drawing-stage-toolbar{position:static;display:flex;flex-wrap:wrap;margin:0 0 6px;width:100%;border-radius:var(--r-sm)}
  .photo-grid{grid-template-columns:repeat(3,minmax(0,1fr));gap:3px}
  .photo-tile{border-radius:var(--r-xs)}
  .siite-photo-viewer{grid-template-columns:minmax(0,1fr);padding:0;gap:0}
  .siite-photo-viewer figure{grid-template-rows:minmax(0,1fr) auto;padding:56px 0 72px}
  .siite-photo-viewer img{border-radius:0;max-height:100%}
  /* Delivery 199: the arrows were hidden on phones by an earlier rule; swipe still works, and the arrows are back at the bottom for thumbs that would rather tap. */
  .siite-photo-viewer .photo-viewer-nav{display:grid;position:fixed;bottom:calc(14px + env(safe-area-inset-bottom));z-index:2}
  .siite-photo-viewer .photo-viewer-nav.prev{left:16px}
  .siite-photo-viewer .photo-viewer-nav.next{right:16px}
}



/* Source-backed project workbook: wrapped, selectable read-only register cells. */
.siite-workbook-view .siite-sheet-table td{min-width:150px;max-width:420px;white-space:normal;overflow-wrap:anywhere;vertical-align:top;padding:var(--space-2)}
.siite-workbook-view .siite-sheet-table th{white-space:nowrap;padding:var(--space-2)}

/* Website enquiry inbox: independent records, shared Siite controls. */
.website-enquiry-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,320px),1fr));gap:var(--space-4)}
.website-enquiry-card{min-width:0;overflow-wrap:anywhere}
.website-enquiry-card small{display:block}
.website-enquiry-filters{display:flex;align-items:end;flex-wrap:wrap;gap:var(--space-3);margin-block:var(--space-4)}
.website-enquiry-filters label{display:grid;gap:var(--space-2);flex:1 1 180px}
.website-enquiry-message,#websiteEnquiryDetail pre{white-space:pre-wrap;overflow-wrap:anywhere;word-break:break-word;font:inherit}
.website-enquiry-facts{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,240px),1fr));gap:var(--space-3)}
.website-enquiry-facts dd{margin:0;overflow-wrap:anywhere}.website-enquiry-facts dt{font-weight:600}
#crmWebsiteEnquiries .cards button{color:var(--ink);background:var(--surface,#fff);text-align:left;display:grid;gap:var(--space-2)}
#crmWebsiteEnquiries .cards strong{font-size:var(--text-3xl);font-weight:600}
#crmWebsiteEnquiries button,#crmWebsiteEnquiries select,#crmWebsiteEnquiries input{min-height:var(--control-md)}

/* Usability 278 (4 Oct): on a touch screen, every button is a glove-sized
   target. A later "button{min-height:40px}" undercut the 44px control size,
   and mini buttons were 12px text. The decorative camera frame on Today is
   hidden on phones so the actions start above the fold. */
@media (pointer: coarse) {
  button, button.mini, .text-button, .button-link { min-height: 48px; }
  button.mini { font-size: var(--text-base); padding-inline: var(--space-4); }
  .today-clock-panel .text-button { padding: 12px 8px; font-size: var(--text-base); }
  .schema-field > span, .dialog-field span { font-size: var(--text-lg); }
  /* Audit 279: round and square icon buttons keep their own shape. */
  .user-button, .context-ai-head .icon-btn, .evidence-viewer-close, .photo-viewer-close, .context-ai-button, .toast button { min-height: 0; }
}
/* Voice 311: the phone assistant's call list on the Enquiries tab. */
.voice-reception-panel{margin-bottom:var(--space-3)}
.voice-call-row{border-bottom:1px solid var(--line);padding:10px 0}
.voice-call-row:last-child{border-bottom:0}
.voice-call-row p{margin:4px 0}
.voice-call-row small{display:block;color:var(--muted,#5b6472);margin-bottom:6px}

/* WhatsApp 314: the WhatsApp section inside the Phone assistant panel */
.voice-whatsapp-section { margin: var(--space-3) 0 var(--space-4); padding: var(--space-3) var(--space-3); border: 1px solid var(--line); border-radius: var(--r-md); background: var(--surface-soft); }
.voice-whatsapp-section h4 { margin: 0 0 4px; font-size: var(--text-lg); }
.voice-whatsapp-row .pill { margin-left: 4px; }

/* Forms 319: a reviewer's correction on a submitted form. */
.form-correction-fields{display:grid;gap:10px}
.form-correction-field.changed{border-color:var(--blue)!important;background:var(--info-bg)!important}
.form-correction-field.changed>span::after{content:"Changed";margin-left:8px;font-size:var(--text-xs);font-weight:600;color:var(--blue);text-transform:uppercase;letter-spacing:.1em}
.form-correction-field>small{font-weight:600;overflow-wrap:anywhere}
.form-correction-reason textarea{margin-top:0}
.review-answers .form-answer-corrected{border-color:var(--blue);background:var(--info-bg)}
.review-answers .form-answer-corrected>span{color:var(--ink);font-weight:600;overflow-wrap:anywhere}
.review-answers .form-answer-corrected small{display:block;margin-top:4px;color:var(--muted);font-size:var(--text-xs);font-weight:500}
.form-corrections-panel .state-row span{overflow-wrap:anywhere}

/* ————— Dictate your diary (Diary 323) ————— */
.diary-dictation{display:flex;flex-direction:column;gap:var(--space-3)}
/* Audit LM-02: the head wraps. Its button row was flex:none and 387px wide,
   so on a phone the words were squeezed to one per line and the mic hung half
   off the screen. The words take the row; the buttons drop beneath them. */
.diary-dictation-head{display:flex;align-items:center;justify-content:space-between;gap:var(--space-3);flex-wrap:wrap}
.diary-dictation-head>div{display:flex;flex-direction:column;gap:2px;min-width:0;flex:1 1 260px}
.diary-dictation-head small{color:var(--muted)}
.diary-mic{flex:none;min-width:112px;min-height:56px;border-radius:28px;font-weight:700;font-size:var(--text-base)}
.diary-mic.live{background:var(--bad);color:#fff;animation:diaryMicPulse 1.4s ease-in-out infinite}
@keyframes diaryMicPulse{0%,100%{box-shadow:0 0 0 0 rgba(180,35,24,.35)}50%{box-shadow:0 0 0 12px rgba(180,35,24,0)}}
.diary-dictation-notes{display:flex;flex-direction:column;gap:4px;border-left:3px solid var(--blueprint);padding-left:var(--space-3)}
.diary-dictation-notes small{color:var(--ink);overflow-wrap:anywhere}
.diary-dictation-actions{display:flex;flex-wrap:wrap;gap:var(--space-2)}
.diary-dictation-questions{display:flex;flex-direction:column;gap:var(--space-2)}
.diary-dictation-question{display:flex;align-items:center;justify-content:space-between;gap:var(--space-3);border:1px solid var(--line);border-radius:var(--r-xs);padding:var(--space-2) var(--space-3);flex-wrap:wrap}
.diary-dictation-question>span:first-child{display:flex;flex-direction:column;gap:2px;min-width:0}
.diary-dictation-question small{color:var(--muted);font-size:var(--text-xs)}
.diary-dictation-question-actions{display:flex;gap:var(--space-2);flex:none}
.diary-dictation-notes.live{border-left-color:var(--bad)}
.diary-dictation-head-actions{display:flex;align-items:center;gap:var(--space-2);flex:0 1 auto;flex-wrap:wrap;justify-content:flex-end;max-width:100%}
@media(max-width:760px){
  .diary-dictation-head-actions{flex:1 1 100%;justify-content:flex-start}
  .diary-dictation-head-actions .diary-mic{flex:1 1 100%;order:-1}
}

/* WhatsApp 319: customer WhatsApp conversations in Messages */
.message-channel.whatsapp-channel .message-channel-icon { color: var(--ink); }
.whatsapp-handling { display: inline-flex; align-items: center; gap: var(--space-1); font-size: var(--text-sm); color: var(--muted); }
.whatsapp-handling select { font-size: var(--text-sm); }
.team-message.whatsapp-customer { border-left: 3px solid var(--line); }

/* WhatsApp 320: team messages on WhatsApp */
.team-whatsapp-strip { display: flex; flex-wrap: wrap; align-items: center; gap: var(--space-2); }
.team-whatsapp-strip code { font-size: var(--text-sm); }
.voice-whatsapp-team { margin-top: var(--space-3); padding-top: var(--space-3); border-top: 1px solid var(--line); }

/* Messages 322: who a message reached, under the sender's own messages */
.message-reach { margin-top: var(--space-1); font-size: var(--text-xs); color: var(--muted); }
.message-reach-app { color: var(--warning, var(--muted)); }

/* Messages 324: who is in a channel, and its settings */
.message-group-manage { display: grid; gap: var(--space-2); padding: var(--space-2) 0 0; border-top: 1px solid var(--line); }
.message-group-toggle { display: flex; align-items: flex-start; gap: var(--space-2); cursor: pointer; }
.message-group-toggle input { margin-top: 3px; }
.message-group-toggle small { display: block; color: var(--muted); }
.message-project-contact-list article .link-button { flex: none; }

/* Plant 329: the pre-use check strip under the clock panel while clocked in */
.today-plant-strip { display: flex; flex-wrap: wrap; align-items: center; gap: var(--space-2); margin-top: var(--space-2); padding: var(--space-2) var(--space-3); border: 1px solid var(--line); border-radius: var(--r-xs); background: var(--surface-soft); color: var(--ink); }
.today-plant-strip span { flex: 1 1 220px; }

/* Materials 330: a project's ordered materials, ticked off as they arrive */
.materials-summary { display: flex; flex-wrap: wrap; gap: var(--space-3); margin: var(--space-3) 0; color: var(--muted); }
.materials-summary strong { color: var(--ink); }
.materials-summary .bad { color: var(--bad); }
.materials-orders { display: grid; gap: var(--space-3); }
.materials-order { border: 1px solid var(--line); border-radius: var(--r-sm); background: var(--surface); padding: var(--space-3); }
.materials-order.is-complete { opacity: .82; }
.materials-order-head { display: flex; justify-content: space-between; gap: var(--space-3); align-items: flex-start; flex-wrap: wrap; margin-bottom: var(--space-2); }
.materials-order-head small { display: block; color: var(--muted); margin-top: 2px; }
.materials-order-meta { display: flex; align-items: center; gap: var(--space-2); }
.materials-lines { display: grid; gap: var(--space-1); }
.materials-line { display: flex; align-items: flex-start; gap: var(--space-2); padding: var(--space-2); border-radius: var(--r-xs); min-height: var(--control-lg); }
.materials-line:hover { background: var(--surface-soft); }
.materials-line input[type="checkbox"] { width: 24px; height: 24px; margin-top: 2px; flex: none; }
.materials-line small { display: block; color: var(--muted); }
.materials-line.is-delivered .materials-line-text { text-decoration: line-through; color: var(--muted); }
.materials-line small .bad { color: var(--bad); }
.materials-line-check { display: grid; grid-template-columns: 1fr; gap: var(--space-1); }
.materials-check-intro { color: var(--muted); }
@media (min-width: 720px) { .materials-line-check { grid-template-columns: 2fr 1fr 1fr; align-items: center; } }

/* Buying 439: deliveries on Today, Bought it already, POs at scale */
.today-delivery-list { display: grid; gap: var(--space-2); }
.today-delivery-row { display: grid; gap: var(--space-2); border: 1px solid var(--line); border-radius: var(--r-sm); background: var(--surface); padding: var(--space-3); }
.today-delivery-row.is-late { border-left: 4px solid var(--warn); }
.today-delivery-what small { display: block; color: var(--muted); margin-top: 2px; overflow-wrap: anywhere; }
.today-delivery-actions { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: var(--space-2); }
.today-delivery-actions button { min-height: var(--control-md); min-width: 0; white-space: normal; }
.today-delivery-waiting { margin-bottom: var(--space-2); }
@media (min-width: 720px) { .today-delivery-row { grid-template-columns: 1fr auto; align-items: center; } .today-delivery-actions { grid-template-columns: repeat(3, auto); } }
.po-pricing-suggestion { display: flex; flex-wrap: wrap; align-items: center; gap: var(--space-2); margin-top: var(--space-1); color: var(--muted); }
.po-pricing-suggestion:empty { display: none; }
.po-retrospective-switch { display: inline-flex; align-items: center; gap: var(--space-2); min-height: var(--control-md); }
.po-retrospective-switch input { width: 22px; height: 22px; }

/* Programme 331: done items, with their evidence, under the working queue */
.programme-control-done { margin-top: var(--space-3); border-top: 1px solid var(--line); padding-top: var(--space-2); }
.programme-control-done summary { cursor: pointer; font-weight: 600; }
.programme-control-done summary span { color: var(--muted); font-weight: 400; margin-left: var(--space-1); }
.programme-control-row.is-done { opacity: .85; }

/* Sales 340: the outcome of a follow-up call, on the call list */
.voice-sales-outcome { display: block; margin-top: var(--space-1); color: var(--muted); }
.voice-sales-outcome .pill { margin-right: var(--space-1); }

/* ————— Client progress update (Reports 382) ————— */
.client-update-sheet{position:fixed;inset:0;z-index:1200;background:rgba(13,27,42,.45);display:flex;align-items:flex-start;justify-content:center;padding:var(--space-4);overflow-y:auto}
.client-update-card{background:var(--panel,#fff);border-radius:var(--r-md);max-width:860px;width:100%;padding:var(--space-4);display:flex;flex-direction:column;gap:var(--space-3);margin:var(--space-4) 0;box-shadow:0 18px 50px rgba(13,27,42,.25)}
.client-update-head{display:flex;align-items:flex-start;justify-content:space-between;gap:var(--space-3)}
.client-update-head>div{display:flex;flex-direction:column;gap:2px}
.client-update-field{display:flex;flex-direction:column;gap:4px}
.client-update-field>span{font-weight:600;font-size:var(--text-sm)}
.client-update-field textarea{width:100%;resize:vertical}
.client-update-photos strong{display:block;margin-bottom:var(--space-2)}
.client-update-photo-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(210px,1fr));gap:var(--space-2)}
.client-update-photo{position:relative;border:2px solid var(--line);border-radius:var(--r-xs);padding:0;overflow:hidden;background:none;cursor:pointer;opacity:.55}
.client-update-photo img{display:block;width:100%;height:96px;object-fit:cover}
.client-update-photo label{display:block;padding:6px;font-size:var(--text-sm);line-height:var(--leading-snug)}
.client-update-photo input:not([type="checkbox"]){width:100%;min-height:var(--control-md);box-sizing:border-box}
.client-update-photo small{display:block;padding:2px 6px;font-size:var(--text-xs);color:var(--muted);text-align:left}
.client-update-photo.picked{border-color:var(--blueprint);opacity:1}
.client-update-photo.picked::after{content:'✓';position:absolute;top:4px;right:4px;width:20px;height:20px;border-radius:50%;background:var(--blueprint);color:#fff;font-size: var(--text-xs);line-height:20px;text-align:center}
.client-update-actions{display:flex;justify-content:flex-end;gap:var(--space-2);flex-wrap:wrap}
.report-photo-strip{display:grid;grid-template-columns:repeat(auto-fill,minmax(150px,1fr));gap:var(--space-2);margin-top:var(--space-2)}
.report-photo-strip figure{margin:0}
.report-photo-strip img{display:block;width:100%;height:110px;object-fit:cover;border-radius:var(--r-xs)}
.report-photo-strip figcaption{font-size:var(--text-xs);color:var(--muted);padding-top:2px}
.report-section-actions{margin:var(--space-2) 0}
@media print{.report-photo-strip{grid-template-columns:repeat(3,1fr)}.report-section-actions{display:none}}
/* ===========================================================================
   Calendar 372 — shared cross-site diary (month / week / day)
   Colours come from --cal-colour (per project) set inline; everything else is
   on the design tokens so light and dark both read correctly.
   =========================================================================== */
.cal-toolbar { display:flex; flex-wrap:wrap; gap:var(--space-3); align-items:center; justify-content:space-between; margin-bottom:var(--space-3); }
.cal-toolbar-left, .cal-toolbar-right { display:flex; flex-wrap:wrap; gap:var(--space-2); align-items:center; }
.cal-nav { display:inline-flex; gap:var(--space-1); }
.cal-nav button, .cal-today { padding:var(--space-2) var(--space-2); }
.cal-period { font-size:var(--text-lg); color:var(--ink); }
.cal-project-filter { max-width:230px; }
.cal-legend { display:flex; flex-wrap:wrap; gap:var(--space-2); margin-bottom:var(--space-3); }
.cal-legend-item { display:inline-flex; align-items:center; gap:var(--space-2); font-size:var(--text-xs); color:var(--muted); }
.cal-legend-dot { width:10px; height:10px; border-radius:var(--radius-xs); display:inline-block; }

/* Month grid */
.cal-dow-row, .cal-grid { display:grid; grid-template-columns:repeat(7,minmax(0,1fr)); gap:1px; }
.cal-dow-row { margin-bottom:1px; }
.cal-dow { text-align:center; font-size:var(--text-xs); color:var(--muted); padding:4px 0; font-weight:600; }
.cal-grid { background:var(--line); border:1px solid var(--line); border-radius:var(--radius-md); overflow:hidden; }
.cal-cell { background:var(--surface); min-height:104px; padding:var(--space-1); display:flex; flex-direction:column; gap:var(--space-1); min-width:0; }
.cal-cell.cal-outside { background:var(--bg); }
.cal-cell.cal-weekend { background:color-mix(in srgb, var(--bg) 60%, var(--surface)); }
.cal-cell.cal-today-cell { outline:2px solid var(--blueprint); outline-offset:-2px; }
.cal-daynum { align-self:flex-start; border:0; background:transparent; color:var(--muted); font:inherit; font-size:var(--text-xs); cursor:pointer; padding:2px var(--space-1); border-radius:var(--r-pill); }
.cal-daynum { position:relative; }
/* Audit LD22/LM-18: the day number is drawn small, but its press area is a
   44px square, so a thumb that lands near it still opens the day. */
.cal-daynum::after { content:""; position:absolute; left:50%; top:50%; width:var(--control-sm); height:var(--control-sm); transform:translate(-50%,-50%); }
/* Audit LM-19: in the month grid the WHOLE cell opens the day - the day
   number's press area stretches over its cell (one button, so it is still one
   tab stop and one spoken label). Meetings and "+n more" sit above it. */
.cal-cell { position:relative; }
.cal-cell > .cal-daynum { position:static; }
.cal-cell > .cal-daynum::after { left:0; top:0; right:0; bottom:0; width:auto; height:auto; transform:none; }
.cal-cell > .cal-chip, .cal-cell > .cal-more { position:relative; z-index:1; }
.cal-cell.cal-today-cell .cal-daynum { background:var(--blueprint); color:#fff; font-weight:700; }
.cal-outside .cal-daynum { opacity:.5; }
.cal-more { align-self:flex-start; border:0; background:transparent; color:var(--blueprint); font:inherit; font-size:var(--text-xs); cursor:pointer; padding:0 4px; }

/* Chips (shared by month + week) */
.cal-chip { display:flex; align-items:center; gap:var(--space-1); width:100%; min-width:0; font-size:var(--text-xs); line-height:var(--leading-tight); padding:2px var(--space-2); border-radius:var(--radius-xs); background:color-mix(in srgb, var(--cal-colour) 14%, var(--surface)); border-left:3px solid var(--cal-colour); color:var(--ink); text-align:left; }
.cal-chip-open { cursor:pointer; }
.cal-chip-open:hover { background:color-mix(in srgb, var(--cal-colour) 26%, var(--surface)); }
.cal-chip-dot { flex:0 0 auto; width:7px; height:7px; border-radius:var(--r-pill); background:var(--cal-colour); }
.cal-chip-time { flex:0 0 auto; font-variant-numeric:tabular-nums; color:var(--muted); font-weight:600; }
.cal-chip-label { flex:1 1 auto; min-width:0; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
/* Visual 455 (V3-24): never under 12px - the type token, not 10px. */
.cal-chip-code { flex:0 0 auto; font-size:var(--text-xs); color:var(--muted); background:var(--bg); border-radius:var(--radius-xs); padding:0 4px; }
.cal-kind-action .cal-chip-label, .cal-kind-valuation-due .cal-chip-label { font-weight:600; }

/* Week view */
.cal-week { display:grid; grid-template-columns:repeat(7,minmax(0,1fr)); gap:var(--space-2); }
.cal-weekday { border:1px solid var(--line); border-radius:var(--radius-md); background:var(--surface); display:flex; flex-direction:column; min-height:160px; overflow:hidden; }
.cal-weekday.cal-today-cell { border-color:var(--blueprint); box-shadow:inset 0 0 0 1px var(--blueprint); }
.cal-weekday-head { padding:6px; border-bottom:1px solid var(--line); }
.cal-weekday-head .cal-daynum { font-size:var(--text-sm); color:var(--ink); border-radius:var(--radius-xs); }
.cal-weekday-items { display:flex; flex-direction:column; gap:var(--space-1); padding:var(--space-1); overflow:auto; }
.cal-empty { color:var(--muted); font-size:var(--text-xs); padding:4px; }

/* Day view */
.cal-day { display:flex; flex-direction:column; gap:var(--space-2); }
.cal-day-row { display:flex; align-items:center; gap:var(--space-2); padding:var(--space-2) var(--space-3); border:1px solid var(--line); border-left:4px solid var(--cal-colour); border-radius:var(--radius-md); background:var(--surface); }
.cal-day-row.cal-chip-open { cursor:pointer; }
.cal-day-row.cal-chip-open:hover { background:color-mix(in srgb, var(--cal-colour) 10%, var(--surface)); }
.cal-day-time { flex:0 0 64px; font-variant-numeric:tabular-nums; font-weight:600; color:var(--ink); }
.cal-day-dot { flex:0 0 auto; width:9px; height:9px; border-radius:var(--r-pill); background:var(--cal-colour); }
.cal-day-kind { flex:0 0 auto; font-size:var(--text-xs); color:var(--muted); text-transform:uppercase; letter-spacing:.1em; }
.cal-day-title { flex:1 1 auto; min-width:0; color:var(--ink); }
.cal-empty-day { padding:var(--space-5); text-align:center; }

@media (max-width:720px) {
  .cal-toolbar { gap:var(--space-2); }
  .cal-cell { min-height:68px; }
  .cal-cell .cal-chip-label, .cal-cell .cal-chip-code { display:none; }
  .cal-cell .cal-chip { justify-content:center; padding:2px; }
  .cal-week { grid-template-columns:1fr; }
  .cal-weekday { min-height:auto; }
  .cal-day-time { flex-basis:52px; }
}
/* Audit LD14: the view and colour switches are the shared tab row; in the
   toolbar they sit without the page-width underline gap. */
body:not(.login-mode) .cal-toolbar .siite-tabs { margin:0; }
@media (max-width:720px) { body:not(.login-mode) .cal-toolbar .cal-colourby-label { display:none; } }
/* The global button rule gives every button a 44px bordered box. Inside the
   grid the day number and "+n more" are quiet links, so they opt out here (the
   id is what out-ranks the global rule). */
#calendar .cal-daynum, #calendar .cal-more { min-height:0; min-width:0; border:0; box-shadow:none; background:transparent; padding:2px var(--space-2); line-height:var(--leading-normal); font-weight:600; }
#calendar .cal-more { padding:0 4px; font-weight:500; color:var(--blueprint); }
#calendar .cal-cell.cal-today-cell .cal-daynum { background:var(--blueprint); color:#fff; }
#calendar .cal-nav button { min-height:var(--control-md); }
.cal-day-person { flex:0 0 auto; font-size:var(--text-xs); color:var(--muted); }
/* Week columns have height to spare and little width: wrap a title rather
   than cut it to one letter, and drop the job code first when narrow. */
.cal-weekday-items .cal-chip { align-items:flex-start; }
.cal-weekday-items .cal-chip-dot { margin-top:4px; }
.cal-weekday-items .cal-chip { flex-wrap:wrap; row-gap:1px; }
.cal-weekday-items .cal-chip-label { white-space:normal; overflow-wrap:break-word; }
.cal-weekday-items .cal-chip-time + .cal-chip-label { flex-basis:100%; }
@media (max-width:1180px) { .cal-weekday-items .cal-chip-code { display:none; } }

/* ===========================================================================
   Calendar 432 — one registry: filters, layers, agenda, spans
   =========================================================================== */
.cal-filters { margin-bottom:var(--space-3); border:1px solid var(--line); border-radius:var(--radius-md); background:var(--surface); padding:var(--space-2) var(--space-3); }
.cal-filters > summary { cursor:pointer; font-weight:600; font-size:var(--text-sm); color:var(--ink); min-height:var(--control-sm); display:flex; align-items:center; }
.cal-filter-row { display:flex; flex-wrap:wrap; gap:var(--space-2); align-items:center; margin-top:var(--space-2); }
.cal-filter-row select, .cal-filter-row .cal-search { max-width:230px; min-width:0; }
.cal-search { flex:1 1 180px; }
.cal-mine, .cal-layer-chip { border:1px solid var(--line); background:var(--surface); color:var(--muted); box-shadow:none; font-weight:600; font-size:var(--text-sm); border-radius:var(--r-pill); padding:var(--space-2) var(--space-3); min-height:var(--control-sm); display:inline-flex; align-items:center; gap:var(--space-2); }
.cal-mine.active, .cal-layer-chip.active { background:color-mix(in srgb, var(--blueprint) 10%, var(--surface)); color:var(--ink); border-color:color-mix(in srgb, var(--blueprint) 45%, var(--line)); }
.cal-layer-row { display:flex; flex-wrap:wrap; gap:var(--space-2); margin-top:var(--space-2); }
.cal-layer-swatch { width:8px; height:8px; border-radius:var(--r-pill); background:var(--muted); display:inline-block; }
.cal-layer-chip:not(.active) .cal-layer-swatch { opacity:.35; }
.cal-layer-swatch.cal-layer-meetings { background:#245f8f; }
.cal-layer-swatch.cal-layer-programme { background:#1e293b; }
.cal-layer-swatch.cal-layer-inspections { background:#7c3aed; }
.cal-layer-swatch.cal-layer-deliveries { background:#0e7490; }
.cal-layer-swatch.cal-layer-labour { background:#16a34a; }
.cal-layer-swatch.cal-layer-orders { background:#d97706; }
.cal-layer-swatch.cal-layer-info { background:#0d9488; }
.cal-layer-swatch.cal-layer-actions { background:#64748b; }
.cal-layer-swatch.cal-layer-hseq { background:#dc2626; }
.cal-layer-swatch.cal-layer-money { background:#a16207; }
.cal-layer-swatch.cal-layer-crm { background:#ec4899; }
/* Calendar 458: the layers "+ Add" brings, the type menu, the free hours of a
   day, pending leave, the Who's where board and the Outlook button. */
.cal-layer-swatch.cal-layer-leave { background:#7e22ce; }
.cal-layer-swatch.cal-layer-training { background:#b45309; }
.cal-layer-swatch.cal-layer-survey { background:#be185d; }
.cal-layer-swatch.cal-layer-company { background:#0f766e; }
.cal-layer-swatch.cal-layer-outlook { background:#94a3b8; }
.cal-type-icon { flex:0 0 auto; display:inline-flex; color:var(--cal-colour, var(--muted)); }
.cal-type-icon .siite-icon { width:13px; height:13px; }
.cal-day-row .cal-type-icon .siite-icon { width:16px; height:16px; }
.cal-chip.cal-pending, .cal-day-row.cal-pending { border-left-style:dashed; background:repeating-linear-gradient(135deg, color-mix(in srgb, var(--cal-colour) 10%, var(--surface)) 0 6px, var(--surface) 6px 12px); }
.cal-chip.cal-kind-busy, .cal-day-row.cal-kind-busy { color:var(--muted); }
.cal458-type-menu { display:grid; grid-template-columns:1fr; gap:var(--space-2); }
body:not(.login-mode) button.cal458-type { display:flex; align-items:center; gap:var(--space-3); width:100%; min-height:56px; padding:10px 12px; text-align:left; background:var(--surface); color:var(--ink); border:1px solid var(--line); border-left:4px solid var(--muted); border-radius:var(--r-md); box-shadow:none; font-weight:600; }
body:not(.login-mode) button.cal458-type:hover { background:var(--surface-sunken, #f5f7fa); }
body:not(.login-mode) button.cal458-type.cal-layer-meetings { border-left-color:#245f8f; }
body:not(.login-mode) button.cal458-type.cal-layer-inspections { border-left-color:#7c3aed; }
body:not(.login-mode) button.cal458-type.cal-layer-deliveries { border-left-color:#0e7490; }
body:not(.login-mode) button.cal458-type.cal-layer-labour { border-left-color:#16a34a; }
body:not(.login-mode) button.cal458-type.cal-layer-actions { border-left-color:#64748b; }
body:not(.login-mode) button.cal458-type.cal-layer-leave { border-left-color:#7e22ce; }
body:not(.login-mode) button.cal458-type.cal-layer-training { border-left-color:#b45309; }
body:not(.login-mode) button.cal458-type.cal-layer-survey { border-left-color:#be185d; }
body:not(.login-mode) button.cal458-type.cal-layer-company { border-left-color:#0f766e; }
.cal458-type-icon { flex:0 0 36px; height:36px; display:grid; place-items:center; border-radius:var(--r-sm); background:var(--surface-sunken, #f5f7fa); color:var(--ink); }
.cal458-type-text { display:flex; flex-direction:column; min-width:0; }
.cal458-type-text small { color:var(--muted); font-weight:500; font-size:var(--text-xs); }
.cal458-slots { display:flex; flex-wrap:wrap; align-items:center; gap:6px; margin-top:var(--space-3); }
.cal458-slots-label { color:var(--muted); font-size:var(--text-sm); font-weight:600; margin-right:4px; }
body:not(.login-mode) button.cal458-slot { min-height:var(--control-sm, 36px); padding:4px 10px; background:var(--surface); color:var(--muted); border:1px dashed var(--line); border-radius:var(--r-pill); box-shadow:none; font-weight:600; font-size:var(--text-sm); font-variant-numeric:tabular-nums; }
body:not(.login-mode) button.cal458-slot:hover { color:var(--ink); border-style:solid; }
body:not(.login-mode) button.cal-outlook { display:inline-flex; align-items:center; gap:var(--space-2); }
body:not(.login-mode) button.cal-outlook .siite-icon { width:16px; height:16px; }
body:not(.login-mode) button.cal-outlook.is-on { border-color:color-mix(in srgb, var(--good) 45%, var(--line)); }
.cal458-whos-tools, .cal458-leave-tools { display:flex; flex-wrap:wrap; align-items:center; gap:var(--space-2); margin-bottom:var(--space-3); }
.cal458-whos-tools select { max-width:100%; min-width:0; }
.cal458-whos-key { margin:0 0 var(--space-2); }
.cal458-whos-role { display:block; }
body:not(.login-mode) button.siite-matrix-cell.site { background:var(--status-info-surface); border-color:transparent; }
body:not(.login-mode) button.siite-matrix-cell.office { background:var(--status-neutral-surface); border-color:transparent; }
body:not(.login-mode) button.siite-matrix-cell.away { background:color-mix(in srgb, #7e22ce 12%, var(--surface)); color:#581c87; border-color:transparent; }
body:not(.login-mode) button.siite-matrix-cell.none { background:transparent; color:var(--muted); border:1px dashed var(--line); font-weight:500; }
.cal458-leave-facts li, .cal458-whos-facts li { background:var(--surface-sunken, #f8fafc); }
.cal-note { margin:0 0 var(--space-3); font-size:var(--text-xs); }
/* A link chip reads as a chip, not as a link. */
a.cal-chip, a.cal-day-row { text-decoration:none; color:var(--ink); }
.cal-chip.cal-critical { box-shadow:inset 0 0 0 1px color-mix(in srgb, var(--bad) 45%, transparent); }
.cal-chip.cal-milestone .cal-chip-label, .cal-day-row.cal-kind-milestone .cal-day-title { font-weight:700; }
.cal-chip.cal-alert .cal-chip-dot, .cal-day-row.cal-alert .cal-day-dot { box-shadow:0 0 0 2px color-mix(in srgb, var(--bad) 55%, transparent); }
.cal-day-main { flex:1 1 auto; min-width:0; display:flex; flex-direction:column; gap:2px; }
.cal-day-meta { font-size:var(--text-xs); color:var(--muted); overflow-wrap:anywhere; }
.cal-day-row.cal-critical { border-left-style:double; }
.cal-row-wrap { display:flex; gap:var(--space-2); align-items:stretch; }
.cal-row-wrap > .cal-day-row { flex:1 1 auto; min-width:0; }
.cal-quick-actions { display:flex; align-items:center; }
.cal-quick { white-space:nowrap; }
/* Agenda: the phone default. */
.cal-agenda { display:flex; flex-direction:column; gap:var(--space-4); }
.cal-agenda-date { font-size:var(--text-base); margin:0 0 var(--space-2); color:var(--ink); }
.cal-agenda .cal-day-row, .today-meetings .cal-day-row, .project-meetings .cal-day-row { min-height:var(--control-md); }
body:not(.login-mode) .cal-toolbar .cal-agenda-tabs { margin:0; }
/* Week: the span lane draws work that runs over several days once, across them. */
.cal-week-wrap { display:flex; flex-direction:column; gap:var(--space-2); }
.cal-week-heads, .cal-span-lane { display:grid; grid-template-columns:repeat(7,minmax(0,1fr)); gap:var(--space-2); }
.cal-week-heads .cal-weekday-head { border:1px solid var(--line); border-radius:var(--radius-md); background:var(--surface); }
.cal-week-heads .cal-weekday-head.cal-today-cell { border-color:var(--blueprint); }
.cal-weekday-head-inline { display:none; }
.cal-span-lane { row-gap:3px; }
.cal-span { min-width:0; }
.cal-span .cal-chip { width:100%; }
.cal-span-cont-left .cal-chip { border-top-left-radius:0; border-bottom-left-radius:0; }
.cal-span-cont-right .cal-chip { border-top-right-radius:0; border-bottom-right-radius:0; }
.cal-span-more { margin:0; font-size:var(--text-xs); }
.cal-week .cal-weekday { min-height:120px; }
@media (max-width:720px) {
  /* A time does not fit a phone's month cell; the dot does. */
  .cal-cell .cal-chip-time { display:none; }
  .cal-cell .cal-chip { overflow:hidden; }
  .cal-week-heads { display:none; }
  .cal-weekday-head-inline { display:block; }
  .cal-span-lane { display:flex; flex-direction:column; }
  .cal-filter-row select, .cal-filter-row .cal-search { max-width:none; flex:1 1 100%; }
  /* A row on a phone: time, then what it is over two lines, the job code at
     the end; the coloured edge already says which job or person. */
  .cal-day-row { display:grid; grid-template-columns:auto minmax(0,1fr) auto; grid-template-areas:"time main code" "time who who"; column-gap:var(--space-2); row-gap:2px; align-items:start; }
  .cal-day-row .cal-day-time { grid-area:time; flex-basis:auto; }
  .cal-day-row .cal-day-time:empty { width:0; }
  .cal-day-row .cal-day-dot { display:none; }
  .cal-day-row .cal-day-main { grid-area:main; }
  .cal-day-row .cal-chip-code { grid-area:code; }
  .cal-day-row .cal-day-person { grid-area:who; }
  .cal-row-wrap { flex-direction:column; }
}

/* ===========================================================================
   Calendar 447 — clashes, bookings on records, the director's week
   =========================================================================== */
.cal-clashes { margin:0 0 var(--space-3); padding:var(--space-2) var(--space-3); border:1px solid color-mix(in srgb, var(--warn) 35%, var(--line)); border-left:4px solid var(--warn); border-radius:var(--radius-md); background:var(--status-warning-surface); }
.cal-clashes ul { list-style:none; margin:0; padding:0; display:flex; flex-direction:column; gap:var(--space-2); }
.cal-clashes-title { margin:0 0 var(--space-2); display:flex; align-items:center; gap:var(--space-2); font-size:var(--text-sm); color:var(--warn-ink); }
.cal-clash { display:flex; flex-direction:column; gap:2px; padding-left:var(--space-2); border-left:3px solid var(--warn); }
.cal-clash strong { font-size:var(--text-sm); color:var(--ink); }
.cal-clash span { font-size:var(--text-xs); color:var(--muted); overflow-wrap:anywhere; }
.cal-clash.cal-clash-bad { border-left-color:var(--bad); }
.cal-clash-more { margin:var(--space-2) 0 0; font-size:var(--text-xs); }
.cal-clash-badge { display:inline-flex; margin-left:4px; padding:0 6px; border-radius:var(--r-pill); background:var(--status-warning-surface); color:var(--warn-ink); font-size:var(--text-xs); font-weight:700; }
.cal-record-bookings { display:flex; flex-direction:column; align-items:flex-start; gap:var(--space-2); margin-top:var(--space-2); }
.cal-record-bookings.compact { margin-top:var(--space-1); }
.cal-record-bookings .cal-clashes { margin:0; width:100%; }
.cal-record-heading { font-size:var(--text-sm); }
.cal-record-list { list-style:none; margin:0; padding:0; display:flex; flex-direction:column; gap:var(--space-1); font-size:var(--text-sm); }
.cal-record-list .link-button { min-height:var(--control-sm); text-align:left; }
.cal-director-week { display:flex; flex-direction:column; gap:var(--space-4); }
.cal-director-section h3 { margin:0 0 var(--space-1); font-size:var(--text-base); }
.cal-director-section > p.muted { margin:0 0 var(--space-2); }
.cal-director-none { margin:0; }
.cal-clash-list { padding:var(--space-2) var(--space-3); }
.cal-toolbar-right .cal-job-week { white-space:nowrap; }
/* Five views do not fit a 320px phone: the view tabs scroll inside the toolbar rather than push past the screen edge. */
.cal-toolbar-right { max-width:100%; min-width:0; }
.cal-toolbar-right > .siite-tabs { max-width:100%; min-width:0; }
.today-calendar-clashes .cal-clashes { margin-bottom:0; }

/* 15 Oct: ONE drawing viewer. Jim: "The mobile drawing viewer is much better
   than the desktop version - why don't we make the viewer capable of
   measuring?" The workspace (the measuring engine) now opens full screen on
   every device in the sheet viewer's clothes: a dark header, the sheet, and a
   bottom bar. The tools, quantities and details live in a tray - a right-hand
   panel on a desktop, a bottom sheet below that - and there is one copy of
   each control, not three. */
/* body:not(.login-mode) .panel sets panel padding site-wide and outranks a two-class rule. */
body:not(.login-mode) .drawing-viewer-panel.dv-viewer,.drawing-viewer-panel.dv-viewer{position:fixed;inset:0;z-index:120;margin:0;padding:0;border:0;width:100vw;height:100dvh;max-height:100dvh;display:flex;flex-direction:column;overflow:hidden;background:var(--ink);color:#fff;box-shadow:var(--elev-0);overscroll-behavior:contain}
.drawing-viewer-panel.dv-viewer>*{flex:none}
.drawing-viewer-panel.dv-viewer>.panel-title,.drawing-viewer-panel.dv-viewer>.drawing-workspace-panes,.drawing-viewer-panel.dv-viewer .drawing-stage-toolbar,.drawing-viewer-panel.dv-viewer .drawing-tool-rail,.drawing-viewer-panel.dv-viewer .measure-zoom-row,.drawing-viewer-panel.dv-viewer select[data-drawing-measure-mode]{display:none !important}
.drawing-viewer-panel.dv-viewer>.state-row{margin:0}
.dv-bar{display:grid;grid-template-columns:var(--control-md) minmax(0,1fr) auto;align-items:center;gap:10px;padding:8px 12px 8px 8px;padding-top:calc(8px + env(safe-area-inset-top,0px));background:rgba(15,23,42,.96);border-bottom:1px solid rgba(255,255,255,.08)}
.dv-bar .dv-close{width:var(--control-md);height:var(--control-md);border:0;border-radius:var(--r-pill);background:rgba(255,255,255,.12);color:#fff;font-size:var(--text-3xl);line-height:var(--leading-none);box-shadow:var(--elev-0);padding:0}
.dv-title{display:grid;min-width:0}
.dv-title strong{font-size:var(--text-base);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.dv-title span{font-size:var(--text-xs);color:rgba(255,255,255,.72);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.dv-pills{display:flex;gap:6px;flex-wrap:nowrap;min-width:0;overflow:hidden}
.dv-pills .pill{white-space:nowrap}
.drawing-viewer-panel.dv-viewer:not([data-tray="tools"]) .dv-guidance{display:none}
.dv-guidance:empty{display:none}
.drawing-viewer-panel.dv-viewer>.drawing-viewer-grid{flex:1 1 auto;min-height:0;display:grid;grid-template-columns:minmax(0,1fr);gap:0;align-items:stretch;position:relative}
.drawing-viewer-panel.dv-viewer>.drawing-viewer-grid>div:first-child{min-width:0;min-height:0;height:100%;position:relative}
.drawing-viewer-panel.dv-viewer .drawing-measure-stage{height:100%;max-height:none;min-height:0;border:0;background:var(--blue-deep);box-shadow:var(--elev-0)}
/* The sheet sits in the middle when it is smaller than the screen, and scrolls
   from its own edge when it is larger (auto margins collapse to zero then). */
.drawing-viewer-panel.dv-viewer .drawing-measure-stage{display:flex;padding:16px;touch-action:none;overscroll-behavior:contain}
.drawing-viewer-panel.dv-viewer .drawing-page-spacer{flex:none;margin:auto}
/* The tray. Closed, the sheet has the whole screen. */
.drawing-viewer-panel.dv-viewer[data-tray=""] .drawing-meta{display:none}
.drawing-viewer-panel.dv-viewer:not([data-tray=""]) .drawing-meta{display:block;position:relative;top:auto;max-height:none;height:100%;overflow:auto;border:0;border-left:1px solid rgba(255,255,255,.12);background:var(--panel);color:var(--ink);padding:0 var(--space-3) var(--space-3)}
.drawing-viewer-panel.dv-viewer:not([data-tray="tools"]) .drawing-tool-shell{display:none}
.drawing-viewer-panel.dv-viewer[data-tray="quantities"] .drawing-quantities-pane{display:block}
.drawing-viewer-panel.dv-viewer:not([data-tray="details"]) .drawing-meta-details,.drawing-viewer-panel.dv-viewer:not([data-tray="details"]) .dv-compare{display:none}
.dv-tray-head{position:sticky;top:0;z-index:2;display:flex;align-items:center;gap:6px;margin:0 calc(-1 * var(--space-3)) var(--space-2);padding:8px var(--space-3);background:var(--panel);border-bottom:1px solid var(--line)}
.dv-tray-tabs{display:flex;gap:6px;flex:1 1 auto;min-width:0;overflow-x:auto}
.dv-tray-tabs button{min-height:var(--control-md);white-space:nowrap}
.drawing-viewer-panel.dv-viewer .dv-tray-tabs button[aria-pressed="true"]{background:var(--blue);color:#fff}
.drawing-viewer-panel.dv-viewer .dv-tray-tabs button[aria-pressed="false"]{background:transparent;color:var(--ink);border:1px solid var(--line);box-shadow:var(--elev-0)}
.dv-tray-head .dv-tray-size,.dv-tray-head .dv-tray-close{flex:none;min-width:var(--control-md);min-height:var(--control-md);padding:0;background:transparent;color:var(--ink);border:1px solid var(--line);box-shadow:var(--elev-0);font-size:var(--text-lg)}
.drawing-viewer-panel.dv-viewer .drawing-tool-head p{display:none}
@media(min-width:1101px){
  .drawing-viewer-panel.dv-viewer:not([data-tray=""])>.drawing-viewer-grid{grid-template-columns:minmax(0,1fr) 360px}
  .dv-tray-head .dv-tray-size{display:none}
}
/* Below a desktop the tray is a sheet over the bottom of the drawing; once a
   tool is chosen it steps down to a strip of tools so the sheet is free to tap. */
@media(max-width:1100px){
  .drawing-viewer-panel.dv-viewer:not([data-tray=""]) .drawing-meta{position:absolute;left:0;right:0;bottom:0;height:auto;max-height:62%;border-left:0;border-top:1px solid var(--line);border-radius:var(--r-md) var(--r-md) 0 0;box-shadow:var(--elev-3);z-index:5}
  .drawing-viewer-panel.dv-viewer[data-tray-size="peek"] .drawing-meta{max-height:none;overflow:visible}
  .drawing-viewer-panel.dv-viewer[data-tray-size="peek"] .drawing-measure-tool>:not(.measure-mode-row[aria-label="Drawing tools"]):not(.mode-panel.active):not(.drawing-measure-result),.drawing-viewer-panel.dv-viewer[data-tray-size="peek"] .drawing-side-lists{display:none}
  .drawing-viewer-panel.dv-viewer[data-tray-size="peek"] .measure-mode-row[aria-label="Drawing tools"]{display:flex;flex-wrap:nowrap;overflow-x:auto;gap:6px;margin:0}
  .drawing-viewer-panel.dv-viewer[data-tray-size="peek"] .measure-mode-row[aria-label="Drawing tools"] button{flex:0 0 auto;width:auto}
  /* The strip: the tools, the active tool's one-line hint and the button that
     finishes it (area, count), and the last result - nothing that hides the sheet. */
  .drawing-viewer-panel.dv-viewer[data-tray-size="peek"] .mode-panel.active>:not(p.muted):not(.dv-panel-actions){display:none}
  .drawing-viewer-panel.dv-viewer[data-tray-size="peek"] .mode-panel.active>p.muted,.drawing-viewer-panel.dv-viewer[data-tray-size="peek"] .drawing-measure-result{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;margin:6px 0 0;font-size:var(--text-sm)}
  .drawing-viewer-panel.dv-viewer[data-tray-size="peek"] .drawing-measure-result *{display:inline}
}
/* The bottom bar: sheets either side, then Fit / Measure / Quantities / More. */
/* A nav is a column site-wide; this one is a row. */
.dv-actions{display:flex;flex-direction:row;flex-wrap:nowrap;align-items:center;gap:8px;padding:8px 10px calc(8px + env(safe-area-inset-bottom,0px));background:rgba(15,23,42,.96);border-top:1px solid rgba(255,255,255,.08)}
.dv-sheet-nav{display:flex;align-items:center;gap:4px;flex:none}
.dv-count{font-variant-numeric:tabular-nums;color:rgba(255,255,255,.72);font-size:var(--text-sm);padding:0 4px;white-space:nowrap}
.dv-buttons{display:flex;align-items:center;gap:6px;margin-left:auto;min-width:0}
.drawing-viewer-panel.dv-viewer .dv-actions button,.drawing-viewer-panel.dv-viewer .dv-actions summary{min-height:var(--control-md);min-width:var(--control-md);background:rgba(255,255,255,.14);color:#fff;border:0;box-shadow:var(--elev-0);border-radius:var(--r-md);padding:0 12px;font-weight:600;white-space:nowrap;display:inline-flex;align-items:center;justify-content:center;cursor:pointer}
.drawing-viewer-panel.dv-viewer .dv-actions .dv-step{font-size:var(--text-2xl);line-height:var(--leading-none);padding:0}
.drawing-viewer-panel.dv-viewer .dv-actions button:disabled{opacity:.35}
/* Audit V2-36 (Visual 454): Measure was a third button colour (blueprint
   blue). It is the viewer's one main action, so it takes the primary tier
   (the rust CTA); pressed, it turns white like the other tray buttons. */
.drawing-viewer-panel.dv-viewer .dv-actions .dv-measure{background:var(--cta);color:var(--cta-ink)}
.drawing-viewer-panel.dv-viewer .dv-actions .dv-tray-button[aria-pressed="true"]{background:#fff;color:var(--ink)}
.dv-actions .drawing-page-picker:empty{display:none}
.dv-actions .drawing-page-picker{color:rgba(255,255,255,.85);font-size:var(--text-sm)}
.dv-more{position:relative}
.dv-more>summary{list-style:none}
.dv-more>summary::-webkit-details-marker{display:none}
.dv-more-menu{position:absolute;right:0;bottom:calc(100% + 8px);z-index:6;display:grid;gap:4px;min-width:200px;padding:6px;background:var(--panel);border:1px solid var(--line);border-radius:var(--r-md);box-shadow:var(--elev-3)}
.dv-more-menu button,.dv-more-menu .button-like{min-height:var(--control-md);justify-content:flex-start;text-align:left;background:transparent;color:var(--ink);border:0;box-shadow:var(--elev-0);padding:0 12px;border-radius:var(--r-sm);text-decoration:none;display:flex;align-items:center}
.dv-more-menu button:hover,.dv-more-menu .button-like:hover{background:#eef4fa}
@media(max-width:760px){
  .dv-pills .pill:nth-child(n+2){display:none}
  .dv-actions{gap:6px;padding-inline:8px;row-gap:6px}
  /* Audit LM-03: a multi-page PDF adds its page picker to the bar, and the
     one row grew to 544px inside a 390 panel, pushing Mark, Measure and More
     (and Fit, at 320) off the edge. With a page picker the bar may take two
     rows: sheet and page controls first, the tools beneath them,
     right-aligned. A single-page sheet keeps its one row. */
  .dv-actions:has(.drawing-page-picker:not(:empty)){flex-wrap:wrap}
  .dv-buttons{flex-wrap:nowrap}
  .drawing-viewer-panel.dv-viewer .dv-actions button,.drawing-viewer-panel.dv-viewer .dv-actions summary{padding:0 10px}
}

/* 16 Oct, release 2: the calm viewer. Jim: "I can't see the drawing or use
   this properly due to all the overlays / warning messages." Nothing sits
   between the header and the sheet now. The sheet status (superseded,
   orientation, scale) is the header badges, worst first, and pressing them
   opens the detail. The step in hand is one line floating over the top of the
   sheet, its explanation behind the ?. */
.drawing-viewer-panel.dv-viewer .dv-bar{position:relative;z-index:7}
.dv-bar .dv-pills{display:flex;align-items:center;justify-content:flex-end;gap:6px;min-width:0;min-height:var(--control-md);padding:4px 6px;overflow:hidden;background:transparent;color:#fff;border:0;border-radius:var(--r-md);box-shadow:var(--elev-0);cursor:pointer}
.dv-bar .dv-pills:hover,.dv-bar .dv-pills[aria-expanded="true"]{background:rgba(255,255,255,.12)}
.dv-pills-more{display:none;font-size:var(--text-xs);font-weight:700;color:rgba(255,255,255,.85)}
.dv-notices{position:absolute;top:calc(100% + 6px);right:8px;width:min(440px,calc(100vw - 16px));max-height:min(70dvh,560px);overflow:auto;display:grid;gap:var(--space-2);padding:var(--space-3);background:var(--panel);color:var(--ink);border:1px solid var(--line);border-radius:var(--r-md);box-shadow:var(--elev-3)}
.dv-notices[hidden]{display:none}
.dv-notices-head{display:flex;align-items:center;justify-content:space-between;gap:8px}
.dv-bar .dv-notices-close{min-width:var(--control-md);min-height:var(--control-md);padding:0;background:transparent;color:var(--ink);border:1px solid var(--line);box-shadow:var(--elev-0);font-size:var(--text-lg)}
.dv-notices .state-row,.dv-notices .drawing-guidance-strip,.dv-notices .button-row{margin:0}
.dv-notices [data-drawing-mirror-banner]:empty,.dv-notices [data-dv-notice-scale]:empty{display:none}
.dv-notices [data-dv-notice-scale]{display:grid;gap:var(--space-2)}
@media(max-width:760px){
  .dv-pills-more{display:inline}
}
/* The step hint over the sheet. */
.drawing-viewer-panel.dv-viewer .dv-stage-wrap{position:relative}
.drawing-viewer-panel.dv-viewer .dv-guidance{position:absolute;top:10px;left:50%;transform:translateX(-50%);z-index:4;width:max-content;max-width:min(620px,calc(100% - 24px));pointer-events:none}
.drawing-viewer-panel.dv-viewer .dv-guidance .drawing-guidance-strip{pointer-events:auto;margin:0;display:flex;flex-direction:row;flex-wrap:wrap;align-items:center;gap:4px 10px;padding:4px 4px 4px 14px;border-radius:var(--r-md);box-shadow:var(--elev-2);font-size:var(--text-sm)}
.drawing-viewer-panel.dv-viewer .dv-guidance .drawing-guidance-strip>strong{flex:1 1 auto;min-width:0;font-size:var(--text-sm);letter-spacing:0;text-transform:none}
.drawing-viewer-panel.dv-viewer .dv-guidance .drawing-guidance-strip>span{display:none;order:3;flex:1 1 100%;padding:0 10px 6px 0;color:var(--ink)}
.drawing-viewer-panel.dv-viewer .dv-guidance .drawing-guidance-strip.open>span{display:block}
.drawing-viewer-panel.dv-viewer .dv-guidance .drawing-guidance-strip>.button-row{order:4;flex:1 1 100%;margin:0 0 4px}
.drawing-viewer-panel.dv-viewer .dv-guidance .dv-hint-more{order:2;flex:none;width:32px;height:32px;min-height:32px;min-width:32px;padding:0;border:0;border-radius:var(--r-pill);background:rgba(15,23,42,.08);color:inherit;box-shadow:var(--elev-0);font-weight:700}
.drawing-viewer-panel.dv-viewer .dv-guidance .drawing-guidance-strip.is-good{display:none}
@media(pointer:coarse){
  .drawing-viewer-panel.dv-viewer .dv-guidance .dv-hint-more{width:var(--control-md);height:var(--control-md);min-width:var(--control-md);min-height:var(--control-md)}
}
/* The tools: one grid under four headings, short names, nothing repeated.
   Scale settings, layers and zones fold away; the point nudges show only
   when a point can be selected. */
.drawing-viewer-panel.dv-viewer .drawing-tool-head{display:none}
.drawing-viewer-panel.dv-viewer .measure-mode-row[aria-label="Drawing tools"]{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:6px;margin:0 0 var(--space-2)}
.drawing-viewer-panel.dv-viewer .measure-mode-row[aria-label="Drawing tools"] button{width:auto;min-width:0;min-height:38px;padding:2px 6px;font-size:var(--text-sm);line-height:var(--leading-tight);white-space:normal;overflow-wrap:anywhere}
.dv-tool-group{grid-column:1/-1;margin-top:6px;font-size:var(--text-xs);font-weight:600;letter-spacing:.1em;text-transform:uppercase;color:var(--muted)}
@media(pointer:coarse){
  .drawing-viewer-panel.dv-viewer .measure-mode-row[aria-label="Drawing tools"] button{min-height:var(--control-md)}
}
.dv-tool-more{margin:0 0 var(--space-2);padding:0 var(--space-2);border:1px solid var(--line);border-radius:var(--r-md)}
.dv-tool-more>summary{display:flex;align-items:center;min-height:var(--control-sm);font-size:var(--text-sm);font-weight:600;cursor:pointer}
.dv-tool-more[open]{padding-bottom:var(--space-2)}
.drawing-viewer-panel.dv-viewer .drawing-measure-tool:not(:has(.mode-panel[data-mode-panel="select"].active)) .measure-nudge-pad{display:none}
.drawing-viewer-panel.dv-viewer[data-tray-size="peek"] .dv-tool-group{display:none}
/* A save message in the viewer sits above the bottom bar, not over it, and
   is smaller: it is a receipt, not a wall. */
body.drawing-fullscreen-active .toast-host{bottom:calc(76px + env(safe-area-inset-bottom,0px))}
body.drawing-fullscreen-active .toast{padding:10px 40px 10px 12px;font-size:var(--text-sm);font-weight:600}

/* 16 Oct, release 2: the phone viewer's red pen, marks, acknowledgement and
   sheet strip, inside the one viewer. */
.drawing-viewer-panel.dv-viewer .dv-actions .dv-count{min-width:var(--control-md);padding:0 8px;background:transparent;color:rgba(255,255,255,.85);font-weight:600;font-variant-numeric:tabular-nums}
.drawing-viewer-panel.dv-viewer .dv-actions .dv-count[aria-expanded="true"]{background:rgba(255,255,255,.14)}
.drawing-viewer-panel.dv-viewer .dv-actions .dv-mark[aria-pressed="true"]{background:var(--bad);color:#fff}
.drawing-viewer-panel.dv-viewer .dv-actions .dv-ack{background:var(--blue);color:#fff}
.dv-actions .dv-acked{white-space:nowrap}
.dv-sheet-strip{display:flex;gap:8px;overflow-x:auto;padding:8px 10px;background:rgba(15,23,42,.96);border-top:1px solid rgba(255,255,255,.08);scrollbar-width:thin}
.dv-sheet-strip[hidden]{display:none}
.drawing-viewer-panel.dv-viewer .dv-sheet-strip .dv-thumb{flex:0 0 auto;width:84px;min-height:var(--control-md);display:grid;gap:3px;padding:3px;background:transparent;color:rgba(255,255,255,.72);border:2px solid transparent;border-radius:var(--r-sm);box-shadow:var(--elev-0);font-size:var(--text-xs);font-weight:600}
.dv-thumb img,.dv-thumb i{display:block;width:100%;height:56px;object-fit:cover;border-radius:var(--r-xs);background:rgba(255,255,255,.9)}
.dv-thumb span{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.drawing-viewer-panel.dv-viewer .dv-sheet-strip .dv-thumb.active{border-color:rgba(255,255,255,.85);color:#fff}
.dv-more-menu .dv-more-quantities{display:none}
.dv-ink{position:absolute;inset:0;z-index:5;touch-action:none;cursor:crosshair}
.dv-ink[hidden]{display:none}
.drawing-viewer-panel.dv-viewer.dv-marking .dv-guidance{display:none}
.dv-ink-bar{position:absolute;left:50%;bottom:12px;transform:translateX(-50%);z-index:6;display:flex;align-items:center;gap:8px;width:max-content;max-width:calc(100% - 24px);padding:6px 6px 6px 14px;background:rgba(15,23,42,.94);color:#fff;border-radius:var(--r-md);box-shadow:var(--elev-3)}
.dv-ink-bar span{font-size:var(--text-sm);color:rgba(255,255,255,.8);white-space:nowrap}
.drawing-viewer-panel.dv-viewer .dv-ink-bar button,.drawing-viewer-panel.dv-viewer .dv-ink-bar button.secondary{min-height:var(--control-md);background:rgba(255,255,255,.14);color:#fff;border:0;box-shadow:var(--elev-0)}
.drawing-viewer-panel.dv-viewer .dv-ink-bar button[data-ink-send]{background:var(--blueprint)}
.drawing-viewer-panel.dv-viewer .dv-ink-bar button:disabled{opacity:.35}
.drawing-measure-svg polyline.sheet-mark{fill:none;stroke:var(--bad);stroke-width:3;stroke-linecap:round;stroke-linejoin:round;vector-effect:non-scaling-stroke}
.drawing-mark-badge{position:absolute;z-index:3;transform:translate(-50%,-50%);display:grid;place-items:center;width:24px;height:24px;border:2px solid #fff;border-radius:var(--r-pill);background:var(--bad);color:#fff;font-size:var(--text-xs);font-weight:700;pointer-events:none;box-shadow:var(--elev-1)}
@media(max-width:760px){
  /* The phone bar: Quantities moves into More to make room for Mark; an
     acknowledgement waiting takes the place of Fit (pinch fits as well). */
  .drawing-viewer-panel.dv-viewer .dv-actions .dv-tray-button[data-dv-tray="quantities"]{display:none}
  .dv-more-menu .dv-more-quantities{display:flex}
  .drawing-viewer-panel.dv-viewer .dv-buttons:has(.dv-ack)>.dv-fit{display:none}
  .drawing-viewer-panel.dv-viewer .dv-sheet-strip .dv-thumb{width:72px}
  .dv-thumb img,.dv-thumb i{height:48px}
  .dv-ink-bar span{display:none}
}
/* The sharp copy of the part of the sheet on screen, laid over the page. */
.drawing-detail-canvas{position:absolute;z-index:1;pointer-events:none;transform-origin:center}
.drawing-detail-canvas[hidden]{display:none}

/* Commercial 415: variation breakdown editor */
.variation-breakdown-table input, .variation-breakdown-table select { width: 100%; min-width: 0; box-sizing: border-box; }
.variation-breakdown-table td:first-child { min-width: 220px; }
.variation-breakdown-table td:nth-child(2), .variation-breakdown-table td:nth-child(4) { width: 90px; }
.variation-breakdown-table td:nth-child(3) { width: 80px; }
.variation-breakdown-table .vb-amount { white-space: nowrap; text-align: right; }

/* Commercial 416: variations schedule and record */
.variation-filters { margin: var(--space-2) 0; flex-wrap: wrap; }
.clickable-row { cursor: pointer; }
.clickable-row:hover td { background: var(--surface-2, #f4f7fa); }
.variation-facts { display: grid; grid-template-columns: repeat(auto-fill, minmax(180px, 1fr)); gap: var(--space-2); margin: var(--space-3) 0; }
.variation-facts div { background: var(--surface-2, #f4f7fa); border-radius: var(--r-xs); padding: 8px 10px; }
.variation-facts dt { font-size: var(--text-xs); color: var(--muted); text-transform: uppercase; letter-spacing: .1em; }
.variation-facts dd { margin: 2px 0 0; font-weight: 600; }
.variation-history { padding-left: 1.2em; display: flex; flex-direction: column; gap: 6px; }
.variation-breakdown-table td:nth-child(3) { width: 96px; }

/* Forms 438: safety records without the slog.
   The card above a repeated inspection, a drafted review or an induction;
   the "nothing changed" view; the line under a drafted answer; and the
   Start of day card on Today. Tokens only; every control at the control-size tokens. */
.form-repeat-card { display: grid; gap: var(--space-2); margin: 0 0 var(--space-4); padding: var(--space-4); border: 1px solid var(--line); border-left: 4px solid var(--blueprint); border-radius: var(--r-sm); background: var(--info-bg); color: var(--ink); }
.form-repeat-card > strong { font-size: var(--text-base); }
.form-repeat-card > span, .form-repeat-card > small { color: var(--muted); font-size: var(--text-sm); }
.form-repeat-card .form-repeat-same { min-height: var(--control-lg); font-size: var(--text-base); justify-self: start; max-width: 100%; white-space: normal; text-align: left; }
.form-repeat-card .form-repeat-why { color: var(--warn-ink, var(--ink)); }
.form-repeat-card .text-button { justify-self: start; min-height: var(--control-md); }
.form-repeat-card .field { display: grid; gap: var(--space-1); }
.form-repeat-card .field select { width: 100%; max-width: 100%; }
.form-repeat-card .button-row { display: flex; flex-wrap: wrap; gap: var(--space-2); }
.form-repeat-card .button-row button, .form-repeat-others button, .form-repeat-note button { min-height: var(--control-md); }
.form-repeat-others { display: flex; flex-wrap: wrap; align-items: center; gap: var(--space-2); }
.form-repeat-others small { flex-basis: 100%; color: var(--muted); }
.form-repeat-others button { max-width: 100%; white-space: normal; text-align: left; }
.form-repeat-note { margin: 0; padding: var(--space-2) var(--space-3); border-radius: var(--r-xs); background: var(--panel); border: 1px solid var(--line); font-size: var(--text-sm); }
.form-repeat-note.good { border-color: var(--good); background: var(--good-bg); }
.form-repeat-note.bad { border-color: var(--bad); background: var(--bad-bg); }
.form-repeat-compact { display: grid; gap: var(--space-3); padding: var(--space-4); border: 1px solid var(--line); border-radius: var(--r-sm); background: var(--panel); }
.form-repeat-compact > button { justify-self: start; min-height: var(--control-md); max-width: 100%; white-space: normal; text-align: left; }
.form-repeat-carried { list-style: none; margin: 0; padding: 0; display: grid; gap: var(--space-1); }
.form-repeat-carried li { display: flex; justify-content: space-between; gap: var(--space-3); padding: var(--space-2) 0; border-bottom: 1px solid var(--line-soft); font-size: var(--text-sm); }
.form-repeat-carried li span { flex: 1 1 auto; min-width: 0; color: var(--muted); }
.form-repeat-carried li strong { flex: 0 1 auto; max-width: 50%; text-align: right; overflow-wrap: break-word; }
.form-drafted-source { display: block; margin-top: var(--space-1); color: var(--status-info, var(--blueprint)); font-size: var(--text-sm); }
.form-drafted-source a { display: inline-flex; align-items: center; min-height: var(--control-md); padding: 0 var(--space-2); }
.form-drafted-source.judgement { color: var(--warn-ink, var(--muted)); font-weight: 600; }
.induction-sign-qr { display: grid; place-items: center; padding: var(--space-3); background: #fff; border: 1px solid var(--line); border-radius: var(--r-sm); }
.induction-sign-qr svg { width: min(260px, 70vw); height: auto; }
.start-of-day .sod-list { list-style: none; margin: 0; padding: 0; display: grid; gap: var(--space-2); }
.start-of-day .sod-row { display: grid; grid-template-columns: 20px minmax(0, 1fr); gap: var(--space-1) var(--space-2); align-items: start; padding: var(--space-3); border: 1px solid var(--line); border-radius: var(--r-sm); background: var(--panel); }
.start-of-day .sod-row.done { background: var(--neutral-bg); }
.start-of-day .sod-row.done .sod-tick { color: var(--good); }
.start-of-day .sod-row.urgent { border-left: 4px solid var(--bad); }
.start-of-day .sod-tick { font-weight: 700; font-size: var(--text-lg); line-height: var(--leading-tight); text-align: center; color: var(--muted); }
.start-of-day .sod-body { display: grid; gap: var(--space-1); min-width: 0; }
.start-of-day .sod-body small { color: var(--muted); font-size: var(--text-sm); overflow-wrap: anywhere; }
.start-of-day .sod-actions { grid-column: 2; display: flex; flex-wrap: wrap; gap: var(--space-2); align-items: center; }
.start-of-day .sod-actions button, .start-of-day .sod-actions a { min-height: var(--control-md); max-width: 100%; white-space: normal; text-align: left; }
.start-of-day .sod-actions a.text-button { display: inline-flex; align-items: center; padding: 0 var(--space-2); }
.start-of-day .sod-plant { list-style: none; margin: var(--space-2) 0 0; padding: 0; display: grid; gap: var(--space-2); }
.start-of-day .sod-plant li { display: grid; gap: var(--space-2); padding-top: var(--space-2); border-top: 1px solid var(--line-soft); }
.start-of-day .sod-plant li.done span { color: var(--muted); }
.start-of-day .sod-plant li.done span::before { content: '✓ '; color: var(--good); font-weight: 700; }
.start-of-day .sod-plant .sod-actions { grid-column: auto; }
/* Platform 435: the line under a portfolio list page heading - what it shows of the history lists (the last 90 days and everything open), and Show older. */
.history-window-strip{display:flex;flex-wrap:wrap;align-items:center;gap:var(--space-2);margin:0 0 var(--space-3)}
/* Diary 437: today's records above the diary form - what Siite drafted from,
   what it suggests and the records the diary's answers can make. */
.diary-day-panel { display: grid; gap: var(--space-2); margin: 0 0 var(--space-4); padding: var(--space-4); border: 1px solid var(--line); border-left: 4px solid var(--blueprint); border-radius: var(--r-sm); background: var(--info-bg); color: var(--ink); min-width: 0; }
.diary-day-panel > strong { font-size: var(--text-base); }
.diary-day-panel > span, .diary-day-panel .diary-day-note { margin: 0; color: var(--muted); font-size: var(--text-sm); }
.diary-day-panel .diary-day-subhead { margin: var(--space-2) 0 0; font-weight: 600; font-size: var(--text-sm); }
.diary-day-panel .diary-day-list { list-style: none; margin: 0; padding: 0; display: grid; gap: var(--space-2); }
.diary-day-panel .diary-day-list li { display: grid; gap: var(--space-2); padding: var(--space-3); border: 1px solid var(--line); border-radius: var(--r-sm); background: var(--panel); font-size: var(--text-sm); overflow-wrap: anywhere; }
.diary-day-panel .button-row { display: flex; flex-wrap: wrap; gap: var(--space-2); }
.diary-day-panel button { min-height: var(--control-md); max-width: 100%; white-space: normal; text-align: left; }
.diary-day-panel .text-button { min-height: var(--control-md); }
.diary-day-panel a { display: inline-flex; align-items: center; min-height: var(--control-md); padding: 0 var(--space-2); }
.diary-day-events ul { margin: var(--space-2) 0 0; padding-left: var(--space-4); display: grid; gap: var(--space-1); font-size: var(--text-sm); overflow-wrap: anywhere; }
.form-drafted-source.suggestion { color: var(--warn-ink, var(--ink)); }
.form-drafted-source.suggestion button { min-height: var(--control-md); margin-left: var(--space-1); }
/* Alerts 441: the alerts card and line on Today, the alert rules on Data Health. */
.today-alerts-card .today-alerts-steps { margin: var(--space-2) 0; padding-left: var(--space-5, 20px); display: grid; gap: var(--space-1, 4px); }
.today-alerts-card .button-row button,
.today-alerts-off button { min-height: var(--control-md); }
/* Visual 454: the card's two buttons share one row on a phone. */
@media(max-width:760px){ .today-alerts-card .button-row{display:grid;grid-template-columns:1fr 1fr;gap:8px} .today-alerts-card .button-row button{width:100%} }
.alert-rules { display: grid; gap: var(--space-2); margin-bottom: var(--space-3); }
.alert-rule-switch { display: flex; align-items: flex-start; gap: var(--space-2); min-height: var(--control-md); }
.alert-rule-switch input { width: 22px; height: 22px; flex: none; margin-top: 2px; }
/* One ask at a time: the Today card or line replaces the bottom strip there. */
body:has(#todayAlertsOff:not([hidden])) .push-nudge { display: none; }
/* PM 444: the PM's "My jobs this week" board. One row per job; each cell is
   a press (44px floor) that opens its fix. Cells are squared-off tiles, not
   round pills, so a two-line fact reads cleanly; the tone colours are the
   shared .pill good / warn / bad. */
body:not(.login-mode) #pmBoard .pm-board-controls { display: flex; flex-wrap: wrap; gap: var(--space-3); margin: 0 0 var(--space-3); }
body:not(.login-mode) #pmBoard .pm-board-controls .field { min-width: 220px; margin: 0; }
/* PM 444: the day-plan switch and its log on the Plan tab; the RFI reply proposal. */
.day-plan-auto { margin: var(--space-3) 0; }
.day-plan-auto-log ul { margin: var(--space-2) 0 0; padding-left: var(--space-5); }
.rfi-reply-proposal p, .client-decision-chase p { margin: 0 0 var(--space-2); }
/* Decisions 484: chases and programme impact (per job), client decisions (My jobs). */
.client-decision-late { color: var(--bad); }
.client-decision-impact details { margin-top: var(--space-3); }
.client-decision-impact details > summary { cursor: pointer; font-weight: 600; min-height: var(--control-md); padding: var(--space-2) 0; box-sizing: border-box; }
.client-decision-critical { margin-top: var(--space-3); }
.client-choice-flag { display: inline-block; color: var(--warn-ink); font-weight: 600; }
.client-choice-flag.bad { color: var(--bad); }

/* AI 446: Siite suggests - one card per AI proposal, evidence under it, one
   primary (Approve) per card; 44px targets from the shared control size. */
#suggestionsContent{display:flex;flex-direction:column;gap:var(--space-3)}
.siite-suggestion[aria-busy="true"]{opacity:.6}
.siite-suggestion-evidence{margin:0 0 var(--space-2);font-size:var(--text-sm)}
.siite-suggestion-evidence summary{cursor:pointer;color:var(--muted);min-height:var(--control-sm)}
.siite-suggestion-evidence ul{margin:var(--space-1) 0 0;padding-left:var(--space-4)}
.siite-suggests-link{margin:0 0 var(--space-2)}
/* AI 446: job cards on the Portfolio. */
.job-card-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(260px,1fr));gap:var(--space-3)}
.job-card{border:1px solid var(--line);border-radius:var(--r-md);padding:var(--space-3);background:var(--panel);display:flex;flex-direction:column;gap:var(--space-2);min-width:0}
.job-card-warn{border-left:4px solid var(--warn)}
.job-card-good{border-left:4px solid var(--good)}
.job-card-head{display:flex;flex-direction:column;gap:2px}
.job-card-head span{color:var(--muted);font-size:var(--text-sm);overflow-wrap:anywhere}
.job-card-facts{display:flex;flex-wrap:wrap;gap:var(--space-1) var(--space-3);font-size:var(--text-sm)}
.job-card-fact.warn b{color:var(--warn-ink)}
.job-card-attention{margin:0;padding-left:var(--space-4);font-size:var(--text-sm)}
.job-card-money{margin:0;font-size:var(--text-sm)}
@media(max-width:760px){
  .job-card-grid{grid-template-columns:1fr}
}

/* Inbox 443: Today's three inbox tiles lead the queue; the review inbox's
   groups (work logs, incidents, RAMS and permits, inductions, other forms). */
.today-inbox-lead{margin:var(--space-3) 0}
.today-inbox-tiles{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:var(--space-3)}
.inbox-review-group{margin-top:var(--space-4)}
.inbox-review-group h4{margin:0 0 var(--space-1)}
.inbox-review-group>p{margin:0 0 var(--space-2)}
.inbox-row{grid-template-columns:minmax(0,1fr) auto}
.inbox-row-acts{display:flex;flex-wrap:wrap;gap:var(--space-2);align-items:center;justify-content:flex-end;max-width:440px}
@media(max-width:760px){.today-inbox-tiles{grid-template-columns:1fr}.inbox-row{grid-template-columns:1fr}.inbox-row-acts{justify-content:flex-start;max-width:none}}

/* Intake 450: emails Siite sorted to their jobs, filed in one press; and
   subcontractors' applications in on Commercial > Valuations. */
.intake-panel .intake-row:not(tr){display:grid;grid-template-columns:44px minmax(0,1fr);gap:var(--space-2) var(--space-3);align-items:start;padding:var(--space-3) 0;border-bottom:1px solid var(--line)}
.intake-panel .intake-row:not(tr):last-child{border-bottom:none}
.intake-panel .intake-row strong{overflow-wrap:anywhere}
.intake-panel .intake-tick{display:flex;align-items:center;justify-content:center;min-width:44px;min-height:var(--control-md);cursor:pointer}
.intake-panel .intake-tick input{width:20px;height:20px}
.intake-panel .intake-row>.intake-row-acts{grid-column:2;display:flex;flex-wrap:wrap;gap:var(--space-2);align-items:center}
.intake-panel .intake-row select,.intake-applications select,.intake-applications input[type=number]{min-height:var(--control-md);max-width:100%}
/* Visual 455 (V1-24): the one-line triage row in the shared table. */
.intake-panel tr.intake-row td{vertical-align:middle}
.intake-panel{min-width:0}
@media(max-width:1100px){
  .intake-panel tr.intake-row select{max-width:150px}
  .intake-panel tr.intake-row .intake-why summary{white-space:normal;max-width:130px}
}
.intake-panel tr.intake-row select{max-width:200px}
.intake-panel tr.intake-row .intake-why summary{white-space:nowrap}
.intake-panel tr.intake-row .intake-why[open] ul{white-space:normal;max-width:280px}
.intake-panel tr.intake-row .intake-subject{max-width:520px}
.intake-applications label{display:inline-flex;align-items:center;gap:var(--space-2);min-height:var(--control-md)}
@media(max-width:760px){
  .intake-panel .intake-row>.intake-row-acts{display:grid;grid-template-columns:1fr}
  .intake-panel .intake-row-acts select,.intake-panel .intake-row-acts button{width:100%}
}
/* Growth 451: the new-job wizard (one review screen), its setup panel on the
   job, the weekly job pack on Reports and the hide-unused-features list.
   Tokens only; 44px targets from the shared control sizes. */
.new-job-sheet{max-width:860px}
.new-job-form{display:flex;flex-direction:column;gap:var(--space-4)}
.new-job-section{border:1px solid var(--line);border-radius:var(--r-md);padding:var(--space-3) var(--space-4);margin:0;min-width:0}
.new-job-section legend{font-weight:700;padding:0 var(--space-1)}
.new-job-section .muted{margin:var(--space-2) 0 0;font-size:var(--text-sm);overflow-wrap:anywhere}
.new-job-steps{display:flex;flex-direction:column;gap:var(--space-2)}
.new-job-step{display:flex;gap:var(--space-3);align-items:flex-start;min-height:var(--control-md);padding:var(--space-2) 0;border-bottom:1px solid var(--line)}
.new-job-step:last-child{border-bottom:none}
.new-job-step input{width:24px;height:24px;flex:0 0 24px;margin-top:2px}
.new-job-step span{display:flex;flex-direction:column;gap:2px;min-width:0}
.new-job-step small{color:var(--muted);font-size:var(--text-sm);overflow-wrap:anywhere}
.new-job-step-left strong::after{content:" · for someone else";font-weight:400;color:var(--warn-ink)}
.new-job-actions{position:sticky;bottom:0;background:var(--panel);padding-top:var(--space-2)}
.new-job-actions button{min-height:var(--control-md)}
.new-job-wizard-offer{flex-wrap:wrap;gap:var(--space-2)}
.new-job-wizard-offer button{min-height:var(--control-md)}
.new-job-setup-list li{padding:var(--space-1) 0;overflow-wrap:anywhere}
.new-job-setup-panel .panel-title button{min-height:var(--control-md)}
.weekly-pack-section{margin-top:var(--space-4)}
.weekly-pack-section h4{margin:0 0 var(--space-1)}
.weekly-pack-source{margin:0 0 var(--space-2)}
.weekly-pack-section li{overflow-wrap:anywhere}
.weekly-pack-missing{color:var(--muted)}
.weekly-pack-panel .panel-title .button-row button{min-height:var(--control-md)}
.siite-retire-row input[type="checkbox"]{width:24px;height:24px}
.siite-retire-row .access-row-actions{min-width:var(--control-md);min-height:var(--control-md);display:flex;align-items:center;justify-content:center}
@media(max-width:760px){
  .new-job-section{padding:var(--space-3)}
  .new-job-actions{display:grid;grid-template-columns:1fr 1fr}
  .weekly-pack-panel .panel-title .button-row{display:grid;grid-template-columns:1fr;width:100%}
}
/* Growth 451: on a phone the wizard sits above the bottom bar (8500) and under the toasts (8600). */
@media(max-width:760px){.new-job-overlay{z-index:8550}.new-job-actions{padding-bottom:max(var(--space-2),env(safe-area-inset-bottom))}}
/* Records 449: the job's second row of tabs (the pages of the group on
   view), the one Actions list and the record band every record page carries. */
body:not(.login-mode) .siite-tabs.project-subtabs{margin:calc(var(--space-2) * -1) 0 var(--space-4);border-bottom:0;gap:var(--space-1)}
body:not(.login-mode) .siite-tabs.project-subtabs > :is(button,a){min-height:var(--control-sm);padding:var(--space-2) var(--space-3);border-bottom:0;border-radius:var(--r-pill);font-size:var(--text-sm)}
body:not(.login-mode) .siite-tabs.project-subtabs > :is(button,a):is(.active,[aria-selected="true"]){background:var(--sand-tint);color:var(--blue);border-bottom:0}
.siite-actions-filters{display:flex;flex-wrap:wrap;gap:var(--space-2) var(--space-3);align-items:flex-end;margin:var(--space-3) 0 var(--space-2)}
.siite-actions-filters .field{margin:0;min-width:150px;flex:1 1 150px;max-width:260px}
.siite-actions-count{margin:0 0 var(--space-2)}
.siite-actions-list{display:flex;flex-direction:column;gap:var(--space-2)}
.siite-action-row:not(tr){display:grid;grid-template-columns:minmax(0,1fr) minmax(160px,240px) auto;gap:var(--space-2) var(--space-3);align-items:center;padding:var(--space-3);border:1px solid var(--line);border-radius:var(--r-md);background:var(--panel)}
.siite-action-row.is-overdue:not(tr){border-left:4px solid var(--bad)}
.siite-action-row.is-closed{opacity:.75}
.siite-action-main{display:flex;flex-wrap:wrap;align-items:center;gap:var(--space-1) var(--space-2);min-width:0}
.siite-action-title{font-weight:600;color:var(--ink);overflow-wrap:anywhere;min-height:var(--control-sm);display:inline-flex;align-items:center}
.siite-action-main small{flex-basis:100%}
.siite-action-owner{min-width:0;overflow-wrap:anywhere}
.siite-action-pick{display:flex;flex-direction:column;gap:2px;margin:0}
.siite-action-pick > span{font-size:var(--text-xs);font-weight:600;color:var(--warn-ink, var(--warn))}
.siite-action-pick select{min-height:var(--control-sm);max-width:100%}
.siite-actions-roads{margin-top:var(--space-3)}
.siite-record-shell{margin:0 0 var(--space-4);padding:var(--space-3) var(--space-4);border:1px solid var(--line);border-radius:var(--r-md);background:var(--panel);box-shadow:var(--shadow-card)}
.siite-record-shell-head{display:flex;flex-wrap:wrap;align-items:flex-start;justify-content:space-between;gap:var(--space-2) var(--space-3)}
.siite-record-shell-title{min-width:0;flex:1 1 220px}
.siite-record-shell-title .eyebrow{margin:0 0 2px}
.siite-record-shell-title strong{font-size:var(--text-lg);font-weight:600;overflow-wrap:anywhere}
.siite-record-next{min-height:var(--control-md)}
.siite-record-shell-facts{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:var(--space-2) var(--space-3);margin:var(--space-3) 0 var(--space-2)}
.siite-record-shell-facts dt{font-size:var(--text-xs);font-weight:600;text-transform:uppercase;letter-spacing:.12em;color:var(--muted)}
.siite-record-shell-facts dd{margin:2px 0 0;overflow-wrap:anywhere}
.siite-record-shell-history summary{cursor:pointer;font-weight:600;min-height:var(--control-sm);display:flex;align-items:center}
.siite-record-history{margin:var(--space-2) 0;padding-left:var(--space-4);font-size:var(--text-sm)}
.siite-record-history li{margin:0 0 var(--space-1)}
@media(max-width:760px){
  .siite-action-row:not(tr){grid-template-columns:1fr}
  .siite-actions-filters .field{max-width:none;flex-basis:calc(50% - var(--space-2))}
  .siite-record-shell{padding:var(--space-3)}
  .siite-record-shell-facts{grid-template-columns:1fr 1fr}
  .siite-record-next{width:100%}
}

/* ═══════════════════════════════════════════════════════════════════════════
   VISUAL 453: FOUNDATIONS - the shared building blocks (app.js "VISUAL 453:
   FOUNDATIONS"). New components, so they live together here; existing rules
   they replace were changed where they were written. Every colour is a token.
   ═══════════════════════════════════════════════════════════════════════════ */

/* ——— The ONE gold clock button ———
   Sand to clock in, the website gold while clocked in (with a live dot), the
   same gold with a dashed edge while a clock-out waits to be confirmed. Both
   golds carry the deep-gold edge, because neither shows against white on its
   own (2.13:1 and 1.48:1). Written at the house button specificity and after
   it, so neither .primary nor the header's inverted buttons can repaint it. */
:where(.siite-clock-btn){display:inline-flex;align-items:center;justify-content:center;gap:var(--space-2)}
body:not(.login-mode) button.siite-clock-btn,
body:not(.login-mode) .topbar button.siite-clock-btn{
  background:var(--clock);
  border:2px solid var(--clock-edge);
  color:var(--clock-ink);
  font-weight:700;
  box-shadow:var(--elev-1);
}
body:not(.login-mode) button.siite-clock-btn:hover,
body:not(.login-mode) .topbar button.siite-clock-btn:hover{background:#b9a37f;border-color:var(--clock-edge);filter:none}
body:not(.login-mode) button.siite-clock-btn.is-live,
body:not(.login-mode) .topbar button.siite-clock-btn.is-live{background:var(--clock-live);color:var(--clock-live-ink);border-color:var(--clock-edge)}
body:not(.login-mode) button.siite-clock-btn.is-live:hover,
body:not(.login-mode) .topbar button.siite-clock-btn.is-live:hover{background:#ebc576}
body:not(.login-mode) button.siite-clock-btn.is-pending,
body:not(.login-mode) .topbar button.siite-clock-btn.is-pending{border-style:dashed}
body:not(.login-mode) button.siite-clock-btn:disabled{opacity:.55}
/* Offline 483 (R2D-02): "Clock-out saved on this phone" - held in the queue
   with its press time; it sends itself. Still the gold clock (Jim, 22 Oct:
   the clock is never a red or amber button): the amber is the waiting dot
   and the "Sends when signal returns" line. Not pressable (disabled), but not
   faded either - it is a state to read, not a control that failed. */
body:not(.login-mode) button.siite-clock-btn.is-saved:disabled{opacity:1;cursor:default}
body:not(.login-mode) button.siite-clock-btn.is-saved{flex-wrap:wrap;row-gap:0}
.siite-clock-btn.is-saved .siite-clock-dot{background:var(--status-warning)}
.siite-clock-btn .siite-clock-sub{flex-basis:100%;font-size:var(--text-sm);font-weight:600;color:var(--clock-live-ink);line-height:var(--leading-tight)}
.siite-clock-dot{width:9px;height:9px;border-radius:50%;background:var(--status-ok);box-shadow:0 0 0 2px var(--surface-raised);flex:none}
.siite-clock-btn.is-pending .siite-clock-dot{background:var(--clock-edge)}
.siite-clock-btn .siite-icon{width:18px;height:18px;flex:none}
/* The tiles that are clock buttons keep their tile layout. */
.project-action-tile.siite-clock-btn,.field-primary-action.siite-clock-btn{justify-content:flex-start}
.front-door-action.siite-clock-btn{align-items:flex-start}
@media(prefers-reduced-motion:no-preference){
  .siite-clock-btn.is-live:not(.is-pending):not(.is-saved) .siite-clock-dot{animation:siiteClockPulse 2.4s var(--ease-in-out) infinite}
}
@keyframes siiteClockPulse{0%,100%{opacity:1}50%{opacity:.45}}

/* A dialog's final destructive confirm: the only filled red button. */
.danger-confirm .siite-icon{width:18px;height:18px;margin-right:var(--space-2);vertical-align:-4px}
.dialog-field[hidden]{display:none!important}

/* ——— Status chips ——— (white-space:nowrap is on .pill itself) */
.siite-status-chip{flex:0 0 auto}

/* ——— "More ▾" and the row "⋯" menu ——— */
.siite-menu{position:relative;display:inline-block}
.siite-menu > summary{list-style:none;cursor:pointer;display:inline-flex;align-items:center;justify-content:center;gap:var(--space-2);min-height:var(--control-md);min-width:44px;padding:0 var(--space-3);border:1px solid var(--line);border-radius:var(--r-sm);background:transparent;color:var(--blue);font-size:var(--text-xs);font-weight:600;white-space:nowrap}
.siite-menu > summary::-webkit-details-marker{display:none}
.siite-menu > summary:hover{background:var(--soft)}
.siite-menu[open] > summary{background:var(--soft);border-color:var(--border-strong)}
.siite-menu-list{position:absolute;z-index:var(--z-overlay);top:calc(100% + 4px);right:0;min-width:200px;max-width:min(320px,calc(100vw - 32px));display:grid;padding:var(--space-1);background:var(--surface-raised);border:1px solid var(--line);border-radius:var(--r-md);box-shadow:var(--elev-3)}
.siite-menu[data-align="start"] .siite-menu-list{left:0;right:auto}
body:not(.login-mode) .siite-menu-list .siite-menu-item{display:flex;align-items:center;justify-content:flex-start;width:100%;min-height:var(--control-md);padding:var(--space-2) var(--space-3);border:0;border-radius:var(--r-sm);background:transparent;color:var(--ink);font-size:var(--text-sm);font-weight:600;text-align:left;text-decoration:none;white-space:normal}
body:not(.login-mode) .siite-menu-list .siite-menu-item:hover{background:var(--soft)}
body:not(.login-mode) .siite-menu-list .siite-menu-item.danger{color:var(--bad);border-top:1px solid var(--line-soft);border-radius:0}
.siite-page-header-tabs{grid-column:1/-1;margin-top:var(--space-2);min-width:0;overflow-x:auto;-webkit-overflow-scrolling:touch}
.siite-page-header-tabs .siite-tabs{margin:0}

/* ——— The enterprise table (siiteDataTable) ——— */
.siite-table{min-width:0;max-width:100%;margin:0 0 var(--space-4)}
.siite-table .siite-table-result{border-top:1px solid var(--line);border-radius:var(--r-md) var(--r-md) 0 0;margin:0}
.siite-table-scroll{position:relative;min-width:0;max-width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;border:1px solid var(--line);border-top:0;border-radius:0 0 var(--r-md) var(--r-md);background:var(--surface-raised)}
.siite-table > .siite-table-scroll:first-child,.siite-selection-bar[hidden] + .siite-table-scroll:nth-child(2){border-top:1px solid var(--line);border-radius:var(--r-md)}
/* The fade says "there is more to the right"; it shows only while there is. */
.siite-table-scroll::after{content:"";position:sticky;right:0;top:0;bottom:0;float:right;width:28px;height:100%;margin-top:-100%;pointer-events:none;background:linear-gradient(to right,rgba(255,255,255,0),rgba(16,42,68,.10));opacity:0;transition:opacity var(--motion) var(--ease-out)}
.siite-table-scroll.has-more-right::after{opacity:1}
body:not(.login-mode) table.siite-data-table{width:100%;min-width:0;border-collapse:separate;border-spacing:0;font-size:var(--text-sm);table-layout:auto}
body:not(.login-mode) .siite-data-table th{position:sticky;top:0;z-index:2;background:var(--surface-sunken);color:var(--muted);text-align:left;padding:var(--space-2);font-size:var(--text-xs);font-weight:600;text-transform:uppercase;letter-spacing:.1em;border-bottom:1px solid var(--line);white-space:nowrap;vertical-align:middle}
body:not(.login-mode) .siite-data-table td{padding:var(--space-2);border-bottom:1px solid var(--line-soft);vertical-align:top;min-width:0;background:var(--surface-raised)}
body:not(.login-mode) .siite-data-table tbody tr:hover td{background:var(--surface-base)}
body:not(.login-mode) .siite-data-table tbody tr:last-child td{border-bottom:0}
/* The first column stays put while the rest scrolls sideways. */
body:not(.login-mode) .siite-data-table :is(th,td):first-child{position:sticky;left:0;z-index:1}
body:not(.login-mode) .siite-data-table thead th:first-child{z-index:3}
.siite-table-scroll.is-scrolled .siite-data-table :is(th,td):first-child{box-shadow:var(--elev-2)}
/* Typed columns. Money is right-aligned and tabular so a column sums by eye. */
body:not(.login-mode) .siite-data-table :is(th,td).siite-col-money,
body:not(.login-mode) .siite-data-table :is(th,td).siite-col-number{text-align:right;white-space:nowrap;font-variant-numeric:tabular-nums}
body:not(.login-mode) .siite-data-table :is(th,td).siite-col-date{white-space:nowrap;font-variant-numeric:tabular-nums}
body:not(.login-mode) .siite-data-table :is(th,td).siite-col-status{white-space:nowrap}
body:not(.login-mode) .siite-data-table :is(th,td).siite-col-actions{width:1%;white-space:nowrap;text-align:right}
body:not(.login-mode) .siite-data-table :is(th,td).siite-col-select{width:52px;padding:0 var(--space-1);vertical-align:middle}
body:not(.login-mode) .siite-data-table td.siite-col-select{vertical-align:top;padding-top:var(--space-1)}
body:not(.login-mode) .siite-data-table td.siite-col-text{min-width:120px}
body:not(.login-mode) .siite-data-table td.siite-col-text:has(.siite-clamp){min-width:min(320px,60vw);width:100%}
body:not(.login-mode) .siite-data-table :is(th,td).siite-col-fit{width:1%;white-space:nowrap}
/* Sortable headers are buttons that look like headers. */
body:not(.login-mode) .siite-data-table th button.siite-sort{display:inline-flex;align-items:center;gap:var(--space-1);min-height:32px;padding:0;border:0;background:transparent;color:inherit;font:inherit;letter-spacing:inherit;text-transform:inherit;box-shadow:var(--elev-0);cursor:pointer}
body:not(.login-mode) .siite-data-table th button.siite-sort:hover{color:var(--ink)}
body:not(.login-mode) .siite-data-table th button.siite-sort span{font-size:var(--text-xs)}
.siite-table-group-head th{position:static;background:var(--limestone)!important;color:var(--ink)!important;text-transform:none!important;letter-spacing:0!important;font-size:var(--text-sm)!important}
.siite-count{display:inline-flex;align-items:center;justify-content:center;min-width:22px;height:20px;padding:0 var(--space-2);margin-left:var(--space-2);border-radius:var(--r-pill);background:var(--line);color:var(--muted);font-size:var(--text-xs);font-weight:700;vertical-align:1px}
.siite-row-actions{display:inline-flex;align-items:center;gap:var(--space-2);justify-content:flex-end}
body:not(.login-mode) .siite-row-actions .siite-row-action{min-height:36px;padding:var(--space-2) var(--space-3);font-size:var(--text-xs);white-space:nowrap}
.siite-table-empty td{padding:var(--space-4)!important}
.siite-table-empty .siite-empty{margin:0}
/* A 1-2 line clamp: long text never sets the row height. */
.siite-clamp{display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:var(--clamp,2);line-clamp:var(--clamp,2);overflow:hidden;overflow-wrap:break-word;margin:0}
body:not(.login-mode) button.link-button.siite-clamp-more{min-height:24px;padding:0;margin-top:2px;border:0;background:transparent;color:var(--blue);font-size:var(--text-xs);font-weight:600;text-decoration:underline;box-shadow:var(--elev-0)}
.siite-drawer-text{white-space:pre-wrap;line-height:var(--leading-normal)}
/* Ticks are 44px targets: the label is the target, the box sits in it. */
.siite-tick{display:inline-grid;place-items:center;width:44px;height:44px;margin:calc(var(--space-2) * -1) 0;cursor:pointer}
.siite-tick input{width:24px;height:24px;min-height:0;margin:0;accent-color:var(--cta);cursor:pointer}
.siite-selection-bar{display:flex;align-items:center;gap:var(--space-2);flex-wrap:wrap;padding:var(--space-2) var(--space-3);border:1px solid var(--cta);border-bottom:0;background:#fbf1ec;color:var(--ink)}
.siite-selection-bar[hidden]{display:none}
.siite-selection-bar strong{margin-right:auto;font-size:var(--text-sm)}
body:not(.login-mode) .siite-selection-bar button.link-button{border:0;background:transparent;min-height:36px;padding:0 var(--space-2);color:var(--blue);text-decoration:underline}
/* Phone: each row is a stacked card, key fact first - the day (or name) and
   the tick, then the status chips on one line, then the clamped summary,
   then the row's action. No column labels: the chips say what they are. */
@media(max-width:760px){
  body:not(.login-mode) table.siite-data-table,
  body:not(.login-mode) .siite-data-table tbody{display:block;width:100%}
  body:not(.login-mode) .siite-data-table thead tr{display:flex;align-items:center;gap:var(--space-2);padding:0 var(--space-2)}
  body:not(.login-mode) .siite-data-table thead th{display:none}
  body:not(.login-mode) .siite-data-table thead th.siite-col-select{display:flex;align-items:center;gap:var(--space-1);position:static;background:none;border:0;padding:0;width:auto}
  body:not(.login-mode) .siite-data-table thead th.siite-col-select::after{content:"Tick all";font-size:var(--text-xs);color:var(--muted);text-transform:none;letter-spacing:0}
  body:not(.login-mode) .siite-data-table tbody tr{display:flex;flex-wrap:wrap;align-items:center;gap:var(--space-2) var(--space-2);padding:var(--space-2) var(--space-3);border-bottom:1px solid var(--line)}
  body:not(.login-mode) .siite-data-table tbody tr.siite-table-group-head{display:block;padding:0}
  body:not(.login-mode) .siite-data-table tbody tr.siite-table-group-head th{display:block}
  body:not(.login-mode) .siite-data-table td{display:block;flex:0 0 auto;width:auto;max-width:100%;padding:0;border:0;position:static!important;background:transparent;box-shadow:var(--elev-0)!important;text-align:left!important;order:1}
  body:not(.login-mode) .siite-data-table td.siite-cell-key{order:-2;flex:1 1 auto;font-weight:700;font-size:var(--text-base)}
  body:not(.login-mode) .siite-data-table td.siite-col-select{order:-1;width:auto}
  body:not(.login-mode) .siite-data-table td.siite-col-status{order:0}
  body:not(.login-mode) .siite-data-table td.siite-col-text:has(.siite-clamp){order:2;flex:1 1 100%;min-width:0;width:100%}
  body:not(.login-mode) .siite-data-table td.siite-col-actions{order:3;flex:1 1 100%;width:auto}
  body:not(.login-mode) .siite-data-table td.siite-col-actions .siite-row-actions{justify-content:flex-start}
  body:not(.login-mode) .siite-data-table td.siite-phone-hide{display:none}
  body:not(.login-mode) .siite-data-table td br{display:none}
  body:not(.login-mode) .siite-data-table td small{margin-left:var(--space-2)}
  body:not(.login-mode) .siite-row-actions .siite-row-action{min-height:var(--control-md)}
  .siite-table-scroll::after{display:none}
}

/* ——— A control matrix (Visual 455: V1-12, V1-25) ———
   One column per control; a coloured cell, words only when not green. */
body:not(.login-mode) .siite-control-matrix .siite-data-table td.siite-col-status{padding:var(--space-1);vertical-align:middle}
body:not(.login-mode) button.siite-matrix-cell{display:flex;flex-direction:column;align-items:flex-start;justify-content:center;gap:1px;width:100%;min-width:112px;max-width:170px;min-height:var(--control-md);margin:0;padding:var(--space-1) var(--space-2);border-radius:var(--r-sm);text-align:left;line-height:var(--leading-tight);font-size:var(--text-sm);white-space:normal}
body:not(.login-mode) button.siite-matrix-cell::before{display:none}
body:not(.login-mode) button.siite-matrix-cell strong{display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;overflow:hidden}
body:not(.login-mode) button.siite-matrix-cell small{display:block;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-weight:500;opacity:.85;font-size:var(--text-xs)}
body:not(.login-mode) .siite-control-matrix .siite-data-table th{white-space:normal;vertical-align:bottom}
body:not(.login-mode) .siite-control-matrix .siite-data-table :is(th,td).siite-col-fit{white-space:normal}
body:not(.login-mode) button.siite-matrix-cell.good{align-items:center;min-width:56px;background:var(--status-ok-surface);border-color:transparent}
.siite-matrix-ok{font-size:var(--text-base);font-weight:700;color:var(--good)}
.siite-matrix-label{display:none}
body:not(.login-mode) .siite-control-matrix td.siite-cell-key{min-width:150px}
body:not(.login-mode) .siite-control-matrix td.siite-cell-key button.link-button{min-height:var(--control-md);padding:0;text-align:left}
@media(max-width:760px){
  /* Stacked on a phone the column heads are gone, so each cell names itself,
     two cells to a line. */
  .siite-matrix-label{display:block;font-size:var(--text-xs);font-weight:600;opacity:.8}
  body:not(.login-mode) .siite-control-matrix .siite-data-table td.siite-col-status{flex:1 1 calc(50% - 8px);width:auto;min-width:0;padding:0}
  /* Visual 459: the job takes its own first line and the controls pair up under it. It used to share that line with one control only when the phone had exactly the pixels for both (304px of 304), so rows jumped between layouts. */
  body:not(.login-mode) .siite-control-matrix .siite-data-table td.siite-cell-key{flex:1 1 100%}
  body:not(.login-mode) button.siite-matrix-cell,body:not(.login-mode) button.siite-matrix-cell.good{min-width:0;max-width:none;align-items:flex-start}
}

/* Visual 455 (V1-17): Reports' tabs - a panel outside the chosen tab steps out. */
.reports-tabs{margin:0 0 var(--space-3)}
#reports .reports-tab-off{display:none}

/* ——— Record rows and lists ——— */
.siite-record-list{display:grid;gap:0;border:1px solid var(--line);border-radius:var(--r-md);background:var(--surface-raised);overflow:hidden}
.siite-record-row{display:grid;grid-template-columns:auto minmax(0,1fr) auto;gap:var(--space-3);align-items:start;padding:var(--space-3) var(--space-4);border-bottom:1px solid var(--line-soft);min-width:0}
.siite-record-row:last-child{border-bottom:0}
.siite-record-row:not(:has(> .siite-tick)){grid-template-columns:minmax(0,1fr) auto}
.siite-record-row.tone-bad{box-shadow:inset 3px 0 0 var(--bad)}
.siite-record-row.tone-warn{box-shadow:inset 3px 0 0 var(--warn)}
.siite-record-main{min-width:0;display:grid;gap:var(--space-1)}
.siite-record-head{display:flex;align-items:center;gap:var(--space-2);min-width:0;flex-wrap:wrap}
.siite-record-title{font-weight:600;font-size:var(--text-base);color:var(--ink);min-width:0;overflow-wrap:anywhere}
body:not(.login-mode) button.link-button.siite-record-title{min-height:0;padding:0;border:0;background:transparent;box-shadow:var(--elev-0);color:var(--ink);text-decoration:none;text-align:left;font-size:var(--text-base);font-weight:600}
body:not(.login-mode) button.link-button.siite-record-title:hover{color:var(--blue);text-decoration:underline}
.siite-record-meta{margin:0;color:var(--muted);font-size:var(--text-sm)}
.siite-record-summary{color:var(--ink);font-size:var(--text-sm);line-height:var(--leading-snug)}
.siite-record-facts{margin:0;color:var(--muted);font-size:var(--text-xs);font-weight:600}
.siite-record-actions{display:flex;align-items:center;gap:var(--space-2);justify-content:flex-end;flex-wrap:nowrap}
body:not(.login-mode) .siite-record-actions > :is(button,a){min-height:var(--control-md);white-space:nowrap} /* Visual 455: the 44px floor (was 40px) */
.siite-list-group{margin:0 0 var(--space-4)}
.siite-list-group-head{display:flex;align-items:center;gap:var(--space-1);margin:0 0 var(--space-2);font-size:var(--text-sm);font-weight:600;color:var(--ink)}
.siite-grouped-list > .siite-result-bar{border-top:1px solid var(--line);border-radius:var(--r-md);margin-top:var(--space-2)}
/* Stacks at ≤1100px (Audit V1-01): the drawer sidebar leaves a laptop too
   little room for text beside a row of buttons. */
@media(max-width:1100px){
  .siite-record-row,.siite-record-row:not(:has(> .siite-tick)){grid-template-columns:minmax(0,1fr)}
  .siite-record-row:has(> .siite-tick){grid-template-columns:auto minmax(0,1fr)}
  .siite-record-row:has(> .siite-tick) .siite-record-actions{grid-column:2}
  .siite-record-actions{justify-content:flex-start}
}

/* Visual 455: on a tablet a stacked row's actions sit at its left, so its
   menu opens to the right; on a phone every menu is the bottom sheet (454). */
@media(min-width:761px) and (max-width:1100px){
  .siite-record-actions .siite-menu-list{left:0;right:auto}
}

/* ——— One filing / sync line ——— */
.siite-filing{display:flex;align-items:center;flex-wrap:wrap;gap:var(--space-2) var(--space-3);padding:var(--space-2) var(--space-4);margin:0 0 var(--space-3);border:1px solid var(--line);border-left:4px solid var(--status-neutral);border-radius:var(--r-md);background:var(--surface-raised);font-size:var(--text-sm)}
.siite-filing.tone-good{border-left-color:var(--good)}
.siite-filing.tone-warn{border-left-color:var(--warn)}
.siite-filing.tone-bad{border-left-color:var(--bad);background:var(--status-critical-surface)}
.siite-filing-dot{display:none}
.siite-filing-text{font-weight:600;color:var(--ink)}
body:not(.login-mode) .siite-filing button.link-button{min-height:32px;padding:0 var(--space-1);border:0;background:transparent;color:var(--blue);text-decoration:underline;font-size:var(--text-sm)}
.siite-filing-link{font-weight:600}
.siite-filing-files{flex-basis:auto}
.siite-filing-files[open]{flex-basis:100%}
.siite-filing-files summary{cursor:pointer;min-height:36px;display:flex;align-items:center;color:var(--blue);font-weight:600}
.siite-filing-files ul{list-style:none;margin:0;padding:0;display:grid;gap:2px;max-height:320px;overflow:auto}
.siite-filing-files li{display:flex;align-items:center;gap:var(--space-2);flex-wrap:wrap;padding:var(--space-2) 0;border-bottom:1px solid var(--line-soft)}
.siite-filing-name{min-width:110px;font-weight:600}
/* Parity 462 (F4): a bulk retry's outcome, record by record. */
.siite-retry-outcome{padding:var(--space-2) var(--space-4);margin:0 0 var(--space-3);border:1px solid var(--line);border-left:4px solid var(--good);border-radius:var(--r-md);background:var(--surface-raised);font-size:var(--text-sm)}
.siite-retry-outcome.tone-bad{border-left-color:var(--bad)}
.siite-retry-outcome ul{list-style:none;margin:var(--space-2) 0 0;padding:0;display:grid;gap:2px;max-height:320px;overflow:auto}
.siite-retry-outcome li{display:flex;align-items:center;gap:var(--space-2);flex-wrap:wrap;padding:var(--space-1) 0;border-bottom:1px solid var(--line-soft)}
.siite-retry-outcome-name{font-weight:600}
.siite-retry-outcome p{margin:var(--space-2) 0 0}

/* ——— The diary list and its month calendar (the proof page) ——— */
.diary-list-panel{min-width:0}
.diary-month{margin:0 0 var(--space-5)}
.diary-month-head{display:flex;align-items:center;justify-content:space-between;gap:var(--space-2);margin:0 0 var(--space-2)}
.diary-month-head h4{margin:0;font-size:var(--text-lg)}
.diary-month-grid{display:grid;grid-template-columns:repeat(7,minmax(0,1fr));gap:4px}
.diary-month-dow{font-size:var(--text-xs);font-weight:600;color:var(--muted);text-transform:uppercase;letter-spacing:.1em;text-align:center;padding:4px 0}
body:not(.login-mode) .diary-day{display:grid;align-content:start;gap:2px;min-height:64px;min-width:0;padding:6px;border:1px solid var(--line);border-radius:var(--r-sm);background:var(--surface-raised);text-align:left;font-weight:400;color:var(--ink);box-shadow:var(--elev-0)}
body:not(.login-mode) .diary-day b{font-size:var(--text-sm);font-weight:700}
body:not(.login-mode) .diary-day small{font-size:var(--text-xs);color:var(--muted);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
body:not(.login-mode) .diary-day.is-written{background:var(--status-ok-surface);border-color:#b9dcc8}
body:not(.login-mode) .diary-day.is-written.rag-amber{background:var(--status-warning-surface);border-color:#ecd3a6}
body:not(.login-mode) .diary-day.is-written.rag-red{background:var(--status-critical-surface);border-color:#e9bcbc}
body:not(.login-mode) .diary-day.is-draft{background:var(--status-warning-surface);border-style:dashed;border-color:var(--warn)}
body:not(.login-mode) .diary-day.is-missing{background:#fff;border-color:#e9bcbc;box-shadow:inset 0 0 0 1px var(--bad-bg)}
body:not(.login-mode) .diary-day.is-missing small{color:var(--bad)}
body:not(.login-mode) .diary-day.is-off{background:var(--surface-base);color:var(--muted);border-style:dotted}
body:not(.login-mode) .diary-day.is-today{outline:2px solid var(--accent);outline-offset:1px}
.diary-day-blank{min-height:64px}
.diary-month-legend{display:flex;flex-wrap:wrap;gap:8px 14px;margin:var(--space-2) 0 0;font-size:var(--text-xs);color:var(--muted)}
.diary-month-legend span::before{content:"";display:inline-block;width:10px;height:10px;margin-right:5px;border-radius:2px;vertical-align:-1px;border:1px solid var(--line)}
.diary-month-legend .lg-written::before{background:var(--status-ok-surface);border-color:#b9dcc8}
.diary-month-legend .lg-draft::before{background:var(--status-warning-surface);border:1px dashed var(--warn)}
.diary-month-legend .lg-missing::before{background:#fff;border-color:var(--bad)}
/* ——— Visual 454: site and field screens ——— */
/* siiteCheck (V2-11): a 24px box in a 44px label; the label is the target. */
.siite-check{display:flex;align-items:center;gap:var(--space-2);min-height:var(--control-md);cursor:pointer;min-width:0}
.siite-check > input[type="checkbox"]{-webkit-appearance:none;appearance:none;width:24px;height:24px;min-height:0;margin:0;padding:0;flex:0 0 24px;display:grid;place-items:center;border:2px solid #6f8197;border-radius:var(--r-xs);background:#fff}
.siite-check > input[type="checkbox"]:checked{background:var(--blue);border-color:var(--blue)}
.siite-check > input[type="checkbox"]:checked::after{content:"";width:9px;height:5px;border-left:2px solid #fff;border-bottom:2px solid #fff;transform:rotate(-45deg);margin-top:-2px}
.siite-check > span{min-width:0;overflow-wrap:anywhere;line-height:var(--leading-tight)}
/* The multi-choice chip grid (V2-12): two to a row, compact chips. */
.schema-options .siite-check{padding:var(--space-2) var(--space-2);min-height:var(--control-md);font-size:var(--text-sm)}
/* A native tick box in the site (capture) density is a 24px box. */
body[data-role-density="capture"] input[type="checkbox"]:not(.siite-check > input){width:24px;height:24px;min-height:0;margin:0;flex:0 0 auto}
/* siiteGroupedList: a group's meta and its one action sit on the head line. */
.siite-list-group-bar{display:flex;align-items:center;justify-content:space-between;gap:var(--space-2);flex-wrap:wrap;margin:0 0 var(--space-2)}
.siite-list-group-bar .siite-list-group-head{margin:0;flex-wrap:wrap}
.siite-list-group-meta{font-weight:500;color:var(--muted);font-size:var(--text-xs)}
body:not(.login-mode) .siite-list-group-bar .siite-list-group-action{min-height:40px;white-space:nowrap}
@media(max-width:760px){body:not(.login-mode) .siite-list-group-bar .siite-list-group-action{min-height:var(--control-md)}}
/* The diary form's first screen (V2-10): the records panel is one line until
   opened; the dictate bar is one row on a phone; the head with no actions
   left is not drawn on the capture route. */
.diary-day-door > summary{cursor:pointer;list-style:none;display:grid;gap:2px;min-height:var(--control-md)}
.diary-day-door > summary::-webkit-details-marker{display:none}
.diary-day-door > summary .eyebrow{margin:0}
.diary-day-door > summary strong::after{content:" ▸";color:var(--blue)}
.diary-day-door[open] > summary strong::after{content:" ▾"}
.daily-form-template-ref{font-size:var(--text-xs);margin:var(--space-3) 0}
@media(max-width:760px){
  #projectHubContent:has(> .capture-route) .daily-form-head{display:none}
  .diary-dictation-bar{padding:10px 12px;gap:8px}
  .diary-dictation-bar .diary-dictation-head{gap:8px}
  .diary-dictation-bar .diary-dictation-head-actions{flex-wrap:nowrap}
  .diary-dictation-bar .diary-dictation-head-actions .diary-mic{flex:1 1 auto;order:-1;min-height:48px;min-width:0}
  .diary-day-door{padding:10px 12px}
  .diary-dictation-bar:not(.listening) .diary-dictation-head > div:first-child{display:none}
  .diary-day-door > summary{display:block}
  .diary-day-door > summary .eyebrow{display:block;font-size:var(--text-xs);letter-spacing:.06em}
  .diary-day-door > summary strong{font-size:var(--text-sm)}
}
/* Today for a site role (V2-16/17/19): the clock, then Close today as the one
   rust primary; one queue; the site tools as a compact two-up grid. */
.today-hero-site{flex-wrap:wrap}
body:not(.login-mode) .today-hero-site .today-close-primary{display:inline-flex;align-items:center;justify-content:center;gap:8px;min-height:52px;padding:0 20px;font-size:var(--text-base)}
.today-site-queue .panel-title{margin-bottom:var(--space-2)}
.today-site-queue .siite-record-actions > :is(button,a){font-size:var(--text-sm)}
.field-command-site-day .field-command-body > p:not(.eyebrow){font-size:var(--text-sm)}
@media(max-width:760px){
  .today-hero-site{padding:16px;gap:12px}
  .today-hero-site > div:first-child{flex:1 1 100%}
  .today-hero-site > .today-clock-panel,.today-hero-site > .today-close-primary{flex:1 1 100%;width:100%}
  .field-command-site-day{padding:14px}
  .field-command-site-day .field-command-actions{grid-template-columns:repeat(2,minmax(0,1fr));gap:8px}
  .field-command-site-day :is(.field-primary-action,.field-secondary-action){min-height:64px;grid-template-columns:1fr;padding:10px;gap:4px;box-shadow:none}
  .field-command-site-day :is(.field-primary-action,.field-secondary-action) span{grid-row:auto;width:32px;height:32px;font-size:var(--text-base)}
  .field-command-site-day :is(.field-primary-action,.field-secondary-action) strong{font-size:var(--text-sm);line-height:var(--leading-tight)}
  .field-command-site-day :is(.field-primary-action,.field-secondary-action) small{font-size:var(--text-xs);line-height:var(--leading-tight)}
  .field-command-site-day .field-urgent-action{grid-column:1/-1}
  .today-site-queue{padding:14px}
}
/* The queue's rows keep their one action beside the words on a phone: one
   short line each, not a stacked card per item. */
@media(max-width:1100px){
  .today-site-queue .siite-record-row,.today-site-queue .siite-record-row:not(:has(> .siite-tick)){grid-template-columns:minmax(0,1fr) auto;gap:var(--space-2);padding:var(--space-2) var(--space-3)}
  .today-site-queue .siite-record-actions{align-self:center}
  .today-site-queue .siite-record-title{font-size:var(--text-sm)}
  .today-site-queue .siite-record-head{gap:var(--space-2)}
}
/* Time Clock (V2-21/24): grouped approvals; the pay-run week grid. */
.labour-time-side .siite-grouped-list{margin-bottom:var(--space-3)}
.labour-time-side .siite-record-facts .pill{margin:2px var(--space-1) 2px 0;white-space:normal;max-width:100%;text-align:left}
.payrun-day{display:grid;gap:2px;justify-items:start}
.payrun-day.payrun-blocked{padding:4px 6px;border-radius:var(--r-xs);background:var(--status-critical-surface)}
.payrun-day-label{display:none;font-size:var(--text-xs);color:var(--muted);font-weight:600}
body:not(.login-mode) .payrun-day button.link-button.payrun-day-words{min-height:28px;padding:0;border:0;background:transparent;color:var(--blue);text-decoration:underline;font-size:var(--text-xs);box-shadow:var(--elev-0)}
@media(max-width:760px){
  .payrun-day-label{display:block}
  .payrun-week-grid .siite-data-table tbody tr{align-items:flex-start}
  .payrun-week-grid .siite-data-table td.siite-cell-key{flex:1 1 100%}
  .payrun-week-grid .siite-data-table td:not(.siite-cell-key){flex:0 0 calc(33% - 8px)}
  body:not(.login-mode) .payrun-day button.link-button.payrun-day-words{min-height:var(--control-md)}
}
/* The job header on a phone (V2-26): about 430px of hero - three stacked
   buttons, the address on two lines and five RAG chips on three rows - came
   before the tabs on every hub tab. One compact header: the buttons on one
   row, the name, the address on one line, the RAG chips small on one or two. */
@media(max-width:760px){
  body:not(.login-mode) .project-hero{padding:10px 12px 12px}
  body:not(.login-mode) .project-hero > div:first-child{display:flex;flex-wrap:wrap;align-items:center;gap:6px}
  body:not(.login-mode) .project-hero > div:first-child > :not(button):not(a){flex:1 1 100%;margin:0}
  body:not(.login-mode) .project-hero .back-link{min-height:var(--control-md);margin:0;padding:0 9px}
  body:not(.login-mode) .project-hero .eyebrow{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
  body:not(.login-mode) .project-hero .eyebrow{margin-top:4px;font-size:var(--text-xs);letter-spacing:.08em}
  body:not(.login-mode) .project-hero h3{margin:0;font-size:var(--text-lg)}
  body:not(.login-mode) .project-hero > div:first-child > p:not(.eyebrow){white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-size:var(--text-xs)}
  body:not(.login-mode) .project-hero:not(.capture-route) .project-hero-rag{margin-top:8px;gap:4px;padding:0;display:grid;grid-template-columns:repeat(2,minmax(0,1fr))}
  body:not(.login-mode) .project-hero-rag > :first-child:not(.rag){grid-column:1/-1;justify-self:start}
  body:not(.login-mode) .project-hero-rag .rag{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
  body:not(.login-mode) .project-hero > div:first-child > details.map-choice-inline{flex:0 0 auto;width:auto;margin:0}
  body:not(.login-mode) .project-hero > div:first-child > details > summary{min-height:var(--control-md)}
  body:not(.login-mode) .project-hero-rag :is(.rag,.pill,.siite-chip){padding:var(--space-1) var(--space-2);font-size:var(--text-xs);letter-spacing:.02em;min-height:0}
}
/* Variations (V2-27): the filters are a row of chips, never stacked
   full-width buttons. */
body:not(.login-mode) .variation-filters{display:flex;flex-wrap:wrap;gap:6px}
body:not(.login-mode) .variation-filters > button{width:auto;flex:0 0 auto;min-height:var(--control-md);padding:0 12px;border-radius:var(--r-pill)}
/* Chips that sit together in one table cell wrap as a row, never stretch. */
.siite-chip-row{display:inline-flex;flex-wrap:wrap;gap:var(--space-1);align-items:center;max-width:100%}
@media(max-width:760px){.siite-data-table .siite-phone-quiet{display:none}}
/* Drawings (V2-30/31): one primary + More; the register table fits its panel. */
.drawing-register-toolbar{display:flex;flex-wrap:wrap;gap:8px;align-items:center}
body:not(.login-mode) .drawing-register-data button.link-button.drawing-scale-toggle{min-height:28px;padding:0;border:0;background:transparent;color:var(--blue);text-decoration:underline;font-size:var(--text-xs);box-shadow:var(--elev-0);text-align:left}
.drawing-register-data td.siite-col-html{vertical-align:top}
.drawing-register-data .drawing-thumb{width:96px;min-height:64px}
.drawing-register-data td .siite-chip-row{flex-direction:column;align-items:flex-start}
.drawing-register-data .drawing-scale-cell{min-width:170px}
.drawing-register-data td[data-label="Title"] .siite-clamp{min-width:170px}
.drawing-register-data td[data-label="Title"]{width:180px}
.drawing-register-data td[data-label="Title"] small{display:block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:260px}
/* Narrower than a wide desktop, the thumbnail column goes (the sheet number
   and View open the same viewer); the table scrolls in its panel with the
   fade if it still must. */
@media(max-width:1320px){.drawing-register-data :is(th,td):first-child{display:none}}
.drawing-register-data tr.superseded-row td{opacity:.75}
@media(max-width:760px){
  body:not(.login-mode) .drawing-register-data button.link-button.drawing-scale-toggle{min-height:var(--control-md)}
  body:not(.login-mode) .drawing-register-toolbar > .primary{flex:1 1 auto}
}
/* Client view (V2-37): the JBP-only tools are one quiet row of small buttons. */
body:not(.login-mode) .client-view-tools{display:flex;flex-wrap:wrap;gap:var(--space-2);margin:0 0 var(--space-3)}
body:not(.login-mode) .client-view-tools > button{width:auto;flex:0 0 auto;min-height:var(--control-md);padding:0 12px;background:transparent;border-color:var(--line);font-size:var(--text-xs)}
/* Messages (V2-38): one pane at a time on a phone; tidy threads. */
.message-back{display:none}
.team-message-body{overflow-wrap:anywhere;word-break:break-word}
body:not(.login-mode) .message-attachment{display:inline-flex;align-items:center;gap:8px;max-width:100%;padding:6px 10px;border:1px solid var(--line);border-radius:var(--r-pill);background:var(--surface-raised);font-size:var(--text-sm)}
body:not(.login-mode) .message-attachment strong{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-weight:600}
body:not(.login-mode) .message-attachment small{color:var(--muted);white-space:nowrap}
.message-sidebar h3 .siite-count{text-transform:none;letter-spacing:0}
@media(max-width:760px){
  .messages-workspace.no-active .message-conversation{display:none}
  .messages-workspace.has-active .message-sidebar{display:none}
  /* With nothing open, the list is the page: channels stacked, sections named. */
  .messages-workspace.no-active .message-sidebar .message-sidebar-scroll{display:block;overflow-x:visible}
  .messages-workspace.no-active .message-sidebar .message-sidebar-scroll h3{display:block}
  .messages-workspace.no-active .message-sidebar .message-channel{width:100%;flex:none}
  body:not(.login-mode) .message-back{display:inline-flex;align-items:center;gap:var(--space-1);min-height:var(--control-md);padding:0 var(--space-2);margin-right:var(--space-2);border:1px solid var(--line);border-radius:var(--r-md);background:#fff;color:var(--ink);font-weight:600;box-shadow:var(--elev-0)}
  .message-conversation-heading{flex-wrap:wrap;align-items:center}
  body:not(.login-mode) .message-attachment small{display:none}
  .message-composer-controls{flex-wrap:wrap;gap:var(--space-2)}
  .message-composer-controls select{flex:1 1 100%;min-width:0}
}
/* Email (Visual 454): sender names, clamped subjects and previews, tidy
   attachment chips; on a phone one pane at a time with a back arrow. */
.email-back{display:none}
/* Visual 459: in the email list the -webkit- clamp did not take in current Chrome - a long subject ran to four lines (the Visual 454 check passed at 59.7px by luck). The standard line-clamp, plus a two-line max-height that holds even where neither clamp applies. */
body:not(.login-mode) .email-message-row .email-row-subject{white-space:normal;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;overflow:hidden;overflow-wrap:anywhere;line-clamp:2;line-height:var(--leading-tight);max-height:calc(2em * 1.25)}
body:not(.login-mode) .email-message-row .email-row-preview{white-space:normal;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;overflow:hidden;overflow-wrap:anywhere;line-clamp:2;line-height:var(--leading-tight);max-height:calc(2em * 1.25)}
.email-subject{overflow-wrap:anywhere}
body:not(.login-mode) .email-attachment-chip{display:inline-flex;align-items:center;gap:6px;max-width:100%;min-height:var(--control-md)}
.email-attachment-chip .email-attachment-name{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:220px}
.email-action-bar{align-items:center}
@media(max-width:760px){
  .email-workspace.no-active .email-detail{display:none}
  .email-workspace.has-active .email-sidebar{display:none}
  body:not(.login-mode) .email-back{display:inline-flex;align-items:center;gap:4px;min-height:var(--control-md);padding:0 10px;margin:0 0 8px;border:1px solid var(--line);border-radius:var(--r-md);background:#fff;color:var(--ink);font-weight:600;box-shadow:var(--elev-0)}
  .email-action-bar{display:grid;grid-template-columns:repeat(3,minmax(0,1fr)) auto;gap:6px}
  .email-action-bar > button{min-width:0;padding:0 6px}
  .email-attachment-chip .email-attachment-name{max-width:170px}
}
/* siiteDataTable on a phone (component fix): a fit column kept its desktop
   width:1% when rows stack, so its cell was 3px wide and its chips and
   buttons spilled over the next cell. Stacked, every cell sizes to its content. */
@media(max-width:760px){
  body:not(.login-mode) .siite-data-table :is(th,td).siite-col-fit{width:auto;white-space:normal}
}
/* Small targets (V3-18): a record row's title is its open control - a 44px
   target on a phone (it was 17px tall). An attachment chip too. */
@media(max-width:760px){
  body:not(.login-mode) .siite-record-row button.link-button.siite-record-title{display:inline-flex;align-items:center;min-height:var(--control-md)}
  body:not(.login-mode) .message-attachment{min-height:var(--control-md)}
}
/* "More" and the row "⋯" on a phone (component): the list opens as a sheet
   along the bottom of the screen, so a menu whose button sits near either
   edge never runs off it. */
@media(max-width:760px){
  .siite-menu-list,.siite-menu[data-align="start"] .siite-menu-list{position:fixed;left:12px;right:12px;top:auto;bottom:calc(12px + env(safe-area-inset-bottom,0px));min-width:0;max-width:none;max-height:70vh;overflow-y:auto;z-index:calc(var(--z-drawer) + 10)}
}
/* ——— end Visual 454 block (more rules below are added per screen) ——— */
@media(max-width:760px){
  body:not(.login-mode) .diary-day{min-height:48px;padding:4px}
  body:not(.login-mode) .diary-day small{display:none}
  .diary-day-blank{min-height:48px}
}
/* The diary's own page (Visual 453, V2-07/V2-08). */
.siite-filing-tech{margin:0 0 var(--space-4);font-size:var(--text-sm)}
.siite-filing-tech summary{cursor:pointer;min-height:var(--control-md);display:flex;align-items:center;font-weight:600;color:var(--blue)}
.siite-filing-tech dl{display:grid;gap:var(--space-2);margin:var(--space-2) 0 0}
.siite-filing-tech dl > div{display:grid;grid-template-columns:minmax(120px,180px) minmax(0,1fr);gap:var(--space-3);padding:var(--space-2) var(--space-2);border:1px solid var(--line-soft);border-radius:var(--r-sm)}
.siite-filing-tech dt{color:var(--muted);font-weight:600}
.siite-filing-tech dd{margin:0;min-width:0;overflow-wrap:anywhere}
.daily-answer-sections{display:grid;gap:var(--space-3);margin-top:var(--space-4)}
.daily-answer-section{border:1px solid var(--line);border-radius:var(--r-md);background:var(--surface-raised);padding:0 var(--space-4)}
.daily-answer-section > summary{cursor:pointer;min-height:var(--control-md);display:flex;align-items:center;gap:4px;font-weight:600;font-size:var(--text-base)}
.daily-answer-section .review-answers{padding:0 0 var(--space-4)}
.daily-answer-silent > summary{color:var(--muted);font-weight:500}
@media(max-width:760px){.siite-filing-tech dl > div{grid-template-columns:1fr;gap:2px}}
/* Phone targets: every control in the new components is 44px tall. */
@media(max-width:760px){
  body:not(.login-mode) :is(.siite-filing,.siite-selection-bar) :is(button.link-button,a),
  body:not(.login-mode) button.link-button.siite-clamp-more,
  body:not(.login-mode) .siite-data-table button.link-button.siite-record-title,
  body:not(.login-mode) .siite-data-table th button.siite-sort,
  .siite-filing-files summary{display:inline-flex;align-items:center;min-height:var(--control-md)}
}
/* A compact data table (inside a card or half-width panel). */
.siite-table-compact{margin:0}
body:not(.login-mode) .siite-table-compact .siite-data-table :is(th,td){padding:var(--space-2) var(--space-2)}
body:not(.login-mode) .siite-table-compact .siite-data-table td.siite-col-text:has(.siite-clamp){min-width:0;width:auto}

/* ——— Visual 456: money, registers and the job pages ——— */
.siite-money{font-variant-numeric:tabular-nums;white-space:nowrap}
.siite-date{white-space:nowrap;font-variant-numeric:tabular-nums}
body:not(.login-mode) .siite-filter-bar button.link-button.siite-filter-clear{min-height:36px;padding:0 var(--space-2);border:0;background:transparent;color:var(--blue);text-decoration:underline;box-shadow:var(--elev-0);margin-left:auto}
body:not(.login-mode) .siite-filter-bar button.link-button.siite-filter-clear:disabled{color:var(--muted);text-decoration:none;cursor:default}
.siite-filter-bar label.siite-filter-field{display:inline-flex;align-items:center;gap:var(--space-2);margin:0;font-size:var(--text-sm);color:var(--muted);white-space:nowrap}
.siite-filter-bar label.siite-filter-field select,.siite-filter-bar label.siite-filter-field input{min-width:0;max-width:220px}
.siite-blocked-details{flex-basis:auto}
.siite-blocked-details[open]{flex-basis:100%}
.siite-blocked-details ul{margin:var(--space-2) 0 0;padding-left:var(--space-4);columns:2 240px;font-size:var(--text-sm);color:var(--muted)}
.siite-blocked-details code{display:block;margin-top:var(--space-2);font-size:var(--text-xs);color:var(--muted);white-space:pre-wrap}
.siite-definition-rows{display:grid;margin:0;border:1px solid var(--line);border-radius:var(--r-md);background:var(--surface-raised);overflow:hidden}
.siite-definition-row{display:grid;grid-template-columns:minmax(140px,1fr) minmax(0,2fr) auto;gap:var(--space-3);align-items:center;padding:var(--space-2) var(--space-4);border-bottom:1px solid var(--line-soft);min-width:0}
.siite-definition-row:last-child{border-bottom:0}
.siite-definition-row dt{font-weight:600;color:var(--ink);margin:0;min-width:0}
.siite-definition-row dd{margin:0;min-width:0;color:var(--ink)}
.siite-definition-row.tone-warn{box-shadow:inset 3px 0 0 var(--warn)}
.siite-definition-row.tone-bad{box-shadow:inset 3px 0 0 var(--bad)}
.siite-definition-action{justify-self:end}
@media(max-width:760px){
  .siite-definition-row{grid-template-columns:minmax(0,1fr) auto}
  .siite-definition-row dd:not(.siite-definition-action){grid-column:1 / -1;order:3}
}
.valuation-drafts-head{display:flex;flex-wrap:wrap;align-items:center;gap:4px 8px;min-width:0}
.valuation-drafts-head small{flex-basis:100%;font-weight:400;color:var(--muted)}
.valuation-drafts .siite-table{margin-top:var(--space-3)}
/* V3-07: money in a hand-written table, marked by alignMoneyCells(). */
body:not(.login-mode) :is(td,th).siite-cell-money{text-align:right;white-space:nowrap;font-variant-numeric:tabular-nums}
body:not(.login-mode) .data-confidence-line button.link-button{min-height:32px;padding:0 4px;border:0;background:transparent;color:var(--blue);text-decoration:underline;font-size:var(--text-sm);box-shadow:var(--elev-0)}
/* V1-06: the invoice filters as one wrapping row. */
.invoice-controls{margin:0 0 var(--space-3)}
.invoice-filter-bar select,.invoice-filter-bar input:not([type=search]){flex:0 1 170px;min-width:0}
.invoice-result-bar select{min-height:36px;width:auto}
/* V1-26: the projects portfolio table and its one-line health strip. */
.project-view-toggle{display:flex;justify-content:flex-end;margin:0 0 var(--space-2)}
.project-view-toggle .siite-tabs{border-bottom:0}
.project-rag-strip{display:inline-flex;flex-wrap:wrap;gap:var(--space-1) var(--space-2);font-size:var(--text-xs);color:var(--muted)}
.project-rag-dot{display:inline-flex;align-items:center;gap:var(--space-1);white-space:nowrap}
.project-rag-dot i{width:10px;height:10px;border-radius:50%;background:var(--status-neutral,#9aa7b4);flex:none}
.project-rag-dot.green i{background:var(--good)}
.project-rag-dot.amber i{background:var(--warn)}
.project-rag-dot.red i{background:var(--bad)}
.projects-portfolio-panel{padding:0;overflow:hidden}
.projects-portfolio-panel .siite-table{margin:0}
/* V1-20: AI QS buttons keep their words on one line ("Import priced BOQ"). */
:is(.drawing-boq-summary, .aiqs-workspace-header, .aiqs-intake-panel, .aiqs-pdf-intake, .aiqs-rate-intake, .aiqs-deliverables) .panel-title .button-row{flex-wrap:wrap}
:is(.drawing-boq-summary, .aiqs-workspace-header, .aiqs-intake-panel, .aiqs-pdf-intake, .aiqs-rate-intake, .aiqs-deliverables) :is(button, a.button-link){white-space:nowrap}
.aiqs-elsewhere{margin:0 0 var(--space-3);align-items:center}
body:not(.login-mode) .aiqs-elsewhere button.link-button{min-height:36px;padding:0 6px;border:0;background:transparent;color:var(--blue);text-decoration:underline;box-shadow:var(--elev-0)}
/* V3-11: the job header - one text back link, the health strip in the meta. */
body:not(.login-mode) .siite-back-link{display:inline-flex;align-items:center;gap:var(--space-1);min-height:32px;margin:0 0 var(--space-1);color:var(--blue);font-size:var(--text-sm);font-weight:600;text-decoration:none}
body:not(.login-mode) .siite-back-link:hover{text-decoration:underline}
/* Job header 489: "Back to …" is one line (it wrapped in a crushed column,
   its first line under the sticky top bar), and a page header that is
   scrolled to comes to rest below the top bar, never under it. */
body:not(.login-mode) .siite-back-link{white-space:nowrap}
body:not(.login-mode) .siite-page-header{scroll-margin-top:calc(var(--siite-jump-top,64px) + var(--space-2))}
.project-hub-header .siite-page-header-meta{flex-wrap:wrap;gap:var(--space-2) var(--space-2)}
/* Job header 489 (Jim, 26 Oct, DL001 Programme): the stacked page header
   (siitePageHeader layout: 'stacked', drawn by the one job header builder on
   every job tab). The back link on its own line; the title block beside the
   actions (the one primary and More, top right, high up), never under 40% of
   the row; the chips - the tab's facts, then this device's status - on their
   own row under the title, wrapping as chips; then the health strip. */
.siite-page-header--stacked{grid-template-columns:minmax(min(40%,100%),1fr) minmax(0,auto);grid-template-areas:"back back" "text actions" "meta meta" "tabs tabs";column-gap:var(--space-6);row-gap:var(--space-2)}
body:not(.login-mode) .siite-page-header--stacked > .siite-back-link{grid-area:back;justify-self:start;margin:0}
.siite-page-header--stacked > .siite-page-header-text{grid-area:text;min-width:0}
.siite-page-header--stacked .siite-page-header-text > .eyebrow{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.siite-page-header--stacked .siite-page-header-text > p:not(.eyebrow){max-width:60ch}
.siite-page-header--stacked > .siite-page-header-actions{grid-area:actions;justify-content:flex-end;align-self:center;min-width:0}
.siite-page-header--stacked > .siite-page-header-actions > button{white-space:nowrap}
.siite-page-header--stacked > .siite-page-header-meta{grid-area:meta;justify-content:flex-start;align-items:center;min-width:0}
.siite-page-header--stacked > .siite-page-header-meta > .pill{max-width:100%;white-space:normal;text-align:left}
.siite-page-header--stacked > .siite-page-header-meta > [data-siite-data-status]{order:9;margin:0} /* the old .compact rule gave it a 12px top margin - a step in the row */
.siite-page-header--stacked > .siite-page-header-tabs{grid-area:tabs}
.project-hub-rag b{font-weight:600;color:var(--ink)}
/* V1-19: the folded programme tools under the one empty state. */
.programme-empty-tools > summary{cursor:pointer;list-style:none;display:flex;align-items:center;gap:8px}
.programme-empty-tools > summary span{display:grid;gap:2px}
.programme-empty-tools > summary small{color:var(--muted);font-weight:400}
.programme-empty-alternatives{margin-top:var(--space-2)}
/* V1-28: instructions folded behind "How it works". */
.siite-how-it-works{margin:var(--space-1) 0 var(--space-2);font-size:var(--text-sm)}
.siite-how-it-works > summary{cursor:pointer;color:var(--blue);font-weight:600;width:max-content}
.siite-how-it-works > p{margin:var(--space-2) 0 0}
.siite-blocked-details > ul,.siite-blocked-details > code{min-width:min(420px,100%)} /* Visual 459: 100% of the open line, not 80vw - on a 320px phone 80vw (256px) was wider than the panel it sits in once the panels kept their 16px insets */
.project-rag-summary{display:grid;gap:var(--space-1);justify-items:start}
.payment-key-dates{display:grid;gap:2px;font-size:var(--text-xs);color:var(--muted)}
.payment-key-dates .siite-date,.payment-key-dates .pill{color:var(--ink);font-size:var(--text-xs)}
body:not(.login-mode) .siite-data-table td.siite-col-status:has(br){white-space:normal}
.quote-exclusions-cell{min-width:200px}
.siite-money.ledger-out{color:var(--ink)}
.siite-money.ledger-in{color:var(--good)}
.project-hub-header .siite-page-header-tabs{margin-top:0}
.project-hub-health .project-rag-strip{gap:var(--space-1) var(--space-4)}
.valuation-drafts > summary{display:flex;align-items:flex-start;gap:8px;cursor:pointer}
.programme-empty-tools > summary{justify-content:space-between}
.programme-empty-tools-toggle{color:var(--blue);font-size:var(--text-sm)}
.programme-empty-start .siite-empty{margin:0}
/* V1-08: workforce person rows. */
.workforce-person-rows .siite-record-facts{display:flex;flex-wrap:wrap;align-items:center;gap:var(--space-1) var(--space-2)}
.person-contact-drawer{display:grid;gap:var(--space-3)}
/* Visual 456: on a phone every "More" / row menu is Visual 454's bottom sheet; the open-right rule is desktop only. */
/* Visual 456: tables drawn by a partial render are now restacked on a phone too
   (applyUkDateDisplay); a stacked cell's inline links wrap inside the cell
   instead of running off a 320px screen (the supplier directory's Onboarding). */
@media(max-width:760px){
  .stacked-table td > *{min-width:0;max-width:100%}
  body:not(.login-mode) .stacked-table td button.link-button{white-space:normal;text-align:left;max-width:100%}
}
/* ── People 457: one profile page per person ─────────────────────────────────
   A navy cover band with the gold edge (the brand), the avatar overlapping it,
   stat chips, then the tabs (one row, scrolling sideways on a phone) and the
   section cards. Calm and professional: no feed chrome, no likes. */
.person-profile{display:grid;gap:var(--space-4);min-width:0;max-width:1180px}
.person-profile-head{position:relative;background:var(--surface);border:1px solid var(--line);border-radius:var(--r-lg);overflow:hidden;box-shadow:var(--shadow-sm)}
.person-profile-cover{height:112px;background:linear-gradient(135deg,var(--navy-900) 0%,var(--navy) 100%);border-bottom:4px solid var(--jbp-gold)}
.person-profile-identity{display:flex;flex-wrap:wrap;align-items:flex-end;gap:var(--space-4);padding:0 var(--space-5) var(--space-4);margin-top:-52px;min-width:0}
.person-profile-avatar{width:104px;height:104px;flex:0 0 104px;border-radius:50%;border:4px solid var(--surface);background:var(--surface-sunken);object-fit:cover;box-shadow:var(--shadow-sm)}
.person-profile-initials{display:grid;place-items:center;background:var(--jbp-navy);color:#fff;font-size:var(--text-3xl);font-weight:700;letter-spacing:.02em}
.person-profile-names{flex:1 1 260px;min-width:0;padding-top:56px}
.person-profile-names h2{margin:0;font-size:var(--text-2xl);line-height:var(--leading-tight);color:var(--ink);overflow-wrap:anywhere}
.person-profile-names .eyebrow{margin:0 0 2px}
.person-profile-meta{margin:4px 0 8px;color:var(--muted)}
.person-profile-chips{display:flex;flex-wrap:wrap;gap:6px;min-width:0}
.person-profile-actions{display:flex;flex-wrap:wrap;gap:8px;align-items:center}
.person-profile-actions .button{min-height:var(--control-md);display:inline-flex;align-items:center}
.person-profile-stats{display:flex;flex-wrap:wrap;gap:10px;padding:0 var(--space-5) var(--space-4)}
.person-profile-stats.compact{padding:0}
.person-profile-stat{display:grid;gap:2px;min-width:120px;padding:10px 14px;border:1px solid var(--line);border-radius:var(--r-md);background:var(--bg)}
.person-profile-stat strong{font-size:var(--text-xl);line-height:var(--leading-none);color:var(--ink);white-space:nowrap}
.person-profile-stat small{color:var(--muted);font-size:var(--text-sm)}
.person-profile-linknote{margin:0;padding:10px var(--space-5);border-top:1px solid var(--line);background:color-mix(in srgb,var(--sand) 16%,var(--surface));color:var(--ink)}
body:not(.login-mode) .person-profile-tabs{margin:0;position:sticky;top:0;z-index:2;background:var(--bg)}
body:not(.login-mode) .person-profile-tabs > :is(button,a){min-height:var(--control-md);padding:10px 16px}
.person-profile-body{min-width:0}
.person-profile-grid{display:grid;gap:var(--space-4);min-width:0}
.person-profile-fields{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:10px 18px}
.person-profile-field{display:grid;gap:2px;min-width:0}
.person-profile-field span{color:var(--muted);font-size:var(--text-sm)}
.person-profile-field strong{font-weight:600;overflow-wrap:anywhere}
.person-profile-note{margin:10px 0 0;color:var(--muted)}
.person-profile-lead{margin:0 0 12px}
/* Roles 467 (R2A-17): a login with no workforce record - its jobs, listed under the login card. */
.person-profile-login-only{display:grid;gap:16px}
.person-profile-login-jobs{list-style:none;margin:12px 0 0;padding:0;display:grid;gap:6px}
.person-profile-login-jobs li{display:flex;gap:8px;align-items:baseline;flex-wrap:wrap;min-height:32px}
.person-profile-why{display:block;max-width:28ch;white-space:normal}
/* Every target on the profile is a 44px one, the record rows' too. */
body:not(.login-mode) .person-profile .siite-record-actions > :is(button,.button){min-height:var(--control-md)}
body:not(.login-mode) .person-profile .siite-record-title.link-button{min-height:var(--control-md);display:inline-flex;align-items:center;text-align:left}
.person-profile-link{font-weight:600;color:var(--blue-2);text-decoration:underline;text-underline-offset:2px}
.person-petl-table th{text-align:left;color:var(--muted);font-weight:600;padding:6px 10px 6px 0}
.person-petl-table td{padding:6px 10px 6px 0}
@media (max-width:760px){
  .person-profile-cover{height:84px}
  .person-profile-identity{padding:0 16px 14px;margin-top:-44px;gap:12px}
  .person-profile-avatar{width:88px;height:88px;flex-basis:88px}
  .person-profile-names{padding-top:0;flex-basis:100%}
  .person-profile-names h2{font-size:var(--text-xl)}
  .person-profile-actions{width:100%}
  .person-profile-actions > .button{flex:1 1 0;justify-content:center}
  .person-profile-stats{padding:0 16px 14px;display:grid;grid-template-columns:repeat(2,minmax(0,1fr))}
  .person-profile-stat{min-width:0}
  .person-profile-linknote{padding:10px 16px}
  /* The stacked phone table: each figure says what it is, and a fitted
     column takes its own width, not 1% of the row. */
  body:not(.login-mode) .person-profile .siite-data-table td.siite-col-fit{width:auto}
  body:not(.login-mode) .person-profile .siite-data-table td:not(.siite-cell-key):not(.siite-col-actions):not(.siite-col-select)[data-label]:not([data-label=""])::before{content:attr(data-label) ": ";color:var(--muted);font-weight:500}
  body:not(.login-mode) .person-profile .siite-data-table tbody tr{gap:var(--space-2) var(--space-4)}
}
/* Visual 456 + 454 (V3-11, V2-26): the ONE job header (projectHubHeaderHtml)
   on a phone - the back link and More on one row, the name, the place on one
   line, the health strip small; a capture page (LM-09) folds it to the back
   link, the form's name and the job. */
@media(max-width:760px){
  /* One column in reading order (back, title, actions, chips, health), by
     flow rather than named rows: a part a page hides (a capture page hides
     the actions, chips and health) leaves no empty row and no gap behind. */
  .siite-page-header--stacked{grid-template-columns:minmax(0,1fr);grid-template-areas:none}
  body:not(.login-mode) .siite-page-header--stacked > *,body:not(.login-mode) .siite-page-header--stacked > .siite-back-link{grid-area:auto}
  .siite-page-header--stacked > .siite-page-header-actions{justify-content:flex-start}
}
@media(max-width:760px){
  body:not(.login-mode) .project-hub-header{gap:var(--space-2) var(--space-2);margin-bottom:var(--space-3)}
  body:not(.login-mode) .project-hub-header .siite-page-header-text h2{font-size:var(--text-lg);margin:0}
  body:not(.login-mode) .project-hub-header .siite-page-header-text p:not(.eyebrow){white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-size:var(--text-xs)}
  body:not(.login-mode) .project-hub-header .eyebrow{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-size:var(--text-xs)}
  body:not(.login-mode) .project-hub-header .project-rag-strip{font-size:var(--text-xs);gap:2px var(--space-2)}
  body:not(.login-mode) .project-hub-header.capture-route :is(.siite-page-header-meta, .siite-page-header-tabs, .siite-page-header-actions){display:none}
}

/* Lead, after Visual 454: on a phone an open conversation is the whole screen,
   like WhatsApp - the page heading and the WhatsApp strip step aside, the
   messages scroll in the space between the header and the composer, and the
   composer sits at the bottom above the tab bar (it no longer floats over the
   messages). Errors still show. */
@media (max-width: 760px){
  /* The live/reconnecting chip stays (Audit F4V-11: "What needs me" is always one press away). */
  body:not(.login-mode) .messages-page.has-active-conversation > .siite-page-header > :not(.siite-page-header-meta),
  body:not(.login-mode) .messages-page.has-active-conversation .team-whatsapp-strip{display:none}
  body:not(.login-mode) .messages-page.has-active-conversation > .siite-page-header{margin:0 0 var(--space-2);padding:0;min-height:0}
  body:not(.login-mode) .messages-page.has-active-conversation .messages-workspace.has-active .message-conversation{display:flex;flex-direction:column;height:calc(100dvh - 68px - var(--tab-bar-h) - 72px);min-height:0}
  body:not(.login-mode) .messages-page.has-active-conversation .messages-workspace.has-active .message-timeline{flex:1 1 auto;min-height:0;max-height:none;overflow-y:auto}
  body[data-auth-state="signed-in"]:not(.external-client-mode) .messages-page.has-active-conversation .message-composer{position:static;bottom:auto}
}
@media (max-width: 760px){
  body:not(.login-mode) .messages-page.has-active-conversation .message-conversation-top{flex:0 0 auto;overflow:visible}
  body:not(.login-mode) .messages-page.has-active-conversation .message-conversation-heading{display:grid;grid-template-columns:auto minmax(0,1fr) auto;align-items:center;gap:8px}
  body:not(.login-mode) .messages-page.has-active-conversation .message-audience{margin:var(--space-2) 0 0;font-size:var(--text-xs)}
  body:not(.login-mode) .messages-page.has-active-conversation .message-composer{padding:var(--space-2) var(--space-2)}
  body:not(.login-mode) .messages-page.has-active-conversation .message-composer textarea{min-height:var(--control-md);height:var(--control-md);resize:none}
  body:not(.login-mode) .messages-page.has-active-conversation .message-composer-controls{display:grid;grid-template-columns:auto minmax(0,1fr) auto auto;gap:var(--space-2);align-items:center}
  body:not(.login-mode) .messages-page.has-active-conversation .message-composer-controls select{grid-column:auto;grid-row:auto;min-width:0;width:100%}
  body:not(.login-mode) .messages-page.has-active-conversation .message-composer-controls button{justify-self:stretch}
}

/* Programme 460: work areas, crews, blockers and the client programme PDF.
   One crew palette for the area chart, the Gantt bar stripe and the legend. */
.programme-460{display:grid;gap:var(--space-4,16px)}
.programme-460 .grid.two{gap:var(--space-4,16px)}
.p460-propose p{max-width:78ch}
.p460-gantt{display:grid;gap:var(--space-2)}
.p460-gantt h4{margin:0}
.p460-gantt-scroll{overflow-x:auto;-webkit-overflow-scrolling:touch;border:1px solid var(--line);border-radius:var(--r-xs);background:var(--surface)}
.p460-gantt-svg{display:block;font-family:inherit}
.p460-gantt-svg .p460-month{font-size:var(--text-xs);font-weight:700;fill:var(--muted)}
.p460-gantt-svg .p460-tick{stroke:var(--line);stroke-width:1}
.p460-gantt-svg .p460-area-bg{fill:var(--p460-area-bg)}
.p460-gantt-svg .p460-area-name{font-size:var(--text-xs);font-weight:700;fill:var(--ink)}
.p460-gantt-svg .p460-area-span{fill:var(--p460-span)}
.p460-gantt-svg .p460-blocker-band{fill:var(--p460-blocker-band);stroke:var(--p460-blocker);stroke-width:1;stroke-dasharray:4 3}
.p460-gantt-svg .p460-blocker-label{font-size:var(--text-xs);font-weight:700;fill:var(--p460-blocker)}
.p460-gantt-svg .p460-task{cursor:pointer}
.p460-gantt-svg .p460-task:focus{outline:none}
.p460-gantt-svg .p460-task:focus .p460-bar,.p460-gantt-svg .p460-task:hover .p460-bar{stroke:var(--ink);stroke-width:1.5}
.p460-gantt-svg .p460-task-name{font-size:var(--text-xs);fill:var(--ink)}
.p460-gantt-svg .p460-bar{fill:var(--crew-8)}
.p460-gantt-svg .p460-bar.crew-tone-0{fill:#9aa7b4}
.p460-gantt-svg .p460-bar.is-critical{stroke:var(--bad,#a63636);stroke-width:2}
.p460-gantt-svg .p460-bar-done{fill:var(--ink);opacity:.55}
.p460-gantt-svg .p460-milestone{fill:var(--ink)}
.p460-gantt-svg .p460-milestone.is-critical{fill:var(--bad,#a63636)}
.p460-gantt-svg .p460-blocker-link{fill:none;stroke:var(--p460-blocker);stroke-width:1.6;stroke-dasharray:5 3}
.p460-gantt-svg .p460-arrow-head{fill:var(--p460-blocker)}
.p460-gantt-svg .p460-today{stroke:var(--cta);stroke-width:1.5;stroke-dasharray:3 3}
.p460-gantt-svg .crew-tone-1{fill:var(--crew-1)}.p460-gantt-svg .crew-tone-2{fill:var(--crew-2)}
.p460-gantt-svg .crew-tone-3{fill:var(--crew-3)}.p460-gantt-svg .crew-tone-4{fill:var(--crew-4)}
.p460-gantt-svg .crew-tone-5{fill:var(--crew-5)}.p460-gantt-svg .crew-tone-6{fill:var(--crew-6)}
.p460-gantt-svg .crew-tone-7{fill:var(--crew-7)}.p460-gantt-svg .crew-tone-8{fill:var(--crew-8)}
.p460-legend{display:flex;flex-wrap:wrap;gap:var(--space-2) var(--space-4);font-size:var(--text-sm);color:var(--muted)}
.p460-legend-item{display:inline-flex;align-items:center;gap:var(--space-2)}
.p460-legend-item i,.p460-crew-swatch{display:inline-block;width:14px;height:10px;border-radius:2px;background:var(--crew-8);vertical-align:middle;margin-right:var(--space-2)}
.p460-legend-item i{margin-right:0}
.p460-legend-item i.crew-tone-1,.p460-crew-swatch.crew-tone-1{background:var(--crew-1)}
.p460-legend-item i.crew-tone-2,.p460-crew-swatch.crew-tone-2{background:var(--crew-2)}
.p460-legend-item i.crew-tone-3,.p460-crew-swatch.crew-tone-3{background:var(--crew-3)}
.p460-legend-item i.crew-tone-4,.p460-crew-swatch.crew-tone-4{background:var(--crew-4)}
.p460-legend-item i.crew-tone-5,.p460-crew-swatch.crew-tone-5{background:var(--crew-5)}
.p460-legend-item i.crew-tone-6,.p460-crew-swatch.crew-tone-6{background:var(--crew-6)}
.p460-legend-item i.crew-tone-7,.p460-crew-swatch.crew-tone-7{background:var(--crew-7)}
.p460-legend-item i.crew-tone-8,.p460-crew-swatch.crew-tone-8{background:var(--crew-8)}
.p460-legend-item i.p460-legend-critical{background:transparent;border:2px solid var(--bad,#a63636)}
.p460-legend-item i.p460-legend-blocker{background:var(--p460-blocker-band);border:1px dashed var(--p460-blocker)}
.p460-findings{margin:var(--space-2) 0 0;padding:0;list-style:none;display:grid;gap:var(--space-2)}
.p460-finding{padding:var(--space-2) var(--space-2);border-radius:var(--r-xs);border-left:3px solid var(--line);background:var(--surface-muted,#f6f8fb);font-size:var(--text-sm)}
.p460-finding.error{border-left-color:var(--bad,#a63636)}
.p460-finding.warning{border-left-color:var(--p460-blocker)}
.p460-finding.info{border-left-color:var(--navy)}
.p460-proposal{display:grid;gap:var(--space-3);margin-top:var(--space-3)}
.p460-compare{width:100%;border-collapse:collapse;font-size:var(--text-sm)}
.p460-compare th,.p460-compare td{padding:var(--space-2) var(--space-2);border-bottom:1px solid var(--line);text-align:left;vertical-align:top}
.p460-compare thead th{font-size:var(--text-xs);color:var(--muted);text-transform:uppercase;letter-spacing:.1em;font-weight:600}
.p460-headline{margin:0;font-size:var(--text-base)}
.p460-details summary{cursor:pointer;font-weight:600;min-height:var(--control-sm);display:flex;align-items:center}
.p460-details ul{margin:var(--space-2) 0 0;padding-left:var(--space-5);display:grid;gap:var(--space-1)}
.p460-area-chip{display:inline-block;padding:0 var(--space-2);border-radius:10px;background:var(--p460-area-bg);color:var(--ink);font-weight:600}
.p460-rules{list-style:none;margin:0;padding:0;display:grid;gap:var(--space-2)}
.p460-rule{padding:var(--space-2) var(--space-3);border:1px solid var(--line);border-radius:var(--r-xs);background:var(--surface)}
.p460-rule p{margin:var(--space-1) 0 0}
.p460-rule.proposed{border-color:var(--p460-blocker)}
.p460-rule.archived{opacity:.65}
.programme-builder-bar.has-crew{box-shadow:inset 5px 0 0 var(--crew-8),var(--shadow-card)}
.programme-builder-bar.has-crew.crew-tone-1{box-shadow:inset 5px 0 0 var(--crew-1),var(--shadow-card)}
.programme-builder-bar.has-crew.crew-tone-2{box-shadow:inset 5px 0 0 var(--crew-2),var(--shadow-card)}
.programme-builder-bar.has-crew.crew-tone-3{box-shadow:inset 5px 0 0 var(--crew-3),var(--shadow-card)}
.programme-builder-bar.has-crew.crew-tone-4{box-shadow:inset 5px 0 0 var(--crew-4),var(--shadow-card)}
.programme-builder-bar.has-crew.crew-tone-5{box-shadow:inset 5px 0 0 var(--crew-5),var(--shadow-card)}
.programme-builder-bar.has-crew.crew-tone-6{box-shadow:inset 5px 0 0 var(--crew-6),var(--shadow-card)}
.programme-builder-bar.has-crew.crew-tone-7{box-shadow:inset 5px 0 0 var(--crew-7),var(--shadow-card)}
.programme-builder-bar.has-crew.crew-tone-8{box-shadow:inset 5px 0 0 var(--crew-8),var(--shadow-card)}
.programme-gantt-overlay .pb-blockerlink{stroke:var(--p460-blocker);stroke-width:1.6;stroke-dasharray:5 3;fill:none}
.client-programme-pdf-card{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:var(--space-3)}
.client-programme-pdf-card h3{margin:2px 0 var(--space-1)}
.client-programme-pdf-card p{margin:0;max-width:70ch}
@media (max-width:767px){
  .programme-460 .grid.two{grid-template-columns:1fr}
  .p460-compare{font-size:var(--text-xs)}
  .p460-compare th,.p460-compare td{padding:var(--space-2)}
}
.p460-stack{display:grid;gap:var(--space-4)}
/* Subcontract 465: the quote row's order buttons (Issue/Re-issue, Edit, Void, Remove) sit two a line, never one word a line. */
.compact-table td.quote-order-actions{min-width:220px}
/* ——— Programme speed 470 (R2B-13, R2B-14) ———
   The task register's one action and its ⋯ sit together; on a phone each
   activity stacks with its fields two to a line (R2B-14). A command-centre
   item keeps one action beside its ⋯ (it stacked three full-width buttons). */
.programme-task-actions{display:flex;align-items:flex-end;gap:var(--space-2)}
.programme-control-actions:has(> .siite-menu){display:flex;align-items:center;gap:var(--space-2)}
.programme-control-actions:has(> .siite-menu) > button{flex:1 1 auto;width:auto}
@media(max-width:760px){
  .programme-task-controls{grid-template-columns:repeat(2,minmax(0,1fr))}
  .programme-task-controls .wide,.programme-task-actions{grid-column:1/-1}
  .programme-task-actions > button{flex:1 1 auto}
}
/* Phone tap floor, 44px (R2B-13): the jump links (36), the back link (32),
   the calendar's previous / next (31 wide) and "+N more" (37), the clamp
   "more" (30 wide), the task board's Select tick (13), the programme
   readiness links (41 wide), and the Gantt bars (31 tall). A month cell's day
   number already presses the whole cell (its ::after covers the cell). */
@media(max-width:760px){
  .siite-jump-link{min-height:var(--control-md)}
  body:not(.login-mode) .siite-back-link{min-height:var(--control-md)}
  #calendar .cal-nav button{min-width:var(--control-md)}
  #calendar .cal-more{display:inline-flex;align-items:center;min-height:var(--control-sm)}
  body:not(.login-mode) button.link-button.siite-clamp-more{min-width:var(--control-md);justify-content:center}
  body:not(.login-mode) .task-bulk-select{min-height:var(--control-sm)}
  .task-bulk-select input{width:24px;height:24px}
  body:not(.login-mode) button.table-link{display:inline-flex;align-items:center;min-height:var(--control-md);min-width:var(--control-md)}
  .programme-builder-bar{top:14px;height:var(--control-md);min-width:var(--control-md)}
}
/* R2B-13: the whole activity row of the area chart is its press (a transparent band). */
.p460-hit{fill:transparent}

/* ——— Hub 473 (R2B-09) ———
   A job's page pills and its "On this page" links are ONE strip: the pages,
   a divider, then the sections. The strip sticks under the header (the jump
   bar did on its own); it scrolls sideways on a phone with a fade that says
   there is more. */
body:not(.login-mode) .project-page-strip{position:sticky;top:var(--siite-jump-top,0px);z-index:var(--z-sticky,8);display:flex;flex-wrap:nowrap;align-items:center;gap:var(--space-2);max-width:100%;margin:calc(var(--space-2) * -1) 0 var(--space-4);padding:var(--space-1) var(--space-2);overflow-x:auto;scrollbar-width:none;background:rgba(244,247,251,.94);-webkit-backdrop-filter:saturate(1.6) blur(12px);backdrop-filter:saturate(1.6) blur(12px);border:1px solid var(--line);border-radius:var(--r-pill)}
body:not(.login-mode) .project-page-strip::-webkit-scrollbar{display:none}
body:not(.login-mode) .project-page-strip > .siite-tabs.project-subtabs{flex:0 0 auto;flex-wrap:nowrap;margin:0;overflow:visible}
body:not(.login-mode) .project-page-strip > .siite-jump-bar.is-merged{position:static;flex:0 0 auto;margin:0;padding:0 0 0 var(--space-2);overflow:visible;background:none;-webkit-backdrop-filter:none;backdrop-filter:none;border:0;border-left:1px solid var(--line);border-radius:0}
body:not(.login-mode) .project-page-strip > .siite-jump-bar.is-merged .siite-jump-link:not(.is-current){color:var(--muted)}
@media(max-width:760px){
  body:not(.login-mode) .project-page-strip{margin-inline:calc(-1 * var(--space-1));border-radius:var(--r-md);-webkit-mask-image:linear-gradient(to right,#000 calc(100% - 28px),transparent);mask-image:linear-gradient(to right,#000 calc(100% - 28px),transparent)}
  #projectHubContent:has(> .capture-route) > .project-page-strip{display:none}
}

/* ——— Hub 473 (R2B-15): the approval queue's flags are one-line chips ———
   Each chip is one line (its sentence is the row's summary and its hover
   text); the chips wrap as a row, never inside themselves. */
.labour-queue-chips{display:flex;flex-wrap:wrap;align-items:center;gap:var(--space-1)}
.labour-time-side .siite-record-facts .labour-queue-chips .pill,
.siite-record-facts .labour-queue-chips .pill{margin:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:100%}
.labour-queue-row .siite-record-summary{color:var(--ink)}

/* ——— Hub 473 (R2B-23): a busy month day is "type · count" chips ——— */
.cal-chip-kind .cal-kind-count{flex:0 0 auto;font-weight:700;font-variant-numeric:tabular-nums;white-space:nowrap}
.cal-chip-kind.cal-alert .cal-kind-count{color:var(--bad)}
@media (max-width:720px){
  .cal-cell .cal-chip-kind{gap:2px}
  .cal-cell .cal-chip-kind .cal-kind-count{font-size:var(--text-xs)}
}
.cal-scale-note{display:flex;flex-wrap:wrap;align-items:center;gap:var(--space-1) var(--space-2);margin:0 0 var(--space-3)}
.cal-scale-note .link-button{min-height:var(--control-sm);padding:0;border:0;background:transparent;color:var(--blueprint);font-weight:600;text-decoration:underline;box-shadow:none}

/* ——— Hub 473 (R2B-17): My jobs fits a laptop, and says "PM not linked" once ——— */
.pm-board-unlinked{margin:0 0 var(--space-3);font-size:var(--text-sm)}
/* The board's eleven columns fit 1440 (they ran 56px past it, the Safety
   column cut off): a cell with nothing to say ("—") is as narrow as a tick,
   and a worded cell starts at 104px. Narrower windows scroll, with the fade
   and the sticky job column. */
body:not(.login-mode) #pmBoard button.siite-matrix-cell.pm-board-cell{min-width:104px}
body:not(.login-mode) #pmBoard button.siite-matrix-cell.pm-board-cell.good,
body:not(.login-mode) #pmBoard button.siite-matrix-cell.pm-board-cell:not(.good):not(.warn):not(.bad){min-width:56px;align-items:center}
@media(max-width:760px){
  body:not(.login-mode) #pmBoard button.siite-matrix-cell.pm-board-cell{min-width:0}
}
/* Variations 474: the variation loop on a variation's page (logged -> priced -> submitted -> agreed), the rule line, Siite's draft banner and the time-related claim. */
.variation-loop-strip{list-style:none;display:flex;flex-wrap:wrap;gap:var(--space-2);padding:0;margin:var(--space-3) 0}
.variation-loop-strip li{display:grid;gap:2px;padding:8px 12px;border-radius:var(--r-xs);border:1px solid var(--line);background:var(--panel);min-width:120px}
.variation-loop-strip li.done{border-color:var(--good);}
.variation-loop-strip li.todo{opacity:.7}
.variation-loop-strip small{color:var(--muted);font-size:var(--text-xs)}
.variation-rules-line{margin:var(--space-2) 0}
.variation-rules-list{margin:var(--space-2) 0;padding-left:1.2em;display:grid;gap:4px}
.variations-at-risk-line,.siite-draft-banner{margin:var(--space-2) 0}
.time-claim-line{margin:var(--space-2) 0}

/* Speed 479 (R2C-16/19): a part of a page drawn a task later stands in its own placeholder; the placeholder takes no box of its own, so a grid or a flex row lays the part out exactly as if it had been drawn in place. */
.siite-deferred-slot{display:contents}
