/* ═══════════════════════════════════════════════════════════════════════
   DAWARCY POS — mobile-fix.css
   Load AFTER css/mobile.css:
     <link rel="stylesheet" href="css/style.css?v=191">
     <link rel="stylesheet" href="css/mobile.css?v=24">
     <link rel="stylesheet" href="css/mobile-fix.css?v=1">

   Additive only. Does not modify style.css or mobile.css.
   Breakpoint standardised on 768px (not 767) to close the
   fractional-DPR gap between the two existing sheets.
   ═══════════════════════════════════════════════════════════════════════ */

/* ── 0. GLOBAL GUARDS ─────────────────────────────────────────────────
   Kills the horizontal bleed at the root. `overflow-x:clip` on <html>
   is preferred over `hidden` because `hidden` on <html> silently makes
   position:sticky stop working inside descendants. */
@media (max-width: 768px) {
  html {
    overflow-x: clip;
    -webkit-text-size-adjust: 100%;   /* stops Safari inflating text after rotate */
  }
  body {
    overflow-x: clip !important;
    min-width: 0 !important;
  }

  /* Nothing may exceed the viewport. Broad safety net for the ~20 inline
     min-width declarations in the HTML that mobile.css does not target. */
  .app-shell, .app-body, .main-content,
  .card, .card-body, .card-header,
  .table-wrap, .panel, section, .modal {
    max-width: 100% !important;
    min-width: 0 !important;
  }

  /* Grid and flex children default to min-width:auto, which refuses to
     shrink below content width. This is the single most common cause of
     grid overflow and must be reset explicitly. */
  .kpi-grid > *, .form-grid > *, .dashboard-primary-row > *,
  .rpt-grid-2 > *, .rpt-grid-2-even > *, .table-toolbar > * {
    min-width: 0 !important;
  }

  img, svg, canvas, video, iframe {
    max-width: 100% !important;
    height: auto;
  }
}

/* ── 1. iOS ZOOM-ON-FOCUS ─────────────────────────────────────────────
   Any input below 16px causes iOS Safari to zoom the viewport on focus
   and never restore it — this is why the app "feels zoomed" for the rest
   of the session after login. 16px is the exact threshold.
   Visual size is preserved by trimming padding, so nothing grows. */
@media (max-width: 768px) {
  input, select, textarea,
  .input, .select, .textarea {
    font-size: 16px !important;
    padding: 10px 12px !important;
    line-height: 1.35 !important;
    max-width: 100% !important;
    min-width: 0 !important;
    width: 100% !important;
    box-sizing: border-box !important;
  }

  /* Neutralise every inline min-width:140px..220px on toolbar controls
     so .table-toolbar can wrap instead of overflowing. */
  .table-toolbar .input,
  .table-toolbar .select,
  .table-toolbar .search-wrap,
  [style*="min-width"].input,
  [style*="min-width"].select {
    min-width: 0 !important;
    width: 100% !important;
  }

  .table-toolbar {
    display: flex !important;
    flex-wrap: wrap !important;
    gap: 8px !important;
    align-items: stretch !important;
  }
  .table-toolbar .btn {
    flex: 1 1 auto !important;
    min-height: 44px !important;   /* WCAG 2.5.8 minimum target size */
  }
}

/* ── 2. LOGIN SCREEN ──────────────────────────────────────────────────
   mobile.css contains no login rules at all; the auth panel inherits a
   card centred for a 1440px canvas. */
@media (max-width: 768px) {
  #authLoginPanel,
  #authScreen,
  .auth-shell {
    display: flex !important;
    flex-direction: column !important;
    justify-content: center !important;
    width: 100% !important;
    max-width: 100% !important;
    min-height: 100dvh !important;          /* dvh, not vh — accounts for
                                               the collapsing URL bar */
    margin: 0 !important;
    padding: calc(24px + env(safe-area-inset-top))
             20px
             calc(24px + env(safe-area-inset-bottom)) !important;
    box-sizing: border-box !important;
  }

  #authLoginPanel .card,
  #authLoginPanel > form,
  .auth-card {
    width: 100% !important;
    max-width: 420px !important;
    margin: 0 auto !important;
    padding: 24px 20px !important;
    border-radius: 16px !important;
    box-shadow: 0 8px 28px rgba(15, 23, 42, 0.08) !important;
  }

  /* Tenant branding logo has no max-width, so a wide asset pushes the
     card past the viewport edge. */
  #authLoginPanel img,
  .auth-brand img,
  .tenant-logo {
    max-width: 180px !important;
    max-height: 72px !important;
    width: auto !important;
    object-fit: contain !important;
    margin: 0 auto 16px !important;
    display: block !important;
  }

  #authSignInBtn,
  #authLoginPanel .btn {
    width: 100% !important;
    min-height: 48px !important;
    font-size: 16px !important;
  }
}

/* ── 3. APP SHELL — bottom-nav clearance ──────────────────────────────
   mobile.css sets .main-content padding-bottom in 8 different rules
   (0, 56, 76, 88, 100, 128, 160px). Pages landing on 0 or 56px have
   their last row hidden under the 72px nav. One variable, one rule. */
@media (max-width: 768px) {
  :root {
    --m-nav-h: 72px;
    --m-topbar-h: 56px;
  }

  .main-content {
    padding-bottom: calc(var(--m-nav-h) + 24px + env(safe-area-inset-bottom)) !important;
  }

  /* Pages with a sticky action bar above the nav need extra clearance.
     Add class="has-action-bar" to <main> on POS / GRN / purchase entry. */
  .main-content.has-action-bar {
    padding-bottom: calc(var(--m-nav-h) + 80px + env(safe-area-inset-bottom)) !important;
  }

  .topbar {
    padding-top: env(safe-area-inset-top) !important;
    height: calc(var(--m-topbar-h) + env(safe-area-inset-top)) !important;
  }
}

/* ── 4. BOTTOM NAV — dark-mode fix ────────────────────────────────────
   mobile.css:87 hardcodes #5f6368 / #1a73e8 / #e8f0fe / white, ignoring
   the --m-* tokens declared at the top of the same file. Result: the nav
   stays white-on-white in dark mode. Re-point it at the tokens. */
@media (max-width: 768px) {
  .mobile-bottom-nav,
  #bottomNav {
    background: var(--m-surface) !important;
    border-top: 1px solid var(--m-border) !important;
    box-shadow: 0 -4px 20px rgba(0, 0, 0, 0.06) !important;
  }
  .mobile-bottom-nav > a,
  .mobile-bottom-nav > button,
  .mobile-nav-item {
    color: var(--m-text-secondary) !important;
    min-height: 48px !important;
    min-width: 48px !important;
  }
  .mobile-bottom-nav > a.active,
  .mobile-bottom-nav > button.active,
  .mobile-nav-item.active {
    color: var(--m-accent) !important;
    background: var(--m-tint-cash-bg) !important;
  }
}

/* ── 5. TABLES → LABELLED CARDS ───────────────────────────────────────
   mobile.css:2280 hides <thead> and blocks out <td>, but no data-label
   exists anywhere in the codebase, so rows become anonymous stacks of
   values. Two fixes:
     (a) extend the card conversion to the 5 table classes it misses;
     (b) render data-label as a leading key when JS supplies it.
   See the JS snippet at the bottom of this file for (b)'s data source. */
@media (max-width: 768px) {

  /* (a) Classes that are NOT .data-table and therefore get no conversion:
         .items-table (POS cart, 3x), .dispensing-table (rx),
         .admin-table (admin), .po-items-table (purchases), .meta */
  .items-table, .dispensing-table, .admin-table,
  .po-items-table, .price-history-table, table.meta {
    display: block !important;
    width: 100% !important;
    min-width: 0 !important;
  }
  .items-table thead, .dispensing-table thead, .admin-table thead,
  .po-items-table thead, .price-history-table thead {
    display: none !important;
  }
  .items-table tbody, .items-table tbody tr,
  .dispensing-table tbody, .dispensing-table tbody tr,
  .admin-table tbody, .admin-table tbody tr,
  .po-items-table tbody, .po-items-table tbody tr,
  .price-history-table tbody, .price-history-table tbody tr {
    display: block !important;
    width: 100% !important;
  }
  .items-table tbody tr, .dispensing-table tbody tr,
  .admin-table tbody tr, .po-items-table tbody tr,
  .price-history-table tbody tr {
    background: var(--m-surface) !important;
    border: 1px solid var(--m-border) !important;
    border-radius: 12px !important;
    margin-bottom: 8px !important;
    padding: 12px 14px !important;
  }
  .items-table td, .dispensing-table td, .admin-table td,
  .po-items-table td, .price-history-table td {
    display: block !important;
    width: auto !important;
    padding: 3px 0 !important;
    border: none !important;
    text-align: left !important;
  }

  /* (b) Label rendering. Applies to every converted table including the
         existing .data-table block. Cells without data-label are
         unaffected, so this is safe to ship before the JS change. */
  .data-table td[data-label],
  .items-table td[data-label],
  .dispensing-table td[data-label],
  .admin-table td[data-label],
  .po-items-table td[data-label] {
    display: grid !important;
    grid-template-columns: minmax(88px, 38%) minmax(0, 1fr) !important;
    gap: 10px !important;
    align-items: baseline !important;
    padding: 4px 0 !important;
  }
  .data-table td[data-label]::before,
  .items-table td[data-label]::before,
  .dispensing-table td[data-label]::before,
  .admin-table td[data-label]::before,
  .po-items-table td[data-label]::before {
    content: attr(data-label);
    font-size: 0.72rem;
    font-weight: 600;
    letter-spacing: 0.02em;
    text-transform: uppercase;
    color: var(--m-text-muted);
  }

  /* Promote the first cell to a card title instead of a labelled row —
     gives each card an anchor the eye can scan. */
  .data-table tbody tr > td:first-child,
  .items-table tbody tr > td:first-child,
  .admin-table tbody tr > td:first-child {
    display: block !important;
    font-size: 0.95rem !important;
    font-weight: 700 !important;
    color: var(--m-text) !important;
    padding-bottom: 8px !important;
    margin-bottom: 6px !important;
    border-bottom: 1px solid var(--m-border) !important;
  }
  .data-table tbody tr > td:first-child::before,
  .items-table tbody tr > td:first-child::before,
  .admin-table tbody tr > td:first-child::before {
    content: none !important;
  }

  /* Action cells go full-width at the card foot with real tap targets. */
  .data-table td.products-actions-cell,
  .data-table td:last-child .btn,
  .items-table td:last-child .btn,
  .admin-table td:last-child .btn {
    min-height: 40px !important;
  }
  .data-table td.products-actions-cell,
  .data-table td.actions-cell {
    display: flex !important;
    flex-wrap: wrap !important;
    gap: 8px !important;
    padding-top: 10px !important;
    margin-top: 6px !important;
    border-top: 1px solid var(--m-border) !important;
  }
  .data-table td.products-actions-cell::before,
  .data-table td.actions-cell::before { content: none !important; }

  /* Fallback for any table that must stay a real table (wide numeric
     reports). Momentum scroll + a visible affordance. */
  .table-wrap.keep-table {
    display: block !important;
    overflow-x: auto !important;
    -webkit-overflow-scrolling: touch !important;
    overscroll-behavior-x: contain !important;
  }
  .table-wrap.keep-table > table {
    display: table !important;
    width: max-content !important;
    min-width: 100% !important;
  }
  .table-wrap.keep-table > table thead { display: table-header-group !important; }
  .table-wrap.keep-table > table tbody { display: table-row-group !important; }
  .table-wrap.keep-table > table tr    { display: table-row !important; }
  .table-wrap.keep-table > table td,
  .table-wrap.keep-table > table th    { display: table-cell !important;
                                         white-space: nowrap !important; }
}

/* ── 6. FORMS ─────────────────────────────────────────────────────────
   Four form-grid variants exist (form-grid, form-grid-3, .two, .three);
   none collapse at 767px. Inline grid-template-columns beat mobile.css
   because they are inline — hence !important here. */
@media (max-width: 768px) {
  .form-grid,
  .form-grid-3,
  .form-grid.two,
  .form-grid.three,
  .returns-entry-grid,
  .grn-meta-grid,
  .product-editor-grid,
  .product-editor-grid-right,
  .rpt-grid-2,
  .rpt-grid-2-even,
  [style*="grid-template-columns"] {
    display: grid !important;
    grid-template-columns: 1fr !important;
    gap: 14px !important;
  }

  /* Opt-out: add class="keep-2col" where two narrow fields genuinely
     read better side by side (e.g. qty + unit). */
  .keep-2col {
    grid-template-columns: 1fr 1fr !important;
    gap: 10px !important;
  }

  .form-row, .field-row, .input-group {
    display: flex !important;
    flex-direction: column !important;
    gap: 6px !important;
    width: 100% !important;
  }
  label { font-size: 0.82rem !important; font-weight: 600 !important; }
}

/* ── 7. MODALS ────────────────────────────────────────────────────────
   mobile.css:1057 styles the modal but never splits header/body/footer
   into a scroll container, so Save falls off-screen on long forms.
   Converted to a bottom sheet — the standard mobile pattern. */
@media (max-width: 768px) {
  .modal {
    position: fixed !important;
    inset: auto 0 0 0 !important;
    display: flex !important;
    flex-direction: column !important;
    width: 100% !important;
    max-width: 100% !important;
    max-height: 92dvh !important;
    margin: 0 !important;
    border-radius: 18px 18px 0 0 !important;
    transform: none !important;
  }
  .modal-header {
    flex: 0 0 auto !important;
    position: sticky !important;
    top: 0 !important;
    z-index: 2 !important;
    background: var(--m-surface) !important;
    padding: 16px !important;
  }
  .modal-body {
    flex: 1 1 auto !important;
    overflow-y: auto !important;
    -webkit-overflow-scrolling: touch !important;
    overscroll-behavior: contain !important;
    padding: 16px !important;
  }
  .modal-footer {
    flex: 0 0 auto !important;
    position: sticky !important;
    bottom: 0 !important;
    z-index: 2 !important;
    display: flex !important;
    flex-direction: column-reverse !important;  /* primary action on top,
                                                   nearest the thumb */
    gap: 8px !important;
    background: var(--m-surface) !important;
    border-top: 1px solid var(--m-border) !important;
    padding: 12px 16px calc(12px + env(safe-area-inset-bottom)) !important;
  }
  .modal-footer .btn {
    width: 100% !important;
    min-height: 48px !important;
    margin: 0 !important;
  }
}

/* ── 8. DASHBOARD ─────────────────────────────────────────────────────
   2-up KPI grid; the inline min-width:190px location select is what
   pushes the greeting row off-screen. */
@media (max-width: 768px) {
  .kpi-grid, .dashboard-kpi-grid {
    display: grid !important;
    grid-template-columns: repeat(2, minmax(0, 1fr)) !important;
    gap: 10px !important;
  }
  .kpi-card { padding: 12px !important; }
  .kpi-value {
    font-size: 1.05rem !important;
    overflow-wrap: anywhere !important;   /* stops "KES 1,240,000" clipping */
  }
  .kpi-label { font-size: 0.7rem !important; }

  .dashboard-divider-row {
    display: flex !important;
    flex-direction: column !important;
    align-items: flex-start !important;
    gap: 10px !important;
  }
  #dashboardLocationFilter {
    width: 100% !important;
    min-width: 0 !important;   /* overrides inline min-width:190px */
  }

  .dashboard-primary-row,
  .dashboard-main-col {
    display: flex !important;
    flex-direction: column !important;
    gap: 14px !important;
  }
  .dashboard-chart-wrap { max-height: 200px !important; }
  .dashboard-chart-axis {
    display: flex !important;
    overflow-x: auto !important;
    font-size: 0.65rem !important;
    scrollbar-width: none;
  }
  .dashboard-trend-controls {
    display: flex !important;
    width: 100% !important;
  }
  .dashboard-trend-btn { flex: 1 1 0 !important; min-height: 40px !important; }
}

/* ── 9. POS ───────────────────────────────────────────────────────────
   pos.html has 1 table with 0 wrappers and class .items-table, so the
   shared conversion never fired. Section 5 handles the conversion; this
   handles the two-pane layout and the pay button falling below the fold. */
@media (max-width: 768px) {
  .pos-layout, .pos-shell, .pos-grid {
    display: flex !important;
    flex-direction: column !important;
    gap: 12px !important;
  }
  .pos-search-results, .pos-product-list {
    max-height: 42dvh !important;
    overflow-y: auto !important;
    -webkit-overflow-scrolling: touch !important;
  }
  .pos-cart, .pos-cart-panel {
    max-height: 46dvh !important;
    overflow-y: auto !important;
  }
  /* Pin the total + pay action above the bottom nav so it is always
     reachable regardless of cart length. */
  .pos-totals, .pos-checkout-bar {
    position: sticky !important;
    bottom: calc(var(--m-nav-h) + env(safe-area-inset-bottom)) !important;
    z-index: 20 !important;
    background: var(--m-surface) !important;
    border-top: 1px solid var(--m-border) !important;
    padding: 12px !important;
    box-shadow: 0 -4px 16px rgba(0, 0, 0, 0.08) !important;
  }
  .pos-totals .btn, .pos-checkout-bar .btn {
    width: 100% !important;
    min-height: 52px !important;
    font-size: 16px !important;
  }
}

/* ── 10. REPORTS ──────────────────────────────────────────────────────
   14 tables. rpt-grid-2 handled in §6. Wide numeric report tables are
   better as scrollers than cards — opt them in via .keep-table. */
@media (max-width: 768px) {
  .rpt-chart-wrap, .report-chart { max-height: 240px !important; }
  .rpt-filters {
    display: grid !important;
    grid-template-columns: 1fr !important;
    gap: 10px !important;
  }
  .rpt-summary-grid {
    grid-template-columns: repeat(2, minmax(0, 1fr)) !important;
    gap: 10px !important;
  }
}

/* ── 11. PURCHASES / GRN LINE ITEMS ───────────────────────────────────
   grid-template-columns:minmax(160px,1fr) 68px 90px 90px 32px = 440px
   minimum, guaranteed overflow. mobile.css:476 fixes this for
   #purchaseEntryPanel only; GRN uses the same pattern unpatched. */
@media (max-width: 768px) {
  .purchase-items-row, .grn-items-row, .po-line-row {
    display: grid !important;
    grid-template-columns: repeat(3, minmax(0, 1fr)) !important;
    gap: 8px !important;
    padding: 12px !important;
    border: 1px solid var(--m-border) !important;
    border-radius: 12px !important;
    margin-bottom: 8px !important;
  }
  .purchase-items-row > :first-child,
  .grn-items-row > :first-child,
  .po-line-row > :first-child {
    grid-column: 1 / -1 !important;   /* product name spans full width */
    font-weight: 600 !important;
  }
  .purchase-items-table-head, .grn-items-table-head {
    display: none !important;
  }
}

/* ── 12. SETTINGS / LOCATIONS / ADMIN ─────────────────────────────────
   settings.html (3 tables) and locations.html (1 table) have zero
   .table-wrap. admin.html does not link mobile.css at all — see the
   note below; this block only helps once that link is added. */
@media (max-width: 768px) {
  .settings-layout, .settings-grid {
    display: flex !important;
    flex-direction: column !important;
    gap: 14px !important;
  }
  .settings-nav, .settings-tabs {
    display: flex !important;
    overflow-x: auto !important;
    gap: 6px !important;
    -webkit-overflow-scrolling: touch !important;
    scrollbar-width: none;
    padding-bottom: 4px !important;
  }
  .settings-nav::-webkit-scrollbar,
  .settings-tabs::-webkit-scrollbar { display: none; }
  .settings-nav > *, .settings-tabs > * {
    flex: 0 0 auto !important;
    white-space: nowrap !important;
    min-height: 40px !important;
  }
}

/* ── 13. TAB STRIPS (global) ──────────────────────────────────────────
   Tab rows across GRN, Products, Reports, Stock all wrap onto 3 lines
   at 360px. Horizontal scroll keeps them one line. */
@media (max-width: 768px) {
  .tabs, .tab-bar, .nav-tabs, .segmented {
    display: flex !important;
    flex-wrap: nowrap !important;
    overflow-x: auto !important;
    -webkit-overflow-scrolling: touch !important;
    scrollbar-width: none;
    gap: 4px !important;
  }
  .tabs::-webkit-scrollbar,
  .tab-bar::-webkit-scrollbar,
  .nav-tabs::-webkit-scrollbar { display: none; }
  .tabs > *, .tab-bar > *, .nav-tabs > * {
    flex: 0 0 auto !important;
    white-space: nowrap !important;
    min-height: 42px !important;
  }
}

/* ── 14. POS CATEGORY SCROLL FIX + BASKET FAB ──────────────────────────
   Section 17's .main-content div:not(.hidden) (specificity 0,0,2,1)
   overrides overflow-x:auto on .pos-category-strip (0,0,1,0) because
   both carry !important, breaking horizontal scroll. Re-assert with
   a higher-specificity ID selector. Also constrain the "More"
   dropdown height + add internal scroll. Fix basket FAB badge
   overlap, centering, and clipping. */
@media (max-width: 768px) {
  #posCategoryStrip.pos-category-strip {
    overflow-x: auto !important;
    overflow-y: hidden !important;
    flex-wrap: nowrap !important;
    -webkit-overflow-scrolling: touch !important;
    scrollbar-width: none !important;
  }
  #posCategoryStrip .pos-category-menu {
    max-height: 260px !important;
    overflow-y: auto !important;
  }

  /* ── Basket floating button ──────────────────────────────────── */
  .pos-right:not(.basket-open) {
    overflow: visible !important;
    background: none !important;
    box-shadow: none !important;
    width: auto !important;
    height: auto !important;
    border-radius: 0 !important;
    padding: 0 !important;
    border: none !important;
    bottom: calc(64px + 14px) !important;
    right: 12px !important;
  }
  .pos-right:not(.basket-open) .basket-header {
    display: flex !important;
    align-items: center !important;
    justify-content: center !important;
    position: relative !important;
    background: none !important;
    color: var(--m-accent) !important;
  }
  .pos-right:not(.basket-open) .basket-header::before {
    width: 40px !important;
    height: 40px !important;
    filter: brightness(0) saturate(100%) invert(35%) sepia(98%) saturate(1248%) hue-rotate(190deg) brightness(92%) contrast(90%) !important;
  }
  .pos-right:not(.basket-open) .basket-count {
    top: -6px !important;
    right: -6px !important;
    min-width: 18px !important;
    height: 18px !important;
    font-size: 0.65rem !important;
    padding: 0 4px !important;
    border-width: 0 !important;
    position: absolute !important;
  }
}

/* ── 15. DASHBOARD KPI — REMOVE TINTED BACKGROUNDS ────────────────────*/
@media (max-width: 768px) {
  .dashboard-kpi-grid .kpi-card,
  .dashboard-kpi-grid .kpi-card:nth-child(1),
  .dashboard-kpi-grid .kpi-card:nth-child(2),
  .dashboard-kpi-grid .kpi-card:nth-child(3),
  .dashboard-kpi-grid .kpi-card:nth-child(4) {
    background: var(--m-surface) !important;
    color: var(--m-text) !important;
    border-color: var(--m-border) !important;
  }
}

/* ── 16. PAST SALES — REMOVE TABLE WRAPPER, MATCH QUOTATION CARDS ────*/
@media (max-width: 768px) {
  #mainContent div:has(> #fullSalesList) {
    border: none !important;
    border-radius: 0 !important;
    overflow: visible !important;
    background: transparent !important;
    box-shadow: none !important;
    padding: 0 !important;
  }
  #fullSalesList .past-sale-item.mobile-sale-card {
    background: linear-gradient(180deg, var(--m-surface) 0%, color-mix(in srgb, var(--m-accent) 4%, var(--m-surface)) 100%) !important;
    border: 1px solid color-mix(in srgb, var(--m-accent) 14%, var(--m-border)) !important;
    border-radius: 14px !important;
    box-shadow: 0 12px 28px color-mix(in srgb, var(--m-accent) 12%, transparent) !important;
    color: var(--m-text) !important;
    padding: 14px !important;
    margin: 0 0 10px !important;
  }
  #fullSalesList .past-sale-item.mobile-sale-card .btn-outline,
  #fullSalesList .past-sale-item.mobile-sale-card .btn-ghost {
    color: var(--m-text-secondary) !important;
    border-color: var(--m-border) !important;
  }
}

/* ── 17. CREDIT KPI — MATCH QUEUED SIZE ───────────────────────────────*/
@media (max-width: 768px) {
  .mobile-credit-kpi-grid {
    display: grid !important;
    grid-template-columns: repeat(3, 1fr) !important;
    gap: 10px !important;
    margin-bottom: 16px !important;
  }
  .mobile-credit-kpi-grid .kpi-card {
    min-height: 76px !important;
    padding: 12px !important;
    border-radius: 1em !important;
    border: 1px solid var(--m-border) !important;
    background: var(--m-surface) !important;
  }
  .mobile-credit-kpi-grid .kpi-label {
    font-size: 0.7rem !important;
  }
  .mobile-credit-kpi-grid .kpi-value {
    font-size: 1.05rem !important;
  }
}

/* ── 18. LANDSCAPE / SMALL-HEIGHT ────────────────────────────────────
   mobile.css:1023 has an orientation rule but it does not reduce the
   sticky chrome, so on a 360x360 landscape viewport the topbar + nav
   consume 128px of 360px. */
@media (max-width: 900px) and (orientation: landscape) and (max-height: 500px) {
  :root { --m-nav-h: 56px; --m-topbar-h: 44px; }
  .mobile-bottom-nav, #bottomNav { height: 56px !important; }
  .mobile-bottom-nav svg, .mobile-nav-item svg {
    width: 20px !important; height: 20px !important;
  }
  .modal { max-height: 96dvh !important; }
  .pos-search-results, .pos-cart { max-height: 34dvh !important; }
}

/* ── 19. DISPENSING FORM CARDS ───────────────────────────────────────*/
#dispensingModal .dispensing-form-card {
  background: var(--m-surface);
  border: 1px solid var(--m-border);
  border-radius: 16px;
  padding: 16px;
  margin-bottom: 12px;
}
#dispensingModal .dis-item-name {
  font-size: 1.05rem;
  font-weight: 700;
  padding-bottom: 10px;
  margin-bottom: 12px;
  border-bottom: 1px solid var(--m-border);
}
#dispensingModal .dis-field-row {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 8px 12px;
  margin-bottom: 4px;
}
#dispensingModal .dis-field {
  margin-bottom: 10px;
}
#dispensingModal .dis-label {
  display: block;
  font-size: 0.72rem;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.03em;
  color: var(--m-text-secondary);
  margin-bottom: 4px;
}
#dispensingModal .dispensing-input {
  min-height: 44px;
  font-size: 1rem;
  width: 100%;
  box-sizing: border-box;
}
#dispensingModal .dispensing-timing-cell {
  position: relative;
}
#dispensingModal .dispensing-dropdown {
  position: absolute;
  top: 100%;
  left: 0;
  right: 0;
  z-index: 50;
  background: var(--m-surface);
  border: 1px solid var(--m-border);
  border-radius: 12px;
  box-shadow: 0 8px 24px rgba(0,0,0,0.15);
  max-height: 240px;
  overflow-y: auto;
}
#dispensingModal #instructionPreview,
#dispensingModal .dispensing-bulk-instruction {
  font-size: 0.92rem;
  line-height: 1.45;
  color: var(--m-text);
  font-style: italic;
  padding: 4px 0;
}

/* ── 20. BASKET SHEET — MOBILE TABLE REDESIGN ─────────────────────── */
@media (max-width: 768px) {
  .pos-right.basket-open {
    height: min(84dvh, 700px) !important;
    left: 8px !important;
    right: 8px !important;
    bottom: calc(64px + 8px + env(safe-area-inset-bottom)) !important;
    border-radius: 22px !important;
    overflow: hidden !important;
    background: linear-gradient(180deg, var(--m-surface) 0%, color-mix(in srgb, var(--m-accent) 3%, var(--m-surface)) 100%) !important;
    box-shadow: 0 20px 50px rgba(15, 23, 42, 0.22) !important;
  }
  .pos-right.basket-open .basket-header {
    padding: 14px 50px 12px 14px !important;
    border-bottom: 1px solid var(--m-border) !important;
    background: transparent !important;
  }
  .pos-right.basket-open .basket-header > div:first-child {
    margin-bottom: 8px !important;
  }
  .basket-items {
    display: flex !important;
    flex-direction: column !important;
    flex: 1 1 auto !important;
    min-height: 0 !important;
    overflow: hidden !important;
  }
  .basket-grid-head,
  .basket-items-body {
    display: none !important;
  }
  .basket-mobile-table-wrap {
    flex: 1 1 auto !important;
    min-height: 0 !important;
    max-height: 100% !important;
    overflow: auto !important;
    -webkit-overflow-scrolling: touch !important;
    padding: 4px 8px 8px !important;
  }
  .basket-mobile-table {
    width: 100% !important;
    border-collapse: collapse !important;
    border-spacing: 0 !important;
    table-layout: fixed !important;
  }
  .basket-mobile-table thead th {
    position: sticky !important;
    top: 0 !important;
    z-index: 1 !important;
    padding: 4px 4px 6px !important;
    background: var(--m-surface) !important;
    color: var(--m-text-secondary) !important;
    font-size: 0.64rem !important;
    font-weight: 800 !important;
    letter-spacing: 0.08em !important;
    text-transform: uppercase !important;
    border-bottom: 1px solid var(--m-border) !important;
  }
  .basket-mobile-table tbody tr {
    background: transparent !important;
  }
  .basket-mobile-table tbody td {
    padding: 7px 4px !important;
    border: none !important;
    border-bottom: 1px solid var(--m-border) !important;
    background: transparent !important;
    vertical-align: top !important;
  }
  .basket-mobile-head-item { width: 72% !important; text-align: left !important; }
  .basket-mobile-head-qty { width: 18% !important; text-align: center !important; }
  .basket-mobile-head-actions { width: 10% !important; text-align: center !important; }
  .basket-mobile-item {
    display: flex !important;
    flex-direction: column !important;
    gap: 2px !important;
    min-width: 0 !important;
  }
  .basket-mobile-name {
    font-size: 0.84rem !important;
    font-weight: 700 !important;
    line-height: 1.15 !important;
    color: var(--m-text) !important;
  }
  .basket-mobile-qty {
    text-align: center !important;
  }
  .basket-mobile-qty .qty-control {
    margin: 0 auto !important;
  }
  .basket-mobile-actions {
    text-align: center !important;
    white-space: nowrap !important;
  }
  .basket-mobile-actions .basket-item-remove {
    width: auto !important;
    height: auto !important;
    padding: 0 !important;
    border-radius: 0 !important;
    display: inline-flex !important;
    align-items: center !important;
    justify-content: center !important;
    border: none !important;
    background: transparent !important;
    font-size: 1.05rem !important;
    line-height: 1 !important;
    font-weight: 700 !important;
    color: var(--m-tint-warn-text) !important;
  }
  .basket-mobile-actions .basket-mobile-remove {
    box-shadow: none !important;
  }
  .basket-summary {
    margin-bottom: 8px !important;
  }
  .basket-summary-row {
    padding: 4px 0 !important;
    font-size: 0.8rem !important;
  }
  .basket-total-row {
    margin-bottom: 10px !important;
  }
  .basket-total-value {
    font-size: 1.35rem !important;
    color: var(--m-accent) !important;
  }
  .basket-actions .btn-lg {
    min-height: 52px !important;
    height: 52px !important;
    font-size: 1rem !important;
    background: var(--m-accent) !important;
    border-color: var(--m-accent) !important;
    color: var(--m-accent-text) !important;
  }
}

/* ── 20. CHECKOUT MODAL — COMPACT MOBILE LAYOUT ──────────────────────*/
@media (max-width: 768px) {
  #checkoutModal {
    z-index: 100000 !important;
  }
  #checkoutModal .modal {
    max-height: calc(100dvh - 12px) !important;
    border-radius: 18px 18px 0 0 !important;
    overflow: hidden !important;
  }
  #checkoutModal .modal-body {
    padding: 12px 16px !important;
  }
  #checkoutSaleTotal {
    font-size: 1.4rem !important;
    margin-bottom: 10px !important;
  }
  #checkoutTaxBreakdown {
    margin: 0 0 10px !important;
    padding: 8px 10px !important;
    font-size: 0.8rem !important;
  }
  #checkoutMiniItems {
    max-height: 120px !important;
    margin: 0 0 10px !important;
    font-size: 0.82rem !important;
  }
  #checkoutModal .form-group.mb-3 {
    margin-bottom: 10px !important;
  }
  #checkoutModal .form-label {
    font-size: 0.72rem !important;
    margin-bottom: 3px !important;
  }
  .checkout-payment-method-pills {
    display: grid !important;
    grid-template-columns: repeat(2, 1fr) !important;
    gap: 6px !important;
  }
  .checkout-payment-pill {
    min-height: 44px !important;
    font-size: 0.85rem !important;
    padding: 8px !important;
  }
  #amountPaidGroup {
    margin-bottom: 8px !important;
  }
  #checkoutAmountPaid {
    min-height: 48px !important;
    font-size: 1.2rem !important;
    font-weight: 700 !important;
  }
  #changeDisplay {
    padding: 10px !important;
    margin-bottom: 10px !important;
  }
  #changeDisplay > div:last-child {
    font-size: 1.3rem !important;
  }
  #checkoutModal .modal-footer .btn {
    min-height: 48px !important;
    font-size: 1rem !important;
  }
}

/* ── 21. TABLET DEAD ZONE (769–900px) ─────────────────────────────────
   style.css has rules at 780/820/900px that fire here while mobile.css
   (max 767) has stopped and .mobile-only elements are hidden. Result:
   desktop sidebar is collapsed but no mobile nav exists. Force the
   desktop shell back on above 768px so there is never a no-nav state. */
@media (min-width: 769px) and (max-width: 900px) {
  .desktop-sidebar { display: block !important; }
  .mobile-bottom-nav, #bottomNav { display: none !important; }
  .kpi-grid { grid-template-columns: repeat(2, minmax(0, 1fr)) !important; }
  .dashboard-primary-row { grid-template-columns: 1fr !important; }
}

/* ── 22. ACCESSIBILITY ────────────────────────────────────────────────*/
@media (max-width: 768px) {
  a, button, .btn, [role="button"], .mobile-nav-item {
    min-height: 44px;
    min-width: 44px;
  }
  .btn-sm, .btn-icon { min-height: 40px; min-width: 40px; }

  :focus-visible {
    outline: 2px solid var(--m-accent) !important;
    outline-offset: 2px !important;
  }
}
@media (prefers-reduced-motion: reduce) {
  .mobile-bottom-nav > a, .mobile-nav-item, .modal, .btn {
    transition: none !important;
    animation: none !important;
  }
}

/* ── 23. ADMIN-MATCHED MOBILE STANDARD ────────────────────────────────
   Mobile app pages should flow like admin.html: sticky top chrome,
   horizontal tab strip, natural document scroll, and real tables inside
   scroll containers. */
@media (max-width: 768px) {
  html,
  body {
    height: auto !important;
    min-height: 100dvh !important;
    overflow-x: clip !important;
    overflow-y: auto !important;
    background: var(--m-bg) !important;
  }

  .app-shell,
  .app-body {
    display: block !important;
    width: 100% !important;
    height: auto !important;
    min-height: 100dvh !important;
    max-height: none !important;
    margin: 0 !important;
    padding: 0 !important;
    overflow: visible !important;
    background: var(--m-bg) !important;
  }

  .desktop-sidebar {
    display: none !important;
  }

  .mobile-bottom-nav,
  #bottomNav {
    display: flex !important;
    position: fixed !important;
    left: 0 !important;
    right: 0 !important;
    bottom: 0 !important;
    z-index: 90 !important;
  }

  .topbar {
    position: sticky !important;
    top: 0 !important;
    left: auto !important;
    right: auto !important;
    z-index: 30 !important;
    width: 100% !important;
    height: auto !important;
    min-height: 64px !important;
    padding: calc(10px + env(safe-area-inset-top)) 14px 10px !important;
    display: flex !important;
    align-items: center !important;
    gap: 10px !important;
    background: var(--m-surface) !important;
    border-bottom: 1px solid var(--m-border) !important;
    box-shadow: none !important;
  }

  #mobileSidebarToggleBtn {
    display: inline-flex !important;
    flex: 0 0 44px !important;
    width: 44px !important;
    height: 44px !important;
  }

  .topbar-brand {
    color: var(--m-text) !important;
    font-size: 1rem !important;
    font-weight: 800 !important;
  }

  .topbar-actions {
    gap: 8px !important;
  }

  .topbar-actions .topbar-icon-btn,
  .topbar-actions .topbar-theme-toggle {
    width: 44px !important;
    height: 44px !important;
    border-radius: 14px !important;
    border: 1px solid var(--m-border) !important;
    background: var(--m-surface-2) !important;
  }

  .topbar-alert-dropdown {
    position: fixed !important;
    top: calc(64px + env(safe-area-inset-top)) !important;
    left: auto !important;
    right: 12px !important;
    width: min(320px, calc(100vw - 28px)) !important;
    max-width: calc(100vw - 28px) !important;
    border-radius: 18px !important;
    max-height: min(72dvh, 560px) !important;
    overflow-y: auto !important;
    transform-origin: top right !important;
  }

  .module-nav:not(.hidden) {
    position: relative !important;
    margin: 0 !important;
    padding: 10px 14px !important;
    min-height: 0 !important;
    height: auto !important;
    overflow: visible !important;
    border: 0 !important;
    border-bottom: 1px solid var(--m-border) !important;
    border-radius: 0 !important;
    background: #e5e7eb !important;
    box-shadow: none !important;
  }

  [data-theme="dark"] .module-nav:not(.hidden) {
    background: #181818 !important;
  }

  .module-nav::after,
  .module-nav-scroll-btn,
  .module-tab-indicator,
  .module-nav-identity {
    display: none !important;
  }

  .module-nav-inner,
  .module-nav-scroll-shell {
    display: flex !important;
    width: 100% !important;
    min-width: 0 !important;
    align-items: center !important;
  }

  .module-nav-track {
    display: flex !important;
    gap: 8px !important;
    padding: 0 !important;
    min-width: 0 !important;
    overflow-x: auto !important;
    overflow-y: hidden !important;
    scrollbar-width: none !important;
  }

  .module-nav-link {
    min-width: 0 !important;
    min-height: 44px !important;
    padding: 10px 16px !important;
    border: 0 !important;
    border-radius: 12px !important;
    background: transparent !important;
    color: var(--m-text) !important;
    font-size: 0.92rem !important;
    font-weight: 800 !important;
    white-space: nowrap !important;
    box-shadow: none !important;
  }

  .module-nav-link.active {
    background: var(--m-accent) !important;
    color: #fff !important;
  }

  .module-nav-context {
    flex: 0 0 auto !important;
    margin: 0 0 0 8px !important;
    gap: 8px !important;
  }

  .module-nav-context .btn {
    min-height: 44px !important;
    white-space: nowrap !important;
  }

  #mainContent,
  #mainContent.main-content,
  .main-content,
  .main-content[class] {
    display: block !important;
    width: 100% !important;
    height: auto !important;
    min-height: 0 !important;
    max-height: none !important;
    padding: 20px 14px calc(96px + env(safe-area-inset-bottom)) !important;
    overflow: visible !important;
    background: var(--m-bg) !important;
    color: var(--m-text) !important;
  }

  .module-nav:not(.hidden) + .main-content {
    padding-top: 20px !important;
  }

  .main-content > section,
  .main-content > div,
  .main-content section:not(.hidden),
  .main-content div:not(.hidden) {
    height: auto !important;
    min-height: 0 !important;
    max-height: none !important;
    overflow: visible !important;
  }

  .card,
  .panel,
  .kpi-card,
  .table-wrap {
    border: 1px solid var(--m-border) !important;
    border-radius: 18px !important;
    background: var(--m-surface) !important;
    box-shadow: 0 18px 48px rgba(15, 23, 42, 0.08) !important;
  }

  .table-wrap,
  .ledger-table-wrap,
  .finance-payables-table-wrap {
    display: block !important;
    width: 100% !important;
    height: auto !important;
    min-height: 0 !important;
    max-height: none !important;
    overflow: auto !important;
    -webkit-overflow-scrolling: touch !important;
  }

  .data-table,
  .items-table,
  .dispensing-table,
  .admin-table,
  .po-items-table,
  .price-history-table {
    display: table !important;
    width: 100% !important;
    min-width: 760px !important;
    border-collapse: collapse !important;
    background: var(--m-surface) !important;
  }

  table.meta {
    display: table !important;
    width: 100% !important;
    min-width: 480px !important;
  }

  .data-table thead,
  .items-table thead,
  .dispensing-table thead,
  .admin-table thead,
  .po-items-table thead,
  .price-history-table thead {
    display: table-header-group !important;
  }

  .data-table tbody,
  .items-table tbody,
  .dispensing-table tbody,
  .admin-table tbody,
  .po-items-table tbody,
  .price-history-table tbody {
    display: table-row-group !important;
  }

  .data-table tr,
  .items-table tr,
  .dispensing-table tr,
  .admin-table tr,
  .po-items-table tr,
  .price-history-table tr {
    display: table-row !important;
    width: auto !important;
    margin: 0 !important;
    padding: 0 !important;
    border: 0 !important;
    border-radius: 0 !important;
    background: transparent !important;
  }

  .data-table tbody tr,
  .items-table tbody tr,
  .dispensing-table tbody tr,
  .admin-table tbody tr,
  .po-items-table tbody tr,
  .price-history-table tbody tr,
  #pastPurchasesTableBody tr,
  #purchaseDraftsTableBody tr,
  #purchasesTableBody tr,
  #pendingPoBody tr,
  #grnTableBody tr,
  #grnOpenPoList tbody tr,
  #supplierTableBody tr,
  #supplierMappingProductsBody tr,
  #supplierMappingSuppliersBody tr {
    display: table-row !important;
    width: auto !important;
    margin: 0 !important;
    padding: 0 !important;
    border: 0 !important;
    border-radius: 0 !important;
    background: transparent !important;
    box-shadow: none !important;
    grid-template-columns: none !important;
    gap: 0 !important;
  }

  .data-table th,
  .data-table td,
  .items-table th,
  .items-table td,
  .dispensing-table th,
  .dispensing-table td,
  .admin-table th,
  .admin-table td,
  .po-items-table th,
  .po-items-table td,
  .price-history-table th,
  .price-history-table td {
    display: table-cell !important;
    width: auto !important;
    padding: 13px 14px !important;
    text-align: left !important;
    vertical-align: middle !important;
    border-bottom: 1px solid var(--m-border) !important;
    border-right: 0 !important;
    white-space: nowrap !important;
  }

  .data-table td[data-label],
  .items-table td[data-label],
  .dispensing-table td[data-label],
  .admin-table td[data-label],
  .po-items-table td[data-label],
  .price-history-table td[data-label],
  #pastPurchasesTableBody td,
  #purchaseDraftsTableBody td,
  #purchasesTableBody td,
  #pendingPoBody td,
  #grnTableBody td,
  #grnOpenPoList tbody td,
  #supplierTableBody td,
  #supplierMappingProductsBody td,
  #supplierMappingSuppliersBody td,
  .data-table tbody tr > td:first-child,
  .items-table tbody tr > td:first-child,
  .dispensing-table tbody tr > td:first-child,
  .admin-table tbody tr > td:first-child,
  .po-items-table tbody tr > td:first-child,
  .price-history-table tbody tr > td:first-child,
  #pastPurchasesTableBody td:first-child,
  #purchaseDraftsTableBody td:nth-child(2),
  #purchasesTableBody td:first-child,
  #pendingPoBody td:first-child,
  #grnTableBody td:first-child,
  #grnOpenPoList tbody td:first-child,
  #supplierTableBody td:first-child,
  #supplierMappingProductsBody td:first-child,
  #supplierMappingSuppliersBody td:first-child {
    display: table-cell !important;
    width: auto !important;
    margin: 0 !important;
    padding: 13px 14px !important;
    border-bottom: 1px solid var(--m-border) !important;
    font-size: 0.8667rem !important;
    font-weight: 600 !important;
    color: var(--m-text) !important;
    grid-column: auto !important;
    grid-row: auto !important;
    text-align: left !important;
  }

  .data-table th,
  .items-table th,
  .dispensing-table th,
  .admin-table th,
  .po-items-table th,
  .price-history-table th {
    background: var(--m-surface-2) !important;
    color: var(--m-text-secondary) !important;
    font-size: 0.78rem !important;
    letter-spacing: 0.08em !important;
    text-transform: uppercase !important;
  }

  .data-table td::before,
  .items-table td::before,
  .dispensing-table td::before,
  .admin-table td::before,
  .po-items-table td::before,
  .price-history-table td::before {
    content: none !important;
  }

  .data-table tbody tr.table-fill-row,
  .data-table tbody tr.finance-table-filler,
  .data-table tbody tr.finance-petty-filler {
    display: none !important;
  }

  .pos-page .pos-left {
    padding-left: 0 !important;
    padding-right: 0 !important;
  }

  .pos-page .pos-results {
    padding: 0 !important;
    background: transparent !important;
  }

  #mainContent > div:has(#fullPageQueuedList),
  #mainContent > div:has(#fullPageQuotationsList),
  #mainContent > div:has(#fullSalesList),
  .mobile-credit-page {
    padding-left: 0 !important;
    padding-right: 0 !important;
  }

  #fullPageQueuedList {
    padding-left: 0 !important;
    padding-right: 0 !important;
  }

  .pos-page .drug-results-body:not(.is-grid) .drug-result-item {
    min-height: 0 !important;
    padding: 10px 10px !important;
    gap: 8px 8px !important;
    grid-template-columns: minmax(0, 1fr) minmax(60px, 66px) !important;
    border-radius: 15px !important;
  }

  .pos-page .drug-results-body:not(.is-grid) .drug-result-main {
    gap: 10px !important;
  }

  .pos-page .drug-results-body:not(.is-grid) .drug-icon {
    width: 34px !important;
    height: 34px !important;
    font-size: 1.16rem !important;
  }

  .pos-page .drug-results-body:not(.is-grid) .drug-result-name {
    font-size: 0.94rem !important;
    line-height: 1.28 !important;
  }

  .pos-page .drug-results-body:not(.is-grid) .drug-result-sub {
    font-size: 0.81rem !important;
    line-height: 1.28 !important;
  }

  .pos-page .drug-results-body:not(.is-grid) .drug-result-stock,
  .pos-page .drug-results-body:not(.is-grid) .drug-result-price {
    font-size: 0.8rem !important;
  }

  .pos-page .drug-results-body:not(.is-grid) .drug-quick-add {
    height: 42px !important;
    min-width: 60px !important;
    width: 60px !important;
    border-radius: 9px !important;
    font-size: 0.8rem !important;
  }
}
