/* ============================================
   VoiceIsolate Pro v22.1 — Mobile Styles
   Capacitor Android/iOS native shell support
   Safe area insets, touch targets, gestures
   Complete mobile UI layout
   ============================================ */

/* ── Safe Area Insets (iPhone notch / Android cutout) ── */
:root {
  --safe-top: env(safe-area-inset-top, 0px);
  --safe-right: env(safe-area-inset-right, 0px);
  --safe-bottom: env(safe-area-inset-bottom, 0px);
  --safe-left: env(safe-area-inset-left, 0px);
  /* Mobile-specific sizing (premium v4) */
  --mob-slider-track: 7px;
  --mob-slider-thumb: 26px;
  --mob-touch-min: 44px;
}

/* ── Capacitor Native Shell Overrides ── */
.capacitor-native body {
  padding-top: var(--safe-top);
  padding-bottom: var(--safe-bottom);
  padding-left: var(--safe-left);
  padding-right: var(--safe-right);
  overscroll-behavior: none;
  -webkit-overflow-scrolling: touch;
}

.capacitor-native .hdr {
  padding-top: calc(0.5rem + var(--safe-top));
}

.capacitor-native .ftr {
  padding-bottom: calc(0.75rem + var(--safe-bottom));
}

/* ── Smooth scrolling + font size lock ── */
html {
  scroll-behavior: smooth;
  -webkit-text-size-adjust: 100%;
}

/* ── Prevent text selection on UI controls ── */
.btn,
.tab,
.hdr,
.presets-row,
.actions-row,
.save-row,
.transport-row {
  -webkit-user-select: none;
  user-select: none;
  -webkit-tap-highlight-color: transparent;
}

.upload-zone {
  -webkit-tap-highlight-color: transparent;
  touch-action: manipulation;
}

/* ═══════════════════════════════════════════
   BREAKPOINT: Tablet / phablet  ≤ 960px
   ═══════════════════════════════════════════ */
@media (max-width: 960px) {
  .main-grid {
    grid-template-columns: minmax(0, 1fr);
    margin: 6px auto;
    padding: 0 8px 80px; /* room for mobile action bar */
  }

  /* Visualisations above controls on tablet */
  .col-right { order: -1; }
  .col-left  { order:  1; }

  .wave-row { grid-template-columns: 1fr; }
  .stats-row { grid-template-columns: repeat(2, 1fr); }
  .ftr { flex-direction: column; text-align: center; gap: 2px; }
}

/* ═══════════════════════════════════════════
   BREAKPOINT: Mobile  ≤ 768px
   ═══════════════════════════════════════════ */
@media (max-width: 768px) {

  /* ── Scroll padding for the fixed bottom action bar ──────────────────────
     `.mobile-action-bar` is `position: fixed` at z-index 200 and owns the
     bottom ~61px of the viewport. Below 768px the console collapses to one
     column, so the DOCUMENT is the scroller and nothing kept programmatic
     scrolling out of that band: `scrollIntoView`, `#anchor` navigation and
     focus-driven scrolling all parked controls underneath it, where
     `elementFromPoint` returns the bar and a click never reaches them (three
     DSP lock buttons, measured in Chromium at 768px). The rack column has its
     own `scroll-padding-bottom` for when it is the scroller; this is the
     document-level equivalent.

     The top inset stays on the measured header height. The `.hdr { position:
     static }` rule below does NOT win on the Engineer surface — precision-
     studio.css has `body.ps-workstation .hdr { position: sticky }` at (0,2,0)
     against this rule's (0,1,0), and specificity beats source order — so the
     header is still sticky here, measured at 269px (390px) and 191px (768px).
     A flat inset would bury scroll targets under it. */
  :root {
    scroll-padding-bottom: calc(72px + var(--safe-bottom, 0px));
    scroll-padding-top: calc(var(--vip-hdr-h, var(--titlebar-h, 48px)) + 8px);
  }

  /* ── Header ── */
  .hdr {
    padding: 8px 12px;
    gap: 8px;
    /* Stacked on narrow screens the bar is 190px+ tall — a quarter of a phone
       viewport. Let it scroll away instead of pinning it; the bottom
       `.mobile-action-bar` keeps primary navigation reachable. */
    position: static;
  }
  .hdr-left,
  .hdr-actions {
    flex-wrap: wrap;
    justify-content: center;
    max-width: 100%;
  }
  .hdr-left { gap: 8px; }
  .hdr-icon { width: 30px; height: 30px; border-radius: 6px; }
  .hdr-title { font-size: 0.95rem; }
  .hdr-ver   { font-size: 0.65rem; }
  .hdr-badge { font-size: 0.5rem; padding: 1px 5px; }

  /* Stats collapsed by default, toggled via JS .expanded */
  .hdr-stats { display: none; width: 100%; }
  .hdr-stats.expanded {
    display: grid;
    grid-template-columns: repeat(4, 1fr);
    gap: 4px 8px;
    padding-top: 6px;
    border-top: 1px solid rgba(255,255,255,0.06);
  }
  .hdr-stat { text-align: center; }
  .hs-val   { font-size: 0.72rem; }
  .hs-lbl   { font-size: 0.5rem; }

  /* Stats toggle button (injected by app.js or present in HTML) */
  .hdr-stats-toggle {
    display: flex;
    align-items: center;
    justify-content: center;
    width: 30px;
    height: 30px;
    background: rgba(255,255,255,0.05);
    border: 1px solid rgba(255,255,255,0.08);
    border-radius: 6px;
    cursor: pointer;
    color: var(--dim);
    font-size: 14px;
    -webkit-tap-highlight-color: transparent;
    flex-shrink: 0;
  }
  .hdr-stats-toggle:active { background: rgba(255,255,255,0.1); }

  /* ── Cards ── */
  .card { padding: 8px; border-radius: 8px; }

  /* ── Upload ── */
  .upload-zone { padding: 14px 10px; }

  /* ── Tabs ── */
  .tabs {
    overflow-x: auto;
    -webkit-overflow-scrolling: touch;
    scrollbar-width: none;
    flex-wrap: nowrap;
    gap: 4px;
    padding-bottom: 2px;
    touch-action: pan-x;
  }
  .tabs::-webkit-scrollbar { display: none; }
  .tab,
  .tab-btn {
    padding: 10px 14px;
    font-size: 0.68rem;
    border-radius: 8px;
    min-height: var(--mob-touch-min);
    flex-shrink: 0;
    touch-action: manipulation;
  }

  /* ── Slider panels ── */
  .panels {
    max-height: none;
    overflow-y: visible;
    padding: 4px 6px 6px;
    border-radius: 8px;
  }

  /* ── Slider rows: label + controls / track / hint panel ── */
  .sr-row {
    display: grid;
    grid-template-columns: minmax(0, 1fr) auto auto auto;
    grid-template-rows: auto auto auto;
    gap: 4px 6px;
    padding: 9px 8px;
    border-radius: 8px;
  }
  /* Canonical DspSlider rows nest the range in .dsp-slider-track-wrap.
     Keep the same touch-first layout on Capacitor instead of falling back to
     the desktop five-column grid after the row mounts. */
  .sr-row.dsp-slider-row {
    grid-template-columns: minmax(0, 1fr) auto auto auto;
    grid-template-rows: auto auto auto;
    grid-template-areas:
      "label num reset lock"
      "track track track track"
      "hint hint hint hint";
    gap: 4px 6px;
    padding: 9px 8px;
  }
  .dsp-slider-row .sr-label {
    grid-area: label;
    grid-column: auto;
    grid-row: auto;
  }
  .dsp-slider-row .dsp-slider-num-wrap {
    grid-area: num;
    min-width: 48px;
  }
  .dsp-slider-row .slider-reset-btn { grid-area: reset; }
  .dsp-slider-row .slider-lock-btn { grid-area: lock; }
  .dsp-slider-row .dsp-slider-track-wrap {
    grid-area: track;
    grid-column: auto;
    grid-row: auto;
    min-height: var(--mob-touch-min);
  }
  .dsp-slider-row .dsp-slider-track-wrap,
  .dsp-slider-row .dsp-slider-track-wrap .slider-tick-wrapper {
    width: 100%;
  }
  .dsp-slider-row .slider-hint,
  .dsp-slider-row .slider-hint-btn,
  .dsp-slider-row .info-btn,
  .dsp-slider-row .info-popover {
    grid-column: 1 / -1;
  }
  .sr-label {
    grid-column: 1;
    grid-row: 1;
    font-size: 0.72rem;
    font-weight: 600;
    color: var(--text);
    white-space: normal;
    overflow: visible;
    text-overflow: unset;
    line-height: 1.3;
    align-self: center;
  }
  .sr-info {
    display: inline-flex;
    width: 22px;
    height: 22px;
    font-size: 0.62rem;
    margin-left: 4px;
  }
  .sr-desc { font-size: 0.72rem; padding: 9px 10px; }
  .sr-val {
    grid-column: 2;
    grid-row: 1;
    font-size: 0.7rem;
    padding: 3px 7px;
    align-self: center;
    min-width: 48px;
    text-align: center;
  }
  .slider-hint-btn {
    grid-column: 3;
    grid-row: 1;
    align-self: center;
    justify-self: center;
  }
  .info-btn {
    grid-column: 4;
    grid-row: 1;
    align-self: center;
    justify-self: center;
    margin-left: 0;
  }
  .sr-row > input[type="range"],
  .sr-row > .slider-tick-wrapper {
    grid-column: 1 / -1;
    grid-row: 2;
  }
  .sr-row > input[type="range"],
  .dsp-slider-row .dsp-slider-track-wrap input[type="range"] {
    height: var(--mob-slider-track);
    border-radius: calc(var(--mob-slider-track) / 2);
  }
  .sr-row > input[type="range"]::-webkit-slider-runnable-track,
  .dsp-slider-row .dsp-slider-track-wrap input[type="range"]::-webkit-slider-runnable-track {
    height: var(--mob-slider-track);
  }
  .sr-row > input[type="range"]::-webkit-slider-thumb,
  .dsp-slider-row .dsp-slider-track-wrap input[type="range"]::-webkit-slider-thumb {
    width: var(--mob-slider-thumb);
    height: var(--mob-slider-thumb);
    margin-top: calc((var(--mob-slider-thumb) / -2) + (var(--mob-slider-track) / 2));
    border-width: 3px;
  }
  .sr-row > input[type="range"]::-moz-range-thumb,
  .dsp-slider-row .dsp-slider-track-wrap input[type="range"]::-moz-range-thumb {
    width: var(--mob-slider-thumb);
    height: var(--mob-slider-thumb);
    border-width: 3px;
  }
  .slider-hint {
    grid-column: 1 / -1;
    grid-row: 3;
    font-size: 0.72rem;
    padding: 9px 10px;
  }
  .hint-aids-row { gap: 6px; }
  .hint-range-meter { min-width: 0; flex: 1 1 100%; }
  .hint-body { font-size: 0.72rem; }
  .hint-chip, .hint-example-pill { font-size: 0.68rem; }
  /* Two-class selectors: slider-theme.css states the whisper template as
     `.sr-row.whisper-mode-row` (0,2,0), and a bare `.whisper-mode-row` here
     would lose to it however late this sheet loads. Touch layouts must keep
     `--mob-touch-min` (44px) hit targets — with the desktop template winning,
     the hint button rendered 22px wide at 768px. */
  .sr-row.whisper-mode-row,
  .slider-row.whisper-mode-row {
    grid-template-columns: minmax(0, 1fr) var(--mob-touch-min) var(--mob-touch-min) var(--mob-touch-min);
    grid-template-areas:
      "label reset lock hint"
      "group group group group"
      "panel panel panel panel";
    grid-template-rows: auto auto auto;
  }
  .whisper-mode-row .whisper-mode-group { grid-area: group; }
  .whisper-mode-row .whisper-mode-reset { grid-area: reset; }
  .whisper-mode-row .slider-lock-btn { grid-area: lock; }
  .whisper-mode-row .slider-hint-btn { grid-area: hint; width: var(--mob-touch-min); }
  .whisper-mode-row .slider-hint { grid-area: panel; }

  /* WhisperHunter — full-width touch target on mobile/Android */
  #btn-whisper-hunter {
    min-height: var(--mob-touch-min, 44px);
    padding: 14px 16px;
    font-size: 0.95rem;
    touch-action: manipulation;
    -webkit-tap-highlight-color: transparent;
  }
  #btn-whisper-hunter:disabled {
    opacity: 0.55;
    cursor: not-allowed;
    transform: none;
    box-shadow: none;
  }

  /* RT badge sizing */
  .rt-badge { font-size: 0.5rem; padding: 1px 5px; }

  /* ── Presets row ── */
  .presets-row {
    overflow-x: auto;
    -webkit-overflow-scrolling: touch;
    scrollbar-width: none;
    flex-wrap: nowrap !important;
    padding-bottom: 4px;
    gap: 5px;
  }
  .presets-row::-webkit-scrollbar { display: none; }
  .btn-preset {
    padding: 6px 11px;
    font-size: 0.65rem;
    border-radius: 7px;
    white-space: nowrap;
    flex-shrink: 0;
  }
  .presets-label { flex-shrink: 0; }

  /* Custom preset input area */
  .custom-preset-actions {
    flex-shrink: 0;
    gap: 5px !important;
  }

  /* ── Action buttons ── */
  .actions-row {
    flex-direction: column;
    gap: 6px;
  }
  .actions-row .btn {
    width: 100%;
    justify-content: center;
    font-size: 0.78rem;
    padding: 11px 14px;
    border-radius: 9px;
  }

  /* ── Pipeline box ── */
  .pipeline-box { padding: 8px 10px; }
  .pipe-bar { height: 5px; border-radius: 3px; }
  .pipe-fill { border-radius: 3px; }

  /* ── Save row ── */
  .save-row { flex-wrap: wrap; gap: 5px; }
  .save-row .btn { flex: 1 1 auto; justify-content: center; }

  /* ── Tech card ── */
  .tech-features-grid { grid-template-columns: 1fr !important; }
  .tech-stack-row { flex-wrap: wrap; }
  .tech-pipeline-flow { flex-direction: column; align-items: flex-start; gap: 4px; }
  .tpf-arrow { transform: rotate(90deg); margin-left: 8px; }

  /* ── Stats row ── */
  .stats-row { grid-template-columns: repeat(2, 1fr); gap: 5px; }

  /* ── Footer ── */
  .ftr { flex-direction: column; text-align: center; gap: 2px; font-size: 0.54rem; }

  /* ── Transport controls ── */
  .transport-card { padding: 8px; }
  .transport-row {
    display: grid;
    grid-template-columns: repeat(5, auto) 1fr;
    grid-template-rows: auto auto;
    gap: 6px;
    align-items: center;
  }
  .btn-tp {
    padding: 8px;
    border-radius: 8px;
  }
  #tpPlay, #tpPause, #tpStop, #tpRew, #tpFwd { grid-row: 1; }
  .tp-time {
    grid-row: 1;
    grid-column: 6;
    text-align: right;
    font-size: 0.65rem;
  }
  .transport-seek {
    width: 100%;
    padding: 12px 0 8px;
    min-height: var(--mob-touch-min);
    touch-action: manipulation;
  }
  .tp-seek {
    width: 100%;
    padding: 14px 0;
    min-height: var(--mob-touch-min);
  }
  .tp-speed { display: none; }
  .tp-ab {
    grid-row: 1;
    grid-column: 5;
    display: none;
  }
  .tp-ab-label { display: none; }

  /* ── Visualizations ── */
  .wave-row { grid-template-columns: 1fr !important; gap: 6px; }
  .spectro3d-container { height: 160px; }
  .spectro2d { height: 90px; }
  .wave-cv   { height: 60px; }
  .freq-cv   { height: 70px; }
  .fs-wrap   { height: 130px; }
  .viz-hdr   { flex-direction: column; align-items: flex-start; gap: 4px; }
  .viz-actions { flex-wrap: wrap; gap: 4px; width: 100%; }
  .btn-viz-gallery,
  .btn-viz-tab-nav,
  .btn-viz-minimize,
  #fullscreenSpectroBtn {
    min-height: var(--mob-touch-min);
    padding: 8px 12px;
    touch-action: manipulation;
  }
  .viz-tab-rail__scroll{scrollbar-width:auto}
  .viz-card .tab-btn{flex-shrink:0}
  .viz-card.viz-gallery .panel {
    margin-bottom: 10px;
    padding: 6px;
  }
  .viz-card.viz-gallery .spectro3d-container { height: 120px; }
  .viz-card.viz-gallery .spectro2d { height: 72px; }
  .viz-card.viz-gallery .freq-cv { height: 48px; }
  .viz-card.viz-gallery .wave-cv { height: 48px; }

  /* ── Sticky mobile action bar ── */
  .mobile-action-bar {
    position: fixed;
    bottom: 0;
    left: 0;
    right: 0;
    z-index: 200;
    background: rgba(6,6,9,0.97);
    backdrop-filter: blur(20px);
    -webkit-backdrop-filter: blur(20px);
    border-top: 1px solid rgba(0,245,255,0.12);
    padding: 8px 12px calc(8px + var(--safe-bottom));
    display: flex;
    gap: 8px;
    align-items: center;
  }
  .mobile-action-bar .btn-primary {
    flex: 1;
    justify-content: center;
    font-size: 0.82rem;
    padding: 12px 16px;
    border-radius: 10px;
  }
  .mobile-action-bar .btn-reprocess,
  .mobile-action-bar .btn-danger {
    flex-shrink: 0;
    padding: 12px 14px;
    border-radius: 10px;
  }

  /* Hide the in-panel actions-row on mobile (moved to sticky bar) */
  .actions-row { display: none; }

  /* Toasts sat at bottom:24px, over the Process button, for 4 s after
     every upload ("Decoded: … run Analyze or Process"). The top edge is the
     sticky header, which scroll-padding-top already keeps content out of, so
     a toast there never covers a control that was scrolled into view. */
  #toastRegion {
    top: calc(8px + env(safe-area-inset-top, 0px));
    bottom: auto;
    right: 12px;
    left: 12px;
  }
  /* Up there a toast overlaps the sticky header for its 4 s. Toasts have
     no controls of their own, so let taps pass through to the header. */
  #toastRegion .toast { pointer-events: none; }
}

/* ═══════════════════════════════════════════
   BREAKPOINT: Small phones  ≤ 480px
   ═══════════════════════════════════════════ */
@media (max-width: 480px) {
  .hdr-stats.expanded {
    grid-template-columns: repeat(3, 1fr);
  }
  /* Forensic toggle — move to bottom of stats on tiny screens */
  .forensic-toggle-wrap {
    grid-column: 1 / -1;
    justify-content: center;
    padding-top: 2px;
  }
  .sr-label { font-size: 0.7rem; }
  .sr-val   { font-size: 0.67rem; min-width: 46px; }
  .tab      { padding: 6px 10px; font-size: 0.65rem; }
}

/* ═══════════════════════════════════════════
   TOUCH INPUT (pointer: coarse)
   Applies to any touch device regardless of size
   ═══════════════════════════════════════════ */
@media (pointer: coarse) {
  /* WCAG 2.5.5 — 44×44 px minimum touch targets */
  .btn,
  .tab,
  .btn-tp,
  .btn-preset,
  .slider-hint-btn,
  .info-btn,
  .hint-example-pill,
  .info-popover-apply {
    min-height: var(--mob-touch-min);
    min-width: var(--mob-touch-min);
  }
  .slider-hint-btn,
  .info-btn {
    width: var(--mob-touch-min);
    height: var(--mob-touch-min);
    line-height: var(--mob-touch-min);
    font-size: 14px;
  }
  .hint-example-pill {
    padding: 8px 12px;
    font-size: 0.72rem;
  }

  /* Slider hit-area — invisible expansion */
  input[type="range"] {
    cursor: pointer;
    padding: 14px 0; /* expands tap area without changing visual height */
  }

  /* Haptic visual cue on active */
  .btn:active {
    transform: scale(0.96);
    transition: transform 0.08s ease;
  }

  /* Tap highlight removed */
  .btn,
  .tab,
  input[type="range"] {
    -webkit-tap-highlight-color: transparent;
  }
}

/* ═══════════════════════════════════════════
   STICKY MOBILE ACTION BAR
   Fixed bottom bar with primary action
   ═══════════════════════════════════════════ */
@media (max-width: 768px) {
  .mobile-action-bar {
    position: fixed;
    bottom: 0;
    left: 0;
    right: 0;
    z-index: 200;
    background: rgba(6,6,9,0.97);
    backdrop-filter: blur(20px);
    -webkit-backdrop-filter: blur(20px);
    border-top: 1px solid rgba(220,38,38,0.15);
    padding: 8px 12px calc(8px + var(--safe-bottom));
    display: flex;
    gap: 8px;
    align-items: center;
  }

  .mobile-action-bar .btn-primary {
    flex: 1;
    justify-content: center;
    font-size: 0.82rem;
    padding: 12px 16px;
    border-radius: 10px;
  }
  .mobile-action-bar .btn-reprocess,
  .mobile-action-bar .btn-danger {
    flex-shrink: 0;
    padding: 12px 14px;
    border-radius: 10px;
  }

  /* Hide the in-panel actions-row on mobile (moved to sticky bar) */
  .actions-row { display: none; }
}

/* ═══════════════════════════════════════════
   TRANSPORT CONTROLS  — mobile
   ═══════════════════════════════════════════ */
@media (max-width: 768px) {
  .transport-card { padding: 8px; }
  .transport-row {
    display: grid;
    grid-template-columns: repeat(5, auto) 1fr;
    grid-template-rows: auto auto;
    gap: 6px;
    align-items: center;
  }

  /* Playback buttons row 1 */
  .btn-tp {
    padding: 8px;
    border-radius: 8px;
  }
  #tpPlay, #tpPause, #tpStop, #tpRew, #tpFwd { grid-row: 1; }

  /* Time display */
  .tp-time {
    grid-row: 1;
    grid-column: 6;
    text-align: right;
    font-size: 0.65rem;
  }

  /* Seek slider full width row 2 */
  .tp-seek {
    grid-row: 2;
    grid-column: 1 / -1;
    width: 100%;
    padding: 14px 0; /* touch area */
  }

  /* Speed + AB on row 2 — hide or compact */
  .tp-speed { display: none; }
  .tp-ab {
    grid-row: 1;
    grid-column: 5;
    display: none; /* show via .transport-row.has-audio .tp-ab if desired */
  }
  .tp-ab-label { display: none; }
}

/* ═══════════════════════════════════════════
   VISUALIZATIONS — mobile
   ═══════════════════════════════════════════ */
@media (max-width: 768px) {
  .wave-row { grid-template-columns: 1fr !important; gap: 6px; }
  .spectro3d-container { height: 160px; }
  .spectro2d { height: 90px; }
  .wave-cv   { height: 60px; }
  .freq-cv   { height: 70px; }
  .fs-wrap   { height: 130px; }
  .viz-hdr   { flex-direction: column; align-items: flex-start; gap: 4px; }
  .viz-actions { flex-wrap: wrap; gap: 4px; width: 100%; }
  .tab-btn {
    min-height: var(--mob-touch-min);
    padding: 10px 12px;
    flex-shrink: 0;
    touch-action: manipulation;
  }
  .transport-seek {
    width: 100%;
    padding: 12px 0 8px;
    min-height: var(--mob-touch-min);
  }
  .btn-viz-gallery,
  .btn-viz-tab-nav,
  .btn-viz-minimize,
  #fullscreenSpectroBtn {
    min-height: var(--mob-touch-min);
    padding: 8px 12px;
  }
  .viz-card.viz-gallery .panel { margin-bottom: 10px; }
}

/* ═══════════════════════════════════════════
   VIDEO + EXPLANATIONS + SPINNER — mobile
   ═══════════════════════════════════════════ */
@media (max-width: 768px) {
  .video-el { max-height: 42vh; }
  .video-hdr { font-size: 0.7rem; }
  .video-note { font-size: 0.6rem; }
  .group-desc { font-size: 0.68rem; padding: 9px 11px; }
  .vip-sonar-spinner { width: 20px; height: 20px; }
}

/* ═══════════════════════════════════════════
   STATUS BAR (standalone/PWA mode)
   ═══════════════════════════════════════════ */
@media (display-mode: standalone) {
  body { background-color: #0a0a0f; }
  .hdr { padding-top: calc(0.5rem + var(--safe-top)); }
}
