/* ==========================================================================
   vault-glass.css — "Liquid Glass" skin for the Command Center dashboard
   Drop in /public_html/vault-glass.css

   Scoped entirely under body.v-glass so it never touches any other page.
   Reuses the color/font tokens from vault-ledger.css (loaded first) and
   layers frosted, translucent panels + a soft animated backdrop on top.
   Sidebar nav replaces the old top nav; a slim glass bar remains on top
   for the brand + quick actions on mobile.
   ========================================================================== */

body.v-glass{
  --g-blur: 16px;
  --g-radius: 20px;
  --g-radius-sm: 14px;
  --g-sidebar-w: 252px;
  --g-border: rgba(220,174,76,.22);
  --g-border-soft: rgba(255,255,255,.09);
  /* Dark "smoked glass" tint rather than a light one — a translucent WHITE
     panel over a bright backdrop shape washes out to near-white, which is
     why faint text was unreadable wherever a ribbon passed behind it. A
     dark tint stays legible no matter what's behind it, while the blur +
     border + highlight still read as glass. */
  --g-panel: rgba(10,8,5,.72);
  --g-panel-strong: rgba(20,16,9,.82);
  --g-shadow: 0 18px 50px rgba(0,0,0,.5), 0 2px 10px rgba(0,0,0,.3);
  --g-highlight: rgba(255,215,140,.4);
  /* Type pass v3 — a cursive script (Great Vibes) is used for the hero line
     and brand wordmark only (see the overrides further down); everything
     else — stat figures, tool names, body/UI text — uses this set instead,
     matching the site's original brand fonts (Cormorant Garamond serif,
     Rajdhani sans, JetBrains Mono). Scoped to the glass dashboard only,
     loaded alongside this stylesheet in dashboard_body.php. */
  --font-display: "Cormorant Garamond", "Instrument Serif", Georgia, serif;
  --font-ui: "Rajdhani", "Manrope", system-ui, -apple-system, sans-serif;
  --font-mono: "JetBrains Mono", "IBM Plex Mono", ui-monospace, Menlo, monospace;
  --font-cursive: "Great Vibes", "Cormorant Garamond", cursive;
  /* Fixed, theme-independent surface. Previously this used var(--ink) — the
     site's TEXT colour token, not a background token — which happens to be
     dark in the light theme (looked fine by accident) but flips to a near-
     white value in the dark theme, while the dashboard's text stays forced
     to a light colour: light-on-light, unreadable. The glass aesthetic only
     works with a dark backdrop, so it no longer follows the site's LIGHT/
     DARK toggle — that toggle still applies everywhere else on the site. */
  background:#0b0a07;
  overflow-x:hidden;
}
body.v-glass .g-hero-line{font-family:var(--font-cursive);font-weight:400;font-size:44px;letter-spacing:.01em}
body.v-glass .g-brand-text{font-family:var(--font-cursive);font-weight:400;font-size:26px}
body.v-glass .g-brand-text small{font-family:var(--font-ui)}
body.v-glass .g-tool-name{font-weight:600;letter-spacing:.01em}
body.v-glass .g-stat-figure{font-weight:600}
body.v-glass .g-nav-label,body.v-glass .g-side-title{font-family:var(--font-ui)}

/* ── Abstract backdrop ──────────────────────────────────────────────────
   Large, crisp, monochrome diagonal ribbons on black — not blurred at the
   source (see .g-bg-art below); it's what gets glass-blurred BY the panels
   sitting on top of it, which is what actually sells the frosted-glass
   effect. Real elements rather than a CSS gradient painted on ::before,
   because clip-path needs geometry a single background-image can't give
   crisply. Fixed regardless of the LIGHT/DARK toggle, for the same reason
   the surface colour above is fixed.

   PERFORMANCE: this used to animate continuously (drifting shapes + a
   sweeping sheen) while also being the size of several viewports and
   carrying its own per-shape `filter: blur()` and `mix-blend-mode: screen`.
   Animating a blurred, blended layer that large forces the browser to
   recomposite it every frame — that was the main source of the lag, well
   before backdrop-filter came into it. It's now a static painted scene:
   all the visual cost is paid once, not every frame. ── */
body.v-glass::after{
  content:"";position:fixed;inset:0;z-index:0;pointer-events:none;opacity:.35;
  background-image:radial-gradient(rgba(255,255,255,.06) 1px, transparent 1px);
  background-size:3px 3px;
}
body.v-glass, body.v-glass a{ color:#f4f1e8; text-shadow:0 1px 3px rgba(0,0,0,.45); }
body.v-glass .v-ink-fix{ color:#f4f1e8; }

.g-bg-art{position:fixed;inset:0;z-index:0;overflow:hidden;pointer-events:none;background:#08070a}
.g-shape{
  position:absolute;display:block;height:22vw;width:130vw;
  border-radius:999px;
}
/* Gold/black duotone — three warm gold tones at different intensities so
   the ribbons layer with some colour variety instead of one flat hue. */
.g-shape-1,.g-shape-3{
  background:linear-gradient(100deg,
    rgba(220,174,76,0) 0%, rgba(230,186,96,.5) 38%,
    rgba(230,186,96,.5) 58%, rgba(220,174,76,0) 100%);
}
.g-shape-2,.g-shape-5{
  background:linear-gradient(100deg,
    rgba(198,137,39,0) 0%, rgba(198,137,39,.45) 38%,
    rgba(198,137,39,.45) 58%, rgba(198,137,39,0) 100%);
}
.g-shape-4{
  background:linear-gradient(100deg,
    rgba(255,222,158,0) 0%, rgba(255,222,158,.4) 38%,
    rgba(255,222,158,.4) 58%, rgba(255,222,158,0) 100%);
}
.g-shape-1{ top:-6vw;  left:-30vw; height:28vw; opacity:.8; transform:rotate(-30deg); }
.g-shape-2{ top:20vw;  left:-40vw; height:15vw; opacity:.4; transform:rotate(-30deg); }
.g-shape-3{ top:48vw;  left:-35vw; height:32vw; opacity:.55; transform:rotate(24deg); }
.g-shape-4{ top:-28vw; left:-15vw; height:17vw; opacity:.25; transform:rotate(52deg); }
.g-shape-5{ top:62vw;  left:-25vw; height:13vw; opacity:.3; transform:rotate(-12deg); }
@media(max-width:900px){ .g-bg-art{opacity:.7} }

/* Safety net: vault_avatar.php's avatar_html() builds a v-avatar-{size} class
   on the fly, but vault-ledger.css only defines fixed dimensions for the 30 /
   34 / 64 variants. Any other size renders unconstrained (natural image
   size), which blows out the sidebar's width/height. This caps every avatar
   inside the glass dashboard as a fallback so a mismatched size degrades
   gracefully instead of wrecking the layout. */
body.v-glass .v-avatar{max-width:64px;max-height:64px;width:34px;height:34px}
body.v-glass .v-avatar-30{width:30px;height:30px;max-width:30px;max-height:30px}
body.v-glass .v-avatar-64{width:64px;height:64px;max-width:64px;max-height:64px}

/* Base glass panel — reused by sidebar, hero, tiles, cards */
.g-panel{
  position:relative;
  background:var(--g-panel);
  border:1px solid var(--g-border);
  border-radius:var(--g-radius);
  -webkit-backdrop-filter:blur(var(--g-blur)) saturate(140%);
  backdrop-filter:blur(var(--g-blur)) saturate(140%);
  box-shadow:var(--g-shadow), inset 0 1px 0 rgba(255,255,255,.1), inset 0 -1px 0 rgba(0,0,0,.25);
}
.g-panel::before{
  /* specular top highlight, the classic "liquid glass" edge-light */
  content:"";position:absolute;top:0;left:14px;right:14px;height:1px;
  background:linear-gradient(90deg, transparent, var(--g-highlight), transparent);
  border-radius:1px;
}

/* ── Shell layout: fixed sidebar + main column ─────────────────────────── */
.g-shell{
  position:relative;z-index:1;display:flex;align-items:flex-start;justify-content:center;gap:28px;
  min-height:100vh;max-width:1440px;margin:0 auto;padding:16px 16px 0;
}

/* ── Sidebar (this is the relocated menu) ──────────────────────────────── */
.g-sidebar{
  position:sticky;top:16px;width:var(--g-sidebar-w);height:min(calc(100vh - 32px), 800px);flex:none;
  display:flex;flex-direction:column;gap:18px;padding:20px 16px;z-index:600;
  overflow-y:auto;overflow-x:hidden;
  transition:width .22s ease,padding .22s ease;
  /* Height is capped at 800px rather than pinned to calc(100vh - 32px) on
     its own — on a tall/large monitor that calc alone kept growing with the
     viewport, which stretched the flex spacer between the nav and the
     bottom controls (theme toggle, Potato Mode, sign out) into a huge,
     empty-looking gap. Capping it keeps the sidebar the same comfortable
     size regardless of screen size; the min() still shrinks it on short
     screens same as before.

     Scroll still works as a fallback on very short screens, but the native
     scrollbar track looked out of place against the glass panel — hidden
     here; the height-based media queries below shrink the internal spacing
     on shorter viewports so scrolling is rarely actually needed. */
  scrollbar-width:none;
  -ms-overflow-style:none;
}
.g-sidebar::-webkit-scrollbar{display:none}

/* Compact the sidebar's internal rhythm on shorter screens so everything
   fits without needing to scroll at all, rather than just hiding the bar. */
@media(max-height:820px){
  .g-sidebar{gap:12px;padding:16px 16px}
  .g-nav{gap:1px}
  .g-nav a{padding:7px 10px}
  .g-nav-label{margin:9px 10px 3px}
  .g-brand{padding-bottom:10px}
}
@media(max-height:680px){
  .g-sidebar{gap:8px;padding:12px 14px}
  .g-nav a{padding:6px 10px;font-size:12px}
  .g-nav-label{margin:6px 10px 2px}
  .g-side-user{padding:7px}
  .g-signout{padding:8px 10px}
}
.g-brand{
  display:flex;align-items:center;gap:10px;padding:2px 6px 14px;
  border-bottom:1px solid var(--g-border-soft);margin-bottom:4px;
}
.g-brand-mark{
  width:34px;height:34px;border-radius:10px;flex:none;overflow:hidden;
  display:flex;align-items:center;justify-content:center;
  box-shadow:0 4px 14px rgba(198,137,39,.4);
}
.g-brand-mark img{width:100%;height:100%;object-fit:cover;display:block}
.g-brand-text{font:400 19px/1.1 var(--font-display);letter-spacing:.01em;color:#f4f1e8;flex:1;min-width:0}
.g-brand-text small{display:block;margin-top:2px;font:500 9.5px/1 var(--font-ui);letter-spacing:.16em;text-transform:uppercase;color:rgba(244,241,232,.65)}
.g-collapse-btn{
  flex:none;width:26px;height:26px;border-radius:8px;border:1px solid var(--g-border-soft);
  background:var(--g-panel);color:rgba(244,241,232,.6);cursor:pointer;font-size:11px;
  display:flex;align-items:center;justify-content:center;transition:background .18s,color .18s;
}
.g-collapse-btn:hover{background:var(--g-panel-strong);color:#f4f1e8}

.g-nav{display:flex;flex-direction:column;gap:2px}
.g-nav-label{margin:14px 10px 4px;font:600 9.5px/1 var(--font-ui);letter-spacing:.16em;text-transform:uppercase;color:rgba(244,241,232,.58)}
.g-nav-label:first-child{margin-top:2px}
.g-nav a{
  position:relative;display:flex;align-items:center;gap:12px;padding:9px 10px;border-radius:12px;
  font:600 12.5px/1 var(--font-ui);letter-spacing:.02em;color:rgba(244,241,232,.68);
  border:1px solid transparent;transition:background .18s,border-color .18s,color .18s;
}
.g-nav a .g-ico{
  width:20px;height:20px;flex:none;display:flex;align-items:center;justify-content:center;
  font-size:13px;opacity:.8;
}
.g-nav a .g-label{flex:1;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.g-nav-badge{font:600 9.5px/1 var(--font-ui);color:rgba(244,241,232,.6);white-space:nowrap;flex:none}
.g-nav-badge.v-warn{color:#ffb02e}
.g-nav a:hover{background:var(--g-panel-strong);color:#f4f1e8;border-color:var(--g-border-soft)}
.g-nav a.active{
  background:linear-gradient(135deg, rgba(220,174,76,.22), rgba(220,174,76,.06));
  border-color:rgba(220,174,76,.4);color:#f4f1e8;
  box-shadow:inset 0 1px 0 rgba(255,255,255,.15);
}
.g-nav a.locked{opacity:.4;pointer-events:none}

.g-sidebar-spacer{flex:1}

.g-theme-toggle{display:flex;align-items:center;gap:4px;border:1px solid var(--g-border);border-radius:999px;padding:3px;background:var(--g-panel)}
.g-theme-toggle button{flex:1;display:flex;align-items:center;justify-content:center;border:0;background:transparent;cursor:pointer;padding:7px 0;border-radius:999px;font:600 10px/1 var(--font-ui);letter-spacing:.1em;color:rgba(244,241,232,.55)}
.g-theme-toggle button.on{background:rgba(220,174,76,.85);color:#0e0d09}
.g-collapsed-ico{display:none;font-size:13px}

/* Potato Mode toggle — relocated here from the old standalone footer.
   The site-wide .potato-toggle-btn styling pulls theme tokens (var(--ink),
   var(--rule-strong)...) that shift with the LIGHT/DARK toggle; this page
   deliberately ignores that toggle (see the surface-colour note above), so
   it's overridden here the same way everything else in the sidebar is. */
.g-side-potato .potato-toggle-btn{
  width:100%;display:flex;align-items:center;gap:9px;
  background:var(--g-panel);border:1px solid var(--g-border-soft);border-radius:12px;
  padding:9px 12px;color:rgba(244,241,232,.75);cursor:pointer;
  font:600 11px/1 var(--font-ui);letter-spacing:.02em;text-transform:none;
  transition:background .18s,border-color .18s,color .18s;
}
.g-side-potato .potato-toggle-btn:hover{border-color:var(--g-border);color:#f4f1e8}
.g-side-potato .potato-toggle-btn.active{
  border-color:rgba(220,174,76,.45);color:#f4f1e8;
  background:linear-gradient(135deg, rgba(220,174,76,.16), var(--g-panel));
}
.g-side-potato .potato-icon{font-size:14px;flex:none}
.g-side-potato .potato-label{flex:1;text-align:left;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.g-side-potato .potato-switch{width:28px;height:15px;border-radius:9px;background:rgba(255,255,255,.12);border:1px solid var(--g-border-soft);position:relative;flex:none}
.g-side-potato .potato-toggle-btn.active .potato-switch{background:rgba(220,174,76,.25);border-color:rgba(220,174,76,.5)}
.g-side-potato .potato-knob{position:absolute;top:1px;left:1px;width:9px;height:9px;border-radius:50%;background:rgba(244,241,232,.55);transition:transform .22s,background .22s}
.g-side-potato .potato-toggle-btn.active .potato-knob{transform:translateX(13px);background:#dcae4c}
.g-side-potato .potato-hint{margin-top:6px;font:400 9.5px/1.3 var(--font-ui);color:rgba(244,241,232,.4)}
body.g-collapsed .g-side-potato .potato-toggle-btn{justify-content:center;padding:10px 0}
body.g-collapsed .g-side-potato .potato-hint{display:none}

.g-side-user{
  display:flex;align-items:center;gap:10px;padding:10px;border-radius:14px;
  background:var(--g-panel);border:1px solid var(--g-border-soft);
}
.g-side-user .v-avatar{border-color:var(--g-border)}
.g-side-user-name{font:600 12.5px/1.2 var(--font-ui);color:#f4f1e8}
.g-side-user-role{margin-top:2px;font:400 10.5px/1.2 var(--font-ui);color:rgba(244,241,232,.65)}

.g-signout{
  display:flex;align-items:center;justify-content:center;gap:7px;
  padding:10px 12px;border-radius:12px;border:1px solid var(--g-border);
  background:var(--g-panel);color:rgba(244,241,232,.75);
  font:600 11px/1 var(--font-ui);letter-spacing:.08em;text-transform:uppercase;cursor:pointer;
  transition:background .18s,color .18s;
}
.g-signout:hover{background:rgba(200,60,50,.18);border-color:rgba(200,60,50,.4);color:#ffb4ab}

/* ── Collapsed rail state (desktop only — toggled via .g-collapse-btn) ── */
body.g-collapsed{ --g-sidebar-w: 76px; }
body.g-collapsed .g-label{display:none}
body.g-collapsed .g-collapsed-ico{display:block}
body.g-collapsed .g-brand{justify-content:center;padding-bottom:14px}
body.g-collapsed .g-collapse-btn{position:absolute;top:8px;right:8px;width:20px;height:20px;font-size:9px}
body.g-collapsed .g-nav-label{display:none}
body.g-collapsed .g-nav a{justify-content:center;padding:11px 0}
body.g-collapsed .g-nav a .g-ico{width:auto}
body.g-collapsed .g-side-user{justify-content:center;padding:8px}
body.g-collapsed .g-signout{padding:10px}

/* Floating tooltip label for collapsed rail items — mirrors the reference's
   "New project" hover chip */
body.g-collapsed [data-tip]{position:relative}
body.g-collapsed [data-tip]::after{
  content:attr(data-tip);position:absolute;left:calc(100% + 14px);top:50%;transform:translateY(-50%) translateX(-4px);
  background:#1a1712;color:#f4f1e8;padding:7px 12px;border-radius:9px;font:600 11.5px/1 var(--font-ui);
  letter-spacing:.02em;white-space:nowrap;box-shadow:0 10px 26px rgba(0,0,0,.4);border:1px solid var(--g-border-soft);
  opacity:0;pointer-events:none;transition:opacity .15s ease,transform .15s ease;z-index:650;
}
body.g-collapsed [data-tip]:hover::after{opacity:1;transform:translateY(-50%) translateX(0)}

/* ── Mobile top glass bar (shown < 900px, sidebar becomes a drawer) ────── */
.g-topbar{display:none}
.g-burger{
  width:38px;height:38px;border-radius:11px;border:1px solid var(--g-border);
  background:var(--g-panel);color:#f4f1e8;font-size:16px;cursor:pointer;
  display:flex;align-items:center;justify-content:center;
}
.g-scrim{display:none;position:fixed;inset:0;background:rgba(0,0,0,.55);z-index:590}
.g-scrim.open{display:block}

/* ── Main column ────────────────────────────────────────────────────────── */
.g-main{position:relative;z-index:1;flex:1;min-width:0;padding:4px 0 40px;max-width:1100px}

/* ── Hero card ──────────────────────────────────────────────────────────── */
.g-hero{padding:32px 30px;display:grid;grid-template-columns:minmax(0,1fr) 300px;gap:30px;margin-bottom:20px}
.g-hero-line{font:400 34px/1.15 var(--font-display);letter-spacing:-.005em;text-wrap:pretty;color:#fff}
.g-hero-sub{margin-top:10px;font:400 13.5px/1.55 var(--font-ui);color:rgba(244,241,232,.62);max-width:46ch}

.g-stats{margin-top:18px;display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:12px}
.g-stat{
  --stat-accent:var(--gold, #dcae4c);
  padding:14px 16px;border-radius:var(--g-radius-sm);position:relative;overflow:hidden;
  background:var(--g-panel);border:1px solid var(--g-border-soft);
  box-shadow:inset 0 1px 0 rgba(255,255,255,.08);
  transition:transform .18s ease,border-color .18s ease,background .18s ease;
}
.g-stat::after{
  content:"";position:absolute;left:0;top:10px;bottom:10px;width:2px;border-radius:2px;
  background:var(--stat-accent);opacity:.8;
}
.g-stat:hover{
  transform:translateY(-1px);
  border-color:color-mix(in srgb, var(--stat-accent) 40%, transparent);
  background:linear-gradient(160deg, color-mix(in srgb, var(--stat-accent) 10%, transparent), var(--g-panel) 65%);
}
.g-stat-head{display:flex;align-items:center;gap:6px}
.g-stat-icon{
  display:flex;align-items:center;justify-content:center;width:20px;height:20px;flex:none;
  border-radius:6px;font-size:9.5px;line-height:1;
  background:color-mix(in srgb, var(--stat-accent) 18%, transparent);
  border:1px solid color-mix(in srgb, var(--stat-accent) 35%, transparent);
  color:var(--stat-accent);
}
.g-stat-label{font:600 9.5px/1 var(--font-ui);letter-spacing:.1em;text-transform:uppercase;color:rgba(244,241,232,.62);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.g-stat-figure{margin-top:8px;font:600 21px/1 var(--font-mono);letter-spacing:-.01em;color:#fff}
.g-stat-figure.v-warn{color:#ffb02e}
html.potato-mode .g-stat{transition:none}
html.potato-mode .g-stat:hover{transform:none}

/* Employee of the Month — spans the two columns Stock Ready/Emails left
   behind; same tile chrome as .g-stat but laid out as avatar + name +
   two figures instead of a single label/value pair. */
.g-eom{grid-column:span 2;display:flex;align-items:center;gap:14px;padding:12px 18px}
.g-eom .v-avatar{box-shadow:0 0 0 2px rgba(220,174,76,.3),0 4px 12px rgba(0,0,0,.35)}
.g-eom-body{flex:1;min-width:0}
.g-eom-label{font:600 9.5px/1 var(--font-ui);letter-spacing:.1em;text-transform:uppercase;color:var(--gold,#dcae4c)}
.g-eom-name{margin-top:5px;font:400 17px/1.15 var(--font-display);color:#fff;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.g-eom-figures{flex:none;display:flex;gap:20px}
.g-eom-figure{display:flex;flex-direction:column;align-items:flex-end;text-align:right}
.g-eom-num{font:600 20px/1 var(--font-mono);letter-spacing:-.01em;color:#fff}
.g-eom-sub{margin-top:4px;font:400 9px/1 var(--font-ui);letter-spacing:.06em;text-transform:uppercase;color:rgba(244,241,232,.5)}
@media(max-width:640px){
  .g-eom{grid-column:span 2;flex-wrap:wrap}
  .g-eom-figures{gap:14px}
}

.g-hero-panel{
  padding:22px;border-radius:18px;position:relative;overflow:hidden;
  display:flex;flex-direction:column;
  background:
    radial-gradient(120% 90% at 100% 0%, rgba(220,174,76,.22) 0%, transparent 55%),
    rgba(10,8,5,.58);
  border:1px solid rgba(220,174,76,.28);
  -webkit-backdrop-filter:blur(var(--g-blur)) saturate(130%);
  backdrop-filter:blur(var(--g-blur)) saturate(130%);
  box-shadow:0 16px 40px rgba(0,0,0,.45), inset 0 1px 0 rgba(255,255,255,.12);
}
.g-hero-panel::before{
  content:"";position:absolute;top:0;left:16px;right:16px;height:1px;
  background:linear-gradient(90deg, transparent, rgba(220,174,76,.65), transparent);
}
.g-profile{margin-top:14px;display:flex;align-items:center;gap:14px}
.g-profile .v-avatar-wrap .v-avatar{box-shadow:0 0 0 3px rgba(220,174,76,.22),0 6px 18px rgba(0,0,0,.35)}
.g-hero-panel .v-avatar-upload{background:linear-gradient(135deg,#dcae4c,#a8893c);color:#1a1509;box-shadow:0 2px 8px rgba(0,0,0,.4)}
.g-profile-name-row{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.g-profile-name{font:600 15px/1.2 var(--font-ui);color:#fff}
.g-profile-role{
  font:600 9px/1 var(--font-ui);letter-spacing:.1em;color:var(--gold,#dcae4c);
  background:rgba(220,174,76,.14);border:1px solid rgba(220,174,76,.32);
  border-radius:999px;padding:3px 8px;
  box-shadow:0 0 0 1px rgba(220,174,76,.08);
}
.g-profile-meta{margin-top:4px;display:flex;align-items:center;gap:6px;font:400 11.5px/1.4 var(--font-ui);color:rgba(244,241,232,.65)}
.g-profile-since{margin-top:5px;font:400 10.5px/1.3 var(--font-ui);color:rgba(244,241,232,.4);letter-spacing:.02em}
.g-hero-panel .v-hint-tip{margin-top:0}
.g-hero-panel .v-hint-tip-icon{
  width:15px;height:15px;border-radius:50%;border:1px solid rgba(244,241,232,.35);
  background:transparent;opacity:1;color:rgba(244,241,232,.5);font-size:9px;
}
.g-hero-divider{margin:18px 0 2px;height:1px;background:linear-gradient(90deg, rgba(255,255,255,.14), transparent)}
.g-shift-row{margin-top:10px;display:flex;gap:8px;flex-wrap:wrap}
.g-shift-row .v-avatar{transition:transform .15s ease;cursor:default}
.g-shift-row .v-avatar:hover{transform:translateY(-2px)}
.g-side-title{font:600 10px/1 var(--font-ui);letter-spacing:.14em;text-transform:uppercase;color:rgba(220,174,76,.75);margin-bottom:2px}

/* ── Tool tiles ─────────────────────────────────────────────────────────── */
.g-tools{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:14px;margin-bottom:20px}
.g-tool{
  --tool-accent:var(--gold, #dcae4c);
  padding:18px 20px;border-radius:var(--g-radius-sm);position:relative;overflow:hidden;
  background:var(--g-panel);border:1px solid var(--g-border-soft);color:#fff;
  display:flex;align-items:center;gap:14px;
  -webkit-backdrop-filter:blur(10px);
  backdrop-filter:blur(10px);
  box-shadow:0 10px 26px rgba(0,0,0,.28), inset 0 1px 0 rgba(255,255,255,.1);
  transition:transform .2s ease,border-color .2s ease,background .2s ease,box-shadow .2s ease;
}
.g-tool::before{
  content:"";position:absolute;top:0;left:14px;right:14px;height:1px;
  background:linear-gradient(90deg, transparent, var(--g-highlight), transparent);
}
.g-tool::after{
  content:"";position:absolute;left:0;top:14px;bottom:14px;width:2.5px;border-radius:2px;
  background:var(--tool-accent);opacity:.85;
}
.g-tool:hover{
  transform:translateY(-2px);
  border-color:color-mix(in srgb, var(--tool-accent) 45%, transparent);
  background:linear-gradient(160deg, color-mix(in srgb, var(--tool-accent) 14%, transparent), var(--g-panel) 60%);
  box-shadow:0 14px 30px rgba(0,0,0,.34), inset 0 1px 0 rgba(255,255,255,.1);
}
.g-tool-icon{
  flex:none;width:40px;height:40px;border-radius:11px;display:flex;align-items:center;justify-content:center;
  font-size:16px;line-height:1;
  background:color-mix(in srgb, var(--tool-accent) 16%, transparent);
  border:1px solid color-mix(in srgb, var(--tool-accent) 35%, transparent);
  color:var(--tool-accent);
}
.g-tool-body{flex:1;min-width:0}
.g-tool-name{display:block;font:400 18px/1.2 var(--font-display)}
.g-tool-desc{display:block;margin-top:4px;font:400 12.5px/1.4 var(--font-ui);color:rgba(244,241,232,.55)}
.g-tool-metric{flex:none;font:600 11.5px/1 var(--font-ui);color:rgba(244,241,232,.55);white-space:nowrap;padding-top:2px}
.g-tool-metric.v-warn{color:#ffb02e}
.g-tool.locked{opacity:.42;pointer-events:none}
.g-tool-lock{flex:none;font:500 10px/1 var(--font-mono);letter-spacing:.06em;color:rgba(244,241,232,.65);padding-top:2px}
html.potato-mode .g-tool{transition:none}
html.potato-mode .g-tool:hover{transform:none}

/* ── Responsive ─────────────────────────────────────────────────────────── */
@media(max-width:1080px){
  .g-hero{grid-template-columns:minmax(0,1fr)}
  .g-tools{grid-template-columns:minmax(0,1fr)}
}
@media(max-width:900px){
  .g-shell{display:block;max-width:none;padding:0}
  .g-sidebar{
    position:fixed;left:-100%;transition:left .25s ease;top:0;bottom:0;height:100vh;border-radius:0;
  }
  .g-sidebar.open{left:0;width:82%;max-width:300px}
  body.g-collapsed .g-sidebar{width:82%;max-width:300px}
  body.g-collapsed .g-label{display:inline}
  body.g-collapsed .g-collapsed-ico{display:none}
  body.g-collapsed .g-nav a{justify-content:flex-start;padding:9px 10px}
  body.g-collapsed .g-brand{justify-content:flex-start}
  body.g-collapsed .g-side-user,body.g-collapsed .g-signout{justify-content:flex-start}
  body.g-collapsed [data-tip]::after{display:none}
  .g-main{margin-left:0;max-width:none;padding:88px 16px 34px}
  .g-topbar{
    display:flex;align-items:center;justify-content:space-between;gap:12px;
    position:fixed;top:12px;left:12px;right:12px;z-index:580;padding:10px 14px;
  }
  .g-stats{grid-template-columns:repeat(2,minmax(0,1fr))}
}

/* ── Page scrollbar ─────────────────────────────────────────────────────
   The page genuinely is taller than the viewport (that's expected — the
   dashboard has more content than fits on one screen), so the scrollbar
   itself shouldn't be hidden, just restyled: the browser's default chunky
   white bar clashes hard with the dark glass look. This file only loads on
   this page, so styling html/body directly here is safe — it can't leak
   into any other page on the site. */
html{
  scrollbar-width:thin;
  scrollbar-color:rgba(220,174,76,.5) rgba(10,8,5,.4);
}
html::-webkit-scrollbar{width:10px;height:10px}
html::-webkit-scrollbar-track{background:rgba(10,8,5,.35)}
html::-webkit-scrollbar-thumb{
  background-color:rgba(220,174,76,.5);
  border-radius:8px;
  border:2px solid rgba(10,8,5,.35);
  background-clip:padding-box;
}
html::-webkit-scrollbar-thumb:hover{background-color:rgba(220,174,76,.75)}

/* ── Entrance animation ─────────────────────────────────────────────────
   Plays once per tab right as the dashboard first loads (typically right
   after logging in) — see the sessionStorage check in dashboard_body.php.
   Hidden by default via display:none so a repeat visit (class absent)
   never flashes it, even briefly. */
.v-entrance{
  display:none;position:fixed;inset:0;z-index:900;
  flex-direction:column;align-items:center;justify-content:center;gap:16px;
  background:#08070a;
  opacity:1;transition:opacity .55s ease;
}
body.v-entrance-show .v-entrance{display:flex}
.v-entrance.fade-out{opacity:0;pointer-events:none}
.v-entrance-mark{
  width:64px;height:64px;border-radius:16px;object-fit:cover;
  box-shadow:0 8px 26px rgba(198,137,39,.45);
  animation:vEntrancePulse 1.6s ease-in-out infinite;
}
.v-entrance-ring{
  width:30px;height:30px;border-radius:50%;
  border:2.5px solid rgba(220,174,76,.2);border-top-color:#dcae4c;
  animation:vEntranceSpin .8s linear infinite;
}
.v-entrance-txt{font:600 11px/1 var(--font-ui,inherit);letter-spacing:.14em;text-transform:uppercase;color:rgba(244,241,232,.55)}
@keyframes vEntrancePulse{0%,100%{transform:scale(1);opacity:1}50%{transform:scale(1.06);opacity:.85}}
@keyframes vEntranceSpin{to{transform:rotate(360deg)}}
html.potato-mode .v-entrance-mark,html.potato-mode .v-entrance-ring{animation:none}
html.potato-mode .v-entrance{transition:none}

/* ── Time-clock widget (employees only) ──────────────────────────────────
   Moved out of a fixed bottom-left floating position (where it overlapped
   the sidebar) into the sidebar's own flow. The markup/ids/onclick handlers
   are unchanged from the original (defined in index.php's <script>), so
   only positioning + look are touched here — the original .clock-fab /
   .clock-panel / .cp-* rules in vault-ledger.css still apply site-wide to
   anything that isn't inside body.v-glass, but this widget only ever
   renders on this page. */
body.v-glass .clock-fab{
  position:relative;bottom:auto;left:auto;z-index:auto;
  display:flex;flex-direction:column;align-items:stretch;gap:0;
  pointer-events:auto;width:100%;
}
body.v-glass .clock-fab-btn{
  background:var(--g-panel);border:1px solid var(--g-border-soft);border-radius:12px;
  padding:9px 12px;display:flex;align-items:center;gap:9px;cursor:pointer;
  transition:background .18s,border-color .18s;
}
body.v-glass .clock-fab-btn:hover{background:var(--g-panel-strong);border-color:var(--g-border)}
body.v-glass .clock-fab-dot{width:8px;height:8px;border-radius:50%;background:#dcae4c;flex:none}
body.v-glass .clock-fab-dot.off{background:rgba(244,241,232,.3)}
body.v-glass .clock-fab-dot.break{background:#e0a23c}
body.v-glass .clock-fab-label{font:600 11px/1.2 var(--font-ui);letter-spacing:.02em;color:#f4f1e8;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
body.v-glass .clock-fab-time{font:400 10.5px/1.3 var(--font-mono);color:rgba(244,241,232,.5);margin-top:2px}
body.g-collapsed .clock-fab-btn{justify-content:center;padding:10px 0}

body.v-glass .clock-panel{
  position:fixed;top:50%;left:50%;transform:translate(-50%,-50%) scale(.96);
  width:340px;max-width:calc(100vw - 32px);max-height:80vh;overflow-y:auto;overflow-x:hidden;
  margin-top:0;z-index:1000;
  background:var(--g-panel-strong);border:1px solid var(--g-border);border-radius:16px;
  box-shadow:0 30px 70px rgba(0,0,0,.6);
  -webkit-backdrop-filter:blur(20px) saturate(150%);backdrop-filter:blur(20px) saturate(150%);
  display:none;opacity:0;transition:opacity .18s ease,transform .18s ease;
}
body.v-glass .clock-panel.open{display:block;opacity:1;transform:translate(-50%,-50%) scale(1)}
/* Dimmed backdrop behind the centered panel — pure CSS via :has(), no
   markup or JS change needed. Targets <body> rather than .clock-fab since
   the panel is reparented to <body> by a small script (see
   dashboard_body.php) so its position:fixed escapes the sidebar's
   backdrop-filter containing block. Click-to-close and Escape-to-close are
   handled by that same script. */
body.v-glass:has(.clock-panel.open)::before{
  content:"";position:fixed;inset:0;background:rgba(4,3,2,.65);z-index:999;
  -webkit-backdrop-filter:blur(3px);backdrop-filter:blur(3px);
}
body.v-glass .cp-head{padding:14px 16px 10px;border-bottom:1px solid rgba(255,255,255,.08)}
body.v-glass .cp-title{font:600 9.5px/1 var(--font-ui);letter-spacing:.12em;text-transform:uppercase;color:rgba(244,241,232,.45);margin-bottom:6px}
body.v-glass .cp-mdt{font:400 17px/1 var(--font-mono);color:#f4f1e8}
body.v-glass .cp-date{font:400 10px/1 var(--font-ui);color:rgba(244,241,232,.4);margin-top:4px}
body.v-glass .cp-status{padding:11px 16px;border-bottom:1px solid rgba(255,255,255,.08)}
body.v-glass .cp-sessions{padding:9px 16px;max-height:130px;overflow-y:auto;border-bottom:1px solid rgba(255,255,255,.08)}
body.v-glass .cp-session{display:flex;justify-content:space-between;align-items:center;padding:6px 0;border-bottom:1px solid rgba(255,255,255,.06);font-size:11px}
body.v-glass .cp-session:last-child{border-bottom:0}
body.v-glass .cp-session-times{color:rgba(244,241,232,.55);font-family:var(--font-mono)}
body.v-glass .cp-session-dur{color:#dcae4c;font-family:var(--font-mono)}
body.v-glass .cp-actions{padding:11px 16px;display:flex;flex-direction:column;gap:7px}
body.v-glass .cp-btn{
  width:100%;min-height:36px;padding:0 12px;border-radius:9px;cursor:pointer;
  border:1px solid rgba(220,174,76,.4);background:rgba(220,174,76,.08);color:#dcae4c;
  font:600 10.5px/1 var(--font-ui);letter-spacing:.06em;text-transform:uppercase;transition:background .15s;
}
body.v-glass .cp-btn:hover{background:rgba(220,174,76,.18)}
body.v-glass .cp-btn-out,body.v-glass .cp-btn-brk{border-color:rgba(224,120,95,.45);background:rgba(224,120,95,.08);color:#e0785f}
body.v-glass .cp-btn-out:hover,body.v-glass .cp-btn-brk:hover{background:rgba(224,120,95,.16)}
body.v-glass .cp-alert{font:400 10.5px/1.4 var(--font-ui);padding:8px 12px;margin:0 16px 10px;border-radius:8px;display:none}
body.v-glass .cp-alert.ok{display:block;border-left:2px solid #dcae4c;background:rgba(220,174,76,.08)}
body.v-glass .cp-alert.err{display:block;border-left:2px solid #e0785f;background:rgba(224,120,95,.08)}
body.v-glass .cp-total{padding:10px 16px 12px;font:400 10.5px/1 var(--font-ui);color:rgba(244,241,232,.4);display:flex;justify-content:space-between}
body.v-glass .cp-total span{color:rgba(244,241,232,.6)}
body.v-glass .cp-extra-row{padding:10px 16px}
body.v-glass .cp-link-btn{
  width:100%;background:transparent;border:1px solid rgba(255,255,255,.1);color:rgba(244,241,232,.6);
  padding:7px;border-radius:8px;font-family:var(--font-ui);font-size:10px;letter-spacing:.1em;
  text-transform:uppercase;cursor:pointer;transition:border-color .15s,color .15s;
}
body.v-glass .cp-link-btn:hover{border-color:rgba(220,174,76,.4);color:#dcae4c}
body.v-glass .cp-link-warn{border-color:rgba(224,120,95,.4);color:#e0785f}
body.v-glass .cp-link-warn:hover{border-color:rgba(224,120,95,.7);background:rgba(224,120,95,.1)}
body.v-glass .cp-link-gold{color:#dcae4c}

/* Sign-out reminder modal — still a full-screen overlay (correct, that
   part of the UX doesn't change), just recoloured to match. */
body.v-glass .clock-overlay{background:rgba(4,3,2,.7)}
body.v-glass .clock-overlay.active{
  -webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px);
}
body.v-glass .clock-modal{
  background:#0e0c08;border:1px solid rgba(220,174,76,.3);border-radius:18px;color:#f4f1e8;
  box-shadow:0 24px 60px rgba(0,0,0,.55);
}
body.v-glass .clock-modal h2{color:#fff}
body.v-glass .clock-modal textarea{
  background:rgba(255,255,255,.05);border:1px solid rgba(255,255,255,.12);border-radius:10px;color:#f4f1e8;
}
body.v-glass .clock-modal textarea:focus{border-color:rgba(220,174,76,.5)}
body.v-glass .clock-modal .btn-clock{
  border-radius:10px;border:1px solid rgba(255,255,255,.12);color:#f4f1e8;background:transparent;
}
body.v-glass .clock-modal .btn-clock.btn-out{
  background:linear-gradient(135deg,#dcae4c,#a8893c);color:#1a1509;border-color:transparent;
}
body.v-glass .clock-modal .btn-clock.btn-skip{color:rgba(244,241,232,.4);border-color:transparent}
body.v-glass .clock-modal .alert-msg{border-radius:8px}
body.v-glass .clock-modal .alert-msg.ok{border-left:2px solid #dcae4c;background:rgba(220,174,76,.08)}
body.v-glass .clock-modal .alert-msg.err{border-left:2px solid #e0785f;background:rgba(224,120,95,.08)}

/* ── Employee clock-system modals (Time History / File Complaint /
   My Cases / Case Detail) — reached from the sidebar's time-clock widget.
   These are built almost entirely from inline styles referencing CSS
   custom properties (var(--bg), var(--rule), var(--ink-faint)...), which
   are still tied to the site's LIGHT/DARK toggle. Redefining those
   properties at each modal's root cascades through every inline style
   that reads them automatically — no !important war needed for colour.
   Only the handful of genuinely hardcoded (non-var) properties — backdrop
   tint, sharp 2px corners, a couple of literal hex colours on form
   elements — need direct overrides below. */
body.v-glass #historyModal,
body.v-glass #complaintModal,
body.v-glass #myCasesModal,
body.v-glass #caseDetailModal{
  --bg:#100d09;--rule:rgba(255,255,255,.08);--rule-strong:rgba(220,174,76,.3);
  --ink:#f4f1e8;--ink-muted:rgba(244,241,232,.65);--ink-faint:rgba(244,241,232,.4);
  --accent:#dcae4c;--accent-soft:rgba(220,174,76,.12);--warn:#e0785f;
  background:rgba(4,3,2,.7) !important;
  -webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px);
}
body.v-glass #historyModal > div,
body.v-glass #complaintModal > div,
body.v-glass #myCasesModal > div,
body.v-glass #caseDetailModal > div{
  border-radius:18px !important;
  border-color:rgba(220,174,76,.28) !important;
  box-shadow:0 30px 70px rgba(0,0,0,.6) !important;
  -webkit-backdrop-filter:blur(20px) saturate(150%);backdrop-filter:blur(20px) saturate(150%);
}
body.v-glass #historyModal button,
body.v-glass #complaintModal button,
body.v-glass #myCasesModal button,
body.v-glass #caseDetailModal button,
body.v-glass #caseDetailModal a{
  border-radius:9px !important;transition:background .15s,border-color .15s;
}
/* Form fields — the complaint form and the case-reply box use hardcoded
   hex (#1a1a1a/#e8e8e8), not custom properties, so these need direct
   overrides rather than the cascade trick above. */
body.v-glass #complaintCategory,
body.v-glass #complaintCategory option{
  background:#15120c !important;color:#f4f1e8 !important;
}
body.v-glass #complaintCategory,
body.v-glass #complaintSubject,
body.v-glass #complaintDetail,
body.v-glass #cdMsgInput{
  border-radius:10px !important;
  border-color:rgba(255,255,255,.12) !important;
}
body.v-glass #complaintSubject,
body.v-glass #complaintDetail,
body.v-glass #cdMsgInput{
  background:rgba(255,255,255,.05) !important;color:#f4f1e8 !important;
}
body.v-glass #complaintSubject:focus,
body.v-glass #complaintDetail:focus,
body.v-glass #cdMsgInput:focus,
body.v-glass #complaintCategory:focus{
  border-color:rgba(220,174,76,.5) !important;outline:none;
}
body.v-glass #cdResolution{color:rgba(244,241,232,.75) !important;}
/* Rows/cards injected by JS (case list items, history table, message
   bubbles) are built with inline style="..." too and inherit the same
   redefined custom properties as everything else in these modals — no
   separate handling needed. */
