/* ============================================================================
   GMH navigation chrome — self-contained plain CSS (no Tailwind, no build step).

   Loaded two ways:
     • admin pages  → via config('adminlte.plugins').GmhNav (active), so it lands
       on every AdminLTE page and cannot be overridden by a page's sections.
     • agent pages  → a plain <link> in layouts.gmh.

   Styles the dark grouped sidebar and the top navbar. Everything is namespaced
   under .gmh-sidebar / .gmh-navbar so it can never touch Bootstrap/AdminLTE
   page content.
   ========================================================================== */

/* ── Sidebar shell ───────────────────────────────────────────────────────── */
.gmh-sidebar {
    background: #0F0F14;
    color: #cbd5e1;
    font-family: Inter, system-ui, -apple-system, sans-serif;
    display: flex;
    flex-direction: column;
    width: 250px;
}

/* On AdminLTE the sidebar is the positioned .main-sidebar — keep AdminLTE's own
   positioning (which already sits below the chat-notification bar), just fix the
   width at 250px (matching the content-wrapper margin) and never let it shrink
   to the mini rail; the grouped labels need the width. */
aside.main-sidebar.gmh-sidebar { width: 250px !important; overflow-y: auto; }
.sidebar-collapse aside.main-sidebar.gmh-sidebar { width: 250px !important; margin-left: 0 !important; }
body.sidebar-collapse .content-wrapper,
body.sidebar-collapse .main-header,
body.sidebar-collapse .main-footer { margin-left: 250px !important; }

/* On the agent shell the sidebar lives in a flex row; make it full-height. */
.gmh-shell { display: flex; min-height: 100vh; }
.gmh-shell > .gmh-sidebar { flex-shrink: 0; align-self: stretch; }

/* ── Brand ───────────────────────────────────────────────────────────────── */
.gmh-brand {
    display: flex; align-items: center; gap: 12px;
    padding: 0 24px; height: 78px; flex-shrink: 0;
    border-bottom: 1px solid rgba(255, 255, 255, 0.06);
}
.gmh-brand-link { display: inline-flex; align-items: center; text-decoration: none; }
/* The GoMyHire wordmark (transparent PNG). Fixed height, width auto so it keeps
   its aspect ratio and never overflows the 250px sidebar. */
.gmh-brand-logo { height: 34px; width: auto; max-width: 100%; display: block; }

/* ── Sidebar collapse control (the < chevron, replaces the top-bar hamburger) ── */
.gmh-collapse-btn {
    margin-left: auto; flex-shrink: 0;
    -webkit-appearance: none; appearance: none;
    background: transparent; border: 0; cursor: pointer;
    width: 30px; height: 30px; border-radius: 8px;
    color: #9ca3af; display: flex; align-items: center; justify-content: center;
    font-size: 20px; line-height: 1; padding: 0;
}
.gmh-collapse-btn:hover { background: rgba(255, 255, 255, 0.08); color: #fff; }

/* Collapsed state ─────────────────────────────────────────────────────────────
   Admin shell: the sidebar is the absolutely-positioned .main-sidebar and the
   content/header/footer carry margin-left:250px — slide the sidebar off and drop
   those margins. Agent shell: the sidebar is a flex item in .gmh-shell — collapse
   its width so the flex content takes the space. */
body.gmh-collapsed aside.main-sidebar.gmh-sidebar { margin-left: -250px !important; }
body.gmh-collapsed .content-wrapper,
body.gmh-collapsed .main-header,
body.gmh-collapsed .main-footer { margin-left: 0 !important; }
body.gmh-collapsed .gmh-shell > .gmh-sidebar { width: 0 !important; min-width: 0; overflow: hidden; }

/* Floating re-open handle (the > chevron), a small tab on the left edge, shown
   only while collapsed. Created by gmh-nav.js so it exists on both shells. */
#gmhReopen { display: none; }
body.gmh-collapsed #gmhReopen {
    display: flex; align-items: center; justify-content: center;
    position: fixed; top: 50%; left: 0; transform: translateY(-50%);
    z-index: 1100; width: 24px; height: 52px;
    border: 1px solid #e5e7eb; border-left: 0; border-radius: 0 8px 8px 0;
    background: #ffffff; color: #6b7280; cursor: pointer;
    box-shadow: 2px 0 10px rgba(0, 0, 0, 0.12);
    font-size: 18px; line-height: 1; padding: 0;
}
body.gmh-collapsed #gmhReopen:hover { color: #111827; background: #f9fafb; }

/* ── Nav list ────────────────────────────────────────────────────────────── */
.gmh-nav { flex: 1; overflow-y: auto; padding: 16px 0; font-size: 14px; }

/* The line separating the current nav from the Deprecated section below it.
   Slightly inset so it reads as a break inside the rail, not a border. */
/* Caption under the progress divider: names the bottom half of the rail as
   the original, not-yet-redesigned pages. */
.gmh-side-caption {
    font: 700 10px/1 var(--gmh-font);
    letter-spacing: .12em;
    text-transform: uppercase;
    color: rgba(255, 255, 255, .38);
    margin: 10px 16px 2px;
}

.gmh-side-divider {
    border-top: 1px solid rgba(255, 255, 255, .14);
    margin: 14px 14px 6px;
}

.gmh-group {
    padding: 16px 16px 4px;
    font-size: 11px; text-transform: uppercase; letter-spacing: 0.05em;
    color: #6b7280; font-weight: 600;
}

.gmh-link {
    display: flex; align-items: center; gap: 8px; padding: 10px 16px;
    color: #9ca3af; text-decoration: none; line-height: 1.3;
}
.gmh-link:hover { background: rgba(255, 255, 255, 0.05); color: #f3f4f6; text-decoration: none; }
.gmh-link.gmh-top { color: #e5e7eb; font-weight: 500; }
.gmh-link.gmh-active {
    background: rgba(147, 51, 234, 0.20); color: #fff;
    border-right: 2px solid #a855f7;
}

/* Sidebar unread badge (per-type on chat sub-items, total on the parent). */
.gmh-nav-badge {
    margin-left: auto; flex-shrink: 0;
    min-width: 18px; height: 18px; padding: 0 5px;
    border-radius: 9999px; background: #e74c3c; color: #fff;
    font-size: 11px; font-weight: 600; line-height: 18px; text-align: center;
}
/* In a <summary> the caret follows the badge, so nudge the badge off the edge. */
.gmh-sub > summary .gmh-nav-badge { margin-right: 6px; }

/* ── Submenu (native <details>) ──────────────────────────────────────────── */
.gmh-sub > summary {
    display: flex; align-items: center; justify-content: space-between; gap: 8px;
    padding: 8px 16px; cursor: pointer; user-select: none;
    color: #d1d5db; list-style: none;
}
.gmh-sub > summary::-webkit-details-marker { display: none; }
.gmh-sub > summary:hover { background: rgba(255, 255, 255, 0.05); }
.gmh-caret { color: #6b7280; font-size: 12px; transition: transform 0.15s ease; }
.gmh-sub[open] > summary .gmh-caret { transform: rotate(90deg); }

/* ── Top navbar (global GMH top bar) ─────────────────────────────────────────
   Matches the GMH quotation header exactly: 78px tall, white with a bottom
   border, title + description on the left, currency pill + action on the right. */
.gmh-navbar.main-header {
    background: #ffffff !important;
    border-bottom: 1px solid #e5e7eb !important;
    height: 78px !important;
    min-height: 78px !important;
    padding: 0 24px !important;
    display: flex !important;
    align-items: center !important;
}
/* The sidebar toggler is kept for collapse, but styled subtly so the bar reads
   as the clean GMH header (title-led), not the old AdminLTE toolbar. */
.gmh-navbar .navbar-nav .nav-link[data-widget="pushmenu"] { color: #9ca3af; padding: 8px 10px; }
.gmh-navbar .navbar-nav .nav-link[data-widget="pushmenu"]:hover { color: #4b5563; }

/* Page title + description (left of the bar) — text-base / text-xs, like the header. */
.gmh-topbar-titles { min-width: 0; padding-left: 12px; line-height: 1.25; }
.gmh-topbar-title {
    font-size: 16px; font-weight: 600; color: #111827;
    white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.gmh-topbar-sub {
    font-size: 12px; color: #6b7280;
    white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}

/* Right group: currency pill + optional action in a clean flex row — the exact
   same context as the quotation header's right div (flex items-center gap-3). */
.gmh-navbar .gmh-topbar-actions {
    display: flex; align-items: center; gap: 12px; flex-shrink: 0;
}
/* Explicit top-bar action button — used on pages whose action is a raw <button>
   (Tailwind preflight is off, so utility classes on a <button> keep the UA bevel).
   Matches the GMH <a> action buttons exactly, so every page's primary action looks
   identical. Wins over UA/AdminLTE chrome via !important on the reset bits. */
.gmh-tb-btn {
    display: inline-flex !important; align-items: center; gap: 8px;
    padding: 10px 16px !important; border: 0 !important; border-radius: 8px !important;
    font-size: 14px !important; font-weight: 500; line-height: 1.25 !important;
    -webkit-appearance: none; appearance: none; box-shadow: none !important;
    cursor: pointer; text-decoration: none; white-space: nowrap;
}
.gmh-tb-btn-primary { background: var(--gmh-purple) !important; color: var(--gmh-on-purple) !important; }
.gmh-tb-btn-primary:hover { background: var(--gmh-purple-deep) !important; color: var(--gmh-on-purple) !important; }
.gmh-tb-btn-ghost { background: #fff !important; color: #374151 !important; border: 1px solid #d1d5db !important; }
.gmh-tb-btn-ghost:hover { background: #f9fafb !important; }

/* Pressed. Nothing in the design system had an :active state, so a click gave
   no feedback at all between the hover and whatever the click went on to do. */
.gmh-tb-btn:active { transform: translateY(1px); }
.gmh-tb-btn-primary:active { background: #6B21A8 !important; }
.gmh-tb-btn-ghost:active { background: var(--gmh-line-soft) !important; }
/* Destructive primary: same geometry, red fill, for the confirm side of a
   destructive dialog. UIUX_GUIDE.md: a destructive button always confirms. */
.gmh-tb-btn--danger { background: #DC2626 !important; border-color: #DC2626 !important; color: #fff !important; }
.gmh-tb-btn--danger:hover { background: #B91C1C !important; border-color: #B91C1C !important; }
@media (prefers-reduced-motion: reduce) { .gmh-tb-btn:active { transform: none; } }

/* Icon / utility <button>s on GMH pages (row 3-dot menus, dropdown items, modal
   close). Tailwind preflight is off, so a raw <button> shows the UA outset border
   and grey buttonface background — strip both so they read as flat controls. */
.gmh-icon-btn {
    -webkit-appearance: none; appearance: none; border: 0; background-color: transparent;
    /* UIUX_GUIDE.md: "Row icon actions 30x30px". They had no size at all, so they
       rendered at whatever the glyph measured, about 20x17, which is under any
       sensible target size and gave a ragged row of actions. */
    display: inline-flex; align-items: center; justify-content: center;
    width: 30px; height: 30px; padding: 0;
    border-radius: var(--gmh-radius-sm); color: var(--gmh-grey); cursor: pointer;
    transition: background-color .12s ease, color .12s ease;
}
.gmh-icon-btn:hover { background-color: var(--gmh-purple-soft); color: var(--gmh-purple-deep); }
.gmh-icon-btn:active { background-color: var(--gmh-purple-soft); transform: translateY(1px); }
@media (prefers-reduced-motion: reduce) { .gmh-icon-btn:active { transform: none; } }
/* Destructive icon action: same box, red on hover so the meaning is visible
   before the click, not after. */
.gmh-icon-btn--danger:hover { background-color: #FEF2F2; color: #DC2626; }
.gmh-icon-btn--danger:active { background-color: #FEF2F2; }
/* Per-page primary action button in the top bar (dynamic per page). */
.gmh-navbar .gmh-topbar-btn {
    display: inline-flex; align-items: center; gap: 6px;
    background: var(--gmh-purple); color: var(--gmh-on-purple); font-weight: 600; font-size: 13px;
    padding: 8px 16px; border-radius: 8px; border: 0; text-decoration: none; white-space: nowrap;
    cursor: pointer;
}
.gmh-navbar .gmh-topbar-btn:hover { background: #7e22ce; color: #fff; }
/* Admin-only controls slot (AdminLTE navbar). The unified user menu lives here. */
.gmh-navbar .gmh-topbar-controls { margin-left: 8px; align-items: center; }
.gmh-navbar .gmh-topbar-controls .nav-link { color: #6b7280; }

/* ── Unified user-menu (avatar + popover), shared by both top bars ─────────── */
.gmh-usermenu { position: relative; display: inline-flex; align-items: center; }
.gmh-avatar-btn {
    width: 36px; height: 36px; border-radius: 9999px !important; border: 0 !important; cursor: pointer;
    /* !important: pages that load Flowbite's CSS reset get their button backgrounds
       zeroed, which turned this avatar white-on-white (invisible). */
    background: var(--gmh-purple) !important; color: var(--gmh-on-purple) !important; font-weight: 700; font-size: 14px;
    display: inline-flex !important; align-items: center; justify-content: center; line-height: 1;
}
.gmh-avatar-btn:hover { background: #7e22ce !important; }
.gmh-usermenu-pop {
    position: absolute; top: calc(100% + 8px); right: 0; z-index: 2000;
    width: 260px; background: #fff; border: 1px solid #e5e7eb; border-radius: 12px;
    box-shadow: 0 12px 28px -8px rgba(17,24,39,.22); padding: 8px;
}
.gmh-usermenu-pop[hidden] { display: none; }
.gmh-usermenu-head { display: flex; gap: 10px; align-items: center; padding: 8px 8px 10px; }
.gmh-avatar-lg {
    width: 40px; height: 40px; border-radius: 9999px; background: #f3e8ff; color: #7e22ce;
    font-weight: 700; font-size: 16px; display: inline-flex; align-items: center; justify-content: center; flex: 0 0 auto;
}
.gmh-usermenu-id { min-width: 0; }
.gmh-usermenu-name { font-size: 14px; font-weight: 600; color: #111827; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.gmh-usermenu-email { font-size: 12px; color: #6b7280; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.gmh-usermenu-role {
    display: inline-block; margin-top: 3px; font-size: 10px; font-weight: 600; text-transform: uppercase;
    letter-spacing: .03em; color: #7e22ce; background: #f5e9f7; border-radius: 9999px; padding: 2px 8px;
}
.gmh-usermenu-divider { height: 1px; background: #f1f1f4; margin: 4px 0; }
.gmh-usermenu-item {
    width: 100%; display: flex; align-items: center; gap: 10px; padding: 9px 10px; border: 0; background: transparent;
    border-radius: 8px; font-size: 13px; color: #374151; cursor: pointer; text-align: left;
}
.gmh-usermenu-item:hover { background: #faf5ff; }
.gmh-usermenu-item i { width: 16px; text-align: center; color: #6b7280; }
/* Only the label grows; the switch keeps its fixed size and sits at the right. */
.gmh-usermenu-item > span:not(.gmh-switch) { flex: 1; }
.gmh-usermenu-logout-form { margin: 0; }
.gmh-usermenu-logout { color: #dc2626; }
.gmh-usermenu-logout i { color: #dc2626; }
.gmh-switch { width: 34px; height: 18px; border-radius: 9999px; background: #d1d5db; position: relative; flex: 0 0 auto; transition: background .15s; }
.gmh-switch::after { content: ''; position: absolute; top: 2px; left: 2px; width: 14px; height: 14px; border-radius: 9999px; background: #fff; transition: left .15s; }
.gmh-switch.on { background: var(--gmh-purple); }
.gmh-switch.on::after { left: 18px; }

/* ── Currency switcher: neutralise native <button> chrome ─────────────────────
   The pill and its dropdown options are <button> elements styled only with
   Tailwind utilities. On the agent/GMH pages Tailwind preflight resets buttons,
   and on the job pages Flowbite's reset does; but on the plain admin pages
   preflight is OFF (so it can't clobber Bootstrap), which left the options
   showing the browser's default button border/background — the boxy look.
   Reset it explicitly here so the switcher renders identically on every page. */
#gmhCurrencyPill,
#gmhCurrencyMenu .gmhCurrencyOption {
    -webkit-appearance: none;
    appearance: none;
    border: 0;
    box-shadow: none;
    font-family: inherit;
    cursor: pointer;
    margin: 0;
}
#gmhCurrencyMenu .gmhCurrencyOption {
    background-color: transparent;
    width: 100%;
    text-align: left;
    color: #374151;
    border-radius: 6px;
}
#gmhCurrencyMenu .gmhCurrencyOption:hover { background-color: #faf5ff; }
/* The dropdown container border is intentional; keep it crisp. */
#gmhCurrencyMenu { line-height: 1.4; }

/* ── Chat Hub top-bar button (beside the currency; replaces the old notif bar) ── */
.gmh-chat-hub {
    display: inline-flex; align-items: center; gap: 6px; position: relative;
    background: #f3f4f6; color: #374151;
    border-radius: 9999px; padding: 8px 12px;
    font-size: 14px; font-weight: 500; text-decoration: none; line-height: 1;
}
.gmh-chat-hub:hover { background: #e5e7eb; color: #111827; text-decoration: none; }
.gmh-chat-hub-icon { width: 16px; height: 16px; flex-shrink: 0; }
.gmh-chat-hub-label { white-space: nowrap; }
/* Total unread badge on the button. */
.gmh-chat-badge {
    min-width: 18px; height: 18px; padding: 0 5px;
    border-radius: 9999px; background: #e74c3c; color: #fff;
    font-size: 11px; font-weight: 600; line-height: 18px; text-align: center;
}

/* ── gmh-table.js: sortable headers, pager, wallet alert dot ──────────────── */
.gmh-th-sortable { user-select: none; }
.gmh-th-sortable:hover { color: #6b7280; }
.gmh-sort-arrow { color: var(--gmh-purple); font-weight: 700; }

.gmh-pager {
    display: inline-flex; align-items: center; gap: 8px;
}
.gmh-pager-info { font-size: 12px; color: #6b7280; }
.gmh-pager-btn {
    -webkit-appearance: none; appearance: none;
    border: 1px solid #d1d5db; background: #fff; color: #374151;
    font-size: 13px; font-weight: 500; border-radius: 8px;
    padding: 5px 12px; cursor: pointer;
}
.gmh-pager-btn:hover:not(:disabled) { background: #f9fafb; }
.gmh-pager-btn:disabled { opacity: .45; cursor: default; }

/* Leftmost wallet alert indicator. */
.gmh-alert-dot {
    -webkit-appearance: none; appearance: none; border: 0; background: transparent;
    display: inline-flex; align-items: center; justify-content: center;
    width: 20px; height: 20px; padding: 0; cursor: pointer; border-radius: 9999px;
}
.gmh-alert-dot::before {
    content: ''; width: 10px; height: 10px; border-radius: 9999px;
    background: #ef4444; box-shadow: 0 0 0 3px rgba(239, 68, 68, .18);
    animation: gmhAlertPulse 2s ease-in-out infinite;
}
@keyframes gmhAlertPulse {
    0%, 100% { box-shadow: 0 0 0 3px rgba(239, 68, 68, .18); }
    50% { box-shadow: 0 0 0 5px rgba(239, 68, 68, .08); }
}
.gmh-alert-pop {
    position: absolute; z-index: 1080; width: 320px; max-width: calc(100vw - 24px);
    background: #fff; border: 1px solid #e5e7eb; border-radius: 12px;
    box-shadow: 0 12px 32px rgba(15, 23, 42, .18); padding: 12px 14px;
}
.gmh-alert-pop-title {
    font-size: 12px; font-weight: 700; text-transform: uppercase; letter-spacing: .04em;
    color: #b91c1c; margin-bottom: 8px;
}
.gmh-alert-pop-item {
    font-size: 13px; color: #374151; line-height: 1.45;
    padding: 6px 0; border-top: 1px solid #f3f4f6;
}
.gmh-alert-pop-item:first-of-type { border-top: 0; }
.gmh-alert-pop-type {
    display: block; font-weight: 600; color: #111827; margin-bottom: 1px;
}

/* ── Unified scrollbar (GMH) ──────────────────────────────────────────────────
   Thin, rounded, muted-purple scrollbar — the style used on the driving-region
   pages, now applied to every admin scroll area (sidebar, content, tables,
   dropdowns) via this globally-loaded stylesheet, so scrollbars look identical
   across both the AdminLTE shell and the agent/GMH pages. */
* { scrollbar-width: thin; scrollbar-color: #cbb8d4 transparent; }
*::-webkit-scrollbar { width: 8px; height: 8px; }
*::-webkit-scrollbar-track { background: transparent; }
*::-webkit-scrollbar-thumb {
    background: #cbb8d4; border-radius: 8px;
    border: 2px solid transparent; background-clip: content-box;
}
*::-webkit-scrollbar-thumb:hover { background: var(--gmh-purple); background-clip: content-box; }

/* ── Sidebar scrollbar (ground rule 1) ────────────────────────────────────────
   The global nav has its own scrollbar: thin, no up/down arrow buttons, and the
   thumb fades out when idle — it appears while scrolling or hovering the rail.
   These rules override the admin-wide scrollbar styling above for the sidebar
   scroll areas only. The .gmh-scrolling class is toggled by gmh-nav.js. */
.gmh-nav, aside.main-sidebar.gmh-sidebar {
    scrollbar-width: thin;
    scrollbar-color: transparent transparent;    /* idle: invisible */
    transition: scrollbar-color .3s ease;
}
.gmh-nav.gmh-scrolling, .gmh-nav:hover,
aside.main-sidebar.gmh-sidebar.gmh-scrolling, aside.main-sidebar.gmh-sidebar:hover {
    scrollbar-color: rgba(155, 59, 173, .45) transparent;
}
.gmh-nav::-webkit-scrollbar, aside.main-sidebar.gmh-sidebar::-webkit-scrollbar { width: 6px; }
.gmh-nav::-webkit-scrollbar-button,
aside.main-sidebar.gmh-sidebar::-webkit-scrollbar-button { display: none; width: 0; height: 0; }
.gmh-nav::-webkit-scrollbar-track,
aside.main-sidebar.gmh-sidebar::-webkit-scrollbar-track { background: transparent; }
.gmh-nav::-webkit-scrollbar-thumb,
aside.main-sidebar.gmh-sidebar::-webkit-scrollbar-thumb {
    background: transparent; border-radius: 6px;
}
.gmh-nav.gmh-scrolling::-webkit-scrollbar-thumb, .gmh-nav:hover::-webkit-scrollbar-thumb,
aside.main-sidebar.gmh-sidebar.gmh-scrolling::-webkit-scrollbar-thumb,
aside.main-sidebar.gmh-sidebar:hover::-webkit-scrollbar-thumb {
    background: rgba(155, 59, 173, .45);
}

/* ── Notification bell + drawer (ground rule 2 — the Notification slot) ─────── */
.gmh-notif { position: relative; display: inline-flex; }
.gmh-notif-btn {
    position: relative; display: inline-flex; align-items: center; justify-content: center;
    width: 36px; height: 36px; border: 0; border-radius: 9999px;
    background: #f3f4f6; color: #374151; cursor: pointer; font-size: 14px;
}
.gmh-notif-btn:hover { background: #e5e7eb; color: #111827; }
.gmh-notif-badge {
    position: absolute; top: -3px; right: -3px;
    min-width: 17px; height: 17px; padding: 0 4px; border-radius: 9999px;
    background: #e74c3c; color: #fff; font-size: 10.5px; font-weight: 700;
    line-height: 17px; text-align: center;
}
.gmh-notif-backdrop {
    position: fixed; inset: 0; background: rgba(17, 24, 39, .35); z-index: 1069;
}
.gmh-notif-drawer {
    position: fixed; top: 0; right: 0; bottom: 0; width: 360px; max-width: 92vw;
    background: #fff; z-index: 1070; display: flex; flex-direction: column;
    box-shadow: -12px 0 32px rgba(17, 24, 39, .18);
    transform: translateX(100%); transition: transform .25s ease;
}
.gmh-notif-drawer.gmh-open { transform: translateX(0); }
.gmh-notif-head {
    display: flex; align-items: center; justify-content: space-between;
    padding: 16px; border-bottom: 1px solid #e5e7eb;
}
.gmh-notif-head b { font-size: 15px; color: #111827; }
.gmh-notif-close {
    border: 0; background: transparent; font-size: 22px; line-height: 1;
    color: #9ca3af; cursor: pointer; padding: 2px 6px; border-radius: 6px;
}
.gmh-notif-close:hover { background: #f3f4f6; color: #111827; }
.gmh-notif-sub { padding: 10px 16px 6px; font-size: 11px; color: #6b7280; }
.gmh-notif-list { flex: 1; overflow-y: auto; padding: 6px 10px 10px; }
.gmh-notif-item {
    display: block; padding: 10px 12px; border-radius: 10px; margin-bottom: 6px;
    background: #f9fafb; border: 1px solid #f3f4f6; text-decoration: none;
}
.gmh-notif-item:hover { background: #faf5ff; border-color: #ead6f0; text-decoration: none; }
.gmh-notif-item .t { display: flex; justify-content: space-between; align-items: center; gap: 8px; }
.gmh-notif-item .t b { font-size: 12px; color: #111827; }
.gmh-notif-item .t .order { font-size: 10.5px; color: var(--gmh-purple); font-weight: 700; white-space: nowrap; }
.gmh-notif-item .m { font-size: 11px; color: #6b7280; margin-top: 2px; line-height: 1.45; }
.gmh-notif-item.sev-red { border-left: 3px solid #dc2626; }
.gmh-notif-item.sev-yellow { border-left: 3px solid #f59e0b; }
.gmh-notif-mine {
    display: inline-block; margin-top: 4px; padding: 1px 8px; border-radius: 9999px;
    background: #f5e9f7; color: #6b21a8; font-size: 9.5px; font-weight: 700;
}
.gmh-notif-empty { padding: 24px 12px; text-align: center; font-size: 12px; color: #9ca3af; }
.gmh-notif-foot {
    display: block; padding: 12px 16px; border-top: 1px solid #e5e7eb;
    font-size: 12px; font-weight: 600; color: var(--gmh-purple); text-align: center; text-decoration: none;
}
.gmh-notif-foot:hover { background: #faf5ff; color: #7e22ce; text-decoration: none; }

/* Ground rules: the AdminLTE footer ("Copyright ...") carries no information -
   removed globally. Content-wrapper keeps its own bottom padding instead. */
.main-footer { display: none !important; }

/* Fixed-navbar offset: AdminLTE offsets content by its default bar height
   (~57px), but the GMH bar is 78px - content started 21px hidden behind the
   bar (summary cards flush at the top) and left a matching white band at the
   bottom. Offset by the real height and paint the field to the viewport. */
body.layout-navbar-fixed .content-wrapper,
body.layout-navbar-fixed.layout-fixed .content-wrapper {
    margin-top: 78px !important;
    min-height: calc(100vh - 78px) !important;
}

/* ── Sticky full-height table card (approved behaviour) ───────────────────────
   The table card is always exactly one screen tall and position:sticky: at the
   top of a page you see the summary cards with the table below; scrolling down
   slides the cards away while the card pins under the 78px top bar and fills
   the screen. The page's scroll range ends there, so further scrolling moves
   the ROWS inside the card (its own scroll area, sticky column header). */
.gmh-sticky-card {
    position: sticky;
    top: calc(78px + 12px);
    height: calc(100vh - 78px - 24px);
}
.gmh-pager-left { display: inline-flex; align-items: center; gap: 12px; }
.gmh-pager-size {
    border: 1px solid #d1d5db; border-radius: 8px; padding: 4px 6px;
    font: inherit; font-size: 13px; color: #111827; background: #fff; margin-left: 4px;
}

/* ── Smooth scrolling (UX polish) ─────────────────────────────────────────────
   Programmatic and anchor scrolls glide instead of jumping - page scroll, the
   sticky table card's inner row scroller, and every other overflow container.
   Guarded by prefers-reduced-motion so users who opt out of motion keep
   instant jumps. */
@media (prefers-reduced-motion: no-preference) {
    html { scroll-behavior: smooth; }
    .gmh-sticky-card div[class*="overflow-"],
    .gmh-nav,
    .overflow-auto, .overflow-y-auto, .overflow-x-auto {
        scroll-behavior: smooth;
    }
}

/* ── Request loader (GMH) ─────────────────────────────────────────────────────
   Two parts, one look:
   1. Pace (already global) restyled from the stock blue flash theme into a
      thin purple progress bar above the top bar - covers page loads and ajax.
   2. .gmh-loading pill - shown by gmh-nav.js the instant a navigation starts
      (link click / form submit), covering the gap before the next page paints. */
.pace { -webkit-perspective: none; }
.pace .pace-progress {
    background: var(--gmh-purple) !important; height: 3px !important;
    box-shadow: 0 0 8px rgba(155, 59, 173, .55);
    z-index: 2050 !important;
}
.pace .pace-progress-inner { box-shadow: 0 0 10px var(--gmh-purple), 0 0 5px var(--gmh-purple) !important; }
.pace .pace-activity { display: none !important; }   /* no corner spinner; the pill covers it */

.gmh-loading {
    position: fixed; top: 14px; left: 50%; transform: translateX(-50%);
    z-index: 2060; display: flex; align-items: center; gap: 8px;
    background: #111827; color: #fff; border-radius: 9999px;
    padding: 8px 16px; font-size: 12.5px; font-weight: 600;
    box-shadow: 0 8px 24px rgba(17, 24, 39, .35);
    opacity: 0; pointer-events: none; transition: opacity .15s ease;
}
/* Appear instantly (no fade-in): with a fade, the pill was still at ~0 opacity
   during the one paint before a heavy re-render blocked the thread - it only
   became visible as the work finished. Fade applies on the way out only. */
.gmh-loading.on { opacity: 1; transition: none; }
.gmh-loading .spin {
    width: 14px; height: 14px; border-radius: 50%;
    border: 2px solid rgba(255, 255, 255, .25); border-top-color: #fff;
    animation: gmh-spin .7s linear infinite;
}
@keyframes gmh-spin { to { transform: rotate(360deg); } }
@media (prefers-reduced-motion: reduce) { .gmh-loading .spin { animation: none; } }

/* Transparent interaction shield behind the Loading pill: while a request is in
   flight every click lands here instead of on buttons/links underneath, so the
   user cannot fire duplicate requests by spamming. Invisible by design - only
   the pill and the progress cursor show that it is active. */
.gmh-loading-shield {
    position: fixed; inset: 0; z-index: 2055;
    background: transparent; cursor: progress;
}

/* Scrollbar-free horizontal strips (tab rows, steppers): still scrollable by
   wheel/drag on narrow screens, but never show a scrollbar. */
.gmh-noscrollbar { scrollbar-width: none; -ms-overflow-style: none; }
.gmh-noscrollbar::-webkit-scrollbar { display: none; width: 0; height: 0; }

/* The table-card search icon: a quiet glyph inside the input - no border, no
   button chrome (Bootstrap-shell pages give <button> a default border). */
.gmh-search-btn { border: 0 !important; background: transparent !important; box-shadow: none !important; }
.gmh-search-btn:hover { background: #faf5ff !important; }

/* ── Drawer backdrop layering ─────────────────────────────────────────────────
   Flowbite ships the backdrop at z-index 30, which leaves the fixed admin top bar
   (z 1037) uncovered and clickable while a drawer is open. Raise it above the bar
   but below the drawer panel itself (lifted to z 1055 by gmh-nav.js). */
[drawer-backdrop] {
    z-index: 1040 !important;
}

/* Back chevron at the top bar's left, rendered only when a page defines the
   topbar_back section. 30x30 like the row icon actions, grey resting, purple hover. */
.gmh-topbar-back {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 30px;
    height: 30px;
    margin-right: 10px;
    border-radius: 8px;
    color: #6B7280;
    font-size: 14px;
    flex: none;
}
.gmh-topbar-back:hover { color: #7E22CE; background: #FAF5FF; text-decoration: none; }

/* A .gmh-tb-btn with no variant class renders as bare text.

   The base above is layout only: `border: 0 !important` and no background, with
   the whole look living in -primary and -ghost. Fourteen call sites across seven
   pages wrote the base alone and shipped an invisible button: Save rates on
   Charter Rates, Back in the price calculator drawer, Add currency, Delivery Log,
   Retry failed, Back to templates, Export on Withdraw Request. Each of them meant
   "a button", and one of them (mail delivery) even sets an inline border-color,
   which the base's `border: 0` was quietly discarding.

   So a variant-less button gets the ghost look it was written for. The attribute
   selector excludes every gmh-tb-btn-* variant in one go, present and future, and
   is-danger only ever ships alongside -ghost (see x-gmh.button), so it is
   untouched too. */
.gmh-tb-btn:not([class*="gmh-tb-btn-"]) {
    background: #fff !important;
    color: #374151 !important;
    border: 1px solid #d1d5db !important;
}
.gmh-tb-btn:not([class*="gmh-tb-btn-"]):hover { background: #f9fafb !important; }
