/* ---------------------------------------------------------------------------
   Orbit-inspired reskin (themewagon.com/themes/orbit) - Orbit itself is a
   React/Tailwind SPA, so rather than adopting a build step this brings its
   visual language (rounded surfaces, soft tinted chips/badges, left-accent
   active nav indicator, blurred sticky topbar, collapsible sidebar) onto the
   existing Bootstrap 5 + jQuery shell as plain CSS. Every accent color below
   is a tint/shade of the single brand color, RGB(0,114,188) - Orbit's violet
   "primary" + cyan "accent" two-hue system is intentionally collapsed into
   one strict brand hue; only the semantic status colors (success/warning/
   danger, already used firm-wide for badges/KPIs) stay distinct so states
   remain readable at a glance.
   --------------------------------------------------------------------------- */
:root{
  --brand:#0072BC;         /* RGB(0,114,188) - the ONE brand color, used strictly */
  --brand-rgb:0,114,188;
  --brand-dark:#005a94;    /* shade - hover/press states */
  --brand-light:#3d93d1;   /* tint - gradients, glows, "accent" role */
  --brand-tint-08:rgba(var(--brand-rgb),.08);
  --brand-tint-12:rgba(var(--brand-rgb),.12);
  --brand-tint-15:rgba(var(--brand-rgb),.15);
  --brand-glow:rgba(var(--brand-rgb),.28);
  --navy:#0a67b9;
  --bg:#f4f6f9;
  --card:#ffffff;
  --border:#e3e7ee;
  --border-soft:#edf1f6;
  --text:#1c2430;
  --text-soft:#667085;
  --success:#1f9d6f;
  --warning:#c98a1f;
  --danger:#d1483f;
  --radius-lg:14px;
  --radius-md:10px;
  --shadow-card:0 1px 2px rgba(16,24,40,.04),0 1px 3px rgba(16,24,40,.05);
  --shadow-pop:0 12px 32px rgba(6,40,69,.14);
}

/* ---- Dark theme - same brand blue throughout (RGB 0,114,188), only the neutral
   surface/text colors change. Toggled via data-theme="dark" on <html> (see #themeToggle
   in layout_header.php / app.js), persisted in localStorage so it survives navigation. ---- */
:root[data-theme="dark"]{
  --bg:#10151f;
  --card:#161d2b;
  --border:#262f42;
  --border-soft:#1e2536;
  --text:#e7ebf3;
  --text-soft:#8b95ab;
  --navy:#0a1626;
  --shadow-card:0 1px 2px rgba(0,0,0,.3),0 1px 3px rgba(0,0,0,.25);
  --shadow-pop:0 12px 32px rgba(0,0,0,.45);
}
/* Bootstrap 5.3 ships its own dark mode, switched by data-bs-theme="dark" (set alongside data-theme
   by layout_header.php / app.js). Pointing ITS neutral variables at OUR palette is what stops every
   Bootstrap surface we don't restyle by hand - cards, tables, nav-tabs, list-groups, modals,
   dropdowns, pagination - from keeping its white default on a dark page.

   --bs-body-bg is deliberately our CARD colour, not our page colour: Bootstrap derives card, modal,
   list-group and dropdown backgrounds from it. The page itself is set separately, by the body rule
   further down, so the two surfaces stay distinct. */
:root[data-theme="dark"]{
  --bs-body-bg:var(--card);
  --bs-body-color:var(--text);
  --bs-emphasis-color:var(--text);
  --bs-heading-color:var(--text);
  --bs-secondary-color:var(--text-soft);
  --bs-secondary-bg:var(--border-soft);
  --bs-tertiary-bg:var(--border-soft);
  --bs-tertiary-color:var(--text-soft);
  --bs-border-color:var(--border);
  --bs-border-color-translucent:var(--border);
  --bs-link-color:var(--brand-light);
  --bs-link-hover-color:var(--brand);
}
:root[data-theme="dark"] .card-header{background:var(--card);color:var(--text);}
/* .card sets no background of its own (see the Cards block below), so without this it fell back to
   Bootstrap's card default. Named explicitly rather than relying on inheritance. */
:root[data-theme="dark"] .card{background:var(--card);}
:root[data-theme="dark"] .list-group-item{background:var(--card);color:var(--text);border-color:var(--border);}
/* .alert-light and .text-bg-light are fixed light palettes - Bootstrap's dark mode does not restyle
   them, so on a dark card they render as a white slab. */
:root[data-theme="dark"] .alert-light,
:root[data-theme="dark"] .alert-secondary{background:var(--border-soft);border-color:var(--border);color:var(--text);}
:root[data-theme="dark"] .badge.text-bg-light{background:var(--border-soft)!important;color:var(--text)!important;}
:root[data-theme="dark"] .btn-outline-secondary{color:var(--text);border-color:var(--border);}
:root[data-theme="dark"] .btn-outline-secondary:hover{background:var(--border-soft);color:var(--text);border-color:var(--text-soft);}
:root[data-theme="dark"] .btn-close{filter:invert(1) grayscale(100%) brightness(200%);}
:root[data-theme="dark"] .nav-tabs .nav-link.active{background:var(--card);border-color:var(--border) var(--border) var(--card);color:var(--text);}
:root[data-theme="dark"] .nav-tabs{border-bottom-color:var(--border);}
:root[data-theme="dark"] .table>:not(caption)>*>*{background-color:transparent;}
:root[data-theme="dark"] .bg-body-tertiary,
:root[data-theme="dark"] .bg-light{background-color:var(--border-soft)!important;}
:root[data-theme="dark"] hr{border-color:var(--border);opacity:1;}
:root[data-theme="dark"] .topbar{background:rgba(16,21,31,.86);}
:root[data-theme="dark"] .topbar-search{background:var(--border-soft);}
:root[data-theme="dark"] .table thead th{color:var(--text-soft);}
:root[data-theme="dark"] .table{color:var(--text);}
:root[data-theme="dark"] .table-hover>tbody>tr:hover>*{background:var(--border-soft);color:var(--text);}
:root[data-theme="dark"] .modal-content{background:var(--card);color:var(--text);}
/* --border-soft (not --bg) on purpose: --bg is the page background, a shade darker than --card, so an
   input using it inside a card read as a punched-out black hole rather than a field that belongs to the
   surface it sits in. --border-soft sits between --card and --border, the same "input on a dark card"
   tone already used for .topbar-search above, so form fields read as part of the page, not a clash. */
:root[data-theme="dark"] .form-control,:root[data-theme="dark"] .form-select{background:var(--border-soft);border-color:var(--border);color:var(--text);}
:root[data-theme="dark"] .form-control:focus,:root[data-theme="dark"] .form-select:focus{background:var(--border-soft);color:var(--text);}
:root[data-theme="dark"] .text-muted{color:var(--text-soft)!important;}
:root[data-theme="dark"] .kpi-explainer{background:#2a2411;border-color:#4a3f1c;color:#e6c766;}
/* --navy is repurposed in dark mode for a near-black sidebar shade (see :root[data-theme="dark"] above),
   so anything using it for TEXT rather than background - like the big number on a stat card - goes
   near-invisible on a dark card. --brand-light keeps the same "branded accent" intent, just readable. */
:root[data-theme="dark"] .stat-card .stat-value{color:var(--brand-light);}
:root[data-theme="dark"] .badge.text-bg-secondary{background:var(--border-soft)!important;color:var(--text-soft)!important;}
body{background:var(--bg);color:var(--text);font-family:'Inter',-apple-system,"Segoe UI",Roboto,Helvetica,Arial,sans-serif;}
a{color:var(--brand);}
.text-brand{color:var(--brand)!important;}
.bg-brand{background-color:var(--brand)!important;}

/* ---- Buttons (Orbit: rounded-lg, soft brand shadow, gentle press-down on click) ---- */
.btn{border-radius:9px;font-weight:600;font-size:13.5px;transition:background .15s,border-color .15s,box-shadow .15s,transform .05s;}
.btn:active{transform:scale(.98);}
.btn-primary{background-color:var(--brand);border-color:var(--brand);box-shadow:0 1px 2px var(--brand-tint-15);}
.btn-primary:hover,.btn-primary:focus{background-color:var(--brand-dark);border-color:var(--brand-dark);}
.btn-outline-primary{color:var(--brand);border-color:var(--brand);}
.btn-outline-primary:hover{background-color:var(--brand);border-color:var(--brand);}
.btn-light{background:var(--brand-tint-08);border-color:transparent;color:var(--brand);}
.btn-light:hover{background:var(--brand-tint-15);color:var(--brand-dark);}
.btn-sm{border-radius:8px;}

/* ---- Form controls (match the buttons/cards radius so the whole app feels of a piece) ---- */
.form-control,.form-select{border-radius:9px;border-color:var(--border);}
.form-control:focus,.form-select:focus{border-color:var(--brand);box-shadow:0 0 0 .2rem var(--brand-tint-15);}
.form-control-sm,.form-select-sm{border-radius:8px;}
.modal-content{border-radius:var(--radius-lg);border:1px solid var(--border);overflow:hidden;}

/* ---- Expandable textareas (Performance Appraisals: Target/comment boxes) ---- */
.field-expand-wrap textarea{padding-right:20px;resize:vertical;}
.field-expand-toggle{position:absolute;top:2px;right:2px;z-index:2;line-height:1;color:var(--text-soft);}
.field-expand-toggle:hover{color:var(--brand);}
.field-expand-toggle i{font-size:11px;}

/* ---- Performance Appraisal KPI cards ----
   Each KPI is a card, not a table row: the KPI and its targets get the full width, and the three
   raters get a third each. A five-column table left the Target box a few characters wide and gave
   each rater ~165px for a rating, a percentage, an achievement note and a comment. */
.apr-modal{max-width:1600px;width:96vw;margin-left:auto;margin-right:auto;}
.apr-kpi-card{border:1px solid var(--border);border-radius:var(--radius-md);padding:14px;margin-bottom:14px;background:var(--card);}
.apr-kpi-head{padding-bottom:10px;border-bottom:1px solid var(--border-soft);}
.apr-kpa{font-weight:700;font-size:14px;color:var(--text);margin-top:4px;}
.apr-kpi-desc{font-size:12.5px;color:var(--text-soft);}
.apr-kpi-targets{padding:10px 0;border-bottom:1px solid var(--border-soft);}
/* Each rater's block is visually its own lane, so it stays obvious whose column you are typing in. */
.apr-rater-row{margin-top:2px;}
.apr-rater-row>[class^="col-"]{border-left:2px solid var(--border-soft);}
.apr-rater-row>[class^="col-"]:first-child{border-left:0;}
.rater-head{font-size:11px;font-weight:700;letter-spacing:.05em;text-transform:uppercase;color:var(--brand);margin-bottom:6px;}
.rater-label{display:block;font-size:10.5px;font-weight:700;letter-spacing:.03em;text-transform:uppercase;color:var(--text-soft);margin-bottom:2px;}
/* Targets read as a checklist, so each bullet gets room for its own discussion beneath it. */
.target-list{list-style:none;margin:0;padding:0;}
.target-list>li{padding:6px 0;border-bottom:1px dashed var(--border);}
.target-list>li:last-child{border-bottom:0;}
.target-text{display:block;font-weight:600;font-size:12.5px;color:var(--text);}
.target-text::before{content:"\2022";color:var(--brand);font-weight:700;margin-right:6px;}
.target-comment{font-size:11.5px;color:var(--text-soft);margin:3px 0 0 12px;padding-left:8px;border-left:2px solid var(--border);overflow-wrap:anywhere;}
/* Appraisal-wide discussion - roomier than the per-target notes, it is a conversation not a margin note. */
.apr-comment{font-size:12.5px;padding:8px 10px;margin-bottom:6px;border-radius:var(--radius-md);background:var(--border-soft);overflow-wrap:anywhere;}

/* ---- Home module launcher ----
   Home doubles as the way into the system, so each module gets a tile with a one-line description
   rather than an icon alone - a name like "Terminal Mapping" does not explain itself. */
.launch-tile{display:flex;align-items:flex-start;gap:12px;height:100%;padding:14px 16px;background:var(--card);
  border:1px solid var(--border);border-radius:var(--radius-lg);box-shadow:var(--shadow-card);
  text-decoration:none;transition:border-color .15s,box-shadow .15s,transform .15s;}
.launch-tile:hover{transform:translateY(-1px);border-color:var(--brand-tint-15);box-shadow:0 4px 14px rgba(16,24,40,.07);}
.launch-icon{display:flex;align-items:center;justify-content:center;width:38px;height:38px;flex-shrink:0;
  border-radius:var(--radius-md);background:var(--brand-tint-08);color:var(--brand);font-size:17px;}
.launch-body{display:flex;flex-direction:column;min-width:0;}
.launch-title{font-weight:700;font-size:13.5px;color:var(--text);}
.launch-blurb{font-size:11.5px;color:var(--text-soft);line-height:1.35;margin-top:2px;}

/* ---- Notifications inbox ---- */
/* Stat cards double as the All/Unread/Read filter, so they are links that look like cards. */
.notif-stat{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:16px 18px;background:var(--card);
  border:1px solid var(--border);border-top:3px solid var(--border);border-radius:var(--radius-lg);
  box-shadow:var(--shadow-card);text-decoration:none;transition:border-color .15s,box-shadow .15s,transform .15s;}
.notif-stat:hover{transform:translateY(-1px);box-shadow:0 4px 14px rgba(16,24,40,.07);}
.notif-stat-primary{border-top-color:var(--brand);}
.notif-stat-warning{border-top-color:var(--warning);}
.notif-stat-success{border-top-color:var(--success);}
.notif-stat.active{box-shadow:0 0 0 2px var(--brand-tint-15),var(--shadow-card);}
.notif-stat-label{font-size:11px;font-weight:700;letter-spacing:.05em;text-transform:uppercase;color:var(--text-soft);}
.notif-stat-value{font-size:28px;font-weight:800;color:var(--text);line-height:1.1;}
.notif-stat-icon{display:flex;align-items:center;justify-content:center;width:44px;height:44px;border-radius:var(--radius-md);
  background:var(--border-soft);font-size:18px;flex-shrink:0;}

/* A row is a 4-column strip: tick box, type icon, the notice, its actions. */
.notif-item{display:flex;align-items:flex-start;gap:12px;border-left:3px solid transparent;}
.notif-item.notif-primary{border-left-color:var(--brand);}
.notif-item.notif-warning{border-left-color:var(--warning);}
.notif-item.notif-success{border-left-color:var(--success);}
.notif-item.notif-danger{border-left-color:var(--danger);}
/* Unread is a tint of the row, not a heavy fill - the list still has to read as one list. */
.notif-item.notif-unread{background:var(--brand-tint-08);}
.notif-icon{display:flex;align-items:center;justify-content:center;width:34px;height:34px;border-radius:50%;flex-shrink:0;font-size:15px;}
.notif-body{flex:1 1 auto;min-width:0;}
.notif-title{font-weight:700;font-size:13px;color:var(--text);display:flex;align-items:center;flex-wrap:wrap;gap:2px;}
.notif-message{font-size:13px;color:var(--text);overflow-wrap:anywhere;margin-top:1px;}
.notif-time{font-size:11.5px;color:var(--text-soft);margin-top:4px;}
.notif-dot{display:inline-block;width:7px;height:7px;border-radius:50%;background:var(--brand);margin-left:6px;}
.notif-actions{display:flex;gap:6px;flex-shrink:0;}
@media (max-width:575.98px){
  .notif-item{flex-wrap:wrap;}
  .notif-actions{width:100%;justify-content:flex-end;}
}

/* ---- Permissions matrix (Security & Admin > Permissions) ---- */
.perm-table-wrap{max-height:62vh;overflow-y:auto;}
/* Sticky header: the catalogue is long enough that the column meanings scroll away otherwise. */
.perm-table thead th{position:sticky;top:0;z-index:2;background:var(--card);border-bottom:2px solid var(--border);}
.perm-group>td{background:var(--border-soft);font-weight:700;font-size:11px;letter-spacing:.06em;
  text-transform:uppercase;color:var(--text-soft);position:sticky;top:33px;z-index:1;}
.perm-desc{font-size:11.5px;line-height:1.35;}
/* A row that departs from the role default is marked, so exceptions are visible at a glance. */
.perm-exception>td:first-child{box-shadow:inset 3px 0 0 var(--brand);}

/* ---- Field visit location line on the Case Mgt Tracker activity log ---- */
.field-visit-loc{font-size:11.5px;background:var(--brand-tint-08);border-radius:6px;padding:3px 7px;display:inline-block;}

/* ---- Appraisal Template editor ----
   Grouped by category so the weight is entered once, where it belongs, instead of being repeated
   on every row and kept in sync by hand. */
.tpl-group{border:1px solid var(--border);border-radius:var(--radius-md);margin-bottom:14px;overflow:hidden;}
.tpl-group-head{background:var(--border-soft);padding:10px 12px;border-bottom:1px solid var(--border);}
.tpl-group-body{padding:4px 12px 10px;}
.tpl-row{padding:10px 0;border-bottom:1px dashed var(--border);}
.tpl-row:last-child{border-bottom:0;}
.tpl-label{display:block;font-size:10.5px;font-weight:700;letter-spacing:.03em;text-transform:uppercase;color:var(--text-soft);margin-bottom:2px;}

/* ---- Login screen ---- */
.login-page{min-height:100vh;display:flex;align-items:center;justify-content:center;background:linear-gradient(135deg,var(--navy),var(--brand));padding:20px;}
.login-card{background:#fff;padding:38px 36px;border-radius:16px;width:400px;max-width:100%;box-shadow:0 24px 60px rgba(0,0,0,.28);}
.login-card h1{font-size:20px;margin:0 0 2px;color:var(--navy);font-weight:800;}
.login-card .sub{font-size:12.5px;color:var(--text-soft);margin-bottom:22px;}

/* ---- App shell (Orbit-style: rounded inset nav pills, left accent bar on the
   active item, collapsible-to-icons sidebar, sticky blurred topbar) ---- */
.app-shell{display:flex;min-height:100vh;}
.sidebar{width:260px;flex-shrink:0;background:var(--navy);color:#fff;display:flex;flex-direction:column;position:sticky;top:0;height:100vh;overflow-y:auto;overflow-x:hidden;transition:width .2s ease;}
/* Brand lockup, STACKED. The artwork is itself a two-line lock-up (RKA over the MGI membership
   line), so setting it beside the system name in a 260px rail left the logo too small to read and
   still overflowed. Stacked, the logo gets the full column width and the name sits beneath it on a
   shared rule - the two read as one mark, and the name is optically matched to the logo's width
   rather than to some arbitrary point size. */
.sidebar-brand{display:flex;flex-direction:column;align-items:center;gap:7px;padding:15px 16px 11px;border-bottom:1px solid rgba(255,255,255,.12);}
/* 132px, not the full column: at 196px the brand block ran to ~230px tall - five nav rows' worth of
   masthead before the first link, which is what made the rail feel top-heavy. At this size the whole
   header is about two nav rows and the MGI line is still legible. */
.brand-mark{width:100%;max-width:132px;display:flex;align-items:center;justify-content:center;}
.brand-mark img{width:100%;height:auto;object-fit:contain;}
.brand-text{width:100%;max-width:132px;overflow:hidden;white-space:nowrap;text-align:center;padding-top:7px;border-top:1px solid rgba(255,255,255,.22);}
.brand-name{display:block;font-weight:700;font-size:13.5px;line-height:1;letter-spacing:.3em;text-indent:.3em;text-transform:uppercase;}
/* Icon rail: the wordmark and the MGI line are both unreadable at 44px, so only the mark shows. */
.sidebar.collapsed .brand-mark{max-width:48px;}
.sidebar-nav{flex:1;padding:12px 10px;}
.nav-section-label{font-size:10.5px;font-weight:700;letter-spacing:.08em;text-transform:uppercase;color:rgba(255,255,255,.4);padding:14px 14px 6px;}
.nav-section-label:first-child{padding-top:4px;}
.sidebar.collapsed .nav-section-label{text-align:center;padding-left:0;padding-right:0;}
.sidebar-nav .nav-link{position:relative;display:flex;align-items:center;gap:12px;padding:10px 14px;margin:2px 0;font-size:13.5px;color:rgba(255,255,255,.62);border-radius:10px;transition:background .15s,color .15s;white-space:nowrap;overflow:hidden;}
.sidebar-nav .nav-link i{width:18px;text-align:center;font-size:15px;color:rgba(255,255,255,.5);transition:color .15s;flex-shrink:0;}
.sidebar-nav .nav-link span{overflow:hidden;text-overflow:ellipsis;}
.sidebar-nav .nav-link:hover{background:rgba(255,255,255,.07);color:#fff;}
.sidebar-nav .nav-link:hover i{color:rgba(255,255,255,.85);}
.sidebar-nav .nav-link.active{background:var(--brand-tint-15);color:#fff;font-weight:600;}
.sidebar-nav .nav-link.active i{color:var(--brand-light);}
.sidebar-nav .nav-link.active::before{content:"";position:absolute;left:-10px;top:50%;transform:translateY(-50%);width:3px;height:60%;border-radius:0 3px 3px 0;background:var(--brand-light);}
.sidebar-foot{display:flex;align-items:center;gap:10px;padding:14px 16px;border-top:1px solid rgba(255,255,255,.12);font-size:12px;}
.sidebar-foot-avatar{display:none;width:34px;height:34px;border-radius:50%;flex-shrink:0;background:linear-gradient(135deg,var(--brand),var(--brand-light));align-items:center;justify-content:center;font-weight:700;font-size:13px;color:#fff;}
.sidebar-foot-text{overflow:hidden;white-space:nowrap;}
.sidebar-foot-logout-icon{display:none;width:34px;height:34px;border-radius:10px;align-items:center;justify-content:center;color:rgba(255,255,255,.75);flex-shrink:0;}
.sidebar-foot-logout-icon:hover{background:rgba(255,255,255,.08);color:#fff;}

/* Collapsed (desktop icon-rail) state - toggled via #sidebarToggle, see app.js */
/* ---- Collapsible sidebar groups ----
   Frequent destinations sit at the top level; the long lists fold behind a chevron so the sidebar
   reads as six rows at rest rather than twenty. A group header is a <button>, not a link - it goes
   nowhere, it only opens. */
.sidebar-nav .nav-group-toggle{width:100%;background:none;border:0;text-align:left;font-family:inherit;}
.nav-chevron{margin-left:auto;font-size:11px!important;transition:transform .18s ease;}
.nav-group-toggle.open .nav-chevron{transform:rotate(90deg);}
.nav-group-toggle.open{color:#fff;}
.nav-group-toggle.open i:first-child{color:var(--brand-light);}
/* Sub-items are indented and slightly quieter, with a hairline connecting them to their group. */
.nav-group-items{position:relative;margin:2px 0 6px;}
.nav-group-items::before{content:"";position:absolute;left:21px;top:2px;bottom:2px;width:1px;background:rgba(255,255,255,.14);}
.sidebar-nav .nav-link.nav-sub{padding-left:34px;font-size:13px;}
.sidebar-nav .nav-link.nav-sub i{font-size:13.5px;}

.sidebar.collapsed{width:76px;}
/* Icon-only mode: there is no room for a fly-out, so every group is simply shown expanded as icons.
   Hiding them would leave whole sections unreachable without first widening the sidebar. */
.sidebar.collapsed .nav-chevron{display:none;}
.sidebar.collapsed .nav-group-items{display:block!important;}
.sidebar.collapsed .nav-group-items::before{display:none;}
.sidebar.collapsed .sidebar-nav .nav-link.nav-sub{padding-left:0;}
.sidebar.collapsed .nav-group-toggle{opacity:.55;}
.sidebar.collapsed .brand-text,
.sidebar.collapsed .sidebar-nav .nav-link span,
.sidebar.collapsed .sidebar-foot-text{display:none;}
.sidebar.collapsed .sidebar-brand{justify-content:center;padding-left:0;padding-right:0;}
.sidebar.collapsed .sidebar-nav .nav-link{justify-content:center;padding-left:0;padding-right:0;}
.sidebar.collapsed .sidebar-nav .nav-link.active::before{left:-10px;}
.sidebar.collapsed .sidebar-foot{flex-direction:column;}
.sidebar.collapsed .sidebar-foot-avatar,
.sidebar.collapsed .sidebar-foot-logout-icon{display:flex;}

.main-wrap{flex:1;min-width:0;display:flex;flex-direction:column;}
.topbar{position:sticky;top:0;z-index:30;background:rgba(255,255,255,.86);backdrop-filter:blur(14px);-webkit-backdrop-filter:blur(14px);border-bottom:1px solid var(--border);padding:14px 24px;display:flex;align-items:center;gap:14px;justify-content:space-between;}
.page-title{margin:0;font-size:17px;font-weight:700;}
.page-sub{font-size:12.5px;color:var(--text-soft);}
/* Back + breadcrumb bar, above the content on every page. */
.page-crumbs{display:flex;align-items:center;gap:12px;flex-wrap:wrap;margin:0 0 16px;font-size:12.5px;}
.page-crumbs .crumb-back{display:inline-flex;align-items:center;gap:5px;padding:4px 12px;border:1px solid var(--border);
  border-radius:var(--radius-md);background:var(--card);color:var(--text);text-decoration:none;font-weight:600;
  transition:border-color .15s,color .15s;white-space:nowrap;}
.page-crumbs .crumb-back:hover{border-color:var(--brand);color:var(--brand);}
.page-crumbs ol{display:flex;align-items:center;flex-wrap:wrap;gap:6px;list-style:none;margin:0;padding:0;min-width:0;}
.page-crumbs li{display:flex;align-items:center;gap:6px;color:var(--text-soft);}
.page-crumbs li+li::before{content:"\203A";color:var(--border);font-size:14px;line-height:1;}
.page-crumbs a{color:var(--text-soft);text-decoration:none;}
.page-crumbs a:hover{color:var(--brand);text-decoration:underline;}
.page-crumbs li[aria-current] span{color:var(--text);font-weight:600;}
@media print{.page-crumbs{display:none;}}
.topbar-actions{display:flex;align-items:center;gap:6px;}
.icon-btn{display:inline-flex;align-items:center;justify-content:center;width:38px;height:38px;border-radius:10px;border:0;background:transparent;color:var(--text-soft);font-size:16px;transition:background .15s,color .15s;}
.icon-btn:hover{background:var(--brand-tint-08);color:var(--brand);}
.notif-badge{position:absolute;top:-4px;right:-4px;font-size:10px;}

.topbar-search{position:relative;display:flex;align-items:center;background:var(--bg);border:1px solid var(--border);border-radius:10px;padding:0 12px;width:220px;}
.topbar-search i{color:var(--text-soft);font-size:13px;flex-shrink:0;}
.topbar-search input{border:0;background:transparent;outline:none;padding:8px 8px;font-size:13px;width:100%;color:var(--text);}

.topbar-avatar-btn{width:38px;height:38px;border-radius:50%;border:0;padding:0;overflow:hidden;background:linear-gradient(135deg,var(--brand),var(--brand-light));color:#fff;font-weight:700;font-size:14px;display:flex;align-items:center;justify-content:center;flex-shrink:0;}
.topbar-avatar-btn img{width:100%;height:100%;object-fit:cover;}
.dropdown-menu{border-radius:var(--radius-md);border:1px solid var(--border);box-shadow:var(--shadow-pop);padding:8px;}
.dropdown-item{border-radius:8px;font-size:13.5px;padding:8px 10px;}
.dropdown-item:hover,.dropdown-item:focus{background:var(--brand-tint-08);color:var(--brand-dark);}

.profile-photo-preview{width:96px;height:96px;border-radius:50%;object-fit:cover;}
.content{padding:22px 24px;flex:1;}
.app-footer{padding:14px 24px;font-size:11.5px;color:var(--text-soft);text-align:center;border-top:1px solid var(--border);}

@media(max-width:991px){
  .sidebar{position:fixed;left:-260px;top:0;bottom:0;z-index:1040;transition:left .2s;width:260px!important;}
  .sidebar.open{left:0;}
  .sidebar.collapsed .brand-text,
  .sidebar.collapsed .sidebar-nav .nav-link span,
  .sidebar.collapsed .sidebar-foot-text{display:block;}
  .sidebar.collapsed .sidebar-nav .nav-link{justify-content:flex-start;padding-left:14px;padding-right:14px;}
  .sidebar.collapsed .sidebar-brand{justify-content:flex-start;padding-left:16px;}
  .sidebar.collapsed .sidebar-foot{flex-direction:row;}
  .sidebar.collapsed .sidebar-foot-avatar,
  .sidebar.collapsed .sidebar-foot-logout-icon{display:none;}
}

/* ---- Cards / stats (Orbit: rounded-xl surfaces, soft elevation, icon "chips") ---- */
.card{border:1px solid var(--border);border-radius:var(--radius-lg);box-shadow:var(--shadow-card);overflow:hidden;}
/* The overflow:hidden above is what keeps a full-bleed table's corners inside the card's radius, so
   it stays. But it also CLIPS any dropdown menu opened from inside a card - the menu is cut off at
   the card's edge instead of floating over the page. Put this class on a card that holds a dropdown
   (e.g. the Case Mgt Tracker filter bar); it has no full-bleed content, so nothing needs clipping. */
.card-allow-popout{overflow:visible;}
/* Belt and braces for a long menu on a short screen: scroll inside the menu rather than off-screen. */
.card-allow-popout .dropdown-menu{max-height:min(60vh,420px);overflow-y:auto;}
.card-header{background:#fff;border-bottom:1px solid var(--border);font-weight:700;font-size:14px;}

/* ---- Detail cards (Case Mgt Tracker engagement page) ----
   A record page is read by scanning labels, so the label is small/uppercase/muted and the value sits
   directly under it at full contrast. Every field uses the same pair, which is what stops the grid
   going ragged when one value happens to be long. */
.detail-grid{row-gap:16px;}
.detail-label{display:block;font-size:10.5px;font-weight:700;letter-spacing:.05em;text-transform:uppercase;color:var(--text-soft);margin-bottom:3px;}
.detail-value{display:block;font-size:13.5px;color:var(--text);font-weight:500;overflow-wrap:anywhere;}
/* The Change / Reassign links live IN the label, not trailing the value - trailing them pushed the
   name onto its own line and made the column look broken. */
.detail-action{font-size:10.5px;font-weight:700;letter-spacing:.03em;text-transform:uppercase;vertical-align:baseline;margin-left:6px;}
/* Names as chips: several people in one field read as a list, not one long comma-run. */
.name-chip{display:inline-block;background:var(--brand-tint-08);color:var(--text);border-radius:6px;padding:2px 8px;margin:0 4px 4px 0;font-size:12.5px;font-weight:600;}
/* Status strip: badges, progress and actions on ONE line, wrapping to two on a narrow screen. */
.status-strip{display:flex;flex-wrap:wrap;align-items:center;gap:14px;}
.status-strip .progress{height:8px;min-width:140px;margin:0;}
.stat-card{background:var(--card);border:1px solid var(--border);border-radius:var(--radius-lg);box-shadow:var(--shadow-card);padding:18px;transition:border-color .15s,box-shadow .15s,transform .15s;}
.stat-card:hover{border-color:var(--brand-tint-15);box-shadow:0 4px 14px rgba(16,24,40,.07);transform:translateY(-1px);}
.stat-card .stat-value{font-size:24px;font-weight:800;color:var(--navy);letter-spacing:-.01em;}
.stat-card .stat-label{font-size:11.5px;color:var(--text-soft);text-transform:uppercase;letter-spacing:.03em;}
.stat-card .stat-icon{width:42px;height:42px;border-radius:var(--radius-md);display:flex;align-items:center;justify-content:center;background:var(--brand-tint-12);color:var(--brand);font-size:18px;flex-shrink:0;}
/* A stat card rendered as a link drills into the days behind the number. The hover lift already
   exists above; these only add the affordance that it is clickable at all. */
a.stat-card{cursor:pointer;}
a.stat-card:hover{border-color:var(--brand);}
a.stat-card:hover .stat-value{color:var(--brand);}
a.stat-card:focus-visible{outline:2px solid var(--brand);outline-offset:2px;}
.table thead th{font-size:11.5px;text-transform:uppercase;letter-spacing:.03em;color:var(--text-soft);border-bottom-width:1px;white-space:nowrap;}
.table td,.table th{vertical-align:middle;font-size:13px;}

/* ---- Badges (Orbit: soft pill chips - color-matched tint background + saturated text,
   not a solid fill). Scoped to .badge.text-bg-* (compound selector) so this does NOT also
   restyle toasts, which reuse the same .text-bg-* utility classes but want to stay bold/solid
   for attention. Bootstrap's own .text-bg-* rules use !important, so these must too. ---- */
.badge{border-radius:20px;font-weight:600;letter-spacing:.01em;padding:.4em .75em;}
.badge.text-bg-success{background:rgba(31,157,111,.14)!important;color:var(--success)!important;}
.badge.text-bg-warning{background:rgba(201,138,31,.14)!important;color:var(--warning)!important;}
.badge.text-bg-danger{background:rgba(209,72,63,.14)!important;color:var(--danger)!important;}
.badge.text-bg-primary{background:var(--brand-tint-15)!important;color:var(--brand)!important;}
.badge.text-bg-secondary{background:#eef1f5!important;color:var(--text-soft)!important;}

/* ---- Legacy badge-status/status-* classes (App.badge() JS helper) - same soft-pill language ---- */
.badge-status{font-size:11px;font-weight:600;padding:5px 10px;border-radius:20px;}
.status-ontrack,.status-ontime,.status-active,.status-approved,.status-completed,.status-processed{background:rgba(31,157,111,.14);color:var(--success);}
.status-atrisk,.status-pending,.status-pendingsupervisor,.status-pendinghrpartner,.status-submitted,.status-draft{background:rgba(201,138,31,.14);color:var(--warning);}
.status-late,.status-rejected,.status-overdue,.status-inactive{background:rgba(209,72,63,.14);color:var(--danger);}
.status-notstarted,.status-open,.status-inprogress{background:var(--brand-tint-15);color:var(--brand);}

.progress{height:8px;border-radius:6px;background-color:var(--brand-tint-08);}
.progress-bar{background-color:var(--brand);}

.kpi-explainer{background:#fff7e6;border:1px solid #f2d38b;border-radius:var(--radius-md);padding:12px 14px;font-size:12.5px;color:#7a5b12;}

.avatar-circle{width:36px;height:36px;border-radius:50%;background:linear-gradient(135deg,var(--brand),var(--brand-light));color:#fff;display:flex;align-items:center;justify-content:center;font-weight:700;font-size:13px;flex-shrink:0;}

.id-card{width:340px;border-radius:var(--radius-lg);overflow:hidden;box-shadow:var(--shadow-pop);border:1px solid var(--border);}
.id-card-head{background:linear-gradient(135deg,var(--navy),var(--brand));color:#fff;padding:14px 16px;}
.id-card-photo{width:84px;height:84px;border-radius:var(--radius-md);background:#eee;object-fit:cover;border:3px solid #fff;margin:-42px auto 8px;display:block;}

@media print{
  .sidebar,.topbar,.app-footer,.no-print{display:none!important;}
  .content{padding:0;}
  body{background:#fff;}
  /* Bootstrap's overflow-x:auto silently CLIPS the right-hand columns of a wide table when it goes
     to a printer - the columns are simply missing from the paper with no scrollbar to hint at it.
     Applies to every page in the app, not just the new report views. */
  .table-responsive{overflow:visible!important;}
  .card{box-shadow:none!important;border:none!important;}
}

/* ---------------------------------------------------------------------------
   Auth pages (login / register / forgot / reset password) - simple centered
   card on a light background, in the style of feedback.rka.ug/login.php:
   logo badge, short tagline, clean bordered inputs, full-width brand button.
   --------------------------------------------------------------------------- */
.auth-page{min-height:100vh;display:flex;flex-direction:column;justify-content:center;align-items:center;padding:32px 16px;background:var(--bg);position:relative;}
.auth-page::before{content:"";position:absolute;inset:0;background:radial-gradient(circle at 50% 0%,rgba(0,114,188,.07),transparent 55%);pointer-events:none;}
.auth-card{position:relative;background:#fff;border-radius:16px;box-shadow:0 10px 40px rgba(6,40,69,.10);border:1px solid var(--border);padding:38px 34px;width:100%;max-width:420px;}
.auth-card .logo-badge{width:100px;height:100px;border-radius:16px;overflow:hidden;margin:0 auto 14px;display:flex;align-items:center;justify-content:center;}
.auth-card .logo-badge img{width:100%;height:100%;object-fit:contain;}
.auth-card .auth-badge{display:block;text-align:center;font-size:11px;font-weight:700;letter-spacing:.06em;text-transform:uppercase;color:var(--brand);margin-bottom:6px;}
.auth-card h2{font-size:1.2rem;font-weight:800;color:var(--navy);text-align:center;margin-bottom:4px;}
.auth-card .auth-sub{text-align:center;color:var(--text-soft);font-size:12.5px;margin-bottom:24px;}
.auth-card .form-label{font-size:12.5px;font-weight:600;color:var(--text-soft);}
.auth-card .form-control,.auth-card .form-select{border-radius:10px;padding:10px 14px;font-size:13.5px;border-color:var(--border);}
.auth-card .form-control:focus,.auth-card .form-select:focus{border-color:var(--brand);box-shadow:0 0 0 .2rem rgba(0,114,188,.15);}
.auth-card .btn-auth-submit{background:var(--brand);border:none;color:#fff;font-weight:700;padding:11px;border-radius:10px;width:100%;font-size:14px;letter-spacing:.01em;transition:background .15s;}
.auth-card .btn-auth-submit:hover{background:var(--brand-dark);color:#fff;}
.auth-links{text-align:center;margin-top:18px;font-size:13px;color:var(--text-soft);}
.auth-links a{color:var(--brand);font-weight:600;text-decoration:none;}
.auth-links a:hover{text-decoration:underline;}
.auth-page-footer{text-align:center;color:var(--text-soft);font-size:11.5px;padding:22px 0 6px;position:relative;}
.auth-page-footer a{color:var(--text-soft);text-decoration:underline;}
.auth-page-footer .dev-credit{margin-top:4px;font-size:11px;}

@media (max-width:420px){
  .auth-card{padding:28px 20px;border-radius:14px;}
}

/* ---- Leave tracker (modules/leave_tracker.php) ----
   A year is ~260 working squares per person, so the day cell has to be small enough that a row
   fits without horizontal scrolling on a laptop, and still big enough to click. 11px with a 1px
   gutter is the smallest that stays comfortably clickable. */
.lt-key{display:inline-block;width:18px;height:18px;line-height:18px;border-radius:4px;color:#fff;
  font-size:10px;font-weight:700;text-align:center;}
.lt-chart td,.lt-chart th{vertical-align:middle;padding:3px 4px;}
.lt-chart .lt-name{position:sticky;left:0;background:var(--card,#fff);z-index:2;white-space:nowrap;
  min-width:170px;box-shadow:1px 0 0 var(--border,#e5e7eb);}
.lt-month{white-space:nowrap;padding-right:10px!important;}
.lt-day{display:inline-block;width:11px;height:16px;margin-right:1px;border-radius:2px;cursor:pointer;
  vertical-align:middle;transition:transform .08s;}
.lt-day:hover{transform:scaleY(1.25);}
.lt-free{background:var(--border,#e5e7eb);}
.lt-off{background:transparent;border:1px dashed var(--border,#e5e7eb);cursor:not-allowed;}
.lt-on{box-shadow:inset 0 0 0 1px rgba(0,0,0,.15);}
:root[data-theme="dark"] .lt-chart .lt-name{background:#1b2431;}
:root[data-theme="dark"] .lt-free{background:#2b3648;}
@media print{
  .lt-day{width:9px;height:12px;}
  .lt-chart .lt-name{position:static;box-shadow:none;}
}
