/* CellHub custom styles — minimal overrides on top of Bootstrap 5 */

/* =============================================================================
   Visual refresh — Phase 1 (2026-07-10)
   Bootstrap 5.3 CSS-variable overrides + per-module color tokens + sidebar
   icon tiles. Scope is deliberately narrow: sidebar top-level nav + headings
   only. No icon-font swap, no new JS framework — see the design-preview
   artifact for the fuller direction and why those were cut for this phase.
   ============================================================================= */
:root {
    /* softer Bootstrap surface tokens (cascades everywhere for free) */
    --bs-border-radius: .625rem;
    --bs-border-radius-sm: .5rem;
    --bs-border-radius-lg: .75rem;
    --bs-border-color: #E4E7EE;
    --bs-box-shadow-sm: 0 1px 2px rgba(20, 20, 35, .06);

    /* one soft pastel token pair per module — background + icon color */
    --mod-inv-bg: #E8ECFC; --mod-inv-fg: #3C4FC0;   /* Inventory — blue */
    --mod-auc-bg: #FBF0DF; --mod-auc-fg: #96701F;   /* Auctions — amber */
    --mod-pcb-bg: #E1F3EF; --mod-pcb-fg: #1F6E5D;   /* PC Batch — teal */
    --mod-shp-bg: #EFEAFB; --mod-shp-fg: #6A4EB0;   /* Shipping — violet */
    --mod-ret-bg: #FCEAF1; --mod-ret-fg: #A4416E;   /* Retail / CT — rose */
    --mod-cfo-bg: #E7F5E9; --mod-cfo-fg: #2E7A45;   /* CFO — green */
    --mod-ops-bg: #FBEAE3; --mod-ops-fg: #A85426;   /* Operations — terracotta */
    --mod-tbl-bg: #FBF3D6; --mod-tbl-fg: #7E621E;   /* TurboLister — mustard */
    --mod-adm-bg: #ECEDF0; --mod-adm-fg: #464E59;   /* Admin — slate */

    /* The brand mark isn't a module — a touch more saturated than the
       nav tiles so it reads as the one "flagship" mark, not a 10th module. */
    --brand-bg: #DCE6FF; --brand-fg: #2F5FD6;
}

@font-face {
    font-family: 'Manrope';
    font-style: normal;
    font-weight: 800;
    font-display: swap;
    src: url('../fonts/manrope-800.woff2') format('woff2');
}
h1, h2, h3, h4, h5, h6, .navbar-text.fw-semibold, .sb-brand .fs-5 {
    font-family: 'Manrope', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
    font-weight: 800;
    letter-spacing: -.01em;
}

/* Sidebar module icon tiles — wraps the existing bi-* glyph, no icon swap.
   .sb-tile = top-level nav (26px). .sb-tile-sm = sub-nav, same module
   colors at a smaller footprint so it doesn't compete with its parent. */
.sb-tile, .sb-tile-sm {
    border-radius: 8px;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    flex: 0 0 auto;
    transition: transform .15s ease, box-shadow .15s ease;
}
.sb-tile { width: 26px; height: 26px; margin-right: .55rem; }
.sb-tile-sm { width: 19px; height: 19px; border-radius: 6px; margin-right: .45rem; }
.sb-tile > i { font-size: .82rem; line-height: 1; }
.sb-tile-sm > i { font-size: .68rem; line-height: 1; }
.sidebar .nav-link:hover .sb-tile,
.sidebar .nav-link:hover .sb-tile-sm { transform: scale(1.08); }
.sidebar .nav-link.active .sb-tile,
.sidebar .nav-link.sb-sub-active .sb-tile-sm { box-shadow: 0 0 0 1px rgba(255, 255, 255, .18); }

.sb-tile.inv, .sb-tile-sm.inv { background: var(--mod-inv-bg); color: var(--mod-inv-fg); }
.sb-tile.auc, .sb-tile-sm.auc { background: var(--mod-auc-bg); color: var(--mod-auc-fg); }
.sb-tile.pcb, .sb-tile-sm.pcb { background: var(--mod-pcb-bg); color: var(--mod-pcb-fg); }
.sb-tile.shp, .sb-tile-sm.shp { background: var(--mod-shp-bg); color: var(--mod-shp-fg); }
.sb-tile.ret, .sb-tile-sm.ret { background: var(--mod-ret-bg); color: var(--mod-ret-fg); }
.sb-tile.cfo, .sb-tile-sm.cfo { background: var(--mod-cfo-bg); color: var(--mod-cfo-fg); }
.sb-tile.ops, .sb-tile-sm.ops { background: var(--mod-ops-bg); color: var(--mod-ops-fg); }
.sb-tile.tbl, .sb-tile-sm.tbl { background: var(--mod-tbl-bg); color: var(--mod-tbl-fg); }
.sb-tile.adm, .sb-tile-sm.adm { background: var(--mod-adm-bg); color: var(--mod-adm-fg); }

/* Brand mark — the CellHub wordmark icon at the top of the sidebar. A
   little more character than a nav tile: it tilts and pops slightly on
   hover since it's the one clickable "home" link with no module of its
   own. Spring-ish easing (not the flat ease used elsewhere) so it feels
   distinct from a plain nav-item hover. */
.sb-brand-tile {
    width: 30px;
    height: 30px;
    border-radius: 9px;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    flex: 0 0 auto;
    margin-right: .55rem;
    background: var(--brand-bg);
    color: var(--brand-fg);
    transition: transform .25s cubic-bezier(.34, 1.56, .64, 1), box-shadow .2s ease;
}
.sb-brand-tile > i { font-size: 1rem; line-height: 1; }
.sb-brand:hover .sb-brand-tile {
    transform: scale(1.1) rotate(-6deg);
    box-shadow: 0 0 0 1px rgba(255, 255, 255, .2), var(--bs-box-shadow-sm);
}
@media (prefers-reduced-motion: reduce) {
    .sb-brand-tile { transition: none; }
    .sb-brand:hover .sb-brand-tile { transform: none; }
}

/* Larger brand tile — login card logo (same identity as the sidebar mark,
   just bigger since it's standing alone with no nav row around it). */
.brand-tile-lg {
    width: 64px;
    height: 64px;
    border-radius: 16px;
    background: var(--brand-bg);
    color: var(--brand-fg);
}
.brand-tile-lg > i { font-size: 1.8rem; }

/* Feedback FAB — small lift on hover, consistent with the rest of the
   refresh's interactive chrome. */
#feedback-btn { transition: transform .15s ease, box-shadow .15s ease; }
#feedback-btn:hover { transform: scale(1.06); }
@media (prefers-reduced-motion: reduce) {
    #feedback-btn { transition: none; }
    #feedback-btn:hover { transform: none; }
}

/* Collapsed sidebar: tiles stay visible/centered, text hidden (see the
   font-size:0 collapse trick further down this file). Overrides the
   `.nav-link > i` margin rule since the icon is now one level deeper,
   wrapped in .sb-tile. */
html.sb-collapsed nav.sidebar .nav-link .sb-tile {
    margin-right: 0 !important;
}

/* -----------------------------------------------------------------------
   Visual refresh — Phase 1b (2026-07-10)
   PC Batch wizard chrome: the shared stepper (_stepper.html, all 7 batch
   pages) + the review-page header action row. Deliberately skips the
   dense review grid itself — too many rows for hover/lift treatment to
   read as anything but noise.
   ----------------------------------------------------------------------- */
.pcr-step { transition: transform .15s ease, box-shadow .15s ease; }
a.pcr-step:hover { transform: translateY(-1px); box-shadow: var(--bs-box-shadow-sm); }
/* "You are here" — tinted with the PC Batch module color instead of
   generic Bootstrap primary, so the wizard chrome reads as part of the
   same module as its sidebar tile. */
.pcr-step-current { background: var(--mod-pcb-fg, #1F6E5D); color: #fff; }

.pcr-hdr-btn { transition: transform .15s ease, box-shadow .15s ease; }
.pcr-hdr-btn:hover { transform: translateY(-1px); box-shadow: var(--bs-box-shadow-sm); }

/* Issues chip strip (_count_strip.html) — these are siblings of the grid,
   not ancestors of its Popper-positioned column filters, so a transform
   hover here carries none of the containing-block risk that ruled out
   touching the grid itself. */
.pcr-chip { transition: transform .15s ease, box-shadow .15s ease; }
a.pcr-chip:hover { transform: translateY(-1px); box-shadow: var(--bs-box-shadow-sm); }

/* Remove number-input spinner buttons site-wide (Chrome/Edge/Safari + Firefox).
   The up/down steppers were error-prone on the data-entry grids; typing,
   validation, and inputmode are unchanged — this only hides the arrows. */
input[type="number"]::-webkit-inner-spin-button,
input[type="number"]::-webkit-outer-spin-button {
    -webkit-appearance: none;
    margin: 0;
}
input[type="number"] {
    -moz-appearance: textfield;
    appearance: textfield;
}

/* Sidebar active link highlight (top-level nav).
   2026-05-27: bumped from a faint white tint to a Bootstrap-primary
   accent so the active module is obvious at a glance. Sub-nav (.sb-sub-active)
   uses the same palette one notch lighter, so an inventory page reads as
   "Inventory (selected) > Items (selected)" without ambiguity. */
.sidebar .nav-link.active {
    background-color: rgba(13, 110, 253, 0.30);    /* Bootstrap primary @ 30% */
    border-left: 3px solid #0d6efd;
    padding-left: calc(1rem - 3px);                /* default nav-link px is 1rem */
    color: #fff !important;
    font-weight: 600;
}

/* Sub-nav (ms-3 children) get the same accent at a lighter tint so the
   parent + child both light up without competing. */
.sidebar .nav-link.sb-sub-active {
    background-color: rgba(13, 110, 253, 0.22);    /* Bootstrap primary @ 22% */
    border-left: 3px solid #0d6efd;
    padding-left: calc(0.75rem - 3px);             /* sub-nav default px is 0.75rem */
    color: #fff !important;
    font-weight: 500;
}

/* Sidebar hover */
.sidebar .nav-link:hover:not(.disabled):not(.active):not(.sb-sub-active) {
    background-color: rgba(255, 255, 255, 0.08);
}

/* Sidebar — default (expanded) state */
nav.sidebar {
    width: 240px;
    min-height: 100vh;
    transition: width .15s ease;
}

/* Toggle chevron button — visible in both states */
#sb-toggle {
    background: transparent;
    border: none;
    color: rgba(255, 255, 255, .55);
    padding: .15rem .35rem;
    border-radius: .25rem;
    cursor: pointer;
    line-height: 1;
}
#sb-toggle:hover {
    color: #fff;
    background: rgba(255, 255, 255, .08);
}

/* ─── Collapsed state ─────────────────────────────────────────────── */
html.sb-collapsed nav.sidebar {
    width: 64px;
    padding-left: .5rem !important;
    padding-right: .5rem !important;
}

/* In collapsed mode: brand text gone, brand row centers the toggle.
   Chevron rotates 180° so it points right (= "expand"). */
html.sb-collapsed nav.sidebar .sb-brand { display: none !important; }
html.sb-collapsed nav.sidebar .sb-brand-row { justify-content: center !important; }

/* Hide labels via font-size:0 trick; restore icons. Hide badges,
   hr dividers, and any element flagged .sb-hide. */
html.sb-collapsed nav.sidebar .nav-link {
    font-size: 0 !important;
    text-align: center;
    padding-left: 0 !important;
    padding-right: 0 !important;
}
html.sb-collapsed nav.sidebar .nav-link > i {
    font-size: 1.1rem !important;
    margin-right: 0 !important;
}
html.sb-collapsed nav.sidebar .nav-link > span,
html.sb-collapsed nav.sidebar .nav-link > .badge,
html.sb-collapsed nav.sidebar .sb-hide,
html.sb-collapsed nav.sidebar hr {
    display: none !important;
}

/* Sub-nav items: drop ms-3 indent, shrink icon slightly so hierarchy
   reads even when text is hidden. ps-4 catches shipping's sub-items.
   Icons are now wrapped in .sb-tile-sm (see Phase 1 block above), so the
   old `.nav-link > i` selector no longer matches — target the tile and
   let its own icon rule (.sb-tile-sm > i) handle size. */
html.sb-collapsed nav.sidebar li.ms-3 { margin-left: 0 !important; }
html.sb-collapsed nav.sidebar li.ms-3 .nav-link > i,
html.sb-collapsed nav.sidebar .nav-link.ps-4 > i {
    font-size: .9rem !important;
    opacity: .85;
}
html.sb-collapsed nav.sidebar li.ms-3 .nav-link .sb-tile-sm,
html.sb-collapsed nav.sidebar .nav-link.ps-4 .sb-tile-sm {
    margin-right: 0 !important;
    opacity: .9;
}

/* ─── Sidebar "Jump to…" quick-nav ────────────────────────────────
   Markup: templates/base.html (#sb-jump). Logic: static/js/nav_jump.js.
   Destinations: app/nav_registry.py.
   The results panel deliberately overflows the sidebar's 240px width —
   nav.sidebar sets no overflow, so nothing clips it. */
.sb-jump {
    position: relative;
}
.sb-jump-icon {
    position: absolute;
    left: .55rem;
    top: 50%;
    transform: translateY(-50%);
    font-size: .8rem;
    color: rgba(255, 255, 255, .45);
    pointer-events: none;
}
.sb-jump-input {
    width: 100%;
    padding: .35rem 3rem .35rem 1.85rem;
    font-size: .82rem;
    line-height: 1.3;
    color: #fff;
    background: rgba(255, 255, 255, .08);
    border: 1px solid rgba(255, 255, 255, .14);
    border-radius: .375rem;
    outline: none;
}
.sb-jump-input::placeholder { color: rgba(255, 255, 255, .45); }
.sb-jump-input:focus {
    background: rgba(255, 255, 255, .14);
    border-color: rgba(255, 255, 255, .35);
}
.sb-jump-kbd {
    position: absolute;
    right: .4rem;
    top: 50%;
    transform: translateY(-50%);
    font-size: .6rem;
    padding: .1rem .3rem;
    color: rgba(255, 255, 255, .45);
    background: rgba(255, 255, 255, .07);
    border-radius: .2rem;
    pointer-events: none;
}
.sb-jump-results {
    position: absolute;
    z-index: 1040;
    top: calc(100% + .3rem);
    left: 0;
    width: 278px;
    max-height: 22rem;
    overflow-y: auto;
    background: #fff;
    border: 1px solid rgba(0, 0, 0, .1);
    border-radius: .5rem;
    box-shadow: 0 .5rem 1.25rem rgba(0, 0, 0, .22);
    padding: .25rem;
}
.sb-jump-head {
    font-size: .65rem;
    text-transform: uppercase;
    letter-spacing: .04em;
    color: #6c757d;
    padding: .3rem .5rem .2rem;
}
.sb-jump-empty {
    font-size: .8rem;
    color: #6c757d;
    padding: .55rem .6rem;
}
.sb-jump-row {
    display: flex;
    align-items: center;
    gap: .1rem;
    padding: .3rem .45rem;
    border-radius: .375rem;
    text-decoration: none;
    color: #212529;
}
.sb-jump-row.is-active,
.sb-jump-row:hover { background: #eef1f6; }
.sb-jump-txt {
    display: flex;
    flex-direction: column;
    line-height: 1.15;
    min-width: 0;
}
.sb-jump-sect {
    font-size: .62rem;
    text-transform: uppercase;
    letter-spacing: .03em;
    color: #8a93a0;
}
.sb-jump-lbl {
    font-size: .84rem;
    font-weight: 500;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}

/* Make flash messages slightly compact */
.alert {
    padding: 0.5rem 0.75rem;
}

/* =============================================================================
   Retail — Transaction Status Palette (single source of truth)
   Used by: history.html Status pill + Resume button, _trans_panel.html badge.
   Status values: Open / Layaway / Complete / Refunded
   ============================================================================= */
:root {
    --status-open-bg:        #0d6efd;   /* neutral blue */
    --status-open-fg:        #ffffff;
    --status-open-border:    #0a58ca;
    --status-open-soft-bg:   #cfe2ff;
    --status-open-soft-fg:   #084298;

    --status-layaway-bg:     #fd7e14;   /* amber / orange */
    --status-layaway-fg:     #ffffff;
    --status-layaway-border: #d96708;
    --status-layaway-soft-bg: #ffe5d0;
    --status-layaway-soft-fg: #8a4300;

    --status-complete-bg:    #198754;   /* green */
    --status-complete-fg:    #ffffff;
    --status-complete-border:#146c43;
    --status-complete-soft-bg:#d1e7dd;
    --status-complete-soft-fg:#0f5132;

    --status-refunded-bg:    #6c757d;   /* muted grey */
    --status-refunded-fg:    #ffffff;
    --status-refunded-border:#565e64;
    --status-refunded-soft-bg:#e2e3e5;
    --status-refunded-soft-fg:#41464b;
}

/* Solid pill — used for the Status badge on both trans panel and history row */
.status-pill {
    display: inline-block;
    font-size: .72rem;
    font-weight: 600;
    padding: .22rem .55rem;
    border-radius: .35rem;
    line-height: 1;
    letter-spacing: .02em;
}
.status-open     { background-color: var(--status-open-bg);     color: var(--status-open-fg); }
.status-layaway  { background-color: var(--status-layaway-bg);  color: var(--status-layaway-fg); }
.status-complete { background-color: var(--status-complete-bg); color: var(--status-complete-fg); }
.status-refunded { background-color: var(--status-refunded-bg); color: var(--status-refunded-fg); }

/* Outlined button (Resume on history.html) — inherits pill color */
.btn-status-open {
    color: var(--status-open-bg);
    border: 1px solid var(--status-open-bg);
    background-color: transparent;
}
.btn-status-open:hover { background-color: var(--status-open-bg); color: var(--status-open-fg); }

.btn-status-layaway {
    color: var(--status-layaway-bg);
    border: 1px solid var(--status-layaway-bg);
    background-color: transparent;
}
.btn-status-layaway:hover { background-color: var(--status-layaway-bg); color: var(--status-layaway-fg); }

/* ─────────────────────────────────────────────────────────────────────────
   PC Batch — Review filter popover layout (2026-06-05, rev 3)

   Goal: the Apply button must ALWAYS be reachable, and scrolling the chip
   list must NOT make the popover drift off-screen.

   Bug (rev 2): the menu is position:fixed, positioned by Popper
   (data-bs-display="dynamic" + strategy="fixed"). Wheel-scrolling past the
   chip list's scroll boundary CHAINED out to scroll the table/page; that
   scroll fired events Popper listens to, so Popper re-positioned the fixed
   menu against the now-moved trigger and shifted it off the left edge
   ("goes to the side"), taking the Apply footer off-screen with it.

   Fix:
     1. `overscroll-behavior: contain` on the menu AND the chip list traps
        the wheel inside the popover — nothing else scrolls, so Popper
        never repositions.
     2. A bounded flex column (the chip list is the ONLY scroller; header +
        Apply footer are flex-none and always visible). This is the flex
        approach rev 2 said "didn't hold" — it holds now because every
        intermediate (body, form) is `display:flex; min-height:0`, the
        gotcha the earlier attempt missed. Flex is scoped to `.show` so it
        can NOT reintroduce the "all popovers open at once" bug — when
        closed, base `.dropdown-menu { display:none }` still wins. */
.pc-filter-dropdown {
    max-height: 85vh;
    overflow: hidden;                 /* chip list is the only scroller */
    overscroll-behavior: contain;     /* trap the wheel — no page/table scroll */
}
.pc-filter-dropdown.show {
    display: flex;
    flex-direction: column;
}
/* Flex chain: every intermediate must be a flex column that can shrink
   (min-height:0) or the chip list won't get a bounded height to scroll in. */
.pc-filter-dropdown .pc-filter-popover-body,
.pc-filter-dropdown .pc-filter-popover-form {
    display: flex;
    flex-direction: column;
    flex: 1 1 auto;
    min-height: 0;
}
/* The chip list flexes to fill the leftover space and scrolls inside it.
   max-height:none overrides the template's inline 22em so flex owns height. */
.pc-filter-dropdown .pc-chip-list,
.pc-filter-dropdown .pc-search-chips {
    flex: 1 1 auto;
    min-height: 4rem;
    max-height: none !important;
    overflow-y: auto;
    overscroll-behavior: contain;
}
/* Apply footer is flex-none — structurally pinned at the column bottom,
   always visible (no sticky/z-index gymnastics needed). */
.pc-filter-dropdown .pc-filter-popover-form > .d-flex.justify-content-end {
    flex: 0 0 auto;
    background: var(--bs-body-bg, #fff);
    border-top: 1px solid var(--bs-border-color, #dee2e6);
    padding-top: .5rem;
    margin-top: .25rem;
}

/* ─────────────────────────────────────────────────────────────────────────
   Shared grid filter popover (gf-*) — 2026-07-30

   The `pc-*` rules above are PC Batch's copy of this same pattern. These are
   the extracted, module-neutral version used by `_macros/grid_filter.html`
   + `static/js/grid_filter.js`. Same structure, same reasons: the flex chain
   exists so a long chip list scrolls INSIDE the popover while the Sort row
   and the Apply footer stay pinned and reachable. Flex is scoped to `.show`
   so it cannot reintroduce "every popover open at once" — when closed, the
   base `.dropdown-menu { display:none }` still wins.
   ───────────────────────────────────────────────────────────────────────── */
.gf-filter-dropdown {
    max-height: 85vh;
    /* A cap is required, not cosmetic. Without it a column of long values
       (Unlock Codes' Item, 133 of them) stretches the menu to whatever the
       widest label needs; right-aligned to its header that runs off the left
       edge of the page and the labels end up under the sidebar. */
    max-width: min(26em, 90vw);
    overflow: hidden;                 /* the chip list is the only scroller */
    overscroll-behavior: contain;     /* trap the wheel — no page scroll */
}
/* A flex child only truncates if it may shrink below its content width;
   `text-truncate` alone does not grant that inside a flex row. */
.gf-filter-dropdown .gf-chip-row > span,
.gf-filter-dropdown .gf-search-chip > span {
    min-width: 0;
}
/* Raised by grid_filter.js while this column's popover is open — see there
   for why a plain z-index on the menu cannot work. */
.gf-th-open { z-index: 1080 !important; }
.gf-filter-dropdown.show {
    display: flex;
    flex-direction: column;
}
/* Every intermediate must be a shrinkable flex column (min-height:0) or the
   chip list never gets a bounded height to scroll within. */
.gf-filter-dropdown .gf-popover-body,
.gf-filter-dropdown .gf-popover-form {
    display: flex;
    flex-direction: column;
    flex: 1 1 auto;
    min-height: 0;
}
.gf-filter-dropdown .gf-chip-list,
.gf-filter-dropdown .gf-search-chips {
    flex: 1 1 auto;
    min-height: 4rem;
    max-height: none !important;
    overflow-y: auto;
    overscroll-behavior: contain;
}
/* Apply footer is flex-none — structurally pinned, no sticky/z-index tricks. */
.gf-filter-dropdown .gf-popover-form > .d-flex.justify-content-end {
    flex: 0 0 auto;
    background: var(--bs-body-bg, #fff);
    border-top: 1px solid var(--bs-border-color, #dee2e6);
    padding-top: .5rem;
    margin-top: .25rem;
}
/* All / None were bare links and operators found them finicky to hit. */
.gf-popover-form .gf-popover-bulk {
    display: inline-flex;
    gap: .25rem;
}
.gf-popover-form .gf-popover-bulk .btn {
    padding: .05rem .4rem;
    line-height: 1.2;
    font-size: .78rem;
}
/* Header label sits flush against its funnel; the funnel is not a sort
   control, so it must not look like part of the clickable label. */
.gf-th-label { white-space: nowrap; }
.gf-active-chips .badge { font-weight: 500; }

/* ─────────────────────────────────────────────────────────────────────────
   PC Batch — Review grid: compact columns (2026-06-05)

   Tighten cell padding, font, and input/select widths so the ~15-column grid
   fits without (or with much less) horizontal scrolling. Denser, but the
   operator asked to trade per-cell room for fit. Inline widths in the cell
   templates were also trimmed; this caps them so nothing blows the column
   back out.
   ───────────────────────────────────────────────────────────────────────── */
table.pcr-grid { font-size: .78rem; }
table.pcr-grid > thead > tr > th,
table.pcr-grid > tbody > tr > td {
    padding: .12rem .25rem;
    vertical-align: middle;
}
table.pcr-grid .form-control-sm,
table.pcr-grid .form-select-sm {
    padding: .05rem .25rem;
    font-size: .76rem;
    height: auto;
    max-width: 100%;
}
table.pcr-grid td code { font-size: .72rem; }
/* The cure ✓ buttons + small chips inside cells stay tight. */
table.pcr-grid .btn-sm { padding: .05rem .3rem; }
/* Clearer hit targets for the All / None / Clear actions (were bare links —
   the operator found them finicky to click). */
.pc-filter-popover-form .pc-popover-bulk {
    display: inline-flex;
    gap: .25rem;
}
.pc-filter-popover-form .pc-popover-bulk .btn {
    padding: .05rem .4rem;
    line-height: 1.2;
    font-size: .78rem;
}

.btn-status-complete {
    color: var(--status-complete-bg);
    border: 1px solid var(--status-complete-bg);
    background-color: transparent;
}
.btn-status-complete:hover { background-color: var(--status-complete-bg); color: var(--status-complete-fg); }

.btn-status-refunded {
    color: var(--status-refunded-bg);
    border: 1px solid var(--status-refunded-bg);
    background-color: transparent;
}
.btn-status-refunded:hover { background-color: var(--status-refunded-bg); color: var(--status-refunded-fg); }

/* Never print the floating feedback widget ("the little guy"). It is
   position:fixed in base.html and isn't caught by per-page print CSS that only
   hides nav/sidebar, so it would otherwise print on every receipt/label. */
@media print {
    #feedback-btn { display: none !important; }
}

/* ─────────────────────────────────────────────────────────────────────────
   CFO — wing sub-nav pills (2026-08-11)

   One compact strip (cfo/_subnav.html) on every CFO page, in money-flow
   order, so the wing navigates without the sidebar. Reuses the CFO module
   tokens; hover is color/border only (Popper-safe, no transform).
   ───────────────────────────────────────────────────────────────────────── */
.cfo-pill {
    display: inline-flex;
    align-items: center;
    padding: .2rem .6rem;
    border: 1px solid var(--bs-border-color);
    border-radius: 50rem;
    font-size: .8rem;
    color: var(--bs-secondary-color);
    text-decoration: none;
    background: var(--bs-body-bg, #fff);
    transition: background-color .15s ease, color .15s ease, border-color .15s ease;
}
.cfo-pill:hover { background: var(--mod-cfo-bg); color: var(--mod-cfo-fg); border-color: var(--mod-cfo-bg); }
.cfo-pill.active {
    background: var(--mod-cfo-bg);
    color: var(--mod-cfo-fg);
    border-color: var(--mod-cfo-fg);
    font-weight: 600;
}

/* ── Auctions — auc_Models plausibility warnings ──────────────────────────
   Painted by app/static/js/auc_model_sanity.js (live, as you type) and by
   the server-rendered row partials (persistent, from
   AuctionService.validate_model_values). Advisory styling only: the row
   still saves, so this reads as "look at this", not as an error state.
   Deliberately amber rather than Bootstrap's .is-invalid red — red is
   reserved in these grids for a hard block (Grades' sum≠100).
   ───────────────────────────────────────────────────────────────────────── */
input.auc-bad,
input.auc-bad:focus {
    border-color: #ffc107;
    box-shadow: 0 0 0 .15rem rgba(255, 193, 7, .35);
}
td.auc-bad-cell { background-color: #fff8e1 !important; cursor: help; }

/* AT&T Codes Import preview — the file states a capacity the built Item does
   not carry. Amber, same family as .auc-bad-cell above, because it is the same
   kind of message: the row saves fine, a human should look at it first. The
   needs-an-Item rows keep Bootstrap's stronger .table-warning, so the two
   states stay distinguishable when both are on screen. */
tr.auc-row-cap-missing > td { background-color: #fffdf3; }
td.auc-cap-missing {
    background-color: #fff8e1 !important;
    color: #c2680a;
    font-weight: 600;
    cursor: help;
}
