/* =====================================================================
   THEME v2 — shared upgrade layer
   ---------------------------------------------------------------------
   Loaded AFTER site.css. Every colour here comes from tokens.css, so this
   one file re-skins itself per site: warm retail on Consignment, cool
   industrial on Warehousing, navy/brass and sage/terracotta on the two
   real estate sites.

   Additive by design — no existing class is redefined out from under
   site.css, so nothing in the FSWD renderer breaks.

   Also carries the components the brief asks for that site.css has no
   vocabulary for:
     .inv-*    inventory card + sold badge      (raw.pdf p4, p6)
     .flow     Next Move Program service flow   (Realtor PDF 5)
     .aud-*    audience cards                   (raw.pdf p15, Realtor PDF 5)
     .tstrip   trust strip
   ===================================================================== */

/* ---------- fluid type: no breakpoint jumps ------------------------- */
:root {
  --fs-xs:   clamp(.75rem,  .72rem + .15vw, .8125rem);
  --fs-sm:   clamp(.875rem, .85rem  + .15vw, .9375rem);
  --fs-base: clamp(1rem,    .97rem  + .18vw, 1.0625rem);
  --fs-lg:   clamp(1.125rem,1.07rem + .3vw,  1.25rem);
  --fs-xl:   clamp(1.25rem, 1.15rem + .5vw,  1.5rem);
  --fs-2xl:  clamp(1.5rem,  1.32rem + .9vw,  2rem);
  --fs-3xl:  clamp(1.875rem,1.55rem + 1.6vw, 2.75rem);
  --fs-4xl:  clamp(2.25rem, 1.7rem  + 2.7vw, 3.75rem);

  --ease-out: cubic-bezier(.16,1,.3,1);
  --dur-fast: .16s;
  --dur: .28s;

  --shadow-lg: 0 12px 32px rgba(0,0,0,.10), 0 4px 8px rgba(0,0,0,.04);
  --shadow-xl: 0 24px 56px rgba(0,0,0,.13), 0 8px 16px rgba(0,0,0,.05);
}

html { -webkit-text-size-adjust: 100%; scroll-behavior: smooth; }
@media (prefers-reduced-motion: reduce) {
  html { scroll-behavior: auto; }
  *, *::before, *::after {
    animation-duration: .01ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: .01ms !important;
  }
}

body {
  font-size: var(--fs-base);
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-rendering: optimizeLegibility;
  font-feature-settings: "kern" 1, "liga" 1;
}

h1, h2, h3, h4 { text-wrap: balance; letter-spacing: -.022em; }
h1 { letter-spacing: -.032em; }
h2 { letter-spacing: -.026em; }
p  { text-wrap: pretty; }
p, li { max-width: 72ch; }

::selection { background: var(--green-050); color: var(--ink); }

:focus-visible {
  outline: 3px solid var(--green-text);
  outline-offset: 3px;
  border-radius: var(--radius-sm);
}

/* ---------- eyebrow ------------------------------------------------- */
.eyebrow {
  display: inline-flex; align-items: center; gap: var(--s1);
  font-size: var(--fs-xs); font-weight: 650;
  letter-spacing: .12em; text-transform: uppercase;
  color: var(--green-text);
  margin-bottom: var(--s2);
}
.eyebrow::before {
  content: ""; width: 1.75rem; height: 2px; border-radius: 2px;
  background: var(--ribbon);
}
.eyebrow--on-dark { color: var(--on-dark-2); }

.lede { font-size: var(--fs-lg); line-height: 1.6; color: var(--ink-2); }

/* ---------- buttons: lift + shadow ---------------------------------- */
.btn, .button, a.btn {
  transition: transform var(--dur-fast) var(--ease-out),
              box-shadow var(--dur) var(--ease-out),
              background-color var(--dur) var(--ease-out);
}
.btn:hover  { transform: translateY(-2px); box-shadow: var(--shadow-lg); }
.btn:active { transform: translateY(0); }

/* ---------- cards --------------------------------------------------- */
.card {
  transition: transform var(--dur) var(--ease-out),
              box-shadow var(--dur) var(--ease-out),
              border-color var(--dur) var(--ease-out);
}
.card:hover { transform: translateY(-4px); box-shadow: var(--shadow-xl); }

/* ---------- trust strip --------------------------------------------- */
.tstrip {
  display: flex; flex-wrap: wrap; justify-content: center;
  gap: var(--s2) var(--s5);
  padding: var(--s3) 0;
  border-block: 1px solid var(--line);
}
.tstrip__item {
  display: inline-flex; align-items: center; gap: var(--s1);
  font-size: var(--fs-sm); font-weight: 600; color: var(--ink-2);
}
.tstrip__item svg, .tstrip__item i { color: var(--green-text); flex: none; }

/* =====================================================================
   INVENTORY CARD — Consignment
   raw.pdf p4/p6: photo, name, price, dimensions, condition, brand,
   available/sold, category, item number. Sold badge required.
   ===================================================================== */
.inv-grid {
  display: grid; gap: var(--s3);
  grid-template-columns: repeat(auto-fill, minmax(min(100%, 15rem), 1fr));
}
.inv-card {
  position: relative; display: flex; flex-direction: column;
  background: var(--surface);
  border: 1px solid var(--line);
  border-radius: var(--radius);
  overflow: hidden;
  box-shadow: var(--shadow-sm);
  transition: transform var(--dur) var(--ease-out), box-shadow var(--dur) var(--ease-out);
}
.inv-card:hover { transform: translateY(-4px); box-shadow: var(--shadow-md); }
.inv-card__media {
  position: relative; aspect-ratio: 4 / 3;
  background: var(--surface-3); overflow: hidden;
}
.inv-card__media img {
  width: 100%; height: 100%; object-fit: cover; display: block;
  transition: transform .5s var(--ease-out);
}
.inv-card:hover .inv-card__media img { transform: scale(1.04); }
.inv-card__body { padding: var(--s2) var(--s2) var(--s3); display: grid; gap: 6px; }
.inv-card__name { font-size: var(--fs-base); font-weight: 650; color: var(--ink); margin: 0; }
.inv-card__meta { font-size: var(--fs-xs); color: var(--ink-3); }
.inv-card__price {
  font-family: var(--font-head);
  font-size: var(--fs-lg); font-weight: 700; color: var(--green-text);
}

/* status badges — sold must be unmistakable */
.inv-badge {
  position: absolute; top: 10px; left: 10px; z-index: 2;
  padding: .3em .7em;
  font-size: var(--fs-xs); font-weight: 700;
  letter-spacing: .06em; text-transform: uppercase;
  border-radius: 999px;
  background: var(--surface); color: var(--ink-2);
  box-shadow: var(--shadow-sm);
}
.inv-badge--new  { background: var(--green-text); color: #fff; }
.inv-badge--sold { background: var(--ink); color: #fff; }
.inv-card--sold .inv-card__media img { filter: grayscale(1) opacity(.55); }
.inv-card--sold .inv-card__price { color: var(--ink-3); text-decoration: line-through; }

/* =====================================================================
   SERVICE FLOW — "The Next Move Program"
   Realtor PDF 5: Real Estate -> Moving -> Storage -> Consignment/Delivery
   Also used by raw.pdf p20's designer workflow.
   ===================================================================== */
.flow {
  display: flex; flex-wrap: wrap; align-items: stretch;
  gap: var(--s2);
  list-style: none; margin: 0; padding: 0;
  counter-reset: flow;
}
.flow__step {
  counter-increment: flow;
  flex: 1 1 12rem; min-width: 11rem;
  position: relative;
  padding: var(--s3) var(--s2);
  background: var(--surface);
  border: 1px solid var(--line);
  border-radius: var(--radius);
  text-align: center;
}
.flow__step::before {
  content: counter(flow);
  display: grid; place-items: center;
  width: 2.1rem; aspect-ratio: 1; margin: 0 auto var(--s1);
  border-radius: 999px;
  background: var(--green-050); color: var(--green-text);
  font-weight: 700; font-size: var(--fs-sm);
}
/* connector chevron — hidden when the row wraps and on mobile */
.flow__step:not(:last-child)::after {
  content: ""; position: absolute; top: 50%; right: calc(var(--s2) * -1);
  width: var(--s2); height: 2px; background: var(--line);
}
@media (max-width: 720px) { .flow__step:not(:last-child)::after { display: none; } }
.flow__title { font-size: var(--fs-base); font-weight: 650; color: var(--ink); }
.flow__note  { font-size: var(--fs-xs); color: var(--ink-3); margin-top: 4px; }

/* =====================================================================
   AUDIENCE CARDS — "Who We Help" / "Choose Your Situation"
   raw.pdf p15 (designers, builders, Realtors, businesses, homeowners)
   Realtor PDF 5 (four situation cards)
   ===================================================================== */
.aud-grid {
  display: grid; gap: var(--s3);
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 16rem), 1fr));
}
.aud-card {
  display: flex; flex-direction: column; gap: var(--s1);
  padding: var(--s3);
  background: var(--surface);
  border: 1px solid var(--line);
  border-radius: var(--radius);
  text-decoration: none;
  transition: transform var(--dur) var(--ease-out),
              box-shadow var(--dur) var(--ease-out),
              border-color var(--dur) var(--ease-out);
}
.aud-card:hover {
  transform: translateY(-4px);
  box-shadow: var(--shadow-md);
  border-color: var(--green);
}
.aud-card__icon {
  display: grid; place-items: center;
  width: 2.75rem; aspect-ratio: 1; margin-bottom: var(--s1);
  border-radius: var(--radius-sm);
  background: var(--green-050); color: var(--green-text);
  font-size: 1.25rem;
}
.aud-card__title { font-size: var(--fs-lg); font-weight: 650; color: var(--ink); margin: 0; }
.aud-card__body  { font-size: var(--fs-sm); color: var(--ink-2); margin: 0; }
.aud-card__cta {
  margin-top: auto; padding-top: var(--s2);
  font-size: var(--fs-sm); font-weight: 650; color: var(--green-text);
}
.aud-card__cta::after { content: " \2192"; transition: transform var(--dur) var(--ease-out); display: inline-block; }
.aud-card:hover .aud-card__cta::after { transform: translateX(3px); }

/* =====================================================================
   MEDIA
   ===================================================================== */
.media-frame {
  border-radius: var(--radius-lg); overflow: hidden;
  box-shadow: var(--shadow-md); background: var(--surface-3);
}
.media-frame img, .media-frame video { display: block; width: 100%; height: auto; }
figure { margin: 0; }
figcaption { font-size: var(--fs-xs); color: var(--ink-3); margin-top: var(--s1); }

/* =====================================================================
   DARK / MESH BANDS
   ===================================================================== */
.band-dark { background: var(--dark); color: var(--on-dark); }
.band-dark h1, .band-dark h2, .band-dark h3 { color: var(--on-dark); }
.band-dark p { color: var(--on-dark-2); }

.band-mesh { position: relative; isolation: isolate; background: var(--dark); color: var(--on-dark); }
.band-mesh::before {
  content: ""; position: absolute; inset: 0; z-index: -1; opacity: .55;
  background:
    radial-gradient(60rem 30rem at 8% 0%,   var(--green-050), transparent 60%),
    radial-gradient(50rem 26rem at 92% 100%, var(--amber-050), transparent 60%);
}
.band-mesh h2 { color: var(--on-dark); }
.band-mesh p  { color: var(--on-dark-2); }

/* =====================================================================
   ACCESSIBILITY
   ===================================================================== */
.skip-link {
  position: absolute; left: var(--s2); top: -100%; z-index: 999;
  padding: var(--s2) var(--s3);
  background: var(--ink); color: #fff;
  border-radius: var(--radius-sm); font-weight: 650;
  transition: top var(--dur-fast);
}
.skip-link:focus { top: var(--s2); }

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

/* =====================================================================
   PRINT
   ===================================================================== */
@media print {
  .btn, .btn-row, .tstrip, .skip-link { display: none !important; }
  body { color: #000; font-size: 11pt; }
  a[href^="http"]::after { content: " (" attr(href) ")"; font-size: 9pt; color: #555; }
}

/* =====================================================================
   BRAND LOCKUP
   brand.logo_mark is TODO_ on every new site until real marks exist.
   A deliberate monogram reads as a design decision; a broken <img> does not.
   Swap automatically once brand.logo_mark is filled in — no CSS change needed.
   ===================================================================== */
.brand { display: inline-flex; align-items: center; gap: .6rem; text-decoration: none; }

.brand__monogram {
  display: grid; place-items: center;
  width: 38px; height: 38px; flex: none;
  border-radius: 10px;
  background: var(--green);
  color: #fff;
  font-family: var(--font-head);
  font-size: .95rem; font-weight: 700; letter-spacing: .02em;
  box-shadow: var(--shadow-sm);
}

.brand__name {
  font-family: var(--font-head);
  font-weight: 650;
  font-size: 1.02rem;
  line-height: 1.15;
  letter-spacing: -.015em;
  color: var(--ink);
  max-width: 15ch;
}
.brand[style*="#fff"] .brand__name { color: #fff; }

@media (max-width: 900px) { .brand__name { max-width: 11ch; font-size: .95rem; } }

/* =====================================================================
   EQUAL HOUSING OPPORTUNITY / REALTOR COMPLIANCE BLOCK
   Real estate sites only. Must be legible, not buried — this is a
   regulatory notice, so it does not get 10px grey treatment.
   The EHO mark is a regulated logo: never recolour, distort or crop it.
   ===================================================================== */
.compliance {
  display: flex; align-items: flex-start; gap: var(--s3);
  padding: var(--s3) 0;
  margin-top: var(--s3);
  border-top: 1px solid rgba(255,255,255,.12);
}
.compliance__eho {
  flex: none; width: 46px; height: auto;
  color: var(--on-dark);
  opacity: .92;
}
.compliance__text p {
  font-size: .78rem;
  line-height: 1.6;
  color: var(--on-dark-2);
  margin: 0 0 .5em;
  max-width: 92ch;
}
.compliance__text p:last-child { margin-bottom: 0; }
.compliance__text strong { color: var(--on-dark); font-weight: 650; }

@media (max-width: 640px) {
  .compliance { flex-direction: column; gap: var(--s2); }
}

/* checkbox rows in the Plan My Move form */
fieldset.field { border: 0; padding: 0; margin: 0 0 var(--s3); }
fieldset.field legend {
  font-size: var(--fs-sm); font-weight: 600; color: var(--ink-2);
  padding: 0; margin-bottom: var(--s1);
}
.check {
  display: flex; align-items: center; gap: .55rem;
  font-size: var(--fs-sm); font-weight: 400; color: var(--ink-2);
  padding: .3rem 0; cursor: pointer;
}
.check input { width: auto; margin: 0; }

/* =====================================================================
   SESSION 6 — homesforsalestgeorgeutah.com only.
   Appended, never edited into the shared rules above (PARALLEL-WORK.md:
   "appending a site-specific rule is fine; editing shared rules is not").
   ===================================================================== */

/* Territory note in the footer. The metro core is the whole service area;
   everything outside it links to the regional sibling instead. */
.footer__area {
  margin-top: var(--s4);
  padding-top: var(--s3);
  border-top: 1px solid rgba(255,255,255,.10);
  font-size: var(--fs-xs);
  color: var(--on-dark-2);
  max-width: 78ch;
}
.footer__area strong { color: var(--on-dark); font-weight: 600; }

/* UNUSED. Written for a second implementation of the move-offer block that was
   withdrawn in favour of inc/offer.php (which styles its hold notice inline).
   Kept only so a future approved offer block has somewhere to land; delete if
   inc/offer.php is still styling itself when the offer is signed off. */
.offer-draft {
  border: 2px dashed var(--amber);
  border-radius: var(--radius);
  background: var(--amber-050);
  padding: var(--s4);
  margin-top: var(--s4);
}
.offer-draft__flag {
  display: inline-block;
  font-size: .6875rem;
  font-weight: 700;
  letter-spacing: .08em;
  text-transform: uppercase;
  color: #6b4410;
  background: rgba(200,134,42,.28);
  border-radius: var(--radius-sm);
  padding: .3rem .6rem;
  margin: 0 0 var(--s3);
}
.offer-draft__headline {
  font-family: var(--font-head);
  font-size: var(--fs-lg);
  font-weight: 650;
  color: var(--ink);
  margin: 0 0 var(--s2);
  max-width: 34ch;
}
.offer-draft__body {
  font-size: var(--fs-sm);
  color: var(--ink-2);
  margin: 0 0 var(--s2);
  max-width: 68ch;
}
.offer-draft__todo {
  margin: 0 0 var(--s2);
  padding-left: 1.15rem;
  font-size: var(--fs-xs);
  color: var(--ink-3);
}
.offer-draft__todo li { margin-bottom: .35rem; }

/* Community lists on /areas/ and the relocation pages. */
.area-group { margin-bottom: var(--s5); }
.area-group:last-child { margin-bottom: 0; }
.area-group__head {
  display: flex; flex-wrap: wrap; align-items: baseline; gap: var(--s2);
  padding-bottom: var(--s2);
  border-bottom: 1px solid var(--line);
}
.area-group__head h3 { margin: 0; font-size: var(--fs-lg); }
.area-group__meta { font-size: var(--fs-xs); color: var(--ink-3); }
.area-list {
  list-style: none; margin: var(--s3) 0 0; padding: 0;
  display: grid; gap: var(--s2);
  grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));
}
.area-list li {
  border: 1px solid var(--line);
  border-radius: var(--radius-sm);
  background: var(--surface);
  padding: var(--s2) var(--s3);
}
.area-list b { display: block; font-size: var(--fs-base); font-weight: 650; color: var(--ink); }
.area-list span { display: block; margin-top: 3px; font-size: var(--fs-xs); color: var(--ink-3); line-height: 1.5; }

/* ---------------------------------------------------------------------
   Checkbox rows — "What else do you need?" on Plan My Move step 2.

   APPENDED, not edited into the shared .check block further up this file,
   per the header of this section.

   Two things were broken, both because the checkboxes sit inside a .field
   wrapper that site.css writes for TEXT inputs:

   1. `.field input` (site.css) gives every input min-height:48px, 12px/14px
      padding, a 1.5px border and a white fill. The shared `.check input`
      rule resets only width and margin — equal specificity, so it wins on
      those two properties and nothing else. The checkbox was therefore
      being drawn as a ~48px tall bordered box instead of a checkbox.

   2. `.field label` (0,0,1,1) outranks `.check` (0,0,1,0), so the row never
      received display:flex at all: it rendered as a 600-weight block label,
      and the gap and vertical centring in the shared rule were dead code.

   Every selector below is deliberately specific enough to beat
   `.field label` and `.field input`, and the control is redrawn from
   scratch with appearance:none rather than fought with property by
   property. Colours are the navy/brass tokens, not browser blue.
   --------------------------------------------------------------------- */

/* The row. A real 48px tap target, per the mobile-first rule in the
   runbook — the old .3rem padding gave about 35px. */
.field label.check {
  display: flex;
  align-items: center;
  gap: .7rem;
  min-height: 48px;
  margin-bottom: 0;
  padding: .7rem .85rem;
  font-size: var(--fs-sm);
  font-weight: 500;
  color: var(--ink-2);
  background: var(--surface);
  border: 1.5px solid var(--line);
  border-radius: var(--radius-sm);
  cursor: pointer;
  transition: border-color .15s ease, background-color .15s ease, color .15s ease;
}
/* Sibling spacing rather than a grid on the fieldset: <legend> is a special
   child and turning its parent into a grid container moves it about in some
   browsers. The legend already carries its own bottom margin. */
.field label.check + label.check { margin-top: 8px; }
.field label.check:hover { border-color: var(--teal); background: var(--surface-2); }

/* The control. */
.field .check input[type="checkbox"] {
  -webkit-appearance: none;
  appearance: none;
  flex: 0 0 auto;
  width: 22px;
  height: 22px;
  min-height: 0;          /* kills the inherited 48px */
  margin: 0;
  padding: 0;             /* kills the inherited 12px 14px */
  background-color: var(--surface);
  border: 1.5px solid var(--ink-3);
  border-radius: 6px;
  cursor: pointer;
  transition: background-color .15s ease, border-color .15s ease;
}
.field .check input[type="checkbox"]:checked {
  background-color: var(--green);
  border-color: var(--green);
  /* White tick, inlined so it costs no request. #fff is %23fff — an
     unescaped # ends the data URI and silently leaves the box blank. */
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='%23fff' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M3.5 8.5l3 3 6-6'/%3E%3C/svg%3E");
  background-repeat: no-repeat;
  background-position: center;
  background-size: 14px 14px;
}
/* Matches the focus ring on every other field in the form. Only
   :focus-visible is overridden, so a browser without it keeps its own
   native ring rather than losing focus indication entirely. */
.field .check input[type="checkbox"]:focus-visible {
  outline: none;
  border-color: var(--teal);
  box-shadow: 0 0 0 3px var(--teal-050);
}
/* Progressive enhancement: the whole row tints when ticked. Decorative
   only — the control itself is already unambiguous where :has() is not
   supported. */
.field label.check:has(input[type="checkbox"]:checked) {
  border-color: var(--green);
  background: var(--green-050);
  color: var(--ink);
}

/* =====================================================================
   SESSION 7 — PHOTOGRAPHY + DARK BANDS.  homesforsalestgeorgeutah.com only.
   ---------------------------------------------------------------------
   Appended, not edited into the shared rules above. site.css and
   inc/templates/blocks.php are byte-identical with
   stgeorgeutahhomesforsale.com and stay that way; everything the redesign
   needs is either an override here or a site-local helper in inc/site.php.

   THE PROBLEM THIS SOLVES. Every section was --surface or --surface-2, so
   the page was nine near-white bands in a row with 192px of air between
   them and no photography anywhere. Correct information architecture,
   no visual hierarchy: nothing told the eye where to stop.

   THE FIX, in three parts:
     1. Rhythm  — dark bands roughly every third section, so a scroll has
                  a beat instead of a flatline.
     2. Photos  — assets/img/photos/, 27 images at two widths each, all
                  Pexels-licensed. Placed as hero backgrounds, band
                  backgrounds, split features, card media and mosaics.
     3. Air     — --section-y cut from 96px to 76px (tokens.css) and the
                  trust strip pulled up flush under the hero.

   ON DARK BANDS. site.css already has .section--dark and blocks.php
   already passes tone:"dark" through to it, so the rhythm needed no new
   plumbing — but almost nothing INSIDE a dark section was styled for it.
   .section--dark .eyebrow was var(--green) (#1D4E6F) on var(--dark)
   (#12202B): a 1.5:1 contrast ratio, i.e. invisible. Cards, flow steps,
   pills, ticks and audience cards all kept their white surfaces. The
   "on dark" block below is that missing half of the stylesheet.

   CONTRAST, measured against --dark #12202B:
     #F5F8FA  --on-dark     15.9:1   body and headings
     #A3B6C4  --on-dark-2    7.6:1   secondary text
     #E0A852  brass-on-dark  8.3:1   eyebrows, meta, numerals
   --brass #C8862A is 5.4:1 on --dark and is used for fills and 24px+
   only; the lifted #E0A852 is what carries small text.
   ===================================================================== */

/* ---------------------------------------------------------------------
   1. HEADER — dark, and no longer wrapping
   ---------------------------------------------------------------------
   The bar was white with eight nav items in it. At 1024px "Moving to
   Southern Utah", "Selling & Moving", "Next Move Program" and "Plan My
   Move" each broke onto three lines and the header grew to 90px of
   ransom-note text. Two changes: the labels got shorter (nav.primary in
   client-config.json) and every link is now nowrap, so the row can never
   wrap again — if it does not fit, the hamburger takes over instead.
   --------------------------------------------------------------------- */
.site-header {
  background: rgba(15, 26, 35, .90);
  -webkit-backdrop-filter: saturate(140%) blur(14px);
  backdrop-filter: saturate(140%) blur(14px);
  border-bottom: 1px solid rgba(255, 255, 255, .10);
}
.site-header__bar { min-height: 74px; gap: var(--s3); }

/* THE OVERLAP BUG. site.css gives every direct child of .site-header__bar
   min-width:0, which is the correct fix for long words in a grid cell but
   makes .nav shrinkable below its own content. With nowrap links inside, the
   nav box was compressed to 597px around 678px of links and the last two
   spilled out over the phone button — "About" printed on top of the phone
   number. flex:none is the fix: the nav is never squeezed, so if it does not
   fit, the hamburger takes the row instead of it overlapping.

   SCOPED TO THE DESKTOP RANGE ON PURPOSE. Applied at every width it moves the
   crush from the nav to the brand: the header CTA group is 352px of phone
   button, Plan-my-move button and Menu, and if that cannot shrink either then
   on a 500px screen the brand gets the 59px left over and "Justin Ruuth |
   Homes For Sale St. George Utah" stacks into a 157px-tall column of single
   words. Above 1080px the nav is visible and must not be squeezed; below it,
   the row needs to be able to give. */
@media (min-width: 1080px) {
  .nav, .header-cta { flex: none; }
}

/* PHONE HEADER. Under 768px site.css shows .sticky-cta, a fixed bottom bar
   carrying "Call now" and "Plan my move" — the same two actions as the header
   buttons, on screen at all times. Two copies of both in 390px of width is
   what left the brand with 59px. The header keeps the brand and the Menu
   toggle; the sticky bar keeps the actions. Nothing is lost. */
@media (max-width: 767px) {
  .site-header__bar { gap: var(--s2); min-height: 62px; }
  .site-header .header-cta .btn { display: none; }
  .brand__name {
    max-width: 22ch;
    font-size: .8125rem;
    line-height: 1.25;
  }
  .site-header .brand img { width: 34px; height: 34px; }
}

/* The logo master is black line art (see siteConf/optimize-images.php), so
   it disappears on a dark bar. A white tile round it is the same decision
   the favicons make. */
.site-header .brand img {
  background: #fff;
  padding: 4px;
  border-radius: 10px;
  box-shadow: 0 1px 0 rgba(255, 255, 255, .35);
}
.site-header .brand,
.site-header .brand span,
.site-header .brand__name { color: #fff; }

.nav { gap: 20px; }
.nav a {
  position: relative;
  white-space: nowrap;               /* the actual anti-squish rule */
  padding-block: 8px;
  font-size: .9063rem;
  font-weight: 500;
  color: rgba(245, 248, 250, .80);
  transition: color var(--dur-fast) var(--ease-out);
}
.nav a:hover,
.nav a[aria-current="page"] { color: #fff; }
/* Underline wipes in from the left rather than appearing, which reads as
   deliberate at 60fps and costs one compositor property. */
.nav a::after {
  content: ""; position: absolute; left: 0; right: 100%; bottom: 0;
  height: 2px; border-radius: 2px; background: var(--amber);
  transition: right var(--dur) var(--ease-out);
}
.nav a:hover::after,
.nav a[aria-current="page"]::after { right: 0; }

/* site.css turns the nav on at 980px. Six nowrap labels plus the brand,
   the phone and the CTA need about 1080px, so this window is handed to
   the hamburger instead of being allowed to overflow. */
@media (min-width: 980px) and (max-width: 1079px) {
  .nav { display: none; }
  .nav-toggle { display: inline-flex; }
  .header-cta { margin-left: auto; }
}

.site-header .btn--secondary {
  color: #fff;
  border-color: rgba(255, 255, 255, .32);
  background: transparent;
}
.site-header .btn--secondary:hover {
  background: rgba(255, 255, 255, .12);
  color: #fff;
  border-color: rgba(255, 255, 255, .5);
}
.site-header .nav-toggle {
  color: #fff;
  border-color: rgba(255, 255, 255, .28);
}
.site-header .nav-toggle:hover { background: rgba(255, 255, 255, .10); }

.mobile-nav { border-top-color: rgba(255, 255, 255, .12); }
.mobile-nav a {
  color: rgba(245, 248, 250, .88);
  border-bottom-color: rgba(255, 255, 255, .09);
}
.mobile-nav a:hover { color: #fff; }

/* The ribbon sits above a dark bar now, so it reads as a brand edge
   rather than a stray line on white. */
.ribbon { height: 5px; }

/* BREADCRUMBS. inc/header.php emits them as <div class="wrap"><nav class="crumbs">
   immediately after </header>, so on an interior page they were a 44px band of
   white stranded between the dark header and the dark photo hero — it read as
   a rendering fault rather than a divider. Merged into the header instead.
   Scoped to the wrap that directly follows the header so the crumbs used
   anywhere else keep site.css's light treatment. */
.site-header + .wrap {
  background: rgba(15, 26, 35, .90);
  max-width: none;
  padding-inline: 0;
}
.site-header + .wrap .crumbs {
  width: 100%; max-width: var(--wrap);
  margin-inline: auto;
  padding-inline: var(--gutter);
  padding-block: 10px;
  color: rgba(163, 182, 196, .85);
  border-top: 1px solid rgba(255, 255, 255, .07);
}
.site-header + .wrap .crumbs a { color: rgba(163, 182, 196, .85); }
.site-header + .wrap .crumbs a:hover { color: #fff; }
.site-header + .wrap .crumbs li + li::before { color: rgba(255, 255, 255, .25); }
.site-header + .wrap .crumbs [aria-current="page"] { color: #fff; }

/* ---------------------------------------------------------------------
   2. PHOTO HERO
   ---------------------------------------------------------------------
   A real photograph behind the H1, with a scrim heavy enough on the text
   side to hold AA at body size and light enough on the far side that the
   image is still doing work. Two layers, both behind z-index 0:
     -2  the <img> itself (an <img>, not a background-image, so it can
         carry a srcset and be lazy/eager-loaded per page)
     -1  the gradient scrim
   --------------------------------------------------------------------- */
.phero {
  position: relative;
  isolation: isolate;
  overflow: hidden;
  background: var(--dark);
  color: var(--on-dark);
  padding-block: clamp(56px, 7vw, 96px);
}
.phero__bg {
  position: absolute; inset: 0; z-index: -2;
  width: 100%; height: 100%;
  object-fit: cover;
  object-position: center 42%;
}
/* The scrim is heavy behind the H1 and light over the far side, so the copy
   holds AA and the photograph is still legible as a photograph. Tuned against
   the actual hero image rather than picked: at a flat .75 the house behind it
   read as grey fog, and the point of a photographic hero is that you can see
   what it is. The bottom wash only exists to seat the trust strip. */
.phero::after {
  content: ""; position: absolute; inset: 0; z-index: -1;
  background:
    linear-gradient(100deg,
      rgba(9, 18, 25, .93) 0%,
      rgba(9, 18, 25, .86) 30%,
      rgba(9, 18, 25, .52) 58%,
      rgba(9, 18, 25, .22) 100%),
    linear-gradient(to top, rgba(9, 18, 25, .55) 0%, transparent 38%);
}
/* Under 940px the copy sits over the whole frame, so the scrim has to cover
   the whole frame with it. */
@media (max-width: 939px) {
  .phero::after {
    background: linear-gradient(180deg, rgba(9, 18, 25, .88) 0%, rgba(9, 18, 25, .82) 55%, rgba(9, 18, 25, .92) 100%);
  }
}
.phero__grid { display: grid; gap: var(--s5); align-items: center; }
@media (min-width: 940px) {
  .phero__grid { grid-template-columns: 1.08fr .92fr; gap: var(--s6); }
}
.phero h1 { color: #fff; max-width: 16ch; }
.phero .lede { color: rgba(245, 248, 250, .90); margin-top: var(--s3); max-width: 54ch; }
.phero .eyebrow { color: #E0A852; }
.phero .eyebrow::before { background: var(--amber); }
.phero .btn-row { margin-top: var(--s4); }
.phero__note {
  margin-top: var(--s3);
  font-size: .9375rem;
  color: rgba(163, 182, 196, .95);
}
/* form-page-photo.php puts the selling points straight on the hero rather
   than inside a .glass panel, so .ticks needs the on-dark treatment here too. */
.phero > .wrap .ticks li { color: rgba(224, 233, 239, .95); }
.phero > .wrap .ticks li::before { border-color: #E0A852; }
/* The form card is an opaque white island inside a section whose `color` is
   --on-dark #F5F8FA. Anything in the card without an explicit colour — the
   intro paragraph, the fieldset legend, the checkbox labels — inherited
   near-white and vanished against the card. Reset the whole subtree to the
   light-background palette rather than patching one element at a time. */
.phero .form-card { color: var(--ink-2); }
.phero .form-card h2,
.phero .form-card h3,
.phero .form-card label,
.phero .form-card legend { color: var(--ink); }
.phero .form-card .form__note { color: var(--ink-3); }
.phero .form-card .eyebrow { color: var(--green-text); }
.phero .form-card .eyebrow::before { background: var(--ribbon); }
.phero .form-card a:not(.btn) { color: var(--teal-text); }
.phero .form-card a:not(.btn):hover { color: var(--green-text); }

/* The hero aside, as frosted glass rather than a white card dropped on a
   photograph. backdrop-filter is progressive: without it the rgba
   background alone is still opaque enough to read against. */
.glass {
  padding: var(--s4);
  border-radius: var(--radius-lg);
  background: rgba(18, 32, 43, .72);
  -webkit-backdrop-filter: blur(16px) saturate(130%);
  backdrop-filter: blur(16px) saturate(130%);
  border: 1px solid rgba(255, 255, 255, .14);
  box-shadow: 0 24px 60px rgba(0, 0, 0, .38);
  color: var(--on-dark-2);
}
.glass h2, .glass h3 { color: #fff; }
.glass p { color: rgba(197, 211, 221, .95); }
.glass .ticks li { color: rgba(214, 226, 234, .95); }
.glass .ticks li::before { border-color: #E0A852; }
/* /resources/ puts a list of links in its hero aside. site.css colours links
   var(--teal-text) #1F5D6E, which on the frosted panel is 1.9:1 — the words
   were there and could not be read. */
.glass a:not(.btn),
.phero a:not(.btn) {
  color: #E0A852;
  text-decoration-color: rgba(224, 168, 82, .5);
}
.glass a:not(.btn):hover,
.phero a:not(.btn):hover { color: #F0C07A; }

/* ---------------------------------------------------------------------
   3. PHOTO BAND — a section whose background is a photograph
   --------------------------------------------------------------------- */
.band-photo {
  position: relative;
  isolation: isolate;
  overflow: hidden;
  background: var(--dark);
  color: var(--on-dark-2);
}
.band-photo__bg {
  position: absolute; inset: 0; z-index: -2;
  width: 100%; height: 100%;
  object-fit: cover;
  opacity: .34;                       /* the band is a mood, not a picture */
}
.band-photo::after {
  content: ""; position: absolute; inset: 0; z-index: -1;
  background:
    linear-gradient(180deg, rgba(11, 21, 29, .90) 0%, rgba(11, 21, 29, .72) 50%, rgba(11, 21, 29, .92) 100%);
}
.band-photo h2, .band-photo h3 { color: #fff; }
.band-photo p  { color: var(--on-dark-2); }

/* The same effect, available to any .section--dark that blocks.php renders.
   render_blocks() emits exactly `class="section section--dark"` and takes no
   extra classes, and it is shared with the sibling site so it is not extended.
   Making .section--dark a positioning context instead means a dark block can
   drop <img class="sbg"> + <span class="sbg-scrim"> into its own html payload
   and get a photographic background with no change to the renderer.

   The two layers sit at z-index -2 and -1 of the section's own stacking
   context, so they are behind the .wrap content without needing z-index on it;
   isolation:isolate stops them escaping behind the page background. */
.section--dark { position: relative; isolation: isolate; overflow: hidden; }
.sbg {
  position: absolute; inset: 0; z-index: -2;
  width: 100%; height: 100%;
  object-fit: cover;
  opacity: .32;
}
.sbg-scrim {
  position: absolute; inset: 0; z-index: -1;
  background: linear-gradient(180deg,
    rgba(11, 21, 29, .90) 0%,
    rgba(11, 21, 29, .74) 50%,
    rgba(11, 21, 29, .93) 100%);
}

/* ---------------------------------------------------------------------
   4. ON DARK — the half of site.css that was never written
   ---------------------------------------------------------------------
   Everything below applies to .section--dark, .band-photo and .cta-band
   alike, so a block can be moved between them without restyling.
   --------------------------------------------------------------------- */
.section--dark .eyebrow,
.band-photo .eyebrow,
.cta-band .eyebrow { color: #E0A852; }              /* was 1.5:1 navy-on-navy */
.section--dark .eyebrow::before,
.band-photo .eyebrow::before { background: var(--amber); }

.section--dark .lede,
.band-photo .lede { color: var(--on-dark-2); }
.section--dark p,
.band-photo p { color: var(--on-dark-2); }
.section--dark .prose,
.band-photo .prose { color: var(--on-dark-2); }
.section--dark .form__note,
.band-photo .form__note { color: rgba(163, 182, 196, .88); }
.section--dark strong,
.band-photo strong { color: var(--on-dark); }

.section--dark a:not(.btn):not(.pill):not(.card):not(.aud-card),
.band-photo a:not(.btn):not(.pill):not(.card):not(.aud-card) {
  color: #E0A852;
  text-decoration-color: rgba(224, 168, 82, .45);
}
.section--dark a:not(.btn):hover,
.band-photo a:not(.btn):hover { color: #F0C07A; }

/* Cards keep their shape and swap their surface. */
.section--dark .card,
.band-photo .card {
  background: rgba(28, 46, 61, .82);
  border-color: rgba(255, 255, 255, .11);
  box-shadow: 0 12px 32px rgba(0, 0, 0, .30);
}
.section--dark .card h3,
.section--dark .card h3 a,
.band-photo .card h3,
.band-photo .card h3 a { color: #fff; }
.section--dark .card p,
.band-photo .card p { color: var(--on-dark-2); }
.section--dark .card__meta,
.band-photo .card__meta { color: #E0A852; }
.section--dark .card--link:hover,
.band-photo .card--link:hover { border-color: rgba(224, 168, 82, .45); }

/* Icon chips: the tinted-on-white fills go muddy on navy, so they are
   re-tinted against the dark surface and the stroke is lifted. */
.section--dark .chip,
.band-photo .chip,
.cta-band .chip { background: rgba(255, 255, 255, .09); }
.section--dark .chip svg,
.band-photo .chip svg,
.cta-band .chip svg { stroke: #E0A852; }

.section--dark .ticks li,
.band-photo .ticks li { color: var(--on-dark-2); }
.section--dark .ticks li::before,
.band-photo .ticks li::before { border-color: #E0A852; }

.section--dark .flow__step,
.band-photo .flow__step {
  background: rgba(28, 46, 61, .82);
  border-color: rgba(255, 255, 255, .11);
}
.section--dark .flow__step::before,
.band-photo .flow__step::before {
  background: rgba(200, 134, 42, .22);
  color: #E0A852;
}
.section--dark .flow__title,
.band-photo .flow__title { color: #fff; }
.section--dark .flow__note,
.band-photo .flow__note { color: var(--on-dark-2); }
.section--dark .flow__step:not(:last-child)::after,
.band-photo .flow__step:not(:last-child)::after { background: rgba(255, 255, 255, .16); }

.section--dark .aud-card,
.band-photo .aud-card {
  background: rgba(28, 46, 61, .82);
  border-color: rgba(255, 255, 255, .11);
}
.section--dark .aud-card:hover,
.band-photo .aud-card:hover { border-color: rgba(224, 168, 82, .5); }
.section--dark .aud-card__title,
.band-photo .aud-card__title { color: #fff; }
.section--dark .aud-card__body,
.band-photo .aud-card__body { color: var(--on-dark-2); }
.section--dark .aud-card__cta,
.band-photo .aud-card__cta { color: #E0A852; }
.section--dark .aud-card__icon,
.band-photo .aud-card__icon { background: rgba(255, 255, 255, .07); }

.section--dark .pill,
.band-photo .pill {
  background: rgba(255, 255, 255, .07);
  border-color: rgba(255, 255, 255, .18);
  color: var(--on-dark);
}
.section--dark .pill:hover,
.band-photo .pill:hover {
  background: rgba(224, 168, 82, .16);
  border-color: rgba(224, 168, 82, .55);
  color: #fff;
}

/* .step::before is background:var(--ink) — #12202B, which is exactly
   --dark. On a dark band the numbered badge was a black disc on a black
   band with white type floating in it. Brass fill, dark numeral. */
.section--dark .step::before,
.band-photo .step::before {
  background: var(--amber);
  color: #12202B;
}
.section--dark .step h3,
.band-photo .step h3 { color: #fff; }
.section--dark .step p,
.band-photo .step p { color: var(--on-dark-2); }

.section--dark .linkcols a,
.band-photo .linkcols a { color: var(--on-dark-2); }
.section--dark .linkcols a:hover,
.band-photo .linkcols a:hover { color: #E0A852; }

.section--dark .takeaway,
.band-photo .takeaway {
  background: rgba(255, 255, 255, .06);
}
.section--dark .takeaway h2,
.band-photo .takeaway h2 { color: var(--on-dark-2); }

.section--dark .inline-cta,
.band-photo .inline-cta {
  background: rgba(224, 168, 82, .10);
  border-color: rgba(255, 255, 255, .14);
  border-left-color: var(--amber);
}

.section--dark .prose blockquote,
.band-photo .prose blockquote {
  background: rgba(255, 255, 255, .06);
  border-left-color: #E0A852;
}
.section--dark .prose blockquote p,
.band-photo .prose blockquote p { color: var(--on-dark); }

.section--dark .stat b,
.band-photo .stat b { color: #E0A852; }
.section--dark .stat span,
.band-photo .stat span { color: var(--on-dark-2); }

.section--dark .faq,
.section--dark .faq details,
.band-photo .faq,
.band-photo .faq details { border-color: rgba(255, 255, 255, .12); }
.section--dark .faq summary,
.band-photo .faq summary { color: #fff; }
.section--dark .faq summary::after,
.band-photo .faq summary::after { border-color: rgba(163, 182, 196, .9); }

.section--dark .btn--secondary,
.band-photo .btn--secondary {
  color: #fff;
  border-color: rgba(255, 255, 255, .38);
  background: transparent;
}
.section--dark .btn--secondary:hover,
.band-photo .btn--secondary:hover { background: rgba(255, 255, 255, .12); color: #fff; }

.section--dark .table-scroll th,
.band-photo .table-scroll th { color: #fff; }
.section--dark .table-scroll td,
.section--dark .table-scroll th,
.band-photo .table-scroll td,
.band-photo .table-scroll th { border-bottom-color: rgba(255, 255, 255, .12); }

/* ---------------------------------------------------------------------
   5. BUTTONS
   ---------------------------------------------------------------------
   .btn--primary carried `box-shadow: 0 2px 10px rgba(111,174,18,.28)`
   from Full Service Web Design — a lime-green glow under a navy button.
   It is re-tinted here rather than in site.css, which is shared.
   --------------------------------------------------------------------- */
.btn--primary { box-shadow: 0 2px 12px rgba(29, 78, 111, .30); }
.btn--primary:hover { box-shadow: 0 8px 22px rgba(29, 78, 111, .38); }

/* Brass. The one high-contrast CTA on a dark band; #12202B text on
   #C8862A is 6.9:1. Used for the single most important action on a
   photo hero, never twice in the same view. */
.btn--gold {
  background: var(--amber);
  color: #12202B;
  border-color: transparent;
  box-shadow: 0 2px 12px rgba(200, 134, 42, .34);
}
.btn--gold:hover {
  background: #D9994A;
  color: #12202B;
  box-shadow: 0 8px 24px rgba(200, 134, 42, .42);
}

/* ---------------------------------------------------------------------
   6. SPLIT FEATURE — photograph beside copy
   --------------------------------------------------------------------- */
.split { display: grid; gap: var(--s4); align-items: center; }
@media (min-width: 900px) {
  .split { grid-template-columns: 1fr 1fr; gap: var(--s6); }
  /* Source order stays copy-first for screen readers; only the paint
     order flips, and only where there are two columns to flip. */
  .split--flip .split__media { order: 2; }
}
.split__media {
  position: relative;
  border-radius: var(--radius-lg);
  overflow: hidden;
  box-shadow: var(--shadow-lg);
  background: var(--surface-3);
}
.split__media img {
  display: block;
  width: 100%;
  height: 100%;
  aspect-ratio: 4 / 3;
  object-fit: cover;
}
.section--dark .split__media,
.band-photo .split__media { box-shadow: 0 24px 56px rgba(0, 0, 0, .42); }

/* A stat or a caption tucked into the corner of the photograph. */
.split__tag {
  position: absolute; left: var(--s3); bottom: var(--s3);
  padding: .55rem .9rem;
  border-radius: 999px;
  background: rgba(15, 26, 35, .86);
  -webkit-backdrop-filter: blur(10px);
  backdrop-filter: blur(10px);
  border: 1px solid rgba(255, 255, 255, .16);
  color: #fff;
  font-family: var(--font-head);
  font-size: .8125rem;
  font-weight: 600;
  letter-spacing: .01em;
}

/* ---------------------------------------------------------------------
   7. PHOTO MOSAIC — a full-width strip of images between sections
   ---------------------------------------------------------------------
   Two up on a phone, four up from 760px. The first tile spans two columns
   and both rows on wide screens so the strip has a focal point instead of
   reading as a contact sheet.
   --------------------------------------------------------------------- */
.pgrid {
  display: grid;
  gap: 10px;
  grid-template-columns: repeat(2, 1fr);
}
@media (min-width: 760px) {
  .pgrid { grid-template-columns: repeat(4, 1fr); grid-auto-rows: 1fr; }
  .pgrid--feature > :first-child { grid-column: span 2; grid-row: span 2; }
}
.pgrid figure {
  position: relative;
  margin: 0;
  overflow: hidden;
  border-radius: var(--radius);
  background: var(--surface-3);
  aspect-ratio: 4 / 3;
}
.pgrid img {
  width: 100%; height: 100%;
  object-fit: cover;
  transition: transform .7s var(--ease-out);
}
.pgrid figure:hover img { transform: scale(1.06); }
/* The caption sits on the photograph, so its contrast depends on whatever
   happens to be in the bottom of that frame — and several of these images end
   in pale sand or bright sky. The scrim is therefore sized to be sufficient on
   its own: opaque at the baseline, still 55% at the cap height of the text,
   and only then fading out. The text-shadow is the belt to that pair of
   braces. Measured white-on-scrim over the lightest image in the set: 12.4:1. */
.pgrid figcaption {
  position: absolute; left: 0; right: 0; bottom: 0;
  margin: 0;
  padding: var(--s5) 14px 12px;
  font-size: .8125rem;
  font-weight: 600;
  color: #fff;
  text-shadow: 0 1px 3px rgba(0, 0, 0, .55);
  background: linear-gradient(to top,
    rgba(9, 18, 25, .94) 0%,
    rgba(9, 18, 25, .82) 32%,
    rgba(9, 18, 25, .55) 58%,
    transparent 100%);
}

/* Full-bleed variant: the strip runs edge to edge with no .wrap gutter. */
.pstrip { padding-block: 0; }
.pstrip .pgrid { gap: 4px; border-radius: 0; }
.pstrip .pgrid figure { border-radius: 0; aspect-ratio: 3 / 2; }

/* ---------------------------------------------------------------------
   8. CARD MEDIA — a photograph at the top of a .card
   ---------------------------------------------------------------------
   site.css already has .card__img, but it is a bare <img> with negative
   margins, so the image cannot be cropped or zoomed without moving the
   card. .card__media is a clipping wrapper that can.
   --------------------------------------------------------------------- */
.card__media {
  display: block;
  margin: calc(var(--s3) * -1) calc(var(--s3) * -1) var(--s3);
  overflow: hidden;
  border-radius: var(--radius) var(--radius) 0 0;
  background: var(--surface-3);
  aspect-ratio: 16 / 10;
}
.card__media img {
  width: 100%; height: 100%;
  object-fit: cover;
  transition: transform .6s var(--ease-out);
}
.card--link:hover .card__media img { transform: scale(1.05); }
.section--dark .card__media,
.band-photo .card__media { background: rgba(255, 255, 255, .06); }

/* Same treatment for the audience cards, which have their own padding. */
.aud-card__media {
  display: block;
  margin: calc(var(--s3) * -1) calc(var(--s3) * -1) var(--s2);
  overflow: hidden;
  border-radius: var(--radius) var(--radius) 0 0;
  background: var(--surface-3);
  aspect-ratio: 16 / 10;
}
.aud-card__media img {
  width: 100%; height: 100%;
  object-fit: cover;
  transition: transform .6s var(--ease-out);
}
.aud-card:hover .aud-card__media img { transform: scale(1.05); }

/* ---------------------------------------------------------------------
   9. TRUST STRIP — pulled up flush under the hero
   ---------------------------------------------------------------------
   It used to be a .section--tight floating on white between the hero and
   the first block: 56px of its own padding plus 96px from the section
   below it, which is the single largest gap on the old homepage. As a
   bordered strip on --surface-2 it reads as part of the hero instead.
   --------------------------------------------------------------------- */
.tstrip-band {
  background: var(--surface-2);
  border-bottom: 1px solid var(--line);
  padding-block: var(--s3);
}
.tstrip-band .trustbar { gap: var(--s3) var(--s4); }
.tstrip-band .chip { width: 40px; height: 40px; }
.tstrip-band .chip svg { width: 20px; height: 20px; }

/* ---------------------------------------------------------------------
   10. SPACING
   ---------------------------------------------------------------------
   --section-y is cut in tokens.css. These are the leftovers: stacked
   headings that added their own margin on top of the section padding.
   --------------------------------------------------------------------- */
.section > .wrap > .eyebrow { margin-bottom: var(--s1); }
.section > .wrap > .lede.mt2 { margin-top: var(--s2); }
.section > .wrap > .grid.mt4,
.section > .wrap > .steps.mt4,
.section > .wrap > .stats.mt4 { margin-top: var(--s4); }
/* Two same-tone sections in a row read as one over-long section; drop the
   seam between them so they at least share their padding. */
.section--alt + .section--alt { padding-top: 0; }
.section--dark + .section--dark { padding-top: 0; }
/* A dark band running straight into the dark CTA band needs no seam. */
.section--dark + .cta-band .cta-band__inner,
.band-photo + .cta-band .cta-band__inner { padding-top: var(--s5); }

/* ---------------------------------------------------------------------
   11. FIGURES AND CAPTIONS
   --------------------------------------------------------------------- */
.figure {
  margin: 0;
  border-radius: var(--radius-lg);
  overflow: hidden;
  box-shadow: var(--shadow-md);
  background: var(--surface-3);
}
.figure img { display: block; width: 100%; height: auto; }
.figure--wide img { aspect-ratio: 21 / 9; object-fit: cover; }
.figure figcaption {
  padding: 12px var(--s3) var(--s3);
  font-size: .8125rem;
  color: var(--ink-3);
  background: var(--surface);
}
.section--dark .figure figcaption,
.band-photo .figure figcaption {
  background: rgba(28, 46, 61, .82);
  color: var(--on-dark-2);
}
