﻿/* ==========================================================================
   KORMAN PORTAL — DESIGN SYSTEM
   --------------------------------------------------------------------------
   Visual language: modern SaaS healthcare analytics.
   Source of truth: originally extracted from Dashboard.razor +
   SpendComparisonTab.razor (redesigned earlier). This file is the authoritative
   token/component sheet for the entire app going forward.

   HOW TO USE
   ----------
     • Pages should reference semantic utility classes (.app-card,
       .app-kpi-card, .app-btn-primary, .app-badge, etc.) instead of
       hard-coding colors.
     • For custom one-off styling in a page, reference the CSS custom
       properties (var(--app-surface), var(--app-text-muted), ...) so dark
       mode flows through automatically.
     • Icon accent families: .app-icon--blue | indigo | emerald | rose |
       amber | teal | orange | green. Pair with a parent container that has
       some padding and radius (e.g. .app-kpi-icon).

   DARK MODE
   ---------
   MudBlazor 8.x adds the class `mud-theme-dark` to <body> (and/or html)
   when <MudThemeProvider IsDarkMode="true"> flips on. We redefine the
   token values under that selector so every component class follows along.
   Do NOT duplicate dark-specific rules in component selectors — change the
   token, not the component.

   WHY THIS EXISTS
   ---------------
   Inline <style> blocks inside Dashboard.razor worked for one page, but
   they can't be reused, don't respond to dark mode (hard-coded whites),
   and drift out of sync across pages. A single tokenized sheet keeps the
   whole app consistent and makes dark mode a free feature.
   ========================================================================== */


/* --------------------------------------------------------------------------
   1. DESIGN TOKENS — LIGHT MODE (default)
   -------------------------------------------------------------------------- */
:root {
    /* Page / surfaces */
    --app-bg-gradient-start: #f0f4f8;
    --app-bg-gradient-end: #e2e8f0;
    --app-surface: #ffffff;
    --app-surface-subtle: #f8fafc; /* table header bg, inner panels */
    --app-surface-hover: #eff6ff; /* row hover, action-card hover bg */
    --app-border-subtle: rgba(0,0,0,.03);
    --app-border-soft: #e2e8f0; /* action-card border */
    --app-divider: #f1f5f9;
    /* Text */
    --app-text-strong: #0f172a; /* headings, KPI values */
    --app-text: #1e293b; /* body */
    --app-text-muted: #475569; /* section captions */
    --app-text-label: #64748b; /* small uppercase labels */
    --app-text-faint: #94a3b8; /* placeholders, formula hints */
    /* Shadows */
    --app-shadow-sm: 0 1px 3px rgba(0,0,0,.05), 0 1px 2px rgba(0,0,0,.03);
    --app-shadow-md: 0 4px 16px rgba(0,0,0,.07), 0 2px 4px rgba(0,0,0,.04);
    --app-shadow-lg: 0 8px 24px rgba(0,0,0,.08), 0 2px 6px rgba(0,0,0,.04);
    --app-shadow-drop: 0 1px 4px rgba(0,0,0,.05), 0 1px 2px rgba(0,0,0,.03);
    /* Radii */
    --app-radius-card: 16px;
    --app-radius-panel: 14px;
    --app-radius-control: 12px;
    --app-radius-pill: 999px;
    /* Primary / accent */
    --app-primary: #1976d2;
    --app-primary-hover-bg: rgba(25,118,210,.08);
    --app-primary-soft-bg: #eff6ff;
    --app-primary-shadow: 0 2px 8px rgba(25,118,210,.28);
    --app-primary-shadow-hover: 0 4px 14px rgba(25,118,210,.38);
    /* Semantic up/down (used by .app-badge--up/down) */
    --app-up-fg: #15803d;
    --app-up-bg: #dcfce7;
    --app-down-fg: #be123c;
    --app-down-bg: #ffe4e6;
    /* Icon accent families — soft pastel bg / saturated fg */
    --app-icon-blue-bg: #dbeafe;
    --app-icon-blue-fg: #1d4ed8;
    --app-icon-indigo-bg: #e0e7ff;
    --app-icon-indigo-fg: #3730a3;
    --app-icon-emerald-bg: #d1fae5;
    --app-icon-emerald-fg: #047857;
    --app-icon-rose-bg: #ffe4e6;
    --app-icon-rose-fg: #be123c;
    --app-icon-amber-bg: #fef3c7;
    --app-icon-amber-fg: #b45309;
    --app-icon-teal-bg: #ccfbf1;
    --app-icon-teal-fg: #0f766e;
    --app-icon-orange-bg: #ffedd5;
    --app-icon-orange-fg: #c2410c;
    --app-icon-green-bg: #dcfce7;
    --app-icon-green-fg: #15803d;
    --app-icon-purple-bg: #ede9fe;
    --app-icon-purple-fg: #6d28d9;
    /* Motion */
    --app-ease: cubic-bezier(.4, 0, .2, 1);
    --app-duration: .3s;
}


/* --------------------------------------------------------------------------
   2. DESIGN TOKENS — DARK MODE REBIND
   MudBlazor's dark mode puts .mud-theme-dark on <body>. We cover <html> too
   for safety and add .mud-theme-dark as a generic selector in case MudBlazor
   moves it between versions.
   -------------------------------------------------------------------------- */
body.mud-theme-dark,
html.mud-theme-dark,
.mud-theme-dark {
    /* Page / surfaces — tuned to match MudBlazor's dark palette */
    --app-bg-gradient-start: #151521;
    --app-bg-gradient-end: #1a1a27;
    --app-surface: #1e1e2d;
    --app-surface-subtle: #252535;
    --app-surface-hover: #2a2a3d;
    --app-border-subtle: rgba(255,255,255,.04);
    --app-border-soft: #33323e;
    --app-divider: #292838;
    /* Text */
    --app-text-strong: #e6e6ef;
    --app-text: #d6d5e0;
    --app-text-muted: #b2b0bf;
    --app-text-label: #92929f;
    --app-text-faint: #74718e;
    /* Shadows are deeper/darker in dark mode */
    --app-shadow-sm: 0 1px 3px rgba(0,0,0,.5), 0 1px 2px rgba(0,0,0,.3);
    --app-shadow-md: 0 4px 16px rgba(0,0,0,.45), 0 2px 4px rgba(0,0,0,.3);
    --app-shadow-lg: 0 8px 24px rgba(0,0,0,.55), 0 2px 6px rgba(0,0,0,.35);
    --app-shadow-drop: 0 1px 4px rgba(0,0,0,.45), 0 1px 2px rgba(0,0,0,.3);
    /* Primary — use the lighter MudBlazor dark primary */
    --app-primary: #4a6fa5;
    --app-primary-hover-bg: rgba(74,111,165,.18);
    --app-primary-soft-bg: rgba(74,111,165,.12);
    --app-primary-shadow: 0 2px 8px rgba(74,111,165,.45);
    --app-primary-shadow-hover: 0 4px 14px rgba(74,111,165,.55);
    /* Semantic up/down — darker pastels, brighter fg */
    --app-up-fg: #4ade80;
    --app-up-bg: rgba(21,128,61,.18);
    --app-down-fg: #f87171;
    --app-down-bg: rgba(190,18,60,.18);
    /* Icon families — desaturated bgs so they don't burn on dark surface,
       brighter fgs for contrast */
    --app-icon-blue-bg: rgba(29,78,216,.22);
    --app-icon-blue-fg: #60a5fa;
    --app-icon-indigo-bg: rgba(55,48,163,.22);
    --app-icon-indigo-fg: #818cf8;
    --app-icon-emerald-bg: rgba(4,120,87,.22);
    --app-icon-emerald-fg: #34d399;
    --app-icon-rose-bg: rgba(190,18,60,.22);
    --app-icon-rose-fg: #fb7185;
    --app-icon-amber-bg: rgba(180,83,9,.22);
    --app-icon-amber-fg: #fbbf24;
    --app-icon-teal-bg: rgba(15,118,110,.22);
    --app-icon-teal-fg: #2dd4bf;
    --app-icon-orange-bg: rgba(194,65,12,.22);
    --app-icon-orange-fg: #fb923c;
    --app-icon-green-bg: rgba(21,128,61,.22);
    --app-icon-green-fg: #4ade80;
    --app-icon-purple-bg: rgba(109,40,217,.22);
    --app-icon-purple-fg: #a78bfa;
}


/* --------------------------------------------------------------------------
   3. PAGE BACKGROUND
   The main content area of the layout uses this. Applied to <MudMainContent>
   via .app-main-content so every authenticated page inherits the gradient.
   -------------------------------------------------------------------------- */
.app-main-content {
    background: linear-gradient(160deg, var(--app-bg-gradient-start) 0%, var(--app-bg-gradient-end) 100%);
    min-height: calc(100vh - 64px); /* minus appbar */
}

.app-page-bg {
    background: linear-gradient(160deg, var(--app-bg-gradient-start) 0%, var(--app-bg-gradient-end) 100%);
    min-height: 100vh;
}


/* --------------------------------------------------------------------------
   4. CARDS
   The core visual: a white (or dark-surface) floating panel with soft shadow,
   16px radius, near-invisible border. Use .app-card as the base; compose with
   .app-card-header / .app-card-body for structured content.
   -------------------------------------------------------------------------- */
.app-card {
    background: var(--app-surface);
    border-radius: var(--app-radius-card);
    border: 1px solid var(--app-border-subtle);
    box-shadow: var(--app-shadow-sm);
    transition: box-shadow var(--app-duration) var(--app-ease), transform var(--app-duration) var(--app-ease);
    overflow: hidden;
}

.app-card--hover:hover {
    box-shadow: var(--app-shadow-lg);
    transform: translateY(-3px);
}

.app-card-header {
    display: flex;
    align-items: center;
    gap: 10px;
    padding: 18px 24px 14px;
    border-bottom: 1px solid var(--app-divider);
}

.app-card-body {
    padding: 20px 24px;
}


/* --------------------------------------------------------------------------
   5. KPI CARDS (icon + label + value)
   -------------------------------------------------------------------------- */
.app-kpi-card {
    background: var(--app-surface);
    border-radius: var(--app-radius-card);
    border: 1px solid var(--app-border-subtle);
    box-shadow: var(--app-shadow-sm);
    padding: 20px;
    display: flex;
    align-items: flex-start;
    gap: 14px;
    transition: box-shadow var(--app-duration) var(--app-ease), transform var(--app-duration) var(--app-ease);
}

    .app-kpi-card:hover {
        box-shadow: var(--app-shadow-lg);
        transform: translateY(-3px);
    }

.app-kpi-icon {
    width: 48px;
    height: 48px;
    border-radius: 14px;
    display: flex;
    align-items: center;
    justify-content: center;
    flex-shrink: 0;
    transition: transform .25s ease;
}

.app-kpi-card:hover .app-kpi-icon {
    transform: scale(1.08);
}

.app-kpi-body {
    display: flex;
    flex-direction: column;
    gap: 4px;
    min-width: 0;
}

.app-kpi-label {
    font-size: .75rem;
    font-weight: 600;
    color: var(--app-text-label);
    text-transform: uppercase;
    letter-spacing: .6px;
}

.app-kpi-value {
    font-size: 1.5rem;
    font-weight: 700;
    color: var(--app-text-strong);
    letter-spacing: -.4px;
}


/* --------------------------------------------------------------------------
   6. ICON ACCENT FAMILIES
   Apply to any square/rounded container that wraps an icon. Pairs soft pastel
   bg with saturated fg that inverts cleanly in dark mode via the tokens.
   -------------------------------------------------------------------------- */
.app-icon--blue {
    background: var(--app-icon-blue-bg);
    color: var(--app-icon-blue-fg);
}

.app-icon--indigo {
    background: var(--app-icon-indigo-bg);
    color: var(--app-icon-indigo-fg);
}

.app-icon--emerald {
    background: var(--app-icon-emerald-bg);
    color: var(--app-icon-emerald-fg);
}

.app-icon--rose {
    background: var(--app-icon-rose-bg);
    color: var(--app-icon-rose-fg);
}

.app-icon--amber {
    background: var(--app-icon-amber-bg);
    color: var(--app-icon-amber-fg);
}

.app-icon--teal {
    background: var(--app-icon-teal-bg);
    color: var(--app-icon-teal-fg);
}

.app-icon--orange {
    background: var(--app-icon-orange-bg);
    color: var(--app-icon-orange-fg);
}

.app-icon--green {
    background: var(--app-icon-green-bg);
    color: var(--app-icon-green-fg);
}

.app-icon--purple {
    background: var(--app-icon-purple-bg);
    color: var(--app-icon-purple-fg);
}


/* --------------------------------------------------------------------------
   7. BUTTONS
   .app-btn-primary is a non-uppercase filled button with a colored drop shadow
   that lifts on hover. Works with MudBlazor by scoping the inside .mud-button
   wrapper.
   -------------------------------------------------------------------------- */
.app-btn-primary,
.app-btn-primary.mud-button-filled,
.app-btn-primary .mud-button-filled {
    border-radius: var(--app-radius-control) !important;
    text-transform: none !important;
    font-weight: 600 !important;
    padding: 8px 22px !important;
    box-shadow: var(--app-primary-shadow) !important;
    transition: box-shadow .2s ease, transform .2s ease !important;
}

    .app-btn-primary:hover,
    .app-btn-primary.mud-button-filled:hover,
    .app-btn-primary .mud-button-filled:hover {
        box-shadow: var(--app-primary-shadow-hover) !important;
        transform: translateY(-1px);
    }


/* --------------------------------------------------------------------------
   8. BADGES (pill up/down indicators)
   -------------------------------------------------------------------------- */
.app-badge {
    display: inline-block;
    padding: 2px 8px;
    border-radius: var(--app-radius-pill);
    font-size: .75rem;
    font-weight: 700;
    line-height: 1.4;
}

.app-badge--up {
    background: var(--app-up-bg);
    color: var(--app-up-fg);
}

.app-badge--down {
    background: var(--app-down-bg);
    color: var(--app-down-fg);
}

.app-badge--neutral {
    background: var(--app-surface-subtle);
    color: var(--app-text-muted);
}


/* --------------------------------------------------------------------------
   9. ACTION CARDS (report selector cards)
   Flat pale-bg panels with a left-sliding hover effect and an arrow that
   slides right. Used on the Dashboard reports section.
   -------------------------------------------------------------------------- */
.app-action-card {
    display: flex;
    align-items: center;
    gap: 16px;
    padding: 16px 20px;
    background: var(--app-surface-subtle);
    border: 1px solid var(--app-border-soft);
    border-radius: 14px;
    cursor: pointer;
    user-select: none;
    transition: background .25s var(--app-ease), border-color .25s var(--app-ease), box-shadow .25s var(--app-ease), transform .25s var(--app-ease);
}

    .app-action-card:hover {
        background: var(--app-primary-soft-bg);
        border-color: var(--app-primary);
        box-shadow: 0 3px 10px rgba(25,118,210,.1);
        transform: translateX(4px);
    }

    .app-action-card:active {
        transform: translateX(2px) scale(.995);
    }

.app-action-icon {
    width: 44px;
    height: 44px;
    border-radius: 12px;
    display: flex;
    align-items: center;
    justify-content: center;
    flex-shrink: 0;
    transition: transform .25s ease;
}

.app-action-card:hover .app-action-icon {
    transform: scale(1.1);
}

.app-action-body {
    flex: 1;
    min-width: 0;
    display: flex;
    flex-direction: column;
    gap: 2px;
}

.app-action-title {
    font-size: .88rem;
    font-weight: 600;
    color: var(--app-text);
}

.app-action-desc {
    font-size: .76rem;
    color: var(--app-text-faint);
    line-height: 1.4;
}


/* --------------------------------------------------------------------------
   10. TABLES — shared polish
   Any MudTable/MudDataGrid inside .app-table gets the uppercase header,
   subtle row hover, and tighter cell padding that matches the dashboard.
   -------------------------------------------------------------------------- */
.app-table .mud-table-head .mud-th,
.app-table .mud-table-head .mud-table-cell {
    background: var(--app-surface-subtle);
    font-size: .75rem;
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: .5px;
    color: var(--app-text-muted);
}

.app-table .mud-table-row:hover td {
    background: var(--app-surface-hover) !important;
}

.app-table .mud-table-cell {
    padding: 12px 16px !important;
    font-size: .875rem;
    border-bottom: 1px solid var(--app-divider) !important;
}


/* --------------------------------------------------------------------------
   11. EMPTY STATE
   -------------------------------------------------------------------------- */
.app-empty-state {
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    gap: 16px;
    padding: 80px 24px;
    color: var(--app-text-faint);
}


/* --------------------------------------------------------------------------
   12. ENTRANCE ANIMATION
   -------------------------------------------------------------------------- */
@keyframes app-fade-in-up {
    from {
        opacity: 0;
        transform: translateY(14px);
    }

    to {
        opacity: 1;
        transform: translateY(0);
    }
}

.app-animate-in {
    animation: app-fade-in-up .45s ease-out both;
}

.app-animate-in-1 {
    animation-delay: .06s;
}

.app-animate-in-2 {
    animation-delay: .12s;
}

.app-animate-in-3 {
    animation-delay: .18s;
}

.app-animate-in-4 {
    animation-delay: .24s;
}


/* --------------------------------------------------------------------------
   13. SCROLLBAR POLISH (webkit)
   -------------------------------------------------------------------------- */
.app-scroll::-webkit-scrollbar,
.app-card ::-webkit-scrollbar {
    width: 5px;
    height: 5px;
}

.app-scroll::-webkit-scrollbar-track,
.app-card ::-webkit-scrollbar-track {
    background: transparent;
}

.app-scroll::-webkit-scrollbar-thumb,
.app-card ::-webkit-scrollbar-thumb {
    background: var(--app-border-soft);
    border-radius: 3px;
}


/* ==========================================================================
   14. LAYOUT CHROME — AppBar, Drawer, Nav
   Applied from MainLayout.razor + NavMenu.razor.
   ========================================================================== */

/* ---- App bar (top) ---- */
.app-appbar.mud-appbar {
    background: var(--app-surface) !important;
    color: var(--app-text) !important;
    box-shadow: var(--app-shadow-drop) !important;
    border-bottom: 1px solid var(--app-divider);
}

.app-appbar .mud-icon-button {
    transition: background-color .2s ease, transform .2s ease;
}

/* Dark-mode toggle button: gentle hover */
.app-theme-toggle:hover {
    background-color: var(--app-primary-hover-bg) !important;
    transform: rotate(12deg);
}

/* Logo wrap: soft hover scale */
.app-logo-wrap {
    display: inline-flex;
    align-items: center;
    transition: transform .25s var(--app-ease);
}

    .app-logo-wrap:hover {
        transform: scale(1.03);
    }


/* ---- Drawer (left nav) ---- */
.app-drawer.mud-drawer {
    background: var(--app-surface) !important;
    border-right: none !important;
    box-shadow: 2px 0 8px rgba(0,0,0,.04);
}

body.mud-theme-dark .app-drawer.mud-drawer {
    box-shadow: 2px 0 8px rgba(0,0,0,.35);
}


/* ---- Main content area ---- */
.app-main-content.mud-main-content {
    background: linear-gradient(160deg, var(--app-bg-gradient-start) 0%, var(--app-bg-gradient-end) 100%);
}


/* ---- Nav menu ---- */
.app-nav {
    padding: 8px 10px;
}

    .app-nav .mud-nav-link {
        margin: 2px 4px;
        padding: 10px 14px;
        border-radius: 10px;
        font-size: .9rem;
        font-weight: 500;
        color: var(--app-text-muted);
        transition: background .2s ease, color .2s ease, padding-left .2s ease;
    }

        .app-nav .mud-nav-link:hover {
            background: var(--app-primary-hover-bg);
            color: var(--app-text-strong);
        }

        /* Active link — subtle pill bg + left accent bar */
        .app-nav .mud-nav-link.active,
        .app-nav .mud-nav-link.mud-nav-link-active {
            background: var(--app-primary-soft-bg) !important;
            color: var(--app-primary) !important;
            font-weight: 600;
            position: relative;
        }

            .app-nav .mud-nav-link.active::before,
            .app-nav .mud-nav-link.mud-nav-link-active::before {
                content: "";
                position: absolute;
                left: 0;
                top: 8px;
                bottom: 8px;
                width: 3px;
                border-radius: 0 3px 3px 0;
                background: var(--app-primary);
            }

        .app-nav .mud-nav-link .mud-nav-link-icon {
            transition: color .2s ease;
        }

    /* Group title */
    .app-nav .mud-nav-group > .mud-nav-link {
        font-weight: 600;
        color: var(--app-text);
        text-transform: none;
        letter-spacing: .1px;
    }

    /* Nested links inside a group: extra indent so hierarchy reads */
    .app-nav .mud-nav-group .mud-nav-group > .mud-nav-link,
    .app-nav .mud-nav-group > div > .mud-nav-link {
        padding-left: 32px;
        font-weight: 500;
    }

        .app-nav .mud-nav-group > div > .mud-nav-link.active::before,
        .app-nav .mud-nav-group > div > .mud-nav-link.mud-nav-link-active::before {
            left: 12px;
        }


/* ==========================================================================
   15. LOGIN PAGE
   The login page renders inside MudMainContent (mt-16 pa-4), so it already
   has 64px top offset (AppBar) + 16px padding on all sides from the layout.
   We break out of that padding with negative margins and use
   calc(100vh - 64px) so the gradient fills exactly the visible area below
   the AppBar without triggering a scrollbar.
   ========================================================================== */

.app-login-page {
    /* Escape the pa-4 (16px) padding MudMainContent adds */
    margin: -16px;
    /* Fill the visible area below the AppBar (64px) exactly */
    min-height: calc(100vh - 64px);
    display: flex;
    align-items: center;
    justify-content: center;
    padding: 24px;
    /* Prevent any overflow from creating a scrollbar */
    overflow: hidden;
    background: linear-gradient(160deg, var(--app-bg-gradient-start) 0%, var(--app-bg-gradient-end) 100%);
}

.app-login-card {
    width: 100%;
    max-width: 440px;
    padding: 32px 32px !important;
    background: var(--app-surface) !important;
    border-radius: var(--app-radius-card) !important;
    border: 1px solid var(--app-border-subtle);
    box-shadow: var(--app-shadow-lg);
}

.app-login-logo-wrap {
    display: flex;
    justify-content: center;
    margin-bottom: 16px;
}

.app-login-title {
    color: var(--app-text-strong) !important;
    font-weight: 700 !important;
    letter-spacing: -.3px;
    margin-bottom: 4px !important;
}

.app-login-subtitle {
    color: var(--app-text-faint);
    font-size: .88rem;
    text-align: center;
    margin-bottom: 24px;
}

/* Round the outlined inputs to match our control radius */
.app-login-card .mud-input-outlined .mud-input-outlined-border {
    border-radius: var(--app-radius-control);
}

.app-login-card .mud-input-outlined {
    border-radius: var(--app-radius-control);
}

/* Link styling */
.app-login-link {
    color: var(--app-primary) !important;
    font-size: .88rem;
    font-weight: 500;
    text-decoration: none !important;
    transition: color .2s ease;
}

    .app-login-link:hover {
        text-decoration: underline !important;
    }


/* ==========================================================================
   16. PAGE HEADERS
   Consistent page-level header: title + subtitle + optional action slot.
   Use inside any .app-card or at the top of a page section.
   ========================================================================== */
.app-page-header {
    display: flex;
    align-items: flex-start;
    justify-content: space-between;
    gap: 16px;
    flex-wrap: wrap;
    margin-bottom: 24px;
}

.app-page-header-text {
    display: flex;
    flex-direction: column;
    gap: 4px;
}

.app-page-title {
    font-size: 1.5rem;
    font-weight: 700;
    color: var(--app-text-strong);
    letter-spacing: -.3px;
    line-height: 1.2;
}

.app-page-subtitle {
    font-size: .875rem;
    color: var(--app-text-muted);
}

.app-page-header-actions {
    display: flex;
    align-items: center;
    gap: 10px;
    flex-shrink: 0;
}


/* ==========================================================================
   17. SECTION CARDS (card header variant with colored left accent)
   ========================================================================== */
.app-card--accent-left {
    border-left: 4px solid var(--app-primary) !important;
}

/* Gradient card header (used in config / setup cards) */
.app-card-header--gradient {
    background: linear-gradient(135deg, #395c80 0%, #4a6f9a 100%);
    color: #ffffff;
    padding: 18px 24px;
    border-radius: var(--app-radius-card) var(--app-radius-card) 0 0;
}

body.mud-theme-dark .app-card-header--gradient {
    background: linear-gradient(135deg, #2a4560 0%, #334f6e 100%);
}

.app-card-header--gradient .app-card-header-title {
    font-size: 1.1rem;
    font-weight: 700;
    color: #ffffff;
}

.app-card-header--gradient .app-card-header-subtitle {
    font-size: .82rem;
    color: rgba(255,255,255,.8);
    margin-top: 2px;
}


/* ==========================================================================
   18. FILTER BAR
   Compact filter section above a data grid (chips, selects, search).
   ========================================================================== */
.app-filter-bar {
    background: var(--app-surface);
    border-radius: var(--app-radius-panel);
    border: 1px solid var(--app-border-soft);
    padding: 14px 20px;
    margin-bottom: 16px;
    display: flex;
    align-items: center;
    gap: 16px;
    flex-wrap: wrap;
}

.app-filter-bar-label {
    font-size: .75rem;
    font-weight: 600;
    color: var(--app-text-label);
    text-transform: uppercase;
    letter-spacing: .5px;
    white-space: nowrap;
}


/* ==========================================================================
   19. DETAIL FIELD (label + value pair in a card)
   ========================================================================== */
.app-detail-field {
    display: flex;
    flex-direction: column;
    gap: 2px;
    padding: 14px 16px;
    background: var(--app-surface);
    border-radius: var(--app-radius-control);
    border: 1px solid var(--app-border-soft);
}

.app-detail-label {
    font-size: .72rem;
    font-weight: 600;
    color: var(--app-text-label);
    text-transform: uppercase;
    letter-spacing: .5px;
}

.app-detail-value {
    font-size: .9rem;
    font-weight: 600;
    color: var(--app-text-strong);
    line-height: 1.3;
}

.app-detail-value--price {
    font-size: 1.1rem;
    color: #be123c;
}

body.mud-theme-dark .app-detail-value--price {
    color: var(--app-down-fg);
}


/* ==========================================================================
   20. WIZARD STEPPER (horizontal step indicator)
   ========================================================================== */
.app-wizard-steps {
    display: flex;
    align-items: center;
    justify-content: center;
    gap: 0;
    margin-bottom: 28px;
}

.app-wizard-step {
    display: flex;
    align-items: center;
    gap: 8px;
    padding: 8px 16px;
    border-radius: var(--app-radius-pill);
    font-size: .82rem;
    font-weight: 600;
    color: var(--app-text-label);
    transition: background .2s ease, color .2s ease;
}

.app-wizard-step--active {
    background: var(--app-primary-soft-bg);
    color: var(--app-primary);
}

.app-wizard-step--done {
    color: var(--app-text-muted);
}

.app-wizard-step-num,
.app-wizard-step-number {
    width: 22px;
    height: 22px;
    border-radius: 50%;
    display: flex;
    align-items: center;
    justify-content: center;
    font-size: .75rem;
    font-weight: 700;
    background: var(--app-border-soft);
    color: var(--app-text-muted);
    flex-shrink: 0;
}

.app-wizard-step--active .app-wizard-step-num,
.app-wizard-step--active .app-wizard-step-number {
    background: var(--app-primary);
    color: #fff;
}

.app-wizard-step--done .app-wizard-step-num,
.app-wizard-step--done .app-wizard-step-number {
    background: var(--app-icon-emerald-bg);
    color: var(--app-icon-emerald-fg);
}

.app-wizard-divider,
.app-wizard-step-divider {
    width: 32px;
    height: 1px;
    background: var(--app-border-soft);
    flex-shrink: 0;
}


/* ==========================================================================
   21. UPLOAD DROP ZONE
   ========================================================================== */
.app-upload-zone {
    border: 2px dashed var(--app-border-soft);
    border-radius: var(--app-radius-control);
    padding: 14px 16px;
    display: flex;
    align-items: center;
    gap: 12px;
    transition: border-color .2s ease, background .2s ease;
    cursor: pointer;
}

    .app-upload-zone:hover,
    .app-upload-zone--has-file {
        border-color: var(--app-primary);
        background: var(--app-primary-soft-bg);
    }


/* ==========================================================================
   22. SUCCESS SCREEN
   ========================================================================== */
.app-success-screen {
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    text-align: center;
    padding: 48px 32px;
    gap: 16px;
}

.app-success-icon-wrap {
    width: 72px;
    height: 72px;
    border-radius: 50%;
    display: flex;
    align-items: center;
    justify-content: center;
    background: var(--app-icon-emerald-bg);
    color: var(--app-icon-emerald-fg);
    margin-bottom: 4px;
}

.app-summary-box {
    width: 100%;
    max-width: 480px;
    background: var(--app-surface-subtle);
    border: 1px solid var(--app-border-soft);
    border-radius: var(--app-radius-control);
    padding: 20px 24px;
}


/* ==========================================================================
   23. DASHBOARD-SPECIFIC REUSABLE PATTERNS
   ========================================================================== */

/* Pill-style tab toolbar (outer dashboard tabs + inner report tabs) */
.app-tabs-pill > .mud-tabs-toolbar {
    background: var(--app-surface);
    border-radius: var(--app-radius-panel);
    padding: 4px;
    box-shadow: var(--app-shadow-sm);
    margin-bottom: 24px;
}

.app-tabs-pill .mud-tab {
    border-radius: 10px;
    font-weight: 600;
    text-transform: none;
    letter-spacing: .3px;
    transition: background .2s ease;
}

    .app-tabs-pill .mud-tab:hover {
        background: var(--app-primary-hover-bg);
    }

/* Inner report sub-tabs — slightly smaller */
.app-tabs-pill--sm > .mud-tabs-toolbar {
    background: var(--app-surface-subtle);
    border-radius: var(--app-radius-control);
    padding: 4px;
    margin-bottom: 0;
    box-shadow: none;
}

.app-tabs-pill--sm .mud-tab {
    border-radius: 10px;
    font-weight: 500;
    text-transform: none;
    font-size: .85rem;
    min-height: 38px;
    transition: background .2s ease;
}

    .app-tabs-pill--sm .mud-tab:hover {
        background: var(--app-primary-hover-bg);
    }

/* Dashboard toolbar (title + date picker + refresh button row) */
.app-toolbar-row {
    display: flex;
    align-items: center;
    justify-content: space-between;
    flex-wrap: wrap;
    gap: 16px;
}

.app-toolbar-left {
    display: flex;
    flex-direction: column;
    gap: 2px;
}

.app-toolbar-right {
    display: flex;
    align-items: center;
    gap: 12px;
    flex-wrap: wrap;
}

/* KPI grid (auto-fit responsive row) */
.app-kpi-grid {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(210px, 1fr));
    gap: 16px;
    margin-bottom: 24px;
}

/* Analytics card (top-5 tables) */
.app-analytics-card {
    background: var(--app-surface);
    border-radius: var(--app-radius-card);
    overflow: hidden;
    box-shadow: var(--app-shadow-sm);
    border: 1px solid var(--app-border-subtle);
    transition: box-shadow var(--app-duration) var(--app-ease);
}

    .app-analytics-card:hover {
        box-shadow: var(--app-shadow-md);
    }

.app-analytics-grid .mud-table-container {
    overflow-x: hidden !important;
}

.app-analytics-grid .mud-table {
    table-layout: fixed;
    width: 100%;
}

.app-analytics-grid .mud-table-cell {
    padding: 12px 16px !important;
    font-size: .875rem;
    border-bottom: 1px solid var(--app-divider) !important;
}

.app-analytics-grid .mud-table-head .mud-table-cell {
    font-weight: 700;
    background: var(--app-surface-subtle);
    color: var(--app-text-muted);
    font-size: .75rem;
    text-transform: uppercase;
    letter-spacing: .5px;
}

.app-analytics-grid .mud-table-row:hover td {
    background: var(--app-surface-hover) !important;
}

/* Progress ring overlay label */
.app-progress-ring-wrap {
    position: relative;
    display: inline-flex;
    align-items: center;
    justify-content: center;
}

.app-progress-ring-label {
    position: absolute;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
    text-align: center;
    pointer-events: none;
}

.app-progress-pct {
    font-size: 1rem;
    font-weight: 700;
    color: var(--app-icon-emerald-fg);
}

/* Summary card value (large number below summary header) */
.app-summary-value {
    font-size: 1.7rem;
    font-weight: 700;
    color: var(--app-text-strong);
    letter-spacing: -.4px;
    margin-top: auto;
}

.app-summary-formula {
    font-size: .68rem;
    color: var(--app-text-faint);
    font-style: italic;
    line-height: 1.35;
}

/* Spend Comparison specific */
.sct-legend {
    display: flex;
    align-items: center;
    gap: 8px;
    margin-top: 4px;
    flex-wrap: wrap;
}

.sct-legend-dot {
    width: 10px;
    height: 10px;
    border-radius: 50%;
    flex-shrink: 0;
}

.sct-dot-primary {
    background: var(--app-primary);
}

.sct-dot-compare {
    background: #9c27b0;
}

.sct-legend-label {
    font-size: .75rem;
    color: var(--app-text-label);
}

.sct-th-stack {
    display: flex;
    flex-direction: column;
    align-items: flex-end;
    gap: 1px;
}

.sct-th-sub {
    font-size: .68rem;
    color: var(--app-text-faint);
    font-weight: 400;
    text-transform: none;
    letter-spacing: 0;
}

.sct-change-row {
    margin-bottom: 14px;
}

.sct-change-meta {
    display: flex;
    align-items: center;
    justify-content: space-between;
    margin-bottom: 6px;
}

.sct-change-label {
    font-size: .875rem;
    font-weight: 500;
    color: var(--app-text);
}

.sct-bar-track {
    border-radius: 6px;
    height: 10px;
    overflow: hidden;
}

.sct-bar-fill {
    height: 100%;
    border-radius: 6px;
    transition: width .5s cubic-bezier(.4,0,.2,1);
}

/* Action cards grid */
.app-action-cards-grid {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(310px, 1fr));
    gap: 12px;
}

/* Action arrow icon */
.app-action-arrow {
    color: var(--app-border-soft) !important;
    flex-shrink: 0;
    transition: color .2s ease, transform .2s ease !important;
}

.app-action-card:hover .app-action-arrow {
    color: var(--app-primary) !important;
    transform: translateX(3px);
}

/* KPI action button (visibility icon on hover) */
.app-kpi-action-btn {
    opacity: .5;
    transition: opacity .2s ease !important;
}

.app-kpi-card:hover .app-kpi-action-btn,
.app-card:hover .app-kpi-action-btn {
    opacity: 1;
}

/* Dashboard responsive */
@media (max-width: 960px) {
    .app-toolbar-row {
        flex-direction: column;
        align-items: stretch;
    }

    .app-toolbar-right {
        flex-direction: column;
    }

    .app-kpi-grid {
        grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
    }

    .app-action-cards-grid {
        grid-template-columns: 1fr;
    }
}

@media (max-width: 600px) {
    .app-kpi-grid {
        grid-template-columns: 1fr;
    }

    .app-kpi-value {
        font-size: 1.25rem;
    }

    .app-summary-value {
        font-size: 1.35rem;
    }
}


/* ==========================================================================
   28. ORDER TIMELINE
   A responsive grid of step tiles used in the OrderDetailsDialog to show
   the lifecycle of an order (Entered → Verified → Checked → Packaged →
   Processed → Delivered → Received).

   Usage:
     <div class="app-timeline">
       <div class="app-timeline-item app-timeline-item--done">
         <div class="app-timeline-icon"> <MudIcon .../> </div>
         <div class="app-timeline-content">
           <span class="app-timeline-title">Step</span>
           <span class="app-timeline-date">timestamp</span>
         </div>
       </div>
       <div class="app-timeline-item"> ... (pending) </div>
     </div>

   States:
     (no modifier) — step not yet reached: muted border, grey icon
     .app-timeline-item--done — step completed: green tint, primary icon bg
   ========================================================================== */
.app-timeline {
    display: grid;
    gap: 12px;
    grid-template-columns: repeat(auto-fit, minmax(160px, 1fr));
}

.app-timeline-item {
    display: flex;
    align-items: center;
    gap: 12px;
    padding: 12px;
    border-radius: var(--app-radius-control);
    background: var(--app-surface);
    border: 2px solid var(--app-border-soft);
    transition: border-color var(--app-duration) var(--app-ease), background var(--app-duration) var(--app-ease), box-shadow var(--app-duration) var(--app-ease);
}

.app-timeline-item--done {
    background: var(--app-icon-emerald-bg);
    border-color: var(--app-icon-emerald-fg);
}

.app-timeline-item:hover {
    box-shadow: var(--app-shadow-sm);
}

.app-timeline-icon {
    width: 32px;
    height: 32px;
    border-radius: 50%;
    display: flex;
    align-items: center;
    justify-content: center;
    background: var(--app-border-soft);
    color: var(--app-text-label);
    flex-shrink: 0;
    transition: background var(--app-duration) ease, color var(--app-duration) ease;
}

.app-timeline-item--done .app-timeline-icon {
    background: var(--app-icon-emerald-fg);
    color: #ffffff;
}

.app-timeline-content {
    flex: 1;
    min-width: 0;
    display: flex;
    flex-direction: column;
    gap: 2px;
}

.app-timeline-title {
    font-size: .83rem;
    font-weight: 600;
    color: var(--app-text);
}

.app-timeline-item--done .app-timeline-title {
    color: var(--app-icon-emerald-fg);
}

.app-timeline-date {
    font-size: .75rem;
    color: var(--app-text-faint);
    line-height: 1.3;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}

body.mud-theme-dark .app-timeline-item--done {
    background: var(--app-icon-emerald-bg);
    border-color: var(--app-icon-emerald-fg);
}

/* Consulting page: colored table header override */
.app-table--consulting .mud-table-head th,
.app-table--consulting .mud-table-head .mud-table-cell {
    background: var(--app-primary) !important;
    color: #ffffff !important;
    font-weight: 600 !important;
    text-transform: none !important;
    letter-spacing: .2px !important;
}

body.mud-theme-dark .app-table--consulting .mud-table-head th,
body.mud-theme-dark .app-table--consulting .mud-table-head .mud-table-cell {
    background: var(--app-primary) !important;
    color: #ffffff !important;
}


/* ==========================================================================
   24. RESPONSIVE TWEAKS
   ========================================================================== */
@media (max-width: 600px) {
    .app-card-body {
        padding: 16px;
    }

    .app-card-header {
        padding: 14px 16px 10px;
    }

    .app-kpi-card {
        padding: 16px;
    }

    .app-kpi-value {
        font-size: 1.25rem;
    }

    .app-login-card {
        padding: 28px 20px !important;
    }
}


/* ==========================================================================
   25. DIALOG INFO GRID
   A responsive label+value field grid used inside detail dialogs (e.g.
   DispenseDataDetailsDialog). Each .app-info-item is a tile with a small
   uppercase label and a bolder value below it.

   Usage:
     <div class="app-info-grid">
       <div class="app-info-item">
         <span class="app-info-label">Label</span>
         <span class="app-info-value">Value</span>
       </div>
     </div>

   Modifier classes:
     .app-info-item--full  — spans all grid columns (for long fields like drug name)
     .app-info-value--price — larger, colored for monetary values
     .app-info-value--strong — bold, same color as strong text

   Status banner cards (gradient headers inside dialogs):
     .app-dialog-status-card — full-bleed gradient surface card used for
     Status / RX Type hero banners at the top of a detail dialog.
   ========================================================================== */

/* Status/hero banner cards in dialogs */
.app-dialog-status-card {
    border-radius: var(--app-radius-control) !important;
    transition: transform var(--app-duration) var(--app-ease);
    overflow: hidden;
}

    .app-dialog-status-card:hover {
        transform: translateY(-2px);
    }

.app-dialog-status-card--blue {
    background: linear-gradient(135deg, #395c80 0%, #4a6f9a 100%) !important;
    color: #ffffff !important;
}

.app-dialog-status-card--teal {
    background: linear-gradient(135deg, #395c80 0%, #2ca6a4 100%) !important;
    color: #ffffff !important;
}

/* Destructive / waste-themed gradient (rose) — used in waste/delete contexts
   to communicate the high-consequence nature of the action. */
.app-dialog-status-card--rose {
    background: linear-gradient(135deg, #9f1239 0%, #be123c 100%) !important;
    color: #ffffff !important;
}

body.mud-theme-dark .app-dialog-status-card--blue {
    background: linear-gradient(135deg, #2a4560 0%, #334f6e 100%) !important;
}

body.mud-theme-dark .app-dialog-status-card--teal {
    background: linear-gradient(135deg, #2a4560 0%, #1e7a78 100%) !important;
}

body.mud-theme-dark .app-dialog-status-card--rose {
    background: linear-gradient(135deg, #6b0f2a 0%, #881d3a 100%) !important;
}

/* Info grid container */
.app-info-grid {
    display: grid;
    gap: 16px;
    grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
}

/* Individual label+value tile */
.app-info-item {
    padding: 12px;
    border-radius: 8px;
    background: var(--app-primary-soft-bg);
    border: 1px solid var(--app-border-soft);
    transition: background-color var(--app-duration) ease;
}

    .app-info-item:hover {
        background: var(--app-surface-hover);
    }

/* Span all columns (e.g. long drug name) */
.app-info-item--full {
    grid-column: 1 / -1;
}

/* Label — small uppercase */
.app-info-label {
    display: block;
    font-size: .72rem;
    font-weight: 600;
    color: var(--app-text-label);
    text-transform: uppercase;
    letter-spacing: .5px;
    margin-bottom: 4px;
}

/* Value — bolder body text */
.app-info-value {
    display: block;
    font-size: .9rem;
    font-weight: 500;
    color: var(--app-text-strong);
    line-height: 1.3;
}

.app-info-value--strong {
    font-weight: 700;
}

/* Monetary values — larger and tinted */
.app-info-value--price {
    font-size: 1.1rem;
    font-weight: 600;
    color: var(--app-primary);
}

/* Info card — standard detail card with left accent + hover shadow */
.app-info-card {
    border-radius: var(--app-radius-card) !important;
    border-left: 4px solid var(--app-primary) !important;
    transition: box-shadow var(--app-duration) var(--app-ease);
}

    .app-info-card:hover {
        box-shadow: var(--app-shadow-lg) !important;
    }


/* ==========================================================================
   26. MEDICATION QUOTE DIALOG — right-panel info mini-card
   A compact property mini-card used in the right panel of the quote dialog
   for displaying read-only medication meta (strength, package size, etc.).
   ========================================================================== */

/* Compact medication info mini-card (border-left accent, subtle bg) */
.app-med-info-card {
    background: var(--app-surface-subtle) !important;
    border-left: 4px solid var(--app-primary) !important;
    border-radius: var(--app-radius-control) !important;
}

/* Property label inside the mini-card */
.app-med-info-label {
    font-size: .7rem;
    font-weight: 700;
    color: var(--app-text-label);
    text-transform: uppercase;
    letter-spacing: .4px;
}

/* Dispense grid sticky header fix (applied from the dialog class scope) */
.app-dispense-grid .mud-table-sticky-header thead tr th {
    position: sticky !important;
    top: 0 !important;
    z-index: 2 !important;
    background-color: var(--app-surface) !important;
}


/* ==========================================================================
   27. TOTAL AMOUNT SUMMARY CHIP
   A small pill-shaped total amount panel used at the bottom of quote tables.
   ========================================================================== */
.app-total-chip {
    display: inline-flex;
    align-items: center;
    padding: 10px 20px;
    border-radius: var(--app-radius-control);
    background: var(--app-primary-soft-bg);
    border: 1px solid var(--app-border-soft);
}

.app-total-chip-label {
    font-size: 1rem;
    font-weight: 600;
    color: var(--app-primary);
}


/* ==========================================================================
   29. FORM SECTIONS
   Logical sub-sections inside a single form card. Compact alternative to
   nested cards — gives groups of related fields a small icon-prefixed
   header and a thin top divider, without burning vertical space the way
   a separate MudCard would.

   Usage:
     <div class="app-form-section">
       <div class="app-form-section-title">
         <MudIcon Icon="..." />
         <span>Section Title</span>
       </div>
       <MudGrid> ... fields ... </MudGrid>
     </div>
   ========================================================================== */
.app-form-section {
    padding-top: 16px;
    margin-top: 4px;
    border-top: 1px solid var(--app-divider);
}

    .app-form-section:first-of-type {
        border-top: none;
        padding-top: 0;
        margin-top: 0;
    }

.app-form-section-title {
    display: flex;
    align-items: center;
    gap: 8px;
    margin-bottom: 12px;
    font-size: .82rem;
    font-weight: 700;
    color: var(--app-text-strong);
    text-transform: uppercase;
    letter-spacing: .5px;
}

    .app-form-section-title .mud-icon-root {
        color: var(--app-primary);
        font-size: 1.1rem !important;
    }


/* ==========================================================================
   30. SELECTED ITEM BANNER
   A prominent card-style banner that displays a "currently selected" entity
   (e.g. the drug being wasted). Larger than .app-info-item, smaller than
   a status hero card. Used at the top of forms where the user needs to be
   constantly reminded what subject they're editing.
   ========================================================================== */
.app-selected-banner {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 16px;
    padding: 16px 20px;
    border-radius: var(--app-radius-card);
    background: var(--app-surface);
    border: 1px solid var(--app-border-soft);
    border-left: 4px solid var(--app-primary);
    box-shadow: var(--app-shadow-sm);
}

.app-selected-banner-icon {
    width: 44px;
    height: 44px;
    border-radius: 12px;
    display: flex;
    align-items: center;
    justify-content: center;
    flex-shrink: 0;
    background: var(--app-icon-blue-bg);
    color: var(--app-icon-blue-fg);
}

.app-selected-banner-body {
    flex: 1;
    min-width: 0;
    display: flex;
    flex-direction: column;
    gap: 2px;
}

.app-selected-banner-eyebrow {
    font-size: .68rem;
    font-weight: 700;
    color: var(--app-text-label);
    text-transform: uppercase;
    letter-spacing: .6px;
}

.app-selected-banner-title {
    font-size: 1.05rem;
    font-weight: 700;
    color: var(--app-text-strong);
    line-height: 1.25;
}

.app-selected-banner-meta {
    display: flex;
    flex-wrap: wrap;
    gap: 8px 14px;
    margin-top: 4px;
    font-size: .78rem;
    color: var(--app-text-muted);
}

    .app-selected-banner-meta strong {
        color: var(--app-text-strong);
        font-weight: 600;
    }


/* ==========================================================================
   31. WASTE DIALOG HERO
   Compact hero strip used at the top of detail dialogs (e.g.
   WasteTransactionDetailsDialog) to surface the most important facts
   before the detail grid. Uses the app primary blue palette.
   ========================================================================== */
.app-dialog-hero {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 20px;
    padding: 20px 24px;
    border-radius: var(--app-radius-card);
    margin-bottom: 20px;
    color: #ffffff;
    background: linear-gradient(135deg, #2d5080 0%, #395c80 60%, #4a6f9a 100%);
    box-shadow: var(--app-shadow-md);
}

body.mud-theme-dark .app-dialog-hero {
    background: linear-gradient(135deg, #1e3a5f 0%, #2d5080 60%, #395c80 100%);
}

.app-dialog-hero-left {
    display: flex;
    flex-direction: column;
    gap: 4px;
    min-width: 0;
}

.app-dialog-hero-eyebrow {
    font-size: .72rem;
    font-weight: 600;
    letter-spacing: .6px;
    text-transform: uppercase;
    opacity: .85;
}

.app-dialog-hero-title {
    font-size: 1.25rem;
    font-weight: 700;
    line-height: 1.25;
    letter-spacing: -.2px;
}

.app-dialog-hero-sub {
    font-size: .8rem;
    opacity: .85;
}

.app-dialog-hero-stat {
    display: flex;
    flex-direction: column;
    align-items: flex-end;
    flex-shrink: 0;
}

.app-dialog-hero-stat-label {
    font-size: .7rem;
    font-weight: 600;
    letter-spacing: .5px;
    text-transform: uppercase;
    opacity: .85;
}

.app-dialog-hero-stat-value {
    font-size: 1.7rem;
    font-weight: 700;
    line-height: 1.1;
    letter-spacing: -.4px;
}

@media (max-width: 600px) {
    .app-dialog-hero {
        flex-direction: column;
        align-items: flex-start;
        gap: 12px;
    }

    .app-dialog-hero-stat {
        align-items: flex-start;
    }

    .app-selected-banner {
        flex-direction: column;
        align-items: flex-start;
    }
}


/* ==========================================================================
   32. DIALOG TITLE BLOCK
   Reusable header strip for MudDialog <TitleContent> slots: leading icon
   in a soft pastel tile + heading + subtle eyebrow line. Replaces the
   ad-hoc inline `display:flex; gap:12px;` pattern used across detail
   dialogs so the spacing/typography stay consistent.

   Usage:
     <TitleContent>
       <div class="app-dialog-title-block">
         <div class="app-dialog-title-icon"><MudIcon Icon="..." /></div>
         <div class="app-dialog-title-text">
           <span class="app-dialog-title">Title</span>
           <span class="app-dialog-title-sub">Subtitle</span>
         </div>
       </div>
     </TitleContent>
   ========================================================================== */
.app-dialog-title-block {
    display: flex;
    align-items: center;
    gap: 12px;
    min-width: 0;
}

.app-dialog-title-icon {
    width: 40px;
    height: 40px;
    border-radius: 12px;
    display: flex;
    align-items: center;
    justify-content: center;
    flex-shrink: 0;
    background: var(--app-icon-blue-bg);
    color: var(--app-icon-blue-fg);
}

    .app-dialog-title-icon .mud-icon-root {
        font-size: 1.4rem !important;
    }

.app-dialog-title-text {
    display: flex;
    flex-direction: column;
    gap: 2px;
    min-width: 0;
}

.app-dialog-title {
    font-size: 1.15rem;
    font-weight: 700;
    color: var(--app-text-strong);
    letter-spacing: -.2px;
    line-height: 1.2;
}

.app-dialog-title-sub {
    font-size: .78rem;
    color: var(--app-text-muted);
    letter-spacing: .2px;
}


/* ==========================================================================
   33. QUOTE SUMMARY BAR
   Enhanced total summary for the PriceQuote page. Two stats side-by-side
   (item count + total amount), aligned to the right of the quote table.
   Sits above .app-total-chip in visual weight without becoming a hero.
   ========================================================================== */
.app-quote-summary {
    display: inline-flex;
    align-items: stretch;
    gap: 0;
    border-radius: var(--app-radius-control);
    background: var(--app-primary-soft-bg);
    border: 1px solid var(--app-border-soft);
    overflow: hidden;
}

.app-quote-summary-cell {
    display: flex;
    flex-direction: column;
    gap: 2px;
    padding: 10px 18px;
    min-width: 0;
}

    .app-quote-summary-cell + .app-quote-summary-cell {
        border-left: 1px solid var(--app-border-soft);
    }

.app-quote-summary-label {
    font-size: .68rem;
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: .6px;
    color: var(--app-text-label);
}

.app-quote-summary-value {
    font-size: 1.05rem;
    font-weight: 700;
    color: var(--app-text-strong);
    letter-spacing: -.2px;
}

.app-quote-summary-value--primary {
    color: var(--app-primary);
}


/* ==========================================================================
   34. STAT FILTER CARDS
   Clickable summary tiles that double as status filters (cycle-fill and
   facility-alert dashboards). A big number + small label; clicking filters
   the grid below. The --active modifier ring shows the current selection.
   The numeric value uses a color modifier so each status reads at a glance
   while still inheriting dark-mode-safe tokens.

   Usage:
     <div class="app-stat-card app-stat-card--active" @onclick="...">
       <span class="app-stat-value app-stat-value--info">12</span>
       <span class="app-stat-label">New</span>
     </div>
   ========================================================================== */
.app-stat-card {
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    gap: 4px;
    padding: 18px 16px;
    height: 100%;
    background: var(--app-surface);
    border-radius: var(--app-radius-card);
    border: 1px solid var(--app-border-subtle);
    box-shadow: var(--app-shadow-sm);
    cursor: pointer;
    transition: box-shadow var(--app-duration) var(--app-ease), transform var(--app-duration) var(--app-ease), border-color var(--app-duration) var(--app-ease);
}

    .app-stat-card:hover {
        box-shadow: var(--app-shadow-lg);
        transform: translateY(-3px);
    }

.app-stat-card--active {
    border-color: var(--app-primary);
    box-shadow: var(--app-shadow-md), inset 0 0 0 1px var(--app-primary);
}

.app-stat-value {
    font-size: 2rem;
    font-weight: 700;
    line-height: 1.1;
    letter-spacing: -.5px;
    color: var(--app-text-strong);
}

.app-stat-value--primary {
    color: var(--app-primary);
}

.app-stat-value--info {
    color: var(--app-icon-blue-fg);
}

.app-stat-value--success {
    color: var(--app-icon-emerald-fg);
}

.app-stat-value--warning {
    color: var(--app-icon-amber-fg);
}

.app-stat-value--error {
    color: var(--app-icon-rose-fg);
}

.app-stat-value--muted {
    color: var(--app-text-muted);
}

.app-stat-label {
    display: flex;
    align-items: center;
    gap: 4px;
    font-size: .8rem;
    font-weight: 600;
    color: var(--app-text-muted);
    text-align: center;
}


/* ==========================================================================
   35. STAT STRIP
   Compact horizontal mini-tiles for an inline metric bar (batch detail
   pages: Total / Not Reviewed / Send / Do Not Send). Lighter than a KPI
   card — a label on the left, value on the right, in a soft-surface pill.
   ========================================================================== */
.app-stat-tile {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 10px;
    padding: 12px 16px;
    height: 100%;
    background: var(--app-surface);
    border-radius: var(--app-radius-panel);
    border: 1px solid var(--app-border-subtle);
    box-shadow: var(--app-shadow-sm);
}

.app-stat-tile-label {
    font-size: .78rem;
    font-weight: 600;
    color: var(--app-text-muted);
    text-transform: uppercase;
    letter-spacing: .4px;
}

.app-stat-tile-value {
    font-size: 1.35rem;
    font-weight: 700;
    line-height: 1;
    letter-spacing: -.3px;
    color: var(--app-text-strong);
}

.app-stat-tile-value--success {
    color: var(--app-icon-emerald-fg);
}

.app-stat-tile-value--warning {
    color: var(--app-icon-amber-fg);
}

.app-stat-tile-value--error {
    color: var(--app-icon-rose-fg);
}

.app-stat-tile-value--muted {
    color: var(--app-text-muted);
}


/* ==========================================================================
   36. REVIEW LIST (grouped patient rows in cycle-fill batch detail)
   A card holding a sticky, clickable group header and a list of item rows.
   Replaces the ad-hoc per-file <style> sticky header + raw MudPaper rows.
   ========================================================================== */
.app-review-group {
    background: var(--app-surface);
    border-radius: var(--app-radius-card);
    border: 1px solid var(--app-border-subtle);
    box-shadow: var(--app-shadow-sm);
    overflow: hidden;
}

.app-review-group-header {
    position: sticky;
    top: 0;
    z-index: 10;
    display: flex;
    align-items: center;
    gap: 8px;
    padding: 12px 16px;
    background: var(--app-surface-subtle);
    border-bottom: 1px solid var(--app-divider);
    cursor: pointer;
    transition: background var(--app-duration) var(--app-ease);
}

    .app-review-group-header:hover {
        background: var(--app-surface-hover);
    }

.app-review-row {
    display: flex;
    align-items: center;
    gap: 12px;
    padding: 12px 16px;
    border-bottom: 1px solid var(--app-divider);
}

    .app-review-row:last-child {
        border-bottom: none;
    }

.app-review-row--processed {
    background: var(--app-up-bg);
}

.app-review-row--skipped {
    background: var(--app-icon-amber-bg);
}

.app-review-note {
    display: inline-block;
    margin-top: 6px;
    padding: 6px 10px;
    border-radius: 8px;
    background: var(--app-icon-amber-bg);
    color: var(--app-icon-amber-fg);
    font-size: .78rem;
    font-weight: 500;
}


/* ==========================================================================
   37. DETAIL HERO HEADER (alert / record detail top banner)
   White card with a primary left accent for a record's headline +
   status chips. Replaces inline `border-left: 6px solid` MudPaper.
   ========================================================================== */
.app-detail-hero {
    display: flex;
    justify-content: space-between;
    align-items: flex-start;
    flex-wrap: wrap;
    gap: 12px;
    padding: 24px;
    background: var(--app-surface);
    border-radius: var(--app-radius-card);
    border: 1px solid var(--app-border-subtle);
    border-left: 5px solid var(--app-primary);
    box-shadow: var(--app-shadow-sm);
}

.app-detail-hero-eyebrow {
    font-size: .72rem;
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: .6px;
    color: var(--app-text-label);
}

.app-detail-hero-title {
    font-size: 1.4rem;
    font-weight: 700;
    color: var(--app-text-strong);
    letter-spacing: -.3px;
    line-height: 1.25;
}

.app-detail-hero-meta {
    font-size: .85rem;
    color: var(--app-text-muted);
    margin-top: 4px;
}


/* ==========================================================================
   38. CODE / DIFF BLOCK
   Monospace panel for raw JSON / preformatted text (e.g. audit-log diff
   old vs. new value). Replaces ad-hoc hard-coded pastel backgrounds so the
   block reads correctly in dark mode. Optional --old / --new tints carry a
   subtle left accent (rose = previous value, emerald = new value) instead
   of full-bleed colored fills.
   ========================================================================== */
.app-code-block {
    margin: 0;
    padding: 12px 14px;
    border-radius: var(--app-radius-control);
    background: var(--app-surface-subtle);
    border: 1px solid var(--app-border-soft);
    font-family: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace;
    font-size: .8rem;
    line-height: 1.5;
    color: var(--app-text);
    white-space: pre-wrap;
    word-break: break-word;
    overflow-x: auto;
}

.app-code-block--old {
    border-left: 3px solid var(--app-icon-rose-fg);
}

.app-code-block--new {
    border-left: 3px solid var(--app-icon-emerald-fg);
}
