/* T.H.O.M.A.S. shared interface system. */

:root {
  /* One canonical interface token layer. The final values preserve the
     Lavender clinical system that the app already presents. */
  --bg-subtle: #0d1218;
  --primary-surface: #b5f0e8;
  --primary-text: #2dd4bf;
  --info: #82c7f5;
  --info-rgb: 130, 199, 245;
  --info-soft: rgba(130, 199, 245, 0.08);
  --cyan-soft: var(--info-soft);
  --text-on-primary: #06231f;
  --border-focus: var(--primary);
  --shadow-xs: none;
  --shadow-xl: 0 16px 48px rgba(0, 0, 0, 0.40);
  --shadow-hover: 0 4px 20px rgba(0, 0, 0, 0.28);
  --shadow-focus: 0 0 0 3px rgba(var(--primary-rgb), 0.28);
  --glow-cyan: 0 4px 20px rgba(130, 199, 245, 0.10);
  --glow-lime: 0 4px 20px rgba(66, 211, 146, 0.10);
  --radius-pill: 100px;
  --font-main: 'DM Sans', system-ui, -apple-system, sans-serif;
  --ease-spring: var(--ease-emphasized);
  --ease-wqf: var(--ease-emphasized);
  --duration-slow: var(--dur-slow);
  --z-base: 1;
  --z-dropdown: 100;
  --z-toast: 1000;
  --z-modal: 2200;
  --z-banner-active: 2300;
  --z-banner-impersonation: 2350;
  --z-overlay-gen: 2400;
  --z-help-tip: 2800;
  --ghost-border: 1px solid var(--border);
  --duration-fast: var(--dur-fast);
  --duration-normal: var(--dur-normal);
  --ease-out: var(--ease-standard);
  --liquid-duration: var(--dur-slow);
  --liquid-spring: var(--ease-emphasized);
  --glass-blur: var(--blur-lg);
  --glass-saturation: 170%;
  --glass-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.88),
    inset 0 -1px 0 rgba(255, 255, 255, 0.24),
    0 12px 38px rgba(37, 55, 82, 0.1),
    0 2px 8px rgba(37, 55, 82, 0.05);
  --glass-shadow-hover: inset 0 1px 0 rgba(255, 255, 255, 0.96),
    inset 0 -1px 0 rgba(255, 255, 255, 0.32),
    0 20px 50px rgba(37, 55, 82, 0.14),
    0 4px 12px rgba(37, 55, 82, 0.07);
  --control-height: 2.75rem;
  --content-max: 1180px;
  --app-content-max: 1600px;
  --font-display: -apple-system, BlinkMacSystemFont, "SF Pro Display", system-ui, "Segoe UI", Roboto, sans-serif;
  --font-body: -apple-system, BlinkMacSystemFont, "SF Pro Text", system-ui, "Segoe UI", Roboto, sans-serif;
  --font-serif: ui-serif, Georgia, serif;
  --font-mono: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace;
  --sidebar-w: 17rem;
  --lv-solid: #0071e3;
  --lv-solid-grad: linear-gradient(90deg, #0071e3, #4a9bf0);
  color-scheme: light;
  --bg: #e8e8ed;
  --bg-elevated: #ffffff;
  --bg-card: #ffffff;
  --bg-surface: #e8e8ed;
  --surface: #ffffff;
  --surface-0: #ffffff;
  --surface-1: #ffffff;
  --surface-2: #f2f2f5;
  --surface-3: #d2d2d7;
  --surface-lowest: #f2f2f5;
  --surface2: #f2f2f5;
  --surface3: #e3e3e8;
  --surface-hover: #eaeaef;
  --border: rgba(0, 0, 0, 0.13);
  --border-strong: rgba(0, 0, 0, 0.22);
  --border-bright: rgba(0, 113, 227, 0.5);
  --text: #1d1d1f;
  --text-primary: #1d1d1f;
  --text-secondary: #6e6e73;
  --text-tertiary: #8e8e93;
  --text-muted: #8e8e93;
  --primary: #0071e3;
  --primary-hover: #0077ed;
  --primary-active: #0058b0;
  --primary-rgb: 0, 113, 227;
  --focus-ring: #0071e3;
  --primary-soft: rgba(0, 113, 227, 0.10);
  --primary-muted: rgba(0, 113, 227, 0.35);
  --accent: #0071e3;
  --accent-hover: #0077ed;
  --accent-ink: #ffffff;
  --text-on-accent: #ffffff;
  --status-ink: #ffffff;
  --accent-dim: rgba(0, 113, 227, 0.12);
  --accent-soft: rgba(0, 113, 227, 0.08);
  --accent-cyan: #3d78c9;
  --cyan: #3d78c9;
  --teal: #0071e3;
  --green: #2e7d55;
  --lime: #2e7d55;
  --success: #2e7d55;
  --success-rgb: 46, 125, 85;
  --success-soft: #eef7f1;
  --lime-soft: #eef7f1;
  --amber: #8a5a00;
  --warning: #8a5a00;
  --warning-rgb: 138, 90, 0;
  --warning-soft: #fbf3e6;
  --red: #b23a54;
  --error: #b23a54;
  --error-rgb: 178, 58, 84;
  --error-text: #98304a;
  --error-soft: #fbeef0;
  --purple: #5b3ea3;
  --tier-none: #6a6377;
  --tier-lite: #5b3ea3;
  --tier-pro: #8a5a00;
  --tier-departamento: #2e7d55;
  --tier-decanatura: #006b73;
  --tier-institucional: #7c5cd6;
  --radius-xs: 9px;
  --radius-sm: 11px;
  --radius-md: 14px;
  --radius-lg: 18px;
  --radius-xl: 24px;
  --shadow-sm: 0 1px 3px rgba(0, 0, 0, 0.12);
  --shadow-md: 0 2px 10px rgba(0, 0, 0, 0.06);
  --shadow-lg: 0 20px 60px rgba(0, 0, 0, 0.14);
  --glass-surface: rgba(255, 255, 255, 0.72);
  --glass-surface-strong: rgba(255, 255, 255, 0.85);
  --glass-surface-soft: rgba(250, 248, 253, 0.6);
  --glass-edge: rgba(0, 113, 227, 0.16);
  --glass-edge-strong: rgba(0, 113, 227, 0.24);
  --lv-sidebar: #ededf0;
  --lv-input: #f5f2fb;
  --lv-active-text: #0058b0;
  --lv-primary-active-bg: rgba(0, 113, 227, 0.12);
  --lv-pill-bg: #ffffff;
  --lv-pill-border: rgba(0, 0, 0, 0.10);
  --lv-pill-shadow: 0 1px 3px rgba(0, 0, 0, 0.12);

  /* Responsive type and spacing scales. */
  --space-0: 0;
  --space-1: 0.25rem;
  --space-2: 0.5rem;
  --space-3: 0.75rem;
  --space-4: 1rem;
  --space-5: 1.25rem;
  --space-6: 1.5rem;
  --space-7: 1.75rem;
  --space-8: 2rem;
  --space-10: 2.5rem;
  --space-12: 3rem;
  --space-14: 3.5rem;
  --space-16: 4rem;
  --space-20: 5rem;
  --space-24: 6rem;
  --text-2xs: 0.625rem;
  --text-xs: 0.6875rem;
  --text-sm: 0.75rem;
  --text-label: 0.8125rem;
  --text-body-sm: 0.875rem;
  --text-body: 1rem;
  --text-body-lg: 1.125rem;
  --text-title-sm: 1.25rem;
  --text-title: 1.5rem;
  --text-display: clamp(2.25rem, 5vw, 4rem);
  /* Tracking is size-specific: display type reads too loose as it grows and
     needs negative tracking; body sits at zero; only small caps take positive.
     A single global letter-spacing is wrong at one end of the scale. */
  --track-display: -0.022em;
  --track-title: -0.015em;
  --track-heading: -0.01em;
  --track-tight: -0.02em;
  --track-normal: 0;
  --track-wide: 0.04em;
  --track-label: 0.06em;
  /* Leading runs inverse to size — tight on display, open on body copy. */
  --leading-display: 1.05;
  --leading-title: 1.15;
  --leading-heading: 1.25;
  --leading-body: 1.5;
  --shadow-1: 0 1px 3px rgba(0, 0, 0, 0.12);
  --shadow-2: 0 2px 10px rgba(0, 0, 0, 0.08);
  --shadow-3: 0 8px 24px rgba(0, 0, 0, 0.12);
  --shadow-4: 0 20px 48px rgba(0, 0, 0, 0.16);
  --shadow-5: 0 32px 72px rgba(0, 0, 0, 0.2);
  --dur-instant: 100ms;
  --dur-fast: 160ms;
  --dur-normal: 240ms;
  --dur-slow: 400ms;
  --ease-standard: cubic-bezier(0.2, 0.8, 0.2, 1);
  --ease-emphasized: cubic-bezier(0.16, 1, 0.3, 1);
  --blur-xs: 4px;
  --blur-sm: 8px;
  --blur-md: 20px;
  --blur-lg: 28px;
  --blur-xl: 40px;
  --font-main: var(--font-body);
  --text-on-primary: #ffffff;
  --primary-text: var(--primary);
  --border-focus: var(--focus-ring);
  --shadow-xs: var(--shadow-1);
  --shadow-sm: var(--shadow-1);
  --shadow-md: var(--shadow-2);
  --shadow-lg: var(--shadow-4);
  --shadow-xl: var(--shadow-5);
  --shadow-hover: var(--shadow-3);
  --duration-fast: var(--dur-fast);
  --duration-normal: var(--dur-normal);
  --duration-slow: var(--dur-slow);
  --ease-out: var(--ease-standard);
}

:root[data-theme="dark"] {
  --glass-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.13),
    inset 0 -1px 0 rgba(255, 255, 255, 0.025),
    0 14px 42px rgba(0, 0, 0, 0.32),
    0 3px 10px rgba(0, 0, 0, 0.2);
  --glass-shadow-hover: inset 0 1px 0 rgba(255, 255, 255, 0.2),
    inset 0 -1px 0 rgba(255, 255, 255, 0.04),
    0 22px 56px rgba(0, 0, 0, 0.4),
    0 5px 15px rgba(0, 0, 0, 0.24);
  color-scheme: dark;
  --bg: #151019;
  --bg-elevated: #221a2e;
  --bg-card: #221a2e;
  --bg-surface: #1a1424;
  --surface: #221a2e;
  --surface-0: #221a2e;
  --surface-1: #2a2137;
  --surface-2: #1a1424;
  --surface-3: #372c49;
  --surface-lowest: #120d17;
  --surface2: #2a2137;
  --surface3: #372c49;
  --surface-hover: #2e2440;
  --border: rgba(255, 255, 255, 0.08);
  --border-strong: rgba(255, 255, 255, 0.15);
  --border-bright: rgba(10, 132, 255, 0.6);
  --text: #f1ecf9;
  --text-primary: #f1ecf9;
  --text-secondary: #b6adc9;
  --text-tertiary: #8b8299;
  --text-muted: #8b8299;
  --primary: #0a84ff;
  --primary-hover: #409cff;
  --primary-active: #0071e3;
  --primary-rgb: 10, 132, 255;
  --focus-ring: #409cff;
  --primary-soft: rgba(0, 113, 227, 0.20);
  --primary-muted: rgba(10, 132, 255, 0.38);
  --accent: #0a84ff;
  --accent-hover: #409cff;
  --accent-ink: #ffffff;
  --text-on-accent: #ffffff;
  --status-ink: #ffffff;
  --accent-dim: rgba(10, 132, 255, 0.2);
  --accent-soft: rgba(10, 132, 255, 0.14);
  --accent-cyan: #7fb2f2;
  --cyan: #7fb2f2;
  --teal: #0a84ff;
  --green: #5bd39a;
  --lime: #5bd39a;
  --success: #5bd39a;
  --success-rgb: 91, 211, 154;
  --success-soft: rgba(63, 157, 109, 0.18);
  --lime-soft: rgba(63, 157, 109, 0.18);
  --amber: #f0b968;
  --warning: #f0b968;
  --warning-rgb: 240, 185, 104;
  --warning-soft: rgba(240, 185, 104, 0.15);
  --red: #ef8fa4;
  --error: #ef8fa4;
  --error-rgb: 239, 143, 164;
  --error-text: #f3a9ba;
  --error-soft: rgba(200, 80, 105, 0.16);
  --purple: #b79aef;
  --tier-none: #8b8299;
  --tier-lite: #b79aef;
  --tier-pro: #f0b968;
  --tier-departamento: #5bd39a;
  --tier-decanatura: #4fc3cc;
  --tier-institucional: #9a7cf0;
  --shadow-sm: 0 1px 3px rgba(0, 0, 0, 0.3);
  --shadow-md: 0 2px 14px rgba(0, 0, 0, 0.28);
  --shadow-lg: 0 20px 60px rgba(0, 0, 0, 0.4);
  --glass-surface: rgba(34, 26, 46, 0.74);
  --glass-surface-strong: rgba(42, 33, 55, 0.86);
  --glass-surface-soft: rgba(21, 16, 25, 0.66);
  --glass-edge: rgba(10, 132, 255, 0.18);
  --glass-edge-strong: rgba(10, 132, 255, 0.28);
  --lv-sidebar: #1c1526;
  --lv-input: #2a2137;
  --lv-active-text: #e0d3fb;
  --lv-primary-active-bg: rgba(10, 132, 255, 0.32);
  --lv-pill-bg: rgba(255, 255, 255, 0.055);
  --lv-pill-border: rgba(255, 255, 255, 0.11);
  --lv-pill-shadow: 0 1px 3px rgba(0, 0, 0, 0.3);

  --shadow-1: 0 1px 3px rgba(0, 0, 0, 0.3);
  --shadow-2: 0 2px 14px rgba(0, 0, 0, 0.28);
  --shadow-3: 0 8px 24px rgba(0, 0, 0, 0.32);
  --shadow-4: 0 20px 60px rgba(0, 0, 0, 0.4);
  --shadow-5: 0 32px 80px rgba(0, 0, 0, 0.48);
  --font-main: var(--font-body);
  --text-on-primary: #ffffff;
  --primary-text: var(--primary);
  --border-focus: var(--focus-ring);
  --shadow-xs: var(--shadow-1);
  --shadow-sm: var(--shadow-1);
  --shadow-md: var(--shadow-2);
  --shadow-lg: var(--shadow-4);
  --shadow-xl: var(--shadow-5);
  --shadow-hover: var(--shadow-3);
}


/* Application compatibility rules, retained in their original cascade order. */

/* ════════════════════════════════════════════════════
   T.H.O.M.A.S. workspace rules
   Shared clinical interface
   ════════════════════════════════════════════════════ */

/* ─── Design Tokens — Visual Overhaul (Jun 2026) ───
   One accent family (teal), one info tone (sky), semantic colors carry
   the only warm notes. Every fg/bg pair below clears WCAG AA 4.5:1 on
   the surfaces it is documented for. --cyan and --lime survive as
   aliases so legacy component rules and JS fallbacks keep resolving. */


/* ─── Reset ─── */
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
html { scroll-behavior: smooth; }

body {
  font-family: var(--font-main);
  background: var(--bg);
  color: var(--text);
  line-height: 1.6;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  min-height: 100vh;
  /* Ambient radial wash — coral top-left, cyan top-right (per handoff) */
  background-image:
    radial-gradient(ellipse 60% 50% at 20% -5%, rgba(var(--primary-rgb), 0.08), transparent 60%),
    radial-gradient(ellipse 50% 40% at 90% 10%, rgba(var(--info-rgb), 0.05), transparent 65%);
  background-attachment: fixed;
}

::selection {
  background: var(--primary);
  color: var(--text-on-primary);
}

/* ─── Accessibility: skip-to-main-content link ───
   Visually hidden until focused (Tab from page load); becomes a coral
   chip in the top-left so keyboard/screen-reader users can jump past
   the tab navigation directly to the form. */
.skip-link {
  position: fixed;
  top: -100px;
  left: 12px;
  z-index: var(--z-help-tip);
  padding: 0.625rem 1rem;
  background: var(--primary);
  color: var(--text-on-primary);
  font-family: var(--font-main);
  font-size: 0.8125rem;
  font-weight: 600;
  text-decoration: none;
  border-radius: var(--radius-md);
  box-shadow: var(--shadow-lg);
  transition: top 150ms var(--ease-out);
}
.skip-link:focus,
.skip-link:focus-visible {
  top: 12px;
  outline: 2px solid var(--text-on-primary);
  outline-offset: 2px;
}

/* ─── Super-admin operational panel (/admin/system.html) ─── */
.sa-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
  gap: 0.75rem;
}
.sa-tile {
  background: var(--surface-1);
  border: 1px solid var(--surface-3);
  border-radius: var(--radius-md);
  padding: 0.875rem 1rem;
  display: flex;
  flex-direction: column;
  gap: 0.25rem;
  min-height: 92px;
}
.sa-tile-skel {
  background: var(--surface-2);
  animation: skPulse 1.5s ease-in-out infinite;
}
.sa-tile-label {
  font-family: var(--font-mono, monospace);
  font-size: 0.75rem;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--text-tertiary);
}
.sa-tile-value {
  font-size: 1.375rem;
  font-weight: 600;
  color: var(--text);
  font-family: var(--font-mono, monospace);
  letter-spacing: -0.01em;
}
.sa-tile-sub {
  font-size: 0.75rem;
  color: var(--text-secondary);
  line-height: 1.35;
}
.sa-tone-ok { border-left: 3px solid var(--success, #42d392); }
.sa-tone-warn { border-left: 3px solid var(--warning); }
.sa-tone-warn .sa-tile-value { color: var(--warning); }
.sa-tone-crit { border-left: 3px solid var(--error, #f4718a); }
.sa-tone-crit .sa-tile-value { color: var(--error, #f4718a); }

.sa-alert {
  display: flex;
  align-items: center;
  gap: 0.625rem;
  padding: 0.625rem 1rem;
  border-radius: var(--radius-md);
  font-size: 0.8125rem;
  margin-bottom: 0.5rem;
}
.sa-alert-ok {
  background: rgba(var(--success-rgb), 0.08);
  border: 1px solid rgba(var(--success-rgb), 0.28);
  color: var(--text);
}
.sa-alert-ok .icon { color: var(--success, #42d392); }
.sa-alert-warn {
  background: rgba(var(--warning-rgb), 0.08);
  border: 1px solid rgba(var(--warning-rgb), 0.32);
  color: var(--text);
}
.sa-alert-warn .icon { color: var(--warning); }
.sa-alert-crit {
  background: rgba(var(--error-rgb), 0.08);
  border: 1px solid rgba(var(--error-rgb), 0.36);
  color: var(--text);
}
.sa-alert-crit .icon { color: var(--error, #f4718a); }

.sa-table {
  width: 100%;
  border-collapse: collapse;
  font-size: 0.75rem;
}
.sa-table th {
  text-align: left;
  padding: 0.625rem 0.875rem;
  font-family: var(--font-mono, monospace);
  font-size: 0.75rem;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  color: var(--text-tertiary);
  border-bottom: 1px solid var(--surface-3);
}
.sa-table td {
  padding: 0.625rem 0.875rem;
  border-bottom: 1px solid rgba(255, 255, 255, 0.04);
  color: var(--text-secondary);
}
.sa-table tr:hover td { background: var(--surface-2); }

/* ─── Operator drill-in modal ─────────────────────────────────────────
   Used by /admin.html when an operator clicks a user row. Backdrop
   blocks pointer events on the dashboard behind it; the inner panel
   scrolls if content overflows the viewport. */
.sa-modal-backdrop {
  position: fixed; inset: 0;
  background: rgba(0, 0, 0, 0.72);
  -webkit-backdrop-filter: blur(var(--blur-xs));
  backdrop-filter: blur(var(--blur-xs));
  display: none;
  align-items: flex-start;
  justify-content: center;
  z-index: 1000;
  padding: 3rem 1rem;
  overflow-y: auto;
}
.sa-modal-backdrop.sa-modal-open { display: flex; }
.sa-modal {
  background: var(--surface-1);
  border: 1px solid var(--surface-3);
  border-radius: var(--radius-lg);
  width: 100%;
  max-width: 920px;
  box-shadow: 0 24px 64px rgba(0, 0, 0, 0.5);
}
.sa-modal-head {
  display: flex; align-items: center; gap: var(--space-3);
  padding: 0.875rem 1.125rem;
  border-bottom: 1px solid var(--surface-3);
}
.sa-modal-head strong { font-size: 0.9375rem; flex: 1; }
.sa-modal-close {
  background: none; border: none; cursor: pointer;
  color: var(--text-secondary);
  min-width: 44px; min-height: 44px;
  padding: 0.25rem; border-radius: 4px;
}
.sa-modal-close:hover { background: var(--surface-3); color: var(--text); }
.sa-modal-body { padding: 1.125rem; color: var(--text); font-size: var(--text-body-sm); line-height: 1.5; }
.sa-modal-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));
  gap: 0.625rem;
  margin-bottom: 1.125rem;
}
.sa-modal-cols {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 0.875rem;
}
@media (max-width: 720px) {
  .sa-modal-cols { grid-template-columns: 1fr; }
}
.sa-kpi-sub {
  font-size: 0.75rem;
  color: var(--text-tertiary);
  font-family: var(--font-mono, monospace);
  letter-spacing: 0.04em;
  margin-top: 0.125rem;
}

/* ─── Reformatter pipeline strip (pre-review + per-job) ───────────────
   Horizontal step indicator: dot → spinner → check / x. Shared between
   the inline upload pipeline (above the textarea) and the per-job row
   pipeline (in the jobs list). The compact variant tightens the gaps
   for use inside a job row. */
.rf-pipeline {
  display: flex;
  align-items: flex-start;
  gap: 0;
  padding: 0.875rem 0;
  flex-wrap: nowrap;
  overflow-x: auto;
}
.rf-pipeline[hidden] { display: none; }
.rf-pipeline-compact { padding: 0; }

/* ─── Persistent batch-failure card ─────────────────────────────────
   Sits at the top of the reformatter card. Unlike a toast it stays put
   until the user acts. Red-tinted surface; optional repair CTA. */
.rf-batch-error {
  border: 1px solid rgba(var(--error-rgb), 0.45);
  background: rgba(var(--error-rgb), 0.07);
  border-radius: var(--radius-md, 12px);
  padding: 0.875rem 1rem;
  margin-bottom: 1rem;
}
.rf-batch-error[hidden] { display: none; }
.rf-batch-error-head {
  display: flex;
  align-items: center;
  gap: 0.5rem;
  color: var(--error-text);
  font-size: 0.8125rem;
}
.rf-batch-error-head .icon { font-size: var(--text-body-lg); }
.rf-batch-error-head strong { flex: 1; font-weight: 600; }
.rf-error-dismiss {
  background: none; border: none; cursor: pointer;
  color: var(--text-tertiary);
  padding: 0.125rem; border-radius: 4px; line-height: 0;
}
.rf-error-dismiss:hover { background: var(--surface-3); color: var(--text); }
.rf-batch-error-detail {
  margin: 0.5rem 0 0;
  font-size: 0.75rem;
  color: var(--text-secondary);
  line-height: 1.5;
}
.rf-batch-error-hint {
  margin: 0.5rem 0 0;
  font-size: 0.75rem;
  color: var(--text-tertiary);
  line-height: 1.5;
}
.rf-batch-error-actions {
  margin-top: 0.75rem;
  display: flex;
  gap: 0.5rem;
  flex-wrap: wrap;
}
.rf-batch-error-actions:empty { display: none; }
.rf-pipe-step {
  display: flex;
  align-items: center;
  gap: 0.5rem;
  flex: 0 0 auto;
  font-size: 0.75rem;
}
.rf-pipe-dot-wrap {
  width: 22px; height: 22px;
  display: flex; align-items: center; justify-content: center;
  border-radius: 50%;
  flex: 0 0 22px;
}
.rf-pipe-dot {
  width: 8px; height: 8px;
  border-radius: 50%;
  background: var(--surface-3);
}
.rf-pipe-pending .rf-pipe-dot-wrap {
  background: transparent;
  border: 1px dashed var(--surface-3);
}
.rf-pipe-pending .rf-pipe-name { color: var(--text-tertiary); }
.rf-pipe-active .rf-pipe-dot-wrap {
  background: rgba(var(--primary-rgb), 0.12);
  border: 1px solid var(--primary);
}
.rf-pipe-active .rf-pipe-name { color: var(--text); font-weight: 600; }
.rf-pipe-done .rf-pipe-dot-wrap {
  background: var(--success, #42d392);
  color: var(--surface-0, #0a0e13);
}
.rf-pipe-done .rf-pipe-dot-wrap .icon { font-size: var(--text-body-sm); }
.rf-pipe-done .rf-pipe-name { color: var(--text-secondary); }
.rf-pipe-error .rf-pipe-dot-wrap {
  background: var(--error);
  color: var(--text-on-accent);
}
.rf-pipe-error .rf-pipe-dot-wrap .icon { font-size: var(--text-body-sm); }
.rf-pipe-error .rf-pipe-name { color: var(--error-text); font-weight: 600; }
.rf-pipe-spinner {
  width: 10px; height: 10px;
  border: 2px solid rgba(var(--primary-rgb), 0.3);
  border-top-color: var(--primary);
  border-radius: 50%;
  animation: rf-spin 0.9s linear infinite;
}
@keyframes rf-spin {
  to { transform: rotate(360deg); }
}
.rf-pipe-label { display: flex; flex-direction: column; line-height: 1.2; }
.rf-pipe-name { font-size: var(--text-sm); letter-spacing: 0.02em; }
.rf-pipe-sub {
  font-size: 0.75rem;
  color: var(--text-tertiary);
  font-family: var(--font-mono, monospace);
  margin-top: 0.0625rem;
}
.rf-pipe-rail {
  flex: 1 1 12px;
  min-width: 12px;
  height: 1px;
  background: var(--surface-3, #222d38);
  margin: 0 0.25rem;
  align-self: center;
}
.rf-pipe-step.rf-pipe-done + .rf-pipe-step .rf-pipe-rail,
.rf-pipeline-compact .rf-pipe-rail { min-width: 8px; }

/* Sticky in-flight banner — patterned on #impersonationBanner.
   Lives above the tab nav so the user sees it on every tab when a
   reformatter job is queued or processing. Clickable as a unit —
   takes them back to the jobs list. */
.rf-active-banner {
  position: sticky;
  top: 0;
  z-index: var(--z-banner-active);
  width: 100%;
  display: flex;
  align-items: center;
  gap: 0.625rem;
  padding: 0.5rem 1rem;
  background: linear-gradient(90deg, rgba(var(--primary-rgb), 0.95), rgba(var(--primary-rgb), 0.82));
  color: var(--text-on-primary);
  font-size: 0.75rem;
  font-weight: 500;
  letter-spacing: 0.02em;
  border: none;
  border-bottom: 1px solid rgba(255, 255, 255, 0.2);
  box-shadow: 0 1px 0 rgba(0, 0, 0, 0.2);
  cursor: pointer;
  text-align: left;
  font-family: inherit;
}
/* `display: flex` would otherwise override the HTML hidden attribute;
   restore the default UA `display: none` so the banner truly hides. */
.rf-active-banner[hidden] { display: none; }
.rf-active-banner:hover { filter: brightness(1.06); }
.rf-active-banner-icon {
  font-size: 1rem;
  animation: rf-pulse 2s ease-in-out infinite;
}
@keyframes rf-pulse {
  0%, 100% { opacity: 1; }
  50% { opacity: 0.55; }
}
.rf-active-banner-text { flex: 1 1 auto; }
.rf-active-banner-cta {
  font-family: var(--font-mono, monospace);
  font-size: 0.75rem;
  font-weight: 600;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  padding: 0.1875rem 0.625rem;
  border: 1px solid rgba(255, 255, 255, 0.5);
  border-radius: 4px;
}
.rf-jobs-highlight {
  animation: rf-jobs-flash 2s ease-out;
}
@keyframes rf-jobs-flash {
  0%   { box-shadow: 0 0 0 4px rgba(var(--primary-rgb), 0.6); }
  100% { box-shadow: 0 0 0 0 rgba(var(--primary-rgb), 0); }
}

/* Sticky banner shown when this tab carries an impersonation token.
   Coral background so it's impossible to miss; high z-index so it sits
   above modals; offsets the app body below it by its own height. */
#impersonationBanner {
  position: sticky;
  top: 0;
  z-index: var(--z-banner-impersonation);
  display: flex;
  align-items: center;
  gap: 0.625rem;
  padding: 0.5rem 1rem;
  background: var(--primary);
  color: var(--text-on-primary);
  font-size: 0.8125rem;
  font-weight: 500;
  letter-spacing: 0.01em;
  border-bottom: 1px solid rgba(255, 255, 255, 0.2);
  box-shadow: 0 1px 0 rgba(0, 0, 0, 0.2);
}
#impersonationBanner strong { font-weight: 600; }
#impersonationBanner button {
  margin-left: auto;
  background: rgba(255, 255, 255, 0.18);
  color: var(--text-on-primary);
  border: 1px solid rgba(255, 255, 255, 0.4);
  padding: 0.25rem 0.75rem;
  border-radius: 4px;
  font-size: 0.75rem;
  font-family: var(--font-mono, monospace);
  font-weight: 600;
  cursor: pointer;
  letter-spacing: 0.04em;
  text-transform: uppercase;
}
#impersonationBanner button:hover {
  background: rgba(255, 255, 255, 0.28);
}

/* Toggle switch for feature flag rows. Minimal — no animation library. */
.sa-toggle { position: relative; display: inline-block; width: 36px; height: 18px; cursor: pointer; }
.sa-toggle input { opacity: 0; width: 0; height: 0; }
.sa-toggle-slider {
  position: absolute; inset: 0;
  background: var(--surface-3);
  border-radius: 999px;
  transition: background-color 0.15s ease;
}
.sa-toggle-slider::before {
  content: ''; position: absolute;
  width: 14px; height: 14px; left: 2px; top: 2px;
  background: var(--text-secondary);
  border-radius: 50%;
  transition: transform 0.15s ease, background-color 0.15s ease;
}
.sa-toggle input:checked + .sa-toggle-slider { background: var(--primary); }
.sa-toggle input:checked + .sa-toggle-slider::before {
  transform: translateX(18px);
  background: var(--surface-2);
}

/* ─── Dashboard chrome ─── */
/* Container limits page width but lets the bg breathe edge-to-edge. */
.sa-app {
  max-width: 1400px;
  margin: 0 auto;
  padding: 0 1.5rem 4rem;
}
@media (max-width: 720px) {
  .sa-app { padding: 0 var(--space-3) var(--space-12); }
}

/* Sticky top bar — brand, time range picker, last-updated, alert badge. */
.sa-topbar {
  position: sticky;
  top: 0;
  z-index: 200;
  display: flex;
  align-items: center;
  gap: 1rem;
  padding: 0.875rem 0 0.75rem;
  margin-bottom: 1.125rem;
  background: rgba(10, 14, 19, 0.88);
  -webkit-backdrop-filter: blur(var(--blur-sm));
  backdrop-filter: blur(var(--blur-sm));
  border-bottom: 1px solid rgba(255, 255, 255, 0.06);
  flex-wrap: wrap;
}
.sa-topbar-brand {
  display: flex;
  flex-direction: column;
  gap: 0.125rem;
  line-height: 1.1;
}
.sa-topbar-brand strong {
  font-size: 0.875rem;
  letter-spacing: -0.01em;
  color: var(--text);
}
.sa-topbar-brand small {
  font-family: var(--font-mono, monospace);
  font-size: 0.75rem;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--text-tertiary);
}
.sa-topbar-spacer { flex: 1; }
.sa-topbar-meta {
  display: flex;
  align-items: center;
  gap: 0.875rem;
  flex-wrap: wrap;
  font-size: 0.75rem;
  color: var(--text-tertiary);
}
.sa-topbar-meta .sa-pulse {
  display: inline-block;
  width: 8px;
  height: 8px;
  border-radius: 50%;
  background: var(--success, #42d392);
  box-shadow: 0 0 8px rgba(var(--success-rgb), 0.6);
  animation: skPulse 1.8s ease-in-out infinite;
  vertical-align: middle;
  margin-right: 0.375rem;
}
.sa-alert-badge {
  display: inline-flex;
  align-items: center;
  gap: 0.375rem;
  padding: 0.25rem 0.625rem;
  border-radius: 999px;
  font-family: var(--font-mono, monospace);
  font-size: 0.75rem;
  font-weight: 600;
  letter-spacing: 0.06em;
  text-transform: uppercase;
}
.sa-alert-badge-ok {
  background: rgba(var(--success-rgb), 0.12);
  color: var(--success, #42d392);
  border: 1px solid rgba(var(--success-rgb), 0.32);
}
.sa-alert-badge-warn {
  background: rgba(var(--warning-rgb), 0.12);
  color: var(--warning);
  border: 1px solid rgba(var(--warning-rgb), 0.4);
}
.sa-alert-badge-crit {
  background: rgba(var(--error-rgb), 0.14);
  color: var(--error, #f4718a);
  border: 1px solid rgba(var(--error-rgb), 0.44);
}

/* Time-range pill group. */
.sa-range {
  display: inline-flex;
  background: var(--surface-1);
  border: 1px solid var(--surface-3);
  border-radius: 999px;
  padding: 0.125rem;
}
.sa-range button {
  background: transparent;
  border: 0;
  padding: 0.25rem 0.75rem;
  font-family: var(--font-mono, monospace);
  font-size: 0.75rem;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  color: var(--text-tertiary);
  cursor: pointer;
  border-radius: 999px;
  transition: background 0.12s ease, color 0.12s ease;
}
.sa-range button:hover { color: var(--text); }
.sa-range button.sa-range-active {
  background: var(--primary);
  color: var(--text-on-primary, #fff);
}

/* Hero KPI strip — 6 mega numbers + sparkline each. */
.sa-hero {
  display: grid;
  grid-template-columns: repeat(6, minmax(0, 1fr));
  gap: 0.625rem;
  margin-bottom: 1.375rem;
}
@media (max-width: 1100px) { .sa-hero { grid-template-columns: repeat(3, 1fr); } }
@media (max-width: 640px) { .sa-hero { grid-template-columns: repeat(2, 1fr); } }
.sa-kpi {
  position: relative;
  background: var(--surface-1);
  border: 1px solid var(--surface-3);
  border-radius: var(--radius-md);
  padding: 0.75rem 0.875rem 0.625rem;
  display: flex;
  flex-direction: column;
  gap: 0.25rem;
  min-height: 92px;
  overflow: hidden;
}
.sa-kpi-label {
  font-family: var(--font-mono, monospace);
  font-size: 0.75rem;
  letter-spacing: 0.1em;
  text-transform: uppercase;
  color: var(--text-tertiary);
}
.sa-kpi-value {
  font-family: var(--font-mono, monospace);
  font-size: 1.5rem;
  font-weight: 600;
  color: var(--text);
  letter-spacing: -0.02em;
  line-height: 1.1;
}
.sa-kpi-sub {
  display: flex;
  align-items: center;
  gap: 0.375rem;
  font-size: 0.75rem;
  color: var(--text-tertiary);
  font-family: var(--font-mono, monospace);
}
.sa-kpi-trend-up { color: var(--success, #42d392); }
.sa-kpi-trend-down { color: var(--error, #f4718a); }
.sa-kpi-trend-flat { color: var(--text-tertiary); }
.sa-kpi-spark {
  position: absolute;
  right: 8px;
  bottom: 8px;
  opacity: 0.7;
  pointer-events: none;
}

/* Two-column main grid for the live charts / health tiles. */
.sa-main {
  display: grid;
  grid-template-columns: 1.4fr 1fr;
  gap: 0.875rem;
  margin-bottom: 1.5rem;
}
@media (max-width: 1024px) { .sa-main { grid-template-columns: 1fr; } }

/* ─── Security & access posture panel ─── */
.sa-main-security { grid-template-columns: 1.4fr 1fr; }
@media (max-width: 1024px) { .sa-main-security { grid-template-columns: 1fr; } }

.sa-sec-checks { display: flex; flex-direction: column; gap: 0.375rem; }
.sa-sec-check {
  display: flex; align-items: flex-start; gap: 0.625rem;
  padding: 0.5625rem 0.6875rem; border-radius: var(--radius-md);
  background: var(--surface-2); border: 1px solid var(--surface-3);
}
.sa-sec-check .icon { margin-top: 0.0625rem; }
.sa-sec-ok .icon { color: var(--success, #5bc08a); }
.sa-sec-warn { border-color: color-mix(in srgb, var(--warning) 45%, var(--surface-3)); }
.sa-sec-warn .icon { color: var(--warning); }
.sa-sec-crit { border-color: color-mix(in srgb, var(--error, #f4718a) 55%, var(--surface-3)); }
.sa-sec-crit .icon { color: var(--error, #f4718a); }
.sa-sec-check-label { font-size: 0.78125rem; font-weight: 600; color: var(--text); }
.sa-sec-check-detail { font-size: var(--text-xs); color: var(--text-secondary); margin-top: 0.0625rem; line-height: 1.35; }

.sa-sec-stats {
  display: grid; grid-template-columns: repeat(4, 1fr); gap: var(--space-2); margin-top: var(--space-1);
}
@media (max-width: 560px) { .sa-sec-stats { grid-template-columns: repeat(2, 1fr); } }
.sa-sec-stat {
  background: var(--surface-2); border: 1px solid var(--surface-3);
  border-radius: var(--radius-md); padding: 0.5625rem 0.625rem; text-align: center;
}
.sa-sec-stat-value { font-size: 1.1875rem; font-weight: 700; font-family: var(--font-mono, monospace); }
.sa-sec-stat-label { font-size: var(--text-2xs); text-transform: uppercase; letter-spacing: 0.05em; color: var(--text-secondary); margin-top: 0.125rem; }
.sa-sec-stat-sub { font-size: var(--text-2xs); color: var(--text-tertiary); margin-top: 0.0625rem; }

/* ─── Models & pricing readout ─── */
.sa-models-body { display: flex; flex-direction: column; gap: 0.375rem; }
.sa-model-row {
  display: flex; align-items: baseline; justify-content: space-between; gap: 0.625rem;
  padding: 0.4375rem 0.6875rem; border-radius: var(--radius-md);
  background: var(--surface-2); border: 1px solid var(--surface-3);
}
.sa-model-role { font-size: var(--text-xs); text-transform: uppercase; letter-spacing: 0.05em; color: var(--text-secondary); }
.sa-model-id { font-size: var(--text-sm); color: var(--primary); overflow-wrap: anywhere; text-align: right; }
.sa-model-pricing {
  display: grid; grid-template-columns: repeat(2, 1fr); gap: 0.375rem; margin-top: var(--space-1);
}
.sa-model-pricing > div {
  display: flex; align-items: baseline; justify-content: space-between; gap: var(--space-2);
  padding: 0.375rem 0.625rem; border-radius: var(--radius-sm);
  background: var(--surface-2); border: 1px solid var(--surface-3);
}
.sa-model-pricing span { font-size: var(--text-xs); color: var(--text-secondary); }
.sa-model-pricing strong { font-size: var(--text-label); font-family: var(--font-mono, monospace); }
.sa-model-pricing small { font-size: 0.5625rem; color: var(--text-tertiary); font-weight: 400; }
.sa-model-pricing-unknown { font-size: 0.71875rem; color: var(--warning); padding: var(--space-2) 0.125rem; }

.sa-card {
  background: var(--surface-1);
  border: 1px solid var(--surface-3);
  border-radius: var(--radius-lg);
  padding: 1rem 1.125rem 0.875rem;
  display: flex;
  flex-direction: column;
  gap: 0.75rem;
}
.sa-card-head {
  display: flex;
  align-items: center;
  gap: 0.625rem;
  font-size: 0.75rem;
  font-family: var(--font-mono, monospace);
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--text-tertiary);
}
.sa-card-head strong {
  color: var(--text);
  font-weight: 600;
  letter-spacing: -0.005em;
  text-transform: none;
  font-family: var(--font-main);
  font-size: 0.8125rem;
}
.sa-card-head-spacer { flex: 1; }

/* Inline SVG chart container — fills the card width. */
.sa-chart-wrap {
  width: 100%;
  min-height: 160px;
}
.sa-chart-wrap svg { width: 100%; height: auto; display: block; }

/* Health row inside the right column. */
.sa-health-row {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 0.625rem;
}
.sa-health-row .sa-tile { min-height: 80px; padding: 0.625rem var(--space-3); gap: 0.125rem; }
.sa-health-row .sa-tile-value { font-size: var(--text-body-lg); }

/* Search + filter strip for the users table. */
.sa-table-toolbar {
  display: flex;
  align-items: center;
  gap: 0.625rem;
  flex-wrap: wrap;
  padding: 0.75rem 0.875rem;
  border-bottom: 1px solid var(--surface-3);
}
.sa-table-toolbar input[type="search"] {
  flex: 1;
  min-width: 200px;
  padding: 0.375rem 0.625rem;
  background: var(--surface-2);
  border: 1px solid var(--surface-3);
  border-radius: 6px;
  color: var(--text);
  font-size: 0.75rem;
}
.sa-filter-pill {
  padding: 0.25rem 0.625rem;
  border-radius: 999px;
  font-family: var(--font-mono, monospace);
  font-size: 0.75rem;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  background: transparent;
  border: 1px solid var(--surface-3);
  color: var(--text-tertiary);
  cursor: pointer;
  transition: background var(--duration-fast) var(--ease-out), border-color var(--duration-fast) var(--ease-out), color var(--duration-fast) var(--ease-out), box-shadow var(--duration-fast) var(--ease-out), transform var(--duration-fast) var(--ease-out);
}
.sa-filter-pill:hover { color: var(--text); }
.sa-filter-pill.sa-filter-active {
  background: var(--primary);
  border-color: var(--primary);
  color: var(--text-on-primary, #fff);
}

/* Bottom 2x2 grid for insights/audit/integrity/flags. */
.sa-bottom {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 0.875rem;
  margin-bottom: 1.5rem;
}
@media (max-width: 900px) { .sa-bottom { grid-template-columns: 1fr; } }

/* Section title inside a card with optional right-aligned actions. */
.sa-section-title {
  display: flex;
  align-items: center;
  gap: 0.625rem;
  font-size: 0.8125rem;
  font-weight: 600;
  color: var(--text);
}
.sa-section-title .sa-section-actions {
  margin-left: auto;
  display: flex;
  align-items: center;
  gap: 0.375rem;
}
.sa-section-title .icon { color: var(--text-secondary); }

/* Operator console accessibility and account-control surfaces. */
.sa-app {
  font-size: 0.875rem;
  line-height: 1.5;
}
.sa-build-id {
  color: var(--info);
  font-family: var(--font-mono, monospace);
  font-size: 0.875rem;
  overflow-wrap: anywhere;
}
.sa-topbar-brand small,
.sa-topbar-meta,
.sa-range button,
.sa-kpi-label,
.sa-kpi-sub,
.sa-card-head,
.sa-card-head strong,
.sa-sec-check-detail,
.sa-model-role,
.sa-model-id,
.sa-model-pricing span,
.sa-model-pricing small,
.sa-model-pricing-unknown,
.sa-section-title {
  font-size: 0.875rem;
}
.sa-sec-check-label { font-size: var(--text-body-sm); }
.sa-sec-stat-label,
.sa-sec-stat-sub { font-size: var(--text-body-sm); }
.sa-table { font-size: var(--text-body-sm); }
.sa-table th { font-size: var(--text-body-sm); color: var(--text-secondary); }
.sa-app [style*="font-size:9px"],
.sa-app [style*="font-size:10px"],
.sa-app [style*="font-size:11px"],
.sa-app [style*="font-size:12px"],
.sa-app [style*="font-size:13px"] {
  font-size: 0.875rem !important;
}
.sa-app .sa-table td,
.sa-app .sa-table td div,
.sa-app .sa-table td span,
.sa-app .sa-table td strong,
.sa-app .sa-table td code {
  font-size: 0.875rem !important;
  line-height: 1.45;
}
.sa-table-toolbar input[type="search"] {
  min-height: 42px;
  font-size: 1rem;
  color: var(--text);
}
.sa-table-toolbar input[type="search"]::placeholder { color: var(--text-secondary); }
.sa-filter-pill { min-height: 36px; font-size: var(--text-body-sm); }
.sa-app button:focus-visible,
.sa-app a:focus-visible,
.sa-app input:focus-visible,
.sa-app textarea:focus-visible,
.sa-app select:focus-visible,
.sa-action-dialog button:focus-visible,
.sa-action-dialog input:focus-visible,
.sa-action-dialog textarea:focus-visible {
  outline: 2px solid var(--primary);
  outline-offset: 2px;
  box-shadow: var(--shadow-focus);
}
.sa-user-row button {
  min-width: 38px;
  min-height: 38px;
  justify-content: center;
}
#saAuditFilter {
  min-height: 36px;
  max-width: 210px;
  padding: 0.375rem 1.75rem 0.375rem 0.625rem;
  border: 1px solid var(--surface-3);
  border-radius: var(--radius-sm);
  background: var(--surface-2);
  color: var(--text);
  font: var(--text-body-sm) var(--font-main);
  text-transform: none;
  letter-spacing: normal;
}
.sa-repeat-count {
  display: inline-block;
  margin-left: 0.25rem;
  padding: 0.0625rem 0.3125rem;
  border-radius: 999px;
  background: var(--surface-3);
  color: var(--text);
}

.sa-action-dialog {
  width: min(680px, calc(100vw - 32px));
  max-height: calc(100vh - 40px);
  padding: 0;
  overflow: auto;
  color: var(--text);
  background: var(--surface-1);
  border: 1px solid var(--border-strong);
  border-radius: var(--radius-lg);
  box-shadow: var(--shadow-xl);
}
.sa-action-dialog::backdrop { background: rgba(5, 8, 12, 0.82); }
.sa-action-dialog-head {
  display: flex;
  align-items: flex-start;
  justify-content: space-between;
  gap: 1.125rem;
  padding: 1.25rem 1.375rem 1rem;
  border-bottom: 1px solid var(--surface-3);
}
.sa-action-dialog h2 { margin: 0.1875rem 0 0; font-size: 1.375rem; line-height: 1.25; }
.sa-action-dialog-eyebrow {
  color: var(--info);
  font: var(--text-body-sm) var(--font-mono, monospace);
  letter-spacing: 0.06em;
  text-transform: uppercase;
}
.sa-action-dialog-eyebrow-danger { color: var(--error, #f4718a); }
.sa-icon-button {
  display: inline-grid;
  place-items: center;
  width: 44px;
  height: 44px;
  padding: 0;
  color: var(--text);
  background: var(--surface-2);
  border: 1px solid var(--surface-3);
  border-radius: var(--radius-md);
  cursor: pointer;
}
.sa-action-dialog-body { display: grid; gap: var(--space-3); padding: var(--space-5) 1.375rem; }
.sa-action-dialog-body label { color: var(--text); font-size: var(--text-body-sm); font-weight: 600; }
.sa-action-dialog textarea,
.sa-action-dialog input {
  width: 100%;
  padding: 0.6875rem 0.75rem;
  color: var(--text);
  background: var(--surface-2);
  border: 1px solid var(--surface-3);
  border-radius: var(--radius-md);
  font: var(--text-body)/1.45 var(--font-main);
  box-sizing: border-box;
}
.sa-action-dialog textarea::placeholder,
.sa-action-dialog input::placeholder { color: var(--text-secondary); }
.sa-scope-notice {
  padding: 0.75rem 0.875rem;
  color: var(--text);
  background: var(--info-soft);
  border: 1px solid rgba(var(--info-rgb), 0.38);
  border-radius: var(--radius-md);
  font-size: 0.875rem;
}
.sa-danger-notice {
  padding: 0.75rem 0.875rem;
  color: var(--error-text, #ffb3c0);
  background: rgba(var(--error-rgb), 0.09);
  border: 1px solid rgba(var(--error-rgb), 0.38);
  border-radius: var(--radius-md);
  font-size: 0.875rem;
  line-height: 1.55;
}
.sa-reset-summary {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: 0.5rem;
}
.sa-grant-summary { grid-template-columns: repeat(2, minmax(0, 1fr)); }
.sa-reset-summary > div {
  display: grid;
  gap: 0.1875rem;
  padding: 0.625rem 0.75rem;
  background: var(--surface-2);
  border: 1px solid var(--surface-3);
  border-radius: var(--radius-md);
}
.sa-reset-summary span { color: var(--text-secondary); font-size: var(--text-body-sm); }
.sa-reset-summary strong { color: var(--text); font-size: 0.9375rem; }
.sa-action-dialog-copy { margin: 0; color: var(--text-secondary); font-size: var(--text-body-sm); line-height: 1.6; }
.sa-action-dialog-status { min-height: 24px; color: var(--text-secondary); font-size: var(--text-body-sm); }
.sa-action-dialog-error { color: var(--error-text); }
.sa-action-dialog-success { color: var(--success); }
.sa-action-dialog-actions {
  display: flex;
  justify-content: flex-end;
  gap: 0.625rem;
  padding: 0.875rem 1.375rem 1.25rem;
  border-top: 1px solid var(--surface-3);
}
.sa-action-dialog-actions .btn { min-height: 42px; font-size: var(--text-body-sm); }
.sa-action-dialog-actions .btn:disabled { opacity: 0.48; cursor: not-allowed; }

.sa-account-controls {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 1.125rem;
  margin-top: 0.875rem;
  padding: 0.875rem 1rem;
  background: var(--surface-2);
  border: 1px solid var(--surface-3);
  border-radius: var(--radius-md);
}
.sa-account-controls strong { font-size: 0.9375rem; }
.sa-account-controls p { margin: 0.1875rem 0 0; color: var(--text-secondary); font-size: var(--text-body-sm); }
.sa-account-controls .btn { flex: 0 0 auto; min-height: 40px; font-size: var(--text-body-sm); }
.sa-job-diagnostics-card { margin-top: 0.875rem; }
.sa-job-diagnostics { display: grid; gap: var(--space-2); }
.sa-job-diagnostic {
  padding: 0.625rem 0.75rem;
  background: var(--surface-2);
  border: 1px solid var(--surface-3);
  border-radius: var(--radius-md);
}
.sa-job-diagnostic-error { border-color: rgba(var(--error-rgb), 0.45); }
.sa-job-diagnostic-head { display: flex; align-items: center; flex-wrap: wrap; gap: var(--space-2) 0.875rem; }
.sa-job-diagnostic-head strong { font-size: var(--text-body-sm); }
.sa-job-diagnostic-head span,
.sa-job-diagnostic-head time,
.sa-job-diagnostic-id { color: var(--text-secondary); font-size: var(--text-body-sm); }
.sa-job-diagnostic-head time { margin-left: auto; }
.sa-job-diagnostic-id { margin-top: 0.1875rem; overflow-wrap: anywhere; }
.sa-job-diagnostic details { margin-top: var(--space-2); }
.sa-job-diagnostic summary { color: var(--error-text); cursor: pointer; font-size: var(--text-body-sm); }
.sa-job-diagnostic ul { margin: var(--space-2) 0 0; padding-left: 1.375rem; }
.sa-job-diagnostic code { white-space: pre-wrap; overflow-wrap: anywhere; color: var(--text); font-size: var(--text-body-sm); }
.sa-empty-note { padding: 0.875rem; color: var(--text-secondary); font-size: var(--text-body-sm); text-align: center; }

@media (max-width: 640px) {
  .sa-reset-summary { grid-template-columns: 1fr; }
  .sa-account-controls { align-items: stretch; flex-direction: column; }
  .sa-action-dialog-actions { flex-direction: column-reverse; }
  .sa-action-dialog-actions .btn { width: 100%; }
}

/* ─── Quota warning banner (≥80% / ≥95% of monthly quota used) ─── */
.quota-banner {
  display: flex;
  align-items: center;
  gap: 0.75rem;
  padding: 0.75rem 1.125rem;
  margin: 0 0 0.75rem;
  border-radius: var(--radius-md);
  font-size: 0.8125rem;
  line-height: 1.45;
  flex-wrap: wrap;
}
.quota-banner .icon { font-size: var(--text-title-sm); flex-shrink: 0; }
.quota-banner-msg { flex: 1 1 220px; }
.quota-banner-cta {
  font-family: var(--font-mono, 'JetBrains Mono', monospace);
  font-size: 0.75rem;
  letter-spacing: 0.03125em;
  padding: 0.375rem 0.875rem;
  border-radius: 6px;
  border: 0;
  font-weight: 600;
  cursor: pointer;
  white-space: nowrap;
}
.quota-banner-warn {
  background: rgba(var(--warning-rgb), 0.07);
  border: 1px solid rgba(var(--warning-rgb), 0.25);
  color: var(--text-secondary, #a3aeb9);
}
.quota-banner-warn .icon { color: var(--warning); }
.quota-banner-warn .quota-banner-cta {
  background: var(--warning);
  color: #1a1a1f;
}
.quota-banner-crit {
  background: rgba(var(--error-rgb), 0.08);
  border: 1px solid rgba(var(--error-rgb), 0.32);
  color: var(--text, #e9eef3);
}
.quota-banner-crit .icon { color: var(--error); }
.quota-banner-crit .quota-banner-cta {
  background: var(--primary);
  color: var(--text-on-primary);
}

#app { position: relative; z-index: 1; }

/* ─── Material Symbols ─── */
.icon {
  font-family: 'Material Symbols Outlined';
  font-weight: normal;
  font-style: normal;
  font-size: 1.25rem;
  display: inline-block;
  line-height: 1;
  vertical-align: middle;
  font-variation-settings: 'FILL' 0, 'wght' 400, 'GRAD' 0, 'opsz' 20;
  /* Prevent ligature text flashing (e.g. "person", "tune") before font loads */
  font-feature-settings: 'liga';
  -webkit-font-feature-settings: 'liga';
  text-rendering: optimizeLegibility;
}
.icon.filled {
  font-variation-settings: 'FILL' 1, 'wght' 400, 'GRAD' 0, 'opsz' 20;
}
/* Size modifiers — extracted from 18+ inline `style="font-size:var(--text-body)"` and
   2× `style="font-size:var(--text-body-lg)"` patterns in index.html. Pair with .icon
   directly: <span class="icon icon-md">tune</span>. */
.icon-sm { font-size: var(--text-body-sm); }
.icon-md { font-size: var(--text-body); }
.icon-lg { font-size: var(--text-body-lg); }
/* Hide icon ligature text until the Material Symbols font is loaded.
   The .icons-loading class is added by an inline script in <head> and
   removed when document.fonts.ready resolves (or after a 2s timeout). */
html.icons-loading .icon {
  visibility: hidden;
}
html.icons-ready .icon {
  visibility: visible;
}

/* ─── App Shell ─── */
#app {
  max-width: 100%;
  margin: 0 auto;
  padding: 1.5rem 2rem;
}

/* ─── Header ─── */
.top-bar {
  display: flex;
  justify-content: space-between;
  align-items: center;
  padding: 1.125rem 1.5rem;
  background: transparent;
  border: none;
  border-radius: var(--radius-lg);
  box-shadow: none;
  margin-bottom: 1.75rem;
  position: relative;
  overflow: hidden;
}

/* iPad portrait + smaller. Without this the header used to stack to
   >200px tall (brand wraps, tagline overflows, top-bar-actions drop to
   the next row) — eating most of the visible area on a 768×1024 tablet. */
@media (max-width: 1024px) {
  .top-bar {
    padding: 0.75rem 1rem;
    margin-bottom: 1.125rem;
  }
  .brand-tagline {
    font-size: 0.75rem;
    line-height: 1.2;
  }
  .brand-tagline .accent {
    font-size: 0.75rem;
    margin-bottom: 0.0625rem;
  }
}
@media (max-width: 768px) {
  .top-bar { flex-wrap: wrap; gap: 0.625rem; }
  .brand-tagline { display: none; }
}
/* Hidden in handoff — kept as a no-op so existing markup works */
.top-bar::after { content: none; display: none; }

.top-bar-brand {
  display: flex;
  gap: 1rem;
  align-items: center;
  position: relative;
  z-index: 1;
}

.brand-badge {
  font-family: var(--font-mono);
  font-weight: 600;
  font-size: 0.75rem;
  letter-spacing: 0.14em;
  padding: 0.625rem 0.875rem;
  background: var(--primary);
  color: var(--text-on-primary);
  border: none;
  border-radius: var(--radius-md);
}

/* Editorial italic tagline (replaces brand-label/title/subtitle stack) */
.brand-tagline {
  font-family: var(--font-display);
  font-style: italic;
  font-size: 1.25rem;
  font-weight: 400;
  color: var(--text-secondary);
  letter-spacing: -0.005em;
  line-height: 1.15;
}
.brand-tagline .accent {
  display: inline-block;
  font-family: var(--font-mono);
  font-style: normal;
  font-size: 0.75rem;
  font-weight: 600;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--primary-text);
  margin-bottom: 0.1875rem;
}
.brand-pills {
  display: flex;
  flex-wrap: wrap;
  gap: 0.375rem;
  margin-top: 0.625rem;
  font-style: normal;
  font-family: var(--font-main);
}

/* Legacy stack (still rendered server-side) — restyle to coexist with the new tagline */
.brand-label {
  font-family: var(--font-mono);
  font-size: 0.75rem;
  font-weight: 400;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--text-tertiary);
  margin-bottom: 0.125rem;
}

.brand-title {
  font-family: var(--font-display);
  font-style: italic;
  font-size: 1.875rem;
  font-weight: 400;
  letter-spacing: -0.01em;
  line-height: 1.15;
  color: var(--text);
}

.brand-subtitle {
  display: flex;
  gap: 0.375rem;
  margin-top: 0.375rem;
  flex-wrap: wrap;
  align-items: center;
}

.top-bar-actions {
  display: flex;
  gap: 0.625rem;
  align-items: center;
}

/* ─── Diagnostic Chips (pills) ─── */
.pill {
  display: inline-flex;
  align-items: center;
  padding: 0.1875rem 0.625rem;
  border-radius: var(--radius-md);
  font-family: var(--font-mono);
  font-size: 0.75rem;
  font-weight: 500;
  letter-spacing: 0.04em;
  border: 1px solid rgba(255, 255, 255, 0.08);
  color: var(--text-secondary);
  background: rgba(255, 255, 255, 0.02);
  white-space: nowrap;
}
.pill-sm { font-size: var(--text-sm); padding: 0.125rem var(--space-2); }
.pill-cyan { background: var(--cyan-soft); color: var(--cyan); border-color: rgba(var(--info-rgb), 0.30); }
.pill-lime { background: var(--lime-soft); color: var(--lime); border-color: rgba(var(--success-rgb), 0.30); }
.pill-pink { background: var(--primary-soft); color: var(--primary-surface); border-color: var(--primary-muted); }
.pill-lavender { background: var(--primary-soft); color: var(--primary-surface); border-color: var(--primary-muted); }
.pill-mint { background: var(--lime-soft); color: var(--lime); border-color: rgba(var(--success-rgb), 0.30); }
.pill-yellow { background: var(--warning-soft); color: var(--warning); border-color: rgba(var(--warning-rgb), 0.30); }
.pill-success { background: var(--success-soft); color: var(--success); border-color: rgba(var(--success-rgb), 0.30); }
.pill-error { background: var(--error-soft); color: var(--error); border-color: var(--primary-muted); }
.pill-tonal { background: var(--primary-soft); color: var(--primary); border-color: var(--primary-muted); }

/* ─── Icon Button ─── */
.btn-icon {
  width: 40px;
  height: 40px;
  display: flex;
  align-items: center;
  justify-content: center;
  border: var(--ghost-border);
  border-radius: var(--radius-md);
  background: var(--surface-2);
  color: var(--text-secondary);
  cursor: pointer;
  transition: background var(--duration-fast) var(--ease-out), border-color var(--duration-fast) var(--ease-out), color var(--duration-fast) var(--ease-out), box-shadow var(--duration-fast) var(--ease-out), transform var(--duration-fast) var(--ease-out);
}
.btn-icon:hover {
  background: var(--surface-3);
  color: var(--text);
  box-shadow: var(--shadow-sm);
}

/* ─── Tabs — underline style (per handoff) ─── */
/* Sticky so the active-tab underline stays visible as the user scrolls a
   long bank/billing/admin view. Replaces the audit's "breadcrumb" item —
   the active underline IS the "you are here" signal once it persists at
   the top of the viewport. Backdrop-filter keeps text legible when the
   bar overlaps scrolled content. */
.tab-bar {
  display: flex;
  gap: 0.125rem;
  margin-bottom: 1.75rem;
  background: rgba(10, 14, 19, 0.78);
  backdrop-filter: blur(var(--blur-sm));
  -webkit-backdrop-filter: blur(var(--blur-sm));
  border-radius: 0;
  padding: 0;
  border: none;
  border-bottom: 1px solid rgba(255, 255, 255, 0.06);
  position: sticky;
  top: 0;
  z-index: 50;
}

.tab-btn {
  flex: 0 1 auto;
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 0.5rem;
  padding: 0.75rem 1.125rem;
  font-family: var(--font-main);
  font-size: 0.875rem;
  font-weight: 500;
  letter-spacing: 0;
  text-transform: none;
  border: none;
  border-radius: 0;
  background: transparent;
  color: var(--text-tertiary);
  cursor: pointer;
  transition: color var(--duration-fast) var(--ease-out);
  position: relative;
}
.tab-btn .icon { font-size: var(--text-body-lg); }
.tab-btn:hover {
  background: transparent;
  color: var(--text-secondary);
}
.tab-btn.active {
  background: transparent;
  color: var(--text);
  box-shadow: none;
}
.tab-btn::after {
  content: '';
  position: absolute;
  left: 12px;
  right: 12px;
  bottom: -1px;
  height: 2px;
  background: var(--primary);
  border-radius: 2px 2px 0 0;
  transform: scaleX(0);
  transform-origin: 50% 100%;
  transition: transform var(--duration-normal) var(--ease-out);
}
.tab-btn.active::after { transform: scaleX(1); }
.tab-btn.active .icon { color: var(--text); }

/* ─── Views ─── */
.view {
  display: none;
  animation: viewFade 0.3s var(--ease-out);
}
.view.active { display: block; }
@keyframes viewFade {
  from { opacity: 0; transform: translateY(8px); }
  to   { opacity: 1; transform: translateY(0); }
}

/* ─── Section Labels — readable, with primary-tinted icon ─── */
.section-label {
  display: flex;
  align-items: center;
  gap: 0.625rem;
  font-family: var(--font-main);
  font-size: 0.9375rem;
  font-weight: 600;
  letter-spacing: -0.005em;
  text-transform: none;
  color: var(--text);
  margin-bottom: 0.25rem;
}
.section-label .icon { font-size: var(--text-title-sm); color: var(--primary); opacity: 0.85; }
.section-label .pulse-dot {
  width: 6px;
  height: 6px;
  border-radius: 50%;
  background: var(--lime);
  box-shadow: 0 0 6px rgba(var(--success-rgb), 0.50);
  animation: statusPulse 3s ease-in-out infinite;
}
.section-hint {
  font-size: 0.8125rem;
  color: var(--text-tertiary);
  margin: -0.125rem 0 1.125rem 0;
  line-height: 1.55;
  text-wrap: pretty;
}

/* ─── Config Surface — handoff card pattern (border-color hover) ─── */
.config-surface {
  background: var(--surface-0);
  border: var(--ghost-border);
  border-radius: var(--radius-lg);
  padding: 1.75rem;
  margin-bottom: 0.875rem;
  transition: border-color var(--duration-normal) var(--ease-out);
  position: relative;
}
.config-surface::before { display: none; }
.config-surface::after { display: none; }
.config-surface:hover {
  border-color: rgba(255, 255, 255, 0.10);
}

.config-grid {
  display: grid;
  grid-template-columns: 1fr 1fr 1fr;
  gap: 1rem 1.25rem;
}
.config-grid .full { grid-column: 1 / -1; }
.config-grid .half { grid-column: span 1; }

/* ─── Toggle Switch ─── */
.toggle-row {
  display: flex;
  align-items: center;
  gap: 0.75rem;
  cursor: pointer;
  font-size: 0.875rem;
  color: var(--text);
  user-select: none;
  padding: 0.375rem 0;
}
.neu-toggle {
  appearance: none;
  -webkit-appearance: none;
  width: 0;
  height: 0;
  opacity: 0;
  position: absolute;
}
.toggle-slider {
  position: relative;
  width: 40px;
  height: 22px;
  min-width: 40px;
  background: var(--surface-3);
  border-radius: 11px;
  transition: background 0.25s ease;
  border: var(--ghost-border);
}
.toggle-slider::after {
  content: '';
  position: absolute;
  top: 2px;
  left: 2px;
  width: 16px;
  height: 16px;
  background: var(--text-tertiary);
  border-radius: 50%;
  transition: transform 0.25s ease, background 0.25s ease;
}
.neu-toggle:checked + .toggle-slider {
  background: var(--primary);
  border-color: var(--primary);
}
.neu-toggle:checked + .toggle-slider::after {
  transform: translateX(18px);
  background: var(--surface-2);
}

/* ─── Export Config ─── */
.export-surface {
  background: var(--surface-0);
  border: var(--ghost-border);
  border-radius: var(--radius-lg);
  padding: 1.5rem;
  margin-bottom: 1.25rem;
  transition: box-shadow var(--duration-normal) var(--ease-out);
}
.export-surface::after { display: none; }
.export-surface:hover {
  box-shadow: var(--shadow-md);
}

.export-grid {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 0.875rem;
}

/* ─── Form Elements — technical lab aesthetic ─── */
.form-group {
  display: flex;
  flex-direction: column;
  gap: 0.375rem;
}
.form-group label {
  font-family: var(--font-main);
  font-size: 0.875rem;
  font-weight: 500;
  letter-spacing: 0;
  text-transform: none;
  color: var(--text-secondary);
}
.form-group .hint {
  font-size: 0.8125rem;
  color: var(--text-tertiary);
  line-height: 1.5;
  margin-top: -0.125rem;
}

.neu-select,
.neu-input,
.neu-textarea {
  font-family: var(--font-main);
  font-size: 0.9375rem;
  font-weight: 400;
  color: var(--text);
  padding: 0.8125rem 0.875rem;
  border: 1px solid rgba(255, 255, 255, 0.06);
  border-radius: var(--radius-md);
  background: var(--surface-lowest);
  outline: none;
  transition: background var(--duration-fast) var(--ease-out), border-color var(--duration-fast) var(--ease-out), color var(--duration-fast) var(--ease-out), box-shadow var(--duration-fast) var(--ease-out), transform var(--duration-fast) var(--ease-out);
  width: 100%;
}
.neu-select:hover, .neu-input:hover, .neu-textarea:hover {
  border-color: rgba(255, 255, 255, 0.10);
}
.neu-select:focus, .neu-input:focus, .neu-textarea:focus {
  border-color: var(--primary-muted);
  background: var(--surface-0);
  box-shadow: 0 0 0 3px var(--primary-soft);
}
.neu-select {
  cursor: pointer;
  appearance: none;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='%2393a1ae' d='M2 4l4 4 4-4'/%3E%3C/svg%3E");
  background-repeat: no-repeat;
  background-position: right 14px center;
  padding-right: 2.125rem;
}
.neu-textarea { resize: vertical; min-height: 72px; line-height: 1.6; }

/* ─── Buttons — surgical precision ─── */
.btn {
  display: inline-flex;
  align-items: center;
  gap: 0.5rem;
  padding: 0.6875rem 1.25rem;
  min-height: 44px;
  border-radius: var(--radius-md);
  font-family: var(--font-main);
  font-size: 0.875rem;
  font-weight: 600;
  cursor: pointer;
  border: var(--ghost-border);
  outline: none;
  white-space: nowrap;
  transition: background var(--duration-fast) var(--ease-out), border-color var(--duration-fast) var(--ease-out), color var(--duration-fast) var(--ease-out), box-shadow var(--duration-fast) var(--ease-out), transform var(--duration-fast) var(--ease-out);
  line-height: 1.2;
  background: var(--surface-2);
  color: var(--text);
}
.btn .icon { font-size: var(--text-body-lg); }
.btn:hover {
  background: var(--surface-3);
  box-shadow: var(--shadow-sm);
}
.btn:active {
  transform: translateY(0);
}

.btn:focus-visible, .btn-icon:focus-visible, .tab-btn:focus-visible {
  outline: 2px solid var(--primary);
  outline-offset: 2px;
}
.btn:disabled {
  opacity: 0.35;
  cursor: not-allowed;
  transform: none;
}

/* ─── Feature-gated elements ─── */
.feature-gated {
  opacity: 0.35 !important;
  cursor: not-allowed !important;
  pointer-events: auto !important;
  position: relative;
}
.feature-gated:hover {
  background: var(--surface-2) !important;
  box-shadow: none !important;
  transform: none !important;
}
.feature-gated-tooltip {
  display: none;
  position: absolute;
  bottom: calc(100% + 8px);
  left: 50%;
  transform: translateX(-50%);
  background: var(--surface-0, #111);
  color: var(--primary-text);
  font-size: 0.75rem;
  font-weight: 600;
  padding: 0.5rem 0.875rem;
  border-radius: 8px;
  white-space: nowrap;
  z-index: 100;
  border: 1px solid var(--primary);
  box-shadow: 0 4px 16px rgba(0,0,0,0.4);
  pointer-events: none;
}
.feature-gated-tooltip::after {
  content: '';
  position: absolute;
  top: 100%;
  left: 50%;
  transform: translateX(-50%);
  border: 6px solid transparent;
  border-top-color: var(--primary);
}
.feature-gated:hover .feature-gated-tooltip {
  display: block;
}
.apa-gated {
  opacity: 0.3;
  position: relative;
  cursor: not-allowed;
}
.apa-gated::after {
  content: attr(data-gate-msg);
  position: absolute;
  top: -2px;
  left: 0;
  right: 0;
  bottom: -2px;
  display: flex;
  align-items: center;
  justify-content: center;
  background: rgba(17,17,17,0.85);
  color: var(--primary);
  font-size: 0.75rem;
  font-weight: 600;
  border-radius: 6px;
  opacity: 0;
  transition: opacity 0.15s;
}
.apa-gated:hover::after {
  opacity: 1;
}

.btn-primary {
  background: var(--primary);
  color: var(--text-on-primary);
  border-color: transparent;
  box-shadow: 0 0 12px rgba(var(--primary-rgb), 0.15), inset 0 0 0 0.5px rgba(181, 240, 232, 0.25);
}
.btn-primary:hover {
  background: var(--primary-hover);
  box-shadow: 0 0 20px rgba(var(--primary-rgb), 0.25), inset 0 0 0 0.5px rgba(181, 240, 232, 0.35);
}

.btn-ghost {
  background: transparent;
  border-color: transparent;
  box-shadow: none;
  color: var(--text-secondary);
}
.btn-ghost:hover {
  background: var(--surface-2);
  box-shadow: none;
}

.btn-approve {
  background: var(--lime-soft);
  color: var(--lime);
  border-color: rgba(var(--success-rgb), 0.25);
}
.btn-approve:hover {
  background: var(--success);
  color: var(--text-on-accent);
  box-shadow: var(--glow-lime);
}

.btn-reject {
  background: transparent;
  color: var(--text-secondary);
}
.btn-reject:hover {
  background: var(--error-soft);
  border-color: var(--primary-muted);
  color: var(--error);
}

.btn-confirm {
  background: var(--error);
  color: var(--text-on-accent);
  border-color: transparent;
  box-shadow: 0 0 12px rgba(var(--error-rgb), 0.20);
}
.btn-confirm:disabled { opacity: 0.35; }

/* ─── Button density + semantic variants ─────────────────────────────
   Use .btn-sm on list-row action buttons that previously relied on inline
   `style="font-size: var(--text-sm);padding:var(--space-1) 0.625rem"`. Combine with a color variant
   (e.g. .btn-danger-subtle) and/or .btn-iconish to match the old look. */
.btn-sm {
  padding: 0.4375rem 0.75rem;
  font-size: 0.8125rem;
  min-height: 36px;
  gap: 0.375rem;
}
.btn-sm .icon { font-size: var(--text-body-sm); }

.btn-xs {
  padding: 0.1875rem 0.5rem;
  font-size: 0.75rem;
  gap: 0.25rem;
}
.btn-xs .icon { font-size: var(--text-body-sm); }

/* Subtle destructive: tints without a full background swap — used for
   delete buttons inside list cards where a solid red would shout. */
.btn-danger-subtle {
  color: var(--error, #f4718a);
  border-color: rgba(var(--error-rgb), 0.20);
}
.btn-danger-subtle:hover {
  background: rgba(var(--error-rgb), 0.08);
  border-color: rgba(var(--error-rgb), 0.40);
  color: var(--error, #f4718a);
}

/* Subtle success: same pattern for Activar-type actions. */
.btn-success-subtle {
  color: var(--success, #42d392);
  border-color: rgba(var(--success-rgb), 0.22);
}
.btn-success-subtle:hover {
  background: rgba(var(--success-rgb), 0.08);
  border-color: rgba(var(--success-rgb), 0.40);
  color: var(--success, #42d392);
}

/* Tight icon-only variant — keeps .btn base styling but strips the text gap
   and padding. Pair with aria-label for accessibility (the iconButton() JS
   helper enforces this). */
.btn-iconish {
  padding: 0.25rem 0.5rem;
  gap: 0;
  /* `.page-app .btn-iconish` forces min-width/min-height 44px for the touch
     target, which makes the box wider than its padding-sized content. Without
     an explicit centre the glyph stays pinned to the flex start — about 5px
     left of centre in a 44px button. */
  justify-content: center;
}
.btn-iconish .icon { font-size: var(--text-body); }

.btn-export {
  background: var(--surface-2);
  color: var(--text);
}
.btn-export:hover { background: var(--surface-3); }

.btn-export-primary {
  background: var(--primary);
  color: var(--text-on-primary);
  border-color: transparent;
  box-shadow: 0 0 12px rgba(var(--primary-rgb), 0.15);
}
.btn-export-primary:hover { background: var(--primary-hover); }

/* On narrow screens collapse secondary export-bar buttons to icon-only
   so the primary "Exportar → DOCX" doesn't get visually crowded out by
   the four siblings (ZipGrade, Validar IA, Aprobar todas, etc.). */
@media (max-width: 900px) {
  .export-bar .btn-export:not(.btn-export-primary) span:not(.icon) {
    display: none;
  }
  .export-bar .btn-export:not(.btn-export-primary) {
    padding: 0.4375rem 0.625rem;
  }
}

/* Compact density variant for the header export buttons. Replaces inline
   `style="font-size: var(--text-sm);padding:0.375rem var(--space-3)"` on #exportBtn / #exportZipGradeBtn
   so it can scale up on touch devices via the @media block. */
.btn-export-compact {
  font-size: 0.8125rem;
  padding: 0.5625rem 0.875rem;
  min-height: 40px;
}
.btn-export-compact .icon { font-size: 0.9375rem; }
@media (max-width: 480px) {
  .btn-export-compact {
    font-size: 0.75rem;
    padding: 0.625rem 0.875rem;
    min-height: 40px;
  }
  .btn-export-compact .icon { font-size: var(--text-body); }
}

.btn-generate {
  background: var(--primary);
  color: var(--text-on-primary);
  border-color: transparent;
  width: 100%;
  justify-content: center;
  padding: 1rem 1.75rem;
  border-radius: var(--radius-md);
  font-size: 0.875rem;
  font-weight: 600;
  letter-spacing: 0.01em;
  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.25);
  position: relative;
  overflow: hidden;
  transition: background var(--duration-fast) var(--ease-out), border-color var(--duration-fast) var(--ease-out), color var(--duration-fast) var(--ease-out), box-shadow var(--duration-fast) var(--ease-out), transform var(--duration-fast) var(--ease-out);
}
.btn-generate:hover {
  background: var(--primary-hover);
  box-shadow: 0 4px 16px rgba(var(--primary-rgb), 0.25);
  transform: translateY(-1px);
}
.btn-generate:active {
  transform: translateY(0);
}

.btn-generate-kbd {
  font-family: var(--font-mono);
  font-size: 0.75rem;
  font-weight: 500;
  background: rgba(0, 0, 0, 0.20);
  padding: 0.1875rem 0.5rem;
  border-radius: 4px;
  margin-left: 0.375rem;
  letter-spacing: 0.04em;
}

/* ─── Sticky generate dock — frosted, hovers above content ─── */
.generate-dock {
  position: sticky;
  bottom: 20px;
  background: rgba(13, 18, 24, 0.85);
  backdrop-filter: blur(var(--blur-md));
  -webkit-backdrop-filter: blur(var(--blur-md));
  border: 1px solid rgba(255, 255, 255, 0.08);
  border-radius: var(--radius-lg);
  padding: 0.375rem;
  box-shadow: 0 -4px 24px rgba(0, 0, 0, 0.4);
  margin-top: 1.5rem;
  z-index: 10;
}
.generate-dock .btn-generate { box-shadow: 0 0 12px rgba(var(--primary-rgb), 0.15); }

/* ─── Question Card — layered laboratory glass ─── */
.q-card {
  background: var(--surface-0);
  border: var(--ghost-border);
  border-radius: var(--radius-lg);
  overflow: hidden;
  margin-bottom: 1rem;
  animation: cardRise 0.4s var(--ease-out) both;
  transition: background var(--duration-fast) var(--ease-out), border-color var(--duration-fast) var(--ease-out), color var(--duration-fast) var(--ease-out), box-shadow var(--duration-fast) var(--ease-out), transform var(--duration-fast) var(--ease-out);
}
.q-card:hover {
  box-shadow: var(--shadow-hover);
}
.q-card:nth-child(1) { animation-delay: 0s; }
.q-card:nth-child(2) { animation-delay: 0.06s; }
.q-card:nth-child(3) { animation-delay: 0.12s; }
.q-card:nth-child(4) { animation-delay: 0.18s; }
.q-card:nth-child(5) { animation-delay: 0.24s; }

/* Subtle left accent — single quiet teal signature (the old 6-color
   rotation carried no meaning and fought the palette) */
.q-card { border-left: 2px solid var(--primary-muted); }
.q-card:hover { border-left-color: var(--primary); }

@keyframes cardRise {
  from { opacity: 0; transform: translateY(16px); }
  to   { opacity: 1; transform: translateY(0); }
}

.q-header {
  display: flex;
  justify-content: space-between;
  align-items: center;
  padding: 1rem 1.375rem;
  background: var(--surface-1);
  border-bottom: 1px solid rgba(255, 255, 255, 0.04);
  flex-wrap: wrap;
  gap: 0.625rem;
}
.q-header .q-num {
  font-family: var(--font-display);
  font-style: italic;
  font-size: 1.375rem;
  font-weight: 400;
  color: var(--text-tertiary);
  min-width: 36px;
  height: 36px;
  display: flex;
  align-items: center;
  justify-content: center;
  background: transparent;
  border: none;
  border-radius: var(--radius-sm);
}
.q-header .q-meta {
  display: flex;
  gap: 0.375rem;
  align-items: center;
  flex-wrap: wrap;
}

.q-body { padding: var(--space-5); }
.q-vignette {
  font-size: 0.9375rem;
  line-height: 1.85;
  color: var(--text);
  margin-bottom: 1rem;
  white-space: pre-wrap;
}
.q-leadin {
  font-size: 0.875rem;
  font-weight: 600;
  color: var(--text);
  margin-bottom: 0.875rem;
  padding: 0.625rem 0.875rem;
  background: var(--primary-soft);
  border-left: 3px solid var(--primary);
  border-radius: 0 var(--radius-sm) var(--radius-sm) 0;
}

/* ─── Options ─── */
.q-options { display: flex; flex-direction: column; gap: 0.375rem; }
.q-opt {
  display: flex;
  align-items: flex-start;
  gap: 0.75rem;
  padding: 0.75rem 1rem;
  border-radius: var(--radius-md);
  font-size: 0.875rem;
  line-height: 1.7;
  border: var(--ghost-border);
  color: var(--text);
  background: var(--bg);
  transition: background var(--duration-fast) var(--ease-out), border-color var(--duration-fast) var(--ease-out), color var(--duration-fast) var(--ease-out), box-shadow var(--duration-fast) var(--ease-out), transform var(--duration-fast) var(--ease-out);
}
.q-opt:hover {
  background: var(--surface-0);
  transform: translateX(2px);
}
.q-opt.correct {
  background: var(--lime-soft);
  border-color: rgba(var(--success-rgb), 0.20);
  box-shadow: var(--glow-lime);
}
.q-opt .letter {
  font-family: var(--font-mono);
  font-weight: 600;
  font-size: 0.75rem;
  min-width: 26px;
  height: 26px;
  display: flex;
  align-items: center;
  justify-content: center;
  background: var(--surface-2);
  border: none;
  border-radius: var(--radius-sm);
  color: var(--text-secondary);
  flex-shrink: 0;
}
.q-opt.correct .letter {
  background: var(--success);
  color: var(--text-on-accent);
  box-shadow: 0 0 8px rgba(var(--success-rgb), 0.25);
}
.q-opt .correctlabel {
  margin-left: auto;
  font-family: var(--font-mono);
  font-size: 0.75rem;
  font-weight: 600;
  letter-spacing: 0.04em;
  color: var(--lime);
  white-space: nowrap;
  display: flex;
  align-items: center;
  gap: 0.25rem;
  background: var(--lime-soft);
  padding: 0.125rem 0.625rem;
  border-radius: var(--radius-md);
  border: 1px solid rgba(var(--success-rgb), 0.30);
}

/* ─── Image Alert ─── */
.img-alert {
  padding: 0.875rem 1.25rem;
  background: var(--primary-soft);
  font-size: 0.8125rem;
  color: var(--text);
  display: flex;
  gap: 0.75rem;
}

/* ─── Explanation Panel ─── */
.exp-panel { padding: 0 var(--space-5) var(--space-4); }
.exp-toggle {
  background: none;
  border: none;
  cursor: pointer;
  font-family: var(--font-main);
  font-size: 0.8125rem;
  font-weight: 600;
  color: var(--primary);
  padding: 0.5rem 0;
  display: flex;
  align-items: center;
  gap: 0.375rem;
  transition: color var(--duration-fast);
}
.exp-toggle:hover { color: var(--primary-hover); }
.exp-content {
  margin-top: 0.75rem;
  animation: expExpand 0.3s var(--ease-out);
}
@keyframes expExpand {
  from { opacity: 0; max-height: 0; }
  to   { opacity: 1; max-height: 2000px; }
}

.exp-teaching {
  font-size: 0.8125rem;
  line-height: 1.9;
  padding: 1rem;
  background: var(--primary-soft);
  color: var(--text);
  border-left: 3px solid var(--primary);
  border-radius: 0 var(--radius-md) var(--radius-md) 0;
  margin-bottom: 0.75rem;
  white-space: pre-wrap;
}
.exp-rationale {
  font-size: 0.75rem;
  padding: 0.625rem 0.875rem;
  border-radius: var(--radius-sm);
  margin-bottom: 0.25rem;
  line-height: 1.7;
}
.exp-rationale.correct {
  background: var(--success-soft);
  color: var(--text);
}
.exp-rationale.wrong {
  background: var(--surface-2);
  color: var(--text-secondary);
}
.exp-keyconcept {
  margin-top: 0.75rem;
  padding: 0.875rem 1rem;
  background: var(--surface-2);
  border: 0.5px dashed rgba(255, 255, 255, 0.10);
  border-radius: var(--radius-md);
  font-size: 0.75rem;
  color: var(--text-secondary);
  line-height: 1.7;
}
.exp-keyconcept strong { color: var(--text); }

/* ─── Actions Bar ─── */
.q-actions {
  padding: 0.75rem 1.25rem;
  display: flex;
  gap: 0.5rem;
  align-items: center;
  flex-wrap: wrap;
  background: var(--surface-2);
}
.q-actions .status-result {
  display: flex;
  align-items: center;
  gap: 0.5rem;
  animation: statusPop 0.35s var(--ease-spring);
}
.undo-reject-btn {
  display: inline-flex;
  align-items: center;
  gap: 0.25rem;
  background: transparent;
  border: 1px solid rgba(255,255,255,0.10);
  color: var(--text-secondary);
  padding: 0.25rem 0.625rem;
  border-radius: var(--radius-sm);
  font-family: var(--font-main);
  font-size: 0.75rem;
  letter-spacing: 0.02em;
  cursor: pointer;
  transition: background 0.12s ease, color 0.12s ease, border-color 0.12s ease;
}
.undo-reject-btn:hover {
  background: rgba(255,255,255,0.04);
  border-color: rgba(255,255,255,0.18);
  color: var(--text);
}
.undo-reject-btn .icon {
  font-size: 0.875rem;
}
@keyframes statusPop {
  0%   { transform: scale(0.8); opacity: 0; }
  60%  { transform: scale(1.05); }
  100% { transform: scale(1); opacity: 1; }
}

.reject-inline { display: flex; gap: 0.375rem; align-items: center; flex: 1; }
.reject-inline select {
  font-family: var(--font-main);
  font-size: 0.75rem;
  font-weight: 500;
  padding: 0.5rem 0.75rem;
  border-radius: var(--radius-sm);
  border: var(--ghost-border);
  background: var(--surface-lowest);
  color: var(--text);
  cursor: pointer;
}

/* ─── Chips — diagnostic status ─── */
.m3chip {
  display: inline-flex;
  align-items: center;
  padding: 0 0.75rem;
  height: 24px;
  border-radius: var(--radius-md);
  font-family: var(--font-mono);
  font-size: 0.75rem;
  font-weight: 500;
  letter-spacing: 0.04em;
  border: 1px solid rgba(255, 255, 255, 0.08);
  color: var(--text-secondary);
  background: rgba(255, 255, 255, 0.02);
  gap: 0.25rem;
}
.m3chip.tonal { background: var(--primary-soft); color: var(--primary); border-color: var(--primary-muted); }
.m3chip.success { background: var(--lime-soft); color: var(--lime); border-color: rgba(var(--success-rgb), 0.30); }
.m3chip.error { background: var(--error-soft); color: var(--error); border-color: var(--primary-muted); }

/* ─── Status Bar ─── */
.status-bar {
  display: flex;
  justify-content: space-between;
  align-items: center;
  margin-bottom: 1rem;
  font-family: var(--font-mono);
  font-size: 0.75rem;
  font-weight: 500;
  letter-spacing: 0.02em;
  color: var(--text-secondary);
  padding: 0.75rem 1rem;
  background: var(--surface-0);
  border: var(--ghost-border);
  border-radius: var(--radius-md);
  flex-wrap: wrap;
  gap: 0.5rem;
}

/* ─── Skeleton ─── */
.skeleton-container { display: flex; flex-direction: column; gap: var(--space-4); margin-top: var(--space-5); }
.skeleton-card {
  background: var(--surface-0);
  border: var(--ghost-border);
  border-radius: var(--radius-lg);
  overflow: hidden;
}
.skeleton-header {
  padding: 1rem 1.25rem;
  background: var(--surface-2);
  display: flex;
  gap: 0.875rem;
  align-items: center;
}
.skeleton-body { padding: 1.125rem; display: flex; flex-direction: column; gap: var(--space-3); }
.skeleton-line {
  height: 12px;
  border-radius: 6px;
  background: linear-gradient(105deg,
    var(--surface-2) 38%, var(--surface-3) 50%, var(--surface-2) 62%);
  background-size: 220% 100%;
  animation: skShimmer 1.4s ease-in-out infinite;
}
@keyframes skShimmer {
  from { background-position: 130% 0; }
  to   { background-position: -90% 0; }
}
.skeleton-line.w100 { width: 100%; }
.skeleton-line.w80  { width: 80%; }
.skeleton-line.w60  { width: 60%; }
.skeleton-line.w40  { width: 40%; }
.skeleton-line.w20  { width: 20%; height: 24px; }
.skeleton-line:nth-child(2) { animation-delay: 0.15s; }
.skeleton-line:nth-child(3) { animation-delay: 0.3s; }
@keyframes skPulse { 0%, 100% { opacity: 0.4; } 50% { opacity: 0.8; } }

/* ─── Cinematic Generation Pipeline ─── */
/* Full-screen overlay when body.is-generating — works from any tab */
body.is-generating { overflow: hidden; }
body.is-generating #loadingState {
  display: flex !important;
  position: fixed;
  inset: 0;
  /* Sits above modals (--z-modal: 2200) so a confirm/prompt that fires
     mid-generation can't punch through the overlay. */
  z-index: var(--z-overlay-gen);
  background: rgba(10, 14, 19, 0.96);
  backdrop-filter: blur(var(--blur-sm));
  -webkit-backdrop-filter: blur(var(--blur-sm));
  align-items: center;
  justify-content: center;
  padding: 2rem;
  overflow-y: auto;
  animation: genFadeIn 0.25s ease;
}
body.is-generating #loadingState .gen-stage {
  width: 100%;
  max-width: 760px;
  margin-bottom: 0;
}
@keyframes genFadeIn { from { opacity: 0; } to { opacity: 1; } }

.gen-stage {
  background: var(--surface-0);
  border: var(--ghost-border);
  border-radius: var(--radius-lg);
  padding: 1.75rem;
  margin-bottom: 1rem;
  position: relative;
  overflow: hidden;
}
.gen-stage::before {
  content: '';
  position: absolute;
  inset: 0;
  background: linear-gradient(90deg, transparent, var(--primary-soft), transparent);
  animation: genSweep 3s linear infinite;
  pointer-events: none;
}
@keyframes genSweep { 0% { transform: translateX(-100%); } 100% { transform: translateX(100%); } }

.gen-top {
  display: flex;
  align-items: center;
  gap: 0.875rem;
  margin-bottom: 1.125rem;
  position: relative;
  z-index: 1;
}
.gen-phase-title {
  font-family: var(--font-mono);
  font-size: 0.75rem;
  font-weight: 600;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--cyan);
}
.gen-phase-sub {
  font-size: 0.875rem;
  color: var(--text);
  margin-top: 0.1875rem;
}

.gen-pipeline {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: 0.5rem;
  margin-bottom: 1.125rem;
  position: relative;
  z-index: 1;
}
.gen-step {
  padding: 0.75rem 0.875rem;
  background: var(--surface-lowest);
  border: var(--ghost-border);
  border-radius: var(--radius-md);
  display: flex;
  flex-direction: column;
  gap: 0.25rem;
  transition: background var(--duration-fast) var(--ease-out), border-color var(--duration-fast) var(--ease-out), color var(--duration-fast) var(--ease-out), box-shadow var(--duration-fast) var(--ease-out), transform var(--duration-fast) var(--ease-out);
}
.gen-step.active {
  background: var(--primary-soft);
  border-color: var(--primary-muted);
  box-shadow: 0 0 12px rgba(var(--primary-rgb), 0.08);
}
.gen-step.done {
  background: var(--lime-soft);
  border-color: rgba(var(--success-rgb), 0.30);
}
.gen-step .step-num {
  font-family: var(--font-mono);
  font-size: 0.75rem;
  font-weight: 600;
  letter-spacing: 0.12em;
  color: var(--text-tertiary);
}
.gen-step.active .step-num { color: var(--primary); }
.gen-step.done .step-num { color: var(--lime); }
.gen-step .step-name {
  font-size: 0.75rem;
  font-weight: 600;
  color: var(--text);
  display: flex;
  align-items: center;
  gap: 0.375rem;
}
.gen-step .step-name .icon { font-size: var(--text-body-sm); }
.gen-step.active .step-name .icon {
  color: var(--primary);
  animation: pulseBreath 1.2s ease-in-out infinite;
}
.gen-step.done .step-name .icon { color: var(--lime); }
@keyframes pulseBreath {
  0%, 100% { opacity: 1; }
  50% { opacity: 0.5; }
}

/* Stream output panel (cinematic) */
.stream-out {
  background: var(--surface-lowest);
  border: var(--ghost-border);
  border-left: 2px solid var(--primary);
  border-radius: var(--radius-lg);
  padding: 1.5rem 1.75rem;
  margin-bottom: 1rem;
  font-size: 0.875rem;
  line-height: 1.9;
  color: var(--text);
  white-space: pre-wrap;
  box-shadow: 0 0 24px rgba(var(--primary-rgb), 0.08);
  min-height: 80px;
  position: relative;
  z-index: 1;
}
.stream-out .stream-meta {
  font-family: var(--font-mono);
  font-size: 0.75rem;
  color: var(--text-tertiary);
  letter-spacing: 0.08em;
  text-transform: uppercase;
  margin-bottom: 0.625rem;
  display: flex;
  gap: 0.625rem;
  align-items: center;
}
.pulse-dot {
  width: 6px;
  height: 6px;
  border-radius: 50%;
  background: var(--primary);
  box-shadow: 0 0 8px rgba(var(--primary-rgb), 0.5);
  animation: pulseBreath 1.2s ease-in-out infinite;
}

/* Log console */
.gen-log {
  background: var(--surface-lowest);
  border: var(--ghost-border);
  border-radius: var(--radius-md);
  padding: 0.875rem 1rem;
  font-family: var(--font-mono);
  font-size: 0.75rem;
  color: var(--text-secondary);
  line-height: 1.8;
  max-height: 160px;
  overflow: hidden;
  position: relative;
  z-index: 1;
  mask-image: linear-gradient(to bottom, transparent, black 30%, black);
  -webkit-mask-image: linear-gradient(to bottom, transparent, black 30%, black);
}
.gen-log-line {
  display: flex;
  gap: 0.625rem;
  animation: logLineIn 0.25s ease-out;
}
.gen-log-line .ts { color: var(--text-tertiary); flex-shrink: 0; }
.gen-log-line .lvl { color: var(--cyan); flex-shrink: 0; width: 40px; }
.gen-log-line.ok .lvl { color: var(--lime); }
.gen-log-line.warn .lvl { color: var(--warning); }
@keyframes logLineIn { from { opacity: 0; transform: translateX(-4px); } to { opacity: 1; transform: translateX(0); } }

@media (max-width: 700px) {
  .gen-pipeline { grid-template-columns: 1fr 1fr; }
  .gen-stage { padding: 1.125rem 0.875rem; }
  .stream-out { padding: var(--space-4); }
}
@media (max-width: 480px) {
  .gen-pipeline { grid-template-columns: 1fr; }
}

/* ─── Streaming Typewriter ─── */
.stream-cursor {
  display: inline-block;
  width: 2px;
  height: 14px;
  background: var(--primary);
  margin-left: 0.0625rem;
  vertical-align: text-bottom;
  animation: streamBlink 0.6s ease-in-out infinite;
}
@keyframes streamBlink { 0%, 100% { opacity: 1; } 50% { opacity: 0; } }

#streamingOutput {
  position: relative;
  border-left: 2px solid var(--primary);
  background: var(--surface-lowest) !important;
  box-shadow: 0 0 16px rgba(var(--primary-rgb), 0.06);
  transition: box-shadow 0.3s ease;
}
#streamingOutput:not(:empty) {
  box-shadow: 0 0 24px rgba(var(--primary-rgb), 0.10);
}

/* ─── Spinner Ring — Clinical Cyan ─── */
.spinner-ring {
  width: 44px;
  height: 44px;
  border: 2px solid rgba(var(--info-rgb), 0.10);
  border-top-color: var(--cyan);
  border-radius: 50%;
  animation: spin 0.7s linear infinite;
  box-shadow: 0 0 12px rgba(var(--info-rgb), 0.10);
}
@keyframes spin { to { transform: rotate(360deg); } }

/* ─── Async button state ───
   Add .is-loading (JS: ui.setButtonLoading) to any button while its
   request is in flight: input is blocked, label dims, an inline spinner
   appears. Works on filled and ghost buttons alike via currentColor. */
.is-loading {
  position: relative;
  pointer-events: none;
  opacity: 0.78;
}
.is-loading::after {
  content: '';
  position: absolute;
  right: 10px;
  top: 50%;
  width: 13px;
  height: 13px;
  margin-top: -0.4375rem;
  border: 2px solid transparent;
  border-top-color: currentColor;
  border-right-color: currentColor;
  border-radius: 50%;
  animation: spin 0.7s linear infinite;
}

/* ─── Medical Word Loader (compact inline) ─── */
.med-loader {
  --loader-bg: var(--bg);
  display: flex;
  align-items: center;
  gap: 0.75rem;
  padding: 0.75rem 1.125rem;
  background: rgba(16, 22, 29, 0.7);
  border: var(--ghost-border);
  border-radius: var(--radius-md);
  margin-top: 0.5rem;
  backdrop-filter: blur(var(--blur-md));
  -webkit-backdrop-filter: blur(var(--blur-md));
}
.spinner-ring-sm {
  width: 22px;
  height: 22px;
  border: 2px solid rgba(var(--info-rgb), 0.10);
  border-top-color: var(--cyan);
  border-radius: 50%;
  animation: spin 0.7s linear infinite;
  flex-shrink: 0;
}
.med-words {
  overflow: hidden;
  position: relative;
  height: 22px;
  flex: 1;
  min-width: 0;
}
.med-words::after {
  content: "";
  position: absolute;
  inset: 0;
  background: linear-gradient(
    var(--loader-bg) 5%,
    transparent 25%,
    transparent 75%,
    var(--loader-bg) 95%
  );
  z-index: 20;
  pointer-events: none;
}
.med-word {
  display: block;
  height: 22px;
  line-height: 22px;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
  color: var(--cyan);
  font-family: var(--font-mono);
  font-size: 0.75rem;
  font-weight: 500;
  animation: medWordSpin 6s infinite;
}
@keyframes medWordSpin {
  10%  { transform: translateY(-102%); }
  25%  { transform: translateY(-100%); }
  35%  { transform: translateY(-202%); }
  50%  { transform: translateY(-200%); }
  60%  { transform: translateY(-302%); }
  75%  { transform: translateY(-300%); }
  85%  { transform: translateY(-402%); }
  100% { transform: translateY(-400%); }
}
.med-loader-sub {
  font-family: var(--font-mono);
  font-size: 0.75rem;
  color: var(--text-tertiary);
  opacity: 0.5;
  white-space: nowrap;
  flex-shrink: 0;
}

/* ─── Empty ─── */
.empty { text-align: center; padding: 3.75rem var(--space-5); color: var(--text-secondary); font-size: 0.9375rem; }
.empty-icon-wrap {
  width: 72px;
  height: 72px;
  margin: 0 auto 1.25rem;
  display: flex;
  align-items: center;
  justify-content: center;
  background: var(--surface-2);
  border: var(--ghost-border);
  border-radius: var(--radius-lg);
}
.empty-icon-wrap .icon { font-size: 2rem; color: var(--text-tertiary); }
.empty p { max-width: 280px; margin: 0 auto; line-height: 1.7; }

/* ─── Image Placeholder ─── */
.img-placeholder {
  display: inline-block;
  padding: 0.1875rem 0.75rem;
  margin: 0.25rem 0.125rem;
  border-radius: var(--radius-sm);
  background: var(--primary-soft);
  border: 1px dashed var(--primary-muted);
  font-family: var(--font-mono);
  font-size: 0.75rem;
  font-weight: 600;
  color: var(--primary);
}

/* ─── Error ─── */
.error-banner {
  padding: 0.875rem 1.125rem;
  border: 1px solid var(--primary-muted);
  border-radius: var(--radius-md);
  background: var(--error-soft);
  color: var(--error);
  font-size: 0.8125rem;
  font-weight: 500;
  margin-top: 1rem;
  display: flex;
  gap: 0.75rem;
  align-items: flex-start;
  box-shadow: 0 0 16px rgba(var(--error-rgb), 0.10);
}
.error-banner .icon { flex-shrink: 0; color: var(--error); }

/* ─── Toast ─── */
.toast-container {
  position: fixed;
  bottom: 24px;
  left: 50%;
  transform: translateX(-50%);
  z-index: 1000;
  display: flex;
  flex-direction: column;
  gap: 0.5rem;
  align-items: center;
  pointer-events: none;
}
.toast {
  background: rgba(34, 45, 56, 0.90);
  backdrop-filter: blur(var(--blur-md));
  -webkit-backdrop-filter: blur(var(--blur-md));
  color: var(--text);
  padding: 0.75rem 1rem 0.75rem 1.25rem;
  border-radius: var(--radius-md);
  border: var(--ghost-border);
  font-size: 0.875rem;
  font-weight: 500;
  box-shadow: var(--shadow-lg);
  animation: toastIn 0.3s var(--ease-out);
  pointer-events: auto;
  display: flex;
  align-items: center;
  gap: 0.625rem;
  max-width: min(560px, 90vw);
}
/* Dismissal is JS-driven (hover pauses the timer; close button) — the old
   pure-CSS toastOut at a fixed 2.5s couldn't be paused or closed. */
.toast-closing { animation: toastOut 0.25s ease-in forwards; }
.toast-error   { border-color: rgba(244, 113, 138, 0.5); }
.toast-error .icon:first-child { color: var(--error); }
.toast-warning { border-color: rgba(245, 185, 65, 0.5); }
.toast-warning .icon:first-child { color: var(--warning); }
.toast-msg { flex: 1; }
.toast-close {
  background: transparent;
  border: none;
  color: var(--text-tertiary);
  cursor: pointer;
  padding: 0.25rem;
  margin: -0.25rem -0.25rem -0.25rem 0;
  border-radius: var(--radius-sm);
  display: flex;
  align-items: center;
}
.toast-close:hover { color: var(--text); background: rgba(255, 255, 255, 0.08); }
@keyframes toastIn {
  from { opacity: 0; transform: translateY(16px) scale(0.95); }
  to   { opacity: 1; transform: translateY(0) scale(1); }
}
@keyframes toastOut {
  from { opacity: 1; }
  to   { opacity: 0; transform: translateY(-8px) scale(0.95); }
}

/* ─── Modal — Glassmorphism (frosted laboratory glass) ─── */
.modal-overlay {
  position: fixed;
  inset: 0;
  background: rgba(16, 22, 29, 0.60);
  backdrop-filter: blur(var(--blur-lg));
  -webkit-backdrop-filter: blur(var(--blur-lg));
  z-index: 900;
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 1.25rem;
}

.modal-surface {
  background: rgba(27, 36, 46, 0.85);
  backdrop-filter: blur(var(--blur-xl));
  -webkit-backdrop-filter: blur(var(--blur-xl));
  border: var(--ghost-border);
  border-radius: var(--radius-lg);
  padding: 1.75rem;
  max-width: 480px;
  width: 100%;
  box-shadow: var(--shadow-xl);
  /* Ambient light leak */
  background-image: radial-gradient(circle at top right, rgba(var(--primary-rgb), 0.06) 0%, transparent 50%);
}
.modal-header { display: flex; align-items: center; gap: var(--space-3); margin-bottom: var(--space-3); }
.modal-header .icon {
  font-size: 1.5rem;
  background: var(--primary-soft);
  width: 44px;
  height: 44px;
  display: flex;
  align-items: center;
  justify-content: center;
  border-radius: var(--radius-md);
  color: var(--primary);
}
.modal-surface h2 { font-size: var(--text-title-sm); font-weight: 600; color: var(--text); }
.modal-surface p { font-size: var(--text-body-sm); color: var(--text-secondary); margin-bottom: var(--space-5); line-height: 1.7; }
.modal-actions { display: flex; gap: 0.625rem; justify-content: flex-end; margin-top: var(--space-5); }

/* ─── Responsive ─── */
@media (max-width: 900px) {
  .source-radio-group { grid-template-columns: 1fr; }
}
@media (max-width: 700px) {
  #app { padding: 0.875rem; padding-bottom: var(--space-24); /* leave room for sticky dock */ }
  .config-surface { padding: 1.125rem 0.875rem; }
  .config-grid { grid-template-columns: 1fr 1fr; }
  .export-grid { grid-template-columns: 1fr; }
  .export-meta-row { grid-template-columns: 1fr; padding: var(--space-3) 0.875rem; }

  /* Top bar — compact "app chrome" mode on phones.
     The marketing tagline + brand-pills are wonderful on desktop but they
     devour the viewport on a phone. Hide them and keep only the badge,
     user identity, and logout — single horizontal row, fits comfortably. */
  .top-bar {
    flex-direction: row;
    align-items: center;
    justify-content: space-between;
    gap: 0.625rem;
    padding: 0.625rem 0.75rem;
    margin-bottom: 1.125rem;
  }
  .top-bar-brand { gap: 0.625rem; align-items: center; }
  .brand-tagline,
  .brand-pills,
  .brand-subtitle { display: none; }
  .brand-badge { font-size: var(--text-sm); padding: var(--space-2) var(--space-3); }
  .top-bar-actions {
    width: auto;
    /* Override the inline style="flex-direction:column;align-items:flex-end;gap:var(--space-2)"
       on this element so the actions sit on a single horizontal row. */
    flex-direction: row !important;
    align-items: center !important;
    justify-content: flex-end;
    flex-wrap: nowrap;
    gap: 0.5rem !important;
  }
  /* Header export buttons (DOCX / ZipGrade) hide on phones — the same
     buttons live inside the Resultados view, so they're not lost. */
  #exportBtnWrap { display: none !important; }

  .q-header { flex-direction: column; align-items: flex-start; }
  .brand-title { font-size: var(--text-body); }
  /* Tab bar: allow horizontal scroll on small screens so tabs don't crush */
  .tab-bar {
    overflow-x: auto;
    flex-wrap: nowrap;
    -webkit-overflow-scrolling: touch;
    scrollbar-width: none;
  }
  .tab-bar::-webkit-scrollbar { display: none; }
  .tab-btn { flex-shrink: 0; }
  /* Make primary CTA full width on mobile so it's thumb-reachable */
  .btn-generate { width: 100%; justify-content: center; }
  /* Toggle row reflows: hint drops to its own line */
  .toggle-row { flex-wrap: wrap; row-gap: var(--space-1); }
  .toggle-hint { margin-left: 2.375rem; flex-basis: 100%; }
  /* Status bar reflows */
  .status-bar { flex-direction: column; align-items: flex-start; gap: 0.625rem; }
  #exportBtnInline { flex-wrap: wrap; }

  /* Source-radio grid: force single column at phone widths so cards size
     to their own content instead of being stretched to match the tallest
     sibling. Bumped to a more specific selector + !important to win
     against any cached/older 2-col rule the user might still be on. */
  .source-section .source-radio-group { grid-template-columns: 1fr !important; }
  .source-radio-group { grid-template-columns: 1fr !important; }
  .source-radio { padding: var(--space-3) 0.875rem; }
  .source-radio-help { font-size: var(--text-sm); line-height: 1.4; }

  /* Material de referencia card — squeeze the long parenthetical sublabel
     ("(libro, presentación o resumen — ...)") which wraps to 3 lines and
     bloats the card vertically. */
  .source-book-picker { padding: 0.625rem var(--space-3); gap: 0.375rem; }
  .source-book-picker-label { flex-wrap: wrap; gap: 0.375rem; font-size: var(--text-sm); }
  .source-book-picker-label > span:nth-of-type(2) > span { display: none; }

  /* Native iOS <select> can render very tall when there are few options.
     Hard-cap the closed visual height; the open native picker is unaffected. */
  .source-book-picker .neu-select { max-height: 48px; min-height: 44px; }

  /* Generate dock — shed the floaty desktop chrome; keep the button thumb-
     reachable but inline so it doesn't visually overlap content above it.
     The kbd hint is irrelevant without a keyboard. */
  .generate-dock {
    position: sticky;
    bottom: 0;
    margin-top: 1rem;
    padding: 0.625rem 0.625rem calc(0.625rem + env(safe-area-inset-bottom, 0rem));
    border-radius: var(--radius-lg) var(--radius-lg) 0 0;
    border-bottom: 0;
    margin-left: -0.875rem;
    margin-right: -0.875rem;
    background: rgba(10, 14, 19, 0.92);
  }
  .btn-generate-kbd { display: none; }
  .btn-generate { padding: 0.875rem 1.125rem; font-size: 0.9375rem; }
}
@media (max-width: 480px) {
  #app { padding: 0.625rem; padding-bottom: var(--space-24); }
  .config-surface { padding: 0.875rem var(--space-3); }
  .config-grid { grid-template-columns: 1fr; }
  .source-radio { padding: var(--space-3) 0.875rem; }
  .source-radio-inputs { flex-direction: column; }
  .source-radio-inputs > * { flex: 1 1 auto; }
  .q-actions { flex-direction: column; align-items: stretch; }

  /* Even-tighter chrome on tiny phones */
  .top-bar { padding: var(--space-2) 0.625rem; margin-bottom: 0.875rem; }
  .brand-badge { font-size: var(--text-sm); padding: 0.4375rem 0.625rem; letter-spacing: 0.10em; }
  .user-badge { padding: 0.3125rem 0.625rem; font-size: var(--text-sm); gap: 0.375rem; }
  .user-badge .icon { font-size: var(--text-body); }
  .user-badge #userUsage { display: none; } /* save horizontal space */

  /* Generate dock — keep the bleed-to-edge but reset margins to the new
     #app padding so the dock sits flush. */
  .generate-dock { margin-left: -0.625rem; margin-right: -0.625rem; }
  .tab-btn {
    padding: 0.625rem 0.75rem;
    font-size: 0.75rem;
    min-height: 44px;          /* WCAG-friendly tap target */
  }
  .tab-btn .icon { font-size: var(--text-body); }
  .brand-subtitle { font-size: var(--text-sm); }
  /* Larger tap targets on phones */
  .neu-select, .neu-input, .neu-textarea { font-size: var(--text-body); padding: var(--space-3) 0.875rem; }
  .btn { min-height: 44px; }

  /* Help tips — visual chip stays small, hit area expands to ~44px */
  .help-tip { width: 24px; height: 24px; font-size: var(--text-sm); }
  .help-tip::before { inset: -10px; }

  /* Animate only dialogs that are closing. Preview overlays use
     .modal-overlay while open and must remain visible on narrow phones. */
  .app-modal-closing { animation: appModalFadeOut 0.15s ease-in forwards; }
.app-modal-closing .app-modal-card { animation: appModalCardOut 0.15s ease-in forwards; }
@keyframes appModalFadeOut { to { opacity: 0; } }
@keyframes appModalCardOut { to { opacity: 0; transform: scale(0.97) translateY(4px); } }
.app-modal-overlay { padding: var(--space-3); }
  .modal-surface,
  .app-modal-card,
  .app-modal-card-wide {
    max-width: calc(100vw - 24px);
    padding: 1.125rem;
    border-radius: var(--radius-lg);
  }
  .modal-surface h2,
  .app-modal-title { font-size: var(--text-body); }
  .app-modal-message { font-size: var(--text-sm); }

  /* Pre-export distribution: tighter rows so the modal fits */
  .stats-group { gap: var(--space-2); }
  .stats-row { font-size: var(--text-sm); }

  /* Generation overlay inner stage: drop heavy padding so the pipeline
     doesn't get squashed against the surface edges. */
  body.is-generating #loadingState { padding: 0.875rem; }
  body.is-generating #loadingState .gen-stage {
    padding: 1rem 0.875rem;
    max-width: 100%;
  }
  .gen-pipeline { gap: var(--space-2); }

  /* Welcome gate: keep the input from wrapping too eagerly on ≤360px,
     reduce existing-exam list height so the page scrolls less. */
  .welcome-card { padding: var(--space-6) var(--space-4); }
  .welcome-input { flex: 1 1 200px; padding: var(--space-3) 0.875rem; font-size: var(--text-body); }
  .welcome-go { padding: var(--space-3) 1.125rem; }
  .welcome-existing-list { max-height: 180px; }
  .welcome-exam-chip { padding: var(--space-3) 0.875rem; }
}

/* ─── Print ─── */
@media print {
  .top-bar, .tab-bar, .q-actions, .exp-panel,
  .config-surface, .export-surface, .status-bar,
  .toast-container, #generateBtn, .q-meta { display: none !important; }
  .q-card { break-inside: avoid; border: 1px solid #ccc; margin-bottom: var(--space-3); box-shadow: none; }
  body { background: white; color: black; }
  #view-results { display: block !important; }
}

/* ─── Reduced Motion ─── */


/* Shared workspace accessibility and state clarity. */
.sr-only {
  position: absolute !important;
  width: 1px !important;
  height: 1px !important;
  padding: 0 !important;
  margin: -0.0625rem !important;
  overflow: hidden !important;
  clip: rect(0, 0, 0, 0) !important;
  white-space: nowrap !important;
  border: 0 !important;
}

#mainContent:focus {
  outline: none;
}

.page-app .tab-btn.active .icon {
  color: #ffffff;
}

.page-app .btn-icon,
.page-app button.btn,
.page-app a.btn,
.page-app .ribbon-change-btn {
  min-height: 44px;
}

.page-app .btn-icon {
  min-width: 44px;
}

.first-run-layout {
  display: flex;
  align-items: flex-start;
  gap: 0.75rem;
  min-width: 0;
}

.first-run-layout > div {
  min-width: 0;
}

.gen-engine-status {
  color: var(--text-tertiary, #5f5f67);
  font-family: var(--font-mono, monospace);
  font-size: 0.75rem;
  text-align: right;
}

.gen-cancel-button {
  flex: 0 0 auto;
  min-width: 104px;
}

@media (max-width: 760px) {
  .first-run-layout {
    flex-direction: column;
  }

  .first-run-layout #firstRunHintDismiss {
    width: 100%;
  }

  .gen-top {
    align-items: flex-start;
    flex-wrap: wrap;
  }

  .gen-engine-status {
    order: 3;
    width: 100%;
    text-align: left;
  }

  .gen-cancel-button {
    margin-left: auto;
  }

  .toast-container {
    bottom: calc(88px + env(safe-area-inset-bottom));
  }

}

/* Optimizer answer provenance, medical-review gate, and separate AI audit. */
.rf-action-gate {
  margin: 0.5rem 0 0.75rem;
  padding: 0.625rem 0.75rem;
  border: 1px solid rgba(var(--warning-rgb), 0.35);
  border-radius: var(--radius-md);
  background: rgba(var(--warning-rgb), 0.1);
  color: var(--text);
  font-size: 0.875rem;
  line-height: 1.45;
}
.rf-action-gate[hidden] { display: none !important; }
.rf-answer-origin,
.rf-medical-review {
  display: flex;
  gap: 0.625rem;
  margin-top: 0.75rem;
  padding: 0.6875rem 0.75rem;
  border-radius: var(--radius-md);
  font-size: 0.875rem;
  line-height: 1.45;
}
.rf-answer-origin {
  align-items: flex-start;
  border: 1px solid var(--surface-3);
  background: var(--surface-1);
}
.rf-answer-origin > .icon { flex: 0 0 auto; color: var(--cyan); }
.rf-answer-origin strong,
.rf-answer-origin span { display: block; }
.rf-answer-origin span { color: var(--text-secondary); margin-top: 0.125rem; }
.rf-answer-inferred {
  border-color: rgba(var(--warning-rgb), 0.4);
  background: rgba(var(--warning-rgb), 0.08);
}
.rf-answer-inferred > .icon { color: var(--warning); }
.rf-answer-transformed > .icon { color: var(--lime); }
.rf-medical-review { display: block; border: 1px solid var(--surface-3); }
.rf-medical-review-title { display: flex; align-items: center; gap: 0.4375rem; }
.rf-medical-review-title .icon { font-size: 1.1875rem; }
.rf-medical-review p { margin: 0.4375rem 0 0; color: var(--text-secondary); }
.rf-medical-review-ok { background: rgba(66, 211, 146, 0.05); }
.rf-medical-review-ok .rf-medical-review-title { color: var(--success); }
.rf-medical-review-warning {
  border-color: rgba(var(--warning-rgb), 0.45);
  background: rgba(var(--warning-rgb), 0.09);
}
.rf-medical-review-warning .rf-medical-review-title { color: var(--warning); }
.rf-review-warning-list,
.rf-transformation-log ul,
.rf-ai-validation-result ul { margin: 0.4375rem 0 0 var(--space-5); padding: 0; }
.rf-review-warning-list li,
.rf-transformation-log li,
.rf-ai-validation-result li { margin: var(--space-1) 0; }
.rf-review-clear { margin-top: 0.4375rem; color: var(--text-secondary); }
.rf-review-acknowledgment {
  display: flex;
  align-items: flex-start;
  gap: 0.5625rem;
  margin-top: 0.625rem;
  padding-top: 0.625rem;
  border-top: 1px solid rgba(var(--warning-rgb), 0.28);
  cursor: pointer;
  color: var(--text);
  font-weight: 600;
}
.rf-review-acknowledgment input { margin-top: 0.1875rem; accent-color: var(--warning); }
.rf-transformation-log { margin-top: 0.625rem; font-size: var(--text-body-sm); color: var(--text-secondary); }
.rf-transformation-log summary { cursor: pointer; color: var(--text); font-weight: 600; }
.rf-separate-validation {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 0.875rem;
  margin-top: 0.875rem;
  padding-top: 0.875rem;
  border-top: 1px solid var(--surface-3);
}
.rf-separate-validation strong,
.rf-separate-validation span { display: block; }
.rf-separate-validation span { margin-top: 0.1875rem; color: var(--text-secondary); font-size: var(--text-body-sm); }
.rf-validation-status,
.rf-ai-validation-result {
  margin-top: 0.625rem;
  padding: 0.625rem 0.75rem;
  border: 1px solid var(--surface-3);
  border-radius: var(--radius-md);
  background: var(--surface-1);
  color: var(--text-secondary);
  font-size: 0.875rem;
  line-height: 1.45;
}
.rf-validation-status[hidden],
.rf-ai-validation-result[hidden] { display: none !important; }
.rf-validation-warning,
.rf-ai-validation-review { border-color: rgba(var(--warning-rgb), 0.4); }
.rf-validation-success,
.rf-ai-validation-pass { border-color: rgba(66, 211, 146, 0.4); }
.rf-ai-validation-result p { margin: 0.4375rem 0 0; color: var(--text-tertiary); }
.rf-ai-validation-result details { margin-top: 0.4375rem; }

@media (max-width: 700px) {
  .rf-separate-validation { align-items: stretch; flex-direction: column; }
  .rf-separate-validation .btn { width: 100%; min-height: 44px; }
  .rf-answer-origin,
  .rf-medical-review,
  .rf-action-gate,
  .rf-validation-status,
  .rf-ai-validation-result,
  .rf-transformation-log { font-size: var(--text-body); }
}

/* ─── Scrollbar ─── */
::-webkit-scrollbar { width: 6px; }
::-webkit-scrollbar-track { background: transparent; }
::-webkit-scrollbar-thumb { background: var(--surface-3); border-radius: 3px; }
::-webkit-scrollbar-thumb:hover { background: var(--text-tertiary); }

/* ─── Book Status ─── */
.book-status {
  display: flex;
  align-items: center;
  gap: 0.375rem;
  padding: 0.5rem 0;
  min-height: 32px;
}

/* ─── Curriculum mode toggle (Por temario / Personalizado) ──────────
   Sits between the course/specialty grid and the source-radio group.
   Hidden by default — js/curricula.js reveals it when the chosen course
   has a UNIBE syllabus encoded. Visually neutral so it sits in the form
   rhythm rather than reading as a separate accent block. */
.topic-mode-block {
  /* Sit in the form rhythm rather than as a tinted panel — the toggle
     inside already carries enough chrome. The previous tinted background
     read as "different section" and clashed with the surrounding
     .config-surface. */
  margin-top: 1.125rem;
}
.topic-mode-block[hidden] { display: none; }
.topic-mode-label {
  display: flex;
  align-items: center;
  gap: 0.375rem;
  font-family: var(--font-main);
  font-size: 0.8125rem;
  font-weight: 600;
  color: var(--text-secondary);
  margin-bottom: 0.625rem;
}
.topic-mode-toggle {
  display: flex;
  gap: 0.375rem;
  background: rgba(255,255,255,0.03);
  border: 1px solid rgba(255,255,255,0.08);
  border-radius: var(--radius-md);
  padding: 0.1875rem;
}
.topic-mode-option {
  flex: 1;
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 0.375rem;
  padding: 0.4375rem 0.75rem;
  font-size: 0.8125rem;
  color: var(--text-secondary);
  cursor: pointer;
  border-radius: calc(var(--radius-md) - 3px);
  transition: background 120ms ease, color 120ms ease;
}
.topic-mode-option input { position: absolute; opacity: 0; pointer-events: none; }
.topic-mode-option:hover { color: var(--text); }
.topic-mode-option:has(input:checked) {
  background: rgba(var(--primary-rgb), 0.15);
  color: var(--text);
  font-weight: 600;
}
.topic-mode-temario-panel {
  margin-top: 0.75rem;
  display: flex;
  flex-direction: column;
  gap: 0.625rem;
}
/* Mirror the temario panel layout so swapping radios doesn't shift the
   form — both children sit at the same vertical position. */
.topic-mode-custom-panel {
  margin-top: 0.75rem;
  display: flex;
  flex-direction: column;
  gap: 0.5rem;
}
.topic-mode-custom-panel[hidden] { display: none; }
.topic-mode-custom-input {
  font-size: 0.8125rem;
  padding: 0.625rem 0.75rem;
}
.topic-mode-custom-hint {
  font-size: 0.75rem;
  color: var(--text-tertiary);
  font-style: italic;
}
.topic-picker-btn {
  display: inline-flex;
  align-items: center;
  gap: 0.5rem;
  align-self: flex-start;
  font-size: 0.8125rem;
  padding: 0.5625rem 1rem;
  background: rgba(255, 255, 255, 0.03);
  border: 1px solid rgba(255, 255, 255, 0.10);
  color: var(--text);
  border-radius: var(--radius-md);
  cursor: pointer;
  transition: background 120ms ease, border-color 120ms ease;
}
.topic-picker-btn:hover {
  background: rgba(255, 255, 255, 0.06);
  border-color: rgba(255, 255, 255, 0.18);
}
.topic-picker-btn .icon { font-size: var(--text-body); }
.topic-picker-chips {
  display: flex;
  flex-wrap: wrap;
  gap: 0.375rem;
  align-items: center;
  min-height: 1.5em;
}
.topic-picker-hint {
  font-size: 0.75rem;
  color: var(--text-tertiary);
  font-style: italic;
}
.topic-picker-chip {
  display: inline-flex;
  align-items: center;
  padding: 0.25rem 0.625rem;
  font-size: 0.75rem;
  background: rgba(255, 255, 255, 0.04);
  border: 0.5px solid rgba(255, 255, 255, 0.10);
  border-radius: 999px;
  color: var(--text-secondary);
  max-width: 320px;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.topic-picker-chip-count {
  display: inline-flex;
  align-items: center;
  padding: 0.25rem 0.625rem;
  font-family: var(--font-mono);
  font-size: 0.75rem;
  background: rgba(var(--primary-rgb), 0.15);
  color: var(--primary);
  border-radius: 999px;
  letter-spacing: 0.04em;
  text-transform: uppercase;
}

/* ─── Curriculum picker modal (uses .app-modal-card-wide as base) ─── */
.curriculum-picker-card { max-height: 86vh; display: flex; flex-direction: column; }
.curriculum-bulk {
  display: flex;
  gap: 0.5rem;
  margin-bottom: 0.75rem;
}
.curriculum-bulk-btn {
  font-family: var(--font-mono);
  font-size: 0.75rem;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  background: transparent;
  border: 0.5px solid rgba(255,255,255,0.10);
  color: var(--text-secondary);
  padding: 0.3125rem 0.625rem;
  border-radius: var(--radius-sm);
  cursor: pointer;
  transition: background 120ms ease, color 120ms ease;
}
.curriculum-bulk-btn:hover {
  background: rgba(255,255,255,0.04);
  color: var(--text);
}
.curriculum-body {
  flex: 1;
  overflow-y: auto;
  padding-right: 0.5rem;
  display: flex;
  flex-direction: column;
  gap: 1.125rem;
}
.curriculum-unit {
  display: flex;
  flex-direction: column;
  gap: 0.25rem;
}
.curriculum-unit-name {
  font-family: var(--font-mono);
  font-size: 0.75rem;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--text-secondary);
  margin-bottom: 0.25rem;
  border-bottom: 0.5px solid rgba(255, 255, 255, 0.08);
  padding-bottom: 0.25rem;
}
.curriculum-row {
  display: flex;
  align-items: flex-start;
  gap: 0.625rem;
  padding: 0.375rem 0.25rem;
  font-size: 0.8125rem;
  color: var(--text-secondary);
  cursor: pointer;
  border-radius: var(--radius-sm);
  transition: background 120ms ease, color 120ms ease;
  line-height: 1.4;
}
.curriculum-row:hover {
  background: rgba(255,255,255,0.03);
  color: var(--text);
}
.curriculum-row input[type="checkbox"] {
  margin-top: 0.125rem;
  flex-shrink: 0;
  width: 14px;
  height: 14px;
  cursor: pointer;
  accent-color: var(--primary);
}
.curriculum-footer {
  display: flex;
  align-items: center;
  justify-content: space-between;
  margin-top: 1rem;
  padding-top: 0.875rem;
  border-top: 0.5px solid rgba(255,255,255,0.06);
  gap: 0.75rem;
}
.curriculum-count {
  font-family: var(--font-mono);
  font-size: 0.75rem;
  color: var(--text-tertiary);
  letter-spacing: 0.04em;
}

/* ─── Source Radio Group (replaces book + ragmode dropdowns) ─── */
.source-section {
  margin-top: 1.125rem;
}
.source-section-label {
  font-family: var(--font-main);
  font-size: 0.8125rem;
  font-weight: 600;
  letter-spacing: 0;
  text-transform: none;
  color: var(--text-secondary);
  margin-bottom: 0.625rem;
}
.source-book-picker {
  padding: 0.75rem 0.875rem;
  border: var(--ghost-border);
  border-radius: var(--radius-md);
  background: var(--surface-lowest);
  margin-bottom: 0.75rem;
  display: flex;
  flex-direction: column;
  gap: 0.5rem;
}
.source-book-picker[hidden] { display: none !important; }
.source-book-picker-label {
  display: flex;
  align-items: center;
  gap: 0.5rem;
  font-size: 0.75rem;
  font-weight: 600;
  color: var(--text-secondary);
}
.source-book-picker-inputs {
  display: flex;
  gap: 0.5rem;
  flex-wrap: wrap;
}
.source-book-picker-inputs > * { flex: 1 1 180px; min-width: 0; }
.source-book-picker .book-status { margin-top: 0.125rem; }
@media (max-width: 700px) {
  .source-book-picker-inputs { flex-direction: column; }
}
.source-radio-group {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 0.625rem;
}
.source-radio {
  position: relative;
  display: flex;
  gap: 0.75rem;
  padding: 0.875rem 1rem;
  border: var(--ghost-border);
  border-radius: var(--radius-md);
  background: var(--surface-lowest);
  cursor: pointer;
  transition: border-color var(--duration-fast) var(--ease-out),
              background var(--duration-fast) var(--ease-out),
              box-shadow var(--duration-fast) var(--ease-out);
}
.source-radio:hover {
  border-color: rgba(var(--primary-rgb), 0.30);
}
.source-radio input[type="radio"] {
  position: absolute;
  opacity: 0;
  pointer-events: none;
}
.source-radio-main {
  display: flex;
  flex-direction: column;
  gap: 0.375rem;
  flex: 1;
  min-width: 0;
}
.source-radio-title {
  display: flex;
  align-items: center;
  gap: 0.5rem;
  font-size: 0.875rem;
  color: var(--text);
}
.source-radio-title strong {
  font-weight: 600;
}
.source-radio-dot {
  display: inline-block;
  width: 14px;
  height: 14px;
  border-radius: 50%;
  border: 1.5px solid var(--text-tertiary);
  background: transparent;
  flex-shrink: 0;
  transition: border-color var(--duration-fast) var(--ease-out),
              background var(--duration-fast) var(--ease-out);
  position: relative;
}
.source-radio-help {
  font-size: 0.75rem;
  line-height: 1.45;
  color: var(--text-secondary);
}
.source-radio-inputs {
  display: flex;
  gap: 0.5rem;
  margin-top: 0.25rem;
  flex-wrap: wrap;
}
.source-radio-inputs > * { flex: 1 1 140px; min-width: 0; }

/* Active state */
.source-radio-active {
  border-color: var(--primary);
  background: var(--primary-soft);
  box-shadow: var(--shadow-sm);
}
.source-radio-active .source-radio-dot {
  border-color: var(--primary);
  background: var(--primary);
  box-shadow: inset 0 0 0 3px var(--surface-lowest);
}

/* Disabled state (e.g. when no books available) */
.source-radio-disabled {
  opacity: 0.45;
  cursor: not-allowed;
  background: transparent;
}
.source-radio-disabled:hover { border-color: var(--border); }

/* ─── Config Details (Mas opciones disclosure) ─── */
.config-details {
  margin-top: 1.125rem;
  border-top: 1px solid rgba(255, 255, 255, 0.06);
  padding-top: 1rem;
}
.config-details-summary {
  display: flex;
  align-items: center;
  gap: 0.625rem;
  cursor: pointer;
  list-style: none;
  font-family: var(--font-main);
  font-size: 0.875rem;
  font-weight: 500;
  letter-spacing: 0;
  text-transform: none;
  color: var(--text-secondary);
  user-select: none;
  padding: 0.25rem 0;
  transition: color var(--duration-fast) var(--ease-out);
}
.config-details-summary:hover { color: var(--text); }
.config-details-summary::-webkit-details-marker { display: none; }
.config-details-summary .icon { font-size: var(--text-body-lg); color: var(--text-tertiary); }
.config-details-summary .chevron {
  margin-left: auto;
  transition: transform 0.25s ease;
  color: var(--text-tertiary);
}
.config-details[open] > .config-details-summary .chevron {
  transform: rotate(180deg);
}

/* ─── Toggle hint (small grey hint inside toggle-row) ─── */
.toggle-hint {
  font-size: 0.75rem;
  color: var(--text-tertiary);
  margin-left: auto;
}

/* ─── Export metadata row (DOCX title + catedra above results) ─── */
.export-meta-row {
  display: grid;
  grid-template-columns: 2fr 1fr;
  gap: 0.75rem;
  padding: 0.875rem 1rem;
  margin-bottom: 0.875rem;
  background: var(--surface-0);
  border: var(--ghost-border);
  border-radius: var(--radius-md);
}

/* ─── User Badge ─── */
.user-badge {
  display: flex;
  align-items: center;
  gap: 0.5rem;
  padding: 0.375rem 0.875rem;
  background: var(--surface-2);
  border: var(--ghost-border);
  border-radius: var(--radius-md);
  color: var(--text);
}

/* ─── Bank Card tweaks ─── */
.bank-card {
  margin-bottom: 0.75rem;
}
.bank-card .q-vignette {
  font-size: 0.8125rem;
  line-height: 1.6;
}
.bank-actions {
  display: flex;
  gap: 0.5rem;
  padding: 0.75rem 1rem;
  border-top: 1px solid var(--border, #222d38);
  align-items: center;
}

/* ─── Admin table ─── */
#adminContent table th {
  font-family: var(--font-mono);
  font-size: 0.75rem;
  font-weight: 500;
  text-transform: uppercase;
  letter-spacing: 0.10em;
  color: var(--text-tertiary);
}
#adminContent table td {
  vertical-align: middle;
}
.admin-row-actions-cell {
  padding: 0.625rem 0.5rem;
  text-align: center;
}
.admin-row-actions {
  display: flex;
  gap: 0.25rem;
  justify-content: center;
  flex-wrap: wrap;
}

/* ─── Pulse Indicator — AI "thinking" / "observing" ─── */
.pulse-dot {
  width: 4px;
  height: 4px;
  border-radius: 50%;
  background: var(--lime);
  display: inline-block;
  animation: statusPulse 3s ease-in-out infinite;
  box-shadow: 0 0 6px rgba(var(--success-rgb), 0.40);
}
@keyframes statusPulse {
  0%, 100% { box-shadow: 0 0 4px rgba(var(--success-rgb), 0.30); opacity: 0.7; }
  50%      { box-shadow: 0 0 12px rgba(var(--success-rgb), 0.60); opacity: 1; }
}

/* (legacy duplicate of .section-label removed — see top of file for canonical rule) */

/* ─── Billing — Tier Badge ─── */
.billing-tier-badge {
  display: flex;
  flex-direction: column;
  gap: 0.25rem;
  padding: 1.25rem 1.75rem;
  border-radius: var(--radius-lg);
  border: 1px solid var(--border, rgba(255,255,255,0.08));
  background: var(--surface-2, #1b242e);
  min-width: 160px;
}
.billing-tier-badge.tier-lite { border-color: rgba(107,107,107,0.3); }
.billing-tier-badge.tier-pro { border-color: rgba(240,74,94,0.35); background: rgba(240,74,94,0.04); }
.billing-tier-badge.tier-departamento { border-color: rgba(245,158,11,0.35); background: rgba(245,158,11,0.04); }
.billing-tier-badge.tier-institucional { border-color: rgba(96,165,250,0.35); background: rgba(96,165,250,0.04); }

/* Billing Progress Bar */
.billing-progress-bar {
  width: 100%;
  height: 8px;
  background: var(--surface-2, #1b242e);
  border-radius: 100px;
  overflow: hidden;
  border: 1px solid var(--border, rgba(255,255,255,0.06));
}
.billing-progress-fill {
  height: 100%;
  border-radius: 100px;
  transition: width 0.6s cubic-bezier(0.62, 0.16, 0.13, 1.01);
}

/* Billing Plans Grid */
.billing-plans-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(160px, 1fr));
  gap: 0.75rem;
  margin-top: 0.75rem;
}
.billing-plan-card {
  padding: 1.25rem 1rem;
  background: var(--surface-0, #10161d);
  border: 1px solid var(--border, rgba(255,255,255,0.08));
  border-radius: var(--radius-md, 12px);
  text-align: center;
  transition: background var(--duration-fast) var(--ease-out), border-color var(--duration-fast) var(--ease-out), color var(--duration-fast) var(--ease-out), box-shadow var(--duration-fast) var(--ease-out), transform var(--duration-fast) var(--ease-out);
  cursor: pointer;
}
.billing-plan-card:hover:not(.current) {
  border-color: var(--primary);
  transform: translateY(-2px);
  box-shadow: 0 8px 24px rgba(240,74,94,0.1);
}
.billing-plan-card.current {
  border-color: rgba(52,211,153,0.3);
  background: rgba(52,211,153,0.04);
  cursor: default;
}

/* Billing Top-ups Grid */
.billing-topups-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(160px, 1fr));
  gap: 0.75rem;
}
.billing-topup-card {
  padding: 1.25rem 1rem;
  background: var(--surface-0, #10161d);
  border: 1px solid var(--border, rgba(255,255,255,0.08));
  border-radius: var(--radius-md, 12px);
  text-align: center;
  cursor: pointer;
  transition: background var(--duration-fast) var(--ease-out), border-color var(--duration-fast) var(--ease-out), color var(--duration-fast) var(--ease-out), box-shadow var(--duration-fast) var(--ease-out), transform var(--duration-fast) var(--ease-out);
}
.billing-topup-card:hover {
  border-color: var(--primary);
  transform: translateY(-2px);
  box-shadow: 0 8px 24px rgba(240,74,94,0.1);
}

/* Billing Payment Table */
.billing-table {
  width: 100%;
  border-collapse: collapse;
  font-size: 0.8125rem;
  margin-top: 0.75rem;
}
.billing-table th {
  font-family: var(--font-mono, monospace);
  font-size: 0.75rem;
  font-weight: 500;
  text-transform: uppercase;
  letter-spacing: 0.1em;
  color: var(--text-tertiary, #555);
  text-align: left;
  padding: 0.625rem 0.75rem;
  border-bottom: 1px solid var(--border, rgba(255,255,255,0.08));
}
.billing-table td {
  padding: 0.625rem 0.75rem;
  border-bottom: 1px solid var(--border, rgba(255,255,255,0.04));
  color: var(--text-secondary, #999);
}
.billing-table tr:hover td {
  background: var(--surface-0, rgba(255,255,255,0.02));
}

@media (max-width: 700px) {
  .billing-plans-grid, .billing-topups-grid { grid-template-columns: 1fr 1fr; }
  .billing-tier-badge { min-width: unset; }
}
@media (max-width: 480px) {
  .billing-plans-grid, .billing-topups-grid { grid-template-columns: 1fr; }
}

/* ─── RAG Disabled (no books available) ─── */
.rag-disabled { opacity: 0.4; pointer-events: none; filter: blur(0.5px); }


/* ─── User badge with quota fill ─── */
.user-badge .mono {
  font-family: var(--font-mono);
  font-size: 0.75rem;
  color: var(--text-tertiary);
  letter-spacing: 0.04em;
}
.user-badge .quota-bar {
  width: 56px;
  height: 4px;
  background: var(--surface-lowest);
  border-radius: 2px;
  overflow: hidden;
  position: relative;
}
.user-badge .quota-bar::after {
  content: '';
  position: absolute;
  inset: 0;
  width: var(--fill, 60%);
  background: var(--primary);
  border-radius: 2px;
}

/* ─── View header (eyebrow + italic display title + sub) ─── */
.view-header {
  display: flex;
  align-items: flex-end;
  justify-content: space-between;
  gap: 1.5rem;
  margin-bottom: 1.5rem;
  padding-bottom: 1.25rem;
  border-bottom: 1px solid var(--border);
}
.view-header-title .eyebrow {
  font-family: var(--font-mono);
  font-size: 0.75rem;
  font-weight: 600;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--primary);
  margin-bottom: 0.5rem;
}
.view-header-title h2 {
  font-family: var(--font-display);
  font-style: italic;
  font-size: 2.125rem;
  font-weight: 400;
  letter-spacing: -0.015em;
  color: var(--text);
  line-height: 1.1;
  margin: 0;
}
.view-header-title h2 em { font-style: italic; color: var(--primary); }
.view-header-title .sub {
  margin-top: 0.625rem;
  font-size: 0.875rem;
  color: var(--text-secondary);
  max-width: 540px;
  line-height: 1.55;
}
.view-header-actions { display: flex; gap: var(--space-2); align-items: center; flex-wrap: wrap; }

/* ─── Card grid (2-up / 3-up) for dashboard tiles ─── */
.card-grid {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 1rem;
  margin-bottom: 1rem;
}
.card-grid.three { grid-template-columns: 1fr 1fr 1fr; }
@media (max-width: 860px) {
  .card-grid, .card-grid.three { grid-template-columns: 1fr; }
}

/* ─── Data card (dashboard tile pattern) ─── */
.data-card {
  background: var(--surface-0);
  border: 1px solid var(--border);
  border-radius: var(--radius-lg);
  padding: 1.25rem 1.375rem;
  transition: background var(--duration-fast) var(--ease-out), border-color var(--duration-fast) var(--ease-out), color var(--duration-fast) var(--ease-out), box-shadow var(--duration-fast) var(--ease-out), transform var(--duration-fast) var(--ease-out);
}
.data-card:hover {
  border-color: var(--border-strong);
  box-shadow: var(--shadow-md);
}
.data-card-label {
  font-family: var(--font-mono);
  font-size: 0.75rem;
  font-weight: 500;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  color: var(--text-tertiary);
  margin-bottom: 0.875rem;
  display: flex;
  align-items: center;
  gap: 0.5rem;
}
.data-card-label .icon {
  font-size: 0.875rem;
  color: var(--primary);
  opacity: 0.9;
}

/* Meter (used inside data-card for usage / quota visuals) */
.meter-row { margin-bottom: var(--space-4); }
.meter-row:last-child { margin-bottom: 0; }
.meter-head {
  display: flex;
  justify-content: space-between;
  align-items: baseline;
  margin-bottom: 0.5rem;
}
.meter-head .label { font-size: var(--text-label); color: var(--text); }
.meter-head .val {
  font-family: var(--font-mono);
  font-size: 0.8125rem;
  font-weight: 600;
  color: var(--text);
}
.meter-head .cap { color: var(--text-tertiary); font-weight: 400; }
.meter-bar {
  height: 6px;
  background: var(--surface-lowest);
  border-radius: 3px;
  overflow: hidden;
}
.meter-fill {
  height: 100%;
  background: linear-gradient(90deg, var(--primary), var(--primary-surface));
  border-radius: 3px;
  transition: width 0.4s var(--ease-out);
}
.meter-foot {
  font-size: 0.75rem;
  color: var(--text-tertiary);
  margin-top: 0.5rem;
  font-family: var(--font-mono);
  letter-spacing: 0.02em;
}

/* ─── Library card (lib-card) ─── */
.lib-card {
  display: flex;
  align-items: center;
  gap: 1rem;
  padding: 1rem 1.25rem;
  background: var(--surface-0);
  border: 1px solid var(--border);
  border-radius: var(--radius-lg);
  margin-bottom: 0.625rem;
  transition: background var(--duration-fast) var(--ease-out), border-color var(--duration-fast) var(--ease-out), color var(--duration-fast) var(--ease-out), box-shadow var(--duration-fast) var(--ease-out), transform var(--duration-fast) var(--ease-out);
}
.lib-card:hover {
  border-color: var(--border-strong);
  background: var(--surface-1);
}
.lib-icon {
  width: 42px;
  height: 42px;
  flex-shrink: 0;
  display: flex;
  align-items: center;
  justify-content: center;
  background: var(--primary-soft);
  border: 1px solid var(--primary-muted);
  border-radius: var(--radius-md);
}
.lib-icon .icon { color: var(--primary); font-size: 1.375rem; }
.lib-body { flex: 1; min-width: 0; }
.lib-name {
  font-size: 0.875rem;
  font-weight: 600;
  color: var(--text);
  margin-bottom: 0.25rem;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.lib-meta {
  display: flex;
  gap: 0.625rem;
  font-family: var(--font-mono);
  font-size: 0.75rem;
  color: var(--text-tertiary);
  margin-bottom: 0.375rem;
  letter-spacing: 0.02em;
  flex-wrap: wrap;
}
.lib-meta .dot { color: var(--surface-3); }
.lib-row { display: flex; gap: var(--space-2); align-items: center; flex-wrap: wrap; }
.lib-tag {
  font-size: 0.75rem;
  font-weight: 500;
  padding: 0.1875rem 0.625rem;
  border-radius: var(--radius-md);
  background: var(--surface-2);
  color: var(--text-secondary);
  border: 1px solid var(--border);
}
.lib-status {
  display: inline-flex;
  align-items: center;
  gap: 0.375rem;
  font-family: var(--font-mono);
  font-size: 0.75rem;
  font-weight: 500;
  color: var(--lime);
  letter-spacing: 0.04em;
}
.lib-status-dot {
  width: 6px;
  height: 6px;
  border-radius: 50%;
  background: var(--lime);
  box-shadow: 0 0 6px rgba(var(--success-rgb), 0.5);
  animation: statusPulse 3s ease-in-out infinite;
}
.lib-upload {
  border-style: dashed;
  border-color: var(--border-strong);
  background: var(--surface-lowest);
  cursor: pointer;
}
.lib-upload:hover {
  border-color: var(--primary);
  background: var(--primary-soft);
}
.lib-note {
  display: flex;
  gap: 0.75rem;
  padding: 1rem 1.25rem;
  background: var(--surface-0);
  border: 1px solid var(--border);
  border-radius: var(--radius-lg);
  margin-top: 1rem;
  font-size: 0.75rem;
  color: var(--text-secondary);
  line-height: 1.6;
}
.lib-note .icon { color: var(--cyan); font-size: var(--text-body-lg); margin-top: 0.0625rem; }

/* ─── Flow steps (empty-bank onboarding) ─── */
.flow {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: 0.625rem;
  margin-bottom: 1.5rem;
}
@media (max-width: 720px) { .flow { grid-template-columns: 1fr 1fr; } }
.flow-step {
  padding: 1rem 1.125rem;
  background: var(--surface-0);
  border: 1px solid var(--border);
  border-radius: var(--radius-lg);
  position: relative;
}
.flow-step.done {
  border-color: rgba(var(--success-rgb), 0.25);
  background: var(--lime-soft);
}
.flow-step.active {
  border-color: var(--primary-muted);
  background: var(--primary-soft);
  box-shadow: 0 0 20px rgba(var(--primary-rgb), 0.08);
}
.flow-num {
  font-family: var(--font-mono);
  font-size: 0.75rem;
  font-weight: 600;
  letter-spacing: 0.12em;
  color: var(--text-tertiary);
  margin-bottom: 0.375rem;
}
.flow-step.done .flow-num { color: var(--lime); }
.flow-step.active .flow-num { color: var(--primary); }
.flow-title {
  font-size: 0.875rem;
  font-weight: 600;
  color: var(--text);
  margin-bottom: 0.25rem;
}
.flow-body {
  font-size: 0.75rem;
  color: var(--text-secondary);
  line-height: 1.5;
}

/* ─── Suggestion chip (pill-style, for prompt builder / instruction picker) ─── */
.sug-chip {
  display: inline-flex;
  align-items: center;
  gap: 0.375rem;
  padding: 0.375rem 0.75rem;
  border-radius: 999px;
  font-size: 0.75rem;
  font-weight: 500;
  background: var(--surface-1);
  color: var(--text-secondary);
  border: 1px solid rgba(255, 255, 255, 0.06);
  cursor: pointer;
  transition: background var(--duration-fast) var(--ease-out), border-color var(--duration-fast) var(--ease-out), color var(--duration-fast) var(--ease-out), box-shadow var(--duration-fast) var(--ease-out), transform var(--duration-fast) var(--ease-out);
  white-space: nowrap;
  font-family: var(--font-main);
}
.sug-chip:hover {
  background: var(--surface-2);
  color: var(--text);
  border-color: rgba(255, 255, 255, 0.12);
}
.sug-chip.active {
  background: var(--primary-soft);
  color: var(--primary-surface);
  border-color: var(--primary-muted);
}
.sug-chip .icon { font-size: var(--text-label); opacity: 0.8; }

/* ─── Chip group (segmented control, parallel to source-radio-group) ─── */
.chip-group {
  display: flex;
  gap: 0.1875rem;
  padding: 0.1875rem;
  background: var(--surface-lowest);
  border: 1px solid rgba(255, 255, 255, 0.05);
  border-radius: var(--radius-md);
}
.chip {
  flex: 1;
  padding: 0.5625rem 0.625rem;
  border: none;
  background: transparent;
  color: var(--text-tertiary);
  cursor: pointer;
  font-family: var(--font-main);
  font-size: 0.8125rem;
  font-weight: 500;
  letter-spacing: 0;
  border-radius: 6px;
  transition: background var(--duration-fast) var(--ease-out), border-color var(--duration-fast) var(--ease-out), color var(--duration-fast) var(--ease-out), box-shadow var(--duration-fast) var(--ease-out), transform var(--duration-fast) var(--ease-out);
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 0.375rem;
  white-space: nowrap;
}
.chip .icon { font-size: 0.9375rem; }
.chip:hover { color: var(--text-secondary); background: var(--surface-1); }
.chip.active {
  background: var(--surface-2);
  color: var(--text);
  box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.08);
}
.chip.active .icon { color: var(--primary); }

/* ────────────────────────────────────────────────────
   Persistent Exam UI — selector, stats, drag-handles, preview
   ──────────────────────────────────────────────────── */

/* Stats panel: compact tag-row of {Bloom, difficulty, specialty} chips */
.exam-stats {
  display: flex;
  flex-wrap: wrap;
  gap: 0.5rem;
  padding: 0.625rem 0.75rem;
  background: var(--surface-1, rgba(255,255,255,0.02));
  border: 0.5px solid rgba(255,255,255,0.06);
  border-radius: 8px;
  font-size: 0.75rem;
}
.exam-stats:empty { display: none; }
.exam-stat {
  display: inline-flex;
  align-items: center;
  gap: 0.375rem;
  padding: 0.1875rem 0.625rem;
  background: rgba(255,255,255,0.03);
  border: 0.5px solid rgba(255,255,255,0.06);
  border-radius: 999px;
  color: var(--text-secondary);
  font-family: var(--font-mono);
  letter-spacing: 0.02em;
}
.exam-stat strong {
  color: var(--text);
  font-weight: 600;
}
.exam-stat .icon { font-size: var(--text-label); opacity: 0.7; }

/* Drag handle on each exam-row */
.drag-handle {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 28px;
  height: 28px;
  margin-right: 0.5rem;
  cursor: grab;
  color: var(--text-tertiary);
  border-radius: 6px;
  transition: background var(--duration-fast) var(--ease-out), color var(--duration-fast) var(--ease-out);
  flex: none;
  user-select: none;
}
.drag-handle:hover {
  color: var(--text);
  background: rgba(255,255,255,0.04);
}
.drag-handle:active { cursor: grabbing; }
.drag-handle .icon { font-size: var(--text-body-lg); }

.exam-row { transition: transform var(--duration-fast) var(--ease-out), opacity var(--duration-fast) var(--ease-out); }
.exam-row.dragging { opacity: 0.45; }
.exam-row.drop-target {
  box-shadow: inset 0 2px 0 0 var(--primary);
  background: rgba(var(--primary-rgb), 0.04);
}

/* Preview modal — printable layout */
#examPreviewBody .preview-q {
  margin-bottom: 1.75rem;
  padding-bottom: 1.25rem;
  border-bottom: 1px dashed rgba(255,255,255,0.08);
  page-break-inside: avoid;
}
#examPreviewBody .preview-q:last-child {
  border-bottom: none;
  margin-bottom: 0;
  padding-bottom: 0;
}
#examPreviewBody .preview-num {
  font-family: var(--font-mono);
  font-size: 0.75rem;
  font-weight: 600;
  color: var(--text-tertiary);
  margin-bottom: 0.5rem;
  letter-spacing: 0.06em;
}
#examPreviewBody .preview-stem {
  margin-bottom: 0.75rem;
  white-space: pre-wrap;
  color: var(--text);
  line-height: 1.7;
}
#examPreviewBody .preview-opts {
  padding-left: 0.875rem;
  border-left: 2px solid var(--primary-soft, rgba(240,74,94,0.15));
}
#examPreviewBody .preview-opt {
  display: flex;
  gap: 0.625rem;
  align-items: flex-start;
  padding: 0.25rem 0;
  color: var(--text-secondary);
}
#examPreviewBody .preview-letter {
  font-family: var(--font-mono);
  font-weight: 600;
  color: var(--text-tertiary);
  min-width: 18px;
}

/* Selector row visual polish */
.exam-selector-row select:disabled,
.exam-selector-row button:disabled {
  opacity: 0.45;
  cursor: not-allowed;
}

/* ────────────────────────────────────────────────────
   Welcome Gate — rotating phrase + exam-name intake
   Sits inside #view-config; hides the rest of the form
   when #view-config carries .welcome-active.
   ──────────────────────────────────────────────────── */

.welcome-gate {
  display: flex;
  align-items: center;
  justify-content: center;
  min-height: 62vh;
  padding: 2.5rem 1.25rem;
  animation: welcome-fade-in 0.45s var(--ease-out, ease-out) both;
}
.welcome-card {
  max-width: 640px;
  width: 100%;
  text-align: center;
}
.welcome-phrase-wrap {
  min-height: 110px;
  margin-bottom: 2.25rem;
  display: flex;
  align-items: center;
  justify-content: center;
}
.welcome-phrase {
  font-family: var(--font-display);
  font-style: italic;
  font-size: clamp(1.75rem, 4.6vw, 2.75rem);
  font-weight: 400;
  color: var(--text);
  line-height: 1.25;
  letter-spacing: -0.01em;
  transition: opacity 320ms ease, transform 320ms ease;
  opacity: 1;
  display: inline-block;
  /* slight coral underglow so it doesn't feel inert */
  text-shadow: 0 8px 40px rgba(var(--primary-rgb), 0.10);
}
.welcome-phrase.fading {
  opacity: 0;
  transform: translateY(-8px);
}
.welcome-form {
  display: flex;
  gap: 0.75rem;
  align-items: stretch;
  max-width: 540px;
  margin: 0 auto;
  flex-wrap: wrap;
}
.welcome-input {
  flex: 1 1 280px;
  font-size: 0.9375rem;
  padding: 0.875rem 1.125rem;
  text-align: left;
}
.welcome-input::placeholder { color: var(--text-tertiary); opacity: 0.6; }
.welcome-go {
  flex: 0 0 auto;
  padding: 0.875rem 1.375rem;
  white-space: nowrap;
  display: inline-flex;
  align-items: center;
  gap: 0.5rem;
}
.welcome-skip {
  margin-top: 1.375rem;
  background: var(--surface-1, var(--surface-0));
  border: var(--ghost-border);
  border-radius: 10px;
  color: var(--text-secondary);
  font-size: 0.875rem;
  font-family: var(--font-main);
  padding: 0.75rem 1.25rem;
  min-height: 44px;
  cursor: pointer;
  transition: color 150ms ease, border-color 150ms ease, background 150ms ease;
}
.welcome-skip:hover { color: var(--text); border-color: rgba(255, 255, 255, 0.2); }

/* Continuar con [exam] — muted secondary action below the create form.
   Shown only when an exam is already loaded; lets the user dismiss the
   gate without typing a new name. */
.welcome-continue {
  margin-top: 1.125rem;
  display: inline-flex;
  align-items: center;
  gap: 0.5rem;
  padding: 0.5625rem 1rem;
  background: rgba(255, 255, 255, 0.03);
  border: 0.5px solid rgba(255, 255, 255, 0.08);
  border-radius: var(--radius-md);
  color: var(--text-secondary);
  font-size: 0.8125rem;
  font-family: var(--font-main);
  cursor: pointer;
  transition: background 150ms ease, color 150ms ease, border-color 150ms ease;
}
.welcome-continue:hover {
  background: rgba(255, 255, 255, 0.06);
  border-color: rgba(255, 255, 255, 0.16);
  color: var(--text);
}
.welcome-continue strong {
  color: var(--text);
  font-weight: 600;
}

/* ─── On-file exams quick-pick list (welcome gate) ─────────────────────
   One chip per active exam in `examsList`. Click → switchToExam + dismiss
   the gate. The currently-loaded exam (if any) is marked with `.is-current`
   so it stands out as the "actual" one without losing its clickability. */
.welcome-existing {
  margin-top: 1.125rem;
  display: flex;
  flex-direction: column;
  align-items: stretch;
  gap: 0.625rem;
  width: 100%;
  max-width: 460px;
}
.welcome-existing-label {
  font-size: 0.75rem;
  color: var(--text-tertiary);
  text-align: center;
  letter-spacing: 0.01em;
}
.welcome-existing-list {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 0.375rem;
  max-height: 220px;
  overflow-y: auto;
  padding: 0.125rem;
}
.welcome-exam-chip {
  display: flex;
  align-items: center;
  gap: 0.75rem;
  padding: 0.625rem 0.875rem;
  width: 100%;
  max-width: 420px;
  background: rgba(255, 255, 255, 0.03);
  border: 0.5px solid rgba(255, 255, 255, 0.08);
  border-radius: var(--radius-md);
  color: var(--text-secondary);
  font-family: var(--font-main);
  text-align: left;
  cursor: pointer;
  transition: background 150ms ease, color 150ms ease, border-color 150ms ease, transform 120ms ease;
}
.welcome-exam-chip:hover {
  background: rgba(255, 255, 255, 0.06);
  border-color: rgba(255, 255, 255, 0.18);
  color: var(--text);
  transform: translateX(2px);
}
.welcome-exam-chip:focus-visible {
  outline: 2px solid var(--primary);
  outline-offset: 2px;
}
.welcome-exam-chip .icon { font-size: var(--text-body); color: var(--text-tertiary); flex-shrink: 0; }
.welcome-exam-chip:hover .icon { color: var(--primary); }
.welcome-exam-chip-body {
  display: flex;
  flex-direction: column;
  gap: 0.125rem;
  min-width: 0;
  flex: 1;
}
.welcome-exam-chip-name {
  font-size: 0.875rem;
  font-weight: 500;
  color: var(--text);
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
.welcome-exam-chip-meta {
  font-family: var(--font-mono);
  font-size: 0.75rem;
  color: var(--text-tertiary);
  letter-spacing: 0.04em;
  text-transform: uppercase;
}
.welcome-exam-chip.is-current {
  background: rgba(var(--primary-rgb), 0.06);
  border-color: rgba(var(--primary-rgb), 0.22);
}
.welcome-exam-chip.is-current .icon { color: var(--primary); }
.welcome-exam-chip.is-current .welcome-exam-chip-meta { color: var(--primary); }

/* ─── Help-tip pills (?) ──────────────────────────────────────────────
   Tiny round button that lives next to a form label. On hover or focus
   it pops a small tooltip bubble with the contents of `data-tip`.
   CSS-only — no JS, keyboard-accessible via tabindex="0" + :focus. */
.help-tip {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 24px;
  height: 24px;
  position: relative;
  margin-left: 0.375rem;
  padding: 0;
  border-radius: 50%;
  background: rgba(255, 255, 255, 0.06);
  border: 0.5px solid rgba(255, 255, 255, 0.12);
  color: var(--text-tertiary);
  font-size: 0.75rem;
  font-weight: 600;
  font-family: var(--font-main);
  line-height: 1;
  cursor: help;
  vertical-align: middle;
  transition: background 120ms ease, color 120ms ease, border-color 120ms ease;
}
/* Invisible hit-area halo (44×44 total with the 24px chip) at ALL widths —
   these 13 tips carry the app's entire explanatory layer; a small
   hover-only target excluded exactly the users who need them. */
.help-tip::before {
  content: '';
  position: absolute;
  inset: -10px;
  border-radius: 50%;
}
.help-tip:hover,
.help-tip:focus-visible {
  background: rgba(var(--info-rgb), 0.16);
  border-color: rgba(var(--info-rgb), 0.35);
  color: var(--info);
  outline: none;
}
/* Tooltip bubble — appended to <body> by setupHelpTips() in ui.js so
   it can never be clipped by an overflow:hidden ancestor. JS positions
   it with fixed coords, clamping inside the viewport gutter. */
.help-tip-bubble {
  position: fixed;
  display: none;
  width: max-content;
  max-width: 280px;
  padding: 0.5625rem 0.75rem;
  background: var(--surface-2);
  border: 0.5px solid rgba(255, 255, 255, 0.12);
  border-radius: var(--radius-sm);
  color: var(--text);
  font-size: 0.75rem;
  font-weight: 400;
  font-family: var(--font-main);
  line-height: 1.45;
  text-align: left;
  white-space: normal;
  pointer-events: none;
  opacity: 0;
  transition: opacity 120ms ease;
  z-index: 2000;
  box-shadow: 0 8px 24px rgba(0, 0, 0, 0.55);
}

/* ─── App modal (prompt / confirm) ─────────────────────────────────── */
.app-modal-overlay {
  position: fixed;
  inset: 0;
  background: rgba(0, 0, 0, 0.65);
  z-index: 2200;
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 1.5rem;
}
.app-modal-card {
  background: var(--surface-2);
  border: 1px solid rgba(255, 255, 255, 0.08);
  border-radius: var(--radius-lg);
  width: 100%;
  max-width: 460px;
  max-height: calc(100vh - 48px);
  padding: 1.375rem 1.5rem 1.25rem;
  box-shadow: 0 20px 60px rgba(0, 0, 0, 0.6);
  display: flex;
  flex-direction: column;
  overflow: hidden;
}
.app-modal-head { margin-bottom: var(--space-2); }
.app-modal-title {
  margin: 0;
  font-size: 1rem;
  font-weight: 600;
  color: var(--text);
  letter-spacing: -0.01em;
}
.app-modal-message {
  margin: 0 0 1rem 0;
  font-size: 0.8125rem;
  color: var(--text-secondary);
  line-height: 1.5;
}
.app-modal-body { display: flex; flex-direction: column; gap: 0.875rem; }
.app-modal-input {
  width: 100%;
  font-size: 0.875rem;
  padding: 0.625rem 0.75rem;
}
.app-modal-actions {
  display: flex;
  justify-content: flex-end;
  gap: 0.5rem;
  margin-top: 0.25rem;
}
.app-modal-btn-cancel {
  font-size: 0.8125rem;
  padding: 0.5rem 0.875rem;
  background: transparent;
  color: var(--text-secondary);
}
.app-modal-btn-cancel:hover {
  color: var(--text);
  background: rgba(255, 255, 255, 0.04);
}
.app-modal-btn-ok {
  font-size: 0.8125rem;
  padding: 0.5rem 1rem;
}
.app-modal-btn-danger {
  background: var(--error, #f4718a);
  color: var(--text-on-accent);
  border-color: var(--error, #f4718a);
}
.app-modal-btn-danger:hover {
  background: #fb8aa0;
  border-color: #fb8aa0;
}

/* Wider variant for the export-confirm modal (distribution chart) */
.app-modal-card-wide { max-width: 560px; }

/* ─── Paywall modal (shown on /api/generate or /api/reformatter 429) ─── */
.paywall-card {
  max-width: 480px;
  padding: 1.5rem 1.625rem 1.125rem;
  text-align: left;
}
.paywall-head {
  display: flex;
  gap: 1rem;
  margin-bottom: 1.125rem;
}
.paywall-icon {
  flex: 0 0 48px;
  width: 48px;
  height: 48px;
  border-radius: 50%;
  background: var(--primary-soft);
  display: flex;
  align-items: center;
  justify-content: center;
  border: 1px solid var(--primary-muted);
}
.paywall-icon .icon { color: var(--primary); font-size: var(--text-title); }
.paywall-title {
  font-size: 1.125rem;
  font-weight: 600;
  color: var(--text);
  letter-spacing: -0.01em;
  margin: 0 0 0.375rem;
  line-height: 1.25;
}
.paywall-body {
  font-size: 0.8125rem;
  color: var(--text-secondary);
  line-height: 1.5;
  margin: 0;
}
.paywall-detail {
  font-size: 0.75rem;
  color: var(--text-tertiary);
  font-family: var(--font-mono, monospace);
  margin: 0.5rem 0 0;
  padding: 0.375rem 0.625rem;
  background: var(--surface-2);
  border-radius: 6px;
  border-left: 2px solid var(--surface-3);
}
.paywall-actions {
  display: flex;
  flex-direction: column;
  gap: 0.5rem;
  margin-bottom: 0.75rem;
}
.paywall-btn {
  width: 100%;
  padding: 0.75rem 1rem;
  border-radius: 8px;
  font-size: 0.8125rem;
  font-weight: 600;
  cursor: pointer;
  font-family: inherit;
  letter-spacing: -0.005em;
  text-align: center;
  transition: background 0.12s ease, border-color 0.12s ease;
}
.paywall-btn-primary {
  background: var(--primary);
  color: var(--text-on-primary, #fff);
  border: 1px solid var(--primary);
  box-shadow: 0 0 16px rgba(var(--primary-rgb), 0.18);
}
.paywall-btn-primary:hover {
  background: var(--primary-hover);
  border-color: var(--primary-hover);
}
.paywall-btn-secondary {
  background: var(--surface-1);
  color: var(--text);
  border: 1px solid var(--surface-3);
}
.paywall-btn-secondary:hover {
  background: var(--surface-2);
  border-color: var(--text-tertiary);
}
.paywall-close {
  display: block;
  margin: 0 auto;
  padding: 0.375rem 0.75rem;
  background: transparent;
  border: 0;
  color: var(--text-tertiary);
  font-size: 0.75rem;
  font-family: var(--font-mono, monospace);
  letter-spacing: 0.06em;
  text-transform: uppercase;
  cursor: pointer;
}
.paywall-close:hover { color: var(--text-secondary); }

/* ─── Reformatter pre-submit preview modal ─── */
.rf-preview-card {
  max-width: 640px;
  width: 100%;
  padding: 1.375rem 1.5rem 1.125rem;
}
.rf-preview-head {
  display: flex;
  align-items: flex-start;
  justify-content: space-between;
  gap: 1.125rem;
  margin-bottom: 0.75rem;
}
.rf-preview-title {
  display: flex;
  align-items: center;
  gap: 0.625rem;
  font-size: 1rem;
  font-weight: 600;
  color: var(--text);
}
.rf-preview-cost {
  text-align: right;
  font-family: var(--font-mono, monospace);
}
.rf-preview-cost strong {
  font-size: 1.375rem;
  color: var(--primary);
  font-weight: 600;
}
.rf-preview-cost-sub {
  display: block;
  font-size: 0.75rem;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  color: var(--text-tertiary);
  margin-top: 0.125rem;
}
.rf-preview-banner {
  display: flex;
  align-items: center;
  gap: 0.625rem;
  padding: 0.625rem 0.875rem;
  border-radius: var(--radius-md);
  font-size: 0.8125rem;
  margin: 0 0 0.75rem;
}
.rf-preview-banner-warn {
  background: rgba(var(--warning-rgb), 0.08);
  border: 1px solid rgba(var(--warning-rgb), 0.28);
  color: var(--text);
}
.rf-preview-banner-warn .icon { color: var(--warning); flex-shrink: 0; }
.rf-preview-banner-ok {
  background: rgba(var(--success-rgb), 0.08);
  border: 1px solid rgba(var(--success-rgb), 0.28);
  color: var(--text);
}
.rf-preview-banner-ok .icon { color: var(--success); flex-shrink: 0; }
.rf-preview-list {
  max-height: 50vh;
  overflow-y: auto;
  border: 1px solid var(--surface-3);
  border-radius: var(--radius-md);
  padding: 0.375rem;
  margin-bottom: 0.75rem;
}
.rf-preview-row {
  display: flex;
  gap: 0.75rem;
  padding: 0.625rem;
  border-radius: var(--radius-sm, 4px);
}
.rf-preview-row + .rf-preview-row { border-top: 1px solid rgba(255, 255, 255, 0.04); }
.rf-preview-row-warn { background: rgba(var(--warning-rgb), 0.04); }
.rf-preview-num {
  flex: 0 0 28px;
  height: 28px;
  display: flex;
  align-items: center;
  justify-content: center;
  background: var(--surface-2);
  border-radius: 999px;
  font-family: var(--font-mono, monospace);
  font-size: 0.75rem;
  font-weight: 600;
  color: var(--text-secondary);
}
.rf-preview-body { flex: 1; min-width: 0; }
.rf-preview-text {
  font-size: 0.8125rem;
  color: var(--text);
  line-height: 1.4;
  overflow: hidden;
  text-overflow: ellipsis;
  display: -webkit-box;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
}
.rf-preview-meta {
  display: flex;
  align-items: center;
  gap: 0.5rem;
  flex-wrap: wrap;
  font-size: 0.75rem;
  color: var(--text-tertiary);
  margin-top: 0.375rem;
  font-family: var(--font-mono, monospace);
}
.rf-preview-chip {
  display: inline-flex;
  align-items: center;
  padding: 0.125rem 0.5rem;
  border-radius: 999px;
  font-size: 0.75rem;
  letter-spacing: 0.04em;
  text-transform: uppercase;
  background: rgba(var(--warning-rgb), 0.12);
  color: var(--warning);
  border: 1px solid rgba(var(--warning-rgb), 0.32);
  font-family: var(--font-main);
}
.rf-preview-footer {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 0.875rem;
  flex-wrap: wrap;
}
.rf-preview-mode {
  font-size: 0.75rem;
  color: var(--text-secondary);
}
.rf-preview-mode strong { color: var(--text); }
.rf-preview-actions {
  display: flex;
  gap: 0.5rem;
}
.rf-ambiguity-choice {
  margin-top: 0.625rem;
  padding: 0.625rem 0.75rem;
  background: rgba(var(--warning-rgb), 0.08);
  border: 1px solid rgba(var(--warning-rgb), 0.22);
  border-radius: var(--radius-md);
}
.rf-ambiguity-choice label {
  display: block;
  margin-bottom: 0.4375rem;
  color: var(--text);
  font-size: 0.875rem;
  line-height: 1.45;
}
.rf-decision { width: 100%; }
.stats-body {
  /* The card is now flex-column with overflow:hidden, so the body itself
     becomes the only scrollable region — its height is bounded by the
     remaining space after title, signoff, disclaimer, and actions. */
  flex: 1 1 auto;
  min-height: 0;
  overflow-y: auto;
  padding-right: 0.25rem;
}
.stats-body.app-modal-body { gap: 1.125rem; }
.stats-empty {
  font-size: 0.8125rem;
  color: var(--text-tertiary);
  text-align: center;
  padding: 1rem 0;
}
.stats-group { display: flex; flex-direction: column; gap: 0.375rem; }
.stats-group-label {
  font-family: var(--font-mono);
  font-size: 0.75rem;
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: 0.08em;
  color: var(--text-tertiary);
  margin-bottom: 0.125rem;
}
.stats-row {
  display: grid;
  grid-template-columns: minmax(110px, 1fr) 2fr auto;
  gap: 0.625rem;
  align-items: center;
  font-size: 0.75rem;
}
.stats-row-label {
  color: var(--text-secondary);
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
.stats-bar {
  background: rgba(255, 255, 255, 0.05);
  border-radius: 999px;
  height: 8px;
  overflow: hidden;
}
.stats-bar-fill {
  background: linear-gradient(90deg, var(--primary), var(--primary-hover));
  height: 100%;
  border-radius: 999px;
  transition: width 0.35s cubic-bezier(0.2, 0.8, 0.2, 1);
}
.stats-row-num {
  font-family: var(--font-mono);
  font-size: 0.75rem;
  color: var(--text);
  white-space: nowrap;
}

/* Hide everything else inside view-config while the gate is active. */
#view-config.welcome-active > :not(#welcomeGate) {
  display: none !important;
}

@keyframes welcome-fade-in {
  from { opacity: 0; transform: translateY(8px); }
  to   { opacity: 1; transform: translateY(0); }
}

/* Active-exam ribbon — tiny status above the form */
.active-exam-ribbon {
  display: inline-flex;
  align-items: center;
  gap: 0.5rem;
  padding: 0.5rem 0.875rem;
  margin: 0 0 1rem 0;
  background: rgba(var(--primary-rgb), 0.06);
  border: 0.5px solid rgba(var(--primary-rgb), 0.18);
  border-radius: 999px;
  font-size: 0.75rem;
  color: var(--text-secondary);
  font-family: var(--font-mono);
  letter-spacing: 0.02em;
}
.active-exam-ribbon strong {
  color: var(--text);
  font-weight: 600;
  font-family: var(--font-main);
  letter-spacing: 0;
}
.ribbon-change-btn {
  background: none;
  border: none;
  color: var(--primary);
  font-size: 0.75rem;
  font-family: var(--font-mono);
  text-transform: uppercase;
  letter-spacing: 0.06em;
  cursor: pointer;
  padding: 0 0 0 0.375rem;
  margin-left: 0.25rem;
  border-left: 1px solid rgba(var(--primary-rgb), 0.25);
}
.ribbon-change-btn:hover { color: var(--primary-hover); }

/* ─── Inbox button + badge in header ──────────────────────────────── */
.inbox-btn {
  position: relative;
  opacity: 0.85;
}
.inbox-btn:hover {
  opacity: 1;
}
.inbox-badge {
  position: absolute;
  top: -2px;
  right: -2px;
  min-width: 18px;
  height: 18px;
  padding: 0 0.3125rem;
  background: var(--primary);
  color: var(--text-on-primary);
  font-family: var(--font-mono);
  font-size: 0.75rem;
  font-weight: 600;
  line-height: 18px;
  text-align: center;
  border-radius: 9px;
  border: 1.5px solid var(--bg, #0a0e13);
  pointer-events: none;
}

/* ─── Inbox modal ─────────────────────────────────────────────────── */
.inbox-modal-overlay {
  position: fixed;
  inset: 0;
  background: rgba(0, 0, 0, 0.65);
  backdrop-filter: blur(var(--blur-sm));
  -webkit-backdrop-filter: blur(var(--blur-sm));
  z-index: var(--z-modal);
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 1.5rem;
}
.inbox-modal-overlay[hidden] { display: none; }
.inbox-modal-card {
  width: 100%;
  max-width: 720px;
  max-height: 86vh;
  display: flex;
  flex-direction: column;
  background: var(--surface-1, #222228);
  border: 1px solid rgba(255, 255, 255, 0.10);
  border-radius: var(--radius-lg);
  box-shadow: 0 24px 60px rgba(0, 0, 0, 0.6);
  overflow: hidden;
}
.inbox-modal-header {
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: 1.125rem 1.375rem 0.875rem;
  border-bottom: 1px solid rgba(255, 255, 255, 0.06);
}
.inbox-modal-title {
  display: flex;
  align-items: center;
  gap: 0.625rem;
  margin: 0;
  font-size: 1rem;
  font-weight: 600;
  color: var(--text);
  letter-spacing: -0.01em;
}
.inbox-modal-title .icon { font-size: var(--text-title-sm); color: var(--primary); }
.inbox-modal-close {
  background: none;
  border: none;
  color: var(--text-tertiary);
  cursor: pointer;
  padding: 0.375rem;
  border-radius: var(--radius-sm);
}
.inbox-modal-close:hover { color: var(--text); background: rgba(255, 255, 255, 0.06); }
.inbox-modal-body {
  padding: 0.875rem 1.375rem 1.375rem;
  overflow-y: auto;
  flex: 1;
}
.inbox-loading,
.inbox-empty {
  padding: 3rem 1rem;
  text-align: center;
  color: var(--text-tertiary);
  font-family: var(--font-main);
  font-size: 0.8125rem;
}
.inbox-empty .icon {
  display: block;
  margin: 0 auto 0.75rem;
  font-size: 2.25rem;
  color: var(--surface-3);
}
.inbox-empty-hint {
  font-size: 0.75rem;
  color: var(--text-tertiary);
  margin-top: 0.375rem;
}
.inbox-list {
  display: flex;
  flex-direction: column;
  gap: 0.375rem;
}
/* Each row is a flex container holding the main item-button and a separate
   delete-button so the delete icon doesn't trigger the row's open-detail click. */
.inbox-item-row {
  display: flex;
  align-items: stretch;
  gap: 0.375rem;
  background: rgba(255, 255, 255, 0.02);
  border: 0.5px solid rgba(255, 255, 255, 0.06);
  border-radius: var(--radius-md);
  transition: background 120ms ease, border-color 120ms ease, transform 100ms ease;
}
.inbox-item-row:hover {
  background: rgba(255, 255, 255, 0.05);
  border-color: rgba(255, 255, 255, 0.14);
  transform: translateX(2px);
}
.inbox-item-row.inbox-item-unread {
  background: rgba(var(--primary-rgb), 0.04);
  border-color: rgba(var(--primary-rgb), 0.18);
}
.inbox-item {
  position: relative;
  display: flex;
  align-items: center;
  gap: 0.625rem;
  flex: 1;
  min-width: 0;
  padding: 0.75rem 0.875rem;
  background: transparent;
  border: 0;
  cursor: pointer;
  text-align: left;
  font-family: var(--font-main);
  color: var(--text-secondary);
}
.inbox-item-delete {
  flex-shrink: 0;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 38px;
  background: transparent;
  border: 0;
  border-left: 1px solid rgba(255, 255, 255, 0.05);
  color: var(--text-tertiary);
  cursor: pointer;
  transition: color 120ms ease, background 120ms ease;
}
.inbox-item-delete:hover {
  color: var(--error, #f4718a);
  background: rgba(var(--error-rgb), 0.08);
}
.inbox-item-delete .icon { font-size: var(--text-body-lg); }
.inbox-unread-dot {
  flex-shrink: 0;
  width: 8px;
  height: 8px;
  border-radius: 50%;
  background: var(--primary);
  box-shadow: 0 0 6px rgba(var(--primary-rgb), 0.4);
}
.inbox-item-main { flex: 1; min-width: 0; }
.inbox-item-title {
  font-size: 0.8125rem;
  font-weight: 600;
  color: var(--text);
  margin-bottom: 0.25rem;
}
.inbox-item-meta {
  display: flex;
  align-items: center;
  gap: 0.625rem;
  font-size: 0.75rem;
  color: var(--text-tertiary);
  flex-wrap: wrap;
}
.inbox-format-pill {
  font-family: var(--font-mono);
  font-size: 0.75rem;
  font-weight: 600;
  padding: 0.125rem 0.375rem;
  border-radius: var(--radius-sm);
  background: rgba(var(--info-rgb), 0.10);
  color: var(--cyan);
  letter-spacing: 0.04em;
  text-transform: uppercase;
}
.inbox-item-actor {
  font-style: italic;
}
.inbox-hint {
  display: flex;
  align-items: flex-start;
  gap: 0.5rem;
  margin-top: 0.875rem;
  padding: 0.625rem 0.75rem;
  background: rgba(var(--info-rgb), 0.05);
  border-left: 2px solid var(--cyan);
  border-radius: var(--radius-sm);
  font-size: 0.75rem;
  color: var(--text-secondary);
  line-height: 1.5;
}
.inbox-hint .icon { font-size: var(--text-body-sm); color: var(--cyan); flex-shrink: 0; margin-top: 0.0625rem; }

/* ─── Report detail (inside inbox modal) ──────────────────────────── */
.rep-header {
  margin-bottom: 1.125rem;
}
.rep-back {
  background: none;
  border: none;
  color: var(--text-tertiary);
  font-family: var(--font-main);
  font-size: 0.75rem;
  display: inline-flex;
  align-items: center;
  gap: 0.25rem;
  cursor: pointer;
  padding: 0.25rem 0.5rem 0.25rem 0;
  margin-bottom: 0.5rem;
  border-radius: var(--radius-sm);
}
.rep-back:hover { color: var(--text); }
.rep-back .icon { font-size: var(--text-body-sm); }
.rep-title {
  margin: 0 0 0.375rem 0;
  font-size: 1.125rem;
  font-weight: 600;
  color: var(--text);
}
.rep-subtitle {
  display: flex;
  gap: 0.625rem;
  align-items: center;
  font-size: 0.75rem;
  color: var(--text-tertiary);
  flex-wrap: wrap;
}
.rep-signoff {
  background: rgba(var(--success-rgb), 0.05);
  border: 0.5px solid rgba(var(--success-rgb), 0.18);
  border-radius: var(--radius-md);
  padding: 0.875rem 1rem;
  margin-bottom: 1.125rem;
}
.rep-signoff-title {
  display: flex;
  align-items: center;
  gap: 0.5rem;
  font-size: 0.8125rem;
  font-weight: 600;
  color: var(--success);
  margin-bottom: 0.5rem;
}
.rep-signoff-title .icon { font-size: var(--text-body-lg); }
.rep-signoff-title strong { color: var(--text); font-weight: 600; }
.rep-signoff-text {
  font-size: 0.75rem;
  color: var(--text-secondary);
  line-height: 1.55;
  margin-bottom: 0.5rem;
}
.rep-disclaimer {
  display: flex;
  align-items: flex-start;
  gap: 0.375rem;
  font-size: 0.75rem;
  color: var(--warning, #e6a23c);
  font-style: italic;
  padding-top: 0.5rem;
  border-top: 0.5px solid rgba(var(--success-rgb), 0.10);
}
.rep-disclaimer .icon { font-size: var(--text-label); flex-shrink: 0; margin-top: 0.0625rem; }

.rep-distributions {
  display: flex;
  flex-direction: column;
  gap: 1.125rem;
}
.rep-group {
  background: rgba(255, 255, 255, 0.02);
  border-radius: var(--radius-md);
  padding: 0.75rem 0.875rem;
}
.rep-group-title {
  font-family: var(--font-mono);
  font-size: 0.75rem;
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: 0.10em;
  color: var(--text-tertiary);
  margin-bottom: 0.625rem;
}
.rep-group-rows {
  display: flex;
  flex-direction: column;
  gap: 0.375rem;
}
.rep-row {
  display: grid;
  grid-template-columns: minmax(0, 1fr) minmax(80px, 30%) minmax(70px, auto);
  gap: 0.625rem;
  align-items: center;
  font-size: 0.75rem;
  color: var(--text);
}
.rep-row-label {
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
.rep-row-bar {
  height: 6px;
  background: rgba(255, 255, 255, 0.05);
  border-radius: 3px;
  overflow: hidden;
}
.rep-row-fill {
  height: 100%;
  background: linear-gradient(90deg, var(--cyan), var(--primary));
  border-radius: 3px;
}
.rep-row-count {
  text-align: right;
  font-family: var(--font-mono);
  font-size: 0.75rem;
  color: var(--text-secondary);
}
.rep-row-pct {
  color: var(--text-tertiary);
  font-size: 0.75rem;
}

/* ─── Admin: user details modal ───────────────────────────────────────
   Two-column key/value rows grouped by section. Sits in the same
   .app-modal-card-wide shell as the export-confirm and curriculum modals
   so it inherits the loosened padding / max-width. */
.user-details-card { max-height: 88vh; display: flex; flex-direction: column; }
.user-details-email {
  font-family: var(--font-mono);
  font-size: 0.75rem;
  color: var(--text-tertiary);
  margin-top: 0.125rem;
}
.user-details-body {
  flex: 1;
  overflow-y: auto;
  padding-right: 0.375rem;
  display: flex;
  flex-direction: column;
  gap: 1.125rem;
  margin-top: 0.25rem;
}
.user-details-section {
  display: flex;
  flex-direction: column;
  gap: 0.25rem;
}
.user-details-section-name {
  font-family: var(--font-mono);
  font-size: 0.75rem;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--text-secondary);
  margin-bottom: 0.25rem;
  padding-bottom: 0.25rem;
  border-bottom: 0.5px solid rgba(255,255,255,0.08);
}
.user-details-row {
  display: grid;
  grid-template-columns: 220px 1fr;
  gap: 0.75rem;
  padding: 0.3125rem 0.25rem;
  font-size: 0.8125rem;
}
.user-details-row-key {
  color: var(--text-tertiary);
}
.user-details-row-val {
  color: var(--text);
  word-break: break-word;
}
@media (max-width: 700px) {
  .user-details-row { grid-template-columns: 1fr; gap: 0.125rem; }
  .user-details-row-key { font-size: var(--text-sm); }
}

/* ─── Export sign-off block (above the AI disclaimer in the export modal) ─ */
/* ─── Export version picker (A/B/C booklets) ─── */
.export-versions {
  margin-top: 1rem;
  padding: 0.75rem 0.875rem;
  background: var(--surface-2);
  border: 1px solid var(--surface-3);
  border-radius: var(--radius-md);
}
.export-versions-label {
  font-size: 0.78125rem;
  font-weight: 600;
  color: var(--text);
  margin-bottom: 0.625rem;
}
.export-versions-hint {
  display: block;
  font-size: 0.6875rem;
  font-weight: 400;
  color: var(--text-tertiary);
  margin-top: 0.125rem;
}
.export-ver-pills {
  display: flex;
  gap: 0.5rem;
  flex-wrap: wrap;
}
.export-ver-pill {
  flex: 1;
  min-width: 88px;
  padding: 0.5rem 0.625rem;
  font-size: 0.78125rem;
  font-weight: 500;
  color: var(--text-secondary);
  background: var(--surface-1);
  border: 1px solid var(--surface-3);
  border-radius: var(--radius-sm);
  cursor: pointer;
  transition: border-color .12s, color .12s, background .12s;
}
.export-ver-pill:hover { color: var(--text); border-color: var(--surface-4); }
.export-ver-active {
  color: var(--primary);
  border-color: var(--primary);
  background: color-mix(in srgb, var(--primary) 12%, var(--surface-1));
}

.export-signoff {
  margin-top: 1.25rem;
  padding: 1.125rem 1.25rem;
  background: rgba(var(--success-rgb), 0.05);
  border: 1px solid rgba(var(--success-rgb), 0.18);
  border-radius: var(--radius-md);
  color: var(--text-secondary);
  font-family: var(--font-main);
  line-height: 1.55;
  /* Inside the new flex-column .app-modal-card layout, this is a fixed-size
     row below the scrollable stats-body. Without flex-shrink:0 a tall
     distribution would compress this block and the user's name would render
     "scrunched". */
  flex-shrink: 0;
}
.export-signoff-head {
  display: flex;
  align-items: center;
  gap: 0.5rem;
  font-family: var(--font-mono);
  font-size: 0.75rem;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--success, #42d392);
}
.export-signoff-head .icon {
  font-size: 1rem;
  color: var(--success, #42d392);
}
.export-signoff-eyebrow {
  /* Spacing-only span; styling inherited from .export-signoff-head. */
}
.export-signoff-name {
  margin-top: 0.5rem;
  font-size: 1rem;
  font-weight: 600;
  color: var(--text);
  font-family: var(--font-display, var(--font-main));
  letter-spacing: -0.005em;
}
.export-signoff-body {
  margin: 0.75rem 0 0 0;
  font-size: 0.8125rem;
  line-height: 1.6;
  color: var(--text-secondary);
}
.export-signoff-lastname {
  font-weight: 600;
  color: var(--text);
  white-space: nowrap;
}

/* The export-confirm modal stacks four blocks (chart + signoff + AI
   disclaimer + actions) in a tall card. Default modal padding/margins are
   tuned for short prompts, so we relax them only on the wide variant.
   The actions row is pinned to the bottom of the flex column so the
   confirm/cancel buttons stay visible regardless of distribution length. */
.app-modal-card-wide { padding: 1.625rem var(--space-7) var(--space-6); }
.app-modal-card-wide .ai-disclaimer { margin: var(--space-4) 0 0 0; flex-shrink: 0; }
.app-modal-card-wide .app-modal-actions { margin-top: var(--space-5); flex-shrink: 0; }
.app-modal-card-wide .app-modal-head { flex-shrink: 0; }
.app-modal-card-wide > .app-modal-message { flex-shrink: 0; }

/* ─── AI disclaimer banner (across the platform) ──────────────────── */
.ai-disclaimer {
  display: flex;
  align-items: flex-start;
  gap: 0.5rem;
  padding: 0.5rem 0.875rem;
  background: rgba(var(--warning-rgb), 0.06);
  border-left: 2px solid var(--warning, #e6a23c);
  border-radius: var(--radius-sm);
  font-size: 0.75rem;
  color: var(--text-secondary);
  font-style: italic;
  line-height: 1.45;
  margin: 0.75rem 0;
}
.ai-disclaimer .icon {
  font-size: 0.875rem;
  color: var(--warning, #e6a23c);
  flex-shrink: 0;
  margin-top: 0.0625rem;
}

@media (max-width: 480px) {
  .inbox-modal-card { max-width: calc(100vw - 16px); max-height: 92vh; }
  .inbox-modal-header { padding: 0.875rem var(--space-4) var(--space-3); }
  .inbox-modal-body { padding: var(--space-3) var(--space-4) var(--space-4); }
  .rep-row { grid-template-columns: 1fr auto; }
  .rep-row-bar { grid-column: 1 / -1; }
}


/* ─── Active-exam header badge (next to Exportar DOCX / ZipGrade CSV) ───
   Mirrors the in-page #activeExamRibbon with a smaller chip suited to
   the header's compact density. Driven by `thomas:exam-changed` events
   so it stays in sync with any place that switches exams. */
.active-exam-badge {
  display: inline-flex;
  align-items: center;
  gap: 0.375rem;
  max-width: 220px;
  padding: 0.375rem 0.625rem;
  background: rgba(var(--primary-rgb), 0.08);
  border: 0.5px solid rgba(var(--primary-rgb), 0.25);
  border-radius: var(--radius-md);
  color: var(--text);
  font-family: var(--font-main);
  font-size: 0.75rem;
  line-height: 1.2;
  box-shadow: inset 0 0 0 1px rgba(var(--primary-rgb), 0.04);
  cursor: pointer;
  transition: border-color 160ms ease, background 160ms ease, transform 160ms ease;
}
.active-exam-badge:hover { border-color: rgba(var(--primary-rgb), 0.52); }
.active-exam-badge:active { transform: scale(0.98); }
.active-exam-badge[hidden] {
  display: none;
}
.active-exam-badge .icon {
  font-size: 0.875rem;
  color: var(--primary);
  flex-shrink: 0;
}
.active-exam-badge-name {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  font-weight: 600;
  letter-spacing: -0.005em;
}
.active-exam-badge-chevron { transition: transform 160ms ease; }
.active-exam-badge[aria-expanded="true"] .active-exam-badge-chevron { transform: rotate(180deg); }
@media (max-width: 480px) {
  .active-exam-badge {
    max-width: 140px;
    padding: 0.3125rem 0.5rem;
    font-size: 0.75rem;
  }
  .active-exam-badge .icon { font-size: var(--text-sm); }
}

/* Shared exam switcher */
.exam-switcher-layer {
  position: fixed;
  inset: 0;
  z-index: var(--z-modal);
  background: rgba(8, 15, 25, 0.12);
}
.exam-switcher-popover {
  position: fixed;
  top: var(--exam-switcher-top, 72px);
  left: var(--exam-switcher-left, 12px);
  width: min(420px, calc(100vw - 24px));
  max-height: min(680px, calc(100vh - var(--exam-switcher-top, 72px) - 16px));
  overflow: auto;
  padding: 0.875rem;
  color: var(--text);
  background: color-mix(in srgb, var(--surface) 88%, transparent);
  border: 1px solid color-mix(in srgb, var(--text) 14%, transparent);
  border-radius: 22px;
  box-shadow: 0 24px 70px rgba(8, 15, 25, 0.24), inset 0 1px rgba(255,255,255,0.5);
  backdrop-filter: saturate(180%) blur(var(--blur-lg));
  -webkit-backdrop-filter: saturate(180%) blur(var(--blur-lg));
  animation: exam-switcher-in 180ms cubic-bezier(.2,.8,.2,1);
}
@keyframes exam-switcher-in {
  from { opacity: 0; transform: translateY(-8px) scale(.98); }
  to { opacity: 1; transform: none; }
}
.exam-switcher-loading { padding: var(--space-7); text-align: center; color: var(--text-secondary); }
.exam-switcher-head,
.exam-switcher-limit,
.exam-switcher-footer,
.exam-switcher-archived-row,
.exam-selector-summary,
.bank-bulk-bar,
.bank-bulk-actions {
  display: flex;
  align-items: center;
}
.exam-switcher-head { justify-content: space-between; gap: var(--space-3); padding: 0.125rem 0.125rem 0.625rem; }
.exam-switcher-head h2 { margin: 0.125rem 0 0; font-size: var(--text-title-sm); letter-spacing: -0.025em; }
.exam-switcher-eyebrow,
.exam-selector-summary-label {
  display: block;
  color: var(--text-secondary);
  font-size: 0.6875rem;
  font-weight: 650;
  letter-spacing: .05em;
  text-transform: uppercase;
}
.exam-switcher-limit { gap: 0.625rem; padding: var(--space-2) var(--space-1) var(--space-3); color: var(--text-secondary); font-size: var(--text-sm); }
.exam-switcher-limit-track { flex: 1; height: 4px; overflow: hidden; background: var(--surface-3); border-radius: 999px; }
.exam-switcher-limit-track i { display: block; height: 100%; background: var(--primary); border-radius: inherit; transition: width 180ms ease; }
.exam-switcher-limit.is-full .exam-switcher-limit-track i { background: var(--warning); }
.exam-switcher-list { display: grid; gap: 0.3125rem; }
.exam-switcher-item {
  display: grid;
  grid-template-columns: 28px minmax(0, 1fr);
  gap: 0.5625rem;
  width: 100%;
  padding: 0.625rem;
  color: var(--text);
  text-align: left;
  background: transparent;
  border: 1px solid transparent;
  border-radius: 13px;
  cursor: pointer;
}
.exam-switcher-item:hover,
.exam-switcher-item:focus-visible { background: var(--surface-2); border-color: var(--border); outline: none; }
.exam-switcher-item.is-current { background: var(--primary-soft); border-color: rgba(var(--primary-rgb), .3); }
.exam-switcher-item-icon { color: var(--primary); padding-top: 0.0625rem; }
.exam-switcher-item-copy { min-width: 0; display: grid; gap: 0.1875rem; }
.exam-switcher-item-copy strong { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: var(--text-body-sm); }
.exam-switcher-item-copy small,
.exam-switcher-archived-row small { display: block; color: var(--text-secondary); font-size: var(--text-xs); }
.exam-switcher-empty { display: grid; justify-items: center; gap: 0.3125rem; padding: 1.375rem var(--space-3); color: var(--text-secondary); text-align: center; }
.exam-switcher-empty .icon { color: var(--primary); font-size: 1.75rem; }
.exam-switcher-empty strong { color: var(--text); }
.exam-switcher-create-trigger {
  display: flex;
  align-items: center;
  gap: 0.5rem;
  width: 100%;
  margin-top: 0.4375rem;
  padding: 0.625rem;
  color: var(--primary);
  font: inherit;
  font-weight: 650;
  text-align: left;
  background: transparent;
  border: 1px dashed rgba(var(--primary-rgb), .34);
  border-radius: 13px;
  cursor: pointer;
}
.exam-switcher-create-trigger:hover { background: var(--primary-soft); }
.exam-switcher-create-trigger:disabled { color: var(--text-tertiary); border-color: var(--border); cursor: not-allowed; }
.exam-switcher-create-form { margin-top: var(--space-2); padding: 0.6875rem; background: var(--surface-2); border-radius: 13px; }
.exam-switcher-create-form[hidden] { display: none; }
.exam-switcher-create-form label { display: block; margin-bottom: 0.4375rem; color: var(--text-secondary); font-size: var(--text-sm); }
.exam-switcher-create-form > div { display: flex; gap: 0.4375rem; }
.exam-switcher-create-form input { min-width: 0; flex: 1; }
.exam-switcher-full-note { margin-top: var(--space-2); padding: 0.5625rem 0.625rem; color: var(--text-secondary); background: var(--warning-soft); border-radius: 11px; font-size: var(--text-sm); line-height: 1.45; }
.exam-switcher-full-note button { padding: 0; color: var(--text); font: inherit; font-weight: 650; text-decoration: underline; background: none; border: 0; cursor: pointer; }
.exam-switcher-archived { margin-top: 0.5625rem; border-top: 1px solid var(--border); }
.exam-switcher-archived summary { padding: 0.6875rem var(--space-1); color: var(--text-secondary); font-size: var(--text-sm); font-weight: 650; cursor: pointer; }
.exam-switcher-archived summary span { margin-left: var(--space-1); color: var(--text-tertiary); }
.exam-switcher-archived-list { display: grid; gap: 0.3125rem; }
.exam-switcher-archived-row { justify-content: space-between; gap: 0.625rem; padding: var(--space-2) 0.375rem var(--space-2) 0.625rem; background: var(--surface-2); border-radius: 11px; }
.exam-switcher-archived-row > span { min-width: 0; }
.exam-switcher-archived-row strong { display: block; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: var(--text-sm); }
.exam-switcher-restore { flex: 0 0 auto; padding: 0.3125rem 0.5625rem; font-size: var(--text-xs); }
.exam-switcher-footer { gap: 0.375rem; margin: 0.6875rem -0.1875rem -0.1875rem; padding: 0.6875rem 0.1875rem 0.1875rem; border-top: 1px solid var(--border); }
.exam-switcher-footer .btn { flex: 1; min-width: 0; padding: 0.4375rem var(--space-2); font-size: var(--text-xs); }
.exam-switcher-footer .exam-switcher-bank { flex: 1.35; }

.exam-selector-summary { justify-content: space-between; gap: var(--space-3); flex-wrap: wrap; margin-bottom: 0.875rem; padding: var(--space-3); background: var(--surface-2); border: 1px solid var(--border); border-radius: var(--radius-md); }
.exam-selector-summary-copy { min-width: 0; display: grid; gap: 0.1875rem; }
.exam-selector-summary-copy strong { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }

.bank-bulk-bar {
  position: sticky;
  top: 134px;
  z-index: 120;
  justify-content: space-between;
  gap: 0.75rem;
  margin: 0.625rem 0;
  padding: 0.625rem 0.75rem;
  color: var(--text);
  background: color-mix(in srgb, var(--surface) 88%, transparent);
  /* Translucent chrome needs the blur. At 88% opacity with no backdrop-filter,
     content scrolling underneath stayed legible through the bar and smeared as
     it moved. The blur turns it into a material instead of a haze. */
  backdrop-filter: saturate(180%) blur(20px);
  -webkit-backdrop-filter: saturate(180%) blur(20px);
  border: 1px solid rgba(var(--primary-rgb), .35);
  border-radius: var(--radius-md);
  box-shadow: var(--shadow-sm);
  backdrop-filter: blur(var(--blur-md));
  -webkit-backdrop-filter: blur(var(--blur-md));
}
.bank-bulk-bar[hidden] { display: none; }
.bank-bulk-actions { gap: 0.4375rem; }
.bank-card-selector { display: inline-flex; align-items: center; gap: 0.4375rem; color: var(--text-secondary); font-size: var(--text-sm); cursor: pointer; }
.bank-select-checkbox { width: 18px; height: 18px; accent-color: var(--primary); }
.bank-membership-chip { background: var(--primary-soft); color: var(--primary); border-color: rgba(var(--primary-rgb), .3); }

@media (max-width: 600px) {
  .exam-switcher-layer { background: rgba(8, 15, 25, .28); }
  .exam-switcher-popover {
    top: auto;
    left: 8px;
    right: 8px;
    bottom: calc(8px + env(safe-area-inset-bottom));
    width: auto;
    max-height: min(82vh, 680px);
    border-radius: 24px;
    animation-name: exam-switcher-sheet-in;
  }
  @keyframes exam-switcher-sheet-in {
    from { opacity: 0; transform: translateY(22px) scale(.98); }
    to { opacity: 1; transform: none; }
  }
  .exam-switcher-footer { flex-wrap: wrap; }
  .exam-switcher-footer .exam-switcher-bank { flex-basis: 100%; }
  .bank-bulk-bar { top: 116px; align-items: flex-start; }
  .bank-bulk-actions { flex-wrap: wrap; justify-content: flex-end; }
}

@media (prefers-reduced-motion: reduce) {
  .exam-switcher-popover { animation: none; }
}

/* ─── Locked select (single-specialty courses like Semiología) ───
   When a course defines exactly one specialty, the dropdown is set to
   that value and disabled — clearer signal than just `disabled` styling
   alone, which on dark themes can read as "broken". */
.neu-select.is-locked,
.neu-select:disabled {
  opacity: 0.6;
  cursor: not-allowed;
  background-color: var(--surface-lowest);
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24'%3E%3Cpath fill='%2393a1ae' d='M12 17a2 2 0 1 0 0-4 2 2 0 0 0 0 4zm6-9h-1V6a5 5 0 0 0-10 0v2H6a2 2 0 0 0-2 2v10a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2zM9 6a3 3 0 1 1 6 0v2H9V6zm9 14H6V10h12v10z'/%3E%3C/svg%3E");
  background-repeat: no-repeat;
  background-position: right 12px center;
  background-size: 12px 12px;
  color: var(--text-tertiary);
  border-color: rgba(255, 255, 255, 0.04);
}
.neu-select.is-locked:hover,
.neu-select:disabled:hover {
  border-color: rgba(255, 255, 255, 0.04);
  background-color: var(--surface-lowest);
}

/* Boot-time skeleton for selects awaiting server data ("Cargando cursos…").
   Overrides the :disabled lock icon with a soft shimmer so it reads as
   "loading", not "locked". Cleared by JS once the data arrives. */
.neu-select.is-loading {
  background-image: linear-gradient(
    100deg,
    transparent 30%,
    rgba(255, 255, 255, 0.06) 50%,
    transparent 70%
  );
  background-size: 200% 100%;
  background-repeat: repeat;
  background-position: 0 0;
  animation: select-shimmer 1.4s linear infinite;
  cursor: progress;
}
@keyframes select-shimmer {
  to { background-position: -200% 0; }
}

/* ─── Team monthly report (admin tab) ─────────────────────────────────
   Stat-card grid + month-by-month table for the accumulated rollup.
   Surface re-uses .config-surface so it inherits the page chrome. */
.team-stat-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
  gap: 0.625rem;
  margin-bottom: 1.375rem;
}
.team-stat-card {
  display: flex;
  align-items: center;
  gap: 0.625rem;
  padding: 0.75rem 0.875rem;
  background: rgba(255, 255, 255, 0.02);
  border: 1px solid rgba(255, 255, 255, 0.06);
  border-radius: var(--radius-md);
}
.team-stat-icon {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 32px;
  height: 32px;
  border-radius: 8px;
  background: rgba(var(--primary-rgb), 0.10);
  color: var(--primary);
  flex-shrink: 0;
}
.team-stat-icon .icon { font-size: var(--text-body-lg); }
.team-stat-body { min-width: 0; }
.team-stat-value {
  font-size: 1.125rem;
  font-weight: 600;
  color: var(--text);
  line-height: 1.2;
  letter-spacing: -0.01em;
}
.team-stat-label {
  font-size: 0.75rem;
  color: var(--text-tertiary);
  text-transform: uppercase;
  letter-spacing: 0.06em;
  margin-top: 0.125rem;
  font-family: var(--font-mono);
}
.team-month-table {
  width: 100%;
  border-collapse: collapse;
  font-size: 0.75rem;
}
.team-month-table th,
.team-month-table td {
  padding: 0.625rem 0.5rem;
  text-align: left;
  border-bottom: 1px solid rgba(255, 255, 255, 0.06);
}
.team-month-table th {
  font-family: var(--font-mono);
  font-size: 0.75rem;
  text-transform: uppercase;
  letter-spacing: 0.06em;
  color: var(--text-tertiary);
  border-bottom: 2px solid rgba(255, 255, 255, 0.10);
}
.team-month-table td {
  color: var(--text-secondary);
}
.team-month-table td:first-child {
  font-weight: 600;
  color: var(--text);
}
.team-bar {
  display: inline-block;
  width: 90px;
  height: 6px;
  background: rgba(255, 255, 255, 0.06);
  border-radius: 3px;
  overflow: hidden;
  vertical-align: middle;
  margin-right: 0.5rem;
}
.team-bar-fill {
  height: 100%;
  background: var(--primary);
  border-radius: 3px;
  transition: width 320ms cubic-bezier(0.2, 0.8, 0.2, 1);
}
.team-bar-num {
  font-family: var(--font-mono);
  font-size: 0.75rem;
  color: var(--text);
}

/* ═══════════════════════════════════════════════
   Workflow picker — top-of-workspace mode toggle
   between "Generar preguntas" and "Optimizar
   preguntas preexistentes". Mirrored on both views
   so flipping back from the optimizer is instant.
   ═══════════════════════════════════════════════ */
.workflow-picker {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 0.75rem;
  margin-bottom: 1rem;
}
.workflow-card {
  display: flex;
  align-items: center;
  gap: 0.875rem;
  padding: 1rem 1.125rem;
  border-radius: var(--radius-lg, 12px);
  border: 1px solid var(--surface-3);
  background: var(--surface-1);
  color: var(--text);
  cursor: pointer;
  text-align: left;
  font-family: inherit;
  transition: border-color 0.15s ease, background 0.15s ease, transform 0.1s ease;
}
.workflow-card:hover {
  border-color: rgba(var(--primary-rgb), 0.4);
  background: var(--surface-2);
}
.workflow-card:active {
  transform: translateY(1px);
}
.workflow-card.workflow-active {
  border-color: var(--primary);
  background: linear-gradient(135deg, rgba(var(--primary-rgb), 0.10), rgba(var(--primary-rgb), 0.04));
}
.workflow-card.workflow-active::before {
  content: "";
  width: 3px;
  align-self: stretch;
  background: var(--primary);
  border-radius: 2px;
  margin-right: 0.375rem;
}
.workflow-icon {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 40px;
  height: 40px;
  border-radius: var(--radius-md, 8px);
  background: var(--surface-2);
  flex-shrink: 0;
}
.workflow-active .workflow-icon {
  background: rgba(var(--primary-rgb), 0.18);
}
.workflow-icon .icon {
  font-size: 1.375rem;
  color: var(--primary);
}
.workflow-text {
  display: flex;
  flex-direction: column;
  gap: 0.25rem;
  min-width: 0;
}
.workflow-text strong {
  font-size: 0.875rem;
  font-weight: 600;
  color: var(--text);
  letter-spacing: 0.01em;
}
.workflow-subtitle {
  font-size: 0.75rem;
  color: var(--text-secondary);
  line-height: 1.4;
}
@media (max-width: 720px) {
  .workflow-picker { grid-template-columns: 1fr; }
}

/* Tab badge — number bubble surfaced next to a tab label when the
   user has unread completions waiting (e.g. reformatter batches). */
.tab-badge {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  background: var(--primary);
  color: var(--text-on-primary);
  border-radius: 999px;
  padding: 0 0.375rem;
  height: 16px;
  min-width: 16px;
  font-size: 0.75rem;
  font-weight: 600;
  line-height: 1;
  margin-left: 0.375rem;
  letter-spacing: 0;
  box-shadow: 0 0 0 2px var(--surface-1);
}
.tab-badge[hidden] { display: none; }

/* Reformatter progress bar — surfaces both the indeterminate "still
   processing" state (animated stripe) and the completion ratio. */
.rf-progress-wrap {
  position: relative;
  height: 6px;
  background: var(--surface-2);
  border-radius: 3px;
  margin-top: 0.75rem;
  overflow: hidden;
}
.rf-progress-bar {
  position: absolute;
  inset: 0 auto 0 0;
  background: var(--primary);
  border-radius: 3px;
  transition: width 0.3s ease;
}
.rf-progress-bar.rf-indeterminate {
  width: 30% !important;
  animation: rf-indeterminate 1.6s infinite cubic-bezier(0.4, 0, 0.2, 1);
}
@keyframes rf-indeterminate {
  0%   { transform: translateX(-100%); }
  100% { transform: translateX(400%); }
}


/* === ADMIN TEAM PANEL v2 (member cards + team meters) === */
.adm-team-head { display: flex; flex-wrap: wrap; gap: var(--space-5); align-items: flex-start; justify-content: space-between; margin-bottom: var(--space-4); }
.adm-team-name { font-size: var(--text-title-sm); font-weight: 800; letter-spacing: -0.02em; }
.adm-team-sub { display: flex; align-items: center; gap: 0.625rem; margin-top: 0.375rem; flex-wrap: wrap; }
.adm-team-note { font-size: var(--text-xs); color: var(--text-tertiary); font-family: var(--font-mono); }
.adm-team-meters { display: flex; flex-direction: column; gap: var(--space-3); min-width: 280px; flex: 1; max-width: 420px; }
.adm-meter-label { display: flex; justify-content: space-between; font-size: var(--text-xs); font-family: var(--font-mono); color: var(--text-secondary); margin-bottom: 0.3125rem; }
.adm-meter-hint { font-size: var(--text-2xs); color: var(--text-tertiary); margin-top: var(--space-1); }
.adm-bar { height: 8px; border-radius: 999px; background: var(--surface-4, #2b2b31); overflow: hidden; }
.adm-bar-fill { height: 100%; border-radius: 999px; transition: width 0.4s ease; }
.adm-members-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(330px, 1fr)); gap: 0.875rem; }
.adm-member-card { background: var(--surface-2, #1c1c21); border: 1px solid var(--surface-4, #2b2b31); border-radius: var(--radius-lg, 12px); padding: var(--space-4); display: flex; flex-direction: column; gap: 0.625rem; }
.adm-member-top { display: flex; gap: 0.625rem; align-items: center; }
.adm-avatar { width: 38px; height: 38px; border-radius: 50%; display: flex; align-items: center; justify-content: center; font-weight: 800; font-family: var(--font-mono); font-size: var(--text-sm); background: var(--primary-soft); color: var(--primary); flex: none; }
.adm-member-name { font-weight: 700; font-size: var(--text-body-sm); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.adm-member-email { font-family: var(--font-mono); font-size: 0.65625rem; color: var(--text-tertiary); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.adm-member-chips { display: flex; gap: 0.375rem; flex-wrap: wrap; }
.adm-member-stats { display: flex; gap: 0.875rem; font-size: var(--text-xs); color: var(--text-secondary); flex-wrap: wrap; }
.adm-member-controls { display: flex; gap: 0.375rem; margin-top: auto; border-top: 1px solid var(--surface-4, #2b2b31); padding-top: 0.625rem; }
.adm-pw-box { font-family: var(--font-mono); font-size: 1.0625rem; letter-spacing: 0.06em; background: var(--surface-1); border: 1px dashed var(--primary); border-radius: 8px; padding: 0.875rem var(--space-4); text-align: center; user-select: all; }
@media (max-width: 640px) { .adm-team-meters { max-width: none; } .adm-members-grid { grid-template-columns: 1fr; } }

/* July 2026 safety and readability pass. Placeholder text stays above the
   WCAG AA 4.5:1 threshold by using the full tertiary-text color, without
   the opacity reduction that previously lowered contrast. */
.neu-input::placeholder,
.neu-textarea::placeholder,
.welcome-input::placeholder {
  color: var(--text-tertiary);
  opacity: 1;
}

.generation-limit-notice {
  display: flex;
  align-items: center;
  gap: 0.75rem;
  margin-bottom: 0.625rem;
  padding: 0.75rem 0.875rem;
  border: 1px solid rgba(var(--warning-rgb), 0.32);
  border-radius: var(--radius-md);
  background: rgba(var(--warning-rgb), 0.09);
  color: var(--text);
  font-size: 0.875rem;
  line-height: 1.5;
}
.generation-limit-notice[hidden] { display: none !important; }
.generation-limit-notice > .icon { color: var(--warning); flex: 0 0 auto; }
.generation-limit-notice > span:nth-child(2) { flex: 1 1 260px; }
.generation-limit-notice .btn { flex: 0 0 auto; }

/* Optimizer composer. The previous version relied on nested inline flex
   declarations, which let the long upload instruction compete with the
   upload control and textarea at intermediate widths. Named layout regions
   keep every control in normal flow and give wrapping content a real min
   width of zero. */
#reformatterContent {
  min-width: 0;
}

#reformatterContent .rf-overview-card,
#reformatterContent .rf-compose-card {
  min-width: 0;
  margin-bottom: 1rem;
}

#reformatterContent .rf-overview-card {
  padding: 1.5rem 1.75rem !important;
}

#reformatterContent .rf-compose-card {
  padding: 1.75rem !important;
}

#reformatterContent .rf-overview-card {
  display: grid;
  gap: 0.75rem;
}

.rf-overview-heading {
  display: flex;
  align-items: center;
  gap: 0.625rem;
  min-width: 0;
}

.rf-overview-heading > .icon {
  flex: 0 0 auto;
  color: var(--primary);
  font-size: 1.25rem;
}

.rf-overview-title {
  min-width: 0;
  color: var(--text);
  font-family: var(--font-main);
  font-size: clamp(1.25rem, 2.1vw, 1.5rem);
  font-weight: 700;
  line-height: 1.25;
  letter-spacing: -0.02em;
  overflow-wrap: anywhere;
}

.rf-overview-copy {
  max-width: 92ch;
  color: var(--text-secondary);
  font-size: 0.9375rem;
  line-height: 1.55;
}

.rf-facts {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 220px), 1fr));
  gap: 0.625rem;
  min-width: 0;
  margin-top: 0.125rem;
}

.rf-fact.m3chip {
  width: 100%;
  height: auto;
  min-height: 40px;
  justify-content: flex-start;
  padding: 0.5rem 0.75rem;
  white-space: normal;
  overflow-wrap: anywhere;
  font-family: var(--font-main);
  font-size: 0.8125rem;
  line-height: 1.35;
  letter-spacing: 0;
}

.rf-fact > .icon {
  flex: 0 0 auto;
  font-size: 1rem;
}

#reformatterContent .rf-compose-card {
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  gap: 1.25rem;
  overflow: visible;
}

.rf-field {
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  gap: 0.5rem;
  min-width: 0;
}

.rf-name-field {
  width: min(100%, 520px);
}

.rf-field-label {
  display: flex;
  align-items: center;
  gap: 0.4375rem;
  min-width: 0;
  color: var(--text-secondary);
  font-size: 0.875rem;
  font-weight: 500;
  line-height: 1.4;
}

.rf-field-label > .icon {
  flex: 0 0 auto;
  font-size: 1.0625rem;
}

.rf-exam-name {
  min-height: 48px;
}

.rf-import-row {
  display: grid;
  grid-template-columns: minmax(0, 1fr) max-content;
  align-items: end;
  gap: 0.75rem 1.125rem;
  min-width: 0;
}

.rf-import-instruction {
  min-width: 0;
  max-width: 82ch;
  color: var(--text-secondary);
  font-size: 0.875rem;
  line-height: 1.5;
  overflow-wrap: anywhere;
}

.rf-upload-button {
  align-self: end;
  min-width: max-content;
  margin: 0;
  white-space: nowrap;
}

.rf-upload-button > .icon {
  font-size: 1.125rem;
}

.rf-upload-button[aria-busy="true"] {
  cursor: wait;
}

#reformatterContent .rf-batch-text {
  display: block;
  width: 100%;
  min-width: 0;
  min-height: 280px !important;
  max-height: min(68vh, 760px);
  margin: 0;
  font-size: 0.9375rem;
  line-height: 1.55;
  scroll-padding-block: 0.875rem;
}

.rf-submit-row {
  display: grid;
  grid-template-columns: minmax(0, 1fr) max-content;
  align-items: center;
  gap: 0.75rem 1.125rem;
  min-width: 0;
}

.rf-batch-count {
  min-width: 0;
  color: var(--text-tertiary);
  font-size: 0.875rem;
  line-height: 1.45;
  overflow-wrap: anywhere;
}

.rf-submit-button {
  min-width: 156px;
  justify-content: center;
}

.rf-batch-help {
  margin: 0;
  padding-top: 1rem;
  border-top: 1px solid var(--surface-3);
  color: var(--text-tertiary);
  font-size: 0.8125rem;
  line-height: 1.55;
}

@media (max-width: 700px) {
  #reformatterContent .rf-overview-card,
  #reformatterContent .rf-compose-card {
    padding: 1.125rem !important;
  }

  .rf-import-row,
  .rf-submit-row {
    grid-template-columns: minmax(0, 1fr);
    align-items: stretch;
  }

  .rf-upload-button,
  .rf-submit-button {
    width: 100%;
    min-width: 0;
    min-height: 48px;
  }

  #reformatterContent .rf-batch-text {
    min-height: 240px !important;
    max-height: 62vh;
  }

  .rf-batch-help {
    font-size: 0.875rem;
  }
}

/* Supporting text in the optimizer is instructional and status-bearing, so
   it must not fall below 14px on desktop. Inline legacy sizes are overridden
   only inside this workspace and its preview modal. */
#reformatterContent [style*="font-size:10"],
#reformatterContent [style*="font-size:11"],
#reformatterContent [style*="font-size:12"],
#reformatterContent [style*="font-size:13"],
#rfJobDetail [style*="font-size:10"],
#rfJobDetail [style*="font-size:11"],
#rfJobDetail [style*="font-size:12"],
#rfJobDetail [style*="font-size:13"],
.rf-preview-card [style*="font-size:10"],
.rf-preview-card [style*="font-size:11"],
.rf-preview-card [style*="font-size:12"],
.rf-preview-card [style*="font-size:13"],
#rfBatchCount,
.rf-preview-cost-sub,
.rf-preview-meta,
.rf-preview-chip,
.rf-preview-mode {
  font-size: 0.875rem !important;
  line-height: 1.45;
}

@media (max-width: 700px) {
  .generation-limit-notice {
    align-items: flex-start;
    flex-wrap: wrap;
    font-size: 1rem;
  }
  .generation-limit-notice .btn { width: 100%; min-height: 44px; }
  .rf-preview-head { flex-direction: column; gap: 0.625rem; }
  .rf-preview-cost { text-align: left; }
  .rf-preview-row { gap: var(--space-2); padding: 0.625rem 0.375rem; }
  .rf-preview-footer { align-items: stretch; }
  .rf-preview-actions { width: 100%; flex-direction: column-reverse; }
  .rf-preview-actions .btn { width: 100%; min-height: 44px; }
  .rf-job-row { flex-wrap: wrap; }
  .rf-exam-actions .btn { width: 100%; min-height: 44px; }
  #reformatterContent [style*="font-size:10"],
  #reformatterContent [style*="font-size:11"],
  #reformatterContent [style*="font-size:12"],
  #reformatterContent [style*="font-size:13"],
  #rfJobDetail [style*="font-size:10"],
  #rfJobDetail [style*="font-size:11"],
  #rfJobDetail [style*="font-size:12"],
  #rfJobDetail [style*="font-size:13"],
  .rf-preview-card [style*="font-size:10"],
  .rf-preview-card [style*="font-size:11"],
  .rf-preview-card [style*="font-size:12"],
  .rf-preview-card [style*="font-size:13"],
  #rfBatchCount,
  .rf-preview-cost-sub,
  .rf-preview-meta,
  .rf-preview-chip,
  .rf-preview-mode,
  .rf-ambiguity-choice label {
    font-size: 1rem !important;
  }
}


/* Shared public-surface rules. */

/*
 * T.H.O.M.A.S. interface system
 *
 * Inspired by Apple Human Interface Guidelines and the system Liquid Glass
 * material without copying Apple assets. Content stays quiet and readable;
 * translucency, specular edges, and motion communicate hierarchy and state.
 * The system font stack supplies the native typeface on each platform and
 * avoids a font download on critical screens.
 */



*,
*::before,
*::after {
  box-sizing: border-box;
}

html {
  min-width: 320px;
  background: var(--bg);
  color: var(--text);
  font-family: var(--font-body);
  font-size: 100%;
  text-size-adjust: 100%;
  -webkit-text-size-adjust: 100%;
  scroll-behavior: smooth;
}

body {
  margin: 0;
  background: var(--bg);
  background-image: none;
  color: var(--text);
  font-family: var(--font-body);
  font-size: 1rem;
  line-height: 1.5;
  letter-spacing: -0.005em;
  -webkit-font-smoothing: antialiased;
  text-rendering: optimizeLegibility;
}

body::before,
body::after {
  content: none;
}

.particles,
.hero-particles,
.page-loader,
.scroll-progress {
  display: none;
}

button,
input,
select,
textarea {
  font: inherit;
}

button,
[role="button"],
a,
input,
select,
textarea,
summary {
  -webkit-tap-highlight-color: transparent;
}

button,
[role="button"],
input[type="button"],
input[type="submit"],
select,
summary {
  min-height: var(--control-height);
}

a {
  color: var(--primary);
  text-underline-offset: 0.18em;
}

a:hover {
  color: var(--primary-hover);
}

:where(button, a, input, select, textarea, summary, [tabindex]):focus-visible {
  outline: 3px solid var(--focus-ring);
  outline-offset: 3px;
}

::selection {
  background: rgba(var(--primary-rgb), 0.2);
}

::placeholder {
  color: #76767b;
  opacity: 1;
}

[hidden] {
  display: none;
}

.apple-skip-link,
.skip-link {
  position: fixed;
  top: 10px;
  left: 12px;
  z-index: 20000;
  width: auto;
  height: auto;
  padding: 0.625rem 0.875rem;
  overflow: visible;
  clip: auto;
  clip-path: none;
  border: 1px solid var(--border-strong);
  border-radius: 10px;
  background: #ffffff;
  color: var(--text);
  box-shadow: var(--shadow-md);
  font-size: 0.875rem;
  font-weight: 600;
  text-decoration: none;
  transform: translateY(-150%);
  transition: transform var(--duration-fast) var(--ease-out);
}

.apple-skip-link:focus,
.skip-link:focus {
  transform: translateY(0);
}

/* Shared controls */

.btn,
.btn-generate,
.login-btn,
.mode-btn,
.price-btn,
.btn-bracket,
.btn-filled {
  min-height: var(--control-height);
  border: 1px solid var(--border);
  border-radius: 999px;
  background: #ffffff;
  color: var(--text);
  box-shadow: none;
  font-family: var(--font-body);
  font-size: 0.875rem;
  font-weight: 600;
  line-height: 1.2;
  letter-spacing: -0.005em;
  text-transform: none;
  transition: background-color var(--duration-fast) ease, border-color var(--duration-fast) ease,
    color var(--duration-fast) ease, transform var(--duration-fast) ease;
}

.btn:hover,
.mode-btn:hover,
.price-btn:hover,
.btn-bracket:hover {
  border-color: var(--border-strong);
  background: #f5f5f7;
  transform: none;
}

.btn:active,
.btn-generate:active,
.login-btn:active,
.mode-btn:active,
.price-btn:active,
.btn-bracket:active,
.btn-filled:active {
  transform: scale(0.98);
}

.btn-primary,
.btn-generate,
.login-btn,
.btn-export-primary,
.btn-confirm,
.page-ocr .btn-primary,
.page-landing .price-card.featured .price-btn,
.page-landing .btn-filled {
  border-color: var(--primary);
  background: var(--primary);
  color: #ffffff;
}

.btn-primary:hover,
.btn-generate:hover,
.login-btn:hover,
.btn-export-primary:hover,
.page-ocr .btn-primary:hover,
.page-landing .price-card.featured .price-btn:hover,
.page-landing .btn-filled:hover {
  border-color: var(--primary-hover);
  background: var(--primary-hover);
  color: #ffffff;
}

.btn-danger-subtle,
.app-modal-btn-danger {
  border-color: rgba(var(--error-rgb), 0.3);
  background: var(--error-soft);
  color: var(--error-text);
}

.btn-icon,
.sa-icon-button,
.inbox-modal-close,
.toast-close {
  min-width: 44px;
  min-height: 44px;
  border: 0;
  border-radius: 50%;
  background: transparent;
  color: var(--text-secondary);
}

.btn-icon:hover,
.sa-icon-button:hover,
.inbox-modal-close:hover,
.toast-close:hover {
  background: rgba(0, 0, 0, 0.06);
  color: var(--text);
}

.neu-select,
.neu-input,
.neu-textarea,
.page-login input,
.page-ocr input,
.page-ocr select,
.sa-table-toolbar input[type="search"],
.sa-action-dialog input,
.sa-action-dialog textarea {
  width: 100%;
  min-height: var(--control-height);
  border: 1px solid var(--border);
  border-radius: 11px;
  background: #ffffff;
  color: var(--text);
  box-shadow: 0 1px 0 rgba(0, 0, 0, 0.02);
  font-family: var(--font-body);
  font-size: 1rem;
  line-height: 1.35;
}

.neu-select:hover,
.neu-input:hover,
.neu-textarea:hover,
.page-login input:hover,
.page-ocr input:hover,
.page-ocr select:hover {
  border-color: var(--border-strong);
}

.neu-select:focus,
.neu-input:focus,
.neu-textarea:focus,
.page-login input:focus,
.page-ocr input:focus,
.page-ocr select:focus {
  border-color: var(--primary);
  box-shadow: 0 0 0 4px rgba(var(--primary-rgb), 0.12);
}

:where(button, input, select, textarea):disabled {
  cursor: not-allowed;
  opacity: 0.5;
}

.form-group label {
  color: var(--text);
  font-size: 0.875rem;
  font-weight: 600;
  letter-spacing: -0.004em;
  text-transform: none;
}

.form-group .hint,
.section-hint,
.topic-mode-custom-hint {
  color: var(--text-secondary);
  font-size: 0.875rem;
  line-height: 1.45;
}

.help-tip {
  width: 44px;
  min-width: 44px;
  height: 44px;
  min-height: 44px;
  border: 0;
  border-radius: 50%;
  background: var(--surface-2);
  color: var(--primary);
  font-size: 0.9375rem;
  font-weight: 700;
}

/* Exam workspace */

.page-app {
  min-height: 100vh;
  padding: 0 1.25rem 3.5rem;
  overflow-x: clip;
}

.page-app #app {
  width: min(100%, var(--app-content-max));
  max-width: var(--app-content-max);
  margin: 0 auto;
}

.page-app .top-bar {
  position: sticky;
  top: 0;
  z-index: 900;
  display: flex;
  align-items: center;
  gap: 1rem;
  width: 100vw;
  max-width: 100vw;
  min-height: 68px;
  /* Break out of the centered app container before applying matching
     viewport-derived gutters. */
  margin: 0 calc(50% - 50vw);
  padding: 0.625rem max(1.25rem, calc((100vw - var(--app-content-max)) / 2));
  border: 0;
  border-bottom: 1px solid rgba(0, 0, 0, 0.08);
  border-radius: 0;
  background: rgba(250, 250, 252, 0.86);
  box-shadow: none;
  box-sizing: border-box;
  overflow: visible;
  backdrop-filter: saturate(180%) blur(var(--blur-md));
  -webkit-backdrop-filter: saturate(180%) blur(var(--blur-md));
}

.page-app .top-bar-brand {
  flex: 0 0 auto;
  align-items: center;
  gap: 0.625rem;
}

.page-app .brand-badge {
  padding: 0;
  border: 0;
  background: transparent;
  color: var(--text);
  font-family: var(--font-body);
  font-size: 1.125rem;
  font-weight: 700;
  letter-spacing: 0.04em;
  box-shadow: none;
}

.page-app .brand-tagline {
  padding-left: 0.625rem;
  border-left: 1px solid var(--border);
  color: var(--text-secondary);
  font-family: var(--font-body);
  font-size: 0.875rem;
  font-style: normal;
  line-height: 1.2;
}

.page-app .top-bar-actions {
  flex: 1 1 auto;
  min-width: 0;
  flex-direction: row;
  align-items: center;
  justify-content: flex-end;
  flex-wrap: nowrap;
  gap: 0.5rem;
}

.page-app .top-bar-account,
.page-app .top-bar-exports {
  display: flex;
  min-width: 0;
  align-items: center;
  flex-wrap: nowrap;
  gap: 0.5rem;
}

.page-app .top-bar-account {
  flex: 0 1 auto;
}

.page-app .top-bar-exports {
  flex: 0 0 auto;
  white-space: nowrap;
}

.page-app .user-badge {
  display: grid;
  grid-template-columns: auto minmax(0, 1fr) auto;
  grid-template-rows: auto auto;
  flex: 0 1 320px;
  width: min(320px, 40vw);
  min-width: 0;
  max-width: 320px;
  height: 44px;
  min-height: 44px;
  column-gap: 0.5rem;
  row-gap: 0;
  overflow: hidden;
  padding: 0.25rem 0.625rem;
}

.page-app .user-badge > .icon {
  grid-column: 1;
  grid-row: 1 / 3;
  flex-shrink: 0;
}

.page-app #userName,
.page-app #userUsage {
  grid-column: 2;
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.page-app #userName {
  grid-row: 1;
  line-height: 1.2;
}

.page-app #userUsage {
  grid-row: 2;
  line-height: 1.2;
}

.page-app #tokenTicker {
  grid-column: 3;
  grid-row: 1 / 3;
  align-self: center;
  margin-left: 0;
  white-space: nowrap;
}

.page-app .active-exam-badge {
  min-height: 40px;
  padding: 0.4375rem 0.6875rem;
  border: 1px solid var(--border);
  border-radius: 999px;
  background: rgba(255, 255, 255, 0.72);
  color: var(--text);
}

.page-app .active-exam-badge {
  max-width: 180px;
}

.page-app #userUsage {
  color: var(--text-secondary);
  font-family: var(--font-body);
  font-size: 0.75rem;
  opacity: 1;
}

.page-app .tab-bar {
  position: sticky;
  top: 69px;
  z-index: 850;
  display: flex;
  justify-content: center;
  gap: 0.25rem;
  width: fit-content;
  max-width: 100%;
  margin: 0.875rem auto 1.5rem;
  padding: 0.3125rem;
  overflow-x: auto;
  border: 1px solid rgba(0, 0, 0, 0.1);
  border-radius: 16px;
  background: rgba(255, 255, 255, 0.82);
  box-shadow: var(--shadow-sm);
  backdrop-filter: saturate(180%) blur(var(--blur-md));
  -webkit-backdrop-filter: saturate(180%) blur(var(--blur-md));
  scrollbar-width: none;
}

.page-app .tab-bar::-webkit-scrollbar {
  display: none;
}

/* The header keeps all controls on one stable row at desktop widths. The
   active-exam chip and header exports are progressive conveniences: both
   remain available inside the app when these duplicates are removed at
   intermediate widths. */
@media (max-width: 1180px) {
  .page-app #exportBtnWrap {
    display: none;
  }
}

@media (max-width: 1040px) {
  .page-app #exportBtnWrap {
    display: none;
  }

  .page-app .brand-tagline {
    display: none;
  }
}

.page-app .tab-btn {
  min-height: 44px;
  padding: 0.5rem 0.8125rem;
  border: 0;
  border-radius: 11px;
  background: transparent;
  color: var(--text-secondary);
  font-family: var(--font-body);
  font-size: 0.8125rem;
  font-weight: 600;
  letter-spacing: -0.004em;
  text-transform: none;
  white-space: nowrap;
}

.page-app .tab-btn:hover {
  background: rgba(0, 0, 0, 0.045);
  color: var(--text);
}

.page-app .tab-btn.active {
  background: var(--text);
  color: #ffffff;
  box-shadow: 0 1px 4px rgba(0, 0, 0, 0.16);
}

.page-app .tab-btn::after {
  content: none;
}

.page-app .tab-btn .icon {
  font-size: 1.125rem;
}

.page-app .view {
  width: 100%;
  animation: none;
}

.page-app .view:focus-visible {
  outline: 3px solid var(--focus-ring);
  outline-offset: 4px;
}

body.is-generating #loadingState {
  background: rgba(29, 29, 31, 0.5);
}

body.is-generating #loadingState .gen-stage {
  border: 1px solid var(--border);
  background: var(--surface-0);
  color: var(--text);
  box-shadow: var(--shadow-lg);
}

body.is-generating #loadingState .gen-stage::before {
  content: none;
}

body.is-generating #loadingState :is(.gen-step, .stream-out, .gen-log) {
  border-color: var(--border);
  background: var(--surface-lowest);
  color: var(--text);
}

/* Restore active/done differentiation the blanket rule above flattened (V5):
   without these, every pipeline step renders the same washed-out gray and
   only a tiny icon signals which step is running. */
body.is-generating #loadingState .gen-step.active {
  background: color-mix(in srgb, var(--primary) 12%, var(--bg-elevated));
  border-color: color-mix(in srgb, var(--primary) 45%, transparent);
}
body.is-generating #loadingState .gen-step.done {
  background: color-mix(in srgb, var(--success) 10%, var(--bg-elevated));
  border-color: color-mix(in srgb, var(--success) 38%, transparent);
}

.page-app .view-header,
.page-app .section-label {
  color: var(--text);
}

.page-app .section-label {
  margin-bottom: 1.125rem;
  font-family: var(--font-body);
  font-size: 1.25rem;
  font-weight: 700;
  letter-spacing: -0.02em;
  text-transform: none;
}

.page-app .view-header-title .eyebrow,
.page-app .source-section-label {
  color: var(--text-secondary);
  font-family: var(--font-body);
  font-size: 0.8125rem;
  font-weight: 600;
  letter-spacing: 0.01em;
  text-transform: none;
}

.page-app .view-header-title h2 {
  color: var(--text);
  font-family: var(--font-display);
  font-size: clamp(1.75rem, 4vw, 2.625rem);
  font-style: normal;
  font-weight: 700;
  letter-spacing: -0.035em;
}

.page-app .config-surface,
.page-app .welcome-card,
.page-app .q-card,
.page-app .question-card,
.page-app .bank-card,
.page-app .billing-plan-card,
.page-app .billing-topup-card,
.page-app .rf-card,
.page-app .library-card,
.page-app .exam-surface,
.page-app .status-bar,
.page-app .export-meta-row {
  border: 1px solid var(--border);
  border-radius: var(--radius-lg);
  background: #ffffff;
  background-image: none;
  box-shadow: var(--shadow-sm);
}

.page-app .billing-plan-card,
.page-app .billing-topup-card {
  width: 100%;
  min-height: 150px;
  color: var(--text);
  font-family: var(--font-body);
  text-align: left;
  cursor: pointer;
}

.page-app .billing-plan-card:disabled {
  cursor: default;
  opacity: 1;
}

.page-app .config-surface {
  padding: clamp(1.25rem, 4vw, 2.25rem);
}

.page-app .config-grid {
  gap: 1.125rem;
}

.page-app .workflow-picker {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: 0.75rem;
  margin-bottom: 1.375rem;
}

.page-app .workflow-card {
  min-height: 112px;
  padding: 1.25rem;
  border: 1px solid var(--border);
  border-radius: var(--radius-lg);
  background: #ffffff;
  color: var(--text);
  box-shadow: none;
  text-align: left;
}

.page-app .workflow-card:hover {
  border-color: var(--border-strong);
  background: #fafafa;
  transform: none;
}

.page-app .workflow-card.workflow-active {
  border-color: rgba(var(--primary-rgb), 0.55);
  background: var(--primary-soft);
  box-shadow: 0 0 0 1px rgba(var(--primary-rgb), 0.12);
}

.page-app .workflow-icon {
  width: 42px;
  height: 42px;
  border-radius: 12px;
  background: var(--surface-2);
  color: var(--primary);
}

.page-app .workflow-card.workflow-active .workflow-icon {
  background: var(--primary);
  color: #ffffff;
}

.page-app .workflow-text strong {
  color: var(--text);
  font-size: 1.0625rem;
}

.page-app .workflow-subtitle {
  margin-top: 0.25rem;
  color: var(--text-secondary);
  font-size: 0.875rem;
  line-height: 1.45;
}

.page-app .welcome-gate {
  min-height: 360px;
}

.page-app .welcome-card {
  padding: clamp(1.75rem, 6vw, 4rem);
  text-align: center;
}

.page-app .welcome-phrase {
  color: var(--text);
  font-family: var(--font-display);
  font-size: clamp(1.875rem, 5vw, 3.125rem);
  font-style: normal;
  font-weight: 700;
  letter-spacing: -0.04em;
}

.page-app .welcome-form {
  width: min(100%, 680px);
  margin-inline: auto;
}

.page-app .welcome-skip,
.page-app .ribbon-change-btn {
  min-height: 44px;
  color: var(--primary);
  font-size: 0.875rem;
  text-decoration: none;
}

.page-app .active-exam-ribbon,
.page-app .ai-disclaimer,
.page-app .quota-banner,
.page-app .generation-limit-notice,
.page-app .rf-active-banner,
.page-app .error-banner {
  border: 1px solid var(--border);
  border-radius: var(--radius-md);
  background: #ffffff;
  color: var(--text);
  box-shadow: none;
}

.page-app .ai-disclaimer {
  border-color: rgba(var(--primary-rgb), 0.25);
  background: var(--primary-soft);
}

.page-app .source-section {
  margin-top: 1.5rem;
  padding-top: 1.5rem;
  border-top: 1px solid var(--border);
}

.page-app .source-radio-group {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: 0.625rem;
}

.page-app .source-radio,
.page-app .topic-mode-option,
.page-app .source-book-picker,
.page-app .toggle-row,
.page-app .config-details {
  border: 1px solid var(--border);
  border-radius: var(--radius-md);
  background: #ffffff;
  color: var(--text);
  box-shadow: none;
}

.page-app .source-radio {
  min-height: 108px;
  padding: 1rem;
}

.page-app .source-radio:hover {
  border-color: var(--border-strong);
  background: #fafafa;
}

.page-app .source-radio-active {
  border-color: var(--primary);
  background: var(--primary-soft);
}

.page-app .source-radio-help {
  color: var(--text-secondary);
  font-size: 0.875rem;
  line-height: 1.45;
}

.page-app .source-radio-dot {
  border-color: var(--border-strong);
  background: #ffffff;
}

.page-app .source-radio-active .source-radio-dot {
  border-color: var(--primary);
  background: var(--primary);
  box-shadow: inset 0 0 0 4px #ffffff;
}

.page-app .source-book-picker {
  padding: 1rem;
  background: var(--surface-2);
}

.page-app .config-details {
  margin-top: 1.125rem;
  overflow: hidden;
}

.page-app .config-details-summary {
  min-height: 52px;
  padding: 0.75rem 1rem;
  color: var(--text);
  font-size: 0.9375rem;
  font-weight: 600;
}

.page-app .config-details[open] .config-details-summary {
  border-bottom: 1px solid var(--border);
  background: var(--surface-2);
}

.page-app .generate-dock {
  position: static;
  bottom: auto;
  z-index: auto;
  display: flex;
  align-items: center;
  justify-content: flex-end;
  gap: 0.75rem;
  margin: 1.25rem 0 0;
  padding: 0.75rem;
  border: 1px solid rgba(0, 0, 0, 0.1);
  border-radius: 18px;
  background: rgba(255, 255, 255, 0.88);
  box-shadow: var(--shadow-md);
  backdrop-filter: saturate(180%) blur(var(--blur-md));
  -webkit-backdrop-filter: saturate(180%) blur(var(--blur-md));
}

.page-app .btn-generate-kbd {
  border-color: rgba(255, 255, 255, 0.28);
  background: rgba(255, 255, 255, 0.16);
  color: #ffffff;
}

.page-app .status-bar,
.page-app .export-meta-row {
  padding: 1rem;
}

.page-app .q-card,
.page-app .question-card,
.page-app .bank-card {
  margin-bottom: 0.875rem;
  padding: clamp(1.125rem, 3vw, 1.625rem);
}

.page-app .q-vignette,
.page-app .preview-stem {
  color: var(--text);
  font-size: 1rem;
  line-height: 1.65;
}

.page-app .q-opt,
.page-app .preview-opt {
  min-height: 44px;
  border-color: var(--border);
  border-radius: 11px;
  background: #ffffff;
  color: var(--text);
}

.page-app .q-meta,
.page-app .exam-stat,
.page-app .billing-tier-badge {
  color: var(--text-secondary);
  font-family: var(--font-body);
  font-size: 0.8125rem;
  letter-spacing: 0;
  text-transform: none;
}

.page-app .empty,
.page-app .skeleton-card {
  border: 1px solid var(--border);
  border-radius: var(--radius-lg);
  background: #ffffff;
  color: var(--text-secondary);
}

.page-app .billing-plans-grid,
.page-app .billing-topups-grid {
  gap: 0.875rem;
}

.page-app .billing-plan-card:hover,
.page-app .billing-topup-card:hover {
  border-color: var(--border-strong);
  transform: none;
}

.page-app .billing-plan-card.current {
  border-color: var(--primary);
  background: var(--primary-soft);
}

.page-app :where(.billing-table, .admin-table, table) {
  color: var(--text);
}

.page-app :where(.billing-table, .admin-table, table) th {
  background: var(--surface-2);
  color: var(--text-secondary);
  font-size: 0.8125rem;
  letter-spacing: 0;
  text-transform: none;
}

.page-app :where(.billing-table, .admin-table, table) td {
  border-color: var(--border);
  background: #ffffff;
  color: var(--text);
  font-size: 0.875rem;
}

/* Shared modal and transient layers */

.modal-overlay,
.app-modal-overlay,
.inbox-modal-overlay,
.sa-modal-backdrop {
  background: rgba(0, 0, 0, 0.38);
  backdrop-filter: none;
  -webkit-backdrop-filter: none;
}

.modal-surface,
.modal-card,
.app-modal-card,
.inbox-modal-card,
.sa-modal,
.sa-action-dialog {
  border: 1px solid var(--border);
  border-radius: var(--radius-lg);
  background: #ffffff;
  color: var(--text);
  box-shadow: var(--shadow-lg);
}

.app-modal-card,
.modal-surface,
.inbox-modal-card {
  max-width: min(560px, calc(100vw - 32px));
}

.modal-surface h2,
.app-modal-title,
.inbox-modal-title,
.sa-modal-head strong,
.sa-action-dialog h2 {
  color: var(--text);
  font-family: var(--font-display);
  font-weight: 700;
  letter-spacing: -0.02em;
}

.modal-surface p,
.app-modal-message,
.paywall-body,
.inbox-empty {
  color: var(--text-secondary);
}

.toast-container {
  z-index: 20000;
}

.toast {
  min-height: 52px;
  border: 1px solid var(--border);
  border-radius: 14px;
  background: rgba(255, 255, 255, 0.94);
  color: var(--text);
  box-shadow: var(--shadow-md);
  backdrop-filter: blur(var(--blur-md));
  -webkit-backdrop-filter: blur(var(--blur-md));
}

/* System operator */

.page-system-admin {
  min-height: 100vh;
  background: var(--bg);
}

.page-system-admin .sa-app {
  width: min(100%, 1480px);
  max-width: 1480px;
  margin: 0 auto;
  padding: 0 1.5rem 4rem;
  color: var(--text);
  font-family: var(--font-body);
}

.page-system-admin .sa-topbar {
  position: sticky;
  top: 0;
  z-index: 900;
  min-height: 72px;
  margin: 0 -1.5rem 1.375rem;
  padding: 0.625rem 1.5rem;
  border: 0;
  border-bottom: 1px solid rgba(0, 0, 0, 0.08);
  border-radius: 0;
  background: rgba(250, 250, 252, 0.86);
  box-shadow: none;
  backdrop-filter: saturate(180%) blur(var(--blur-md));
  -webkit-backdrop-filter: saturate(180%) blur(var(--blur-md));
}

.page-system-admin .sa-topbar-brand strong {
  color: var(--text);
  font-family: var(--font-body);
  font-size: 1.125rem;
  font-weight: 700;
  letter-spacing: -0.01em;
}

.page-system-admin .sa-topbar-brand small,
.page-system-admin .sa-topbar-meta,
.page-system-admin .sa-build-id {
  color: var(--text-secondary);
  font-family: var(--font-body);
  font-size: 0.8125rem;
  letter-spacing: 0;
  text-transform: none;
}

.page-system-admin .sa-pulse.sa-pulse-error {
  background: var(--error);
  box-shadow: 0 0 0 4px var(--error-soft);
}

.page-system-admin .sa-range {
  gap: 0.125rem;
  padding: 0.25rem;
  border: 1px solid var(--border);
  border-radius: 12px;
  background: rgba(0, 0, 0, 0.045);
}

.page-system-admin .sa-section-nav {
  position: sticky;
  top: 84px;
  z-index: 820;
  display: flex;
  width: fit-content;
  max-width: 100%;
  margin: 0 auto 1.375rem;
  padding: 0.3125rem;
  overflow-x: auto;
  border: 1px solid var(--border);
  border-radius: 15px;
  background: rgba(255, 255, 255, 0.86);
  box-shadow: var(--shadow-sm);
  backdrop-filter: saturate(180%) blur(var(--blur-md));
  -webkit-backdrop-filter: saturate(180%) blur(var(--blur-md));
  scrollbar-width: none;
}

.page-system-admin .sa-section-nav::-webkit-scrollbar {
  display: none;
}

.page-system-admin .sa-section-nav button {
  min-height: 44px;
  padding: 0.5rem 0.9375rem;
  border: 0;
  border-radius: 10px;
  background: transparent;
  color: var(--text-secondary);
  font-size: 0.875rem;
  font-weight: 600;
  white-space: nowrap;
}

.page-system-admin .sa-section-nav button[aria-pressed="true"],
.page-system-admin .sa-section-nav button[aria-selected="true"] {
  background: var(--text);
  color: #ffffff;
}

.page-system-admin .sa-range button,
.page-system-admin .sa-filter-pill {
  min-height: 44px;
  padding: 0.4375rem 0.6875rem;
  border: 0;
  border-radius: 9px;
  background: transparent;
  color: var(--text-secondary);
  font-family: var(--font-body);
  font-size: 0.8125rem;
  font-weight: 600;
  letter-spacing: 0;
  text-transform: none;
}

.page-system-admin .sa-range button.sa-range-active,
.page-system-admin .sa-filter-pill.sa-filter-active {
  background: #ffffff;
  color: var(--text);
  box-shadow: 0 1px 4px rgba(0, 0, 0, 0.12);
}

.page-system-admin .sa-hero {
  gap: 0.75rem;
}

.page-system-admin .sa-kpi,
.page-system-admin .sa-card,
.page-system-admin .sa-tile,
.page-system-admin .sa-sec-check,
.page-system-admin .sa-sec-stat,
.page-system-admin .sa-model-row,
.page-system-admin .sa-job-diagnostic,
.page-system-admin .sa-account-controls {
  border: 1px solid var(--border);
  border-radius: var(--radius-md);
  background: #ffffff;
  background-image: none;
  color: var(--text);
  box-shadow: var(--shadow-sm);
}

.page-system-admin .sa-kpi {
  min-height: 122px;
  padding: 1.125rem;
}

.page-system-admin .sa-kpi-label,
.page-system-admin .sa-kpi-sub,
.page-system-admin .sa-tile-label,
.page-system-admin .sa-tile-sub,
.page-system-admin .sa-card-head,
.page-system-admin .sa-section-title,
.page-system-admin .sa-model-role,
.page-system-admin .sa-sec-check-detail {
  color: var(--text-secondary);
  font-family: var(--font-body);
  font-size: 0.875rem;
  letter-spacing: 0;
  text-transform: none;
}

.page-system-admin .sa-kpi-value,
.page-system-admin .sa-tile-value {
  color: var(--text);
  font-family: var(--font-display);
  font-variant-numeric: tabular-nums;
  font-weight: 700;
  letter-spacing: -0.03em;
}

.page-system-admin .sa-card {
  overflow: hidden;
}

.page-system-admin .sa-card-head {
  min-height: 54px;
  padding: 0.875rem 1rem;
  border-bottom: 1px solid var(--border);
  background: #ffffff;
}

.page-system-admin .sa-card-head strong {
  color: var(--text);
  font-size: 0.9375rem;
}

.page-system-admin .sa-alert,
.page-system-admin .sa-scope-notice,
.page-system-admin .sa-danger-notice {
  border: 1px solid var(--border);
  border-radius: 12px;
  background: #ffffff;
  color: var(--text);
}

.page-system-admin .sa-alert-ok {
  border-color: rgba(36, 138, 61, 0.25);
  background: var(--success-soft);
}

.page-system-admin .sa-alert-warn {
  border-color: rgba(148, 98, 0, 0.25);
  background: var(--warning-soft);
}

.page-system-admin .sa-alert-crit,
.page-system-admin .sa-danger-notice {
  border-color: rgba(var(--error-rgb), 0.25);
  background: var(--error-soft);
}

.page-system-admin .sa-table-toolbar {
  gap: 0.625rem;
  padding: 0.75rem 0.875rem;
  border-bottom: 1px solid var(--border);
  background: var(--surface-2);
}

.page-system-admin .sa-table {
  width: 100%;
  border-collapse: collapse;
  color: var(--text);
  font-family: var(--font-body);
  font-size: 0.875rem;
}

.page-system-admin .sa-table th {
  padding: 0.75rem 0.875rem;
  border-color: var(--border);
  background: var(--surface-2);
  color: var(--text-secondary);
  font-size: 0.8125rem;
  font-weight: 600;
  letter-spacing: 0;
  text-transform: none;
}

.page-system-admin .sa-table td {
  padding: 0.8125rem 0.875rem;
  border-color: var(--border);
  background: #ffffff;
  color: var(--text);
  font-size: 0.875rem;
  line-height: 1.4;
}

.page-system-admin .sa-table tr:hover td {
  background: #f8f8fa;
}

.page-system-admin .sa-user-row button,
.page-system-admin .sa-account-controls .btn,
.page-system-admin .sa-action-dialog-actions .btn {
  min-height: 44px;
}

.page-system-admin .sa-action-dialog::backdrop {
  background: rgba(0, 0, 0, 0.38);
  backdrop-filter: none;
  -webkit-backdrop-filter: none;
}

.page-system-admin .sa-action-dialog-head,
.page-system-admin .sa-action-dialog-actions {
  border-color: var(--border);
  background: #ffffff;
}

.page-system-admin code,
.page-system-admin .sa-model-id {
  color: var(--primary);
}

/* Public landing page */

.page-landing {
  opacity: 1;
  overflow-x: clip;
  animation: none;
}

.page-landing .nav-header {
  position: fixed;
  top: 0;
  z-index: 1000;
  width: 100%;
  padding: 0.75rem 1.25rem;
  transform: none;
  opacity: 1;
  background: rgba(250, 250, 252, 0.86);
  border-bottom: 1px solid rgba(0, 0, 0, 0.08);
  backdrop-filter: saturate(180%) blur(var(--blur-md));
  -webkit-backdrop-filter: saturate(180%) blur(var(--blur-md));
}

.page-landing .nav-header.hide-nav,
.page-landing .nav-header.scrolled {
  transform: none;
}

.page-landing .nav-inner,
.page-landing .nav-pill {
  width: min(100%, var(--content-max));
  max-width: var(--content-max);
  margin: 0 auto;
}

.page-landing .nav-pill {
  display: flex;
  align-items: center;
  justify-content: space-between;
  min-height: 48px;
  padding: 0;
  border: 0;
  border-radius: 0;
  background: transparent;
  box-shadow: none;
  backdrop-filter: none;
}

.page-landing .nav-brand {
  display: inline-flex;
  min-height: 44px;
  align-items: center;
  color: var(--text);
  font-family: var(--font-body);
  font-size: 1.0625rem;
  font-weight: 700;
  letter-spacing: 0.04em;
}

.page-landing .nav-links {
  gap: 0.25rem;
}

.page-landing .nav-links a {
  min-height: 44px;
  display: inline-flex;
  align-items: center;
  padding: 0.5rem 0.75rem;
  border-radius: 999px;
  color: var(--text-secondary);
  font-family: var(--font-body);
  font-size: 0.8125rem;
  font-weight: 500;
  letter-spacing: 0;
  text-transform: none;
}

.page-landing .nav-links a:hover {
  background: rgba(0, 0, 0, 0.05);
  color: var(--text);
}

.page-landing .nav-links .nav-cta {
  padding-inline: 1.0625rem;
  background: var(--primary);
  color: #ffffff;
}

.page-landing .nav-hamburger {
  width: 44px;
  min-width: 44px;
  height: 44px;
  padding: 0.6875rem;
  border: 0;
  border-radius: 50%;
  background: transparent;
}

.page-landing .nav-hamburger span {
  background: var(--text);
}

.page-landing .container {
  width: min(100%, var(--content-max));
  max-width: var(--content-max);
  padding-inline: 1.5rem;
}

.page-landing .hero,
.page-landing .section-dark,
.page-landing .section-light,
.page-landing .cta-section,
.page-landing .footer {
  position: relative;
  background: #ffffff;
  background-image: none;
  color: var(--text);
  transform: none;
}

.page-landing .hero {
  min-height: 760px;
  padding: 11.875rem 0 6.875rem;
}

.page-landing .hero-content {
  max-width: 900px;
  margin-inline: auto;
  text-align: center;
}

.page-landing .hero-acronym {
  margin-bottom: 1.75rem;
  color: var(--text-secondary);
  font-family: var(--font-body);
  font-size: 0.8125rem;
  line-height: 1.45;
  letter-spacing: 0;
  text-transform: none;
}

.page-landing .hero-acronym strong {
  color: var(--text);
  font-size: 0.9375rem;
  letter-spacing: 0.04em;
}

.page-landing .hero h1 {
  margin: 0 auto 1.75rem;
  color: var(--text);
  font-family: var(--font-display);
  font-size: clamp(3.125rem, 8vw, 5.5rem);
  font-weight: 700;
  line-height: 0.98;
  letter-spacing: -0.06em;
  text-transform: none;
}

.page-landing .hero h1 .accent,
.page-landing .gradient-text,
.page-landing .hero h1 .serif {
  background: none;
  color: var(--primary);
  font-family: inherit;
  font-style: normal;
  -webkit-text-fill-color: currentColor;
}

.page-landing .hero-desc {
  max-width: 720px;
  margin: 0 auto 2.125rem;
  color: var(--text-secondary);
  font-size: clamp(1.125rem, 2.3vw, 1.3125rem);
  line-height: 1.5;
}

.page-landing .hero-ctas {
  justify-content: center;
  gap: 0.75rem;
}

.page-landing .hero-ctas .btn-bracket {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-height: 50px;
  padding: 0.75rem 1.375rem;
  text-decoration: none;
}

.page-landing .hero-ctas .btn-bracket:first-child {
  border-color: var(--primary);
  background: var(--primary);
  color: #ffffff;
}

.page-landing .btn-bracket::before,
.page-landing .btn-bracket::after,
.page-landing .ripple-circle {
  content: none;
  display: none;
}

.page-landing .section-light,
.page-landing .section-dark {
  padding: 7rem 0;
  border-top: 1px solid rgba(0, 0, 0, 0.06);
}

.page-landing .section-dark {
  background: var(--bg);
}

.page-landing .section-label,
.page-landing .section-label.on-light,
.page-landing .section-label.on-dark {
  color: var(--primary);
  font-family: var(--font-body);
  font-size: 0.875rem;
  font-weight: 600;
  letter-spacing: 0;
  text-transform: none;
}

.page-landing .section-label::before,
.page-landing .section-label::after {
  content: none;
}

.page-landing .section-title,
.page-landing .ethos-title,
.page-landing .cta-title {
  color: var(--text);
  font-family: var(--font-display);
  font-size: clamp(2.25rem, 6vw, 4rem);
  font-weight: 700;
  line-height: 1.05;
  letter-spacing: -0.045em;
  text-transform: none;
}

.page-landing .section-title .serif,
.page-landing .ethos-title .serif,
.page-landing .cta-title .serif,
.page-landing [style*="font-family: var(--font-serif)"] {
  color: inherit;
  font-family: inherit;
  font-style: normal;
}

.page-landing .ethos-body,
.page-landing .cta-desc,
.page-landing .value-card-desc,
.page-landing .timeline-desc,
.page-landing .alt-flow-body,
.page-landing .topup-detail,
.page-landing .topup-per,
.page-landing .topup-usecase,
.page-landing .topup-note,
.page-landing .price-features,
.page-landing .stat-source {
  color: var(--text-secondary);
  font-family: var(--font-body);
  font-size: 1rem;
  line-height: 1.55;
}

.page-landing .price-features li {
  color: var(--text-secondary);
  font-size: 0.875rem;
  line-height: 1.5;
}

.page-landing .price-features li.is-unavailable {
  color: var(--text-tertiary);
}

.page-landing .value-card,
.page-landing .step-card,
.page-landing .cap-card,
.page-landing .stats-card,
.page-landing .bib-card,
.page-landing .alt-flow-card,
.page-landing .price-card,
.page-landing .topup-card {
  border: 1px solid var(--border);
  border-radius: var(--radius-lg);
  background: #ffffff;
  background-image: none;
  color: var(--text);
  box-shadow: var(--shadow-sm);
  transform: none;
}

.page-landing .section-light .value-card,
.page-landing .section-light .price-card,
.page-landing .section-light .topup-card {
  background: #ffffff;
}

.page-landing :where(.value-card, .step-card, .cap-card, .stats-card, .bib-card, .alt-flow-card, .price-card, .topup-card):hover {
  border-color: var(--border-strong);
  box-shadow: var(--shadow-md);
  transform: none;
}

.page-landing .value-card-title,
.page-landing .step-card h3,
.page-landing .cap-card h3,
.page-landing .bib-card h3,
.page-landing .alt-flow-card h3,
.page-landing .price-tier,
.page-landing .topup-name,
.page-landing .stat-header {
  color: var(--text);
  font-family: var(--font-body);
  font-weight: 700;
  letter-spacing: -0.015em;
  text-transform: none;
}

.page-landing .value-card-number,
.page-landing .cap-number,
.page-landing .step-num,
.page-landing .alt-flow-badge,
.page-landing .timeline-label,
.page-landing .timeline-tag,
.page-landing .bib-tag {
  color: var(--primary);
  font-family: var(--font-body);
  letter-spacing: 0;
  text-transform: none;
}

.page-landing .price-card.featured {
  border-color: var(--primary);
  box-shadow: 0 0 0 1px rgba(var(--primary-rgb), 0.1), var(--shadow-md);
}

.page-landing .price-amount,
.page-landing .topup-amount,
.page-landing .stat-row .value {
  color: var(--text);
  font-family: var(--font-display);
  font-weight: 700;
  letter-spacing: -0.035em;
}

.page-landing .check,
.page-landing .included,
.page-landing .highlight {
  color: var(--success);
}

.page-landing .no {
  color: var(--text-tertiary);
}

.page-landing .cta-section {
  padding: 7.5rem 0;
  background: var(--bg);
  text-align: center;
}

.page-landing .footer {
  padding: 2.125rem 0;
  border-top: 1px solid var(--border);
  background: #ffffff;
}

.page-landing .footer p,
.page-landing .footer .brand {
  color: var(--text-secondary);
  font-family: var(--font-body);
}

.page-landing .footer-links {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  gap: 0.5rem 1.25rem;
  margin-top: 1.125rem;
}

.page-landing .footer-links a {
  display: inline-flex;
  min-height: 44px;
  align-items: center;
  color: var(--text-secondary);
  font-size: 0.875rem;
}


.page-landing .gradient-text,
.page-landing .gradient-border::before,
.page-landing .typewriter-cursor::after,
.page-landing .float-anim,
.page-landing .btn-pulse,
.page-landing .shimmer::after {
  animation: none;
}

/* Login and account creation */

.page-login {
  min-height: 100vh;
  align-items: center;
  justify-content: center;
  padding: 2.25rem 1.25rem;
  overflow-y: auto;
  opacity: 1;
  animation: none;
}

.page-login .login-container {
  width: min(100%, 480px);
  max-width: 480px;
  padding: 0;
}

.page-login .login-brand {
  margin-bottom: 1.5rem;
}

.page-login .login-brand h1,
.page-login .login-brand h1 .accent {
  margin-bottom: 0.5rem;
  color: var(--text);
  font-family: var(--font-body);
  font-size: 1.5rem;
  font-weight: 700;
  letter-spacing: 0.04em;
}

.page-login .login-brand .full-name {
  display: none;
}

.page-login .login-brand .university {
  color: var(--text-secondary);
  font-family: var(--font-body);
  font-size: 0.9375rem;
  font-weight: 400;
  letter-spacing: 0;
  text-transform: none;
}

.page-login .mode-toggle {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 0.1875rem;
  margin-bottom: 0.75rem;
  padding: 0.25rem;
  border: 1px solid var(--border);
  border-radius: 13px;
  background: rgba(0, 0, 0, 0.045);
}

.page-login .mode-toggle button {
  min-height: 44px;
  border: 0;
  border-radius: 9px;
  background: transparent;
  color: var(--text-secondary);
  font-size: 0.875rem;
  font-weight: 600;
}

.page-login .mode-toggle button.active {
  background: #ffffff;
  color: var(--text);
  box-shadow: 0 1px 4px rgba(0, 0, 0, 0.12);
}

.page-login .login-card {
  padding: clamp(1.375rem, 6vw, 2.125rem);
  border: 1px solid var(--border);
  border-radius: var(--radius-lg);
  background: #ffffff;
  box-shadow: var(--shadow-md);
}

.page-login .login-card::before,
.page-login .login-card::after {
  content: none;
}

.page-login .form-panel[hidden] {
  display: none;
}

.page-login .form-group {
  margin-bottom: 1.125rem;
}

.page-login .form-group label {
  margin-bottom: 0.4375rem;
}

.page-login .login-btn {
  width: 100%;
  min-height: 48px;
  margin-top: 0.25rem;
}

.page-login .msg-box {
  border-radius: 11px;
  font-size: 0.875rem;
  line-height: 1.45;
}

.page-login .msg-box.error {
  border-color: rgba(var(--error-rgb), 0.25);
  background: var(--error-soft);
  color: var(--error-text);
}

.page-login .msg-box.success {
  border-color: rgba(36, 138, 61, 0.25);
  background: var(--success-soft);
  color: var(--success);
}

.page-login .invite-icon {
  opacity: 0.65;
}

.page-login .plan-grid {
  gap: 0.625rem;
}

.page-login .plan-card {
  width: 100%;
  min-height: 92px;
  padding: 0.875rem;
  border: 1px solid var(--border);
  border-radius: 13px;
  background: #ffffff;
  color: var(--text);
  box-shadow: none;
  font-family: var(--font-body);
  text-align: left;
}

.page-login .plan-card:hover {
  border-color: var(--border-strong);
  transform: none;
}

.page-login .plan-card.selected {
  border-color: var(--primary);
  background: var(--primary-soft);
}

.page-login .plan-card.current-plan:not(.selected) {
  border-color: rgba(var(--success-rgb), 0.45);
  background: var(--success-soft);
}

.page-login .password-toggle {
  min-width: 64px;
  min-height: 44px;
  color: var(--text-secondary);
}

.page-login .login-help a {
  display: inline-flex;
  min-height: 44px;
  align-items: center;
  color: var(--primary);
}

.page-app .btn-iconish,
.page-app .delete-book-btn {
  min-width: 44px;
  min-height: 44px;
}

.page-app input[type="file"]:not([hidden]) {
  min-height: 44px;
  max-width: 100%;
  padding: 0.5rem;
  border: 1px solid var(--border);
  border-radius: 10px;
  background: var(--surface-2);
}

.page-app .billing-table-scroll {
  width: 100%;
  max-width: 100%;
  overflow-x: auto;
  overscroll-behavior-inline: contain;
  -webkit-overflow-scrolling: touch;
}

.page-login .plan-name,
.page-login .plan-price,
.page-login .plan-quota,
.page-login .plan-step-title,
.page-login .plan-step-subtitle {
  color: var(--text);
  font-family: var(--font-body);
}

.page-login .plan-quota,
.page-login .plan-step-subtitle {
  color: var(--text-secondary);
}

.page-login .plan-skip-button {
  min-height: 44px;
  padding: 0.5rem 0.75rem;
  border: 0;
  background: transparent;
  color: var(--primary);
  font-size: 0.875rem;
  cursor: pointer;
}

.page-login .login-footer a {
  min-height: 44px;
  display: inline-flex;
  align-items: center;
  color: var(--text-secondary);
  font-size: 0.875rem;
}

/* OCR operations */

.page-ocr {
  min-height: 100vh;
  padding: 1.75rem 1.25rem 4rem;
  background: var(--bg);
}

.page-ocr #authGate {
  background: var(--bg);
  color: var(--text);
}

.page-ocr #authGateActions a {
  display: inline-flex;
  min-height: 44px;
  align-items: center;
  padding: 0.5rem 0.875rem;
}

.page-ocr .app-wrap {
  width: min(100%, 980px);
  max-width: 980px;
  margin: 0 auto;
}

.page-ocr .header {
  margin-bottom: 1.75rem;
  text-align: left;
}

.page-ocr .header h1,
.page-ocr .header h1 span {
  color: var(--text);
  font-family: var(--font-display);
  font-size: clamp(2rem, 5vw, 3rem);
  font-weight: 700;
  letter-spacing: -0.04em;
}

.page-ocr .header h1 span {
  color: var(--primary);
}

.page-ocr .header p,
.page-ocr .dropzone-hint,
.page-ocr .progress-info,
.page-ocr .job-meta {
  color: var(--text-secondary);
  font-size: 0.875rem;
}

.page-ocr .back-link {
  min-height: 44px;
  display: inline-flex;
  align-items: center;
  color: var(--primary);
  font-size: 0.875rem;
  text-decoration: none;
}

.page-ocr .engine-badge {
  border: 1px solid rgba(var(--primary-rgb), 0.2);
  border-radius: 999px;
  background: var(--primary-soft);
  color: var(--primary);
  font-family: var(--font-body);
  font-size: 0.8125rem;
  letter-spacing: 0;
  text-transform: none;
}

.page-ocr .card,
.page-ocr .result-wrap,
.page-ocr .progress-wrap,
.page-ocr .cost-banner,
.page-ocr .stat-box,
.page-ocr .job-item,
.page-ocr .chapter-item {
  border: 1px solid var(--border);
  border-radius: var(--radius-lg);
  background: #ffffff;
  background-image: none;
  color: var(--text);
  box-shadow: var(--shadow-sm);
}

.page-ocr .file-item {
  border: 1px solid var(--border);
  background: var(--surface-2);
  color: var(--text);
}

.page-ocr .file-move,
.page-ocr .file-remove {
  min-width: 40px;
  min-height: 40px;
  border-radius: 8px;
}

.page-ocr .inline-feedback {
  border-color: rgba(var(--error-rgb), 0.25);
  background: var(--error-soft);
  color: var(--error-text);
}

.page-ocr .card {
  padding: clamp(1.125rem, 4vw, 1.75rem);
}

.page-ocr .card-title {
  color: var(--text);
  font-family: var(--font-body);
  font-size: 1.0625rem;
  font-weight: 700;
  letter-spacing: -0.015em;
}

.page-ocr .mode-btn {
  flex: 1;
  min-height: 44px;
}

.page-ocr .mode-btn.active {
  border-color: var(--primary);
  background: var(--primary-soft);
  color: var(--primary);
}

.page-ocr .dropzone {
  width: 100%;
  min-height: 210px;
  border: 2px dashed var(--border-strong);
  border-radius: var(--radius-lg);
  background: var(--surface-2);
  color: var(--text);
}

.page-ocr .dropzone:hover,
.page-ocr .dropzone.dragover {
  border-color: var(--primary);
  background: var(--primary-soft);
}

.page-ocr .dropzone-icon,
.page-ocr .dropzone-text,
.page-ocr .stat-val,
.page-ocr .progress-status,
.page-ocr .job-name,
.page-ocr .ch-title {
  color: var(--text);
}

.page-ocr .dropzone-icon,
.page-ocr .dropzone-text,
.page-ocr .dropzone-hint {
  display: block;
}

.page-ocr .progress-bar-bg {
  background: var(--surface-3);
}

.page-ocr .progress-bar-fill {
  background: var(--primary);
}

.page-ocr .result-preview {
  border: 1px solid var(--border);
  border-radius: 12px;
  background: var(--surface-2);
  color: var(--text);
  font-family: var(--font-body);
  font-size: 0.9375rem;
  line-height: 1.65;
}

.page-ocr .bib-item {
  width: 100%;
  min-height: 52px;
  font: inherit;
  text-align: left;
  border-color: var(--border);
  color: var(--text);
}

.page-ocr .chapter-item {
  width: 100%;
  min-height: 52px;
  font: inherit;
  text-align: left;
}

.page-ocr .bib-item:hover {
  background: var(--surface-2);
}

.page-ocr #copyrightModal,
.page-ocr #chapterModal {
  width: 100vw;
  max-width: none;
  height: 100vh;
  max-height: none;
  margin: 0;
  padding: 0;
  border: 0;
  background: rgba(0, 0, 0, 0.38);
  backdrop-filter: none;
  -webkit-backdrop-filter: none;
}

.page-ocr #copyrightModal[open] {
  display: flex;
  align-items: center;
  justify-content: center;
}

.page-ocr #chapterModal[open] {
  display: block;
}

.page-ocr #copyrightModal::backdrop,
.page-ocr #chapterModal::backdrop {
  background: transparent;
}

.page-ocr #copyrightModal > div,
.page-ocr #chapterModal > div {
  border-color: var(--border);
  background: #ffffff;
  color: var(--text);
  box-shadow: var(--shadow-lg);
}

.page-ocr #copyrightDecline,
.page-ocr #copyrightAccept {
  min-height: 48px;
  border-radius: 999px;
  font-family: var(--font-body);
}

.page-ocr #copyrightDecline {
  border-color: var(--border);
  background: #ffffff;
  color: var(--text);
}

.page-ocr #copyrightAccept {
  background: var(--primary);
  color: #ffffff;
}

/* Liquid Glass enhancement layer
 *
 * The Apple sample groups related glass elements and animates state changes
 * between them. On the web, the equivalent is a restrained shared material,
 * a bright specular edge, and short spring-like transitions. Repeated reading
 * surfaces stay more opaque than navigation and transient controls.
 */

.page-app,
.page-system-admin,
.page-login,
.page-ocr,
.page-landing {
  /* Page field sits a step below the white card surfaces so cards read as
     floating. The previous #f9fbff base was within ~2% luminance of the cards
     on it, so every screen read as one bright sheet. One restrained accent
     wash replaces the former blue + teal + purple stack — three competing hues
     on the base layer is decoration, not hierarchy. */
  background:
    radial-gradient(70rem 38rem at 4% -8%, rgba(0, 113, 227, 0.06), transparent 64%),
    radial-gradient(58rem 36rem at 102% 2%, rgba(0, 113, 227, 0.04), transparent 62%),
    linear-gradient(180deg, #ededf0 0%, #eaeaee 42%, #e8e8ed 100%);
}

.page-landing .hero,
.page-landing .section-light {
  background: rgba(255, 255, 255, 0.24);
}

.page-landing .section-dark,
.page-landing .cta-section {
  background: rgba(241, 246, 253, 0.48);
}

.page-landing .footer {
  background: rgba(255, 255, 255, 0.94);
}

/* Integrated title bars and floating navigation materials. */
.page-app .top-bar,
.page-system-admin .sa-topbar {
  border-color: rgba(255, 255, 255, 0.72);
  background:
    linear-gradient(180deg, rgba(255, 255, 255, 0.82), rgba(244, 248, 255, 0.62));
  box-shadow: inset 0 -1px 0 rgba(62, 77, 103, 0.08), 0 12px 36px rgba(37, 55, 82, 0.07);
  backdrop-filter: saturate(var(--glass-saturation)) blur(var(--glass-blur));
  -webkit-backdrop-filter: saturate(var(--glass-saturation)) blur(var(--glass-blur));
}

.page-landing .nav-header {
  border: 0;
  background: transparent;
  backdrop-filter: none;
  -webkit-backdrop-filter: none;
}

.page-landing .nav-pill,
.page-app .tab-bar,
.page-app .generate-dock,
.page-system-admin .sa-section-nav,
.page-login .login-card,
.page-ocr .mode-options,
.page-landing .nav-mobile-overlay,
.page-ocr #copyrightModal > div,
.page-ocr #chapterModal > div,
:is(
  .modal-surface,
  .modal-card,
  .app-modal-card,
  .inbox-modal-card,
  .sa-modal,
  .sa-action-dialog,
  .toast
) {
  border-color: var(--glass-edge);
  background:
    linear-gradient(145deg, var(--glass-surface-strong), var(--glass-surface-soft));
  box-shadow: var(--glass-shadow);
  backdrop-filter: saturate(var(--glass-saturation)) blur(var(--glass-blur));
  -webkit-backdrop-filter: saturate(var(--glass-saturation)) blur(var(--glass-blur));
}

/* Segmented controls inside a glass parent share that parent's blur plane. */
.page-login .mode-toggle,
.page-system-admin .sa-range {
  border-color: rgba(29, 29, 31, 0.12);
  background: rgba(255, 255, 255, 0.72);
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.92), 0 1px 4px rgba(37, 55, 82, 0.06);
  backdrop-filter: none;
  -webkit-backdrop-filter: none;
}

.page-landing .nav-pill {
  min-height: 58px;
  padding: 0.375rem 0.5625rem 0.375rem 1.0625rem;
  border: 1px solid var(--glass-edge);
  border-radius: 24px;
}

/* Primary content material. These surfaces use a higher white component so
   clinical text and tabular data retain their normal contrast. */
.page-app :is(
  .config-surface,
  .welcome-card,
  .q-card,
  .question-card,
  .bank-card,
  .billing-plan-card,
  .billing-topup-card,
  .rf-card,
  .library-card,
  .exam-surface,
  .status-bar,
  .export-meta-row,
  .generate-dock
),
.page-system-admin :is(
  .sa-kpi,
  .sa-card,
  .sa-tile,
  .sa-sec-check,
  .sa-sec-stat,
  .sa-model-row,
  .sa-job-diagnostic,
  .sa-account-controls
),
.page-landing :is(
  .value-card,
  .step-card,
  .cap-card,
  .stats-card,
  .bib-card,
  .alt-flow-card,
  .price-card,
  .topup-card
),
.page-login :is(.login-card, .plan-card),
.page-ocr :is(
  .card,
  .result-wrap,
  .progress-wrap,
  .cost-banner,
  .stat-box,
  .job-item,
  .chapter-item
),
:is(
  .modal-surface,
  .modal-card,
  .app-modal-card,
  .inbox-modal-card,
  .sa-modal,
  .sa-action-dialog,
  .toast
) {
  border-color: var(--glass-edge);
  background:
    linear-gradient(145deg, rgba(255, 255, 255, 0.96), rgba(248, 251, 255, 0.9));
  background-image:
    linear-gradient(145deg, rgba(255, 255, 255, 0.96), rgba(248, 251, 255, 0.9));
  box-shadow: var(--glass-shadow);
}

.page-app :is(.active-exam-ribbon, .ai-disclaimer, .quota-banner, .generation-limit-notice, .rf-active-banner),
.page-system-admin :is(.sa-alert, .sa-scope-notice),
.page-ocr .engine-badge {
  border-color: rgba(255, 255, 255, 0.78);
  background:
    linear-gradient(145deg, rgba(255, 255, 255, 0.94), rgba(var(--primary-rgb), 0.08));
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.9), 0 8px 24px rgba(37, 55, 82, 0.06);
}

/* Status meaning outranks the generic glass treatment. */
.page-system-admin .sa-alert-ok {
  border-color: rgba(36, 138, 61, 0.3);
  background: var(--success-soft);
}

.page-system-admin .sa-alert-warn {
  border-color: rgba(148, 98, 0, 0.3);
  background: var(--warning-soft);
}

.page-system-admin .sa-alert-crit,
.page-system-admin .sa-danger-notice {
  border-color: rgba(var(--error-rgb), 0.3);
  background: var(--error-soft);
}

.page-system-admin .sa-sec-warn {
  border-color: rgba(var(--warning-rgb), 0.38);
}

.page-system-admin .sa-sec-crit,
.page-system-admin .sa-job-diagnostic-error {
  border-color: rgba(var(--error-rgb), 0.42);
}

/* Nested controls remain quieter than their containing glass surface. */
.page-app :is(.workflow-card, .source-radio, .topic-mode-option, .source-book-picker, .toggle-row, .config-details, .q-opt, .preview-opt),
.page-ocr :is(.dropzone, .file-item, .result-preview, .bib-item),
.page-system-admin .sa-card-head,
.neu-select,
.neu-input,
.neu-textarea,
.page-login input,
.page-ocr input,
.page-ocr select,
.sa-table-toolbar input[type="search"],
.sa-action-dialog input,
.sa-action-dialog textarea {
  border-color: rgba(29, 29, 31, 0.14);
  background: rgba(255, 255, 255, 0.9);
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.92), 0 1px 3px rgba(37, 55, 82, 0.06);
  transition: border-color var(--duration-normal) ease, background-color var(--duration-normal) ease,
    box-shadow var(--duration-normal) ease, transform var(--liquid-duration) var(--liquid-spring);
}

.page-app :is(.workflow-card.workflow-active, .source-radio-active, .billing-plan-card.current),
.page-login .plan-card.selected,
.page-ocr .mode-btn.active {
  border-color: rgba(var(--primary-rgb), 0.48);
  background:
    linear-gradient(145deg, rgba(255, 255, 255, 0.8), rgba(var(--primary-rgb), 0.15));
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.94), 0 10px 28px rgba(var(--primary-rgb), 0.11);
}

/* Glass buttons preserve a physical press response while keeping the primary
   action unmistakably blue. */
.btn,
.mode-btn,
.price-btn,
.btn-bracket,
.btn-filled,
.page-landing .nav-links a,
.page-app .btn-icon,
.page-system-admin .sa-icon-button,
.page-login .password-toggle {
  transition: color var(--duration-normal) ease, border-color var(--duration-normal) ease,
    background-color var(--duration-normal) ease, box-shadow var(--liquid-duration) var(--liquid-spring),
    transform var(--liquid-duration) var(--liquid-spring);
}

.btn:not(:where(.btn-primary, .btn-generate, .login-btn, .btn-danger-subtle, .btn-export-primary, .btn-confirm)),
.mode-btn:not(.active),
.price-btn:not(.featured .price-btn),
.btn-bracket:not(:first-child) {
  border-color: rgba(29, 29, 31, 0.14);
  background:
    linear-gradient(145deg, rgba(255, 255, 255, 0.92), rgba(244, 248, 255, 0.84));
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.94), 0 7px 18px rgba(37, 55, 82, 0.07);
}

.btn-primary,
.btn-generate,
.login-btn,
.btn-export-primary,
.btn-confirm,
.page-ocr .btn-primary,
.page-landing .price-card.featured .price-btn,
.page-landing .btn-filled,
.page-landing .hero-ctas .btn-bracket:first-child,
.page-landing .nav-links .nav-cta {
  border-color: rgba(0, 94, 214, 0.42);
  background: linear-gradient(180deg, #0071e3, #0068d1);
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.42), 0 10px 24px rgba(var(--primary-rgb), 0.24);
}

.page-app .tab-btn,
.page-system-admin .sa-section-nav button,
.page-login .mode-toggle button {
  transition: color var(--duration-normal) ease, background-color var(--duration-normal) ease,
    box-shadow var(--liquid-duration) var(--liquid-spring), transform var(--liquid-duration) var(--liquid-spring);
}

/* Segmented controls have stronger selectors than the shared :where() focus
   rule, so keep their keyboard focus treatment explicit and dependable. */
.page-app .tab-btn:focus-visible,
.page-system-admin .sa-section-nav button:focus-visible,
.page-system-admin .sa-range button:focus-visible,
.page-login .mode-toggle button:focus-visible {
  outline: 3px solid var(--focus-ring);
  outline-offset: 0;
}

.page-app .tab-btn.active,
.page-system-admin .sa-section-nav button[aria-pressed="true"],
.page-system-admin .sa-section-nav button[aria-selected="true"],
.page-login .mode-toggle button.active {
  background: linear-gradient(180deg, #0071e3, #0068d1);
  color: #ffffff;
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.45), 0 7px 18px rgba(var(--primary-rgb), 0.24);
}

@media (hover: hover) and (pointer: fine) {
  .page-landing :is(.value-card, .step-card, .cap-card, .stats-card, .bib-card, .alt-flow-card, .price-card, .topup-card):hover,
  .page-app :is(.workflow-card, .billing-plan-card:not(.current), .billing-topup-card, .source-radio):hover {
    border-color: var(--glass-edge-strong);
    box-shadow: var(--glass-shadow-hover);
    transform: translateY(-3px);
  }

  .btn:not(:disabled):hover,
  .mode-btn:not(:disabled):hover,
  .price-btn:not(:disabled):hover,
  .btn-bracket:not(:disabled):hover,
  .page-app .tab-btn:not(:disabled):hover,
  .page-system-admin .sa-section-nav button:not(:disabled):hover,
  .page-landing .nav-links a:hover {
    transform: translateY(-1px) scale(1.012);
  }
}

:is(.btn, .btn-generate, .login-btn, .mode-btn, .price-btn, .btn-bracket, .btn-filled, .tab-btn):not(:disabled):active {
  transform: scale(0.98);
  transition-duration: 90ms;
}

/* Short, state-linked motion. Nothing loops continuously. */
@keyframes liquid-shell-enter {
  from {
    opacity: 0;
    transform: translateY(14px) scale(0.992);
  }
  to {
    opacity: 1;
    transform: none;
  }
}

@keyframes liquid-panel-enter {
  from {
    opacity: 0;
    transform: translateY(10px) scale(0.996);
  }
  to {
    opacity: 1;
    transform: none;
  }
}

@keyframes liquid-dialog-enter {
  from {
    opacity: 0;
    transform: translateY(12px) scale(0.975);
  }
  to {
    opacity: 1;
    transform: none;
  }
}

@keyframes liquid-toast-enter {
  from {
    opacity: 0;
    transform: translateY(-8px) scale(0.98);
  }
  to {
    opacity: 1;
    transform: none;
  }
}

.page-login .login-container,
.page-ocr .app-wrap,
.page-system-admin :is(#saAuthBlock, #saContent) {
  animation: liquid-shell-enter 680ms var(--liquid-spring) both;
}

.page-app .view.active,
.page-system-admin [data-sa-panel]:not([hidden]) {
  transform-origin: top center;
  animation: liquid-panel-enter var(--liquid-duration) var(--liquid-spring) both;
}

:is(.modal-surface, .modal-card, .app-modal-card, .inbox-modal-card, .sa-modal, .sa-action-dialog[open]),
.page-ocr :is(#copyrightModal[open], #chapterModal[open]) > div {
  transform-origin: var(--modal-origin-x, 50%) var(--modal-origin-y, 50%);
  animation: liquid-dialog-enter 360ms var(--liquid-spring) both;
}

.toast:not(.toast-closing) {
  animation: liquid-toast-enter 360ms var(--liquid-spring) both;
}

.toast.toast-closing {
  animation: toastOut 250ms ease-in forwards;
}

.app-modal-closing .app-modal-card {
  animation: appModalCardOut 150ms ease-in forwards;
}

.toast.toast-error {
  border-color: rgba(var(--error-rgb), 0.5);
}

.toast.toast-warning {
  border-color: rgba(var(--warning-rgb), 0.5);
}

.page-ocr .progress-bar-fill,
.progress-fill,
.usage-bar-fill {
  transition: width 520ms var(--liquid-spring);
}

/* Progressive motion only starts after JavaScript has prepared every target.
   Opacity and transforms keep the work on the compositor. */
@media (prefers-reduced-motion: no-preference) {
  body.page-landing.motion-ready .hero-content > * {
    animation: liquid-shell-enter 640ms var(--liquid-spring) both;
  }

  body.page-landing.motion-ready .hero-content > *:nth-child(2) {
    animation-delay: 60ms;
  }

  body.page-landing.motion-ready .hero-content > *:nth-child(3) {
    animation-delay: 120ms;
  }

  body.page-landing.motion-ready .hero-content > *:nth-child(4) {
    animation-delay: 180ms;
  }

  /* Reveal is a ONE-SHOT animation, never a lingering transition.
     `backwards` fill holds the hidden first frame through the stagger delay and
     then releases, so once the entrance finishes the element returns to its
     natural style and nothing about it survives.
     The previous form parked a 620ms transition AND a 50-250ms transition-delay
     permanently on every revealed element, so each later hover and press on a
     revealed card was silently delayed by up to a quarter second. */
  body.page-landing.motion-ready [data-motion]:not(.is-visible) {
    opacity: 0;
    transform: translate3d(0, 16px, 0);
  }

  body.page-landing.motion-ready [data-motion-stagger]:not(.is-visible) > * {
    opacity: 0;
    transform: translate3d(0, 14px, 0) scale(0.985);
  }

  body.page-landing.motion-ready [data-motion].is-visible,
  body.page-landing.motion-ready [data-motion-stagger].is-visible > * {
    animation: liquid-shell-enter 420ms var(--liquid-spring) backwards;
  }

  body.page-landing.motion-ready [data-motion-stagger].is-visible > *:nth-child(2) {
    animation-delay: 40ms;
  }

  body.page-landing.motion-ready [data-motion-stagger].is-visible > *:nth-child(3) {
    animation-delay: 80ms;
  }

  body.page-landing.motion-ready [data-motion-stagger].is-visible > *:nth-child(4) {
    animation-delay: 120ms;
  }

  body.page-landing.motion-ready [data-motion-stagger].is-visible > *:nth-child(5) {
    animation-delay: 160ms;
  }

  body.page-landing.motion-ready [data-motion-stagger].is-visible > *:nth-child(n + 6) {
    animation-delay: 200ms;
  }
}

/* Material fallbacks preserve contrast and hierarchy when transparency is
   unavailable or the user asks the operating system to reduce it. */
@supports not ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))) {
  .page-app .top-bar,
  .page-app .tab-bar,
  .page-app .generate-dock,
  .page-system-admin .sa-topbar,
  .page-system-admin .sa-section-nav,
  .page-system-admin .sa-range,
  .page-landing .nav-pill,
  .page-landing .nav-mobile-overlay,
  .page-login .mode-toggle,
  .page-login .login-card,
  .page-ocr .mode-options,
  .page-ocr #copyrightModal > div,
  .page-ocr #chapterModal > div,
  :is(.modal-surface, .modal-card, .app-modal-card, .inbox-modal-card, .sa-modal, .sa-action-dialog, .toast) {
    background: #ffffff;
  }
}

/* Responsive behavior and text enlargement */

@media (min-width: 1500px) {
  .page-app #reformatterContent {
    display: grid;
    grid-template-columns: minmax(340px, 0.42fr) minmax(0, 1fr);
    align-items: start;
    gap: 1.25rem;
  }

  .page-app #reformatterContent .rf-overview-card {
    position: sticky;
    top: 150px;
    grid-column: 1;
    grid-row: 1;
    margin-bottom: 0;
  }

  .page-app #reformatterContent .rf-facts {
    grid-template-columns: minmax(0, 1fr);
  }

  .page-app #reformatterContent .rf-compose-card {
    grid-column: 2;
    grid-row: 1;
    margin-bottom: 0;
  }

  .page-app #reformatterContent :is(#rfJobsContainer, #rfJobDetail) {
    grid-column: 1 / -1;
  }

  .page-app #reformatterContent :is(#rfJobsContainer, #rfJobDetail):empty {
    display: none;
  }
}

@media (max-width: 980px) {
  .page-app {
    padding-inline: 1rem;
  }

  .page-app .top-bar {
    margin-inline: calc(50% - 50vw);
    padding-inline: 1rem;
  }

  .page-app .top-bar-actions {
    flex: 1 1 auto;
    min-width: 0;
    max-width: none;
  }

  .page-system-admin .sa-topbar {
    align-items: flex-start;
    flex-wrap: wrap;
  }

  .page-system-admin .sa-section-nav {
    position: relative;
    top: auto;
    width: 100%;
    justify-content: flex-start;
  }

  .page-system-admin .sa-topbar-spacer {
    display: none;
  }

  .page-system-admin .sa-topbar-meta {
    width: 100%;
    overflow-x: auto;
  }

  .page-system-admin .sa-main,
  .page-system-admin .sa-main-security,
  .page-system-admin .sa-bottom {
    grid-template-columns: 1fr;
  }
}

@media (min-width: 761px) and (max-width: 900px) {
  .page-landing .nav-pill {
    padding: 0.375rem 0.5rem 0.375rem 0.875rem;
  }

  .page-landing .nav-brand {
    font-size: 0.9375rem;
  }

  .page-landing .nav-links {
    gap: 0.125rem;
  }

  .page-landing .nav-links a {
    padding: 0.5rem 0.4375rem;
    font-size: 0.75rem;
    white-space: nowrap;
  }

  .page-landing .nav-links .nav-cta {
    padding-inline: 0.75rem;
  }
}

@media (max-width: 760px) {
  html {
    scroll-padding-bottom: calc(var(--space-24) + env(safe-area-inset-bottom));
  }

  body {
    font-size: 1rem;
  }

  .page-app {
    padding: 0 0.75rem 6rem;
  }

  .page-app .top-bar {
    position: relative;
    min-height: 60px;
    margin: 0 calc(50% - 50vw);
    padding: 0.5rem 0.75rem;
  }

  .page-app .brand-tagline {
    display: none;
  }

  .page-app .top-bar-actions {
    flex: 1 1 auto;
    min-width: 0;
    max-width: none;
  }

  .page-app .user-badge .icon,
  .page-app #userUsage,
  .page-app #tokenTicker {
    display: none;
  }

  .page-app .tab-bar {
    position: fixed;
    inset: auto 8px 8px 8px;
    z-index: 1500;
    width: auto;
    max-width: none;
    margin: 0;
    padding: 0.3125rem max(0.3125rem, env(safe-area-inset-right)) calc(0.3125rem + env(safe-area-inset-bottom)) max(0.3125rem, env(safe-area-inset-left));
    justify-content: flex-start;
    border-radius: 18px;
  }

  .page-app .tab-btn {
    flex: 1 0 68px;
    min-width: 68px;
    min-height: 54px;
    padding: 0.3125rem 0.4375rem;
    flex-direction: column;
    gap: 0.125rem;
    font-size: 0.6875rem;
  }

  .page-app .tab-btn .icon {
    font-size: 1.25rem;
  }

  .page-app :is(input, select, textarea, button, [contenteditable="true"], [tabindex]) {
    scroll-margin-bottom: calc(var(--space-24) + env(safe-area-inset-bottom));
  }

  .page-app #returnToTopBtn {
    bottom: calc(84px + env(safe-area-inset-bottom));
    z-index: 1490;
  }

  .page-app .workflow-picker,
  .page-app .source-radio-group,
  .page-app .config-grid,
  .page-app .billing-plans-grid,
  .page-app .billing-topups-grid {
    grid-template-columns: 1fr;
  }

  .page-app .workflow-card {
    min-height: 96px;
  }

  .page-app .config-surface {
    padding: 1.125rem;
    border-radius: 17px;
  }

  .page-app .source-radio {
    min-height: 96px;
  }

  .page-app .generate-dock {
    bottom: auto;
    align-items: stretch;
    flex-direction: column;
  }

  .page-app .generate-dock #generationSummary {
    margin: 0;
  }

  .page-app .generate-dock .btn-generate {
    width: 100%;
  }

  .page-app .export-bar,
  .page-app .view-header-actions,
  .page-app .bank-actions,
  .page-app .admin-row-actions {
    align-items: stretch;
    flex-direction: column;
    width: 100%;
  }

  .page-app .export-bar .btn,
  .page-app .view-header-actions .btn,
  .page-app .bank-actions .btn {
    width: 100%;
  }

  .modal-overlay,
  .app-modal-overlay,
  .inbox-modal-overlay,
  .sa-modal-backdrop {
    padding: 0.75rem;
  }

  .page-system-admin .sa-app {
    padding: 0 0.75rem 3rem;
  }

  .page-system-admin .sa-topbar {
    position: relative;
    margin-inline: -0.75rem;
    padding-inline: 0.75rem;
  }

  .page-system-admin .sa-range {
    order: 3;
    width: 100%;
    overflow-x: auto;
  }

  .page-system-admin .sa-hero {
    grid-template-columns: repeat(2, minmax(0, 1fr));
  }

  .page-system-admin .sa-table-toolbar {
    align-items: stretch;
    flex-direction: column;
  }

  .page-system-admin .sa-card:has(.sa-table) {
    overflow-x: auto;
  }

  .page-system-admin .sa-table {
    min-width: 760px;
  }

  .page-landing .nav-header {
    padding-inline: 0.75rem;
  }

  .page-landing .nav-links {
    display: none;
  }

  .page-landing .nav-hamburger {
    display: flex;
  }

  .page-landing .nav-mobile-overlay {
    background: rgba(245, 245, 247, 0.96);
    backdrop-filter: blur(var(--blur-md));
  }

  .page-landing .nav-mobile-overlay a {
    min-height: 44px;
    color: var(--text);
    font-family: var(--font-body);
    font-size: 1.1875rem;
    font-weight: 600;
    letter-spacing: -0.01em;
    text-transform: none;
  }

  .page-landing .container {
    padding-inline: 1.125rem;
  }

  .page-landing .hero {
    min-height: auto;
    padding: 8.875rem 0 5rem;
  }

  .page-landing .hero h1 {
    font-size: clamp(2.875rem, 14vw, 4.25rem);
  }

  .page-landing .hero-ctas {
    align-items: stretch;
    flex-direction: column;
  }

  .page-landing .section-light,
  .page-landing .section-dark,
  .page-landing .cta-section {
    padding: 4.875rem 0;
  }

  .page-landing .value-cards,
  .page-landing .steps-grid,
  .page-landing .cap-grid,
  .page-landing .stats-grid,
  .page-landing .bib-grid,
  .page-landing .pricing-grid,
  .page-landing .topups-grid,
  .page-landing .ethos-grid {
    grid-template-columns: 1fr;
  }

  .page-login {
    align-items: flex-start;
    padding: 1.5rem 1rem 3rem;
  }

  .page-login .plan-grid {
    grid-template-columns: 1fr;
  }

  .page-ocr {
    padding: 1.25rem 0.75rem 3rem;
  }

  .page-ocr .form-row,
  .page-ocr .result-stats,
  .page-ocr .phase-steps {
    grid-template-columns: 1fr;
  }

  .page-ocr .btn-row {
    align-items: stretch;
    flex-direction: column;
  }

  .page-ocr .btn-row .btn {
    width: 100%;
  }
}

@media (max-width: 520px) {
  .page-app .tab-bar {
    justify-content: flex-start;
    gap: 0.25rem;
    overflow-x: auto;
    overflow-y: hidden;
    padding-inline: 0.5rem;
    scroll-padding-inline: var(--space-2);
    scroll-snap-type: x proximity;
    scrollbar-width: none;
    -webkit-overflow-scrolling: touch;
  }

  .page-app .tab-bar::-webkit-scrollbar {
    display: none;
  }

  .page-app .tab-btn {
    flex: 0 0 auto;
    width: auto;
    min-width: 76px;
    padding-inline: 0.5rem;
    font-size: 0.6875rem;
    line-height: 1.15;
    scroll-snap-align: start;
  }

  .page-app .tab-btn > span:not(.icon):not(.tab-badge) {
    display: block;
    width: auto;
    max-width: none;
    overflow: visible;
    text-align: center;
    white-space: nowrap;
  }
}

@media (max-width: 420px) {
  .page-app .brand-badge {
    font-size: 1rem;
  }

  .page-app .top-bar-actions {
    gap: 0.125rem;
  }

  .page-app .user-badge {
    max-width: 118px;
    overflow: hidden;
  }

  .page-app #userName {
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
  }

  .page-system-admin .sa-hero {
    grid-template-columns: 1fr;
  }

  .page-landing .hero h1 {
    font-size: 2.75rem;
  }

  .page-login .login-card {
    padding: 1.25rem;
  }

  .page-ocr #copyrightModal [style*="display:flex"] {
    flex-direction: column;
  }
}

@media (min-width: 761px) {
  .page-landing .nav-hamburger,
  .page-landing .nav-mobile-overlay {
    display: none;
  }
}

/* Dark appearance follows the operating system. The material uses a deep,
   neutral canvas with brighter glass edges so content remains legible without
   turning every panel into a flat black rectangle. */


:root[data-theme="dark"] body,
:root[data-theme="dark"] .page-app,
:root[data-theme="dark"] .page-system-admin,
:root[data-theme="dark"] .page-login,
:root[data-theme="dark"] .page-ocr,
:root[data-theme="dark"] .page-landing {
  background:
    radial-gradient(70rem 38rem at 4% -8%, rgba(10, 132, 255, 0.2), transparent 64%),
    radial-gradient(58rem 36rem at 102% 2%, rgba(64, 200, 224, 0.12), transparent 62%),
    radial-gradient(52rem 34rem at 72% 84%, rgba(191, 90, 242, 0.1), transparent 66%),
    linear-gradient(180deg, #090b10 0%, #0c0f15 48%, #0a0c11 100%);
}

:root[data-theme="dark"] ::placeholder {
  color: #98989f;
}

:root[data-theme="dark"] :is(.apple-skip-link, .skip-link) {
  border-color: var(--glass-edge-strong);
  background: #20242d;
  color: var(--text);
}

:root[data-theme="dark"] .page-landing :is(.hero, .section-light) {
  border-color: rgba(255, 255, 255, 0.07);
  background: rgba(20, 23, 30, 0.3);
}

:root[data-theme="dark"] .page-landing :is(.section-dark, .cta-section) {
  border-color: rgba(255, 255, 255, 0.07);
  background: rgba(8, 10, 15, 0.5);
}

:root[data-theme="dark"] .page-landing .footer {
  background: rgba(14, 17, 23, 0.94);
}

:root[data-theme="dark"] .page-app .top-bar,
:root[data-theme="dark"] .page-system-admin .sa-topbar {
  border-color: rgba(255, 255, 255, 0.11);
  background: linear-gradient(180deg, rgba(29, 33, 43, 0.88), rgba(15, 18, 24, 0.7));
  box-shadow: inset 0 -1px 0 rgba(255, 255, 255, 0.06), 0 14px 40px rgba(0, 0, 0, 0.28);
}

:root[data-theme="dark"] :is(
  .page-landing .nav-pill,
  .page-app .tab-bar,
  .page-app .generate-dock,
  .page-system-admin .sa-section-nav,
  .page-login .login-card,
  .page-ocr .mode-options,
  .page-landing .nav-mobile-overlay,
  .page-ocr #copyrightModal > div,
  .page-ocr #chapterModal > div,
  .modal-surface,
  .modal-card,
  .app-modal-card,
  .inbox-modal-card,
  .sa-modal,
  .sa-action-dialog,
  .toast
) {
  border-color: var(--glass-edge);
  background: linear-gradient(145deg, var(--glass-surface-strong), var(--glass-surface-soft));
  background-image: linear-gradient(145deg, var(--glass-surface-strong), var(--glass-surface-soft));
  box-shadow: var(--glass-shadow);
}

:root[data-theme="dark"] :is(.page-login .mode-toggle, .page-system-admin .sa-range) {
  border-color: var(--border);
  background: rgba(10, 12, 17, 0.62);
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.07), 0 1px 5px rgba(0, 0, 0, 0.28);
}

:root[data-theme="dark"] .page-app :is(
  .config-surface,
  .welcome-card,
  .q-card,
  .question-card,
  .bank-card,
  .billing-plan-card,
  .billing-topup-card,
  .rf-card,
  .library-card,
  .exam-surface,
  .status-bar,
  .export-meta-row,
  .generate-dock
),
:root[data-theme="dark"] .page-system-admin :is(
  .sa-kpi,
  .sa-card,
  .sa-tile,
  .sa-sec-check,
  .sa-sec-stat,
  .sa-model-row,
  .sa-job-diagnostic,
  .sa-account-controls
),
:root[data-theme="dark"] .page-landing :is(
  .value-card,
  .step-card,
  .cap-card,
  .stats-card,
  .bib-card,
  .alt-flow-card,
  .price-card,
  .topup-card
),
:root[data-theme="dark"] .page-login :is(.login-card, .plan-card),
:root[data-theme="dark"] .page-ocr :is(
  .card,
  .result-wrap,
  .progress-wrap,
  .cost-banner,
  .stat-box,
  .job-item,
  .chapter-item
),
:root[data-theme="dark"] :is(
  .modal-surface,
  .modal-card,
  .app-modal-card,
  .inbox-modal-card,
  .sa-modal,
  .sa-action-dialog,
  .toast
) {
  border-color: var(--glass-edge);
  background: linear-gradient(145deg, rgba(32, 36, 46, 0.96), rgba(18, 21, 28, 0.92));
  background-image: linear-gradient(145deg, rgba(32, 36, 46, 0.96), rgba(18, 21, 28, 0.92));
  color: var(--text);
  box-shadow: var(--glass-shadow);
}

:root[data-theme="dark"] .page-app :is(.active-exam-ribbon, .ai-disclaimer, .quota-banner, .generation-limit-notice, .rf-active-banner),
:root[data-theme="dark"] .page-system-admin :is(.sa-alert, .sa-scope-notice),
:root[data-theme="dark"] .page-ocr .engine-badge {
  border-color: rgba(255, 255, 255, 0.14);
  background: linear-gradient(145deg, rgba(31, 35, 45, 0.94), rgba(var(--primary-rgb), 0.14));
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.12), 0 9px 26px rgba(0, 0, 0, 0.24);
}

:root[data-theme="dark"] .page-app :is(.workflow-card, .source-radio, .topic-mode-option, .source-book-picker, .toggle-row, .config-details, .q-opt, .preview-opt),
:root[data-theme="dark"] .page-ocr :is(.dropzone, .file-item, .result-preview, .bib-item),
:root[data-theme="dark"] .page-system-admin .sa-card-head,
:root[data-theme="dark"] :is(
  .neu-select,
  .neu-input,
  .neu-textarea,
  .page-login input,
  .page-ocr input,
  .page-ocr select,
  .sa-table-toolbar input[type="search"],
  .sa-action-dialog input,
  .sa-action-dialog textarea
) {
  border-color: var(--border);
  background: rgba(10, 12, 17, 0.68);
  color: var(--text);
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.06), 0 1px 4px rgba(0, 0, 0, 0.28);
}

:root[data-theme="dark"] .page-app :is(.workflow-card.workflow-active, .source-radio-active, .billing-plan-card.current),
:root[data-theme="dark"] .page-login .plan-card.selected,
:root[data-theme="dark"] .page-ocr .mode-btn.active {
  border-color: rgba(var(--primary-rgb), 0.58);
  background: linear-gradient(145deg, rgba(32, 36, 46, 0.92), rgba(var(--primary-rgb), 0.2));
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.14), 0 11px 30px rgba(0, 0, 0, 0.28);
}

:root[data-theme="dark"] .btn:not(:where(.btn-primary, .btn-generate, .login-btn, .btn-danger-subtle, .btn-export-primary, .btn-confirm)),
:root[data-theme="dark"] .mode-btn:not(.active),
:root[data-theme="dark"] .price-btn:not(.featured .price-btn),
:root[data-theme="dark"] .btn-bracket:not(:first-child),
:root[data-theme="dark"] .page-ocr #copyrightDecline {
  border-color: var(--border);
  background: linear-gradient(145deg, rgba(39, 44, 55, 0.94), rgba(23, 26, 34, 0.9));
  color: var(--text);
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.12), 0 8px 20px rgba(0, 0, 0, 0.25);
}

:root[data-theme="dark"] :is(
  .btn-primary,
  .btn-generate,
  .login-btn,
  .btn-export-primary,
  .btn-confirm,
  .page-ocr .btn-primary,
  .page-landing .price-card.featured .price-btn,
  .page-landing .btn-filled,
  .page-landing .hero-ctas .btn-bracket:first-child,
  .page-landing .nav-links .nav-cta
) {
  border-color: rgba(100, 210, 255, 0.34);
  background: linear-gradient(180deg, #0077ed, #0066cc);
  color: #ffffff;
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.28), 0 11px 27px rgba(0, 83, 182, 0.38);
}

:root[data-theme="dark"] .page-app .tab-btn.active,
:root[data-theme="dark"] .page-system-admin .sa-section-nav button[aria-pressed="true"],
:root[data-theme="dark"] .page-system-admin .sa-section-nav button[aria-selected="true"],
:root[data-theme="dark"] .page-login .mode-toggle button.active {
  background: linear-gradient(180deg, #0077ed, #0066cc);
  color: #ffffff;
}

:root[data-theme="dark"] .page-system-admin :is(.sa-range button.sa-range-active, .sa-filter-pill.sa-filter-active) {
  background: #343a46;
  color: var(--text);
  box-shadow: 0 1px 5px rgba(0, 0, 0, 0.42);
}

:root[data-theme="dark"] .page-app :is(.active-exam-badge, .empty, .skeleton-card),
:root[data-theme="dark"] .page-app :where(.billing-table, .admin-table, table) td {
  border-color: var(--border);
  background: #171a22;
  color: var(--text);
}

:root[data-theme="dark"] .page-app .source-radio:not(.source-radio-active):hover {
  background: #222731;
}

:root[data-theme="dark"] .page-app .source-radio-dot {
  background: #171a22;
}

:root[data-theme="dark"] .page-app .source-radio-active .source-radio-dot {
  background: var(--primary);
  box-shadow: inset 0 0 0 4px #171a22;
}

:root[data-theme="dark"] :is(.modal-overlay, .app-modal-overlay, .inbox-modal-overlay, .sa-modal-backdrop) {
  background: rgba(0, 0, 0, 0.64);
}

@media (prefers-reduced-transparency: reduce) {
  :root {
    --glass-surface: #ffffff;
    --glass-surface-strong: #ffffff;
    --glass-surface-soft: #ffffff;
  }

  .page-app,
  .page-system-admin,
  .page-login,
  .page-ocr,
  .page-landing {
    background: #f5f5f7;
  }

  .page-app *,
  .page-system-admin *,
  .page-login *,
  .page-ocr *,
  .page-landing * {
    backdrop-filter: none;
    -webkit-backdrop-filter: none;
  }

  .page-system-admin .sa-action-dialog::backdrop {
    backdrop-filter: none;
    -webkit-backdrop-filter: none;
  }

  .page-app :is(
    .top-bar, .tab-bar, .generate-dock, .config-surface, .welcome-card,
    .q-card, .question-card, .bank-card, .billing-plan-card,
    .billing-topup-card, .rf-card, .library-card, .exam-surface
  ),
  .page-system-admin :is(
    .sa-topbar, .sa-section-nav, .sa-range, .sa-kpi, .sa-card, .sa-tile,
    .sa-sec-check, .sa-sec-stat, .sa-model-row, .sa-job-diagnostic
  ),
  .page-landing :is(
    .nav-pill, .nav-mobile-overlay, .value-card, .step-card, .cap-card,
    .stats-card, .bib-card, .alt-flow-card, .price-card, .topup-card, .footer
  ),
  .page-login :is(.mode-toggle, .login-card, .plan-card),
  .page-ocr :is(.mode-options, .card, .result-wrap, .progress-wrap, .cost-banner, .stat-box, .job-item, .chapter-item),
  :is(.modal-surface, .modal-card, .app-modal-card, .inbox-modal-card, .sa-modal, .sa-action-dialog, .toast) {
    background: #ffffff;
    background-image: none;
  }

  .page-landing :is(.hero, .section-light, .section-dark, .cta-section) {
    background: #f5f5f7;
  }

  :root[data-theme="dark"] {
    --glass-surface: #171a22;
    --glass-surface-strong: #1c2029;
    --glass-surface-soft: #171a22;
  }

  :root[data-theme="dark"] :is(
    .page-app,
    .page-system-admin,
    .page-login,
    .page-ocr,
    .page-landing,
    .page-landing .hero,
    .page-landing .section-light,
    .page-landing .section-dark,
    .page-landing .cta-section
  ) {
    background: #090b10;
  }

  :root[data-theme="dark"] .page-app :is(
    .top-bar, .tab-bar, .generate-dock, .config-surface, .welcome-card,
    .q-card, .question-card, .bank-card, .billing-plan-card,
    .billing-topup-card, .rf-card, .library-card, .exam-surface
  ),
  :root[data-theme="dark"] .page-system-admin :is(
    .sa-topbar, .sa-section-nav, .sa-range, .sa-kpi, .sa-card, .sa-tile,
    .sa-sec-check, .sa-sec-stat, .sa-model-row, .sa-job-diagnostic
  ),
  :root[data-theme="dark"] .page-landing :is(
    .nav-pill, .nav-mobile-overlay, .value-card, .step-card, .cap-card,
    .stats-card, .bib-card, .alt-flow-card, .price-card, .topup-card, .footer
  ),
  :root[data-theme="dark"] .page-login :is(.mode-toggle, .login-card, .plan-card),
  :root[data-theme="dark"] .page-ocr :is(.mode-options, .card, .result-wrap, .progress-wrap, .cost-banner, .stat-box, .job-item, .chapter-item),
  :root[data-theme="dark"] :is(.modal-surface, .modal-card, .app-modal-card, .inbox-modal-card, .sa-modal, .sa-action-dialog, .toast) {
    background: #171a22;
    background-image: none;
  }
}

@media (prefers-contrast: more) {
  :root {
    --glass-edge: rgba(0, 0, 0, 0.34);
    --glass-edge-strong: rgba(0, 0, 0, 0.5);
  }

  .page-app *,
  .page-system-admin *,
  .page-login *,
  .page-ocr *,
  .page-landing * {
    backdrop-filter: none;
    -webkit-backdrop-filter: none;
  }

  .page-system-admin .sa-action-dialog::backdrop {
    backdrop-filter: none;
    -webkit-backdrop-filter: none;
  }

  .page-app :is(.workflow-card, .source-radio, .topic-mode-option, .source-book-picker, .toggle-row, .config-details, .q-opt, .preview-opt),
  .page-ocr :is(.dropzone, .file-item, .result-preview, .bib-item),
  .neu-select,
  .neu-input,
  .neu-textarea,
  .page-login input,
  .page-ocr input,
  .page-ocr select,
  .sa-table-toolbar input[type="search"],
  .sa-action-dialog input,
  .sa-action-dialog textarea,
  .btn:not(:where(.btn-primary, .btn-generate, .login-btn, .btn-danger-subtle, .btn-export-primary, .btn-confirm)),
  .mode-btn:not(.active),
  .price-card:not(.featured) .price-btn,
  .btn-bracket:not(:first-child) {
    border-color: rgba(0, 0, 0, 0.48);
  }

  .page-app :is(.top-bar, .tab-bar, .generate-dock, .config-surface),
  .page-system-admin :is(.sa-topbar, .sa-section-nav, .sa-card, .sa-kpi),
  .page-landing :is(.nav-pill, .value-card, .price-card),
  .page-login :is(.mode-toggle, .login-card),
  .page-ocr :is(.mode-options, .card),
  :is(.modal-surface, .modal-card, .app-modal-card, .inbox-modal-card, .sa-modal, .sa-action-dialog, .toast) {
    border-color: var(--glass-edge);
    background: #ffffff;
    background-image: none;
  }

  :root[data-theme="dark"] {
    --glass-edge: rgba(255, 255, 255, 0.42);
    --glass-edge-strong: rgba(255, 255, 255, 0.62);
  }

  :root[data-theme="dark"] .page-app :is(.workflow-card, .source-radio, .topic-mode-option, .source-book-picker, .toggle-row, .config-details, .q-opt, .preview-opt),
  :root[data-theme="dark"] .page-ocr :is(.dropzone, .file-item, .result-preview, .bib-item),
  :root[data-theme="dark"] :is(
    .neu-select,
    .neu-input,
    .neu-textarea,
    .page-login input,
    .page-ocr input,
    .page-ocr select,
    .sa-table-toolbar input[type="search"],
    .sa-action-dialog input,
    .sa-action-dialog textarea
  ) {
    border-color: rgba(255, 255, 255, 0.52);
  }

  :root[data-theme="dark"] .page-app :is(.top-bar, .tab-bar, .generate-dock, .config-surface),
  :root[data-theme="dark"] .page-system-admin :is(.sa-topbar, .sa-section-nav, .sa-card, .sa-kpi),
  :root[data-theme="dark"] .page-landing :is(.nav-pill, .value-card, .price-card),
  :root[data-theme="dark"] .page-login :is(.mode-toggle, .login-card),
  :root[data-theme="dark"] .page-ocr :is(.mode-options, .card),
  :root[data-theme="dark"] :is(.modal-surface, .modal-card, .app-modal-card, .inbox-modal-card, .sa-modal, .sa-action-dialog, .toast) {
    border-color: var(--glass-edge);
    background: #171a22;
    background-image: none;
  }
}



@media (forced-colors: active) {
  .page-app *,
  .page-system-admin *,
  .page-login *,
  .page-ocr *,
  .page-landing * {
    background-image: none;
    box-shadow: none;
    backdrop-filter: none;
    -webkit-backdrop-filter: none;
  }

  .page-system-admin .sa-action-dialog::backdrop {
    backdrop-filter: none;
    -webkit-backdrop-filter: none;
  }

  :where(button, a, input, select, textarea, summary):focus-visible {
    outline: 3px solid CanvasText;
  }

  .page-app .tab-btn:focus-visible,
  .page-system-admin .sa-section-nav button:focus-visible,
  .page-system-admin .sa-range button:focus-visible,
  .page-login .mode-toggle button:focus-visible {
    outline: 3px solid CanvasText;
    outline-offset: 0;
  }

  .page-app .tab-btn.active,
  .page-system-admin .sa-section-nav button[aria-pressed="true"],
  .page-system-admin .sa-section-nav button[aria-selected="true"],
  .page-login .mode-toggle button.active,
  .page-app .workflow-card[aria-pressed="true"],
  .page-app .source-radio-active,
  .page-app .billing-plan-card.current,
  .page-app .btn[aria-pressed="true"],
  .page-login .plan-card[aria-pressed="true"],
  .page-ocr .mode-btn[aria-pressed="true"],
  .page-system-admin .sa-range button[aria-pressed="true"],
  .page-system-admin .sa-filter-pill[aria-pressed="true"],
  .btn-primary,
  .btn-generate,
  .login-btn {
    border: 2px solid Highlight;
    background: Highlight;
    color: HighlightText;
  }

  .page-app,
  .page-system-admin,
  .page-login,
  .page-ocr,
  .page-landing,
  .page-landing :is(.hero, .section-light, .section-dark, .cta-section, .footer) {
    background: Canvas;
    background-image: none;
    box-shadow: none;
  }

  .page-app :is(
    .top-bar, .tab-bar, .generate-dock, .config-surface, .welcome-card,
    .q-card, .question-card, .bank-card, .billing-plan-card,
    .billing-topup-card, .rf-card, .library-card, .exam-surface,
    .status-bar, .export-meta-row, .active-exam-ribbon, .ai-disclaimer,
    .quota-banner, .generation-limit-notice, .rf-active-banner
  ),
  .page-system-admin :is(
    .sa-topbar, .sa-section-nav, .sa-range, .sa-kpi, .sa-card, .sa-tile,
    .sa-sec-check, .sa-sec-stat, .sa-model-row, .sa-job-diagnostic,
    .sa-account-controls, .sa-alert, .sa-scope-notice
  ),
  .page-landing :is(
    .nav-pill, .nav-mobile-overlay, .value-card, .step-card, .cap-card,
    .stats-card, .bib-card, .alt-flow-card, .price-card, .topup-card
  ),
  .page-login :is(.login-card, .mode-toggle, .plan-card),
  .page-ocr :is(
    .mode-options, .card, .result-wrap, .progress-wrap, .cost-banner,
    .stat-box, .job-item, .chapter-item, .engine-badge
  ),
  .page-ocr #copyrightModal > div,
  .page-ocr #chapterModal > div,
  :is(.modal-surface, .modal-card, .app-modal-card, .inbox-modal-card, .sa-modal, .sa-action-dialog, .toast) {
    border-color: CanvasText;
    background: Canvas;
    background-image: none;
    box-shadow: none;
    color: CanvasText;
  }

  .neu-select {
    appearance: auto;
    -webkit-appearance: menulist;
    background-image: none;
  }
}

@media print {
  .top-bar,
  .tab-bar,
  .generate-dock,
  .nav-header,
  .nav-mobile-overlay,
  .toast-container,
  .btn,
  button {
    display: none;
  }

  body,
  .page-app,
  .page-system-admin,
  .page-ocr,
  .page-login,
  .page-landing {
    padding: 0;
    background: #ffffff;
    color: #000000;
  }

  .page-app *,
  .page-system-admin *,
  .page-login *,
  .page-ocr *,
  .page-landing * {
    background-image: none;
    box-shadow: none;
    backdrop-filter: none;
    -webkit-backdrop-filter: none;
  }

  .page-app :is(
    .top-bar, .tab-bar, .generate-dock, .config-surface, .welcome-card,
    .q-card, .question-card, .bank-card, .billing-plan-card,
    .billing-topup-card, .rf-card, .library-card, .exam-surface,
    .status-bar, .export-meta-row, .active-exam-ribbon, .ai-disclaimer,
    .quota-banner, .generation-limit-notice, .rf-active-banner
  ),
  .page-system-admin :is(
    .sa-topbar, .sa-section-nav, .sa-range, .sa-kpi, .sa-card, .sa-tile,
    .sa-sec-check, .sa-sec-stat, .sa-model-row, .sa-job-diagnostic,
    .sa-account-controls, .sa-alert, .sa-scope-notice
  ),
  .page-landing :is(
    .nav-pill, .nav-mobile-overlay, .value-card, .step-card, .cap-card,
    .stats-card, .bib-card, .alt-flow-card, .price-card, .topup-card, .footer
  ),
  .page-login :is(.login-card, .mode-toggle, .plan-card),
  .page-ocr :is(
    .mode-options, .card, .result-wrap, .progress-wrap, .cost-banner,
    .stat-box, .job-item, .chapter-item, .engine-badge
  ),
  .page-ocr #copyrightModal > div,
  .page-ocr #chapterModal > div,
  :is(.modal-surface, .modal-card, .app-modal-card, .inbox-modal-card, .sa-modal, .sa-action-dialog, .toast) {
    background: #ffffff;
    background-image: none;
    box-shadow: none;
  }

  .page-system-admin .sa-action-dialog::backdrop {
    backdrop-filter: none;
    -webkit-backdrop-filter: none;
  }

  .page-landing [data-motion],
  .page-landing [data-motion-stagger],
  .page-landing [data-motion-stagger] > * {
    opacity: 1;
    transform: none;
    animation: none;
    transition: none;
  }
}


/* App shell rules. */

/* ═══════════════════════════════════════════════════════════════════════
   T.H.O.M.A.S. — "Lavanda clínica" (THOMAS Facelift App.dc.html)
   ─────────────────────────────────────────────────────────────────────
   Part of the shared interface system. Two jobs:
     (1) re-point every design token to the design file's exact lavender
         palettes (light + dark) and swap in the three brand fonts, so the
         existing component rules inherit the new look;
     (2) lay out the design's shell — 272px left sidebar (profile · nav ·
         USO MENSUAL card · account) + content column with per-view
         in-content headers. The old full-bleed top bar is gone from the
         template, so nothing here fights the earlier 100vw header rules.
   Uses stronger selectors only where the consolidated cascade requires them.
   Every load-bearing DOM id and the .tab-btn/.view mechanisms are intact.
   ═══════════════════════════════════════════════════════════════════════ */

/* ── 1. Brand fonts + shared design constants ─────────────────────────── */


/* ── 2. Light palette (design [data-theme="light"]) ───────────────────── */


/* ── 3. Dark palette (design [data-theme="dark"]) ─────────────────────── */


/* ── 4. Typography ────────────────────────────────────────────────────── */
.page-app body,
.page-app { font-family: var(--font-body); }
.page-app h1, .page-app h2,
.page-app .view-header-title h2,
.page-app .config-hero-title,
.page-app .rf-overview-title {
  font-family: var(--font-display);
  letter-spacing: -0.01em;
}

/* Page head (design: h2 800 26px Bricolage + 13px subtitle) */
.page-app .page-head { margin-bottom: 1.125rem; }
.page-app .page-head h2 {
  font: 800 1.625rem/1 var(--font-display);
  letter-spacing: -0.01em;
  color: var(--text);
  margin: 0;
}
.page-app .page-head p {
  font-size: 0.8125rem;
  color: var(--text-tertiary);
  margin: 0.375rem 0 0;
}

/* ═══════════════════════════════════════════════════════════════════════
   5. SHELL LAYOUT — sidebar + content column (desktop ≥ 761px)
   Boundary matches the shared bottom-dock band (≤760px) exactly, so
   every width gets either the sidebar grid or the dock — no orphan band.
   ═══════════════════════════════════════════════════════════════════════ */
@media (min-width: 761px) {
  .page-app { padding: 0; }
  .page-app #app.app-shell {
    display: grid;
    grid-template-columns: var(--sidebar-w) minmax(0, 1fr);
    align-items: stretch;
    width: 100%;
    max-width: none;
    margin: 0;
    min-height: 100vh;
  }

  /* ── Sidebar — floating rounded panel, pinned to the viewport ──
     position: fixed (not sticky) so it can never move with scroll,
     regardless of any ancestor overflow behavior. The grid's first column
     stays as the 272px spacer; .app-main is pinned to column 2. */
  .page-app .app-sidebar {
    position: fixed;
    top: 14px;
    left: 14px;
    bottom: 14px;
    width: calc(var(--sidebar-w) - 14px);
    display: flex;
    flex-direction: column;
    gap: 0.3125rem;
    padding: 1.375rem 1rem;
    background: var(--lv-sidebar);
    border: 1px solid var(--border);
    border-radius: 22px;
    box-shadow: var(--shadow-md);
    overflow-y: auto;
    z-index: 60;
  }
  .page-app .app-main { grid-column: 2; }

  /* Profile (design: 42px gradient avatar + name 700 14px + role 11px) */
  .page-app .sidebar-profile { flex: none; }
  .page-app .sidebar-profile .user-badge {
    display: grid;
    grid-template-columns: 42px minmax(0, 1fr);
    grid-template-rows: auto auto;
    column-gap: 0.6875rem;
    row-gap: 0;
    align-items: center;
    width: 100%;
    max-width: none;
    height: auto;
    min-height: 0;
    padding: 0.375rem 0.5rem 1.125rem;
    background: none;
    border: none;
    box-shadow: none;
    overflow: visible;
  }
  .page-app .user-avatar {
    grid-column: 1;
    grid-row: 1 / 3;
    width: 42px;
    height: 42px;
    border-radius: 50%;
    background: linear-gradient(135deg, var(--primary-hover), var(--primary));
    color: #fff;
    display: flex;
    align-items: center;
    justify-content: center;
    font: 700 0.9375rem var(--font-body);
    letter-spacing: 0.02em;
  }
  .page-app .sidebar-profile #userName {
    grid-column: 2;
    grid-row: 1;
    font: 700 var(--text-body-sm) var(--font-body);
    color: var(--text);
    min-width: 0;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
  }
  .page-app .sidebar-profile .user-role {
    grid-column: 2;
    grid-row: 2;
    font-size: 0.6875rem;
    color: var(--text-tertiary);
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
  }

  /* Nav rail — the tab-bar reflowed vertically (design: 12px 13px pads,
     13px radius, hover primary-soft, active primary-active + 600) */
  .page-app .app-sidebar .tab-bar {
    position: static;
    display: flex;
    flex-direction: column;
    align-items: stretch;
    justify-content: flex-start;
    gap: 0.3125rem;
    width: 100%;
    max-width: none;
    margin: 0;
    padding: 0;
    background: none;
    border: none;
    border-radius: 0;
    box-shadow: none;
    overflow: visible;
    backdrop-filter: none;
    -webkit-backdrop-filter: none;
  }
  .page-app .app-sidebar .tab-btn {
    justify-content: flex-start;
    width: 100%;
    min-width: 0;
    gap: 0.75rem;
    padding: 0.75rem 0.8125rem;
    border: none;
    border-radius: 13px;
    background: transparent;
    box-shadow: none;
    font-family: var(--font-body);
    font-size: 0.84375rem;
    font-weight: 500;
    color: var(--text-secondary);
    text-align: left;
  }
  .page-app .app-sidebar .tab-btn .icon { font-size: 1.3125rem; }
  .page-app .app-sidebar .tab-btn:hover {
    background: var(--primary-soft);
    color: var(--text-secondary);
  }
  .page-app .app-sidebar .tab-btn.active,
  :root[data-theme="dark"] .page-app .app-sidebar .tab-btn.active,
  :root[data-theme="light"] .page-app .app-sidebar .tab-btn.active {
    background: var(--lv-primary-active-bg);
    color: var(--lv-active-text);
    font-weight: 600;
  }

  /* USO MENSUAL card (design: surface card, 14px radius, 7px bar) */
  .page-app .usage-card {
    margin-top: auto;
    flex: none;
    background: var(--surface);
    border: 1px solid var(--border);
    border-radius: 14px;
    padding: 0.8125rem 0.875rem;
    display: flex;
    flex-direction: column;
    gap: 0.5rem;
  }
  .page-app .usage-card-head {
    display: flex;
    justify-content: space-between;
    align-items: center;
  }
  .page-app .usage-card-label {
    display: flex;
    align-items: center;
    gap: 0.4375rem;
    font: 600 var(--text-xs) var(--font-mono);
    letter-spacing: 0.03125em;
    color: var(--primary);
  }
  .page-app .usage-card-label .icon { font-size: 0.9375rem; }
  .page-app .usage-card-nums {
    font: 600 var(--text-xs) var(--font-mono);
    color: var(--text-secondary);
  }
  .page-app .usage-bar {
    height: 7px;
    border-radius: 100px;
    background: var(--surface-2);
    overflow: hidden;
  }
  .page-app .usage-bar-fill {
    width: 0;
    height: 100%;
    background: var(--lv-solid-grad);
    border-radius: 100px;
    transition: width 400ms ease;
  }
  .page-app .usage-card #userUsage {
    font-size: 0.65625rem;
    font-family: var(--font-body);
    color: var(--text-tertiary);
    opacity: 1;
  }
  .page-app .usage-card #tokenTicker {
    margin-left: 0;
    align-self: flex-start;
  }

  /* Account row (design: Cerrar sesión in danger + help circle) */
  .page-app .sidebar-foot {
    flex: none;
    display: flex;
    align-items: center;
    gap: 0.5rem;
    padding: 0.75rem 0.5rem 0.125rem;
  }
  .page-app .sidebar-foot .sidebar-logout {
    display: inline-flex;
    align-items: center;
    gap: 0.5625rem;
    border: none;
    background: none;
    box-shadow: none;
    padding: 0.25rem 0;
    width: auto;
    height: auto;
    min-height: var(--control-height);
    font: 600 var(--text-label) var(--font-body);
    color: var(--error);
    opacity: 1;
    cursor: pointer;
  }
  .page-app .sidebar-foot .sidebar-logout .icon { font-size: var(--text-title-sm); }
  .page-app .sidebar-foot .inbox-btn { margin-left: auto; }
  .page-app .sidebar-help {
    width: 28px;
    height: 28px;
    flex: none;
    border-radius: 50%;
    border: 1px solid var(--border-strong);
    display: inline-flex;
    align-items: center;
    justify-content: center;
    color: var(--text-tertiary);
    font-size: 0.8125rem;
    text-decoration: none;
  }
  .page-app .sidebar-help:hover { color: var(--text); border-color: var(--text-tertiary); }

  /* ── Content column (design main: 28px 34px 40px padding) ── */
  .page-app .app-main {
    min-width: 0;
    padding: 1.375rem 2.125rem 3rem;
  }
  .page-app .content-actions {
    display: flex;
    justify-content: flex-end;
    align-items: center;
    flex-wrap: wrap;
    gap: 0.625rem;
    margin-bottom: 1rem;
  }
  .page-app .content-actions .top-bar-exports {
    flex: 0 1 auto;
    flex-wrap: wrap;
    justify-content: flex-end;
    max-width: 100%;
  }
}

/* Theme toggle (design: 40px circle, surface bg) — all widths */
.page-app .theme-toggle {
  width: var(--control-height);
  height: var(--control-height);
  flex: none;
  border: 1px solid var(--border);
  border-radius: 50%;
  background: var(--surface);
  color: var(--text);
  display: inline-flex;
  align-items: center;
  justify-content: center;
  cursor: pointer;
}
.page-app .theme-toggle .icon { font-size: var(--text-title-sm); }
.page-app .theme-toggle:hover { border-color: var(--border-strong); }

/* ── 6. Component polish (both themes, all widths) ────────────────────── */

/* Cards → 18px radius + design card shadow */
.page-app .config-surface,
.page-app .q-card,
.page-app .data-card,
.page-app .lib-card,
.page-app .workflow-card,
.page-app .rf-overview-card,
.page-app .rf-compose-card,
.page-app .exam-surface,
.page-app .welcome-card {
  border-radius: var(--radius-lg);
}

/* Workflow cards — design geometry: surface card, 1.5px border, 16px
   radius; selection is a violet ring + glow ONLY. No left accent bar
   (styles.css ::before), no solid-violet icon chip (the earlier active
   state painted the glyph violet-on-violet). */
.page-app .workflow-card {
  background: var(--surface);
  border: 1.5px solid var(--border);
  border-radius: 16px;
  box-shadow: none;
}
.page-app .workflow-card::before { content: none; }
.page-app .workflow-card[aria-pressed="true"],
.page-app .workflow-card.workflow-active {
  background: var(--surface);
  border: 1.5px solid var(--primary);
  box-shadow: 0 6px 18px rgba(0, 113, 227, 0.16);
}
/* Icon chip: 38px, 11px radius, soft surface with a VISIBLE muted glyph —
   identical in both states (design .wfic). */
:root[data-theme="dark"] .page-app .workflow-card .workflow-icon,
.page-app .workflow-card .workflow-icon,
.page-app .workflow-card.workflow-active .workflow-icon {
  width: 38px;
  height: 38px;
  border-radius: 11px;
  background: var(--surface-2);
  color: var(--text-tertiary);
}
:root[data-theme="dark"] .page-app .workflow-card .workflow-icon .icon,
.page-app .workflow-card .workflow-icon .icon,
.page-app .workflow-card.workflow-active .workflow-icon .icon {
  font-size: 1.375rem;
  color: var(--text-tertiary);
}

/* Exports live inside Resultados as the design's pill row (#exportBtn2 /
   #exportZipGradeBtn2 already render there). The legacy top-bar duplicate
   stays in the DOM — js/results.js and js/bank.js toggle it by id — but
   never shows. */
.page-app #exportBtnWrap { display: none; }

/* ── Nav icons: the design project's custom icon set ──────────────────────
   Recreated as inline SVG masks (traced from the uploaded icon files) so
   they tint with currentColor in every theme and state. font-size: 0 mutes
   the Material ligature text; the mask paints the glyph instead. */
.page-app .tab-bar .tab-btn .icon {
  font-size: 0;
  width: 21px;
  height: 21px;
  flex: 0 0 21px;
  display: inline-block;
  background-color: currentColor;
  -webkit-mask: var(--lv-nav-icon) center / contain no-repeat;
  mask: var(--lv-nav-icon) center / contain no-repeat;
}
/* Crear: pencil breaking out of a circle */
.page-app #tab-config .icon {
  --lv-nav-icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M20.4 9A9.6 9.6 0 1 1 12 2.4'/%3E%3Cpath d='M8.6 15.4 7.8 19.4 11.8 18.6 19.4 11 16.2 7.8z'/%3E%3Cpath d='M14 10l3.2 3.2'/%3E%3C/svg%3E");
}
/* Resultados: document with a check badge */
.page-app #tab-results .icon {
  --lv-nav-icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M18 10V8l-5-5H5v18h7'/%3E%3Cpath d='M13 3v5h5'/%3E%3Cpath d='M8 8h2M8 12h5M8 16h3'/%3E%3Ccircle cx='16.8' cy='16.8' r='4.2'/%3E%3Cpath d='M15 16.9l1.3 1.3 2.3-2.4'/%3E%3C/svg%3E");
}
/* Mi banco: reviewed checklist with magnifier check */
.page-app #tab-bank .icon {
  --lv-nav-icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M16 9V3H4v16h6'/%3E%3Cpath d='M6.6 6.6l1 1 1.8-1.9'/%3E%3Cpath d='M6.8 10.8l1.8 1.8M8.6 10.8l-1.8 1.8'/%3E%3Ccircle cx='7.6' cy='15.6' r='0.4'/%3E%3Cpath d='M11.5 7h3.5M11.5 11.5h3.5M11.5 15.5h1.5'/%3E%3Ccircle cx='16.4' cy='16.4' r='4.2'/%3E%3Cpath d='M19.6 19.6 22 22'/%3E%3Cpath d='M14.6 16.5l1.3 1.3 2.2-2.3'/%3E%3C/svg%3E");
}
/* Mi biblioteca: stacked books with bookmark */
.page-app #tab-library .icon {
  --lv-nav-icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M3.5 9.8 12 6l8.5 3.8L12 13.6z'/%3E%3Cpath d='M3.5 13.2 12 17l8.5-3.8'/%3E%3Cpath d='M3.5 16.4 12 20.2l8.5-3.8'/%3E%3Cpath d='M9.5 7.9l4.6-1.5'/%3E%3C/svg%3E");
}
/* Facturación: receipt from slot with $ */
.page-app #tab-billing .icon {
  --lv-nav-icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M6.6 6.8H6a2.4 2.4 0 0 1 0-4.8h12a2.4 2.4 0 0 1 0 4.8h-.6'/%3E%3Cpath d='M6.8 5v16.4l1.7-1.2 1.7 1.2 1.8-1.2 1.7 1.2 1.7-1.2 1.8 1.2V5'/%3E%3Cpath d='M9 8.6h1.4M11.8 8.6h1.4M14.6 8.6h1.4'/%3E%3Cpath d='M9.2 12h2.4M9.2 14.8h1.8M9.2 17.6h2.4'/%3E%3Cpath d='M15.8 12.4c-.5-.5-2.3-.5-2.3.6 0 1.2 2.5.6 2.5 1.9 0 1.1-1.9 1-2.6.4'/%3E%3Cpath d='M14.9 11.4v5'/%3E%3C/svg%3E");
}
/* Administración: person with gear */
.page-app #tab-admin .icon {
  --lv-nav-icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='9.5' cy='6.5' r='4'/%3E%3Cpath d='M2.5 21c0-4.4 3.1-7 7-7 .9 0 1.8.1 2.6.4'/%3E%3Ccircle cx='17' cy='17.5' r='1.8'/%3E%3Cpath d='M17 13.2l.6 1.3 1.4.2 1 1.1-.3 1.4.8 1.2-.8 1.2.3 1.4-1 1.1-1.4.2-.6 1.3-1.4-.3-1.4.3-.6-1.3-1.4-.2-1-1.1.3-1.4-.8-1.2.8-1.2-.3-1.4 1-1.1 1.4-.2z'/%3E%3C/svg%3E");
}

/* Pills (design: 100px radius, pill bg/border/shadow) */
.page-app .active-exam-badge,
.page-app .btn-export-compact,
.page-app .m3chip,
.page-app .sug-chip {
  border-radius: 100px;
}
.page-app .active-exam-badge,
.page-app .btn-export-compact {
  background: var(--lv-pill-bg);
  border: 1px solid var(--lv-pill-border);
  box-shadow: var(--lv-pill-shadow);
  color: var(--text);
  font-family: var(--font-body);
  font-weight: 600;
}

/* Primary filled actions: solid accent fill + accent glow, pill.
   Must out-rank the earlier hardcoded blue gradients — both the
   base rule (:2544) and the dark ':root[data-theme] :is(...)' rule (:3477).
   ⚠ Specificity trap: apple's :is() list includes the compound selector
   '.page-landing .price-card.featured .price-btn', so the WHOLE :is() rule
   scores (0,4,0) for its :is() term — (0,6,0) total. The decoy compound arg
   below (never matches inside .page-app) inflates ours the same way so the
   later sheet wins. */
:root[data-theme="dark"] .page-app :is(.btn-primary, .btn-generate, .btn-export-primary, .btn-confirm, .welcome-go),
:root[data-theme="light"] .page-app :is(.btn-primary, .btn-generate, .btn-export-primary, .btn-confirm, .welcome-go),
.page-app :is(.btn-primary, .btn-generate, .btn-export-primary, .btn-confirm, .welcome-go) {
  background: linear-gradient(180deg, var(--primary), var(--primary-active));
  color: #fff;
  border-color: rgba(0, 113, 227, 0.42);
  border-radius: 100px;
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.3), 0 6px 16px rgba(0, 113, 227, 0.34);
  font-family: var(--font-body);
  font-weight: 700;
}
:root[data-theme="dark"] .page-app :is(.btn-primary, .btn-generate, .btn-export-primary, .btn-confirm, .welcome-go):hover,
.page-app :is(.btn-primary, .btn-generate, .btn-export-primary, .btn-confirm, .welcome-go):hover {
  background: linear-gradient(180deg, var(--primary-hover), var(--primary));
}
/* Beat the earlier hardcoded blue on the active tab in BOTH themes at
   every width (its .page-app .tab-btn.active gradient rule is unscoped by
   media query, so the mobile dock needs this too). */
:root[data-theme="dark"] .page-app .tab-btn.active,
:root[data-theme="light"] .page-app .tab-btn.active,
.page-app .tab-btn.active {
  background: var(--lv-primary-active-bg);
  color: var(--lv-active-text);
  box-shadow: none;
}

/* Dark rail: apple's dark glass rule ':root[data-theme] :is(..., .page-app
   .tab-bar, ..., #copyrightModal > div)' carries ID-level specificity from
   its :is() list — an ID decoy pulls ours above it so the rail stays flat
   on the sidebar surface. */
:root[data-theme="dark"] .page-app .app-sidebar :is(.tab-bar) {
  background: none;
  background-image: none;
  border: none;
  box-shadow: none;
  backdrop-filter: none;
  -webkit-backdrop-filter: none;
}

/* Dark inputs: apple's ':root[data-theme] :is(..., input[type="search"])'
   rule scores (0,4,1); the compound decoy lifts ours past it so fields use
   the design's violet input surface, and the focus ring actually shows. */
:root[data-theme="dark"] .page-app :is(.neu-select, .neu-input, .neu-textarea) {
  background: var(--lv-input);
  border: 1px solid var(--border);
  box-shadow: none;
  color: var(--text);
}
:root[data-theme="dark"] .page-app :is(.neu-select, .neu-input, .neu-textarea):focus {
  border-color: var(--primary);
  box-shadow: 0 0 0 3px rgba(var(--primary-rgb), 0.22);
}

/* Bank status dots (design: 8px dot per row, semantic colors) */
.page-app .bank-status-dot {
  width: 8px;
  height: 8px;
  flex: 0 0 auto;
  display: inline-block;
  border-radius: 50%;
  background: var(--text-tertiary);
}
.page-app .bank-status-dot.is-approved { background: var(--success); }
.page-app .bank-status-dot.is-pending { background: var(--warning); }
.page-app .bank-status-dot.is-rejected { background: var(--error); }

/* Inputs / selects → design field look (12px radius, input bg) */
:root[data-theme="dark"] .page-app .neu-select,
:root[data-theme="dark"] .page-app .neu-input,
:root[data-theme="dark"] .page-app .neu-textarea,
:root[data-theme="light"] .page-app .neu-select,
:root[data-theme="light"] .page-app .neu-input,
:root[data-theme="light"] .page-app .neu-textarea,
.page-app .neu-select,
.page-app .neu-input,
.page-app .neu-textarea {
  background: var(--lv-input);
  border: 1px solid var(--border);
  border-radius: 12px;
  color: var(--text);
  font-family: var(--font-body);
}
.page-app .neu-select:focus,
.page-app .neu-input:focus,
.page-app .neu-textarea:focus {
  border-color: var(--primary);
  box-shadow: 0 0 0 3px rgba(var(--primary-rgb), 0.18);
}

/* ── 7. Mobile (≤ 760px): shared bottom dock band ─────────────────────── */
@media (max-width: 760px) {
  .page-app .sidebar-profile,
  .page-app .usage-card { display: none; }
  /* The aside collapses to a slim account strip: logout · inbox · help stay
     reachable (the sidebar-foot is their ONLY affordance in the app). The
     tab-bar inside is fixed to the bottom by the shared mobile rules, so it leaves
     this strip's flow entirely. */
  .page-app .app-sidebar {
    display: flex;
    align-items: center;
    justify-content: flex-end;
    gap: 0.5rem;
    padding: 0.5rem 0.875rem 0;
  }
  .page-app .sidebar-foot {
    display: flex;
    align-items: center;
    gap: 0.625rem;
  }
  .page-app .sidebar-foot .sidebar-logout {
    display: inline-flex;
    align-items: center;
    gap: 0.4375rem;
    border: none;
    background: none;
    box-shadow: none;
    padding: 0.25rem 0.375rem;
    width: auto;
    height: auto;
    min-height: var(--control-height);
    font: 600 var(--text-label) var(--font-body);
    color: var(--error);
    opacity: 1;
    cursor: pointer;
  }
  .page-app .sidebar-foot .sidebar-logout .icon { font-size: 1.1875rem; }
  .page-app .sidebar-help {
    width: 28px;
    height: 28px;
    flex: none;
    border-radius: 50%;
    border: 1px solid var(--border-strong);
    display: inline-flex;
    align-items: center;
    justify-content: center;
    color: var(--text-tertiary);
    font-size: 0.8125rem;
    text-decoration: none;
  }
  .page-app .app-main { padding: var(--space-1) 0.875rem var(--space-24); }
  .page-app .content-actions {
    display: flex;
    justify-content: flex-end;
    align-items: center;
    gap: 0.5rem;
    margin-bottom: 0.75rem;
  }
  /* Long design labels: keep the dock rows compact */
  .page-app .tab-bar .tab-btn > span:not(.icon) {
    max-width: 96px;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
  }
}
@media (min-width: 761px) and (max-height: 800px) {
  .page-landing .hero {
    min-height: 100svh;
    padding: 7.5rem 0 3rem;
  }

  .page-landing .hero-acronym {
    margin-bottom: 1rem;
  }

  .page-landing .hero h1 {
    margin-bottom: 1.25rem;
    font-size: clamp(3rem, 6.5vw, 5rem);
  }

  .page-landing .hero-desc {
    margin-bottom: 1.5rem;
  }
}

/* Interaction foundation: direct press feedback, adaptive type, and calm
   accessibility fallbacks. Gesture springs live in js/spring.js. */
html {
  font-size: 100%;
  text-size-adjust: 100%;
  -webkit-text-size-adjust: 100%;
}

body {
  font-family: var(--font-body);
  font-size: var(--text-body);
}

:is(h1, h2, h3, .page-head h2, .view-header-title h2, .config-hero-title, .rf-overview-title) {
  font-family: var(--font-display);
  letter-spacing: var(--track-tight);
  line-height: 1.08;
}

:is(.sa-tile-label, .sa-kpi-label, .usage-card-label, .export-signoff-eyebrow, .exam-switcher-archived summary) {
  letter-spacing: var(--track-wide);
}

.page-app :is(
  .neu-select, .neu-input, .neu-textarea, .source-radio, .sug-chip,
  .q-card, .lib-card, .data-card, .workflow-card, .tab-btn, .flow-step
) {
  transform-origin: center;
  transition: transform var(--dur-instant) var(--ease-standard),
    background-color var(--dur-fast) var(--ease-standard),
    border-color var(--dur-fast) var(--ease-standard),
    box-shadow var(--dur-fast) var(--ease-standard);
}

.page-app :is(
  .neu-select, .neu-input, .neu-textarea, .source-radio, .sug-chip,
  .q-card, .lib-card, .data-card, .workflow-card, .tab-btn, .flow-step
):not(:disabled):active {
  transform: scale(0.97);
}

:is(
  .page-login .mode-toggle button,
  .page-login .password-toggle,
  .page-ocr .mode-btn,
  .page-ocr .dropzone,
  .page-system-admin .sa-section-nav button,
  .page-system-admin .sa-range button,
  .page-system-admin .sa-icon-button,
  .page-landing .nav-cta,
  .page-landing .mobile-sticky-cta a
):not(:disabled):active {
  transform: scale(0.97);
  transition-duration: var(--dur-instant);
}

@media (hover: hover) and (pointer: fine) {
  .page-app :is(
    .source-radio, .sug-chip, .q-card, .lib-card, .data-card, .workflow-card,
    .tab-btn, .flow-step
  ):hover {
    will-change: transform;
  }
}

@media (hover: none) {
  .page-app :is(
    .source-radio, .sug-chip, .q-card, .lib-card, .data-card, .workflow-card,
    .tab-btn, .flow-step
  ):hover {
    transform: none;
  }
}

.drag-handle {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  touch-action: none;
  cursor: grab;
  user-select: none;
  -webkit-user-select: none;
}

.exam-card.is-reordering {
  position: relative;
  z-index: var(--z-dropdown);
  box-shadow: var(--shadow-4);
  transition: none;
  will-change: transform;
}

.exam-card.dragging {
  opacity: 0.94;
  cursor: grabbing;
}

.exam-card.drop-target {
  box-shadow: inset 0 0.125rem 0 var(--primary), var(--shadow-2);
}

:is(
  .page-app .q-card,
  .page-app .lib-card,
  .page-app .data-card,
  .page-app .workflow-card,
  .page-landing .value-card,
  .page-landing .step-card,
  .page-landing .cap-card,
  .page-landing .stats-card,
  .page-landing .bib-card,
  .page-landing .price-card,
  .page-login .login-card,
  .page-ocr .card,
  .page-system-admin .sa-card
) {
  box-shadow: var(--shadow-2);
}

:is(
  .page-app .tab-bar,
  .page-app .generate-dock,
  .page-landing .nav-pill,
  .page-system-admin .sa-section-nav,
  .toast
) {
  box-shadow: var(--shadow-3);
}

:is(.app-modal-card, .modal-card, .modal-surface, .inbox-modal-card, .sa-modal, .sa-action-dialog) {
  box-shadow: var(--shadow-5);
  transform-origin: var(--modal-origin-x, 50%) var(--modal-origin-y, 50%);
}

:is(.modal-surface, .modal-card, .app-modal-card, .inbox-modal-card, .sa-modal, .sa-action-dialog[open]),
.page-ocr :is(#copyrightModal[open], #chapterModal[open]) > div,
.toast:not(.toast-closing) {
  animation-duration: var(--dur-normal);
  animation-timing-function: var(--ease-emphasized);
}

.toast.toast-closing,
.app-modal-closing .app-modal-card {
  animation-duration: var(--dur-normal);
  animation-timing-function: var(--ease-emphasized);
}

@keyframes reduced-crossfade-in {
  from { opacity: 0; }
  to { opacity: 1; }
}

@keyframes reduced-crossfade-out {
  from { opacity: 1; }
  to { opacity: 0; }
}

@media (prefers-reduced-motion: reduce) {
  html {
    scroll-behavior: auto !important;
  }

  .page-app :is(
    .workflow-card, .source-radio, .topic-mode-option, .source-book-picker,
    .toggle-row, .config-details, .q-opt, .preview-opt, .neu-select,
    .neu-input, .neu-textarea, .sug-chip, .q-card, .lib-card, .data-card,
    .tab-btn, .flow-step
  ),
  .page-ocr :is(.dropzone, .file-item, .result-preview, .bib-item),
  .page-system-admin .sa-card-head,
  .page-login input,
  .page-ocr input,
  .page-ocr select,
  .sa-table-toolbar input[type="search"],
  .sa-action-dialog input,
  .sa-action-dialog textarea,
  .btn,
  .mode-btn,
  .price-btn,
  .btn-bracket,
  .btn-filled,
  .page-landing .nav-links a,
  .page-app .btn-icon,
  .page-system-admin .sa-icon-button,
  .page-login .password-toggle,
  .page-system-admin .sa-section-nav button,
  .page-login .mode-toggle button {
    transition-duration: var(--dur-instant) !important;
    transition-property: opacity, color, background-color, border-color !important;
    transition-timing-function: linear !important;
  }

  .page-ocr .progress-bar-fill,
  .progress-fill,
  .usage-bar-fill {
    transition: none !important;
  }

  .page-login .login-container,
  .page-ocr .app-wrap,
  .page-system-admin :is(#saAuthBlock, #saContent),
  .page-app .view.active,
  .page-system-admin [data-sa-panel]:not([hidden]),
  :is(.modal-surface, .modal-card, .app-modal-card, .inbox-modal-card, .sa-modal, .sa-action-dialog[open]),
  .page-ocr :is(#copyrightModal[open], #chapterModal[open]) > div,
  .toast:not(.toast-closing) {
    animation: reduced-crossfade-in var(--dur-instant) linear both !important;
    transform: none !important;
  }

  .toast.toast-closing,
  .app-modal-closing .app-modal-card {
    animation: reduced-crossfade-out var(--dur-instant) linear both !important;
    transform: none !important;
  }

  .page-app :is(
    .neu-select, .neu-input, .neu-textarea, .source-radio, .sug-chip,
    .q-card, .lib-card, .data-card, .workflow-card, .tab-btn, .flow-step
  ),
  :is(.app-modal-card, .modal-card, .modal-surface, .inbox-modal-card, .toast),
  .page-landing :is(.value-card, .step-card, .cap-card, .stats-card, .bib-card, .alt-flow-card, .price-card, .topup-card):hover,
  .page-app :is(.workflow-card, .billing-plan-card:not(.current), .billing-topup-card, .source-radio):hover,
  .btn:not(:disabled):hover,
  .mode-btn:not(:disabled):hover,
  .price-btn:not(:disabled):hover,
  .btn-bracket:not(:disabled):hover,
  .page-app .tab-btn:not(:disabled):hover,
  .page-system-admin .sa-section-nav button:not(:disabled):hover,
  .page-landing .nav-links a:hover,
  :is(.btn, .btn-generate, .login-btn, .mode-btn, .price-btn, .btn-bracket, .btn-filled, .tab-btn):not(:disabled):active {
    transform: none !important;
  }
}

@media (prefers-reduced-transparency: reduce) {
  .page-app :is(.tab-bar, .generate-dock),
  .page-system-admin :is(.sa-topbar, .sa-section-nav),
  .page-landing :is(.nav-pill, .nav-mobile-overlay),
  .page-login .mode-toggle,
  .page-ocr .mode-options,
  :is(.app-modal-card, .modal-card, .modal-surface, .inbox-modal-card, .sa-modal, .sa-action-dialog, .toast) {
    background: var(--surface);
    backdrop-filter: none;
    -webkit-backdrop-filter: none;
  }
}

@media (prefers-contrast: more) {
  .page-app :is(.config-surface, .q-card, .lib-card, .data-card, .workflow-card),
  :is(.app-modal-card, .modal-card, .modal-surface, .inbox-modal-card, .toast) {
    border-color: var(--text);
    background: var(--surface);
  }
}

/* Keep operating-system accessibility modes authoritative even though this
   consolidated sheet contains later component refinements. */
@media (forced-colors: active) {
  .page-app *,
  .page-system-admin *,
  .page-login *,
  .page-ocr *,
  .page-landing * {
    background-image: none !important;
    box-shadow: none !important;
    backdrop-filter: none !important;
    -webkit-backdrop-filter: none !important;
  }

  :where(button, a, input, select, textarea, summary):focus-visible {
    outline: 3px solid CanvasText !important;
  }

  .page-app .tab-btn:focus-visible,
  .page-system-admin .sa-section-nav button:focus-visible,
  .page-system-admin .sa-range button:focus-visible,
  .page-login .mode-toggle button:focus-visible {
    outline: 3px solid CanvasText !important;
    outline-offset: 0 !important;
  }

  .page-app,
  .page-system-admin,
  .page-login,
  .page-ocr,
  .page-landing,
  .page-landing :is(.hero, .section-light, .section-dark, .cta-section, .footer) {
    background: Canvas !important;
    color: CanvasText !important;
  }

  .page-app :is(
    .top-bar, .tab-bar, .generate-dock, .config-surface, .welcome-card,
    .q-card, .question-card, .bank-card, .billing-plan-card,
    .billing-topup-card, .rf-card, .library-card, .exam-surface
  ),
  .page-system-admin :is(.sa-topbar, .sa-section-nav, .sa-card, .sa-kpi),
  .page-landing :is(.nav-pill, .nav-mobile-overlay, .value-card, .price-card),
  .page-login :is(.login-card, .mode-toggle, .plan-card),
  .page-ocr :is(.mode-options, .card),
  :is(.modal-surface, .modal-card, .app-modal-card, .inbox-modal-card, .sa-modal, .sa-action-dialog, .toast) {
    border-color: CanvasText !important;
    background: Canvas !important;
    color: CanvasText !important;
  }

  .page-app .tab-btn.active,
  .page-system-admin .sa-section-nav button[aria-pressed="true"],
  .page-system-admin .sa-section-nav button[aria-selected="true"],
  .page-login .mode-toggle button.active,
  .page-app .workflow-card[aria-pressed="true"],
  .page-system-admin .sa-range button[aria-pressed="true"],
  .btn-primary,
  .btn-generate,
  .login-btn {
    border: 2px solid Highlight !important;
    background: Highlight !important;
    color: HighlightText !important;
  }

  .neu-select {
    appearance: auto !important;
    -webkit-appearance: menulist !important;
  }
}

@media print {
  .top-bar,
  .tab-bar,
  .generate-dock,
  .nav-header,
  .nav-mobile-overlay,
  .toast-container,
  .btn,
  button {
    display: none !important;
  }

  body,
  .page-app,
  .page-system-admin,
  .page-ocr,
  .page-login,
  .page-landing {
    padding: 0 !important;
    background: #ffffff !important;
    color: #000000 !important;
  }

  .page-landing [data-motion],
  .page-landing [data-motion-stagger] > * {
    opacity: 1 !important;
    transform: none !important;
  }

  .page-app :is(
    .config-surface, .q-card, .question-card, .bank-card, .data-card,
    .lib-card, .workflow-card, .rf-overview-card, .rf-compose-card
  ) {
    background-image: none !important;
    box-shadow: none !important;
    backdrop-filter: none !important;
    -webkit-backdrop-filter: none !important;
  }
}

/* ═══════════════════════════════════════════════════════════════════════
   TYPOGRAPHY — size-specific tracking, inverse leading
   Display type tightens as it grows, body sits at zero tracking, and only
   small uppercase labels take positive tracking. Leading runs the other way.
   ═══════════════════════════════════════════════════════════════════════ */

body {
  -webkit-font-smoothing: antialiased;
  text-rendering: optimizeLegibility;
}

.page-landing .hero h1,
.page-landing h1,
.page-app h1,
.page-login h1 {
  font-family: var(--font-display);
  letter-spacing: var(--track-display);
  line-height: var(--leading-display);
}

.page-landing h2,
.page-app h2,
.page-app .page-head h2,
.page-app .view-header-title h2,
.page-app .config-hero-title,
.page-system-admin h2,
.page-login h2 {
  font-family: var(--font-display);
  letter-spacing: var(--track-title);
  line-height: var(--leading-title);
}

.page-landing h3,
.page-app h3,
.page-system-admin h3,
h4 {
  letter-spacing: var(--track-heading);
  line-height: var(--leading-heading);
}

/* Numeric UI reads as columns, not prose: tabular figures stop stat rows and
   counters jittering as their digits change. */
.page-app .stat-value,
.page-app .usage-count,
.page-system-admin .sa-stat-value,
.page-landing .stat-number,
time,
.mono {
  font-variant-numeric: tabular-nums;
  font-feature-settings: "tnum" 1;
}

/* ─── Return-to-top FAB ───────────────────────────────────────────────
   Visibility rides on opacity/transform (compositor properties) instead of
   `display`, which cannot transition and made the button pop. `display` stays
   inline on the element; only the animatable properties live here.
   `visibility` is delayed out so the button is not focusable while hidden. */
#returnToTopBtn {
  opacity: 0;
  visibility: hidden;
  transform: translateY(8px) scale(0.96);
  transition:
    opacity var(--dur-normal) var(--ease-standard),
    transform var(--dur-normal) var(--ease-standard),
    visibility 0s linear var(--dur-normal);
}

#returnToTopBtn.is-visible {
  opacity: 1;
  visibility: visible;
  transform: none;
  transition-delay: 0s;
}

#returnToTopBtn.is-visible:active {
  transform: scale(0.92);
  transition-duration: var(--dur-instant);
}

/* ─── Sidebar rail: labels stay inside the panel ──────────────────────
   The nav label is a flex child that inherited `white-space: nowrap` from
   `.tab-btn`. A nowrap flex child keeps the default `min-width: auto`, so it
   refuses to shrink below its text width — a long Spanish label such as
   "Crear preguntas u optimizar" rendered straight out through the sidebar's
   rounded edge instead of wrapping or truncating.
   Wrapping is preferred over an ellipsis here: these labels are named for their
   contents ("Mi banco de preguntas"), and truncating them costs the wayfinding
   the specific naming was chosen to provide. */
.page-app .app-sidebar .tab-btn {
  white-space: normal;
}

.page-app .app-sidebar .tab-btn > span:not(.icon):not(.tab-badge) {
  min-width: 0;
  overflow-wrap: anywhere;
  line-height: 1.25;
}

/* Backstop: nothing may paint outside the rail, whatever the label length or
   the reader's text-size setting. `clip` rather than `hidden` so this does not
   silently turn the sidebar into a scroll container. */
.page-app .app-sidebar {
  overflow-x: clip;
}
