/* Self-hosted fonts - spec §1.3.

 Both mockups pull Oswald / Barlow / IBM Plex Mono from fonts.googleapis.com.
 §1.3 recommends self-hosting woff2: it removes a render-blocking third-party
 round trip from every page, and removes a dependency on Google from a site
 whose entire value is organic search. Licences permit it - Oswald and Barlow
 are OFL, IBM Plex Mono is OFL.

 LATIN SUBSET ONLY. The Google CSS serves 45 faces across latin, latin-ext,
 cyrillic, greek and vietnamese; 11 of them are latin. Shipping the other 34
 would quadruple the bytes for glyphs this site never renders - the copy is
 English and the data is US place names.

 font-display: swap on every face, so text paints in a fallback immediately
 rather than blocking on the download. */

@font-face{font-family:'Barlow';font-style:italic;font-weight:400;font-display:swap;src:url('/assets/fonts/barlow-400-italic.woff2') format('woff2')}
@font-face{font-family:'Barlow';font-style:normal;font-weight:400;font-display:swap;src:url('/assets/fonts/barlow-400.woff2') format('woff2')}
@font-face{font-family:'Barlow';font-style:normal;font-weight:500;font-display:swap;src:url('/assets/fonts/barlow-500.woff2') format('woff2')}
@font-face{font-family:'Barlow';font-style:normal;font-weight:600;font-display:swap;src:url('/assets/fonts/barlow-600.woff2') format('woff2')}
@font-face{font-family:'Barlow';font-style:normal;font-weight:700;font-display:swap;src:url('/assets/fonts/barlow-700.woff2') format('woff2')}
@font-face{font-family:'IBM Plex Mono';font-style:normal;font-weight:400;font-display:swap;src:url('/assets/fonts/ibm-plex-mono-400.woff2') format('woff2')}
@font-face{font-family:'IBM Plex Mono';font-style:normal;font-weight:500;font-display:swap;src:url('/assets/fonts/ibm-plex-mono-500.woff2') format('woff2')}
@font-face{font-family:'IBM Plex Mono';font-style:normal;font-weight:600;font-display:swap;src:url('/assets/fonts/ibm-plex-mono-600.woff2') format('woff2')}
@font-face{font-family:'Oswald';font-style:normal;font-weight:500;font-display:swap;src:url('/assets/fonts/oswald-500.woff2') format('woff2')}
@font-face{font-family:'Oswald';font-style:normal;font-weight:600;font-display:swap;src:url('/assets/fonts/oswald-600.woff2') format('woff2')}
@font-face{font-family:'Oswald';font-style:normal;font-weight:700;font-display:swap;src:url('/assets/fonts/oswald-700.woff2') format('woff2')}

/*
 * site.css - the single stylesheet for every generated page (spec 1.3).
 *
 * EXTRACTED VERBATIM from docs/but-homepage-redesign.html, 2026-08-13. Not
 * retyped and not reformatted: the two approved mockups were compared rule by
 * rule first, and the homepage sheet turned out to be a strict SUPERSET of the
 * city sheet -
 *
 *   city selectors            97
 *   homepage selectors       121
 *   city-only selectors        0
 *   shared rule keys         108  (including @media-scoped rules)
 *   shared bodies differing    0  (all 108 byte-identical)
 *
 * so this file reproduces BOTH mockups exactly. 1.3 estimated ~90% shared; it
 * is in fact 100% of the city sheet, with the homepage adding .badges,
 * .type-grid, .gallery6, .fleet-banner, .testi and .states on top. That is why
 * this is a copy rather than a merge - there was nothing to reconcile, and a
 * hand-merged sheet would have been the risky version.
 *
 * Regenerate and verify with worker/test/module1-byte-identical/css-check.js,
 * which re-derives both mockups rule sets and asserts every rule survives here
 * byte-for-byte.
 *
 * KNOWN DEAD RULES: .testi, .testi-img, .testi-body, .testi-body p and
 * .testi-body .who style the testimonial block, which was DROPPED from the city
 * page (2026-08-12, 1.4 option (a) - no per-city testimonial data exists and
 * inventing one is fabrication). They are retained for now because the homepage
 * template is not built and that decision has not been made for it. Remove them
 * with the homepage if it drops the block too.
 */
:root{
  --asphalt:#16181B;
  --asphalt-2:#212429;
  --paper:#FAF8F4;
  --red:#C8102E;
  --red-dark:#A50D26;
  --manila:#F0E2C0;
  --manila-line:#D9C48F;
  --slate:#5C6166;
  --line:#E4E0D6;
  --plate:#2A2D33;
}
*{margin:0;padding:0;box-sizing:border-box}
html{scroll-behavior:smooth}
@media (prefers-reduced-motion:reduce){html{scroll-behavior:auto}*{transition:none!important}}
body{font-family:'Barlow',sans-serif;background:var(--paper);color:var(--asphalt);font-size:17px;line-height:1.55}
img{max-width:100%;display:block}
a{color:inherit}
.wrap{max-width:1180px;margin:0 auto;padding:0 20px}
.oswald{font-family:'Oswald',sans-serif;text-transform:uppercase}
.mono{font-family:'IBM Plex Mono',monospace}

/* ---------- header ---------- */
header{background:var(--asphalt);color:#fff;position:sticky;top:0;z-index:50;border-bottom:3px solid var(--red)}
.hd{display:flex;align-items:center;justify-content:space-between;padding:14px 0;gap:16px}
.logo{font-family:'Oswald',sans-serif;font-weight:700;font-size:1.35rem;letter-spacing:.02em;text-transform:uppercase;line-height:1}
.logo em{color:var(--red);font-style:normal}
.hd-right{display:flex;align-items:center;gap:18px}
.hd-phone{font-family:'Oswald',sans-serif;font-weight:600;font-size:1.05rem;letter-spacing:.03em;text-decoration:none;display:flex;align-items:center;gap:8px}
.hd-phone svg{width:18px;height:18px;fill:var(--red)}
.hd-cta{background:var(--red);color:#fff;text-decoration:none;font-family:'Oswald',sans-serif;font-weight:600;text-transform:uppercase;letter-spacing:.05em;font-size:.9rem;padding:10px 18px;border-radius:4px}
.hd-cta:hover{background:var(--red-dark)}
@media(max-width:700px){.hd-cta{display:none}.hd-phone span{display:none}}

/* ---------- hero ---------- */
.hero{background:var(--asphalt);color:#fff;padding:52px 0 60px;position:relative;overflow:hidden}
.hero .wrap{display:grid;grid-template-columns:1.15fr .95fr;gap:48px;align-items:start}
@media(max-width:940px){.hero .wrap{grid-template-columns:1fr;gap:36px}}
.eyebrow{font-family:'IBM Plex Mono',monospace;font-size:.8rem;letter-spacing:.14em;text-transform:uppercase;color:#B9BDC4;margin-bottom:14px}
.eyebrow b{color:#fff;font-weight:600}
h1{font-family:'Oswald',sans-serif;font-weight:700;text-transform:uppercase;font-size:clamp(2.3rem,5vw,3.6rem);line-height:1.04;letter-spacing:.005em}
h1 .city{color:var(--red)}
.attitude{font-family:'Oswald',sans-serif;font-weight:500;text-transform:uppercase;letter-spacing:.08em;color:var(--manila);font-size:1.05rem;margin:16px 0 22px}
.hero p.lede{color:#CFD2D7;max-width:52ch;margin-bottom:26px}
.hero-points{list-style:none;display:grid;gap:12px;margin-bottom:30px}
.hero-points li{display:flex;gap:12px;align-items:flex-start;color:#E8EAEC;font-weight:500}
.tick{flex:none;width:22px;height:22px;border-radius:50%;background:var(--red);display:grid;place-items:center;margin-top:1px}
.tick svg{width:12px;height:12px;fill:#fff}
.hero-call{display:inline-flex;align-items:center;gap:10px;color:#fff;text-decoration:none;font-family:'Oswald',sans-serif;font-weight:600;font-size:1.25rem;letter-spacing:.03em;border-bottom:2px solid var(--red);padding-bottom:2px}

/* photo slot: hero background truck */
.hero-photo{position:absolute;right:-40px;bottom:-30px;width:420px;height:260px;opacity:.14;pointer-events:none}
@media(max-width:940px){.hero-photo{display:none}}

/* ---------- the quote card (manila clipboard) ---------- */
.quote-card{background:var(--manila);color:var(--asphalt);border-radius:10px;padding:26px 26px 22px;box-shadow:0 18px 40px rgba(0,0,0,.35);border:1px solid var(--manila-line);position:relative}
.quote-card::before{content:"";position:absolute;top:-11px;left:50%;transform:translateX(-50%);width:88px;height:20px;background:var(--plate);border-radius:5px;box-shadow:inset 0 -2px 0 rgba(255,255,255,.12)}
.qc-head{display:flex;justify-content:space-between;align-items:baseline;margin-bottom:6px}
.qc-title{font-family:'Oswald',sans-serif;font-weight:700;text-transform:uppercase;font-size:1.3rem;letter-spacing:.02em}
.qc-tag{font-family:'IBM Plex Mono',monospace;font-size:.7rem;letter-spacing:.1em;color:var(--slate)}
.qc-sub{font-size:.92rem;color:#5b543f;margin-bottom:16px}
.qform{display:grid;grid-template-columns:1fr 1fr;gap:12px}
.qform .full{grid-column:1/-1}
.qf label{display:block;font-family:'Oswald',sans-serif;font-size:.72rem;font-weight:600;letter-spacing:.09em;text-transform:uppercase;color:#6b6248;margin-bottom:5px}
.qf input,.qf select,.qf textarea{width:100%;font-family:'Barlow',sans-serif;font-size:16px;padding:11px 12px;height:auto;min-height:46px;border:1px solid #C9B583;border-radius:5px;background:#FFFDF7;color:var(--asphalt)}
.qf input:focus,.qf select:focus,.qf textarea:focus{outline:2px solid var(--red);outline-offset:1px;border-color:var(--red)}
.q-submit{grid-column:1/-1;background:var(--red);color:#fff;border:none;border-radius:6px;font-family:'Oswald',sans-serif;font-weight:700;text-transform:uppercase;letter-spacing:.06em;font-size:1.1rem;padding:15px;cursor:pointer;margin-top:4px}
.q-submit:hover{background:var(--red-dark)}
.q-fine{grid-column:1/-1;text-align:center;font-size:.78rem;color:#77704f;margin-top:2px}
.q-error{grid-column:1/-1;margin:2px 0 0;color:#C8102E;font-family:'Barlow',sans-serif;font-size:.86rem;text-align:center}
@media(max-width:460px){.qform{grid-template-columns:1fr}}

/* ---------- hazard divider (the one loud stripe) ---------- */
.hazard{height:14px;background:repeating-linear-gradient(-45deg,var(--red) 0 18px,var(--asphalt) 18px 36px)}

/* ---------- bought gallery ---------- */
section{padding:64px 0}
.sec-eyebrow{font-family:'IBM Plex Mono',monospace;font-size:.78rem;letter-spacing:.16em;text-transform:uppercase;color:var(--red);margin-bottom:10px}
h2{font-family:'Oswald',sans-serif;font-weight:700;text-transform:uppercase;font-size:clamp(1.7rem,3.4vw,2.4rem);line-height:1.1;margin-bottom:14px}
.sec-lede{color:var(--slate);max-width:62ch;margin-bottom:34px}
.gallery{display:grid;grid-template-columns:repeat(3,1fr);gap:22px}
@media(max-width:820px){.gallery{grid-template-columns:1fr;max-width:480px}}
.shot{background:#fff;border:1px solid var(--line);border-radius:8px;overflow:hidden;box-shadow:0 6px 18px rgba(22,24,27,.06)}
.shot-img{aspect-ratio:4/3;background:
  repeating-linear-gradient(-45deg,#ECE8DD 0 14px,#F5F2EA 14px 28px);
  display:grid;place-items:center;color:#9a937f;font-family:'IBM Plex Mono',monospace;font-size:.75rem;letter-spacing:.08em;text-align:center;padding:12px}
.plate{margin:14px;margin-top:12px;background:var(--plate);color:#F2EFE6;border-radius:5px;padding:8px 12px;font-family:'IBM Plex Mono',monospace;font-size:.72rem;letter-spacing:.1em;display:flex;justify-content:space-between;gap:8px;box-shadow:inset 0 0 0 2px #3a3e46, inset 0 0 0 3px #1c1e22}
.plate b{color:#fff;font-weight:600}

/* ---------- freight facts (the data card no competitor has) ---------- */
.facts{background:var(--asphalt);color:#fff}
.facts-grid{display:grid;grid-template-columns:1.1fr .9fr;gap:44px;align-items:center}
@media(max-width:880px){.facts-grid{grid-template-columns:1fr}}
.facts h2{color:#fff}
.facts .sec-lede{color:#B9BDC4}
.fact-card{background:var(--asphalt-2);border:1px solid #33373E;border-radius:10px;padding:26px}
.fact-card .mono-h{font-family:'IBM Plex Mono',monospace;font-size:.72rem;letter-spacing:.14em;text-transform:uppercase;color:#8f959e;border-bottom:1px dashed #3b3f46;padding-bottom:10px;margin-bottom:16px;display:flex;justify-content:space-between}
.fact-row{display:flex;justify-content:space-between;align-items:baseline;padding:11px 0;border-bottom:1px solid #2b2e34}
.fact-row:last-child{border-bottom:none}
.fact-label{color:#C6CAD1;font-size:.95rem}
.fact-val{font-family:'IBM Plex Mono',monospace;font-weight:600;font-size:1.25rem;color:var(--manila)}
.finding{margin-top:18px;background:rgba(200,16,46,.12);border-left:3px solid var(--red);padding:14px 16px;border-radius:0 6px 6px 0;color:#E8EAEC;font-size:.95rem}
.finding b{color:#fff}
/* .finding CARRIES NO SURFACE OF ITS OWN. In the approved mockups it lives
   INSIDE .fact-card, which is background:var(--asphalt-2) - so its #E8EAEC is
   correct THERE and both mockup rules above are right and unchanged.
   build.js renders the findings block STANDALONE, in a bare <section> on
   --paper (#FAF8F4). Its translucent red composites over near-white to a pale
   pink, and #E8EAEC on that measures 1.01:1 - invisible, not merely faint.
   .finding b at #fff measures 1.19:1.
   Fixed by giving the standalone case the dark surface it assumes, rather
   than by darkening .finding - darkening it would break it inside .fact-card,
   where it is currently correct, and would force an edit to two approved
   design mockups to fix a bug that is not in them. #E8EAEC on --asphalt-2
   measures 12.91:1. */
.finding-solo{background:var(--asphalt-2);border:1px solid #33373E;border-left:3px solid var(--red)}

/* ---------- bundle statements ----------
   HIERARCHY FIX. The first version set .stmt-text to #E8EAEC - a near-white
   copied from .finding - on a --paper (#FAF8F4) page, so the facts rendered
   effectively invisible; and .stmt-meta used var(--muted), which IS NOT
   DEFINED in this palette, so it fell back to inherited --asphalt and the
   provenance tags came out DARKER than the facts they were annotating. The
   content was the faintest thing on the page and the footnotes were the
   boldest.
   The fact is the content: full --asphalt, 1.05rem, generous line height. The
   provenance is a footnote: --slate, small, mono, uppercase. */
.stmts{list-style:none;margin:16px 0 0;padding:0;max-width:62ch}
.stmt{padding:14px 0;border-bottom:1px solid var(--line)}
.stmt:last-child{border-bottom:0}
.stmt-text{display:block;color:var(--asphalt);font-size:1.05rem;line-height:1.6}
.stmt-meta{display:block;margin-top:6px;font-family:'IBM Plex Mono',monospace;font-size:.7rem;letter-spacing:.08em;text-transform:uppercase;color:var(--slate)}
/* The block-level confidence word, shown once when every line agrees. */
.stmts-conf{display:inline-block;margin-bottom:2px;font-family:'IBM Plex Mono',monospace;font-size:.7rem;letter-spacing:.08em;text-transform:uppercase;color:var(--slate);border:1px solid var(--line);border-radius:3px;padding:2px 7px}

/* ---------- process ---------- */
.steps{display:grid;grid-template-columns:repeat(3,1fr);gap:22px;counter-reset:step}
@media(max-width:820px){.steps{grid-template-columns:1fr;max-width:520px}}
.step{background:#fff;border:1px solid var(--line);border-radius:8px;padding:26px 22px 22px;position:relative}
.step::before{counter-increment:step;content:counter(step,decimal-leading-zero);position:absolute;top:-14px;left:18px;background:var(--red);color:#fff;font-family:'Oswald',sans-serif;font-weight:700;font-size:.95rem;padding:4px 10px;border-radius:4px;letter-spacing:.06em}
.step h3{font-family:'Oswald',sans-serif;text-transform:uppercase;font-size:1.1rem;letter-spacing:.03em;margin:8px 0 8px}
.step p{color:var(--slate);font-size:.95rem}

/* ---------- buy-list ---------- */
.buy-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:14px}
@media(max-width:900px){.buy-grid{grid-template-columns:repeat(2,1fr)}}
.buy{background:#fff;border:1px solid var(--line);border-radius:6px;padding:14px 16px;font-weight:600;font-size:.95rem;display:flex;gap:10px;align-items:center}
.buy .dot{width:8px;height:8px;border-radius:50%;background:var(--red);flex:none}

/* ---------- testimonial ---------- */
.quotebox{background:var(--manila);border-radius:10px;padding:34px;border:1px solid var(--manila-line);max-width:820px}
.quotebox p{font-size:1.15rem;font-weight:500;font-style:italic;margin-bottom:14px}
.quotebox .who{font-family:'IBM Plex Mono',monospace;font-size:.78rem;letter-spacing:.1em;text-transform:uppercase;color:#77704f}

/* ---------- big cta ---------- */
.big-cta{background:var(--red);color:#fff;text-align:center}
.big-cta h2{color:#fff}
.big-cta p{color:#FBD9DF;max-width:56ch;margin:0 auto 26px}
.cta-row{display:flex;gap:14px;justify-content:center;flex-wrap:wrap}
.btn-light{background:#fff;color:var(--red);text-decoration:none;font-family:'Oswald',sans-serif;font-weight:700;text-transform:uppercase;letter-spacing:.05em;padding:14px 26px;border-radius:6px}
.btn-ghost{border:2px solid #fff;color:#fff;text-decoration:none;font-family:'Oswald',sans-serif;font-weight:600;text-transform:uppercase;letter-spacing:.05em;padding:12px 24px;border-radius:6px}

/* ---------- footer ---------- */
footer{background:var(--asphalt);color:#9aa0a8;padding:44px 0 90px;font-size:.9rem}
.ft{display:flex;justify-content:space-between;gap:24px;flex-wrap:wrap}
footer .logo{color:#fff;margin-bottom:8px}
footer a{color:#c8ccd2;text-decoration:none}

/* ---------- sticky mobile bar ---------- */
.mbar{position:fixed;bottom:0;left:0;right:0;display:none;z-index:60;box-shadow:0 -8px 24px rgba(0,0,0,.25)}
.mbar a{flex:1;text-align:center;padding:15px 8px;font-family:'Oswald',sans-serif;font-weight:700;text-transform:uppercase;letter-spacing:.05em;text-decoration:none;font-size:1rem}
.mbar .call{background:var(--asphalt);color:#fff}
.mbar .quote{background:var(--red);color:#fff}
@media(max-width:700px){.mbar{display:flex}}

.note{background:#FFF6D9;border:1px dashed #D9B84A;color:#6b5a12;font-size:.8rem;padding:8px 12px;border-radius:6px;font-family:'IBM Plex Mono',monospace;letter-spacing:.02em}

/* ---------- homepage additions ---------- */
.badges{background:var(--paper);border-bottom:1px solid var(--line)}
.badge-row{display:grid;grid-template-columns:repeat(4,1fr);gap:0;padding:18px 0}
@media(max-width:820px){.badge-row{grid-template-columns:repeat(2,1fr);row-gap:14px}}
.badge{display:flex;flex-direction:column;align-items:center;text-align:center;gap:2px;border-right:1px solid var(--line);padding:4px 10px}
.badge:last-child{border-right:none}
@media(max-width:820px){.badge:nth-child(2){border-right:none}}
.badge b{font-family:'Oswald',sans-serif;text-transform:uppercase;font-size:1.15rem;letter-spacing:.03em}
.badge span{font-size:.82rem;color:var(--slate)}
.gallery6{display:grid;grid-template-columns:repeat(3,1fr);gap:22px}
@media(max-width:820px){.gallery6{grid-template-columns:1fr 1fr;gap:14px}}
@media(max-width:520px){.gallery6{grid-template-columns:1fr}}
.type-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:16px}
@media(max-width:960px){.type-grid{grid-template-columns:repeat(2,1fr)}}
.type{background:#fff;border:1px solid var(--line);border-radius:8px;overflow:hidden}
.type-img{aspect-ratio:16/9;background:repeating-linear-gradient(-45deg,#ECE8DD 0 14px,#F5F2EA 14px 28px);display:grid;place-items:center;color:#9a937f;font-family:'IBM Plex Mono',monospace;font-size:.68rem;letter-spacing:.06em;text-align:center;padding:8px}
.type-cap{display:flex;align-items:center;gap:9px;padding:11px 14px;font-weight:600;font-size:.95rem}
.type-cap .dot{width:8px;height:8px;border-radius:50%;background:var(--red);flex:none}
.fleet-banner{background:var(--manila);border:1px solid var(--manila-line);border-radius:12px;padding:34px;display:grid;grid-template-columns:1.4fr .6fr;gap:26px;align-items:center}
@media(max-width:820px){.fleet-banner{grid-template-columns:1fr}}
.fleet-banner h3{font-family:'Oswald',sans-serif;text-transform:uppercase;font-size:1.6rem;line-height:1.1;margin-bottom:8px}
.fleet-banner p{color:#5b543f;margin-bottom:0}
.btn-dark{background:var(--asphalt);color:#fff;text-decoration:none;font-family:'Oswald',sans-serif;font-weight:700;text-transform:uppercase;letter-spacing:.05em;padding:14px 24px;border-radius:6px;text-align:center}
.states{columns:4;column-gap:28px;font-size:.95rem;line-height:2}

@media(max-width:900px){.states{columns:3}}
@media(max-width:600px){.states{columns:2}}
.states a{text-decoration:none;color:var(--asphalt);border-bottom:1px solid var(--line)}
.states a:hover{color:var(--red);border-color:var(--red)}
.testi{display:grid;grid-template-columns:.8fr 1.2fr;gap:0;max-width:920px;background:var(--manila);border:1px solid var(--manila-line);border-radius:10px;overflow:hidden}
@media(max-width:760px){.testi{grid-template-columns:1fr}}
.testi-img{background:repeating-linear-gradient(-45deg,#E2D5AE 0 14px,#EADFBE 14px 28px);display:grid;place-items:center;color:#8a7c4e;font-family:'IBM Plex Mono',monospace;font-size:.72rem;text-align:center;padding:12px;min-height:220px}
.testi-body{padding:30px}
.testi-body p{font-size:1.12rem;font-weight:500;font-style:italic;margin-bottom:14px}
.testi-body .who{font-family:'IBM Plex Mono',monospace;font-size:.76rem;letter-spacing:.1em;text-transform:uppercase;color:#77704f}

/* The state list ran together on the deployed page: .states sets columns:4,
   but the 51 anchors are inline, so they flow as one paragraph across the
   columns and read as prose.
   A CHILD selector, deliberately. .states a comes from the approved mockup and
   css-check asserts every mockup rule survives byte-for-byte, while also
   refusing a second .states a block as a conflicting duplicate. Both checks
   are right: the mockup is the design of record and duplicate rules are how
   stylesheets rot. .states>a is neither - it is a new, more specific rule that
   leaves the mockup's untouched. */
.states>a{display:block;break-inside:avoid}

/* ===== Navigation (measured against live 2026-08-18) =====
   The header carried 2 links against WordPress's 20 and the footer 1 against
   18, on all 166 pages. These rules style the structure that restores them.
   Class names follow the mockup's vocabulary (.hd, .ft, .wrap). */
.wrap.hd{position:relative}
/* THE QUOTE FIELDS ON A PHONE (RONNIE, 2026-09-06, approved on /form-preview/).
   TWO COLUMNS ALL THE WAY DOWN, in the pairs the desktop form already uses:
   First|Last, Phone|Email, City|State, Year|Make, Model|Engine,
   Transmission|Runs, Complete|Title, and Comments across both. The pairing is
   not arranged here - the renderer emits the fields in that order, so a
   two-column grid produces it.

   SUPERSEDES THE 2026-09-05 RULING, which narrowed each field to 260px and
   centred it in the card. That was one column; the cap and the auto margins
   are what "original field widths" undoes, so they are set back rather than
   left to be overridden somewhere else. The 40px height from that ruling
   STAYS - it was the height that was asked about, and the new ruling is about
   width and gaps.

   THE GAPS ARE MEASURED. Swept 12/10/8/6/5/4/3/2px on the rendered page:
     column-gap 4px  the columns stay apart to 2px, but 4px is where the gutter
                     still reads as one, and it costs a single pixel of field.
     row-gap    6px  a floor with a reason - `.qf label` is margin-bottom:5px,
                     so under 6px a label sits closer to the field ABOVE it
                     than to the one it names.

   THE FONT SIZE IS UNTOUCHED, by the ruling and because under 16px iOS Safari
   zooms the page when a field takes focus. */
@media(max-width:640px){
  .qform{grid-template-columns:1fr 1fr;column-gap:4px;row-gap:6px}
  .qform > div{width:auto;max-width:none;margin-left:0;margin-right:0}
  .qform input,.qform select,.qform textarea{min-height:40px;padding:8px 12px}
  .qform .full{grid-column:1/-1}
  .qform .q-submit{width:100%;max-width:none;margin-left:0;margin-right:0}
}

/* THE WORDMARK IS NEVER UNDERLINED (RONNIE, 2026-09-04). Both mockups' .logo
   rule sets no text-decoration, so an <a class="logo"> took the browser
   default and the header and footer wordmarks shipped underlined on every
   layout.js page. The mockup rule is the design of record and is not edited;
   a.logo (0,1,1) beats it without touching it. The composed shell already
   carries text-decoration:none inside its own .logo rule. */
a.logo{text-decoration:none}
.mnav-cb,.tools-cb{position:absolute;opacity:0;width:1px;height:1px;margin:0}
.mnav-t{display:inline-flex;align-items:center;justify-content:center;margin-left:auto;
  width:44px;height:44px;flex:0 0 44px;cursor:pointer;border:1px solid var(--line);
  border-radius:7px;background:var(--paper);transition:border-color .14s,background .14s}
.mnav-t:hover{border-color:var(--red)}
.mnav-cb:focus-visible~.mnav-t,
.mnav-t:focus-visible{outline:2px solid var(--red);outline-offset:3px}
.mnav-t span,.mnav-t span::before,.mnav-t span::after{display:block;width:19px;height:2px;
  background:var(--asphalt);border-radius:2px;transition:transform .18s,opacity .18s}
.mnav-t span{position:relative}
.mnav-t span::before,.mnav-t span::after{content:"";position:absolute;left:0}
.mnav-t span::before{top:-6px}
.mnav-t span::after{top:6px}
.mnav-cb:checked~.mnav-t span{background:transparent}
.mnav-cb:checked~.mnav-t span::before{transform:translateY(6px) rotate(45deg)}
.mnav-cb:checked~.mnav-t span::after{transform:translateY(-6px) rotate(-45deg)}
.hd-nav{display:none;position:absolute;top:calc(100% - 4px);right:0;z-index:70;width:330px;
  flex-direction:column;padding:8px;background:#fff;border:1px solid var(--line);
  border-radius:8px;box-shadow:0 18px 44px rgba(0,0,0,.16);
  font-family:'Barlow',sans-serif;font-size:.95rem}
.mnav-cb:checked~.hd-nav{display:flex}
.hd-nav>a,.tools-t{display:block;padding:11px 12px;border-radius:5px;color:var(--asphalt);
  text-decoration:none;border-bottom:1px solid var(--line)}
.hd-nav>a:hover,.tools-t:hover{background:#F6F3EA;color:var(--red)}
.tools{display:block}
.tools-t{cursor:pointer;display:flex;align-items:center;justify-content:space-between;
  border-bottom:0;font-weight:600}
.tools-t::after{content:"";border-left:5px solid transparent;border-right:5px solid transparent;
  border-top:6px solid currentColor;transition:transform .16s}
.tools-cb:checked~.tools-t::after{transform:rotate(180deg)}
.tools-cb:focus-visible~.tools-t,
.tools-t:focus-visible{outline:2px solid var(--red);outline-offset:-2px}
.tools-menu{display:none;flex-direction:column;padding:2px 0 6px 12px;
  border-left:2px solid var(--manila-line);margin:0 0 4px 12px}
.tools-cb:checked~.tools-menu{display:flex}
.tools-menu a{display:block;padding:9px 10px;border-radius:5px;color:var(--slate);
  text-decoration:none;font-size:.9rem}
.tools-menu a:hover{background:#F6F3EA;color:var(--red)}
.ft-col{display:flex;flex-direction:column;gap:6px;min-width:150px}
.ft-h{font-family:'Oswald',sans-serif;text-transform:uppercase;letter-spacing:.05em;color:#fff;margin-bottom:4px}
.ft-col a{color:inherit;text-decoration:none}
.ft-col a:hover{color:var(--red)}

/* Captured WordPress pages wrap their body in .but-page. 50 of the 165
   captures use it and site.css had no rule, so those pages had no container
   width at all - text ran the full viewport. The captures' own inline CSS
   styles everything INSIDE the wrapper; only the wrapper itself was orphaned. */
.but-page{max-width:1100px;margin:0 auto}

/* Core block-editor classes on a handful of captured pages. Semantic only -
   the theme styled them and that stylesheet is not coming with us. */
.wp-block-heading{font-family:'Oswald',sans-serif}
.wp-block-paragraph{margin:0 0 1em}

@media(max-width:700px){
  .hd .hd-nav{width:auto;left:0;right:0}
  .states{columns:1}
  /* THE PHONE NUMBER AND THE BUTTON STAY (RONNIE, 2026-09-04).
     The mockup rule above this section reads
       @media(max-width:700px){.hd-cta{display:none}.hd-phone span{display:none}}
     and layout.js puts the number in that span - so on a phone the header
     carried a logo, a hamburger and nothing else. MEASURED on /where-we-buy/
     and /thank-you/ at 390px: phone not rendered, CTA not rendered.
     The mockup rule is the design of record and is not edited; these are
     more specific rules that leave it in place, the same move .states>a makes
     further up. */
  header .hd-cta{display:inline-block}
  header .hd-phone span{display:inline}
}
/* ONE ROW, at every phone width (RONNIE, 2026-09-04, on an iPhone at 390px).
   The block this replaces gave .hd-right `width:100%`, which pushed the phone
   and SELL MY TRUCK onto a second line under the logo.

   A CONTINUOUS RAMP, not steps. 350px of content at 390px does not hold the
   wordmark, a 40px target, the number and the button at their desktop sizes, so
   everything scales - but as clamp() between the value at 320px and the value
   at 560px rather than as four breakpoints. Two reasons, and the second is the
   one that decided it: it reads smoothly instead of jumping, and each selector
   is then written ONCE, so css-check's duplicate-rule arm (which keys on the
   selector and not the @media context) has nothing to collide with. The
   breakpoint version tripped it on five selectors.

   The logo takes two lines rather than shrink away - all three words stay,
   which is the point. Selectors are `header .hd .x` (0,2,1) so they beat the
   rules they replace without reusing their keys. The horizontal padding is set
   here because the mockup's `.hd{padding:14px 0}` zeroes what `.wrap` gives it,
   which left the logo flush against the screen edge at 390px. Measured at 560, 480, 430, 414, 393, 390, 375, 360, 344 and
   320px: one row, nothing overlapping, no horizontal scroll, right edge on the
   sheet's own padding. */
@media(max-width:560px){
  header .hd{gap:clamp(5px,1px + 1.25vw,8px);
    padding-left:clamp(12px,-9.33px + 6.67vw,20px);
    padding-right:clamp(12px,-9.33px + 6.67vw,20px)}
  header .hd .logo{order:1;flex:0 0 auto;max-width:5.4em;letter-spacing:0;line-height:1.06;
    font-size:clamp(13.6px,9.07px + 1.42vw,17px)}
  header .hd .mnav-t{order:2;margin-left:auto;
    width:clamp(36px,30.67px + 1.67vw,40px);height:clamp(36px,30.67px + 1.67vw,40px);
    flex:0 0 clamp(36px,30.67px + 1.67vw,40px)}
  header .hd .hd-right{order:3;width:auto;margin:0;flex:0 0 auto;justify-content:flex-end;
    gap:clamp(5px,1px + 1.25vw,8px)}
  header .hd .hd-phone{font-size:clamp(12.24px,7.71px + 1.42vw,15.64px)}
  header .hd .hd-cta{display:inline-block;letter-spacing:.02em;
    font-size:clamp(9.86px,5.78px + 1.28vw,12.92px);
    padding:clamp(7px,3px + 1.25vw,10px) clamp(8px,1.33px + 2.08vw,13px)}
  header .hd .hd-nav{top:calc(100% - 10px)}
}

/* THE TRUCK ROW ABOVE THE QUOTE CARD (RONNIE, 2026-09-06).
   One row of four, spanning the card's width, and SHORT - the brief was "not
   much height, roughly the height of two form fields".
   The height is not set here and cannot be: four drawings across a fixed card
   width fixes it. Each SVG is 2:1, so the row is card-width/8 tall - about 55px
   against a 440px card, 38px on a 390px phone. Constraining the height instead
   would either crop the drawings or leave gaps between them. */
.truck-row{display:grid;grid-template-columns:repeat(4,1fr);gap:6px;align-items:end;margin:0 0 14px}
.truck-row .truck{display:block;width:100%;height:auto}
/* UNDER 700px THE ROW LEAVES THE CARD (RONNIE, 2026-09-06): outside it, directly
   above its top edge, the full width of the card. Desktop keeps it inside at the
   top, which is what he approved on the preview.
   ONE PLACE IN THE MARKUP, SWITCHED HERE. The row is the card's first child in
   the DOM at every width; emitting it twice and hiding one copy would put 31KB
   of SVG on the page for the sake of a breakpoint. `.quote-card` is already
   position:relative, so bottom:100% puts the row directly on the card's top
   border and left/right:0 makes it exactly the card's width - the width comes
   out of the card's own box rather than a number kept in step by hand.
   The 14px clears the clipboard clip, which `.quote-card::before` hangs from
   top:-11px, so the row sits above the clip rather than behind it. */
@media(max-width:699.98px){
  .quote-card>.truck-row{position:absolute;left:0;right:0;bottom:100%;margin:0 0 14px;gap:4px}
  /* Out of flow means nothing reserves the row's height, and it landed across
     the hero paragraph. A PERCENTAGE margin is the right reservation because a
     percentage resolves against the containing block's WIDTH - and the row's
     height IS a function of that width: four 2:1 drawings across it, so
     width/8. 12.5% + the 14px gap tracks the row at every viewport instead of
     being a pixel guess that is right at 390px and wrong at 430px.
     Scoped to .has-truck-row, which build.js puts on the one card that has one:
     unconditional, it would open this gap above every card on the site.
     THE CLASS IS DOUBLED ON PURPOSE. The re-housed homepage inlines the shell's
     own stylesheet AFTER this one, and that sheet carries
     `.top-grid>.quote-card{margin-top:8px}` - the same specificity as
     `.quote-card.has-truck-row`, so it won on source order and the computed
     margin came back 8px with the row still lying across the hero copy.
     Repeating the class takes this to (0,3,0) and settles it by specificity
     rather than by order, which matters because that sheet is inlined per page
     and is not ours to sequence. */
  .quote-card.has-truck-row.has-truck-row{margin-top:calc(12.5% + 14px)}
}
