  :root{
    --bg:#F3F4F7;
    --panel:#FFFFFF;
    --ink:#1B2130;
    --ink-soft:#606A7A;
    --line:#E3E6EB;
    --line-strong:#C7CCD6;
    --navy:#1B2A44;
    --navy-dark:#0E1A30;
    --navy-light:#EBEFF6;
    --navy-2:#24365A;
    --accent:#3E6FD9;
    --accent-dark:#2F58B3;
    --slate:#5B6472;
    --red:#C0392B;
    --red-bg:#FBEAE7;
    --amber:#8F6407;
    --amber-bg:#FBF0DA;
    --green:#227A4E;
    --green-bg:#E3F3E9;
    --blue:#2A5185;
    --blue-bg:#E3E9F3;
    --purple:#6B4FA0;
    --purple-bg:#F1ECF8;
    --gray-bg:#EEF0F3;
    /* Surface tints — barely-there panel/row washes. Consolidated from
       #FAFBFC / #F7F9FC / #F0F2F6 (row hover) and #F3F5F8 / #F9FAFB
       (sunk panels); all sat within ~3-6/255 of each other. */
    --row-hover:#F7F9FC;
    --surface-sunk:#F3F5F8;
    /* Text ramp for dark (navy) surfaces — sidebar, banners, modal heads.
       Tokenised at their current values so a later contrast bump is a
       one-line change here rather than a sweep. */
    --on-navy:#C3CBDA;
    --on-navy-soft:#9FB0CC;
    --on-navy-dim:#8EA0BE;
    /* Extra navy gradient stop shared by .page-banner / .um-head / .fp-head. */
    --navy-3:#1E2C46;
    /* Checklist "topic" bar — deliberately off the semantic palette
       (it's a section divider inside the fill-in form, not a status). */
    --checklist-topic-bg:#D9D24A;
    --checklist-topic-ink:#2B2A12;

    /* Radius + elevation. These are the FINAL values — earlier passes of the
       sheet defined --radius:10px / softer shadows and then a later :root
       overrode them; that override is now folded in here so there is one
       source of truth. */
    --radius:12px;
    --radius-sm:9px;
    --shadow:0 1px 2px rgba(15,22,40,0.05), 0 1px 1px rgba(15,22,40,0.03);
    --shadow-hover:0 10px 24px rgba(15,22,40,0.09), 0 2px 6px rgba(15,22,40,0.05);
    --shadow-lg:0 24px 48px rgba(10,15,28,0.16), 0 6px 16px rgba(10,15,28,0.08);

    /* Motion easings (were a separate :root under "MOTION LAYER"). */
    --ease-out:cubic-bezier(0.23, 1, 0.32, 1);
    --ease-in-out:cubic-bezier(0.77, 0, 0.175, 1);

    /* 4px spacing scale (was a separate :root under "REDESIGN PASS"). */
    --sp-1:4px; --sp-2:8px; --sp-3:12px; --sp-4:16px; --sp-5:20px; --sp-6:24px; --sp-7:32px; --sp-8:40px;
    /* Type scale — the ONLY set of font sizes the app uses. Every rule below
       references one of these tokens; no raw px font-size anywhere in the
       sheet. --fs-2xs is the floor and is reserved for uppercase,
       letter-spaced micro-labels (eyebrows, table headers, badges); nothing
       set in sentence case should go below --fs-xs. */
    --fs-2xs:10px;   /* was 8-10.5px: badges, eyebrows, table th, meta */
    --fs-xs:11px;    /* was 11-11.5px: secondary text, hints, captions */
    --fs-sm:12px;    /* was 12-12.5px: dense body — rows, table cells */
    --fs-base:13px;  /* was 13-13.5px: default body, buttons, inputs */
    --fs-md:15px;    /* was 14-15px: emphasised body, card/list titles */
    --fs-lg:18px;    /* was 16-18px: page/section/modal titles */
    --fs-xl:22px;    /* was 19-23px: banner + dashboard headlines */
    --fs-2xl:28px;   /* was 24-28px: KPI numbers */
    --fs-3xl:34px;   /* login hero headline only */
  }
  *{box-sizing:border-box;}
  html,body{margin:0;padding:0;height:100%;background:var(--bg);color:var(--ink);font-family:'Inter',sans-serif;-webkit-font-smoothing:antialiased;color-scheme:light;}
  .app{max-width:1160px;margin:0 auto;padding:0 24px 90px;}

  /* Shell layout — horizontal top nav */
  .shell{display:flex;flex-direction:column;min-height:100vh;}
  .sidebar{width:100%;flex-shrink:0;background:var(--navy);color:#fff;display:flex;align-items:center;position:sticky;top:0;z-index:200;padding:0 20px;height:60px;box-sizing:border-box;}
  .sidebar-header{display:flex;align-items:center;gap:10px;padding-right:22px;margin-right:16px;border-right:1px solid rgba(255,255,255,0.12);flex-shrink:0;}
  .sidebar-logo{width:30px;height:30px;object-fit:contain;flex-shrink:0;}
  .sidebar-title{font-family:'IBM Plex Sans',sans-serif;font-weight:700;font-size:var(--fs-base);letter-spacing:0.4px;line-height:1.3;}
  .sidebar-sub{font-size:var(--fs-2xs);color:var(--on-navy-soft);line-height:1.3;}
  .sidebar-nav{position:relative;flex:1;min-width:0;display:flex;align-items:center;gap:2px;height:100%;}
  .nav-item{display:flex;align-items:center;gap:8px;padding:8px 12px;cursor:pointer;color:var(--on-navy);font-size:var(--fs-base);font-weight:600;border-radius:8px;white-space:nowrap;}
  .nav-item:hover{background:rgba(255,255,255,0.06);color:#fff;}
  .nav-item.active{background:rgba(255,255,255,0.12);color:#fff;}
  .nav-item .nav-label{min-width:0;}
  .nav-chevron{width:12px;height:12px;flex-shrink:0;opacity:0.55;transition:transform .18s;}
  .nav-item.expanded .nav-chevron{transform:rotate(180deg);}
  .nav-group{position:relative;}
  .nav-subgroup{position:absolute;top:calc(100% + 10px);left:0;min-width:200px;background:var(--navy-2);border:1px solid rgba(255,255,255,0.1);border-radius:12px;box-shadow:0 16px 40px rgba(5,8,16,0.45), 0 2px 8px rgba(5,8,16,0.3);padding:7px;opacity:0;visibility:hidden;transform:translateY(-8px) scale(0.97);transform-origin:top left;transition:opacity .16s ease, transform .16s ease, visibility 0s linear .16s;z-index:150;}
  .nav-subgroup.open{opacity:1;visibility:visible;transform:translateY(0) scale(1);transition:opacity .16s ease, transform .16s ease;}
  .nav-subgroup::before{content:'';position:absolute;top:-6px;left:22px;width:12px;height:12px;background:var(--navy-2);border-left:1px solid rgba(255,255,255,0.1);border-top:1px solid rgba(255,255,255,0.1);transform:rotate(45deg);border-radius:2px 0 0 0;}
  .nav-subitem{display:block;padding:9px 14px;font-size:var(--fs-sm);font-weight:500;color:var(--on-navy);cursor:pointer;border-radius:8px;white-space:nowrap;}
  .nav-subitem:hover{background:rgba(255,255,255,0.08);color:#fff;}
  .nav-subitem.active{background:rgba(90,140,230,0.22);color:#fff;font-weight:600;}

  /* A nav-subitem that reveals a second-level flyout on hover instead of
     navigating itself - e.g. QA's "Sites Visits" grouping Sites Check and
     Check List. Positioned beside (not below) the subgroup panel it lives
     in, matching how the subgroup itself opens beside the top-level nav. */
  .nav-subitem.nav-flyout-trigger{position:relative;display:flex;align-items:center;justify-content:space-between;gap:10px;}
  .nav-flyout-arrow{font-size:var(--fs-2xs);opacity:0.55;flex-shrink:0;transition:opacity .12s ease;}
  .nav-subitem.nav-flyout-trigger:hover .nav-flyout-arrow,
  .nav-subitem.nav-flyout-trigger.active .nav-flyout-arrow{opacity:0.9;}
  .nav-flyout{
    position:absolute;top:-7px;left:calc(100% + 10px);min-width:180px;
    background:var(--navy-2);border:1px solid rgba(255,255,255,0.1);border-radius:12px;
    box-shadow:0 16px 40px rgba(5,8,16,0.45), 0 2px 8px rgba(5,8,16,0.3);
    padding:7px;opacity:0;visibility:hidden;transform:translateX(-6px);
    transition:opacity .14s ease, transform .14s ease, visibility 0s linear .14s;
    z-index:160;
  }
  .nav-subitem.nav-flyout-trigger:hover .nav-flyout,
  .nav-subitem.nav-flyout-trigger:focus-within .nav-flyout,
  .nav-subitem.nav-flyout-trigger.open .nav-flyout{
    opacity:1;visibility:visible;transform:translateX(0);
    transition:opacity .14s ease, transform .14s ease;
  }
  .nav-flyout::before{
    content:'';position:absolute;top:14px;left:-6px;width:12px;height:12px;
    background:var(--navy-2);border-left:1px solid rgba(255,255,255,0.1);border-bottom:1px solid rgba(255,255,255,0.1);
    transform:rotate(45deg);border-radius:0 0 0 2px;
  }
  .nav-icon{width:16px;height:16px;flex-shrink:0;}
  #topnavIndicator{position:absolute;left:0;bottom:0;height:2px;border-radius:2px;background:linear-gradient(90deg, var(--accent), #8fb4ff);box-shadow:0 0 10px rgba(90,140,230,0.7);transition:transform .32s cubic-bezier(.4,0,.2,1), width .32s cubic-bezier(.4,0,.2,1), opacity .2s;opacity:0;pointer-events:none;}
  .sidebar-footer{display:flex;align-items:center;gap:10px;margin-left:auto;padding-left:16px;border-left:1px solid rgba(255,255,255,0.12);flex-shrink:0;position:relative;}
  .topnav-user{text-align:right;line-height:1.25;}
  .sidebar-signout{background:transparent;border:1px solid rgba(255,255,255,0.25);border-radius:var(--radius-sm);color:var(--on-navy);font-size:var(--fs-sm);font-weight:600;padding:7px 11px;cursor:pointer;white-space:nowrap;}
  .sidebar-signout:hover{border-color:#fff;color:#fff;}
  #fullBackupStatus{position:absolute;top:100%;right:0;margin-top:6px;font-size:var(--fs-2xs);color:var(--on-navy-soft);white-space:nowrap;}
  .nav-hamburger{display:none;margin-left:auto;background:transparent;border:1px solid rgba(255,255,255,0.25);border-radius:var(--radius-sm);color:#fff;font-size:var(--fs-lg);line-height:1;width:38px;height:38px;cursor:pointer;flex-shrink:0;}
  .nav-hamburger:hover{border-color:#fff;}
  .nav-backdrop{display:none;position:fixed;inset:0;top:60px;background:rgba(5,8,16,0.45);z-index:190;}
  .main-content{flex:1;min-width:0;padding:22px 28px 90px;}
  .content-header{display:flex;justify-content:space-between;align-items:baseline;gap:14px;margin-bottom:16px;}
  .page-title{font-family:'IBM Plex Sans',sans-serif;font-weight:700;font-size:var(--fs-lg);color:var(--navy);letter-spacing:-0.2px;}
  .content-header .date{font-family:'IBM Plex Mono',monospace;font-size:var(--fs-sm);color:var(--ink-soft);}
  /* Lightweight uppercase heading that separates sections inside a pane
     (e.g. the Tracker dashboard's Overview / Project Health / Most Urgent).
     Was an inline style block repeated by sectionTitle() in tracker.js. */
  .section-heading{font-family:'IBM Plex Sans',sans-serif;font-weight:700;font-size:var(--fs-sm);color:var(--navy);text-transform:uppercase;letter-spacing:0.5px;margin:22px 0 10px;}
  .subtabs{display:flex;gap:18px;border-bottom:2px solid var(--line);margin-bottom:18px;}
  .subtab{padding:8px 2px;font-size:var(--fs-base);font-weight:600;color:var(--ink-soft);cursor:pointer;border-bottom:2px solid transparent;margin-bottom:-2px;}
  .subtab.active{color:var(--navy);border-bottom-color:var(--navy);}
  .subtab:hover:not(.active){color:var(--ink);}

  /* Mobile/tablet nav (<=1024px): the horizontal top-nav row (logo + 7 nav
     groups + user info, all inline in one 60px bar) has no room to breathe
     below desktop widths, so it collapses into a hamburger-triggered
     off-canvas drawer. .sidebar-nav/.sidebar-footer keep every existing id
     and are driven by the SAME .open/.active classes JS already sets above
     this breakpoint - only their positioning changes here. */
  @media (max-width:1024px){
    .nav-hamburger{display:flex;align-items:center;justify-content:center;}
    #topnavIndicator{display:none;}
    body.mobile-nav-open .nav-backdrop{display:block;}

    .sidebar-nav{
      position:fixed;top:60px;left:0;bottom:64px;width:82vw;max-width:320px;
      flex-direction:column;align-items:stretch;gap:0;overflow-y:auto;
      background:var(--navy);padding:10px;box-shadow:4px 0 24px rgba(5,8,16,0.35);
      transform:translateX(-100%);transition:transform .25s var(--ease-out);z-index:195;
    }
    body.mobile-nav-open .sidebar-nav{transform:translateX(0);}
    .sidebar-nav .nav-group{width:100%;}
    .sidebar-nav .nav-item{width:100%;justify-content:space-between;box-sizing:border-box;}

    /* Re-skin the existing open/close classes as an inline accordion instead
       of a floating dropdown/flyout - same JS-driven classes, new geometry. */
    .sidebar-nav .nav-subgroup{
      position:static;opacity:1;visibility:visible;transform:none;
      width:100%;box-shadow:none;border:none;background:rgba(0,0,0,0.18);
      max-height:0;overflow:hidden;padding:0;margin:0;transition:max-height .2s ease, padding .2s ease;
    }
    .sidebar-nav .nav-subgroup::before{display:none;}
    .sidebar-nav .nav-subgroup.open{max-height:600px;padding:6px;margin-top:2px;}
    .sidebar-nav .nav-flyout{
      position:static;opacity:1;visibility:visible;transform:none;
      width:100%;box-shadow:none;border:none;background:rgba(0,0,0,0.18);
      max-height:0;overflow:hidden;padding:0;margin:0;transition:max-height .2s ease, padding .2s ease;
    }
    .sidebar-nav .nav-flyout::before{display:none;}
    .sidebar-nav .nav-subitem.nav-flyout-trigger.open .nav-flyout{max-height:400px;padding:6px;margin-top:2px;padding-left:14px;}
    .sidebar-nav .nav-flyout-arrow{transition:transform .15s ease;}
    .sidebar-nav .nav-subitem.nav-flyout-trigger.open .nav-flyout-arrow{transform:rotate(90deg);}

    .sidebar-footer{
      position:fixed;left:0;bottom:0;width:82vw;max-width:320px;
      transform:translateX(-100%);transition:transform .25s var(--ease-out);
      margin:0;border-left:none;border-top:1px solid rgba(255,255,255,0.12);
      background:var(--navy);padding:14px;box-sizing:border-box;z-index:195;
      justify-content:space-between;
    }
    body.mobile-nav-open .sidebar-footer{transform:translateX(0);}
  }

  /* Login — split-screen hero with interactive glow */
  #loginScreen{display:flex;min-height:100vh;background:linear-gradient(135deg,#1a2436 0%,#232f45 45%,#2c3a54 100%);overflow:hidden;position:relative;}

  .login-hero{position:relative;flex:1.35;min-width:0;padding:64px 60px;display:flex;align-items:center;overflow:hidden;}
  .login-glow{position:absolute;width:520px;height:520px;border-radius:50%;background:radial-gradient(circle, rgba(90,140,230,0.28) 0%, rgba(90,140,230,0.08) 45%, transparent 70%);pointer-events:none;transform:translate(-50%,-50%);left:30%;top:35%;transition:left .35s ease-out, top .35s ease-out;filter:blur(4px);}
  .login-grid-overlay{position:absolute;inset:0;background-image:linear-gradient(rgba(255,255,255,0.035) 1px, transparent 1px),linear-gradient(90deg, rgba(255,255,255,0.035) 1px, transparent 1px);background-size:46px 46px;pointer-events:none;mask-image:radial-gradient(ellipse 800px 500px at 30% 40%, #000 0%, transparent 75%);}
  .login-hero-content{position:relative;z-index:2;max-width:560px;}

  .login-logo-wrap{position:relative;width:96px;height:96px;margin-bottom:30px;display:flex;align-items:center;justify-content:center;}
  .login-logo-ring{position:absolute;inset:-14px;border-radius:50%;background:conic-gradient(from 0deg, transparent 0%, rgba(120,175,255,0.9) 8%, transparent 22%, transparent 100%);animation:logoRingSpin 4.5s linear infinite;filter:blur(3px);opacity:0.9;}
  .login-logo-ring::after{content:'';position:absolute;inset:8px;border-radius:50%;background:radial-gradient(circle, rgba(26,36,54,1) 55%, rgba(26,36,54,0) 100%);}
  @keyframes logoRingSpin{ to{ transform:rotate(360deg); } }
  .login-logo-glow{position:absolute;inset:-24px;border-radius:50%;background:radial-gradient(circle, rgba(90,140,230,0.35) 0%, transparent 70%);animation:logoGlowPulse 3s ease-in-out infinite;pointer-events:none;}
  @keyframes logoGlowPulse{ 0%,100%{opacity:0.55;transform:scale(1);} 50%{opacity:0.9;transform:scale(1.08);} }
  .login-logo-img{position:relative;z-index:2;width:78px;height:78px;object-fit:contain;filter:drop-shadow(0 4px 16px rgba(0,0,0,0.35));}

  .login-headline{font-family:'IBM Plex Sans',sans-serif;font-weight:700;font-size:var(--fs-3xl);line-height:1.2;color:#fff;margin:0 0 16px;letter-spacing:-0.3px;}
  .login-tagline{font-size:var(--fs-md);color:#B9C4D6;margin:0 0 4px;font-weight:500;}
  .login-sub{font-size:var(--fs-base);color:#8A96AC;margin:0 0 34px;line-height:1.6;max-width:380px;}

  .login-diagram{position:relative;height:170px;margin-bottom:34px;}
  .login-tile-grid{display:grid;grid-template-columns:repeat(2,84px);grid-template-rows:repeat(2,84px);gap:14px;position:relative;z-index:2;}
  .login-tile{background:rgba(255,255,255,0.05);border:1px solid rgba(255,255,255,0.12);border-radius:10px;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:6px;cursor:default;transition:all .25s ease;animation:tileFadeIn .6s ease backwards;animation-delay:var(--tile-delay);}
  @keyframes tileFadeIn{ from{opacity:0;transform:translateY(8px);} to{opacity:1;transform:translateY(0);} }
  .login-tile:hover{background:rgba(90,140,230,0.14);border-color:rgba(120,165,255,0.55);box-shadow:0 0 0 1px rgba(120,165,255,0.25), 0 8px 24px rgba(60,100,200,0.35), 0 0 28px rgba(90,140,230,0.35);transform:translateY(-3px);}
  .login-tile-icon{width:26px;height:26px;color:#9DB0D6;transition:color .25s ease, transform .25s ease;}
  .login-tile-icon svg{width:100%;height:100%;stroke:currentColor;fill:currentColor;}
  .login-tile:hover .login-tile-icon{color:#BFD4FF;transform:scale(1.1);}
  .login-tile-label{font-size:var(--fs-2xs);font-weight:700;text-transform:uppercase;letter-spacing:0.4px;color:#7C8AA3;text-align:center;line-height:1.3;transition:color .25s ease;}
  .login-tile:hover .login-tile-label{color:#D6E1FA;}

  .login-flow-svg{position:absolute;top:0;left:190px;width:calc(100% - 190px);height:100%;color:#7C8AA3;overflow:visible;}
  .flow-path{stroke-dasharray:6 5;animation:flowDash 3.5s linear infinite;}
  @keyframes flowDash{ to{ stroke-dashoffset:-220; } }
  .login-radar{animation:radarSpin 26s linear infinite;transform-origin:center;}
  @keyframes radarSpin{ to{ transform:translate(330px,140px) rotate(360deg); } }

  .login-mission-btn{background:transparent;border:1px solid rgba(255,255,255,0.35);color:#fff;font-size:var(--fs-xs);font-weight:700;letter-spacing:0.6px;text-transform:uppercase;padding:13px 22px;border-radius:var(--radius-sm);cursor:pointer;}
  .login-mission-btn:hover{background:rgba(255,255,255,0.1);border-color:#fff;box-shadow:0 0 20px rgba(255,255,255,0.15);}

  .login-panel{flex:1;min-width:340px;max-width:460px;display:flex;align-items:center;justify-content:center;position:relative;background:rgba(210,220,235,0.08);backdrop-filter:blur(30px);-webkit-backdrop-filter:blur(30px);border-left:1px solid rgba(255,255,255,0.12);}
  .login-card{width:100%;max-width:340px;padding:0 40px;}
  .login-card-logo-wrap{position:relative;width:96px;height:96px;margin-bottom:18px;display:flex;align-items:center;justify-content:center;}
  .login-card-logo-ring{position:absolute;inset:-14px;border-radius:50%;background:conic-gradient(from 0deg, transparent 0%, rgba(120,175,255,0.85) 8%, transparent 22%, transparent 100%);animation:logoRingSpin 4.5s linear infinite;filter:blur(2px);opacity:0.85;}
  .login-card-logo-ring::after{content:'';position:absolute;inset:8px;border-radius:50%;background:radial-gradient(circle, rgba(30,42,66,1) 55%, rgba(30,42,66,0) 100%);}
  .login-card-logo-glow{position:absolute;inset:-24px;border-radius:50%;background:radial-gradient(circle, rgba(90,140,230,0.32) 0%, transparent 70%);animation:logoGlowPulse 3s ease-in-out infinite;pointer-events:none;}
  .login-card-badge{position:relative;z-index:2;width:78px;height:78px;object-fit:contain;filter:drop-shadow(0 3px 10px rgba(0,0,0,0.3));}
  .login-card-title{font-family:'IBM Plex Sans',sans-serif;font-weight:700;font-size:var(--fs-lg);color:#fff;}
  .login-card-sub{font-size:var(--fs-sm);color:var(--on-navy-soft);margin-bottom:26px;}
  .login-card-heading{font-family:'IBM Plex Sans',sans-serif;font-weight:700;font-size:var(--fs-xl);color:#fff;margin-bottom:22px;letter-spacing:-0.2px;}
  #loginScreen label{display:block;font-size:var(--fs-2xs);font-weight:700;text-transform:uppercase;letter-spacing:0.5px;color:var(--on-navy-soft);margin-bottom:6px;margin-top:16px;}
  #loginScreen input, #loginScreen select{width:100%;padding:11px 13px;font-size:var(--fs-base);border:1px solid rgba(255,255,255,0.18);border-radius:var(--radius-sm);background:rgba(255,255,255,0.06);color:#fff;transition:all .18s ease;}
  #loginScreen input::placeholder{color:#66738D;}
  #loginScreen input:focus, #loginScreen select:focus{outline:none;border-color:var(--accent);background:rgba(255,255,255,0.09);box-shadow:0 0 0 3px rgba(62,111,217,0.22);}
  #loginScreen select option{background:var(--navy-dark, #0E1A30);color:#fff;}
  .login-remember-row{margin-top:14px;}
  .login-remember-row label{display:flex;align-items:center;gap:7px;font-size:var(--fs-sm);font-weight:500;text-transform:none;letter-spacing:normal;color:#B9C4D6;margin:0;cursor:pointer;}
  .login-remember-row input{width:auto;accent-color:var(--accent);}
  #loginScreen button#loginBtn{width:100%;margin-top:22px;background:linear-gradient(135deg, var(--accent), var(--navy));border:none;box-shadow:0 4px 16px rgba(62,111,217,0.35);}
  #loginScreen button#loginBtn:hover{box-shadow:0 6px 22px rgba(62,111,217,0.5);transform:translateY(-1px);}
  #loginError{color:#FF9B8A;font-size:var(--fs-sm);margin-top:10px;min-height:16px;}
  .login-forgot-link{display:block;text-align:center;font-size:var(--fs-sm);color:#8FA8E0;text-decoration:none;margin-top:18px;transition:color .15s;}
  .login-forgot-link:hover{color:#BFD4FF;text-decoration:underline;}
  .login-forgot-msg{font-size:var(--fs-xs);color:var(--on-navy-soft);text-align:center;margin-top:8px;min-height:14px;}

  @media (max-width:900px){
    #loginScreen{flex-direction:column;}
    .login-hero{padding:48px 28px;min-height:auto;}
    .login-headline{font-size:var(--fs-2xl);}
    .login-diagram{display:none;}
    .login-panel{border-left:none;border-top:1px solid rgba(255,255,255,0.12);padding:40px 0;}
  }

  /* Top bar */
  .topbar{background:var(--navy);color:#fff;padding:20px 24px;margin-bottom:22px;}
  .topbar-inner{max-width:1160px;margin:0 auto;display:flex;justify-content:space-between;align-items:flex-start;}
  .topbar h1{font-family:'IBM Plex Sans',sans-serif;font-weight:700;font-size:var(--fs-xl);margin:0;letter-spacing:0.2px;}
  .topbar .sub{font-size:var(--fs-sm);color:var(--on-navy);margin-top:5px;}
  .topbar .date{font-family:'IBM Plex Mono',monospace;font-size:var(--fs-sm);color:var(--on-navy);text-align:right;}
  .save-status{font-family:'IBM Plex Mono',monospace;font-size:var(--fs-xs);margin-top:5px;text-align:right;transition:color 140ms var(--ease-out);}
  .save-status.ok{color:#8FD3A8;} .save-status.pending{color:var(--on-navy);} .save-status.fail{color:#F0A69C;font-weight:600;}
  .topline{display:flex;justify-content:flex-end;margin-bottom:14px;}
  .topline button{font-size:var(--fs-xs);background:none;border:1px solid var(--line-strong);border-radius:var(--radius-sm);color:var(--ink-soft);cursor:pointer;font-weight:600;padding:5px 10px;}
  .topline button:hover{border-color:var(--navy);color:var(--navy);}

  .summary{display:grid;grid-template-columns:repeat(4,1fr);gap:1px;background:var(--line);border:1px solid var(--line);margin-bottom:22px;}
  .summary .card{background:var(--panel);padding:16px 18px;}
  .summary .card .n{font-family:'IBM Plex Sans',sans-serif;font-size:var(--fs-2xl);font-weight:700;line-height:1;}
  .summary .card .l{font-size:var(--fs-2xs);text-transform:uppercase;letter-spacing:0.6px;color:var(--ink-soft);margin-top:6px;font-weight:600;}
  .summary .card.overdue .n{color:var(--red);} .summary .card.today .n{color:var(--amber);}
  .summary .card.open .n{color:var(--navy);} .summary .card.closed .n{color:var(--green);}

  .controls{display:flex;justify-content:space-between;align-items:center;flex-wrap:wrap;gap:10px;margin-bottom:0;}
  .tabs{display:flex;gap:0;border:1px solid var(--line);flex-wrap:wrap;}
  .tab{position:relative;padding:9px 15px;font-size:var(--fs-sm);font-weight:600;cursor:pointer;color:var(--ink-soft);user-select:none;white-space:nowrap;border-right:1px solid var(--line);}
  /* Every small floating count badge on an icon/tab shares one design -
     size, shape, offset, color, ring - so they read as the same UI
     element wherever they show up (notification bell, tab counts,
     comment/subtask counts, Sites Check comments/photos/dates/raised-by).
     .tab-badge/.count-badge/.obs-icon-badge only differ in *when* they're
     shown: .tab-badge starts hidden and is toggled via JS (setTabBadge),
     the other two are simply not rendered into the DOM until count > 0. */
  .tab-badge, .count-badge, .obs-icon-badge{position:absolute;top:-6px;right:-6px;background:var(--red);color:#fff;font-size:var(--fs-2xs);font-weight:800;min-width:16px;height:16px;border-radius:50%;display:flex;align-items:center;justify-content:center;padding:0 3px;box-shadow:0 0 0 2px var(--panel);}
  .tab-badge{display:none;}
  .tab:last-child{border-right:none;}
  .tab.active{background:var(--navy);color:#fff;}
  .tab:hover:not(.active){background:var(--gray-bg);color:var(--ink);}
  .right-controls{display:flex;gap:8px;align-items:center;flex-wrap:wrap;}
  select, input[type=text], input[type=date], input[type=search]{
    font-family:'Inter',sans-serif;font-size:var(--fs-base);padding:8px 10px;border:1px solid var(--line-strong);border-radius:var(--radius-sm);background:var(--panel);color:var(--ink);transition:border-color .15s;
  }
  select:focus, input:focus{outline:none;border-color:var(--navy);}
  /* Buttons — the whole system in one place. Primary = filled --accent
     (reserved for actionable elements, so it reads apart from the navy
     structural chrome); .secondary = navy outline. Earlier passes of the
     sheet set the base here and then re-touched .btn depth / press-motion /
     colour in three later blocks; those are all folded back in below. */
  .btn{
    font-family:'IBM Plex Sans',sans-serif;font-size:var(--fs-base);font-weight:600;
    padding:9px 16px;border-radius:var(--radius-sm);border:1px solid var(--navy);
    background:var(--navy);color:#fff;cursor:pointer;
    box-shadow:0 1px 2px rgba(20,30,50,0.12), 0 2px 6px rgba(27,42,68,0.18);
    transition:transform .12s, box-shadow .12s, background .12s;
  }
  .btn:hover{
    background:var(--navy-dark);border-color:var(--navy-dark);
    transform:translateY(-1px);box-shadow:0 3px 10px rgba(27,42,68,0.28);
  }
  .btn:active{ transform:translateY(0) scale(0.95); transition-duration:90ms; }
  .btn:disabled{ opacity:0.5; cursor:not-allowed; box-shadow:none; transform:none; }
  .btn:not(.secondary){
    background:var(--accent);border-color:var(--accent);
    box-shadow:0 1px 2px rgba(62,111,217,0.18), 0 4px 12px rgba(62,111,217,0.22);
  }
  .btn:not(.secondary):hover{
    background:var(--accent-dark);border-color:var(--accent-dark);
    box-shadow:0 2px 6px rgba(62,111,217,0.22), 0 6px 18px rgba(62,111,217,0.3);
  }
  .btn.secondary{
    background:transparent;color:var(--navy);border-color:var(--line-strong);
    box-shadow:none;font-weight:600;
  }
  .btn.secondary:hover{ background:var(--navy-light);border-color:var(--navy);box-shadow:var(--shadow); }
  .btn.secondary:disabled:hover{ background:transparent; }
  .btn.small{ padding:6px 11px;font-size:var(--fs-sm);letter-spacing:0.1px; }
  /* Last of the equal-specificity :hover rules on purpose — a disabled
     button being hovered keeps the flat accent fill (matches the pre-merge
     cascade order). */
  .btn:disabled:hover{ background:var(--accent); border-color:var(--accent); transform:none; }

  .search-wrap{position:relative;flex:1;min-width:200px;max-width:340px;}
  .search-wrap input{width:100%;padding-left:32px;}
  .search-wrap .icon{position:absolute;left:10px;top:50%;transform:translateY(-50%);color:var(--ink-soft);font-size:var(--fs-base);pointer-events:none;}
  .search-note{font-size:var(--fs-xs);color:var(--ink-soft);padding:8px 2px;}

  .form-panel{background:var(--panel);border:1px solid var(--line);border-top:3px solid var(--navy);padding:20px;margin:16px 0 20px;display:none;}
  .form-panel.open{display:block;}
  .form-grid{display:grid;grid-template-columns:1.6fr 1fr 1fr;gap:12px;margin-bottom:12px;}
  .form-grid label{display:block;font-size:var(--fs-xs);font-weight:600;text-transform:uppercase;letter-spacing:0.3px;color:var(--ink-soft);margin-bottom:5px;}
  .form-grid .full{grid-column:1/-1;}
  .form-grid input, .form-grid select, .form-grid textarea{width:100%;}
  .form-actions{display:flex;gap:8px;justify-content:flex-end;}

  .empty{padding:44px 10px;text-align:center;color:var(--ink-soft);font-size:var(--fs-md);background:var(--panel);border:1px solid var(--line);border-top:none;}
  .list-container{border:1px solid var(--line);border-top:none;margin-bottom:20px;}
  .row-header{display:grid;grid-template-columns:5px 1fr 148px 100px 105px 95px 152px 115px 125px;background:var(--navy-light);border-top:1px solid var(--line);}
  .row-header .cell{padding:9px 12px;font-size:var(--fs-2xs);font-weight:700;text-transform:uppercase;letter-spacing:0.4px;color:var(--navy);}
  .task-group{border-top:1px solid var(--line);}
  .row{
    display:grid;grid-template-columns:5px 1fr 148px 100px 105px 95px 152px 115px 125px;gap:0;align-items:center;
    background:var(--panel);transition:background .1s;
  }
  .row:hover{background:var(--row-hover);}
  .row .flag{align-self:stretch;}
  .row .cell{padding:8px 12px;font-size:var(--fs-base);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
  .row .action-cell{white-space:normal;overflow:visible;}
  .action-title-row{display:flex;align-items:baseline;gap:10px;justify-content:space-between;}
  .row .action-text{font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0;flex:1;}
  .row .subtitle{font-size:var(--fs-sm);color:var(--ink-soft);margin-top:1px;font-style:italic;}
  .row .meta{font-size:var(--fs-xs);color:var(--ink-soft);margin-top:0;flex-shrink:0;white-space:nowrap;display:flex;align-items:center;gap:6px;}
  .badge{display:inline-block;font-size:var(--fs-2xs);font-weight:700;text-transform:uppercase;letter-spacing:0.3px;padding:3px 7px;border-radius:var(--radius-sm);}
  .badge.High{background:var(--red-bg);color:var(--red);}
  .badge.Medium{background:var(--amber-bg);color:var(--amber);}
  .badge.Low{background:var(--gray-bg);color:var(--slate);}
  .due-wrap{border-radius:var(--radius-sm);padding:2px;}
  .due-wrap.overdue{background:var(--red-bg);}
  .due-wrap.today{background:var(--amber-bg);}
  .due-input{font-family:'IBM Plex Mono',monospace;font-size:var(--fs-sm);border:none;background:transparent;width:100%;padding:5px 4px;cursor:pointer;}
  .due-input:focus{outline:1px solid var(--navy);border-radius:2px;}
  .due-input:disabled{cursor:not-allowed;color:var(--ink-soft);}
  .row-actions{display:flex;gap:5px;justify-content:flex-end;padding-right:10px;}
  .icon-btn{position:relative;background:var(--panel);border:1px solid var(--line-strong);border-radius:var(--radius-sm);min-width:27px;height:27px;padding:0 7px;cursor:pointer;color:var(--ink-soft);font-size:var(--fs-sm);line-height:1;}
  .icon-btn:hover{border-color:var(--navy);color:var(--navy);}
  .icon-btn.active{border-color:var(--navy);color:var(--navy);background:var(--navy-light);}
  .icon-btn.del:hover{border-color:var(--red);color:var(--red);}
  .count-badge.sub{background:var(--blue);}
  .flag.overdue{background:var(--red);} .flag.today{background:var(--amber);}
  .flag.upcoming{background:var(--navy);} .flag.closed{background:var(--green);} .flag.none{background:var(--line-strong);}
  .status-select{font-size:var(--fs-xs);padding:6px 5px;border:1px solid var(--line-strong);border-radius:var(--radius-sm);background:var(--panel);color:var(--ink);font-weight:600;width:100%;text-transform:uppercase;letter-spacing:0.3px;}
  .company-tag{font-size:var(--fs-sm);color:var(--slate);}
  .area-tag{font-size:var(--fs-sm);color:var(--slate);}
  .co-badge{display:inline-block;font-size:var(--fs-2xs);font-weight:700;text-transform:uppercase;letter-spacing:0.3px;padding:3px 7px;border-radius:var(--radius-sm);}
  .co-badge.palestine{background:var(--blue-bg);color:var(--blue);}
  .co-badge.jordan{background:var(--green-bg);color:var(--green);}
  .co-badge.ctc{background:var(--red-bg);color:var(--red);}

  .comment-item{padding:8px 0;border-bottom:1px dashed var(--line);font-size:var(--fs-sm);}
  .comment-item:last-child{border-bottom:none;}
  .comment-time{font-family:'IBM Plex Mono',monospace;font-size:var(--fs-2xs);color:var(--ink-soft);margin-bottom:3px;}
  .comment-add{display:flex;gap:8px;margin-top:10px;}
  .comment-add textarea{flex:1;font-family:'Inter',sans-serif;font-size:var(--fs-sm);padding:8px 10px;border:1px solid var(--line-strong);border-radius:var(--radius-sm);resize:vertical;min-height:34px;}
  .no-comments{font-size:var(--fs-sm);color:var(--ink-soft);font-style:italic;}
  .loading{padding:34px;text-align:center;color:var(--ink-soft);font-family:'IBM Plex Mono',monospace;font-size:var(--fs-base);}

  /* Comments popover - shared by every 💬 button (task/subtask/project task).
     Floats above the page, anchored near the button that opened it, instead
     of expanding inline in the row - see openCommentsPopover in tracker.js. */
  .comment-popover{
    position:fixed; z-index:1000; width:300px; max-height:380px;
    background:var(--panel); border:1px solid var(--line); border-radius:var(--radius);
    box-shadow:var(--shadow-lg); display:flex; flex-direction:column; overflow:hidden;
    animation: motionScaleIn 180ms var(--ease-out) both;
  }
  .comment-popover-head{
    display:flex; align-items:center; justify-content:space-between; flex-shrink:0;
    padding:10px 14px; border-bottom:1px solid var(--line);
    font-family:'IBM Plex Sans',sans-serif; font-size:var(--fs-sm); font-weight:700; color:var(--navy);
  }
  .comment-popover-close{
    background:transparent; border:none; cursor:pointer; color:var(--ink-soft);
    font-size:var(--fs-base); line-height:1; padding:4px 7px; border-radius:6px;
  }
  .comment-popover-close:hover{ background:var(--gray-bg); color:var(--ink); }
  .comment-popover-body{ padding:12px 14px; overflow-y:auto; }
  .comment-popover-body .comment-add{ margin-top:8px; }

  /* Subtasks */
  .subtasks-panel{background:var(--surface-sunk);border-top:1px solid var(--line);height:0;overflow:hidden;}
  .subtasks-panel.open{height:auto;}
  .subtasks-panel.open .panel-inner{padding:12px 16px 14px;max-height:900px;overflow-y:auto;}
  .subtask-block{margin-bottom:8px;}
  .subtask-block:last-child{margin-bottom:0;}
  .subtask-row{display:grid;grid-template-columns:1fr 132px 122px 40px;gap:8px;align-items:center;background:var(--panel);border:1px solid var(--line);padding:8px 10px;}
  .subtask-row.closed{opacity:0.55;}
  .subtask-row.closed .subtask-text{text-decoration:line-through;color:var(--ink-soft);}
  .subtask-text{font-size:var(--fs-base);font-weight:500;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
  .no-subtasks{font-size:var(--fs-sm);color:var(--ink-soft);font-style:italic;margin-bottom:6px;}
  .subtask-add{display:flex;gap:8px;margin-top:10px;}
  .subtask-add input{flex:1;font-family:'Inter',sans-serif;font-size:var(--fs-sm);padding:8px 10px;border:1px solid var(--line-strong);border-radius:var(--radius-sm);}
  .subtask-edit-row{display:grid;grid-template-columns:1fr 132px 122px 30px;gap:6px;margin-bottom:6px;align-items:center;}
  .subtask-edit-row input, .subtask-edit-row select{width:100%;}

  .filter-field{display:flex;flex-direction:column;gap:4px;}
  .filter-field label{font-size:var(--fs-2xs);font-weight:600;color:var(--ink-soft);text-transform:uppercase;letter-spacing:0.3px;}

  /* User Management */
  .role-badge{display:inline-block;font-size:var(--fs-2xs);font-weight:700;text-transform:uppercase;letter-spacing:0.3px;padding:3px 8px;border-radius:20px;}
  .role-badge.superadmin{background:var(--purple-bg, #EFE9F7);color:var(--purple, #6B4FA0);}
  .role-badge.admin{background:var(--blue-bg);color:var(--blue);}
  .role-badge.user{background:var(--gray-bg);color:var(--slate);}
  .status-badge{display:inline-block;font-size:var(--fs-2xs);font-weight:700;text-transform:uppercase;letter-spacing:0.3px;padding:3px 8px;border-radius:20px;}
  .status-badge.active, .status-badge.accepted{background:var(--green-bg);color:var(--green);}
  .status-badge.inactive{background:var(--red-bg);color:var(--red);}
  .status-badge.pending{background:var(--amber-bg);color:var(--amber);}
  .cp-modal-grid label.perm-label{display:flex;align-items:center;gap:6px;font-size:var(--fs-sm);font-weight:500;color:var(--ink);text-transform:none;letter-spacing:normal;margin-bottom:0;cursor:pointer;}

  /* Page Management (Admin: Regions, Warehouses & Areas, Departments) */
  .pm-section{background:var(--panel);border:1px solid var(--line);border-radius:var(--radius);padding:18px 20px;margin-bottom:16px;}
  .pm-section-head{display:flex;align-items:flex-start;justify-content:space-between;gap:14px;margin-bottom:14px;}
  .pm-section-title{font-family:'IBM Plex Sans',sans-serif;font-weight:700;font-size:var(--fs-md);color:var(--navy);}
  .pm-section-hint{font-size:var(--fs-xs);color:var(--ink-soft);margin-top:2px;max-width:520px;}
  .pm-section-head .btn{flex-shrink:0;}
  /* Warehouses/departments saved before Companies existed - still shown by
     their old region, but flagged so the admin knows to attach a company. */
  .pm-needs-company{color:var(--amber);font-style:italic;}
  /* Add/Edit popups (Region, Company, Warehouse, Department) - a compact
     dialog rather than the wide default .cp-modal, since these forms only
     ever hold a couple of fields and 680px left them looking sparse. */
  .pm-modal{max-width:440px;}
  .pm-modal-head{margin-bottom:20px;}
  .pm-modal-eyebrow{
    display:flex; align-items:center; gap:8px;
    font-size:var(--fs-2xs); font-weight:700; letter-spacing:1.1px; text-transform:uppercase;
    color:var(--ink-soft); margin-bottom:8px;
  }
  .pm-modal-head h3{margin:0;}
  .pm-modal-sub{font-size:var(--fs-sm);color:var(--ink-soft);margin-top:5px;line-height:1.5;}
  .pm-modal-field{margin-bottom:16px;}
  .pm-modal-field label{display:block;font-size:var(--fs-2xs);font-weight:600;color:var(--ink-soft);text-transform:uppercase;letter-spacing:0.3px;margin-bottom:5px;}
  .pm-modal-field input, .pm-modal-field select{width:100%;}
  .wh-areas-list{display:flex;flex-wrap:wrap;gap:6px;min-height:26px;margin-bottom:10px;}
  .wh-areas-empty{font-size:var(--fs-xs);color:var(--ink-soft);font-style:italic;}
  .wh-area-chip{display:inline-flex;align-items:center;gap:6px;background:var(--gray-bg);border:1px solid var(--line-strong);color:var(--ink);border-radius:20px;padding:4px 6px 4px 11px;font-size:var(--fs-xs);}
  .wh-area-chip button{background:none;border:none;color:var(--ink-soft);cursor:pointer;font-size:var(--fs-xs);line-height:1;padding:2px 4px;border-radius:50%;}
  .wh-area-chip button:hover{color:var(--red);background:var(--red-bg);}
  .wh-area-add{display:flex;gap:6px;}
  .wh-area-add input{flex:1;font-size:var(--fs-sm);padding:7px 9px;}

  /* Checklist form */
  .cl-modal-overlay{position:fixed;inset:0;background:rgba(10,14,20,0.6);display:flex;align-items:flex-start;justify-content:center;z-index:1000;padding:24px;overflow-y:auto;}
  .cl-modal{background:#fff;border-radius:var(--radius);box-shadow:var(--shadow-lg);max-width:820px;width:100%;padding:0;border-top:4px solid var(--navy);margin-bottom:40px;}
  .cl-modal-header{padding:20px 24px 4px;position:relative;}
  .cl-modal-header h3{margin:0 0 14px;font-family:'IBM Plex Sans',sans-serif;color:var(--navy);font-size:var(--fs-lg);padding-right:60px;}
  .cl-qr-btn{position:absolute;top:18px;right:22px;width:48px;height:48px;border-radius:var(--radius-sm);border:1.5px solid var(--navy);background:var(--navy-light);color:var(--navy);font-weight:700;font-size:var(--fs-xs);letter-spacing:0.3px;cursor:pointer;}
  .cl-qr-btn:hover{background:var(--navy);color:#fff;}
  .cl-locked-grid{display:grid;grid-template-columns:1fr 1fr 1fr;gap:12px;margin-bottom:10px;}
  /* Read-only submission view shows 4 locked fields (Date/Time/Warehouse/Filled
     By) instead of the fill-in form's 3 - kept as its OWN single-class
     selector (not a compound .cl-locked-grid.cl-locked-grid-4, which would
     out-specificity the max-width:640px rule below and break the mobile
     collapse to 1 column) so that rule still wins when it's active. */
  .cl-locked-grid-4{grid-template-columns:1fr 1fr 1fr 1fr;}
  .cl-locked-field label{display:block;font-size:var(--fs-2xs);font-weight:600;color:var(--ink-soft);text-transform:uppercase;letter-spacing:0.3px;margin-bottom:3px;}
  .cl-locked-field .val{font-size:var(--fs-base);font-weight:600;color:var(--ink);background:var(--gray-bg);padding:8px 10px;border-radius:var(--radius-sm);}
  .cl-name-field{margin-bottom:16px;}
  .cl-name-field label{display:block;font-size:var(--fs-2xs);font-weight:600;color:var(--ink-soft);text-transform:uppercase;letter-spacing:0.3px;margin-bottom:3px;}
  .cl-name-field input{width:100%;}
  .cl-topic-bar{background:var(--checklist-topic-bg);color:var(--checklist-topic-ink);font-weight:700;font-size:var(--fs-sm);text-transform:uppercase;letter-spacing:0.3px;padding:9px 24px;position:sticky;top:0;z-index:2;}
  .cl-point-row{display:grid;grid-template-columns:1fr auto;gap:12px;align-items:center;padding:11px 24px;border-bottom:1px solid var(--line);}
  .cl-point-row:hover{background:var(--row-hover);}
  .cl-point-text{font-size:var(--fs-base);line-height:1.4;}
  .cl-point-controls{display:flex;gap:8px;align-items:center;flex-shrink:0;}
  .cl-yn-btn{border:1.5px solid var(--line-strong);background:var(--panel);border-radius:20px;padding:5px 14px;font-size:var(--fs-xs);font-weight:700;cursor:pointer;color:var(--ink-soft);}
  .cl-yn-btn.yes.active{background:var(--green);border-color:var(--green);color:#fff;}
  .cl-yn-btn.no.active{background:var(--red);border-color:var(--red);color:#fff;}
  .cl-attach-btn{width:30px;height:30px;border-radius:var(--radius-sm);border:1.5px solid var(--line-strong);background:var(--panel);cursor:pointer;color:var(--ink-soft);font-size:var(--fs-base);}
  .cl-attach-btn.has-photo{border-color:var(--green);color:var(--green);}
  .cl-comment-wrap{grid-column:1/-1;padding-top:2px;}
  .cl-comment-wrap textarea{width:100%;font-size:var(--fs-sm);padding:8px 10px;border:1px solid var(--line);border-radius:var(--radius-sm);resize:vertical;min-height:44px;}
  .cl-footer{padding:18px 24px 22px;display:flex;justify-content:space-between;align-items:center;gap:12px;position:sticky;bottom:0;background:#fff;border-top:1px solid var(--line);}
  .cl-progress{font-size:var(--fs-xs);color:var(--ink-soft);}
  .checklist-tag{display:inline-block;font-size:var(--fs-2xs);font-weight:700;text-transform:uppercase;letter-spacing:0.3px;padding:3px 7px;border-radius:20px;background:var(--navy-light);color:var(--navy);white-space:nowrap;}
  .obs-locked select, .obs-locked input, input.obs-locked-input{background:var(--gray-bg)!important;color:var(--ink-soft)!important;cursor:not-allowed;}
  /* position:fixed (with top/left set in JS from the bell button's own
     rect) rather than absolute - .page-banner, its positioned ancestor,
     has overflow:hidden for its own rounded-corner gradient, which would
     otherwise clip this popover down to a sliver the moment its content
     grows past the banner's own height. */
  #obsNotifPanel{position:fixed;width:320px;background:var(--panel);border:1px solid var(--line);border-radius:var(--radius);box-shadow:var(--shadow-lg);z-index:210;overflow:hidden;}
  .obs-notif-row{position:relative;padding:10px 14px 10px 20px;border-bottom:1px solid var(--line);font-size:var(--fs-sm);}
  .obs-notif-row:last-child{border-bottom:none;}
  .obs-notif-title{line-height:1.4;}
  .obs-notif-meta{font-size:var(--fs-xs);color:var(--ink-soft);margin-top:2px;}
  .obs-notif-dot{position:absolute;top:14px;left:8px;width:6px;height:6px;border-radius:50%;background:var(--green);}
  .obs-notif-showall-btn{width:100%;border-radius:0;border:none;border-bottom:1px solid var(--line);}

  #publicChecklistScreen{min-height:100vh;background:var(--bg);}

  @media (max-width:640px){
    .cl-modal-overlay{padding:0;align-items:stretch;}
    .cl-modal{max-width:100%;border-radius:0;min-height:100vh;margin-bottom:0;}
    .cl-modal-header{padding:16px 16px 4px;}
    .cl-modal-header h3{padding-right:56px;font-size:var(--fs-md);}
    .cl-qr-btn{top:14px;right:14px;width:42px;height:42px;font-size:var(--fs-2xs);}
    .cl-locked-grid{grid-template-columns:1fr;gap:8px;}
    .cl-topic-bar{padding:9px 16px;font-size:var(--fs-xs);}
    .cl-point-row{grid-template-columns:1fr;padding:12px 16px;gap:8px;}
    .cl-point-controls{flex-wrap:wrap;}
    .cl-footer{padding:14px 16px 18px;flex-direction:column;align-items:stretch;gap:10px;}
    .cl-footer > div{width:100%;}
    .cl-footer > div[style*="flex"]{display:flex;gap:8px;}
    .cl-footer .btn{flex:1;}
  }

  /* Quality Incidents dashboard */
  .qi-header{background:var(--navy);color:#fff;border-radius:var(--radius);padding:var(--sp-6);display:flex;justify-content:space-between;align-items:flex-start;margin-bottom:var(--sp-5);}
  .qi-eyebrow{font-size:var(--fs-2xs);font-weight:700;letter-spacing:0.6px;color:var(--on-navy-soft);text-transform:uppercase;margin-bottom:8px;}
  .qi-title{font-family:'IBM Plex Sans',sans-serif;font-weight:700;font-size:var(--fs-xl);margin-bottom:4px;}
  .qi-subtitle{font-size:var(--fs-sm);color:var(--on-navy);}
  .qi-header-right{display:flex;align-items:center;gap:12px;}
  .qi-synced{font-size:var(--fs-xs);color:var(--on-navy-soft);font-style:italic;}
  .qi-header .btn.secondary{background:transparent;border:1px solid rgba(255,255,255,0.3);color:#fff;}
  .qi-header .btn.secondary:hover{background:rgba(255,255,255,0.1);}
  .qi-header .btn{background:var(--accent);}

  .qi-kpi-row{display:grid;grid-template-columns:repeat(4,1fr);gap:14px;margin-bottom:18px;}
  .qi-kpi-card{background:var(--panel);border:1px solid var(--line);border-top:3px solid var(--navy);border-radius:var(--radius);padding:16px 18px;}
  .qi-kpi-top{display:flex;justify-content:space-between;align-items:center;margin-bottom:8px;}
  .qi-kpi-label{font-size:var(--fs-2xs);font-weight:700;text-transform:uppercase;letter-spacing:0.4px;color:var(--ink-soft);}
  .qi-kpi-icon{font-size:var(--fs-md);opacity:0.7;}
  .qi-kpi-value{font-family:'IBM Plex Sans',sans-serif;font-weight:700;font-size:var(--fs-2xl);color:var(--navy);}
  .qi-kpi-sub{font-size:var(--fs-xs);color:var(--ink-soft);margin-top:3px;}

  .qi-chart-row{display:flex;gap:14px;margin-bottom:18px;align-items:stretch;}
  .qi-chart-card{flex:1;background:var(--panel);border:1px solid var(--line);border-radius:var(--radius);padding:16px 18px;min-width:0;}
  .qi-chart-title{font-size:var(--fs-2xs);font-weight:700;text-transform:uppercase;letter-spacing:0.4px;color:var(--ink-soft);margin-bottom:14px;}

  .qi-filters-row{display:flex;gap:10px;align-items:center;margin-bottom:14px;flex-wrap:wrap;}
  .qi-filters-row input[type="text"]{flex:1;min-width:220px;padding:9px 12px;border:1px solid var(--line-strong);border-radius:var(--radius-sm);font-size:var(--fs-base);}
  .qi-filters-row select{padding:9px 10px;border:1px solid var(--line-strong);border-radius:var(--radius-sm);font-size:var(--fs-sm);background:var(--panel);}
  .qi-count{font-size:var(--fs-xs);color:var(--ink-soft);white-space:nowrap;margin-left:auto;}

  /* ===================== Non-Conformity KPI page ===================== */
  .qi-kpi2-head{display:flex;justify-content:space-between;align-items:flex-start;gap:16px;flex-wrap:wrap;margin-bottom:16px;}
  .qi-kpi2-title{font-family:'IBM Plex Sans',sans-serif;font-weight:700;font-size:var(--fs-xl);color:var(--navy);margin:0 0 4px;}
  .qi-kpi2-sub{font-size:var(--fs-sm);color:var(--ink-soft);max-width:560px;line-height:1.5;}
  .qi-kpi2-actions{display:flex;align-items:center;gap:8px;flex-wrap:wrap;}
  .qi-kpi2-updated{font-size:var(--fs-xs);color:var(--ink-soft);white-space:nowrap;font-family:'IBM Plex Mono',monospace;}

  .qi-kpi2-filterbar{display:flex;flex-wrap:wrap;gap:10px;align-items:flex-end;background:var(--panel);border:1px solid var(--line);border-radius:var(--radius);padding:12px 14px;margin-bottom:10px;}
  .qi-kpi2-filter-field{display:flex;flex-direction:column;gap:4px;min-width:130px;}
  .qi-kpi2-filter-field label{font-size:var(--fs-2xs);font-weight:700;text-transform:uppercase;letter-spacing:0.3px;color:var(--ink-soft);}
  .qi-kpi2-filter-field select, .qi-kpi2-filter-field input[type="date"]{padding:8px 10px;border:1px solid var(--line-strong);border-radius:var(--radius-sm);font-size:var(--fs-sm);background:var(--panel);color:var(--ink);}
  .qi-kpi2-custom-dates{display:flex;gap:6px;}
  .qi-kpi2-quickdates{display:flex;gap:6px;flex-wrap:wrap;}
  .qi-kpi2-quickdate{padding:7px 11px;font-size:var(--fs-xs);font-weight:600;border:1px solid var(--line-strong);border-radius:20px;background:var(--panel);color:var(--ink-soft);cursor:pointer;white-space:nowrap;}
  .qi-kpi2-quickdate:hover{border-color:var(--navy);color:var(--navy);}
  .qi-kpi2-quickdate.active{background:var(--navy);border-color:var(--navy);color:#fff;}

  .qi-kpi2-chips{display:flex;flex-wrap:wrap;gap:7px;margin-bottom:16px;min-height:1px;}
  .qi-kpi2-chip{display:inline-flex;align-items:center;gap:6px;padding:4px 8px 4px 11px;border-radius:20px;background:var(--navy-light);color:var(--navy);font-size:var(--fs-xs);font-weight:600;}
  .qi-kpi2-chip button{border:none;background:rgba(27,42,68,0.12);color:var(--navy);width:16px;height:16px;border-radius:50%;font-size:var(--fs-2xs);line-height:1;cursor:pointer;display:flex;align-items:center;justify-content:center;padding:0;}
  .qi-kpi2-chip button:hover{background:var(--navy);color:#fff;}

  .qi-kpi-row-8{display:grid;grid-template-columns:repeat(4,1fr);gap:14px;margin-bottom:22px;}
  .qi-kpi-card.clickable{cursor:pointer;transition:transform 120ms var(--ease-out), box-shadow 120ms var(--ease-out);}
  .qi-kpi-card.clickable:hover{transform:translateY(-2px);box-shadow:0 8px 20px rgba(20,30,50,0.1);}
  .qi-kpi-card.unavailable{background:var(--navy-light);border-style:dashed;}
  .qi-kpi-card .qi-kpi-value-row{display:flex;align-items:baseline;gap:8px;flex-wrap:wrap;}
  .qi-kpi-delta{font-size:var(--fs-xs);font-weight:700;padding:1px 6px;border-radius:5px;}
  .qi-kpi-delta.up{color:var(--green);background:var(--green-bg);}
  .qi-kpi-delta.down{color:var(--red);background:var(--red-bg);}
  .qi-kpi-delta.flat{color:var(--ink-soft);background:var(--navy-light);}

  /* KPI Dashboard (Facility > Daily Production > Dashboard tab) */
  .fac-kpi-filterbar{position:sticky;top:0;z-index:40;background:var(--panel);border:1px solid var(--line);border-radius:var(--radius);padding:12px 14px;margin-bottom:18px;box-shadow:0 2px 10px rgba(20,30,50,0.06);}
  .fac-kpi-section{margin-top:28px;}
  .fac-kpi-section:first-of-type{margin-top:0;}
  .fac-kpi-section-title{font-size:var(--fs-sm);font-weight:700;color:var(--navy);text-transform:uppercase;letter-spacing:0.5px;margin-bottom:12px;padding-bottom:8px;border-bottom:2px solid var(--line-strong);}
  .qi-status-pill.fac-green{color:var(--green);border-color:var(--green);background:var(--green-bg);}
  .qi-status-pill.fac-amber{color:var(--amber);border-color:var(--amber);background:var(--amber-bg);}
  .qi-status-pill.fac-red{color:var(--red);border-color:var(--red);background:var(--red-bg);}
  .qi-status-pill.fac-gray{color:var(--slate);border-color:var(--slate);background:var(--gray-bg);}
  .fac-kpi-target-track{position:relative;background:var(--navy-light);border-radius:4px;height:6px;margin:8px 0 4px;}
  .fac-kpi-target-fill{height:100%;border-radius:4px;}
  .fac-kpi-target-marker{position:absolute;top:-2px;width:2px;height:10px;background:var(--navy);}
  .fac-kpi-formula-tip{cursor:help;color:var(--ink-soft);font-size:var(--fs-2xs);border-bottom:1px dotted var(--ink-soft);}
  .qi-kpi-target{display:inline-flex;align-items:center;gap:4px;font-size:var(--fs-2xs);font-weight:700;padding:2px 7px;border-radius:5px;margin-top:6px;}
  .qi-kpi-target.ok{color:var(--green);background:var(--green-bg);}
  .qi-kpi-target.warn{color:var(--amber);background:var(--amber-bg);}
  .qi-kpi-target.bad{color:var(--red);background:var(--red-bg);}
  .qi-kpi-spark{display:block;margin-top:8px;}
  .qi-info-tip{position:relative;display:inline-flex;align-items:center;justify-content:center;width:14px;height:14px;border-radius:50%;background:var(--navy-light);color:var(--ink-soft);font-size:var(--fs-2xs);font-weight:700;font-style:normal;cursor:help;}
  .qi-info-tip:hover::after, .qi-info-tip:focus::after{
    content:attr(data-tip);position:absolute;bottom:120%;left:50%;transform:translateX(-50%);
    width:210px;background:var(--navy-dark, var(--navy));color:#fff;font-size:var(--fs-xs);font-weight:500;line-height:1.4;
    padding:8px 10px;border-radius:7px;box-shadow:0 8px 20px rgba(5,8,16,0.3);z-index:20;white-space:normal;text-align:left;
  }

  .qi-kpi2-section-title{font-family:'IBM Plex Sans',sans-serif;font-weight:700;font-size:var(--fs-md);color:var(--navy);margin:26px 0 12px;padding-bottom:8px;border-bottom:1px solid var(--line);display:flex;align-items:center;justify-content:space-between;}

  .qi-kpi2-donut-wrap{position:relative;display:flex;align-items:center;justify-content:center;}
  .qi-kpi2-donut-center{position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);text-align:center;pointer-events:none;}
  .qi-kpi2-donut-center .n{font-family:'IBM Plex Sans',sans-serif;font-weight:700;font-size:var(--fs-xl);color:var(--navy);line-height:1;}
  .qi-kpi2-donut-center .l{font-size:var(--fs-2xs);color:var(--ink-soft);text-transform:uppercase;letter-spacing:0.3px;margin-top:2px;}
  .qi-kpi2-legend-item{cursor:pointer;border-radius:6px;padding:2px 5px;transition:background 100ms;}
  .qi-kpi2-legend-item:hover{background:var(--navy-light);}

  .qi-kpi2-aging-row{display:grid;grid-template-columns:80px 1fr 34px;align-items:center;gap:8px;margin-bottom:10px;}
  .qi-kpi2-aging-row .lbl{font-size:var(--fs-xs);color:var(--ink-soft);}
  .qi-kpi2-aging-row .track{background:var(--navy-light);border-radius:4px;height:16px;overflow:hidden;}
  .qi-kpi2-aging-row .fill{height:100%;border-radius:4px;}
  .qi-kpi2-aging-row .n{font-size:var(--fs-xs);font-weight:600;text-align:right;}

  .qi-kpi2-rank-tabs{display:flex;gap:6px;margin-bottom:12px;flex-wrap:wrap;}
  .qi-kpi2-rank-tab{padding:6px 13px;font-size:var(--fs-sm);font-weight:600;border:1px solid var(--line-strong);border-radius:20px;background:var(--panel);color:var(--ink-soft);cursor:pointer;}
  .qi-kpi2-rank-tab:hover{border-color:var(--navy);color:var(--navy);}
  .qi-kpi2-rank-tab.active{background:var(--navy);border-color:var(--navy);color:#fff;}

  .qi-kpi2-unavailable{color:var(--ink-soft);font-size:var(--fs-sm);padding:22px 16px;text-align:center;background:var(--navy-light);border-radius:8px;line-height:1.6;}
  .qi-kpi2-unavailable b{color:var(--ink);}

  .qi-kpi2-uom-row{display:flex;justify-content:space-between;align-items:center;padding:9px 0;border-bottom:1px solid var(--line);font-size:var(--fs-sm);}
  .qi-kpi2-uom-row:last-child{border-bottom:none;}
  .qi-kpi2-uom-row .uom-tag{font-family:'IBM Plex Mono',monospace;font-size:var(--fs-2xs);font-weight:700;color:var(--navy);background:var(--navy-light);border-radius:5px;padding:2px 7px;margin-right:8px;}

  .qi-kpi2-table-toolbar{display:flex;justify-content:space-between;align-items:center;gap:10px;margin-bottom:12px;flex-wrap:wrap;}
  .qi-kpi2-table-toolbar input[type="text"]{padding:8px 12px;border:1px solid var(--line-strong);border-radius:var(--radius-sm);font-size:var(--fs-sm);min-width:240px;}
  .qi-kpi2-pagination{display:flex;align-items:center;justify-content:flex-end;gap:8px;margin-top:12px;font-size:var(--fs-sm);color:var(--ink-soft);}
  .qi-kpi2-pagination button{padding:5px 10px;border:1px solid var(--line-strong);border-radius:var(--radius-sm);background:var(--panel);color:var(--ink);cursor:pointer;font-size:var(--fs-sm);}
  .qi-kpi2-pagination button:disabled{opacity:0.4;cursor:not-allowed;}
  .qi-table th.sortable{cursor:pointer;user-select:none;}
  .qi-table th.sortable .arrow{opacity:0.5;margin-left:3px;font-size:var(--fs-2xs);}
  .qi-table tbody tr.qi-kpi2-row-clickable{cursor:pointer;}
  .qi-table tbody tr.qi-kpi2-row-clickable:hover{background:var(--navy-light);}

  .qi-kpi2-skel{background:linear-gradient(90deg, var(--navy-light) 25%, var(--row-hover) 37%, var(--navy-light) 63%);background-size:400% 100%;animation:qiKpiShimmer 1.4s ease infinite;border-radius:6px;}
  @keyframes qiKpiShimmer{0%{background-position:100% 0;}100%{background-position:0 0;}}

  @media (max-width:1180px){
    .qi-kpi-row-8{grid-template-columns:repeat(3,1fr);}
  }
  @media (max-width:900px){
    #qiKpiView .qi-chart-row{flex-wrap:wrap;}
    #qiKpiView .qi-chart-card{flex:1 1 260px;}
    .qi-kpi-row-8{grid-template-columns:repeat(2,1fr);}
  }
  @media (max-width:560px){
    .qi-kpi-row-8{grid-template-columns:1fr;}
    .qi-kpi2-head{flex-direction:column;}
    .qi-kpi2-actions{width:100%;justify-content:space-between;}
  }

  @media print{
    body *{visibility:hidden;}
    #qiKpiView, #qiKpiView *{visibility:visible;}
    #qiKpiView{position:absolute;left:0;top:0;width:100%;padding:20px;}
    #qiKpiView .no-print{display:none !important;}
  }

  .qi-table-wrap{overflow-x:auto;border:1px solid var(--line);border-radius:var(--radius);background:var(--panel);}
  .qi-table{width:100%;border-collapse:collapse;font-size:var(--fs-sm);}
  .qi-table th{text-align:left;font-size:var(--fs-2xs);font-weight:700;text-transform:uppercase;letter-spacing:0.4px;color:var(--ink-soft);padding:10px 14px;border-bottom:1px solid var(--line);background:var(--navy-light);white-space:nowrap;}
  .qi-table td{padding:11px 14px;border-bottom:1px solid var(--line);vertical-align:top;}
  .qi-table tr:last-child td{border-bottom:none;}
  .qi-table tr:hover td{background:var(--row-hover);}

  /* Inline add/edit row (Facility Daily Log): a row of real inputs sized to
     their column instead of a popup. */
  #fac-draft-row td{padding:6px 8px;}
  #fac-draft-row input,
  #fac-draft-row select{width:100%;padding:5px 6px;font-size:var(--fs-sm);border:1px solid var(--line-strong);border-radius:4px;}

  /* Column-group band above the Daily Log's individual column headers,
     mirroring the Excel's own merged section headers (Batch Info / Rice /
     Finished Output / Filling Film / Bundle Nylon / Shrink Wrap / etc). */
  .qi-table th.fac-group-th{background:var(--navy);color:#fff;text-align:center;font-size:var(--fs-2xs);letter-spacing:0.4px;padding:6px 8px;white-space:nowrap;}
  /* Vertical divider at the first column of each topic band, carried down
     through the column headers and every row, so it's clear at a glance
     which columns the band above them belongs to. */
  .qi-table th.fac-group-start,
  .qi-table td.fac-group-start{border-left:2px solid var(--navy);}

  /* Per-row completeness dot: green once every required field is filled,
     red while something's still missing - reuses --green/--red like every
     other status signal in the app (see .qi-status-pill etc). */
  .fac-status-th{width:30px;}
  .fac-status-cell{text-align:center;}
  .fac-status-dot{display:inline-block;width:10px;height:10px;border-radius:50%;}
  .fac-status-dot.ok{background:var(--green);}
  .fac-status-dot.bad{background:var(--red);}

  /* Formula-derived cells: shaded so it's obvious at a glance which columns
     are typed vs auto-calculated - same gray already used for locked/system
     fields elsewhere (.obs-locked-input). */
  .qi-table td.fac-computed-cell{background:var(--gray-bg);color:var(--ink-soft);}
  .qi-issue-badge{display:inline-block;border:1px solid var(--line-strong);border-radius:5px;padding:2px 8px;font-family:'IBM Plex Mono',monospace;font-size:var(--fs-xs);font-weight:600;color:var(--navy);}
  .qi-item-name{font-weight:600;color:var(--ink);margin-bottom:2px;}
  .qi-item-desc{font-size:var(--fs-xs);color:var(--ink-soft);max-width:340px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
  .qi-type-badge{display:inline-block;border:1px solid;border-radius:5px;padding:2px 7px;font-size:var(--fs-2xs);font-weight:700;letter-spacing:0.3px;}
  .qi-type-badge.SQI{color:var(--red);border-color:var(--red);background:var(--red-bg);}
  .qi-type-badge.QI{color:var(--blue);border-color:var(--blue);background:var(--blue-bg);}
  .qi-type-badge.QA{color:var(--purple);border-color:var(--purple);background:var(--purple-bg);}
  /* Neutral variant for badge-shaped labels that carry no red/blue/purple
     status meaning (e.g. a free-text complaint "type" field). */
  .qi-type-badge.slate{color:var(--slate);border-color:var(--line-strong);background:var(--gray-bg);}
  .qi-status-pill{display:inline-flex;align-items:center;gap:4px;border-radius:20px;padding:3px 10px;font-size:var(--fs-xs);font-weight:700;border:1px solid;}
  .qi-status-pill.Closed{color:var(--green);border-color:var(--green);background:var(--green-bg);}
  .qi-status-pill.Open{color:var(--red);border-color:var(--red);background:var(--red-bg);}
  /* "In progress"/"pending verification" states use purple, not amber - a
     deliberate 4th semantic color for "actively being worked on" (distinct
     from amber's "not yet started/due soon"), consistent everywhere it's
     used (this pill, the QA type badge above, and chart legends). */
  .qi-status-pill.In-Progress{color:var(--purple);border-color:var(--purple);background:var(--purple-bg);}
  /* Audit lifecycle statuses */
  .qi-status-pill.Planned{color:var(--amber);border-color:var(--amber);background:var(--amber-bg);}
  .qi-status-pill.Completed{color:var(--green);border-color:var(--green);background:var(--green-bg);}
  .qi-status-pill.Cancelled{color:var(--slate);border-color:var(--slate);background:var(--gray-bg);}
  /* CAPA verification stage */
  .qi-status-pill.Pending-Verification{color:var(--purple);border-color:var(--purple);background:var(--purple-bg);}

  /* Dept. Tracker owner initial */
  .dept-avatar{
    width:30px; height:30px; border-radius:50%; flex-shrink:0;
    background:linear-gradient(160deg, var(--accent), var(--navy)); color:#fff;
    display:flex; align-items:center; justify-content:center;
    font-family:'IBM Plex Sans',sans-serif; font-weight:700; font-size:var(--fs-sm);
  }

  /* User Management — permission picker */
  .cp-modal-wide{ max-width:900px; }

  /* Invite / Edit user modal */
  .um-modal{ padding:0; display:flex; flex-direction:column; max-height:88vh; }
  .um-head{
    background:linear-gradient(160deg, var(--navy-3) 0%, var(--navy) 100%);
    padding:18px 24px; display:flex; justify-content:space-between;
    align-items:flex-start; gap:16px; flex-shrink:0;
  }
  .um-eyebrow{
    display:flex; align-items:center; gap:8px;
    font-size:var(--fs-2xs); font-weight:700; letter-spacing:1.1px;
    text-transform:uppercase; color:var(--on-navy-dim);
  }
  .um-title{
    font-family:'IBM Plex Sans',sans-serif; font-weight:700; font-size:var(--fs-xl);
    color:#fff; letter-spacing:-0.3px; margin-top:6px;
  }
  .um-sub{ font-size:var(--fs-sm); color:var(--on-navy-soft); margin-top:4px; }

  .um-body{ padding:6px 24px 4px; overflow-y:auto; flex:1; min-height:0; }
  .um-section{ padding:18px 0; border-bottom:1px solid var(--line); }
  .um-section:last-child{ border-bottom:none; }
  .um-section-head{ display:flex; align-items:flex-start; gap:11px; margin-bottom:13px; }
  .um-step{
    width:22px; height:22px; border-radius:50%; flex-shrink:0;
    background:var(--navy-light); color:var(--navy);
    display:flex; align-items:center; justify-content:center;
    font-family:'IBM Plex Mono',monospace; font-size:var(--fs-xs); font-weight:700;
  }
  .um-section-title{ font-size:var(--fs-base); font-weight:700; color:var(--navy); letter-spacing:-0.1px; }
  .um-section-hint{ font-size:var(--fs-xs); color:var(--ink-soft); margin-top:2px; line-height:1.5; }
  .um-section-actions{ margin-left:auto; display:flex; gap:8px; flex-shrink:0; }
  .um-fields{ display:grid; grid-template-columns:1fr 1fr; gap:14px; }
  .um-fields label{ display:block; font-size:var(--fs-xs); font-weight:600; color:var(--ink-soft); margin-bottom:5px; }
  .um-fields input, .um-fields select{ width:100%; padding:9px 11px; font-size:var(--fs-base); border-radius:var(--radius-sm); }
  .um-req{ font-weight:500; color:var(--accent); letter-spacing:0; }
  .um-hint{ font-size:var(--fs-xs); color:var(--ink-soft); margin-top:6px; }

  .um-pass-row{ display:flex; gap:8px; }
  .um-pass-row input{ flex:1; padding:9px 11px; font-size:var(--fs-base); font-family:'IBM Plex Mono',monospace; border-radius:var(--radius-sm); }
  .um-strength{ height:4px; border-radius:3px; background:var(--line); margin-top:9px; overflow:hidden; }
  .um-strength span{
    display:block; height:100%; width:0; border-radius:3px;
    background:var(--line-strong); transition:width .2s ease, background .2s ease;
  }
  .um-strength span.weak{ background:var(--red); }
  .um-strength span.ok{ background:var(--amber); }
  .um-strength span.good{ background:var(--green); }

  .um-fields-3{ display:grid; grid-template-columns:repeat(3,1fr); gap:14px; }

  /* Multi-select fields (Region/Company/Department): a button that opens a
     checkbox panel beneath it instead of a native <select multiple>. */
  .ms-field{ position:relative; }
  .ms-field label{ display:block; font-size:var(--fs-xs); font-weight:600; color:var(--ink-soft); margin-bottom:5px; }
  .ms-trigger{
    width:100%; text-align:left; padding:9px 11px; font-size:var(--fs-sm);
    border:1px solid var(--line-strong); border-radius:var(--radius-sm);
    background:var(--panel); color:var(--ink-soft); cursor:pointer;
    display:flex; justify-content:space-between; align-items:center; gap:6px;
  }
  .ms-trigger::after{ content:'▾'; font-size:var(--fs-2xs); color:var(--ink-soft); flex-shrink:0; }
  .ms-trigger.ms-has-value{ color:var(--ink); font-weight:600; }
  .ms-trigger:hover{ border-color:var(--navy); }
  .ms-panel{
    display:none; position:absolute; top:calc(100% + 4px); left:0; right:0; z-index:20;
    background:var(--panel); border:1px solid var(--line-strong); border-radius:var(--radius-sm);
    box-shadow:var(--shadow-lg); max-height:220px; overflow-y:auto; padding:6px;
  }
  .ms-panel.open{ display:block; }
  .ms-option{ display:flex; align-items:center; gap:8px; padding:7px 8px; border-radius:var(--radius-sm); font-size:var(--fs-sm); cursor:pointer; }
  .ms-option:hover{ background:var(--gray-bg); }
  .ms-empty{ font-size:var(--fs-xs); color:var(--ink-soft); font-style:italic; padding:8px; }

  .um-foot{
    display:flex; justify-content:space-between; align-items:center; gap:16px;
    padding:14px 24px; background:var(--gray-bg);
    border-top:1px solid var(--line); flex-shrink:0;
  }
  .um-foot-note{ font-size:var(--fs-xs); color:var(--ink-soft); line-height:1.5; }
  .um-foot-actions{ display:flex; gap:10px; flex-shrink:0; }

  @media (max-width:680px){
    .um-fields, .um-fields-3{ grid-template-columns:1fr; }
    .um-foot{ flex-direction:column; align-items:stretch; }
  }

  /* Task window — comments & attachments */
  .fp-tabs{ display:flex; gap:4px; margin-bottom:12px; }
  .fp-tab{
    background:transparent; border:1px solid var(--line); border-radius:20px;
    padding:6px 14px; font-size:var(--fs-xs); font-weight:600; color:var(--ink-soft);
    cursor:pointer; display:inline-flex; align-items:center; gap:6px;
    transition:all .14s;
  }
  .fp-tab:hover{ border-color:var(--line-strong); color:var(--ink); }
  .fp-tab.active{ background:var(--navy-light); border-color:var(--accent); color:var(--navy); }
  .fp-tab-count{
    font-family:'IBM Plex Mono',monospace; font-size:var(--fs-2xs); font-weight:700;
    color:var(--accent);
  }
  .fp-extra-list{
    max-height:200px; overflow-y:auto; margin-bottom:10px;
    border:1px solid var(--line); border-radius:var(--radius-sm);
    padding:10px 12px; background:var(--gray-bg);
  }
  .fp-file-row{
    display:flex; align-items:center; gap:10px; padding:7px 0;
    border-bottom:1px dashed var(--line);
  }
  .fp-file-row:last-child{ border-bottom:none; }
  .fp-file-row img{
    width:38px; height:38px; object-fit:cover; border-radius:5px;
    border:1px solid var(--line-strong); cursor:pointer; flex-shrink:0;
  }
  .fp-file-meta{ flex:1; min-width:0; }
  .fp-file-name{
    font-size:var(--fs-sm); font-weight:600; color:var(--ink);
    overflow:hidden; text-overflow:ellipsis; white-space:nowrap;
  }
  .fp-file-date{ font-size:var(--fs-2xs); color:var(--ink-soft); margin-top:1px; }

  .perm-grid{
    display:grid; grid-template-columns:repeat(auto-fill, minmax(250px, 1fr));
    gap:12px;
  }
  .perm-card{
    border:1px solid var(--line); border-radius:var(--radius-sm);
    background:var(--panel); overflow:hidden;
    transition:border-color .15s, box-shadow .15s;
  }
  .perm-card.is-on{
    border-color:var(--accent);
    box-shadow:0 0 0 1px rgba(62,111,217,0.18), 0 2px 8px rgba(62,111,217,0.10);
  }
  .perm-card-head{
    display:flex; align-items:center; gap:9px;
    padding:11px 13px; background:var(--gray-bg);
    border-bottom:1px solid var(--line);
    transition:background .15s;
  }
  .perm-card.is-on .perm-card-head{ background:var(--navy-light); }
  .perm-mod-icon{ font-size:var(--fs-base); line-height:1; }
  .perm-mod-name{
    font-size:var(--fs-sm); font-weight:700; color:var(--navy);
    letter-spacing:-0.1px; flex:1; min-width:0;
  }
  .perm-count{
    font-size:var(--fs-2xs); font-weight:600; color:var(--ink-soft);
    font-family:'IBM Plex Mono',monospace; white-space:nowrap;
  }

  /* Module on/off switch */
  .perm-mod-toggle{ display:inline-flex; margin:0; cursor:pointer; flex-shrink:0; }
  .perm-mod-toggle input{ position:absolute; opacity:0; width:0; height:0; }
  .perm-switch{
    width:30px; height:17px; border-radius:20px; background:#C9D2E0;
    position:relative; display:inline-block; transition:background .18s;
  }
  .perm-switch::after{
    content:''; position:absolute; top:2px; left:2px;
    width:13px; height:13px; border-radius:50%; background:#fff;
    transition:transform .18s; box-shadow:0 1px 2px rgba(0,0,0,0.2);
  }
  .perm-mod-toggle input:checked + .perm-switch{ background:var(--accent); }
  .perm-mod-toggle input:checked + .perm-switch::after{ transform:translateX(13px); }
  .perm-mod-toggle input:focus-visible + .perm-switch{ box-shadow:0 0 0 3px rgba(62,111,217,0.25); }

  /* Sub-page rows */
  .perm-rows{ padding:6px; display:flex; flex-direction:column; gap:2px; }
  .perm-row{
    display:flex; align-items:center; gap:9px; margin:0;
    padding:7px 9px; border-radius:6px; cursor:pointer;
    font-size:var(--fs-sm); color:var(--ink-soft); transition:background .12s, color .12s;
  }
  .perm-row:hover{ background:var(--gray-bg); }
  .perm-row input{ position:absolute; opacity:0; width:0; height:0; }
  .perm-tick{
    width:15px; height:15px; border-radius:4px; flex-shrink:0;
    border:1.5px solid var(--line-strong); background:var(--panel);
    position:relative; transition:all .14s;
  }
  .perm-tick::after{
    content:''; position:absolute; left:4px; top:1px;
    width:4px; height:8px; border:solid #fff;
    border-width:0 2px 2px 0; transform:rotate(45deg) scale(0);
    transition:transform .14s;
  }
  .perm-row input:checked + .perm-tick{ background:var(--accent); border-color:var(--accent); }
  .perm-row input:checked + .perm-tick::after{ transform:rotate(45deg) scale(1); }
  .perm-row input:focus-visible + .perm-tick{ box-shadow:0 0 0 3px rgba(62,111,217,0.25); }
  .perm-row.is-on{ color:var(--ink); font-weight:600; }
  .perm-row-label{ min-width:0; }
  .perm-none{ font-size:var(--fs-xs); color:var(--ink-soft); font-style:italic; padding:10px 13px; }
  .perms-disabled{ opacity:0.45; pointer-events:none; }

  /* Inline active/inactive control in the users table */
  .um-status-select{
    font-size:var(--fs-2xs); font-weight:700; letter-spacing:0.4px; padding:5px 8px;
    border-radius:20px; border:1px solid transparent; cursor:pointer;
    appearance:none; -webkit-appearance:none;
    transition:border-color .12s, box-shadow .12s;
  }
  .um-status-select:hover{ border-color:var(--line-strong); }
  .um-status-select:focus{ outline:none; border-color:var(--accent); box-shadow:0 0 0 3px rgba(62,111,217,0.15); }
  .um-status-select.is-active{ background:var(--green-bg); color:var(--green); }
  .um-status-select.is-inactive{ background:var(--red-bg); color:var(--red); }
  tr.um-row-inactive td:not(:nth-last-child(4)){ opacity:0.5; }
  .qi-followup-input{width:100%;border:1px solid transparent;background:transparent;font-size:var(--fs-sm);padding:3px 5px;border-radius:4px;}
  .qi-followup-input:hover, .qi-followup-input:focus{border-color:var(--line-strong);background:#fff;}

  /* CS Complaints — dynamic Excel-imported data table */
  .cp-scroll-nav{display:flex;align-items:center;gap:8px;margin-top:10px;}
  .data-table-wrap{overflow:auto;border:1px solid var(--line);border-radius:var(--radius);max-height:62vh;position:relative;}
  table.data-table{width:100%;border-collapse:collapse;font-size:var(--fs-sm);background:var(--panel);}
  table.data-table thead th{background:var(--navy-light);color:var(--navy);font-size:var(--fs-2xs);font-weight:700;text-transform:uppercase;letter-spacing:0.3px;padding:9px 12px;text-align:start;white-space:nowrap;border-bottom:1px solid var(--line);position:sticky;top:0;z-index:2;}
  table.data-table td{padding:8px 12px;border-bottom:1px solid var(--line);white-space:nowrap;text-align:start;}
  table.data-table tr{cursor:pointer;}
  table.data-table tr:hover td{background:var(--navy-light);}
  table.data-table td.dt-actions{text-align:right;cursor:default;}
  .qi-table td.dt-actions{text-align:right;white-space:nowrap;}

  /* Accidents & Incidents — internal Accidents/Analysis/Dashboard sub-tabs */
  .ac-subtabs{display:flex;gap:4px;padding-top:4px;}
  .ac-subtab{padding:9px 16px;font-size:var(--fs-sm);font-weight:600;color:var(--on-navy);cursor:pointer;border-radius:8px 8px 0 0;}
  .ac-subtab:hover{color:#fff;background:rgba(255,255,255,0.06);}
  .ac-subtab.active{background:var(--panel);color:var(--navy);}
  .ac-code-badge{display:inline-block;border:1px solid var(--line-strong);border-radius:5px;padding:2px 8px;font-family:'IBM Plex Mono',monospace;font-size:var(--fs-xs);font-weight:600;color:var(--navy);}
  .ac-class-badge{display:inline-block;border:1px solid;border-radius:5px;padding:2px 7px;font-size:var(--fs-2xs);font-weight:700;}
  .ac-class-badge.c1{color:var(--blue);border-color:var(--blue);background:var(--blue-bg);}
  .ac-class-badge.c2{color:var(--amber);border-color:var(--amber);background:var(--amber-bg);}
  .ac-class-badge.c3{color:var(--amber);border-color:var(--amber);background:var(--amber-bg);}
  .ac-class-badge.c4{color:var(--red);border-color:var(--red);background:var(--red-bg);}
  .ac-status-icon{width:26px;height:26px;border-radius:5px;border:1px solid var(--line-strong);background:var(--panel);display:flex;align-items:center;justify-content:center;cursor:pointer;font-size:var(--fs-sm);}
  .ac-aging{font-size:var(--fs-2xs);color:#C0392B;margin-top:3px;}
  .ac-na-row{display:flex;align-items:center;gap:10px;padding:9px 0;border-bottom:1px solid var(--line);font-size:var(--fs-sm);}
  .ac-na-row:last-child{border-bottom:none;}
  .ac-na-desc{flex:1;color:var(--ink);}
  .ac-na-meta{display:flex;gap:8px;align-items:center;font-size:var(--fs-2xs);color:var(--ink-soft);}
  .ac-na-tag{padding:2px 7px;border-radius:20px;font-size:var(--fs-2xs);font-weight:700;}
  .ac-na-tag.capa{background:#F1ECF8;color:#6B4FA0;}
  .ac-na-tag.mol{background:#FBF3E3;color:var(--amber);}

  /* Quality Incidents — Analysis Report */
  .qir-overlay{position:fixed;inset:0;background:#4a4d50;z-index:2000;overflow-y:auto;padding:30px 0 60px;}
  .qir-toolbar{position:sticky;top:0;z-index:10;display:flex;justify-content:center;gap:10px;padding:12px;background:#33363a;margin-bottom:24px;}
  .qir-toolbar .btn.secondary{background:transparent;border:1px solid rgba(255,255,255,0.3);color:#fff;}
  .qir-page{background:#fff;max-width:840px;margin:0 auto;padding:46px 56px;box-shadow:0 6px 30px rgba(0,0,0,0.35);border-radius:4px;color:#232323;}
  .qir-header{display:flex;justify-content:space-between;align-items:center;border-bottom:3px solid var(--navy);padding-bottom:16px;margin-bottom:26px;gap:16px;}
  .qir-logo{width:56px;height:56px;object-fit:contain;flex-shrink:0;}
  .qir-header-center{text-align:center;flex:1;}
  .qir-header-title{font-family:'IBM Plex Sans',sans-serif;font-weight:700;font-size:var(--fs-xl);color:var(--navy);}
  .qir-header-sub{font-size:var(--fs-xs);color:#555;margin-top:3px;}
  .qir-header-meta{font-size:var(--fs-2xs);color:#8a8a8a;margin-top:7px;}
  .qir-section{margin-bottom:24px;}
  .qir-section-title{font-family:'IBM Plex Sans',sans-serif;font-weight:700;font-size:var(--fs-sm);color:var(--navy);text-transform:uppercase;letter-spacing:0.4px;border-bottom:1px solid #e2e2e2;padding-bottom:6px;margin-bottom:12px;}
  .qir-summary{font-size:var(--fs-sm);line-height:1.75;color:#333;}
  .qir-kpi-grid{display:grid;grid-template-columns:repeat(6,1fr);gap:9px;}
  .qir-kpi{background:var(--row-hover);border:1px solid #E3E8F0;border-radius:6px;padding:11px 6px;text-align:center;}
  .qir-kpi-n{font-family:'IBM Plex Sans',sans-serif;font-weight:700;font-size:var(--fs-lg);color:var(--navy);}
  .qir-kpi-l{font-size:var(--fs-2xs);color:#8a8a8a;text-transform:uppercase;margin-top:3px;letter-spacing:0.2px;}
  .qir-two-col{display:grid;grid-template-columns:1fr 1fr;gap:24px;}
  .qir-table{width:100%;border-collapse:collapse;font-size:var(--fs-xs);}
  .qir-table th{text-align:left;font-size:var(--fs-2xs);text-transform:uppercase;color:#8a8a8a;padding:6px 8px;border-bottom:2px solid #e2e2e2;letter-spacing:0.2px;}
  .qir-table td{padding:7px 8px;border-bottom:1px solid #f0f0f0;}
  .qir-recs ul{margin:0;padding-left:20px;}
  .qir-recs li{font-size:var(--fs-sm);line-height:1.7;margin-bottom:8px;color:#333;}
  .qir-footer{text-align:center;font-size:var(--fs-2xs);color:#aaa;margin-top:28px;padding-top:14px;border-top:1px solid #f0f0f0;}

  @media print{
    body *{visibility:hidden;}
    .qir-page, .qir-page *{visibility:visible;}
    .qir-page{position:absolute;left:0;top:0;width:100%;box-shadow:none;margin:0;padding:20px 40px;}
    .qir-toolbar{display:none !important;}
    @page{margin:14mm;}
  }

  /* Complaint add/edit modal */
  .cp-modal-overlay{position:fixed;inset:0;background:rgba(10,14,20,0.55);display:flex;align-items:center;justify-content:center;z-index:1000;padding:24px;}
  .cp-modal{background:#fff;border-radius:var(--radius);box-shadow:var(--shadow-lg);max-width:680px;width:100%;max-height:85vh;overflow-y:auto;padding:24px;border-top:3px solid var(--navy);}
  .cp-modal h3{margin:0 0 18px;font-family:'IBM Plex Sans',sans-serif;color:var(--navy);font-size:var(--fs-lg);}
  .cp-modal-grid{display:grid;grid-template-columns:1fr 1fr;gap:12px;margin-bottom:18px;}
  .cp-modal-grid label{display:block;font-size:var(--fs-xs);font-weight:600;color:var(--ink-soft);text-transform:uppercase;letter-spacing:0.3px;margin-bottom:4px;}
  .cp-modal-grid input{width:100%;}
  .cp-modal-grid .full{grid-column:1/-1;}
  .cp-modal-actions{display:flex;justify-content:flex-end;gap:8px;}
  @media (max-width:640px){ .cp-modal-grid{grid-template-columns:1fr;} }

  /* Non-Conformity — repeatable item block (Item #/Name/UOM/Lot/Qty/Expiry per row) */
  .qi-items-table{border:1px solid var(--line);border-radius:8px;overflow:hidden;margin-top:2px;}
  .qi-items-head, .qi-item-row{display:grid;grid-template-columns:100px 1.6fr 90px 100px 90px 120px 30px;gap:8px;align-items:center;padding:8px 10px;}
  .qi-items-head{background:var(--navy-light);font-size:var(--fs-2xs);font-weight:700;text-transform:uppercase;letter-spacing:0.3px;color:var(--ink-soft);}
  .qi-item-row{border-top:1px solid var(--line);}
  .qi-item-row input, .qi-item-row select{width:100%;font-size:var(--fs-sm);padding:6px 8px;}
  .qi-item-remove-btn{background:none;border:none;color:var(--ink-soft);cursor:pointer;font-size:var(--fs-md);line-height:1;padding:4px;border-radius:6px;justify-self:center;}
  .qi-item-remove-btn:hover{background:var(--red-bg);color:var(--red);}
  .qi-item-remove-btn:disabled{opacity:0.3;cursor:not-allowed;}
  .qi-add-item-btn{margin-top:8px;padding:6px 12px;font-size:var(--fs-sm);}
  .qi-item-name .qi-item-more{font-size:var(--fs-2xs);font-weight:600;color:var(--ink-soft);background:var(--navy-light);border-radius:5px;padding:1px 6px;margin-left:6px;}

  /* Non-Conformity — "CAPA needed" tick + the reserved CAPA badge once one exists */
  .qi-capa-check{display:flex;align-items:center;gap:7px;font-size:var(--fs-sm);font-weight:500;color:var(--ink);cursor:pointer;padding:7px 0;}
  .qi-capa-check input{width:auto;margin:0;}
  .qi-capa-linked{display:flex;align-items:center;gap:8px;}
  .qi-capa-linked .btn{padding:4px 10px;font-size:var(--fs-xs);}

  /* Non-Conformity modal — extra wide, with roomier fields than the standard
     cp-modal, since it packs a repeatable item row and a full-width description. */
  .qi-nc-modal{max-width:1120px;padding:28px 34px;}
  .qi-nc-modal .cp-modal-grid{gap:18px 22px;}
  .qi-nc-modal .cp-modal-grid input,
  .qi-nc-modal .cp-modal-grid select,
  .qi-nc-modal .cp-modal-grid textarea{padding:10px 12px;font-size:var(--fs-base);}
  /* #qi-desc otherwise inherits the browser's bare <textarea> look (monospace,
     grey border, no set width) since textarea isn't covered by the shared
     input/select styling rule — match it to the Topic box beside it instead. */
  .qi-nc-modal .cp-modal-grid textarea{
    width:100%;font-family:'Inter',sans-serif;color:var(--ink);background:var(--panel);
    border:1px solid var(--line-strong);border-radius:var(--radius-sm);
  }
  .qi-nc-modal #qi-desc{height:38px;min-height:38px;resize:vertical;}
  .qi-nc-modal .qi-items-head, .qi-nc-modal .qi-item-row{grid-template-columns:110px 2fr 110px 120px 100px 140px 34px;gap:12px;padding:10px 12px;}
  .qi-nc-modal .qi-item-row input, .qi-nc-modal .qi-item-row select{padding:8px 10px;font-size:var(--fs-base);}
  @media (max-width:1180px){ .qi-nc-modal{max-width:94vw;} }

  /* QMS Search */
  .qms-search-wrap{max-width:720px;margin:48px auto 0;text-align:center;padding:0 12px;}
  .qms-search-title{font-family:'IBM Plex Sans',sans-serif;font-weight:700;font-size:var(--fs-2xl);color:var(--navy);margin:0 0 6px;}
  .qms-search-sub{font-size:var(--fs-base);color:var(--ink-soft);margin:0 0 24px;}
  .qms-search-box{display:flex;gap:10px;background:var(--panel);border:1px solid var(--line);border-radius:var(--radius);box-shadow:var(--shadow-hover);padding:8px;transition:border-color 140ms var(--ease-out), box-shadow 140ms var(--ease-out);}
  .qms-search-box:focus-within{border-color:var(--accent);box-shadow:0 0 0 3px rgba(62,111,217,0.18);}
  .qms-search-box input{flex:1;border:none;padding:14px 16px;font-size:var(--fs-md);border-radius:var(--radius-sm);}
  .qms-search-box input:focus{outline:none;box-shadow:none;}
  .qms-search-box .btn{padding:12px 24px;}
  .qms-search-examples{font-size:var(--fs-xs);color:var(--ink-soft);margin-top:14px;font-style:italic;}
  #qmsDataStamp{display:block;margin-top:4px;font-style:normal;}
  #qmsAnswer{margin-top:28px;text-align:left;}
  .qms-answer-card{background:var(--panel);border:1px solid var(--line);border-radius:var(--radius);box-shadow:var(--shadow);padding:20px 22px;}
  .qms-answer-card h4{margin:0 0 10px;font-family:'IBM Plex Sans',sans-serif;color:var(--navy);font-size:var(--fs-md);}
  .qms-answer-list{margin:8px 0 0;padding-left:18px;font-size:var(--fs-base);line-height:1.6;}
  .qms-answer-list li{margin-bottom:4px;}
  .qms-loading-dots{color:var(--ink-soft);font-size:var(--fs-base);text-align:center;}

  /* Fire Extinguishers - same banner + white-body structure as First Aid.
     The banner still carries the check-state color (navy = not checked yet
     this month, green = checked-ok, red = problem - unchanged rules, just
     filling the banner instead of tinting the card/border); the type badge
     (CO2/Powder/FM200/Halon) keeps its own distinct fill color and now
     floats on the banner with a white ring so it stays legible even when
     both colors land in the same red family (a Halon problem, say). */
  .ext-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(108px,1fr));gap:10px;}
  .ext-card{background:var(--panel);border:1px solid var(--line);padding:0;cursor:pointer;text-align:center;position:relative;border-radius:var(--radius-sm);box-shadow:var(--shadow);overflow:hidden;transition:box-shadow .15s, transform .15s;}
  .ext-card:hover{box-shadow:var(--shadow-hover);transform:translateY(-2px);}
  .ext-card.problem{animation:extBlink 1.2s ease-in-out infinite;}
  @media (prefers-reduced-motion: reduce){
    .ext-card.problem{animation:none;}
  }
  @keyframes extBlink{
    0%,100%{opacity:1;box-shadow:0 0 0 0 rgba(192,57,43,0.55);}
    50%{opacity:0.55;box-shadow:0 0 0 7px rgba(192,57,43,0);}
  }
  .ext-banner{background:var(--navy);padding:12px 0;display:flex;align-items:center;justify-content:center;transition:background .15s;}
  .ext-card.checked-ok .ext-banner{background:var(--green);}
  .ext-card.problem .ext-banner{background:var(--red);}
  /* Halon is the one exception to "banner = check-state color" - its
     banner is a fixed type-identity purple regardless of checked/problem
     (the blink animation on .problem still fires, so a Halon problem is
     still flagged - just not through the banner's own color). Declared
     after the state-color rules above so it wins the tie on specificity. */
  .ext-card.Halon .ext-banner{background:var(--purple);}
  /* font-size:8px is deliberate and off-scale: this is a glyph label
     ("CO2"/"FM200") crammed into a 26px disc, not readable body text. */
  .ext-type-icon{width:26px;height:26px;border-radius:50%;display:flex;align-items:center;justify-content:center;color:#fff;font-size:8px;font-weight:800;letter-spacing:0.2px;border:2px solid rgba(255,255,255,0.75);}
  .ext-type-icon.CO2{background:var(--blue);}
  .ext-type-icon.Powder{background:var(--amber);}
  .ext-type-icon.FM200{background:var(--purple);}
  .ext-type-icon.Halon{background:var(--red);}
  .ext-body{padding:10px 8px;}
  .ext-number{font-family:'IBM Plex Sans',sans-serif;font-weight:700;font-size:var(--fs-sm);color:var(--navy);margin-bottom:2px;}
  .ext-wh{font-size:var(--fs-2xs);color:var(--ink-soft);}
  .ext-area{font-size:var(--fs-2xs);color:var(--ink-soft);}
  .ext-month-header{display:grid;grid-template-columns:110px 90px 90px 1fr 100px;gap:8px;background:var(--navy-light);border:1px solid var(--line);padding:8px 10px;font-size:var(--fs-2xs);font-weight:700;text-transform:uppercase;letter-spacing:0.4px;color:var(--navy);}
  .ext-month-row{display:grid;grid-template-columns:110px 90px 90px 1fr 100px;gap:8px;align-items:center;background:var(--panel);border:1px solid var(--line);border-top:none;padding:7px 10px;}

  /* First Aid boxes - a colored banner (red = not checked this month, green
     = checked) with a medical cross, like the box's own real-world label,
     rather than a small standalone icon above the text. */
  .fa-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(150px,1fr));gap:12px;}
  .fa-card{background:var(--panel);border:1px solid var(--line);padding:0;cursor:pointer;text-align:center;position:relative;transition:box-shadow .12s;}
  .fa-card:hover{box-shadow:var(--shadow-hover);}
  .fa-banner{background:var(--red);padding:18px 0;display:flex;align-items:center;justify-content:center;transition:background .15s;}
  .fa-banner.checked{background:var(--green);}
  .fa-cross{width:28px;height:28px;position:relative;}
  .fa-cross::before{content:'';position:absolute;background:#fff;width:28px;height:8px;top:10px;left:0;border-radius:2px;}
  .fa-cross::after{content:'';position:absolute;background:#fff;width:8px;height:28px;top:0;left:10px;border-radius:2px;}
  .fa-body{padding:14px;}
  .fa-wh{font-family:'IBM Plex Sans',sans-serif;font-weight:700;font-size:var(--fs-md);color:var(--navy);margin-bottom:4px;}
  .fa-area{font-size:var(--fs-sm);color:var(--ink-soft);}
  .fa-month-header{display:grid;grid-template-columns:110px 130px 1fr 100px;gap:8px;background:var(--navy-light);border:1px solid var(--line);padding:8px 10px;font-size:var(--fs-2xs);font-weight:700;text-transform:uppercase;letter-spacing:0.4px;color:var(--navy);}
  .fa-month-row{display:grid;grid-template-columns:110px 130px 1fr 100px;gap:8px;align-items:center;background:var(--panel);border:1px solid var(--line);border-top:none;padding:7px 10px;}
  .fa-month-name{font-size:var(--fs-sm);font-weight:600;}
  .fa-comment-input{width:100%;font-size:var(--fs-sm);padding:6px 8px;border:1px solid var(--line);border-radius:var(--radius-sm);}
  .fa-attach-cell{display:flex;gap:4px;align-items:center;}
  .fa-del{position:absolute;top:6px;right:6px;width:22px;height:22px;min-width:22px;padding:0;font-size:var(--fs-xs);}

  /* First Aid report */
  .fa-report-toolbar{display:flex;justify-content:space-between;align-items:flex-end;flex-wrap:wrap;gap:14px;margin:16px 0;}
  .report-card{background:var(--panel);border:1px solid var(--line);border-radius:var(--radius);box-shadow:0 1px 2px rgba(20,30,50,0.05);padding:22px 24px;margin-bottom:20px;}
  .report-head{display:flex;justify-content:space-between;align-items:flex-start;gap:16px;padding-bottom:16px;margin-bottom:18px;border-bottom:1px solid var(--line);}
  .report-title{font-family:'IBM Plex Sans',sans-serif;font-weight:700;font-size:var(--fs-xl);color:var(--navy);letter-spacing:-0.2px;}
  .report-meta{font-size:var(--fs-sm);color:var(--ink-soft);margin-top:4px;}
  .report-generated{font-size:var(--fs-xs);color:var(--ink-soft);white-space:nowrap;font-family:'IBM Plex Mono',monospace;}
  .report-kpis{display:grid;grid-template-columns:repeat(4,1fr);gap:14px;}
  .report-kpi{background:var(--gray-bg);border-radius:var(--radius-sm);padding:14px 16px;text-align:center;}
  .report-kpi-value{font-family:'IBM Plex Sans',sans-serif;font-weight:700;font-size:var(--fs-2xl);color:var(--navy);font-variant-numeric:tabular-nums;}
  .report-kpi-label{font-size:var(--fs-2xs);font-weight:700;text-transform:uppercase;letter-spacing:0.4px;color:var(--ink-soft);margin-top:4px;}
  .report-site{margin-bottom:18px;}
  .report-site-head{display:flex;justify-content:space-between;align-items:baseline;margin-bottom:10px;}
  .report-site-name{font-family:'IBM Plex Sans',sans-serif;font-weight:700;font-size:var(--fs-md);color:var(--navy);}
  .report-site-stats{font-size:var(--fs-sm);color:var(--ink-soft);display:flex;align-items:center;gap:8px;}
  .report-pct{font-size:var(--fs-xs);font-weight:700;padding:2px 8px;border-radius:20px;background:var(--gray-bg);color:var(--slate);}
  .report-pct.full{background:var(--green-bg);color:var(--green);}
  .report-pct.zero{background:var(--red-bg);color:var(--red);}
  @media print{
    .page-banner, .fa-report-toolbar, #sidebar, .sidebar{display:none !important;}
  }

  /* Site observations */
  .obs-row-header{display:grid;grid-template-columns:88px 108px 1fr 122px 98px 122px 118px 108px 40px 40px 64px;gap:8px;background:var(--navy-light);border:1px solid var(--line);padding:7px 10px;}
  .obs-row-header .cell{font-size:var(--fs-2xs);font-weight:700;text-transform:uppercase;letter-spacing:0.4px;color:var(--navy);}
  .obs-card{display:grid;grid-template-columns:88px 108px 1fr 122px 98px 122px 118px 108px 40px 40px 64px;gap:8px;align-items:center;background:var(--panel);border:1px solid var(--line);border-top:none;padding:7px 10px;}
  .obs-cell{font-size:var(--fs-sm);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
  /* The ellipsis/overflow rule above is for plain text cells - a cell
     holding an icon+badge button needs to stay visible instead, since the
     badge deliberately pokes a few px outside the icon's own edges and
     would otherwise get clipped right where it matters most. */
  .obs-cell:has(.obs-photo-icon){overflow:visible;}
  .obs-text{font-size:var(--fs-sm);font-weight:500;white-space:normal;}
  .obs-photo-icon{position:relative;width:26px;height:26px;border:1px solid var(--line-strong);border-radius:var(--radius-sm);background:var(--panel);cursor:pointer;font-size:var(--fs-sm);color:var(--navy);}
  /* Date/Raised By read as plain data (the first occurrence's own value,
     plus a "+N" for a repeated cycle's history) rather than an icon
     control - same click-to-reveal popover as comments/photos, just
     without a badge, so the underline-on-hover is the only affordance. */
  .obs-text-btn{background:none;border:none;padding:0;margin:0;font:inherit;font-size:var(--fs-sm);color:var(--ink);cursor:pointer;text-align:left;display:block;width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
  .obs-text-btn:hover{color:var(--navy);text-decoration:underline;}
  .obs-text-btn:focus-visible{outline:2px solid var(--accent);outline-offset:2px;border-radius:2px;}
  /* Popover the comments/photos/date/raised-by icons open - position:fixed
     for the same reason as #obsNotifPanel: escapes .page-banner's
     overflow:hidden. */
  .obs-info-popover{position:fixed;width:280px;max-height:320px;overflow-y:auto;background:var(--panel);border:1px solid var(--line);border-radius:var(--radius);box-shadow:var(--shadow-lg);z-index:210;padding:8px 12px;}
  .obs-info-popover .comment-item:last-child{border-bottom:none;}
  .obs-info-photo-btn{width:auto;height:auto;padding:6px 10px;font-size:var(--fs-xs);display:block;margin-bottom:6px;text-align:left;}
  .obs-info-photo-btn:last-child{margin-bottom:0;}
  .obs-info-line{font-size:var(--fs-sm);padding:5px 2px;border-bottom:1px dashed var(--line);}
  .obs-info-line:last-child{border-bottom:none;}
  .obs-info-sub{color:var(--ink-soft);font-size:var(--fs-xs);}
  .obs-actions{display:flex;gap:8px;justify-content:flex-end;}
  /* A recurring finding's badge and its raised-by count both pulse gently
     to draw the eye - same finding happening again is worth a second
     look. Respects reduced-motion since it's a decorative attention cue,
     not information carried only by the animation itself (the badge text
     and count still say the same thing while static). */
  .obs-repeat-badge{display:inline-block;font-size:var(--fs-2xs);font-weight:700;text-transform:uppercase;letter-spacing:0.3px;padding:3px 7px;border-radius:20px;background:var(--amber-bg);color:var(--amber);white-space:nowrap;margin-left:6px;}
  @keyframes obsBlink{0%,100%{opacity:1;}50%{opacity:0.4;}}
  .obs-blink{animation:obsBlink 1.4s ease-in-out infinite;}
  @media (prefers-reduced-motion: reduce){
    .obs-blink{animation:none;}
  }
  .obs-lightbox-overlay{position:fixed;inset:0;background:rgba(10,14,20,0.82);display:flex;align-items:center;justify-content:center;z-index:1000;padding:30px;}
  .obs-lightbox-overlay img{max-width:90vw;max-height:88vh;border-radius:4px;}
  .obs-lightbox-close{position:absolute;top:22px;right:26px;color:#fff;font-size:var(--fs-2xl);cursor:pointer;background:none;border:none;line-height:1;}

  /* Projects */
  .project-card{background:var(--panel);border:1px solid var(--line);margin-bottom:12px;}
  .project-card-header{display:flex;justify-content:space-between;align-items:center;padding:14px 16px;cursor:pointer;gap:14px;}
  .project-card-header:hover{background:var(--row-hover);}
  .project-main{flex:1;min-width:0;}
  .project-name-row{display:flex;align-items:center;gap:8px;margin-bottom:6px;}
  .project-name{font-family:'IBM Plex Sans',sans-serif;font-weight:700;font-size:var(--fs-md);color:var(--ink);}
  .project-meta-row{display:flex;align-items:center;gap:10px;font-size:var(--fs-sm);color:var(--ink-soft);}
  .project-progress-track{width:160px;height:6px;background:var(--gray-bg);border-radius:4px;overflow:hidden;flex-shrink:0;}
  .project-progress-fill{height:100%;background:var(--navy);}
  .project-status-pill{font-size:var(--fs-2xs);font-weight:700;text-transform:uppercase;letter-spacing:0.3px;padding:3px 8px;border-radius:var(--radius-sm);white-space:nowrap;}
  .project-status-pill.ontrack{background:var(--blue-bg);color:var(--blue);}
  .project-status-pill.duesoon{background:var(--amber-bg);color:var(--amber);}
  .project-status-pill.overdue{background:var(--red-bg);color:var(--red);}
  .project-status-pill.complete{background:var(--green-bg);color:var(--green);}
  .project-status-pill.none{background:var(--gray-bg);color:var(--slate);}
  .project-actions{display:flex;gap:8px;align-items:center;flex-shrink:0;}
  .project-chevron{font-size:var(--fs-sm);color:var(--ink-soft);transition:transform .15s;flex-shrink:0;}
  .project-chevron.open{transform:rotate(90deg);}
  .project-tasks-panel{border-top:1px solid var(--line);background:var(--surface-sunk);height:0;overflow:hidden;}
  .project-tasks-panel.open{height:auto;}
  .project-tasks-panel.open .panel-inner{padding:12px 16px 14px;max-height:1200px;overflow-y:auto;}
  .ptask-row{display:grid;grid-template-columns:16px 1fr 114px 108px 112px 32px 30px;gap:6px;align-items:center;background:var(--panel);border:1px solid var(--line);padding:7px 8px;}
  .ptask-row.closed{opacity:0.6;}
  .ptask-row.closed .ptask-text{text-decoration:line-through;color:var(--ink-soft);}
  .ptask-block{margin-bottom:6px;}
  .ptask-block:last-child{margin-bottom:0;}
  .ptask-handle{cursor:grab;color:var(--ink-soft);font-size:var(--fs-base);text-align:center;user-select:none;}
  .ptask-handle:active{cursor:grabbing;}
  .ptask-text-input{border:none;background:transparent;width:100%;font-size:var(--fs-base);padding:4px 2px;}
  .ptask-text-input:focus{outline:1px solid var(--navy);border-radius:2px;}
  .ptask-add-row{display:flex;gap:8px;margin-top:8px;}
  .ptask-add-row input{flex:1;}
  .no-ptasks{font-size:var(--fs-sm);color:var(--ink-soft);font-style:italic;margin-bottom:8px;}
  .proj-tag{display:inline-flex;align-items:center;gap:3px;font-size:var(--fs-2xs);font-weight:600;color:var(--navy);background:var(--navy-light);padding:2px 6px;border-radius:var(--radius-sm);white-space:nowrap;}

  /* Calendar */
  .cal-nav{display:flex;align-items:center;justify-content:space-between;background:var(--navy);color:#fff;padding:12px 16px;margin-bottom:0;}
  .cal-nav .month-label{font-family:'IBM Plex Sans',sans-serif;font-weight:700;font-size:var(--fs-md);}
  .cal-nav button{background:rgba(255,255,255,0.12);border:none;border-radius:var(--radius-sm);width:30px;height:30px;cursor:pointer;font-size:var(--fs-md);color:#fff;}
  .cal-nav button:hover{background:rgba(255,255,255,0.22);}
  .cal-grid{display:grid;grid-template-columns:repeat(7,1fr);gap:1px;background:var(--line);border:1px solid var(--line);}
  .cal-dow{font-size:var(--fs-2xs);font-weight:700;text-transform:uppercase;letter-spacing:0.4px;color:var(--ink-soft);text-align:center;padding:8px 0;background:var(--navy-light);}
  .cal-cell{background:var(--panel);min-height:106px;padding:8px;transition:background .12s;}
  .cal-cell.other-month{opacity:0.4;}
  .cal-cell.is-past{background:var(--gray-bg);}
  .cal-cell.dragover{background:var(--navy-light);}
  .cal-cell.is-today{box-shadow:inset 0 0 0 2px var(--navy);}
  .cal-daynum{font-size:var(--fs-sm);font-weight:700;color:var(--ink-soft);margin-bottom:5px;}
  .cal-chip{font-size:var(--fs-2xs);font-weight:600;padding:4px 6px;border-radius:2px;margin-bottom:4px;cursor:grab;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;background:var(--navy-light);color:var(--navy);border-left:3px solid var(--navy);}
  .cal-chip.High{border-left-color:var(--red);} .cal-chip.Medium{border-left-color:var(--amber);} .cal-chip.Low{border-left-color:var(--slate);}
  .cal-chip .co-badge{padding:1px 5px;font-size:var(--fs-2xs);}
  .cal-chip:active{cursor:grabbing;}

  /* Home */
  .home-wrap{max-width:1160px;margin:0 auto;padding:0 24px 90px;}
  .home-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:14px;}
  .home-tile{background:var(--panel);border:1px solid var(--line);border-top:3px solid var(--navy);padding:20px 18px;cursor:pointer;}
  .home-tile:hover{border-color:var(--line-strong);box-shadow:var(--shadow-hover);transform:translateY(-1px);}
  .home-tile-bar{width:28px;height:3px;background:var(--navy);margin-bottom:14px;}
  .home-tile-title{font-family:'IBM Plex Sans',sans-serif;font-weight:700;font-size:var(--fs-lg);color:var(--navy);margin-bottom:6px;}
  .home-tile-desc{font-size:var(--fs-sm);color:var(--ink-soft);line-height:1.5;}
  @media (max-width:820px){
    .home-grid{grid-template-columns:1fr 1fr;}
  }

  @media (max-width:820px){
    .row, .row-header{grid-template-columns:5px 1fr;grid-auto-rows:auto;}
    .row .cell:not(.action-cell), .row-header .cell:not(:nth-child(2)){display:none;}
    .row .action-cell{padding:12px 12px 4px;}
    .row-actions{display:flex;padding:6px 12px 12px;justify-self:end;grid-column:2/3;}
    .summary{grid-template-columns:repeat(2,1fr);}
    .form-grid{grid-template-columns:1fr;}
    .cal-grid{grid-template-columns:repeat(7,minmax(70px,1fr));overflow-x:auto;}
  }

  /* ============================================================
     DESIGN REFRESH — visual polish layer (structure untouched)
     ============================================================ */

  html,body{background:
    radial-gradient(1200px 500px at 15% -10%, rgba(62,111,217,0.06), transparent 60%),
    var(--bg);}

  /* Sidebar: subtle gradient + soft edge instead of flat navy */
  .sidebar{
    background:linear-gradient(90deg, var(--navy-2) 0%, var(--navy-dark) 100%);
    box-shadow:0 2px 24px rgba(10,16,30,0.18);
    border-bottom:1px solid rgba(255,255,255,0.05);
  }
  .sidebar-title{letter-spacing:0.6px;}
  .nav-item{border-radius:8px;position:relative;}
  .nav-item.active{background:rgba(255,255,255,0.14);}
  .nav-subitem{border-radius:8px;}
  .nav-subitem.active{background:rgba(90,140,230,0.22);}
  .sidebar-signout{border-radius:var(--radius-sm);}
  .sidebar-signout:hover{background:rgba(255,255,255,0.06);}

  /* Topbar with gentle gradient + depth */
  .topbar{background:linear-gradient(120deg, var(--navy) 0%, var(--navy-2) 100%);box-shadow:0 6px 20px rgba(15,22,40,0.12);border-radius:0 0 var(--radius) var(--radius);}
  .topbar h1{letter-spacing:0.3px;}

  /* Summary cards: elevate, round, add accent bar */
  .summary{background:transparent;border:none;gap:14px;}
  .summary .card{border-radius:var(--radius);box-shadow:var(--shadow);border:1px solid var(--line);transition:box-shadow .15s, transform .15s;}
  .summary .card:hover{box-shadow:var(--shadow-hover);transform:translateY(-2px);}
  .summary .card .n{font-size:var(--fs-2xl);}

  /* Inputs & selects */
  select, input[type=text], input[type=date], input[type=search], .comment-add textarea{
    border-radius:var(--radius-sm);transition:box-shadow .15s, border-color .15s;
  }
  select:focus, input:focus, .comment-add textarea:focus{box-shadow:0 0 0 3px rgba(62,111,217,0.14);border-color:var(--accent);}

  /* Tabs & subtabs: rounded pill group */
  .tabs{border:none;background:var(--gray-bg);border-radius:var(--radius-sm);padding:3px;gap:2px;}
  .tab{border-right:none;border-radius:6px;}
  .tab.active{background:var(--panel);color:var(--navy);box-shadow:0 1px 3px rgba(20,30,50,0.12);font-weight:700;}
  .tab:hover:not(.active){background:rgba(255,255,255,0.6);}
  .tab-badge{box-shadow:0 0 0 2px var(--gray-bg);}

  /* Panels, lists, cards: rounded + soft shadow instead of hard boxes */
  .form-panel{border-radius:var(--radius);border-top:none;box-shadow:var(--shadow-lg);position:relative;}
  .form-panel::before{content:'';position:absolute;top:0;left:0;right:0;height:3px;border-radius:var(--radius) var(--radius) 0 0;background:linear-gradient(90deg, var(--accent), var(--navy));}
  .list-container{border-radius:var(--radius);overflow:hidden;box-shadow:var(--shadow);border:1px solid var(--line);}
  .row-header{border-top:none;}
  .row:hover{background:var(--navy-light);}
  .empty{border-radius:var(--radius);border:1px dashed var(--line-strong);background:var(--panel);}

  /* Badges & pills: rounder, slightly bolder */
  .badge, .co-badge, .project-status-pill, .status-select{border-radius:20px;}
  .status-select{border-radius:var(--radius-sm);}

  /* Icon buttons */
  .icon-btn{border-radius:7px;}
  .icon-btn:hover{box-shadow:0 2px 6px rgba(20,30,50,0.12);transform:translateY(-1px);}

  /* Projects & first-aid cards */
  .project-card{border-radius:var(--radius);overflow:hidden;box-shadow:var(--shadow);border:1px solid var(--line);transition:box-shadow .15s;}
  .project-card:hover{box-shadow:var(--shadow-hover);}
  .project-progress-track{border-radius:20px;}
  .project-progress-fill{border-radius:20px;background:linear-gradient(90deg, var(--accent), var(--navy));}
  .fa-card{border-radius:var(--radius);box-shadow:var(--shadow);border:1px solid var(--line);position:relative;overflow:hidden;}
  .fa-card:hover{box-shadow:var(--shadow-hover);transform:translateY(-2px);}

  /* First aid monthly checklist + observations table (added after this design pass) */
  .fa-month-header, .obs-row-header{border-radius:var(--radius) var(--radius) 0 0;}
  .fa-month-row, .obs-card{transition:background .15s;}
  .fa-month-row:hover, .obs-card:hover{background:var(--navy-light);}
  .fa-month-row:last-child, .obs-card:last-child{border-radius:0 0 var(--radius) var(--radius);}
  .ext-month-header{border-radius:var(--radius) var(--radius) 0 0;}
  .ext-month-row:hover{background:var(--navy-light);}
  .ext-month-row:last-child{border-radius:0 0 var(--radius) var(--radius);}
  .fa-comment-input{border-radius:var(--radius-sm);}
  .obs-photo-icon{border-radius:var(--radius-sm);}
  .obs-photo-icon:hover{box-shadow:0 2px 6px rgba(20,30,50,0.12);transform:translateY(-1px);}
  .subtasks-panel{border-radius:0 0 var(--radius) var(--radius);}

  /* Home tiles */
  .home-tile{border-radius:var(--radius);border-top:1px solid var(--line);box-shadow:var(--shadow);position:relative;overflow:hidden;}
  .home-tile::before{content:'';position:absolute;top:0;left:0;right:0;height:3px;background:linear-gradient(90deg, var(--accent), var(--navy));}
  .home-tile:hover{box-shadow:var(--shadow-hover);transform:translateY(-3px);}

  /* Calendar */
  .cal-nav{border-radius:var(--radius) var(--radius) 0 0;background:linear-gradient(120deg, var(--navy), var(--navy-2));}
  .cal-grid{border-radius:0 0 var(--radius) var(--radius);overflow:hidden;box-shadow:var(--shadow);}
  .cal-cell{transition:background .15s;}
  .cal-chip{border-radius:5px;box-shadow:0 1px 2px rgba(20,30,50,0.08);}

  /* Scrollbar polish (webkit) */
  ::-webkit-scrollbar{width:10px;height:10px;}
  ::-webkit-scrollbar-track{background:transparent;}
  ::-webkit-scrollbar-thumb{background:var(--line-strong);border-radius:20px;border:2px solid var(--bg);}
  ::-webkit-scrollbar-thumb:hover{background:var(--ink-soft);}

  /* ============================================================
     MOTION LAYER — animation & interaction polish (structure/JS untouched)
     Additive only: overrides transition timing on existing selectors
     and adds entrance keyframes to elements that are already shown/hidden
     by the app's existing display/class toggling. No markup or logic
     touched, no new DOM elements, no changed event handlers.
     ============================================================ */

  @media (prefers-reduced-motion: reduce){
    *, *::before, *::after{
      animation-duration: 0.001ms !important;
      animation-delay: 0s !important;
      animation-iteration-count: 1 !important;
      transition-duration: 0.001ms !important;
      transition-delay: 0s !important;
      scroll-behavior: auto !important;
    }
  }

  @keyframes motionFadeIn{ from{ opacity:0; } to{ opacity:1; } }
  @keyframes motionRiseIn{ from{ opacity:0; transform:translateY(9px); } to{ opacity:1; transform:translateY(0); } }
  /* Split version of the two keyframes above: same visible motion, but only
     the opacity half keeps its end state (fill:forwards) - the transform
     half is left to revert to the element's real (none) transform once it
     finishes. A `transform` value that lingers at translateY(0) forever
     (fill:both on the combined animation) is visually a no-op but is NOT
     `transform:none`, and per spec that alone turns the element into a new
     containing block for any `position:fixed` descendant - which silently
     broke centering for every popup opened from inside an animated module
     pane (Add First Aid Box, Add Extinguisher, Add Observation, and even
     the task Edit modal, just less visibly). Used only on the module/pane
     wrappers below, not the .summary/.qi-kpi-card staggered rows, which
     never contain a position:fixed descendant. */
  @keyframes motionRiseInOpacity{ from{ opacity:0; } to{ opacity:1; } }
  @keyframes motionRiseInMove{ from{ transform:translateY(9px); } to{ transform:translateY(0); } }
  @keyframes motionScaleIn{ from{ opacity:0; transform:scale(0.92) translateY(10px); } to{ opacity:1; transform:scale(1) translateY(0); } }

  @keyframes errorShake{
    0%, 100%{ transform:translateX(0); }
    20%{ transform:translateX(-6px); }
    40%{ transform:translateX(5px); }
    60%{ transform:translateX(-3px); }
    80%{ transform:translateX(2px); }
  }
  #loginError.shake{ animation: errorShake 380ms var(--ease-in-out); }

  /* Buttons & pressable controls: fast, honest press feedback.
     Kept under 200ms so frequently-clicked nav/tabs never feel delayed,
     but the press/lift itself is sized to actually be seen. */
  .btn, .icon-btn, .tab, .ac-subtab, .cl-yn-btn, .cl-qr-btn, .cl-attach-btn,
  .login-mission-btn, .nav-item, .nav-subitem, .sidebar-signout, .obs-photo-icon,
  .home-tile, .ext-card, .fa-card, .project-card{
    transition-property: transform, background-color, border-color, box-shadow, color;
    transition-duration: 160ms;
    transition-timing-function: var(--ease-out);
  }
  .icon-btn:active, .cl-qr-btn:active, .cl-attach-btn:active, .obs-photo-icon:active,
  .cl-yn-btn:active, .ac-subtab:active, .tab:active, .login-mission-btn:active,
  .nav-item:active, .nav-subitem:active, .sidebar-signout:active{
    transform:scale(0.94); transition-duration:90ms;
  }
  .home-tile:active, .ext-card:active, .fa-card:active, .project-card:active{
    transform:scale(0.97); transition-duration:90ms;
  }

  /* Real modals: enter with a fade + a clearly visible scale from center —
     never from scale(0). Slightly heavier blur reinforces the depth shift. */
  .cl-modal-overlay, .cp-modal-overlay, .obs-lightbox-overlay{
    animation: motionFadeIn 200ms var(--ease-out) both;
    backdrop-filter: blur(4px);
  }
  .cl-modal, .cp-modal{
    transform-origin:center;
    animation: motionScaleIn 260ms var(--ease-out) both;
  }
  .obs-lightbox-overlay img{
    transform-origin:center;
    animation: motionScaleIn 240ms var(--ease-out) both;
  }

  /* Module & first-level sub-pane switches: a visible rise+fade so views
     never pop in instantly. Deeper, frequently-clicked tab content
     (warehouse tabs, HSE sub-tabs, grid/detail drill-downs) is
     intentionally left un-animated — those get clicked too often for
     motion to stay welcome. */
  #loginScreen, #shellScreen{
    animation: motionFadeIn 220ms var(--ease-out) both;
  }

  #moduleTracker, #moduleQA, #moduleSafety, #moduleQMSSearch, #moduleCS, #moduleAdmin,
  #trackerDashboardPane, #trackerDailyPane, #trackerProjectsPane,
  #qaOverviewPane, #qaSitesCheckPane, #qaChecklistPane, #qaIncidentsPane,
  #safetyOverviewPane, #safetyHSEPane, #safetyAccidentsPane,
  #csOverviewPane, #csComplaintsPane,
  #adminOverviewPane, #adminUsersPane, #adminPagesPane{
    animation: motionRiseInOpacity 200ms var(--ease-out) forwards, motionRiseInMove 200ms var(--ease-out);
  }

  /* ============================================================
     MOTION LAYER v2 — modal close, tables, form focus states, badges
     Still additive-only. All entrance/exit motion below is vertical
     (translateY) or scale/opacity — no left/right slides — so it
     reads correctly unchanged if RTL (dir="rtl") is ever introduced.
     ============================================================ */

  @keyframes motionFadeOut{ from{ opacity:1; } to{ opacity:0; } }
  @keyframes motionScaleOut{ from{ opacity:1; transform:scale(1) translateY(0); } to{ opacity:0; transform:scale(0.94) translateY(8px); } }

  /* Modals: close smoothly to match the smooth open (paired with a small,
     isolated JS hook near the end of the main script that briefly defers
     the existing .remove() calls so this animation can play first —
     nothing about *when*/*why* a modal closes is changed, only the visual
     transition immediately before removal). */
  .cl-modal-overlay.motion-closing, .cp-modal-overlay.motion-closing, .obs-lightbox-overlay.motion-closing{
    animation: motionFadeOut 180ms var(--ease-out) both;
    pointer-events:none;
  }
  .cl-modal-overlay.motion-closing .cl-modal, .cp-modal-overlay.motion-closing .cp-modal{
    animation: motionScaleOut 180ms var(--ease-out) both;
  }
  .obs-lightbox-overlay.motion-closing img{
    animation: motionScaleOut 180ms var(--ease-out) both;
  }

  /* Inline form panels: animate BOTH open and close via a discrete-display
     transition (modern CSS; degrades to the original instant show/hide on
     unsupported browsers, so this is a pure progressive enhancement). */
  .form-panel{
    opacity:0; transform:translateY(-9px);
    transition: opacity 190ms var(--ease-out), transform 190ms var(--ease-out), display 190ms allow-discrete;
  }
  .form-panel.open{ opacity:1; transform:translateY(0); }
  @starting-style{ .form-panel.open{ opacity:0; transform:translateY(-9px); } }

  /* Tables: smooth row hover instead of an instant color swap */
  table.data-table td{ transition: background-color 140ms var(--ease-out); }

  /* Inputs, selects, textareas everywhere: smooth, consistent focus states */
  input, select, textarea{
    transition: border-color 150ms var(--ease-out), box-shadow 150ms var(--ease-out), background-color 150ms var(--ease-out);
  }
  input:focus, select:focus, textarea:focus{
    box-shadow: 0 0 0 3px rgba(62,111,217,0.14);
    border-color: var(--accent);
  }

  /* ============================================================
     REDESIGN PASS — visual design system (structure/JS untouched)
     A senior-review pass: consistent spacing/type scale, unified
     badges, disabled states, refined cards/tables/forms, a real
     loading spinner, and richer empty states. Everything below is
     additive CSS layered on top of the rules above — no HTML
     elements added or removed, no class names or IDs the app's JS
     depends on were touched, no Firebase/permission/business logic
     touched. Motion continues to use only translateY / scale /
     opacity so nothing needs to change if RTL (dir="rtl") is ever
     added — no left/right slide to mirror.
     ============================================================ */

  /* ---- Status badges & pills: one consistent shape system.
     Colors/semantics per type are untouched — only geometry unified. ---- */
  .badge, .co-badge, .status-badge, .project-status-pill, .qi-status-pill, .checklist-tag, .proj-tag{
    font-size: var(--fs-xs);
    font-weight: 700;
    letter-spacing: 0.35px;
    padding: 4px 9px;
    border-radius: 20px;
    line-height: 1.4;
    box-shadow: inset 0 0 0 1px rgba(15,22,40,0.06);
  }
  .qi-status-pill{ padding:4px 11px; }

  /* ---- Cards & KPI tiles: clearer hierarchy, a felt hover lift,
     and a gentle stagger the first time a section is opened.
     .qi-kpi-card/.qi-kpi-value are shared by Incidents, Accidents,
     and Complaints — one rule here covers all three modules. ---- */
  .summary .card, .qi-kpi-card{
    transition: transform 180ms var(--ease-out), box-shadow 180ms var(--ease-out);
  }
  .summary .card:hover, .qi-kpi-card:hover{
    transform: translateY(-3px);
    box-shadow: var(--shadow-hover);
  }
  .summary .card .n{ font-size:var(--fs-2xl); letter-spacing:-0.5px; }
  .qi-kpi-value{ letter-spacing:-0.5px; }

  .summary{ animation: motionRiseIn 220ms var(--ease-out) both; }
  .summary .card:nth-child(1){ animation: motionRiseIn 220ms var(--ease-out) both; }
  .summary .card:nth-child(2){ animation: motionRiseIn 220ms var(--ease-out) 40ms both; }
  .summary .card:nth-child(3){ animation: motionRiseIn 220ms var(--ease-out) 80ms both; }
  .summary .card:nth-child(4){ animation: motionRiseIn 220ms var(--ease-out) 120ms both; }
  .qi-kpi-row .qi-kpi-card:nth-child(1){ animation: motionRiseIn 220ms var(--ease-out) both; }
  .qi-kpi-row .qi-kpi-card:nth-child(2){ animation: motionRiseIn 220ms var(--ease-out) 40ms both; }
  .qi-kpi-row .qi-kpi-card:nth-child(3){ animation: motionRiseIn 220ms var(--ease-out) 80ms both; }
  .qi-kpi-row .qi-kpi-card:nth-child(4){ animation: motionRiseIn 220ms var(--ease-out) 120ms both; }
  .qi-kpi-row .qi-kpi-card:nth-child(5){ animation: motionRiseIn 220ms var(--ease-out) 160ms both; }
  .qi-kpi-row .qi-kpi-card:nth-child(6){ animation: motionRiseIn 220ms var(--ease-out) 200ms both; }

  /* ---- Tables: clearer header, calmer rhythm ---- */
  table.data-table thead th{ letter-spacing:0.5px; }
  table.data-table td{ line-height:1.45; }

  /* ---- Forms: calmer label rhythm or focus emphasis ---- */
  .form-grid label{ letter-spacing:0.35px; }

  /* ---- A real loading state instead of plain mono text ---- */
  .loading{
    font-family:'Inter',sans-serif;
    letter-spacing:0.2px;
    display:flex;
    flex-direction:column;
    align-items:center;
    justify-content:center;
    gap:14px;
    padding:48px 20px;
    animation: motionFadeIn 200ms var(--ease-out) both;
  }
  .loading::before{
    content:'';
    width:26px; height:26px;
    border-radius:50%;
    border:3px solid var(--line);
    border-top-color:var(--accent);
    animation: loadingSpin 0.7s linear infinite;
  }
  @keyframes loadingSpin{ to{ transform:rotate(360deg); } }

  /* ---- Empty states: softer, a little more considered ---- */
  .empty{
    padding:56px 24px;
    border-radius:var(--radius);
    background:linear-gradient(180deg, var(--panel), var(--gray-bg) 240%);
    line-height:1.7;
    animation: motionFadeIn 200ms var(--ease-out) both;
  }
  .empty::before{
    content:'';
    display:block;
    width:40px; height:40px;
    margin:0 auto 16px;
    border-radius:50%;
    border:2px dashed var(--line-strong);
  }
  .empty .btn{ margin-top:4px; }

  @media (prefers-reduced-motion: reduce){
    .loading::before{ animation-duration: 1.4s; }
  }

  /* ============================================================
     PREMIUM POLISH — elevating toward Linear/Notion/Framer-tier
     calm, confident SaaS density. Additive only, same rules as the
     layers above: no HTML/JS structure touched, no Firebase/permission
     logic touched, nothing here changes what anything DOES. This pass
     focuses on the three things a dense enterprise tool usually lacks:
     breathing room, a clear single accent for actionable elements
     (navy stays the structural/brand color; the vivid --accent blue is
     now reserved for things you can actually click), and softer,
     more layered depth instead of flat boxes. Motion continues to be
     translateY/scale/opacity only — safe if RTL is ever added.
     ============================================================ */

  html, body{ line-height:1.55; }

  /* ---- Whitespace: generous, calm page rhythm, snapped to the --sp-* 4px
     grid so page/header/card padding matches across every module. Dense
     grid-cell padding (.row .cell, table td, badges) is deliberately left
     off-grid — those are tuned tight and a 1-2px bump reflows every list. ---- */
  .app{ padding:0 var(--sp-6) 100px; }
  .main-content{ padding:var(--sp-6) var(--sp-7) 100px; }
  .content-header{ margin-bottom:var(--sp-6); }
  .page-title{ font-size:var(--fs-xl); }
  .form-grid{ gap:var(--sp-4); margin-bottom:var(--sp-4); }
  .form-actions{ margin-top:var(--sp-2); }
  .list-container{ margin-bottom:var(--sp-6); }
  .row-header .cell{ padding:11px 12px; }
  .row .cell{ padding:11px 12px; }
  .qi-kpi-row{ gap:var(--sp-4); margin-bottom:var(--sp-6); }
  .qi-kpi-card{ padding:var(--sp-5) var(--sp-6); border-top-width:2px; }
  .summary .card{ padding:var(--sp-5) var(--sp-6); }
  @media (min-width:641px){
    .cp-modal{ padding:var(--sp-7); }
    .cl-modal-header{ padding:var(--sp-7) var(--sp-7) var(--sp-1); }
    .cl-footer{ padding:var(--sp-6) var(--sp-7) var(--sp-6); }
  }

  /* ---- Depth: softer, more layered shadows on surfaces that float
     above the page (modals, dropdowns, panels already use --shadow-lg
     / --shadow-hover, so refining those tokens above cascades here) ---- */
  .form-panel{ box-shadow:var(--shadow); }
  .nav-subgroup{ box-shadow:0 20px 44px rgba(5,8,16,0.4), 0 2px 8px rgba(5,8,16,0.25); }

  /* ---- Micro-interactions: a bit more presence, still calm ---- */
  .icon-btn:hover{ border-color:var(--accent); color:var(--accent); }
  .tab.active{ box-shadow:0 1px 4px rgba(20,30,50,0.14); }
  a{ transition:color 140ms var(--ease-out); }

  /* Consistent, visible keyboard focus without disturbing the mouse-driven
     focus rings already defined on inputs/selects above. Covers every
     custom-styled control that is a real focusable element (button /
     select / a) — the many click-handler <div>s (cards, tabs, rows) are
     not keyboard-reachable without a tabindex and are left for the a11y
     pass that adds one. */
  .btn:focus-visible, .icon-btn:focus-visible, .tab:focus-visible,
  .nav-item:focus-visible, .nav-subitem:focus-visible,
  .subtab:focus-visible, .ac-subtab:focus-visible, .fp-tab:focus-visible,
  .qi-kpi2-quickdate:focus-visible, .qi-kpi2-rank-tab:focus-visible,
  .cl-yn-btn:focus-visible, .cl-attach-btn:focus-visible, .cl-qr-btn:focus-visible,
  .tc-check:focus-visible, .tc-chevron:focus-visible, .tc-add-subtask:focus-visible,
  .ms-trigger:focus-visible, .obs-photo-icon:focus-visible,
  .status-select:focus-visible, .obs-status-select:focus-visible, .um-status-select:focus-visible,
  .sidebar-signout:focus-visible, .login-mission-btn:focus-visible,
  .fp-close:focus-visible, .comment-popover-close:focus-visible,
  .cal-nav button:focus-visible, .qi-item-remove-btn:focus-visible, .fa-del:focus-visible{
    outline:2px solid var(--accent);
    outline-offset:2px;
  }
  /* Task form panel now opens as a centered, focused overlay with a dimmed
     backdrop behind it, instead of expanding inline in the page flow. */
  .form-backdrop{
    position:fixed; inset:0; background:rgba(10,14,20,0.55); backdrop-filter:blur(3px);
    z-index:998; opacity:0; visibility:hidden;
    transition:opacity 190ms var(--ease-out), visibility 0s linear 190ms;
  }
  .form-backdrop.open{ opacity:1; visibility:visible; transition:opacity 190ms var(--ease-out); }
  .form-panel{
    position:fixed; top:50%; left:50%; transform:translate(-50%,calc(-50% - 9px));
    width:min(680px, 92vw); max-height:86vh; overflow-y:auto;
    z-index:999; border-radius:var(--radius); box-shadow:var(--shadow-lg);
  }
  .form-panel.open{ transform:translate(-50%,-50%); }

  /* Closed tasks appearing in search results: dim + strike through the whole row */
  .row.search-closed .action-text, .row.search-closed .cell, .row.search-closed .subtitle{
    color:var(--ink-soft) !important;
    text-decoration:line-through;
  }
  .row.search-closed .co-badge, .row.search-closed .badge, .row.search-closed .flag{ opacity:0.55; }
  .row[draggable="true"]{ cursor:grab; }
  .row[draggable="true"]:active{ cursor:grabbing; }

  /* ============================================================
     Page banner — the standard header block for a module page.
     Three tiers: meta row (context) -> title + primary action
     -> navigation tabs sitting on the baseline.
     ============================================================ */
  .page-banner{
    background:linear-gradient(160deg, var(--navy-3) 0%, var(--navy) 55%, #16223A 100%);
    border-radius:var(--radius);
    padding:var(--sp-5) var(--sp-6) 0;
    margin-bottom:var(--sp-5);
    box-shadow:0 8px 26px rgba(15,22,40,0.16);
    position:relative;
    overflow:hidden;
  }
  /* hairline highlight along the top edge for a crisper, printed-panel feel */
  .page-banner::before{
    content:''; position:absolute; top:0; left:0; right:0; height:1px;
    background:linear-gradient(90deg, transparent, rgba(255,255,255,0.16) 22%, rgba(255,255,255,0.16) 78%, transparent);
  }

  .pb-metarow{
    display:flex; justify-content:space-between; align-items:center;
    padding-bottom:14px; margin-bottom:16px;
    border-bottom:1px solid rgba(255,255,255,0.09);
    gap:16px; flex-wrap:wrap;
  }
  .pb-eyebrow{
    display:flex; align-items:center; gap:8px;
    font-size:var(--fs-2xs); font-weight:700; letter-spacing:1.1px; text-transform:uppercase;
    color:var(--on-navy-dim); white-space:nowrap;
  }
  .pb-eyebrow-mark{
    width:3px; height:12px; border-radius:2px; flex-shrink:0;
    background:linear-gradient(180deg, var(--accent), #7FA8F5);
  }
  .pb-meta{ display:flex; align-items:center; gap:12px; white-space:nowrap; }
  .pb-date{
    font-family:'IBM Plex Mono', monospace; font-size:var(--fs-xs);
    color:var(--on-navy-dim); letter-spacing:0.2px;
  }
  .pb-sep{ width:1px; height:11px; background:rgba(255,255,255,0.16); }
  .pb-sync{
    display:inline-flex; align-items:center; gap:6px;
    font-size:var(--fs-xs); font-weight:600; color:#7FBF9B; letter-spacing:0.2px;
    transition:color 140ms var(--ease-out);
  }
  /* Dot is a pseudo-element so status updates that rewrite the label's text
     can't wipe it out. */
  .pb-sync::before{
    content:''; width:6px; height:6px; border-radius:50%; background:currentColor;
    flex-shrink:0; box-shadow:0 0 0 3px rgba(255,255,255,0.07);
  }
  .pb-sync.is-pending{ color:#D9B168; }
  .pb-sync.is-fail{ color:#E88C7D; }

  /* Pages whose banner has no tab strip need their own bottom padding. */
  .page-banner.pb-flat{ padding-bottom:20px; }
  .page-banner.pb-flat .pb-mainrow{ margin-bottom:0; }

  .pb-mainrow{
    display:flex; justify-content:space-between; align-items:flex-end;
    gap:24px; margin-bottom:18px; flex-wrap:wrap;
  }
  .pb-title{
    font-family:'IBM Plex Sans', sans-serif; font-weight:700;
    font-size:var(--fs-xl); line-height:1.15; letter-spacing:-0.4px; color:#fff;
  }
  .pb-subtitle{ font-size:var(--fs-sm); color:var(--on-navy-soft); margin-top:5px; max-width:62ch; }
  .pb-actions{ display:flex; align-items:center; gap:10px; flex-shrink:0; }
  .pb-actions .btn{ box-shadow:0 4px 14px rgba(62,111,217,0.34); }
  .pb-actions .btn.secondary{
    background:transparent; border:1px solid rgba(255,255,255,0.26); color:#fff; box-shadow:none;
  }
  .pb-actions .btn.secondary:hover{ background:rgba(255,255,255,0.09); border-color:rgba(255,255,255,0.45); }

  /* Tabs sit flush on the banner's bottom edge; the active tab reads as
     the front sheet of the content below it. */
  /* Banner tab strips: several pages reuse the .tabs container class, which
     carries a light pill background and padding meant for in-page use. Reset
     it here for every banner so the tabs sit flush on the dark bottom edge. */
  .page-banner .ac-subtabs{
    padding:0; gap:2px; background:transparent; border:none; border-radius:0;
    /* .tabs sets flex-wrap:wrap, which would push overflow tabs onto a second
       row detached from the banner's bottom edge. Scroll instead. */
    flex-wrap:nowrap; overflow-x:auto; scrollbar-width:none;
    position:relative;
  }
  .page-banner .ac-subtabs::-webkit-scrollbar{ display:none; }

  /* The sliding highlight. One per strip; moves between tabs rather than the
     background switching instantly. */
  .page-banner .tab-pill{
    position:absolute; left:0; bottom:0; top:0; width:0;
    background:var(--gray-bg); border-radius:7px 7px 0 0;
    opacity:0; pointer-events:none; z-index:0;
    transition:transform 420ms cubic-bezier(.34,1.32,.48,1),
               width 420ms cubic-bezier(.34,1.32,.48,1),
               opacity 160ms ease;
  }
  @media (prefers-reduced-motion: reduce){
    .page-banner .tab-pill{ transition:opacity 160ms ease; }
  }
  /* Two tab flavours exist: the tracker reuses .tab, other modules use
     .ac-subtab. Both get the same in-banner appearance. */
  .page-banner .ac-subtabs .tab,
  .page-banner .ac-subtab{
    padding:10px 16px; border-right:none; border-radius:7px 7px 0 0;
    color:var(--on-navy-soft); background:transparent; overflow:visible; flex-shrink:0;
    position:relative; z-index:1;
    transition:color 200ms ease;
  }
  .page-banner .ac-subtabs .tab:hover,
  .page-banner .ac-subtab:hover{ color:#fff; }
  /* Hover tint drawn behind the label so it never covers the sliding pill. */
  .page-banner .ac-subtabs .tab::before,
  .page-banner .ac-subtab::before{
    content:''; position:absolute; inset:0; z-index:-1;
    border-radius:7px 7px 0 0; background:rgba(255,255,255,0.07);
    opacity:0; transition:opacity 160ms ease;
  }
  .page-banner .ac-subtabs .tab:hover::before,
  .page-banner .ac-subtab:hover::before{ opacity:1; }
  .page-banner .ac-subtabs .tab.active::before,
  .page-banner .ac-subtab.active::before{ opacity:0; }
  /* Background comes from the sliding pill, so the active tab only changes
     its text — otherwise two highlights would be visible mid-slide. */
  .page-banner .ac-subtabs .tab.active,
  .page-banner .ac-subtab.active{
    background:transparent; color:var(--navy); font-weight:700; box-shadow:none;
  }
  /* Counts render as inline pills next to the label instead of floating
     circles that collide with the tab's top edge. */
  .page-banner .ac-subtabs .tab-badge{
    position:static; margin-left:7px; box-shadow:none;
    min-width:18px; height:17px; border-radius:9px;
    font-size:var(--fs-2xs); padding:0 5px; background:var(--red); color:#fff;
  }
  .page-banner .ac-subtabs .tab.active .tab-badge{ background:var(--red); }

  @media (max-width:720px){
    .page-banner{ padding:16px 16px 0; }
    .pb-title{ font-size:var(--fs-lg); }
    .pb-mainrow{ align-items:flex-start; }
    .page-banner .ac-subtabs{ overflow-x:auto; }
  }

  /* ============================================================
     Task list — business-report table treatment.
     Wider columns, calmer controls, chrome that appears on demand.
     ============================================================ */
  .row-header,
  .row{
    grid-template-columns:4px minmax(0,1fr) 168px 104px 118px 96px 140px 126px 116px;
    column-gap:12px;
  }
  .list-container{
    border:1px solid var(--line); border-radius:var(--radius);
    overflow:hidden; box-shadow:0 1px 2px rgba(20,30,50,0.05);
  }
  .row-header{
    background:#EEF2F8; border-top:none;
    border-bottom:1px solid var(--line-strong);
  }
  .row-header .cell{
    padding:11px 10px; font-size:var(--fs-2xs); letter-spacing:0.7px; color:#5A6B87;
  }
  .task-group{ border-top:1px solid var(--line); transition:opacity 160ms var(--ease-out); }
  .task-group:first-child{ border-top:none; }
  .task-group.row-faded{ opacity:0.35; }
  .row{ align-items:center; min-height:54px; }
  .row .cell{ padding:11px 10px; font-size:var(--fs-sm); }
  .row:hover{ background:var(--row-hover); }

  /* Urgency marker reads as an inset accent rather than a full-bleed stripe */
  .row .flag{
    align-self:center; height:26px; width:3px; margin-left:1px; border-radius:0 3px 3px 0;
  }

  .row .action-text{ font-size:var(--fs-base); font-weight:600; letter-spacing:-0.1px; }
  .row .subtitle{
    font-size:var(--fs-xs); margin-top:2px;
    display:flex; align-items:center; gap:7px; flex-wrap:wrap;
  }
  .row .subtitle-text{ min-width:0; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
  /* Small dots riding the same line as the details text - one per open
     subtask, closed ones don't count since they no longer need attention. */
  .subtask-dots{ display:inline-flex; align-items:center; gap:3px; flex-shrink:0; }
  .stdot{ width:5px; height:5px; border-radius:50%; background:var(--blue); display:inline-block; }
  .stdot-more{ font-size:var(--fs-2xs); font-weight:700; color:var(--blue); font-style:normal; margin-left:1px; }
  .cell-company{ overflow:visible; text-overflow:clip; }
  .co-badge{ font-size:var(--fs-2xs); padding:4px 8px; border-radius:20px; white-space:nowrap; }
  .badge{ border-radius:20px; padding:4px 9px; font-size:var(--fs-2xs); }
  .area-tag, .company-tag{ color:#5A6B87; }

  /* Date reads as text until you interact with it */
  .due-wrap{ padding:0; border-radius:6px; }
  .due-input{
    font-size:var(--fs-sm); padding:7px 8px; border:1px solid transparent; border-radius:6px;
    color:var(--ink); transition:border-color .12s, background .12s;
  }
  .due-input:hover:not(:disabled){ border-color:var(--line-strong); background:var(--panel); }
  .due-input:focus{ outline:none; border-color:var(--accent); background:var(--panel); }
  .due-wrap.overdue .due-input{ color:var(--red); font-weight:600; }
  .due-wrap.today .due-input{ color:var(--amber); font-weight:600; }

  /* Status is a quiet colour-coded pill that only shows its control on hover */
  .status-select{
    font-size:var(--fs-2xs); font-weight:700; letter-spacing:0.4px; padding:6px 8px;
    border:1px solid transparent; border-radius:20px; cursor:pointer;
    appearance:none; -webkit-appearance:none; text-align:left;
    transition:border-color .12s, box-shadow .12s;
  }
  .status-select:hover{ border-color:var(--line-strong); }
  .status-select:focus{ outline:none; border-color:var(--accent); box-shadow:0 0 0 3px rgba(62,111,217,0.15); }
  .status-select.st-Open{ background:var(--red-bg); color:var(--red); }
  .status-select.st-InProgress{ background:var(--purple-bg); color:var(--purple); }
  .status-select.st-Closed{ background:var(--green-bg); color:var(--green); }

  /* Sites Check's real Open/In Progress/Closed status pill - a distinct
     class from .status-select above, which in qa-sites-checklist.js is
     already used for the Responsible Dept. dropdown (a naming collision
     that predates this control; kept separate rather than untangled). */
  .obs-status-select{
    font-size:var(--fs-2xs); font-weight:700; letter-spacing:0.4px; padding:6px 8px;
    border:1px solid transparent; border-radius:20px; cursor:pointer;
    appearance:none; -webkit-appearance:none; text-align:left; width:100%;
    transition:border-color .12s, box-shadow .12s;
  }
  .obs-status-select:hover{ border-color:var(--line-strong); }
  .obs-status-select:focus{ outline:none; border-color:var(--accent); box-shadow:0 0 0 3px rgba(62,111,217,0.15); }
  .obs-status-select.st-Open{ background:var(--red-bg); color:var(--red); }
  .obs-status-select.st-InProgress{ background:var(--purple-bg); color:var(--purple); }
  .obs-status-select.st-Closed{ background:var(--green-bg); color:var(--green); }

  /* Row actions are always visible (not just on row hover) so the comment
     and subtask badges stay legible on every line. */
  .row-actions{ gap:9px; padding-right:12px; }
  .icon-btn{
    background:var(--panel); border-color:var(--line-strong); color:#5A6B87;
    min-width:28px; height:28px; font-size:var(--fs-base); box-shadow:0 1px 2px rgba(20,30,50,0.04);
  }
  .icon-btn:hover{ border-color:var(--navy); color:var(--navy); background:var(--navy-light); }
  /* Subtasks is the odd one out (an emoji glyph, not a symbol) - give it a
     standing tint whenever the task actually has subtasks so it doesn't get
     lost next to the plainer comment/edit/delete icons. */
  .icon-btn:has(.count-badge.sub){
    background:var(--navy-light); border-color:var(--navy); color:var(--navy);
  }

  /* ---- Drag to reorder: neighbours slide to open a gap ---- */
  .task-card.dnd-active{ transition:transform 90ms cubic-bezier(.2,.7,.3,1); }
  .task-card.dnd-dragging{ position:relative; z-index:3; }
  .task-card.dnd-dragging .tc-row{
    background:var(--navy-light);
    box-shadow:0 10px 24px rgba(15,22,40,0.16);
    opacity:0.92;
  }
  @media (prefers-reduced-motion: reduce){
    .task-card.dnd-active{ transition:none; }
  }

  /* ============================================================
     Task cards — collapsed pill row that expands into a full detail
     card (fields grid + subtasks) in place, one at a time.
     ============================================================ */
  /* .tc-row's grid columns are fixed px and don't shrink - if their sum ever
     exceeds the available width (e.g. the page zoomed in enough that a
     narrower-screen breakpoint hasn't collapsed columns yet), this keeps the
     overflow contained to a scrollbar on the list instead of it spilling
     into the rest of the page or being clipped out of view. */
  .tc-list{ display:flex; flex-direction:column; gap:10px; margin-bottom:20px; overflow-x:auto; }
  .task-card{
    background:var(--panel); border:1px solid var(--line); border-radius:var(--radius);
    box-shadow:0 1px 2px rgba(20,30,50,0.05); overflow:hidden;
    transition:box-shadow 140ms var(--ease-out);
  }
  .task-card:hover{ box-shadow:var(--shadow-hover); }

  .tc-row{
    display:grid;
    grid-template-columns:18px 4px minmax(160px,1.6fr) 132px 100px 118px 90px 132px 118px 92px 30px;
    align-items:center; column-gap:12px; padding:13px 16px;
  }
  .tc-row-actions{ display:flex; align-items:center; gap:8px; justify-content:flex-end; }
  .tc-row.is-open{ border-bottom:1px solid var(--line); }
  .tc-row.search-closed .tc-title, .tc-row.search-closed .tc-field{
    color:var(--ink-soft) !important; text-decoration:line-through;
  }

  .tc-drag{ color:var(--line-strong); font-size:var(--fs-base); text-align:center; cursor:grab; user-select:none; }
  .tc-accent{ align-self:stretch; width:4px; border-radius:3px; }
  .tc-accent.overdue{ background:var(--red); }
  .tc-accent.today{ background:var(--amber); }
  .tc-accent.upcoming{ background:var(--navy); }
  .tc-accent.closed{ background:var(--green); }
  .tc-accent.none{ background:var(--line-strong); }

  .tc-title-wrap{ min-width:0; }
  .tc-title{ font-size:var(--fs-md); font-weight:700; color:var(--ink); letter-spacing:-0.1px; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
  .tc-sub{ display:flex; align-items:center; gap:7px; margin-top:2px; }
  .tc-sub-text{ font-size:var(--fs-xs); color:var(--ink-soft); min-width:0; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }

  .tc-field{ font-size:var(--fs-sm); color:var(--ink); display:flex; align-items:center; gap:6px; min-width:0; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
  .tc-f-area, .tc-f-owner{ color:var(--ink-soft); }
  .tc-icon{ font-size:var(--fs-xs); flex-shrink:0; opacity:0.65; }
  .tc-f-due{ font-family:'IBM Plex Mono',monospace; }
  .tc-f-due .due-wrap{ padding:0; width:100%; }
  /* 98px was too tight for a native date input's day/month/year segments plus
     its calendar-picker icon - a 4-digit year like 2026 would crowd against
     the day, reading as if part of the date were missing. The grid column
     itself already reserves 132px (.tc-row's 4th column); let the input use
     it instead of capping itself well under that. */
  .tc-f-due .due-input{ padding:0; font-size:var(--fs-sm); width:100%; min-width:118px; }
  .tc-f-due.overdue{ color:var(--red); font-weight:600; }
  .tc-f-due.overdue .tc-icon{ opacity:1; }
  .tc-f-due.today{ color:var(--amber); font-weight:600; }
  .tc-f-status .status-select{ width:100%; text-align:center; }

  .tc-chevron{
    background:transparent; border:none; color:var(--ink-soft); font-size:var(--fs-base); cursor:pointer;
    width:26px; height:26px; border-radius:50%; flex-shrink:0;
    display:flex; align-items:center; justify-content:center;
    transition:transform 160ms var(--ease-out), background 120ms, color 120ms;
  }
  .tc-chevron:hover{ background:var(--gray-bg); color:var(--navy); }
  .tc-chevron.up{ transform:rotate(180deg); }

  /* Expanded detail card - hidden/collapsed by default, JS animates the
     height open the same way the old subtasks panel did. */
  .tc-expanded{ height:0; overflow:hidden; }
  .tc-expanded.open{ height:auto; }
  .tc-expanded .panel-inner, .tc-expanded > *{ box-sizing:border-box; }

  .tc-subtasks{ padding:18px 20px; }
  .tc-subtasks-head{ display:flex; align-items:baseline; justify-content:space-between; margin-bottom:10px; }
  .tc-subtasks-title{ font-size:var(--fs-sm); font-weight:700; color:var(--navy); }
  .tc-subtasks-count{ font-size:var(--fs-xs); color:var(--ink-soft); }
  .tc-progress-row{ display:flex; align-items:center; gap:10px; margin-bottom:14px; }
  .tc-progress{ flex:1; height:6px; border-radius:3px; background:var(--gray-bg); overflow:hidden; }
  .tc-progress-bar{ height:100%; border-radius:3px; background:var(--accent); transition:width 200ms var(--ease-out); }
  .tc-progress-pct{ font-size:var(--fs-xs); font-weight:700; color:var(--ink-soft); font-variant-numeric:tabular-nums; min-width:30px; text-align:right; }

  .tc-subtask-row{
    display:grid; grid-template-columns:16px 22px 1fr 34px;
    align-items:center; column-gap:10px; padding:9px 4px;
    border-top:1px solid var(--line);
  }
  .tc-subtask-row:first-of-type{ border-top:none; }
  .tc-sub-drag{ color:var(--line-strong); font-size:var(--fs-sm); text-align:center; cursor:grab; user-select:none; }
  /* Same drag-shift technique as the Today list (.task-card.dnd-active/
     .dnd-dragging) - see subtaskDragStart/Over in tracker.js. */
  .tc-subtask-row.sub-dnd-active{ transition:transform 90ms cubic-bezier(.2,.7,.3,1); }
  .tc-subtask-row.sub-dnd-dragging{ position:relative; z-index:3; background:var(--navy-light); box-shadow:0 6px 16px rgba(15,22,40,0.14); }
  @media (prefers-reduced-motion: reduce){
    .tc-subtask-row.sub-dnd-active{ transition:none; }
  }
  .tc-check{
    width:19px; height:19px; border-radius:50%; border:1.5px solid var(--line-strong);
    background:var(--panel); cursor:pointer; padding:0; flex-shrink:0;
    display:flex; align-items:center; justify-content:center; color:#fff; font-size:var(--fs-xs); line-height:1;
    transition:background 120ms, border-color 120ms;
  }
  .tc-check:hover{ border-color:var(--accent); }
  .tc-check.checked{ background:var(--accent); border-color:var(--accent); }
  .tc-check.checked::after{ content:'✓'; }
  .tc-subtask-text{ font-size:var(--fs-sm); color:var(--ink); min-width:0; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
  .tc-subtask-text.done{ color:var(--ink-soft); text-decoration:line-through; }

  .tc-add-subtask-row{
    display:flex; gap:8px; margin-top:10px;
    border:1.5px dashed var(--line-strong); border-radius:var(--radius-sm); padding:5px;
    transition:border-color 120ms;
  }
  .tc-add-subtask-row:focus-within{ border-color:var(--accent); }
  .tc-add-subtask-row input{
    flex:1; border:none; background:transparent; padding:6px 8px; font-size:var(--fs-sm);
  }
  .tc-add-subtask-row input:focus{ outline:none; box-shadow:none; }
  .tc-add-subtask{
    padding:6px 14px; text-align:center; flex-shrink:0;
    background:transparent; border:none; border-radius:var(--radius-sm);
    color:var(--accent); font-size:var(--fs-sm); font-weight:600; cursor:pointer;
    transition:background 120ms;
  }
  .tc-add-subtask:hover{ background:var(--navy-light); }

  @media (max-width:1080px){
    .tc-row{ grid-template-columns:18px 4px minmax(140px,1.4fr) 120px 100px 30px; }
    .tc-f-owner, .tc-f-due, .tc-f-status, .tc-f-priority, .tc-row-actions{ display:none; }
  }
  @media (max-width:720px){
    .tc-row{ grid-template-columns:18px 4px 1fr 30px; }
    .tc-f-company, .tc-f-area{ display:none; }
    .tc-grid{ grid-template-columns:repeat(2,1fr); }
  }

  /* ============================================================
     Task modal — same three-tier structure as the page banner:
     head (context) / body (grouped fields) / footer (actions).
     ============================================================ */
  /* display stays on the .open rule only — setting it here would override the
     base `display:none` and leave the panel permanently visible. */
  .form-panel{ padding:0; overflow:hidden; flex-direction:column; }
  .form-panel.open{ display:flex; }

  /* Simpler "Add ..." popups (First Aid, Extinguisher, Site Observation)
     reuse .form-panel for the centered-overlay positioning above, but don't
     have the task modal's .fp-head/.fp-body wrapper that supplies its own
     padding - without this they'd render with zero padding (content flush
     against the edges). .form-grid only sits as a *direct* child of
     .form-panel in these simpler panels (the task modal nests it inside
     .fp-body), so this can't accidentally double up on the task modal. */
  .form-panel > .fp-mini-head{
    font-family:'IBM Plex Sans', sans-serif; font-weight:700; font-size:var(--fs-md);
    color:var(--navy); padding:18px 22px 14px; border-bottom:1px solid var(--line);
  }
  .form-panel > .form-grid{ padding:16px 22px 4px; }

  .fp-head{
    background:linear-gradient(160deg, var(--navy-3) 0%, var(--navy) 100%);
    padding:16px 22px; display:flex; justify-content:space-between; align-items:flex-start;
    gap:16px; flex-shrink:0;
  }
  .fp-eyebrow{
    display:flex; align-items:center; gap:8px;
    font-size:var(--fs-2xs); font-weight:700; letter-spacing:1.1px; text-transform:uppercase; color:var(--on-navy-dim);
  }
  .fp-title{
    font-family:'IBM Plex Sans', sans-serif; font-weight:700;
    font-size:var(--fs-lg); color:#fff; letter-spacing:-0.3px; margin-top:5px;
  }
  .fp-close{
    background:transparent; border:1px solid rgba(255,255,255,0.22); color:var(--on-navy);
    width:28px; height:28px; border-radius:7px; cursor:pointer; font-size:var(--fs-sm);
    line-height:1; flex-shrink:0; transition:all .14s;
  }
  .fp-close:hover{ background:rgba(255,255,255,0.1); color:#fff; border-color:rgba(255,255,255,0.4); }

  .fp-body{ padding:20px 22px; overflow-y:auto; flex:1; min-height:0; }
  .fp-section{ margin-bottom:20px; }
  .fp-section:last-child{ margin-bottom:0; }
  .fp-section-label{
    font-size:var(--fs-2xs); font-weight:700; letter-spacing:0.9px; text-transform:uppercase;
    color:var(--navy); padding-bottom:7px; margin-bottom:13px;
    border-bottom:1px solid var(--line);
  }
  .fp-optional{
    font-weight:600; letter-spacing:0.3px; color:var(--ink-soft);
    text-transform:none; font-size:var(--fs-2xs); margin-left:5px;
  }
  .form-panel .form-grid{ grid-template-columns:repeat(3, minmax(0,1fr)); gap:14px; margin-bottom:0; }
  .form-panel .form-grid input,
  .form-panel .form-grid select{ box-sizing:border-box; height:36px; padding:9px 11px; font-size:var(--fs-base); border-radius:var(--radius-sm); }
  .form-panel .form-grid textarea#f_details{ box-sizing:border-box; min-height:36px; resize:none; overflow:hidden; padding:9px 11px; font-size:var(--fs-base); line-height:1.28; border-radius:var(--radius-sm); font-family:inherit; }
  .form-panel .form-actions{
    padding:14px 22px; background:var(--gray-bg); border-top:1px solid var(--line);
    flex-shrink:0; gap:10px;
  }

  @media (max-width:720px){
    .form-panel .form-grid{ grid-template-columns:1fr; }
  }

  /* Re-asserted after the desktop grid above: these rules share the same
     specificity, so the narrow-screen collapse has to come later in the
     sheet to win. */
  @media (max-width:820px){
    .row, .row-header{ grid-template-columns:4px 1fr; grid-auto-rows:auto; }
    .row .flag{ height:auto; align-self:stretch; }
  }
