/* =========================================================
   Sentinel Ledger — theme system
   Two palettes (dark default, light) switched via
   [data-theme] on <html>, plus a set of "accent" colors used
   to give each section of the app its own color identity.
   ========================================================= */

:root,
[data-theme="dark"] {
  --bg:#10141A; --panel:#1B2127; --panel-alt:#212930; --border:#2B333B;
  --text:#EDF0F2; --muted:#98A3AD;
  --brass:#E0BC6C; --brass-dim:#8A7638;
  --teal:#5FC0B2; --amber:#EBA85E; --red:#EC7267; --green:#68C77F;
  --blue:#7BA6FF; --purple:#C29AF4; --coral:#F6976F; --rose:#F393BC;
  /* Textboxes/dropdowns specifically — panel-alt (#212930) sits only a
     few RGB units from panel (#1B2127), too close to read as "a field"
     rather than just part of the card, especially on a small mobile
     screen. Meaningfully lighter, with a matching brighter border. */
  --field-bg:#36414F; --field-border:#57697E;

  --shadow-sm: 0 1px 2px rgba(0,0,0,.28);
  --shadow: 0 10px 28px rgba(0,0,0,.38), 0 2px 8px rgba(0,0,0,.24);
  --shadow-lg: 0 22px 48px rgba(0,0,0,.42), 0 6px 16px rgba(0,0,0,.3);
  --sheen: rgba(255,255,255,.03);
}

[data-theme="light"] {
  --bg:#F1F4F7; --panel:#FFFFFF; --panel-alt:#F3F5F8; --border:#E3E7EC;
  --text:#181F28; --muted:#5B6773;
  --brass:#9C6F14; --brass-dim:#C9A24B;
  /* Same reasoning as the dark theme above — panel-alt (#F3F5F8) is too
     close to a white panel to read as a distinct field. */
  --field-bg:#DCE3EC; --field-border:#A8B6C6;
  --teal:#188577; --amber:#B36A12; --red:#B23A30; --green:#22753F;
  --blue:#2E52C4; --purple:#7748C9; --coral:#C24A2C; --rose:#C23E80;

  --shadow-sm: 0 1px 2px rgba(30,40,60,.06);
  --shadow: 0 10px 26px rgba(30,40,60,.10), 0 2px 6px rgba(30,40,60,.06);
  --shadow-lg: 0 24px 48px rgba(30,40,60,.14), 0 6px 16px rgba(30,40,60,.08);
  --sheen: rgba(20,30,45,.025);
}

/* Section accent colors — pick a hue per page so headings/nav read as
   distinct "departments" rather than one flat palette. Same variable
   names in both themes, values tuned per-theme above for contrast. */
:root {
  --accent-dashboard: var(--brass);
  --accent-sites: var(--blue);
  --accent-managers: var(--purple);
  --accent-supervisors: var(--amber);
  --accent-guards: var(--teal);
  --accent-allocate: var(--rose);
  --accent-attendance: var(--green);
  --accent-reports: var(--coral);
  --accent-audit: var(--brass);
  --accent-approvals: var(--purple);
  --accent-permissions: var(--brass);
  --accent-profile: var(--teal);
  --accent-advances: var(--green);
  --accent-matrix: var(--blue);

  --ease: cubic-bezier(.25,.8,.35,1);
  --ease-spring: cubic-bezier(.34,1.56,.64,1);
  --radius: 10px;
  --radius-sm: 6px;
}

* { box-sizing: border-box; }
html { scroll-behavior: smooth; }
html, body { margin:0; padding:0; min-height:100%; background:var(--bg); color:var(--text); font-family:var(--font-body); transition: background .2s var(--ease), color .2s var(--ease); }
:root {
  --font-display:'Arial Narrow','Trebuchet MS',Impact,sans-serif;
  --font-body:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,sans-serif;
  --font-mono:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;
}
body{
  background-image:
    radial-gradient(900px 500px at 12% -8%, var(--sheen), transparent),
    radial-gradient(800px 460px at 100% 0%, var(--sheen), transparent);
  background-attachment: fixed;
}
a { color: var(--teal); transition: color .15s var(--ease); }
button { cursor:pointer; font-family:inherit; }
input, select, textarea { font-family:inherit; }
::selection{ background: var(--teal); color:#08130f; }

/* Slim, theme-aware scrollbar */
* { scrollbar-width: thin; scrollbar-color: var(--border) transparent; }
*::-webkit-scrollbar{ width:9px; height:9px; }
*::-webkit-scrollbar-track{ background:transparent; }
*::-webkit-scrollbar-thumb{ background:var(--border); border-radius:8px; border:2px solid var(--bg); }
*::-webkit-scrollbar-thumb:hover{ background:var(--muted); }

/* Consistent, calmer focus ring instead of the browser default */
a:focus-visible, button:focus-visible, input:focus-visible, select:focus-visible,
textarea:focus-visible, [tabindex]:focus-visible {
  outline: 2px solid var(--teal); outline-offset: 2px; border-radius: 3px;
}

.eyebrow{font-family:var(--font-display);text-transform:uppercase;letter-spacing:.14em;font-size:11px;color:var(--brass);font-weight:700;}
h1,h2,h3{font-family:var(--font-display);text-transform:uppercase;letter-spacing:.03em;font-weight:700;margin:0 0 4px;}
h1{font-size:27px;} h2{font-size:18px;} h3{font-size:14px;color:var(--muted);letter-spacing:.08em;}
p{color:var(--muted);font-size:13.5px;line-height:1.55;margin:4px 0;}
.mono{font-family:var(--font-mono);}

/* Page heading accent — set per page via .topline-<section>. A soft
   gradient wash keeps it from being flat single-color text. */
.topline h1 {
  color: var(--page-accent, var(--text));
  background: linear-gradient(90deg, var(--page-accent, var(--text)), color-mix(in srgb, var(--page-accent, var(--text)) 55%, var(--text)));
  -webkit-background-clip: text; background-clip: text;
  -webkit-text-fill-color: transparent;
}
.topline-dashboard    { --page-accent: var(--accent-dashboard); }
.topline-sites        { --page-accent: var(--accent-sites); }
.topline-managers     { --page-accent: var(--accent-managers); }
.topline-supervisors  { --page-accent: var(--accent-supervisors); }
.topline-guards       { --page-accent: var(--accent-guards); }
.topline-allocate     { --page-accent: var(--accent-allocate); }
.topline-attendance   { --page-accent: var(--accent-attendance); }
.topline-reports      { --page-accent: var(--accent-reports); }
.topline-audit        { --page-accent: var(--accent-audit); }
.topline-approvals    { --page-accent: var(--accent-approvals); }
.topline-permissions  { --page-accent: var(--accent-permissions); }
.topline-profile      { --page-accent: var(--accent-profile); }
.topline-advances     { --page-accent: var(--accent-advances); }
.topline-matrix        { --page-accent: var(--accent-matrix); }

@keyframes drift {
  0%, 100% { transform: translate(0, 0); }
  50% { transform: translate(2%, 1.5%); }
}
.login-wrap{
  min-height:100vh; display:flex; align-items:center; justify-content:center; position:relative; overflow:hidden;
  background:var(--bg);
}
.login-wrap::before{
  content:''; position:absolute; inset:-10%; z-index:0; animation: drift 22s ease-in-out infinite;
  background:
    radial-gradient(1100px 620px at 18% -8%, rgba(95,192,178,.16), transparent 60%),
    radial-gradient(950px 560px at 102% 8%, rgba(224,188,108,.13), transparent 60%),
    radial-gradient(800px 520px at 40% 115%, rgba(243,147,188,.10), transparent 60%);
}
.login-card{
  width:420px; max-width:92vw; background:var(--panel); border:1px solid var(--border);
  border-radius:var(--radius); padding:32px; position:relative; overflow:hidden; box-shadow:var(--shadow-lg);
  z-index:1; animation: fadeInUp .5s var(--ease-spring) both;
}
.login-card::before{content:'';position:absolute;top:0;left:0;right:0;height:4px;background:linear-gradient(90deg,var(--teal),var(--brass),var(--rose),var(--blue));background-size:200% 100%;animation:sheen 6s linear infinite;}
@keyframes sheen{ 0%{background-position:0% 0;} 100%{background-position:200% 0;} }
.badge-title{display:flex;align-items:center;gap:10px;margin-bottom:22px;}
.badge-icon{width:38px;height:38px;border:2px solid var(--brass);border-radius:50%;display:flex;align-items:center;justify-content:center;font-family:var(--font-display);color:var(--brass);font-weight:700;font-size:16px;flex-shrink:0;}
.field{margin-bottom:14px;}
/* AJAX search box sitting above its paired <select> — see ajax_search.php
   and the script in layout_foot.php. Deliberately stacked ABOVE the
   select rather than beside it, so on a narrow/mobile screen the field
   still reads top-to-bottom as Label -> Search -> Dropdown, no separate
   responsive layout needed since it's just normal block flow inside the
   existing .field container. */
.ajax-search-wrap{position:relative;margin-bottom:6px;}
.ajax-search-input{
  width:100%;box-sizing:border-box;padding:9px 12px;background:var(--field-bg);
  border:1px solid var(--field-border);border-radius:var(--radius-sm);color:var(--text);font-size:13px;
}
.ajax-search-input:focus{outline:none;border-color:var(--brass);}
.ajax-search-results{
  display:none;position:absolute;left:0;right:0;top:calc(100% + 4px);z-index:20;
  max-height:240px;overflow-y:auto;background:var(--panel);border:1px solid var(--border);
  border-radius:var(--radius-sm);box-shadow:var(--shadow-lg);
}
.ajax-search-results.show{display:block;}
.ajax-search-result{padding:9px 12px;font-size:13px;cursor:pointer;border-bottom:1px solid var(--border);}
.ajax-search-result:last-child{border-bottom:none;}
.ajax-search-result:hover,.ajax-search-result.active{background:var(--panel-alt);}
.ajax-search-result.selected{color:var(--teal);font-weight:600;}
.ajax-search-empty{padding:9px 12px;font-size:12.5px;color:var(--muted);}

/* Multi-select employee checklist on Allocate's "New assignment" panel —
   see the JS at the bottom of allocate.php. Reuses the same field-bg /
   field-border pair as regular inputs for visual consistency, just in a
   scrollable box instead of a single-line control. */
#employee-filter-input{
  width:100%;box-sizing:border-box;padding:9px 12px;margin-bottom:8px;
  background:var(--field-bg);border:1.5px solid var(--field-border);
  border-radius:var(--radius-sm);color:var(--text);font-size:13px;
}
#employee-filter-input:focus{outline:none;border-color:var(--brass);}
.employee-checklist{
  max-height:320px;overflow-y:auto;background:var(--field-bg);
  border:1.5px solid var(--field-border);border-radius:var(--radius-sm);
}
#employee-checklist .employee-checklist-row{
  display:flex;align-items:center;gap:10px;padding:11px 12px;font-size:15px;
  cursor:pointer;border-bottom:1px solid var(--border);
}
#employee-checklist .employee-checklist-row:last-child{border-bottom:none;}
#employee-checklist .employee-checklist-row:hover{background:var(--panel-alt);}
#employee-checklist .employee-checklist-row input[type="checkbox"]{flex-shrink:0;width:18px;height:18px;cursor:pointer;}
.employee-checklist-name{flex:1;font-size:15px;line-height:1.4;}
.employee-checklist-tag{margin:0;flex-shrink:0;}
.employee-checklist-empty{padding:14px 12px;font-size:12.5px;color:var(--muted);text-align:center;}

.field label{display:block;font-size:11px;text-transform:uppercase;letter-spacing:.08em;color:var(--muted);margin-bottom:5px;}
/* New assignment's Site/Employees/Duration/Shift labels, and its overall
   body text, sized up to match Your Active Deployments' table (13px
   content, 15px on mobile) rather than the smaller 11px used for field
   labels elsewhere in the app — scoped to this one form so nothing else
   is affected. */
#allocate-form .field label{
  font-family:var(--font-display);font-size:18px;font-weight:700;
  letter-spacing:.03em;text-transform:uppercase;color:var(--text);
}
@media (max-width: 880px) {
  #allocate-form .field label{font-size:20px;}
}
#allocate-form,#allocate-form .note{font-size:14px;}

/* Spinner shown in the employee checklist while its AJAX request is in
   flight — see the JS at the bottom of allocate.php. */
.employee-checklist-loading{
  display:flex;align-items:center;justify-content:center;gap:10px;
  padding:22px 12px;font-size:13px;color:var(--muted);
}
.employee-checklist-spinner{
  width:18px;height:18px;border-radius:50%;flex-shrink:0;
  border:2.5px solid var(--field-border);border-top-color:var(--teal);
  animation:employee-checklist-spin .7s linear infinite;
}
@keyframes employee-checklist-spin{ to{ transform:rotate(360deg); } }
.field input,.field select{width:100%;padding:10px 12px;background:var(--field-bg);border:1.5px solid var(--field-border);border-radius:var(--radius-sm);color:var(--text);font-size:14px;transition:border-color .15s var(--ease), box-shadow .15s var(--ease), background .15s var(--ease);}
.field select{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-image:url("data:image/svg+xml;charset=UTF-8,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%2398A3AD' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3e%3cpolyline points='6 9 12 15 18 9'%3e%3c/polyline%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right 10px center;background-size:16px;padding-right:34px;}
.field input:hover,.field select:hover{border-color:var(--muted);}
.field input:focus,.field select:focus,textarea:focus{outline:none;border-color:var(--teal);box-shadow:0 0 0 3px color-mix(in srgb, var(--teal) 20%, transparent);}

.btn{
  display:inline-flex;align-items:center;justify-content:center;gap:6px;padding:10px 16px;border-radius:var(--radius-sm);
  border:1px solid var(--border);background:var(--panel-alt);color:var(--text);font-size:13px;font-weight:600;letter-spacing:.02em;
  text-decoration:none; transition:transform .15s var(--ease), box-shadow .15s var(--ease), border-color .15s var(--ease), background .15s var(--ease), filter .15s var(--ease);
}
.btn:hover{border-color:var(--brass);transform:translateY(-1px);box-shadow:var(--shadow-sm);}
/* Applied by the global double-submit guard in layout_foot.php / login.php
   the instant a form is actually submitting, so a slow server response
   can't be mistaken for "nothing happened" and clicked again. */
.btn-pending{opacity:.55;cursor:wait!important;pointer-events:none;transform:none!important;}
.btn:active{transform:translateY(0);filter:brightness(.96);}
.btn-primary{background:var(--teal);background:linear-gradient(155deg, color-mix(in srgb, var(--teal) 85%, white), var(--teal));border-color:var(--teal);color:#07120f;font-weight:700;}
.btn-primary:hover{filter:brightness(1.07);box-shadow:0 6px 18px color-mix(in srgb, var(--teal) 38%, transparent);}
.btn-danger{background:transparent;border-color:var(--red);color:var(--red);}
.btn-danger:hover{background:color-mix(in srgb, var(--red) 12%, transparent);box-shadow:0 6px 16px color-mix(in srgb, var(--red) 20%, transparent);}
.btn-teal{background:transparent;border-color:var(--teal);color:var(--teal);}
.btn-teal:hover{background:color-mix(in srgb, var(--teal) 12%, transparent);box-shadow:0 6px 16px color-mix(in srgb, var(--teal) 20%, transparent);}
.btn-amber{background:transparent;border-color:var(--amber);color:var(--amber);}
.btn-amber:hover{background:color-mix(in srgb, var(--amber) 12%, transparent);box-shadow:0 6px 16px color-mix(in srgb, var(--amber) 20%, transparent);}
.btn-purple{background:transparent;border-color:var(--purple);color:var(--purple);}
.btn-purple:hover{background:color-mix(in srgb, var(--purple) 12%, transparent);box-shadow:0 6px 16px color-mix(in srgb, var(--purple) 20%, transparent);}
.btn-blue{background:transparent;border-color:var(--blue);color:var(--blue);}
.btn-blue:hover{background:color-mix(in srgb, var(--blue) 12%, transparent);box-shadow:0 6px 16px color-mix(in srgb, var(--blue) 20%, transparent);}
.btn-block{width:100%;}
.btn-sm{padding:6px 10px;font-size:12px;}
.err-msg{color:var(--red);font-size:12.5px;margin-top:10px;animation:shake .35s var(--ease);}
@keyframes shake{ 10%,90%{transform:translateX(-1px);} 20%,80%{transform:translateX(2px);} 30%,50%,70%{transform:translateX(-3px);} 40%,60%{transform:translateX(3px);} }
.demo-accounts{margin-top:20px;padding-top:16px;border-top:1px dashed var(--border);}
.demo-row{display:flex;justify-content:space-between;align-items:center;padding:7px 0;font-size:12.5px;color:var(--muted);}

.app{display:flex;min-height:100vh;}
.mobile-topbar{display:none;}
.sidebar-backdrop{display:none;}
.sidebar{width:212px;background:var(--panel);border-right:1px solid var(--border);display:flex;flex-direction:column;flex-shrink:0;}
.sidebar-head{padding:20px 18px 16px;border-bottom:1px solid var(--border);}
.sidebar-head .brand{display:flex;align-items:center;gap:8px;}
.brand-mark{width:26px;height:26px;border:2px solid var(--brass);border-radius:50%;display:flex;align-items:center;justify-content:center;font-family:var(--font-display);color:var(--brass);font-size:12px;font-weight:700;}
.brand-name{font-family:var(--font-display);letter-spacing:.06em;font-size:14px;font-weight:700;}

/* Client logo has fixed dark/red artwork (not theme-aware), so it always
   sits on its own light plate rather than directly on the app's panel
   background — keeps it legible in dark mode instead of the black text
   in the artwork disappearing against a near-black sidebar. */
.brand-logo-chip{
  display:inline-flex; align-items:center; background:#fff;
  border:1px solid var(--border); border-radius:var(--radius-sm); box-shadow:var(--shadow-sm);
  padding:5px 10px; transition:box-shadow .2s var(--ease), transform .2s var(--ease);
}
.brand-logo-chip:hover{ box-shadow:var(--shadow); transform:translateY(-1px); }
.brand-logo-chip img{ display:block; height:30px; width:auto; }
.brand-logo-chip.brand-logo-lg{ padding:10px 16px; }
.brand-logo-chip.brand-logo-lg img{ width:250px; height:auto; }
.brand-caption{ font-size:10px; color:var(--muted); text-transform:uppercase; letter-spacing:.08em; margin-top:6px; }

.nav{flex:1;padding:14px 10px;display:flex;flex-direction:column;gap:2px;}
.nav-item{
  position:relative; display:flex;align-items:center;gap:9px;padding:10px 12px 10px 16px;border-radius:var(--radius-sm);
  color:var(--muted);font-size:13px;font-weight:600;border:1px solid transparent;text-decoration:none;
  transition:background .15s var(--ease), color .15s var(--ease), padding-left .15s var(--ease);
}
.nav-item:hover{background:var(--panel-alt);color:var(--text);padding-left:19px;}
.nav-item.active{background:var(--panel-alt);color:var(--nav-accent,var(--brass));border-color:var(--border);}
.nav-item.active::before{
  content:''; position:absolute; left:0; top:50%; transform:translateY(-50%); width:3px; height:60%;
  border-radius:0 3px 3px 0; background:var(--nav-accent,var(--brass));
}
.nav-item.active .nav-dot{background:var(--nav-accent,var(--brass));box-shadow:0 0 0 3px color-mix(in srgb, var(--nav-accent,var(--brass)) 25%, transparent);}
.nav-dot{width:6px;height:6px;border-radius:50%;background:var(--border);flex-shrink:0;transition:box-shadow .2s var(--ease), background .2s var(--ease);}
.nav-item[data-key="dashboard"]{--nav-accent:var(--accent-dashboard);}
.nav-item[data-key="sites"]{--nav-accent:var(--accent-sites);}
.nav-item[data-key="managers"]{--nav-accent:var(--accent-managers);}
.nav-item[data-key="supervisors"]{--nav-accent:var(--accent-supervisors);}
.nav-item[data-key="guards"]{--nav-accent:var(--accent-guards);}
.nav-item[data-key="allocate"]{--nav-accent:var(--accent-allocate);}
.nav-item[data-key="attendance"]{--nav-accent:var(--accent-attendance);}
.nav-item[data-key="reports"]{--nav-accent:var(--accent-reports);}
.nav-item[data-key="audit"]{--nav-accent:var(--accent-audit);}
.nav-item[data-key="approvals"]{--nav-accent:var(--accent-approvals);}
.nav-item[data-key="permissions"]{--nav-accent:var(--accent-permissions);}
.nav-item[data-key="profile"]{--nav-accent:var(--accent-profile);}
.nav-item[data-key="advances"]{--nav-accent:var(--accent-advances);}
.nav-item[data-key="matrix"]{--nav-accent:var(--accent-matrix);}
.sidebar-foot{padding:14px;border-top:1px solid var(--border);}

/* Developer/vendor attribution, at the bottom of the page content (not
   the nav) — deliberately subordinate to the client's own branding
   (brand-logo-chip): small, muted, and using the vendor's own brand
   colors rather than the app's theme variables, the same way a "Powered
   by Stripe" badge stays Stripe-purple regardless of the host site's
   palette. */
.page-footer-credit{
  display:flex; align-items:center; justify-content:center; gap:8px;
  margin-top:36px; padding-top:16px; border-top:1px dashed var(--border);
  font-size:11.5px; color:var(--muted); text-align:center; flex-wrap:wrap;
}
.page-footer-credit img{ height:18px; width:auto; flex-shrink:0; }
.page-footer-credit b{ color:#E8792C; font-weight:700; }
.page-footer-credit-text{ display:flex; flex-direction:column; gap:3px; }
.page-footer-credit-text div:last-child{ font-size:10.5px; opacity:.75; }
.dev-credit-login{
  display:flex; align-items:center; justify-content:center; gap:8px;
  margin-top:18px; padding-top:14px; border-top:1px dashed var(--border);
  font-size:11px; color:var(--muted);
}
.dev-credit-login-logo{ width:100%; max-width:270px; height:auto; border-radius:4px; }
.user-chip{display:flex;flex-direction:column;gap:2px;margin-bottom:10px;}
.user-chip .name{font-size:13px;font-weight:700;}
.role-stamp{display:inline-block;align-self:flex-start;margin-top:4px;padding:2px 8px;border:1px solid var(--role-color,var(--brass));color:var(--role-color,var(--brass));font-family:var(--font-display);font-size:10px;letter-spacing:.1em;text-transform:uppercase;border-radius:3px;}
.role-owner{--role-color:var(--brass);}
.role-manager{--role-color:var(--purple);}
.role-supervisor{--role-color:var(--teal);}
.theme-toggle{
  display:flex;align-items:center;justify-content:center;gap:8px;width:100%;padding:8px 10px;margin-bottom:10px;
  border-radius:var(--radius-sm);border:1px solid var(--border);background:var(--panel-alt);color:var(--text);
  font-size:12px;font-weight:600;transition:border-color .15s var(--ease), transform .15s var(--ease);
}
.theme-toggle:hover{border-color:var(--brass);transform:translateY(-1px);}
.theme-toggle:active{transform:translateY(0);}
.theme-toggle svg{ width:15px; height:15px; transition:transform .3s var(--ease-spring); }
.theme-toggle:hover svg{ transform:rotate(18deg); }
.icon-btn{display:inline-flex;align-items:center;justify-content:center;}
.icon-btn svg{width:16px;height:16px;}
.hamburger-lines{ position:relative; width:16px; height:12px; display:inline-block; flex-shrink:0; }
.hamburger-lines span{
  position:absolute; left:0; width:100%; height:2px; background:currentColor; border-radius:2px;
  transition:transform .25s var(--ease), opacity .2s var(--ease), top .25s var(--ease);
}
.hamburger-lines span:nth-child(1){ top:0; }
.hamburger-lines span:nth-child(2){ top:5px; }
.hamburger-lines span:nth-child(3){ top:10px; }
.hamburger[aria-expanded="true"] .hamburger-lines span:nth-child(1){ top:5px; transform:rotate(45deg); }
.hamburger[aria-expanded="true"] .hamburger-lines span:nth-child(2){ opacity:0; }
.hamburger[aria-expanded="true"] .hamburger-lines span:nth-child(3){ top:5px; transform:rotate(-45deg); }

.main{flex:1;padding:26px 32px 60px;overflow-x:hidden;max-width:1180px;}
.topline{display:flex;justify-content:space-between;align-items:flex-end;margin-bottom:22px;flex-wrap:wrap;gap:10px;}
.shared-note{font-size:11.5px;color:var(--muted);}

.grid{display:grid;gap:14px;}
.grid-4{grid-template-columns:repeat(4,1fr);}
.grid-3{grid-template-columns:repeat(3,1fr);}
.grid-2{grid-template-columns:1fr 1fr;}
@media (max-width:900px){.grid-4{grid-template-columns:repeat(2,1fr);} .grid-3{grid-template-columns:repeat(2,1fr);} .grid-2{grid-template-columns:1fr;}}

@keyframes fadeInUp{ from{ opacity:0; transform:translateY(8px); } to{ opacity:1; transform:translateY(0); } }
.stat-card{
  position:relative; background:var(--panel);border:1px solid var(--border);border-radius:var(--radius);padding:16px 18px;
  box-shadow:var(--shadow); overflow:hidden; animation:fadeInUp .4s var(--ease) both;
  transition:transform .2s var(--ease), box-shadow .2s var(--ease);
}
.stat-card::before{
  content:''; position:absolute; top:0; left:0; right:0; height:3px;
  background:linear-gradient(90deg, var(--stat-color,var(--border)), color-mix(in srgb, var(--stat-color,var(--border)) 40%, transparent));
}
.stat-card:hover{ transform:translateY(-3px); box-shadow:var(--shadow-lg); }
.stat-card .num{font-family:var(--font-display);font-size:31px;font-weight:700;line-height:1;color:var(--stat-color,var(--text));}
.stat-card .lbl{font-size:11.5px;color:var(--muted);text-transform:uppercase;letter-spacing:.06em;margin-top:6px;}
.stat-brass{--stat-color:var(--brass);} .stat-teal{--stat-color:var(--teal);}
.stat-amber{--stat-color:var(--amber);} .stat-red{--stat-color:var(--red);}
.stat-green{--stat-color:var(--green);} .stat-blue{--stat-color:var(--blue);}
.stat-purple{--stat-color:var(--purple);} .stat-coral{--stat-color:var(--coral);}
.stat-rose{--stat-color:var(--rose);}

.panel{
  background:var(--panel);border:1px solid var(--border);border-radius:var(--radius);padding:20px 22px;margin-bottom:18px;
  box-shadow:var(--shadow);scroll-margin-top:20px; animation:fadeInUp .35s var(--ease) both;
  transition:box-shadow .2s var(--ease);
}
tr[id]{scroll-margin-top:90px;}
.panel-head{display:flex;justify-content:space-between;align-items:center;margin-bottom:14px;}

table{width:100%;border-collapse:collapse;font-size:13px;}
th{text-align:left;font-size:10.5px;text-transform:uppercase;letter-spacing:.06em;color:var(--muted);padding:8px 10px;border-bottom:1px solid var(--border);}
td{padding:9px 10px;border-bottom:1px solid var(--border);color:var(--text);position:relative;transition:background .12s var(--ease);}
tr:last-child td{border-bottom:none;}
tbody tr{ transition:background .12s var(--ease); }
tbody tr:hover td{background:var(--panel-alt);}
tbody tr:hover td:first-child::before{
  content:''; position:absolute; left:0; top:0; bottom:0; width:2px; background:var(--brass);
}
.tag{display:inline-flex;align-items:center;gap:5px;padding:3px 9px;border-radius:20px;font-size:11px;font-weight:700;letter-spacing:.03em;}
.tag::before{content:'';width:5px;height:5px;border-radius:50%;background:currentColor;flex-shrink:0;}
.tag-green{background:rgba(95,187,116,.15);color:var(--green);}
.tag-amber{background:rgba(228,161,85,.15);color:var(--amber);}
.tag-teal{background:rgba(87,179,166,.15);color:var(--teal);}
.tag-red{background:rgba(224,100,90,.15);color:var(--red);}
.tag-purple{background:rgba(180,142,234,.15);color:var(--purple);}
.tag-blue{background:rgba(108,155,255,.15);color:var(--blue);}
.tag-rose{background:rgba(238,134,176,.15);color:var(--rose);}
.tag-muted{background:rgba(154,165,175,.15);color:var(--muted);}

form.inline-form{display:flex;flex-wrap:wrap;gap:10px;align-items:end;}
form.inline-form .field{margin-bottom:0;min-width:150px;flex:1;}
.empty{padding:30px 20px;text-align:center;color:var(--muted);font-size:13px;border:1.5px dashed var(--border);border-radius:var(--radius);}
.empty::before{content:'○';display:block;font-size:18px;margin-bottom:6px;color:var(--border);}

.chain{position:relative;padding-left:26px;}
.chain-entry{position:relative;padding:12px 14px;border:1px solid var(--border);background:var(--panel-alt);border-radius:var(--radius-sm);transition:border-color .15s var(--ease), transform .15s var(--ease);}
.chain-entry:hover{border-color:var(--brass-dim);transform:translateX(2px);}
.chain-entry + .chain-entry{margin-top:14px;}
.chain-entry::before{content:'';position:absolute;left:-20px;top:16px;width:10px;height:10px;border-radius:50%;background:var(--brass);border:2px solid var(--bg);box-shadow:0 0 0 3px color-mix(in srgb, var(--brass) 20%, transparent);}
.chain::after{content:'';position:absolute;left:-16px;top:8px;bottom:8px;width:2px;background:linear-gradient(var(--border), transparent);}
.chain-hash{font-family:var(--font-mono);font-size:11px;color:var(--teal);word-break:break-all;}
.chain-meta{display:flex;justify-content:space-between;font-size:11.5px;color:var(--muted);margin-bottom:4px;}
.verify-banner{padding:12px 16px;border-radius:var(--radius-sm);font-size:13px;font-weight:600;margin-bottom:16px;animation:fadeInUp .3s var(--ease) both;}
.verify-ok{background:rgba(95,187,116,.14);color:var(--green);border:1px solid rgba(95,187,116,.4);}
.verify-bad{background:rgba(224,100,90,.14);color:var(--red);border:1px solid rgba(224,100,90,.4);}

.encbox{font-family:var(--font-mono);font-size:11.5px;color:var(--muted);background:var(--panel-alt);padding:2px 6px;border-radius:3px;}
.note{font-size:12px;color:var(--muted);border-left:2px solid var(--brass-dim);padding-left:10px;margin-top:10px;}
.row-flex{display:flex;gap:8px;align-items:center;flex-wrap:wrap;}

/* Scoped to the Managers/Supervisors row actions (Save photo, Save phone,
   Reset password, Remove) so labels of very different lengths still line
   up consistently, without changing .row-flex's behavior everywhere else
   it's used (Allocate's swap form, Permissions toggles, etc.). */
.person-actions{display:flex;gap:10px;align-items:center;flex-wrap:wrap;}
.person-actions form{display:flex;align-items:center;gap:6px;flex-wrap:nowrap;}
.person-actions .btn-sm{min-width:112px;white-space:nowrap;}
.person-actions input[type="tel"],.person-actions input[type="password"]{width:130px;flex-shrink:0;}

.avatar-img{border-radius:50%;object-fit:cover;display:inline-block;border:2px solid var(--border);vertical-align:middle;transition:border-color .15s var(--ease), transform .15s var(--ease);}
.avatar-link:hover .avatar-img{border-color:var(--brass);transform:scale(1.06);}
.avatar-link{display:inline-block;line-height:0;}
.avatar-fallback{display:inline-flex;align-items:center;justify-content:center;border-radius:50%;color:#fff;font-weight:700;font-family:var(--font-display);vertical-align:middle;flex-shrink:0;box-shadow:inset 0 0 0 2px rgba(255,255,255,.18);}
.avatar-row{display:flex;align-items:center;gap:10px;}
.photo-upload-form{display:flex;align-items:center;gap:8px;flex-wrap:wrap;}
.photo-upload-form input[type="file"]{font-size:11.5px;max-width:170px;color:var(--muted);}
.profile-card{display:flex;align-items:center;gap:18px;flex-wrap:wrap;}
.chart-grid{display:grid;grid-template-columns:1fr 1fr;gap:14px;}
@media (max-width:900px){.chart-grid{grid-template-columns:1fr;}}
.chart-panel canvas{max-height:260px;}

/* Attendance matrix report: a wide date-grid needs its own scroll container
   (not the panel-level one used by ordinary tables) plus a sticky first
   column so the guard name stays visible while scrolling through dates. */
.matrix-wrap{overflow-x:auto;-webkit-overflow-scrolling:touch;border:1px solid var(--border);border-radius:var(--radius-sm);}
.matrix-table{border-collapse:collapse;font-size:12px;white-space:nowrap;font-family:var(--font-mono);}
.matrix-table th,.matrix-table td{padding:6px 9px;border-bottom:1px solid var(--border);border-right:1px solid var(--border);text-align:center;transition:background .12s var(--ease);}
.matrix-table tbody tr:hover td{background:var(--panel-alt);}
.matrix-table thead th{background:var(--panel-alt);position:sticky;top:0;z-index:1;font-family:var(--font-body);font-size:10.5px;text-transform:uppercase;letter-spacing:.04em;color:var(--muted);font-weight:700;}
.matrix-table th:nth-child(1),.matrix-table td:nth-child(1){
  position:sticky;left:0;width:44px;min-width:44px;max-width:44px;
  background:var(--panel);text-align:center;z-index:2;font-family:var(--font-body);font-weight:600;
}
.matrix-table th:nth-child(2),.matrix-table td:nth-child(2){
  position:sticky;left:44px;width:88px;min-width:88px;max-width:88px;
  background:var(--panel);text-align:left;z-index:2;font-family:var(--font-body);font-weight:600;
}
.matrix-table th:nth-child(3),.matrix-table td:nth-child(3){
  position:sticky;left:132px;width:150px;min-width:150px;max-width:150px;
  background:var(--panel);text-align:left;z-index:2;font-family:var(--font-body);font-weight:600;
  border-right:2px solid var(--border);
}
.matrix-table th:nth-child(4),.matrix-table td:nth-child(4){
  position:sticky;left:282px;width:110px;min-width:110px;max-width:110px;
  background:var(--panel);text-align:left;z-index:2;font-family:var(--font-body);font-weight:600;
  border-right:2px solid var(--border);
}
.matrix-table thead th:nth-child(1),.matrix-table thead th:nth-child(2),
.matrix-table thead th:nth-child(3),.matrix-table thead th:nth-child(4){z-index:3;background:var(--panel-alt);}
.matrix-table tbody tr:hover td:nth-child(1),.matrix-table tbody tr:hover td:nth-child(2),
.matrix-table tbody tr:hover td:nth-child(3),.matrix-table tbody tr:hover td:nth-child(4){background:var(--panel-alt);}
.matrix-table td.weekend,.matrix-table th.weekend{background:rgba(217,178,92,.08);}
.matrix-table tfoot td{font-weight:700;background:var(--panel-alt);}
.matrix-table tfoot td:nth-child(1),.matrix-table tfoot td:nth-child(2),
.matrix-table tfoot td:nth-child(3),.matrix-table tfoot td:nth-child(4){background:var(--panel-alt);}
.matrix-table tfoot td:first-child{background:var(--panel-alt);}
.matrix-table td.matrix-total,.matrix-table th.matrix-total{background:var(--panel-alt);font-weight:700;border-left:2px solid var(--border);}
.matrix-empty-cell{color:var(--muted);}

/* =========================================================
   Mobile layout — off-canvas nav drawer + stacked content
   ========================================================= */
@media (max-width: 880px) {
  .app { flex-direction: column; }

  .mobile-topbar{
    display:flex; align-items:center; justify-content:space-between;
    gap:10px; background:var(--panel); border-bottom:1px solid var(--border);
    padding:12px 16px; position:sticky; top:0; z-index:60;
  }
  .mobile-topbar .brand{display:flex;align-items:center;gap:8px;}
  .hamburger{
    display:inline-flex; align-items:center; gap:8px;
    background:var(--panel-alt); border:1px solid var(--border); border-radius:var(--radius-sm);
    padding:8px 12px; color:var(--text); font-size:13px; font-weight:600; line-height:1;
    transition:border-color .15s var(--ease);
  }
  .hamburger:hover{border-color:var(--brass);}

  .sidebar-backdrop{
    display:block; position:fixed; inset:0; background:rgba(10,12,14,.5); backdrop-filter:blur(2px);
    z-index:90; opacity:0; pointer-events:none; transition:opacity .2s var(--ease);
  }
  .sidebar-backdrop.show{ opacity:1; pointer-events:auto; }

  .sidebar{
    position:fixed; top:0; left:0; bottom:0; width:250px; max-width:80vw;
    z-index:100; transform:translateX(-100%); transition:transform .25s var(--ease-spring);
    box-shadow: var(--shadow-lg);
  }
  .sidebar.nav-open{ transform:translateX(0); }
  .sidebar-head{ display:none; }

  .main{ padding:18px 16px 48px; max-width:100%; }
  .topline{ align-items:flex-start; }
  h1{ font-size:28px; line-height:1.15; }
  .panel-head h2, h2{ font-size:20px; }

  #employee-checklist .employee-checklist-row{ padding:13px 12px; font-size:16.5px; }
  .employee-checklist-name{ font-size:16.5px; }
  #employee-checklist .employee-checklist-row input[type="checkbox"]{ width:20px; height:20px; }
  #employee-filter-input{ font-size:15px; padding:11px 12px; }

  /* Attendance Matrix on mobile: only Sr. No., Reg. No., and Employee
     Name stay frozen while scrolling through the day columns — Rank
     scrolls away with them instead of eating into the narrow screen's
     frozen-column budget. Sr. No. and Reg. No. also shrink to fit,
     since their desktop widths (44px/88px) alone would eat most of a
     375px screen before a single day column is visible. */
  .matrix-table th:nth-child(1),.matrix-table td:nth-child(1){
    width:30px;min-width:30px;max-width:30px;padding:6px 4px;
  }
  .matrix-table th:nth-child(2),.matrix-table td:nth-child(2){
    left:30px;width:64px;min-width:64px;max-width:64px;padding:6px 5px;
    font-size:11px;white-space:normal;word-break:break-word;
  }
  .matrix-table th:nth-child(3),.matrix-table td:nth-child(3){
    left:94px; /* 30 (Sr. No.) + 64 (Reg. No.) */
  }
  .matrix-table th:nth-child(4),.matrix-table td:nth-child(4){
    position:static;left:auto;width:auto;min-width:90px;max-width:none;
    background:var(--panel);border-right:1px solid var(--border);
  }
  .matrix-table thead th:nth-child(4){position:static;z-index:auto;background:var(--panel-alt);}
  .matrix-table tbody tr:hover td:nth-child(4){background:var(--panel-alt);}
  .matrix-table tfoot td:nth-child(4){position:static;background:var(--panel-alt);}

  .grid-4, .grid-3, .grid-2{ grid-template-columns:repeat(2,1fr); }

  form.inline-form .field{ min-width:100%; }
  form.inline-form .btn{ width:100%; }

  .panel:has(table){ overflow-x:auto; -webkit-overflow-scrolling:touch; }
  table{ min-width:620px; }

  .panel, tr[id]{ scroll-margin-top: 90px; }

  /* Opt-in: tables with class="stack-table" become stacked cards instead
     of scrolling horizontally — used where a row has too many columns
     (including action buttons/forms) to read comfortably as a scroll-table
     on a phone. Each <td> needs data-label="Column Name". */
  .panel:has(.stack-table){ overflow-x: visible; }
  .stack-table{ min-width: 0; border-collapse: separate; border-spacing: 0; }
  .stack-table thead{ display:none; }
  .stack-table, .stack-table tbody, .stack-table tr, .stack-table td{ display:block; width:100%; }
  .stack-table tr{
    background:var(--panel-alt); border:1px solid var(--border); border-radius:var(--radius-sm);
    padding:10px 12px; margin-bottom:12px;
  }
  .stack-table tr:last-child{ margin-bottom:0; }
  .stack-table td{
    border-bottom:1px solid var(--border); padding:8px 0;
    display:flex; align-items:center; justify-content:space-between; gap:12px; text-align:right;
  }
  .stack-table td:last-child{ border-bottom:none; }
  .stack-table td::before{
    content:attr(data-label); font-size:10.5px; text-transform:uppercase; letter-spacing:.06em;
    color:var(--muted); font-weight:700; flex-shrink:0; text-align:left;
  }
  .stack-table td.stack-actions{ flex-direction:column; align-items:stretch; text-align:left; }
  .stack-table td.stack-actions::before{ margin-bottom:6px; }
  .stack-table td.stack-actions .person-actions{ flex-direction:column; align-items:stretch; }
  .stack-table td.stack-actions .person-actions form{ flex-direction:column; align-items:stretch; width:100%; gap:6px; }
  .stack-table td.stack-actions .person-actions input[type="tel"],
  .stack-table td.stack-actions .person-actions input[type="password"]{ width:100%; box-sizing:border-box; }
  .stack-table td.stack-actions .person-actions .btn-sm{ width:100%; min-width:0; }
  .stack-table td.stack-actions .person-actions .photo-upload-form input[type="file"]{ max-width:100%; width:100%; }
  .stack-table .row-flex, .stack-table form.row-flex{ width:100%; }
}

@media (max-width: 480px) {
  .grid-4, .grid-3, .grid-2{ grid-template-columns:1fr; }
  .login-card{ padding:24px 20px; }
  .panel{ padding:16px 16px; }
}

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