/* ==========================================================================
   QuoteAmerica — global stylesheet
   Brand: white / blue #113491 / red #ba0422. Light theme only.
   Headings: Inter. Paragraphs: Merriweather.
   ========================================================================== */

/* --- Self-hosted variable fonts (latin subset) --- */
@font-face {
  font-family: 'Inter';
  src: url('/assets/fonts/Inter.c940764593.woff2') format('woff2');
  font-weight: 100 900;
  font-style: normal;
  font-display: swap;
}
@font-face {
  font-family: 'Merriweather';
  src: url('/assets/fonts/Merriweather.af1be39e2f.woff2') format('woff2');
  font-weight: 300 900;
  font-style: normal;
  font-display: swap;
}

:root {
  --blue: #113491;
  --blue-dark: #0c2569;
  --blue-light: #e8edf8;
  --blue-tint: #f4f6fc;
  --red: #ba0422;
  --red-dark: #94031b;
  --red-tint: #fdf2f4;
  /* Only used for the ZIP-step “Good News!” line so far. Dark enough to clear
     AA on white at bold weight. */
  --green: #0f7a3d;
  --white: #ffffff;

  --ink: #14181f;
  --ink-soft: #414a58;
  --ink-muted: #6a7382;
  --line: #dfe3ea;
  --line-soft: #eef1f5;
  --bg-alt: #f7f8fb;

  --font-head: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
  /* Proxima Nova is a licensed font; if you license it, it will be used first. */
  --font-body: 'Proxima Nova', 'Merriweather', Georgia, 'Times New Roman', serif;
  --font-ui: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;

  --wrap: 1180px;
  --radius: 10px;
  --radius-lg: 16px;
  --shadow-sm: 0 1px 2px rgba(20, 24, 31, 0.06), 0 1px 3px rgba(20, 24, 31, 0.05);
  --shadow: 0 4px 6px -1px rgba(20, 24, 31, 0.07), 0 2px 4px -2px rgba(20, 24, 31, 0.05);
  --shadow-lg: 0 12px 28px -8px rgba(17, 52, 145, 0.18), 0 4px 10px -4px rgba(20, 24, 31, 0.08);

  --header-h: 76px;
}

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

html {
  -webkit-text-size-adjust: 100%;
  scroll-behavior: smooth;
  scroll-padding-top: calc(var(--header-h) + 16px);
  /* Horizontal containment at the root. `hidden` rather than `clip`: Safari's
     support for `overflow: clip` on the root element is unreliable, and clip was
     not holding on iOS. `hidden` on the root is the combination Safari honours.
     The drawer that originally caused the overflow is now display:none when
     closed, so this is a backstop rather than the primary fix. */
  overflow-x: hidden;
}
@media (prefers-reduced-motion: reduce) {
  html { scroll-behavior: auto; }
  *, *::before, *::after { animation-duration: .01ms !important; transition-duration: .01ms !important; }
}

body {
  margin: 0;
  background: var(--white);
  color: var(--ink);
  font-family: var(--font-body);
  font-size: 17px;
  line-height: 1.75;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  /* `clip`, not `hidden`: an overflow value on <body> makes it a scroll container,
     which breaks position:sticky on the header in mobile browsers. The root's
     overflow-x:hidden above remains the horizontal backstop. */
  overflow-x: clip;
}

h1, h2, h3, h4, h5, h6 {
  font-family: var(--font-head);
  color: var(--blue);
  font-weight: 800;
  letter-spacing: -0.02em;
  line-height: 1.18;
  margin: 0 0 .5em;
  text-wrap: balance;
}
h1 { font-size: clamp(2rem, 5.2vw, 3.25rem); }
h2 { font-size: clamp(1.6rem, 3.6vw, 2.35rem); }
h3 { font-size: clamp(1.2rem, 2.2vw, 1.5rem); font-weight: 700; }
h4 { font-size: 1.1rem; font-weight: 700; }

p { margin: 0 0 1.15em; }
p:last-child { margin-bottom: 0; }

a { color: var(--blue); text-decoration-thickness: 1px; text-underline-offset: 2px; }
a:hover { color: var(--red); }

img { max-width: 100%; height: auto; display: block; }
ul, ol { padding-left: 1.35em; }
li { margin-bottom: .45em; }
strong, b { font-weight: 700; }
hr { border: 0; border-top: 1px solid var(--line); margin: 2.5rem 0; }

:focus-visible {
  outline: 3px solid var(--red);
  outline-offset: 2px;
  border-radius: 4px;
}

.wrap { width: 100%; max-width: var(--wrap); margin: 0 auto; padding: 0 20px; }
.narrow { max-width: 780px; }
.center { text-align: center; }
.eyebrow {
  font-family: var(--font-ui);
  font-size: .78rem;
  font-weight: 700;
  letter-spacing: .12em;
  text-transform: uppercase;
  color: var(--red);
  margin-bottom: .75rem;
}
.lede { font-size: 1.12rem; color: var(--ink-soft); }
.section { padding: clamp(3rem, 7vw, 5.5rem) 0; }
.section--alt { background: var(--bg-alt); }
.section--tint { background: var(--blue-tint); }

.skip-link {
  position: absolute; left: -9999px; top: 0; z-index: 200;
  background: var(--blue); color: #fff; padding: 12px 20px;
  font-family: var(--font-ui); font-weight: 700; border-radius: 0 0 var(--radius) 0;
}
.skip-link:focus { left: 0; color: #fff; }

/* ============================== BUTTONS ==============================
   Every CTA is red #ba0422 with bold white text. */
.btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: .55em;
  font-family: var(--font-ui);
  font-weight: 700;
  font-size: 1.02rem;
  line-height: 1.2;
  padding: 17px 34px;
  border: 2px solid transparent;
  border-radius: var(--radius);
  cursor: pointer;
  text-decoration: none;
  text-align: center;
  transition: background-color .16s ease, transform .12s ease, box-shadow .16s ease, color .16s ease;
  -webkit-tap-highlight-color: transparent;
}
.btn:active { transform: translateY(1px); }

.btn--primary,
.btn--cta {
  background: var(--red);
  color: var(--white);
  box-shadow: var(--shadow);
}
.btn--primary:hover,
.btn--cta:hover { background: var(--red-dark); color: var(--white); box-shadow: var(--shadow-lg); }

.btn--ghost { background: transparent; color: var(--blue); border-color: var(--blue); }
.btn--ghost:hover { background: var(--blue); color: var(--white); }

.btn--white { background: var(--white); color: var(--blue); }
.btn--white:hover { background: var(--blue-light); color: var(--blue); }

.btn--lg { font-size: 1.12rem; padding: 20px 44px; }
.btn--block { display: flex; width: 100%; }
.btn[disabled], .btn[aria-disabled='true'] { opacity: .5; cursor: not-allowed; }

.btn-note {
  font-family: var(--font-ui);
  font-size: .82rem;
  color: var(--ink-muted);
  margin-top: .75rem;
}

/* ---- Click-to-call CTA: [phone icon] [number] [label] ---- */
.btn--call { gap: 9px; white-space: nowrap; }
.btn--call .call-icon { width: 1.05em; height: 1.05em; flex-shrink: 0; stroke-width: 2.1; }
.btn--call .call-num { font-weight: 800; letter-spacing: .01em; }
@media (max-width: 400px) { .btn--call { gap: 7px; } }

/* Lead-in above the chooser's call CTA. */
.call-prompt {
  font-family: var(--font-ui);
  font-size: .82rem; font-weight: 600; line-height: 1.4;
  color: var(--ink);
  text-align: center;
  margin: 14px 0 8px;
}


/* No top margin on <main>: the hero band starts flush under the nav bar (or
   under the breadcrumb bar on internal pages). The 50px of breathing room that
   used to sit here left a white strip above the tinted hero — removed
   2026-08-07 at the user's request. */
main { margin-top: 0; }

/* ============================== HEADER / NAV ============================== */
.site-header {
  position: sticky; top: 0; z-index: 100;
  background: var(--white);
  border-bottom: 1px solid var(--line);
}
.header-bar {
  display: flex; align-items: center; justify-content: space-between;
  gap: 16px; min-height: var(--header-h);
}
.logo { display: flex; align-items: center; flex-shrink: 0; }
.logo img { height: 38px; width: auto; }

.nav { display: flex; align-items: center; gap: 4px; }
.nav-list { display: flex; align-items: center; gap: 2px; margin: 0; padding: 0; list-style: none; }
/* The <li>s are grandchildren of .nav (inside .nav-list) — reset them directly,
   or the default disc markers render between the nav links. */
.nav-list > li, .nav-item { list-style: none; margin: 0; position: relative; }

.nav-link {
  display: inline-flex; align-items: center; gap: 6px;
  font-family: var(--font-ui); font-weight: 600; font-size: .95rem;
  color: var(--ink); text-decoration: none;
  padding: 10px 14px; border-radius: 8px;
  background: none; border: 0; cursor: pointer;
  white-space: nowrap;
}
.nav-link:hover, .nav-link[aria-expanded='true'] { background: var(--blue-tint); color: var(--blue); }
.nav-link[aria-current='page'] { color: var(--blue); }
.nav-link[aria-current='page']::after {
  content: ''; position: absolute; left: 14px; right: 14px; bottom: 4px;
  height: 2px; background: var(--red); border-radius: 2px;
}
.caret { width: 10px; height: 10px; transition: transform .18s ease; flex-shrink: 0; }
.nav-link[aria-expanded='true'] .caret { transform: rotate(180deg); }

.submenu {
  position: absolute; top: calc(100% + 6px); left: 0;
  min-width: 268px; margin: 0; padding: 8px;
  list-style: none;
  background: var(--white);
  border: 1px solid var(--line);
  border-radius: var(--radius-lg);
  box-shadow: var(--shadow-lg);
  opacity: 0; visibility: hidden; transform: translateY(-6px);
  transition: opacity .16s ease, transform .16s ease, visibility .16s;
}
.nav-item[data-open='true'] .submenu { opacity: 1; visibility: visible; transform: translateY(0); }
.submenu li { margin: 0; }
.submenu a {
  display: block; padding: 11px 14px; border-radius: 8px;
  font-family: var(--font-ui); font-size: .93rem; font-weight: 600;
  color: var(--ink); text-decoration: none;
}
.submenu a:hover { background: var(--blue-tint); color: var(--blue); }
.submenu a small {
  display: block; font-weight: 400; font-size: .8rem; color: var(--ink-muted);
  margin-top: 2px; line-height: 1.45;
}
.submenu a:hover small { color: var(--ink-soft); }

.header-cta { flex-shrink: 0; }
.header-cta .btn { padding: 13px 24px; font-size: .95rem; }

.nav-toggle {
  display: none; background: none; border: 0; cursor: pointer;
  padding: 10px; margin-right: -10px; border-radius: 8px;
}
.nav-toggle span {
  display: block; width: 26px; height: 2.5px; background: var(--blue);
  border-radius: 2px; transition: transform .2s ease, opacity .2s ease;
}
.nav-toggle span + span { margin-top: 6px; }
.nav-toggle[aria-expanded='true'] span:nth-child(1) { transform: translateY(8.5px) rotate(45deg); }
.nav-toggle[aria-expanded='true'] span:nth-child(2) { opacity: 0; }
.nav-toggle[aria-expanded='true'] span:nth-child(3) { transform: translateY(-8.5px) rotate(-45deg); }

/* Breakpoint raised from 1000px: the desktop nav needs 1157px to fit, so
   1001-1157px showed the full nav and overflowed the viewport by up to
   157px. The hamburger now takes over before that gap opens. Keep in sync
   with isDesktop() in app.js. */
@media (max-width: 1160px) {
  .nav-toggle { display: block; }
  /* Call CTA stays visible in the mobile nav bar. The full wordmark stays on
     the left, so the button is centered in the space BETWEEN the logo and the
     hamburger — a viewport-centered button would overlap the wordmark on a
     phone (at 320px it would need a ~14px-tall logo to clear it). */
  .header-bar { position: relative; }
  .header-cta {
    display: flex;
    flex: 1;
    justify-content: center;
    min-width: 0;
  }
  .header-cta .btn--call {
    padding: 15px 18px;
    font-size: 1rem;
    gap: 8px;
    box-shadow: none;
  }
  .nav {
    position: fixed; inset: var(--header-h) 0 0 0;
    background: var(--white);
    overflow-y: auto;
    padding: 12px 20px 48px;
    border-top: 1px solid var(--line);
    /* The closed drawer is NOT rendered at all.
       It used to sit at translateX(100%) — a full viewport to the RIGHT of the
       screen — which made the document twice as wide as the phone. Nothing on
       the page could clip it: a position:fixed element is laid out against the
       viewport, so neither `overflow-x: hidden` on <body> nor `overflow-x: clip`
       on the root contains it, and iOS Safari let the page be dragged sideways.
       Removing it from layout when closed kills the overflow at its source; the
       240ms slide is the price, and it is worth it. */
    display: none;
  }
  .nav[data-open='true'] { display: block; }
  body.nav-open { overflow: hidden; }
  .nav-list { display: block; }
  .nav-item { border-bottom: 1px solid var(--line-soft); }
  .nav-link {
    width: 100%; justify-content: space-between;
    padding: 17px 4px; font-size: 1.05rem; border-radius: 0;
  }
  .nav-link[aria-current='page']::after { display: none; }
  .nav-link[aria-current='page'] { color: var(--red); }
  .submenu {
    position: static; opacity: 1; visibility: visible; transform: none;
    box-shadow: none; border: 0; border-radius: 0;
    padding: 0 0 10px 4px; min-width: 0;
    display: none;
  }
  .nav-item[data-open='true'] .submenu { display: block; }
  .submenu a { padding: 12px 14px; }
}

/* ============================== BREADCRUMBS ============================== */
.breadcrumbs { background: var(--bg-alt); border-bottom: 1px solid var(--line-soft); }
.breadcrumbs ol {
  display: flex; flex-wrap: wrap; align-items: center; gap: 6px;
  list-style: none; margin: 0; padding: 13px 0;
  font-family: var(--font-ui); font-size: .82rem;
}
.breadcrumbs li { display: flex; align-items: center; gap: 6px; margin: 0; }
.breadcrumbs li + li::before {
  content: '›'; color: var(--ink-muted); font-size: 1.05rem; line-height: 1;
}
.breadcrumbs a { color: var(--ink-muted); text-decoration: none; font-weight: 600; }
.breadcrumbs a:hover { color: var(--red); text-decoration: underline; }
.breadcrumbs [aria-current='page'] { color: var(--blue); font-weight: 700; }

/* ============================== HERO ============================== */
.hero {
  background: linear-gradient(168deg, var(--blue-tint) 0%, var(--white) 62%);
  padding: clamp(2.5rem, 5vw, 4.25rem) 0 clamp(2.5rem, 5vw, 4rem);
  border-bottom: 1px solid var(--line-soft);
}
.hero-grid {
  display: grid; grid-template-columns: 1.05fr .95fr; gap: clamp(2rem, 4vw, 4rem);
  align-items: center;
}
.hero h1 { margin-bottom: .45em; }
.hero-sub { font-size: 1.15rem; color: var(--ink-soft); margin-bottom: 1.75rem; max-width: 34em; }
.hero-logo { margin-bottom: 1.5rem; }
.hero-logo img { height: 52px; width: auto; }

.hero--home { background: linear-gradient(168deg, var(--blue-tint) 0%, var(--white) 70%); }
.hero--home .hero-grid { align-items: start; }
.hero--center { text-align: center; }
.hero--center .hero-sub { margin-left: auto; margin-right: auto; }

/* Homepage stacked hero: headline on top, the chooser card, then the
   supporting copy + trust row — one centered column at every width. */
.hero--stack { text-align: center; }
.hero-stack {
  display: flex; flex-direction: column; align-items: center;
  gap: clamp(1.4rem, 3.2vw, 2.25rem);
}
.hero-stack > * { width: 100%; }
.hero-stack .hero-head h1 { margin-bottom: 0; }
.hero-stack .hero-card { max-width: 640px; margin: 0 auto; }
.hero-stack .hero-foot { max-width: 72ch; margin: 0 auto; }
.hero-stack .hero-sub { max-width: none; margin: 0 auto; }
.hero-stack .trust-row { justify-content: center; margin-top: 1.15rem; }

/* The stacked hero centers its text, but form controls inside the card must
   keep their own alignment — a centered field label or consent paragraph reads
   as a mistake. */
.hero-stack .quote-card .field label,
.hero-stack .quote-card .field .flabel,
.hero-stack .quote-card .field-error,
.hero-stack .quote-card .consent,
.hero-stack .quote-card .consent label,
.hero-stack .quote-card .form-alert { text-align: left; }

/* The chooser card's two headings, enlarged (homepage only — the funnel steps
   have no fold budget to spare). Sized per height tier so the card still
   clears the fold on short laptops and phones. */
.hero--home .quote-head h2 { font-size: 1.5rem; }
.hero--home .quote-card .qtitle { font-size: 1.3rem; }
@media (max-width: 900px), (max-height: 1200px) {
  .hero--home .quote-head h2 { font-size: 1.3rem; }
  .hero--home .quote-card .qtitle { font-size: 1.16rem; }
}
@media (max-height: 700px) {
  .hero--home .quote-head h2 { font-size: 1.12rem; }
  .hero--home .quote-card .qtitle { font-size: 1.05rem; }
}
@media (max-height: 620px) {
  .hero--home .quote-card .qtitle { font-size: 1rem; }
}
@media (max-width: 360px) {
  .hero--home .quote-head h2 { font-size: 1.02rem; }
  .hero--home .quote-card .qtitle { font-size: .98rem; }
}

.trust-row {
  display: flex; flex-wrap: wrap; gap: 10px 22px; align-items: center;
  font-family: var(--font-ui); font-size: .86rem; font-weight: 600; color: var(--ink-soft);
  margin-top: 1.5rem;
}
.trust-row span { display: inline-flex; align-items: center; gap: 7px; }
.trust-row svg { width: 17px; height: 17px; color: var(--blue); flex-shrink: 0; }
.hero--center .trust-row { justify-content: center; }

@media (max-width: 900px) {
  /* The quote form must be fully above the fold. It is the second grid child
     in source order (good for SEO — the <h1> still comes first in the DOM);
     visually it moves to the top on narrow screens. */
  .hero { padding: 14px 0 28px; }
  .hero-grid { grid-template-columns: 1fr; gap: 1.75rem; }
  .hero-grid > *:last-child { order: -1; }
  .hero-sub { font-size: 1.02rem; }
  .hero-logo { margin-bottom: 1rem; }
  .hero-logo img { height: 40px; }
  .hero--center .hero-grid > *:last-child { order: 0; }

  /* The stacked hero keeps its source order (headline → card → copy), so the
     headline itself has to shrink to protect the card's fold budget. */
  .hero--stack .hero-stack { gap: 1rem; }
  .hero--stack .eyebrow { font-size: .7rem; letter-spacing: .1em; margin-bottom: .35rem; }
  .hero--stack h1 { font-size: clamp(1.4rem, 6.2vw, 2rem); line-height: 1.16; }
  /* Funnel pages carry a much taller card than the homepage chooser, and they
     also carry breadcrumbs, so their headline runs one notch smaller. */
  .hero--form.hero--stack h1 { font-size: clamp(1.22rem, 5vw, 1.55rem); }
  .hero--form.hero--stack .hero-stack { gap: .8rem; }
  .hero--form.hero--stack .hero-split { row-gap: .8rem; }
  .hero-stack .trust-row { margin-top: .9rem; }
}

/* Short desktops/laptops: the hero band, not the card, gives up the space. */
@media (min-width: 901px) and (max-height: 900px) {
  .hero--stack { padding-top: 26px; padding-bottom: 26px; }
  .hero--stack .hero-stack { gap: 1.25rem; }
  .hero--stack h1 { font-size: clamp(1.9rem, 3vw, 2.5rem); }
}
@media (min-width: 901px) and (max-height: 780px) {
  .hero--stack { padding-top: 10px; padding-bottom: 18px; }
  .hero--stack .hero-stack { gap: .7rem; }
  .hero--stack h1 { font-size: 1.6rem; }
  .hero--stack .eyebrow { font-size: .7rem; margin-bottom: .3rem; }
  /* 720p laptops: the funnel's last step is the tallest thing on the site. */
  .hero--form.hero--stack { padding-top: 4px; padding-bottom: 14px; }
  .hero--form.hero--stack .hero-stack { gap: .45rem; }
  .hero--form.hero--stack .hero-split { row-gap: .45rem; }
  .hero--form.hero--stack h1 { font-size: 1.25rem; }
  .hero--form + * .breadcrumbs ol { padding: 6px 0; }
}
@media (min-width: 901px) and (max-height: 780px) {
  .breadcrumbs ol { padding: 6px 0; }
}

/* ============================== VERTICAL GRID ============================== */
.vgrid {
  display: grid; gap: 20px;
  grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
}
.vcard {
  display: flex; flex-direction: column; gap: 12px;
  background: var(--white);
  border: 1px solid var(--line);
  border-radius: var(--radius-lg);
  padding: 28px 26px;
  text-decoration: none;
  box-shadow: var(--shadow-sm);
  transition: transform .16s ease, box-shadow .16s ease, border-color .16s ease;
}
.vcard:hover {
  transform: translateY(-3px);
  box-shadow: var(--shadow-lg);
  border-color: var(--blue);
}
.vcard-icon {
  width: 48px; height: 48px; border-radius: 12px;
  background: var(--blue-light); color: var(--blue);
  display: grid; place-items: center; flex-shrink: 0;
}
.vcard-icon svg { width: 26px; height: 26px; }
.vcard h3 { margin: 0; font-family: var(--font-head); color: var(--blue); font-size: 1.22rem; }
.vcard p { font-size: .95rem; color: var(--ink-soft); line-height: 1.65; margin: 0; flex-grow: 1; }
.vcard-link {
  font-family: var(--font-ui); font-weight: 700; font-size: .92rem; color: var(--red);
  display: inline-flex; align-items: center; gap: 6px;
}
.vcard:hover .vcard-link { gap: 10px; }
.vcard-link svg { width: 15px; height: 15px; transition: transform .16s ease; }

/* ============================== FEATURE / BENEFIT LIST ============================== */
.benefits { display: grid; gap: 26px; grid-template-columns: repeat(auto-fit, minmax(260px, 1fr)); }
.benefit { display: flex; gap: 16px; align-items: flex-start; }
.benefit-check {
  flex-shrink: 0; width: 30px; height: 30px; border-radius: 50%;
  background: var(--red); color: var(--white);
  display: grid; place-items: center; margin-top: 3px;
}
.benefit-check svg { width: 16px; height: 16px; }
.benefit h3 { font-size: 1.06rem; margin: 0 0 .3em; color: var(--blue); font-weight: 700; }
.benefit p { font-size: .95rem; color: var(--ink-soft); margin: 0; line-height: 1.65; }

/* ============================== STEPS ============================== */
.steps { display: grid; gap: 30px; grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); counter-reset: step; }
.step { text-align: center; }
.step-num {
  width: 60px; height: 60px; margin: 0 auto 1rem;
  border-radius: 50%; background: var(--blue); color: var(--white);
  display: grid; place-items: center;
  font-family: var(--font-head); font-weight: 800; font-size: 1.5rem;
}
.step h3 { font-size: 1.12rem; margin-bottom: .4em; }
.step p { font-size: .95rem; color: var(--ink-soft); margin: 0; }

/* ============================== FAQ ============================== */
.faq-list { max-width: 860px; margin: 0 auto; }
.faq {
  border-bottom: 1px solid var(--line);
  background: var(--white);
}
.faq:first-child { border-top: 1px solid var(--line); }
.faq summary {
  display: flex; align-items: flex-start; justify-content: space-between; gap: 20px;
  padding: 22px 4px; cursor: pointer; list-style: none;
  font-family: var(--font-head); font-weight: 700; font-size: 1.06rem; color: var(--blue);
  line-height: 1.45;
}
.faq summary::-webkit-details-marker { display: none; }
.faq summary:hover { color: var(--red); }
.faq-plus {
  flex-shrink: 0; width: 22px; height: 22px; position: relative; margin-top: 4px;
}
.faq-plus::before, .faq-plus::after {
  content: ''; position: absolute; background: var(--red); border-radius: 2px;
  top: 50%; left: 50%; transform: translate(-50%, -50%);
}
.faq-plus::before { width: 14px; height: 2.5px; }
.faq-plus::after { width: 2.5px; height: 14px; transition: transform .2s ease, opacity .2s ease; }
.faq[open] .faq-plus::after { transform: translate(-50%, -50%) rotate(90deg); opacity: 0; }
.faq-answer { padding: 0 4px 24px; color: var(--ink-soft); font-size: 1rem; max-width: 74ch; }

/* ============================== QUOTE FORM ============================== */
.quote-card {
  background: var(--white);
  border: 1px solid var(--line);
  border-radius: var(--radius-lg);
  box-shadow: var(--shadow-lg);
  overflow: hidden;
}
.quote-head { padding: 24px 28px 0; }
.quote-head h2 { font-size: 1.4rem; margin-bottom: .25em; }
.quote-head p { font-size: .92rem; color: var(--ink-muted); font-family: var(--font-ui); margin: 0; }

.progress { padding: 22px 28px 0; }
.progress-track { height: 6px; background: var(--line-soft); border-radius: 99px; overflow: hidden; }
.progress-fill {
  height: 100%; width: 0%; background: var(--red);
  border-radius: 99px; transition: width .3s ease;
}
.progress-label {
  font-family: var(--font-ui); font-size: .78rem; font-weight: 600;
  color: var(--ink-muted); margin-top: 8px;
  display: flex; justify-content: space-between;
}

.quote-body { padding: 22px 28px 28px; }
.qstep { display: none; }
.qstep[data-active='true'] { display: block; animation: qfade .22s ease; }
@keyframes qfade { from { opacity: 0; transform: translateY(6px); } to { opacity: 1; transform: none; } }

/* Contact-step title ("Lock-In Your Quote") — fixed 40px at every breakpoint (user-directed). */
.quote-card .qstep--contact .qtitle { font-size: 40px !important; line-height: 1.15; }
.quote-card .qstep--contact .qtitle + .qhelp { font-size: 16px !important; line-height: 1.35; margin-bottom: 1.1rem; }
@media (max-width: 480px) { .quote-card .qstep--contact .qtitle { font-size: 32px !important; } .quote-card .qstep--contact .qtitle + .qhelp { font-size: 15px !important; } }

/* Price badge — light green card with odometer-style rolling digits (windows quiz). */
.price-badge {
  display: flex; align-items: baseline; justify-content: center; flex-wrap: wrap; gap: 0 .35em;
  margin: 0 0 1rem; padding: 14px 18px; border-radius: var(--radius);
  background: #eaf8ec; border: 2px solid #bfe6c6; color: #14532d; font-family: var(--font-head);
}
.pb-pre, .pb-suf { font-size: 20px; font-weight: 700; line-height: 1; }
.pb-amt { display: inline-flex; align-items: baseline; font-size: 40px; font-weight: 800; line-height: 1; letter-spacing: 0; font-variant-numeric: tabular-nums; color: #166534; }
.pb-cur { font-size: 28px; margin-right: 1px; align-self: flex-start; padding-top: .18em; }
.odo-digit { display: inline-block; height: 1em; overflow: hidden; line-height: 1; vertical-align: baseline; }
.odo-strip { display: block; transform: translateY(calc(-1em * var(--d, 0))); transition: transform 1.6s cubic-bezier(.16,.84,.3,1); } /* column shows digit --d; changing --d rolls the strip */
.odo-sep { display: inline-block; line-height: 1; }
.odo-digit { transition: width .6s ease .2s, opacity .4s ease .2s, margin .6s ease .2s; width: .65em; text-align: center; overflow: hidden; }
.odo-digit.odo-gone { width: 0 !important; opacity: 0; margin: 0; }
@media (prefers-reduced-motion: reduce) { .odo-strip { transition: none; } }
@media (max-width: 480px) { .pb-pre, .pb-suf { font-size: 17px; } .pb-amt { font-size: 34px; } .pb-cur { font-size: 24px; } }
.pb-city { display: none; font-size: 20px; font-weight: 700; line-height: 1; }
.pb-match { display: none; flex-basis: 100%; text-align: center; margin-top: 8px; font-family: var(--font-ui); font-size: 15px; font-weight: 600; color: var(--ink); }
.pb-match-n { color: var(--red); font-size: 20px; font-weight: 800; }
.price-badge[data-form='true'] .pb-city, .price-badge[data-form='true'] .pb-match { display: inline; }
.price-badge[data-form='true'] .pb-match { display: block; }
.qstep--zip .field--zip { max-width: 240px; margin: 1.1rem auto 0; text-align: center; }
.qstep--zip .field--zip input { text-align: center; font-size: 1.4rem; letter-spacing: .12em; font-weight: 700; }
/* min-height reserves TWO lines: the confirmation sentence wraps on a phone and
   the Continue button sits right under it — without the reserve, the button jumps
   down the moment the ZIP resolves, under the thumb that is reaching for it. */
.zip-city { min-height: 3.1em; margin: .6rem 0 0; font-family: var(--font-ui); font-weight: 700; color: var(--blue); font-size: 1.05rem; line-height: 1.45; }
.zip-city[data-state='error'] { color: var(--red); }
.zip-city[data-state='loading'] { color: var(--ink-muted); font-weight: 500; }
/* "Good News!" leads the ZIP confirmation line in green; the rest of the
   sentence stays in the card's navy (user-directed 2026-08-21). */
.zip-city .zip-good { color: var(--green); }
.qdq { text-align: center; padding: 8px 4px 4px; }
.qdq-msg { font-family: var(--font-head); font-weight: 700; font-size: 1.15rem; line-height: 1.4; color: var(--ink); margin: 0 0 1.1rem; }
form[data-dq='true'] .qstep, form[data-dq='true'] .qnav { display: none !important; }

.quote-card legend, .quote-card .qtitle {
  font-family: var(--font-head); font-weight: 800; color: var(--blue);
  font-size: 1.8rem; line-height: 1.25; margin-bottom: .35em; padding: 0;
  letter-spacing: -0.015em;
}
.qhelp { font-family: var(--font-ui); font-size: .86rem; color: var(--ink-muted); margin-bottom: 1.1rem; }
.quote-card fieldset { border: 0; padding: 0; margin: 0; min-width: 0; }

.opts { display: grid; gap: 10px; margin: 1.15rem 0 0; }
.opt { position: relative; }
.opt input { position: absolute; opacity: 0; width: 0; height: 0; }
.opt label {
  display: flex; align-items: center; gap: 12px;
  padding: 16px 18px;
  border: 2px solid var(--line);
  border-radius: var(--radius);
  font-family: var(--font-ui); font-weight: 600; font-size: 1.1rem;
  cursor: pointer; background: var(--white);
  transition: border-color .14s ease, background-color .14s ease, box-shadow .14s ease;
  min-height: 58px;
}
.opt label::before {
  content: ''; flex-shrink: 0; width: 21px; height: 21px;
  border: 2px solid var(--line); border-radius: 50%;
  transition: border-color .14s ease, box-shadow .14s ease;
}
.opt label:hover { border-color: var(--blue); background: var(--blue-tint); }
.opt input:checked + label { border-color: var(--red); background: var(--red-tint); }
.opt input:checked + label::before {
  border-color: var(--red); box-shadow: inset 0 0 0 5px var(--red);
}
.opt input:focus-visible + label { outline: 3px solid var(--red); outline-offset: 2px; }

/* Homepage category chooser — 2-up tiles, no radio dot, red on select. */
.opts--grid { grid-template-columns: 1fr 1fr; gap: 10px; }
.opts--grid .opt label {
  flex-direction: column; justify-content: center; align-items: center;
  text-align: center; gap: 7px; min-height: 84px; padding: 12px 8px;
  font-size: .9rem; line-height: 1.25;
}
.opts--grid .opt label::before { display: none; }
.opts--grid .opt label svg { width: 24px; height: 24px; color: var(--blue); flex-shrink: 0; }
.opts--grid .opt input:checked + label svg { color: var(--red); }
/* A trailing odd tile spans both columns; with an even count nothing spans. */
.opts--grid .opt:last-child:nth-child(odd) { grid-column: 1 / -1; }
.opts--grid .opt:last-child:nth-child(odd) label { flex-direction: row; gap: 10px; min-height: 56px; }
.chooser-form noscript ul { margin: 1rem 0 0; font-family: var(--font-ui); font-size: .9rem; }

.field { margin-bottom: 16px; }
.field label, .field .flabel {
  display: block; font-family: var(--font-ui); font-weight: 600; font-size: .88rem;
  color: var(--ink); margin-bottom: 6px;
}
.field input, .field select, .field textarea {
  width: 100%; padding: 15px 16px;
  font-family: var(--font-ui); font-size: 1rem; color: var(--ink);
  background: var(--white);
  border: 2px solid var(--line); border-radius: var(--radius);
  transition: border-color .14s ease;
  -webkit-appearance: none; appearance: none;
}
.field select {
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 8' fill='none' stroke='%236a7382' stroke-width='2'%3E%3Cpath d='M1 1l5 5 5-5'/%3E%3C/svg%3E");
  background-repeat: no-repeat; background-position: right 16px center; background-size: 12px;
  padding-right: 42px;
}
.field textarea { min-height: 140px; resize: vertical; font-family: var(--font-ui); line-height: 1.6; }
.field input:focus, .field select:focus, .field textarea:focus {
  outline: none; border-color: var(--blue);
}
.field input[aria-invalid='true'], .field select[aria-invalid='true'], .field textarea[aria-invalid='true'] {
  border-color: var(--red); background: var(--red-tint);
}
.field-error {
  display: none; font-family: var(--font-ui); font-size: .8rem; font-weight: 600;
  color: var(--red); margin-top: 5px;
}
.field-error[data-show='true'] { display: block; }
.field-row { display: grid; grid-template-columns: 1fr 1fr; gap: 14px; }
/* Address autocomplete dropdown (Google Places via /api/address) */
.field--address { position: relative; }
.addr-list { position: absolute; left: 0; right: 0; top: 100%; z-index: 30; margin: 4px 0 0; padding: 6px 0; list-style: none;
  background: var(--white); border: 2px solid var(--line); border-radius: var(--radius); box-shadow: var(--shadow-lg); max-height: 260px; overflow-y: auto; }
.addr-list li { padding: 10px 14px; cursor: pointer; display: flex; flex-direction: column; gap: 2px; font-family: var(--font-ui); }
.addr-list li:hover, .addr-list li[aria-selected='true'] { background: var(--blue-tint); }
.addr-main { font-weight: 600; font-size: .98rem; color: var(--ink); }
.addr-sec { font-size: .82rem; color: var(--ink-muted); }
.field input[data-verifying='true'] { background-image: linear-gradient(90deg, transparent 0 60%, var(--blue-tint) 60% 100%); background-size: 200% 100%; animation: verifying 1s linear infinite; }
@keyframes verifying { from { background-position: 100% 0; } to { background-position: -100% 0; } }
@media (max-width: 520px) { .field-row { grid-template-columns: 1fr; gap: 0; } }
/* City / State / ZIP share one row on the final step and keep sharing it on a
   phone — State and ZIP are short enough, and stacking them pushes the submit
   button below the fold (see tools/fold.cjs). */
.quote-card .field-row--csz { grid-template-columns: 1.5fr .85fr 1fr; }
@media (max-width: 520px) { .quote-card .field-row--csz { grid-template-columns: 1.4fr .8fr .95fr; gap: 8px; } }
@media (max-width: 360px) { .quote-card .field-row--csz { gap: 6px; } }
/* The State <select> and ZIP sit in narrow columns — let the chevron and the
   placeholder shrink with them instead of clipping. */
.quote-card .field-row--csz .field select { padding-right: 26px; background-position: right 8px center; }

.consent {
  display: flex; gap: 12px; align-items: flex-start;
  background: var(--bg-alt); border: 1px solid var(--line);
  border-radius: var(--radius); padding: 16px; margin: 18px 0;
}
.consent input[type='checkbox'] {
  flex-shrink: 0; width: 22px; height: 22px; margin: 2px 0 0;
  accent-color: var(--red); cursor: pointer;
}
.consent label {
  font-family: var(--font-ui); font-size: .76rem; line-height: 1.6; color: var(--ink-soft);
  cursor: pointer;
}
.consent a { color: var(--blue); font-weight: 600; }
.consent[data-invalid='true'] { border-color: var(--red); background: var(--red-tint); }

.qnav { display: flex; gap: 12px; align-items: center; margin-top: 22px; }
/* Chooser: the call CTA replaces Continue and spans the full card width. */
.qnav--call { display: block; }
.qnav--call .btn--call { width: 100%; }
.qnav .btn--primary { flex: 1; font-size: 1.15rem; padding: 19px 34px; }
.btn-arrow { width: 1.15em; height: 1.15em; flex-shrink: 0; }
.qback {
  background: none; border: 0; cursor: pointer; flex-shrink: 0;
  font-family: var(--font-ui); font-weight: 600; font-size: .92rem; color: var(--ink-muted);
  padding: 14px 12px; border-radius: 8px;
  display: inline-flex; align-items: center; gap: 6px;
}
.qback:hover { color: var(--blue); background: var(--blue-tint); }
.qback svg { width: 14px; height: 14px; }

.hp { position: absolute; left: -9999px; opacity: 0; height: 0; width: 0; overflow: hidden; }

/* Lock + secure message under the quiz buttons — centered, 10px. */
.secure-note {
  display: flex; align-items: center; justify-content: center; gap: 6px;
  font-family: var(--font-ui);
  font-size: 10px; line-height: 1.4;
  color: var(--ink-muted);
  margin: 10px 0 0;
  text-align: center;
}
.secure-note svg { width: 12px; height: 12px; flex-shrink: 0; color: var(--blue); }


.qdone { text-align: center; padding: 20px 0 8px; }
.qdone-icon {
  width: 72px; height: 72px; margin: 0 auto 1.25rem; border-radius: 50%;
  background: var(--blue); color: var(--white); display: grid; place-items: center;
}
.qdone-icon svg { width: 36px; height: 36px; }
.qdone h2 { font-size: 1.6rem; }
.qdone p { color: var(--ink-soft); font-size: 1rem; }
.qdone .ref {
  font-family: var(--font-ui); font-size: .8rem; color: var(--ink-muted);
  background: var(--bg-alt); border: 1px solid var(--line);
  border-radius: 8px; padding: 10px 14px; display: inline-block; margin-top: 1rem;
}

.form-alert {
  display: none; padding: 14px 16px; border-radius: var(--radius);
  font-family: var(--font-ui); font-size: .9rem; font-weight: 600;
  margin-bottom: 16px;
}
.form-alert[data-show='true'] { display: block; }
.form-alert--error { background: var(--red-tint); border: 1px solid var(--red); color: var(--red-dark); }
.form-alert--ok { background: var(--blue-tint); border: 1px solid var(--blue); color: var(--blue); }

.spinner {
  width: 18px; height: 18px; border: 2.5px solid rgba(255, 255, 255, .35);
  border-top-color: #fff; border-radius: 50%;
  animation: spin .6s linear infinite; display: none;
}
.btn[data-loading='true'] .spinner { display: block; }
.btn[data-loading='true'] .btn-text { opacity: .75; }
@keyframes spin { to { transform: rotate(360deg); } }

/* ================== ABOVE-THE-FOLD COMPACTION ==================
   HARD REQUIREMENT: 100% of the quote card is visible above the fold on every
   device, for every step — including the tall final contact step. It applies on
   narrow screens AND on short screens (720p/768p laptops), because the binding
   constraint is viewport HEIGHT, not width. Verified by tools/fold.cjs. */
@media (max-width: 900px), (max-height: 1200px) {
  .quote-head { padding: 14px 16px 0; }
  .quote-head h2 { font-size: 1.04rem; line-height: 1.25; margin-bottom: 0; }
  .quote-head p { display: none; }

  .progress { padding: 10px 16px 0; }
  .progress-track { height: 5px; }
  .progress-label { font-size: .68rem; margin-top: 5px; }

  .quote-body { padding: 12px 16px 16px; }

  .quote-card legend, .quote-card .qtitle { font-size: 1.6rem; margin-bottom: .25em; }
  .qhelp { font-size: .72rem; line-height: 1.45; margin-bottom: .5rem; }

  .opts { gap: 7px; margin-top: .6rem; }
  .opt label {
    min-height: 44px;               /* keep the 44px tap-target floor */
    padding: 9px 13px; gap: 10px;
    font-size: 1rem;
  }
  .opt label::before { width: 17px; height: 17px; }
  .opt input:checked + label::before { box-shadow: inset 0 0 0 4px var(--red); }

  .field { margin-bottom: 9px; }
  .field label, .field .flabel { font-size: .74rem; margin-bottom: 3px; }
  .field input, .field select {
    padding: 10px 12px;
    font-size: 16px;                /* < 16px makes iOS Safari zoom on focus */
  }
  .field select { background-position: right 12px center; padding-right: 36px; }
  .field-error { font-size: .72rem; margin-top: 3px; }

  /* Two columns even at 320px — stacking these blows the fold budget. */
  .field-row { grid-template-columns: 1fr 1fr; gap: 10px; }

  .consent { padding: 9px 11px; margin: 10px 0; gap: 9px; }
  .consent label { font-size: .63rem; line-height: 1.45; }
  .consent input[type='checkbox'] { width: 19px; height: 19px; }

  .opts--grid { gap: 8px; }
  .opts--grid .opt label { min-height: 70px; padding: 10px 6px; font-size: .84rem; gap: 6px; }
  .opts--grid .opt label svg { width: 21px; height: 21px; }
  .opts--grid .opt:last-child:nth-child(odd) label { min-height: 48px; }

  .qnav { margin-top: 12px; gap: 8px; }
  .qnav .btn { padding: 15px 18px; font-size: 1.05rem; }
  .qback { padding: 12px 10px; font-size: .86rem; }
  .quote-card .btn-note { display: none; }
}

/* Short viewports: reclaim hero padding and drop non-essential form chrome. */
@media (max-height: 820px) {
  .hero { padding-top: 16px; padding-bottom: 26px; }
  .hero--stack .hero-stack { gap: .9rem; }
  .hero--form.hero--stack .hero-stack { gap: .6rem; }
  .hero--form.hero--stack .hero-split { row-gap: .6rem; }
  .hero--form.hero--stack { padding-top: 8px; padding-bottom: 18px; }
  .breadcrumbs ol { padding: 7px 0; }
  .qstep .qhelp { display: none; }
  .qstep--contact .qtitle + .qhelp { display: block; }   /* contact-step subline stays visible (user-directed) */
  /* Homepage chooser tiles only (.opts--grid is used nowhere else), so this
     buys fold budget for the headline without touching the funnel steps. */
  .opts--grid { gap: 6px; }
  .opts--grid .opt label { min-height: 56px; font-size: .8rem; gap: 4px; padding: 8px 6px; }
  .opts--grid .opt label svg { width: 19px; height: 19px; }
  .opts--grid .opt:last-child:nth-child(odd) label { min-height: 46px; }
  .secure-note { margin-top: 7px; }
  .call-prompt { font-size: .76rem; margin: 10px 0 6px; }
}

/* Phones: the field labels become placeholders. The <label> stays in the DOM,
   visually hidden, so screen readers and `for=`/`id=` pairing still work. */
@media (max-width: 900px) {
  .quote-card .field > label {
    position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px;
    overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; border: 0;
  }
}

/* Very short viewports (iPhone SE/8 at 667, SE w/ chrome, 720p laptops). */
@media (max-height: 700px) {
  .secure-note { margin-top: 5px; gap: 5px; }
  .call-prompt { font-size: .72rem; margin: 8px 0 5px; }
  .consent { margin: 8px 0; }
  .progress-label { display: none; }
  .progress { padding-bottom: 2px; }
  .quote-head h2 { font-size: .96rem; }
  .quote-body { padding: 10px 14px 14px; }
  .quote-card legend, .quote-card .qtitle { font-size: 1.4rem; }
  .opts { gap: 6px; }
  .opt label { min-height: 44px; padding: 8px 12px; font-size: .95rem; }
  .field { margin-bottom: 7px; }
  .consent { padding: 8px 10px; margin: 8px 0; }
  .consent label { font-size: .58rem; line-height: 1.38; }
  .hero { padding-top: 8px; padding-bottom: 20px; }
  .qnav { margin-top: 9px; }
  .hero--stack .hero-stack { gap: .7rem; }
  .hero--stack .eyebrow { font-size: .64rem; margin-bottom: .25rem; }
  .hero--stack h1 { font-size: 1.3rem; }
  .hero--form.hero--stack h1 { font-size: 1.1rem; }
  .hero--form.hero--stack .hero-stack { gap: .45rem; }
  .hero--form.hero--stack .hero-split { row-gap: .45rem; }
  .hero-stack .trust-row { margin-top: .75rem; }
  .opts--grid .opt label { min-height: 52px; }
}

/* Smallest phones (320×568, or a 375 device once Safari's chrome is subtracted). */
@media (max-height: 620px) {
  .secure-note { margin-top: 4px; }
  .call-prompt { font-size: .7rem; margin: 6px 0 4px; }
  :root { --header-h: 52px; }
  .logo img { height: 27px; }
  .breadcrumbs ol { padding: 5px 0; font-size: .7rem; }
  .quote-head { padding: 11px 14px 0; }
  .quote-head h2 { font-size: .92rem; }
  .progress { padding: 7px 14px 0; }
  .quote-body { padding: 9px 14px 12px; }
  .quote-card legend, .quote-card .qtitle { font-size: 1.2rem; margin-bottom: .2em; }
  .opts { gap: 5px; margin-top: .5rem; }
  .opt label { padding: 7px 11px; font-size: .84rem; }
  .opts--grid { gap: 4px; }
  .opts--grid .opt label { min-height: 46px; font-size: .78rem; gap: 2px; }
  .opts--grid .opt label svg { width: 16px; height: 16px; }
  .opts--grid .opt:last-child:nth-child(odd) label { min-height: 44px; }
  .field { margin-bottom: 6px; }
  .field input, .field select { padding: 9px 11px; }
  .consent { padding: 7px 9px; margin: 4px 0; gap: 8px; }
  .consent label { font-size: .55rem; line-height: 1.35; }
  .qnav { margin-top: 8px; }
  .qnav .btn { padding: 12px 16px; font-size: .92rem; }
  .hero--stack .hero-stack { gap: .45rem; }
  .hero--stack .eyebrow { font-size: .6rem; margin-bottom: .18rem; }
  .hero--stack h1 { font-size: 1.08rem; }
  .hero--form.hero--stack h1 { font-size: 1rem; }
  .hero--form.hero--stack .hero-stack { gap: .35rem; }
  .hero--form.hero--stack .hero-split { row-gap: .35rem; }
  /* On the shortest phones the card's own heading is dropped: the page
     headline sits right above it and says the same thing. */
  .hero--stack .quote-head { display: none; }
}

/* 320px-wide phones need one more notch. Button padding is deliberately left
   at >=13px so tap targets stay above the 44px floor. */
@media (max-width: 360px) {
  .quote-head h2 { font-size: .88rem; }
  .quote-card legend, .quote-card .qtitle { font-size: 1.1rem; }
  .opts--grid { gap: 4px; }
  .opts--grid .opt label { min-height: 46px; font-size: .72rem; gap: 2px; }
  .opts--grid .opt label svg { width: 16px; height: 16px; }
  .opt label { font-size: .82rem; padding: 7px 10px; }
  .field { margin-bottom: 4px; }
  .field input, .field select { padding: 8px 10px; }
  .consent { padding: 6px 8px; margin: 4px 0; gap: 7px; }
  .consent label { font-size: .5rem; line-height: 1.28; }
}

@media (max-width: 900px) {
  /* Taller nav bar. Stepped down on short viewports because a bigger header
     eats the fold budget and the quote card must stay fully above the fold. */
  :root { --header-h: 76px; }
  .logo img { height: 30px; }
  /* Keep the trail on ONE line — a wrapped breadcrumb costs ~26px of fold
     budget on deep pages. It scrolls horizontally inside its own container,
     so the page body never scrolls sideways. */
  .breadcrumbs ol {
    padding: 8px 0; font-size: .74rem;
    flex-wrap: nowrap; overflow-x: auto; scrollbar-width: none;
  }
  .breadcrumbs ol::-webkit-scrollbar { display: none; }
  .breadcrumbs li { white-space: nowrap; flex-shrink: 0; }
}

/* User-directed 2026-08-17: on phones the hamburger is GONE (the drawer nav is
   desktop/tablet only; phones reach the other pages through the footer) and
   the call button is bigger and pinned to the RIGHT edge of the bar. Overrides
   the ≤1160px "centered between wordmark and hamburger" rule above and the
   narrow-phone step-downs below (hence the later, more specific selectors). */
@media (max-width: 900px) {
  .nav-toggle { display: none !important; }
  .header-cta { justify-content: flex-end; }
  .header-bar .header-cta .btn--call {
    padding: 16px 18px;
    font-size: 1.02rem;
    gap: 8px;
    border-radius: 14px;
    white-space: nowrap;
  }
  .header-bar .header-cta .call-icon { width: 1.1em; height: 1.1em; }
  /* User-directed 2026-08-17 (night): bigger wordmark, same 76px sticky bar */
  .header-bar .logo img { height: clamp(24px, 7.7vw, 30px); }
  .header-bar .logo { flex-shrink: 0; }
}
@media (max-width: 380px) {
  .header-bar .header-cta .btn--call { padding: 15px 14px; font-size: .95rem; gap: 6px; }
}
@media (max-width: 345px) {
  .header-bar .header-cta .btn--call { padding: 14px 11px; font-size: .88rem; gap: 5px; }
}

@media (max-width: 900px) and (max-height: 700px) { :root { --header-h: 66px; } }
@media (max-width: 900px) and (max-height: 620px) { :root { --header-h: 58px; } }

/* Narrow phones: step the wordmark, button and hamburger down together so the
   three never collide. Sizes proven across 320-1000px by tools/header.cjs. */
@media (max-width: 460px) {
  /* viewport-fit=cover runs the layout to the physical screen edges, so the
     gutter has to clear the safe-area inset (rounded corners, notch) rather
     than assume a flat rectangle. max() keeps the normal 14px when the inset
     is 0, e.g. on a flat-edged phone or in a desktop browser. */
  .wrap {
    padding-left: max(14px, env(safe-area-inset-left));
    padding-right: max(14px, env(safe-area-inset-right));
  }
  .logo img { height: 24px; }
  .header-cta .btn--call { padding: 14px 12px; font-size: .88rem; gap: 7px; }
  .header-cta .call-icon { width: .95em; height: .95em; }
  .nav-toggle { padding: 8px; margin-right: -8px; }
  .nav-toggle span { width: 22px; }
}
@media (max-width: 380px) {
  .logo img { height: 21px; }
  .header-cta .btn--call { padding: 14px 9px; font-size: .8rem; gap: 5px; }
}
@media (max-width: 340px) {
  .wrap {
    padding-left: max(10px, env(safe-area-inset-left));
    padding-right: max(10px, env(safe-area-inset-right));
  }
  .logo img { height: 19px; }
  .header-cta .btn--call { padding: 16px 7px; font-size: .74rem; gap: 4px; }
  .nav-toggle { padding: 6px; margin-right: -6px; }
  .nav-toggle span { width: 20px; }
}

/* ============================== CTA BAND ============================== */
.cta-band {
  background: var(--blue);
  color: var(--white);
  text-align: center;
  padding: clamp(3rem, 6vw, 4.5rem) 0;
}
.cta-band h2 { color: var(--white); }
.cta-band p { color: rgba(255, 255, 255, .86); max-width: 56ch; margin: 0 auto 2rem; }
.cta-band .btn-note { color: rgba(255, 255, 255, .68); }
.cta-band-buttons { display: flex; flex-wrap: wrap; gap: 14px; justify-content: center; }
@media (max-width: 480px) { .cta-band-buttons { flex-direction: column; } .cta-band-buttons .btn { width: 100%; } }

/* ============================== CONTACT PAGE ============================== */
.contact-grid {
  display: grid; grid-template-columns: 1fr 1fr;
  gap: 3.5rem; align-items: start; max-width: 1000px;
}
@media (max-width: 860px) { .contact-grid { grid-template-columns: 1fr; gap: 2.5rem; } }

/* ============================== PROSE (legal + content pages) ============================== */
.prose { max-width: 76ch; }
.prose h2 { font-size: 1.5rem; margin-top: 2.5rem; }
.prose h3 { font-size: 1.15rem; margin-top: 1.75rem; color: var(--ink); }
.prose h2:first-child, .prose h3:first-child { margin-top: 0; }
.prose ul, .prose ol { margin-bottom: 1.25em; }
.prose li { color: var(--ink-soft); }
.prose p { color: var(--ink-soft); }
.prose table {
  width: 100%; border-collapse: collapse; margin: 1.5rem 0;
  font-family: var(--font-ui); font-size: .9rem;
}
.prose th, .prose td { border: 1px solid var(--line); padding: 12px 14px; text-align: left; }
.prose th { background: var(--bg-alt); font-weight: 700; color: var(--blue); }
.prose-updated {
  font-family: var(--font-ui); font-size: .85rem; color: var(--ink-muted);
  padding-bottom: 1.5rem; margin-bottom: 2rem; border-bottom: 1px solid var(--line);
}
.table-scroll { overflow-x: auto; -webkit-overflow-scrolling: touch; }

.callout {
  background: var(--blue-tint); border-left: 4px solid var(--blue);
  border-radius: 0 var(--radius) var(--radius) 0;
  padding: 18px 22px; margin: 1.75rem 0;
  font-family: var(--font-ui); font-size: .93rem; color: var(--ink-soft); line-height: 1.7;
}
.callout--warn { background: var(--red-tint); border-left-color: var(--red); }
.callout strong { color: var(--ink); }

/* ============================== SITEMAP PAGE ============================== */
.sitemap-grid { display: grid; gap: 36px; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); }
.sitemap-col h2 { font-size: 1.15rem; padding-bottom: .6rem; border-bottom: 2px solid var(--red); margin-bottom: 1rem; }
.sitemap-col ul { list-style: none; padding: 0; margin: 0; }
.sitemap-col li { margin-bottom: .6em; }
.sitemap-col a { font-family: var(--font-ui); font-size: .94rem; font-weight: 600; color: var(--ink-soft); text-decoration: none; }
.sitemap-col a:hover { color: var(--red); text-decoration: underline; }
.sitemap-col ul ul { padding-left: 16px; margin-top: .6em; border-left: 2px solid var(--line); }
.sitemap-col ul ul a { font-weight: 400; }

/* ============================== FOOTER ============================== */
/* User-directed 2026-08-17: WHITE footer, medium-grey text + links (#6b7075). */
.site-footer { background: #FFFFFF; color: #6b7075; padding: 3.5rem 0 0; }  /* no separator lines (user-directed 2026-08-17) */
/* Logo only, centred (user-directed 2026-08-17; the link columns are gone). */
.footer-top {
  display: flex; justify-content: center;
  padding-bottom: .75rem;  /* tighter logo→links (user-directed 2026-08-17; was 2.5rem + 24px band padding) */
}
.footer-brand { text-align: center; }
.footer-brand img { height: 17px; width: auto; }  /* 50% of the previous 34px (user-directed 2026-08-17) */
.footer-brand p {
  font-family: var(--font-ui); font-size: .85rem; line-height: 1.7;
  color: rgba(255, 255, 255, .7); margin: 1rem 0 0; max-width: 34ch;
}
.footer-col h3 {
  font-family: var(--font-ui); font-size: .78rem; font-weight: 700;
  letter-spacing: .1em; text-transform: uppercase; color: var(--white); margin-bottom: 1rem;
}
.footer-col ul { list-style: none; padding: 0; margin: 0; }
.footer-col li { margin-bottom: .55em; }
.footer-col a {
  font-family: var(--font-ui); font-size: .88rem; color: rgba(255, 255, 255, .72); text-decoration: none;
}
.footer-col a:hover { color: var(--white); text-decoration: underline; }



/* Global footer disclaimer band — 90% width, 9px, gray keyed to dark blue bg */
#qa-global-footer {
  width: 90%; max-width: 90%; margin: 0 auto;
  padding: 10px 0 28px;
}
#qa-global-footer, #qa-global-footer * { font-size: 9px !important; }
#qa-global-footer {
  font-family: var(--font-ui);
  line-height: 1.75;
  color: #6b7075;
}
#qa-global-footer { text-align: center; }
#qa-global-footer p { margin: 0 0 10px; }
#qa-global-footer strong { color: #6b7075; font-weight: 700; }
#qa-global-footer a { color: #6b7075; text-decoration: underline; }
#qa-global-footer a:hover { color: var(--ink); }
.footer-legal-links {
  display: flex; flex-wrap: wrap; justify-content: center; gap: 6px 14px;
  margin: 0 0 16px; padding: 0; list-style: none;
}
.footer-legal-links li { margin: 0; }
.footer-copy {
  margin-top: 14px; padding-top: 14px;
}

/* ============================== UTIL ============================== */
.visually-hidden {
  position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px;
  overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; border: 0;
}
.mt-0 { margin-top: 0; }
.mb-2 { margin-bottom: 2rem; }
.stack > * + * { margin-top: 1.5rem; }

@media print {
  .site-header, .site-footer, .quote-card, .cta-band, .breadcrumbs { display: none !important; }
}

/* ================== CHOOSER TILES (homepage card) ==================
   User-directed 2026-08-07: three tiles per row on desktop, and the category
   names set at 26px on desktop / 22px on phones. These rules sit at the end of
   the sheet on purpose — they must win over the fold-compaction tiers above. */
.opts--grid .opt label { font-size: 22px; line-height: 1.2; }
.opts--grid .opt label svg { width: 24px; height: 24px; }

@media (min-width: 901px) {
  .hero-stack .hero-card { max-width: 920px; }
  /* Uniform tile height across all three rows, not just within a row. */
  .opts--grid { grid-template-columns: repeat(3, 1fr); gap: 12px; grid-auto-rows: 1fr; }
  .opts--grid .opt label { font-size: 24px; min-height: 96px; height: 100%; padding: 14px 10px; gap: 8px; }
  .opts--grid .opt label svg { width: 30px; height: 30px; }
  /* With three columns the odd-one-out must not span the full row. */
  .opts--grid .opt:last-child:nth-child(odd) { grid-column: auto; }
  .opts--grid .opt:last-child:nth-child(odd) label {
    flex-direction: column; gap: 8px; min-height: 96px;
  }
}

/* Phones: the 22px names wrap to two lines, so the tile chrome around them is
   trimmed to whatever still clears the 44px tap-target floor. */
@media (max-width: 900px) {
  .opts--grid { gap: 6px; }
  .opts--grid .opt label { min-height: 0; height: 100%; padding: 8px 6px; gap: 4px; }
  .opts--grid .opt label svg { width: 20px; height: 20px; }
}
/* Short laptops keep the 26px names but lose the tile padding. */
@media (min-width: 901px) and (max-height: 800px) {
  .opts--grid { gap: 8px; }
  .opts--grid .opt label,
  .opts--grid .opt:last-child:nth-child(odd) label { min-height: 72px; padding: 9px 8px; gap: 5px; }
  .opts--grid .opt label svg { width: 24px; height: 24px; }
}

/* ================== HERO — AMANDA (homepage + every quiz page) ==================
   Amanda is the face of the brand, so on desktop she anchors the left of the
   hero and the whole chooser stack moves right. User-directed 2026-08-17: the 11
   quiz (form) pages carry the same `.hero--amanda` figure, on phones too — the
   figure/card split below applies to the quiz card exactly as to the chooser. She stands at 80% of the
   viewport height, vertically centred against the stack beside her.

   Phones get no figure at all: the chooser card owns the mobile fold, and a
   full-height portrait next to it would push the tiles under. Painting her as a
   background rather than an <img> is what keeps phones from paying to download
   an asset they never render. */
.hero-figure { display: none; }

@media (min-width: 901px) {
  .hero--amanda .hero-split {
    display: grid;
    /* She is a tall, narrow portrait — a quarter of the band is enough to read
       her at full height, and the stack keeps the rest. */
    grid-template-columns: minmax(220px, 25%) minmax(0, 1fr);
    align-items: center;
    gap: clamp(1.25rem, 3vw, 3rem);
    /* Same wrap as the header (the default 1180px). It used to be 1400px, which
       started the hero 110px left of the header and put Amanda well left of the
       logo. Sharing the container is what lets her align with it. The chooser
       card is capped at 720px now, so the extra width is no longer needed. */
  }

  .hero--amanda .hero-figure {
    display: block;
    height: 80vh;
    /* PNG first so browsers without image-set() still get her; the webp is a
       quarter of the weight for everything since ~2023. */
    background-image: url('/assets/img/amanda-v3.png');
    background-image: image-set(
      url('/assets/img/amanda-v3.webp') type('image/webp'),
      url('/assets/img/amanda-v3.png') type('image/png')
    );
    /* contain + center is what makes her responsive: she scales to whatever the
       column allows and never distorts or overflows it, while the 80vh height
       holds. */
    background-repeat: no-repeat;
    background-size: contain;
    background-position: center center;
  }

  /* The stack no longer has the full wrap to itself, so the card stops trying
     to hold the 920px it claims when it is the only thing in the band.
     User-directed 2026-08-11: desktop goes the other way from mobile — the card
     is capped well short of its column and centred in the space, so it reads as
     a compact panel next to Amanda rather than a wall of tiles. */
  .hero--amanda .hero-stack .hero-card {
    max-width: 720px;
    margin-inline: auto;
  }
  /* User-directed 2026-08-17: on desktop the homepage stack (headline, chooser,
     badge, trust row) sits 80px higher than its centred position beside Amanda. */
  .hero--home.hero--amanda .hero-stack { position: relative; top: -10px; }  /* user-directed 2026-08-17: -80 → +20 → -10 */

  /* Tiles shrink to match: 24px/96px was sized for a full-width card.
     Gap = the panel's 22px side padding (user-directed 2026-08-17, was 10px). */
  .hero--amanda .opts--grid { gap: 22px; }
  .hero--amanda .opts--grid .opt label,
  .hero--amanda .opts--grid .opt:last-child:nth-child(odd) label {
    font-size: 17px;
    min-height: 74px;
    padding: 11px 8px;
    gap: 6px;
  }
  .hero--amanda .opts--grid .opt label svg { width: 23px; height: 23px; }
}

/* ---------- Phones: Amanda 30% left, chooser 70% right (user-directed 2026-08-17, was 40/60) ----------
   User-directed 2026-08-11. The headline and the supporting copy still run the
   full width — only the chooser sits beside her — so `display: contents` hoists
   the stack's three children into this grid to be placed individually.
   The tiles go one-per-row and swap to a horizontal icon+label, which is what
   halves their height: at 60% of a phone the stacked layout wrapped every
   name onto a second line. */
@media (max-width: 900px) {
  .hero--amanda .hero-split {
    display: grid;
    /* 40/60 must be of the SCREEN, so the wrap's own side padding is dropped
       here and handed back to the full-width rows below — otherwise the
       padding comes off the top and Amanda measures ~35%, not 40%. */
    padding-left: 0;
    padding-right: 0;
    /* minmax(0, …) not a bare percentage: a bare track cannot stop an item
       whose min-content is wider than the track from spilling past it, and that
       spill is what pushed the cards off the right of the screen. */
    /* The cards column is deliberately NARROWER than the space available: 40%
       for Amanda + 50% for the cards leaves the remaining ~10% as clear space
       on the right. The cards used to take the whole remainder and run to the
       edge. Tile type steps down to match (see below). */
    /* Amanda takes 40%, the cards take everything left over. The two tracks plus
       the gap add up to exactly the 95% block, so the content fills it edge to
       edge — no spacer, and the full-width rows below (grid-column: 1 / -1)
       still span the whole block. */
    grid-template-columns: minmax(0, 30%) minmax(0, 1fr);
    column-gap: 8px;
    row-gap: .75rem;
  }
  .hero--amanda .hero-stack { display: contents; }
  /* Every grid item opts out of the automatic min-content floor. Without this a
     single unbreakable word inside any of them widens the whole row. */
  .hero--amanda .hero-figure,
  .hero--amanda .hero-head,
  .hero--amanda .hero-card,
  .hero--amanda .hero-foot { min-width: 0; max-width: 100%; }
  .hero--amanda .hero-head,
  .hero--amanda .hero-foot {
    grid-column: 1 / -1;
    /* The 95% block is the gutter now, so these align flush with the figure and
       the cards rather than carrying an extra inset of their own. */
    padding-inline: 0;
  }

  .hero--amanda .hero-figure {
    display: block;
    grid-column: 1;
    grid-row: 2;
    /* Stretch to whatever the chooser beside her is tall. She is anchored to
       the TOP of that box, and the asset is cropped to her bounding box, so the
       image's top edge IS the top of her head — it lands level with the top of
       the cards. (User-directed 2026-08-11; she was bottom-anchored before.) */
    align-self: stretch;
    background-image: url('/assets/img/amanda-sm-v3.png');
    background-image: image-set(
      url('/assets/img/amanda-sm-v3.webp') type('image/webp'),
      url('/assets/img/amanda-sm-v3.png') type('image/png')
    );
    background-repeat: no-repeat;
    background-size: contain;
    background-position: center top;
  }
  /* Amanda is flush to the left screen edge, which reads as deliberate for a
     figure. The card cannot do the same — it has a rounded border and a shadow,
     and those touching the edge read as broken — so it keeps a small inset and
     renders at 60% minus that. */
  .hero--amanda .hero-card {
    grid-column: 2;
    grid-row: 2;
    /* Both sides must be set: the stacked-hero rule above leaves margin-inline
       at `auto`, and a single auto margin on a grid item swallows the inset.
       `width: auto` is required too — `.hero-stack > *` pins width to 100% of
       the grid area, which leaves the margin nothing to take from. */
    width: auto;
    /* No inset of its own any more — the 95% block above is what holds the
       cards off the right edge. */
    margin-left: 0;
    margin-right: 0;
  }

  /* The card is in a 60% column now, so its own chrome has to give up width. */
  /* User-directed 2026-08-17: side padding = the visible top gap above the
     tiles (12px padding + ~11px grid margin ≈ 23px), so 22px + 1px border.
     Tiles get narrower on phones as a result — intended. */
  .hero--home.hero--amanda .quote-card .quote-body { padding: 12px 22px 22px; }
  /* Bottom = top: the visible gap above the tiles is 12px padding + the grid's
     top margin (~11px; ~9px on short phones), hence 22px, or 20px on short. */
  @media (max-height: 620px) { .hero--home.hero--amanda .quote-card .quote-body { padding-bottom: 20px; } }
  .hero--home.hero--amanda .quote-card .quote-head { padding: 10px 8px 8px; }


  .hero--amanda .opts--grid { grid-template-columns: minmax(0, 1fr); gap: 8px; } /* 8px user-directed 2026-08-17 (was 5) */
  .hero--amanda .opts--grid .opt { min-width: 0; }
  /* A category name must be allowed to break rather than set a floor on the
     card's width — "Window Replacement" is the long one. */
  .hero--amanda .opts--grid .opt label span { min-width: 0; overflow-wrap: anywhere; }
  .hero--amanda .opts--grid .opt label,
  .hero--amanda .opts--grid .opt:last-child:nth-child(odd) label {
    min-width: 0;
    flex-direction: row;
    justify-content: flex-start;
    text-align: left;
    /* 44px is the tap-target floor — the tiles land on it exactly rather than
       going under it. */
    min-height: 46px;
    padding: 6px 10px;
    gap: 9px;
    font-size: 17px;   /* user-directed 2026-08-17: 17px on all phones (was 15) */
    line-height: 1.15;
  }
  .hero--amanda .opts--grid .opt label svg { width: 20px; height: 20px; }
}

/* ---------- Homepage phones: Amanda as tall as the chooser card ----------
   User-directed 2026-08-17. In a 30% column she was width-limited (~107px wide,
   ~285px tall). She now sizes by HEIGHT — the full card row, same aspect — and
   whatever width that needs beyond her column runs under the card (her hand on
   hip goes beneath it, as agreed). The figure box is made wide and layered under
   the card, so the card keeps every tap. */
@media (max-width: 900px) {
  .hero--home.hero--amanda .hero-figure {
    width: 70vw;              /* generous box; the image is left-anchored inside it */
    max-width: none;
    background-size: auto 100%;
    background-position: left top;
    position: relative;
    z-index: 0;
    left: -5px;               /* user-directed 2026-08-17: 5px further left */
  }
  .hero--home.hero--amanda .hero-card { position: relative; z-index: 1; }
}

/* ---------- Quiz pages: the "hand on the form" Amanda ----------
   User-directed 2026-08-17. Quiz pages use their own photo (amanda-quiz.*):
   Amanda in profile, right hand raised. The crop is tight, so her fingertips
   ARE the image's right edge (at ~22% of its height). The rules below make
   that edge the card's left edge: no column gap, image anchored right, and a
   3px overlap so the fingertips read as resting ON the card rather than beside
   it. Homepage keeps the front-facing amanda-v3 asset. */
.hero--form.hero--amanda .hero-figure {
  background-image: url('/assets/img/amanda-quiz.png');
  background-image: image-set(
    url('/assets/img/amanda-quiz.webp') type('image/webp'),
    url('/assets/img/amanda-quiz.png') type('image/png')
  );
  background-position: right top;
  position: relative;
  z-index: 1;
  margin-right: -3px;
}
@media (min-width: 901px) {
  .hero--form.hero--amanda .hero-split {
    /* figure sized by its own aspect, card column = the 40vw the card claims;
       the pair is centred as a unit. */
    grid-template-columns: auto minmax(0, 40vw);
    justify-content: center;
    column-gap: 0;
    align-items: start;
  }
  .hero--form.hero--amanda .hero-figure {
    height: 80vh;
    width: calc(80vh * 0.4627);   /* 892 / 1928 */
    /* the wordmark-centring nudge is a homepage concern */
    transform: none;
  }
  .hero--form.hero--amanda .hero-stack .hero-card { margin-inline: 0; }
}
@media (max-width: 900px) {
  /* User-directed 2026-08-17 (later): on phones the quiz pages use a THIRD
     Amanda (amanda-board-sm — see the block below) centred ABOVE the quiz card;
     the card takes the full width. */
  .hero--form.hero--amanda .hero-split {
    /* User-directed 2026-08-17 (night): Amanda LEFT, the headline beside her
       on the right ("Instant" over "<vertical> Quote"), vertically centred on
       her; the card spans both columns below. */
    column-gap: 8px;
    grid-template-columns: auto minmax(0, 1fr);
    row-gap: .5rem;
    align-items: start;
  }
  .hero--form.hero--amanda .hero-head {
    grid-column: 2; grid-row: 1;
    /* User-directed 2026-08-17 (night): the top of "Instant" lines up with the
       top of Amanda's head — both start at the row's top edge. */
    align-self: start;
    text-align: center;
    padding-inline: 0;
    margin: 0;
  }
  /* User-directed 2026-08-17 (night): 30px on phones, centred in its column.
     The "<vertical> Quote" lines shrink (app.js fitHeroHead) only when a word
     would not fit the column or the block would run under the card. */
  .hero--form.hero--amanda .hero-head h1 { text-align: center; margin: 0; font-size: 30px; line-height: 1.08; }
  .hero--form.hero--amanda .hero-head .h1-a { line-height: 1; }
  .hero--form.hero--amanda .hero-head .h1-b { margin-top: .12em; letter-spacing: -0.01em; }
  .hero--form.hero--amanda .hero-head .h1-a,
  .hero--form.hero--amanda .hero-head .h1-b { display: block; }
  /* User-directed 2026-08-17 (later still): the phone quiz pages use the
     "board" Amanda (amanda-board-sm: leaning on a white board, hands hanging
     over its top edge) and THE QUIZ CARD IS THE BOARD. Two layers of the same
     560x466 crop, pixel-aligned: the bust (background, everything above the
     board's top edge) sits behind the card, and `::after` paints an arms
     cutout ABOVE the card: forearms from ~16px above the board edge down
     through the fingers (identical pixels to the bust where they overlap it,
     so no seam), everything else masked. Layers: bust < card < arms — the
     card's top border, placed exactly at the board edge (24% up from the
     crop's bottom, y=354 of 466), runs BEHIND her forearms; her fingertips
     reach the bottom, so the card's content starts 24% further down. */
  .hero--form.hero--amanda .hero-split { --qfig: min(172px, 44vw); }   /* her head top = top of "Instant"; the headline shrinks to fit beside her */
  .hero--form.hero--amanda .hero-figure {
    grid-column: 1;
    grid-row: 1;
    align-self: start;
    height: var(--qfig);
    width: calc(var(--qfig) * 1.2017);   /* 560 / 466 */
    max-width: 100%;
    margin: 0;
    position: relative;
    z-index: auto;                 /* no stacking context: lets ::after rise above the card */
    background-image: url('/assets/img/amanda-board2-sm.png');
    background-image: image-set(
      url('/assets/img/amanda-board2-sm.webp') type('image/webp'),
      url('/assets/img/amanda-board2-sm.png') type('image/png')
    );
    background-repeat: no-repeat;
    background-size: contain;
    background-position: center bottom;
  }
  .hero--form.hero--amanda .hero-figure::after {
    content: '';
    position: absolute; inset: 0;
    z-index: 2;
    pointer-events: none;
    background-image: url('/assets/img/amanda-board-arms4-sm.png');
    background-image: image-set(
      url('/assets/img/amanda-board-arms4-sm.webp') type('image/webp'),
      url('/assets/img/amanda-board-arms4-sm.png') type('image/png')
    );
    background-repeat: no-repeat;
    background-size: contain;
    background-position: center bottom;
  }
  .hero--form.hero--amanda .hero-card {
    grid-column: 1 / -1; grid-row: 2;
    position: relative; z-index: 1;
    /* up to the board edge under her forearms: 24% of the figure, plus the row gap */
    margin-top: calc(var(--qfig) * -0.239 - .5rem);
  }
  /* Her fingertips reach 24% of the figure below the card's top; the card's
     content starts under them so the hands cover only blank card. */
  .hero--form.hero--amanda .hero-card .quote-card { padding-top: calc(var(--qfig) * 0.24 - 2px); }
  .hero--form.hero--amanda .hero-foot { grid-row: 3; }
}

/* ---------- Quiz contact step on phones: Amanda steps out, card goes full width ----------
   User-directed 2026-08-17. app.js sets `.hero--contact-step` on the hero while
   the `.qstep--contact` step (7 fields + consent) is active. A 60% column
   truncates its placeholders and doubles the card's height, so on phones the
   figure hides and the card spans both tracks. Desktop is unaffected — the 25%
   column leaves the card its full 40vw. */
@media (max-width: 900px) {
  .hero--amanda.hero--contact-step .hero-figure { display: none; }
  .hero--amanda.hero--contact-step .hero-head { grid-column: 1 / -1; }
  .hero--amanda.hero--contact-step .hero-card { grid-column: 1 / -1; grid-row: 2; margin-top: 0; }
  .hero--form.hero--amanda.hero--contact-step .hero-card .quote-card { padding-top: 0; }
}

/* ---------- Phone content width: 95%, one gutter for the whole page ----------
   User-directed 2026-08-11. EVERY .wrap on a phone — header, hero, sections,
   footer — is 95% of the screen and centred, so the header lines up with the
   hero instead of running wider than it. The page declares viewport-fit=cover,
   so the layout reaches the physical screen edges (behind the rounded corners
   and safe-area insets); the 2.5% gutter each side keeps content clear of them.
   This replaces the per-breakpoint padding that used to do the job. */
@media (max-width: 900px) {
  .wrap {
    width: 95%;
    max-width: 95%;
    margin-inline: auto;
    padding-left: 0;
    padding-right: 0;
  }
  /* The hamburger carried a negative margin so it could sit outside the wrap
     padding and hug the screen edge. Under viewport-fit=cover that puts it in
     the clipped corner zone — it was running off screen. It now stays inside
     the 95% block like everything else. */
  .nav-toggle { margin-right: 0; }
  /* Nothing in the header may push a sibling out: the wordmark and the burger
     hold their size, and the call button is what gives way if space is tight. */
  .header-bar { min-width: 0; }
  .header-cta { flex: 0 1 auto; min-width: 0; }
  .header-cta .btn--call { max-width: 100%; }
  .nav-toggle, .logo { flex-shrink: 0; }
}

/* Narrow phones: the longest name ("Window Replacement") is what sets the
   floor here, so the type steps down before the tiles are allowed to wrap. */
@media (max-width: 400px) {
  .hero--amanda .opts--grid .opt label,
  .hero--amanda .opts--grid .opt:last-child:nth-child(odd) label {
    font-size: 17px; /* user-directed 2026-08-17: 17px on all phones */ padding: 6px 5px; gap: 5px;
  }
  .hero--amanda .opts--grid .opt label svg { width: 18px; height: 18px; }
}
/* ---------- "Get an Instant Quote" ----------
   User-directed 2026-08-11, replacing the two headings that used to sit inside
   the chooser card. It inherits their voice — the same blue, weight and scale
   the card's <legend> carried — so the hero still tells you what to do next now
   that the card opens straight onto the tiles. */
.hero-prompt {
  font-family: var(--font-head);
  font-weight: 800;
  color: var(--blue);
  /* User-directed 2026-08-17: bigger on all devices (was 1.28rem / 1.16 / 1.02 / 1.05 / .98). */
  font-size: 1.85rem;
  line-height: 1.25;
  letter-spacing: -0.015em;
  margin: .5rem 0 0;
}
/* Same fold discipline the removed headings were under: on short desktops and
   phones this line gives up size before the chooser card does. */
@media (min-width: 901px) and (max-height: 900px) { .hero-prompt { font-size: 1.65rem; } }
@media (min-width: 901px) and (max-height: 780px) { .hero-prompt { font-size: 1.45rem; margin-top: .35rem; } }
@media (max-width: 900px) {
  .hero-prompt { font-size: 1.4rem; margin-top: .3rem; }
  /* User-directed 2026-08-17: on phones "Get an Instant Quote" is centred over
     the CARD, not the screen — the card sits in the right column of the 30/70
     split (30% figure + 8px gap), so the line is inset by exactly that. */
  .hero--home .hero-prompt { margin-left: calc(30% + 8px); }
}
@media (max-width: 400px) { .hero-prompt { font-size: 1.3rem; } }

/* 320px devices: one more step so the longest name still holds a single line.
   Wrapping would not change the tile height — 44px is a floor, not a fit — but
   a single wrapped tile in a column of nine reads as a mistake. */
@media (max-width: 345px) {
  .hero--amanda .opts--grid .opt label,
  .hero--amanda .opts--grid .opt:last-child:nth-child(odd) label {
    font-size: 17px; padding: 5px 5px; gap: 4px;   /* user-directed 2026-08-17: 17px on all phones */
  }
  .hero--amanda .opts--grid .opt label svg { width: 15px; height: 15px; }
}

/* ================== HOMEPAGE HERO BAND ==================
   User-directed 2026-08-11: a flat #FFFFFF band. The copy is dark navy — on a
   white band white text is invisible. The chooser card is white too, so it now
   reads as a bordered panel rather than a raised one. */
.hero--home {
  background: #FFFFFF;
  border-bottom: 0;
}
/* Dark navy copy: the band is white, so white text would be invisible. */
.hero--home .eyebrow { color: var(--blue-dark); }
.hero--home h1,
.hero--home .hero-prompt { color: var(--blue-dark); }
.hero--home .hero-sub { color: var(--blue-dark); }
.hero--home .trust-row { color: var(--blue-dark); }
.hero--home .trust-row svg { color: var(--blue-dark); }

/* ================== HOMEPAGE CHOOSER CARD — NAVY PANEL ==================
   User-directed 2026-08-17: the chooser card's background is #19297D on every
   device. Only the panel changes — the category tiles stay white. The
   "Secure & encrypted" line under the tiles goes white so it stays legible. */
.hero--home .quote-card {
  background: #19297D;
  border-color: #19297D;
}
.hero--home .quote-card .secure-note { color: rgba(255, 255, 255, .88); }
.hero--home .quote-card .secure-note svg { color: #fff; }
/* Side padding equal to the visible top gap (user-directed 2026-08-17). The
   phone tier sets its own shorthand further down; this covers desktop. */
.hero--home .quote-card .quote-body { padding-left: 22px; padding-right: 22px; padding-bottom: 22px; }

/* ---------- Google rating badge (homepage, directly below the navy chooser panel) ---------- */
.grating {
  display: flex; align-items: center; justify-content: center; flex-wrap: wrap;
  gap: 4px 8px;
  margin: 0;
  font-family: var(--font-ui);
  font-size: 11.2px; line-height: 1.2; /* 20% smaller, user-directed 2026-08-17 (was 14px) */
  color: var(--blue-dark);
  text-align: center;
}
.grating-g { font-family: 'Product Sans', Inter, Arial, sans-serif; font-weight: 700; font-size: 1.55em; letter-spacing: -.02em; line-height: 1; }
.grating-g b { font-weight: 700; }
.grating-g b:nth-child(1) { color: #4285F4; }
.grating-g b:nth-child(2) { color: #EA4335; }
.grating-g b:nth-child(3) { color: #FBBC05; }
.grating-g b:nth-child(4) { color: #4285F4; }
.grating-g b:nth-child(5) { color: #34A853; }
.grating-g b:nth-child(6) { color: #EA4335; }
.grating-stars { display: inline-flex; gap: 2px; color: #FBBC05; }
.grating-stars svg { width: 1.3em; height: 1.3em; }
.grating-score { font-weight: 800; font-size: 1.3em; }
.grating-note { color: var(--ink-muted); }
@media (max-width: 900px) {
  .grating { font-size: 9.2px; gap: 3px 5px; }
  /* User-directed 2026-08-17 (phones only): badge 20px lower; the trust row
     30px lower than it was — 20 of that comes from the badge pushing it, the
     other 10 is added to its own margin (both tiers below). */
  .hero--home .grating { margin-top: 20px; }
  .hero--home .hero-stack .trust-row { margin-top: calc(.9rem + 10px); }
}
@media (max-width: 900px) and (max-height: 700px) {
  .hero--home .hero-stack .trust-row { margin-top: calc(.75rem + 10px); }
}
/* 320px phones: the badge wraps to two lines there and pushed the card 10px
   past the fold — tighter type and margin bring it back. */
@media (max-width: 345px) {
  .grating { font-size: 8px; gap: 1px 4px; }
  .grating-g { font-size: 1.45em; }
}

/* ---------- Homepage desktop headlines: 45px (user-directed 2026-08-17) ----------
   Both the H1 and the "Get an Instant Quote" line, overriding the height tiers. */
@media (min-width: 901px) {
  /* 60px, ONE line (user-directed 2026-08-17). nowrap lets the headline set the
     stack column's width; the grid takes the difference out of Amanda's column. */
  .hero--home.hero--stack h1 {
    font-size: min(60px, 4.2vw); line-height: 1.08; white-space: nowrap;
    /* Wider than its column at 60px; a block can only overflow to the RIGHT, which
       pushed its centre off the card's. Centre it on its own midpoint instead
       (user-directed 2026-08-17: "make sure everything is centered"). */
    width: max-content; max-width: none;
    margin-left: 50%; transform: translateX(-50%);
  }  /* 60px from ~1430px up; scales below so the single line never leaves the screen */
  .hero--home .hero-prompt { font-size: 45px; line-height: 1.15; }
  /* Two tiles per row on desktop, panel width unchanged (user-directed 2026-08-17). */
  .hero--home .opts--grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}
/* "Get an Instant Quote" in brand red (user-directed 2026-08-17), every device. */
.hero--home .hero-prompt { color: #BA0422; }

/* ---------- Chooser tile price line: "Plans Start at" + price (user-directed 2026-08-17) ----------
   Right side of every tile, on all devices: [icon] [name] …… [Plans Start at / $price]. */
.tile-text { display: flex; flex: 1 1 auto; flex-direction: row; align-items: center; justify-content: space-between; gap: 8px; min-width: 0; }
.tile-name { display: block; flex: 1 1 0%; text-align: left; overflow-wrap: normal; word-break: normal; min-width: 0; }
.tile-price { display: flex; flex-direction: column; align-items: flex-end; text-align: right; flex-shrink: 0; line-height: 1.1; }
.tile-price small { font-size: 10px; font-weight: 600; color: var(--ink-muted); letter-spacing: .01em; white-space: nowrap;
  /* User-directed 2026-08-17: the lead's right edge lines up with the "/mo"
     of the price, NOT with the arrow — so it steps in by arrow (10px) + gap (4px). */
  padding-right: 14px; }
.tile-price b { font-size: 19px; font-weight: 800; color: #BA0422; white-space: nowrap; }  /* red (user-directed 2026-08-17, final: red) */
/* Solid red triangle to the right of the amount (user-directed 2026-08-17).
   The generic tile-icon rule sizes/colours every svg in the label — override. */
.tile-amt { display: inline-flex; align-items: center; gap: 4px; }
.hero--home .opts--grid .opt label svg.tile-arrow,
.hero--home .opts--grid .opt input:checked + label svg.tile-arrow { width: 10px; height: 12px; color: #BA0422; flex-shrink: 0; }
@media (min-width: 901px) {
  /* Desktop tiles become a row (they were icon-over-name columns). */
  .hero--home .opts--grid .opt label,
  .hero--home .opts--grid .opt:last-child:nth-child(odd) label {
    flex-direction: row; justify-content: flex-start; align-items: center; text-align: left;
    gap: 9px; min-height: 84px; padding: 12px 11px;
  }
  .hero--home .opts--grid .opt label svg { flex-shrink: 0; }
  .hero--home .opts--grid .opt label .tile-text { gap: 6px; }
}
@media (max-width: 900px) {
  .hero--amanda .opts--grid .opt label .tile-text { gap: 6px; }
  /* Names wrap by WORD only (the generic tile rule allows mid-word breaks). */
  .hero--amanda .opts--grid .opt label .tile-name { overflow-wrap: normal; word-break: normal; hyphens: none; }
  /* Price block: as narrow as "Plans Start at"; the price breaks at its "/"
     (via <wbr>) only when it must, so "$349/window" becomes two short lines. */
  .hero--amanda .opts--grid .opt label .tile-price { max-width: 84px; }
  .hero--amanda .opts--grid .opt label .tile-text { gap: 5px; }
  .hero--amanda .opts--grid .opt label .tile-amt { gap: 3px; align-items: flex-end; }
  .hero--home .opts--grid .opt label svg.tile-arrow { width: 7px; height: 9px; margin-bottom: 2px; }
  .hero--amanda .opts--grid .opt label .tile-price small { font-size: 8.5px; white-space: nowrap; padding-right: 10px; }  /* phone arrow 7px + gap 3px */
  /* $ amounts bigger on phones (user-directed 2026-08-17): 13.5 → 16px; the lead stays small */
  .hero--amanda .opts--grid .opt label .tile-price b { font-size: 16px; white-space: normal; text-align: right; overflow-wrap: normal; word-break: keep-all; }
  .hero--amanda .opts--grid .opt label { padding-top: 5px; padding-bottom: 5px; padding-left: 8px; padding-right: 8px; gap: 7px; }
  /* The one name with an 11-letter word ("Window Replacement") steps down so
     the word fits beside the price; every other name stays at 17px. */
  .hero--amanda .opts--grid .opt[data-long-name] label .tile-name { font-size: 13.5px; }
}
@media (max-width: 380px) {
  .hero--amanda .opts--grid .opt[data-long-name] label .tile-name { font-size: 12px; }
  .hero--amanda .opts--grid .opt label .tile-price { max-width: 78px; }
  .hero--amanda .opts--grid .opt label .tile-price b { font-size: 16px; }
}
/* ≤365px phones (360px Androids, 320px SE1): nothing fits beside a 17px name
   once the price + arrow are there, so the price drops under the name,
   right-aligned — only on these narrow viewports. */
@media (max-width: 365px) {
  .hero--amanda .opts--grid .opt label .tile-text { flex-wrap: wrap; row-gap: 2px; }
  .hero--amanda .opts--grid .opt label .tile-name { flex: 1 1 100%; }
  .hero--amanda .opts--grid .opt label .tile-price { margin-left: auto; max-width: none; flex-shrink: 0; min-width: 0; flex-direction: row; flex-wrap: nowrap; justify-content: flex-end; align-items: baseline; gap: 0 3px; }
  .hero--amanda .opts--grid .opt label .tile-price b { white-space: nowrap; font-size: 16px; }
  .hero--amanda .opts--grid .opt label .tile-price small { font-size: 8.5px; padding-right: 0; }
  .hero--amanda .opts--grid .opt label .tile-text { column-gap: 3px; }
  .hero--amanda .opts--grid .opt label .tile-name,
  .hero--amanda .opts--grid .opt[data-long-name] label .tile-name { font-size: 17px; }
}
@media (max-width: 345px) {
  /* 320px: the lead + price no longer fit on one row — the lead sits above. */
  .hero--amanda .opts--grid .opt label .tile-price { flex-wrap: wrap; row-gap: 0; }
  .hero--amanda .opts--grid .opt label .tile-price small { font-size: 8px; flex-basis: 100%; text-align: right; }
  .hero--amanda .opts--grid .opt label .tile-price b { font-size: 15px; }
}

/* ================== QUIZ (FUNNEL) — WIDTH + BUTTON HEIGHT ==================
   User-directed 2026-08-11.
   1. On desktop the quiz card is 40% of the SCREEN (vw, not a share of the
      1180px wrap), centred. min(…, 100%) so it can never exceed the wrap on a
      very wide monitor.
   2. Answer buttons are 50% taller on desktop AND mobile: 58 -> 87px and
      44 -> 66px. Scoped with :not(.opts--grid) so the homepage category tiles,
      which share the .opt markup, keep the sizes set for them above. */
@media (min-width: 901px) {
  .hero--form .hero-stack .hero-card {
    width: min(40vw, 100%);
    max-width: min(40vw, 100%);
    margin-inline: auto;
  }
}
.opts:not(.opts--grid) .opt label { min-height: 87px; }
@media (max-width: 900px), (max-height: 1200px) {
  .opts:not(.opts--grid) .opt label { min-height: 66px; }
}

/* ---------- Amanda's head centred on the wordmark (desktop) ----------
   User-directed 2026-08-11. Her crown sits at 49.5% of the asset's width — i.e.
   the middle — so aligning her head means aligning the FIGURE'S centre with the
   logo's centre. Both now share the 1180px wrap, so the offset is simply
   (logoWidth / 2) - (figureWidth / 2).

   The 50% in the translate resolves against the figure's OWN width, so this
   stays exact as the 25% column grows and shrinks — no viewport maths, and no
   dependence on 100vw (which counts the scrollbar and would drift). Clamped so
   the nudge can never push her past the wrap's 20px padding into the edge. */
@media (min-width: 901px) {
  .hero--amanda .hero-figure {
    /* Wordmark is 38px tall and 242px wide at its intrinsic aspect. */
    transform: translateX(clamp(-20px, calc(121px - 50%), 20px));
  }
}

/* User-directed 2026-08-17: on phones the WHOLE first quiz question — title +
   every option — must sit above the fold. Short phones (iPhone SE class,
   ≤700px tall) get a smaller Amanda and a tighter hero/price/option stack;
   the taller phones already fit with the 150px figure. Lives at the END of the
   file so it wins the same-specificity --qfig rule in the ≤900px block. */
@media (max-width: 900px) and (max-height: 720px) {
  .hero--form.hero--amanda .hero-split { --qfig: min(88px, 24vw); row-gap: .25rem; }
  .hero--form.hero--amanda { padding-top: 8px; }
  .hero--form.hero--amanda .hero-head h1 { font-size: 1.15rem; line-height: 1.2; }
  .hero--form.hero--amanda .price-badge { padding: 8px 14px; margin-bottom: .55rem; }
  .hero--form.hero--amanda .pb-pre, .hero--form.hero--amanda .pb-suf { font-size: 16px; }
  .hero--form.hero--amanda .pb-amt { font-size: 30px; }
  .hero--form.hero--amanda .pb-cur { font-size: 21px; }
  .hero--form.hero--amanda .quote-card legend, .hero--form.hero--amanda .quote-card .qtitle { font-size: 1.3rem; margin-bottom: .15em; }
  .hero--form.hero--amanda .opts { gap: 5px; margin-top: .35rem; }
  /* answer buttons: 66px (the "50% taller" rule) does not fit 4 answers above
     the SE fold together with the figure — 54px does, still a fat tap target */
  .hero--form.hero--amanda .opts:not(.opts--grid) .opt label { min-height: 54px; padding: 6px 12px; font-size: .95rem; }
  .hero--form.hero--amanda .price-badge { margin-bottom: .4rem; }
  .hero--form.hero--amanda .hero-head h1 { margin-bottom: 0; }
  .hero--form.hero--amanda .progress { padding-top: 6px; }
  .hero--form.hero--amanda .quote-body { padding-top: 8px; }
}

/* User-directed 2026-08-17: the "Step 1 of 6 / Free & secure" progress row is
   REMOVED on every device. Kept in the DOM (app.js still updates it and the
   e2e reads .progress-total) — just never painted. */
.quote-card .progress { display: none !important; }

/* ══════════════════════════════ CRAMPED PHONE VIEWPORTS ══════════════════════
   Real mobile browsers eat 80–110px of height with their URL and tab bars —
   tools/fold.cjs models that with 375×553 and 390×724, and the whole quote card
   has to stay above the fold there or the visitor never sees the button.
   These rules ONLY compress, never below the 44px tap-target floor, and they are
   gated on height so roomy phones (390×844, 430×932) render exactly as before.
   Last in the file so they win over the width-only steps above. */
@media (max-width: 900px) and (max-height: 760px) {
  /* Quiz (radio) steps — scoped to .quote-form so the homepage chooser tiles,
     which are .chooser-form and sized separately below, are never touched. */
  .quote-card .quote-form .opts { gap: 6px; margin-top: .55rem; }
  .quote-card .quote-form .opt label { min-height: 50px; padding: 9px 14px; }
  .quote-card legend, .quote-card .qtitle { font-size: 1.3rem; }

  /* Contact steps — the title is the single biggest block on the last step. */
  .quote-card .qstep--contact .qtitle { font-size: 23px !important; }
  .quote-card .qstep--contact .qtitle + .qhelp { font-size: 14px !important; margin-bottom: .5rem; }
  .quote-card .field { margin-bottom: 10px; }
  .quote-card .consent { padding: 6px 9px; margin: 6px 0; }
  .quote-card .qnav { margin-top: 8px; }
  .quote-card .qnav .btn--primary { padding: 14px 20px; font-size: 1.05rem; }
  /* Two lines is enough reserve here; the sentence is smaller at this size. */
  .quote-card .zip-city { min-height: 2.8em; font-size: .98rem; }
}

/* iPhone SE (1st gen) and friends: the homepage chooser is six full-width rows
   (user-directed 2026-08-17 — icon, name, "Plans Start at" price, arrow), which
   is 500px of tiles on a 568px-tall screen. Shrink the type, not the layout. */
@media (max-width: 380px) and (max-height: 660px) {
  .hero--home .opts--grid { gap: 5px; }
  .hero--home .opts--grid .opt label { min-height: 44px; padding: 4px 7px; }
  .hero--home .opts--grid .opt label svg { width: 17px; height: 17px; }
  .hero--home .tile-name { font-size: 13.5px; line-height: 1.12; }
  .hero--home .tile-price b { font-size: 15px; }
  .hero--home .tile-price small { font-size: 9px; }
  .hero--home .quote-body { padding-top: 8px; padding-bottom: 10px; }
  .hero--home .grating { margin-top: 6px; }
}

/* Tier 2 — the shortest viewports fold.cjs models (375×553, 320×568). Everything
   here is a type/spacing squeeze; no layout changes, tap targets stay ≥44px. */
@media (max-width: 900px) and (max-height: 620px) {
  .quote-card .quote-form .opts { gap: 5px; margin-top: .3rem; }
  .quote-card .quote-form .opt label { min-height: 46px; padding: 6px 12px; font-size: .95rem; }
  .quote-card legend, .quote-card .qtitle { font-size: 1.15rem; margin-bottom: .12em; }
  /* Last pixels come off the card's own padding, not the tap targets. */
  .quote-card .quote-body { padding-top: 5px; padding-bottom: 5px; }
  .quote-card .quote-form .opts { gap: 4px; }
}
@media (max-width: 380px) and (max-height: 620px) {
  .hero--home .opts--grid { gap: 4px; }
  .hero--home .opts--grid .opt label { min-height: 44px; padding: 3px 6px; gap: 3px; }
  .hero--home .opts--grid .opt label svg { width: 15px; height: 15px; }
  /* Include the [data-long-name] variant ("Window Replacement"), which carries
     its own font-size higher up — without it that one tile stays large while
     every other name shrinks, and the row reads as broken. */
  .hero--amanda .opts--grid .opt label .tile-name,
  .hero--amanda .opts--grid .opt[data-long-name] label .tile-name { font-size: 12.5px; line-height: 1.1; }
  .hero--amanda .opts--grid .opt label .tile-price { line-height: 1.03; max-width: 76px; }
  .hero--amanda .opts--grid .opt label .tile-price small { font-size: 8px; }
  .hero--amanda .opts--grid .opt label .tile-price b { font-size: 13.5px; }
  .hero--home .quote-body { padding: 8px 14px 12px; }
}

/* ---------- /live/: talk to Amanda + typed contact form (2026-09-04) ----------
   Same quote card, same red CTA, same field styles as the funnel. Only the
   live-call affordances are new: the on/off button state, a pulse ring while
   Amanda speaks, a status line and a small level meter. */
.live-btn { position: relative; gap: 10px; }
.live-btn .call-icon { width: 1.15em; height: 1.15em; flex-shrink: 0; stroke-width: 2.1; }
.live-btn[data-on='true'] { background: var(--blue); }
.live-btn[data-on='true']:hover { background: var(--blue-dark); }
.live-btn[data-speaking='true']::before {
  content: ''; position: absolute; inset: -6px; border-radius: inherit;
  border: 3px solid var(--red); opacity: .55; pointer-events: none;
  animation: livepulse 1.2s ease-out infinite;
}
.live-btn[data-on='true'][data-speaking='true']::before { border-color: var(--blue); }
@keyframes livepulse { 0% { transform: scale(1); opacity: .6; } 100% { transform: scale(1.07); opacity: 0; } }
.live-status {
  font-family: var(--font-ui); font-size: .95rem; color: var(--ink-muted);
  text-align: center; margin: 14px 0 0; min-height: 1.4em;
}
.live-status[data-state='live'] { color: var(--blue); font-weight: 600; }
.live-status[data-state='error'] { color: var(--red); font-weight: 600; }
.live-meter { height: 6px; background: var(--line-soft); border-radius: 99px; overflow: hidden; margin: 12px auto 0; max-width: 220px; }
.live-meter span { display: block; height: 100%; width: 0; background: var(--red); border-radius: 99px; transition: width .15s ease; }
.live-btn[data-on='true'] ~ .live-meter span { background: var(--blue); }
.live-form { margin-top: 24px; border-top: 1px solid var(--line-soft); padding-top: 22px; text-align: left; }
.live-form[hidden] { display: none; }
.live-progress:not(:empty) { margin-bottom: 14px; }
.live-step-done {
  display: flex; gap: 8px; align-items: baseline; font-family: var(--font-ui);
  font-size: .9rem; color: var(--ink-muted); margin: 0 0 6px;
}
.live-check { color: var(--blue); font-weight: 800; }
.live-done[hidden] { display: none; }
.live-done { margin-top: 20px; }
.live-form .qnav .btn--primary { width: 100%; }
@media (max-width: 900px) {
  .live-card .quote-head h2 { font-size: 1.15rem; }
  .live-card .quote-head p { font-size: .88rem; }
}

/* ---- /live/: price line + Q&A table + submit (2026-09-04, flow 2) ---- */
.live-price {
  margin: 20px 0 0; padding: 14px 18px; border-radius: var(--radius, 12px);
  background: var(--blue-tint); border: 1px solid var(--blue-light); text-align: center;
}
.live-price[hidden] { display: none; }
.live-price-text { display: block; font-family: var(--font-head); font-weight: 800; font-size: 1.25rem; color: var(--blue); line-height: 1.25; }
.live-price-text b { color: var(--red); }
.live-price-note { display: block; font-family: var(--font-ui); font-size: .82rem; color: var(--ink-muted); margin-top: 6px; }
.live-qa { margin-top: 18px; overflow-x: auto; }
.live-qa[hidden] { display: none; }
.live-qa table { width: 100%; border-collapse: collapse; font-family: var(--font-ui); font-size: .95rem; }
.live-qa th, .live-qa td { text-align: left; padding: 9px 10px; border-bottom: 1px solid var(--line-soft); vertical-align: top; }
.live-qa thead th { font-size: .78rem; text-transform: uppercase; letter-spacing: .04em; color: var(--ink-muted); font-weight: 700; }
.live-qa tbody th { font-weight: 600; color: var(--ink-soft); width: 46%; }
.live-qa tbody td { color: var(--ink); font-weight: 600; }
.live-qa tr[data-fresh='true'] td { animation: qafade .5s ease; }
@keyframes qafade { from { background: var(--blue-tint); } to { background: transparent; } }
.live-submit { margin-top: 22px; border-top: 1px solid var(--line-soft); padding-top: 20px; text-align: center; }
.live-submit[hidden] { display: none; }
.live-submit .qhelp { margin-bottom: 14px; }
.live-form .consent { margin-top: 4px; }
/* /livem/ (Andrew): same live card, no figure — the card is centered on its own. */
.hero--nofigure .hero-split { display: block; }
.hero--nofigure .hero-figure { display: none; }
.hero--nofigure .hero-stack .hero-card { max-width: 640px; margin: 0 auto; }
