:root, [data-theme="dark"]{
  --bg:#0b0e17; --bg2:#121826; --bg3:#1a2235; --bg4:#222d45;
  --b:#243050; --b2:#2e3d60;
  --tx:#eaecf4; --tx2:#8896b8; --tx3:#4a5878;
  --blue:#4d8aff; --blue-d:#162050;
  --green:#00d180; --green-d:#00341f;
  --amber:#f5a623; --amber-d:#3d2800;
  --red:#ff4d4d; --red-d:#3d0f0f;
  --purple:#9b6dff; --purple-d:#1e1040;
  --teal:#00c9b1; --teal-d:#003d36;
  --orange:#e86d3d; --orange-d:#3d1a0a;
  --r:6px; --rl:10px;
  --shadow:0 1px 2px rgba(0,0,0,0.35);
  --shadow-lg:0 4px 20px rgba(0,0,0,0.5);
  --sidebar-bg:#0a0d15;
  --sidebar-hover:#1a2235;
  --sidebar-active-bg:rgba(77,138,255,0.12);
  --sidebar-active-border:#4d8aff;
}

[data-theme="light"]{
  --bg:#f5f7fa; --bg2:#ffffff; --bg3:#f0f3f8; --bg4:#e4e9f2;
  --b:#dde3ec; --b2:#c5cfdb;
  --tx:#1a2332; --tx2:#4a5878; --tx3:#8896b8;
  --blue:#2563eb; --blue-d:#dbeafe;
  --green:#059669; --green-d:#d1fae5;
  --amber:#d97706; --amber-d:#fef3c7;
  --red:#dc2626; --red-d:#fee2e2;
  --purple:#7c3aed; --purple-d:#ede9fe;
  --teal:#0891b2; --teal-d:#cffafe;
  --orange:#ea580c; --orange-d:#ffedd5;
  --shadow:0 1px 2px rgba(0,0,0,0.06);
  --shadow-lg:0 4px 16px rgba(0,0,0,0.08);
  --sidebar-bg:#ffffff;
  --sidebar-hover:#f0f3f8;
  --sidebar-active-bg:#dbeafe;
  --sidebar-active-border:#2563eb;
}

/* [THEME-DAYLIGHT-V1] Daylight Dark — higher-contrast dark theme
   for outdoor / sunlit hangar use. Lighter backgrounds than pure Dark,
   brighter accent colors, stronger text contrast to fight sun glare. */
[data-theme="daylight"]{
  --bg:#1e293b; --bg2:#334155; --bg3:#475569; --bg4:#64748b;
  --b:#64748b; --b2:#94a3b8;
  --tx:#f8fafc; --tx2:#cbd5e1; --tx3:#94a3b8;
  --blue:#60a5fa; --blue-d:#1e3a8a;
  --green:#4ade80; --green-d:#14532d;
  --amber:#fbbf24; --amber-d:#78350f;
  --red:#f87171; --red-d:#7f1d1d;
  --purple:#a78bfa; --purple-d:#4c1d95;
  --teal:#2dd4bf; --teal-d:#134e4a;
  --orange:#fb923c; --orange-d:#7c2d12;
  --shadow:0 1px 2px rgba(0,0,0,0.45);
  --shadow-lg:0 4px 20px rgba(0,0,0,0.55);
  --sidebar-bg:#0f172a;
  --sidebar-hover:#334155;
  --sidebar-active-bg:rgba(96,165,250,0.18);
  --sidebar-active-border:#60a5fa;
}

/* ╔══════════════════════════════════════════════════════════════════════╗
   ║ [PHASE-3 SEMANTIC TOKENS] — theme-agnostic state vocabulary          ║
   ║                                                                       ║
   ║ Layer 2 of the 3-layer design system:                                 ║
   ║   Layer 1 — brand palette (--red, --green, --amber, ...) per theme    ║
   ║   Layer 2 — SEMANTIC tokens (this block) — names states, not colors   ║
   ║   Layer 3 — state classes (.s-aog, .sev-high, .t-overdue, ...)        ║
   ║                                                                       ║
   ║ Each state has TWO tokens:                                            ║
   ║   --color-<state>        foreground tone (text, border, icon)         ║
   ║   --color-<state>-soft   background tint (matches .bdg.X pattern)     ║
   ║                                                                       ║
   ║ Per-tenant theming (Step 7): the tenant stylesheet redefines any of   ║
   ║ these tokens to brand the SaaS without code changes. Example:         ║
   ║   :root { --color-status-aog: #C00; --color-status-aog-soft: #FEE; }  ║
   ║                                                                       ║
   ║ DO NOT reference Layer 1 palette tokens (--red, etc.) directly from   ║
   ║ JS-rendered HTML. Use a Layer 3 class so tenant overrides take effect.║
   ╚══════════════════════════════════════════════════════════════════════╝ */
:root {
  /* ── Status tokens (assets, defects, work orders, ADs, AMP tasks) ── */
  --color-status-aog:               var(--red);
  --color-status-aog-soft:          var(--red-d);
  --color-status-grounded:          var(--red);
  --color-status-grounded-soft:     var(--red-d);
  --color-status-overdue:           var(--red);
  --color-status-overdue-soft:      var(--red-d);
  --color-status-open:              var(--red);
  --color-status-open-soft:         var(--red-d);
  --color-status-due-soon:          var(--amber);
  --color-status-due-soon-soft:     var(--amber-d);
  --color-status-in-progress:       var(--amber);
  --color-status-in-progress-soft:  var(--amber-d);
  --color-status-draft:             var(--amber);
  --color-status-draft-soft:        var(--amber-d);
  --color-status-deferred:          var(--orange);
  --color-status-deferred-soft:     var(--orange-d);
  --color-status-stored:            var(--purple);
  --color-status-stored-soft:       var(--purple-d);
  --color-status-maint:             var(--amber);
  --color-status-maint-soft:        var(--amber-d);
  --color-status-ok:                var(--green);
  --color-status-ok-soft:           var(--green-d);
  --color-status-approved:          var(--green);
  --color-status-approved-soft:     var(--green-d);
  --color-status-complied:          var(--green);
  --color-status-complied-soft:     var(--green-d);
  --color-status-closed:            var(--green);
  --color-status-closed-soft:       var(--green-d);
  --color-status-done:              var(--green);
  --color-status-done-soft:         var(--green-d);
  --color-status-serviceable:       var(--green);
  --color-status-serviceable-soft:  var(--green-d);
  --color-status-superseded:        var(--tx3);
  --color-status-superseded-soft:   var(--bg4);
  --color-status-archived:          var(--tx3);
  --color-status-archived-soft:     var(--bg4);
  --color-status-pending:           var(--tx3);
  --color-status-pending-soft:      var(--bg4);
  --color-status-info:              var(--blue);
  --color-status-info-soft:         var(--blue-d);

  /* ── Severity tokens — SMS risk, quality findings, audits ── */
  /* SMS scale — Extreme/High/Medium/Low (5×5 risk matrix) */
  --color-severity-extreme:         var(--red);
  --color-severity-extreme-soft:    var(--red-d);
  --color-severity-high:            var(--orange);
  --color-severity-high-soft:       var(--orange-d);
  --color-severity-medium:          var(--amber);
  --color-severity-medium-soft:     var(--amber-d);
  --color-severity-low:             var(--green);
  --color-severity-low-soft:        var(--green-d);
  /* Quality scale — Major/Minor/Observation (EASA Part-145 audits) */
  --color-severity-major:           var(--red);
  --color-severity-major-soft:      var(--red-d);
  --color-severity-minor:           var(--amber);
  --color-severity-minor-soft:      var(--amber-d);
  --color-severity-observation:     var(--tx3);
  --color-severity-observation-soft:var(--bg4);
  /* Cross-domain */
  --color-severity-critical:        var(--red);
  --color-severity-critical-soft:   var(--red-d);
  --color-severity-info:            var(--blue);
  --color-severity-info-soft:       var(--blue-d);

  /* ── Time-to-event tokens — days-overdue / days-to-due bands ── */
  --color-time-overdue:             var(--red);     /* d < 0 */
  --color-time-overdue-soft:        var(--red-d);
  --color-time-due-soon:            var(--amber);   /* 0 ≤ d ≤ 30 */
  --color-time-due-soon-soft:       var(--amber-d);
  --color-time-ok:                  var(--green);   /* d > 30 */
  --color-time-ok-soft:              var(--green-d);
  --color-time-not-set:             var(--tx3);     /* null / unscheduled */
  --color-time-not-set-soft:        var(--bg4);
}

*{box-sizing:border-box;margin:0;padding:0;}

/* Modern scrollbar */
*::-webkit-scrollbar{width:10px;height:10px;}
*::-webkit-scrollbar-track{background:transparent;}
*::-webkit-scrollbar-thumb{background:var(--bg4);border-radius:5px;border:2px solid var(--bg);}
*::-webkit-scrollbar-thumb:hover{background:var(--b2);}

/* Text selection */
::selection{background:var(--blue);color:#fff;}
body{font-family:'IBM Plex Sans',sans-serif;background:var(--bg);color:var(--tx);font-size:14px;line-height:1.5;overflow:hidden;transition:background 0.2s, color 0.2s;}
input, select, textarea, button{transition:background 0.2s, color 0.2s, border-color 0.2s;}
#app{display:none;height:100vh;flex-direction:row;}
#app.on{display:flex;}

/* ── SIDEBAR NAVIGATION ────────────────────────────── */
.sidebar{width:210px;background:var(--sidebar-bg);border-right:1px solid var(--b);display:flex;flex-direction:column;flex-shrink:0;transition:width 0.25s;overflow:hidden;}
.sidebar.collapsed{width:56px;}
.sb-brand{display:flex;align-items:center;gap:9px;padding:15px 16px;border-bottom:1px solid var(--b);cursor:pointer;flex-shrink:0;height:58px;}
.sb-logo{width:28px;height:28px;border-radius:7px;background:linear-gradient(135deg,#4d8aff,#00c9b1);display:flex;align-items:center;justify-content:center;flex-shrink:0;}
.sb-logo svg{width:14px;height:14px;fill:#fff;}
.sb-name{font-family:'IBM Plex Mono',monospace;font-size:14px;font-weight:600;color:var(--tx);white-space:nowrap;overflow:hidden;}
.sidebar.collapsed .sb-name{display:none;}
.sb-nav{flex:1;padding:12px 8px;overflow-y:auto;display:flex;flex-direction:column;gap:2px;}
.sb-item{display:flex;align-items:center;gap:11px;padding:9px 12px;border-radius:var(--r);color:var(--tx2);cursor:pointer;font-size:13px;white-space:nowrap;overflow:hidden;border-left:3px solid transparent;transition:all 0.15s;}
.sb-item:hover{background:var(--sidebar-hover);color:var(--tx);}
.sb-item.on{background:var(--sidebar-active-bg);color:var(--blue);border-left-color:var(--sidebar-active-border);font-weight:500;}
.sb-icon{font-size:16px;width:20px;text-align:center;flex-shrink:0;}
.sb-label{flex:1;}
.sb-badge{font-family:'IBM Plex Mono',monospace;font-size:10px;padding:2px 6px;border-radius:10px;background:var(--red);color:#fff;font-weight:600;}
.sidebar.collapsed .sb-label, .sidebar.collapsed .sb-badge{display:none;}
.sb-divider{height:1px;background:var(--b);margin:8px 0;}
.sb-foot{padding:10px 8px;border-top:1px solid var(--b);display:flex;flex-direction:column;gap:2px;}
.sb-toggle{display:flex;align-items:center;justify-content:center;padding:8px;border-radius:var(--r);color:var(--tx3);cursor:pointer;border:none;background:transparent;font-size:14px;width:100%;}
.sb-toggle:hover{background:var(--sidebar-hover);color:var(--tx);}

/* ── MAIN AREA ─────────────────────────────────────── */
.main-area{flex:1;display:flex;flex-direction:column;min-width:0;}
.topbar{height:58px;background:var(--bg2);border-bottom:1px solid var(--b);display:flex;align-items:center;padding:0 20px;gap:14px;flex-shrink:0;}
.tb-search{flex:1;max-width:480px;position:relative;}
.tb-search input{width:100%;padding:8px 11px 8px 34px;background:var(--bg3);border:1px solid var(--b);border-radius:var(--r);color:var(--tx);font-size:12px;font-family:'IBM Plex Sans',sans-serif;outline:none;}
.tb-search input:focus{border-color:var(--blue);}
.tb-search::before{content:'⌕';position:absolute;left:11px;top:50%;transform:translateY(-50%);color:var(--tx3);font-size:14px;pointer-events:none;}
.tb-right{margin-left:auto;display:flex;align-items:center;gap:10px;}
.tb-icon-btn{width:36px;height:36px;border-radius:var(--r);border:1px solid var(--b);background:var(--bg3);color:var(--tx2);cursor:pointer;display:flex;align-items:center;justify-content:center;font-size:14px;position:relative;}
.tb-icon-btn:hover{background:var(--bg4);color:var(--tx);}
.tb-user{display:flex;align-items:center;gap:9px;padding:5px 11px 5px 5px;background:var(--bg3);border:1px solid var(--b);border-radius:20px;cursor:pointer;position:relative;}
.tb-user:hover{background:var(--bg4);}
.tb-user .uav{width:26px;height:26px;}
.uav{width:20px;height:20px;border-radius:50%;display:flex;align-items:center;justify-content:center;font-size:8px;font-weight:700;flex-shrink:0;}
.tb-udetails{display:flex;flex-direction:column;}
.tb-uname{font-size:12px;font-weight:500;color:var(--tx);line-height:1.1;}
.tb-urole{font-size:10px;color:var(--tx3);line-height:1.1;margin-top:1px;}
.tb-caret{color:var(--tx3);font-size:9px;margin-left:4px;}

/* User dropdown menu */
.user-menu{position:absolute;top:calc(100% + 6px);right:0;background:var(--bg2);border:1px solid var(--b);border-radius:var(--r);box-shadow:var(--shadow-lg);width:220px;display:none;z-index:1000;overflow:hidden;}
.user-menu.on{display:block;}
.um-header{padding:12px 14px;border-bottom:1px solid var(--b);}
.um-name{font-size:13px;font-weight:600;color:var(--tx);}
.um-email{font-size:10px;color:var(--tx3);margin-top:2px;}
.um-item{padding:9px 14px;font-size:12px;color:var(--tx2);cursor:pointer;display:flex;align-items:center;gap:9px;border:none;background:transparent;width:100%;text-align:left;font-family:'IBM Plex Sans',sans-serif;}
.um-item:hover{background:var(--bg3);color:var(--tx);}
.um-item.danger{color:var(--red);}
.um-item.danger:hover{background:var(--red-d);}

.bellb{position:absolute;top:2px;right:2px;width:15px;height:15px;border-radius:50%;background:var(--red);font-size:8px;color:#fff;display:flex;align-items:center;justify-content:center;font-family:'IBM Plex Mono',monospace;border:2px solid var(--bg2);}

/* [NOTIF-CENTER-V1 2026-05-30] Notification drawer anchored to 🛎️
   button in the topbar. Same visual language as the user-menu so it
   feels native. Rows are dense (no big avatars) — the priority is
   chronology + click-through to the underlying surface. */
.notif-menu{position:absolute;top:calc(100% + 6px);right:0;background:var(--bg2);border:1px solid var(--b);border-radius:var(--r);box-shadow:var(--shadow-lg);width:340px;max-height:480px;display:none;z-index:1000;overflow:hidden;flex-direction:column;}
.notif-menu.on{display:flex;}
.nm-header{padding:10px 14px;border-bottom:1px solid var(--b);display:flex;align-items:center;justify-content:space-between;}
.nm-title{font-size:13px;font-weight:600;color:var(--tx);}
.nm-mark-all{font-size:10px;color:var(--tx3);background:transparent;border:1px solid var(--b);border-radius:4px;padding:3px 8px;cursor:pointer;font-family:inherit;}
.nm-mark-all:hover{background:var(--bg3);color:var(--tx);}
.nm-body{flex:1 1 auto;overflow-y:auto;}
.nm-empty{padding:30px 14px;text-align:center;font-size:11px;color:var(--tx3);}
.nm-row{padding:10px 14px;border-bottom:1px solid var(--b);cursor:pointer;display:flex;gap:9px;align-items:flex-start;}
.nm-row:hover{background:var(--bg3);}
.nm-row.unread{background:rgba(33,150,243,0.06);}
.nm-row.unread .nm-r-title{font-weight:600;color:var(--tx);}
.nm-r-icon{font-size:16px;flex:0 0 auto;line-height:1;}
.nm-r-body{flex:1 1 auto;min-width:0;}
.nm-r-title{font-size:12px;color:var(--tx2);line-height:1.3;}
.nm-r-sub{font-size:10px;color:var(--tx3);margin-top:3px;line-height:1.3;overflow:hidden;text-overflow:ellipsis;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;}
.nm-r-when{font-size:9px;color:var(--tx3);margin-top:4px;font-family:'IBM Plex Mono',monospace;text-transform:uppercase;letter-spacing:0.05em;}

/* Keep legacy topbar classes for compatibility */
.tlogo,.tli,.tlb,.tnav,.tn,.tdiv{display:none;}
.tright{display:none;}

/* LOGIN */
#ls{position:fixed;inset:0;background:var(--bg);display:flex;align-items:center;justify-content:center;z-index:999;}
.lbg{position:absolute;inset:0;background:radial-gradient(ellipse at 30% 50%,rgba(77,138,255,.08),transparent 60%);pointer-events:none;}
.lcard{background:var(--bg2);border:1px solid var(--b);border-radius:14px;padding:36px;width:390px;position:relative;}
.logo-r{display:flex;align-items:center;gap:10px;margin-bottom:26px;}
.logo-i{width:40px;height:40px;border-radius:9px;background:linear-gradient(135deg,#4d8aff,#00c9b1);display:flex;align-items:center;justify-content:center;}
.logo-i svg{width:20px;height:20px;fill:#fff;}
.logo-n{font-family:'IBM Plex Mono',monospace;font-size:17px;font-weight:500;}
.logo-s{font-size:9px;color:var(--tx3);letter-spacing:.09em;text-transform:uppercase;}
.l-title{font-size:16px;font-weight:600;margin-bottom:3px;}
.l-sub{font-size:12px;color:var(--tx2);margin-bottom:18px;}
.lf{display:flex;flex-direction:column;gap:4px;margin-bottom:11px;}
.ll{font-size:10px;color:var(--tx3);text-transform:uppercase;letter-spacing:.07em;}
.li{padding:9px 11px;background:var(--bg3);border:1px solid var(--b);border-radius:var(--r);color:var(--tx);font-size:13px;font-family:'IBM Plex Sans',sans-serif;outline:none;width:100%;}
.li:focus{border-color:var(--blue);}
.li.err{border-color:var(--red);}
.lbtn{width:100%;padding:10px;background:var(--blue);border:none;border-radius:var(--r);color:#fff;font-size:13px;font-weight:600;font-family:'IBM Plex Sans',sans-serif;cursor:pointer;margin-top:3px;}
.lbtn:hover{background:#6699ff;}
.lerr{background:var(--red-d);border:1px solid var(--red);border-radius:var(--r);padding:8px 11px;font-size:12px;color:var(--red);margin-top:8px;display:none;}
.lerr.show{display:block;}
.ql-wrap{margin-top:18px;padding-top:16px;border-top:1px solid var(--b);}
.ql-lbl{font-size:9px;color:var(--tx3);text-transform:uppercase;letter-spacing:.08em;margin-bottom:7px;}
.ql-grid{display:grid;grid-template-columns:1fr 1fr;gap:6px;}
.qb{padding:7px 9px;background:var(--bg3);border:1px solid var(--b);border-radius:var(--r);cursor:pointer;}
.qb:hover{background:var(--bg4);}
.qr{font-size:10px;font-weight:600;margin-bottom:1px;}
.qu{font-size:9px;color:var(--tx3);font-family:'IBM Plex Mono',monospace;}

/* APP SHELL */
.url{font-size:9px;color:var(--tx3);}
.lox{background:none;border:none;color:var(--tx3);cursor:pointer;font-size:13px;padding:2px 5px;}
.lox:hover{color:var(--red);}
.content{flex:1;overflow-y:auto;}

/* PAGES */
.page{display:none;padding:20px 28px 32px;}
.page.on{display:block;}
.ph{display:flex;align-items:flex-start;justify-content:space-between;flex-wrap:wrap;gap:12px;margin-bottom:18px;padding-bottom:14px;border-bottom:1px solid var(--b);}
.pt{font-size:22px;font-weight:700;letter-spacing:-0.3px;}
.ps{font-size:11px;color:var(--tx3);margin-top:3px;font-family:'IBM Plex Mono',monospace;text-transform:uppercase;letter-spacing:.08em;}
.ha{display:flex;gap:8px;align-items:center;}

/* MODERN TABS - pill style */
.tabs{display:flex;gap:4px;margin-bottom:16px;overflow-x:auto;padding:4px;background:var(--bg2);border:1px solid var(--b);border-radius:var(--rl);scrollbar-width:thin;}
.tab{padding:7px 14px;font-size:12px;cursor:pointer;color:var(--tx2);border-radius:var(--r);white-space:nowrap;font-weight:500;transition:all 0.15s;display:flex;align-items:center;gap:5px;}
.tab:hover{color:var(--tx);background:var(--bg3);}
.tab.on{color:#fff;background:var(--blue);box-shadow:var(--shadow);}
.tc{display:none;}.tc.on{display:block;}
.tbn{display:inline-block;font-family:'IBM Plex Mono',monospace;font-size:9px;padding:1px 5px;border-radius:3px;margin-left:3px;background:var(--bg4);color:var(--tx3);}
.tab.on .tbn{background:rgba(255,255,255,0.25);color:#fff;}
.tbnr{background:var(--red-d);color:var(--red);}
.tbna{background:var(--amber-d);color:var(--amber);}

/* METRICS */
.mx{display:grid;gap:10px;margin-bottom:14px;}
.m5{grid-template-columns:repeat(5,1fr);}
.m4{grid-template-columns:repeat(4,1fr);}
.m3{grid-template-columns:repeat(3,1fr);}
.met{background:var(--bg2);border:1px solid var(--b);border-radius:var(--rl);padding:13px 15px;transition:transform 0.15s, box-shadow 0.15s;}
.met:hover{transform:translateY(-1px);box-shadow:var(--shadow);}
.ml{font-size:9px;color:var(--tx3);text-transform:uppercase;letter-spacing:.1em;margin-bottom:6px;font-weight:600;}
.mv{font-size:22px;font-weight:700;font-family:'IBM Plex Mono',monospace;line-height:1;letter-spacing:-0.5px;}
.mv.r{color:var(--red);}.mv.a{color:var(--amber);}.mv.g{color:var(--green);}.mv.b{color:var(--blue);}
.ms{font-size:10px;color:var(--tx3);margin-top:5px;}

/* BUTTONS */
.btn{padding:7px 13px;border-radius:var(--r);border:1px solid var(--b2);background:var(--bg3);color:var(--tx);font-size:12px;font-family:'IBM Plex Sans',sans-serif;cursor:pointer;white-space:nowrap;font-weight:500;transition:all 0.15s;}
.btn:hover{background:var(--bg4);border-color:var(--b2);}
.bp{background:var(--blue);border-color:var(--blue);color:#fff;font-weight:600;}
.bp:hover{background:#3d7aee;filter:brightness(1.08);}
.bg2{background:var(--green);border-color:var(--green);color:#fff;font-weight:600;}
.bg2:hover{filter:brightness(1.08);}
.ba2{background:var(--amber);border-color:var(--amber);color:#fff;font-weight:600;}
.ba2:hover{filter:brightness(1.08);}
.bt2{background:var(--teal);border-color:var(--teal);color:#fff;font-weight:600;}
.bt2:hover{filter:brightness(1.08);}
.bpu{background:var(--purple);border-color:var(--purple);color:#fff;font-weight:600;}
.bpu:hover{filter:brightness(1.08);}
.bo2{background:var(--orange);border-color:var(--orange);color:#fff;font-weight:600;}
.bo2:hover{filter:brightness(1.08);}
.bsm{padding:5px 10px;font-size:11px;}
.br2{background:var(--red-d);border-color:var(--red);color:var(--red);}
.br2:hover{background:var(--red);color:#fff;}

/* TABLE WRAPPER */
.tw{background:var(--bg2);border:1px solid var(--b);border-radius:var(--rl);overflow:hidden;box-shadow:var(--shadow);}
.twb{padding:12px 16px;border-bottom:1px solid var(--b);display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:8px;background:linear-gradient(180deg, var(--bg2) 0%, var(--bg3) 100%);}
.twt{font-size:12px;font-weight:600;text-transform:uppercase;letter-spacing:.08em;color:var(--tx);}
table{width:100%;border-collapse:collapse;}
thead th{text-align:left;font-size:10px;color:var(--tx3);text-transform:uppercase;letter-spacing:.08em;padding:10px 14px;border-bottom:1px solid var(--b);font-weight:600;white-space:nowrap;background:var(--bg3);}
tbody tr{border-bottom:1px solid var(--b);transition:background 0.1s;}
tbody tr:hover{background:var(--bg3);}
tbody tr:last-child{border-bottom:none;}
tbody tr.cp{cursor:pointer;}

/* CSP Phase 3: hover utility classes — replace inline onmouseover/onmouseout */
/* Light background highlight (used in list items, search results, picker rows) */
.hov-bg3{transition:background 0.1s;}
.hov-bg3:hover{background:var(--bg3) !important;}
.hov-bg4{transition:background 0.1s;}
.hov-bg4:hover{background:var(--bg4) !important;}
/* Card lift effect (aircraft cards, status cards) */
.hov-lift{transition:transform 0.15s;}
.hov-lift:hover{transform:translateY(-2px);}
/* Risk-matrix-cell scale on hover */
.hov-scale{transition:transform 0.15s;}
.hov-scale:hover{transform:scale(1.1);z-index:10;}
/* Dynamic color hover via CSS custom properties — set on the element:
     style="--hov-bg:#abc;--hov-bd:#def"
   then add hov-bg-dyn / hov-bd-dyn class. Lets template-literal styles
   carry the per-card color into a CSS :hover rule. */
.hov-bg-dyn{transition:background 0.1s;}
.hov-bg-dyn:hover{background:var(--hov-bg) !important;}
.hov-bd-dyn{transition:border-color 0.15s;}
.hov-bd-dyn:hover{border-color:var(--hov-bd) !important;}
.hov-lift-bd-dyn{transition:transform 0.15s,border-color 0.15s;}
.hov-lift-bd-dyn:hover{transform:translateY(-2px);border-color:var(--hov-bd) !important;}
td{padding:10px 14px;font-size:12px;color:var(--tx);vertical-align:middle;}
td.mo{font-family:'IBM Plex Mono',monospace;font-size:11px;}
td.mu{color:var(--tx2);}

/* CSP Phase 3: utility classes for the most-repeated inline style="…" patterns.
   These cover ~500 instances codebase-wide. Prefer composition (e.g. "u-fs11 u-t3"
   replaces class="u-fs11 u-t3") over per-pattern classes. */
.u-t3{color:var(--tx3);}
.u-t2{color:var(--tx2);}
.u-tx{color:var(--tx);}
.u-tb{color:var(--blue);}
.u-tr{color:var(--red);}
.u-tg{color:var(--green);}
.u-ta{color:var(--amber);}
.u-tt{color:var(--teal);}
.u-to{color:var(--orange);}
.u-tp{color:var(--purple);}
.u-bg-blue{background:var(--blue);}
.u-bg-red{background:var(--red);}
.u-bg-green{background:var(--green);}
.u-bg-amber{background:var(--amber);}
.u-bg-teal{background:var(--teal);}
.u-bg-orange{background:var(--orange);}
.u-bg-purple{background:var(--purple);}
.u-bg-blue-d{background:var(--blue-d);}
.u-bg-red-d{background:var(--red-d);}
.u-bg-green-d{background:var(--green-d);}
.u-bg-amber-d{background:var(--amber-d);}
.u-bg-teal-d{background:var(--teal-d);}
.u-bg-orange-d{background:var(--orange-d);}
.u-bg-purple-d{background:var(--purple-d);}
.u-fs9{font-size:9px;}
.u-fs10{font-size:10px;}
.u-fs11{font-size:11px;}
.u-fs12{font-size:12px;}
.u-fs13{font-size:13px;}
.u-fwb{font-weight:600;}
.u-fw7{font-weight:700;}
.u-f1{flex:1;}
.u-w100{width:100%;}
.u-dn{display:none !important;}
.u-mb11{margin-bottom:11px;}
.u-p14{padding:14px;}
.u-oxa{overflow-x:auto;}
.u-gtc1{grid-template-columns:1fr;}
.u-tac{text-align:center;}
.u-tar{text-align:right;}
/* Common table header padding presets used by hand-built tables */
.u-thc{padding:9px 10px;text-align:center;font-size:10px;color:var(--tx3);}
.u-thl{padding:6px 10px;text-align:left;font-size:10px;color:var(--tx3);}
.u-thtc{padding:5px 4px;text-align:center;}
.u-thr{padding:6px 10px;text-align:right;font-size:10px;color:var(--tx3);}
/* Phase 3 batch 2 — more utilities */
.u-fs14{font-size:14px;}
.u-fs15{font-size:15px;}
.u-fs16{font-size:16px;}
.u-fs18{font-size:18px;}
.u-fs20{font-size:20px;}
.u-mw0{min-width:0;}        /* lets ellipsis truncation work in flex children */
.u-mt6{margin-top:6px;}
.u-mt10{margin-top:10px;}
.u-mt14{margin-top:14px;}
.u-mb4{margin-bottom:4px;}
.u-mb6{margin-bottom:6px;}
.u-mb8{margin-bottom:8px;}
.u-mb10{margin-bottom:10px;}
.u-mb14{margin-bottom:14px;}
.u-mr8{margin-right:8px;}
.u-bg2{background:var(--bg2);}
.u-bg3{background:var(--bg3);}
.u-bg4{background:var(--bg4);}
.u-pre{white-space:pre-wrap;}
.u-bbb{border-bottom:1px solid var(--b);}
.u-bbt{border-top:1px solid var(--b);}
.u-row{display:flex;align-items:center;}
.u-row-sb{display:flex;justify-content:space-between;align-items:center;}
.u-row-end{display:flex;justify-content:flex-end;align-items:center;}
.u-grid{display:grid;}
.u-grid14{display:grid;gap:14px;}
.u-grid10{display:grid;gap:10px;}
.u-grid8{display:grid;grid-template-columns:1fr;gap:8px;}
.u-cur-p{cursor:pointer;}
.u-cur-h{cursor:help;}
/* Composite text+font shortcuts */
.u-t3-fs10{color:var(--tx3);font-size:10px;}
.u-tbl{width:100%;border-collapse:collapse;}
.u-fwb-fs13{font-size:13px;font-weight:600;}
.u-fwb-fs15{font-size:15px;font-weight:600;}
/* Batch 3 — table header variants + padding + grid + composites */
.u-thl11{padding:7px 10px;text-align:left;font-size:11px;color:var(--tx3);}
.u-thp10{padding:6px 10px;font-size:10px;color:var(--tx3);}
.u-thl-sm{padding:5px 8px;text-align:left;font-size:10px;color:var(--tx3);}
.u-thr-sm{padding:5px 8px;text-align:right;font-size:10px;color:var(--tx3);}
.u-p6-10{padding:6px 10px;}
.u-p5-8{padding:5px 8px;}
.u-p3{padding:3px;}
.u-p7-10{padding:7px 10px;}
.u-p5-10{padding:5px 10px;}
.u-p4-8{padding:4px 8px;}
.u-p4-10{padding:4px 10px;}
.u-p4-12{padding:4px 12px;}
.u-p8-10{padding:8px 10px;}
.u-p8-12{padding:8px 12px;}
.u-p7-11{padding:7px 11px;}
.u-p10{padding:10px;}
.u-p12{padding:12px;}
.u-p20{padding:20px;}
.u-p3-6{padding:3px 6px;}
.u-p2-6{padding:2px 6px;}
.u-p2-5{padding:2px 5px;}
.u-p2-8{padding:2px 8px;}
.u-p1-6{padding:1px 6px;}
.u-p1-5{padding:1px 5px;}
.u-row-wrap{display:flex;gap:8px;flex-wrap:wrap;}
.u-row-wrap-6{display:flex;gap:6px;flex-wrap:wrap;}
.u-row-10{display:flex;gap:10px;align-items:center;}
.u-row-8{display:flex;gap:8px;align-items:center;}
.u-row-6{display:flex;gap:6px;align-items:center;}
.u-empty-pad{color:var(--tx3);padding:20px;text-align:center;}
.u-empty-pad-lg{color:var(--tx3);padding:40px;text-align:center;}
.u-fw5{font-weight:500;}
.u-mt3{margin-top:3px;}
.u-mt4{margin-top:4px;}
.u-mt5{margin-top:5px;}
.u-tal{text-align:left;}
.u-p0{padding:0;}
.u-op6{opacity:0.6;}
.u-gtc2{grid-template-columns:1fr 1fr;}
.u-sq16{width:16px;height:16px;}
.u-row-3{display:flex;align-items:center;gap:3px;}
.u-sticky-top{position:sticky;top:0;background:var(--bg2);z-index:1;}
.u-row-picked-bg{background:rgba(55,138,221,0.10);}
/* [WOP-MULTI-V2 2026-05-17] Issue-parts modal table — bigger viewport
   than the generic frm-bulk-tbl-shell (380px) so operators can see
   ~12-15 rows of stock at once without scrolling. */
.wop-tbl-shell{max-height:55vh;overflow-y:auto;border:1px solid var(--b);border-radius:var(--r);}
.u-modal-hdr{padding:14px 18px;border-bottom:1px solid var(--b);display:flex;align-items:center;gap:10px;}
.u-modal-ftr{padding:12px 18px;border-top:1px solid var(--b);display:flex;justify-content:flex-end;gap:8px;}
.u-modal-body{padding:14px 18px;overflow-y:auto;flex:1;}
.u-page-hdr{display:flex;justify-content:space-between;align-items:center;margin-bottom:11px;flex-wrap:wrap;gap:8px;}
.u-row-3-gap{display:flex;gap:3px;}
.u-pill-green{padding:5px 8px;text-align:center;font-size:10px;color:var(--tx3);background:var(--green-d);}
.u-card-tw{background:var(--bg2);border:1px solid var(--b);border-radius:var(--rl);padding:12px;}
.u-fw4{font-weight:400;}
.u-bbn{border-bottom:none;}
.u-fs0{flex-shrink:0;}
.u-py5{padding:5px 0;}
.u-pt6{padding-top:6px;}
.u-pb4{padding-bottom:4px;}
.u-lh1{line-height:1;}
.u-lh13{line-height:1.3;}
.u-lh14{line-height:1.4;}
.u-gap-6{gap:6px;}
.u-gap-8{gap:8px;}
.u-gap-10{gap:10px;}
.u-italic{font-style:italic;}
.u-tbl-fixed{width:100%;border-collapse:collapse;table-layout:fixed;}
.u-scroll-380{max-height:380px;overflow-y:auto;border:1px solid var(--b);border-radius:var(--r);}
.u-th-9-10{padding:9px 10px;}
.u-p8-11{padding:8px 11px;}
.u-sect-sm{font-size:9px;color:var(--tx3);text-transform:uppercase;letter-spacing:.08em;margin-bottom:5px;}
.u-sect-md{font-size:11px;color:var(--tx3);text-transform:uppercase;letter-spacing:0.8px;margin-bottom:8px;}
.u-sect-lg{font-size:12px;font-weight:600;color:var(--tx3);text-transform:uppercase;letter-spacing:0.8px;margin-bottom:10px;}
.u-w60{width:60px;}
.u-w80{width:80px;}
.u-w100px{width:100px;}
.u-w110{width:110px;}
.u-w32{width:32px;}
.u-w18{width:18px;}
.u-m0{margin:0;}
.u-ml4{margin-left:4px;}
.u-ml6{margin-left:6px;}
.u-ml8{margin-left:8px;}
.u-ml10{margin-left:10px;}
.u-input-bg3{padding:5px;background:var(--bg3);border:1px solid var(--b);border-radius:var(--r);color:var(--tx);font-size:11px;width:100%;}
.u-mh-8{margin:0 8px;}
.u-row-sb-wrap{display:flex;justify-content:space-between;align-items:center;gap:10px;flex-wrap:wrap;}
.u-row-gap8{display:flex;gap:8px;}
.u-row-gap7{display:flex;gap:7px;}
.u-row-gap4{display:flex;gap:4px;}
.u-t1{color:var(--tx1);}
.u-tw{color:white;}
.u-rot-90{transform:rotate(-90deg);}
.u-modal-body-sm{padding:8px 14px;overflow-y:auto;flex:1;}
.u-dot-6{width:6px;height:6px;border-radius:50%;flex-shrink:0;}
.u-p6{padding:6px;}
.u-pill-blue{padding:5px 8px;text-align:center;font-size:10px;color:var(--tx3);background:var(--blue-d);}
.u-py4{padding:4px 0;}
.u-abs-center{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);text-align:center;}
.u-modal-hero-hdr{padding:20px 30px 12px;display:flex;align-items:center;gap:14px;border-bottom:1px solid var(--b);}
.u-p14-30{padding:14px 30px;}
.u-gtc3{grid-template-columns:1fr 1fr 1fr;}
.u-fs42{font-size:42px;}
.u-mt8{margin-top:8px;}
.u-mb0{margin-bottom:0;}
.u-input-num60{width:60px;background:var(--bg2);border:1px solid var(--b2);border-radius:var(--r);padding:3px 6px;color:var(--tx);font-size:11px;}
.u-input-bg3-p6{background:var(--bg3);border:1px solid var(--b);border-radius:var(--r);padding:6px;color:var(--tx);font-size:11px;width:100%;}
.u-modal-wrap-760{background:var(--bg);border:1px solid var(--b);border-radius:var(--rl);max-width:760px;width:100%;max-height:90vh;display:flex;flex-direction:column;box-shadow:0 12px 48px rgba(0,0,0,0.45);}
.u-btn-red-soft{background:var(--red-d);border-color:var(--red);color:var(--red);}
.u-btn-green-soft{background:var(--green-d);border-color:var(--green);color:var(--green);}
.u-callout-blue{background:var(--bg3);padding:10px 14px;border-radius:var(--r);border-left:3px solid var(--blue);font-size:13px;color:var(--tx2);}
/* [CSP-PHASE-3 BATCH 49b — 2026-05-16] SMS callout/info-card family — bg3 card + accent border-left, full padding+size variants used by canavia-sms.js modal/edit-form flows */
.u-callout-am{background:var(--bg3);padding:8px 14px;border-radius:var(--r);border-left:3px solid var(--amber);font-size:12px;color:var(--tx2);line-height:1.5;}
.u-callout-rd{background:var(--bg3);padding:12px 14px;border-radius:var(--r);border-left:3px solid var(--red);}
.u-callout-rd-fs13{background:var(--bg3);padding:10px 14px;border-radius:var(--r);border-left:3px solid var(--red);font-size:13px;}
.u-callout-gn{background:var(--bg3);padding:12px 14px;border-radius:var(--r);border-left:3px solid var(--green);}
.u-callout-gn-soft{background:#00d18022;padding:10px 14px;border-radius:var(--r);border-left:3px solid var(--green);font-size:13px;color:var(--green);}
.u-callout-am-row{background:var(--bg3);padding:14px;border-radius:var(--r);border-left:3px solid var(--amber);display:flex;justify-content:space-between;align-items:center;gap:12px;}
.u-icard-8-14{background:var(--bg3);padding:8px 14px;border-radius:var(--r);}
.u-icard-10-14{background:var(--bg3);padding:10px 14px;border-radius:var(--r);}
.u-icard-12-14{background:var(--bg3);padding:12px 14px;border-radius:var(--r);}
.u-icard-12-14-fs12-t2{background:var(--bg3);padding:12px 14px;border-radius:var(--r);font-size:12px;line-height:1.7;color:var(--tx2);}
.u-icard-10-fs11-t3-mt8{background:var(--bg3);padding:10px;border-radius:var(--r);font-size:11px;color:var(--tx3);line-height:1.6;margin-top:8px;}
.u-icard-10-14-fs12-t3{background:var(--bg3);padding:10px 14px;border-radius:var(--r);font-size:12px;color:var(--tx3);}
.u-icard-10-14-fs12-t2-lh16{background:var(--bg3);padding:10px 14px;border-radius:var(--r);font-size:12px;color:var(--tx2);line-height:1.6;}
.u-mono-10-t3{font-family:monospace;font-size:10px;color:var(--tx3);}
.u-mono-11{font-family:monospace;font-size:11px;}
.u-mono-11-fw6{font-family:monospace;font-size:11px;font-weight:600;}
.u-mono-13{font-family:monospace;font-size:13px;}
.u-mono-13-t3-fw6{font-family:monospace;font-size:13px;color:var(--tx3);font-weight:600;}
.u-mono-16-fw7{font-family:monospace;font-size:16px;font-weight:700;}
.u-foot-bdt-r-g8{border-top:1px solid var(--b);padding-top:12px;display:flex;justify-content:flex-end;gap:8px;}
.u-foot-bdt-r-g10{border-top:1px solid var(--b);padding-top:12px;display:flex;justify-content:flex-end;gap:10px;}
.u-foot-bdt-r-pt10{border-top:1px solid var(--b);padding-top:10px;margin-top:6px;}
.u-grid-11-10{display:grid;grid-template-columns:1fr 1fr;gap:10px;}
.u-grid-11-14{display:grid;grid-template-columns:1fr 1fr;gap:14px;}
.u-grid-111-8-mb12{display:grid;grid-template-columns:1fr 1fr 1fr;gap:8px;margin-bottom:12px;}
.u-grid-aa1-10-c-mb12{display:grid;grid-template-columns:auto auto 1fr;gap:10px;align-items:center;margin-bottom:12px;}
.u-grid-au300-16{display:grid;grid-template-columns:auto 300px;gap:16px;}
.u-grid-21-16{display:grid;grid-template-columns:2fr 1fr;gap:16px;}
.u-grid-auto320{display:grid;grid-template-columns:repeat(auto-fill,minmax(320px,1fr));gap:14px;}
.u-grid-mc1-4-14{display:grid;grid-template-columns:max-content 1fr;gap:4px 14px;font-size:11px;margin-bottom:8px;}
.u-grid-11-6-14{display:grid;grid-template-columns:1fr 1fr;gap:6px 14px;font-size:11px;}
.u-btn-red-w{background:var(--red);color:#fff;}
.u-btn-red-w-fs12{background:var(--red);color:#fff;font-size:12px;}
.u-btn-red-w-ml-auto{background:var(--red);color:#fff;margin-left:auto;}
.u-tx3-italic{color:var(--tx3);font-style:italic;}
.u-pre-min80{white-space:pre-wrap;min-height:80px;}
.u-pre-min200-lh17{white-space:pre-wrap;min-height:200px;line-height:1.7;padding:16px;}
.u-ro7{pointer-events:none;opacity:0.7;}
.u-ro85{pointer-events:none;opacity:0.85;}
.u-overdue-cell{color:var(--red);font-weight:600;}
.u-fs9-t3-fw4{color:var(--tx3);font-size:9px;font-weight:400;}
.u-fs11-tac-bg2-t3{background:var(--bg2);padding:6px;font-size:11px;color:var(--tx3);text-align:center;}
.u-fs11-th-l-bg2{text-align:right;padding-right:10px;font-size:11px;color:var(--tx3);white-space:nowrap;background:var(--bg2);}
.u-fs12-t3-fw6-vrl{writing-mode:vertical-rl;transform:rotate(180deg);font-size:12px;color:var(--tx3);font-weight:600;}
.u-fs12-t3-fw6-tac-mt8{text-align:center;font-size:12px;color:var(--tx3);font-weight:600;margin-top:8px;}
.u-fs18-fw7-mw70{font-size:18px;font-weight:700;min-width:70px;}
.u-fs16-fw7{font-size:16px;font-weight:700;}
.u-fs20-fw7{font-size:20px;font-weight:700;}
.u-fs24-t3-p10-0{font-size:24px;color:var(--tx3);padding:10px 0;}
.u-fs15-fw7-mb8-lh13{font-size:15px;font-weight:700;margin-bottom:8px;line-height:1.3;}
.u-fs15-fw6-mt4{font-size:15px;font-weight:600;margin-top:4px;}
.u-fs18-fw7-mt6{font-size:18px;font-weight:700;margin-top:6px;}
.u-fs12-fw7-tt-mt2{font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:0.8px;margin-top:2px;}
.u-fs11-fw6-tt{font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:0.8px;}
.u-fs12-fw6-t3-tt-mb12{font-size:12px;font-weight:600;color:var(--tx3);text-transform:uppercase;letter-spacing:0.8px;margin-bottom:12px;}
.u-fs12-t3-mb6{font-size:12px;color:var(--tx3);margin-bottom:6px;}
.u-fs12-t2-mt6-pre{font-size:12px;color:var(--tx2);margin-top:6px;white-space:pre-wrap;}
.u-fs12-t2-flex-mb10-pre{font-size:12px;color:var(--tx2);line-height:1.5;flex:1;margin-bottom:10px;white-space:pre-wrap;overflow:hidden;}
.u-fs11-t3-sb-bdt-pt8{display:flex;justify-content:space-between;align-items:center;font-size:11px;color:var(--tx3);border-top:1px solid var(--b);padding-top:8px;}
.u-bdl4-cc-card{border-left:4px solid currentColor;padding:14px;cursor:pointer;min-height:200px;display:flex;flex-direction:column;}
.u-fwb-mb8{font-weight:600;margin-bottom:8px;}
.u-fs13-mb6{font-size:13px;margin-bottom:6px;}
.u-bar-8{height:8px;background:var(--bg1);border-radius:4px;overflow:hidden;margin-bottom:8px;}
.u-bar-fill-gn{height:100%;background:var(--green);}
.u-pill-bg1-t1{background:var(--bg1);color:var(--tx1);border-radius:999px;padding:2px 8px;display:inline-block;font-size:12px;font-weight:700;margin-top:4px;}
.u-p10-22{padding:10px 22px;}
.u-grid-g10-icard-12-14{display:grid;gap:10px;background:var(--bg3);padding:12px 14px;border-radius:var(--r);}
.u-row-10-wrap{display:flex;gap:10px;flex-wrap:wrap;}
.u-row-7-wrap{display:flex;gap:7px;flex-wrap:wrap;}
.u-row-7-mb4{display:flex;gap:7px;margin-bottom:4px;}
.u-row-8-jb{display:flex;justify-content:space-between;align-items:center;margin-bottom:8px;padding-bottom:8px;border-top:0;border-bottom:1px solid var(--b);}
.u-foot-bdt-r{border-top:1px solid var(--b);padding-top:12px;display:flex;justify-content:flex-end;}
.u-foot-bdt-r-g10-fxw{border-top:1px solid var(--b);padding-top:14px;display:flex;gap:10px;flex-wrap:wrap;justify-content:flex-end;}
.u-callout-am-fs13{background:var(--bg3);padding:10px 14px;border-radius:var(--r);border-left:3px solid var(--amber);font-size:13px;color:var(--tx2);}
.u-fs12-t3-mb10{font-size:12px;color:var(--tx3);margin-bottom:10px;}
.u-row-10-p10-rr{display:flex;align-items:center;gap:10px;padding:10px;border-radius:var(--r);}
.u-table-sep2{border-collapse:separate;border-spacing:2px;margin:0 auto;}
.u-matrix-cell{border-width:2px;border-style:solid;width:90px;height:90px;text-align:center;cursor:pointer;padding:4px;}
.u-matrix-cell-sel{border-width:3px;border-style:solid;width:90px;height:90px;text-align:center;cursor:pointer;padding:4px;}
.u-c2-au300-16{grid-template-columns:auto 300px;gap:16px;}
.u-mono-11-t3{font-family:monospace;font-size:11px;color:var(--tx3);}
.u-p-12-14-rr{padding:12px 14px;border-radius:var(--r);}
.u-flex-r-g8{display:flex;gap:8px;justify-content:flex-end;}
.u-callout-am-12-14{background:var(--bg3);padding:12px 14px;border-radius:var(--r);border-left:3px solid var(--amber);}
.u-callout-gn-10-14{background:var(--bg3);padding:10px 14px;border-radius:var(--r);border-left:3px solid var(--green);}
.u-icard-12-fs12-t2-lh17{background:var(--bg3);padding:12px;border-radius:var(--r);font-size:12px;line-height:1.7;color:var(--tx2);}
/* [CSP-PHASE-3 BATCH 49c — 2026-05-16] CAMO banner family — uniform 9px 12px banners (amber/red/green/blue) + 4 specialised variants used inside WO/CRS/IR2 modals */
.u-banner-am-9-12{background:var(--amber-d);border:1px solid var(--amber);border-radius:var(--r);padding:9px 12px;margin-bottom:8px;font-size:11px;color:var(--amber);}
.u-banner-rd-9-12{background:var(--red-d);border:1px solid var(--red);border-radius:var(--r);padding:9px 12px;margin-bottom:8px;font-size:11px;color:var(--red);}
.u-banner-gn-9-12{background:var(--green-d);border:1px solid var(--green);border-radius:var(--r);padding:9px 12px;margin-bottom:8px;font-size:11px;color:var(--green);}
.u-banner-bl-9-12{background:var(--blue-d);border:1px solid var(--blue);border-radius:var(--r);padding:9px 12px;margin-bottom:12px;font-size:11px;color:var(--blue);}
.u-banner-rd-10-14-lh15{background:var(--red-d);border:1px solid var(--red);border-radius:var(--r);padding:10px 14px;margin-bottom:12px;font-size:11px;color:var(--red);line-height:1.5;}
.u-banner-rd-7-10{background:var(--red-d);border:1px solid var(--red);border-radius:var(--r);padding:7px 10px;font-size:11px;color:var(--red);}
.u-banner-am-row-4-8{background:var(--amber-d);border:1px solid var(--amber);color:var(--amber);border-radius:var(--r);padding:4px 8px;font-size:11px;display:flex;align-items:center;gap:6px;}
.u-banner-bg2-row-4-8{background:var(--bg2);border:1px solid var(--b);border-radius:var(--r);padding:4px 8px;font-size:11px;display:flex;align-items:center;gap:6px;}
.u-row-8-bdb-p7-10-fs11-cur{display:flex;align-items:center;gap:8px;padding:7px 10px;border-bottom:1px solid var(--b);font-size:11px;cursor:pointer;}
.u-icard-8-fs11-t3-mb8{font-size:11px;color:var(--tx3);background:var(--bg3);padding:8px;border-radius:var(--r);margin-bottom:8px;}
.u-icard-10-14-fs11-mb12{background:var(--bg3);padding:10px 14px;border-radius:var(--r);margin-bottom:12px;font-size:11px;}
.u-fs10-t3-mb6{color:var(--tx3);font-size:10px;margin-bottom:6px;}
.u-row-8-cur-fs12{display:flex;gap:8px;align-items:center;cursor:pointer;font-size:12px;}
.u-card-bdb-p12-mb10-bg3{border:1px solid var(--b);border-radius:var(--r);padding:12px;margin-bottom:10px;background:var(--bg3);}
.u-row-sb-mb8-pb8-bdb{display:flex;justify-content:space-between;align-items:center;margin-bottom:8px;padding-bottom:8px;border-bottom:1px solid var(--b);}
.u-banner-bg3-bd-8-10-mb4{background:var(--bg3);border:1px solid var(--b);border-radius:var(--r);padding:8px 10px;margin-bottom:4px;font-size:10px;color:var(--tx3);}
.u-icard-8-10-fs11-mb12{background:var(--bg3);padding:8px 10px;border-radius:var(--r);font-size:11px;margin-bottom:12px;}
.u-bd-rr{border:1px solid var(--b);border-radius:var(--r);}
.u-card-bg2-bd-8{border:1px solid var(--b);border-radius:var(--r);padding:8px;background:var(--bg2);}
.u-row-6-mb6{display:flex;align-items:center;gap:6px;margin-bottom:6px;}
.u-row-fxw-g4-mh18{display:flex;flex-wrap:wrap;gap:4px;min-height:18px;}
.u-fs10-bg3-pill{font-size:10px;background:var(--bg3);border:1px solid var(--b);border-radius:var(--r);padding:2px 6px;display:inline-flex;align-items:center;gap:4px;}
.u-cur-t3{cursor:pointer;color:var(--tx3);}
.u-wo-link-pill{background:var(--bg2);border:1px solid var(--b);border-radius:var(--r);padding:4px 8px;font-size:11px;display:flex;align-items:center;gap:6px;}
.u-label-fs11-row-4-cur{font-size:11px;display:flex;align-items:center;gap:4px;cursor:pointer;}
.u-modal-shell-840{background:var(--bg);border:1px solid var(--b);border-radius:var(--rl);max-width:840px;width:100%;max-height:90vh;display:flex;flex-direction:column;box-shadow:0 12px 48px rgba(0,0,0,0.45);}
.u-grid-mc1-4-14-fs11-mb8{display:grid;grid-template-columns:max-content 1fr;gap:4px 14px;font-size:11px;margin-bottom:8px;}
.u-fs10-t3-fw4{font-size:10px;color:var(--tx3);font-weight:400;}
.u-fs11-fw6-fl1-curfg{font-size:11px;font-weight:600;flex:1;}
.u-row-7-fxw{display:flex;gap:7px;flex-wrap:wrap;}
.u-grid-11-6-14-fs11{display:grid;grid-template-columns:1fr 1fr;gap:6px 14px;font-size:11px;}
.u-btn-icon-transparent-am{background:transparent;border:none;color:var(--amber);padding:0 2px;font-size:13px;line-height:1;}
/* [CSP-PHASE-3 BATCH 49d — 2026-05-16] CORE.js helpers — sidebar/topnav locked state, password-strength meter, search dropdown, signature modal */
.sb-item.locked{opacity:.4;cursor:not-allowed;pointer-events:none;}
.tn.locked{opacity:.4;cursor:not-allowed;}
.u-banner-bl-8-12-mb8{background:var(--blue-d,rgba(100,150,255,0.1));border:1px solid var(--blue);border-radius:var(--r);padding:8px 12px;margin-bottom:8px;font-size:11px;color:var(--blue);}
.u-banner-bl-8-12-mb12{background:var(--blue-d,rgba(100,150,255,0.1));border:1px solid var(--blue);border-radius:var(--r);padding:8px 12px;margin-bottom:12px;font-size:11px;color:var(--blue);}
.u-pw-strength{display:flex;gap:6px;margin-top:5px;font-size:10px;}
.u-srch-result-row{padding:9px 12px;cursor:pointer;display:flex;align-items:center;gap:10px;border-bottom:1px solid var(--b);}
.u-srch-title{font-size:12px;font-weight:500;color:var(--tx);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
.u-srch-subtitle{font-size:10px;color:var(--tx3);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
.u-srch-type-pill{font-size:9px;padding:2px 6px;border-radius:3px;background:var(--bg4);color:var(--tx3);text-transform:uppercase;}
.u-cell-tac-p24-t3{text-align:center;padding:24px;color:var(--tx3);}
.u-wp18{width:18%;}.u-wp35{width:35%;}
.u-sig-info-row{margin-top:6px;padding:8px 12px;background:var(--bg3);border-radius:var(--r);display:flex;justify-content:space-between;align-items:center;}
.u-sig-preview-img{max-width:100%;max-height:120px;background:#fff;border:1px solid var(--b);border-radius:var(--r);display:block;margin:0 auto;}
.u-sig-placeholder{padding:30px;text-align:center;color:var(--tx3);font-size:11px;font-style:italic;}
.u-sig-section-label{font-size:10px;color:var(--tx3);text-transform:uppercase;letter-spacing:.07em;margin-bottom:5px;}
.u-sig-preview-shell{background:var(--bg3);border:1px solid var(--b);border-radius:var(--r);padding:8px;margin-bottom:14px;min-height:60px;}
.u-row-6-mb12{display:flex;gap:6px;margin-bottom:12px;}
.u-sig-canvas-wrap{background:#fff;border:2px solid var(--b);border-radius:var(--r);padding:0;overflow:hidden;}
.u-sig-canvas{display:block;width:100%;cursor:crosshair;touch-action:none;}
.u-row-6-mt8{display:flex;gap:6px;margin-top:8px;}
.u-row-6-mt10{display:flex;gap:6px;margin-top:10px;}
.u-foot-bdt-mt14-pt12-tac{border-top:1px solid var(--b);margin-top:14px;padding-top:12px;text-align:center;}
.u-cell-mono-cond{padding:7px 11px;font-family:'IBM Plex Mono',monospace;font-size:10px;}
/* [CSP-PHASE-3 BATCH 49e — 2026-05-16] FormEngine helpers (canavia-formengine.js) */
.fe-state-badge{color:#fff;padding:2px 8px;border-radius:3px;font-size:10px;font-weight:600;}
.fe-section-title{font-size:12px;font-weight:600;color:var(--tx2);margin-bottom:8px;padding-bottom:4px;border-bottom:1px solid var(--b);}
.fe-fields-grid{display:grid;grid-template-columns:repeat(12,1fr);gap:8px;}
.fe-history-details{margin-top:12px;padding:8px;background:var(--bg3);border-radius:4px;}
.fe-history-summary{cursor:pointer;font-size:11px;color:var(--tx3);}
.fe-history-body{margin-top:8px;font-size:11px;}
.fe-modal-hdr-info{margin-bottom:12px;padding:8px 12px;background:var(--bg3);border-radius:4px;display:flex;justify-content:space-between;align-items:center;}
.fe-form-scroll{max-height:55vh;overflow-y:auto;padding-right:8px;}
.fe-footer-actions{margin-top:16px;padding-top:12px;border-top:2px solid var(--b);display:flex;gap:6px;justify-content:flex-end;flex-wrap:wrap;}
.fe-label-inline{display:inline-flex;align-items:center;gap:4px;margin-right:12px;cursor:pointer;}
.fe-label-checkbox{display:inline-flex;align-items:center;gap:6px;cursor:pointer;}
.fe-label-row{display:flex;align-items:center;gap:6px;padding:3px 0;cursor:pointer;}
.fe-label-block{display:block;font-size:11px;color:var(--tx2);margin-bottom:3px;}
.fe-btn-micro{font-size:10px;padding:2px 6px;border:1px solid var(--b);background:var(--bg2);border-radius:3px;cursor:pointer;}
.fe-btn-add{margin-top:4px;font-size:11px;padding:4px 10px;border:1px solid var(--b);background:var(--bg2);border-radius:3px;cursor:pointer;}
.fe-sig-clear-btn{font-size:10px;padding:3px 8px;border:1px solid var(--b);background:var(--bg2);border-radius:3px;cursor:pointer;}
.fe-row-4-c{display:flex;gap:4px;align-items:center;}
.fe-readonly{background:var(--bg3);color:var(--tx3);padding:6px 8px;border-radius:3px;font-size:12px;}
.fe-info-block{background:rgba(33,150,243,.08);border-left:3px solid #2196F3;padding:8px 10px;border-radius:3px;font-size:12px;color:var(--tx2);line-height:1.4;}
.fe-multiselect-h80{min-height:80px;}
.fe-sig-wrap{border:1px solid var(--b);border-radius:4px;padding:4px;background:#fff;}
.fe-sig-canvas{display:block;width:100%;height:100px;cursor:crosshair;background:#fff;border-radius:3px;}
.fe-sig-controls{display:flex;gap:6px;margin-top:4px;align-items:center;}
.fe-table-base{width:100%;border-collapse:collapse;font-size:11px;}
.fe-table td{padding:3px;min-width:60px;}
.fe-table th{padding:4px 3px;text-align:left;font-weight:600;font-size:10px;color:var(--tx2);text-transform:uppercase;letter-spacing:.3px;border-bottom:1px solid var(--b);}
.fe-table .fe-tbl-cell{width:100%;box-sizing:border-box;font-size:11px;}
.fe-field[data-fe-col="1"]{grid-column:span 1;}.fe-field[data-fe-col="2"]{grid-column:span 2;}.fe-field[data-fe-col="3"]{grid-column:span 3;}.fe-field[data-fe-col="4"]{grid-column:span 4;}.fe-field[data-fe-col="5"]{grid-column:span 5;}.fe-field[data-fe-col="6"]{grid-column:span 6;}.fe-field[data-fe-col="7"]{grid-column:span 7;}.fe-field[data-fe-col="8"]{grid-column:span 8;}.fe-field[data-fe-col="9"]{grid-column:span 9;}.fe-field[data-fe-col="10"]{grid-column:span 10;}.fe-field[data-fe-col="11"]{grid-column:span 11;}.fe-field[data-fe-col="12"]{grid-column:span 12;}
/* [CSP-PHASE-3 BATCH 49f — 2026-05-16] mcalendar helpers (canavia-mcalendar.js) — calendar grid, day cells, event list, color picker swatch */
.mcal-toolbar-row{display:flex;align-items:center;gap:14px;flex-wrap:wrap;}
.mcal-month-label{font-size:18px;font-weight:600;min-width:200px;text-align:center;}
.mcal-c2-mb11{margin-bottom:11px;gap:11px;}
.mcal-type-filter-row{display:flex;flex-wrap:wrap;gap:4px;}
.mcal-ac-select{width:100%;padding:6px;font-size:12px;border:1px solid var(--b);border-radius:var(--r);background:var(--bg2);color:var(--tx1);}
.mcal-grid-shell{padding:0;overflow:hidden;}
.mcal-week-header{display:grid;grid-template-columns:repeat(7,1fr);background:var(--bg3);border-bottom:1px solid var(--b);}
.mcal-week-day-name{padding:8px;text-align:center;font-size:10px;font-weight:600;letter-spacing:1px;}
.mcal-month-grid{display:grid;grid-template-columns:repeat(7,1fr);}
.mcal-day-cell{min-height:100px;border-right:1px solid var(--b);border-bottom:1px solid var(--b);padding:4px;cursor:pointer;position:relative;overflow:hidden;}
.mcal-day-num{font-size:11px;font-weight:500;color:var(--tx1);margin-bottom:4px;}
.mcal-day-num-today{font-size:11px;font-weight:700;color:var(--blue);margin-bottom:4px;}
.mcal-day-num-weekend{font-size:11px;font-weight:500;color:var(--tx3);margin-bottom:4px;}
.mcal-evt-chip{font-size:10px;padding:2px 5px;margin-bottom:2px;color:#fff;border-radius:3px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.mcal-evt-more{font-size:9px;color:var(--tx2);text-align:center;}
.mcal-list-shell{padding:0;max-height:400px;overflow-y:auto;}
.mcal-list-overdue-row{background:rgba(244,67,54,0.05);}
.mcal-bdg-fg-w{color:#fff;}
.mcal-day-evt-card{padding:12px;background:var(--bg2);margin-bottom:8px;border-radius:0 var(--r) var(--r) 0;border-left:4px solid;}
.mcal-day-evt-title{font-size:13px;font-weight:600;margin-bottom:4px;}
.mcal-overdue-tag{font-size:10px;color:var(--red);font-weight:600;margin-top:4px;}
.mcal-swatch-btn{width:30px;height:30px;border-radius:50%;border:2px solid var(--b);cursor:pointer;}
/* Type-filter button: hex/CSS-var-driven via data-bd-color (handled by _applyDataColors). */
.mcal-type-btn-active{color:#fff;}
.mcal-type-btn-inactive{opacity:0.5;}
/* [CSP-PHASE-3 BATCH 49g — 2026-05-16] TLB helpers (canavia-tlb.js) — anomaly/correlation rows, CRS banners, signoff modal */
.tlb-fg-anorm{grid-template-columns:0.5fr 1fr 1fr 2.5fr 0.5fr;margin-bottom:6px;}
.tlb-fg-corr{grid-template-columns:0.5fr 1fr 1fr 1.5fr 1fr 0.5fr;margin-bottom:6px;}
.tlb-dpst-actions{margin-top:14px;display:flex;align-items:center;justify-content:space-between;}
.tlb-sigactions{display:flex;gap:8px;margin-bottom:8px;}
.tlb-banner-am-8-12{background:var(--amber-d);border:1px solid var(--amber);border-radius:var(--r);padding:8px 12px;font-size:11px;margin-bottom:10px;}
.tlb-banner-gn-8-12{background:var(--green-d);border:1px solid var(--green);border-radius:var(--r);padding:8px 12px;font-size:11px;margin-bottom:10px;}
.tlb-banner-am-flex{background:var(--amber-d);border:1px solid var(--amber);border-radius:var(--r);padding:8px 12px;font-size:11px;flex:1;}
.tlb-banner-gn-flex{background:var(--green-d);border:1px solid var(--green);border-radius:var(--r);padding:8px 12px;font-size:11px;flex:1;}
.tlb-crs-note{font-size:11px;color:var(--tx2);background:var(--bg3);padding:8px;border-radius:var(--r);margin-top:6px;}
.tlb-pf-scroll{max-height:340px;overflow-y:auto;border:1px solid var(--b);border-radius:var(--r);}
.tlb-pf-row{display:flex;gap:8px;padding:6px 10px;border-bottom:1px solid var(--b);font-size:11px;align-items:center;}
.tlb-pf-label{flex:1;cursor:pointer;}
.tlb-pf-note-input{width:160px;font-size:10px;padding:2px 6px;}
.tlb-fg-12{grid-template-columns:1fr 2fr;}
.tlb-modal-shell-640{background:var(--bg);border:1px solid var(--b);border-radius:var(--rl);max-width:640px;width:100%;max-height:90vh;display:flex;flex-direction:column;box-shadow:0 12px 48px rgba(0,0,0,0.45);}
.tlb-sig-role-grid{grid-template-columns:0.7fr 1.5fr 1fr;margin-bottom:8px;}
.tlb-role-input{text-align:center;font-weight:600;}
.tlb-info-note-bg3{font-size:11px;color:var(--tx3);background:var(--bg3);padding:8px;border-radius:var(--r);margin-bottom:12px;}
.tlb-modal-foot{padding:12px 18px;border-top:1px solid var(--b);display:flex;justify-content:flex-end;gap:8px;flex-wrap:wrap;}
/* [CSP-PHASE-3 BATCH 49h — 2026-05-16] forms.js helpers — edit modal note + bulk-upload UI (drop zone, info, progress bar, file-row table) */
.frm-file-note{padding:8px;background:var(--bg3);border-radius:6px;font-size:11px;color:var(--tx3);}
.frm-drop-zone{border:2px dashed var(--blue);border-radius:12px;padding:40px;text-align:center;background:var(--bg3);cursor:pointer;transition:all 0.2s;margin-bottom:16px;}
.frm-drop-icon{font-size:48px;margin-bottom:8px;}
.frm-drop-title{font-size:14px;font-weight:600;margin-bottom:4px;}
.frm-drop-hint{font-size:11px;color:var(--tx3);margin-bottom:12px;}
.frm-bulk-info{background:var(--bg3);border-left:3px solid var(--blue);padding:10px 12px;border-radius:6px;margin-bottom:12px;font-size:11px;color:var(--tx2);}
.frm-bulk-preview{max-height:400px;overflow-y:auto;}
.frm-bulk-progress{display:none;margin-top:12px;padding:10px;background:var(--bg3);border-radius:6px;}
.frm-bulk-progress-text{font-size:12px;margin-bottom:6px;}
.frm-bulk-bar-track{width:100%;height:6px;background:var(--bg);border-radius:3px;overflow:hidden;}
.frm-bulk-bar-fill{height:100%;background:var(--blue);transition:width 0.3s;width:0%;}
.frm-bulk-tbl-shell{max-height:380px;overflow-y:auto;}
.frm-bulk-col-file{width:200px;}
.frm-bulk-col-code{width:120px;}
.frm-bulk-row-success{opacity:.5;}
.frm-bulk-row-error{background:rgba(239,68,68,0.1);}
.frm-bulk-status-cell{text-align:center;font-size:14px;}
.frm-bulk-file-cell{font-size:10px;color:var(--tx3);word-break:break-all;}
.frm-bulk-errrow{background:rgba(239,68,68,0.05);}
.frm-bulk-errmsg-cell{font-size:10px;color:var(--red);padding:4px 8px;}
.frm-bulk-footer{display:flex;justify-content:space-between;align-items:center;margin-top:8px;font-size:11px;color:var(--tx3);}
/* [CSP-PHASE-3 BATCH 49i — 2026-05-16] forecast.js helpers — hub page, event rows, drawer warnings */
.fc-hub-host{padding:14px 18px;}
.fc-error-block{padding:24px;color:var(--red);}
.fc-row-c-fxw{display:flex;gap:14px;align-items:center;flex-wrap:wrap;}
.fc-empty-block{padding:24px;text-align:center;color:var(--tx3);font-size:12px;}
.fc-btn-blue-active{background:var(--blue);color:#fff;border-color:var(--blue);}
.fc-covered-badge{font-size:9px;background:rgba(55,138,221,.18);color:var(--blue);padding:1px 6px;border-radius:4px;margin-left:6px;}
.fc-covered-badge-row{font-size:9px;background:rgba(55,138,221,.18);color:var(--blue);padding:1px 5px;border-radius:4px;}
.fc-evt-dimmed{opacity:0.45;}
.fc-evt-dimmed-55{opacity:0.55;}
.fc-evt-dimmed-60{opacity:0.6;}
.fc-banner-gn-8-12{background:rgba(29,158,117,.08);border:1px solid var(--green);color:var(--green);padding:8px 12px;border-radius:var(--r);font-size:11px;margin-bottom:10px;}
.fc-banner-am-8-12{background:rgba(239,159,39,.08);border:1px solid var(--amber);color:var(--amber);padding:8px 12px;border-radius:var(--r);font-size:11px;margin-bottom:6px;}
.fc-icard-9-12{background:var(--bg3);padding:9px 12px;border-radius:var(--r);margin-bottom:14px;}
.fc-icard-sub-info{font-size:11px;color:var(--tx3);margin-top:3px;}
.fc-card-bg2-mt14{margin-top:14px;padding:10px 12px;background:var(--bg2);border:1px solid var(--b);border-radius:var(--r);}
.fc-card-bg2-mt8{margin-top:8px;padding:10px 12px;background:var(--bg2);border:1px solid var(--b);border-radius:var(--r);}
.fc-kind-chip-mr4{margin-right:4px;}
.fc-no-mech-empty{text-align:center;padding:40px;color:var(--tx3);font-size:12px;}
.fc-mech-label{display:flex;align-items:center;gap:8px;padding:6px 10px;cursor:pointer;border-bottom:1px solid var(--b);}
/* [CSP-PHASE-3 BATCH 49j — 2026-05-16] labels.js / tags.js / aircraft-status.js helpers */
.u-display-contents{display:contents;}
.lbl-type-card{cursor:pointer;border:2px solid var(--b);border-radius:8px;padding:12px;background:var(--bg2);}
.lbl-info-note-bg3-mt{margin-top:12px;padding:8px;background:var(--bg3);border-radius:4px;font-size:11px;color:var(--tx3);}
.lbl-info-card-bg3{margin-bottom:10px;padding:10px;background:var(--bg3);border-radius:6px;}
.tag-type-card{border:2px solid;border-radius:8px;padding:10px;cursor:pointer;background:var(--bg3);}
.tag-type-card.tag-gn,.tag-card-code.tag-gn{border-color:#00a86b;color:#00a86b;}
.tag-type-card.tag-am,.tag-card-code.tag-am{border-color:#f5a623;color:#f5a623;}
.tag-type-card.tag-rd,.tag-card-code.tag-rd{border-color:#ff4d4d;color:#ff4d4d;}
.tag-type-card.tag-or,.tag-card-code.tag-or{border-color:#ff8c00;color:#ff8c00;}
.tag-card-code{font-size:10px;font-weight:700;}
.tag-card-label{font-size:12px;font-weight:600;margin-top:2px;}
/* [CSP-PHASE-3 BATCH 49k — 2026-05-16] qr.js helpers — bulk-select dialog */
.qr-bulk-intro{font-size:12px;margin-bottom:10px;color:var(--tx2);}
.qr-bulk-search-row{margin:14px 0 6px;display:flex;justify-content:space-between;align-items:center;}
.qr-bulk-search-input{flex:1;padding:6px 10px;font-size:12px;border:1px solid var(--b2);border-radius:var(--r);background:var(--bg2);}
.qr-bulk-actions{margin-left:10px;display:flex;gap:6px;}
.qr-bulk-items-list{max-height:300px;overflow-y:auto;border:1px solid var(--b);border-radius:var(--r);padding:4px;background:var(--bg2);}
.qr-bulk-footer{margin-top:10px;font-size:11px;color:var(--tx2);}
.qr-bulk-empty{padding:20px;text-align:center;color:var(--tx3);font-size:12px;}
.qr-bulk-row-label{display:flex;align-items:center;gap:8px;padding:6px 8px;border-bottom:1px solid var(--b);cursor:pointer;}
.qr-bulk-row-sub{color:var(--tx2);font-size:10px;}
/* [CSP-PHASE-3 BATCH 49l — 2026-05-16] cae.js helpers — version-detail modal */
.cae-desc-box{padding:10px;background:var(--bg4);border-radius:var(--r);font-size:12px;}
.cae-changelog-scroll{max-height:200px;overflow:auto;}
.cae-changelog-row{padding:6px;border-bottom:1px solid var(--b);font-size:11px;}
.cae-changelog-sb{display:flex;justify-content:space-between;}
.cae-foot-divider{margin-top:14px;padding-top:14px;border-top:1px solid var(--b);}
.cae-version-detail-body{font-size:12px;line-height:1.5;}
.cae-version-card{background:var(--bg4);padding:14px;border-radius:var(--r);margin-bottom:14px;}
.cae-version-hdr{font-weight:600;margin-bottom:6px;}
.cae-ul-indent{padding-left:20px;margin-top:8px;}
/* [CSP-PHASE-3 BATCH 49m — 2026-05-16] forminbox.js helpers */
.fib-summary{cursor:pointer;padding:8px;background:var(--bg3);border-radius:4px;font-weight:600;}
.fib-form-card{padding:10px;border:1px solid var(--b);border-radius:4px;margin-bottom:6px;background:var(--bg2);}
.fib-row-4-fxw{display:flex;gap:4px;flex-wrap:wrap;}
.fib-tag-awaiting{background:#FFA726;color:#fff;padding:2px 8px;border-radius:3px;font-size:10px;font-weight:600;}
.fib-form-card-mut{padding:8px 10px;border:1px solid var(--b);border-radius:4px;margin-bottom:4px;background:var(--bg3);opacity:0.85;}
.fib-sb-c-8{display:flex;justify-content:space-between;align-items:center;gap:8px;}
.fib-meta-sub{font-size:10px;color:var(--tx3);margin-left:6px;}
.fib-state-pill{color:#fff;padding:1px 6px;border-radius:3px;font-size:9px;}
.fib-pending-pill{background:var(--red);color:#fff;padding:2px 8px;border-radius:10px;font-size:11px;font-weight:700;margin-left:8px;}
.fib-modal-body-scroll{max-height:70vh;overflow-y:auto;padding-right:8px;}
.fib-modal-foot{margin-top:12px;padding-top:12px;border-top:2px solid var(--b);text-align:right;}
/* [CSP-PHASE-3 BATCH 49n — 2026-05-16] logbook.js helpers */
.lb-empty-tw{padding:40px;text-align:center;color:var(--tx3);}
.lb-empty-icon{font-size:40px;margin-bottom:10px;}
.lb-table-min1100{min-width:1100px;}
.lb-task-type-cell{font-size:10px;color:var(--blue);}
.lb-op-cell{font-size:11px;max-width:250px;}
/* [LOGBOOK-VOID-V1 2026-05-30] Voided rows — strike-through + red tint */
.lb-row-voided{opacity:.6;background:rgba(180,0,0,.06);}
.lb-row-voided td{color:#a00;text-decoration:line-through;text-decoration-color:#a00;}
.lb-row-voided .lb-void-badge{text-decoration:none;}
.lb-void-badge{display:inline-block;background:#a00;color:#fff;font-size:9px;font-weight:700;padding:1px 5px;border-radius:2px;margin-right:4px;letter-spacing:.5px;}
.lb-bar-fill-grad{height:100%;background:linear-gradient(90deg,var(--blue),var(--teal));}
.lb-bar-row{display:flex;justify-content:space-between;padding:6px 0;border-bottom:1px solid var(--b);font-size:12px;}
.lb-bar-cluster{display:flex;gap:4px;align-items:flex-end;height:100px;}
.lb-bar-col{flex:1;text-align:center;}
.lb-bar-fill-mini{background:linear-gradient(0deg,var(--blue),var(--teal));min-height:4px;border-radius:2px 2px 0 0;margin-top:2px;}
.lb-auto-note{padding:8px;background:rgba(33,150,243,0.08);border-radius:3px;font-size:11px;color:var(--blue);margin-top:8px;}
.lb-modal-body-scroll{max-height:500px;overflow:auto;}
/* [CSP-PHASE-3 BATCH 49o — 2026-05-16] api.js helpers — PO modals, 2FA, team picker */
.api-ilot-info{background:var(--bg3);border-radius:var(--r);padding:8px 10px;font-size:11px;color:var(--tx2);}
.api-po-qty-input{width:70px;background:var(--bg3);border:1px solid var(--b);border-radius:var(--r);padding:5px 8px;color:var(--tx);}
.api-po-qty-input-small{width:65px;background:var(--bg3);border:1px solid var(--b);border-radius:var(--r);padding:5px 8px;color:var(--tx);}
.api-po-items-list-50{background:var(--bg3);border-radius:var(--r);padding:9px;min-height:50px;}
.api-po-items-list-44{background:var(--bg3);border-radius:var(--r);padding:9px;min-height:44px;}
.api-po-card{background:var(--bg3);border-radius:var(--r);padding:9px;}
.api-po-hdr-grid{display:grid;grid-template-columns:1fr 2fr 80px 90px;gap:5px;font-size:9px;color:var(--tx3);text-transform:uppercase;padding:0 4px 5px;border-bottom:1px solid var(--b);}
.api-po-row-grid{display:grid;grid-template-columns:1fr 2fr 80px 90px;gap:5px;align-items:center;padding:5px 4px;border-bottom:1px solid var(--b);}
.api-row-6{display:flex;gap:6px;}
.api-foot-r-g8{display:flex;gap:8px;justify-content:flex-end;grid-column:1/-1;margin-top:4px;}
.api-2fa-qr-wrap{text-align:center;margin-bottom:14px;}
.api-2fa-qr-img{width:180px;height:180px;background:#fff;padding:8px;border-radius:8px;}
.api-2fa-secret-hint{font-size:10px;color:var(--tx3);margin-top:8px;}
.api-2fa-code{font-family:monospace;color:var(--blue);}
.api-2fa-warning{font-size:12px;color:var(--amber);margin-bottom:12px;}
.api-team-chip{display:inline-flex;align-items:center;gap:4px;background:rgba(55,138,221,.18);color:var(--blue);padding:2px 8px;border-radius:12px;font-size:11px;margin:2px;}
.api-team-chip-x{background:none;border:none;color:var(--blue);cursor:pointer;font-size:13px;line-height:1;padding:0;}
.api-team-host{display:flex;flex-wrap:wrap;align-items:center;gap:4px;min-height:32px;padding:4px;border:1px solid var(--b);border-radius:var(--r);background:var(--bg);}
.api-team-select{border:none;background:transparent;font-size:11px;cursor:pointer;flex:1;min-width:140px;}
/* [CSP-PHASE-3 BATCH 49p — 2026-05-16] library.js helpers — empty/loading states, doc detail, history */
.lib-empty-text{font-size:14px;font-weight:500;color:var(--tx2);}
.lib-empty-msg-t3{color:var(--tx3);font-size:12px;padding:20px;text-align:center;}
.lib-empty-msg-t2{color:var(--tx2);font-size:12px;padding:20px;text-align:center;}
.lib-empty-msg-rd{color:var(--red);font-size:12px;padding:20px;text-align:center;}
.lib-empty-noresults{font-size:14px;color:var(--tx2);}
.lib-search-card{background:var(--bg2);border:1px solid var(--b);border-radius:var(--r);padding:12px 14px;margin-bottom:8px;}
.lib-search-summary{background:var(--bg3);padding:8px 10px;border-radius:var(--r);font-size:11px;color:var(--tx);line-height:1.5;border-left:3px solid var(--blue);}
.lib-viewer-title{font-weight:600;font-size:13px;color:var(--tx);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
.lib-page-input{width:55px;text-align:center;}
.lib-zoom-label{font-size:11px;color:var(--tx2);min-width:40px;text-align:center;}
.lib-det-err-row{background:color-mix(in srgb,var(--red) 10%,transparent);border-radius:var(--r);padding:8px 10px;margin-top:6px;}
.lib-doc-title{font-weight:600;font-size:14px;color:var(--tx);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.lib-doc-filename{font-size:10px;font-family:monospace;color:var(--tx3);word-break:break-all;}
.lib-doc-delete-btn{color:var(--red);margin-left:auto;}
.lib-callout-am-10-12{background:var(--bg3);padding:10px 12px;border-radius:var(--r);font-size:11px;color:var(--tx2);border-left:3px solid var(--amber);}
.lib-history-row{display:flex;flex-wrap:wrap;gap:6px;align-items:center;padding:8px 10px;background:var(--bg3);border-radius:var(--r);border:1px solid var(--b);}
.lib-history-recent-label{font-size:10px;color:var(--tx3);font-weight:600;text-transform:uppercase;letter-spacing:1px;margin-right:4px;}
/* [CSP-PHASE-3 BATCH 49q — 2026-05-16] amppkg.js helpers — task picker, archive viewer */
.amp-task-scroll{max-height:200px;overflow-y:auto;font-size:10px;}
.amp-search-row{display:flex;gap:6px;margin-bottom:6px;}
.amp-error-box{padding:14px;color:var(--red);}
.amp-empty-tasks{padding:14px;text-align:center;color:var(--tx3);font-size:11px;}
.amp-task-label{display:flex;align-items:center;gap:8px;padding:6px 10px;border-bottom:1px solid var(--b);cursor:pointer;font-size:11px;}
.amp-task-label-warn{background:var(--amber-d);}
.amp-task-warn-tag{font-size:9px;color:var(--amber);min-width:80px;}
.amp-more-info{padding:8px;text-align:center;color:var(--tx3);font-size:10px;}
.amp-match-badge{color:var(--green);font-size:9px;}
.amp-task-row-base{display:flex;align-items:center;gap:8px;padding:6px 10px;border-bottom:1px solid var(--b);font-size:11px;}
.amp-task-row-disabled{cursor:not-allowed;opacity:.5;}
.amp-task-row-enabled{cursor:pointer;opacity:1;}
.amp-error-bar{font-size:11px;color:var(--red);padding:8px;background:var(--red-d);border:1px solid var(--red);border-radius:var(--r);margin-top:6px;}
.amp-archive-toggle{margin-top:10px;font-size:10px;color:var(--tx3);cursor:pointer;}
.amp-archive-body{display:none;margin-top:6px;}
.amp-archive-row{display:flex;align-items:center;gap:6px;padding:4px 8px;background:var(--bg3);border-radius:var(--r);margin-bottom:3px;font-size:10px;}
.amp-archive-name{color:var(--blue);min-width:90px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.amp-archive-btn{padding:1px 6px;font-size:10px;}
/* AMP toolset chip — 3 health states (ok/warn/block) */
.u-tool-chip{background:var(--bg2);border:1px solid var(--b);border-radius:var(--r);padding:4px 8px;font-size:11px;display:flex;align-items:center;gap:6px;}
.u-tool-chip-ok > .mo{color:var(--blue);}
.u-tool-chip-warn{border-color:var(--amber);}
.u-tool-chip-warn > .mo{color:var(--amber);}
.u-tool-chip-block{border-color:var(--red);}
.u-tool-chip-block > .mo{color:var(--red);}
.u-p2-8-ib-fw7{padding:2px 8px;display:inline-block;font-weight:700;}
.u-row-sb-card{display:flex;justify-content:space-between;align-items:center;background:var(--bg3);padding:10px 14px;border-radius:var(--r);}
.u-row-sb-start{display:flex;justify-content:space-between;align-items:start;}
.u-mo{font-family:monospace;}
.u-list-row{display:flex;gap:8px;padding:8px 10px;border-bottom:1px solid var(--b);font-size:11px;align-items:center;}
.u-list-row-clk{display:flex;gap:8px;padding:6px 8px;border-bottom:1px solid var(--b);font-size:11px;align-items:center;cursor:pointer;}
.u-rr{border-radius:var(--r);}
.u-w-auto{width:auto;}
.u-ml-auto{margin-left:auto;}
.u-w70{width:70px;}
.u-mw400{min-width:400px;}
.u-mw300{min-width:300px;}
.u-gap-7{gap:7px;}
.u-flex-100{flex:0 0 100px;}
.u-card-base{background:var(--bg2);border:1px solid var(--b);border-radius:var(--rl);}
.u-input-row{width:100%;padding:6px 8px;font-size:11px;border:1px solid var(--b);border-radius:var(--r);background:var(--bg2);color:var(--tx);}
.u-tbl-12{width:100%;border-collapse:collapse;font-size:12px;}
.u-mh60{min-height:60px;}
.u-empty-pad-xl{text-align:center;padding:60px;color:var(--tx3);}
.u-empty-mid{text-align:center;padding:16px;color:var(--tx3);font-size:12px;}
.u-p9-10{padding:9px 10px;}
.u-th-stripe{padding:6px 8px;font-size:10px;color:var(--tx3);text-align:center;background:var(--bg3);}
.u-pill-red{padding:5px 8px;text-align:center;font-size:10px;color:var(--tx3);background:var(--red-d);}
.u-pill-amber{padding:5px 8px;text-align:center;font-size:10px;color:var(--tx3);background:var(--amber-d);}
.u-p8{padding:8px;}
.u-rel{position:relative;}
.u-nowrap{white-space:nowrap;}
.u-flex-wrap{flex-wrap:wrap;}
.u-chip-clk{cursor:pointer;background:var(--bg3);border:1px solid var(--b);border-radius:6px;padding:6px 14px;font-size:13px;color:var(--tx);white-space:nowrap;}
.u-risk-card{padding:14px;border-radius:var(--r);text-align:center;border-width:1px;border-style:solid;}
.u-empty-drop{padding:40px;text-align:center;color:var(--tx3);border:1px dashed var(--b);border-radius:var(--r);}
.u-p10-card{padding:10px;border:1px solid var(--b);border-radius:4px;margin-bottom:6px;}
.u-disabled{opacity:0.4;cursor:not-allowed;}
.u-p8-12{padding:8px 12px;}
.u-bar-track-6{height:6px;background:var(--bg4);border-radius:2px;overflow:hidden;}
.u-w42{width:42px;}
.u-w65{width:65px;}
.u-w130{width:130px;}
.u-w140{width:140px;}
.u-w28{width:28px;}
.u-mt11{margin-top:11px;}
.u-ova{overflow:auto;}
.u-p16{padding:16px;}
.u-thl-up{text-align:left;font-size:9px;color:var(--tx3);text-transform:uppercase;letter-spacing:.08em;padding:7px 11px;border-bottom:1px solid var(--b);}
.u-mb12{margin-bottom:12px;}
.u-mb15{margin-bottom:15px;}
.u-mb16{margin-bottom:16px;}
.u-mb18{margin-bottom:18px;}
.u-fs22{font-size:22px;}
.u-fs24{font-size:24px;}
.u-fs28{font-size:28px;}
.u-fs32{font-size:32px;}
.u-mw100{min-width:100px;}
.u-mw160{min-width:160px;}
.u-p30{padding:30px;}
.u-p2-7{padding:2px 7px;}
.u-gc-full{grid-column:1/-1;}
.u-mt2{margin-top:2px;}
/* [CSP-PHASE-3 BATCH 11 — 2026-05-15] */
.u-lh15{line-height:1.5;}
.u-mw55{min-width:55px;}
.u-mw60{min-width:60px;}
.u-mw80{min-width:80px;}
.u-mw90{min-width:90px;}
.u-p8-0{padding:8px 0;}
.u-p4-2{padding:4px 2px;}
.u-p6-8{padding:6px 8px;}
.u-p5-0{padding:5px 0;}
.u-rad-r{border-radius:var(--r);}
.u-fxx-0{flex:0 0 auto;}
.u-bd-b{border:1px solid var(--b);}
.u-bg-red-w{background:var(--red);color:#fff;}
.u-divider-v{width:1px;height:20px;background:var(--b);margin:0 4px;}
.u-empty-grid{grid-column:1/-1;text-align:center;padding:40px;color:var(--tx3);font-size:12px;}
.u-card-mb6{font-size:11px;color:var(--tx3);background:var(--bg3);padding:8px;border-radius:var(--r);margin-bottom:6px;}
.u-card-mb10{font-size:11px;color:var(--tx3);background:var(--bg3);padding:8px;border-radius:var(--r);margin-bottom:10px;}
/* [CSP-PHASE-3 BATCH 13 — 2026-05-15] */
.u-tt-up{text-transform:uppercase;}
.u-bg-green-w{background:var(--green);color:#fff;}
.u-bg-green-wht{background:var(--green);color:white;}
.u-bg-red-wht{background:var(--red);color:white;}
.u-bg-amber-w{background:var(--amber);color:#fff;}
.u-card-bd{border:1px solid var(--b);border-radius:var(--r);}
.u-card-bd-mb12{border:1px solid var(--b);border-radius:var(--r);margin-bottom:12px;}
.u-card-clickable{border-width:1px;border-style:solid;border-radius:var(--r);padding:12px 14px;cursor:pointer;}
.u-divider-top-mt6{border-top:1px solid var(--b);padding-top:14px;margin-top:6px;}
.u-divider-top-pt14{border-top:1px solid var(--b);padding-top:14px;}
.u-divider-top-pt12{border-top:1px solid var(--b);padding-top:12px;margin-top:4px;}
.u-tab-bottom{border-bottom:2px solid var(--b);background:var(--bg2);}
.u-dropdown-320{max-height:320px;overflow-y:auto;border:1px solid var(--b);border-radius:var(--r);margin-top:4px;background:var(--bg2);display:none;}
.u-grid-cell-ghost{min-height:100px;border-right:1px solid var(--b);border-bottom:1px solid var(--b);background:var(--bg1);opacity:0.3;}
.u-bx-flex-c-bg3{display:flex;flex-direction:column;gap:6px;background:var(--bg3);border:1px solid var(--b);border-radius:var(--r);padding:8px;}
.u-bx-row-bg3{display:flex;gap:10px;flex-wrap:wrap;padding:6px 8px;background:var(--bg3);border:1px solid var(--b);border-radius:var(--r);}
.u-chip-pad-bg2{font-size:10px;padding:2px 7px;background:var(--bg2);color:var(--tx3);border:1px solid var(--b);}
.u-sect-08-mb6{font-size:11px;color:var(--tx3);text-transform:uppercase;letter-spacing:0.8px;margin-bottom:6px;}
.u-sect-04-mb6{font-size:11px;color:var(--tx3);text-transform:uppercase;letter-spacing:0.4px;margin-bottom:6px;}
.u-sect-07em-mb8{font-size:11px;color:var(--tx3);text-transform:uppercase;letter-spacing:.07em;margin-bottom:8px;}
.u-sect-08em-mb9{font-size:10px;color:var(--tx3);text-transform:uppercase;letter-spacing:.08em;margin-bottom:9px;}
.u-link-blue{color:var(--blue);cursor:pointer;text-decoration:underline;}
.u-tb-fxx-0{color:var(--blue);flex:0 0 auto;}
.u-tb-fs11-mw90{color:var(--blue);font-size:11px;min-width:90px;}
.u-x-red-btn{background:transparent;border:none;color:var(--red);padding:0 2px;font-size:13px;line-height:1;}
/* [CSP-PHASE-3 BATCH 14 — 2026-05-15] */
/* Percent widths (for <col> table column sizing) */
.u-wp6{width:6%;}.u-wp7{width:7%;}.u-wp8{width:8%;}.u-wp9{width:9%;}
.u-wp10{width:10%;}.u-wp11{width:11%;}.u-wp14{width:14%;}.u-wp30{width:30%;}
/* SMS SPI (Safety Performance Indicator) colours */
.u-spi-g{color:#00d180;}
.u-spi-a{color:#f5a623;}
.u-spi-r{color:#ff4d4d;}
.u-spi-bg-g{background:#00d18022;}
.u-spi-bg-a{background:#f5a62322;}
.u-spi-bg-r{background:#ff4d4d22;}
/* Modal-body scrollables */
.u-modal-body-400{padding:0;max-height:400px;overflow:auto;}
.u-modal-body-280{max-height:calc(100vh - 280px);overflow:auto;padding:0;}
.u-modal-body-260{max-height:calc(100vh - 260px);overflow:auto;padding:0;}
/* Mono fonts (data display) */
.u-mono-fs10{font-family:'IBM Plex Mono',monospace;font-size:10px;}
.u-mono-p4-8{padding:4px 8px;font-family:'IBM Plex Mono',monospace;font-size:11px;}
.u-mono-p4-8-tar{padding:4px 8px;text-align:right;font-size:11px;}
/* Big metric value */
.u-metric-lg{font-size:20px;font-weight:700;margin-top:4px;}
/* Grids */
.u-grid-2c-10{display:grid;grid-template-columns:1fr 1fr;gap:10px;}
.u-grid-12{display:grid;gap:12px;}
/* Fixed-width chip */
.u-chip-fixed-130{font-size:11px;padding:5px 7px;width:130px;flex:0 0 130px;}
/* Aircraft registration mono-style */
.u-reg-mono{font-size:14px;font-weight:600;letter-spacing:1px;}
/* Decorative overlay (non-interactive) */
.u-decor-8{pointer-events:none;opacity:0.8;}
/* Misc table-cell + text combos */
.u-cell-p5-4{padding:5px 4px;text-align:left;}
.u-fs11-mt6{font-size:11px;margin-top:6px;}
.u-fs11-mb8{font-size:11px;margin-bottom:8px;}
.u-fs11-mb18{font-size:11px;margin-bottom:18px;}
.u-fs11-fwb{font-size:11px;font-weight:600;}
.u-fs11-mw300{font-size:11px;max-width:300px;}
.u-fs11-p4-8-w200{font-size:11px;padding:4px 8px;width:200px;}
.u-fs11-p5-7-w130{font-size:11px;padding:5px 7px;width:130px;flex:0 0 130px;}
.u-row-mb12-ai{gap:10px;margin-bottom:12px;align-items:center;}
/* OTP / 2FA code display */
.u-otp{text-align:center;font-size:18px;letter-spacing:4px;font-family:monospace;}
/* Auto-width chip variant */
.u-chip-auto{font-size:10px;padding:3px 8px;width:auto;}
/* Solid badge (rounded chip with white text) */
.u-badge-solid{font-size:10px;padding:2px 7px;border-radius:3px;color:#fff;font-weight:600;}
/* Tiny min-width-32 cell */
.u-tac-mw32{text-align:center;min-width:32px;}
/* Position relative + margin-top:6px (for tooltip anchors etc.) */
.u-rel-mt6{position:relative;margin-top:6px;}
/* Small icon dot 15px / 18px squares */
.u-sq15{width:15px;height:15px;}
.u-sq18-mt4{width:18px;height:18px;margin-top:4px;}
/* Soft tinted card with blue left-bar */
.u-card-blue-bar{background:var(--bg3);padding:10px 14px;border-radius:var(--r);border-left:3px solid var(--blue);}
/* Row of clickable items */
.u-row-click{display:flex;align-items:center;gap:8px;cursor:pointer;font-size:13px;}
/* margin-bottom:11px + padding:14px (modal sections) */
.u-mb11-p14{margin-bottom:11px;padding:14px;}
/* Flex 1 with font-size:11px (descriptive text in flex row) */
.u-f1-fs11{flex:1;font-size:11px;}
/* [CSP-PHASE-3 BATCH 15 — 2026-05-15] */
/* Flex/row composites with multiple modifiers */
.u-row-sb-fs11-mb2{display:flex;justify-content:space-between;font-size:11px;margin-bottom:2px;}
.u-row-sb-start-mb8{display:flex;justify-content:space-between;align-items:start;margin-bottom:8px;}
.u-row-end-gap8-mt8-gcfull{display:flex;gap:8px;justify-content:flex-end;margin-top:8px;grid-column:1/-1;}
.u-row-5{display:flex;gap:5px;}
.u-row-wrap-4-mt8{display:flex;gap:4px;margin-top:8px;flex-wrap:wrap;}
.u-row-gap12-tac{display:flex;gap:12px;text-align:center;}
.u-row-10-mb14{display:flex;gap:10px;margin-bottom:14px;}
.u-col-5-end{display:flex;flex-direction:column;gap:5px;align-items:flex-end;}
.u-row-8-mb10{display:flex;align-items:center;gap:8px;margin-bottom:10px;}
.u-row-4-fs11-cur{display:flex;align-items:center;gap:4px;font-size:11px;cursor:pointer;}
.u-row-10-mb8{display:flex;align-items:center;gap:10px;margin-bottom:8px;}
.u-row-10-mb6{display:flex;align-items:center;gap:10px;margin-bottom:6px;}
/* Background composites */
.u-section-hdr-bg3{background:var(--bg3);padding:6px 10px;font-size:10px;font-weight:600;color:var(--tx3);border-bottom:1px solid var(--b);}
.u-card-blue-bar-fs11{background:var(--bg3);padding:10px 12px;border-radius:var(--r);font-size:11px;color:var(--tx2);border-left:3px solid var(--blue);}
.u-cell-bg3-w32{background:var(--bg3);color:var(--tx3);text-align:center;width:32px;}
.u-row-bg3-tag{background:var(--bg3);border-radius:var(--r);padding:6px 9px;margin-bottom:4px;font-size:11px;display:flex;align-items:center;gap:6px;}
.u-chip-bg2{background:var(--bg2);color:var(--tx3);border:1px solid var(--b);}
.u-input-bg2{background:var(--bg2);border:1px solid var(--b2);border-radius:var(--r);padding:3px 6px;color:var(--tx);font-size:11px;width:100%;}
.u-cell-bg2-rl{background:var(--bg2);border:1px solid var(--b);border-radius:var(--rl);overflow:hidden;}
.u-modal-shell{background:var(--bg);border:1px solid var(--b);border-radius:var(--rl);max-width:680px;width:100%;max-height:90vh;display:flex;flex-direction:column;box-shadow:0 12px 48px rgba(0,0,0,0.45);}
/* Misc */
.u-t-violet{color:#A78BFA;}
/* [CSP-PHASE-3 BATCH 16 — 2026-05-15] data-driven from report-only log */
.u-row-grow{display:flex;gap:8px;min-width:max-content;}
.u-grid-13-4{display:grid;grid-template-columns:repeat(13,1fr);gap:4px;}
.u-bg-red{background:var(--red);}
.u-row-7-12-bb{display:flex;align-items:center;gap:7px;padding:7px 12px;border-bottom:1px solid var(--b);}
.u-fs12-fw5-w52{font-size:12px;font-weight:500;width:52px;}
.u-fs10-t2-f1{font-size:10px;color:var(--tx2);flex:1;}
.u-p7-11-fs11-fw5{padding:7px 11px;font-size:11px;font-weight:500;}
.u-p7-11-fs10-t2{padding:7px 11px;font-size:10px;color:var(--tx2);}
.u-p12-tac-fs11-t3{padding:12px;text-align:center;font-size:11px;color:var(--tx3);}
.u-p6-0{padding:6px 0;}
.u-row-6{display:flex;align-items:center;gap:6px;}
.u-tg-fwb{color:var(--green);font-weight:600;}
.u-empty-30{text-align:center;padding:30px;color:var(--tx3);}
.u-mb11-p12{margin-bottom:11px;padding:12px;}
.u-row-9-mb10{display:flex;align-items:center;gap:9px;margin-bottom:10px;}
/* [CSP-PHASE-3 BATCH 17 — 2026-05-15 round 2 data-driven] */
.u-mw140{min-width:140px;}
.u-grid-2c-20{display:grid;grid-template-columns:1fr 1fr;gap:20px;}
.u-row-16-mb12{display:flex;gap:16px;align-items:center;margin-bottom:12px;}
.u-spinner-32{width:32px;height:32px;border:3px solid var(--b2);border-top-color:var(--blue);border-radius:50%;animation:spin .8s linear infinite;}
.u-fs13-t2{font-size:13px;color:var(--tx2);}
.u-rel-fxx-0{flex-shrink:0;position:relative;}
.u-row-sb-mb8-fs11{display:flex;justify-content:space-between;margin-bottom:8px;font-size:11px;}
.u-ta-fwb{color:var(--amber);font-weight:600;}
/* [CSP-PHASE-3 BATCH 18 — 2026-05-15 index.html sweep] */
/* Dashboard / fleet cards / KPI grids */
.u-fleet-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(200px,1fr));gap:10px;padding:12px;}
.u-kpi-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(190px,1fr));gap:8px;}
.u-cards-grid-260{display:grid;grid-template-columns:repeat(auto-fill,minmax(260px,1fr));gap:10px;}
.u-grid-4c-10{display:grid;grid-template-columns:repeat(4,1fr);gap:10px;margin-top:12px;}
.u-row-pad-flex-16{padding:14px;display:flex;align-items:center;gap:16px;}
.u-timeline-x{padding:14px;overflow-x:auto;}
.u-stock-mono-green{font-family:'IBM Plex Mono',monospace;font-size:11px;color:var(--green);}
/* Dots (legend pips) */
.u-dot-6-blue{width:6px;height:6px;border-radius:50%;background:var(--blue);display:inline-block;}
.u-dot-6-red{width:6px;height:6px;border-radius:50%;background:var(--red);display:inline-block;}
.u-dot-6-amber{width:6px;height:6px;border-radius:50%;background:var(--amber);display:inline-block;}
/* Colored chip squares */
.u-chip-8-blue{width:8px;height:8px;background:var(--blue-d);border:1px solid var(--blue);border-radius:2px;display:inline-block;}
.u-chip-8-purple{width:8px;height:8px;background:var(--purple-d);border:1px solid var(--purple);border-radius:2px;display:inline-block;}
.u-chip-8-red{width:8px;height:8px;background:var(--red-d);border:1px solid var(--red);border-radius:2px;display:inline-block;}
.u-chip-8-teal{width:8px;height:8px;background:var(--teal-d);border:1px solid var(--teal);border-radius:2px;display:inline-block;}
/* Layout misc */
.u-row-7-mt9-wrap{display:flex;gap:7px;margin-top:9px;flex-wrap:wrap;}
.u-row-tab-strip{display:flex;gap:6px;margin-bottom:12px;border-bottom:1px solid var(--b);padding-bottom:8px;}
.u-tabs-bar{display:flex;gap:4px;padding:10px 14px;background:var(--bg2);border-bottom:1px solid var(--b);}
.u-legend-row{display:flex;gap:11px;flex-wrap:wrap;margin-bottom:10px;}
.u-legend-row-8{display:flex;gap:8px;margin-left:10px;}
.u-row-sb-mb13{display:flex;align-items:center;justify-content:space-between;margin-bottom:13px;}
.u-row-sb-mb11{display:flex;align-items:center;justify-content:space-between;margin-bottom:11px;}
.u-row-10-mb10-wrap{display:flex;gap:10px;align-items:center;margin-bottom:10px;flex-wrap:wrap;}
.u-page-h26{font-size:26px;font-weight:500;}
.u-stat-20-green{font-size:20px;font-weight:600;color:var(--green);}
.u-stat-13-fwb-120{font-size:13px;font-weight:600;min-width:120px;text-align:center;}
.u-stat-13-fwb-130{font-size:13px;font-weight:600;min-width:130px;text-align:center;}
.u-fs15-fw5-amber{font-size:15px;font-weight:500;color:var(--amber);}
.u-bdt{border-top:1px solid var(--b);}
.u-margin-clear{margin-top:0;margin-bottom:0;}
.u-mt0{margin-top:0;}
.u-mt9-w100{margin-top:9px;width:100%;}
.u-ml3{margin-left:3px;}
.u-min-w-1400{min-width:1400px;}
.u-pad-0-12{padding:0 12px;}
.u-f1-mw200{flex:1;min-width:200px;}
.u-overflow-y-140{overflow-y:auto;max-height:calc(100vh - 140px);}
.u-overflow-y-220{max-height:calc(100vh - 220px);overflow-y:auto;}
.u-overflow-y-340{overflow-y:auto;max-height:calc(100vh - 340px);}
.u-card-shell-10{background:var(--bg2);border:1px solid var(--b);border-radius:10px;padding:12px;}
.u-dropzone{border:2px dashed var(--b2);border-radius:var(--rl);padding:18px;text-align:center;cursor:pointer;}
.u-banner-amber{background:var(--bg2);border:1px solid var(--b);border-radius:var(--rl);padding:10px 13px;display:flex;align-items:center;gap:12px;}
/* [CSP-PHASE-3 BATCH 19 — 2026-05-15 round 4 data-driven] */
.u-otp-mono-17{text-align:center;font-size:17px;letter-spacing:6px;font-family:'IBM Plex Mono',monospace;}
.u-welcome-banner{background:linear-gradient(135deg,var(--bg2) 0%,var(--bg3) 100%);border:1px solid var(--b);border-radius:var(--rl);padding:14px 18px;margin-bottom:11px;display:flex;align-items:center;gap:14px;}
.u-msg-error-hidden{display:none;margin-top:9px;padding:9px;background:var(--red-d);border-radius:var(--r);font-size:12px;color:var(--red);}
.u-msg-success-hidden{display:none;margin-top:11px;background:var(--green-d);border:1px solid var(--green);border-radius:var(--r);padding:10px 14px;font-size:12px;color:var(--green);}
.u-ml7{margin-left:7px;}
.u-row-sb-stat-mt10{background:var(--bg2);border:1px solid var(--b);border-radius:var(--rl);padding:10px 13px;display:flex;justify-content:space-between;align-items:center;margin-top:10px;}
.u-pill-blue-active{background:var(--blue-d);border-color:var(--blue);color:var(--blue);font-weight:600;}
.u-pill-green-active{background:var(--green-d);border-color:var(--green);color:var(--green);font-weight:600;}
.u-row-sb-mb11-wrap{display:flex;align-items:center;justify-content:space-between;margin-bottom:11px;flex-wrap:wrap;}
.u-card-shell-16{background:var(--bg2);border:1px solid var(--b);border-radius:var(--rl);padding:16px;margin-bottom:12px;}
.u-card-shell-16-row{background:var(--bg2);border:1px solid var(--b);border-radius:var(--rl);padding:16px;margin-bottom:13px;display:flex;align-items:center;gap:13px;}
.u-card-shell-12-mb12{background:var(--bg2);border:1px solid var(--b);border-radius:10px;padding:12px;margin-bottom:12px;}
.u-grid-220-9-mb13{display:grid;grid-template-columns:repeat(auto-fill,minmax(220px,1fr));gap:9px;margin-bottom:13px;}
.u-icon-40-blue{width:40px;height:40px;border-radius:8px;background:var(--blue-d);border:1px solid var(--blue);display:flex;align-items:center;justify-content:center;font-size:20px;color:var(--blue);}
.u-dropzone-12-t2{border:2px dashed var(--b2);border-radius:var(--rl);padding:18px;text-align:center;cursor:pointer;font-size:12px;color:var(--tx2);}
.u-row-14{display:flex;gap:14px;align-items:center;}
/* [CSP-PHASE-3 BATCH 20 — 2026-05-15 core.js dashboard widgets] */
/* Heatmap cells (expiry calendar) */
.u-heatmap-empty{width:14px;height:14px;background:var(--bg4);border-radius:3px;}
.u-heatmap-amber{width:14px;height:14px;background:rgba(245,158,11,0.6);border-radius:3px;}
.u-heatmap-red{width:14px;height:14px;background:rgba(239,68,68,0.7);border-radius:3px;}
.u-heatmap-green{width:14px;height:14px;background:rgba(16,185,129,0.5);border-radius:3px;}
.u-icon-16-c{width:16px;height:16px;border-radius:3px;margin:auto;display:flex;align-items:center;justify-content:center;font-size:9px;}
.u-chip-10-2{width:10px;height:10px;border-radius:2px;flex-shrink:0;}
/* Chart container */
.u-chart-100-110{width:100%;height:110px;}
.u-trans-4{transition:all 0.4s;}
/* Bar labels */
.u-bar-value{position:absolute;right:8px;top:2px;font-size:10px;color:var(--tx1);font-weight:600;text-shadow:0 0 3px var(--bg3);}
.u-bar-track-8{height:8px;background:var(--bg4);border-radius:2px;overflow:hidden;}
/* Section headers (priority / module breakdown) */
.u-sec-leave{padding:8px 12px 4px;background:var(--bg3);border-bottom:2px solid var(--amber);}
.u-sec-critical{padding:7px 12px;background:var(--red-d);border-bottom:2px solid var(--red);}
.u-sec-warning{padding:7px 12px;background:var(--bg3);border-bottom:2px solid var(--amber);}
.u-sec-default{padding:7px 12px;background:var(--bg3);border-bottom:1px solid var(--b);}
/* Layout / utilities */
.u-mla{margin-left:auto;}
.u-min-w-700{min-width:700px;}
.u-p8-11-tac{padding:8px 11px;text-align:center;}
.u-row-tag-5-mt4{margin-top:4px;display:flex;gap:5px;flex-wrap:wrap;}
.u-cap-t2-f1{text-transform:capitalize;color:var(--tx2);flex:1;}
/* Chips / badges */
.u-chip-fwb-9-2-6{font-size:9px;padding:2px 6px;border-radius:3px;font-weight:600;}
.u-chip-9-2-6{font-size:9px;padding:2px 6px;border-radius:3px;}
.u-mod-chip-75{font-size:9px;background:var(--bg4);color:var(--tx3);padding:2px 6px;border-radius:3px;width:75px;text-align:center;flex-shrink:0;}
.u-pri-badge{font-size:8px;padding:2px 5px;border-radius:3px;color:#fff;font-weight:600;}
/* Section labels */
.u-sect-07em-fs9{font-size:9px;color:var(--tx3);text-transform:uppercase;letter-spacing:.07em;}
.u-fs9-t3-mw28-tar{font-size:9px;color:var(--tx3);min-width:28px;text-align:right;}
.u-fs9-t3-mb2{font-size:9px;color:var(--tx3);margin-bottom:2px;}
/* Headings */
.u-h22-fw7-t1{font-size:22px;font-weight:700;color:var(--tx1);}
.u-h18-fw6-blue{font-size:18px;font-weight:600;color:var(--blue);}
.u-fs14-fw7{font-size:14px;font-weight:700;}
.u-label-blue-70{font-size:11px;font-weight:600;width:70px;color:var(--blue);}
.u-truncate-32-fs11{font-size:11px;color:var(--tx1);margin-bottom:6px;line-height:1.3;max-height:32px;overflow:hidden;}
.u-fs10-fw7-t3{font-size:10px;font-weight:700;color:var(--tx3);}
.u-fs10-fw7-red{font-size:10px;font-weight:700;color:var(--red);}
.u-fs10-fw7-amber{font-size:10px;font-weight:700;color:var(--amber);}
.u-fs10-fw7-amber-mb5{font-size:10px;font-weight:700;color:var(--amber);margin-bottom:5px;}
.u-fs10-fw6{font-size:10px;font-weight:600;}
/* [CSP-PHASE-3 BATCH 21 — 2026-05-15 round 6, deeper core.js] */
.u-row-7-0-bb{display:flex;align-items:center;gap:10px;padding:7px 0;border-bottom:1px solid var(--b);}
.u-row-8-bdt-p7-0{display:flex;align-items:center;gap:8px;padding:7px 0;border-top:1px solid var(--b);}
.u-fx1-fs12-tx{flex:1;font-size:12px;color:var(--tx);}
.u-row-alerts-tb{display:flex;gap:8px;padding:10px 12px;border-bottom:1px solid var(--b);flex-wrap:wrap;align-items:center;}
.u-pill-amber{background:var(--amber-d);border-color:var(--amber);color:var(--amber);font-size:9px;}
.u-pill-green{background:var(--green-d);border-color:var(--green);color:var(--green);font-size:9px;}
.u-card-160{border-width:1px;border-style:solid;border-radius:var(--r);padding:10px 12px;min-width:160px;flex-shrink:0;}
.u-card-4-c{border:1px solid var(--b);border-radius:4px;padding:8px 4px;text-align:center;cursor:default;}
.u-row-8-fs11{display:flex;align-items:center;gap:8px;font-size:11px;}
.u-row-8-mt6-fs10-t3{display:flex;align-items:center;gap:8px;margin-top:6px;font-size:10px;color:var(--tx3);}
.u-row-start-9-mb10{display:flex;align-items:flex-start;gap:9px;margin-bottom:10px;}
.u-col-3-stretch{display:flex;flex-direction:column;gap:3px;align-items:stretch;flex-shrink:0;}
.u-row-sb-pt6-bdt{display:flex;justify-content:space-between;align-items:center;padding-top:6px;border-top:1px solid var(--b);}
.u-row-sb-fs11-mb3{display:flex;justify-content:space-between;font-size:11px;margin-bottom:3px;}
.u-row-sb-fs9-t3-mt4{display:flex;justify-content:space-between;font-size:9px;color:var(--tx3);margin-top:4px;}
.u-row-sb-fs9-t3-mt8{display:flex;justify-content:space-between;font-size:9px;color:var(--tx3);margin-top:8px;}
.u-col-6-f1{flex:1;display:flex;flex-direction:column;gap:6px;}
.u-bar-track-18{flex:1;height:18px;background:var(--bg4);border-radius:3px;overflow:hidden;position:relative;}
.u-sect-07em-fs10{font-size:10px;color:var(--tx3);text-transform:uppercase;letter-spacing:.07em;}
/* [CSP-PHASE-3 BATCH 22 — 2026-05-15 JS-side refactors for dynamic interpolations] */
.u-row-10-12-bb{display:flex;align-items:center;gap:10px;padding:10px 12px;border-bottom:1px solid var(--b);}
.u-op-5{opacity:0.5;}
.u-op-6{opacity:0.6;}
.u-bar-fill-blue-teal{height:100%;background:linear-gradient(90deg,var(--blue) 0%,var(--teal) 100%);transition:width 0.4s;}
.u-bar-fill-transition{height:100%;transition:width 0.4s;}
/* Avatar background palette (cycled by index via aCls(i)) */
.u-av-0{background:#162050;color:#4d8aff;}
.u-av-1{background:#00341f;color:#00d180;}
.u-av-2{background:#3d2800;color:#f5a623;}
.u-av-3{background:#1e1040;color:#9b6dff;}
.u-av-4{background:#3d0f0f;color:#ff4d4d;}
.u-av-5{background:#003d36;color:#00c9b1;}
/* Avatar size variants */
.u-av-42{width:42px;height:42px;font-size:14px;flex-shrink:0;}
.u-av-32{width:32px;height:32px;font-size:11px;flex-shrink:0;}
.u-av-30{width:30px;height:30px;font-size:10px;}
.u-av-28{width:28px;height:28px;font-size:10px;}
/* [CSP-PHASE-3 BATCH 23 — 2026-05-15 scatter sweep across 14 modules] */
.u-row-sb-mb11-wrap-8{display:flex;align-items:center;justify-content:space-between;margin-bottom:11px;flex-wrap:wrap;gap:8px;}
.u-msg-success-hidden-13{display:none;margin-top:11px;background:var(--green-d);border:1px solid var(--green);border-radius:var(--rl);padding:13px 15px;}
.u-tabs-bar-wrap{display:flex;gap:4px;padding:10px 14px;background:var(--bg2);border-bottom:1px solid var(--b);flex-wrap:wrap;}
.u-icon-40-mono{width:40px;height:40px;border-radius:8px;background:var(--blue-d);border:1px solid var(--blue);display:flex;align-items:center;justify-content:center;font-family:'IBM Plex Mono',monospace;font-size:11px;font-weight:500;color:var(--blue);flex-shrink:0;}
.u-empty-20-t3{text-align:center;color:var(--tx3);padding:20px;}
.u-tac-t3{text-align:center;color:var(--tx3);}
.u-square-70-rel{position:relative;width:70px;height:70px;flex-shrink:0;}
.u-square-170-rel{position:relative;width:170px;height:170px;flex-shrink:0;}
.u-fs10-t3-mb4-mh14{font-size:10px;color:var(--tx3);margin-bottom:4px;min-height:14px;}
.u-pad-0-bg3{padding:0;background:var(--bg3);}
.u-dashed-t3{border-style:dashed;color:var(--tx3);}
.u-fs15-op4{font-size:15px;opacity:.4;}
.u-fs12-fw5-mt3{font-size:12px;font-weight:500;margin-top:3px;}
.u-fs17-fwb-mt7{font-size:17px;font-weight:600;margin-top:7px;}
.u-card-bd-fs11{border-width:1px;border-style:solid;border-radius:var(--r);padding:8px 12px;margin-bottom:10px;font-size:11px;}
.u-pad-20-24{padding:20px 24px;}
.u-grid-3-24{display:grid;grid-template-columns:auto 1fr auto;gap:24px;align-items:center;}
.u-empty-40-t3-full{text-align:center;padding:40px;color:var(--tx3);grid-column:1/-1;}
.u-fs48-mb12{font-size:48px;margin-bottom:12px;}
.u-fs14-mb6{font-size:14px;margin-bottom:6px;}
.u-row-start-10-mb10{display:flex;align-items:flex-start;gap:10px;margin-bottom:10px;}
.u-fs32-lh1{font-size:32px;line-height:1;}
.u-f1-mw380{flex:1;max-width:380px;}
.u-w90{width:90px;}
.u-tac-fs16{text-align:center;font-size:16px;}
.u-banner-amber-tint{padding:14px;margin-bottom:11px;background:rgba(255,167,38,0.1);border:1px solid var(--amber);}
.u-row-12-ai{display:flex;gap:12px;align-items:center;}
.u-grid-120-fs12{display:grid;grid-template-columns:120px 1fr;gap:8px;font-size:12px;}
.u-fs9-tb-mt1{font-size:9px;color:var(--blue);margin-top:1px;}
.u-grid-2c-4-fs10{display:grid;grid-template-columns:1fr 1fr;gap:4px;font-size:10px;}
.u-fs10-t3-mt6-bdt-pt5{font-size:10px;color:var(--tx3);margin-top:6px;border-top:1px solid var(--b);padding-top:5px;}
.u-square-48-fs16{width:48px;height:48px;font-size:16px;}
/* [CSP-PHASE-3 BATCH 24 — 2026-05-15 final scatter pass] */
.u-row-5-ai{display:flex;align-items:center;gap:5px;}
.u-fs9-blue-trans{font-size:9px;color:var(--blue);transition:transform .2s;}
.u-w12{width:12px;}
.u-p12-20-fs11-t3{padding:12px 20px;font-size:11px;color:var(--tx3);}
.u-mono-cell-t3{padding:6px 12px;font-size:10px;color:var(--tx3);font-family:'IBM Plex Mono',monospace;}
.u-mono-cell-blue{padding:6px 12px;font-size:11px;font-family:'IBM Plex Mono',monospace;color:var(--blue);}
.u-p6-12-fs11-fwb{padding:6px 12px;font-size:11px;font-weight:600;}
.u-fs18-fw7{font-size:18px;font-weight:700;}
.u-fs10-tb-mt4{font-size:10px;color:var(--blue);margin-top:4px;}
.u-grid-6c-4{display:grid;grid-template-columns:repeat(6,1fr);gap:4px;}
.u-heat-cell-w{padding:6px 4px;color:#fff;border-radius:3px;text-align:center;}
.u-flex-scroll-x{display:flex;flex-wrap:nowrap;overflow-x:auto;gap:4px;scrollbar-width:thin;padding-bottom:2px;}
.u-fxx-0-nowrap{flex:0 0 auto;white-space:nowrap;}
.u-gauge-overlay{position:absolute;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center;}
.u-fs40-fw7-lh1{font-size:40px;font-weight:700;line-height:1;}
.u-gauge-label{font-size:10px;color:var(--tx3);text-transform:uppercase;letter-spacing:1.2px;margin-top:4px;}
.u-fs13-fw7-mb2{font-size:13px;font-weight:700;margin-bottom:2px;}
.u-fs12-fw6-lh13{font-size:12px;font-weight:600;line-height:1.3;}
.u-fs11-t2-mh-lh14{font-size:11px;color:var(--tx2);margin:8px 0;line-height:1.4;}
.u-md-h3{margin:8px 0 4px;font-size:12px;font-weight:600;}
.u-md-h2{margin:10px 0 6px;font-size:13px;font-weight:600;}
.u-md-h1{margin:12px 0 8px;font-size:14px;font-weight:700;}
.u-banner-amber-fs12{background:var(--amber-d);border:1px solid var(--amber);border-radius:var(--rl);padding:11px 13px;font-size:12px;color:var(--tx2);}
.u-row-sb-6-0-bb{display:flex;justify-content:space-between;align-items:center;padding:6px 0;border-bottom:1px solid var(--b);font-size:11px;}
.u-dot-10{width:10px;height:10px;border-radius:50%;display:inline-block;}
.u-f1-mw460{flex:1;max-width:460px;}
.u-card-bg4-fs11{margin-top:14px;padding:10px;background:var(--bg4);border-radius:var(--r);font-size:11px;}
.u-fs10-tg-mt6{margin-top:6px;font-size:10px;color:var(--green);}
.u-fs10-tg-mt4{margin-top:4px;font-size:10px;color:var(--green);}
.u-fs10-t3-mt4{margin-top:4px;font-size:10px;color:var(--tx3);}
.u-fs10-tb-mt4{margin-top:4px;font-size:10px;color:var(--blue);}
/* [CSP-PHASE-3 BATCH 25 — 2026-05-16 deep template-literal sites] */
.u-fs10-fw7{font-size:10px;font-weight:700;}
.u-audit-row{padding:8px 0;border-bottom:1px solid var(--b);font-size:11px;cursor:pointer;}
.u-row-sb-mb2{display:flex;justify-content:space-between;align-items:center;margin-bottom:2px;}
.u-t2-mb2{color:var(--tx2);margin-bottom:2px;}
.u-mh200{min-height:200px;}
.u-pill-blue-fwb-soft{background:var(--blue-d);border-color:var(--blue);color:var(--blue);}
.u-bdl-3-blue{border-left:3px solid var(--blue);}
.u-bdl-3-tr{border-left:3px solid transparent;}
.u-lots-count{font-size:9px;background:var(--blue-d);color:var(--blue);padding:1px 4px;border-radius:3px;}
.u-mono-fs10-t3{font-family:'IBM Plex Mono',monospace;font-size:10px;color:var(--tx3);}
.u-grid-2c-4-fs10-t3-my8{display:grid;grid-template-columns:1fr 1fr;gap:4px;font-size:10px;color:var(--tx3);margin:8px 0;}
.u-p-mv4{margin:4px 0;}
.u-op-badge{display:inline-flex;align-items:center;gap:4px;padding:2px 8px;color:#fff;border-radius:10px;font-size:10px;font-weight:700;letter-spacing:.05em;}
.u-fs19-fwb{font-size:19px;font-weight:600;}
.u-fs19-fwb-tg{font-size:19px;font-weight:600;color:var(--green);}
.u-fs19-fwb-tb{font-size:19px;font-weight:600;color:var(--blue);}
.u-fs19-fwb-ta{font-size:19px;font-weight:600;color:var(--amber);}
.u-tlb-wide-table{min-width:980px;width:100%;border-collapse:collapse;font-size:10px;table-layout:fixed;}
.u-tipo-bdg{font-size:9px;background:var(--bg4);padding:1px 5px;border-radius:3px;white-space:nowrap;}
.u-rot-row-bg2{border-left:3px solid var(--teal);background:var(--bg2);}
.u-bdg-teal-d{background:var(--teal-d,#0d3333);color:var(--teal);}
/* [CSP-PHASE-3 BATCH 28] aircraft-status badge sizes + dashboard cells */
.u-op-badge-md{display:inline-flex;align-items:center;gap:6px;padding:4px 10px;color:#fff;border-radius:var(--r);font-size:11px;font-weight:700;letter-spacing:.05em;}
.u-op-badge-lg{display:inline-flex;align-items:center;gap:10px;padding:10px 16px;border-width:2px;border-style:solid;border-radius:var(--r);font-size:13px;}
.u-fw7-ls{font-weight:700;letter-spacing:.05em;}
.u-sect-07em-mb6{font-size:11px;color:var(--tx3);text-transform:uppercase;letter-spacing:.07em;margin-bottom:6px;}
.u-fs11-t3-pt6{font-size:11px;color:var(--tx3);padding-top:6px;}
.u-amber-tint-bdl{background:rgba(255,167,38,0.1);border-left:3px solid var(--amber);padding:10px;margin-top:14px;font-size:11px;border-radius:0 var(--r) var(--r) 0;}
.u-fwb-tg{font-weight:600;color:var(--green);}
.u-fwb-tr{font-weight:600;color:var(--red);}
.u-fwb-t3{font-weight:600;color:var(--tx3);}
.u-row-sb-pad4{display:flex;justify-content:space-between;padding:4px 0;}
.u-amp-cell{padding:9px 10px;font-size:12px;font-weight:500;color:var(--tx);}
.u-amp-cell-c-blue{padding:9px 10px;text-align:center;font-size:11px;color:var(--blue);}
.u-amp-cell-t2{padding:9px 10px;font-size:11px;color:var(--tx2);}
.u-amp-cell-c{padding:9px 10px;text-align:center;}
.u-gtc1-p12{grid-template-columns:1fr;padding:12px;}
.u-p12-fs11-t3{padding:12px;font-size:11px;color:var(--tx3);}
/* [CSP-PHASE-3 BATCH 29] cae + sms + settings + forms — long-tail cleanup */
.u-empty-60-red{text-align:center;padding:60px;color:var(--red);}
.u-p12-fs12-t2{padding:12px;font-size:12px;color:var(--tx2);}
.u-p0-12-12{padding:0 12px 12px;}
.u-tlb-mode-card{border:1px solid;border-radius:var(--r);padding:12px;margin-bottom:10px;}
.u-tlb-mode-title{font-size:14px;font-weight:600;margin-bottom:4px;}
.u-fs10-t3-mt8-bdt-pt8{font-size:10px;color:var(--tx3);margin-top:8px;border-top:1px solid var(--b);padding-top:8px;}
.u-p14-fs12{padding:14px;font-size:12px;}
.u-audit-row-fs12{padding:8px 0;border-bottom:1px solid var(--b);font-size:12px;}
.u-row-cae-effective{background:rgba(76,175,80,0.05);}
.u-amber-tint-card{border:1px solid var(--amber);background:rgba(255,167,38,0.05);border-radius:var(--r);padding:14px;margin-bottom:10px;}
.u-fs11-t2-mb10{font-size:11px;color:var(--tx2);margin-bottom:10px;}
.u-cae-success{padding:30px;text-align:center;color:var(--green);margin-bottom:11px;}
.u-fs40-mb8{font-size:40px;margin-bottom:8px;}
.u-row-12-mt10-fs11{display:flex;gap:12px;margin-top:10px;font-size:11px;}
.u-card-bg4-12{padding:10px;background:var(--bg4);border-radius:var(--r);font-size:12px;}
.u-fs20-fwb-mb4{font-size:20px;font-weight:600;margin-bottom:4px;}
.u-t3-fs12-lh17{color:var(--tx3);font-size:12px;line-height:1.7;}
.u-row-14-mt6-wrap{display:inline-flex;gap:14px;margin-top:6px;flex-wrap:wrap;}
.u-fs10-t3-mt10-mono{font-size:10px;color:var(--tx3);margin-top:10px;font-family:monospace;}
.u-spi-card-r{background:#ff4d4d22;border:1px solid #ff4d4d;padding:14px 18px;border-radius:var(--r);min-width:200px;max-width:240px;}
.u-spi-card-g{background:#00d18022;border:1px solid #00d180;padding:14px 18px;border-radius:var(--r);min-width:180px;max-width:220px;}
.u-fs13-fwb-r-mb4{font-size:13px;font-weight:600;color:#ff4d4d;margin-bottom:4px;}
.u-fs13-fwb-g-mb4{font-size:13px;font-weight:600;color:#00d180;margin-bottom:4px;}
.u-grid-240-10{display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));gap:10px;}
.u-bg-bg3-fwb{background:var(--bg3);font-weight:600;}
.u-spi-circle-trans{transition:stroke-dashoffset 0.8s ease;}
.u-c2-2-1{grid-template-columns:2fr 1fr;gap:14px;}
.u-c2-1-1-14{grid-template-columns:1fr 1fr;gap:14px;}
/* [CSP-PHASE-3 BATCH 30] hard-flip prep — last 7 active sites */
.u-grid-130-8-mb14{display:grid;grid-template-columns:repeat(auto-fit,minmax(130px,1fr));gap:8px;margin-bottom:14px;}
.u-bar-fill-bt{height:100%;background:linear-gradient(90deg,var(--blue) 0%,var(--teal) 100%);}
.u-tlb-cell-id{padding:8px 10px;font-size:11px;font-weight:500;}
.u-tlb-cell-fs11{padding:8px 10px;font-size:11px;}
.u-tlb-cell-tac-10-t3{padding:8px 10px;text-align:center;font-size:10px;color:var(--tx3);}
.u-tlb-cell-actions{padding:8px 10px;text-align:center;white-space:nowrap;}
.u-mr3{margin-right:3px;}
.u-btn-red-soft-bd{background:var(--red-d);color:var(--red);border-color:var(--red);}
.u-btn-green-soft-bd{background:var(--green-d);color:var(--green);border-color:var(--green);}
.u-btn-blue-soft-bd{background:var(--blue-d);color:var(--blue);border-color:var(--blue);}
.u-tlb-cell-row{padding:3px;text-align:center;color:var(--tx3);}
.u-tlb-mini-btn{padding:2px 6px;font-size:10px;}
.u-amp-form-grid{grid-template-columns:1fr 1fr;gap:8px 14px;}
.u-amp-task-scroll{max-height:280px;overflow-y:auto;}
.u-amp-task-row{display:flex;align-items:center;gap:8px;padding:6px 4px;border-bottom:1px solid var(--b);font-size:11px;}
.u-tb-mw90{color:var(--blue);min-width:90px;}
.u-ellipsis-t2{flex:1;color:var(--tx2);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.u-amp-ac-chip{display:inline-flex;align-items:center;gap:4px;background:var(--bg3);border:1px solid var(--b);border-radius:var(--r);padding:3px 4px 3px 8px;font-size:10px;}
.u-amp-x-btn{padding:0 5px;font-size:11px;background:transparent;border:none;color:var(--red);}
.u-amp-rm-btn{padding:2px 6px;font-size:11px;background:var(--red-d);color:var(--red);border-color:var(--red);}
.u-w25{width:25%;}.u-w20{width:20%;}.u-wp12{width:12%;}
/* [CSP-PHASE-3 BATCH 31] sms dash cards + compliance hero — final 2 sites */
.u-dash-card{padding:14px 16px;}
.u-cur-h{cursor:help;}
.u-row-sb-start-mb8{display:flex;justify-content:space-between;align-items:flex-start;margin-bottom:8px;}
.u-fs16-lh1{font-size:16px;line-height:1;}
.u-dot-8{display:inline-block;width:8px;height:8px;border-radius:50%;}
.u-metric-26{font-size:26px;font-weight:700;font-variant-numeric:tabular-nums;line-height:1;}
.u-fs13-fwb-mb2{font-size:13px;font-weight:600;margin-bottom:2px;}
.u-progress-bar{height:4px;background:#2a2f3a;border-radius:2px;overflow:hidden;margin-bottom:6px;}
.u-progress-fill{height:100%;transition:width 0.6s ease;}
/* compliance hero (rCompliance full page) */
.u-comp-hero{margin-bottom:11px;padding:24px;text-align:center;}
.u-comp-hero-row{display:flex;align-items:center;justify-content:center;gap:40px;flex-wrap:wrap;}
.u-comp-ring{position:relative;width:180px;height:180px;}
.u-comp-ring-trans{transition:stroke-dasharray 1s ease-out;}
.u-comp-score-big{font-size:44px;font-weight:700;}
.u-comp-sect-label{font-size:11px;color:var(--tx3);text-transform:uppercase;letter-spacing:.1em;}
.u-comp-stats{text-align:left;max-width:340px;}
.u-comp-card-green{background:rgba(76,175,80,0.15);border:1px solid var(--green);color:var(--green);padding:12px 16px;border-radius:var(--r);margin-bottom:10px;}
.u-comp-card-red{background:rgba(244,67,54,0.1);border:1px solid var(--red);color:var(--red);padding:12px 16px;border-radius:var(--r);margin-bottom:10px;}
.u-comp-card-amber{background:rgba(255,167,38,0.1);border:1px solid var(--amber);color:var(--amber);padding:12px 16px;border-radius:var(--r);margin-bottom:10px;}
.u-comp-cat-head{display:flex;justify-content:space-between;align-items:flex-start;margin-bottom:10px;}
.u-comp-cat-icon{font-size:22px;margin-bottom:4px;}
.u-comp-cat-score{font-size:28px;font-weight:700;line-height:1;}
.u-comp-bar-track{height:6px;background:var(--bg4);border-radius:3px;overflow:hidden;}
.u-comp-bar-fill{height:100%;transition:width 0.8s;}
.u-fs10-t3-mt6{font-size:10px;color:var(--tx3);margin-top:6px;}
.u-fs10-tg-mt6-2{font-size:10px;color:var(--green);margin-top:6px;}
.u-comp-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(260px,1fr));gap:10px;margin-bottom:11px;}
.u-comp-ok-card{font-size:48px;margin-bottom:10px;}
.u-fs16-fwb{font-size:16px;font-weight:600;}
.u-fs12-t3-mt4{font-size:12px;color:var(--tx3);margin-top:4px;}
.u-comp-issue-card{padding:10px 12px;margin-bottom:6px;border-radius:0 3px 3px 0;}
.u-fs10-mt4{font-size:10px;margin-top:4px;}
.u-fxx-0-ml10{flex-shrink:0;margin-left:10px;}
.u-empty-10-t3{text-align:center;padding:10px;color:var(--tx3);font-size:11px;}
/* [CSP-PHASE-3 BATCH 32] sms helpers — donut + bars + recent activity */
.u-empty-30-t3{color:var(--tx3);padding:30px;}
.u-donut-wrap{display:flex;flex-direction:column;align-items:center;gap:14px;}
.u-donut-svg{width:160px;height:160px;}
.u-w100-grid6{width:100%;display:grid;gap:6px;}
.u-legend-row-12{display:flex;align-items:center;gap:8px;font-size:12px;}
.u-legend-chip{display:inline-block;width:12px;height:12px;border-radius:3px;}
.u-legend-pct{color:var(--tx3);margin-left:auto;}
.u-sev-row{display:flex;align-items:center;gap:10px;}
.u-sev-label{min-width:95px;font-size:12px;color:var(--tx2);}
.u-sev-bar-track{flex:1;height:16px;background:var(--bg3);border-radius:3px;overflow:hidden;}
.u-sev-bar-fill{height:100%;transition:width 0.3s;}
.u-sev-count{min-width:30px;text-align:right;font-size:13px;font-weight:600;color:var(--tx1);}
.u-empty-10-tac{color:var(--tx3);text-align:center;padding:10px;}
.u-act-row{display:flex;align-items:center;gap:10px;padding:8px;background:var(--bg3);border-radius:var(--r);cursor:pointer;}
.u-empty-pad-20-tac{color:var(--tx3);text-align:center;padding:20px;}
.u-svg-w100-mx600{width:100%;max-width:600px;height:auto;}
.u-act-code{font-family:monospace;font-size:12px;font-weight:600;}
.u-act-desc{font-size:11px;color:var(--tx3);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
/* [CSP-PHASE-3 BATCH 35] rComp AMP table cells (post hard-flip) */
.u-amp-ref-cell{padding:5px 8px;font-size:10px;font-weight:600;color:var(--blue);white-space:nowrap;}
.u-amp-desc-cell{padding:5px 8px;font-size:11px;font-weight:500;min-width:160px;}
.u-amp-reg-cell{padding:5px 8px;font-size:10px;color:var(--blue);}
/* [CSP-PHASE-3 BATCH 36 — 2026-05-16 dormant-path coverage] */
.u-p6-12{padding:6px 12px;}
.u-p8-16-4{padding:8px 16px 4px;}
.u-p7-13-bg3{padding:7px 13px;background:var(--bg3);}
.u-empty-16-t3{text-align:center;padding:16px;color:var(--tx3);}
.u-tac-mt4{text-align:center;margin-top:4px;}
.u-w46-tac-fs11{width:46px;text-align:center;padding:2px;font-size:11px;}
.u-mw180{max-width:180px;}
.u-mw200{max-width:200px;}
.u-row-10-12-bb-8{padding:10px 12px;border-bottom:1px solid var(--b);display:flex;align-items:center;gap:8px;}
.u-empty-grid-red{grid-column:1/-1;text-align:center;padding:40px;color:var(--red);font-size:12px;}
.u-tab-toolbar{padding:8px 13px;background:var(--bg3);border-bottom:1px solid var(--b);display:flex;align-items:center;justify-content:space-between;}
.u-nowrap{white-space:nowrap;}
/* [CSP-PHASE-3 BATCH 37] deep-snap round 2 — sub-tab dormant paths */
.u-row-wrap-8-mb14{display:flex;flex-wrap:wrap;gap:8px;margin-bottom:14px;}
.u-fw5-mw200-fs12{font-weight:500;max-width:200px;font-size:12px;}
.u-fs10-tg-help{font-size:10px;color:var(--green);cursor:help;}
.u-chip-mono-bg4{font-family:'IBM Plex Mono',monospace;font-size:10px;background:var(--bg4);color:var(--tx3);padding:1px 5px;border-radius:3px;}
.u-toolbar-row{display:flex;align-items:center;justify-content:space-between;margin-bottom:14px;flex-wrap:wrap;gap:8px;}
.u-fs11-t3-ml9{font-size:11px;color:var(--tx3);margin-left:9px;}
.u-sect-08em-bb{font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.08em;margin-bottom:7px;padding-bottom:4px;border-bottom:1px solid var(--b);}
.u-fs11-tb-w100-fxx0{font-size:11px;color:var(--blue);width:100px;flex-shrink:0;}
.u-fs12-t2-mb12{font-size:12px;color:var(--tx2);margin-bottom:12px;}
.u-info-row-bg3{background:var(--bg3);border:1px solid var(--b);border-radius:var(--rl);padding:10px;display:flex;align-items:center;justify-content:space-between;gap:8px;}
.u-list-item-bg2{background:var(--bg2);border:1px solid var(--b);border-radius:var(--rl);padding:10px 13px;display:flex;align-items:center;gap:11px;margin-bottom:7px;}
.u-mw250{max-width:250px;}
.u-chip-fs10-mt5{font-size:10px;margin-top:5px;padding:4px 8px;border-radius:3px;}
.u-logbook-row{display:grid;grid-template-columns:40px 1fr 80px 80px 100px;gap:10px;align-items:center;padding:10px;border-bottom:1px solid var(--b);}
.u-modal-body-280-r0{max-height:calc(100vh - 280px);overflow-y:auto;border-radius:0;}
.u-card-checked-bd{background:var(--bg2);border:1px solid var(--b);border-radius:var(--rl);padding:11px 13px;margin-bottom:10px;}
.u-card-checked-bd-p{background:var(--bg2);border:1px solid var(--purple);border-radius:var(--rl);padding:11px 13px;margin-bottom:10px;}
.u-row-7-12-bg-best{display:flex;align-items:center;gap:8px;padding:7px 12px;border-bottom:1px solid var(--b);}
.u-row-7-12-bg-best.u-best{background:var(--green-d);}
.u-row-overdue-tint{background:rgba(244,67,54,0.05);}
.u-bar-fill-blue{height:100%;background:var(--blue);}
.u-bar-fill-green{height:100%;background:var(--green);}
.u-bar-fill-red{height:100%;background:var(--red);}
.u-bar-fill-amber{height:100%;background:var(--amber);}
.u-fs11-tg{font-size:11px;color:var(--green);}
.u-fs11-tr{font-size:11px;color:var(--red);}
.u-stock-mv-issue{padding:8px 11px;font-family:'IBM Plex Mono',monospace;font-size:12px;font-weight:600;color:var(--amber);}
.u-stock-mv-receive{padding:8px 11px;font-family:'IBM Plex Mono',monospace;font-size:12px;font-weight:600;color:var(--green);}
/* [CSP-PHASE-3 BATCH 38] deep-snap round 3 */
.u-row-7{display:flex;align-items:center;gap:7px;}
.u-pill-green-soft-bd-w{background:var(--green-d);color:var(--green);border-color:var(--green);width:auto;padding:8px 14px;}
.u-fs9-t3-tt-none{font-size:9px;color:var(--tx3);text-transform:none;font-weight:400;}
.u-cell-pad-tac-10-t3{padding:6px 10px;text-align:center;font-size:10px;color:var(--tx3);}
.u-chip-bg3{background:var(--bg3);padding:2px 6px;border-radius:4px;}
.u-row-bg3-fs11{background:var(--bg3);border-radius:var(--r);padding:7px 9px;margin-bottom:4px;font-size:11px;}
.u-warn-chip{font-size:10px;margin-top:5px;padding:4px 8px;background:var(--bg3);border-left:3px solid var(--tx3);border-radius:3px;color:var(--tx3);}
.u-qa-row{display:grid;grid-template-columns:40px 120px 1fr 100px 120px;gap:10px;align-items:center;padding:8px;border-bottom:1px solid var(--b);}
.u-fwb-fs11{font-weight:600;font-size:11px;}
.u-square-36-fs12{width:36px;height:36px;font-size:12px;}
.u-drop-zone-mh130{border:2px dashed var(--b2);display:flex;flex-direction:column;align-items:center;justify-content:center;gap:5px;min-height:130px;text-align:center;cursor:pointer;}
.u-row-3-ai{display:flex;gap:3px;align-items:center;}
.u-fs10-t3-self-center{font-size:10px;color:var(--tx3);align-self:center;}
.u-fs10-t3-ml10{margin-left:10px;font-size:10px;color:var(--tx3);}
.u-fs11-tg-ml7{font-size:11px;color:var(--green);margin-left:7px;}
.u-grid-1c-10-mb14{display:grid;grid-template-columns:1fr;gap:10px;margin-bottom:14px;}
.u-grid-2c-10-mb14{display:grid;grid-template-columns:repeat(2,1fr);gap:10px;margin-bottom:14px;}
.u-grid-1c-10{display:grid;grid-template-columns:1fr;gap:10px;}
.u-grid-2c-10{display:grid;grid-template-columns:repeat(2,1fr);gap:10px;}
.u-fs24-op25-tt{font-size:24px;opacity:.25;color:var(--teal);}
.u-fs11-tb-w105-fxx0{font-size:11px;color:var(--blue);width:105px;flex-shrink:0;}
.u-row-7-mt12{margin-top:12px;display:flex;gap:7px;}
/* [CSP-PHASE-3 BATCH 41] deep-snap round 4 */
.u-row-sb-mb2-noalign{display:flex;justify-content:space-between;margin-bottom:2px;}
.u-bar-track-4{flex:1;height:4px;background:var(--bg4);border-radius:2px;overflow:hidden;}
.u-bar-track-4-mw40{flex:1;height:4px;background:var(--bg4);border-radius:2px;overflow:hidden;min-width:40px;}
.u-fs9-t3-mb3{font-size:9px;color:var(--tx3);margin-bottom:3px;}
.u-p6-10-fs10{padding:6px 10px;font-size:10px;}
.u-fs14-fwb-tb{font-size:14px;font-weight:600;color:var(--blue);}
.u-fs10-tg{font-size:10px;color:var(--green);}
.u-row-wrap-1{display:flex;flex-wrap:wrap;gap:1px;margin-top:1px;}
.u-fs13-fwb-mb3{font-size:13px;font-weight:600;margin-bottom:3px;}
.u-red-tint-chip{margin-top:5px;font-size:10px;background:rgba(239,68,68,.15);color:var(--red);border-radius:3px;padding:2px 6px;font-weight:700;}
.u-p5-10-tar-fs10-t3{padding:5px 10px;text-align:right;font-size:10px;color:var(--tx3);}
.u-p5-8-tac{padding:5px 8px;text-align:center;}
.u-p6-10-row-3{padding:6px 10px;display:flex;gap:3px;align-items:center;}
.u-qa-grid-fillable{padding:14px;display:grid;grid-template-columns:repeat(auto-fill,minmax(180px,1fr));gap:10px;}
.u-actlog-toolbar{padding:10px 12px;border-bottom:1px solid var(--b);display:flex;gap:8px;flex-wrap:wrap;align-items:center;background:var(--bg2);position:sticky;top:0;z-index:2;}
/* [CSP-PHASE-3 BATCH 42] deep-snap round 5 */
.u-fs12-t3-trailing{font-size:12px;color:var(--tx3);}
.u-row-sb-ai-mt5{display:flex;justify-content:space-between;align-items:center;margin-top:5px;}
.u-btn-tiny{font-size:9px;padding:2px 5px;}
.u-btn-tiny-del{font-size:9px;padding:2px 5px;margin-left:3px;background:transparent;color:var(--red);border:1px solid var(--red);}
.u-tb-fs13-fwb{color:var(--blue);font-size:13px;font-weight:600;}
.u-f1-fs10-t3{flex:1;font-size:10px;color:var(--tx3);}
.u-amp-subtask{display:flex;align-items:center;gap:8px;padding:5px 5px 5px 25px;border-top:1px solid var(--b);}
.u-btn-del-bd{background:transparent;color:var(--red);border:1px solid var(--red);margin-left:4px;}
/* [CSP-PHASE-3 BATCH 43] camo CAMO documents/engine details aggressive sweep */
.u-doc-info-chip{display:flex;align-items:center;gap:6px;background:var(--b2);border-radius:var(--rl);padding:7px 11px;min-width:120px;}
.u-doc-sect-label{font-size:10px;color:var(--tx3);text-transform:uppercase;font-weight:600;}
.u-doc-sect-val{font-size:12px;font-weight:700;}
.u-doc-alert-red{background:rgba(239,68,68,.12);border:1px solid var(--red);border-radius:var(--rl);padding:8px 12px;font-size:12px;color:var(--red);font-weight:600;margin-bottom:10px;}
.u-doc-alert-amber{background:rgba(245,158,11,.1);border:1px solid var(--amber);border-radius:var(--rl);padding:8px 12px;font-size:12px;color:var(--amber);font-weight:600;margin-bottom:10px;}
.u-amber-tint-chip{margin-top:5px;font-size:10px;background:rgba(245,158,11,.15);color:var(--amber);border-radius:3px;padding:2px 6px;font-weight:600;}
.u-fs10-tt-mt5{margin-top:5px;font-size:10px;color:var(--teal);}
.u-doc-icon{font-size:22px;margin-bottom:6px;}
.u-doc-cat-label{font-size:10px;font-weight:600;text-transform:uppercase;margin-top:2px;}
.u-row-4-mt8{display:flex;gap:4px;margin-top:8px;}
/* [CSP-PHASE-3 BATCH 44] camo aggressive sweep — 20 patterns */
.u-p6-10-fs10-fwb-tb{padding:6px 10px;font-size:10px;font-weight:600;color:var(--blue);}
.u-p5-8-nw{padding:5px 8px;white-space:nowrap;}
.u-p5-8-fs11-fw5{padding:5px 8px;font-size:11px;font-weight:500;}
.u-p2-6-fs10{padding:2px 6px;font-size:10px;}
.u-modal-hdr-wrap{padding:14px 18px;border-bottom:1px solid var(--b);display:flex;align-items:center;gap:10px;flex-wrap:wrap;}
.u-list-divider-row{padding:10px 13px;border-bottom:1px solid var(--b);}
.u-oxa-mb14{overflow-x:auto;margin-bottom:14px;}
.u-img-preview-80{max-width:100%;max-height:80px;display:block;margin:0 auto;}
.u-img-preview-50{max-height:50px;max-width:100%;}
.u-chip-row-6-mt8{margin-top:8px;display:flex;gap:6px;flex-wrap:wrap;}
.u-success-card{margin-top:6px;background:var(--green-d);border:1px solid var(--green);border-radius:var(--rl);padding:10px 12px;}
.u-row-5-mt5{margin-top:5px;display:flex;gap:5px;}
.u-pill-teal-soft-mt2{margin-top:2px;background:var(--teal-d);border-color:var(--teal);color:var(--teal);}
.u-preview-box-mt10{margin-top:10px;padding:8px;background:#fff;border:1px solid var(--b);border-radius:var(--r);text-align:center;}
.u-row-10-mb12{margin-bottom:12px;display:flex;align-items:center;gap:10px;}
.u-h180{height:180px;}
.u-mono-pill-green{font-size:9px;padding:2px 6px;border-radius:3px;background:var(--green-d);color:var(--green);font-family:'IBM Plex Mono',monospace;margin-left:6px;}
.u-mono-pill-gray{font-size:9px;padding:2px 6px;border-radius:3px;background:var(--bg4);color:var(--tx3);font-family:'IBM Plex Mono',monospace;margin-left:6px;}
.u-mono-pill-amber{font-size:9px;padding:2px 6px;border-radius:3px;background:var(--amber-d);color:var(--amber);font-family:'IBM Plex Mono',monospace;margin-left:6px;}
.u-fs9-mw56-tac{font-size:9px;min-width:56px;text-align:center;}
.u-fs9-t3-ml8-mono{font-size:9px;color:var(--tx3);margin-left:8px;font-family:'IBM Plex Mono',monospace;}
.u-fs9-t3-mono{font-size:9px;color:var(--tx3);font-family:'IBM Plex Mono',monospace;}
.u-fs9-c666-tt-ls-mb4{font-size:9px;color:#666;text-transform:uppercase;letter-spacing:.07em;margin-bottom:4px;}
.u-fs12-fwb-t2-mb8-row-8{font-size:12px;font-weight:600;color:var(--tx2);margin-bottom:8px;display:flex;align-items:center;gap:8px;}
.u-fs12-fwb-tg-mb8-row-6{font-size:12px;font-weight:600;color:var(--green);margin-bottom:8px;display:flex;align-items:center;gap:6px;}
.u-fs12-t2-mt2{font-size:12px;color:var(--tx2);margin-top:2px;}
.u-fs12-t{font-size:12px;color:var(--tx);}
.u-fs11-p4-8-w180{font-size:11px;padding:4px 8px;width:180px;}
.u-sect-07em-fs11-row-6{font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.07em;margin-bottom:8px;display:flex;align-items:center;gap:6px;}
/* [CSP-PHASE-3 BATCH 45] camo dynamic interpolations refactor */
.u-bar-fill-100{height:100%;}
.u-cur-default{cursor:default;}
.u-fs10-wbreak{font-size:10px;word-break:break-all;}
.u-fs11-fw5-mb3{font-size:11px;font-weight:500;margin-bottom:3px;}
.u-pill-amber-soft{background:var(--amber-d);border-color:var(--amber);color:var(--amber);}
.u-issue-btn-blue{background:var(--blue-d,rgba(55,138,221,.2));border-color:var(--blue);color:var(--blue);font-size:9px;flex:0 0 auto;}
.u-return-btn-amber{background:var(--amber-d);border-color:var(--amber);color:var(--amber);font-size:9px;flex:0 0 auto;}
.u-fs10-fw-norm-t3{font-size:10px;font-weight:400;color:var(--tx3);}
.u-fs11-tr-fwb{font-size:11px;color:var(--red);font-weight:600;}
.u-sig-box{background:#fff;border:1px solid var(--b);border-radius:var(--r);padding:6px;text-align:center;margin-bottom:8px;}
.u-comp-btn-blue{background:var(--bg2);color:var(--blue);border:1px solid var(--b);}
.u-comp-btn-amber{background:var(--bg2);color:var(--amber);border:1px solid var(--b);}
.u-comp-btn-green{background:var(--bg2);color:var(--green);border:1px solid var(--b);}
.u-amp-link{color:var(--blue);text-decoration:underline;cursor:pointer;}
/* Checkbox indicator pattern (used in AMP group selection) */
.u-amp-cbox{width:15px;height:15px;border-radius:3px;border:1px solid var(--b2);background:var(--bg3);cursor:pointer;display:flex;align-items:center;justify-content:center;font-size:9px;flex-shrink:0;color:#fff;}
.u-amp-cbox-mixed{width:15px;height:15px;border-radius:3px;border:1px solid var(--b2);background:var(--bg4);cursor:pointer;display:flex;align-items:center;justify-content:center;font-size:9px;flex-shrink:0;color:#fff;}
.u-amp-cbox-all{width:15px;height:15px;border-radius:3px;border:1px solid var(--purple);background:var(--purple);cursor:pointer;display:flex;align-items:center;justify-content:center;font-size:9px;flex-shrink:0;color:#fff;}
.u-amp-cbox-sm{width:13px;height:13px;border-radius:2px;border:1px solid var(--b2);background:var(--bg3);cursor:pointer;display:flex;align-items:center;justify-content:center;font-size:8px;flex-shrink:0;color:#fff;}
.u-amp-cbox-sm-on{width:13px;height:13px;border-radius:2px;border:1px solid var(--purple);background:var(--purple);cursor:pointer;display:flex;align-items:center;justify-content:center;font-size:8px;flex-shrink:0;color:#fff;}
/* [CSP-PHASE-3 BATCH 46] stock + quality + hr aggressive sweep */
/* stock.js patterns */
.u-card-bg3-9{background:var(--bg3);border-radius:var(--r);padding:9px;font-size:11px;color:var(--tx2);}
.u-fs10-c666{color:#666;font-size:10px;}
.u-t3-py6{color:var(--tx3);padding:6px 0;}
.u-row-8-mt4-bg3{display:flex;align-items:center;gap:8px;margin-top:4px;padding:6px 8px;background:var(--bg3);border-radius:var(--r);}
.u-row-7-12-bg-row{display:flex;align-items:center;gap:8px;padding:7px 12px;border-bottom:1px solid var(--b);}
.u-row-7-12-bg-best-on{background:var(--green-d);}
.u-row-8-mb4-bg3{display:flex;align-items:center;gap:8px;padding:6px 8px;margin-bottom:4px;background:var(--bg3);border-radius:var(--r);}
.u-row-8-mb4-bg-best-on{background:var(--green-d);}
.u-ellipsis-t2-f1{flex:1;font-size:11px;color:var(--tx2);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.u-mono-tb{font-family:'IBM Plex Mono',monospace;color:var(--blue);}
.u-fs10-green-chip{font-size:10px;background:var(--green-d);color:var(--green);padding:2px 6px;border-radius:3px;}
.u-fs10-tt{font-size:10px;color:var(--teal);}
.u-fs10-t3-mt5-bdt-pt5{font-size:10px;color:var(--tx3);margin-top:5px;border-top:1px solid var(--b);padding-top:5px;}
.u-fs10-t3-mw55-tar{font-size:10px;color:var(--tx3);min-width:55px;text-align:right;}
.u-fs10-t3-ellipsis{font-size:10px;color:var(--tx3);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.u-fs10-p2-6{font-size:10px;padding:2px 6px;}
.u-fs10-p2-6-red{font-size:10px;padding:2px 6px;color:var(--red);border-color:var(--red);}
.u-fs11-tb-mb2{font-size:11px;color:var(--blue);margin-bottom:2px;}
.u-fs11-fw5-tx-ellipsis{font-size:11px;font-weight:500;color:var(--tx);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.u-fs12-tb-ellipsis{font-size:12px;color:var(--blue);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.u-fs12-fw5-best{font-size:12px;font-weight:500;color:var(--green);}
.u-fs12-fw5-tx{font-size:12px;font-weight:500;color:var(--tx);}
.u-fs9-tg-mw38-tar{font-size:9px;color:var(--green);min-width:38px;text-align:right;}
.u-fs9-tr{font-size:9px;color:var(--red);}
.u-fs9-tr-mw38-tar{font-size:9px;color:var(--red);min-width:38px;text-align:right;}
.u-fs9-t3-mt3{font-size:9px;color:var(--tx3);margin-top:3px;}
.u-fs9-t3-sect-08em-mb6{font-size:9px;color:var(--tx3);text-transform:uppercase;letter-spacing:.08em;margin-bottom:6px;}
.u-fwb-tx-mb6{font-weight:600;color:var(--tx);margin-bottom:6px;}
/* quality.js patterns */
.u-fs10-tg-mt4{font-size:10px;color:var(--green);margin-top:4px;}
.u-fs11-tx1{font-size:11px;color:var(--tx1);}
.u-fs12-fwb-tb-mb4{font-size:12px;font-weight:600;color:var(--blue);margin-bottom:4px;}
/* hr.js patterns */
.u-card-bg3-9-scroll{background:var(--bg3);border-radius:var(--r);padding:9px;max-height:200px;overflow-y:auto;}
.u-btn-approve{background:var(--green-d);border:1px solid var(--green);color:var(--green);padding:5px 9px;border-radius:var(--r);font-size:10px;font-weight:600;cursor:pointer;font-family:'IBM Plex Sans',sans-serif;}
.u-btn-reject{background:var(--red-d);border:1px solid var(--red);color:var(--red);padding:5px 9px;border-radius:var(--r);font-size:10px;font-weight:600;cursor:pointer;font-family:'IBM Plex Sans',sans-serif;}
.u-row-8-py6-bb{display:flex;align-items:center;gap:8px;padding:6px 0;border-bottom:1px solid var(--b);}
.u-fs11-t2-p8-11{font-size:11px;color:var(--tx2);padding:8px 11px;}
.u-fs11-t3-p10{font-size:11px;color:var(--tx3);padding:10px;}
.u-fs11-fwb-mb8-t2{font-size:11px;font-weight:600;margin-bottom:8px;color:var(--tx2);}
.u-fs12-fw5-p8-11{font-size:12px;font-weight:500;padding:8px 11px;}
.u-fs15-fw5{font-size:15px;font-weight:500;}
.u-fs8{font-size:8px;}
/* [CSP-PHASE-3 BATCH 47] dynamic interpolations + final scatter */
.u-row-10-pure{display:flex;gap:10px;}
.u-qa-row-overdue{display:grid;grid-template-columns:40px 120px 1fr 100px 120px;gap:10px;align-items:center;padding:8px;border-bottom:1px solid var(--b);background:rgba(244,67,54,0.05);}
.u-area-card{padding:10px;border:1px solid var(--b);border-radius:var(--r);cursor:pointer;}
.u-area-card-done{padding:10px;border:1px solid var(--b);border-radius:var(--r);cursor:pointer;background:rgba(76,175,80,0.08);}
.u-overdue-cell{color:var(--red);font-weight:600;}
.u-sw-mw200{max-width:200px;flex:0 0 200px;}
.u-mla-row-6{margin-left:auto;display:flex;gap:6px;}
.u-best-row{display:flex;align-items:center;gap:8px;padding:7px 12px;border-bottom:1px solid var(--b);background:var(--green-d);}
.u-best-price{font-size:12px;font-weight:500;color:var(--green);}
.u-norm-price{font-size:12px;font-weight:500;color:var(--tx);}
.u-best-row-bg{display:flex;align-items:center;gap:8px;padding:6px 8px;margin-bottom:4px;background:var(--green-d);border-radius:var(--r);}
.u-norm-row-bg{display:flex;align-items:center;gap:8px;padding:6px 8px;margin-bottom:4px;background:var(--bg3);border-radius:var(--r);}
.u-engine-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:8px;padding:10px 13px;text-align:center;}
.u-p8-11-tg{padding:8px 11px;color:var(--green);}
.u-cal-day{text-align:center;font-size:9px;color:var(--tx3);padding:4px 0;}
.u-leave-bar{width:4px;height:38px;border-radius:2px;flex-shrink:0;}
.u-mt3-inline{margin-top:3px;display:inline-block;}
.u-tar-mw38{text-align:right;min-width:38px;}
.u-tag-9{font-size:9px;background:var(--bg4);border:1px solid var(--b2);border-radius:3px;padding:1px 5px;margin:1px;display:inline-block;}
.u-tac-fs11-t2{text-align:center;font-size:11px;color:var(--tx2);}
.u-h140{height:140px;}
.u-fs14-fwb-tg{font-size:14px;font-weight:600;color:var(--green);}
.u-p6-10-row-3-noalign{padding:6px 10px;display:flex;gap:3px;}

/* BADGES */
.bdg{font-size:9px;padding:3px 8px;border-radius:10px;font-weight:600;font-family:'IBM Plex Mono',monospace;white-space:nowrap;display:inline-block;letter-spacing:.04em;}
.bdg.r{background:var(--red-d);color:var(--red);}
.bdg.a{background:var(--amber-d);color:var(--amber);}
.bdg.g{background:var(--green-d);color:var(--green);}
.bdg.b{background:var(--blue-d);color:var(--blue);}
.bdg.t{background:var(--teal-d);color:var(--teal);}
.bdg.p{background:var(--purple-d);color:var(--purple);}
.bdg.o{background:var(--orange-d);color:var(--orange);}
.bdg.gr{background:var(--bg4);color:var(--tx3);}

/* ╔══════════════════════════════════════════════════════════════════════╗
   ║ [PHASE-3 STATE CLASSES] — semantic vocabulary at the markup layer    ║
   ║                                                                       ║
   ║ Replaces inline `style="color:${state==='aog'?'red':'green'}"` with  ║
   ║ `class="s-aog"` so:                                                   ║
   ║   • per-tenant theming works (override Layer 2 token, not 600 sites)  ║
   ║   • CSP `style-src-attr 'none'` becomes achievable (Phase 3 Step 6)   ║
   ║   • a11y / dark-mode / print stylesheets become trivial               ║
   ║                                                                       ║
   ║ Naming convention:                                                    ║
   ║   .s-<state>      — STATUS (assets, defects, WO, ADs, AMP)            ║
   ║   .sev-<level>    — SEVERITY (SMS risk, audit findings)               ║
   ║   .t-<band>       — TIME-to-event (overdue / due-soon / ok)           ║
   ║                                                                       ║
   ║ Each state has THREE variants:                                        ║
   ║   .X        text foreground only                                      ║
   ║   .X-bg     soft background tint + matching foreground (badge style)  ║
   ║   .X-bd     border colour only (cards, dropzones, dividers)           ║
   ║                                                                       ║
   ║ Compose with shape utilities (.bdg, .u-*) — never set !important.    ║
   ╚══════════════════════════════════════════════════════════════════════╝ */

/* ── Status — text variant ── */
.s-aog         {color:var(--color-status-aog);}
.s-grounded    {color:var(--color-status-grounded);}
.s-overdue     {color:var(--color-status-overdue);}
.s-open        {color:var(--color-status-open);}
.s-due-soon    {color:var(--color-status-due-soon);}
.s-in-progress {color:var(--color-status-in-progress);}
.s-draft       {color:var(--color-status-draft);}
.s-deferred    {color:var(--color-status-deferred);}
.s-stored      {color:var(--color-status-stored);}
.s-maint       {color:var(--color-status-maint);}
.s-ok          {color:var(--color-status-ok);}
.s-approved    {color:var(--color-status-approved);}
.s-complied    {color:var(--color-status-complied);}
.s-closed      {color:var(--color-status-closed);}
.s-done        {color:var(--color-status-done);}
.s-serviceable {color:var(--color-status-serviceable);}
.s-superseded  {color:var(--color-status-superseded);}
.s-archived    {color:var(--color-status-archived);}
.s-pending     {color:var(--color-status-pending);}
.s-info        {color:var(--color-status-info);}

/* ── Status — background-tinted variant (badge-style soft chip) ── */
.s-aog-bg         {background:var(--color-status-aog-soft);         color:var(--color-status-aog);}
.s-grounded-bg    {background:var(--color-status-grounded-soft);    color:var(--color-status-grounded);}
.s-overdue-bg     {background:var(--color-status-overdue-soft);     color:var(--color-status-overdue);}
.s-open-bg        {background:var(--color-status-open-soft);        color:var(--color-status-open);}
.s-due-soon-bg    {background:var(--color-status-due-soon-soft);    color:var(--color-status-due-soon);}
.s-in-progress-bg {background:var(--color-status-in-progress-soft); color:var(--color-status-in-progress);}
.s-draft-bg       {background:var(--color-status-draft-soft);       color:var(--color-status-draft);}
.s-deferred-bg    {background:var(--color-status-deferred-soft);    color:var(--color-status-deferred);}
.s-stored-bg      {background:var(--color-status-stored-soft);      color:var(--color-status-stored);}
.s-maint-bg       {background:var(--color-status-maint-soft);       color:var(--color-status-maint);}
.s-ok-bg          {background:var(--color-status-ok-soft);          color:var(--color-status-ok);}
.s-approved-bg    {background:var(--color-status-approved-soft);    color:var(--color-status-approved);}
.s-complied-bg    {background:var(--color-status-complied-soft);    color:var(--color-status-complied);}
.s-closed-bg      {background:var(--color-status-closed-soft);      color:var(--color-status-closed);}
.s-done-bg        {background:var(--color-status-done-soft);        color:var(--color-status-done);}
.s-serviceable-bg {background:var(--color-status-serviceable-soft); color:var(--color-status-serviceable);}
.s-superseded-bg  {background:var(--color-status-superseded-soft);  color:var(--color-status-superseded);}
.s-archived-bg    {background:var(--color-status-archived-soft);    color:var(--color-status-archived);}
.s-pending-bg     {background:var(--color-status-pending-soft);     color:var(--color-status-pending);}
.s-info-bg        {background:var(--color-status-info-soft);        color:var(--color-status-info);}

/* ── Status — border-only variant ── */
.s-aog-bd         {border-color:var(--color-status-aog);}
.s-grounded-bd    {border-color:var(--color-status-grounded);}
.s-overdue-bd     {border-color:var(--color-status-overdue);}
.s-open-bd        {border-color:var(--color-status-open);}
.s-due-soon-bd    {border-color:var(--color-status-due-soon);}
.s-in-progress-bd {border-color:var(--color-status-in-progress);}
.s-draft-bd       {border-color:var(--color-status-draft);}
.s-deferred-bd    {border-color:var(--color-status-deferred);}
.s-stored-bd      {border-color:var(--color-status-stored);}
.s-maint-bd       {border-color:var(--color-status-maint);}
.s-ok-bd          {border-color:var(--color-status-ok);}
.s-approved-bd    {border-color:var(--color-status-approved);}
.s-complied-bd    {border-color:var(--color-status-complied);}
.s-closed-bd      {border-color:var(--color-status-closed);}
.s-done-bd        {border-color:var(--color-status-done);}
.s-serviceable-bd {border-color:var(--color-status-serviceable);}
.s-superseded-bd  {border-color:var(--color-status-superseded);}
.s-archived-bd    {border-color:var(--color-status-archived);}
.s-pending-bd     {border-color:var(--color-status-pending);}
.s-info-bd        {border-color:var(--color-status-info);}

/* ── Severity — text variant ── */
.sev-extreme     {color:var(--color-severity-extreme);}
.sev-high        {color:var(--color-severity-high);}
.sev-medium      {color:var(--color-severity-medium);}
.sev-low         {color:var(--color-severity-low);}
.sev-major       {color:var(--color-severity-major);}
.sev-minor       {color:var(--color-severity-minor);}
.sev-obs         {color:var(--color-severity-observation);}
.sev-critical    {color:var(--color-severity-critical);}
.sev-info        {color:var(--color-severity-info);}

/* ── Severity — background-tinted variant ── */
.sev-extreme-bg  {background:var(--color-severity-extreme-soft);     color:var(--color-severity-extreme);}
.sev-high-bg     {background:var(--color-severity-high-soft);        color:var(--color-severity-high);}
.sev-medium-bg   {background:var(--color-severity-medium-soft);      color:var(--color-severity-medium);}
.sev-low-bg      {background:var(--color-severity-low-soft);         color:var(--color-severity-low);}
.sev-major-bg    {background:var(--color-severity-major-soft);       color:var(--color-severity-major);}
.sev-minor-bg    {background:var(--color-severity-minor-soft);       color:var(--color-severity-minor);}
.sev-obs-bg      {background:var(--color-severity-observation-soft); color:var(--color-severity-observation);}
.sev-critical-bg {background:var(--color-severity-critical-soft);    color:var(--color-severity-critical);}
.sev-info-bg     {background:var(--color-severity-info-soft);        color:var(--color-severity-info);}

/* ── Severity — border-only variant ── */
.sev-extreme-bd  {border-color:var(--color-severity-extreme);}
.sev-high-bd     {border-color:var(--color-severity-high);}
.sev-medium-bd   {border-color:var(--color-severity-medium);}
.sev-low-bd      {border-color:var(--color-severity-low);}
.sev-major-bd    {border-color:var(--color-severity-major);}
.sev-minor-bd    {border-color:var(--color-severity-minor);}
.sev-obs-bd      {border-color:var(--color-severity-observation);}
.sev-critical-bd {border-color:var(--color-severity-critical);}
.sev-info-bd     {border-color:var(--color-severity-info);}

/* ── Time-to-event — text variant ── */
.t-overdue   {color:var(--color-time-overdue);}
.t-due-soon  {color:var(--color-time-due-soon);}
.t-ok        {color:var(--color-time-ok);}
.t-not-set   {color:var(--color-time-not-set);}

/* ── Time-to-event — background-tinted variant ── */
.t-overdue-bg  {background:var(--color-time-overdue-soft);  color:var(--color-time-overdue);}
.t-due-soon-bg {background:var(--color-time-due-soon-soft); color:var(--color-time-due-soon);}
.t-ok-bg       {background:var(--color-time-ok-soft);       color:var(--color-time-ok);}
.t-not-set-bg  {background:var(--color-time-not-set-soft);  color:var(--color-time-not-set);}

/* ── Time-to-event — border-only variant ── */
.t-overdue-bd  {border-color:var(--color-time-overdue);}
.t-due-soon-bd {border-color:var(--color-time-due-soon);}
.t-ok-bd       {border-color:var(--color-time-ok);}
.t-not-set-bd  {border-color:var(--color-time-not-set);}

/* ── Solid-fill variants — for data-viz indicators (status dots,
   progress-bar fills, doc-status markers). Use SPARINGLY: prefer
   the soft `-bg` chip style for badges. ── */
.s-aog-solid       {background:var(--color-status-aog);}
.s-grounded-solid  {background:var(--color-status-grounded);}
.s-stored-solid    {background:var(--color-status-stored);}
.s-deferred-solid  {background:var(--color-status-deferred);}
.s-maint-solid     {background:var(--color-status-maint);}
.s-due-soon-solid  {background:var(--color-status-due-soon);}
.s-ok-solid        {background:var(--color-status-ok);}
.t-overdue-solid   {background:var(--color-time-overdue);}
.t-due-soon-solid  {background:var(--color-time-due-soon);}
.t-ok-solid        {background:var(--color-time-ok);}
.sev-extreme-solid {background:var(--color-severity-extreme);}
.sev-high-solid    {background:var(--color-severity-high);}
.sev-medium-solid  {background:var(--color-severity-medium);}
.sev-low-solid     {background:var(--color-severity-low);}
.sev-major-solid   {background:var(--color-severity-major);}
.sev-minor-solid   {background:var(--color-severity-minor);}
.sev-obs-solid     {background:var(--color-severity-observation);}
.sev-critical-solid{background:var(--color-severity-critical);}
.sev-info-solid    {background:var(--color-severity-info);}

/* ── Severity alpha-mix variants — for data-viz cells (5×5 risk matrix,
   heatmaps, etc.) where multiple opacity levels of the same hue are
   needed. Uses color-mix(in srgb, …) so the alpha resolves per-theme. ── */
.sev-extreme-bg-l1{background:color-mix(in srgb, var(--color-severity-extreme) 20%, transparent);}
.sev-extreme-bg-l2{background:color-mix(in srgb, var(--color-severity-extreme) 40%, transparent);}
.sev-extreme-bg-l3{background:color-mix(in srgb, var(--color-severity-extreme) 60%, transparent);}
.sev-extreme-bd-soft{border-color:color-mix(in srgb, var(--color-severity-extreme) 53%, transparent);}
.sev-high-bg-l1   {background:color-mix(in srgb, var(--color-severity-high) 20%, transparent);}
.sev-high-bg-l2   {background:color-mix(in srgb, var(--color-severity-high) 40%, transparent);}
.sev-high-bg-l3   {background:color-mix(in srgb, var(--color-severity-high) 60%, transparent);}
.sev-high-bd-soft {border-color:color-mix(in srgb, var(--color-severity-high) 53%, transparent);}
.sev-medium-bg-l1 {background:color-mix(in srgb, var(--color-severity-medium) 20%, transparent);}
.sev-medium-bg-l2 {background:color-mix(in srgb, var(--color-severity-medium) 40%, transparent);}
.sev-medium-bg-l3 {background:color-mix(in srgb, var(--color-severity-medium) 60%, transparent);}
.sev-medium-bd-soft{border-color:color-mix(in srgb, var(--color-severity-medium) 53%, transparent);}
.sev-low-bg-l1    {background:color-mix(in srgb, var(--color-severity-low) 20%, transparent);}
.sev-low-bg-l2    {background:color-mix(in srgb, var(--color-severity-low) 40%, transparent);}
.sev-low-bg-l3    {background:color-mix(in srgb, var(--color-severity-low) 60%, transparent);}
.sev-low-bd-soft  {border-color:color-mix(in srgb, var(--color-severity-low) 53%, transparent);}

/* ── Permission-matrix cell states (granted vs denied) ── */
.perm-granted{background:var(--green-d);border:1px solid var(--green);color:var(--green);}
.perm-denied {background:var(--bg4);border:1px solid var(--b);color:var(--tx3);}

/* ── Heatmap intensity bands (replaces inline rgba(intensity) styling) ── */
.heat-cell-0 {background:var(--bg4);color:var(--tx3);}
.heat-cell-1 {background:color-mix(in srgb, var(--green) 35%, transparent);color:var(--green);}
.heat-cell-2 {background:color-mix(in srgb, var(--amber) 40%, transparent);color:var(--amber);}
.heat-cell-3 {background:color-mix(in srgb, var(--red) 50%, transparent);color:var(--red);}

/* ── Mcalendar day-cell backgrounds ── */
.mcal-day-today  {background:var(--blue-d);border:2px solid var(--blue);}
.mcal-day-weekend{background:var(--bg3);border:1px solid var(--b);}
.mcal-day-weekday{background:var(--bg2);border:1px solid var(--b);}

/* ── Custom-event colour-picker swatches ── */
.mce-sw{transition:transform 0.15s, border-color 0.15s;}
.mce-sw:hover{transform:scale(1.1);}
.mce-sw.on{border-color:var(--tx);border-width:3px;transform:scale(1.15);}

/* ── Maintenance Calendar day-detail event row.
   The data-fg-color hook sets `color` via JS; `border-left-color`
   inherits from that via the `currentColor` keyword pattern. ── */
.mcal-day-evt{border-left-color:currentColor;}

/* ── Left-border accent utility (combine with .X-bd for state colour).
   Used for legend cards, callout boxes — visible 3px stripe on the left. ── */
.u-bdl{border-left-width:3px;border-left-style:solid;}

/* ── Zebra-striped table rows (replaces inline `i%2===0?bg:bg2` styling) ── */
.u-zebra > tr,
.u-zebra > tbody > tr{border-bottom:1px solid var(--b);}
.u-zebra > tr:nth-child(odd),
.u-zebra > tbody > tr:nth-child(odd){background:var(--bg);}
.u-zebra > tr:nth-child(even),
.u-zebra > tbody > tr:nth-child(even){background:var(--bg2);}

/* TOOLBAR with filters */
.toolbar{display:flex;gap:8px;align-items:center;flex-wrap:wrap;margin-bottom:12px;padding:10px 12px;background:var(--bg2);border:1px solid var(--b);border-radius:var(--rl);}
.sw{position:relative;flex:1;min-width:180px;max-width:300px;}
.sw input{width:100%;padding:8px 11px 8px 32px;background:var(--bg3);border:1px solid var(--b);border-radius:var(--r);color:var(--tx);font-size:12px;font-family:'IBM Plex Sans',sans-serif;outline:none;}
.sw input:focus{border-color:var(--blue);box-shadow:0 0 0 3px var(--blue-d);}
.si{position:absolute;left:10px;top:50%;transform:translateY(-50%);color:var(--tx3);font-size:14px;pointer-events:none;}
select.fs{padding:7px 10px;background:var(--bg3);border:1px solid var(--b);border-radius:var(--r);color:var(--tx);font-size:12px;font-family:'IBM Plex Sans',sans-serif;cursor:pointer;outline:none;min-width:120px;}
select.fs:hover{border-color:var(--b2);}
select.fs:focus{border-color:var(--blue);}

/* Empty state */
.empty{padding:24px 16px;text-align:center;font-size:12px;color:var(--tx3);font-style:italic;}

/* MODAL - modernized */
.mo-ov{position:fixed;inset:0;background:rgba(0,0,0,.75);backdrop-filter:blur(4px);display:flex;align-items:center;justify-content:center;z-index:500;padding:20px;}
.mo-c{background:var(--bg2);border:1px solid var(--b2);border-radius:12px;width:100%;max-width:580px;max-height:90vh;overflow-y:auto;box-shadow:var(--shadow-lg);}
.mo-h{padding:16px 20px 14px;border-bottom:1px solid var(--b);display:flex;align-items:center;justify-content:space-between;background:linear-gradient(180deg, var(--bg2) 0%, var(--bg3) 100%);}
.mo-t{font-size:15px;font-weight:600;letter-spacing:-0.2px;}
.mo-x{background:none;border:none;color:var(--tx3);cursor:pointer;font-size:18px;width:28px;height:28px;border-radius:var(--r);display:flex;align-items:center;justify-content:center;transition:all 0.15s;}
.mo-x:hover{color:var(--red);background:var(--red-d);}
.mo-b{padding:18px 20px;}
.mo-f{padding:13px 20px;border-top:1px solid var(--b);display:flex;gap:8px;justify-content:flex-end;background:var(--bg3);}

/* FORMS - modernized */
.fg{display:grid;grid-template-columns:1fr 1fr;gap:12px;}
.fi{display:flex;flex-direction:column;gap:5px;}
.fi.f{grid-column:1/-1;}
label{font-size:10px;color:var(--tx3);text-transform:uppercase;letter-spacing:.08em;font-weight:600;}
input[type=text],input[type=number],input[type=date],input[type=time],input[type=email],input[type=password],textarea,select.fss{padding:9px 11px;background:var(--bg3);border:1px solid var(--b);border-radius:var(--r);color:var(--tx);font-size:13px;font-family:'IBM Plex Sans',sans-serif;outline:none;width:100%;transition:all 0.15s;}
input:focus,textarea:focus,select.fss:focus{border-color:var(--blue);box-shadow:0 0 0 3px var(--blue-d);}
input:hover,textarea:hover,select.fss:hover{border-color:var(--b2);}
/* [CSP-PHASE-3] When a select carries both .fss and a width/padding utility,
   the utility must win. select.fss sets width:100% via the form-controls
   rule above (same specificity as the bare .u-* rule). Force these compound
   selectors to override by repeating the utility with the select. prefix. */
select.u-chip-auto{font-size:10px;padding:3px 8px;width:auto;}
select.u-w-auto{width:auto;}
select.u-w140{width:140px;}
select.u-fs11{font-size:11px;}
textarea{resize:vertical;min-height:68px;font-family:'IBM Plex Sans',sans-serif;}

/* DETAIL PANEL */
.dov{position:fixed;inset:0;z-index:200;display:flex;justify-content:flex-end;}
.dbk{position:absolute;inset:0;background:rgba(0,0,0,.5);backdrop-filter:blur(2px);}
.dpn{position:relative;width:440px;background:var(--bg2);border-left:1px solid var(--b2);height:100%;overflow-y:auto;box-shadow:-8px 0 24px rgba(0,0,0,0.3);}
.dph{padding:16px 18px 14px;border-bottom:1px solid var(--b);display:flex;align-items:flex-start;justify-content:space-between;background:linear-gradient(180deg, var(--bg2) 0%, var(--bg3) 100%);}
.dps{padding:14px 18px;border-bottom:1px solid var(--b);}
.dpst{font-size:10px;color:var(--tx3);text-transform:uppercase;letter-spacing:.1em;margin-bottom:10px;font-weight:600;}
.ir{display:flex;justify-content:space-between;align-items:baseline;margin-bottom:7px;gap:10px;}
.ik{font-size:11px;color:var(--tx3);}
.iv{font-size:12px;color:var(--tx);text-align:right;font-family:'IBM Plex Mono',monospace;}

/* CARDS */
/* CARDS - modernized */
.c2{display:grid;grid-template-columns:1fr 1fr;gap:12px;}
.c3{display:grid;grid-template-columns:repeat(auto-fill,minmax(260px,1fr));gap:12px;}
.card{background:var(--bg2);border:1px solid var(--b);border-radius:var(--rl);padding:16px;transition:all 0.15s;box-shadow:var(--shadow);}
.card:hover{border-color:var(--b2);box-shadow:var(--shadow-lg);}
.ct{font-size:10px;color:var(--tx3);text-transform:uppercase;letter-spacing:.1em;margin-bottom:12px;display:flex;align-items:center;justify-content:space-between;font-weight:600;}

/* PROGRESS */
/* PROGRESS - modernized */
.pb{height:6px;background:var(--bg4);border-radius:3px;overflow:hidden;}
.pbf{height:100%;border-radius:3px;transition:width 0.4s;}

/* TIMELINE */
.tli{display:flex;gap:10px;padding:8px 0;border-bottom:1px solid var(--b);}
.tli:last-child{border-bottom:none;}
.tldw{display:flex;flex-direction:column;align-items:center;flex-shrink:0;}
.tld{width:8px;height:8px;border-radius:50%;flex-shrink:0;margin-top:3px;}
.tll{width:1px;background:var(--b);flex:1;margin-top:3px;}
.tlb{flex:1;min-width:0;}
.tlt{font-size:12px;font-weight:500;}
.tlm{font-size:10px;color:var(--tx3);margin-top:1px;font-family:'IBM Plex Mono',monospace;}
.tlq{font-family:'IBM Plex Mono',monospace;font-size:12px;font-weight:600;flex-shrink:0;margin-top:2px;}

/* KANBAN */
/* KANBAN - modernized */
.kanban{display:grid;grid-template-columns:repeat(4,1fr);gap:12px;}
.kcol{background:var(--bg2);border:1px solid var(--b);border-radius:var(--rl);overflow:hidden;box-shadow:var(--shadow);}
.kch{padding:10px 14px;border-bottom:1px solid var(--b);display:flex;align-items:center;justify-content:space-between;background:linear-gradient(180deg, var(--bg2) 0%, var(--bg3) 100%);}
.kct{font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.08em;}
.kcb{padding:10px;display:flex;flex-direction:column;gap:8px;min-height:180px;}
.woc{background:var(--bg3);border:1px solid var(--b);border-left:3px solid var(--b);border-radius:var(--r);padding:11px 12px;cursor:pointer;transition:all 0.15s;}
.woc:hover{background:var(--bg4);transform:translateX(2px);box-shadow:var(--shadow);}
.woc.aog{border-left-color:var(--red);border-left-width:4px;}
.woc.ov{border-left-color:var(--red);border-left-width:4px;}
.woc.pr{border-left-color:var(--blue);border-left-width:4px;}
.woc.dn{border-left-color:var(--green);opacity:.6;}

/* AC STRIP */
/* AC STRIP - modernized */
.acs{display:flex;gap:10px;margin-bottom:16px;overflow-x:auto;padding:2px;}
.acp{display:flex;align-items:center;gap:9px;padding:10px 14px;background:var(--bg2);border:1px solid var(--b);border-radius:var(--rl);cursor:pointer;flex-shrink:0;transition:all 0.15s;box-shadow:var(--shadow);}
.acp:hover{border-color:var(--teal);transform:translateY(-1px);box-shadow:var(--shadow-lg);}
.acp.on{border-color:var(--teal);background:var(--teal-d);box-shadow:0 0 0 3px rgba(0,201,177,0.15);}
.acp.aog{border-color:var(--red);background:var(--red-d);}
.acd{width:8px;height:8px;border-radius:50%;flex-shrink:0;background:var(--color-status-ok);}
.acp.aog .acd      {background:var(--color-status-aog);}
.acp.grounded .acd {background:var(--color-status-grounded);}
.acp.stored .acd   {background:var(--color-status-stored);}
.acp.deferred .acd {background:var(--color-status-deferred);}
.acp.maint .acd    {background:var(--color-status-maint);}
.acp.due-soon .acd {background:var(--color-status-due-soon);}
.acr{font-family:'IBM Plex Mono',monospace;font-size:13px;font-weight:600;letter-spacing:0.5px;}
.act{font-size:10px;color:var(--tx3);}

/* SCAN */
.scan-z{background:var(--bg2);border:1px solid var(--b);border-radius:var(--rl);padding:15px;margin-bottom:12px;}
.scan-i{flex:1;padding:9px 12px;background:var(--bg3);border:2px solid var(--b2);border-radius:var(--r);color:var(--tx);font-size:14px;font-family:'IBM Plex Mono',monospace;outline:none;}
.scan-i:focus{border-color:var(--blue);}
.scan-i.f{border-color:var(--green);}
.scan-i.nf{border-color:var(--red);}
.scan-r{background:var(--bg3);border-radius:var(--rl);padding:12px;margin-top:10px;display:none;}
.scan-r.on{display:block;}
.sg{display:grid;grid-template-columns:repeat(4,1fr);gap:8px;margin-top:9px;}
.ss{text-align:center;background:var(--bg2);border-radius:var(--r);padding:9px;}
.ssv{font-family:'IBM Plex Mono',monospace;font-size:14px;font-weight:600;}
.ssl{font-size:9px;color:var(--tx3);margin-top:2px;}

/* GANTT */
.gantt-w{overflow-x:auto;background:var(--bg2);border:1px solid var(--b);border-radius:var(--rl);}
.gh{display:flex;border-bottom:1px solid var(--b);}
.glc{width:180px;min-width:180px;padding:7px 11px;font-size:9px;color:var(--tx3);text-transform:uppercase;letter-spacing:.07em;border-right:1px solid var(--b);flex-shrink:0;}
.gdr{display:flex;flex:1;}
.gdl{font-size:9px;color:var(--tx3);text-align:center;padding:7px 0;flex:1;min-width:24px;border-right:1px solid var(--b);}
.gdl.tod{color:var(--orange);font-weight:600;}
.grow{display:flex;border-bottom:1px solid var(--b);}
.grow:last-child{border-bottom:none;}
.gac{width:180px;min-width:180px;padding:8px 11px;border-right:1px solid var(--b);flex-shrink:0;}
.gacr{font-family:'IBM Plex Mono',monospace;font-size:12px;font-weight:500;}
.gact{font-size:10px;color:var(--tx3);}
.gcs{display:flex;flex:1;position:relative;height:40px;}
.gc{flex:1;min-width:24px;border-right:1px solid var(--b);height:100%;}
.gc.wk{background:var(--bg3);}
.gc.tod{background:rgba(232,109,61,.07);}
.gbar{position:absolute;height:20px;top:10px;border-radius:4px;display:flex;align-items:center;padding:0 6px;font-size:9px;font-weight:500;white-space:nowrap;overflow:hidden;cursor:pointer;}
.gbar.insp{background:var(--blue-d);color:var(--blue);border:1px solid var(--blue);}
.gbar.mx{background:var(--purple-d);color:var(--purple);border:1px solid var(--purple);}
.gbar.aog{background:var(--red-d);color:var(--red);border:1px solid var(--red);}
.gbar.sch{background:var(--teal-d);color:var(--teal);border:1px solid var(--teal);}

/* PERSONNEL */
/* PERSONNEL CARDS */
.pcard{background:var(--bg2);border:1px solid var(--b);border-radius:var(--rl);padding:14px;border-top:3px solid transparent;transition:all 0.15s;box-shadow:var(--shadow);}
.pcard:hover{border-color:var(--b2);box-shadow:var(--shadow-lg);transform:translateY(-2px);}
.pcard.cr{border-top-color:var(--red);}
.pcard.wa{border-top-color:var(--amber);}
.pcard.ok{border-top-color:var(--green);}
.av{width:32px;height:32px;border-radius:50%;display:flex;align-items:center;justify-content:center;font-size:11px;font-weight:700;flex-shrink:0;}

/* CALENDAR */
/* CALENDAR - modernized */
.cal-g{display:grid;grid-template-columns:repeat(7,1fr);gap:4px;margin-bottom:14px;}
.cal-d{min-height:40px;background:var(--bg2);border:1px solid var(--b);border-radius:var(--r);padding:5px 7px;font-size:10px;font-family:'IBM Plex Mono',monospace;color:var(--tx3);transition:all 0.15s;}
.cal-d:hover{border-color:var(--b2);background:var(--bg3);}
.cal-d.tod{border-color:var(--green);color:var(--green);background:var(--green-d);}
.cal-d.wk{background:var(--bg3);}
.cal-d.om{opacity:.35;}
.cdot{width:6px;height:6px;border-radius:50%;display:inline-block;margin:1px;}

/* DOC CARDS - modernized */
.doc-g{display:grid;grid-template-columns:repeat(auto-fill,minmax(195px,1fr));gap:11px;}
.doc-c{background:var(--bg2);border:1px solid var(--b);border-radius:var(--rl);padding:14px;cursor:pointer;position:relative;transition:all 0.15s;box-shadow:var(--shadow);}
.doc-c:hover{background:var(--bg3);border-color:var(--b2);transform:translateY(-2px);box-shadow:var(--shadow-lg);}
.doc-c.exp{border-color:var(--red);}
.doc-c.sn{border-color:var(--amber);}
.doc-s{position:absolute;top:0;left:0;right:0;height:3px;border-radius:var(--rl) var(--rl) 0 0;}
.doc-nm{font-size:12px;font-weight:600;margin-bottom:3px;line-height:1.3;}
.doc-ct{font-size:9px;color:var(--tx3);text-transform:uppercase;margin-bottom:6px;letter-spacing:.08em;font-weight:600;}
.doc-mt{font-size:10px;color:var(--tx3);font-family:'IBM Plex Mono',monospace;line-height:1.7;}

/* AMP */
.amp-ban{background:var(--purple-d);border:1px solid var(--purple);border-radius:var(--rl);padding:13px 16px;margin-bottom:13px;display:flex;align-items:center;gap:13px;}
.ata-g{background:var(--bg2);border:1px solid var(--b);border-radius:var(--rl);overflow:hidden;margin-bottom:8px;}
.ata-h{padding:9px 13px;display:flex;align-items:center;justify-content:space-between;cursor:pointer;}
.ata-h:hover{background:var(--bg3);}
.ata-b{border-top:1px solid var(--b);display:none;}
.ata-b.on{display:block;}
.ata-r{display:flex;align-items:center;gap:10px;padding:8px 13px;border-bottom:1px solid var(--b);cursor:pointer;}
.ata-r:last-child{border-bottom:none;}
.ata-r:hover{background:var(--bg3);}

/* ORDER LIST */
/* ORDER CARDS - modernized */
.ocard{background:var(--bg2);border:1px solid var(--b);border-radius:var(--rl);overflow:hidden;margin-bottom:12px;box-shadow:var(--shadow);}
.och{padding:10px 14px;border-bottom:1px solid var(--b);display:flex;align-items:center;justify-content:space-between;background:linear-gradient(180deg, var(--bg3) 0%, var(--bg2) 100%);}
.or{display:flex;align-items:center;gap:10px;padding:9px 14px;border-bottom:1px solid var(--b);transition:background 0.15s;}
.or:hover{background:var(--bg3);}
.or:last-child{border-bottom:none;}
.ochk{width:16px;height:16px;border-radius:4px;border:1.5px solid var(--b2);background:var(--bg3);cursor:pointer;display:flex;align-items:center;justify-content:center;font-size:9px;flex-shrink:0;transition:all 0.15s;}
.ochk.on{background:var(--purple);border-color:var(--purple);color:#fff;}

/* ALERTS - modernized */
.alr{display:flex;align-items:center;gap:10px;padding:10px 14px;border-bottom:1px solid var(--b);cursor:pointer;transition:background 0.15s;}
.alr:hover{background:var(--bg3);}
.alr:last-child{border-bottom:none;}
.ald{width:8px;height:8px;border-radius:50%;flex-shrink:0;}
.alb{flex:1;min-width:0;}
.alt{font-size:11px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
.alm{font-size:9px;color:var(--tx3);}
.ackb{font-size:9px;padding:2px 5px;border-radius:3px;border:1px solid var(--b2);background:none;color:var(--tx3);cursor:pointer;}
.ackb:hover{color:var(--green);border-color:var(--green);}
.live{display:flex;align-items:center;gap:5px;font-size:10px;font-family:'IBM Plex Mono',monospace;background:var(--green-d);color:var(--green);padding:3px 8px;border-radius:4px;transition:background 0.3s, color 0.3s;}
.ldot{width:5px;height:5px;border-radius:50%;background:var(--green);animation:pulse 2s infinite;}
/* [LIVE-PING-V1 2026-05-30] Offline state — the dashboard chip turns
   red and the pulse stops when the /api/ping probe fails or the
   browser fires the offline event. Same shape, different colour, so
   the user spots it in the corner of the eye. */
.live.off{background:var(--red-d);color:var(--red);}
.live.off .ldot{background:var(--red);animation:none;}
.vt{display:flex;gap:3px;background:var(--bg3);border:1px solid var(--b);border-radius:var(--r);padding:3px;}
.vb{padding:3px 8px;border-radius:4px;font-size:10px;cursor:pointer;border:none;background:transparent;color:var(--tx3);}
.vb.on{background:var(--bg2);color:var(--tx);border:1px solid var(--b);}
.empty{text-align:center;padding:32px;color:var(--tx3);font-size:12px;}
@keyframes pulse{0%,100%{opacity:1}50%{opacity:.3}}

/* [MT-PHASE6-V1 2026-05-23] Tenant management UI ─────────────── */
.tn-row-logo{width:36px;height:36px;object-fit:contain;border-radius:6px;background:var(--bg2);padding:2px;border:1px solid var(--b);}
.tn-color-swatch{display:inline-block;width:24px;height:24px;border-radius:6px;border:1px solid var(--b);vertical-align:middle;}
.tn-color-input{width:48px;height:32px;padding:0;border:1px solid var(--b);border-radius:6px;background:transparent;cursor:pointer;}
.tn-logo-preview{width:96px;height:96px;display:flex;align-items:center;justify-content:center;background:var(--bg2);border:1px dashed var(--b);border-radius:8px;overflow:hidden;}
.tn-logo-preview img{max-width:100%;max-height:100%;object-fit:contain;}
.tenant-logo-img{max-width:100%;max-height:100%;object-fit:contain;display:block;}
/* When a tenant logo image replaces the inline SVG, drop the */
/* gradient background so the brand image renders cleanly.    */
.sb-logo:has(img),.logo-i:has(img){background:transparent;}
.sb-logo img.tenant-logo-img{width:28px;height:28px;border-radius:7px;}
.logo-i img.tenant-logo-img{width:40px;height:40px;border-radius:9px;}

/* [MT-PHASE8A-V1 2026-05-24] Subscription modal */
.tn-plan-list{display:flex;flex-direction:column;gap:8px;}
.tn-plan-row{display:flex;align-items:flex-start;gap:10px;padding:10px;border:1px solid var(--b);border-radius:8px;background:var(--bg2);cursor:pointer;}
.tn-plan-row:hover{border-color:var(--blue);}
.tn-plan-row input[type="radio"]{margin-top:3px;flex-shrink:0;}
.tn-plan-body{flex:1;min-width:0;}
.tn-addon-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(160px,1fr));gap:6px;}
.tn-addon-chip{display:flex;align-items:center;gap:6px;padding:6px 10px;border:1px solid var(--b);border-radius:6px;background:var(--bg2);cursor:pointer;font-size:12px;}
.tn-addon-chip:hover{border-color:var(--blue);}
.tn-addon-chip input{margin:0;}

/* [MT-PHASE9-V1 2026-05-24] Per-tenant usage stats modal */
.tn-stats-section{margin-bottom:14px;}
.tn-stats-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(120px,1fr));gap:8px;}
.tn-stats-cell{padding:8px 10px;background:var(--bg2);border:1px solid var(--b);border-radius:6px;}

/* [MT-PHASE8C-V1 2026-05-24] My Subscription page */
.u-grid-2col{display:grid;grid-template-columns:1fr 1fr;gap:12px;}
@media (max-width:900px){.u-grid-2col{grid-template-columns:1fr;}}
.sub-mod-row{display:flex;align-items:center;padding:6px 0;border-bottom:1px solid var(--b);font-size:12px;}
.sub-mod-row:last-child{border-bottom:none;}
.sub-mod-icon{width:24px;text-align:center;}
.sub-mod-name{flex:1;font-family:var(--mono),monospace;font-size:11px;}
.sub-plans-list{display:flex;flex-direction:column;gap:6px;}
.sub-plan-row{padding:8px 10px;border:1px solid var(--b);border-radius:6px;background:var(--bg2);}
.sub-plan-row.sub-plan-current{border-color:var(--blue);background:var(--bg3);}

/* ─── [MT-PHASE-MOBILE-V1 2026-05-24] Responsive layout ──────── */
/* Tablet portrait + smaller (≤ 1024px): sidebar becomes a drawer. */

/* Hamburger button — hidden on desktop, visible on tablet/mobile */
.tb-hamburger{display:none;width:38px;height:38px;background:transparent;border:none;color:var(--tx);font-size:22px;cursor:pointer;padding:0;align-items:center;justify-content:center;border-radius:6px;}
.tb-hamburger:hover{background:var(--bg3);}

/* Drawer backdrop — only appears when sidebar is open on mobile */
.sidebar-backdrop{display:none;position:fixed;inset:0;background:rgba(0,0,0,0.5);z-index:998;}
body.sidebar-open .sidebar-backdrop{display:block;}

@media (max-width:1024px){
  /* Sidebar slides off-screen by default, slides in when body.sidebar-open */
  .sidebar{
    position:fixed;
    top:0;left:0;bottom:0;
    width:260px !important;          /* override .collapsed too */
    transform:translateX(-100%);
    transition:transform 0.25s ease;
    z-index:999;
    box-shadow:2px 0 12px rgba(0,0,0,0.4);
  }
  body.sidebar-open .sidebar{
    transform:translateX(0);
  }
  /* The sb-toggle (collapse) button on desktop hides — drawer doesn't collapse */
  .sb-foot .sb-toggle:last-child{display:none;}

  /* Hamburger button shows in topbar */
  .tb-hamburger{display:inline-flex;}

  /* Topbar: tighter padding + smaller search */
  .topbar{padding:0 12px;gap:8px;}
  .tb-search{max-width:none;flex:1;min-width:0;}

  /* Page padding less aggressive */
  .page{padding:14px;}

  /* Larger touch targets for buttons everywhere */
  .btn{min-height:38px;}
  .sb-item{padding:12px;font-size:14px;}

  /* Tables: horizontal scroll instead of overflow */
  .tw{overflow-x:auto;-webkit-overflow-scrolling:touch;}
  table{min-width:600px;}

  /* Modals: nearly full-screen on small viewports */
  #genmo .mo-c, #detov .det-c{max-width:95vw !important;max-height:90vh;}

  /* Forms: stack 2-col grids to 1-col */
  .fg{grid-template-columns:1fr !important;}
}

/* Mobile portrait (≤ 640px) — additional tightening */
@media (max-width:640px){
  .topbar{padding:0 8px;gap:6px;}
  /* Hide search bar on tiny screens — user can still scroll the page */
  .tb-search{display:none;}
  /* Page header tightens */
  .ph{flex-direction:column;align-items:flex-start;gap:8px;}
  .ph .ha{align-self:stretch;}
  /* Page title smaller */
  .pt{font-size:18px;}
  .ps{font-size:10px;}
  /* Dashboard tiles stack */
  .c3, .u-grid8{grid-template-columns:1fr !important;}
  /* Tenant grid actions: stack the action buttons */
  .u-row-gap6{flex-wrap:wrap;}
  /* Subscription page 2-col layout collapses (already done in -2col) */
  /* Forms stack tighter */
  .fi label{font-size:11px;}
  .fi input, .fi select, .fi textarea{font-size:14px;}  /* 14px+ prevents iOS zoom-on-focus */
}

/* [MT-PHASE-MOBILE-V2 2026-05-24] Hotfix: drawer mode overrides */
@media (max-width:1024px){
  /* Force labels visible inside the drawer — the .collapsed class
     might still be set from a previous desktop session via localStorage. */
  .sidebar.collapsed .sb-name,
  .sidebar.collapsed .sb-label,
  .sidebar.collapsed .sb-badge,
  .sidebar.collapsed .sb-group-header .sb-label{display:initial !important;}
  .sidebar .sb-nav{padding:12px 8px !important;}
  /* Make sure the sidebar item rows are full-width regardless of
     the collapsed state. */
  .sidebar.collapsed{width:260px !important;}

  /* Horizontal table scroll containers — body has overflow:hidden so
     we need the table wrapper itself to scroll. The .tw class was
     already overflow-x:auto; add a defensive variant for raw <div>
     ancestors that some pages use, and make table widths flexible. */
  .page{overflow-x:auto;}
  .tw{overflow-x:auto;-webkit-overflow-scrolling:touch;max-width:100%;}
  table{min-width:0;width:auto;}
  /* Stock + tools modules often render very wide tables (15+ cols);
     give them a minimum that triggers scroll on phones but isn't
     fixed so wider tablets in landscape still see everything. */
  #pg-stock table, #pg-camo table, #pg-tenants table, #pg-users table{min-width:800px;}
}

/* ─── [MT-PHASE-MOBILE-M2 2026-05-25] Native-feeling mobile ───── */

/* ── Tables → cards on phones (≤ 640px) ───────────────────────── */
/* [M5 visual refresh 2026-05-25] Premium card design — drop the
   label:value rows pattern in favour of a curated 3-line layout that
   reads like a native iOS / Linear list. The annotator picks the
   most informative cells (title, subtitle, status, key metric); the
   rest stay hidden unless the user taps to drill into detail.
   Result: scannable cards with proper hierarchy, no noisy LABEL
   prefixes, status chip top-right, action footer with hairline rule. */
@media (max-width:640px){
  #pg-stock table, #pg-camo table, #pg-tenants table, #pg-users table{min-width:0 !important;}
  .tw{overflow:visible;background:transparent;border:none;box-shadow:none;}

  .tw table:not([data-no-mobile-cards]),
  .tw table:not([data-no-mobile-cards]) tbody{display:block;width:auto;background:transparent;}
  .tw table:not([data-no-mobile-cards]) thead{display:none;}

  /* Card row — gradient surface, rounded, subtle ring, soft elevation */
  .tw table:not([data-no-mobile-cards]) tr{
    display:block;
    position:relative;
    background:var(--bg2);
    border:1px solid var(--b);
    border-radius:14px;
    margin:0 0 10px;
    padding:14px 16px 12px;
    box-shadow:0 1px 2px rgba(0,0,0,0.08), 0 4px 12px rgba(0,0,0,0.05);
    transition:transform 0.12s ease, box-shadow 0.12s ease;
  }
  .tw table:not([data-no-mobile-cards]) tr:active{
    transform:scale(0.985);
    box-shadow:0 1px 2px rgba(0,0,0,0.06);
  }
  /* Zebra-stripe drops on cards */
  .tw table:not([data-no-mobile-cards]) tr:nth-child(even){background:var(--bg2);}

  /* Hide every cell by default — annotator opts specific ones back in */
  .tw table:not([data-no-mobile-cards]) td{
    display:none;
    padding:0;border:none !important;background:transparent;
    text-align:left;
    line-height:1.4;
    font-size:13px;
    color:var(--tx);
  }

  /* TITLE — large, bold, primary text. */
  .tw table:not([data-no-mobile-cards]) td.mob-card-title{
    display:block;
    font-size:16px;
    font-weight:600;
    color:var(--tx);
    letter-spacing:-0.2px;
    padding-right:90px;  /* leave room for the status chip top-right */
    margin-bottom:2px;
    white-space:nowrap;
    overflow:hidden;
    text-overflow:ellipsis;
  }
  /* Hide expand-caret / lots-count spans that desktop uses — they
     visually clutter the mobile title. The caret functionality is
     not needed on mobile (cards open detail on tap). */
  .tw table:not([data-no-mobile-cards]) td.mob-card-title .u-fs9-blue-trans,
  .tw table:not([data-no-mobile-cards]) td.mob-card-title .stk-caret,
  .tw table:not([data-no-mobile-cards]) td.mob-card-title .stk-expand{display:none !important;}
  /* Style the lots-count badge (e.g. "3 lots") so it sits next to
     the title text instead of looking like a stray superscript. */
  .tw table:not([data-no-mobile-cards]) td.mob-card-title .u-lots-count{
    display:inline-block;
    font-size:10px;
    font-weight:600;
    color:var(--blue);
    background:rgba(77,138,255,0.12);
    padding:2px 7px;
    border-radius:8px;
    margin-left:8px;
    vertical-align:middle;
    letter-spacing:0.2px;
  }

  /* SUBTITLE — dimmed, smaller, 1-line ellipsis */
  .tw table:not([data-no-mobile-cards]) td.mob-card-subtitle{
    display:block;
    font-size:13px;
    color:var(--tx2);
    margin-bottom:8px;
    white-space:nowrap;
    overflow:hidden;
    text-overflow:ellipsis;
    padding-right:80px;
  }

  /* STATUS CHIP — absolute top-right, picks up colour from the source
     cell's classes (.u-tg, .u-tr, .u-ta, .s-aog, .sev-high, …) */
  .tw table:not([data-no-mobile-cards]) td.mob-card-status{
    display:inline-flex;
    align-items:center;
    gap:5px;
    position:absolute;
    top:14px;
    right:16px;
    padding:3px 9px;
    border-radius:10px;
    font-size:11px;
    font-weight:600;
    letter-spacing:0.2px;
    background:var(--bg3);
    color:var(--tx2);
    border:1px solid var(--b);
    max-width:120px;
    white-space:nowrap;
    overflow:hidden;
    text-overflow:ellipsis;
    text-transform:none;
  }
  /* Picks up status hue when source carried a known status class */
  .tw table:not([data-no-mobile-cards]) td.mob-card-status.u-tg,
  .tw table:not([data-no-mobile-cards]) td.mob-card-status.s-serviceable,
  .tw table:not([data-no-mobile-cards]) td.mob-card-status.s-ok{
    background:rgba(0,209,128,0.12);color:var(--green);border-color:rgba(0,209,128,0.3);}
  .tw table:not([data-no-mobile-cards]) td.mob-card-status.u-tr,
  .tw table:not([data-no-mobile-cards]) td.mob-card-status.s-aog,
  .tw table:not([data-no-mobile-cards]) td.mob-card-status.s-grounded,
  .tw table:not([data-no-mobile-cards]) td.mob-card-status.sev-extreme,
  .tw table:not([data-no-mobile-cards]) td.mob-card-status.sev-high{
    background:rgba(255,77,77,0.12);color:var(--red);border-color:rgba(255,77,77,0.3);}
  .tw table:not([data-no-mobile-cards]) td.mob-card-status.u-ta,
  .tw table:not([data-no-mobile-cards]) td.mob-card-status.s-deferred,
  .tw table:not([data-no-mobile-cards]) td.mob-card-status.s-maint,
  .tw table:not([data-no-mobile-cards]) td.mob-card-status.s-due-soon,
  .tw table:not([data-no-mobile-cards]) td.mob-card-status.sev-medium{
    background:rgba(245,166,35,0.12);color:var(--amber);border-color:rgba(245,166,35,0.3);}
  .tw table:not([data-no-mobile-cards]) td.mob-card-status.u-tb,
  .tw table:not([data-no-mobile-cards]) td.mob-card-status.sev-low{
    background:rgba(77,138,255,0.12);color:var(--blue);border-color:rgba(77,138,255,0.3);}

  /* METRIC STRIP — up to 3 inline chips with the most important numeric/text values */
  .tw table:not([data-no-mobile-cards]) td.mob-card-metric{
    display:inline-block;
    font-size:13px;
    color:var(--tx);
    background:var(--bg3);
    border-radius:6px;
    padding:4px 9px;
    margin:0 6px 8px 0;
    font-weight:500;
    max-width:160px;
    white-space:nowrap;
    overflow:hidden;
    text-overflow:ellipsis;
    line-height:1.3;
  }
  .tw table:not([data-no-mobile-cards]) td.mob-card-metric strong{
    font-weight:600;
    color:var(--tx);
  }
  .tw table:not([data-no-mobile-cards]) td.mob-card-metric .mob-mlabel{
    display:inline;
    color:var(--tx3);
    font-size:11px;
    font-weight:500;
    text-transform:uppercase;
    letter-spacing:0.3px;
    margin-right:5px;
  }

  /* ACTION FOOTER — hairline rule then a compact, scrollable row.
     Many modules pack buttons inside a .u-row-3-gap wrapper; we treat
     it as a flex container so the buttons lay out properly. The row
     scrolls horizontally if there are more buttons than fit (the
     long-press context menu provides the full keyboard-style list). */
  .tw table:not([data-no-mobile-cards]) td.mob-card-actions{
    display:flex;
    align-items:center;
    justify-content:flex-start;
    gap:4px;
    padding:10px 0 0;
    margin-top:8px;
    border-top:1px solid var(--b) !important;
    overflow-x:auto;
    scrollbar-width:none;
    -webkit-overflow-scrolling:touch;
  }
  .tw table:not([data-no-mobile-cards]) td.mob-card-actions::-webkit-scrollbar{display:none;}
  .tw table:not([data-no-mobile-cards]) td.mob-card-actions > div{
    display:flex;
    gap:6px;
    align-items:center;
    flex-wrap:nowrap;
  }
  .tw table:not([data-no-mobile-cards]) td.mob-card-actions button,
  .tw table:not([data-no-mobile-cards]) td.mob-card-actions .btn{
    min-height:34px;
    padding:0 12px;
    font-size:12px;
    border-radius:8px;
    flex-shrink:0;
    white-space:nowrap;
  }
}

/* ── Bottom navigation bar (≤ 640px) ──────────────────────────── */
/* Fixed 56px bar with 5 thumb-reachable items. The active item
   tracks window._currentPage via _updateBottomNavActive() in core.js,
   called from the patched nav() function. The "More" item opens the
   side drawer (toggleMobileSidebar) so every other module stays
   reachable through the sidebar list. */
/* [M5 visual refresh 2026-05-25] iOS-style bottom nav — frosted glass
   background, soft top hairline, active item rises with a tinted pill
   under the icon (replaces the M2 underline). */
.bottom-nav{
  display:none;
  position:fixed;
  bottom:0;
  left:0;
  right:0;
  height:58px;
  background:rgba(18,24,38,0.85);
  -webkit-backdrop-filter:saturate(180%) blur(20px);
  backdrop-filter:saturate(180%) blur(20px);
  border-top:1px solid rgba(255,255,255,0.06);
  z-index:900;
  padding-bottom:env(safe-area-inset-bottom, 0);
}
[data-theme="light"] .bottom-nav{
  background:rgba(255,255,255,0.85);
  border-top-color:rgba(0,0,0,0.08);
}
.bn-item{
  flex:1;
  display:flex;
  flex-direction:column;
  align-items:center;
  justify-content:center;
  gap:3px;
  background:none;
  border:none;
  color:var(--tx2);
  cursor:pointer;
  font-family:inherit;
  padding:8px 4px 6px;
  position:relative;
  -webkit-tap-highlight-color:transparent;
  transition:color 0.15s ease;
}
.bn-item:active{transform:scale(0.96);}
.bn-item.on{color:var(--blue);}
.bn-i{
  font-size:22px;
  line-height:1;
  position:relative;
  z-index:1;
  transition:transform 0.18s cubic-bezier(.2,.9,.3,1.2);
}
.bn-item.on .bn-i{transform:translateY(-1px);}
/* Active pill behind the icon */
.bn-item.on::before{
  content:'';
  position:absolute;
  top:5px;
  left:50%;
  transform:translateX(-50%);
  width:38px;
  height:26px;
  background:rgba(77,138,255,0.15);
  border-radius:13px;
  z-index:0;
}
.bn-l{
  font-size:10px;
  line-height:1.1;
  font-weight:500;
  letter-spacing:0.1px;
  position:relative;
  z-index:1;
}
.bn-badge{
  position:absolute;
  top:3px;
  right:calc(50% - 22px);
  background:var(--red);
  color:#fff;
  font-size:9px;
  font-weight:700;
  padding:2px 5px;
  border-radius:9px;
  min-width:16px;
  text-align:center;
  line-height:1.2;
  box-shadow:0 0 0 2px rgba(18,24,38,0.85);
  z-index:2;
}
[data-theme="light"] .bn-badge{box-shadow:0 0 0 2px rgba(255,255,255,0.85);}

@media (max-width:640px){
  .bottom-nav{display:flex;}
  /* Reserve space at the bottom of the scrolling content so the bar
     never overlaps page content. The drawer + backdrop stay above
     the bar (z-index:998/999) so navigation always works. */
  .content{padding-bottom:62px;}
  /* Push the user menu dropdown above the bar so it stays usable */
  .user-menu{max-height:calc(100vh - 130px);overflow-y:auto;}
}

/* ── Pull-to-refresh indicator ────────────────────────────────── */
/* The PTR engine in canavia-core.js attaches to #content. On phones
   with scrollTop=0, dragging down past 70px and releasing fires the
   current page's refresh function (see _ptrRefresh map). The
   indicator is positioned at the top center of the viewport. */
.ptr-indicator{
  position:fixed;
  top:64px;
  left:50%;
  width:38px;
  height:38px;
  border-radius:50%;
  background:var(--bg2);
  border:1px solid var(--b);
  display:none;
  align-items:center;
  justify-content:center;
  color:var(--tx2);
  font-size:18px;
  z-index:500;
  box-shadow:0 2px 12px rgba(0,0,0,0.25);
  transform:translateX(-50%) translateY(-60px);
  transition:transform 0.18s ease, opacity 0.18s ease;
  opacity:0;
  pointer-events:none;
}
.ptr-indicator.visible{display:flex;opacity:1;}
.ptr-indicator.ready{color:var(--blue);border-color:var(--blue);}
.ptr-indicator.refreshing{
  color:var(--blue);
  border-color:var(--blue);
  animation:ptr-spin 0.8s linear infinite;
}
.ptr-arrow{transition:transform 0.18s ease;display:inline-block;}
.ptr-indicator.ready .ptr-arrow{transform:rotate(180deg);}
.ptr-indicator.refreshing .ptr-arrow{display:none;}
.ptr-indicator.refreshing::before{content:'↻';font-size:20px;}

@keyframes ptr-spin{
  from{transform:translateX(-50%) translateY(0) rotate(0);}
  to{transform:translateX(-50%) translateY(0) rotate(360deg);}
}

/* Disable on desktop — touch handlers also guard against this */
@media (min-width:641px){
  .ptr-indicator{display:none !important;}
}

/* ─── [MT-PHASE-MOBILE-M3 2026-05-25] PWA polish ──────────────────── */

/* [M5 visual refresh] Install banner — iOS Smart App Banner style.
   App icon left, app name + tagline middle, install CTA right. Sits
   above the bottom nav so it doesn't block content. */
.install-banner{
  position:fixed;
  bottom:72px;
  left:10px;
  right:10px;
  background:rgba(18,24,38,0.95);
  -webkit-backdrop-filter:blur(20px);
  backdrop-filter:blur(20px);
  border:1px solid rgba(255,255,255,0.08);
  border-radius:14px;
  padding:10px 12px 10px 10px;
  display:flex;
  align-items:center;
  gap:11px;
  z-index:850;
  box-shadow:0 8px 32px rgba(0,0,0,0.45);
  animation:install-slide-up 0.36s cubic-bezier(.2,.9,.3,1.2);
}
[data-theme="light"] .install-banner{
  background:rgba(255,255,255,0.96);
  border-color:rgba(0,0,0,0.08);
  box-shadow:0 8px 32px rgba(0,0,0,0.18);
}
.ib-i{
  display:flex;
  align-items:center;
  justify-content:center;
  width:42px;
  height:42px;
  border-radius:10px;
  background:linear-gradient(135deg, #2563eb 0%, #4d8aff 100%);
  font-size:0;
  flex-shrink:0;
  background-image:url('/icons/icon-192.png');
  background-size:cover;
  background-position:center;
  box-shadow:0 2px 6px rgba(37,99,235,0.4);
}
.ib-body{flex:1;display:flex;flex-direction:column;gap:1px;min-width:0;}
.ib-t{
  font-size:13px;
  font-weight:600;
  color:var(--tx);
  line-height:1.2;
}
.ib-sub{
  font-size:11px;
  color:var(--tx3);
  line-height:1.2;
}
.ib-yes{
  background:var(--blue);
  color:#fff;
  border:none;
  padding:8px 14px;
  border-radius:18px;
  font-size:12px;
  font-weight:600;
  cursor:pointer;
  font-family:inherit;
  letter-spacing:0.2px;
  flex-shrink:0;
  -webkit-tap-highlight-color:transparent;
}
.ib-yes:active{transform:scale(0.95);}
.ib-no{
  background:transparent;
  border:none;
  color:var(--tx3);
  font-size:16px;
  cursor:pointer;
  padding:6px 4px 6px 0;
  line-height:1;
  flex-shrink:0;
}
@keyframes install-slide-up{
  from{transform:translateY(80px);opacity:0;}
  to{transform:translateY(0);opacity:1;}
}
@media (min-width:641px){
  .install-banner{display:none !important;}
}

/* [M5 visual refresh] Discreet offline pill — sits just below the
   topbar instead of pushing it down. Less screaming than a full
   amber bar, still clearly visible. */
.offline-banner{
  position:fixed;
  top:14px;
  left:50%;
  transform:translateX(-50%);
  background:var(--bg2);
  border:1px solid var(--amber);
  color:var(--amber);
  padding:6px 14px 6px 11px;
  font-size:12px;
  font-weight:600;
  z-index:990;
  display:inline-flex;
  align-items:center;
  gap:8px;
  border-radius:18px;
  box-shadow:0 4px 16px rgba(0,0,0,0.25);
  animation:offline-pill-in 0.3s cubic-bezier(.2,.9,.3,1.2);
  letter-spacing:0.1px;
  max-width:calc(100vw - 24px);
}
.ob-d{
  width:7px;
  height:7px;
  border-radius:50%;
  background:var(--amber);
  animation:ob-pulse 1.6s ease-in-out infinite;
  flex-shrink:0;
}
@keyframes offline-pill-in{
  from{transform:translateX(-50%) translateY(-20px) scale(0.9);opacity:0;}
  to{transform:translateX(-50%) translateY(0) scale(1);opacity:1;}
}
@keyframes ob-pulse{
  0%,100%{opacity:1;transform:scale(1);}
  50%{opacity:0.4;transform:scale(0.85);}
}
@media (max-width:640px){
  .offline-banner{top:auto;bottom:74px;}  /* float above the bottom nav */
}
/* Topbar no longer needs to move — the pill sits in its own layer */

/* [M5 visual refresh] iOS-style bottom-sheet modal on phones.
   The modal anchors to the bottom of the viewport with rounded top
   corners; the swipe-handle is a slim pill above the header. The
   shell uses backdrop-filter so the page behind blurs subtly
   instead of being completely flat-dimmed. */
@media (max-width:640px){
  .mo-ov{
    align-items:flex-end;
    padding:0;
    background:rgba(0,0,0,0.5);
    -webkit-backdrop-filter:blur(6px);
    backdrop-filter:blur(6px);
  }
  .mo-c{
    max-width:100% !important;
    max-height:88vh !important;
    width:100%;
    border-radius:18px 18px 0 0;
    will-change:transform, opacity;
    animation:mo-sheet-up 0.32s cubic-bezier(.2,.9,.3,1.25);
  }
  @keyframes mo-sheet-up{
    from{transform:translateY(40px);opacity:0;}
    to{transform:translateY(0);opacity:1;}
  }
  .mo-h{
    cursor:grab;
    position:relative;
    touch-action:pan-y;
    padding-top:20px;
    padding-bottom:14px;
    border-radius:18px 18px 0 0;
    background:linear-gradient(180deg, var(--bg2) 0%, var(--bg2) 70%, transparent 100%);
  }
  /* Subtle slim grip — iOS bottom-sheet signature */
  .mo-h::before{
    content:'';
    position:absolute;
    top:8px;
    left:50%;
    transform:translateX(-50%);
    width:38px;
    height:4px;
    border-radius:2px;
    background:var(--tx3);
    opacity:0.45;
  }
  .mo-h .mo-x{
    width:34px;height:34px;
    border-radius:50%;
    background:var(--bg3);
    color:var(--tx2);
    border:none;
    font-size:16px;
  }
}

/* ─── [MT-PHASE-MOBILE-M4 2026-05-25] Background sync + context menu ── */

/* [M5 visual refresh] iOS-style context menu — full-bleed scrim
   behind the menu, spring pop, frosted-glass surface, soft inset
   separators. The scrim catches outside taps so we don't need the
   capture-click listener anymore. */
.ctx-scrim{
  position:fixed;
  inset:0;
  background:rgba(0,0,0,0.35);
  -webkit-backdrop-filter:blur(3px);
  backdrop-filter:blur(3px);
  z-index:949;
  animation:ctx-scrim-in 0.18s ease;
}
@keyframes ctx-scrim-in{from{opacity:0;} to{opacity:1;}}
.ctx-menu{
  position:fixed;
  background:rgba(28,36,52,0.92);
  -webkit-backdrop-filter:saturate(180%) blur(24px);
  backdrop-filter:saturate(180%) blur(24px);
  border:1px solid rgba(255,255,255,0.08);
  border-radius:14px;
  box-shadow:0 16px 48px rgba(0,0,0,0.55);
  min-width:230px;
  max-width:280px;
  padding:5px 0;
  z-index:950;
  animation:ctx-pop 0.22s cubic-bezier(.2,.9,.3,1.3);
  overflow:hidden;
  transform-origin:top left;
}
[data-theme="light"] .ctx-menu{
  background:rgba(255,255,255,0.95);
  border-color:rgba(0,0,0,0.08);
  box-shadow:0 16px 48px rgba(0,0,0,0.25);
}
.ctx-header{
  padding:10px 16px 8px;
  font-size:11px;
  text-transform:uppercase;
  letter-spacing:0.5px;
  color:var(--tx3);
  font-weight:600;
  border-bottom:1px solid rgba(255,255,255,0.06);
  background:transparent;
}
[data-theme="light"] .ctx-header{border-bottom-color:rgba(0,0,0,0.06);}
.ctx-item{
  display:flex;
  align-items:center;
  gap:10px;
  width:100%;
  padding:12px 16px;
  text-align:left;
  background:transparent;
  border:none;
  color:var(--tx);
  font-size:15px;
  font-weight:500;
  cursor:pointer;
  font-family:inherit;
  -webkit-tap-highlight-color:transparent;
  transition:background-color 0.08s;
  position:relative;
}
.ctx-item + .ctx-item{
  box-shadow:inset 0 1px 0 rgba(255,255,255,0.04);
}
[data-theme="light"] .ctx-item + .ctx-item{
  box-shadow:inset 0 1px 0 rgba(0,0,0,0.06);
}
.ctx-item:active{background:rgba(255,255,255,0.06);}
[data-theme="light"] .ctx-item:active{background:rgba(0,0,0,0.05);}
.ctx-item.danger{color:var(--red);}
@keyframes ctx-pop{
  from{opacity:0;transform:scale(0.88) translateY(-4px);}
  60%{opacity:1;}
  to{opacity:1;transform:scale(1) translateY(0);}
}
@media (min-width:641px){
  .ctx-menu, .ctx-scrim{display:none !important;}
}

/* [M5 visual refresh] Discreet cached-data hint — small pill that
   sits under the topbar (or floats above the bottom-nav on phones),
   neutral colours, just enough to signal "data is fresh-ish" without
   demanding attention. */
.cached-pill{
  position:fixed;
  top:14px;
  right:14px;
  background:rgba(28,36,52,0.85);
  -webkit-backdrop-filter:blur(12px);
  backdrop-filter:blur(12px);
  color:var(--tx2);
  border:1px solid rgba(255,255,255,0.08);
  border-radius:12px;
  padding:5px 11px 5px 9px;
  font-size:11px;
  font-weight:500;
  z-index:880;
  display:inline-flex;
  align-items:center;
  gap:6px;
  box-shadow:0 4px 12px rgba(0,0,0,0.2);
  animation:cached-pill-in 0.28s cubic-bezier(.2,.9,.3,1.2);
  pointer-events:none;
  letter-spacing:0.1px;
}
[data-theme="light"] .cached-pill{
  background:rgba(255,255,255,0.95);
  color:var(--tx2);
  border-color:rgba(0,0,0,0.08);
}
.cached-pill span{font-size:11px;}
@keyframes cached-pill-in{
  from{opacity:0;transform:translateY(-6px) scale(0.95);}
  to{opacity:1;transform:translateY(0) scale(1);}
}
@media (max-width:640px){
  .cached-pill{top:auto;bottom:130px;right:10px;}
}
body.is-offline .cached-pill{display:none;}

/* Bottom-nav badge variant for the More item — amber pending count.
   The badge is itself a tap target — touching it opens the pending-sync
   panel (handled by canavia-core.js). */
.bn-queue-badge{
  background:var(--amber) !important;
  right:calc(50% - 22px) !important;
  pointer-events:auto;
  cursor:pointer;
}

/* [M5] Conflict-resolution sheet — bottom sheet with proper polish.
   Renders for 409/422/403/400 from drain. Also used by the pending-sync
   panel which lists every queued mutation. */
.conflict-sheet{
  position:fixed;
  inset:0;
  background:rgba(0,0,0,0.55);
  -webkit-backdrop-filter:blur(6px);
  backdrop-filter:blur(6px);
  z-index:960;
  display:flex;
  align-items:flex-end;
  justify-content:center;
  animation:cs-fade-in 0.2s ease;
}
@keyframes cs-fade-in{from{opacity:0;} to{opacity:1;}}
.conflict-sheet.cs-closing{animation:cs-fade-out 0.2s ease forwards;}
@keyframes cs-fade-out{from{opacity:1;} to{opacity:0;}}
.conflict-sheet .cs-card{
  background:var(--bg2);
  width:100%;
  max-width:480px;
  border-radius:18px 18px 0 0;
  padding:8px 0 24px;
  animation:cs-sheet-up 0.34s cubic-bezier(.2,.9,.3,1.25);
  box-shadow:0 -8px 32px rgba(0,0,0,0.5);
  max-height:80vh;
  overflow-y:auto;
}
@media (min-width:641px){
  .conflict-sheet{align-items:center;}
  .conflict-sheet .cs-card{border-radius:18px;margin:20px;}
}
@keyframes cs-sheet-up{
  from{transform:translateY(60px);opacity:0;}
  to{transform:translateY(0);opacity:1;}
}
.cs-grip{
  width:38px;
  height:4px;
  border-radius:2px;
  background:var(--tx3);
  opacity:0.45;
  margin:0 auto 12px;
}
.cs-header{
  display:flex;
  align-items:center;
  gap:10px;
  padding:6px 20px 14px;
}
.cs-i{font-size:20px;color:var(--amber);flex-shrink:0;}
.cs-htitle{
  font-size:16px;
  font-weight:600;
  color:var(--tx);
  flex:1;
}
.cs-close{
  background:var(--bg3);
  border:none;
  width:30px;
  height:30px;
  border-radius:50%;
  color:var(--tx2);
  font-size:13px;
  cursor:pointer;
  flex-shrink:0;
}
.cs-body{padding:0 20px 16px;}
.cs-reason{
  font-size:14px;
  color:var(--tx);
  background:rgba(245,166,35,0.1);
  border:1px solid rgba(245,166,35,0.25);
  border-radius:10px;
  padding:12px 14px;
  margin-bottom:14px;
  line-height:1.45;
}
.cs-detail{
  background:var(--bg3);
  border-radius:10px;
  padding:4px 12px;
}
.cs-d-row{
  display:flex;
  justify-content:space-between;
  align-items:center;
  padding:9px 0;
  font-size:12px;
}
.cs-d-row + .cs-d-row{border-top:1px solid var(--b);}
.cs-d-l{color:var(--tx3);font-weight:500;text-transform:uppercase;letter-spacing:0.3px;font-size:10px;}
.cs-d-v{color:var(--tx);font-family:'IBM Plex Mono',monospace;font-size:12px;max-width:60%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.cs-actions{
  display:flex;
  gap:8px;
  padding:8px 20px 0;
  border-top:1px solid var(--b);
  padding-top:16px;
  flex-wrap:wrap;
}
.cs-btn{
  flex:1;
  min-height:44px;
  border:none;
  border-radius:10px;
  font-size:14px;
  font-weight:600;
  cursor:pointer;
  font-family:inherit;
  -webkit-tap-highlight-color:transparent;
  padding:0 12px;
  transition:transform 0.1s;
  min-width:90px;
}
.cs-btn:active{transform:scale(0.97);}
.cs-btn-primary{background:var(--blue);color:#fff;}
.cs-btn-secondary{background:var(--bg3);color:var(--tx);border:1px solid var(--b);}
.cs-btn-secondary:first-child{color:var(--red);}  /* discard = destructive */

/* Pending-sync panel — list view, reuses the sheet shell */
.pending-sync .ps-card{padding-bottom:16px;}
.ps-body{padding:0 16px 8px;}
.ps-empty{
  padding:32px 16px;
  text-align:center;
  color:var(--tx3);
  font-size:14px;
}
.ps-row{
  display:flex;
  align-items:center;
  gap:10px;
  padding:12px 12px;
  background:var(--bg3);
  border-radius:10px;
  margin-bottom:6px;
}
.ps-row-main{flex:1;display:flex;flex-direction:column;gap:2px;min-width:0;}
.ps-method{
  display:inline-block;
  font-size:10px;
  font-weight:700;
  padding:2px 6px;
  border-radius:5px;
  background:var(--blue);
  color:#fff;
  margin-right:auto;
  letter-spacing:0.4px;
  width:fit-content;
}
.ps-url{
  font-size:12px;
  font-family:'IBM Plex Mono',monospace;
  color:var(--tx2);
  white-space:nowrap;
  overflow:hidden;
  text-overflow:ellipsis;
  margin-top:3px;
}
.ps-row-meta{display:flex;align-items:center;gap:10px;flex-shrink:0;}
.ps-status{font-size:11px;color:var(--tx3);}
.ps-failed{border-left:3px solid var(--red);}
.ps-failed .ps-status{color:var(--red);}
.ps-syncing{border-left:3px solid var(--blue);}
.ps-pending{border-left:3px solid var(--amber);}
.ps-x{
  background:transparent;
  border:none;
  color:var(--tx3);
  font-size:14px;
  cursor:pointer;
  padding:6px 8px;
}

/* ─── [PERMISSIONS-V2 2026-05-25] Role-permissions matrix ─────────── */
.prm-help{
  display:flex;
  justify-content:space-between;
  align-items:center;
  gap:12px;
  padding:12px 14px;
  background:var(--bg3);
  border:1px solid var(--b);
  border-radius:10px;
  margin-bottom:14px;
  font-size:13px;
  color:var(--tx2);
  line-height:1.45;
  flex-wrap:wrap;
}
.prm-help strong{color:var(--tx);margin-right:6px;}
.prm-matrix-wrap{overflow-x:auto;border:1px solid var(--b);border-radius:10px;background:var(--bg2);}
.prm-matrix{
  width:100%;
  border-collapse:collapse;
  font-size:13px;
}
.prm-matrix th, .prm-matrix td{
  padding:10px 14px;
  border-bottom:1px solid var(--b);
  text-align:left;
  vertical-align:middle;
}
.prm-matrix tbody tr:last-child td{border-bottom:none;}
.prm-head-perm{
  width:40%;
  font-weight:600;
  color:var(--tx2);
  text-transform:uppercase;
  letter-spacing:0.4px;
  font-size:11px;
  background:var(--bg3);
}
.prm-head-role{
  text-align:center !important;
  font-weight:600;
  font-size:11px;
  text-transform:uppercase;
  letter-spacing:0.3px;
  background:var(--bg3);
  white-space:nowrap;
}
.prm-group td{
  font-weight:700;
  color:var(--tx2);
  background:var(--bg);
  padding:6px 14px !important;
  font-size:11px;
  letter-spacing:0.5px;
  text-transform:uppercase;
  border-bottom:1px solid var(--b);
}
.prm-name{font-weight:500;color:var(--tx);}
.prm-key{font-size:13px;}

/* iOS-style toggle switch */
.prm-toggle{
  display:inline-block;
  position:relative;
  width:38px;
  height:22px;
  cursor:pointer;
}
.prm-toggle input{
  position:absolute;
  width:0;
  height:0;
  opacity:0;
}
.prm-slider{
  position:absolute;
  inset:0;
  background:var(--bg4);
  border-radius:11px;
  transition:background-color 0.18s ease;
  border:1px solid var(--b);
}
.prm-slider::before{
  content:'';
  position:absolute;
  left:2px;
  top:2px;
  width:16px;
  height:16px;
  background:var(--tx2);
  border-radius:50%;
  transition:transform 0.18s cubic-bezier(.2,.9,.3,1.2), background-color 0.18s;
  box-shadow:0 1px 2px rgba(0,0,0,0.3);
}
.prm-toggle input:checked + .prm-slider{
  background:var(--blue);
  border-color:var(--blue);
}
.prm-toggle input:checked + .prm-slider::before{
  transform:translateX(16px);
  background:#fff;
}
/* Customized cells get an orange dot — visual cue that this row differs
   from the factory default */
.prm-toggle.prm-override::after{
  content:'';
  position:absolute;
  top:-3px;
  right:-3px;
  width:8px;
  height:8px;
  border-radius:50%;
  background:var(--amber);
  border:1.5px solid var(--bg2);
}

/* Read-only variant (managers, viewers) */
.prm-chip{
  display:inline-flex;
  align-items:center;
  justify-content:center;
  width:26px;
  height:22px;
  border-radius:6px;
  font-size:12px;
  font-weight:600;
}
.prm-chip.prm-on{background:rgba(0,209,128,0.12);color:var(--green);}
.prm-chip.prm-off{background:var(--bg3);color:var(--tx3);}
.prm-chip.prm-override{box-shadow:0 0 0 2px var(--amber);}

.u-pad-loading,.u-pad-error{padding:32px;text-align:center;color:var(--tx3);font-size:14px;}
.u-pad-error{color:var(--red);}

/* Per-user permission overrides — embedded in the user edit modal */
.user-perm-section{
  display:block;
  margin-top:18px;
  padding-top:18px;
  border-top:1px solid var(--b);
}
.user-perm-section > label{
  font-size:12px;
  font-weight:600;
  color:var(--tx);
  text-transform:uppercase;
  letter-spacing:0.4px;
  display:block;
  margin-bottom:10px;
}
.user-perm-host{
  background:var(--bg3);
  border:1px solid var(--b);
  border-radius:10px;
  padding:8px 0;
  max-height:340px;
  overflow-y:auto;
}
.up-help{
  padding:10px 14px 12px;
  font-size:12px;
  color:var(--tx2);
  line-height:1.45;
  border-bottom:1px solid var(--b);
  background:var(--bg2);
}
.up-group-h{
  padding:8px 14px 4px;
  font-size:10px;
  font-weight:700;
  color:var(--tx3);
  text-transform:uppercase;
  letter-spacing:0.5px;
  margin-top:4px;
}
.up-row{
  display:flex;
  align-items:center;
  justify-content:space-between;
  padding:8px 14px;
  gap:14px;
}
.up-row + .up-row{border-top:1px solid var(--b);}
.up-row-label{
  flex:1;
  display:flex;
  flex-direction:column;
  gap:2px;
  min-width:0;
}
.up-row-name{
  font-size:13px;
  color:var(--tx);
  font-weight:500;
}
.up-row-hint{
  font-size:10px;
  color:var(--tx3);
  text-transform:uppercase;
  letter-spacing:0.4px;
}

/* ─── [GROUND-FLEET-V1 2026-05-25] Vehicle detail blocks ──────────── */
.gf-vehicle-meta{
  display:grid;
  grid-template-columns:repeat(auto-fit, minmax(120px, 1fr));
  gap:10px 16px;
  background:var(--bg3);
  border-radius:8px;
  padding:12px 14px;
  margin-bottom:14px;
  font-size:13px;
}
.gf-vehicle-meta > div > span:first-child{
  font-size:10px;
  text-transform:uppercase;
  letter-spacing:0.3px;
  font-weight:600;
}
.gf-vehicle-meta > div > div{
  font-weight:500;
  color:var(--tx);
  margin-top:2px;
}
.gf-block{
  border:1px solid var(--b);
  border-radius:8px;
  margin-bottom:12px;
  background:var(--bg2);
  overflow:hidden;
}
.gf-block-h{
  display:flex;
  justify-content:space-between;
  align-items:center;
  padding:10px 14px;
  background:var(--bg3);
  border-bottom:1px solid var(--b);
  font-weight:600;
  font-size:13px;
}
.gf-row{
  display:flex;
  justify-content:space-between;
  align-items:flex-start;
  padding:10px 14px;
  gap:10px;
  font-size:13px;
}
.gf-row + .gf-row{border-top:1px solid var(--b);}
.gf-empty{
  padding:14px;
  text-align:center;
  color:var(--tx3);
  font-size:12px;
  font-style:italic;
}
.gf-filter-row{
  display:flex;
  gap:10px;
  margin-bottom:12px;
  align-items:center;
  flex-wrap:wrap;
}
.gf-filter-row select,
.gf-filter-row input[type="search"],
.gf-filter-row input[type="text"]{
  background:var(--bg3);
  border:1px solid var(--b);
  border-radius:6px;
  color:var(--tx);
  padding:7px 10px;
  font-size:13px;
  font-family:inherit;
  min-width:160px;
}
.gf-filter-row input[type="search"]{flex:1;max-width:320px;}
.gf-filter-row select:focus,
.gf-filter-row input:focus{outline:none;border-color:var(--blue);}

/* Sub-tabs inside the Vehicles tab — pill row above the table */
.gf-subtabs{
  display:flex;
  gap:6px;
  margin-bottom:12px;
  padding-bottom:8px;
  border-bottom:1px solid var(--b);
  overflow-x:auto;
}
.gf-subtab{
  padding:8px 14px;
  background:var(--bg3);
  border:1px solid var(--b);
  border-radius:8px;
  font-size:12px;
  font-weight:600;
  color:var(--tx2);
  cursor:pointer;
  white-space:nowrap;
  transition:all 0.12s ease;
  display:inline-flex;
  align-items:center;
  gap:6px;
}
.gf-subtab:hover{background:var(--bg4);color:var(--tx);}
.gf-subtab.on{
  background:rgba(77,138,255,0.15);
  border-color:var(--blue);
  color:var(--blue);
}
.gf-subc{
  display:inline-block;
  background:var(--bg2);
  padding:1px 7px;
  border-radius:8px;
  font-size:10px;
  color:var(--tx3);
  font-weight:500;
}
.gf-subtab.on .gf-subc{background:rgba(77,138,255,0.2);color:var(--blue);}

/* Wide tables (Airport access has 14 cols) — let horizontal scroll work */
.gf-wide-table{min-width:1400px;font-size:12px;}
.gf-wide-table th, .gf-wide-table td{padding:6px 8px;white-space:nowrap;}

/* Section separator inside the Bases tab */
.gf-hr{border:none;border-top:1px solid var(--b);margin:24px 0 0;}

/* Document attachment link — small 📎 icon, hover reveals filename */
.gf-doc-link{
  display:inline-flex;
  align-items:center;
  justify-content:center;
  width:22px;
  height:22px;
  border-radius:5px;
  background:rgba(77,138,255,0.12);
  color:var(--blue);
  text-decoration:none;
  font-size:13px;
  margin-left:4px;
  transition:background 0.12s;
}
.gf-doc-link:hover{background:rgba(77,138,255,0.25);}

/* [GROUND-FLEET-V5] Per-record document strip — renders below the
   main row of a sub-record (service / permit / insurance), with the
   filename + View / Replace / Remove buttons. */
.gf-row-stacked{flex-direction:column;align-items:stretch;}
.gf-row-stacked .gf-row-main{
  display:flex;
  justify-content:space-between;
  align-items:flex-start;
  gap:10px;
}
.gf-doc-strip{
  display:flex;
  align-items:center;
  gap:10px;
  margin-top:8px;
  padding:6px 10px;
  background:var(--bg3);
  border-radius:6px;
  border:1px solid var(--b);
  font-size:11px;
  flex-wrap:wrap;
}
.gf-doc-strip-empty{
  background:transparent;
  border:1px dashed var(--b);
  color:var(--tx3);
}
.gf-doc-name{
  color:var(--tx);
  font-family:'IBM Plex Mono',monospace;
  flex:1;
  min-width:0;
  overflow:hidden;
  text-overflow:ellipsis;
  white-space:nowrap;
}
.gf-doc-name-empty{
  color:var(--tx3);
  font-style:italic;
  flex:1;
}
.gf-doc-act{
  background:transparent;
  border:1px solid var(--b);
  color:var(--blue);
  border-radius:4px;
  padding:3px 9px;
  font-size:11px;
  font-weight:500;
  cursor:pointer;
  text-decoration:none;
  font-family:inherit;
}
.gf-doc-act:hover{background:rgba(77,138,255,0.10);}
.gf-doc-act-danger{color:var(--red);}
.gf-doc-act-danger:hover{background:rgba(255,77,77,0.10);}

/* Manage-document modal — opens from the 📎 / +📎 click */
.gf-doc-modal-body{padding:8px 0;}
.gf-doc-modal-file{font-size:14px;color:var(--tx);word-break:break-all;margin-bottom:6px;}
.gf-doc-modal-empty{font-size:13px;color:var(--tx3);font-style:italic;text-align:center;padding:16px 0;}
.gf-doc-modal-actions{display:flex;gap:8px;margin-top:14px;flex-wrap:wrap;}
.gf-doc-modal-actions .btn{flex:1;min-width:120px;}

/* Inline upload button — appears on rows that don't have a doc yet */
.gf-doc-upload{
  display:inline-flex;
  align-items:center;
  justify-content:center;
  width:22px;
  height:22px;
  border-radius:5px;
  background:var(--bg4);
  color:var(--tx3);
  border:1px dashed var(--b);
  font-size:12px;
  margin-left:4px;
  cursor:pointer;
  font-family:inherit;
  transition:all 0.12s;
}
.gf-doc-upload:hover{background:var(--bg3);color:var(--tx2);border-style:solid;border-color:var(--blue);}

/* File input styling — make it visible against dark theme */
.fi input[type="file"]{
  color:var(--tx);
  background:var(--bg3);
  padding:7px 10px;
  border:1px dashed var(--b);
  border-radius:6px;
  font-family:inherit;
  font-size:12px;
  width:100%;
  cursor:pointer;
}
.fi input[type="file"]::file-selector-button{
  background:var(--blue);
  color:#fff;
  border:none;
  padding:6px 12px;
  border-radius:4px;
  margin-right:10px;
  cursor:pointer;
  font-size:12px;
  font-weight:600;
  font-family:inherit;
}
.fi input[type="file"]:hover{border-color:var(--blue);}

/* [AUDIT-PLAN-V1 2026-05-31] Annual Audit Plan rows */
.qa-plan-row{display:flex;align-items:center;gap:12px;padding:8px 6px;border-bottom:1px solid var(--b);flex-wrap:nowrap;}
.qa-plan-mon{min-width:40px;}
.qa-plan-code{min-width:55px;}
.qa-plan-area{flex:1 1 auto;min-width:0;}
.qa-plan-date{background:var(--bg2);border:1px solid var(--b);color:var(--tx);padding:3px 6px;border-radius:4px;font-size:11px;min-width:130px;}
.qa-plan-bdg{min-width:90px;text-align:center;}
.qa-plan-trail{min-width:90px;text-align:right;}
.u-row-overdue{background:rgba(244,67,54,0.05);}
