/* ==========================================================================
   QuoteSuite Redesign — assets/css/qs-redesign.css
   --------------------------------------------------------------------------
   Loaded AFTER app.css and any per-page stylesheet. All rules are scoped
   under body.qs-v3 so pages that have not opted in stay unaffected.

   Component classes use the qs-v3- prefix. Never overwrite existing app.css
   classes. If a JS-hooked element needs restyling, add a qs-v3- class
   alongside the original class, do not rename or remove hooks.

   Sections:
     1. Design tokens          (colors, type, spacing, radii, shadows)
     2. Base + typography      (body, headings, links)
     3. Layout shell           (sidebar, topbar, main, page background)
     4. Primitives             (buttons, inputs, badges, chips, pills, avatars)
     5. Cards                  (stat, panel, empty state)
     6. Data table             (table, row states, avatar cells)
     7. Tabs                   (horizontal tab strip)
     8. Utilities              (spacing, muted text, dividers, focus)
     9. Accessibility helpers  (skip link, sr-only, focus ring)

   LOAD-BEARING RULE — do not remove:
     Section 8 contains `body.qs-v3 [hidden] { display: none !important; }`.
     This app shows and hides panels, notices and badges by toggling the
     [hidden] attribute from JS (protectedPanel, accessDenied, authMessage,
     creditWarning, notificationCount, ...). [hidden] only carries the UA's
     display:none, which ANY component rule setting display:flex/grid/
     inline-flex will out-specify — silently forcing hidden elements visible.
     It has already caused the "Access denied" panel to render on top of a
     working dashboard. Keep the guard; do not "clean up" the !important.

   A related trap, for anyone adding page sections below: several JS functions
   OVERWRITE className on the elements they update, e.g.
     setMessage()  -> el.className = "notice" + tone
     renderProfile -> badge.className = statusClass(status)
   Any qs-v3- class added to those elements in markup is wiped on first
   render. Style them via their ID or their base class (.notice, .status-pill)
   instead of adding a new class.
   ========================================================================== */


/* --------------------------------------------------------------------------
   1. Design tokens
   -------------------------------------------------------------------------- */
body.qs-v3 {
  /* Palette ------------------------------------------------------------- */
  --qs-navy-900: #0D2B5E;
  --qs-navy-800: #132F63;
  --qs-navy-700: #1E3A7A;
  --qs-navy-500: #2563EB;
  --qs-navy-400: #3B82F6;

  --qs-gold-500: #C7A75A;
  --qs-gold-400: #D4B872;
  --qs-gold-300: #E4CB94;
  --qs-gold-100: #FBF5E4;

  --qs-ink-900: #0F172A;
  --qs-ink-800: #1A2540;
  --qs-ink-700: #1F2937;
  --qs-ink-600: #374151;
  --qs-ink-500: #64748B;
  --qs-ink-400: #94A3B8;
  --qs-ink-300: #CBD5E1;
  --qs-ink-200: #E2E8F0;
  --qs-ink-100: #F1F5F9;

  --qs-bg: #F5F7FB;
  --qs-surface: #FFFFFF;
  --qs-surface-alt: #F9FAFB;

  --qs-border: #E5E7EB;
  --qs-border-strong: #D1D5DB;

  --qs-success: #10B981;
  --qs-success-soft: #D1FAE5;
  --qs-warning: #F59E0B;
  --qs-warning-soft: #FEF3C7;
  --qs-danger: #EF4444;
  --qs-danger-soft: #FEE2E2;
  --qs-info: #3B82F6;
  --qs-info-soft: #DBEAFE;
  --qs-purple-soft: #EDE9FE;
  --qs-teal-soft: #CCFBF1;

  /* Sidebar-specific (dark surface) ------------------------------------- */
  --qs-sidebar-bg: var(--qs-navy-900);
  --qs-sidebar-hover: rgba(255, 255, 255, 0.06);
  --qs-sidebar-active-bg: var(--qs-navy-500);
  --qs-sidebar-text: rgba(255, 255, 255, 0.72);
  --qs-sidebar-text-strong: #FFFFFF;
  --qs-sidebar-divider: rgba(255, 255, 255, 0.08);

  /* Typography --------------------------------------------------------- */
  --qs-font-display: "Playfair Display", "Fraunces", Georgia, serif;
  --qs-font-ui: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto,
                system-ui, sans-serif;

  --qs-fs-xs: 12px;
  --qs-fs-sm: 13px;
  --qs-fs-base: 14px;
  --qs-fs-lg: 16px;
  --qs-fs-xl: 18px;
  --qs-fs-2xl: 22px;
  --qs-fs-3xl: 28px;
  --qs-fs-4xl: 36px;
  --qs-fs-5xl: 48px;

  --qs-fw-normal: 400;
  --qs-fw-medium: 500;
  --qs-fw-semibold: 600;
  --qs-fw-bold: 700;

  --qs-lh-tight: 1.2;
  --qs-lh-snug: 1.35;
  --qs-lh-normal: 1.5;
  --qs-lh-relaxed: 1.7;

  /* Spacing scale ------------------------------------------------------ */
  --qs-sp-1: 4px;
  --qs-sp-2: 8px;
  --qs-sp-3: 12px;
  --qs-sp-4: 16px;
  --qs-sp-5: 20px;
  --qs-sp-6: 24px;
  --qs-sp-8: 32px;
  --qs-sp-10: 40px;
  --qs-sp-12: 48px;
  --qs-sp-16: 64px;

  /* Radii -------------------------------------------------------------- */
  --qs-r-sm: 6px;
  --qs-r-md: 8px;
  --qs-r-lg: 12px;
  --qs-r-xl: 16px;
  --qs-r-2xl: 20px;
  --qs-r-full: 999px;

  /* Shadows ------------------------------------------------------------ */
  --qs-sh-xs: 0 1px 2px rgba(15, 23, 42, 0.04);
  --qs-sh-sm: 0 1px 3px rgba(15, 23, 42, 0.06), 0 1px 2px rgba(15, 23, 42, 0.04);
  --qs-sh-md: 0 4px 12px rgba(15, 23, 42, 0.08);
  --qs-sh-lg: 0 12px 32px rgba(15, 23, 42, 0.10);
  --qs-sh-xl: 0 24px 48px rgba(15, 23, 42, 0.14);
  --qs-sh-focus: 0 0 0 3px rgba(37, 99, 235, 0.35);

  /* Layout ------------------------------------------------------------- */
  --qs-sidebar-w: 240px;
  --qs-topbar-h: 72px;
  --qs-content-max: 1400px;

  /* Motion ------------------------------------------------------------- */
  --qs-t-fast: 120ms;
  --qs-t-base: 180ms;
  --qs-t-slow: 240ms;
  --qs-ease: cubic-bezier(0.2, 0.8, 0.2, 1);
}


/* --------------------------------------------------------------------------
   2. Base + typography
   -------------------------------------------------------------------------- */
body.qs-v3 {
  font-family: var(--qs-font-ui);
  font-size: var(--qs-fs-base);
  line-height: var(--qs-lh-normal);
  color: var(--qs-ink-800);
  background: var(--qs-bg);
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
}

body.qs-v3 h1,
body.qs-v3 h2,
body.qs-v3 h3,
body.qs-v3 h4 {
  color: var(--qs-ink-900);
  font-weight: var(--qs-fw-semibold);
  line-height: var(--qs-lh-tight);
  letter-spacing: -0.01em;
  margin: 0;
}

body.qs-v3 h1 { font-size: var(--qs-fs-3xl); }
body.qs-v3 h2 { font-size: var(--qs-fs-2xl); }
body.qs-v3 h3 { font-size: var(--qs-fs-xl); }
body.qs-v3 h4 { font-size: var(--qs-fs-lg); }

body.qs-v3 p { margin: 0; color: var(--qs-ink-700); }

body.qs-v3 .qs-v3-display {
  font-family: var(--qs-font-display);
  font-weight: var(--qs-fw-normal);
  letter-spacing: -0.015em;
}

body.qs-v3 a {
  color: var(--qs-navy-500);
  text-decoration: none;
  transition: color var(--qs-t-fast) var(--qs-ease);
}
body.qs-v3 a:hover { color: var(--qs-navy-700); }


/* --------------------------------------------------------------------------
   3. Layout shell
   -------------------------------------------------------------------------- */

/* Page frame: sidebar + main. Applied to a wrapper div on redesigned pages */
body.qs-v3 .qs-v3-shell {
  display: grid;
  grid-template-columns: var(--qs-sidebar-w) 1fr;
  min-height: 100vh;
  background: var(--qs-bg);
}

/* Sidebar --------------------------------------------------------------- */
body.qs-v3 .qs-v3-sidebar {
  background: var(--qs-sidebar-bg);
  color: var(--qs-sidebar-text);
  display: flex;
  flex-direction: column;
  padding: var(--qs-sp-6) var(--qs-sp-4);
  gap: var(--qs-sp-4);
  position: sticky;
  top: 0;
  height: 100vh;
  overflow-y: auto;
}

body.qs-v3 .qs-v3-sidebar-brand {
  display: flex;
  align-items: center;
  gap: var(--qs-sp-2);
  padding: var(--qs-sp-2) var(--qs-sp-3);
  color: var(--qs-gold-500);
  font-family: var(--qs-font-display);
  font-size: var(--qs-fs-2xl);
  font-weight: var(--qs-fw-semibold);
  letter-spacing: -0.01em;
}
body.qs-v3 .qs-v3-sidebar-brand svg { width: 28px; height: 28px; }

body.qs-v3 .qs-v3-sidebar-nav {
  display: flex;
  flex-direction: column;
  gap: 2px;
  margin-top: var(--qs-sp-2);
}

body.qs-v3 .qs-v3-nav-item {
  display: flex;
  align-items: center;
  gap: var(--qs-sp-3);
  padding: var(--qs-sp-3) var(--qs-sp-4);
  border-radius: var(--qs-r-md);
  color: var(--qs-sidebar-text);
  font-size: var(--qs-fs-base);
  font-weight: var(--qs-fw-medium);
  background: transparent;
  border: 0;
  cursor: pointer;
  text-align: left;
  width: 100%;
  transition: background var(--qs-t-fast) var(--qs-ease),
              color var(--qs-t-fast) var(--qs-ease);
}
body.qs-v3 .qs-v3-nav-item svg {
  width: 18px;
  height: 18px;
  flex-shrink: 0;
  stroke: currentColor;
  fill: none;
  stroke-width: 1.75;
}
body.qs-v3 .qs-v3-nav-item:hover {
  background: var(--qs-sidebar-hover);
  color: var(--qs-sidebar-text-strong);
}
body.qs-v3 .qs-v3-nav-item.is-active {
  background: var(--qs-sidebar-active-bg);
  color: var(--qs-sidebar-text-strong);
  font-weight: var(--qs-fw-semibold);
}
body.qs-v3 .qs-v3-nav-item:focus-visible {
  outline: none;
  box-shadow: 0 0 0 2px var(--qs-gold-500);
}

body.qs-v3 .qs-v3-sidebar-footer {
  margin-top: auto;
  padding-top: var(--qs-sp-4);
  border-top: 1px solid var(--qs-sidebar-divider);
}

body.qs-v3 .qs-v3-plan-card {
  background: rgba(255, 255, 255, 0.04);
  border: 1px solid var(--qs-sidebar-divider);
  border-radius: var(--qs-r-lg);
  padding: var(--qs-sp-4);
  color: var(--qs-sidebar-text-strong);
  font-size: var(--qs-fs-sm);
}
body.qs-v3 .qs-v3-plan-card strong {
  display: flex;
  align-items: center;
  gap: var(--qs-sp-2);
  color: var(--qs-gold-500);
  font-family: var(--qs-font-display);
  font-size: var(--qs-fs-lg);
  margin-bottom: var(--qs-sp-1);
}
body.qs-v3 .qs-v3-plan-card span { color: var(--qs-ink-300); font-size: var(--qs-fs-xs); }

/* Main content area ----------------------------------------------------- */
body.qs-v3 .qs-v3-main {
  min-width: 0; /* prevents grid children from overflowing */
  display: flex;
  flex-direction: column;
}

body.qs-v3 .qs-v3-topbar {
  min-height: var(--qs-topbar-h);
  padding: var(--qs-sp-5) var(--qs-sp-8);
  display: flex;
  align-items: center;
  gap: var(--qs-sp-5);
  background: var(--qs-surface);
  border-bottom: 1px solid var(--qs-border);
}

body.qs-v3 .qs-v3-topbar-title { flex: 1; min-width: 0; }
body.qs-v3 .qs-v3-topbar-title h1 { font-size: var(--qs-fs-2xl); }
body.qs-v3 .qs-v3-topbar-title p {
  color: var(--qs-ink-500);
  font-size: var(--qs-fs-sm);
  margin-top: 2px;
}

body.qs-v3 .qs-v3-search {
  display: flex;
  align-items: center;
  gap: var(--qs-sp-2);
  padding: var(--qs-sp-3) var(--qs-sp-4);
  background: var(--qs-surface-alt);
  border: 1px solid var(--qs-border);
  border-radius: var(--qs-r-md);
  min-width: 320px;
  transition: border-color var(--qs-t-fast) var(--qs-ease),
              box-shadow var(--qs-t-fast) var(--qs-ease);
}
body.qs-v3 .qs-v3-search:focus-within {
  border-color: var(--qs-navy-500);
  box-shadow: var(--qs-sh-focus);
}
body.qs-v3 .qs-v3-search svg {
  width: 16px;
  height: 16px;
  color: var(--qs-ink-400);
  flex-shrink: 0;
}
body.qs-v3 .qs-v3-search input {
  border: 0;
  background: transparent;
  outline: none;
  flex: 1;
  font-size: var(--qs-fs-sm);
  color: var(--qs-ink-800);
  /* The search pill (wrapper) supplies the height and padding; reset the
     input so app.css's global `input { min-height: 44px }` doesn't stack a
     second box inside the padded wrapper (was making the pill ~70px tall). */
  min-height: 0;
  padding: 0;
}
body.qs-v3 .qs-v3-search kbd {
  background: var(--qs-surface);
  border: 1px solid var(--qs-border);
  border-radius: var(--qs-r-sm);
  padding: 2px 6px;
  font-size: var(--qs-fs-xs);
  color: var(--qs-ink-500);
  font-family: var(--qs-font-ui);
}

body.qs-v3 .qs-v3-topbar-icon {
  width: 40px;
  height: 40px;
  border-radius: var(--qs-r-full);
  background: transparent;
  border: 0;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  color: var(--qs-ink-500);
  cursor: pointer;
  position: relative;
  transition: background var(--qs-t-fast) var(--qs-ease);
}
body.qs-v3 .qs-v3-topbar-icon:hover { background: var(--qs-ink-100); }
body.qs-v3 .qs-v3-topbar-icon .qs-v3-badge {
  position: absolute;
  top: 6px;
  right: 6px;
  min-width: 16px;
  height: 16px;
  padding: 0 4px;
  background: var(--qs-navy-500);
  color: #fff;
  font-size: 10px;
  font-weight: var(--qs-fw-semibold);
  border-radius: var(--qs-r-full);
  display: inline-flex;
  align-items: center;
  justify-content: center;
}

body.qs-v3 .qs-v3-credit-pill {
  display: inline-flex;
  align-items: center;
  gap: var(--qs-sp-2);
  padding: var(--qs-sp-2) var(--qs-sp-3);
  background: var(--qs-gold-100);
  border: 1px solid var(--qs-gold-300);
  border-radius: var(--qs-r-md);
  color: var(--qs-ink-800);
  font-size: var(--qs-fs-sm);
  font-weight: var(--qs-fw-semibold);
}
body.qs-v3 .qs-v3-credit-pill svg { width: 16px; height: 16px; color: var(--qs-gold-500); }

body.qs-v3 .qs-v3-avatar-btn {
  display: inline-flex;
  align-items: center;
  gap: var(--qs-sp-2);
  padding: 4px 10px 4px 4px;
  background: transparent;
  border: 1px solid var(--qs-border);
  border-radius: var(--qs-r-full);
  cursor: pointer;
}

body.qs-v3 .qs-v3-content {
  padding: var(--qs-sp-8);
  display: flex;
  flex-direction: column;
  gap: var(--qs-sp-6);
  /* Full-bleed: content fills the area beside the sidebar (minus its own
     padding) rather than being capped at --qs-content-max and centered, which
     left large blank margins on wide screens. Individual elements that would
     look stretched at full width are capped on their own rule below. */
  width: 100%;
  box-sizing: border-box;
}


/* --------------------------------------------------------------------------
   4. Primitives
   -------------------------------------------------------------------------- */

/* Buttons -------------------------------------------------------------- */
body.qs-v3 .qs-v3-btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: var(--qs-sp-2);
  padding: 10px 16px;
  border-radius: var(--qs-r-md);
  font-family: inherit;
  font-size: var(--qs-fs-sm);
  font-weight: var(--qs-fw-semibold);
  line-height: 1;
  border: 1px solid transparent;
  cursor: pointer;
  transition: background var(--qs-t-fast) var(--qs-ease),
              color var(--qs-t-fast) var(--qs-ease),
              border-color var(--qs-t-fast) var(--qs-ease),
              box-shadow var(--qs-t-fast) var(--qs-ease),
              transform var(--qs-t-fast) var(--qs-ease);
  text-decoration: none;
  white-space: nowrap;
}
body.qs-v3 .qs-v3-btn svg { width: 16px; height: 16px; }
body.qs-v3 .qs-v3-btn:active { transform: translateY(1px); }
body.qs-v3 .qs-v3-btn:disabled { opacity: 0.5; cursor: not-allowed; }

body.qs-v3 .qs-v3-btn-primary {
  background: var(--qs-navy-500);
  color: #fff;
  border-color: var(--qs-navy-500);
}
body.qs-v3 .qs-v3-btn-primary:hover { background: var(--qs-navy-700); border-color: var(--qs-navy-700); }
body.qs-v3 .qs-v3-btn-primary:focus-visible { box-shadow: var(--qs-sh-focus); outline: none; }

body.qs-v3 .qs-v3-btn-gold {
  background: var(--qs-gold-500);
  color: var(--qs-ink-900);
  border-color: var(--qs-gold-500);
}
body.qs-v3 .qs-v3-btn-gold:hover { background: var(--qs-gold-400); border-color: var(--qs-gold-400); }

body.qs-v3 .qs-v3-btn-secondary {
  background: var(--qs-surface);
  color: var(--qs-ink-800);
  border-color: var(--qs-border-strong);
}
body.qs-v3 .qs-v3-btn-secondary:hover { border-color: var(--qs-ink-400); background: var(--qs-surface-alt); }

body.qs-v3 .qs-v3-btn-ghost {
  background: transparent;
  color: var(--qs-ink-700);
  border-color: transparent;
}
body.qs-v3 .qs-v3-btn-ghost:hover { background: var(--qs-ink-100); }

body.qs-v3 .qs-v3-btn-danger {
  background: var(--qs-surface);
  color: var(--qs-danger);
  border-color: var(--qs-border);
}
body.qs-v3 .qs-v3-btn-danger:hover { background: var(--qs-danger-soft); border-color: var(--qs-danger); }

body.qs-v3 .qs-v3-btn-sm { padding: 6px 10px; font-size: var(--qs-fs-xs); }
body.qs-v3 .qs-v3-btn-lg { padding: 12px 20px; font-size: var(--qs-fs-base); }

/* Inputs --------------------------------------------------------------- */
body.qs-v3 .qs-v3-input,
body.qs-v3 .qs-v3-select,
body.qs-v3 .qs-v3-textarea {
  width: 100%;
  padding: 10px 14px;
  font-family: inherit;
  font-size: var(--qs-fs-sm);
  color: var(--qs-ink-800);
  background: var(--qs-surface);
  border: 1px solid var(--qs-border-strong);
  border-radius: var(--qs-r-md);
  transition: border-color var(--qs-t-fast) var(--qs-ease),
              box-shadow var(--qs-t-fast) var(--qs-ease);
  box-sizing: border-box;
}
body.qs-v3 .qs-v3-input:focus,
body.qs-v3 .qs-v3-select:focus,
body.qs-v3 .qs-v3-textarea:focus {
  border-color: var(--qs-navy-500);
  box-shadow: var(--qs-sh-focus);
  outline: none;
}
body.qs-v3 .qs-v3-input::placeholder,
body.qs-v3 .qs-v3-textarea::placeholder { color: var(--qs-ink-400); }
body.qs-v3 .qs-v3-textarea { resize: vertical; min-height: 88px; line-height: var(--qs-lh-normal); }

body.qs-v3 .qs-v3-field {
  display: flex;
  flex-direction: column;
  gap: var(--qs-sp-1);
}
body.qs-v3 .qs-v3-label {
  /* app.css sets `label { display: grid }`, which turned every label into a
     grid container — so a trailing required-asterisk span dropped onto its own
     grid row. Force block flow so label text + inline children stay on one line. */
  display: block;
  font-size: var(--qs-fs-sm);
  font-weight: var(--qs-fw-medium);
  color: var(--qs-ink-700);
}
body.qs-v3 .qs-v3-hint {
  font-size: var(--qs-fs-xs);
  color: var(--qs-ink-500);
}

/* Badges / status pills ------------------------------------------------- */
body.qs-v3 .qs-v3-badge {
  display: inline-flex;
  align-items: center;
  gap: 4px;
  padding: 2px 8px;
  border-radius: var(--qs-r-full);
  font-size: var(--qs-fs-xs);
  font-weight: var(--qs-fw-semibold);
  line-height: 1.6;
}
body.qs-v3 .qs-v3-badge-neutral { background: var(--qs-ink-100); color: var(--qs-ink-700); }
body.qs-v3 .qs-v3-badge-info    { background: var(--qs-info-soft); color: #1E40AF; }
body.qs-v3 .qs-v3-badge-success { background: var(--qs-success-soft); color: #065F46; }
body.qs-v3 .qs-v3-badge-warning { background: var(--qs-warning-soft); color: #92400E; }
body.qs-v3 .qs-v3-badge-danger  { background: var(--qs-danger-soft); color: #991B1B; }
body.qs-v3 .qs-v3-badge-gold    { background: var(--qs-gold-100); color: #7C5A16; }

body.qs-v3 .qs-v3-status-dot {
  display: inline-block;
  width: 8px;
  height: 8px;
  border-radius: var(--qs-r-full);
  background: var(--qs-ink-300);
  margin-right: 6px;
  vertical-align: middle;
}
body.qs-v3 .qs-v3-status-dot.is-active   { background: var(--qs-success); }
body.qs-v3 .qs-v3-status-dot.is-warning  { background: var(--qs-warning); }
body.qs-v3 .qs-v3-status-dot.is-inactive { background: var(--qs-ink-400); }

/* Chip (filter chips) --------------------------------------------------- */
body.qs-v3 .qs-v3-chip {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  padding: 6px 12px;
  background: var(--qs-surface);
  border: 1px solid var(--qs-border);
  border-radius: var(--qs-r-full);
  font-size: var(--qs-fs-xs);
  font-weight: var(--qs-fw-medium);
  color: var(--qs-ink-700);
  cursor: pointer;
  transition: background var(--qs-t-fast) var(--qs-ease),
              border-color var(--qs-t-fast) var(--qs-ease);
}
body.qs-v3 .qs-v3-chip svg { width: 14px; height: 14px; }
body.qs-v3 .qs-v3-chip:hover { border-color: var(--qs-ink-400); }
body.qs-v3 .qs-v3-chip.is-active {
  background: var(--qs-navy-500);
  color: #fff;
  border-color: var(--qs-navy-500);
}

/* Avatar --------------------------------------------------------------- */
body.qs-v3 .qs-v3-avatar {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 32px;
  height: 32px;
  border-radius: var(--qs-r-full);
  background: var(--qs-navy-700);
  color: #fff;
  font-size: var(--qs-fs-xs);
  font-weight: var(--qs-fw-semibold);
  overflow: hidden;
  flex-shrink: 0;
}
body.qs-v3 .qs-v3-avatar img { width: 100%; height: 100%; object-fit: cover; }
body.qs-v3 .qs-v3-avatar-sm { width: 24px; height: 24px; font-size: 10px; }
body.qs-v3 .qs-v3-avatar-lg { width: 48px; height: 48px; font-size: var(--qs-fs-base); }
body.qs-v3 .qs-v3-avatar-xl { width: 72px; height: 72px; font-size: var(--qs-fs-xl); }


/* --------------------------------------------------------------------------
   5. Cards
   -------------------------------------------------------------------------- */
body.qs-v3 .qs-v3-card {
  background: var(--qs-surface);
  border: 1px solid var(--qs-border);
  border-radius: var(--qs-r-xl);
  padding: var(--qs-sp-6);
  box-shadow: var(--qs-sh-xs);
}
body.qs-v3 .qs-v3-card-header {
  display: flex;
  align-items: flex-start;
  justify-content: space-between;
  gap: var(--qs-sp-4);
  margin-bottom: var(--qs-sp-5);
}
body.qs-v3 .qs-v3-card-title { font-size: var(--qs-fs-xl); }
body.qs-v3 .qs-v3-card-subtitle {
  font-size: var(--qs-fs-sm);
  color: var(--qs-ink-500);
  margin-top: 2px;
}

/* Stat card (dashboard: Total Quotes, etc.) ----------------------------- */
body.qs-v3 .qs-v3-stat {
  background: var(--qs-surface);
  border: 1px solid var(--qs-border);
  border-radius: var(--qs-r-xl);
  padding: var(--qs-sp-5);
  display: flex;
  align-items: flex-start;
  gap: var(--qs-sp-4);
  box-shadow: var(--qs-sh-xs);
}
body.qs-v3 .qs-v3-stat-icon {
  width: 44px;
  height: 44px;
  border-radius: var(--qs-r-lg);
  display: inline-flex;
  align-items: center;
  justify-content: center;
  flex-shrink: 0;
}
body.qs-v3 .qs-v3-stat-icon svg { width: 22px; height: 22px; }
body.qs-v3 .qs-v3-stat-icon.tint-blue   { background: var(--qs-info-soft); color: #1E40AF; }
body.qs-v3 .qs-v3-stat-icon.tint-green  { background: var(--qs-success-soft); color: #065F46; }
body.qs-v3 .qs-v3-stat-icon.tint-purple { background: var(--qs-purple-soft); color: #6D28D9; }
body.qs-v3 .qs-v3-stat-icon.tint-gold   { background: var(--qs-gold-100); color: #92640E; }
body.qs-v3 .qs-v3-stat-icon.tint-teal   { background: var(--qs-teal-soft); color: #0F766E; }

body.qs-v3 .qs-v3-stat-body { min-width: 0; }
body.qs-v3 .qs-v3-stat-label {
  color: var(--qs-ink-500);
  font-size: var(--qs-fs-sm);
  font-weight: var(--qs-fw-medium);
}
body.qs-v3 .qs-v3-stat-value {
  color: var(--qs-ink-900);
  font-size: var(--qs-fs-3xl);
  font-weight: var(--qs-fw-semibold);
  line-height: 1.1;
  margin: 4px 0 6px;
}
body.qs-v3 .qs-v3-stat-delta {
  font-size: var(--qs-fs-xs);
  color: var(--qs-ink-500);
}
body.qs-v3 .qs-v3-stat-delta.is-up   { color: var(--qs-success); }
body.qs-v3 .qs-v3-stat-delta.is-down { color: var(--qs-danger); }

body.qs-v3 .qs-v3-stat-grid {
  display: grid;
  grid-template-columns: repeat(4, minmax(0, 1fr));
  gap: var(--qs-sp-4);
}
@media (max-width: 1100px) { body.qs-v3 .qs-v3-stat-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
@media (max-width: 640px)  { body.qs-v3 .qs-v3-stat-grid { grid-template-columns: 1fr; } }

/* Empty state ----------------------------------------------------------- */
body.qs-v3 .qs-v3-empty {
  padding: var(--qs-sp-10) var(--qs-sp-6);
  text-align: center;
  color: var(--qs-ink-500);
  font-size: var(--qs-fs-sm);
  border: 1px dashed var(--qs-border);
  border-radius: var(--qs-r-lg);
  background: var(--qs-surface-alt);
}


/* --------------------------------------------------------------------------
   6. Data table
   -------------------------------------------------------------------------- */
body.qs-v3 .qs-v3-table-wrap {
  overflow-x: auto;
  border-radius: var(--qs-r-lg);
}
body.qs-v3 .qs-v3-table {
  width: 100%;
  border-collapse: collapse;
  font-size: var(--qs-fs-sm);
}
body.qs-v3 .qs-v3-table thead th {
  text-align: left;
  padding: var(--qs-sp-3) var(--qs-sp-4);
  color: var(--qs-ink-500);
  font-weight: var(--qs-fw-semibold);
  font-size: var(--qs-fs-xs);
  text-transform: uppercase;
  letter-spacing: 0.03em;
  background: var(--qs-surface-alt);
  border-bottom: 1px solid var(--qs-border);
}
body.qs-v3 .qs-v3-table tbody td {
  padding: var(--qs-sp-4);
  border-bottom: 1px solid var(--qs-border);
  color: var(--qs-ink-800);
  vertical-align: middle;
}
body.qs-v3 .qs-v3-table tbody tr:last-child td { border-bottom: 0; }
body.qs-v3 .qs-v3-table tbody tr {
  transition: background var(--qs-t-fast) var(--qs-ease);
}
body.qs-v3 .qs-v3-table tbody tr:hover { background: var(--qs-surface-alt); }

body.qs-v3 .qs-v3-table-user {
  display: flex;
  align-items: center;
  gap: var(--qs-sp-3);
}
body.qs-v3 .qs-v3-table-user-name {
  display: flex;
  align-items: center;
  gap: var(--qs-sp-2);
  font-weight: var(--qs-fw-semibold);
  color: var(--qs-ink-900);
}
body.qs-v3 .qs-v3-table-user-sub {
  color: var(--qs-ink-500);
  font-size: var(--qs-fs-xs);
  margin-top: 2px;
}

body.qs-v3 .qs-v3-table-actions {
  display: inline-flex;
  gap: var(--qs-sp-1);
}
body.qs-v3 .qs-v3-icon-btn {
  width: 32px;
  height: 32px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  background: transparent;
  border: 1px solid var(--qs-border);
  border-radius: var(--qs-r-md);
  cursor: pointer;
  color: var(--qs-ink-600);
  transition: background var(--qs-t-fast) var(--qs-ease),
              color var(--qs-t-fast) var(--qs-ease);
}
body.qs-v3 .qs-v3-icon-btn svg { width: 16px; height: 16px; }
body.qs-v3 .qs-v3-icon-btn:hover { background: var(--qs-ink-100); color: var(--qs-ink-900); }


/* --------------------------------------------------------------------------
   7. Tabs (horizontal)
   -------------------------------------------------------------------------- */
body.qs-v3 .qs-v3-tabs {
  display: flex;
  gap: var(--qs-sp-6);
  border-bottom: 1px solid var(--qs-border);
  padding: 0 var(--qs-sp-2);
}
body.qs-v3 .qs-v3-tab {
  display: inline-flex;
  align-items: center;
  gap: var(--qs-sp-2);
  padding: var(--qs-sp-3) var(--qs-sp-1);
  background: transparent;
  border: 0;
  border-bottom: 2px solid transparent;
  color: var(--qs-ink-500);
  font-family: inherit;
  font-size: var(--qs-fs-sm);
  font-weight: var(--qs-fw-medium);
  cursor: pointer;
  transition: color var(--qs-t-fast) var(--qs-ease),
              border-color var(--qs-t-fast) var(--qs-ease);
  margin-bottom: -1px;
}
body.qs-v3 .qs-v3-tab svg { width: 16px; height: 16px; }
body.qs-v3 .qs-v3-tab:hover { color: var(--qs-ink-800); }
body.qs-v3 .qs-v3-tab.is-active {
  color: var(--qs-navy-500);
  border-bottom-color: var(--qs-navy-500);
}
body.qs-v3 .qs-v3-tab:focus-visible {
  outline: none;
  box-shadow: var(--qs-sh-focus);
  border-radius: var(--qs-r-sm);
}


/* --------------------------------------------------------------------------
   8. Utilities
   -------------------------------------------------------------------------- */
body.qs-v3 .qs-v3-row {
  display: flex;
  align-items: center;
  gap: var(--qs-sp-3);
}
body.qs-v3 .qs-v3-row-between {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--qs-sp-3);
}
body.qs-v3 .qs-v3-stack {
  display: flex;
  flex-direction: column;
  gap: var(--qs-sp-4);
}
body.qs-v3 .qs-v3-grid-2 {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: var(--qs-sp-5);
}
body.qs-v3 .qs-v3-grid-3 {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: var(--qs-sp-5);
}
@media (max-width: 900px) {
  body.qs-v3 .qs-v3-grid-2,
  body.qs-v3 .qs-v3-grid-3 { grid-template-columns: 1fr; }
}

/* LOAD-BEARING — see the "LOAD-BEARING RULE" note in the file header.
   The [hidden] attribute is how this app's JS shows/hides panels, notices and
   badges (protectedPanel, accessDenied, authMessage, creditWarning, ...). A
   component rule carrying display:flex/grid/inline-flex out-specifies the UA's
   [hidden]{display:none} and forces the element visible. Guard globally. */
body.qs-v3 [hidden] { display: none !important; }

body.qs-v3 .qs-v3-muted { color: var(--qs-ink-500); }
body.qs-v3 .qs-v3-mono  { font-variant-numeric: tabular-nums; }
body.qs-v3 .qs-v3-divider { border-top: 1px solid var(--qs-border); margin: var(--qs-sp-5) 0; }

body.qs-v3 .qs-v3-scroll-shadow { position: relative; }


/* --------------------------------------------------------------------------
   9. Accessibility helpers
   -------------------------------------------------------------------------- */

/* Screen-reader only */
body.qs-v3 .qs-v3-sr-only {
  position: absolute;
  width: 1px;
  height: 1px;
  padding: 0;
  margin: -1px;
  overflow: hidden;
  clip: rect(0, 0, 0, 0);
  white-space: nowrap;
  border: 0;
}

/* Skip to content */
body.qs-v3 .qs-v3-skip-link {
  position: absolute;
  top: -40px;
  left: var(--qs-sp-4);
  padding: var(--qs-sp-2) var(--qs-sp-4);
  background: var(--qs-navy-900);
  color: #fff;
  border-radius: var(--qs-r-md);
  z-index: 1000;
  transition: top var(--qs-t-fast) var(--qs-ease);
}
body.qs-v3 .qs-v3-skip-link:focus { top: var(--qs-sp-4); }

/* Consistent focus ring on interactive elements without their own rule */
body.qs-v3 :where(button, [href], input, select, textarea, [tabindex]):not(
  .qs-v3-btn, .qs-v3-nav-item, .qs-v3-tab, .qs-v3-input, .qs-v3-select, .qs-v3-textarea
):focus-visible {
  outline: 2px solid var(--qs-navy-500);
  outline-offset: 2px;
}

/* Reduce motion respect */
@media (prefers-reduced-motion: reduce) {
  body.qs-v3 * {
    animation-duration: 0.001ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: 0.001ms !important;
  }
}

/* Print baseline: keep public quote printable */
@media print {
  body.qs-v3 .qs-v3-sidebar,
  body.qs-v3 .qs-v3-topbar { display: none !important; }
  body.qs-v3 .qs-v3-shell { grid-template-columns: 1fr; }
  body.qs-v3 .qs-v3-content { padding: 0; }
}

/* v87 actual QuoteSuite renderer inside Agency Branding live preview */
body.qs-v3.qs-v3-branding .qs-v3-branding-layout {
  grid-template-columns: minmax(0,1fr) minmax(520px,.96fr);
}
body.qs-v3.qs-v3-branding .qs-v3-branding-preview > .qs-v3-card {
  padding: var(--qs-sp-5);
}
body.qs-v3.qs-v3-branding .qs-v3-preview-stage {
  display: block;
  padding: 12px;
  border: 1px solid var(--qs-border);
  background: #eef3f8;
}
body.qs-v3.qs-v3-branding .qs-v3-actual-preview-shell {
  width: 100%;
  overflow: hidden;
  border: 1px solid #d9e3ee;
  border-radius: 10px;
  background: #e8eef5;
  box-shadow: 0 8px 24px rgba(20,47,78,.08);
}
body.qs-v3.qs-v3-branding .qs-v3-actual-preview-scroll {
  height: min(650px,calc(100vh - 285px));
  min-height: 510px;
  overflow: auto;
  padding: 14px;
  overscroll-behavior: contain;
  scrollbar-color: #aab8c9 transparent;
}
body.qs-v3.qs-v3-branding .qs-v3-actual-preview-document {
  margin: 0 auto;
  transform-origin: top center;
  transition: width var(--qs-t-base) var(--qs-ease), zoom var(--qs-t-base) var(--qs-ease);
}
body.qs-v3.qs-v3-branding .qs-v3-preview-stage[data-device="desktop"] .qs-v3-actual-preview-document {
  width: 820px;
  zoom: .62;
}
body.qs-v3.qs-v3-branding .qs-v3-preview-stage[data-device="mobile"] .qs-v3-actual-preview-document {
  width: 390px;
  zoom: .86;
}
body.qs-v3.qs-v3-branding #publicQuote .quote-rendered {
  min-height: 100%;
  overflow: hidden;
  border: 1px solid #dce5ef;
  border-radius: 8px;
  background: #fff;
  box-shadow: 0 14px 35px rgba(15,38,67,.12);
}
body.qs-v3.qs-v3-branding #publicQuote .letterhead {
  background: #fff;
}
body.qs-v3.qs-v3-branding .qs-v3-preview-stage[data-device="mobile"] #publicQuote .letterhead {
  align-items: flex-start;
  flex-direction: column;
}
body.qs-v3.qs-v3-branding .qs-v3-preview-stage[data-device="mobile"] #publicQuote .day-content,
body.qs-v3.qs-v3-branding .qs-v3-preview-stage[data-device="mobile"] #publicQuote .hotel-row-display,
body.qs-v3.qs-v3-branding .qs-v3-preview-stage[data-device="mobile"] #publicQuote .inclusion-grid,
body.qs-v3.qs-v3-branding .qs-v3-preview-stage[data-device="mobile"] #publicQuote .terms-grid,
body.qs-v3.qs-v3-branding .qs-v3-preview-stage[data-device="mobile"] #publicQuote .quote-pricing-summary {
  grid-template-columns: 1fr;
}
body.qs-v3.qs-v3-branding .qs-v3-preview-stage[data-device="mobile"] #publicQuote .quote-pricing-grand {
  padding-top: 18px;
  padding-left: 0;
  text-align: left;
  border-top: 1px solid var(--qs-border);
  border-left: 0;
}
body.qs-v3.qs-v3-branding .qs-v3-preview-note {
  margin-right: auto;
  margin-left: auto;
  max-width: 560px;
  line-height: 1.5;
}

@media (max-width: 1180px) {
  body.qs-v3.qs-v3-branding .qs-v3-branding-layout { grid-template-columns: minmax(0,1fr); }
  body.qs-v3.qs-v3-branding .qs-v3-branding-preview { position: static; }
  body.qs-v3.qs-v3-branding .qs-v3-actual-preview-scroll { height: 650px; }
}
@media (max-width: 640px) {
  body.qs-v3.qs-v3-branding .qs-v3-branding-preview > .qs-v3-card { padding: var(--qs-sp-4); }
  body.qs-v3.qs-v3-branding .qs-v3-preview-head { align-items: flex-start; flex-direction: column; }
  body.qs-v3.qs-v3-branding .qs-v3-preview-toggle { width: 100%; }
  body.qs-v3.qs-v3-branding .qs-v3-preview-device { flex: 1; }
  body.qs-v3.qs-v3-branding .qs-v3-preview-stage { padding: 7px; }
  body.qs-v3.qs-v3-branding .qs-v3-actual-preview-scroll { min-height: 480px; padding: 8px; }
  body.qs-v3.qs-v3-branding .qs-v3-preview-stage[data-device="desktop"] .qs-v3-actual-preview-document { zoom: .42; }
  body.qs-v3.qs-v3-branding .qs-v3-preview-stage[data-device="mobile"] .qs-v3-actual-preview-document { zoom: .72; }
}

/* v86 keep the selected Ready Package market visible in every interaction state */
body.qs-v3.qs-v3-ready .ready-market-tabs button.is-active,
body.qs-v3.qs-v3-ready .ready-market-tabs button.is-active:hover,
body.qs-v3.qs-v3-ready .ready-market-tabs button.is-active:focus,
body.qs-v3.qs-v3-ready .ready-market-tabs button.is-active:active {
  color: #fff !important;
  background: #2563eb !important;
  border-color: #2563eb !important;
  opacity: 1 !important;
  box-shadow: 0 5px 14px rgba(37,99,235,.22) !important;
}
body.qs-v3.qs-v3-ready .ready-market-tabs button:not(.is-active):hover,
body.qs-v3.qs-v3-ready .ready-market-tabs button:not(.is-active):focus {
  color: #173b68 !important;
  background: #eaf2ff !important;
}

/* End of qs-redesign.css base file. Per-page sections are added below this
   line under clearly-labelled comment blocks, e.g. "=== LOGIN ===",
   "=== DASHBOARD (agent.html) ===", "=== CUSTOMERS ===".
   Note: CSS comments do not nest, so section labels are written as plain
   text here rather than as example comments. */


/* === LOGIN ===============================================================
   login.html — split screen. Left: hero photo + navy scrim + brand + 3
   feature bullets. Right: white auth panel.

   Hooks preserved and styled by ID/existing class, not by new class:
     #loginForm, #email, #password  — read by assets/js/auth.js
     #authMessage (.notice)         — auth.js setMessage() overwrites
                                      className, so never rely on a qs-v3-
                                      class surviving on that element.
   ========================================================================== */

/* Scrim tints. Derived from --qs-navy-900 (#0D2B5E); declared once here
   because CSS cannot apply alpha to an existing hex token directly. */
body.qs-v3.qs-v3-login {
  --qs-login-scrim-1: rgba(13, 43, 94, 0.94);
  --qs-login-scrim-2: rgba(13, 43, 94, 0.74);
  --qs-login-scrim-3: rgba(13, 43, 94, 0.40);
  --qs-login-scrim-flat: rgba(13, 43, 94, 0.28);
  --qs-login-hero-text: rgba(255, 255, 255, 0.78);
  --qs-login-hero-rule: var(--qs-gold-500);
  --qs-login-panel-w: 460px;

  background: var(--qs-surface);
  min-height: 100vh;
  margin: 0;
}

/* Split shell ------------------------------------------------------------ */
body.qs-v3 .qs-v3-login-split {
  display: grid;
  grid-template-columns: minmax(0, 1.45fr) minmax(0, 1fr);
  min-height: 100vh;
}

/* Left: hero -------------------------------------------------------------- */
body.qs-v3 .qs-v3-login-hero {
  position: relative;
  display: flex;
  flex-direction: column;
  justify-content: center;
  gap: var(--qs-sp-10);
  padding: var(--qs-sp-12) clamp(var(--qs-sp-8), 5vw, var(--qs-sp-16));
  overflow: hidden;

  /* Solid navy fallback shows if login-hero.jpg is missing or still loading */
  background-color: var(--qs-navy-900);
  background-image:
    linear-gradient(var(--qs-login-scrim-flat), var(--qs-login-scrim-flat)),
    linear-gradient(105deg,
      var(--qs-login-scrim-1) 0%,
      var(--qs-login-scrim-2) 46%,
      var(--qs-login-scrim-3) 100%),
    url("../images/login-hero.jpg");
  background-size: cover;
  background-position: center;
  background-repeat: no-repeat;
}

body.qs-v3 .qs-v3-login-brand {
  display: inline-flex;
  align-items: center;
  gap: var(--qs-sp-3);
  color: var(--qs-gold-500);
  font-family: var(--qs-font-display);
  font-size: var(--qs-fs-4xl);
  font-weight: var(--qs-fw-bold);
  letter-spacing: -0.02em;
  line-height: 1;
}
body.qs-v3 .qs-v3-login-brand svg {
  width: 1.5em;
  height: 1.5em;
  flex-shrink: 0;
}

body.qs-v3 .qs-v3-login-hero-title {
  font-family: var(--qs-font-display);
  font-size: clamp(var(--qs-fs-4xl), 3.4vw, var(--qs-fs-5xl));
  font-weight: var(--qs-fw-medium);
  line-height: var(--qs-lh-tight);
  letter-spacing: -0.02em;
  color: #FFFFFF;
  /* em-based so the 3-line wrap of the mockup holds as the size clamps */
  max-width: 8em;
}

body.qs-v3 .qs-v3-login-rule {
  width: var(--qs-sp-16);
  height: 2px;
  border: 0;
  margin: var(--qs-sp-6) 0 0;
  background: var(--qs-login-hero-rule);
}

body.qs-v3 .qs-v3-login-features {
  display: flex;
  flex-direction: column;
  gap: var(--qs-sp-6);
  margin: 0;
  padding: 0;
  list-style: none;
  max-width: 46ch;
}
body.qs-v3 .qs-v3-login-feature {
  display: grid;
  grid-template-columns: auto minmax(0, 1fr);
  gap: var(--qs-sp-4);
  align-items: start;
}
body.qs-v3 .qs-v3-login-feature svg {
  width: 26px;
  height: 26px;
  color: var(--qs-gold-500);
  stroke: currentColor;
  fill: none;
  stroke-width: 1.5;
  stroke-linecap: round;
  stroke-linejoin: round;
  flex-shrink: 0;
  margin-top: 2px;
}
body.qs-v3 .qs-v3-login-feature h3 {
  color: #FFFFFF;
  font-family: var(--qs-font-ui);
  font-size: var(--qs-fs-lg);
  font-weight: var(--qs-fw-semibold);
  letter-spacing: -0.005em;
}
body.qs-v3 .qs-v3-login-feature p {
  color: var(--qs-login-hero-text);
  font-size: var(--qs-fs-base);
  line-height: var(--qs-lh-normal);
  margin-top: var(--qs-sp-1);
}

/* Right: auth panel ------------------------------------------------------- */
body.qs-v3 .qs-v3-login-panel {
  display: flex;
  align-items: center;
  justify-content: center;
  padding: var(--qs-sp-10) var(--qs-sp-8);
  background: var(--qs-surface);
}

body.qs-v3 .qs-v3-login-card {
  width: 100%;
  max-width: var(--qs-login-panel-w);
  display: flex;
  flex-direction: column;
}

body.qs-v3 .qs-v3-login-head {
  text-align: center;
  margin-bottom: var(--qs-sp-8);
}
body.qs-v3 .qs-v3-login-head h1 {
  font-family: var(--qs-font-display);
  font-size: var(--qs-fs-4xl);
  font-weight: var(--qs-fw-bold);
  color: var(--qs-navy-900);
  letter-spacing: -0.02em;
}
body.qs-v3 .qs-v3-login-head p {
  color: var(--qs-ink-500);
  font-size: var(--qs-fs-lg);
  margin-top: var(--qs-sp-2);
}

/* Form ------------------------------------------------------------------- */
body.qs-v3 #loginForm {
  display: flex;
  flex-direction: column;
  gap: var(--qs-sp-5);
}

body.qs-v3 .qs-v3-login-field {
  display: flex;
  flex-direction: column;
  gap: var(--qs-sp-2);
}
body.qs-v3 .qs-v3-login-field > label {
  font-size: var(--qs-fs-base);
  font-weight: var(--qs-fw-semibold);
  color: var(--qs-ink-900);
}

/* Taller inputs than the base .qs-v3-input primitive, to match the mockup */
body.qs-v3 .qs-v3-login-field .qs-v3-input {
  padding: 14px var(--qs-sp-4);
  font-size: var(--qs-fs-lg);
  border-color: var(--qs-border);
}
body.qs-v3 .qs-v3-login-field .qs-v3-input:hover { border-color: var(--qs-border-strong); }

/* Password + reveal toggle */
body.qs-v3 .qs-v3-login-password { position: relative; }
body.qs-v3 .qs-v3-login-password .qs-v3-input { padding-right: var(--qs-sp-12); }

body.qs-v3 .qs-v3-login-eye {
  position: absolute;
  top: 50%;
  right: var(--qs-sp-2);
  transform: translateY(-50%);
  width: 36px;
  height: 36px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  padding: 0;
  background: transparent;
  border: 0;
  border-radius: var(--qs-r-sm);
  color: var(--qs-ink-500);
  cursor: pointer;
  transition: color var(--qs-t-fast) var(--qs-ease),
              background var(--qs-t-fast) var(--qs-ease);
}
body.qs-v3 .qs-v3-login-eye:hover { color: var(--qs-ink-800); background: var(--qs-ink-100); }
body.qs-v3 .qs-v3-login-eye svg {
  width: 20px;
  height: 20px;
  stroke: currentColor;
  fill: none;
  stroke-width: 1.6;
  stroke-linecap: round;
  stroke-linejoin: round;
}
body.qs-v3 .qs-v3-login-eye .qs-v3-eye-off { display: none; }
body.qs-v3 .qs-v3-login-eye[aria-pressed="true"] .qs-v3-eye-on  { display: none; }
body.qs-v3 .qs-v3-login-eye[aria-pressed="true"] .qs-v3-eye-off { display: block; }

/* "Forgot password? Contact admin" — informational text, no reset flow
   exists backend-side, so this is deliberately not a link. */
body.qs-v3 .qs-v3-login-forgot {
  align-self: flex-end;
  font-size: var(--qs-fs-sm);
  color: var(--qs-ink-500);
  margin-top: calc(var(--qs-sp-2) * -1);
}

body.qs-v3 .qs-v3-login-submit {
  width: 100%;
  padding: 15px var(--qs-sp-5);
  font-size: var(--qs-fs-lg);
  border-radius: var(--qs-r-md);
  margin-top: var(--qs-sp-1);
}

/* #authMessage keeps its .notice class only — auth.js rewrites className */
body.qs-v3 .notice {
  margin: var(--qs-sp-4) 0 0;
  border-radius: var(--qs-r-md);
  border: 1px solid var(--qs-border);
  padding: var(--qs-sp-3) var(--qs-sp-4);
  font-size: var(--qs-fs-sm);
  color: var(--qs-ink-700);
  background: var(--qs-surface-alt);
}
body.qs-v3 .notice.success { border-color: var(--qs-success); color: #065F46; background: var(--qs-success-soft); }
body.qs-v3 .notice.error   { border-color: var(--qs-danger);  color: #991B1B; background: var(--qs-danger-soft); }
body.qs-v3 .notice.info    { border-color: var(--qs-info);    color: #1E40AF; background: var(--qs-info-soft); }
body.qs-v3 .notice.warning { border-color: var(--qs-warning); color: #92400E; background: var(--qs-warning-soft); }

/* Panel footer ------------------------------------------------------------ */
body.qs-v3 .qs-v3-login-secure {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: var(--qs-sp-2);
  margin-top: var(--qs-sp-5);
  color: var(--qs-ink-500);
  font-size: var(--qs-fs-sm);
}
body.qs-v3 .qs-v3-login-secure svg {
  width: 14px;
  height: 14px;
  stroke: currentColor;
  fill: none;
  stroke-width: 1.6;
  flex-shrink: 0;
}

body.qs-v3 .qs-v3-login-help {
  margin-top: var(--qs-sp-8);
  text-align: center;
  color: var(--qs-ink-500);
  font-size: var(--qs-fs-base);
}
body.qs-v3 .qs-v3-login-help strong {
  color: var(--qs-navy-500);
  font-weight: var(--qs-fw-semibold);
}

body.qs-v3 .qs-v3-login-foot {
  margin-top: var(--qs-sp-8);
  padding-top: var(--qs-sp-5);
  border-top: 1px solid var(--qs-border);
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: var(--qs-sp-2);
}
body.qs-v3 .qs-v3-login-copy {
  color: var(--qs-ink-400);
  font-size: var(--qs-fs-sm);
}
body.qs-v3 .qs-v3-login-setup {
  color: var(--qs-ink-400);
  font-size: var(--qs-fs-xs);
}
body.qs-v3 .qs-v3-login-setup:hover { color: var(--qs-navy-500); }

/* Responsive -------------------------------------------------------------- */

/* Below 1024px the hero becomes a banner above the form and drops bullets */
@media (max-width: 1024px) {
  body.qs-v3 .qs-v3-login-split { grid-template-columns: 1fr; min-height: 0; }
  body.qs-v3 .qs-v3-login-hero {
    gap: var(--qs-sp-6);
    padding: var(--qs-sp-10) var(--qs-sp-8);
    background-image:
      linear-gradient(var(--qs-login-scrim-flat), var(--qs-login-scrim-flat)),
      linear-gradient(160deg,
        var(--qs-login-scrim-1) 0%,
        var(--qs-login-scrim-2) 60%,
        var(--qs-login-scrim-3) 100%),
      url("../images/login-hero.jpg");
  }
  body.qs-v3 .qs-v3-login-hero-title { font-size: var(--qs-fs-4xl); max-width: 14em; }
  body.qs-v3 .qs-v3-login-features,
  body.qs-v3 .qs-v3-login-rule { display: none; }
  body.qs-v3 .qs-v3-login-panel { padding: var(--qs-sp-10) var(--qs-sp-6); }
}

@media (max-width: 600px) {
  body.qs-v3 .qs-v3-login-hero { padding: var(--qs-sp-8) var(--qs-sp-5); }
  body.qs-v3 .qs-v3-login-brand { font-size: var(--qs-fs-3xl); }
  body.qs-v3 .qs-v3-login-hero-title { font-size: var(--qs-fs-3xl); }
  body.qs-v3 .qs-v3-login-panel { padding: var(--qs-sp-8) var(--qs-sp-5); }
  body.qs-v3 .qs-v3-login-head h1 { font-size: var(--qs-fs-3xl); }
  body.qs-v3 .qs-v3-login-head p { font-size: var(--qs-fs-base); }
}

/* === WALLET RECHARGE (recharge.html) =================================== */
body.qs-v3.qs-v3-recharge { margin: 0; }
body.qs-v3 .qs-v3-topbar-spacer { flex: 1 1 auto; }
body.qs-v3 .qs-v3-page-actions {
  display: flex;
  align-items: flex-start;
  justify-content: space-between;
  gap: var(--qs-sp-4);
}
body.qs-v3 .qs-v3-page-actions h1 { font-size: var(--qs-fs-2xl); }
body.qs-v3 .qs-v3-page-actions p { margin-top: var(--qs-sp-1); color: var(--qs-ink-500); }
body.qs-v3 .qs-v3-recharge-stats { grid-template-columns: repeat(3, minmax(0, 1fr)); }
body.qs-v3 .qs-v3-recharge-layout {
  display: grid;
  grid-template-columns: minmax(0, 1.7fr) minmax(280px, 0.8fr);
  gap: var(--qs-sp-5);
  align-items: start;
}
body.qs-v3 .qs-v3-recharge-empty {
  min-height: 320px;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: var(--qs-sp-3);
  padding: var(--qs-sp-8);
  text-align: center;
  border: 1px dashed var(--qs-border);
  border-radius: var(--qs-r-lg);
  background: var(--qs-surface-alt);
}
body.qs-v3 .qs-v3-recharge-empty h3 { font-size: var(--qs-fs-xl); }
body.qs-v3 .qs-v3-recharge-empty p { max-width: 52ch; color: var(--qs-ink-500); }
body.qs-v3 .qs-v3-recharge-icon {
  width: 64px;
  height: 64px;
  display: inline-grid;
  place-items: center;
  border-radius: var(--qs-r-xl);
  background: var(--qs-surface-alt);
  color: var(--qs-navy-500);
}
body.qs-v3 .qs-v3-recharge-icon svg { width: 30px; height: 30px; }

body.qs-v3 .qs-v3-recharge-request-card { overflow: hidden; }
body.qs-v3 .qs-v3-recharge-start-form { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr) 310px; gap: var(--qs-sp-5); align-items: stretch; }
body.qs-v3 .qs-v3-recharge-fieldset { min-width: 0; margin: 0; padding: var(--qs-sp-5); border: 1px solid var(--qs-border); border-radius: var(--qs-r-lg); background: var(--qs-surface-alt); }
body.qs-v3 .qs-v3-recharge-fieldset legend { padding: 0 var(--qs-sp-2); color: var(--qs-navy-900); font-weight: var(--qs-fw-semibold); }
body.qs-v3 .qs-v3-recharge-amounts { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: var(--qs-sp-2); margin-bottom: var(--qs-sp-4); }
body.qs-v3 .qs-v3-recharge-amounts button { min-height: 42px; border: 1px solid var(--qs-border); border-radius: var(--qs-r-md); color: var(--qs-ink-700); background: #fff; font: inherit; font-weight: var(--qs-fw-semibold); cursor: pointer; }
body.qs-v3 .qs-v3-recharge-amounts button:hover,
body.qs-v3 .qs-v3-recharge-amounts button.is-selected { border-color: var(--qs-navy-500); color: var(--qs-navy-700); background: var(--qs-info-soft); box-shadow: 0 0 0 2px rgba(37, 99, 235, .08); }
body.qs-v3 .qs-v3-recharge-field { display: grid; gap: 7px; color: var(--qs-ink-700); font-size: var(--qs-fs-sm); font-weight: var(--qs-fw-medium); }
body.qs-v3 .qs-v3-recharge-field b { color: var(--qs-danger); }
body.qs-v3 .qs-v3-recharge-field em { color: var(--qs-ink-400); font-size: var(--qs-fs-xs); font-style: normal; font-weight: var(--qs-fw-normal); }
body.qs-v3 .qs-v3-recharge-field small { color: var(--qs-ink-400); font-size: var(--qs-fs-xs); font-weight: var(--qs-fw-normal); }
body.qs-v3 .qs-v3-recharge-field input,
body.qs-v3 .qs-v3-recharge-field textarea { width: 100%; min-height: 44px; border: 1px solid var(--qs-border); border-radius: var(--qs-r-md); padding: 10px 12px; color: var(--qs-ink-800); background: #fff; font: inherit; }
body.qs-v3 .qs-v3-recharge-field textarea { resize: vertical; }
body.qs-v3 .qs-v3-money-input { display: grid; grid-template-columns: auto minmax(0, 1fr); align-items: center; border: 1px solid var(--qs-border); border-radius: var(--qs-r-md); background: #fff; overflow: hidden; }
body.qs-v3 .qs-v3-money-input > span { padding-left: 12px; color: var(--qs-ink-500); }
body.qs-v3 .qs-v3-money-input input { border: 0; border-radius: 0; }
body.qs-v3 .qs-v3-recharge-methods { display: grid; gap: var(--qs-sp-3); }
body.qs-v3 .qs-v3-recharge-methods label { display: grid; grid-template-columns: auto minmax(0, 1fr); gap: var(--qs-sp-3); align-items: center; min-height: 70px; padding: var(--qs-sp-3) var(--qs-sp-4); border: 1px solid var(--qs-border); border-radius: var(--qs-r-md); background: #fff; cursor: pointer; }
body.qs-v3 .qs-v3-recharge-methods label:has(input:checked) { border-color: var(--qs-navy-500); background: var(--qs-info-soft); box-shadow: 0 0 0 2px rgba(37, 99, 235, .08); }
body.qs-v3 .qs-v3-recharge-methods input { width: 18px; height: 18px; accent-color: var(--qs-navy-500); }
body.qs-v3 .qs-v3-recharge-methods strong,
body.qs-v3 .qs-v3-recharge-methods small { display: block; }
body.qs-v3 .qs-v3-recharge-methods small { margin-top: 2px; color: var(--qs-ink-500); font-size: var(--qs-fs-xs); }
body.qs-v3 .qs-v3-recharge-calculation { display: flex; flex-direction: column; padding: var(--qs-sp-5); border: 1px solid #E8D49E; border-radius: var(--qs-r-lg); background: #FFFBEB; }
body.qs-v3 .qs-v3-recharge-calculation > div { display: flex; justify-content: space-between; gap: var(--qs-sp-3); padding: 7px 0; color: var(--qs-ink-600); font-size: var(--qs-fs-sm); }
body.qs-v3 .qs-v3-recharge-calculation > div.total { margin-top: 5px; padding-top: 13px; border-top: 1px solid #E8D49E; color: var(--qs-navy-900); font-size: var(--qs-fs-base); }
body.qs-v3 .qs-v3-recharge-calculation > div.total strong { font-size: var(--qs-fs-xl); }
body.qs-v3 .qs-v3-recharge-calculation p { margin: auto 0 0; padding-top: var(--qs-sp-4); color: var(--qs-ink-500); font-size: var(--qs-fs-xs); line-height: 1.55; }
body.qs-v3 .qs-v3-recharge-start-form > .qs-v3-btn { grid-column: 1 / -1; justify-self: end; min-width: 220px; }

body.qs-v3 .qs-v3-recharge-payment { border: 1px solid var(--qs-border); border-radius: var(--qs-r-lg); background: var(--qs-surface-alt); overflow: hidden; }
body.qs-v3 .qs-v3-recharge-request-head { display: flex; align-items: center; justify-content: space-between; gap: var(--qs-sp-4); padding: var(--qs-sp-4) var(--qs-sp-5); border-bottom: 1px solid var(--qs-border); background: #fff; }
body.qs-v3 .qs-v3-recharge-request-head > div span,
body.qs-v3 .qs-v3-recharge-request-head > div strong { display: block; }
body.qs-v3 .qs-v3-recharge-request-head > div span { color: var(--qs-navy-500); font-size: var(--qs-fs-xs); font-weight: var(--qs-fw-bold); letter-spacing: .07em; }
body.qs-v3 .qs-v3-recharge-request-head > div strong { margin-top: 3px; color: var(--qs-navy-900); }
body.qs-v3 .qs-v3-recharge-pay-grid { display: grid; grid-template-columns: minmax(280px, .8fr) minmax(320px, 1.2fr); gap: var(--qs-sp-5); padding: var(--qs-sp-5); }
body.qs-v3 .qs-v3-recharge-qr,
body.qs-v3 .qs-v3-recharge-bank,
body.qs-v3 .qs-v3-recharge-confirm-form { padding: var(--qs-sp-5); border: 1px solid var(--qs-border); border-radius: var(--qs-r-lg); background: #fff; }
body.qs-v3 .qs-v3-recharge-section-label { display: block; margin-bottom: var(--qs-sp-4); color: var(--qs-navy-900); font-weight: var(--qs-fw-semibold); }
body.qs-v3 .qs-v3-recharge-qr { grid-row: span 1; text-align: center; }
body.qs-v3 .qs-v3-recharge-qr img { display: block; width: min(100%, 310px); max-height: 390px; margin: 0 auto var(--qs-sp-4); border: 1px solid var(--qs-border); border-radius: var(--qs-r-md); object-fit: contain; }
body.qs-v3 .qs-v3-recharge-qr > strong { display: block; color: var(--qs-navy-900); }
body.qs-v3 .qs-v3-recharge-qr > div { display: flex; align-items: center; justify-content: center; gap: var(--qs-sp-2); margin-top: var(--qs-sp-2); color: var(--qs-ink-500); font-size: var(--qs-fs-xs); overflow-wrap: anywhere; }
body.qs-v3 .qs-v3-recharge-qr button,
body.qs-v3 .qs-v3-recharge-bank button,
body.qs-v3 .qs-v3-recharge-row-actions button { border: 0; padding: 2px 5px; color: var(--qs-navy-500); background: transparent; font: inherit; font-size: var(--qs-fs-xs); font-weight: var(--qs-fw-semibold); cursor: pointer; }
body.qs-v3 .qs-v3-recharge-qr p { margin: var(--qs-sp-4) 0 0; padding: var(--qs-sp-3); border-radius: var(--qs-r-md); color: #92400E; background: var(--qs-warning-soft); font-size: var(--qs-fs-sm); }
body.qs-v3 .qs-v3-recharge-bank dl { display: grid; margin: 0; }
body.qs-v3 .qs-v3-recharge-bank dl > div { display: grid; grid-template-columns: 135px minmax(0, 1fr); gap: var(--qs-sp-3); padding: 11px 0; border-bottom: 1px solid var(--qs-border); }
body.qs-v3 .qs-v3-recharge-bank dt { color: var(--qs-ink-500); font-size: var(--qs-fs-sm); }
body.qs-v3 .qs-v3-recharge-bank dd { margin: 0; color: var(--qs-ink-800); font-weight: var(--qs-fw-semibold); overflow-wrap: anywhere; }
body.qs-v3 .qs-v3-recharge-bank dl > div.total { border-bottom: 0; color: var(--qs-navy-900); }
body.qs-v3 .qs-v3-recharge-bank dl > div.total dd { font-size: var(--qs-fs-xl); }
body.qs-v3 .qs-v3-recharge-confirm-form { display: grid; gap: var(--qs-sp-4); }
body.qs-v3 .qs-v3-recharge-confirm-form input[type="file"] { padding: 7px; }
body.qs-v3 .qs-v3-recharge-declaration { display: grid; grid-template-columns: auto minmax(0, 1fr); gap: var(--qs-sp-2); align-items: start; color: var(--qs-ink-600); font-size: var(--qs-fs-sm); cursor: pointer; }
body.qs-v3 .qs-v3-recharge-declaration input { width: 17px; height: 17px; margin-top: 1px; accent-color: var(--qs-navy-500); }
body.qs-v3 .qs-v3-recharge-form-actions { display: flex; justify-content: flex-end; gap: var(--qs-sp-3); }

body.qs-v3 .qs-v3-recharge-table-wrap { overflow-x: auto; }
body.qs-v3 .qs-v3-recharge-table-wrap table { width: 100%; min-width: 950px; border-collapse: collapse; }
body.qs-v3 .qs-v3-recharge-table-wrap th { padding: 12px; border-bottom: 1px solid var(--qs-border); color: var(--qs-ink-500); background: var(--qs-surface-alt); font-size: var(--qs-fs-xs); text-align: left; text-transform: uppercase; letter-spacing: .03em; }
body.qs-v3 .qs-v3-recharge-table-wrap td { padding: 13px 12px; border-bottom: 1px solid var(--qs-border); color: var(--qs-ink-700); font-size: var(--qs-fs-sm); vertical-align: top; }
body.qs-v3 .qs-v3-recharge-table-wrap td strong,
body.qs-v3 .qs-v3-recharge-table-wrap td small { display: block; }
body.qs-v3 .qs-v3-recharge-table-wrap td small { margin-top: 3px; color: var(--qs-ink-400); }
body.qs-v3 .qs-v3-recharge-status { display: inline-flex; padding: 5px 9px; border-radius: var(--qs-r-full); color: var(--qs-ink-600); background: var(--qs-surface-alt); font-size: var(--qs-fs-xs); font-weight: var(--qs-fw-semibold); white-space: nowrap; }
body.qs-v3 .qs-v3-recharge-status.pending_verification { color: #92400E; background: var(--qs-warning-soft); }
body.qs-v3 .qs-v3-recharge-status.approved { color: #065F46; background: var(--qs-success-soft); }
body.qs-v3 .qs-v3-recharge-status.rejected,
body.qs-v3 .qs-v3-recharge-status.cancelled { color: #991B1B; background: var(--qs-danger-soft); }
body.qs-v3 .qs-v3-recharge-review-note { max-width: 210px; line-height: 1.4; }
body.qs-v3 .qs-v3-recharge-row-actions { display: flex; flex-wrap: wrap; gap: 5px; }
body.qs-v3 .qs-v3-recharge-row-actions a { color: var(--qs-navy-500); font-size: var(--qs-fs-xs); font-weight: var(--qs-fw-semibold); }
body.qs-v3 .qs-v3-recharge-row-actions button.danger { color: var(--qs-danger); }
body.qs-v3 .qs-v3-recharge-no-records { padding: var(--qs-sp-6); color: var(--qs-ink-500); text-align: center; }

@media (max-width: 1100px) {
  body.qs-v3 .qs-v3-recharge-layout { grid-template-columns: minmax(0, 1fr); }
  body.qs-v3 .qs-v3-recharge-start-form { grid-template-columns: 1fr 1fr; }
  body.qs-v3 .qs-v3-recharge-calculation { grid-column: 1 / -1; }
}
@media (max-width: 900px) {
  body.qs-v3 .qs-v3-recharge-stats { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  body.qs-v3 .qs-v3-recharge-pay-grid { grid-template-columns: 1fr; }
}
@media (max-width: 640px) {
  body.qs-v3 .qs-v3-recharge-stats { grid-template-columns: 1fr; }
  body.qs-v3 .qs-v3-page-actions { flex-direction: column; }
  body.qs-v3 .qs-v3-page-actions .qs-v3-btn { width: 100%; }
  body.qs-v3 .qs-v3-recharge-empty { min-height: 0; padding: var(--qs-sp-6) var(--qs-sp-4); }
  body.qs-v3 .qs-v3-recharge-empty .qs-v3-btn { width: 100%; }
  body.qs-v3 .qs-v3-recharge-start-form { grid-template-columns: 1fr; }
  body.qs-v3 .qs-v3-recharge-calculation { grid-column: auto; }
  body.qs-v3 .qs-v3-recharge-start-form > .qs-v3-btn { width: 100%; min-width: 0; }
  body.qs-v3 .qs-v3-recharge-amounts { grid-template-columns: 1fr 1fr; }
  body.qs-v3 .qs-v3-recharge-pay-grid { padding: var(--qs-sp-3); }
  body.qs-v3 .qs-v3-recharge-qr,
  body.qs-v3 .qs-v3-recharge-bank,
  body.qs-v3 .qs-v3-recharge-confirm-form { padding: var(--qs-sp-4); }
  body.qs-v3 .qs-v3-recharge-bank dl > div { grid-template-columns: 1fr; gap: 3px; }
  body.qs-v3 .qs-v3-recharge-form-actions { flex-direction: column-reverse; }
  body.qs-v3 .qs-v3-recharge-form-actions .qs-v3-btn { width: 100%; }
}


/* Login enhancements: same visual system, inline OTP and rotating promos. */
body.qs-v3 .qs-v3-login-promo-track {
  min-height: clamp(174px, 15vw, 216px);
  display: flex;
  align-items: flex-end;
}
body.qs-v3 .qs-v3-login-promo-slide { width: 100%; }
body.qs-v3 .qs-v3-login-promo-slide[hidden] { display: none !important; }
body.qs-v3 .qs-v3-login-promo-controls {
  display: flex;
  align-items: center;
  gap: var(--qs-sp-3);
  margin-top: var(--qs-sp-5);
}
body.qs-v3 .qs-v3-login-promo-arrow {
  width: 30px;
  height: 30px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  border: 1px solid rgba(255, 255, 255, 0.3);
  border-radius: 50%;
  padding: 0;
  color: #fff;
  background: rgba(255, 255, 255, 0.08);
  cursor: pointer;
}
body.qs-v3 .qs-v3-login-promo-arrow:hover,
body.qs-v3 .qs-v3-login-promo-arrow:focus-visible { border-color: var(--qs-gold-500); color: var(--qs-gold-500); }
body.qs-v3 .qs-v3-login-promo-arrow svg {
  width: 17px;
  height: 17px;
  fill: none;
  stroke: currentColor;
  stroke-width: 1.8;
  stroke-linecap: round;
  stroke-linejoin: round;
}
body.qs-v3 .qs-v3-login-promo-dots { display: inline-flex; align-items: center; gap: 7px; }
body.qs-v3 .qs-v3-login-promo-dots button {
  width: 7px;
  height: 7px;
  border: 0;
  border-radius: 999px;
  padding: 0;
  background: rgba(255, 255, 255, 0.45);
  cursor: pointer;
  transition: width var(--qs-t-fast) var(--qs-ease), background var(--qs-t-fast) var(--qs-ease);
}
body.qs-v3 .qs-v3-login-promo-dots button[aria-selected="true"] { width: 24px; background: var(--qs-gold-500); }

body.qs-v3 .qs-v3-login-forgot a { color: inherit; text-decoration: none; }
body.qs-v3 .qs-v3-login-forgot a:hover,
body.qs-v3 .qs-v3-login-forgot a:focus-visible { color: var(--qs-navy-500); text-decoration: underline; }

body.qs-v3 #loginForm[hidden] { display: none !important; }
body.qs-v3 .qs-v3-login-otp[hidden] { display: none !important; }
body.qs-v3 #loginOtpForm { display: flex; flex-direction: column; gap: var(--qs-sp-5); }
body.qs-v3 .qs-v3-login-otp-note {
  margin: 0 0 var(--qs-sp-5);
  color: var(--qs-ink-500);
  font-size: var(--qs-fs-sm);
  line-height: var(--qs-lh-normal);
  text-align: center;
}
body.qs-v3 .qs-v3-login-otp-note strong { color: var(--qs-ink-700); }
body.qs-v3 .qs-v3-login-otp-input {
  text-align: center;
  letter-spacing: 0.3em;
  font-variant-numeric: tabular-nums;
}
body.qs-v3 .qs-v3-login-otp-actions {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--qs-sp-4);
  margin-top: var(--qs-sp-4);
}
body.qs-v3 .qs-v3-login-text-button {
  border: 0;
  padding: var(--qs-sp-1) 0;
  color: var(--qs-navy-500);
  background: transparent;
  font: inherit;
  font-size: var(--qs-fs-sm);
  font-weight: var(--qs-fw-semibold);
  cursor: pointer;
}
body.qs-v3 .qs-v3-login-text-button:hover,
body.qs-v3 .qs-v3-login-text-button:focus-visible { text-decoration: underline; }
body.qs-v3 .qs-v3-login-text-button:disabled { color: var(--qs-ink-400); cursor: wait; text-decoration: none; }

body.qs-v3 .qs-v3-login-help button {
  border: 0;
  padding: 0;
  color: var(--qs-navy-500);
  background: transparent;
  font: inherit;
  font-weight: var(--qs-fw-semibold);
  cursor: pointer;
}
body.qs-v3 .qs-v3-login-help button:hover,
body.qs-v3 .qs-v3-login-help button:focus-visible { text-decoration: underline; }

body.qs-v3 .qs-v3-login-support-modal {
  position: fixed;
  inset: 0;
  z-index: 1200;
  display: grid;
  place-items: center;
  padding: var(--qs-sp-5);
}
body.qs-v3 .qs-v3-login-support-backdrop {
  position: absolute;
  inset: 0;
  background: rgba(7, 25, 52, .68);
  backdrop-filter: blur(5px);
}
body.qs-v3 .qs-v3-login-support-dialog {
  position: relative;
  width: min(620px, 100%);
  max-height: calc(100vh - 40px);
  overflow-y: auto;
  padding: 34px;
  border: 1px solid rgba(215, 223, 235, .95);
  border-radius: 22px;
  background: #fff;
  box-shadow: 0 28px 80px rgba(5, 24, 52, .3);
}
body.qs-v3 .qs-v3-login-support-close {
  position: absolute;
  top: 18px;
  right: 18px;
  width: 40px;
  height: 40px;
  display: grid;
  place-items: center;
  border: 1px solid var(--qs-border);
  border-radius: 12px;
  color: var(--qs-ink-600);
  background: #fff;
  cursor: pointer;
}
body.qs-v3 .qs-v3-login-support-close:hover,
body.qs-v3 .qs-v3-login-support-close:focus-visible { color: var(--qs-navy-700); border-color: var(--qs-navy-400); background: var(--qs-surface-alt); }
body.qs-v3 .qs-v3-login-support-close svg {
  width: 19px;
  height: 19px;
  fill: none;
  stroke: currentColor;
  stroke-width: 1.9;
  stroke-linecap: round;
}
body.qs-v3 .qs-v3-login-support-kicker {
  display: inline-block;
  margin-bottom: 8px;
  color: var(--qs-navy-500);
  font-size: 12px;
  font-weight: 800;
  letter-spacing: .11em;
}
body.qs-v3 .qs-v3-login-support-dialog h2 {
  margin: 0 48px 8px 0;
  color: var(--qs-navy-900);
  font-family: var(--qs-font-display);
  font-size: 30px;
  line-height: 1.15;
}
body.qs-v3 .qs-v3-login-support-dialog > p:not(.qs-v3-login-support-security) {
  margin: 0;
  color: var(--qs-ink-500);
  font-size: 15px;
  line-height: 1.65;
}
body.qs-v3 .qs-v3-login-support-options {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: 12px;
  margin-top: 24px;
}
body.qs-v3 .qs-v3-login-support-option {
  min-width: 0;
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  gap: 13px;
  padding: 17px;
  border: 1px solid var(--qs-border);
  border-radius: 15px;
  color: var(--qs-ink-800);
  background: #fff;
  text-decoration: none;
  transition: transform var(--qs-t-fast) var(--qs-ease), border-color var(--qs-t-fast) var(--qs-ease), box-shadow var(--qs-t-fast) var(--qs-ease);
}
body.qs-v3 .qs-v3-login-support-option:hover,
body.qs-v3 .qs-v3-login-support-option:focus-visible {
  transform: translateY(-2px);
  border-color: var(--qs-navy-400);
  box-shadow: 0 10px 26px rgba(18, 54, 102, .11);
}
body.qs-v3 .qs-v3-login-support-option > span:last-child { min-width: 0; }
body.qs-v3 .qs-v3-login-support-option strong { display: block; color: var(--qs-navy-900); font-size: 14px; }
body.qs-v3 .qs-v3-login-support-option small { display: block; margin-top: 4px; overflow-wrap: anywhere; color: var(--qs-ink-500); font-size: 12px; line-height: 1.35; }
body.qs-v3 .qs-v3-login-support-icon {
  width: 42px;
  height: 42px;
  display: grid;
  place-items: center;
  border-radius: 13px;
  color: var(--qs-navy-700);
  background: var(--qs-info-soft);
}
body.qs-v3 .qs-v3-login-support-icon.whatsapp { color: #087A46; background: #E6F7EF; }
body.qs-v3 .qs-v3-login-support-icon.email { color: #9A6508; background: #FFF6DE; }
body.qs-v3 .qs-v3-login-support-icon svg {
  width: 21px;
  height: 21px;
  fill: none;
  stroke: currentColor;
  stroke-width: 1.7;
  stroke-linecap: round;
  stroke-linejoin: round;
}
body.qs-v3 .qs-v3-login-support-security {
  display: flex;
  align-items: center;
  gap: 9px;
  margin: 22px 0 0;
  padding-top: 18px;
  border-top: 1px solid var(--qs-border);
  color: var(--qs-ink-500);
  font-size: 13px;
}
body.qs-v3 .qs-v3-login-support-security svg {
  width: 16px;
  height: 16px;
  flex: 0 0 auto;
  fill: none;
  stroke: currentColor;
  stroke-width: 1.6;
}

@media (max-width: 1024px) {
  body.qs-v3 .qs-v3-login-promo-track { min-height: auto; align-items: flex-start; }
}
@media (max-width: 600px) {
  body.qs-v3 .qs-v3-login-promo-controls { margin-top: var(--qs-sp-4); }
  body.qs-v3 .qs-v3-login-otp-actions { align-items: stretch; flex-direction: column; gap: var(--qs-sp-2); }
  body.qs-v3 .qs-v3-login-support-modal { padding: 12px; align-items: end; }
  body.qs-v3 .qs-v3-login-support-dialog { max-height: calc(100vh - 24px); padding: 28px 20px 22px; border-radius: 20px; }
  body.qs-v3 .qs-v3-login-support-options { grid-template-columns: 1fr; }
  body.qs-v3 .qs-v3-login-support-option { flex-direction: row; align-items: center; }
}

/* === DASHBOARD (agent.html) ==============================================
   Platform brand in the sidebar; agency (tenant) identity in the topbar.

   Hooks styled by ID / existing class, never by an added qs-v3- class,
   because agent-dashboard.js overwrites className on these:
     #accountStatusBadge  -> badge.className = statusClass(status)
     #creditWarning, #recentQuotesMessage, #creditHistoryMessage -> setMessage()
   Also driven by inline style from JS:
     #creditWidget        -> --credit-used-percent
     #creditProgressBar   -> width
   #recentQuotesList has its innerHTML replaced by agent-dashboard.js, so the
   table it emits (.agent-table.recent-quotes-table) is styled here rather
   than rewritten.
   ========================================================================== */

body.qs-v3.qs-v3-dashboard {
  --qs-dash-rail: 340px;
  margin: 0;
}

/* This topbar carries more than the base one (agency chip + avatar menu), so
   the greeting gets flex priority and the search yields. Deliberately no
   ellipsis on the greeting: a long agency name wraps rather than truncates. */
body.qs-v3.qs-v3-dashboard .qs-v3-topbar-title { flex: 1 1 400px; }
body.qs-v3.qs-v3-dashboard .qs-v3-search { flex: 0 1 220px; min-width: 0; }
/* Only the title and search may absorb the squeeze; the pill and chip hold
   their natural width so the balance and agency name stay readable. */
body.qs-v3.qs-v3-dashboard .qs-v3-credit-pill {
  flex-shrink: 0;
  white-space: nowrap;
}
body.qs-v3.qs-v3-dashboard .qs-v3-agency-chip,
body.qs-v3.qs-v3-dashboard .qs-v3-topbar-icon { flex-shrink: 0; }

/* Search collapse: icon button only appears once the field is hidden. */
body.qs-v3 .qs-v3-search-toggle { display: none; }
body.qs-v3 .qs-v3-search input { min-width: 0; }

/* Sidebar extras ---------------------------------------------------------- */
body.qs-v3 .qs-v3-plan-card svg { width: 18px; height: 18px; }
body.qs-v3 .qs-v3-plan-link {
  display: inline-flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--qs-sp-2);
  width: 100%;
  margin-top: var(--qs-sp-3);
  padding-top: var(--qs-sp-3);
  border-top: 1px solid var(--qs-sidebar-divider);
  color: var(--qs-sidebar-text-strong);
  font-size: var(--qs-fs-xs);
  font-weight: var(--qs-fw-medium);
}
body.qs-v3 .qs-v3-plan-link svg { width: 14px; height: 14px; stroke: currentColor; fill: none; }
body.qs-v3 .qs-v3-plan-link:hover { color: var(--qs-gold-400); }

/* Topbar: agency chip ----------------------------------------------------- */
body.qs-v3 .qs-v3-agency-chip {
  display: flex;
  align-items: center;
  gap: var(--qs-sp-3);
  padding-left: var(--qs-sp-4);
  border-left: 1px solid var(--qs-border);
  min-width: 0;
}
body.qs-v3 .qs-v3-agency-logo {
  width: 32px;
  height: 32px;
  border-radius: var(--qs-r-md);
  background: var(--qs-ink-100);
  color: var(--qs-ink-600);
  display: inline-flex;
  align-items: center;
  justify-content: center;
  font-size: var(--qs-fs-xs);
  font-weight: var(--qs-fw-semibold);
  overflow: hidden;
  flex-shrink: 0;
}
/* renderLogo() injects either an <img> or .logo-placeholder here */
body.qs-v3 .qs-v3-agency-logo img { width: 100%; height: 100%; object-fit: contain; }
body.qs-v3 .qs-v3-agency-logo .logo-placeholder {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 100%;
  height: 100%;
}
body.qs-v3 .qs-v3-agency-meta { min-width: 0; line-height: var(--qs-lh-snug); }
body.qs-v3 .qs-v3-agency-meta strong {
  display: block;
  font-size: var(--qs-fs-sm);
  font-weight: var(--qs-fw-semibold);
  color: var(--qs-ink-800);
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
  max-width: 140px;
}
body.qs-v3 .qs-v3-agency-meta span {
  display: block;
  font-size: var(--qs-fs-xs);
  color: var(--qs-ink-500);
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
  max-width: 140px;
}

/* Topbar: avatar menu ----------------------------------------------------- */
body.qs-v3 .qs-v3-avatar-menu { position: relative; flex-shrink: 0; }
body.qs-v3 .qs-v3-avatar-btn:hover { border-color: var(--qs-ink-400); }
body.qs-v3 .qs-v3-avatar-chevron { width: 16px; height: 16px; color: var(--qs-ink-500); }

body.qs-v3 .qs-v3-menu {
  position: absolute;
  top: calc(100% + var(--qs-sp-2));
  right: 0;
  min-width: 220px;
  padding: var(--qs-sp-2);
  background: var(--qs-surface);
  border: 1px solid var(--qs-border);
  border-radius: var(--qs-r-lg);
  box-shadow: var(--qs-sh-lg);
  z-index: 50;
}
body.qs-v3 .qs-v3-menu-head {
  padding: var(--qs-sp-2) var(--qs-sp-3);
  font-size: var(--qs-fs-xs);
  color: var(--qs-ink-500);
  border-bottom: 1px solid var(--qs-border);
  margin-bottom: var(--qs-sp-1);
}
body.qs-v3 .qs-v3-menu-head strong { display: block; color: var(--qs-ink-900); font-size: var(--qs-fs-sm); }
body.qs-v3 .qs-v3-menu-item {
  display: block;
  width: 100%;
  padding: var(--qs-sp-2) var(--qs-sp-3);
  border: 0;
  border-radius: var(--qs-r-sm);
  background: transparent;
  color: var(--qs-ink-700);
  font-family: inherit;
  font-size: var(--qs-fs-sm);
  text-align: left;
  cursor: pointer;
}
body.qs-v3 .qs-v3-menu-item:hover { background: var(--qs-ink-100); color: var(--qs-ink-900); }
body.qs-v3 .qs-v3-menu-item-danger { color: var(--qs-danger); }
body.qs-v3 .qs-v3-menu-item-danger:hover { background: var(--qs-danger-soft); color: var(--qs-danger); }

/* Content grids ----------------------------------------------------------- */
body.qs-v3 .qs-v3-dash-actions { display: flex; justify-content: flex-end; }

/* Dashboard top block: hero + quick actions on the left, Credit Usage on the
   right. Both columns share one row so their bottom edges can align. */
body.qs-v3 .qs-v3-dash-columns {
  display: grid;
  grid-template-columns: minmax(0, 1fr) var(--qs-dash-rail);
  gap: var(--qs-sp-6);
  align-items: stretch;
}
body.qs-v3 .qs-v3-dash-col {
  display: flex;
  flex-direction: column;
  gap: var(--qs-sp-6);
  min-width: 0;
  height: 100%;
}
body.qs-v3.qs-v3-dashboard .qs-v3-dashboard-quick-card {
  display: flex;
  flex: 1;
  flex-direction: column;
}
body.qs-v3.qs-v3-dashboard .qs-v3-dash-col:last-child .credit-widget-panel {
  height: 100%;
}
body.qs-v3.qs-v3-dashboard.qs-v3-no-billing .qs-v3-dash-columns {
  grid-template-columns: minmax(0, 1fr);
}
body.qs-v3.qs-v3-dashboard.qs-v3-no-billing .qs-v3-dash-col:last-child {
  display: none;
}

/* Hero card --------------------------------------------------------------- */
body.qs-v3 .qs-v3-hero-card {
  position: relative;
  display: grid;
  grid-template-columns: minmax(0, 1fr) 40%;
  min-height: 300px;
  border-radius: var(--qs-r-xl);
  background: var(--qs-navy-900);
  overflow: hidden;
  box-shadow: var(--qs-sh-sm);
}
body.qs-v3 .qs-v3-hero-content {
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  justify-content: center;
  gap: var(--qs-sp-4);
  padding: var(--qs-sp-8);
  z-index: 1;
}
body.qs-v3 .qs-v3-hero-slide {
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  justify-content: center;
  gap: var(--qs-sp-4);
  width: 100%;
  min-height: 190px;
}
body.qs-v3 .qs-v3-hero-slide[hidden] { display: none; }
body.qs-v3 .qs-v3-hero-controls {
  display: flex;
  align-items: center;
  gap: var(--qs-sp-3);
  margin-top: auto;
}
body.qs-v3 .qs-v3-hero-arrow {
  width: 28px;
  height: 28px;
  display: inline-grid;
  place-items: center;
  border: 1px solid rgba(255, 255, 255, 0.28);
  border-radius: var(--qs-r-full);
  background: rgba(255, 255, 255, 0.10);
  color: #FFFFFF;
  font: inherit;
  font-size: 20px;
  line-height: 1;
  cursor: pointer;
}
body.qs-v3 .qs-v3-hero-arrow:hover,
body.qs-v3 .qs-v3-hero-arrow:focus-visible { background: rgba(255, 255, 255, 0.18); }
body.qs-v3 .qs-v3-hero-dots { display: flex; align-items: center; gap: 7px; }
body.qs-v3 .qs-v3-hero-dots button {
  width: 7px;
  height: 7px;
  padding: 0;
  border: 0;
  border-radius: var(--qs-r-full);
  background: rgba(255, 255, 255, 0.40);
  cursor: pointer;
}
body.qs-v3 .qs-v3-hero-dots button[aria-current="true"] {
  width: 20px;
  background: var(--qs-gold-500);
}
body.qs-v3 .qs-v3-hero-kicker {
  display: inline-flex;
  padding: var(--qs-sp-1) var(--qs-sp-3);
  border: 1px solid var(--qs-gold-500);
  border-radius: var(--qs-r-full);
  color: var(--qs-gold-400);
  font-size: var(--qs-fs-xs);
  font-weight: var(--qs-fw-medium);
  letter-spacing: 0.02em;
}
body.qs-v3 .qs-v3-hero-card h2 {
  font-family: var(--qs-font-display);
  font-size: var(--qs-fs-3xl);
  font-weight: var(--qs-fw-medium);
  line-height: var(--qs-lh-tight);
  color: #FFFFFF;
  max-width: 14em;
}
body.qs-v3 .qs-v3-hero-card p {
  color: rgba(255, 255, 255, 0.76);
  font-size: var(--qs-fs-base);
  max-width: 42ch;
}
body.qs-v3 .qs-v3-hero-btn-ghost {
  background: rgba(255, 255, 255, 0.10);
  color: #FFFFFF;
  border-color: rgba(255, 255, 255, 0.28);
}
body.qs-v3 .qs-v3-hero-btn-ghost:hover { background: rgba(255, 255, 255, 0.18); }
/* Keep both hero button labels readable over the navy banner. The generic
   body.qs-v3 a:hover rule otherwise changes link text to navy on hover. */
body.qs-v3 .qs-v3-hero-card .qs-v3-btn-primary:hover,
body.qs-v3 .qs-v3-hero-card .qs-v3-btn-primary:focus-visible,
body.qs-v3 .qs-v3-hero-card .qs-v3-hero-btn-ghost:hover,
body.qs-v3 .qs-v3-hero-card .qs-v3-hero-btn-ghost:focus-visible {
  color: #FFFFFF;
  text-decoration: none;
}

body.qs-v3 .qs-v3-hero-visual {
  position: relative;
  background-color: var(--qs-navy-800);
  background-image: url("../images/agent-dashboard-hero-v1.png");
  background-size: cover;
  background-position: center;
}
/* Feathers the photo into the navy panel instead of a hard seam */
body.qs-v3 .qs-v3-hero-visual::before {
  content: "";
  position: absolute;
  inset: 0;
  background: linear-gradient(90deg, var(--qs-navy-900) 0%, rgba(13, 43, 94, 0.55) 38%, rgba(13, 43, 94, 0) 100%);
}

/* Credit usage card ------------------------------------------------------- */
body.qs-v3 .qs-v3-credit-layout {
  display: flex;
  align-items: center;
  gap: var(--qs-sp-5);
  margin-bottom: var(--qs-sp-5);
}

/* Ring reads "used", matching --credit-used-percent and the existing
   app.css .credit-donut semantics. See changelog note. */
body.qs-v3 .qs-v3-donut {
  position: relative;
  display: grid;
  place-items: center;
  width: 112px;
  height: 112px;
  border-radius: var(--qs-r-full);
  flex-shrink: 0;
  background: conic-gradient(
    var(--qs-navy-500) var(--credit-used-percent, 0%),
    var(--qs-ink-200) 0
  );
}
body.qs-v3 .qs-v3-donut::after {
  content: "";
  position: absolute;
  inset: 12px;
  border-radius: inherit;
  background: var(--qs-surface);
}
body.qs-v3 .qs-v3-donut-center {
  position: relative;
  z-index: 1;
  text-align: center;
  line-height: 1.1;
}
body.qs-v3 .qs-v3-donut-center strong {
  display: block;
  font-size: var(--qs-fs-2xl);
  font-weight: var(--qs-fw-semibold);
  color: var(--qs-ink-900);
}
body.qs-v3 .qs-v3-donut-center span { font-size: var(--qs-fs-xs); color: var(--qs-ink-500); }

body.qs-v3 .qs-v3-credit-headline strong {
  display: block;
  font-size: var(--qs-fs-2xl);
  font-weight: var(--qs-fw-semibold);
  color: var(--qs-ink-900);
  line-height: var(--qs-lh-tight);
}
/* Child combinator: the spans inside <strong> carry the numbers and must keep
   the headline size. Only the caption span is targeted here. */
body.qs-v3 .qs-v3-credit-headline > span {
  font-size: var(--qs-fs-sm);
  color: var(--qs-ink-500);
}

body.qs-v3 .qs-v3-credit-list { margin: 0 0 var(--qs-sp-5); padding: 0; }
body.qs-v3 .qs-v3-credit-list > div {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--qs-sp-3);
  padding: var(--qs-sp-3) 0;
  border-top: 1px solid var(--qs-border);
}
body.qs-v3 .qs-v3-credit-list dt { color: var(--qs-ink-500); font-size: var(--qs-fs-sm); }
body.qs-v3 .qs-v3-credit-list dd {
  margin: 0;
  color: var(--qs-ink-900);
  font-size: var(--qs-fs-sm);
  font-weight: var(--qs-fw-semibold);
}

body.qs-v3 .qs-v3-credit-meter { margin-bottom: var(--qs-sp-4); }
body.qs-v3 .qs-v3-credit-meter strong { font-size: var(--qs-fs-xs); color: var(--qs-ink-700); }
/* #creditProgressBar gets its width inline from JS */
body.qs-v3 .credit-progress {
  height: 6px;
  margin-top: var(--qs-sp-2);
  border-radius: var(--qs-r-full);
  background: var(--qs-ink-200);
  overflow: hidden;
}
body.qs-v3 .credit-progress span {
  display: block;
  height: 100%;
  border-radius: inherit;
  background: var(--qs-navy-500);
  transition: width var(--qs-t-slow) var(--qs-ease);
}

body.qs-v3 .qs-v3-credit-usage-btn { width: 100%; margin-top: var(--qs-sp-4); }

/* #accountStatusBadge — className is overwritten by JS to
   "status-pill active|suspended", so style the base class. */
body.qs-v3 .status-pill {
  display: inline-flex;
  align-items: center;
  padding: 2px 10px;
  border-radius: var(--qs-r-full);
  font-size: var(--qs-fs-xs);
  font-weight: var(--qs-fw-semibold);
  text-transform: capitalize;
  background: var(--qs-ink-100);
  color: var(--qs-ink-700);
}
body.qs-v3 .status-pill.active    { background: var(--qs-success-soft); color: #065F46; }
body.qs-v3 .status-pill.suspended { background: var(--qs-danger-soft); color: #991B1B; }

/* Quote status badges ----------------------------------------------------- */
/* Real, backend-supported statuses (quotes.js cleanQuoteStatus whitelist). */
body.qs-v3 .qs-v3-badge-draft { background: var(--qs-ink-100); color: var(--qs-ink-700); }
body.qs-v3 .qs-v3-badge-saved { background: var(--qs-info-soft); color: #1E40AF; }
body.qs-v3 .qs-v3-badge-sent  { background: var(--qs-gold-100); color: #7C5A16; }
/* Forward compatibility: not in the data model yet. If the backend starts
   returning these statuses they pick up styling automatically. */
body.qs-v3 .qs-v3-badge-viewed   { background: var(--qs-purple-soft); color: #6D28D9; }
body.qs-v3 .qs-v3-badge-accepted { background: var(--qs-success-soft); color: #065F46; }

/* Recent Quotes: styling the markup agent-dashboard.js emits --------------- */
body.qs-v3 .qs-v3-table-card { padding: var(--qs-sp-6) var(--qs-sp-6) var(--qs-sp-2); }
body.qs-v3 .qs-v3-table-card .qs-v3-card-header { margin-bottom: var(--qs-sp-2); }

body.qs-v3 .qs-v3-link-arrow {
  display: inline-flex;
  align-items: center;
  gap: var(--qs-sp-1);
  font-size: var(--qs-fs-sm);
  font-weight: var(--qs-fw-medium);
  white-space: nowrap;
}
body.qs-v3 .qs-v3-link-arrow svg { width: 14px; height: 14px; }

body.qs-v3 .recent-quote-list .table-wrap { overflow-x: auto; }
body.qs-v3 .recent-quote-list table,
body.qs-v3 .qs-v3-table-card .agent-table {
  width: 100%;
  border-collapse: collapse;
  font-size: var(--qs-fs-xs);
}
/* Without a floor these tables squeeze their columns to fit narrow viewports
   and shred every word. Give them a minimum and let the wrapper scroll. */
body.qs-v3 .recent-quote-list table {
  min-width: 900px;
  table-layout: fixed;
}
/* Fixed, professional column widths prevent a long Quote ID from painting
   over Customer Name. Narrow screens use the existing horizontal scroller. */
body.qs-v3 .recent-quote-list th:nth-child(1),
body.qs-v3 .recent-quote-list td:nth-child(1) { width: 240px; }
body.qs-v3 .recent-quote-list th:nth-child(2),
body.qs-v3 .recent-quote-list td:nth-child(2) { width: 165px; }
body.qs-v3 .recent-quote-list th:nth-child(3),
body.qs-v3 .recent-quote-list td:nth-child(3) { width: 190px; }
body.qs-v3 .recent-quote-list th:nth-child(4),
body.qs-v3 .recent-quote-list td:nth-child(4) { width: 85px; }
body.qs-v3 .recent-quote-list th:nth-child(5),
body.qs-v3 .recent-quote-list td:nth-child(5) { width: 130px; }
body.qs-v3 .recent-quote-list th:nth-child(6),
body.qs-v3 .recent-quote-list td:nth-child(6) { width: 80px; }
body.qs-v3 #creditHistorySection .qs-v3-table { min-width: 760px; }
body.qs-v3 .recent-quote-list thead th {
  text-align: left;
  padding: var(--qs-sp-2) 10px;
  color: var(--qs-ink-500);
  font-weight: var(--qs-fw-semibold);
  font-size: var(--qs-fs-xs);
  text-transform: uppercase;
  letter-spacing: 0.03em;
  background: transparent;
  border-bottom: 1px solid var(--qs-border);
  white-space: nowrap;
}
body.qs-v3 .recent-quote-list tbody td {
  padding: var(--qs-sp-2) 10px;
  border-bottom: 1px solid var(--qs-border);
  color: var(--qs-ink-800);
  vertical-align: middle;
}
body.qs-v3 .recent-quote-list tbody tr:last-child td { border-bottom: 0; }
body.qs-v3 .recent-quote-list tbody tr { transition: background var(--qs-t-fast) var(--qs-ease); }
body.qs-v3 .recent-quote-list tbody tr:hover { background: var(--qs-surface-alt); }
body.qs-v3 .recent-quote-list .qs-v3-quote-id {
  display: block;
  max-width: 100%;
  color: var(--qs-ink-500);
  font-size: var(--qs-fs-xs);
  font-variant-numeric: tabular-nums;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
/* The row action is emitted as <a class="btn small btn-secondary"> */
body.qs-v3 .recent-quote-list .btn.small {
  display: inline-flex;
  align-items: center;
  padding: 4px 10px;
  border-radius: var(--qs-r-md);
  border: 1px solid var(--qs-border-strong);
  background: var(--qs-surface);
  color: var(--qs-ink-800);
  font-size: var(--qs-fs-xs);
  font-weight: var(--qs-fw-semibold);
  text-decoration: none;
}
body.qs-v3 .recent-quote-list .btn.small:hover {
  border-color: var(--qs-navy-500);
  color: var(--qs-navy-500);
}

body.qs-v3 .qs-v3-table-card .empty-state,
body.qs-v3 .recent-quote-list .empty-state {
  padding: var(--qs-sp-10) var(--qs-sp-6);
  text-align: center;
  color: var(--qs-ink-500);
  font-size: var(--qs-fs-sm);
  border: 1px dashed var(--qs-border);
  border-radius: var(--qs-r-lg);
  background: var(--qs-surface-alt);
  margin-bottom: var(--qs-sp-4);
}

/* Credit history table cells are dense; keep them from wrapping badly */
body.qs-v3 #creditHistoryBody td { white-space: nowrap; }
body.qs-v3 #creditHistoryBody code {
  font-size: var(--qs-fs-xs);
  color: var(--qs-ink-600);
  background: var(--qs-ink-100);
  padding: 2px 6px;
  border-radius: var(--qs-r-sm);
}

/* Quick actions ----------------------------------------------------------- */
body.qs-v3 .qs-v3-quick-list { display: flex; flex-direction: column; }
body.qs-v3 .qs-v3-quick-item {
  display: flex;
  align-items: center;
  gap: var(--qs-sp-3);
  padding: var(--qs-sp-3) var(--qs-sp-2);
  border-bottom: 1px solid var(--qs-border);
  color: var(--qs-ink-800);
  font-size: var(--qs-fs-sm);
  font-weight: var(--qs-fw-medium);
  border-radius: var(--qs-r-md);
  transition: background var(--qs-t-fast) var(--qs-ease);
}
body.qs-v3 .qs-v3-quick-item:last-child { border-bottom: 0; }
body.qs-v3 .qs-v3-quick-item:hover { background: var(--qs-surface-alt); color: var(--qs-ink-900); }
body.qs-v3 .qs-v3-quick-icon {
  width: 32px;
  height: 32px;
  border-radius: var(--qs-r-md);
  display: inline-flex;
  align-items: center;
  justify-content: center;
  flex-shrink: 0;
}
body.qs-v3 .qs-v3-quick-icon svg { width: 17px; height: 17px; }
body.qs-v3 .qs-v3-quick-icon.tint-blue   { background: var(--qs-info-soft); color: #1E40AF; }
body.qs-v3 .qs-v3-quick-icon.tint-green  { background: var(--qs-success-soft); color: #065F46; }
body.qs-v3 .qs-v3-quick-icon.tint-purple { background: var(--qs-purple-soft); color: #6D28D9; }
body.qs-v3 .qs-v3-quick-icon.tint-gold   { background: var(--qs-gold-100); color: #92640E; }
body.qs-v3 .qs-v3-quick-icon.tint-teal   { background: var(--qs-teal-soft); color: #0F766E; }
body.qs-v3 .qs-v3-quick-label { flex: 1; min-width: 0; }
body.qs-v3 .qs-v3-quick-label small {
  display: block;
  margin-top: 2px;
  color: var(--qs-ink-500);
  font-size: var(--qs-fs-xs);
  font-weight: var(--qs-fw-normal);
}
body.qs-v3 .qs-v3-quick-chevron {
  width: 16px;
  height: 16px;
  color: var(--qs-ink-400);
  flex-shrink: 0;
}

/* Dashboard-only 3 x 2 Quick Actions grid ------------------------------- */
body.qs-v3.qs-v3-dashboard .qs-v3-dashboard-quick-card .qs-v3-card-header {
  margin-bottom: var(--qs-sp-4);
}
body.qs-v3.qs-v3-dashboard .qs-v3-dashboard-quick-card .qs-v3-quick-list {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: var(--qs-sp-3);
  flex: 1;
}
body.qs-v3.qs-v3-dashboard .qs-v3-dashboard-quick-card .qs-v3-quick-item {
  min-width: 0;
  min-height: 64px;
  padding: var(--qs-sp-3);
  border: 1px solid var(--qs-border);
  border-radius: var(--qs-r-lg);
  background: var(--qs-surface);
  box-shadow: var(--qs-sh-xs);
}
body.qs-v3.qs-v3-dashboard .qs-v3-dashboard-quick-card .qs-v3-quick-item:hover,
body.qs-v3.qs-v3-dashboard .qs-v3-dashboard-quick-card .qs-v3-quick-item:focus-visible {
  color: var(--qs-ink-900);
  border-color: var(--qs-border-strong);
  box-shadow: var(--qs-sh-sm);
  text-decoration: none;
}

/* Full-width Recent Quotes card grid ------------------------------------ */
body.qs-v3 .qs-v3-recent-card-panel { padding: var(--qs-sp-6); }
body.qs-v3 .qs-v3-recent-quote-grid {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: var(--qs-sp-4);
}
body.qs-v3 .qs-v3-recent-quote-grid > .empty-state { grid-column: 1 / -1; }
body.qs-v3 .qs-v3-recent-quote-card {
  display: grid;
  grid-template-columns: 112px minmax(0, 1fr);
  min-width: 0;
  overflow: hidden;
  border: 1px solid var(--qs-border);
  border-radius: var(--qs-r-xl);
  background: var(--qs-surface);
  box-shadow: var(--qs-sh-xs);
  transition: border-color var(--qs-t-fast) var(--qs-ease),
              box-shadow var(--qs-t-fast) var(--qs-ease),
              transform var(--qs-t-fast) var(--qs-ease);
}
body.qs-v3 .qs-v3-recent-quote-card:hover {
  border-color: var(--qs-border-strong);
  box-shadow: var(--qs-sh-md);
  transform: translateY(-2px);
}
body.qs-v3 .qs-v3-recent-quote-cover {
  min-height: 190px;
  display: grid;
  place-items: center;
  overflow: hidden;
  background: linear-gradient(145deg, var(--qs-navy-800), var(--qs-navy-500));
  color: #FFFFFF;
}
body.qs-v3 .qs-v3-recent-quote-cover img { width: 100%; height: 100%; object-fit: cover; }
body.qs-v3 .qs-v3-recent-quote-cover > span {
  font-family: var(--qs-font-display);
  font-size: var(--qs-fs-4xl);
  font-weight: var(--qs-fw-semibold);
}
body.qs-v3 .qs-v3-recent-quote-body {
  min-width: 0;
  display: flex;
  flex-direction: column;
  gap: 6px;
  padding: var(--qs-sp-4);
}
body.qs-v3 .qs-v3-recent-quote-head { min-height: 22px; }
body.qs-v3 .qs-v3-recent-quote-body h3 {
  display: -webkit-box;
  overflow: hidden;
  -webkit-box-orient: vertical;
  -webkit-line-clamp: 2;
  color: var(--qs-ink-900);
  font-size: var(--qs-fs-base);
  font-weight: var(--qs-fw-semibold);
  line-height: var(--qs-lh-snug);
}
body.qs-v3 .qs-v3-recent-customer {
  overflow: hidden;
  color: var(--qs-ink-700);
  font-size: var(--qs-fs-sm);
  text-overflow: ellipsis;
  white-space: nowrap;
}
body.qs-v3 .qs-v3-recent-meta {
  display: flex;
  flex-direction: column;
  gap: 2px;
  color: var(--qs-ink-500);
  font-size: var(--qs-fs-xs);
}
body.qs-v3 .qs-v3-recent-meta span {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
body.qs-v3 .qs-v3-recent-actions {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: 6px;
  margin-top: auto;
  padding-top: var(--qs-sp-2);
}
body.qs-v3 .qs-v3-recent-action {
  min-width: 0;
  min-height: 32px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 4px;
  padding: 5px 6px;
  border: 1px solid var(--qs-border);
  border-radius: var(--qs-r-md);
  background: var(--qs-surface);
  color: var(--qs-ink-700);
  font-family: inherit;
  font-size: 11px;
  font-weight: var(--qs-fw-semibold);
  line-height: 1;
  text-decoration: none;
  cursor: pointer;
}
body.qs-v3 .qs-v3-recent-action svg { width: 14px; height: 14px; flex-shrink: 0; }
body.qs-v3 .qs-v3-recent-action:hover,
body.qs-v3 .qs-v3-recent-action:focus-visible {
  border-color: var(--qs-navy-500);
  background: var(--qs-surface-alt);
  color: var(--qs-navy-500);
  text-decoration: none;
}
body.qs-v3 .qs-v3-recent-action-wa { color: #087A4B; }
body.qs-v3 .qs-v3-recent-action-wa:hover,
body.qs-v3 .qs-v3-recent-action-wa:focus-visible { border-color: #16A66A; color: #087A4B; }
body.qs-v3 .qs-v3-recent-action:disabled,
body.qs-v3 .qs-v3-recent-action.is-busy { opacity: 0.62; cursor: wait; }

/* Access denied ----------------------------------------------------------- */
body.qs-v3 .access-denied { display: flex; flex-direction: column; gap: var(--qs-sp-4); align-items: flex-start; }

/* Responsive -------------------------------------------------------------- */
@media (max-width: 1280px) {
  body.qs-v3.qs-v3-dashboard { --qs-dash-rail: 300px; }
  body.qs-v3 .qs-v3-search { min-width: 200px; }
  body.qs-v3 .qs-v3-agency-chip { display: none; }
}

@media (max-width: 1100px) {
  body.qs-v3 .qs-v3-dash-columns { grid-template-columns: minmax(0, 1fr); }
  body.qs-v3 .qs-v3-hero-card { grid-template-columns: minmax(0, 1fr) 34%; }
  body.qs-v3.qs-v3-dashboard .qs-v3-dash-col:last-child .credit-widget-panel { height: auto; }
  body.qs-v3 .qs-v3-recent-quote-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}

@media (max-width: 900px) {
  body.qs-v3 .qs-v3-shell { grid-template-columns: 1fr; }
  body.qs-v3 .qs-v3-sidebar {
    position: static;
    height: auto;
    flex-direction: row;
    align-items: center;
    flex-wrap: wrap;
    gap: var(--qs-sp-3);
    padding: var(--qs-sp-3) var(--qs-sp-4);
  }
  body.qs-v3 .qs-v3-sidebar-brand { font-size: var(--qs-fs-xl); padding: 0; }
  body.qs-v3 .qs-v3-sidebar-nav {
    flex-direction: row;
    flex-wrap: wrap;
    margin-top: 0;
    gap: var(--qs-sp-1);
  }
  body.qs-v3 .qs-v3-nav-item { padding: var(--qs-sp-2) var(--qs-sp-3); font-size: var(--qs-fs-sm); }
  body.qs-v3 .qs-v3-sidebar-footer { display: none; }
  body.qs-v3 .qs-v3-topbar { flex-wrap: wrap; padding: var(--qs-sp-4); }
  body.qs-v3 .qs-v3-topbar-title { flex-basis: 100%; }
  body.qs-v3 .qs-v3-search { flex: 1; min-width: 0; }
  body.qs-v3 .qs-v3-content { padding: var(--qs-sp-5) var(--qs-sp-4); }
  body.qs-v3 .qs-v3-hero-card { grid-template-columns: minmax(0, 1fr); min-height: 0; }
  body.qs-v3 .qs-v3-hero-visual { display: none; }
}

@media (max-width: 600px) {
  /* Dashboard topbar only: the search collapses behind the icon toggle (which
     exists only on the dashboard). Scoped to .qs-v3-dashboard so the content-
     area search on quotes/customers/ready-packages stays visible on mobile. */
  body.qs-v3.qs-v3-dashboard .qs-v3-search-toggle { display: inline-flex; }
  body.qs-v3.qs-v3-dashboard .qs-v3-search { display: none; }
  body.qs-v3.qs-v3-dashboard .qs-v3-search.is-open {
    display: flex;
    order: 99;          /* drops onto its own row beneath the topbar items */
    flex-basis: 100%;
  }
  body.qs-v3 .qs-v3-search kbd { display: none; }
  body.qs-v3 .qs-v3-credit-layout { flex-direction: column; align-items: flex-start; }
  body.qs-v3 .qs-v3-hero-content { padding: var(--qs-sp-6); }
  body.qs-v3 .qs-v3-hero-card h2 { font-size: var(--qs-fs-2xl); }
  body.qs-v3 .qs-v3-dash-actions .qs-v3-btn { width: 100%; }
  body.qs-v3.qs-v3-dashboard .qs-v3-dashboard-quick-card .qs-v3-quick-list { grid-template-columns: 1fr; }
  body.qs-v3 .qs-v3-recent-quote-grid { grid-template-columns: 1fr; }
  body.qs-v3 .qs-v3-recent-quote-card { grid-template-columns: 96px minmax(0, 1fr); }
  body.qs-v3 .qs-v3-recent-action span { display: none; }
}

@media (min-width: 601px) and (max-width: 760px) {
  body.qs-v3.qs-v3-dashboard .qs-v3-dashboard-quick-card .qs-v3-quick-list { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}


/* === PROFILE (profile.html) ============================================
   Reuses the dashboard shell (sidebar, topbar, agency chip, avatar menu),
   the .qs-v3-tabs primitive, and .status-pill / .qs-v3-credit-list.

   Structure note: the Profile and Agency tab panels are wrapped in one
   <form id="basicProfileForm"> because profile.js serialises every NAMED
   control to update_basic. The empty-state and billing panels sit OUTSIDE
   that form so they can never contribute to the payload. The save bar's
   button associates back via form="basicProfileForm".

   #profileMessage keeps only .notice (profile.js overwrites className).
   ======================================================================== */

body.qs-v3.qs-v3-profile { margin: 0; }

body.qs-v3 .qs-v3-tabpanel { outline: none; }
body.qs-v3 .qs-v3-tabpanel:focus-visible {
  outline: 2px solid var(--qs-navy-500);
  outline-offset: 4px;
  border-radius: var(--qs-r-md);
}

/* Profile / agency cards ------------------------------------------------- */
body.qs-v3 .qs-v3-profile-body {
  display: grid;
  grid-template-columns: 220px minmax(0, 1fr);
  gap: var(--qs-sp-8);
  align-items: start;
}

body.qs-v3 .qs-v3-profile-aside {
  display: flex;
  flex-direction: column;
  align-items: center;
  text-align: center;
  gap: var(--qs-sp-2);
}
body.qs-v3 .qs-v3-profile-logo {
  width: 128px;
  height: 128px;
  border-radius: var(--qs-r-xl);
  background: var(--qs-navy-900);
  color: var(--qs-gold-500);
  display: inline-flex;
  align-items: center;
  justify-content: center;
  overflow: hidden;
  font-family: var(--qs-font-display);
  font-size: var(--qs-fs-4xl);
  font-weight: var(--qs-fw-bold);
}
body.qs-v3 .qs-v3-profile-logo img { width: 100%; height: 100%; object-fit: contain; }
body.qs-v3 .qs-v3-profile-logo .logo-placeholder {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 100%;
  height: 100%;
}
body.qs-v3 .qs-v3-profile-logo-label {
  font-size: var(--qs-fs-sm);
  font-weight: var(--qs-fw-semibold);
  color: var(--qs-ink-700);
  margin-top: var(--qs-sp-1);
}

body.qs-v3 .qs-v3-inline-link {
  display: inline-flex;
  align-items: center;
  gap: 4px;
  font-size: var(--qs-fs-sm);
  font-weight: var(--qs-fw-medium);
  color: var(--qs-navy-500);
}
body.qs-v3 .qs-v3-inline-link svg { width: 14px; height: 14px; flex-shrink: 0; }
body.qs-v3 .qs-v3-inline-link:hover { color: var(--qs-navy-700); }
/* In the narrow aside the label wraps; flow inline so the arrow stays with
   the last word instead of orphaning onto its own line. */
body.qs-v3 .qs-v3-profile-aside .qs-v3-inline-link { display: inline; line-height: var(--qs-lh-snug); }
body.qs-v3 .qs-v3-profile-aside .qs-v3-inline-link svg { display: inline; vertical-align: -2px; margin-left: 2px; }

body.qs-v3 .qs-v3-profile-fields {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: var(--qs-sp-5);
}
body.qs-v3 .qs-v3-field-wide { grid-column: 1 / -1; }

/* Read-only inputs read as filled but visibly inert */
body.qs-v3 .qs-v3-input[readonly] {
  background: var(--qs-surface-alt);
  color: var(--qs-ink-600);
  cursor: default;
}
body.qs-v3 .qs-v3-input[readonly]:focus {
  border-color: var(--qs-border-strong);
  box-shadow: none;
}

body.qs-v3 .qs-v3-profile-branding-link {
  margin-top: var(--qs-sp-6);
  padding-top: var(--qs-sp-5);
  border-top: 1px solid var(--qs-border);
}
body.qs-v3 .qs-v3-profile-branding-link .qs-v3-hint { margin-top: var(--qs-sp-2); }

/* Empty-state panels ----------------------------------------------------- */
body.qs-v3 .qs-v3-empty-panel {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: var(--qs-sp-3);
  padding: var(--qs-sp-16) var(--qs-sp-6);
  text-align: center;
  border: 0;
  background: transparent;
}
body.qs-v3 .qs-v3-empty-panel svg {
  width: 40px;
  height: 40px;
  color: var(--qs-ink-400);
  margin-bottom: var(--qs-sp-2);
}
body.qs-v3 .qs-v3-empty-panel h3 { font-size: var(--qs-fs-lg); color: var(--qs-ink-800); }
body.qs-v3 .qs-v3-empty-panel p { color: var(--qs-ink-500); font-size: var(--qs-fs-sm); }

body.qs-v3 .qs-v3-billing-list { margin-top: var(--qs-sp-2); }

/* Save bar --------------------------------------------------------------- */
body.qs-v3 .qs-v3-save-bar {
  position: sticky;
  bottom: var(--qs-sp-4);
  display: flex;
  align-items: center;
  justify-content: flex-end;
  gap: var(--qs-sp-4);
  padding: var(--qs-sp-4) var(--qs-sp-6);
  background: var(--qs-surface);
  border: 1px solid var(--qs-border);
  border-radius: var(--qs-r-lg);
  box-shadow: var(--qs-sh-md);
}
body.qs-v3 .qs-v3-unsaved {
  margin-right: auto;
  display: inline-flex;
  align-items: center;
  gap: var(--qs-sp-2);
  color: #92400E;
  font-size: var(--qs-fs-sm);
  font-weight: var(--qs-fw-medium);
}
body.qs-v3 .qs-v3-unsaved::before {
  content: "";
  width: 8px;
  height: 8px;
  border-radius: var(--qs-r-full);
  background: var(--qs-warning);
}
body.qs-v3 .qs-v3-inline-status { font-size: var(--qs-fs-sm); color: var(--qs-ink-500); }

/* === SETTINGS — full mockup rebuild ===================================== */
/* Single continuous page. The tab strip is a sticky scroll-nav (scroll-spy in
   qs-profile-ui.js). basicProfileForm wraps the top row only; the four cards
   below are separate forms so they never touch the update_basic payload. */

body.qs-v3 .qs-v3-settings { display: flex; flex-direction: column; gap: var(--qs-sp-6); }

/* The page is long; a sticky save bar would float over the mid-page cards and
   hide their headers. Keep it in flow at the bottom, as the mockup shows. */
body.qs-v3 .qs-v3-settings .qs-v3-save-bar { position: static; bottom: auto; }

/* Sticky section nav */
body.qs-v3 .qs-v3-settings-nav {
  position: sticky;
  top: var(--qs-sp-2);
  z-index: 5;
  margin-bottom: 0;
  background: var(--qs-surface);
  border: 1px solid var(--qs-border);
  border-radius: var(--qs-r-lg);
  padding: var(--qs-sp-1);
  box-shadow: var(--qs-sh-xs);
}

/* Layout grids */
body.qs-v3 .qs-v3-settings-grid { display: grid; gap: var(--qs-sp-6); align-items: start; }
body.qs-v3 .qs-v3-settings-grid-2 { grid-template-columns: minmax(0, 1.05fr) minmax(0, 0.95fr); }
body.qs-v3 .qs-v3-settings-grid-4 { grid-template-columns: repeat(4, minmax(0, 1fr)); }
body.qs-v3 .qs-v3-settings-cell { height: 100%; }
body.qs-v3 .qs-v3-settings [id^="section-"] { scroll-margin-top: 96px; outline: none; }

/* Stacked field list + required marker + info glyph */
body.qs-v3 .qs-v3-field-list { display: flex; flex-direction: column; gap: var(--qs-sp-4); }
body.qs-v3 .qs-v3-req { display: inline; color: var(--qs-danger); font-weight: var(--qs-fw-semibold); margin-left: 2px; }
body.qs-v3 .qs-v3-label-info { width: 14px; height: 14px; color: var(--qs-ink-400); vertical-align: -2px; margin-left: 2px; }

/* Verified badge inside a control */
body.qs-v3 .qs-v3-control { position: relative; display: block; }
body.qs-v3 .qs-v3-input.has-verified { padding-right: 96px; }
body.qs-v3 .qs-v3-verified {
  position: absolute;
  top: 50%;
  right: 8px;
  transform: translateY(-50%);
  display: inline-flex;
  align-items: center;
  gap: 4px;
  padding: 3px 8px;
  border-radius: var(--qs-r-full);
  background: var(--qs-success-soft);
  color: #047857;
  font-size: var(--qs-fs-xs);
  font-weight: var(--qs-fw-semibold);
  white-space: nowrap;
  pointer-events: none;
}
body.qs-v3 .qs-v3-verified svg { width: 12px; height: 12px; }

/* Phone group: country-code select + number input */
body.qs-v3 .qs-v3-phone-group { display: flex; gap: var(--qs-sp-2); align-items: stretch; }
body.qs-v3 .qs-v3-phone-group .qs-v3-control { flex: 1 1 auto; min-width: 0; }
body.qs-v3 .qs-v3-phone-group > .qs-v3-input { flex: 1 1 auto; min-width: 0; }
body.qs-v3 .qs-v3-phone-cc {
  width: auto;
  flex: 0 0 auto;
  min-width: 88px;
  padding-left: var(--qs-sp-3);
  padding-right: var(--qs-sp-6);
  font-weight: var(--qs-fw-medium);
}

/* Profile photo */
body.qs-v3 .qs-v3-photo { position: relative; width: 120px; height: 120px; }
body.qs-v3 .qs-v3-photo-frame {
  width: 120px;
  height: 120px;
  border-radius: var(--qs-r-full);
  overflow: hidden;
  background: var(--qs-navy-900);
  color: var(--qs-gold-500);
  display: inline-flex;
  align-items: center;
  justify-content: center;
  border: 3px solid var(--qs-surface);
  box-shadow: var(--qs-sh-sm);
}
body.qs-v3 .qs-v3-photo-frame img { width: 100%; height: 100%; object-fit: cover; }
body.qs-v3 .qs-v3-photo-initials { font-family: var(--qs-font-display); font-size: var(--qs-fs-4xl); font-weight: var(--qs-fw-bold); }
body.qs-v3 .qs-v3-photo-btn {
  position: absolute;
  right: 2px;
  bottom: 2px;
  width: 34px;
  height: 34px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  border-radius: var(--qs-r-full);
  border: 2px solid var(--qs-surface);
  background: var(--qs-navy-500);
  color: #fff;
  cursor: pointer;
  box-shadow: var(--qs-sh-sm);
}
body.qs-v3 .qs-v3-photo-btn svg { width: 16px; height: 16px; }
body.qs-v3 .qs-v3-photo-btn:hover { background: var(--qs-navy-700); }
body.qs-v3 .qs-v3-photo-hint { font-size: var(--qs-fs-xs); color: var(--qs-ink-500); text-align: center; }

/* A link styled as a button (no href) */
body.qs-v3 .qs-v3-linkbtn { border: none; background: none; padding: 0; cursor: pointer; font: inherit; }

/* Agency Details (Summary) */
body.qs-v3 .qs-v3-agency-summary { display: flex; flex-direction: column; gap: var(--qs-sp-5); }
body.qs-v3 .qs-v3-agency-summary-head { display: flex; align-items: center; gap: var(--qs-sp-4); }
body.qs-v3 .qs-v3-agency-summary-logo { width: 84px; height: 84px; border-radius: var(--qs-r-lg); font-size: var(--qs-fs-2xl); flex-shrink: 0; }
body.qs-v3 .qs-v3-agency-summary-name { font-size: var(--qs-fs-xl); font-weight: var(--qs-fw-bold); color: var(--qs-ink-900); }
body.qs-v3 .qs-v3-agency-summary-list { display: flex; flex-direction: column; gap: var(--qs-sp-4); }
body.qs-v3 .qs-v3-agency-summary-row { display: grid; grid-template-columns: 150px minmax(0, 1fr); gap: var(--qs-sp-3); align-items: start; }
body.qs-v3 .qs-v3-agency-summary-row dt {
  display: inline-flex;
  align-items: center;
  gap: 7px;
  font-size: var(--qs-fs-sm);
  color: var(--qs-ink-500);
}
body.qs-v3 .qs-v3-agency-summary-row dt svg { width: 16px; height: 16px; flex-shrink: 0; color: var(--qs-ink-400); }
body.qs-v3 .qs-v3-agency-summary-row dd { font-size: var(--qs-fs-sm); color: var(--qs-ink-800); font-weight: var(--qs-fw-medium); line-height: var(--qs-lh-snug); }
body.qs-v3 .qs-v3-agency-summary-link { color: var(--qs-navy-500); word-break: break-word; }
body.qs-v3 .qs-v3-agency-summary-link[aria-disabled="true"] { color: var(--qs-ink-400); pointer-events: none; }
body.qs-v3 .qs-v3-agency-edit-btn { align-self: flex-start; }
body.qs-v3 .qs-v3-agency-edit-btn svg { width: 15px; height: 15px; }
body.qs-v3 .qs-v3-agency-edit { display: flex; flex-direction: column; gap: var(--qs-sp-4); }
body.qs-v3 .qs-v3-agency-edit-actions { display: flex; align-items: center; gap: var(--qs-sp-3); flex-wrap: wrap; }

/* Toggle switches */
body.qs-v3 .qs-v3-toggle-list { display: flex; flex-direction: column; gap: var(--qs-sp-4); }
body.qs-v3 .qs-v3-toggle-row { display: flex; align-items: center; justify-content: space-between; gap: var(--qs-sp-4); }
body.qs-v3 .qs-v3-toggle-text { display: flex; flex-direction: column; gap: 1px; min-width: 0; }
body.qs-v3 .qs-v3-toggle-text strong { font-size: var(--qs-fs-sm); font-weight: var(--qs-fw-semibold); color: var(--qs-ink-800); }
body.qs-v3 .qs-v3-toggle-text span { font-size: var(--qs-fs-xs); color: var(--qs-ink-500); }
body.qs-v3 .qs-v3-toggle { position: relative; display: inline-flex; align-items: center; flex-shrink: 0; cursor: pointer; }
body.qs-v3 .qs-v3-toggle input { position: absolute; opacity: 0; width: 0; height: 0; }
body.qs-v3 .qs-v3-toggle-track {
  width: 40px;
  height: 22px;
  border-radius: var(--qs-r-full);
  background: var(--qs-border-strong);
  transition: background var(--qs-t-fast) var(--qs-ease);
  display: inline-flex;
  align-items: center;
  padding: 2px;
}
body.qs-v3 .qs-v3-toggle-thumb {
  width: 18px;
  height: 18px;
  border-radius: var(--qs-r-full);
  background: #fff;
  box-shadow: var(--qs-sh-xs);
  transition: transform var(--qs-t-fast) var(--qs-ease);
}
body.qs-v3 .qs-v3-toggle input:checked + .qs-v3-toggle-track { background: var(--qs-navy-500); }
body.qs-v3 .qs-v3-toggle input:checked + .qs-v3-toggle-track .qs-v3-toggle-thumb { transform: translateX(18px); }
body.qs-v3 .qs-v3-toggle input:focus-visible + .qs-v3-toggle-track { outline: 2px solid var(--qs-navy-500); outline-offset: 2px; }

/* Security row: three cards deliberately reuse the existing profile-card system. */
body.qs-v3 .qs-v124-security-grid {
  grid-template-columns: repeat(3, minmax(0, 1fr));
  align-items: stretch;
}
body.qs-v3 .qs-v124-password-card { order: 1; }
body.qs-v3 .qs-v124-plan-card { order: 2; }
body.qs-v3 .qs-v124-notification-card { order: 3; }
body.qs-v3 .qs-v124-password-card,
body.qs-v3 .qs-v124-plan-card,
body.qs-v3 .qs-v124-notification-card { min-width: 0; }
body.qs-v3 .qs-v124-plan-card { display: flex; flex-direction: column; }
body.qs-v3 .qs-v124-plan-highlight {
  display: flex;
  flex-direction: column;
  gap: 5px;
  margin-bottom: var(--qs-sp-5);
  padding: var(--qs-sp-5);
  border: 1px solid #d9e4f2;
  border-radius: var(--qs-r-md);
  background: linear-gradient(145deg, #f8fbff 0%, #eef4ff 100%);
}
body.qs-v3 .qs-v124-plan-highlight span { color: var(--qs-navy-500); font-size: 10px; font-weight: 700; letter-spacing: .12em; }
body.qs-v3 .qs-v124-plan-highlight strong { color: var(--qs-ink-900); font-size: var(--qs-fs-lg); line-height: 1.25; }
body.qs-v3 .qs-v124-plan-highlight small { color: var(--qs-ink-500); font-size: var(--qs-fs-sm); }
body.qs-v3 .qs-v124-plan-list { margin-bottom: var(--qs-sp-5); }
body.qs-v3 .qs-v124-plan-card > .qs-v3-btn { margin-top: auto; }
body.qs-v3 .qs-v124-preference-status { min-height: 18px; margin: 0; color: var(--qs-ink-500); font-size: var(--qs-fs-xs); }

@media (max-width: 1180px) {
  body.qs-v3 .qs-v124-security-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  body.qs-v3 .qs-v124-notification-card { grid-column: 1 / -1; }
}

@media (max-width: 760px) {
  body.qs-v3 .qs-v124-security-grid { grid-template-columns: 1fr; }
  body.qs-v3 .qs-v124-notification-card { grid-column: auto; }
}

/* Password field with reveal eye */
body.qs-v3 .qs-v3-password-field { position: relative; }
body.qs-v3 .qs-v3-password-field .qs-v3-input { padding-right: 44px; }
body.qs-v3 .qs-v3-eye {
  position: absolute;
  top: 50%;
  right: 6px;
  transform: translateY(-50%);
  width: 30px;
  height: 30px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  border: none;
  background: none;
  border-radius: var(--qs-r-sm);
  color: var(--qs-ink-400);
  cursor: pointer;
}
body.qs-v3 .qs-v3-eye svg { width: 18px; height: 18px; }
body.qs-v3 .qs-v3-eye:hover { color: var(--qs-ink-600); }
body.qs-v3 .qs-v3-eye.is-on { color: var(--qs-navy-500); }
body.qs-v3 .qs-v3-eye:focus-visible { outline: 2px solid var(--qs-navy-500); outline-offset: 1px; }

/* Full-width button */
body.qs-v3 .qs-v3-btn-block { width: 100%; justify-content: center; margin-top: var(--qs-sp-1); }

/* Active sessions */
body.qs-v3 .qs-v3-session-list { list-style: none; margin: 0 0 var(--qs-sp-4); padding: 0; display: flex; flex-direction: column; gap: var(--qs-sp-3); }
body.qs-v3 .qs-v3-session-item {
  display: flex;
  align-items: flex-start;
  gap: var(--qs-sp-3);
  padding: var(--qs-sp-3);
  border: 1px solid var(--qs-border);
  border-radius: var(--qs-r-md);
  background: var(--qs-surface-alt);
}
body.qs-v3 .qs-v3-session-icon {
  flex-shrink: 0;
  width: 36px;
  height: 36px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  border-radius: var(--qs-r-md);
  background: var(--qs-info-soft);
  color: var(--qs-navy-500);
}
body.qs-v3 .qs-v3-session-icon svg { width: 18px; height: 18px; }
body.qs-v3 .qs-v3-session-meta { display: flex; flex-direction: column; gap: 2px; min-width: 0; flex: 1 1 auto; }
body.qs-v3 .qs-v3-session-meta strong { font-size: var(--qs-fs-sm); color: var(--qs-ink-800); display: flex; align-items: center; gap: var(--qs-sp-2); flex-wrap: wrap; }
body.qs-v3 .qs-v3-session-meta span { font-size: var(--qs-fs-xs); color: var(--qs-ink-500); }
body.qs-v3 .qs-v3-session-badge {
  padding: 2px 8px;
  border-radius: var(--qs-r-full);
  background: var(--qs-success-soft);
  color: #047857;
  font-size: 10px;
  font-weight: var(--qs-fw-semibold);
  text-transform: uppercase;
  letter-spacing: 0.03em;
}
body.qs-v3 .qs-v3-session-kebab {
  flex-shrink: 0;
  width: 28px;
  height: 28px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  border: none;
  background: none;
  border-radius: var(--qs-r-sm);
  color: var(--qs-ink-400);
  cursor: pointer;
}
body.qs-v3 .qs-v3-session-kebab svg { width: 16px; height: 16px; }
body.qs-v3 .qs-v3-session-kebab:hover { background: var(--qs-surface); color: var(--qs-ink-700); }

/* Inline form note (password validation / pending-backend status) */
body.qs-v3 .qs-v3-form-note { margin-top: var(--qs-sp-1); font-size: var(--qs-fs-xs); color: var(--qs-ink-500); }
body.qs-v3 .qs-v3-form-note.is-error { color: var(--qs-danger); }

/* Responsive ------------------------------------------------------------- */
@media (max-width: 1200px) {
  body.qs-v3 .qs-v3-settings-grid-4 { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}
@media (max-width: 900px) {
  body.qs-v3 .qs-v3-settings-grid-2 { grid-template-columns: 1fr; }
  body.qs-v3 .qs-v3-profile-body { grid-template-columns: 1fr; gap: var(--qs-sp-6); }
  body.qs-v3 .qs-v3-profile-aside {
    flex-direction: row;
    flex-wrap: wrap;
    justify-content: flex-start;
    text-align: left;
    gap: var(--qs-sp-3);
  }
  body.qs-v3 .qs-v3-profile-logo { width: 88px; height: 88px; font-size: var(--qs-fs-3xl); }
  body.qs-v3 .qs-v3-profile-fields { grid-template-columns: 1fr; }
}
@media (max-width: 640px) {
  body.qs-v3 .qs-v3-tabs { overflow-x: auto; flex-wrap: nowrap; }
  body.qs-v3 .qs-v3-tab { white-space: nowrap; }
  body.qs-v3 .qs-v3-settings-grid-4 { grid-template-columns: 1fr; }
  body.qs-v3 .qs-v3-agency-summary-row { grid-template-columns: 1fr; gap: var(--qs-sp-1); }
  body.qs-v3 .qs-v3-save-bar { flex-wrap: wrap; justify-content: stretch; }
  body.qs-v3 .qs-v3-unsaved { flex-basis: 100%; margin-right: 0; }
  body.qs-v3 .qs-v3-save-bar .qs-v3-btn { flex: 1; }
}

/* The photo aside is narrower than the old logo aside */
body.qs-v3 .qs-v3-settings .qs-v3-profile-body { grid-template-columns: 156px minmax(0, 1fr); }
@media (max-width: 900px) {
  body.qs-v3 .qs-v3-settings .qs-v3-profile-body { grid-template-columns: 1fr; }
}


/* === CUSTOMERS (customers.html) ========================================
   Card grid -> data table + insights rail. The table body #customerCards
   is a <tbody>; customers.js renderCustomers() (markup-only edit) fills it
   with <tr> rows carrying data-customer-id. The detail panel is a modal
   whose body #customerDetailPanel still receives renderDetail() output.

   #customersMessage keeps only .notice (customers.js overwrites className).
   Insight numbers are derived client-side by qs-customers-ui.js.
   ======================================================================== */

body.qs-v3.qs-v3-customers { --qs-cust-rail: 300px; margin: 0; }

/* Layout: table + insights rail ----------------------------------------- */
body.qs-v3 .qs-v3-cust-layout {
  display: grid;
  grid-template-columns: minmax(0, 1fr) var(--qs-cust-rail);
  gap: var(--qs-sp-6);
  align-items: start;
}
/* Without this the table-card (grid item, default min-width:auto) expands to
   the table's min-width and overflows the viewport instead of letting the
   inner .qs-v3-table-wrap scroll. */
body.qs-v3 .qs-v3-cust-layout > * { min-width: 0; }

/* Toolbar: search | tag/country/source filters + More Filters | Refresh /
   Import / Export. Search + Refresh are the working hooks; the rest is
   frontend-only pending backend. ------------------------------------------ */
body.qs-v3 .qs-v3-cust-toolbar {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--qs-sp-3);
  margin-bottom: var(--qs-sp-4);
}
body.qs-v3 .qs-v3-cust-search { flex: 1 1 220px; min-width: 0; max-width: 340px; }
body.qs-v3 .qs-v3-cust-filters {
  display: inline-flex;
  align-items: center;
  gap: var(--qs-sp-2);
  flex-wrap: wrap;
}
/* Override the base .qs-v3-select width:100% so selects hug their content in
   the inline toolbar instead of stretching (which would overflow). */
body.qs-v3 .qs-v3-cust-filter { width: auto; min-width: 128px; max-width: 100%; }
body.qs-v3 .qs-v3-cust-morefilters { flex-shrink: 0; }
body.qs-v3 .qs-v3-cust-morefilters svg { width: 15px; height: 15px; }
body.qs-v3 .qs-v3-cust-toolbar-actions {
  display: inline-flex;
  align-items: center;
  gap: var(--qs-sp-2);
  margin-left: auto;
  flex-shrink: 0;
}
body.qs-v3 .qs-v3-cust-toolbar-actions .qs-v3-btn svg { width: 15px; height: 15px; }

/* More Filters placeholder panel (frontend-only) */
body.qs-v3 .qs-v3-cust-morefilters-panel {
  margin-bottom: var(--qs-sp-4);
  padding: var(--qs-sp-4);
  border: 1px dashed var(--qs-border-strong);
  border-radius: var(--qs-r-md);
  background: var(--qs-surface-alt);
}
body.qs-v3 .qs-v3-cust-morefilters-panel .qs-v3-hint { margin: 0; }

/* Lifetime Value + Last Activity cells (frontend-only placeholders) */
body.qs-v3 .qs-v3-cust-ltv {
  font-variant-numeric: tabular-nums;
  font-weight: var(--qs-fw-semibold);
  color: var(--qs-ink-800);
  white-space: nowrap;
}
body.qs-v3 .qs-v3-cust-activity {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  font-size: var(--qs-fs-sm);
  color: var(--qs-ink-500);
  white-space: nowrap;
}
body.qs-v3 .qs-v3-activity-dot {
  width: 7px;
  height: 7px;
  border-radius: var(--qs-r-full);
  background: var(--qs-ink-400);
  flex-shrink: 0;
}
body.qs-v3 .qs-v3-cust-activity.is-active .qs-v3-activity-dot { background: var(--qs-success); }
body.qs-v3 .qs-v3-cust-activity.is-inactive .qs-v3-activity-dot { background: var(--qs-warning); }

/* Pagination: showing-count (real hook) + page buttons + per-page ---------- */
body.qs-v3 .qs-v3-cust-pagination {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--qs-sp-3);
  flex-wrap: wrap;
  margin-top: var(--qs-sp-5);
  padding-top: var(--qs-sp-4);
  border-top: 1px solid var(--qs-border);
}
body.qs-v3 .qs-v3-cust-showing { font-size: var(--qs-fs-sm); white-space: nowrap; }
body.qs-v3 .qs-v3-cust-pager-group { display: inline-flex; align-items: center; gap: var(--qs-sp-3); flex-wrap: wrap; }
body.qs-v3 .qs-v3-cust-pager { display: inline-flex; align-items: center; gap: var(--qs-sp-1); }
body.qs-v3 .qs-v3-pager-btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-width: 34px;
  height: 34px;
  padding: 0 var(--qs-sp-2);
  border: 1px solid var(--qs-border);
  border-radius: var(--qs-r-sm);
  background: var(--qs-surface);
  color: var(--qs-ink-700);
  font-size: var(--qs-fs-sm);
  font-weight: var(--qs-fw-medium);
  cursor: pointer;
  transition: background var(--qs-t-fast) var(--qs-ease), border-color var(--qs-t-fast) var(--qs-ease), color var(--qs-t-fast) var(--qs-ease);
}
body.qs-v3 .qs-v3-pager-btn:hover { border-color: var(--qs-navy-400); background: var(--qs-surface-alt); }
body.qs-v3 .qs-v3-pager-btn.is-active { background: var(--qs-navy-500); border-color: var(--qs-navy-500); color: #fff; }
body.qs-v3 .qs-v3-pager-btn:focus-visible { outline: 2px solid var(--qs-navy-400); outline-offset: 2px; }
body.qs-v3 .qs-v3-pager-nav { font-size: var(--qs-fs-lg); }
body.qs-v3 .qs-v3-cust-perpage { width: auto; min-width: 108px; max-width: 100%; }

/* Table ------------------------------------------------------------------ */
/* No desktop min-width: at 1440 the table must fit its column so the actions
   cell isn't clipped. A scroll floor is applied only at narrow widths below. */
body.qs-v3 .qs-v3-cust-row { cursor: pointer; }
body.qs-v3 .qs-v3-cust-row.is-selected { background: var(--qs-info-soft); }
body.qs-v3 .qs-v3-cust-row.is-selected:hover { background: var(--qs-info-soft); }
body.qs-v3 .qs-v3-cust-table .qs-v3-table-user-name {
  gap: var(--qs-sp-2);
  white-space: nowrap;
}
/* Tighten padding (each selector must repeat the prefix — a bare "td" in a
   comma list would drop to specificity 0,0,1 and lose to the base table
   rule) so all seven columns fit the ~760px main column without scrolling. */
body.qs-v3 .qs-v3-cust-table thead th,
body.qs-v3 .qs-v3-cust-table tbody td { padding-left: var(--qs-sp-2); padding-right: var(--qs-sp-2); }
body.qs-v3 .qs-v3-cust-table thead th { text-align: center; }
body.qs-v3 .qs-v3-cust-table tbody td {
  text-align: center;
  font-size: var(--qs-fs-sm);
}
body.qs-v3 .qs-v3-cust-table .qs-v3-table-user,
body.qs-v3 .qs-v3-cust-table .qs-v3-table-user-name,
body.qs-v3 .qs-v3-cust-table .qs-v3-table-actions {
  justify-content: center;
}
body.qs-v3 .qs-v3-cust-table .qs-v3-table-user-name {
  text-align: center;
  font-size: var(--qs-fs-sm);
}
/* Numeric / value / activity columns hug their content. Their multi-word
   headers (Total Quotes, Confirmed Trips, Lifetime Value, Last Activity) are
   allowed to wrap to two lines so the columns stay narrow; the data cells stay
   on one line. */
body.qs-v3 .qs-v3-cust-table th:nth-child(3),
body.qs-v3 .qs-v3-cust-table th:nth-child(4),
body.qs-v3 .qs-v3-cust-table th:nth-child(5),
body.qs-v3 .qs-v3-cust-table th:nth-child(6) { width: 1%; padding-left: var(--qs-sp-1); padding-right: var(--qs-sp-1); }
body.qs-v3 .qs-v3-cust-table td:nth-child(3),
body.qs-v3 .qs-v3-cust-table td:nth-child(4),
body.qs-v3 .qs-v3-cust-table td:nth-child(5),
body.qs-v3 .qs-v3-cust-table td:nth-child(6) { white-space: nowrap; padding-left: var(--qs-sp-1); padding-right: var(--qs-sp-1); }
body.qs-v3 .qs-v3-cust-table th:last-child,
body.qs-v3 .qs-v3-cust-table td:last-child { width: 1%; white-space: nowrap; }
body.qs-v3 .qs-v3-empty-cell {
  padding: var(--qs-sp-10) var(--qs-sp-6) !important;
  text-align: center;
  color: var(--qs-ink-500);
  font-size: var(--qs-fs-sm);
}

/* Insights rail ---------------------------------------------------------- */
body.qs-v3 .qs-v3-cust-insights { position: sticky; top: var(--qs-sp-6); }
body.qs-v3 .qs-v3-insight-title {
  font-size: var(--qs-fs-sm);
  font-weight: var(--qs-fw-semibold);
  color: var(--qs-ink-700);
  margin: 0 0 var(--qs-sp-3);
}
body.qs-v3 .qs-v3-insight-empty {
  padding: var(--qs-sp-4);
  text-align: left;
  border: 0;
  background: transparent;
}

/* Repeat donut: page-specific fill driven by --pct (repeat vs new). The
   base .qs-v3-donut supplies the ring size and the centre hole. */
body.qs-v3 #custDonut {
  width: 96px;
  height: 96px;
  background: conic-gradient(var(--qs-navy-500) var(--pct, 0%), var(--qs-gold-400) 0);
}
body.qs-v3 #custDonut::after { inset: 11px; }
body.qs-v3 #custDonut .qs-v3-donut-center strong { font-size: var(--qs-fs-lg); }

body.qs-v3 .qs-v3-insight-legend { margin: 0; padding: 0; flex: 1; }
body.qs-v3 .qs-v3-insight-legend > div {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--qs-sp-2);
  padding: var(--qs-sp-1) 0;
}
body.qs-v3 .qs-v3-insight-legend dt {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  color: var(--qs-ink-500);
  font-size: var(--qs-fs-xs);
}
body.qs-v3 .qs-v3-insight-legend dd {
  margin: 0;
  color: var(--qs-ink-900);
  font-size: var(--qs-fs-sm);
  font-weight: var(--qs-fw-semibold);
}
body.qs-v3 .qs-v3-legend-dot {
  width: 8px; height: 8px; border-radius: var(--qs-r-full); flex-shrink: 0;
}
body.qs-v3 .qs-v3-legend-dot.is-repeat { background: var(--qs-navy-500); }
body.qs-v3 .qs-v3-legend-dot.is-new { background: var(--qs-gold-400); }

/* Top destinations ------------------------------------------------------- */
body.qs-v3 .qs-v3-insight-list { list-style: none; margin: 0; padding: 0; }
body.qs-v3 .qs-v3-insight-list li {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--qs-sp-3);
  padding: var(--qs-sp-2) 0;
}
body.qs-v3 .qs-v3-insight-name { color: var(--qs-ink-700); font-size: var(--qs-fs-sm); }
body.qs-v3 .qs-v3-insight-val {
  color: var(--qs-ink-900);
  font-size: var(--qs-fs-sm);
  font-weight: var(--qs-fw-semibold);
  font-variant-numeric: tabular-nums;
}

/* Upcoming events -------------------------------------------------------- */
body.qs-v3 .qs-v3-insight-events { list-style: none; margin: 0; padding: 0; }
body.qs-v3 .qs-v3-insight-events li {
  display: flex;
  align-items: center;
  gap: var(--qs-sp-3);
  padding: var(--qs-sp-2) 0;
  border-top: 1px solid var(--qs-border);
}
body.qs-v3 .qs-v3-insight-events li:first-child { border-top: 0; }
body.qs-v3 .qs-v3-insight-ev-icon {
  width: 32px; height: 32px;
  display: inline-flex; align-items: center; justify-content: center;
  background: var(--qs-gold-100);
  border-radius: var(--qs-r-md);
  font-size: var(--qs-fs-base);
  flex-shrink: 0;
}
body.qs-v3 .qs-v3-insight-ev-body { flex: 1; min-width: 0; line-height: var(--qs-lh-snug); }
body.qs-v3 .qs-v3-insight-ev-body strong {
  display: block; color: var(--qs-ink-900); font-size: var(--qs-fs-sm);
  font-weight: var(--qs-fw-semibold);
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
body.qs-v3 .qs-v3-insight-ev-body small { color: var(--qs-ink-500); font-size: var(--qs-fs-xs); }
body.qs-v3 .qs-v3-insight-ev-when {
  color: var(--qs-ink-500); font-size: var(--qs-fs-xs); white-space: nowrap; flex-shrink: 0;
}

/* Add/Edit form card ----------------------------------------------------- */
body.qs-v3.qs-v3-modal-open { overflow: hidden; }
body.qs-v3 .qs-v3-cust-form-modal {
  align-items: center;
  padding: var(--qs-sp-6) var(--qs-sp-4);
}
body.qs-v3 .qs-v3-cust-form-dialog {
  max-width: 820px;
  max-height: calc(100vh - (var(--qs-sp-6) * 2));
  display: flex;
  flex-direction: column;
}
body.qs-v3 .qs-v3-cust-form-dialog .qs-v3-modal-body {
  overflow-y: auto;
  padding: var(--qs-sp-6);
}
body.qs-v3 .qs-v3-cust-form-dialog .qs-v3-card-subtitle { margin: var(--qs-sp-1) 0 0; }
body.qs-v3 .qs-v3-cust-form {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: var(--qs-sp-5);
}
body.qs-v3 .qs-v3-cust-form input[type="hidden"] { display: none; }
body.qs-v3 .qs-v3-cust-form-actions {
  display: flex;
  align-items: center;
  justify-content: flex-end;
  gap: var(--qs-sp-4);
  padding-top: var(--qs-sp-4);
  border-top: 1px solid var(--qs-border);
}
body.qs-v3 .qs-v3-cust-form-actions .qs-v3-inline-status { margin-right: auto; }

/* Detail modal ----------------------------------------------------------- */
body.qs-v3 .qs-v3-modal-overlay {
  position: fixed;
  inset: 0;
  z-index: 200;
  display: flex;
  align-items: flex-start;
  justify-content: center;
  padding: var(--qs-sp-10) var(--qs-sp-4);
  background: rgba(15, 23, 42, 0.55);
  overflow-y: auto;
}
body.qs-v3 .qs-v3-modal {
  width: 100%;
  max-width: 560px;
  background: var(--qs-surface);
  border-radius: var(--qs-r-xl);
  box-shadow: var(--qs-sh-xl);
  overflow: hidden;
  outline: none;
}
body.qs-v3 .qs-v3-modal-head {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--qs-sp-4);
  padding: var(--qs-sp-5) var(--qs-sp-6);
  border-bottom: 1px solid var(--qs-border);
}
body.qs-v3 .qs-v3-modal-title { font-size: var(--qs-fs-lg); }
body.qs-v3 .qs-v3-modal-close {
  width: 36px; height: 36px;
  display: inline-flex; align-items: center; justify-content: center;
  border: 0; background: transparent; border-radius: var(--qs-r-md);
  color: var(--qs-ink-500); cursor: pointer;
}
body.qs-v3 .qs-v3-modal-close:hover { background: var(--qs-ink-100); color: var(--qs-ink-900); }
body.qs-v3 .qs-v3-modal-close svg { width: 18px; height: 18px; }
body.qs-v3 .qs-v3-modal-body { padding: var(--qs-sp-6); }

/* renderDetail() markup inside the modal (app.css classes, restyled here) */
body.qs-v3 .qs-v3-modal-body .customer-detail-head {
  display: flex; align-items: center; gap: var(--qs-sp-4); margin-bottom: var(--qs-sp-5);
}
body.qs-v3 .qs-v3-modal-body .customer-avatar.large {
  width: 56px; height: 56px; border-radius: var(--qs-r-full);
  display: inline-flex; align-items: center; justify-content: center;
  background: var(--qs-navy-700); color: #fff;
  font-weight: var(--qs-fw-semibold); flex-shrink: 0;
}
body.qs-v3 .qs-v3-modal-body .customer-detail-head h3 { font-size: var(--qs-fs-xl); }
body.qs-v3 .qs-v3-modal-body .customer-detail-head p { color: var(--qs-ink-500); font-size: var(--qs-fs-sm); }

body.qs-v3 .qs-v3-modal-body .customer-detail-actions {
  display: flex; flex-wrap: wrap; gap: var(--qs-sp-2); margin-bottom: var(--qs-sp-5);
}
/* renderDetail buttons use app.css .btn classes; give them the v3 look */
body.qs-v3 .qs-v3-modal-body .btn {
  display: inline-flex; align-items: center; justify-content: center;
  padding: 8px 14px; border-radius: var(--qs-r-md);
  font-size: var(--qs-fs-sm); font-weight: var(--qs-fw-semibold);
  border: 1px solid var(--qs-border-strong); background: var(--qs-surface);
  color: var(--qs-ink-800); cursor: pointer; text-decoration: none;
}
body.qs-v3 .qs-v3-modal-body .btn:hover { background: var(--qs-surface-alt); }
body.qs-v3 .qs-v3-modal-body .btn.primary {
  background: var(--qs-navy-500); border-color: var(--qs-navy-500); color: #fff;
}
body.qs-v3 .qs-v3-modal-body .btn.primary:hover { background: var(--qs-navy-700); }
body.qs-v3 .qs-v3-modal-body .btn.danger {
  color: var(--qs-danger); border-color: var(--qs-border);
}
body.qs-v3 .qs-v3-modal-body .btn.danger:hover { background: var(--qs-danger-soft); border-color: var(--qs-danger); }
body.qs-v3 .qs-v3-modal-body .btn.small { padding: 5px 10px; font-size: var(--qs-fs-xs); }

body.qs-v3 .qs-v3-modal-body .customer-info-grid {
  display: grid; grid-template-columns: 1fr 1fr; gap: var(--qs-sp-3);
  padding: var(--qs-sp-4) 0; border-top: 1px solid var(--qs-border);
}
body.qs-v3 .qs-v3-modal-body .customer-info-grid > div { display: flex; flex-direction: column; gap: 2px; }
body.qs-v3 .qs-v3-modal-body .customer-info-grid span { color: var(--qs-ink-500); font-size: var(--qs-fs-xs); }
body.qs-v3 .qs-v3-modal-body .customer-info-grid strong { color: var(--qs-ink-900); font-size: var(--qs-fs-sm); }

body.qs-v3 .qs-v3-modal-body .customer-tags { display: flex; flex-wrap: wrap; gap: var(--qs-sp-2); margin: var(--qs-sp-3) 0; }
body.qs-v3 .qs-v3-modal-body .tag-pill {
  display: inline-flex; padding: 2px 10px; border-radius: var(--qs-r-full);
  background: var(--qs-gold-100); color: #7C5A16;
  font-size: var(--qs-fs-xs); font-weight: var(--qs-fw-medium);
}
body.qs-v3 .qs-v3-modal-body .customer-note-block { margin-top: var(--qs-sp-3); }
body.qs-v3 .qs-v3-modal-body .customer-note-block strong { font-size: var(--qs-fs-sm); color: var(--qs-ink-900); }
body.qs-v3 .qs-v3-modal-body .customer-note-block p { color: var(--qs-ink-600); font-size: var(--qs-fs-sm); margin-top: 2px; }

body.qs-v3 .qs-v3-modal-body .customer-quote-list { display: flex; flex-direction: column; gap: var(--qs-sp-2); margin-top: var(--qs-sp-3); }
body.qs-v3 .qs-v3-modal-body .customer-quote-item {
  display: flex; align-items: center; justify-content: space-between; gap: var(--qs-sp-3);
  padding: var(--qs-sp-3); border: 1px solid var(--qs-border); border-radius: var(--qs-r-md);
}
body.qs-v3 .qs-v3-modal-body .customer-quote-item strong { display: block; font-size: var(--qs-fs-sm); color: var(--qs-ink-900); }
body.qs-v3 .qs-v3-modal-body .customer-quote-item small { color: var(--qs-ink-500); font-size: var(--qs-fs-xs); }
body.qs-v3 .qs-v3-modal-body .empty-state,
body.qs-v3 .qs-v3-modal-body .empty-state.compact {
  padding: var(--qs-sp-6); text-align: center; color: var(--qs-ink-500);
  font-size: var(--qs-fs-sm); background: var(--qs-surface-alt); border-radius: var(--qs-r-md);
}
body.qs-v3 .qs-v3-modal-body .section-head.compact { margin-top: var(--qs-sp-5); }
body.qs-v3 .qs-v3-modal-body .section-head.compact h3 { font-size: var(--qs-fs-base); }
body.qs-v3 .qs-v3-modal-body .section-head.compact p { color: var(--qs-ink-500); font-size: var(--qs-fs-xs); }

/* Responsive ------------------------------------------------------------- */
@media (max-width: 1100px) {
  body.qs-v3 .qs-v3-cust-layout { grid-template-columns: minmax(0, 1fr); }
  body.qs-v3 .qs-v3-cust-insights { position: static; }
}
/* Narrow: instead of a min-width that forces horizontal scroll (a nested
   auto-scroller widens the viewport in Chromium), drop the non-essential
   columns so the table fits. Below 760px: hide Total Quotes, Confirmed Trips,
   Lifetime Value, Last Activity. Below 480px: also hide Phone & Email, leaving
   Name + Actions. (Quotes/Trips remain in the detail modal.) */
@media (max-width: 760px) {
  body.qs-v3 .qs-v3-cust-table th:nth-child(3),
  body.qs-v3 .qs-v3-cust-table td:nth-child(3),
  body.qs-v3 .qs-v3-cust-table th:nth-child(4),
  body.qs-v3 .qs-v3-cust-table td:nth-child(4),
  body.qs-v3 .qs-v3-cust-table th:nth-child(5),
  body.qs-v3 .qs-v3-cust-table td:nth-child(5),
  body.qs-v3 .qs-v3-cust-table th:nth-child(6),
  body.qs-v3 .qs-v3-cust-table td:nth-child(6) { display: none; }
}
@media (max-width: 480px) {
  body.qs-v3 .qs-v3-cust-table th:nth-child(2),
  body.qs-v3 .qs-v3-cust-table td:nth-child(2) { display: none; }
}
@media (max-width: 700px) {
  body.qs-v3 .qs-v3-cust-search { max-width: none; flex-basis: 100%; }
  body.qs-v3 .qs-v3-cust-filters { width: 100%; }
  body.qs-v3 .qs-v3-cust-filter { flex: 1 1 128px; }
  body.qs-v3 .qs-v3-cust-toolbar-actions { margin-left: 0; width: 100%; }
  body.qs-v3 .qs-v3-cust-toolbar-actions .qs-v3-btn { flex: 1; justify-content: center; }
  body.qs-v3 .qs-v3-cust-pagination { justify-content: center; }
  body.qs-v3 .qs-v3-cust-form { grid-template-columns: 1fr; }
  body.qs-v3 .qs-v3-modal-overlay { padding: var(--qs-sp-4) var(--qs-sp-3); }
}


/* === MY QUOTES (quotes.html) ===========================================
   No mockup: qs-v3 shell + the existing card-grid UI restyled. quotes.js is
   unchanged; it emits .quote-group-card / .quote-version-card / status badges
   / .quote-detail-card into #quoteGroupGrid and #quoteDetailPanel, all styled
   here (app.css classes, not new ones).

   The legacy .quote-table-list table is never shown (quotes.js hideTable()).
   #quotesMessage and #quoteCreditSummary keep only .notice (className is
   overwritten by quotes.js setMessage()).
   ======================================================================== */

body.qs-v3.qs-v3-quotes { margin: 0; }

body.qs-v3 .qs-v3-quotes-actions {
  display: flex;
  justify-content: flex-end;
  gap: var(--qs-sp-3);
}

body.qs-v3 .qs-v3-quotes-panel { padding: var(--qs-sp-6); }

/* Toolbar: search + status + count -------------------------------------- */
body.qs-v3 .qs-v3-quotes-toolbar {
  display: flex;
  align-items: center;
  gap: var(--qs-sp-4);
  margin-bottom: var(--qs-sp-6);
}
body.qs-v3 .qs-v3-quotes-search { flex: 1; min-width: 0; max-width: 480px; }
body.qs-v3 .qs-v3-quotes-statusfield { flex-shrink: 0; }
body.qs-v3 .qs-v3-quotes-statusfield .qs-v3-select { min-width: 150px; }
body.qs-v3 .qs-v3-quotes-count { flex-shrink: 0; font-size: var(--qs-fs-sm); white-space: nowrap; }

/* Card grid (emitted by quotes.js renderQuoteGroups / renderVersionCards) */
body.qs-v3 .quote-group-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));
  gap: var(--qs-sp-5);
}
body.qs-v3 .quote-group-grid:empty { display: none; }

body.qs-v3 .quote-group-card {
  display: flex;
  flex-direction: column;
  text-align: left;
  padding: 0;
  background: var(--qs-surface);
  border: 1px solid var(--qs-border);
  border-radius: var(--qs-r-xl);
  overflow: hidden;
  cursor: pointer;
  box-shadow: var(--qs-sh-xs);
  transition: border-color var(--qs-t-fast) var(--qs-ease),
              box-shadow var(--qs-t-fast) var(--qs-ease),
              transform var(--qs-t-fast) var(--qs-ease);
  font-family: inherit;
}
body.qs-v3 .quote-group-card:hover {
  border-color: var(--qs-border-strong);
  box-shadow: var(--qs-sh-md);
  transform: translateY(-2px);
}
body.qs-v3 .quote-group-card:focus-visible {
  outline: 2px solid var(--qs-navy-500);
  outline-offset: 2px;
}

body.qs-v3 .quote-group-cover {
  position: relative;
  display: flex;
  align-items: center;
  justify-content: center;
  height: 120px;
  background: linear-gradient(135deg, var(--qs-navy-800), var(--qs-navy-500));
  color: #fff;
  overflow: hidden;
}
body.qs-v3 .quote-group-cover img { width: 100%; height: 100%; object-fit: cover; }
body.qs-v3 .quote-group-cover > span {
  font-family: var(--qs-font-display);
  font-size: var(--qs-fs-4xl);
  font-weight: var(--qs-fw-semibold);
}

body.qs-v3 .quote-group-body {
  display: flex;
  flex-direction: column;
  gap: var(--qs-sp-2);
  padding: var(--qs-sp-4) var(--qs-sp-5);
  flex: 1;
}
body.qs-v3 .quote-group-body strong {
  font-size: var(--qs-fs-lg);
  font-weight: var(--qs-fw-semibold);
  color: var(--qs-ink-900);
  line-height: var(--qs-lh-snug);
}
body.qs-v3 .quote-group-body .quote-group-customer {
  font-size: var(--qs-fs-sm);
  color: var(--qs-ink-700);
}
body.qs-v3 .quote-group-body em {
  font-style: normal;
  font-size: var(--qs-fs-sm);
  color: var(--qs-ink-500);
}

/* Status / version badges (emitted with app.css class names) */
body.qs-v3 .status-badge.quote-status-badge {
  align-self: flex-start;
  display: inline-flex;
  align-items: center;
  padding: 2px 10px;
  border-radius: var(--qs-r-full);
  font-size: var(--qs-fs-xs);
  font-weight: var(--qs-fw-semibold);
  background: var(--qs-ink-100);
  color: var(--qs-ink-700);
}
body.qs-v3 .status-badge.quote-status-badge.draft { background: var(--qs-ink-100); color: var(--qs-ink-700); }
body.qs-v3 .status-badge.quote-status-badge.saved { background: var(--qs-info-soft); color: #1E40AF; }
body.qs-v3 .status-badge.quote-status-badge.sent  { background: var(--qs-gold-100); color: #7C5A16; }
body.qs-v3 .status-badge.quote-status-badge.version-count { background: var(--qs-purple-soft); color: #6D28D9; }

body.qs-v3 .quote-group-footer {
  display: flex;
  border-top: 1px solid var(--qs-border);
}
body.qs-v3 .quote-group-footer > span {
  flex: 1;
  display: flex;
  flex-direction: column;
  gap: 2px;
  padding: var(--qs-sp-3) var(--qs-sp-5);
}
body.qs-v3 .quote-group-footer > span + span { border-left: 1px solid var(--qs-border); }
body.qs-v3 .quote-group-footer strong { font-size: var(--qs-fs-sm); color: var(--qs-ink-900); font-weight: var(--qs-fw-semibold); }
body.qs-v3 .quote-group-footer small { font-size: var(--qs-fs-xs); color: var(--qs-ink-500); }

/* Version header -------------------------------------------------------- */
body.qs-v3 .quote-version-header {
  display: flex;
  align-items: flex-start;
  justify-content: space-between;
  gap: var(--qs-sp-4);
  margin-bottom: var(--qs-sp-5);
  padding-bottom: var(--qs-sp-4);
  border-bottom: 1px solid var(--qs-border);
}
body.qs-v3 .quote-version-header h3 { font-size: var(--qs-fs-xl); }
body.qs-v3 .quote-version-header p { font-size: var(--qs-fs-sm); margin-top: 2px; }

/* Detail panel (emitted .quote-detail-card) ----------------------------- */
body.qs-v3 .quote-detail-card {
  display: grid;
  grid-template-columns: 280px minmax(0, 1fr);
  gap: var(--qs-sp-6);
  border: 1px solid var(--qs-border);
  border-radius: var(--qs-r-xl);
  overflow: hidden;
  background: var(--qs-surface);
}
body.qs-v3 .quote-detail-hero {
  display: flex;
  align-items: center;
  justify-content: center;
  min-height: 240px;
  background: linear-gradient(135deg, var(--qs-navy-800), var(--qs-navy-500));
  color: #fff;
}
body.qs-v3 .quote-detail-hero img { width: 100%; height: 100%; object-fit: cover; }
body.qs-v3 .quote-detail-hero > span { font-family: var(--qs-font-display); font-size: var(--qs-fs-5xl); }
body.qs-v3 .quote-detail-content { padding: var(--qs-sp-6) var(--qs-sp-6) var(--qs-sp-6) 0; }

body.qs-v3 .quote-detail-head {
  display: flex;
  align-items: flex-start;
  justify-content: space-between;
  gap: var(--qs-sp-4);
  margin-bottom: var(--qs-sp-5);
}
body.qs-v3 .quote-detail-head h3 { font-size: var(--qs-fs-2xl); margin-top: var(--qs-sp-2); }
body.qs-v3 .quote-detail-head .quote-group-customer { color: var(--qs-ink-500); font-size: var(--qs-fs-sm); margin-top: 2px; }

body.qs-v3 .quote-detail-meta {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));
  gap: var(--qs-sp-4);
  padding: var(--qs-sp-5) 0;
  border-top: 1px solid var(--qs-border);
  border-bottom: 1px solid var(--qs-border);
  margin-bottom: var(--qs-sp-5);
}
body.qs-v3 .quote-detail-meta > span { display: flex; flex-direction: column; gap: 2px; font-size: var(--qs-fs-sm); color: var(--qs-ink-800); }
body.qs-v3 .quote-detail-meta strong { color: var(--qs-ink-500); font-size: var(--qs-fs-xs); font-weight: var(--qs-fw-medium); text-transform: uppercase; letter-spacing: 0.03em; }

/* Action buttons in the detail view use app.css .btn classes */
body.qs-v3 .quote-detail-actions { display: flex; flex-wrap: wrap; gap: var(--qs-sp-2); }
body.qs-v3 .quote-detail-actions .btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  padding: 8px 14px;
  border-radius: var(--qs-r-md);
  font-size: var(--qs-fs-sm);
  font-weight: var(--qs-fw-semibold);
  border: 1px solid var(--qs-border-strong);
  background: var(--qs-surface);
  color: var(--qs-ink-800);
  cursor: pointer;
  text-decoration: none;
}
body.qs-v3 .quote-detail-actions .btn:hover { background: var(--qs-surface-alt); }
body.qs-v3 .quote-detail-actions .btn.primary { background: var(--qs-navy-500); border-color: var(--qs-navy-500); color: #fff; }
body.qs-v3 .quote-detail-actions .btn.primary:hover { background: var(--qs-navy-700); }
body.qs-v3 .quote-detail-actions .btn.btn-secondary { background: var(--qs-surface); }
body.qs-v3 .quote-detail-actions .btn.danger { color: var(--qs-danger); border-color: var(--qs-border); }
body.qs-v3 .quote-detail-actions .btn.danger:hover { background: var(--qs-danger-soft); border-color: var(--qs-danger); }

/* Empty states inside the grid ------------------------------------------ */
body.qs-v3 .quote-group-grid .empty-state,
body.qs-v3 .quote-detail-panel .empty-state {
  grid-column: 1 / -1;
  padding: var(--qs-sp-12) var(--qs-sp-6);
  text-align: center;
  color: var(--qs-ink-500);
  font-size: var(--qs-fs-sm);
  border: 1px dashed var(--qs-border);
  border-radius: var(--qs-r-lg);
  background: var(--qs-surface-alt);
}

/* Responsive ------------------------------------------------------------ */
@media (max-width: 700px) {
  body.qs-v3 .qs-v3-quotes-toolbar { flex-wrap: wrap; }
  body.qs-v3 .qs-v3-quotes-search { flex-basis: 100%; max-width: none; }
  body.qs-v3 .quote-detail-card { grid-template-columns: 1fr; }
  body.qs-v3 .quote-detail-hero { min-height: 160px; }
  body.qs-v3 .quote-detail-content { padding: var(--qs-sp-5); }
  body.qs-v3 .qs-v3-quotes-actions { flex-direction: column; }
  body.qs-v3 .qs-v3-quotes-actions .qs-v3-btn { width: 100%; }
}


/* === READY PACKAGES (ready-packages.html) ==============================
   qs-v3 shell + the existing card-grid UI restyled. ready-packages.js is
   unchanged; it emits .quote-group-card.ready-package-card into the grids
   (styled by the MY QUOTES rules) and .ready-version-shell / .ready-use-btn
   in the version view. Trip-type chips (#readyChipRow) are built and wired by
   qs-ready-ui.js from real data.

   Full mockup UI is now built as functional frontend (client wires the backend):
   My Packages / Admin Library tabs, sort + destination/duration selects, Clear
   Filters, per-card price / bookmark / inclusions, and pagination. The controls
   pending backend are listed in CHANGELOG with their exact wiring hook.
   #readyCreditSummary / #readyPackagesMessage keep only .notice.
   ======================================================================== */

body.qs-v3.qs-v3-ready { margin: 0; }

/* Filter chips row ------------------------------------------------------- */
body.qs-v3 .qs-v3-chip-row {
  display: flex;
  flex-wrap: wrap;
  gap: var(--qs-sp-2);
  margin-bottom: var(--qs-sp-6);
}
body.qs-v3 .qs-v3-chip-ic { display: inline-flex; }
body.qs-v3 .qs-v3-chip-ic svg { width: 14px; height: 14px; }

/* Package card cover: photo fills the frame; trip-type + duration badges
   overlay it over a bottom scrim so they stay readable on light photos. */
body.qs-v3 .ready-cover { height: 156px; }
/* .ready-cover child spans intentionally out-specify the shared
   `.quote-group-cover > span` letter rule (0,2,2) with a 0,3,1 selector, so
   the badges/scrim don't inherit its 36px Playfair sizing. */
body.qs-v3 .ready-cover .ready-cover-letter {
  font-family: var(--qs-font-display);
  font-size: var(--qs-fs-4xl);
  font-weight: var(--qs-fw-semibold);
  color: #fff;
}
body.qs-v3 .ready-cover .ready-cover-scrim {
  position: absolute;
  inset: 0;
  background: linear-gradient(to top, rgba(13, 43, 94, 0.55) 0%, rgba(13, 43, 94, 0.10) 42%, transparent 70%);
  pointer-events: none;
}
body.qs-v3 .ready-cover .ready-cover-badge {
  position: absolute;
  z-index: 1;
  display: inline-block;
  width: auto;
  padding: 2px 8px;
  border-radius: var(--qs-r-sm);
  font-family: var(--qs-font-ui);
  font-size: 11px;
  font-weight: var(--qs-fw-semibold);
  line-height: 1.5;
  letter-spacing: 0.01em;
  white-space: nowrap;
}
body.qs-v3 .ready-cover .ready-cover-type {
  top: var(--qs-sp-3);
  left: var(--qs-sp-3);
  background: var(--qs-navy-500);
  color: #fff;
}
body.qs-v3 .ready-cover .ready-cover-duration {
  right: var(--qs-sp-3);
  bottom: var(--qs-sp-3);
  background: rgba(15, 23, 42, 0.72);
  color: #fff;
}

/* Card footer: "Starting from ₹X /person" price on the left, Preview + Use
   Package actions on the right. The ₹ amount ([data-package-price]) is a
   frontend placeholder the client wires (see CHANGELOG). */
body.qs-v3 .ready-card-footer {
  display: flex;
  align-items: flex-end;
  justify-content: space-between;
  gap: var(--qs-sp-3);
  padding: 0 var(--qs-sp-5) var(--qs-sp-5);
}
body.qs-v3 .ready-card-price {
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  column-gap: 5px;
  line-height: 1.25;
  min-width: 0;
}
body.qs-v3 .ready-price-label {
  flex-basis: 100%;   /* forces amount + unit onto the next line together */
  font-size: var(--qs-fs-xs);
  color: var(--qs-ink-500);
}
body.qs-v3 .ready-price-amount {
  font-family: var(--qs-font-display);
  font-size: var(--qs-fs-lg);
  font-weight: var(--qs-fw-semibold);
  color: var(--qs-ink-900);
  white-space: nowrap;
}
body.qs-v3 .ready-price-unit {
  font-size: var(--qs-fs-xs);
  color: var(--qs-ink-500);
}
body.qs-v3 .ready-card-actions {
  display: flex;
  justify-content: flex-end;
  gap: var(--qs-sp-2);
  flex-shrink: 0;
}

/* Cover bookmark button (top-right) — frontend-only save toggle. */
body.qs-v3 .ready-cover-bookmark {
  position: absolute;
  z-index: 2;
  top: var(--qs-sp-3);
  right: var(--qs-sp-3);
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 30px;
  height: 30px;
  padding: 0;
  border: none;
  border-radius: var(--qs-r-full);
  background: rgba(255, 255, 255, 0.92);
  color: var(--qs-ink-700);
  cursor: pointer;
  box-shadow: var(--qs-sh-xs);
  transition: background var(--qs-t-fast) var(--qs-ease), color var(--qs-t-fast) var(--qs-ease), transform var(--qs-t-fast) var(--qs-ease);
}
body.qs-v3 .ready-cover-bookmark svg { width: 16px; height: 16px; }
body.qs-v3 .ready-cover-bookmark:hover { transform: translateY(-1px); }
body.qs-v3 .ready-cover-bookmark.is-saved {
  background: var(--qs-navy-500);
  color: #fff;
}
body.qs-v3 .ready-cover-bookmark.is-saved svg { fill: currentColor; }
body.qs-v3 .ready-cover-bookmark:focus-visible {
  outline: 2px solid var(--qs-navy-400);
  outline-offset: 2px;
}

/* Inclusions icon row in the card body (Hotels / Meals / Transfers /
   Sightseeing) — static frontend labels; client wires real inclusions. */
body.qs-v3 .ready-inclusions {
  display: flex;
  flex-wrap: wrap;
  gap: var(--qs-sp-3);
  margin-top: var(--qs-sp-1);
  padding-top: var(--qs-sp-3);
  border-top: 1px solid var(--qs-border);
}
body.qs-v3 .ready-inclusion {
  display: inline-flex;
  align-items: center;
  gap: 5px;
  font-size: var(--qs-fs-xs);
  color: var(--qs-ink-500);
}
body.qs-v3 .ready-inclusion svg {
  width: 15px;
  height: 15px;
  color: var(--qs-navy-500);
  flex-shrink: 0;
}

/* Per-category cover-badge colours (first trip-type token → ready-cat-*).
   These out-specify the default navy .ready-cover-type at (0,3,1). */
body.qs-v3 .ready-cover .ready-cover-type.ready-cat-mountains,
body.qs-v3 .ready-cover .ready-cover-type.ready-cat-mountain,
body.qs-v3 .ready-cover .ready-cover-type.ready-cat-hill,
body.qs-v3 .ready-cover .ready-cover-type.ready-cat-hills { background: #B45309; }
body.qs-v3 .ready-cover .ready-cover-type.ready-cat-beach,
body.qs-v3 .ready-cover .ready-cover-type.ready-cat-island,
body.qs-v3 .ready-cover .ready-cover-type.ready-cat-islands { background: #0F766E; }
body.qs-v3 .ready-cover .ready-cover-type.ready-cat-family { background: #7C3AED; }
body.qs-v3 .ready-cover .ready-cover-type.ready-cat-international { background: #2563EB; }
body.qs-v3 .ready-cover .ready-cover-type.ready-cat-honeymoon,
body.qs-v3 .ready-cover .ready-cover-type.ready-cat-romantic { background: #E11D48; }
body.qs-v3 .ready-cover .ready-cover-type.ready-cat-domestic { background: #059669; }
body.qs-v3 .ready-cover .ready-cover-type.ready-cat-adventure { background: #C2410C; }
body.qs-v3 .ready-cover .ready-cover-type.ready-cat-luxury,
body.qs-v3 .ready-cover .ready-cover-type.ready-cat-premium { background: #92400E; }
body.qs-v3 .ready-cover .ready-cover-type.ready-cat-wildlife,
body.qs-v3 .ready-cover .ready-cover-type.ready-cat-nature { background: #15803D; }
body.qs-v3 .ready-cover .ready-cover-type.ready-cat-city,
body.qs-v3 .ready-cover .ready-cover-type.ready-cat-cultural,
body.qs-v3 .ready-cover .ready-cover-type.ready-cat-heritage { background: #7E22CE; }
body.qs-v3 .ready-cover .ready-cover-type.ready-cat-pilgrimage,
body.qs-v3 .ready-cover .ready-cover-type.ready-cat-spiritual { background: #A16207; }

/* Source tabs row: My Packages / Admin Library on the left, Create Blank
   Quote + Refresh on the right. */
body.qs-v3 .ready-tabs-row {
  display: flex;
  align-items: center;
  gap: var(--qs-sp-4);
  flex-wrap: wrap;
  margin-bottom: var(--qs-sp-5);
}
body.qs-v3 .ready-tabs-row .qs-v3-tabs { margin-bottom: 0; }
body.qs-v3 .ready-tabs { flex: 1 1 auto; }

/* My Packages placeholder panel */
body.qs-v3 .ready-my-empty { margin: var(--qs-sp-4) 0; }

/* Toolbar: search left, Sort-by select right */
body.qs-v3 .ready-sort {
  display: inline-flex;
  align-items: center;
  gap: var(--qs-sp-2);
  margin-left: auto;
  flex-shrink: 0;
}
body.qs-v3 .ready-sort-label {
  font-size: var(--qs-fs-sm);
  color: var(--qs-ink-500);
  white-space: nowrap;
}
/* Override the base .qs-v3-select width:100% so selects size to content inside
   the inline-flex toolbar/filter rows instead of stretching (which overflowed). */
body.qs-v3 .ready-select { width: auto; min-width: 150px; max-width: 100%; }

/* Filter row: chips on the left, All Destinations / Any Duration / Clear
   Filters on the right. */
body.qs-v3 .ready-filter-row {
  display: flex;
  align-items: flex-start;
  justify-content: space-between;
  gap: var(--qs-sp-3);
  flex-wrap: wrap;
  margin-bottom: var(--qs-sp-6);
}
body.qs-v3 .ready-filter-row .qs-v3-chip-row {
  margin-bottom: 0;
  flex: 1 1 auto;
}
body.qs-v3 .ready-filter-controls {
  display: inline-flex;
  align-items: center;
  gap: var(--qs-sp-2);
  min-width: 0;   /* allow the group to shrink instead of overflowing */
  flex-wrap: wrap;
}
body.qs-v3 .ready-filter-controls .ready-select { min-width: 140px; }
body.qs-v3 .ready-clear-filters {
  border: none;
  background: none;
  padding: 4px 2px;
  font-size: var(--qs-fs-sm);
  font-weight: var(--qs-fw-medium);
  color: var(--qs-navy-500);
  cursor: pointer;
  white-space: nowrap;
}
body.qs-v3 .ready-clear-filters:hover { text-decoration: underline; }
body.qs-v3 .ready-clear-filters:focus-visible {
  outline: 2px solid var(--qs-navy-400);
  outline-offset: 2px;
  border-radius: var(--qs-r-sm);
}

/* Pagination: count on the left, page controls on the right. */
body.qs-v3 .ready-pagination {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--qs-sp-3);
  flex-wrap: wrap;
  margin-top: var(--qs-sp-6);
  padding-top: var(--qs-sp-5);
  border-top: 1px solid var(--qs-border);
}
body.qs-v3 .ready-pager {
  display: inline-flex;
  align-items: center;
  gap: var(--qs-sp-1);
}
body.qs-v3 .ready-pager-btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-width: 34px;
  height: 34px;
  padding: 0 var(--qs-sp-2);
  border: 1px solid var(--qs-border);
  border-radius: var(--qs-r-sm);
  background: var(--qs-surface);
  color: var(--qs-ink-700);
  font-size: var(--qs-fs-sm);
  font-weight: var(--qs-fw-medium);
  cursor: pointer;
  transition: background var(--qs-t-fast) var(--qs-ease), border-color var(--qs-t-fast) var(--qs-ease), color var(--qs-t-fast) var(--qs-ease);
}
body.qs-v3 .ready-pager-btn:hover { border-color: var(--qs-navy-400); background: var(--qs-surface-alt); }
body.qs-v3 .ready-pager-btn.is-active {
  background: var(--qs-navy-500);
  border-color: var(--qs-navy-500);
  color: #fff;
}
body.qs-v3 .ready-pager-btn:focus-visible {
  outline: 2px solid var(--qs-navy-400);
  outline-offset: 2px;
}
body.qs-v3 .ready-pager-nav { font-size: var(--qs-fs-lg); }

/* Toolbar: search on the left, Create Blank Quote + Refresh pushed right */
body.qs-v3 .qs-v3-quotes-toolbar-actions {
  display: inline-flex;
  align-items: center;
  gap: var(--qs-sp-2);
  margin-left: auto;
  flex-shrink: 0;
}

/* "Ready" / "published" status badge on package cards */
body.qs-v3 .status-badge.quote-status-badge.published {
  background: var(--qs-success-soft);
  color: #065F46;
}

/* Version view: card + "Use as Quote" button stacked ---------------------- */
body.qs-v3 .ready-version-shell {
  display: flex;
  flex-direction: column;
  gap: var(--qs-sp-3);
}
body.qs-v3 .ready-version-shell .quote-group-card { height: 100%; }

/* .ready-use-btn is emitted with app.css "btn primary" classes */
body.qs-v3 .ready-use-btn.btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: var(--qs-sp-2);
  padding: 11px var(--qs-sp-4);
  border-radius: var(--qs-r-md);
  font-size: var(--qs-fs-sm);
  font-weight: var(--qs-fw-semibold);
  border: 1px solid var(--qs-navy-500);
  background: var(--qs-navy-500);
  color: #fff;
  cursor: pointer;
}
body.qs-v3 .ready-use-btn.btn:hover { background: var(--qs-navy-700); border-color: var(--qs-navy-700); }
body.qs-v3 .ready-use-btn.btn:disabled { opacity: 0.6; cursor: not-allowed; }

/* v83 destination-first Ready Package library -------------------------- */
body.qs-v3 .ready-library-head {
  display: flex;
  align-items: flex-start;
  justify-content: space-between;
  gap: var(--qs-sp-4);
  margin-bottom: var(--qs-sp-5);
}
body.qs-v3 .ready-library-head h2 { margin: 0 0 var(--qs-sp-1); font-size: var(--qs-fs-xl); }
body.qs-v3 .ready-library-head p { margin: 0; }
body.qs-v3 .ready-market-tabs { display: inline-flex; align-items: center; gap: 5px; margin: 0 0 var(--qs-sp-5); padding: 5px; border: 1px solid var(--qs-border); border-radius: 10px; background: var(--qs-surface-alt); }
body.qs-v3 .ready-market-tabs button { min-height: 34px; padding: 7px 14px; color: var(--qs-ink-500); font: 700 12px var(--qs-font-ui); border: 0; border-radius: 7px; background: transparent; cursor: pointer; }
body.qs-v3 .ready-market-tabs button.is-active { color: #fff; background: var(--qs-blue-600); box-shadow: 0 5px 14px rgba(37,99,235,.2); }
body.qs-v3 .ready-library-toolbar { margin-bottom: var(--qs-sp-6); }
body.qs-v3 .ready-destination-grid {
  display: grid;
  grid-template-columns: repeat(5, minmax(0, 1fr));
  gap: 14px;
}
body.qs-v3 .ready-tour-grid {
  display: grid;
  grid-template-columns: repeat(5, minmax(0, 1fr));
  gap: 14px;
}
body.qs-v3 .ready-destination-grid > .qs-v3-empty,
body.qs-v3 .ready-tour-grid > .qs-v3-empty { grid-column: 1 / -1; }
body.qs-v3 .ready-destination-card,
body.qs-v3 .ready-tour-card { overflow: hidden; }
body.qs-v3 .ready-destination-cover {
  position: relative;
  height: 176px;
  min-height: 176px;
  overflow: hidden;
  background: linear-gradient(145deg, var(--qs-navy-700), var(--qs-navy-400));
}
body.qs-v3 .ready-tour-cover {
  position: relative;
  height: 176px;
  min-height: 176px;
  overflow: hidden;
  background: linear-gradient(145deg, var(--qs-navy-700), var(--qs-navy-400));
}
body.qs-v3 .ready-destination-cover > img,
body.qs-v3 .ready-tour-cover > img { width: 100%; height: 100%; object-fit: cover; }
body.qs-v3 .ready-destination-cover .ready-cover-letter,
body.qs-v3 .ready-tour-cover .ready-cover-letter {
  display: grid;
  place-items: center;
  width: 100%;
  height: 100%;
  font-family: var(--qs-font-display);
  font-size: 64px;
  color: rgba(255,255,255,.9);
}
body.qs-v3 .ready-destination-cover .ready-cover-scrim,
body.qs-v3 .ready-tour-cover .ready-cover-scrim,
body.qs-v3 .ready-detail-hero .ready-cover-scrim {
  position: absolute;
  inset: 0;
  width: auto;
  height: auto;
  background: linear-gradient(to top, rgba(7, 24, 54, .92) 0%, rgba(7, 24, 54, .48) 48%, rgba(7, 24, 54, .08) 78%);
  pointer-events: none;
}
body.qs-v3 .ready-destination-count,
body.qs-v3 .ready-tour-type,
body.qs-v3 .ready-tour-duration {
  position: absolute;
  z-index: 2;
  top: var(--qs-sp-4);
  display: inline-flex;
  width: auto;
  height: auto;
  padding: 5px 10px;
  border-radius: var(--qs-r-full);
  color: #fff;
  font-family: var(--qs-font-ui);
  font-size: var(--qs-fs-xs);
  font-weight: var(--qs-fw-semibold);
  line-height: 1.2;
  background: rgba(37, 99, 235, .92);
  box-shadow: var(--qs-sh-sm);
}
body.qs-v3 .ready-destination-count,
body.qs-v3 .ready-tour-type { left: var(--qs-sp-4); }
body.qs-v3 .ready-tour-duration { right: var(--qs-sp-4); background: rgba(15, 23, 42, .82); }
body.qs-v3 .ready-destination-cover > .ready-destination-count {
  top: 11px;
  left: 11px;
  align-items: center;
  gap: 6px;
  padding: 5px 9px;
  border: 1px solid rgba(255,255,255,.34);
  border-radius: 999px;
  color: #fff;
  font-family: var(--qs-font-ui);
  font-size: 11px;
  font-weight: var(--qs-fw-bold);
  line-height: 1;
  letter-spacing: .01em;
  background: rgba(11,42,86,.78);
  box-shadow: 0 5px 14px rgba(7,24,54,.2);
  backdrop-filter: blur(7px);
}
body.qs-v3 .ready-destination-cover > .ready-destination-count::before {
  content: "";
  width: 6px;
  height: 6px;
  flex: 0 0 6px;
  border-radius: 50%;
  background: #6da8ff;
  box-shadow: 0 0 0 2px rgba(109,168,255,.2);
}
body.qs-v3 .ready-destination-cover > .ready-destination-market {
  position: absolute;
  z-index: 2;
  top: 11px;
  right: 11px;
  width: auto;
  height: auto;
  padding: 5px 8px;
  color: #fff;
  font: 700 10px/1 var(--qs-font-ui);
  border: 1px solid rgba(255,255,255,.3);
  border-radius: 999px;
  background: rgba(15,23,42,.72);
  backdrop-filter: blur(7px);
}
body.qs-v3 .ready-tour-cover > .ready-tour-type,
body.qs-v3 .ready-tour-cover > .ready-tour-duration {
  top: 11px;
  width: auto;
  height: auto;
  padding: 5px 8px;
  color: #fff;
  font: 700 10px/1 var(--qs-font-ui);
  border: 1px solid rgba(255,255,255,.28);
  border-radius: 999px;
  box-shadow: 0 5px 14px rgba(7,24,54,.18);
  backdrop-filter: blur(7px);
}
body.qs-v3 .ready-tour-cover > .ready-tour-type { left: 11px; background: rgba(37,99,235,.84); }
body.qs-v3 .ready-tour-cover > .ready-tour-duration { right: 11px; background: rgba(11,42,86,.8); }
body.qs-v3 .ready-destination-overlay,
body.qs-v3 .ready-tour-overlay {
  position: absolute;
  z-index: 2;
  right: var(--qs-sp-5);
  bottom: var(--qs-sp-5);
  left: var(--qs-sp-5);
  color: #fff;
}
body.qs-v3 .ready-destination-overlay h3,
body.qs-v3 .ready-tour-overlay h3 {
  margin: 0;
  color: #fff;
  font-family: var(--qs-font-display);
  font-size: var(--qs-fs-2xl);
  line-height: 1.18;
  text-shadow: 0 2px 12px rgba(0,0,0,.35);
}
body.qs-v3 .ready-destination-overlay {
  right: 14px;
  bottom: 14px;
  left: 14px;
}
body.qs-v3 .ready-destination-overlay h3 {
  font-size: 19px;
  line-height: 1.2;
}
body.qs-v3 .ready-tour-overlay { right: 14px; bottom: 13px; left: 14px; }
body.qs-v3 .ready-tour-overlay h3 { font-size: 18px; line-height: 1.18; }
body.qs-v3 .ready-tour-overlay p { margin-top: 4px; font-size: 11px; line-height: 1.3; }
body.qs-v3 .ready-tour-overlay strong { margin-top: 5px; font-size: 11px; }
body.qs-v3 .ready-destination-overlay p {
  margin-top: 5px;
  font-size: 11px;
  line-height: 1.35;
}
body.qs-v3 .ready-destination-overlay p,
body.qs-v3 .ready-tour-overlay p {
  margin: 5px 0 0;
  color: rgba(255,255,255,.88);
  font-size: 11px;
  line-height: 1.35;
  display: -webkit-box;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
  overflow: hidden;
}
body.qs-v3 .ready-tour-overlay strong { display: block; margin-top: 5px; color: #fff; font-size: 11px; }
body.qs-v3 .ready-destination-action { padding: 10px; }
body.qs-v3 .ready-destination-action .qs-v3-btn { width: 100%; min-height: 36px; padding: 7px 9px; font-size: 12px; }
body.qs-v3 .ready-tour-actions {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 7px;
  padding: 10px;
}
body.qs-v3 .ready-tour-actions .qs-v3-btn { min-width: 0; min-height: 34px; padding: 6px 7px; font-size: 11px; }
body.qs-v3 .ready-tour-actions [data-use-ready-package] { grid-column: 1 / -1; grid-row: 1; }
body.qs-v3 .ready-tour-actions [data-enquire-package] { grid-column: 1; grid-row: 2; }
body.qs-v3 .ready-tour-actions [data-details-package] { grid-column: 2; grid-row: 2; }
body.qs-v3 .ready-destination-header { margin: 0 0 var(--qs-sp-5); }
body.qs-v3 .ready-destination-header h3 { margin: 0 0 var(--qs-sp-1); font-size: var(--qs-fs-xl); }
body.qs-v3 .ready-destination-header p { margin: 0; }
body.qs-v3 #readyDestinationCount,
body.qs-v3 #readyTourCount { margin: var(--qs-sp-5) 0 0; }

/* Package detail + enquiry modals */
body.qs-v3 .ready-modal-overlay { align-items: center; padding: var(--qs-sp-6) var(--qs-sp-4); }
body.qs-v3 .ready-details-dialog { max-width: 980px; max-height: calc(100vh - 48px); display: flex; flex-direction: column; }
body.qs-v3 .ready-enquiry-dialog { max-width: 760px; max-height: calc(100vh - 48px); display: flex; flex-direction: column; }
body.qs-v3 .ready-details-dialog .qs-v3-modal-body,
body.qs-v3 .ready-enquiry-dialog .qs-v3-modal-body { overflow-y: auto; }
body.qs-v3 .ready-modal-kicker { display: block; margin-bottom: 3px; color: var(--qs-navy-500); font-size: 11px; font-weight: var(--qs-fw-bold); letter-spacing: .08em; }
body.qs-v3 .ready-detail-hero { position: relative; min-height: 330px; overflow: hidden; border-radius: var(--qs-r-lg); background: var(--qs-navy-700); }
body.qs-v3 .ready-detail-hero > img { width: 100%; height: 330px; object-fit: cover; }
body.qs-v3 .ready-detail-hero > .ready-cover-letter { display: grid; place-items: center; min-height: 330px; color: #fff; font: 600 72px var(--qs-font-display); }
body.qs-v3 .ready-detail-hero > div { position: absolute; z-index: 2; right: var(--qs-sp-7); bottom: var(--qs-sp-7); left: var(--qs-sp-7); color: #fff; }
body.qs-v3 .ready-detail-hero > div span { font-size: var(--qs-fs-xs); font-weight: var(--qs-fw-bold); letter-spacing: .08em; }
body.qs-v3 .ready-detail-hero h2 { margin: var(--qs-sp-2) 0; color: #fff; font-family: var(--qs-font-display); font-size: var(--qs-fs-4xl); }
body.qs-v3 .ready-detail-hero p { margin: 0; color: rgba(255,255,255,.88); }
body.qs-v3 .ready-detail-summary { margin: var(--qs-sp-6) 0 0; color: var(--qs-ink-600); font-size: var(--qs-fs-base); line-height: 1.7; }
body.qs-v3 .ready-detail-section { margin-top: var(--qs-sp-7); padding-top: var(--qs-sp-6); border-top: 1px solid var(--qs-border); }
body.qs-v3 .ready-detail-section h3 { margin: 0 0 var(--qs-sp-4); font-size: var(--qs-fs-xl); }
body.qs-v3 .ready-detail-section > p { margin: 0; color: var(--qs-ink-600); line-height: 1.75; }
body.qs-v3 .ready-detail-day { display: grid; grid-template-columns: 180px 1fr; gap: var(--qs-sp-5); padding: var(--qs-sp-4) 0; border-top: 1px solid var(--qs-border); }
body.qs-v3 .ready-detail-day:first-of-type { border-top: 0; }
body.qs-v3 .ready-detail-day img { width: 180px; height: 120px; object-fit: cover; border-radius: var(--qs-r-md); }
body.qs-v3 .ready-detail-day span { color: var(--qs-navy-500); font-size: var(--qs-fs-xs); font-weight: var(--qs-fw-bold); }
body.qs-v3 .ready-detail-day h4 { margin: 4px 0 var(--qs-sp-2); font-size: var(--qs-fs-base); }
body.qs-v3 .ready-detail-day p { margin: 0; color: var(--qs-ink-600); line-height: 1.65; }
body.qs-v3 .ready-detail-pricing { display: grid; grid-template-columns: repeat(2, minmax(0,1fr)); gap: var(--qs-sp-3); }
body.qs-v3 .ready-detail-pricing h3 { grid-column: 1 / -1; }
body.qs-v3 .ready-detail-price { display: grid; gap: var(--qs-sp-2); padding: var(--qs-sp-4); border: 1px solid var(--qs-border); border-radius: var(--qs-r-md); background: var(--qs-surface-alt); }
body.qs-v3 .ready-detail-price span { color: var(--qs-ink-600); font-size: var(--qs-fs-sm); }
body.qs-v3 .ready-detail-option { overflow: hidden; margin-top: var(--qs-sp-4); border: 1px solid var(--qs-border); border-radius: var(--qs-r-md); background: #fff; }
body.qs-v3 .ready-detail-option:first-of-type { margin-top: 0; }
body.qs-v3 .ready-detail-option > div:first-child { display: flex; align-items: center; justify-content: space-between; gap: var(--qs-sp-3); padding: var(--qs-sp-3) var(--qs-sp-4); color: #fff; background: var(--qs-navy-700); }
body.qs-v3 .ready-detail-option > div:first-child span { font-size: var(--qs-fs-xs); opacity: .82; }
body.qs-v3 .ready-detail-hotel { display: grid; grid-template-columns: 150px 1fr; gap: var(--qs-sp-4); align-items: center; padding: var(--qs-sp-4); border-top: 1px solid var(--qs-border); }
body.qs-v3 .ready-detail-hotel > img,
body.qs-v3 .ready-detail-hotel-placeholder { width: 150px; height: 100px; object-fit: cover; border-radius: var(--qs-r-sm); }
body.qs-v3 .ready-detail-hotel-placeholder { display: grid; place-items: center; color: #fff; font: 600 34px var(--qs-font-display); background: linear-gradient(145deg,var(--qs-navy-600),var(--qs-blue-500)); }
body.qs-v3 .ready-detail-hotel span { color: var(--qs-blue-600); font-size: var(--qs-fs-xs); font-weight: var(--qs-fw-bold); text-transform: uppercase; }
body.qs-v3 .ready-detail-hotel h4 { margin: 4px 0; color: var(--qs-ink-900); font-size: var(--qs-fs-lg); }
body.qs-v3 .ready-detail-hotel p { margin: 0; color: var(--qs-ink-600); font-size: var(--qs-fs-sm); line-height: 1.5; }
body.qs-v3 .ready-detail-transports { display: grid; grid-template-columns: repeat(2,minmax(0,1fr)); gap: var(--qs-sp-3); }
body.qs-v3 .ready-detail-transports > h3 { grid-column: 1/-1; }
body.qs-v3 .ready-detail-transport { display: grid; gap: 5px; padding: var(--qs-sp-4); border: 1px solid var(--qs-border); border-radius: var(--qs-r-md); background: var(--qs-surface-alt); }
body.qs-v3 .ready-detail-transport span { color: var(--qs-blue-600); font-size: var(--qs-fs-sm); font-weight: var(--qs-fw-semibold); }
body.qs-v3 .ready-detail-transport small,
body.qs-v3 .ready-detail-transport-note { color: var(--qs-ink-600); line-height: 1.55; }
body.qs-v3 .ready-detail-transport-note { grid-column: 1/-1; margin: 0; padding: var(--qs-sp-4); border: 1px solid var(--qs-border); border-radius: var(--qs-r-md); }
body.qs-v3 .ready-enquiry-grid { display: grid; grid-template-columns: 1fr 1fr; gap: var(--qs-sp-5); }
body.qs-v3 .ready-enquiry-grid > label { display: grid; gap: var(--qs-sp-2); color: var(--qs-ink-700); font-size: var(--qs-fs-sm); font-weight: var(--qs-fw-semibold); }
body.qs-v3 .ready-enquiry-grid .wide { grid-column: 1 / -1; }
body.qs-v3 .ready-date-head { display: flex; align-items: center; justify-content: space-between; gap: var(--qs-sp-3); margin-bottom: var(--qs-sp-2); }
body.qs-v3 .ready-date-head label { font-size: var(--qs-fs-sm); font-weight: var(--qs-fw-semibold); }
body.qs-v3 .ready-enquiry-dates { display: grid; gap: var(--qs-sp-2); }
body.qs-v3 .ready-enquiry-date-row { display: grid; grid-template-columns: 1fr 40px; gap: var(--qs-sp-2); }
body.qs-v3 .ready-enquiry-actions { display: flex; align-items: center; justify-content: flex-end; gap: var(--qs-sp-3); margin-top: var(--qs-sp-6); padding-top: var(--qs-sp-4); border-top: 1px solid var(--qs-border); }
body.qs-v3 .ready-enquiry-actions .qs-v3-inline-status { margin-right: auto; }

/* Narrow screens: stack the toolbar, filter and pagination rows so the sort +
   destination/duration selects fill the width instead of overflowing. */
@media (max-width: 640px) {
  body.qs-v3.qs-v3-ready .qs-v3-quotes-toolbar { flex-direction: column; align-items: stretch; }
  body.qs-v3.qs-v3-ready .ready-sort { margin-left: 0; width: 100%; }
  body.qs-v3.qs-v3-ready .ready-sort .ready-select { flex: 1 1 auto; }

  body.qs-v3.qs-v3-ready .ready-filter-controls { width: 100%; }
  body.qs-v3.qs-v3-ready .ready-filter-controls .ready-select { flex: 1 1 140px; min-width: 0; }
  body.qs-v3.qs-v3-ready .ready-clear-filters { margin-left: auto; }

  body.qs-v3.qs-v3-ready .ready-pagination { flex-direction: column; align-items: flex-start; }
  body.qs-v3 .ready-library-head { flex-direction: column; }
  body.qs-v3 .ready-library-head .qs-v3-quotes-toolbar-actions { width: 100%; margin-left: 0; }
  body.qs-v3 .ready-library-head .qs-v3-btn { flex: 1; }
  body.qs-v3 .ready-destination-grid,
  body.qs-v3 .ready-tour-grid { grid-template-columns: 1fr; }
  body.qs-v3 .ready-destination-cover,
  body.qs-v3 .ready-tour-cover { height: 250px; min-height: 250px; }
  body.qs-v3 .ready-tour-actions { grid-template-columns: 1fr; }
  body.qs-v3 .ready-tour-actions [data-use-ready-package],
  body.qs-v3 .ready-tour-actions [data-enquire-package],
  body.qs-v3 .ready-tour-actions [data-details-package] { grid-column: 1; grid-row: auto; }
  body.qs-v3 .ready-enquiry-grid,
  body.qs-v3 .ready-detail-pricing,
  body.qs-v3 .ready-detail-transports { grid-template-columns: 1fr; }
  body.qs-v3 .ready-detail-pricing h3 { grid-column: auto; }
  body.qs-v3 .ready-detail-transports > h3,
  body.qs-v3 .ready-detail-transport-note { grid-column: auto; }
  body.qs-v3 .ready-detail-hotel { grid-template-columns: 1fr; }
  body.qs-v3 .ready-detail-hotel > img,
  body.qs-v3 .ready-detail-hotel-placeholder { width: 100%; height: 170px; }
  body.qs-v3 .ready-detail-day { grid-template-columns: 1fr; }
  body.qs-v3 .ready-detail-day img { width: 100%; height: 180px; }
  body.qs-v3 .ready-detail-hero,
  body.qs-v3 .ready-detail-hero > img,
  body.qs-v3 .ready-detail-hero > .ready-cover-letter { min-height: 260px; height: 260px; }
  body.qs-v3 .ready-detail-hero > div { right: var(--qs-sp-5); bottom: var(--qs-sp-5); left: var(--qs-sp-5); }
  body.qs-v3 .ready-detail-hero h2 { font-size: var(--qs-fs-2xl); }
}

@media (min-width: 641px) and (max-width: 1100px) {
  body.qs-v3 .ready-destination-grid { grid-template-columns: repeat(3, minmax(0, 1fr)); }
  body.qs-v3 .ready-tour-grid { grid-template-columns: repeat(3, minmax(0, 1fr)); }
}

@media (min-width: 1101px) and (max-width: 1350px) {
  body.qs-v3 .ready-destination-grid { grid-template-columns: repeat(4, minmax(0, 1fr)); }
  body.qs-v3 .ready-tour-grid { grid-template-columns: repeat(4, minmax(0, 1fr)); }
}

@media (min-width: 641px) and (max-width: 820px) {
  body.qs-v3 .ready-destination-grid,
  body.qs-v3 .ready-tour-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}


/* === AGENCY BRANDING (branding.html) ===================================
   Tabbed form (left) + live cover preview (right). branding.js is unchanged;
   its 14 form fields associate with the empty #brandingForm via the HTML
   form= attribute (the logo upload must be its own <form>, so the fields
   can't be nested inside #brandingForm). The live preview is a lightweight
   cover mock in qs-branding-ui.js — quote-renderer.js is NOT reused.

   Unbacked mockup controls (tagline, font family, cover style) are omitted.
   #brandingMessage keeps only .notice (branding.js overwrites className).
   ======================================================================== */

body.qs-v3.qs-v3-branding { margin: 0; }

/* Header actions --------------------------------------------------------- */
body.qs-v3 .qs-v3-branding-actions {
  display: flex;
  align-items: center;
  justify-content: flex-end;
  gap: var(--qs-sp-3);
}
body.qs-v3 .qs-v3-branding-actions .qs-v3-unsaved { margin-right: auto; }

/* Two-column layout ------------------------------------------------------ */
body.qs-v3 .qs-v3-branding-layout {
  display: grid;
  grid-template-columns: minmax(0, 1fr) minmax(0, 0.95fr);
  gap: var(--qs-sp-6);
  align-items: start;
}
/* Let the columns shrink below content min-width so the tabs scroll and the
   field blocks reflow instead of widening the page. */
body.qs-v3 .qs-v3-branding-layout > * { min-width: 0; }
body.qs-v3 .qs-v3-branding-form-card { padding: var(--qs-sp-6); }

/* Field blocks: label column + control (Brand Identity tab) --------------- */
body.qs-v3 .qs-v3-field-block {
  display: grid;
  grid-template-columns: 200px minmax(0, 1fr);
  gap: var(--qs-sp-5);
  align-items: start;
  padding: var(--qs-sp-5) 0;
  border-top: 1px solid var(--qs-border);
}
body.qs-v3 .qs-v3-field-block:first-of-type { border-top: 0; padding-top: var(--qs-sp-4); }
body.qs-v3 .qs-v3-field-label-col { display: flex; flex-direction: column; gap: 2px; }
body.qs-v3 .qs-v3-field-label-col .qs-v3-hint { margin-top: 2px; }

/* Stacked fields (Quote Defaults / Policies tabs) */
body.qs-v3 .qs-v3-field-stack { margin-bottom: var(--qs-sp-5); }
body.qs-v3 .qs-v3-field-stack .qs-v3-hint { margin-bottom: var(--qs-sp-1); }
body.qs-v3 .qs-v3-defaults-note { margin-top: var(--qs-sp-2); }

/* Contact grid */
body.qs-v3 .qs-v3-branding-grid {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: var(--qs-sp-5);
}

/* Logo row --------------------------------------------------------------- */
body.qs-v3 .qs-v3-logo-row {
  display: flex;
  align-items: center;
  gap: var(--qs-sp-4);
  flex-wrap: wrap;
}
body.qs-v3 .qs-v3-logo-box {
  width: 200px;
  height: 72px;
  border: 1px dashed var(--qs-border-strong);
  border-radius: var(--qs-r-md);
  background: var(--qs-surface-alt);
  display: flex;
  align-items: center;
  justify-content: center;
  overflow: hidden;
  flex-shrink: 0;
}
body.qs-v3 .qs-v3-logo-box img { max-width: 100%; max-height: 100%; object-fit: contain; }
body.qs-v3 .qs-v3-logo-box .logo-placeholder {
  font-family: var(--qs-font-display);
  font-size: var(--qs-fs-2xl);
  font-weight: var(--qs-fw-bold);
  color: var(--qs-navy-700);
}
body.qs-v3 .qs-v3-logo-upload {
  display: inline-flex;
  align-items: center;
  gap: var(--qs-sp-2);
  flex-wrap: wrap;
}
body.qs-v3 .qs-v3-logo-choose { cursor: pointer; }
body.qs-v3 .qs-v3-logo-choose svg { width: 16px; height: 16px; }

/* Color fields ----------------------------------------------------------- */
body.qs-v3 .qs-v3-color-field {
  display: inline-flex;
  align-items: center;
  gap: var(--qs-sp-3);
}
body.qs-v3 .qs-v3-color-swatch {
  width: 48px;
  height: 40px;
  padding: 0;
  border: 1px solid var(--qs-border-strong);
  border-radius: var(--qs-r-md);
  background: none;
  cursor: pointer;
}
body.qs-v3 .qs-v3-color-swatch::-webkit-color-swatch-wrapper { padding: 3px; }
body.qs-v3 .qs-v3-color-swatch::-webkit-color-swatch { border: none; border-radius: var(--qs-r-sm); }
body.qs-v3 .qs-v3-color-value {
  font-size: var(--qs-fs-sm);
  font-weight: var(--qs-fw-semibold);
  color: var(--qs-ink-700);
  font-variant-numeric: tabular-nums;
  text-transform: uppercase;
}

/* Live preview ----------------------------------------------------------- */
body.qs-v3 .qs-v3-branding-preview { position: sticky; top: var(--qs-sp-6); }
body.qs-v3 .qs-v3-preview-head {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--qs-sp-4);
  margin-bottom: var(--qs-sp-5);
}
body.qs-v3 .qs-v3-preview-toggle {
  display: inline-flex;
  padding: 3px;
  background: var(--qs-ink-100);
  border-radius: var(--qs-r-md);
}
body.qs-v3 .qs-v3-preview-device {
  border: 0;
  background: transparent;
  padding: 5px 12px;
  border-radius: var(--qs-r-sm);
  font-family: inherit;
  font-size: var(--qs-fs-xs);
  font-weight: var(--qs-fw-medium);
  color: var(--qs-ink-500);
  cursor: pointer;
}
body.qs-v3 .qs-v3-preview-device.is-active {
  background: var(--qs-surface);
  color: var(--qs-navy-500);
  box-shadow: var(--qs-sh-xs);
}

body.qs-v3 .qs-v3-preview-stage {
  display: flex;
  justify-content: center;
  padding: var(--qs-sp-5);
  background: var(--qs-bg);
  border-radius: var(--qs-r-lg);
}
/* Device toggle: swap the cover frame width */
body.qs-v3 .qs-v3-preview-stage[data-device="desktop"] .qs-v3-preview-cover { width: 100%; }
body.qs-v3 .qs-v3-preview-stage[data-device="mobile"] .qs-v3-preview-cover { width: 260px; }

/* The cover mock: colours come from --preview-primary / --preview-accent,
   set live by qs-branding-ui.js from the colour fields. */
body.qs-v3 .qs-v3-preview-cover {
  --preview-primary: #0f766e;
  --preview-accent: #b7791f;
  background: var(--qs-surface);
  border: 1px solid var(--qs-border);
  border-radius: var(--qs-r-md);
  overflow: hidden;
  box-shadow: var(--qs-sh-md);
  transition: width var(--qs-t-base) var(--qs-ease);
}
body.qs-v3 .qs-v3-preview-topbar {
  display: flex;
  align-items: flex-start;
  justify-content: space-between;
  gap: var(--qs-sp-3);
  padding: var(--qs-sp-4);
}
body.qs-v3 .qs-v3-preview-logo {
  display: inline-flex;
  align-items: center;
  min-height: 32px;
  color: var(--preview-primary);
  font-family: var(--qs-font-display);
  font-size: var(--qs-fs-lg);
  font-weight: var(--qs-fw-bold);
  letter-spacing: 0.02em;
}
body.qs-v3 .qs-v3-preview-logo img { max-height: 40px; max-width: 150px; object-fit: contain; }
body.qs-v3 .qs-v3-preview-tagline {
  text-align: right;
  color: var(--preview-accent);
  font-size: 9px;
  font-weight: var(--qs-fw-semibold);
  letter-spacing: 0.08em;
  line-height: 1.4;
}
body.qs-v3 .qs-v3-preview-hero {
  position: relative;
  height: 150px;
  background-image: linear-gradient(160deg, #64748b, #334155);
  background-size: cover;
  background-position: center;
  display: flex;
  align-items: flex-end;
}
body.qs-v3 .qs-v3-preview-hero-band {
  width: 100%;
  padding: var(--qs-sp-4);
  display: flex;
  flex-direction: column;
  gap: 2px;
  background: linear-gradient(to top, var(--preview-primary), transparent);
}
body.qs-v3 .qs-v3-preview-eyebrow { color: var(--preview-accent); font-size: 9px; font-weight: var(--qs-fw-semibold); letter-spacing: 0.1em; }
body.qs-v3 .qs-v3-preview-title { color: #fff; font-family: var(--qs-font-display); font-size: var(--qs-fs-2xl); line-height: 1.1; }
body.qs-v3 .qs-v3-preview-sub { color: var(--preview-accent); font-size: var(--qs-fs-xs); }
body.qs-v3 .qs-v3-preview-footer {
  display: flex;
  gap: var(--qs-sp-5);
  padding: var(--qs-sp-4);
}
body.qs-v3 .qs-v3-preview-footer > div { display: flex; flex-direction: column; gap: 2px; }
body.qs-v3 .qs-v3-preview-footer span { color: var(--qs-ink-500); font-size: 9px; text-transform: uppercase; letter-spacing: 0.04em; }
body.qs-v3 .qs-v3-preview-footer strong { color: var(--qs-ink-900); font-size: var(--qs-fs-xs); }
body.qs-v3 .qs-v3-preview-note { margin-top: var(--qs-sp-4); text-align: center; }

/* Responsive ------------------------------------------------------------- */
@media (max-width: 1024px) {
  body.qs-v3 .qs-v3-branding-layout { grid-template-columns: minmax(0, 1fr); }
  body.qs-v3 .qs-v3-branding-preview { position: static; }
}
@media (max-width: 640px) {
  body.qs-v3 .qs-v3-tabs { overflow-x: auto; flex-wrap: nowrap; }
  body.qs-v3 .qs-v3-tab { white-space: nowrap; }
  body.qs-v3 .qs-v3-field-block { grid-template-columns: 1fr; gap: var(--qs-sp-2); }
  body.qs-v3 .qs-v3-branding-grid { grid-template-columns: 1fr; }
  body.qs-v3 .qs-v3-branding-actions { flex-wrap: wrap; }
  body.qs-v3 .qs-v3-branding-actions .qs-v3-unsaved { flex-basis: 100%; margin-right: 0; }
}


/* === QUOTE BUILDER (quote-builder.html) ================================
   RE-SKIN ONLY — the v2 shell and its 5,434-line stylesheet are NOT rebuilt.
   quotesuite-builder-v2.css drives the whole shell from a handful of CSS
   variables declared on .qs-builder-v2-page. We remap just those variables to
   qs-v3 token values here (this selector is more specific and loads later, so
   it wins), re-skinning the sidebar, topbar, steps, buttons and cards through
   the cascade with no structural or JS changes.

   Section-local variables (--trip-*, --ai-*, --hero-*) and hardcoded hexes
   deep in the hotel/transport/day editors are intentionally left as-is:
   remapping them would mean broad edits to that large file. Shell chrome
   re-skins; deep section internals stay close to their current look.

   quote-builder.js and quote-builder-ui-v2.js are NOT modified. The right-rail
   panels below use hooks those files already write to but that had no DOM yet.
   ======================================================================== */

body.qs-v3.qs-builder-v2-page {
  /* Colour remap only — layout dimension vars (sidebar/preview/topbar widths)
     are deliberately untouched. */
  --qs-navy: #0D2B5E;
  --qs-navy-2: #132F63;
  --qs-blue: #2563EB;
  --qs-blue-dark: #1E3A7A;
  --qs-indigo: #4F46E5;
  --qs-green: #10B981;
  --qs-amber: #F59E0B;
  --qs-red: #EF4444;
  --qs-ink: #0F172A;
  --qs-muted: #64748B;
  --qs-line: #E5E7EB;
  --qs-surface: #FFFFFF;
  --qs-bg: #F5F7FB;
}

/* Sidebar re-skin to match the qs-v3 sidebar on every other page. Targeted
   selector overrides only — the v2 markup, quote-builder.js and
   quotesuite-builder-v2.css are untouched. (The v2 step-list and quick-tools
   are already sr-only hidden in this sidebar, so only the brand, app-nav and
   plan card are visible — same structure as the other pages.)

   Brand: swap the blue "QS" tile for the gold Q mark used elsewhere, rendered
   as a data-URI SVG background (identical artwork to the other pages'
   .qs-v3-sidebar-brand svg) with the "QS" text hidden; gold Playfair wordmark;
   drop the "Tour Quotation Builder" subtitle the other pages don't have. */
body.qs-v3.qs-builder-v2-page .qs-v2-brand > span {
  width: 34px;
  height: 34px;
  border-radius: 0;
  background: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Ccircle cx='14.5' cy='14.5' r='10.5' fill='none' stroke='%23C7A75A' stroke-width='3.25'/%3E%3Cpath d='M19.5 20 L26 27.5' fill='none' stroke='%23C7A75A' stroke-width='4.25' stroke-linecap='round'/%3E%3Cpath d='M14.5 8.5 L16.4 12.6 L20.5 14.5 L16.4 16.4 L14.5 20.5 L12.6 16.4 L8.5 14.5 L12.6 12.6 Z' fill='%23C7A75A'/%3E%3C/svg%3E") center / contain no-repeat;
  box-shadow: none;
  font-size: 0;              /* hides the literal "QS" text */
  color: transparent;
}
body.qs-v3.qs-builder-v2-page .qs-v2-brand strong {
  font-family: var(--qs-font-display);
  font-size: var(--qs-fs-2xl);
  font-weight: var(--qs-fw-semibold);
  letter-spacing: -0.01em;
  color: var(--qs-gold-500);
}
body.qs-v3.qs-builder-v2-page .qs-v2-brand small { display: none; }

/* App nav: match .qs-v3-nav-item — muted-white text, subtle hover, flat blue
   active state (was blue-tinted text with a gradient/shadow active pill). */
body.qs-v3.qs-builder-v2-page .qs-v2-main-nav a {
  min-height: 0;
  padding: var(--qs-sp-3) var(--qs-sp-4);
  gap: var(--qs-sp-3);
  border: 0;
  border-radius: var(--qs-r-md);
  color: var(--qs-sidebar-text);
  font-size: var(--qs-fs-base);
  font-weight: var(--qs-fw-medium);
}
body.qs-v3.qs-builder-v2-page .qs-v2-main-nav a:hover {
  border-color: transparent;
  background: var(--qs-sidebar-hover);
  color: var(--qs-sidebar-text-strong);
}
body.qs-v3.qs-builder-v2-page .qs-v2-main-nav a.active {
  border-color: transparent;
  background: var(--qs-sidebar-active-bg);
  box-shadow: none;
  color: var(--qs-sidebar-text-strong);
  font-weight: var(--qs-fw-semibold);
}
body.qs-v3.qs-builder-v2-page .qs-v2-main-nav svg { width: 18px; height: 18px; flex-basis: 18px; }

/* Plan card: match .qs-v3-plan-card — subtle surface, gold Playfair title
   with a crown mark, muted subtitle, gold link. */
body.qs-v3.qs-builder-v2-page .qs-v2-plan-card {
  gap: var(--qs-sp-1);
  padding: var(--qs-sp-4);
  border: 1px solid var(--qs-sidebar-divider);
  border-radius: var(--qs-r-lg);
  background: rgba(255, 255, 255, 0.04);
}
body.qs-v3.qs-builder-v2-page .qs-v2-plan-card strong {
  display: flex;
  align-items: center;
  gap: var(--qs-sp-2);
  color: var(--qs-gold-500);
  font-family: var(--qs-font-display);
  font-size: var(--qs-fs-lg);
  font-weight: var(--qs-fw-semibold);
}
body.qs-v3.qs-builder-v2-page .qs-v2-plan-card strong::before {
  content: "";
  width: 16px;
  height: 16px;
  flex-shrink: 0;
  background: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='%23C7A75A'%3E%3Cpath d='M4 18h16l1.2-9.5-5 3.2L12 5l-4.2 6.7-5-3.2z'/%3E%3C/svg%3E") center / contain no-repeat;
}
body.qs-v3.qs-builder-v2-page .qs-v2-plan-card span {
  color: var(--qs-ink-300);
  font-size: var(--qs-fs-xs);
  font-weight: var(--qs-fw-normal);
  text-transform: none;
  letter-spacing: 0;
}
body.qs-v3.qs-builder-v2-page .qs-v2-plan-card a {
  color: var(--qs-gold-500);
  font-size: var(--qs-fs-xs);
  font-weight: var(--qs-fw-medium);
}
body.qs-v3.qs-builder-v2-page .qs-v2-plan-card a:hover { color: var(--qs-gold-400); }

/* Pricing section drawer — widen it so the two-column Pricing Option + Price
   Summary card and the settings mini-grid have room, and the long labels
   ("Cancellation Policy", "Cancel Before Days", "Tax / Service Charge (%)")
   stop wrapping. The v2 default drawer is 474px (486px content push); that is
   too narrow for Pricing (Hotels already gets its own ~812px treatment).
   Override-only, scoped to [data-active-section="pricing"] so Hotels, Transport
   and every other section keep their existing width. Three values must move
   together: the drawer width, #protectedPanel's right padding and the bottom
   bar's right offset (they mirror the v2 mechanism). quotesuite-builder-v2.css,
   quote-builder.js and quote-builder-ui-v2.js are NOT touched. */
@media (min-width: 1241px) {
  body.qs-v3.qs-builder-v2-page #sectionDrawer[data-active-section="pricing"]:not([hidden]) {
    width: 760px;
  }
  body.qs-v3.qs-builder-v2-page.section-drawer-open:has(#sectionDrawer[data-active-section="pricing"]:not([hidden])) #protectedPanel:not([hidden]) {
    padding-right: 772px;
  }
  body.qs-v3.qs-builder-v2-page.section-drawer-open:has(#sectionDrawer[data-active-section="pricing"]:not([hidden])) .qs-v2-bottom-bar {
    right: 772px;
  }
}
/* Mid widths: a more modest widen so the drawer never crowds the canvas.
   Below 921px the v2 drawer already goes near-full-width, so leave it alone. */
@media (min-width: 921px) and (max-width: 1240px) {
  body.qs-v3.qs-builder-v2-page #sectionDrawer[data-active-section="pricing"]:not([hidden]) {
    width: 600px;
  }
  body.qs-v3.qs-builder-v2-page.section-drawer-open:has(#sectionDrawer[data-active-section="pricing"]:not([hidden])) #protectedPanel:not([hidden]) {
    padding-right: 612px;
  }
  body.qs-v3.qs-builder-v2-page.section-drawer-open:has(#sectionDrawer[data-active-section="pricing"]:not([hidden])) .qs-v2-bottom-bar {
    right: 612px;
  }
}


/* === PUBLIC QUOTE (public-quote.html) ==================================
   CSS + shell only — quote-renderer.js is NOT edited (client approval on
   that pending; see CHANGELOG). These rules re-skin the classes the renderer
   already emits (.tour-cover, .quote-section, .day-card, .stay-card,
   .quote-pricing-*, .terms-grid, .quote-lite-footer, ...) plus the shell.

   Brand accents use --quote-primary / --quote-accent, which the renderer sets
   inline on .quote-rendered from each agency's branding colours — so per-agency
   theming keeps working. qs-v3 tokens drive the neutral chrome.
   ======================================================================== */

body.qs-v3.public-quote-page {
  margin: 0;
  background: var(--qs-bg);
  font-family: var(--qs-font-ui);
  color: var(--qs-ink-800);
}

/* Shell ------------------------------------------------------------------ */
body.qs-v3 .public-quote-shell {
  max-width: 1200px;
  margin: 0 auto;
  padding: var(--qs-sp-6) var(--qs-sp-5) var(--qs-sp-12);
}
body.qs-v3 .public-quote-card {
  background: transparent;
  border: 0;
  box-shadow: none;
  padding: 0;
}
/* The renderer's hero already carries the title as an <h1>; hide the shell's
   redundant duplicate (kept in the DOM: public-quote.js reads its text). */
body.qs-v3 .public-quote-main-head { display: none; }

body.qs-v3 .public-quote-layout {
  display: grid;
  grid-template-columns: minmax(0, 1fr) 320px;
  gap: var(--qs-sp-6);
  align-items: start;
}
body.qs-v3 .public-quote-paper {
  background: var(--qs-surface);
  border: 1px solid var(--qs-border);
  border-radius: var(--qs-r-xl);
  overflow: hidden;
  box-shadow: var(--qs-sh-sm);
  min-width: 0;
}

/* Actions sidebar (Trip-summary-style sticky card) ----------------------- */
body.qs-v3 .public-quote-actions-card {
  position: sticky;
  top: var(--qs-sp-6);
  background: var(--qs-surface);
  border: 1px solid var(--qs-border);
  border-radius: var(--qs-r-xl);
  box-shadow: var(--qs-sh-sm);
  padding: var(--qs-sp-6);
  display: flex;
  flex-direction: column;
  gap: var(--qs-sp-3);
}
body.qs-v3 .public-quote-actions-card h2 {
  font-family: var(--qs-font-display);
  font-size: var(--qs-fs-xl);
  color: var(--qs-navy-900);
}
body.qs-v3 .public-quote-actions-card > p {
  color: var(--qs-ink-500);
  font-size: var(--qs-fs-sm);
  margin-bottom: var(--qs-sp-1);
}
/* The four action buttons keep their IDs/handlers; only restyled here. */
body.qs-v3 .public-quote-actions-card .btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: var(--qs-sp-2);
  width: 100%;
  padding: 11px var(--qs-sp-4);
  border-radius: var(--qs-r-md);
  font-family: inherit;
  font-size: var(--qs-fs-sm);
  font-weight: var(--qs-fw-semibold);
  border: 1px solid var(--qs-border-strong);
  background: var(--qs-surface);
  color: var(--qs-ink-800);
  cursor: pointer;
  text-decoration: none;
}
body.qs-v3 .public-quote-actions-card .btn:hover { background: var(--qs-surface-alt); border-color: var(--qs-ink-400); }
body.qs-v3 .public-quote-actions-card .btn.primary {
  background: var(--qs-gold-500);
  border-color: var(--qs-gold-500);
  color: var(--qs-ink-900);
}
body.qs-v3 .public-quote-actions-card .btn.primary:hover { background: var(--qs-gold-400); border-color: var(--qs-gold-400); }
body.qs-v3 .public-quote-secure {
  display: flex;
  align-items: center;
  gap: var(--qs-sp-2);
  margin-top: var(--qs-sp-2);
  color: var(--qs-ink-500);
  font-size: var(--qs-fs-xs);
}
body.qs-v3 .public-quote-secure svg { width: 14px; height: 14px; flex-shrink: 0; }

body.qs-v3 #publicQuoteMessage.notice {
  max-width: 1200px;
  margin: var(--qs-sp-4) auto 0;
}

/* ---- Renderer output: neutral document chrome -------------------------- */
body.qs-v3 #publicQuote .quote-rendered {
  padding: 0;
  color: var(--qs-ink-800);
  font-size: var(--qs-fs-base);
  line-height: var(--qs-lh-normal);
}
body.qs-v3 #publicQuote .quote-section {
  padding: var(--qs-sp-8) var(--qs-sp-8) 0;
}
body.qs-v3 #publicQuote .quote-section:last-child { padding-bottom: var(--qs-sp-8); }
body.qs-v3 #publicQuote .section-heading {
  display: flex;
  align-items: center;
  gap: var(--qs-sp-2);
  font-family: var(--qs-font-display);
  font-size: var(--qs-fs-2xl);
  font-weight: var(--qs-fw-semibold);
  color: var(--qs-navy-900);
  padding-bottom: var(--qs-sp-3);
  margin-bottom: var(--qs-sp-4);
  border-bottom: 2px solid var(--quote-accent, var(--qs-gold-500));
}

/* Letterhead ------------------------------------------------------------- */
body.qs-v3 #publicQuote .letterhead {
  display: flex;
  align-items: center;
  gap: var(--qs-sp-4);
  padding: var(--qs-sp-5) var(--qs-sp-8);
  border-bottom: 1px solid var(--qs-border);
}
body.qs-v3 #publicQuote .letterhead-logo img { max-height: 48px; max-width: 180px; object-fit: contain; }
body.qs-v3 #publicQuote .letterhead-logo span {
  display: inline-flex; align-items: center; justify-content: center;
  width: 48px; height: 48px; border-radius: var(--qs-r-md);
  background: var(--quote-primary, var(--qs-navy-900)); color: #fff;
  font-weight: var(--qs-fw-semibold);
}
body.qs-v3 #publicQuote .letterhead-copy h2 {
  font-family: var(--qs-font-display);
  font-size: var(--qs-fs-xl); color: var(--qs-navy-900);
}
body.qs-v3 #publicQuote .letterhead-copy p { color: var(--qs-ink-500); font-size: var(--qs-fs-xs); margin-top: 2px; }

/* Hero cover ------------------------------------------------------------- */
body.qs-v3 #publicQuote .tour-cover {
  position: relative;
  min-height: 320px;
  display: flex;
  align-items: flex-end;
  background-size: cover;
  background-position: center;
  color: #fff;
}
body.qs-v3 #publicQuote .tour-cover.no-image { background: var(--quote-primary, var(--qs-navy-900)); }
body.qs-v3 #publicQuote .tour-cover-inner { padding: var(--qs-sp-8); width: 100%; }
body.qs-v3 #publicQuote .tour-cover h1 {
  font-family: var(--qs-font-display);
  font-size: var(--qs-fs-5xl);
  font-weight: var(--qs-fw-bold);
  line-height: var(--qs-lh-tight);
  color: #fff;
  margin: 0 0 var(--qs-sp-3);
  text-shadow: 0 2px 18px rgba(0,0,0,0.35);
}
body.qs-v3 #publicQuote .tour-cover .prepared-line { font-size: var(--qs-fs-sm); color: rgba(255,255,255,0.9); }
body.qs-v3 #publicQuote .tour-cover .prepared-line strong { color: #fff; }
body.qs-v3 #publicQuote .tour-cover .reference-line {
  font-size: var(--qs-fs-sm); color: rgba(255,255,255,0.85); margin-top: var(--qs-sp-1);
}
body.qs-v3 #publicQuote .tour-cover .reference-line strong { color: var(--quote-accent, var(--qs-gold-400)); }
body.qs-v3 #publicQuote .tour-cover-rule {
  width: 64px; height: 3px; margin: var(--qs-sp-4) 0;
  background: var(--quote-accent, var(--qs-gold-500));
}
body.qs-v3 #publicQuote .cover-meta { display: flex; flex-wrap: wrap; gap: var(--qs-sp-5); }
body.qs-v3 #publicQuote .cover-meta-row {
  display: inline-flex; align-items: center; gap: var(--qs-sp-2);
  font-size: var(--qs-fs-sm); font-weight: var(--qs-fw-medium); color: #fff;
}
body.qs-v3 #publicQuote .cover-meta-row svg { width: 18px; height: 18px; fill: var(--quote-accent, var(--qs-gold-400)); }

body.qs-v3 #publicQuote .hero-gallery {
  display: grid; grid-template-columns: repeat(auto-fill, minmax(120px, 1fr));
  gap: var(--qs-sp-2); padding: var(--qs-sp-4) var(--qs-sp-8) 0;
}
body.qs-v3 #publicQuote .hero-gallery img { width: 100%; height: 90px; object-fit: cover; border-radius: var(--qs-r-md); }

/* Lists / highlights ----------------------------------------------------- */
body.qs-v3 #publicQuote .quote-section ul { margin: 0; padding-left: var(--qs-sp-5); }
body.qs-v3 #publicQuote .quote-section li { margin-bottom: var(--qs-sp-2); color: var(--qs-ink-700); }
body.qs-v3 #publicQuote .quote-section p { color: var(--qs-ink-700); }

/* Brief itinerary -------------------------------------------------------- */
body.qs-v3 #publicQuote .brief-list { display: flex; flex-direction: column; gap: var(--qs-sp-3); }
body.qs-v3 #publicQuote .brief-row {
  display: grid; grid-template-columns: 64px minmax(0, 1fr); gap: var(--qs-sp-4);
  padding: var(--qs-sp-4); border: 1px solid var(--qs-border); border-radius: var(--qs-r-lg);
  background: var(--qs-surface-alt);
}
body.qs-v3 #publicQuote .brief-row > strong { color: var(--quote-accent, var(--qs-gold-500)); font-size: var(--qs-fs-sm); }

/* Day cards -------------------------------------------------------------- */
body.qs-v3 #publicQuote .day-card {
  display: grid;
  grid-template-columns: auto 1fr auto;
  gap: var(--qs-sp-2) var(--qs-sp-4);
  padding: var(--qs-sp-5);
  margin-bottom: var(--qs-sp-4);
  border: 1px solid var(--qs-border);
  border-radius: var(--qs-r-lg);
  background: var(--qs-surface);
}
body.qs-v3 #publicQuote .day-pill {
  display: inline-flex; align-items: center; justify-content: center;
  min-width: 48px; height: 48px; padding: 0 var(--qs-sp-2);
  border-radius: var(--qs-r-full);
  background: var(--quote-accent, var(--qs-gold-500)); color: var(--qs-ink-900);
  font-size: var(--qs-fs-xs); font-weight: var(--qs-fw-bold); text-align: center;
}
body.qs-v3 #publicQuote .day-title {
  font-family: var(--qs-font-display); font-size: var(--qs-fs-xl);
  color: var(--qs-navy-900); align-self: center;
}
body.qs-v3 #publicQuote .day-date { color: var(--qs-ink-500); font-size: var(--qs-fs-sm); white-space: nowrap; }
body.qs-v3 #publicQuote .day-content {
  grid-column: 1 / -1;
  display: grid; grid-template-columns: 200px minmax(0, 1fr); gap: var(--qs-sp-4);
  margin-top: var(--qs-sp-2);
}
body.qs-v3 #publicQuote .day-card.no-day-images .day-content { grid-template-columns: 1fr; }
body.qs-v3 #publicQuote .day-image-stack figure { margin: 0; }
body.qs-v3 #publicQuote .day-image-stack img { width: 100%; border-radius: var(--qs-r-md); object-fit: cover; }
body.qs-v3 #publicQuote .day-image-stack figcaption { font-size: var(--qs-fs-xs); color: var(--qs-ink-500); margin-top: 4px; }
body.qs-v3 #publicQuote .meal-box {
  display: inline-flex; align-items: center; gap: 6px;
  margin-top: var(--qs-sp-3); padding: 4px 12px;
  background: var(--qs-success-soft); color: #065F46;
  border-radius: var(--qs-r-full); font-size: var(--qs-fs-xs); font-weight: var(--qs-fw-medium);
}
body.qs-v3 #publicQuote .note-box {
  margin-top: var(--qs-sp-3); padding: var(--qs-sp-3) var(--qs-sp-4);
  background: var(--qs-warning-soft); border-left: 3px solid var(--qs-warning);
  border-radius: var(--qs-r-sm); font-size: var(--qs-fs-sm); color: #92400E;
}

/* Stay / hotel / transport cards ----------------------------------------- */
body.qs-v3 #publicQuote .hotel-option-heading,
body.qs-v3 #publicQuote .stay-banner {
  display: flex; align-items: center; justify-content: space-between; gap: var(--qs-sp-3);
}
body.qs-v3 #publicQuote .hotel-option-heading {
  margin-bottom: var(--qs-sp-3); color: var(--qs-navy-900); font-weight: var(--qs-fw-semibold);
}
body.qs-v3 #publicQuote .hotel-option-heading span { color: var(--quote-accent, var(--qs-gold-500)); font-size: var(--qs-fs-sm); }
body.qs-v3 #publicQuote .stay-card {
  margin-bottom: var(--qs-sp-4); border: 1px solid var(--qs-border);
  border-radius: var(--qs-r-lg); overflow: hidden;
}
body.qs-v3 #publicQuote .stay-banner {
  padding: var(--qs-sp-3) var(--qs-sp-4);
  background: var(--quote-primary, var(--qs-navy-900)); color: #fff;
}
body.qs-v3 #publicQuote .stay-banner span { color: rgba(255,255,255,0.85); font-size: var(--qs-fs-sm); }
body.qs-v3 #publicQuote .hotel-row-display { display: grid; grid-template-columns: 180px minmax(0,1fr); gap: var(--qs-sp-4); padding: var(--qs-sp-4); }
body.qs-v3 #publicQuote .hotel-row-display.no-hotel-image { grid-template-columns: 1fr; }
body.qs-v3 #publicQuote .hotel-row-display-image img { width: 100%; border-radius: var(--qs-r-md); object-fit: cover; }
body.qs-v3 #publicQuote .stay-stars { color: var(--quote-accent, var(--qs-gold-500)); font-size: var(--qs-fs-xs); font-weight: var(--qs-fw-semibold); }
body.qs-v3 #publicQuote .stay-copy h4 { font-family: var(--qs-font-display); font-size: var(--qs-fs-lg); color: var(--qs-navy-900); margin: 2px 0; }
body.qs-v3 #publicQuote .stay-detail-row { color: var(--qs-ink-500); font-size: var(--qs-fs-sm); }
body.qs-v3 #publicQuote .transport-card-body { padding: var(--qs-sp-2) var(--qs-sp-4); }
body.qs-v3 #publicQuote .transport-row-display {
  display: grid; grid-template-columns: minmax(0,1.4fr) minmax(0,1fr) auto auto;
  gap: var(--qs-sp-3); align-items: center;
  padding: var(--qs-sp-3) 0; border-bottom: 1px solid var(--qs-border);
  font-size: var(--qs-fs-sm);
}
body.qs-v3 #publicQuote .transport-row-display:last-child { border-bottom: 0; }
body.qs-v3 #publicQuote .transport-row-display b { color: var(--qs-ink-400); font-size: var(--qs-fs-xs); }

/* Inclusions / terms grids ----------------------------------------------- */
body.qs-v3 #publicQuote .inclusion-grid,
body.qs-v3 #publicQuote .terms-grid {
  display: grid; grid-template-columns: 1fr 1fr; gap: var(--qs-sp-4);
}
body.qs-v3 #publicQuote .info-block {
  padding: var(--qs-sp-4); border: 1px solid var(--qs-border);
  border-radius: var(--qs-r-lg); background: var(--qs-surface-alt);
}
body.qs-v3 #publicQuote .info-block h4 { color: var(--qs-navy-900); font-size: var(--qs-fs-base); margin-bottom: var(--qs-sp-2); }

/* Pricing ---------------------------------------------------------------- */
body.qs-v3 #publicQuote .quote-pricing-summary {
  display: grid; grid-template-columns: minmax(0,1fr) auto; gap: var(--qs-sp-4);
  align-items: center; padding: var(--qs-sp-5);
  border: 1px solid var(--qs-border); border-radius: var(--qs-r-lg); background: var(--qs-surface-alt);
}
body.qs-v3 #publicQuote .quote-summary-label { font-weight: var(--qs-fw-semibold); color: var(--qs-navy-900); display: block; margin-bottom: var(--qs-sp-2); }
body.qs-v3 #publicQuote .quote-pricing-summary-row {
  display: flex; justify-content: space-between; gap: var(--qs-sp-4);
  padding: 4px 0; font-size: var(--qs-fs-sm); color: var(--qs-ink-700);
}
body.qs-v3 #publicQuote .quote-pricing-grand {
  text-align: right; padding-left: var(--qs-sp-5); border-left: 1px solid var(--qs-border);
}
body.qs-v3 #publicQuote .quote-pricing-grand span { display: block; color: var(--qs-ink-500); font-size: var(--qs-fs-xs); text-transform: uppercase; letter-spacing: 0.04em; }
body.qs-v3 #publicQuote .quote-pricing-grand strong {
  font-family: var(--qs-font-display); font-size: var(--qs-fs-3xl); color: var(--quote-primary, var(--qs-navy-900));
}
body.qs-v3 #publicQuote .quote-table { width: 100%; border-collapse: collapse; margin-top: var(--qs-sp-4); font-size: var(--qs-fs-sm); }
body.qs-v3 #publicQuote .quote-table th {
  text-align: left; padding: var(--qs-sp-2) var(--qs-sp-3);
  background: var(--qs-surface-alt); color: var(--qs-ink-500);
  font-size: var(--qs-fs-xs); text-transform: uppercase; letter-spacing: 0.03em;
  border-bottom: 1px solid var(--qs-border);
}
body.qs-v3 #publicQuote .quote-table td { padding: var(--qs-sp-2) var(--qs-sp-3); border-bottom: 1px solid var(--qs-border); }

/* Footer ----------------------------------------------------------------- */
body.qs-v3 #publicQuote .quote-lite-footer {
  margin-top: var(--qs-sp-8); padding: var(--qs-sp-6) var(--qs-sp-8);
  background: var(--quote-primary, var(--qs-navy-900)); color: rgba(255,255,255,0.85);
  font-size: var(--qs-fs-sm);
}
body.qs-v3 #publicQuote .quote-lite-footer strong { display: block; margin-top: var(--qs-sp-2); color: #fff; font-family: var(--qs-font-display); font-size: var(--qs-fs-lg); }

/* Responsive ------------------------------------------------------------- */
@media (max-width: 900px) {
  body.qs-v3 .public-quote-layout { grid-template-columns: 1fr; }
  body.qs-v3 .public-quote-actions-card { position: static; order: 2; }
  body.qs-v3 #publicQuote .day-content,
  body.qs-v3 #publicQuote .hotel-row-display { grid-template-columns: 1fr; }
  body.qs-v3 #publicQuote .inclusion-grid,
  body.qs-v3 #publicQuote .terms-grid,
  body.qs-v3 #publicQuote .quote-pricing-summary { grid-template-columns: 1fr; }
  body.qs-v3 #publicQuote .quote-pricing-grand { border-left: 0; padding-left: 0; text-align: left; }
  body.qs-v3 #publicQuote .tour-cover h1 { font-size: var(--qs-fs-4xl); }
}

/* Print: single clean column, no actions sidebar ------------------------- */
@media print {
  body.qs-v3 .public-quote-actions-card,
  body.qs-v3 #publicQuoteMessage { display: none !important; }
  body.qs-v3 .public-quote-layout { display: block; }
  body.qs-v3 .public-quote-paper { border: 0; box-shadow: none; border-radius: 0; }
  body.qs-v3 .public-quote-shell { max-width: none; padding: 0; }
}
