/* Locke & Ladder - Site 3.1
   Editorial / luxury exterior design system.
   Keeps the stacked full-bleed photography aesthetic with the
   AI-friendly information layer beneath it.
*/

/* Fonts self-hosted locally in /assets/fonts/: Termina (display), Mona Sans
   (body/sans) and Brier (serif emphasis + nav flip). All three ship as local
   woff2 - no Google Fonts / render-blocking chain. */
@font-face {
  font-family: "Termina";
  src: url("fonts/TerminaTest-Medium.woff2") format("woff2");
  font-weight: 500;
  font-style: normal;
  font-display: swap;
}
@font-face {
  font-family: "Termina";
  src: url("fonts/TerminaTest-Heavy.woff2") format("woff2");
  font-weight: 800;
  font-style: normal;
  font-display: swap;
}
/* Mona Sans replaces Source Sans 3 as the body/sans face. Upright variable
   woff2: weight 200-900, width 75-125. Body copy renders at the approved
   Regular preset (weight 400, width/stretch 100%) by default. */
@font-face {
  font-family: "Mona Sans";
  src: url("fonts/MonaSansVariable.woff2") format("woff2-variations");
  font-weight: 200 900;
  font-stretch: 75% 125%;
  font-style: normal;
  font-display: swap;
}
/* Brier replaces Source Serif 4 as the serif emphasis face (nav hover flip and
   the culture heading accents). Single weight-axis woff2. */
@font-face {
  font-family: "Brier";
  src: url("fonts/Brier-Bold.woff2") format("woff2");
  font-weight: 100 900;
  font-style: normal;
  font-display: swap;
}

:root {
  /* Light is the site-wide base. Dark surfaces (.band.dark, .cta-section,
     .ethos-band, footer, roofing-dark, ai-composed 3n) opt back into dark
     tokens explicitly. The visitor-facing light/dark toggle has been retired. */
  --ink: #1d1a15;
  --ink-soft: #38332b;
  --muted: #625a4e;
  --line: rgba(29,26,21,.17);
  --line-soft: rgba(29,26,21,.09);
  --paper: #eee9dd;
  --soft: #e2dbcc;
  --cream: #eee9dd;
  --dark: #0d0d0d;
  --dark3: #1f1f1f;
  --accent: #34373b;
  --gold: #909090;
  --gold-soft: #a8a8a8;
  /* Google review-star gold (matches the yellow of the Google "G"). Used only
     for review stars + Google badges, so they read as genuine Google reviews. */
  --google-gold: #fbbc04;
  --copper: #34373b;
  --patina: #6b8e7b;
  --green: #6b8e7b;
  --radius: 0;
  --font-display: 'Termina', 'Arial Narrow', system-ui, sans-serif;
  --font-sans: 'Mona Sans', ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
  --font-serif: 'Brier', Georgia, 'Times New Roman', serif;
  --shadow-soft: 0 1px 2px rgba(0,0,0,.04), 0 12px 36px rgba(20,15,10,.07);
  --container: 1380px;
}

* { box-sizing: border-box; }
.skip-link {
  position: fixed;
  left: 16px;
  top: 12px;
  z-index: 10000;
  padding: 12px 16px;
  background: #ffffff;
  color: #111111;
  font: 700 14px/1 var(--font-sans);
  text-decoration: none;
  border: 2px solid #111111;
  transform: translateY(-180%);
  transition: transform .15s ease;
}
.skip-link:focus { transform: translateY(0); }
/* Match original Cormorant/body footprint: scale the new fonts by x-height (weights unchanged) */
[style*="--font-display"] { }
html, body { margin: 0; padding: 0; width: 100%; overflow-x: clip; }
@supports not (overflow: clip) {
  html, body { overflow-x: hidden; }
}
html.lenis,
html.lenis body {
  height: auto;
}
html.lenis.lenis-smooth,
html.ll-lenis-fallback {
  scroll-behavior: auto !important;
}
html.lenis.lenis-smooth [data-lenis-prevent] {
  overscroll-behavior: contain;
}
html.lenis.lenis-stopped {
  overflow: hidden;
}
body {
  font-family: var(--font-sans);
  color: var(--ink-soft);
  background: var(--paper);
  line-height: 1.55;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
}
img { display: block; max-width: 100%; height: auto; }
a { color: inherit; text-decoration: none; }
button { font: inherit; }
em, i, cite, q { font-style: normal; }

/* ============ HEADER ============
   Default state: solid paper background with dark text and dark logo.
   .over-hero state (added by JS while the page is scrolled over the dark hero
   photo): transparent background with white text and white logo. */
.site-header {
  position: fixed;
  top: 0;
  left: 0;
  right: 0;
  z-index: 100;
  font-family: var(--font-display);
  backdrop-filter: blur(14px);
  border-bottom: 1px solid var(--line);
  transition: background .25s ease, border-color .25s ease, backdrop-filter .25s ease;
}
/* .site-header / .schedule-ribbon transforms are scroll-driven by site.js:
   the footer's top edge pushes them up and hands them back (no transition) */
.site-header.over-hero {
  backdrop-filter: none;
}
.nav {
  max-width: var(--container);
  margin: 0 auto;
  padding: 22px 36px;
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 40px;
}
.brand {
  display: flex;
  align-items: center;
  gap: 14px;
  line-height: 1.05;
  color: var(--ink);
  transition: color .25s ease;
}
.site-header.over-hero .brand { color: #fff; }
.brand-logo {
  height: 52px;
  width: 52px;
  display: block;
  object-fit: contain;
  transition: filter .25s ease;
}
/* OVER HERO: invert to white - visible against the dark photo. */

.brand-text-mark {
  display: flex;
  flex-direction: column;
  line-height: 1.05;
  color: inherit;
}
.brand-text-mark strong {
  font-family: var(--font-display);
  font-size: 22px;
  font-weight: 500;
  letter-spacing: .03em;
}
.brand-text-mark small {
  font-size: 9px;
  letter-spacing: .26em;
  text-transform: uppercase;
  font-weight: 700;
  opacity: .7;
  margin-top: 4px;
}
.brand-text { display: flex; flex-direction: column; line-height: 1.05; }
.brand-text strong {
  font-family: var(--font-display);
  font-size: 22px;
  font-weight: 500;
  letter-spacing: .04em;
}
.brand-text small {
  font-size: 10px;
  letter-spacing: .26em;
  text-transform: uppercase;
  font-weight: 600;
  opacity: .8;
  margin-top: 2px;
}
.footer-brand-logo {
  height: auto;
  display: block;
  object-fit: contain;
  margin-bottom: 22px;
}

/* ============ PARTNER / CERTIFICATION BADGES ============ */
.partners-band {
  background: var(--paper);
}
.partners-band .band-inner { display: flex; flex-direction: column; gap: 36px; align-items: center; }
.partners-band .partners-eyebrow {
  font-family: var(--font-sans);
  font-size: 11px;
  letter-spacing: .28em;
  text-transform: uppercase;
  font-weight: 700;
  color: var(--accent);
}
.partners-band h3 {
  font-family: var(--font-display);
  font-weight: 400;
  font-size: clamp(28px, 3.4vw, 44px);
  text-align: center;
  max-width: 760px;
  line-height: 1.15;
}
.partners-band h3 em { color: var(--accent); font-style: normal; }
.partner-grid {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  width: 100%;
  max-width: 1100px;
}
@media (max-width: 880px) { .partner-grid { grid-template-columns: repeat(2, 1fr); } }
@media (max-width: 480px) { .partner-grid { grid-template-columns: 1fr; } }
.partner-card {
  padding: 36px 24px;
  border-right: 1px solid var(--line);
  border-bottom: 1px solid var(--line);
  display: flex;
  flex-direction: column;
  gap: 10px;
  text-align: center;
  align-items: center;
}
.partner-card:nth-child(4n) { border-right: 0; }
@media (max-width: 880px) {
  
  .partner-card:nth-child(2n) { border-right: 0; }
}
@media (max-width: 480px) {
  .partner-card { border-right: 0; }
}
.partner-card .partner-name {
  font-family: var(--font-display);
  font-weight: 500;
  font-size: 22px;
  color: var(--ink);
  letter-spacing: -0.005em;
}
.partner-card .partner-role {
  font-family: var(--font-sans);
  font-size: 11px;
  letter-spacing: .22em;
  text-transform: uppercase;
  font-weight: 700;
  color: var(--accent);
}
.partner-card .partner-blurb {
  font-size: 14px;
  color: var(--muted);
  line-height: 1.55;
  margin-top: 4px;
}
.partner-grid--roofing {
  grid-template-columns: repeat(2, minmax(0, 1fr));
  max-width: 980px;
}
.partner-grid--roofing .partner-card {
  border-right: 1px solid var(--line);
}
.partner-grid--roofing .partner-card:nth-child(2n) {
  border-right: 0;
}
.partner-card--roofing {
  min-height: 320px;
  justify-content: flex-start;
  gap: 14px;
}
.partner-card .partner-name--wordmark {
  font-size: clamp(28px, 3.4vw, 42px);
  letter-spacing: 0;
  min-height: 48px;
}
.partner-certifications {
  display: flex;
  flex-wrap: wrap;
  gap: 12px;
  justify-content: center;
  align-items: center;
  margin-top: auto;
  padding-top: 8px;
}
.partner-certifications img {
  width: 78px;
  height: 78px;
  object-fit: contain;
  border-radius: 0;
  background: transparent;
  padding: 0;
  box-shadow: none;
  filter: drop-shadow(0 1px 1px rgba(0, 0, 0, 0.16));
}
.partner-certifications .partner-certification--premium-warranty {
  width: 108px;
  height: 93px;
}
body.theme-dark .partner-certifications img {
  filter: none;
}
@media (max-width: 680px) {
  .partner-grid--roofing {
    grid-template-columns: 1fr;
  }
  .partner-grid--roofing .partner-card {
    border-right: 0;
  }
}

/* ============ MATERIAL / PRODUCT BLOCKS ============ */
.product-list {
  display: grid;
  grid-template-columns: 1fr;
  gap: 0;
}
.product-row {
  display: grid;
  grid-template-columns: 240px 1fr;
  gap: 32px;
  padding: 36px 0;
  align-items: start;
}
.product-row:last-child { border-bottom: 0; }
@media (max-width: 720px) { .product-row { grid-template-columns: 1fr; gap: 12px; } }
.product-row .product-label {
  font-family: var(--font-display);
  font-weight: 500;
  font-size: clamp(22px, 2.4vw, 28px);
  color: var(--ink);
  line-height: 1.2;
}
.product-row .product-label span {
  display: block;
  font-family: var(--font-sans);
  font-size: 10px;
  letter-spacing: .26em;
  text-transform: uppercase;
  font-weight: 700;
  color: var(--accent);
  margin-bottom: 8px;
}
.product-row .product-body p { font-size: 17px; line-height: 1.65; color: var(--muted); }
.product-row .product-body p strong { color: var(--ink); }
.nav-links { display: flex; gap: 32px; flex-wrap: wrap; }
.nav-links a {
  padding: 6px 0;
  position: relative;
  transition: color .2s;
}

.nav-links a::after {
  content: '';
  position: absolute;
  left: 0;
  right: 0;
  bottom: -2px;
  height: 1px;
  background: var(--gold);
  transform: scaleX(0);
  transform-origin: left center;
  transition: transform .25s ease;
}
.nav-links a:hover::after,
.nav-links a[aria-current="page"]::after { transform: scaleX(1); }
.nav-cta {
  display: inline-flex;
  align-items: center;
  gap: 10px;
  transition: background .2s, color .2s, border-color .2s;
}

/* Mobile nav toggle (hamburger) - hidden on desktop, shown <=720px (see media query). */
.nav-toggle {
  display: none;
  flex-direction: column;
  justify-content: center;
  gap: 5px;
  width: 44px;
  height: 44px;
  padding: 10px;
  background: transparent;
  border: 0;
  cursor: pointer;
}
.nav-toggle span {
  display: block;
  width: 24px;
  height: 2px;
  background: var(--ink);
  transition: transform .25s ease, opacity .2s ease, background .25s ease;
}
.site-header.over-hero .nav-toggle span { background: #fff; }
.nav.nav-open .nav-toggle span:nth-child(1) { transform: translateY(7px) rotate(45deg); }
.nav.nav-open .nav-toggle span:nth-child(2) { opacity: 0; }
.nav.nav-open .nav-toggle span:nth-child(3) { transform: translateY(-7px) rotate(-45deg); }

/* ============ TYPE ============ */
h1, h2, h3, h4 {
  margin: 0;
  font-family: var(--font-display);
  font-weight: 500;
  letter-spacing: -0.005em;
  color: var(--ink);
  line-height: 1.05;
}

h3 {
  font-size: clamp(24px, 2.4vw, 34px);
  line-height: 1.15;
}
h4 { font-size: 14px; font-weight: 700; letter-spacing: .14em; text-transform: uppercase; line-height: 1.3; }
p {
  margin: 0;
  color: var(--muted);
}
strong { font-weight: 600; color: var(--ink); }
.eyebrow {
  display: inline-block;
  font-family: var(--font-sans);
  font-size: 11px;
  letter-spacing: .26em;
  text-transform: uppercase;
  font-weight: 700;
  color: var(--gold);
  margin: 0 0 22px;
}
.eyebrow.dark { color: var(--accent); }
.script-mark {
  font-family: var(--font-display);
  font-style: normal;
  font-weight: 400;
  color: var(--gold);
}

/* ============ HERO (BRAND) ============ */
.brand-hero {
  position: relative;
  min-height: 100vh;
  background: #0d0d0d;
  overflow: hidden;
  display: grid;
  align-items: end;
}
.brand-hero .bg {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
}
.brand-hero .shade {
  position: absolute;
  inset: 0;
  background:
    linear-gradient(180deg, rgba(0,0,0,.5) 0%, rgba(0,0,0,0) 35%, rgba(0,0,0,0) 60%, rgba(0,0,0,.8) 100%),
    linear-gradient(90deg, rgba(0,0,0,.5), rgba(0,0,0,.05) 60%);
}
.brand-hero .inner {
  position: relative;
  z-index: 2;
  max-width: var(--container);
  margin: 0 auto;
  padding: 220px 36px 120px;
  color: #fff;
  width: 100%;
}
.brand-hero h1 {
  color: #fff;
  font-family: var(--font-display);
  max-width: 1100px;
  text-shadow: 0 1px 2px rgba(0,0,0,.2);
}
.brand-hero h1 em {
  font-style: normal;
  font-weight: 400;
  color: var(--gold-soft);
}
.brand-hero .lede {
  color: rgba(255,255,255,.92);
  font-size: clamp(18px, 1.6vw, 22px);
  max-width: 720px;
  margin-top: 28px;
  line-height: 1.5;
}
.brand-hero .actions { display: flex; flex-wrap: wrap; gap: 22px; margin-top: 44px; }
.brand-hero .signals {
  display: flex;
  color: rgba(255,255,255,.88);
  flex-wrap: wrap;
}
.brand-hero .signals div {
  max-width: 200px;
}
.brand-hero .signals strong {
  display: block;
  line-height: 1;
}
.brand-hero .signals span {
  display: block;
  font-size: 10px;
  text-transform: uppercase;
  margin-bottom: 10px;
}

/* ============ EXPLORE / BUTTONS ============ */
.explore {
  display: inline-flex;
  align-items: center;
  gap: 16px;
  color: #fff;
  padding-bottom: 8px;
  border-bottom: 1px solid rgba(255,255,255,.4);
  transition: border-color .2s, color .2s, gap .2s;
}
.explore::after { content: '→'; font-size: 16px; letter-spacing: 0; font-weight: 400; line-height: 1; }
.explore:hover { color: var(--gold); border-color: var(--gold); gap: 22px; }
.explore.dark {
  color: var(--ink);
  border-color: var(--line);
}
.explore.dark:hover { color: var(--accent); border-color: var(--accent); }

.btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 12px;
  min-height: 54px;
  padding: 16px 28px;
  font-family: var(--font-sans);
  font-size: 12px;
  text-transform: uppercase;
  border: 1px solid var(--ink);
  transition: transform .15s, background .2s, color .2s, border-color .2s;
  cursor: pointer;
}

/* ============ STACKED SERVICE SECTIONS ============ */
.service-stack { background: #0d0d0d; }
.brava-profiles { gap: 0; }
.brava-profiles > .service-section,
.brava-profiles > .service-section + .service-section { margin-top: 0; }
body.brava-page main > section,
body.brava-page main > div {
  border-top: 0 !important;
  border-bottom: 0 !important;
}
.brava-page .brava-profile-details .signals {
  padding-top: 0;
  border-top: 0;
}
.brava-profile-details .band-inner {
  max-width: 1720px;
}
.brava-profile-details .lede {
  max-width: 1440px;
  color: var(--ink-soft);
  font-size: clamp(18px, 2vw, 22px);
  line-height: 1.55;
}
.brava-profile-details .actions { margin: 32px 0 20px; }
.brava-profile-details .brava-verify-line { margin: 0 0 28px; }
.brava-profile-details .brava-verify-link {
  color: var(--ink);
  text-decoration: underline;
  text-underline-offset: 4px;
}
.brava-profile-details .signals {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: 24px 36px;
  padding-top: 24px;
  border-top: 1px solid var(--line);
  color: var(--muted);
}
.brava-profile-details .signals div { max-width: none; }
.brava-profile-details .signals span,
.brava-profile-details .signals strong { display: block; }
.brava-profile-details .signals strong { color: var(--ink); }
.brava-page .brava-price-head p {
  max-width: 1440px;
}
.brava-page .brava-price-inner {
  max-width: 1720px;
}
@media (max-width: 720px) {
  .brava-profile-details .signals { grid-template-columns: 1fr; }
}
.service-section {
  position: relative;
  min-height: 88vh;
  background: #0d0d0d;
  overflow: hidden;
  display: grid;
  align-items: end;
}
.service-section .bg {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
  filter: saturate(.95);
  transition: transform 5s ease;
}
.service-section:hover .bg { transform: scale(1.03); }
.service-section .shade {
  position: absolute;
  inset: 0;
  background:
    linear-gradient(0deg, rgba(0,0,0,.78), rgba(0,0,0,0) 55%),
    linear-gradient(90deg, rgba(0,0,0,.5), rgba(0,0,0,0) 50%);
}
.service-section .inner {
  position: relative;
  z-index: 2;
  max-width: var(--container);
  margin: 0 auto;
  padding: 120px 36px 88px;
  color: #fff;
  width: 100%;
}
.service-section h2 {
  color: #fff;
  font-family: var(--font-display);
  font-weight: 400;
  letter-spacing: .005em;
  max-width: 940px;
  margin: 12px 0 24px;
  text-shadow: 0 1px 2px rgba(0,0,0,.2);
}
.service-section h2 em { font-style: normal; color: var(--gold-soft); }
.service-section .tagline {
  color: rgba(255,255,255,.88);
  font-size: 19px;
  max-width: 620px;
  margin-bottom: 36px;
  line-height: 1.55;
}
.service-section .service-label {
  font-family: var(--font-sans);
  font-size: 11px;
  letter-spacing: .3em;
  text-transform: uppercase;
  font-weight: 700;
  color: var(--gold);
}
.service-section .meta {
  display: flex;
  gap: 36px;
  margin-bottom: 20px;
  flex-wrap: wrap;
  font-size: 13px;
  color: rgba(255,255,255,.72);
}
.service-section .meta strong {
  display: block;
  color: #fff;
  font-family: var(--font-display);
  font-weight: 400;
  font-size: 22px;
  line-height: 1;
  margin-bottom: 4px;
}

/* ============ BANDS / EDITORIAL SECTIONS ============ */

.band.paper { background: var(--paper); }
.band.dark {
  background: var(--dark);
  color: #dcdcdc;
  border-top-color: #222222;
}
.band.dark h1, .band.dark h2, .band.dark h3, .band.dark h4 { color: #fff; }
.band.dark p { color: #c4c4c4; }
.band-inner { max-width: var(--container); margin: 0 auto; padding: 0 36px; }
.section-head {
  display: grid;
  grid-template-columns: minmax(0,1fr) minmax(280px,500px);
  align-items: end;
}

.section-head h2 { max-width: 760px; }
@media (max-width: 880px) {
  
  .section-head {
  grid-template-columns: 1fr;
}
}

/* ============ EDITORIAL GRID ============ */
.grid { display: grid; gap: 28px; }
.grid.two { grid-template-columns: repeat(2, minmax(0,1fr)); }
.grid.three { grid-template-columns: repeat(3, minmax(0,1fr)); }

@media (max-width: 980px) {
  .grid.three, .grid.four { grid-template-columns: repeat(2, 1fr); }
}
@media (max-width: 620px) {
  .grid.two, .grid.three, .grid.four { grid-template-columns: 1fr; }
}
/* Center a lone card sitting on its own row (3-column layout only) */
@media (min-width: 981px) {
  .grid.three > .review.center-solo {
    grid-column: 1 / -1;
    max-width: calc((100% - 56px) / 3);
    margin-inline: auto;
  }
}

/* ============ EDITORIAL CARDS ============ */
.card {
  background: transparent;
  border: 0;
  padding: 0;
  display: flex;
  flex-direction: column;
  gap: 18px;
}
.card .kicker {
  display: inline-block;
  font-family: var(--font-sans);
  font-size: 11px;
  letter-spacing: .26em;
  text-transform: uppercase;
  font-weight: 700;
  color: var(--accent);
}
.band.dark .card .kicker { color: var(--gold); }

.card h3 {
  font-family: var(--font-display);
  font-weight: 500;
  color: var(--ink);
  line-height: 1.15;
}
.band.dark .card h3 { color: #fff; }
.card p { font-size: 17px; color: var(--muted); }
.band.dark .card p { color: #c4c4c4; }
.card .arrow {
  margin-top: auto;
  font-family: var(--font-sans);
  font-size: 11px;
  text-transform: uppercase;
  color: var(--accent);
  border-bottom: 1px solid var(--line);
  padding-bottom: 8px;
  align-self: flex-start;
  transition: color .2s, border-color .2s;
}
a.card { transition: opacity .2s; }
a.card:hover .arrow { color: var(--gold); border-color: var(--gold); }

/* ============ ANSWER CARDS (cost numbers) ============ */
.answer-card .figure {
  font-family: var(--font-display);
  font-size: 48px;
  font-weight: 500;
  color: var(--ink);
  line-height: 1;
  letter-spacing: -0.005em;
}
.answer-card .figure small {
  display: block;
  margin-top: 8px;
  font-family: var(--font-sans);
  font-size: 12px;
  font-weight: 600;
  letter-spacing: .18em;
  text-transform: uppercase;
  color: var(--muted);
}
.answer-card .range {
  font-size: 14px;
  color: var(--muted);
  margin-top: 4px;
}

/* ============ EDITORIAL SPLIT ============ */
.split {
  display: grid;
  grid-template-columns: minmax(0,1fr) minmax(380px,560px);
  gap: 96px;
  align-items: center;
}

.split .media { overflow: hidden; }
.split .media img { aspect-ratio: 4/5; object-fit: cover; width: 100%; }

@media (max-width: 880px) {
  .split, .split.reverse {
  grid-template-columns: 1fr;
}
}

/* ============ COST INDEX (editorial) ============ */
.index-block {
  background: transparent;
  border: 0;
  padding: 0;
  scroll-margin-top: 110px;
  display: grid;
  grid-template-columns: 300px 1fr;
  gap: 80px;
}
@media (max-width: 880px) { .index-block {
  gap: 36px;
} }
.index-tabs { display: flex; flex-direction: column; gap: 0; }
.index-tab {
  text-align: left;
  background: transparent;
  border: 0;
  border-top: 1px solid var(--line);
  padding: 22px 0;
  cursor: pointer;
  transition: padding-left .2s;
}
.index-tab:last-child { border-bottom: 1px solid var(--line); }
.index-tab:hover { padding-left: 12px; }
.index-tab.is-active { padding-left: 18px; border-left: 2px solid var(--accent); margin-left: -20px; padding-left: 18px; }
.index-tab span {
  display: block;
  font-family: var(--font-sans);
  text-transform: uppercase;
  font-weight: 700;
  color: var(--accent);
  margin-bottom: 6px;
}
.index-tab strong {
  display: block;
  font-family: var(--font-display);
  font-weight: 500;
  font-size: 22px;
  color: var(--ink);
  line-height: 1.2;
}
.index-tab small {
  display: block;
  font-size: 12px;
  color: var(--muted);
  margin-top: 6px;
  letter-spacing: .04em;
}

.index-panel { display: flex; flex-direction: column; gap: 28px; }
.index-panel .label {
  font-family: var(--font-sans);
  font-size: 11px;
  letter-spacing: .26em;
  text-transform: uppercase;
  font-weight: 700;
  color: var(--accent);
}
.index-panel h3 {
  font-family: var(--font-display);
  font-size: clamp(48px, 6.4vw, 88px);
  font-weight: 500;
  color: var(--ink);
  line-height: 1;
  letter-spacing: -0.01em;
}
.range-bar {
  position: relative;
  height: 2px;
  background: var(--line);
  margin: 4px 0 8px;
}
.range-bar i {
  position: absolute;
  left: 22%;
  right: 22%;
  top: -1px;
  bottom: -1px;
  background: var(--accent);
}
.stat-row {
  display: grid;
  margin-top: 4px;
}
.stat-row div {
  padding: 18px 4px 18px 0;
}
.stat-row div:last-child { border-right: 0; padding-right: 0; }
.stat-row span {
  font-family: var(--font-sans);
  text-transform: uppercase;
  font-weight: 700;
  color: var(--muted);
}
.stat-row strong {
  display: block;
  font-family: var(--font-display);
  font-size: 26px;
  color: var(--ink);
  font-weight: 500;
  margin-top: 6px;
  letter-spacing: -0.005em;
}
.confidence {
  font-size: 14px;
  color: var(--muted);
  font-style: normal;
  font-family: var(--font-display);
}

/* ============ CALCULATOR ============ */
.calculator {
  background: var(--dark);
  color: #fff;
  padding: 64px;
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 64px;
  margin-top: 32px;
}
@media (max-width: 880px) { .calculator { grid-template-columns: 1fr; gap: 32px; padding: 40px; } }
.calculator h3, .calculator h4 { color: #fff; }
.calculator p { color: #c4c4c4; font-size: 16px; }
.calc-form { display: flex; flex-direction: column; gap: 22px; }
.calc-form label {
  display: flex;
  flex-direction: column;
  gap: 10px;
  font-family: var(--font-sans);
  font-size: 11px;
  font-weight: 700;
  letter-spacing: .22em;
  text-transform: uppercase;
  color: var(--gold);
}
.calc-form select, .calc-form input[type="range"] {
  font-family: var(--font-sans);
  font-size: 15px;
  background: transparent;
  color: #fff;
  border: 0;
  border-bottom: 1px solid rgba(255,255,255,.3);
  padding: 12px 0;
  letter-spacing: 0;
}
.calc-form select:focus { outline: none; border-bottom-color: var(--gold); }
.calc-form input[type="range"] {
  padding: 0;
  border-bottom: 0;
  height: 4px;
  background: rgba(255,255,255,.15);
}
.calc-output {
  padding-left: 56px;
  display: flex;
  flex-direction: column;
  gap: 20px;
  justify-content: center;
}
@media (max-width: 880px) { .calc-output {
  border-left: 0;
  padding-left: 0;
  padding-top: 32px;
} }
.calc-output .system-label {
  font-family: var(--font-sans);
  font-size: 11px;
  letter-spacing: .26em;
  text-transform: uppercase;
  font-weight: 700;
  color: var(--gold);
}
.calc-output .range-out {
  font-family: var(--font-display);
  font-size: clamp(40px, 5vw, 64px);
  font-weight: 400;
  color: #fff;
  line-height: 1;
  letter-spacing: -0.01em;
}
.calc-output p { font-size: 14px; color: #a8a8a8; line-height: 1.6; }

/* ============ MATERIAL FIT ADVISOR ============ */
.advisor-shell {
  background: var(--paper);
  border-top: 3px solid var(--accent);   /* copper accent flags the interactive tool */
  border-bottom: 1px solid var(--line);
  padding: 72px 0;
}
/* Lift the tool into a distinct, elevated panel so it reads as interactive,
   not just more page. */
.advisor-body {
  display: grid; grid-template-columns: 1fr 1fr; gap: 64px; align-items: start;
  background: var(--soft);
  border: 1px solid var(--line);
  border-radius: 16px;
  padding: 44px;
  box-shadow: 0 26px 70px rgba(0,0,0,0.30);
  margin-top: 14px;
}
@media (max-width: 880px) { .advisor-body { grid-template-columns: 1fr; gap: 34px; padding: 26px; } }
.advisor-controls { display: flex; flex-direction: column; gap: 24px; }
.advisor-controls label {
  display: flex;
  flex-direction: column;
  gap: 8px;
  font-family: var(--font-sans);
  font-size: 11px;
  font-weight: 700;
  letter-spacing: .22em;
  text-transform: uppercase;
  color: var(--muted);
}
.advisor-controls select {
  font-family: var(--font-sans);
  font-size: 17px;
  padding: 12px 0;
  border: 0;
  border-bottom: 1px solid var(--line);
  background: transparent;
  color: var(--ink);
  letter-spacing: 0;
}
.advisor-controls select:focus { outline: none; border-bottom-color: var(--accent); }

@media (max-width: 880px) { .recommendation {
  padding-left: 0;
  border-left: 0;
  padding-top: 32px;
} }
.recommendation .rec-label {
  font-family: var(--font-sans);
  font-size: 11px;
  letter-spacing: .26em;
  text-transform: uppercase;
  font-weight: 700;
  color: var(--accent);
  margin-bottom: 14px;
  display: block;
}
.recommendation h3 {
  margin-bottom: 16px;
  font-family: var(--font-display);
  font-weight: 500;
  font-size: clamp(32px, 3.8vw, 48px);
  line-height: 1.1;
}
.recommendation > p {
  font-size: 17px;
  line-height: 1.6;
}
.recommendation ul {
  list-style: none;
  margin: 28px 0 0;
  padding: 0;
  display: flex;
  flex-direction: column;
  gap: 14px;
}
.recommendation li {
  padding-left: 24px;
  position: relative;
  font-size: 15px;
  color: var(--muted);
  line-height: 1.6;
}
.recommendation li::before {
  content: "–";
  position: absolute;
  left: 0;
  top: 0;
  color: var(--accent);
  font-weight: 700;
}

/* ============ EDITORIAL TABLES ============ */
.table-wrap { overflow-x: auto; }
table.compare {
  width: 100%;
  border-collapse: collapse;
  background: transparent;
  font-size: 15px;
  font-family: var(--font-sans);
}
.compare th, .compare td {
  padding: 24px 20px;
  text-align: left;
  border-bottom: 1px solid var(--line);
  vertical-align: top;
}
.compare th {
  background: transparent;
  font-size: 10px;
  letter-spacing: .22em;
  text-transform: uppercase;
  font-weight: 700;
  color: var(--muted);
  border-bottom: 1px solid var(--ink);
  padding-bottom: 12px;
}
.compare tbody tr:last-child td { border-bottom: 0; }
.compare td strong { font-family: var(--font-display); font-weight: 500; font-size: 19px; color: var(--ink); }
.compare td:last-child { font-family: var(--font-display); font-weight: 500; font-size: 19px; color: var(--ink); }

/* ============ TESTIMONIAL WALL ============ */
.review-summary {
  display: flex;
  flex-wrap: wrap;
  gap: 56px;
  align-items: center;
  margin-bottom: 80px;
  padding: 48px 0;
}
.review-summary .big {
  font-family: var(--font-display);
  font-size: 88px;
  font-weight: 400;
  color: var(--ink);
  line-height: 1;
  letter-spacing: -0.02em;
}
.review-summary .stars { color: var(--google-gold); font-size: 18px; letter-spacing: 4px; margin-top: 8px; }
.review-summary .breakdown { display: flex; gap: 44px; flex-wrap: wrap; }
.review-summary .breakdown div {
  font-family: var(--font-sans);
  color: var(--muted);
}
.review-summary .breakdown strong {
  display: block;
  font-family: var(--font-display);
  font-size: 28px;
  font-weight: 500;
  color: var(--ink);
  letter-spacing: -0.01em;
  margin-bottom: 4px;
}

.review {
  background: transparent;
  border: 0;
  padding: 32px 0 0;
  display: flex;
  flex-direction: column;
  gap: 18px;
}
.review .stars { color: var(--google-gold); letter-spacing: 3px; font-size: 13px; }
.review p {
  font-family: var(--font-display);
  font-weight: 400;
  font-size: 22px;
  color: var(--ink);
  line-height: 1.4;
  font-style: normal;
}
.review .attrib {
  font-family: var(--font-sans);
  color: var(--muted);
  margin-top: auto;
}
.review .attrib strong {
  color: var(--ink);
}
/* Per-review "posted on Google" line — reinforces that every review is a
   genuine, verifiable Google review. */
.review .attrib .g-source {
  display: inline-flex;
  align-items: center;
  gap: 5px;
  color: var(--muted);
}
.review .attrib .g-source .g-logo { height: 13px; }

/* ============ GOOGLE REVIEWS BRANDING ============ */
/* Shared: the Google "G" mark, sized to the surrounding text by default. */
.g-logo {
  display: inline-block;
  height: 1em;
  width: auto;
  flex: none;
  vertical-align: -0.14em;
}

/* Eyebrow-style attribution chip placed with a review section heading:
   [G] Reviews from Google */
.g-badge {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  font-family: var(--font-sans);
  font-size: 13px;
  letter-spacing: .01em;
  color: var(--muted);
}
.g-badge .g-logo { height: 16px; }
.g-badge strong { color: var(--ink); font-weight: 600; }
.g-badge .g-badge-stars { color: var(--google-gold); letter-spacing: 2px; font-size: 12px; }

/* Rating summary: [G]  5.0 ★★★★★  ·  229 reviews on Google */
.g-rating {
  display: inline-flex;
  align-items: center;
  gap: 14px;
  font-family: var(--font-sans);
  flex-wrap: wrap;
}
.g-rating .g-logo { height: 24px; }
.g-rating .g-rating-score { display: inline-flex; align-items: baseline; gap: 10px; }
.g-rating .g-rating-num {
  font-family: var(--font-display);
  font-size: 28px;
  line-height: 1;
  color: var(--ink);
  letter-spacing: -0.01em;
}
.g-rating .g-rating-stars { color: var(--google-gold); letter-spacing: 2px; font-size: 17px; }
.g-rating .g-rating-count { color: var(--muted); font-size: 13.5px; letter-spacing: .01em; }

/* "See all of our reviews →" link — reuses the site's underlined-CTA idiom
   but leads with the Google mark and always points at the Google profile. */
.g-reviews-cta {
  display: inline-flex;
  align-items: center;
  gap: 10px;
  font-family: var(--font-sans);
  font-size: 15px;
  color: var(--ink);
  border-bottom: 1px solid var(--line);
  padding-bottom: 6px;
  transition: gap .2s, border-color .2s, color .2s;
}
.g-reviews-cta .g-logo { height: 18px; }
.g-reviews-cta::after { content: '→'; font-size: 15px; line-height: 1; }
.g-reviews-cta:hover { gap: 16px; border-color: var(--ink); }
.band.dark .g-reviews-cta,
.cta-section .g-reviews-cta,
footer .g-reviews-cta {
  color: #fff;
  border-color: rgba(255,255,255,.4);
}
.band.dark .g-reviews-cta:hover,
.cta-section .g-reviews-cta:hover,
footer .g-reviews-cta:hover { border-color: #fff; }

/* ============ PROJECT PROOF REVIEW WALL ============ */
.proof-reviews-head {
  margin-bottom: 42px;
}
.proof-review-grid {
  gap: clamp(48px, 7vw, 96px) clamp(32px, 6vw, 84px);
}
.proof-review-card {
  min-height: 0;
  padding: 0;
  background: transparent;
}
.proof-review-card p {
  font-size: clamp(20px, 1.8vw, 25px);
}
@media (max-width: 700px) {
  .proof-reviews-head {
    margin-bottom: 28px;
  }
  .proof-review-grid {
    gap: 48px;
  }
}

/* ============ FAQ ============ */
.faq-block {
  display: flex;
  flex-direction: column;
  max-width: 960px;
  margin: 0 auto;
}
.faq-item {
  background: transparent;
  border: 0;
  border-bottom: 1px solid var(--line);
}
.faq-item summary {
  list-style: none;
  cursor: pointer;
  padding: 32px 0;
  font-family: var(--font-display);
  font-weight: 500;
  font-size: 24px;
  color: var(--ink);
  display: flex;
  justify-content: space-between;
  align-items: center;
  gap: 24px;
  line-height: 1.3;
}
.faq-item summary::-webkit-details-marker { display: none; }
.faq-item summary::after {
  content: "+";
  font-family: var(--font-sans);
  font-size: 22px;
  font-weight: 400;
  color: var(--accent);
  flex-shrink: 0;
  transition: transform .25s;
}
.faq-item[open] summary::after { content: "−"; }
.faq-item div.answer {
  padding: 0 0 36px;
  color: var(--muted);
  font-size: 17px;
  line-height: 1.7;
  max-width: 760px;
}
.faq-item div.answer strong { color: var(--ink); }
.faq-item div.answer a { color: var(--accent); border-bottom: 1px solid currentColor; }
/* Two-column FAQ: halves the vertical "wall" of questions on wider screens.
   Items still collapse independently; columns flow top-to-bottom. */
@media (min-width: 760px) {
  .faq-block.faq-2col {
    display: grid;
    grid-template-columns: 1fr 1fr;
    column-gap: 56px;
    align-items: start;
    max-width: 1120px;
  }
}

/* ============ CHECKLIST ============ */
ul.checklist {
  list-style: none;
  margin: 32px 0 0;
  padding: 0;
  display: grid;
  gap: 18px;
}
ul.checklist li {
  padding-left: 32px;
  position: relative;
  font-size: 17px;
  color: var(--muted);
  line-height: 1.6;
}
ul.checklist li::before {
  content: "→";
  position: absolute;
  left: 0;
  top: 0;
  color: var(--accent);
  font-family: var(--font-display);
  font-weight: 500;
  font-size: 20px;
  line-height: 1.4;
}
ul.checklist li strong { color: var(--ink); }

/* ============ CITY PAGE / SUBPAGE HERO ============ */
.subpage-hero {
  position: relative;
  min-height: 78vh;
  background: #0d0d0d;
  overflow: hidden;
  display: grid;
  align-items: end;
}
.subpage-hero .bg {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
}
.subpage-hero .shade {
  position: absolute;
  inset: 0;
  background:
    linear-gradient(0deg, rgba(0,0,0,.85) 0%, rgba(0,0,0,0) 60%),
    linear-gradient(90deg, rgba(0,0,0,.55), rgba(0,0,0,0) 55%);
}
.subpage-hero .inner {
  position: relative;
  z-index: 2;
  max-width: var(--container);
  margin: 0 auto;
  padding: 200px 36px 100px;
  color: #fff;
  width: 100%;
}
.subpage-hero h1 {
  color: #fff;
  font-family: var(--font-display);
  font-weight: 400;
  font-size: clamp(48px, 6.4vw, 92px);
  letter-spacing: 0;
  line-height: 1;
  max-width: 1000px;
  margin: 18px 0 0;
}
.subpage-hero h1 em { font-style: normal; color: var(--gold-soft); }
.subpage-hero .lede {
  color: rgba(255,255,255,.9);
  font-size: 20px;
  max-width: 720px;
  margin-top: 26px;
  line-height: 1.55;
}
.subpage-hero .actions { display: flex; gap: 20px; margin-top: 40px; flex-wrap: wrap; }

.gutter-hero .bg {
  animation: none;
  top: auto;
  bottom: 0;
  height: 150%;
  object-position: center bottom;
}

@media (max-width: 900px) {
  .gutter-hero .bg {
    height: 142%;
    object-position: 42% bottom;
  }
}

/* ============ CITY STATS ASIDE ============ */
.city-stats {
  background: var(--paper);
  display: flex;
  flex-direction: column;
  gap: 24px;
}

.city-stats div:last-child { border-bottom: 0; padding-bottom: 0; }
.city-stats strong {
  display: block;
  font-family: var(--font-display);
  font-weight: 500;
  font-size: 28px;
  color: var(--ink);
  line-height: 1.1;
  margin-bottom: 4px;
}
.city-stats span {
  display: block;
  font-family: var(--font-sans);
  font-size: 10px;
  letter-spacing: .26em;
  text-transform: uppercase;
  color: var(--accent);
  font-weight: 700;
  margin-bottom: 12px;
}
.city-stats .note {
  font-size: 13px;
  color: var(--muted);
  line-height: 1.6;
}

/* ============ NOTES ============ */
.note {
  background: transparent;
  border-left: 2px solid var(--accent);
  padding: 8px 0 8px 28px;
  font-size: 17px;
  font-family: var(--font-display);
  font-weight: 400;
  color: var(--ink);
  line-height: 1.5;
  font-style: normal;
}
.note strong { font-style: normal; color: var(--ink); font-family: var(--font-sans); font-weight: 700; }

/* ============ BIG 5 ============ */
.big5 {
  display: grid;
  grid-template-columns: repeat(5, 1fr);
  gap: 0;
}
@media (max-width: 1100px) { .big5 { grid-template-columns: repeat(3, 1fr); } }
@media (max-width: 720px) { .big5 { grid-template-columns: 1fr; } }
.big5 article {
  padding: 40px 30px;
  text-align: center;
  display: flex;
  flex-direction: column;
}
.big5 article:last-child { border-right: 0; }
.big5 article .explore { margin-top: auto; align-self: center; justify-content: center; letter-spacing: .14em; font-size: 11px; }
.big5 article span {
  font-family: var(--font-display);
  font-style: normal;
  font-weight: 400;
  font-size: 36px;
  color: var(--gold);
  display: block;
  margin-bottom: 16px;
  line-height: 1;
}
.big5 article strong {
  display: block;
  font-family: var(--font-display);
  font-weight: 500;
  font-size: 24px;
  color: #fff;
  margin-bottom: 12px;
  line-height: 1.15;
}
.big5 article p { font-size: 14px; color: #c4c4c4; line-height: 1.6; }

/* ============ FOOTER ============ */
.site-footer {
  background: var(--dark);
  color: #c4c4c4;
  padding: 96px 0 36px;
}
.footer-inner {
  max-width: var(--container);
  margin: 0 auto;
  padding: 0 36px;
  display: grid;
  grid-template-columns: 1.6fr 1fr 1fr 1fr 1fr;
  gap: 56px;
}
@media (max-width: 1180px) { .footer-inner { grid-template-columns: 2fr 1fr 1fr; gap: 48px; } }
@media (max-width: 880px) { .footer-inner { grid-template-columns: 1fr 1fr; gap: 40px; } }
@media (max-width: 520px) { .footer-inner { grid-template-columns: 1fr; } }
.footer-inner h4 {
  color: #fff;
  font-size: 11px;
  font-weight: 700;
  letter-spacing: .26em;
  text-transform: uppercase;
  margin-bottom: 22px;
}
.footer-inner .brand-block strong {
  font-family: var(--font-display);
  font-weight: 500;
  font-size: 32px;
  color: #fff;
  letter-spacing: .02em;
  display: block;
  margin-bottom: 16px;
}
.footer-inner .brand-block p {
  font-size: 15px;
  line-height: 1.7;
  color: #c4c4c4;
  max-width: 380px;
}
.footer-inner address {
  font-style: normal;
  font-size: 14px;
  color: #c4c4c4;
  line-height: 1.85;
}
.footer-inner address strong {
  color: #fff;
  display: block;
  font-family: var(--font-display);
  font-weight: 500;
  font-size: 19px;
  margin-bottom: 8px;
}
.footer-inner a { color: #c4c4c4; transition: color .2s; }
.footer-inner a:hover { color: var(--gold); }
.footer-inner ul { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 12px; font-size: 14px; }
.footer-social-label {
  margin: 22px 0 10px;
  color: #ededed;
  font-size: 13px;
  font-weight: 700;
  line-height: 1.3;
}
.footer-social { display: flex; gap: 16px; margin-top: 10px; }
.footer-social a {
  width: 36px;
  height: 36px;
  border: 1px solid #333333;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  font-size: 12px;
  font-weight: 700;
  letter-spacing: .04em;
  transition: background .2s, color .2s, border-color .2s;
}
.footer-social a:hover { background: var(--gold); border-color: var(--gold); color: var(--ink); }
.footer-bottom {
  max-width: var(--container);
  margin: 64px auto 0;
  padding: 32px 36px 0;
  border-top: 1px solid #222222;
  display: flex;
  justify-content: space-between;
  flex-wrap: wrap;
  gap: 14px;
  font-size: 12px;
  font-family: var(--font-sans);
  letter-spacing: .12em;
  text-transform: uppercase;
  color: #8e877b;
}

/* ============ UTILITIES ============ */
.center { text-align: center; }
.center.section-head { display: block; }
.center.section-head h2 { max-width: 760px; margin: 0 auto; }
.center.section-head p { max-width: 600px; margin: 24px auto 0; }
.muted { color: var(--muted); }
.max-prose { max-width: 760px; }
.body-flow {
  color: var(--ink-soft);
  line-height: 1.7;
  max-width: 760px;
}
.body-flow + .body-flow { margin-top: 22px; }
.serif { font-family: var(--font-display); font-weight: 400; }

/* ============ BRAND PROMISE / STATEMENT BAND ============ */
.statement-band {
  background: var(--paper);
}
.statement-band .inner { max-width: 980px; margin: 0 auto; }
.statement-band h2 {
  font-family: var(--font-display);
  font-weight: 400;
  font-size: clamp(36px, 4.6vw, 64px);
  line-height: 1.15;
  letter-spacing: -0.005em;
}
.statement-band h2 em { font-style: normal; color: var(--accent); }
.statement-band p {
  font-size: 19px;
  line-height: 1.7;
  margin: 32px auto 0;
  color: var(--muted);
  max-width: 680px;
}

/* ============ ETHOS / OUR STORY ============ */
.ethos-band {
  color: #fff;
  position: relative;
  overflow: hidden;
}
.ethos-band::before {
  content: "";
  position: absolute;
  inset: 0;
  background: radial-gradient(ellipse at top left, rgba(196,123,79,.10), transparent 60%);
  pointer-events: none;
}
.ethos-band .band-inner { position: relative; z-index: 2; }
.ethos-band h2 {
  color: #fff;
  font-family: var(--font-display);
  font-weight: 400;
  font-size: clamp(40px, 5.4vw, 76px);
  line-height: 1.05;
  max-width: 920px;
}
.ethos-band h2 em { color: var(--gold-soft); font-style: normal; }
.ethos-band p { color: #c4c4c4; }
.ethos-stack {
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  gap: 64px 96px;
  margin-top: 64px;
}
@media (max-width: 880px) { .ethos-stack { grid-template-columns: 1fr; gap: 48px; } }

.ethos-stack article h3 {
  font-family: var(--font-display);
  font-weight: 500;
  color: #fff;
  font-size: clamp(22px, 2.4vw, 30px);
  letter-spacing: .005em;
  margin-bottom: 14px;
}
.ethos-stack article .ethos-eyebrow {
  font-family: var(--font-sans);
  font-size: 10px;
  letter-spacing: .28em;
  text-transform: uppercase;
  font-weight: 700;
  color: var(--gold);
  display: block;
  margin-bottom: 10px;
}
.ethos-stack article p { font-size: 16px; line-height: 1.7; color: #c4c4c4; }
.ethos-band .ethos-lede {
  font-family: var(--font-display);
  font-style: normal;
  font-weight: 400;
  font-size: clamp(22px, 2.2vw, 30px);
  color: #e4e4e4;
  line-height: 1.5;
  margin-top: 32px;
  max-width: 860px;
}

/* ============ PROCESS / TIMELINE ============ */
.process-timeline {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
}
@media (max-width: 880px) { .process-timeline { grid-template-columns: 1fr; } }
.process-step {
  padding: 56px 36px 0;
  position: relative;
}
.process-step:last-child { border-right: 0; }
@media (max-width: 880px) {
  .process-step {
  border-right: 0;
  padding: 40px 0;
}
  .process-step:last-child { border-bottom: 0; }
}
.process-step .step-num {
  font-family: var(--font-display);
  font-style: normal;
  font-weight: 400;
  font-size: 56px;
  color: var(--gold);
  line-height: 1;
  margin-bottom: 22px;
}
.process-step h3 {
  font-family: var(--font-display);
  font-weight: 500;
  font-size: clamp(24px, 2.4vw, 32px);
  color: var(--ink);
  margin-bottom: 14px;
  line-height: 1.2;
}
.process-step p {
  font-size: 16px;
  line-height: 1.65;
  color: var(--muted);
}
.process-step .step-label {
  font-family: var(--font-sans);
  font-size: 10px;
  letter-spacing: .28em;
  text-transform: uppercase;
  font-weight: 700;
  color: var(--accent);
  display: block;
  margin-bottom: 6px;
}

/* ============ CTA SECTION ============ */
.cta-section {
  background: var(--dark);
}
.cta-section h2 {
  color: #fff;
  font-family: var(--font-display);
  font-weight: 400;
  max-width: 880px;
  margin: 0 auto;
}
.cta-section h2 em { font-style: normal; color: var(--gold-soft); }
.cta-section p {
  color: #c4c4c4;
  font-size: 19px;
  max-width: 620px;
  margin: 24px auto 0;
  line-height: 1.6;
}
.cta-section .actions {
  display: flex;
  gap: 22px;
  margin-top: 44px;
  flex-wrap: wrap;
}
.cta-phone-actions {
  display: flex;
  flex-wrap: wrap;
  gap: 10px;
  margin-top: 26px;
}
.cta-phone-actions--centered { justify-content: center; }
.cta-phone-button {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-height: 42px;
  padding: 0 18px;
  border: 1px solid rgba(255,255,255,.62);
  border-radius: 6px;
  color: #fff;
  font-family: var(--font-display);
  font-size: 13px;
  font-weight: 700;
  line-height: 1.2;
  text-decoration: none;
  transition: background .2s ease, border-color .2s ease, color .2s ease;
}
.cta-phone-button:hover {
  background: #fff;
  border-color: #fff;
  color: #111;
}
.cta-phone-button:focus-visible {
  outline: 2px solid #fff;
  outline-offset: 3px;
}
@media (max-width: 560px) {
  .cta-phone-actions { gap: 10px; }
}

/* ============ BREADCRUMB ============ */
.breadcrumb {
  font-family: var(--font-sans);
  font-size: 11px;
  letter-spacing: .26em;
  text-transform: uppercase;
  color: rgba(255,255,255,.7);
  display: flex;
  gap: 12px;
  align-items: center;
  font-weight: 600;
}
.breadcrumb a { color: rgba(255,255,255,.7); }
.breadcrumb a:hover { color: var(--gold); }
.breadcrumb span { color: rgba(255,255,255,.4); }

/* ============ CITY GRID (Service Areas page) ============ */
.city-grid {
  display: grid;
  grid-template-columns: repeat(4, minmax(0, 1fr));
}
@media (max-width: 1100px) { .city-grid { grid-template-columns: repeat(3, 1fr); } }
/* iPad / tablet (portrait and below) and all phones: two cities per row so the
   list stays compact and doesn't require excessive scrolling. */
@media (max-width: 1024px) { .city-grid { grid-template-columns: repeat(2, 1fr); } }
@media (max-width: 460px) { .city-grid { grid-template-columns: repeat(2, 1fr); } }
.city-tile {
  display: flex;
  flex-direction: column;
  gap: 6px;
  padding: 26px 24px;
  transition: background .2s;
  position: relative;
}
.city-tile > * {
  transition: transform .2s;
}

a.city-tile:hover > * { transform: translateX(8px); }
.city-tile strong {
  font-family: var(--font-display);
  font-weight: 500;
  font-size: 21px;
  color: var(--ink);
  line-height: 1.2;
  letter-spacing: -0.005em;
}
.city-tile .city-meta {
  font-family: var(--font-sans);
  font-size: 11px;
  letter-spacing: .18em;
  text-transform: uppercase;
  font-weight: 600;
  color: var(--muted);
}

.city-tile.featured .featured-tag {
  font-family: var(--font-sans);
  font-size: 10px;
  letter-spacing: .26em;
  text-transform: uppercase;
  font-weight: 700;
  margin-bottom: 4px;
}

/* ============ CASE STUDIES (Project Proof page) ============ */

.case-study:first-of-type { border-top: 0; padding-top: 80px; }
.case-study .case-inner {
  max-width: 1280px;
  margin: 0 auto;
  padding: 0 36px;
  display: grid;
  grid-template-columns: minmax(0,1fr) minmax(380px,540px);
  gap: clamp(64px, 5vw, 84px);
  align-items: start;
}
.case-study.reverse .case-inner { grid-template-columns: minmax(380px,540px) minmax(0,1fr); }
@media (max-width: 980px) {
  .case-study .case-inner,
  .case-study.reverse .case-inner { grid-template-columns: 1fr; gap: 52px; }
}
.case-study .case-meta {
  font-family: var(--font-sans);
  font-size: 11px;
  letter-spacing: .24em;
  text-transform: uppercase;
  font-weight: 700;
  color: var(--accent);
  margin-bottom: 16px;
  display: flex;
  flex-wrap: wrap;
  gap: 18px;
}
.case-study h2 {
  font-family: var(--font-display);
  font-weight: 400;
  letter-spacing: -0.005em;
  font-size: clamp(34px, 4.4vw, 56px);
  line-height: 1.05;
  margin-bottom: 24px;
}
.case-study h2 em { font-style: normal; color: var(--accent); }
.case-study .case-lede {
  font-family: var(--font-display);
  font-style: normal;
  font-weight: 400;
  font-size: 22px;
  color: var(--ink-soft);
  line-height: 1.5;
  margin-bottom: 28px;
}
.case-study .case-body p {
  line-height: 1.7;
  margin-bottom: 18px;
}
.case-study .case-body p strong { color: var(--ink); }
.case-study .case-facts {
  background: var(--paper);
  display: flex;
  flex-direction: column;
  gap: 22px;
}
.case-study .case-facts div {
  display: flex;
  flex-direction: column;
  gap: 4px;
  padding-bottom: 18px;
}
.case-study .case-facts div:last-child { border-bottom: 0; padding-bottom: 0; }
.case-study .case-facts span {
  font-family: var(--font-sans);
  font-size: 10px;
  letter-spacing: .26em;
  text-transform: uppercase;
  font-weight: 700;
  color: var(--muted);
}
.case-study .case-facts strong {
  font-family: var(--font-display);
  font-weight: 500;
  font-size: 19px;
  color: var(--ink);
  line-height: 1.3;
}
.case-study .case-pull {
  border-left: 2px solid var(--accent);
  padding: 8px 0 8px 28px;
  margin: 28px 0;
  font-family: var(--font-display);
  font-style: normal;
  font-weight: 400;
  font-size: 22px;
  color: var(--ink);
  line-height: 1.45;
}
.case-study .case-pull cite {
  display: block;
  font-family: var(--font-sans);
  font-style: normal;
  font-size: 11px;
  letter-spacing: .22em;
  text-transform: uppercase;
  font-weight: 600;
  color: var(--muted);
  margin-top: 16px;
}
.case-study .case-pull cite strong { color: var(--ink); letter-spacing: .22em; }
.case-study .case-image {
  display: grid;
  gap: 16px;
  width: 100%;
  max-width: 540px;
  justify-self: center;
}
.case-study .case-image img {
  aspect-ratio: 5 / 6;
  object-fit: cover;
  width: 100%;
}
.case-study .case-image img.castleton-detail-photo {
  object-position: 54% center;
}
.case-study .case-image.gallery {
  grid-template-columns: 2fr 1fr;
  grid-template-rows: auto auto;
  gap: 12px;
  max-width: 660px;
}
.case-study .case-image.gallery img:first-child {
  grid-row: span 2;
  aspect-ratio: 3/5;
}
.case-study .case-image.gallery img:nth-child(2),
.case-study .case-image.gallery img:nth-child(3) {
  aspect-ratio: 4/3;
}

@media (max-width: 1480px) and (min-width: 981px) {
  .case-study .case-inner,
  .case-study.reverse .case-inner {
    max-width: 1160px;
    grid-template-columns: minmax(0,1fr) minmax(360px,520px);
    gap: clamp(48px, 4vw, 68px);
  }

  .case-study .case-image {
    max-width: 520px;
  }

  .case-study .case-image.gallery {
    max-width: 620px;
  }
}

/* ============ START / INTAKE FORM ============ */
.intake-form {
  /* Its own sheet of paper: a touch lighter than the cream band behind it,
     so the card edge comes from surface + hairline + shadow rather than a
     hard color block. (Site is light-only; no dark variant needed.) */
  background: #f6f2e9;
  display: grid;
  gap: 22px;
  max-width: 1040px;
  margin-inline: auto;
  padding: clamp(30px, 5vw, 56px) clamp(24px, 5vw, 64px);
  border: 1px solid var(--line);
  border-radius: 10px;
  box-shadow: var(--shadow-soft);
}
.intake-form .row {
  display: grid;
  gap: 22px;
}
.intake-form label {
  display: flex;
  flex-direction: column;
  gap: 8px;
  font-family: var(--font-sans);
  font-size: 11px;
  font-weight: 700;
  letter-spacing: .22em;
  text-transform: uppercase;
  color: var(--muted);
}
.intake-form input,
.intake-form select,
.intake-form textarea {
  font-family: var(--font-sans);
  font-size: 16px;
  padding: 14px 0;
  border: 0;
  border-bottom: 1px solid var(--line);
  background: transparent;
  color: var(--ink);
  letter-spacing: 0;
}
.intake-form input:focus,
.intake-form select:focus,
.intake-form textarea:focus { outline: none; border-bottom-color: var(--accent); }
.intake-form textarea { min-height: 140px; resize: vertical; line-height: 1.5; }
.hp-field {
  position: absolute;
  left: -9999px;
  width: 1px;
  height: 1px;
  overflow: hidden;
}
.form-status {
  min-height: 1.4em;
  margin: 0;
  color: var(--muted);
  font-size: 0.94rem;
}
.intake-form button,
.intake-form input[type="submit"] {
  font-size: 12px;
  padding: 18px 28px;
  cursor: pointer;
  transition: background .2s, border-color .2s;
  justify-self: start;
  width: auto;
}

.intake-disclaimer {
  font-size: 13px;
  color: var(--muted);
  line-height: 1.55;
  font-style: normal;
  font-family: var(--font-display);
}
.form-consent {
  display: grid !important;
  grid-template-columns: 18px minmax(0, 1fr);
  align-items: start;
  gap: 10px !important;
  font-family: var(--font-sans) !important;
  font-size: 13px !important;
  font-weight: 400 !important;
  line-height: 1.5;
  letter-spacing: 0 !important;
  text-transform: none !important;
  color: var(--muted) !important;
}
.form-consent input[type="checkbox"] {
  width: 16px;
  height: 16px;
  margin: 2px 0 0;
  padding: 0;
  border: 1px solid var(--line);
  background: transparent;
  accent-color: var(--accent);
}
.form-consent a { text-decoration: underline; text-underline-offset: 2px; }

/* Privacy notice */
.privacy-hero {
  padding: clamp(128px, 15vw, 188px) 24px clamp(46px, 7vw, 86px);
  background: var(--dark);
  color: var(--paper);
}
.privacy-hero-inner,
.privacy-content {
  width: min(880px, calc(100% - 48px));
  margin-inline: auto;
}
.privacy-hero .eyebrow { color: #b9b4a7 !important; }
.privacy-hero h1 {
  max-width: 680px;
  margin: 12px 0 0;
  font-size: clamp(46px, 7vw, 88px);
  line-height: .98;
  color: #ffffff !important;
}
.privacy-hero h1 em { color: #ffffff !important; }
.privacy-hero .lede { max-width: 660px; margin: 24px 0 0; color: #d6d0c2 !important; }
.privacy-content { padding: clamp(46px, 8vw, 96px) 0 clamp(74px, 10vw, 130px); }
.privacy-content > p,
.privacy-content > ul,
.privacy-content > ol { margin: 0 0 20px; }
.privacy-content h2 {
  margin: 46px 0 14px;
  font-size: clamp(24px, 3vw, 34px);
  line-height: 1.1;
}
.privacy-content h3 { margin: 28px 0 10px; font-size: 18px; }
.privacy-content ul,
.privacy-content ol { padding-left: 1.25em; }
.privacy-content li { margin: 0 0 10px; }
.privacy-content a { text-decoration: underline; text-underline-offset: 3px; }
.privacy-contact { font-style: normal; line-height: 1.6; }
.privacy-footer {
  padding: 28px 24px;
  background: #101010;
  color: #c6c0b3;
  font-size: 13px;
}
.privacy-footer-inner {
  display: flex;
  justify-content: space-between;
  gap: 18px;
  width: min(1120px, calc(100% - 48px));
  margin-inline: auto;
}
.privacy-footer a { color: inherit; }
@media (max-width: 640px) {
  .privacy-hero { padding-inline: 0; }
  .privacy-hero-inner, .privacy-content, .privacy-footer-inner { width: min(100% - 40px, 880px); }
  .privacy-footer-inner { display: grid; }
}

/* ============ PATH CARDS (buyer segmentation) ============ */
.path-grid {
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  border-top: 1px solid var(--line);
  border-left: 1px solid var(--line);
}
@media (max-width: 720px) { .path-grid { grid-template-columns: 1fr; } }
.path-card {
  padding: 40px 32px;
  border-right: 1px solid var(--line);
  border-bottom: 1px solid var(--line);
  display: flex;
  flex-direction: column;
  gap: 14px;
  transition: background .2s, padding-left .2s;
}
.path-card:hover {
  padding-left: 40px;
}
.path-card .path-num {
  font-family: var(--font-display);
  font-style: normal;
  font-weight: 400;
  font-size: 36px;
  color: var(--accent);
  line-height: 1;
}
.path-card h3 {
  font-family: var(--font-display);
  font-weight: 500;
  font-size: clamp(22px, 2.4vw, 30px);
  color: var(--ink);
  line-height: 1.15;
}
.path-card p { font-size: 16px; color: var(--muted); line-height: 1.6; }
.path-card .arrow {
  margin-top: auto;
  font-family: var(--font-sans);
  font-size: 11px;
  font-weight: 700;
  letter-spacing: .26em;
  text-transform: uppercase;
  color: var(--accent);
  border-bottom: 1px solid var(--line);
  padding-bottom: 6px;
  align-self: flex-start;
}

/* ============ MINI GALLERY GRID ============ */
.proof-gallery {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 16px;
}
@media (max-width: 720px) { .proof-gallery { grid-template-columns: 1fr; } }
.proof-gallery-toggle {
  display: none;
  align-items: center;
  justify-content: center;
  width: min(100%, 360px);
  margin: 24px auto 0;
  padding: 15px 22px;
  border: 1px solid var(--ink);
  background: transparent;
  color: var(--ink);
  font: 700 12px/1 var(--font-sans);
  letter-spacing: .16em;
  text-transform: uppercase;
  cursor: pointer;
}
.proof-gallery-toggle::after {
  content: "+";
  margin-left: 12px;
  font-size: 18px;
  font-weight: 400;
  line-height: .7;
}
.proof-gallery-toggle[aria-expanded="true"]::after { content: "−"; }
.proof-gallery-toggle:hover { background: var(--ink); color: #fff; }
.proof-gallery-toggle:focus-visible { outline: 3px solid var(--gold); outline-offset: 3px; }
@media (max-width: 720px) {
  .proof-gallery.is-collapsible:not(.is-expanded) figure:nth-child(n+4) { display: none; }
  .proof-gallery-toggle.is-ready { display: flex; }
}
/* Balanced 2x2 variant for galleries with four photos (avoids an orphan tile). */
@media (min-width: 721px) {
  .proof-gallery.cols-2 { grid-template-columns: repeat(2, 1fr); max-width: 1100px; margin: 0 auto; }
}
/* Large button + cinematic manifesto feature (Culture page opener) */
.btn-lg { padding: 20px 46px; font-size: 16px; letter-spacing: .04em; }
.manifesto-feature {
  position: relative;
  isolation: isolate;
  overflow: hidden;
  display: flex;
  align-items: center;
  justify-content: center;
  min-height: clamp(560px, 88vh, 860px);
  padding: 120px 24px;
  color: #fff;
}
.manifesto-feature .mf-bg {
  position: absolute; inset: 0; width: 100%; height: 100%;
  object-fit: cover; z-index: -2; transform-origin: center;
  animation: mfKenBurns 22s ease-out forwards;
}
@keyframes mfKenBurns { from { transform: scale(1.02); } to { transform: scale(1.12); } }
@media (prefers-reduced-motion: reduce) { .manifesto-feature .mf-bg { animation: none; } }
.manifesto-feature::after {
  content: ""; position: absolute; inset: 0; z-index: -1;
  background:
    radial-gradient(120% 92% at 50% 40%, rgba(10,10,10,0) 28%, rgba(10,10,10,.58) 100%),
    linear-gradient(180deg, rgba(10,10,10,.55), rgba(10,10,10,.32) 44%, rgba(10,10,10,.82));
}
.manifesto-feature .mf-inner { max-width: 960px; text-shadow: 0 2px 30px rgba(0,0,0,.6); }
.manifesto-feature .eyebrow { color: var(--gold); letter-spacing: .32em; margin-bottom: 22px; }
.manifesto-feature h2 {
  color: #fff; font-family: var(--font-display); font-weight: 500;
  font-size: clamp(42px, 7.4vw, 86px); line-height: 1.0; letter-spacing: -0.025em;
  margin: 0 0 22px;
}
.manifesto-feature h2 em { font-style: normal; color: var(--gold); }
.manifesto-feature p {
  color: rgba(255,255,255,.9); font-size: clamp(18px, 2.1vw, 22px);
  line-height: 1.55; max-width: 720px; margin: 0 auto 40px;
}
.proof-gallery figure {
  margin: 0;
  position: relative;
  overflow: hidden;
}
.proof-gallery figure img {
  aspect-ratio: 4/5;
  object-fit: cover;
  width: 100%;
  transition: transform .8s ease;
}
.proof-gallery figure:hover img { transform: scale(1.04); }
/* Clickable project tiles: full-figure link overlay -> portfolio gallery */
.split .media, .photo-break, .detail-strip figure { position: relative; }
.proof-gallery figure .proof-link,
.split .media .proof-link,
.photo-break .proof-link,
.detail-strip figure .proof-link {
  position: absolute; inset: 0; z-index: 3;
  cursor: pointer; text-indent: -9999px; overflow: hidden;
}
.proof-gallery figure .proof-link:focus-visible,
.split .media .proof-link:focus-visible,
.photo-break .proof-link:focus-visible,
.detail-strip figure .proof-link:focus-visible {
  outline: 3px solid var(--gold); outline-offset: -3px;
}
/* Horizontal macro-detail filmstrip (Gutters signature device) */
.detail-strip {
  display: flex; gap: 14px; overflow-x: auto;
  padding: 4px 0 16px; scroll-snap-type: x mandatory;
  -webkit-overflow-scrolling: touch;
  scrollbar-width: thin; scrollbar-color: rgba(0,0,0,.3) transparent;
}
.detail-strip figure {
  flex: 0 0 auto; width: clamp(260px, 42vw, 440px); margin: 0;
  scroll-snap-align: start; overflow: hidden;
}
.detail-strip figure img {
  display: block; width: 100%;
  height: clamp(220px, 30vw, 320px); object-fit: cover;
}
.detail-strip figcaption {
  position: absolute; left: 0; right: 0; bottom: 0; z-index: 2;
  padding: 16px 18px; color: #fff;
  background: linear-gradient(0deg, rgba(0,0,0,.74), rgba(0,0,0,0));
  font-family: var(--font-sans); font-size: 11px;
  letter-spacing: .18em; text-transform: uppercase;
}
.detail-strip figcaption strong {
  display: block; margin-bottom: 3px; text-transform: none;
  font-family: var(--font-display); font-weight: 500; font-size: 17px; letter-spacing: .01em; color: #fff;
}
/* Editorial photo breaks. Photos sit within the page rhythm rather than
   becoming edge-to-edge bands between otherwise contained sections. */
.photo-break {
  width: calc(100% - 48px);
  max-width: 1200px;
  margin: clamp(48px, 7vw, 96px) auto;
  overflow: hidden;
}
.photo-break > img {
  display: block;
  width: 100%;
  height: auto;
  max-height: 680px;
  object-fit: cover;
}
.window-photo-feature {
  padding: clamp(48px, 6vw, 88px) 24px;
}
.window-photo-feature__inner {
  width: min(100%, 1120px);
  margin: 0 auto;
}
.window-photo-feature__link {
  display: block;
  color: inherit;
  text-decoration: none;
}
.window-photo-feature__link img {
  display: block;
  width: 100%;
  height: auto;
  aspect-ratio: 2560 / 1705;
  object-fit: cover;
  transition: transform .8s ease;
}
.window-photo-feature__link:hover img { transform: scale(1.012); }
.window-photo-feature__link:focus-visible { outline: 3px solid var(--gold); outline-offset: 5px; }
@media (max-width: 720px) {
  .window-photo-feature { padding: 40px 18px; }
}
/* The door-inspection source is 16:9, while this section can be much wider
   on ultrawide displays. Keep its top edge visible so the installer’s face
   is not lost to the vertical crop. */
.photo-break--door-inspect > img { object-position: center top; }
.photo-break figcaption {
  padding: 18px 0 0;
  color: var(--ink);
  font-family: var(--font-sans); font-size: 11px;
  letter-spacing: .2em; text-transform: uppercase;
}
.photo-break figcaption strong {
  display: block; margin-bottom: 5px;
  font-family: var(--font-display); font-weight: 500; font-size: 22px;
  letter-spacing: .005em; text-transform: none; color: var(--ink);
}
.proof-gallery figcaption {
  position: absolute;
  inset: auto 0 0 0;
  padding: 20px 22px;
  background: linear-gradient(0deg, rgba(0,0,0,.85), rgba(0,0,0,0));
  color: #fff;
}
.proof-gallery figcaption strong {
  display: block;
  font-family: var(--font-display);
  font-weight: 500;
  font-size: 19px;
  color: #fff;
  margin-bottom: 4px;
}
.proof-gallery figcaption span {
  font-family: var(--font-sans);
  font-size: 11px;
  letter-spacing: .22em;
  text-transform: uppercase;
  color: var(--gold);
  font-weight: 600;
}

/* ============ BACKWARD COMPAT: legacy hero / city-intro on sub-pages ============ */
.hero {
  position: relative;
  min-height: 78vh;
  background: #0d0d0d;
  overflow: hidden;
  display: grid;
  align-items: end;
}
.hero-bg {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
}
.hero-shade {
  position: absolute;
  inset: 0;
  background:
    linear-gradient(0deg, rgba(0,0,0,.85) 0%, rgba(0,0,0,0) 60%),
    linear-gradient(90deg, rgba(0,0,0,.55), rgba(0,0,0,0) 55%);
}
.hero-inner {
  position: relative;
  z-index: 2;
  max-width: var(--container);
  margin: 0 auto;
  padding: 200px 36px 100px;
  color: #fff;
  width: 100%;
}
.hero-inner h1 {
  color: #fff;
  font-family: var(--font-display);
  font-weight: 400;
  font-size: clamp(48px, 6.4vw, 92px);
  letter-spacing: 0;
  line-height: 1;
  max-width: 1000px;
  margin: 18px 0 0;
}
.hero-inner h1 em { color: var(--gold-soft); font-style: normal; }
.hero-inner h2 {
  color: #fff;
  font-family: var(--font-display);
  font-weight: 400;
  letter-spacing: 0;
  max-width: 940px;
  margin: 12px 0 16px;
}
.hero-inner p,
.hero-inner p.lead {
  color: rgba(255,255,255,.9);
  font-size: 20px;
  max-width: 720px;
  margin-top: 26px;
  line-height: 1.55;
}
.hero-actions { display: flex; gap: 20px; margin-top: 40px; flex-wrap: wrap; }

.eyebrow.light { color: var(--gold); }

/* legacy city-intro (carmel / hinsdale) - render as editorial split */
.city-intro {
  display: grid;
  grid-template-columns: minmax(0, 1fr) minmax(340px, 480px);
  gap: 96px;
  align-items: start;
  padding: 200px 36px 120px;
  max-width: var(--container);
  margin: 0 auto;
  background: var(--paper);
}
@media (max-width: 880px) {
  .city-intro { grid-template-columns: 1fr; gap: 40px; padding: 140px 24px 80px; }
}
.city-intro h1 {
  font-family: var(--font-display);
  font-weight: 400;
  font-size: clamp(40px, 5.4vw, 72px);
  line-height: 1.05;
  color: var(--ink);
  letter-spacing: -0.005em;
}
.city-intro h1 em { color: var(--accent); font-style: normal; }
.city-intro p {
  font-size: 19px !important;
  line-height: 1.65;
  color: var(--ink-soft) !important;
  max-width: 640px;
}
.city-intro .stats {
  background: var(--paper);
  display: flex;
  flex-direction: column;
  gap: 24px;
}
.city-intro .stats div {
  padding-bottom: 20px;
}
.city-intro .stats div:last-child {
  border-bottom: 0;
  padding-bottom: 0;
}
.city-intro .stats strong {
  display: block;
  font-family: var(--font-display);
  font-weight: 500;
  font-size: 26px;
  color: var(--ink);
  line-height: 1.15;
  margin-bottom: 4px;
}
.city-intro .stats span {
  display: block;
  font-family: var(--font-sans);
  font-size: 10px;
  letter-spacing: .26em;
  text-transform: uppercase;
  color: var(--accent);
  font-weight: 700;
  margin-bottom: 10px;
}

/* legacy band variants on sub-pages */

/* legacy grid lockup remains supported via the existing .grid system */
.grid.four { grid-template-columns: repeat(4, minmax(0,1fr)); }
@media (max-width: 980px) { .grid.four { grid-template-columns: repeat(2, 1fr); } }
@media (max-width: 620px) { .grid.four { grid-template-columns: 1fr; } }

/* fix split layout used on legacy pages */
.split.reverse { grid-template-columns: minmax(380px, 560px) minmax(0, 1fr); }
@media (max-width: 880px) { .split.reverse { grid-template-columns: 1fr; } }

/* ============ SCROLL TO TRIGGER HEADER STATE ============ */
@media (max-width: 720px) {
  .brand-hero .inner { padding: 180px 24px 80px; }
  .service-section .inner { padding: 80px 24px 56px; }
  .band { padding: 80px 0; }
  .band-inner { padding: 0 24px; }
  .nav { padding: 16px 24px; gap: 16px; position: relative; flex-wrap: wrap; }
  .js .nav { flex-wrap: nowrap; }
  .brand { order: 1; }
  .nav-cta { order: 2; margin-left: auto; }
  .js .nav-toggle { display: flex; order: 4; }
  .nav-links {
    order: 4;
    display: flex;
    position: static;
    flex: 1 0 100%;
    top: 100%;
    left: 0;
    right: 0;
    flex-direction: column;
    gap: 0;
    background: var(--paper);
    border-bottom: 1px solid var(--line);
    box-shadow: var(--shadow-soft);
    padding: 4px 24px 14px;
  }
  .js .nav-links {
    display: none;
    position: absolute;
    flex: 0 1 auto;
  }
  .js .nav.nav-open .nav-links { display: flex; }
  .nav-links a,
  .site-header.over-hero .nav-links a {
    color: var(--ink-soft);
    font-size: 15px;
    letter-spacing: .12em;
    padding: 15px 2px;
    border-bottom: 1px solid var(--line-soft);
  }
  .nav-links a:last-child { border-bottom: 0; }
  .nav-links a::after { display: none; }
  /* Wide comparison tables scroll horizontally instead of widening the page. */
  .compare { display: block; overflow-x: auto; -webkit-overflow-scrolling: touch; max-width: 100%; }
  /* Stop form controls / gallery images from forcing min-content overflow on small screens. */
  .calc-form, .calc-form label { min-width: 0; }
  .calc-form select, .calc-form input { width: 100%; max-width: 100%; min-width: 0; }
  
  .intake-form input, .intake-form select, .intake-form textarea { width: 100%; max-width: 100%; min-width: 0; }
  .case-study .case-image, .case-study .case-image.gallery { grid-template-columns: minmax(0, 1fr); grid-template-rows: auto; }
  .case-study .case-image.gallery img:first-child { grid-row: auto; }
  .case-study .case-image img { min-width: 0; max-width: 100%; }
  .footer-bottom { padding: 24px 24px 0; }
  .index-tab.is-active { margin-left: -16px; padding-left: 14px; }
}

/* Very small screens: keep the schedule CTA from crowding the hamburger. */
@media (max-width: 460px) {
  .nav-cta { padding: 11px 14px; letter-spacing: .12em; font-size: 11px; }
  .nav { gap: 10px; }
}

@media (max-width: 360px) {
  .nav { padding-inline: 16px; gap: 8px; }
  .nav-cta {
    padding: 10px 12px;
    font-size: 10px;
    letter-spacing: .1em;
    white-space: nowrap;
  }
}

/* ============ iPAD / TABLET NAV ============ */
/* Portrait iPads (and narrower) collapse the 10-link nav into the hamburger
   drawer so it never wraps to two rows and the CTA stays one line.
   Landscape iPads (1024px+) get the single-row nav below. */
@media (max-width: 959px) {
  .nav { flex-wrap: nowrap; gap: 16px; position: relative; }
  .brand { order: 1; }
  .nav-cta { order: 2; margin-left: auto; white-space: nowrap; }
  .js .nav-toggle { display: flex; order: 4; }
  .nav-links {
    order: 5;
    flex: 1 0 100%;
    display: flex;
    flex-direction: column;
    gap: 0;
    position: static;
    background: var(--paper);
    border-bottom: 1px solid var(--line);
    box-shadow: var(--shadow-soft);
    padding: 4px 24px 14px;
  }
  .js .nav-links { display: none; position: absolute; top: 100%; left: 0; right: 0; flex: 0 1 auto; }
  .js .nav.nav-open .nav-links { display: flex; }
  .nav-links a,
  .site-header.over-hero .nav-links a {
    color: var(--ink-soft);
    font-size: 15px;
    letter-spacing: .12em;
    padding: 15px 2px;
    border-bottom: 1px solid var(--line-soft);
  }
  .nav-links a:last-child { border-bottom: 0; }
  .nav-links a::after { display: none; }
}
/* Landscape iPads: keep the full horizontal nav, just compress it so every
   link and the CTA sit on a single row. */
@media (min-width: 960px) and (max-width: 1280px) {
  .nav { gap: 18px; padding: 18px 20px; }
  .nav-links { flex-wrap: nowrap; gap: 16px; }
  .nav-links a { font-size: 13px; letter-spacing: .03em; }
  .nav-cta { white-space: nowrap; padding: 11px 14px; font-size: 11px; letter-spacing: .1em; }
}
/* iPad (tablet) hamburger: larger button and roomy, easy-to-tap drawer items.
   Scoped with .site-header so the enlarged size also wins once the page is
   scrolled (a later desktop-nav rule otherwise shrinks these links past the hero). */
@media (min-width: 600px) and (max-width: 959px) {
  .nav-toggle { width: 54px; height: 54px; padding: 12px; }
  .nav-toggle span { width: 30px; }
  .site-header .nav-links { margin-inline: 0; padding: 10px 30px 24px; }
  .site-header .nav-links a,
  .site-header.over-hero .nav-links a {
    font-size: 20px;
    padding: 22px 8px;
    min-height: 0;
    letter-spacing: .08em;
  }
}

/* Anchor offset for deep-linked cost-index categories */
.index-tab { scroll-margin-top: 100px; }

/* ============ HOMEPAGE REDESIGN (luxury / editorial) ============ */

/* Quiet intro statement directly under the hero */
.intro-statement {
  background: var(--paper);
}
.intro-statement .band-inner { max-width: 980px; }
.intro-statement p {
  font-family: var(--font-display);
  font-weight: 400;
  color: var(--ink-soft);
}
.intro-statement p + p { margin-top: 26px; }
.intro-statement p.fine {
  font-family: var(--font-sans);
  line-height: 1.7;
  color: var(--muted);
  margin-top: 32px;
}

/* What We Do - editorial service entries (large photo + real text) */
.service-entry {
  padding: 110px 0;
  scroll-margin-top: 90px;
}
.service-entry:first-of-type { border-top: 0; }
.service-entry .service-eyebrow {
  font-family: var(--font-sans);
  font-size: 11px; letter-spacing: .28em; text-transform: uppercase;
  font-weight: 700; color: var(--accent); display: block; margin-bottom: 18px;
}
.service-entry h3 {
  font-family: var(--font-display);
  font-weight: 400; font-size: clamp(30px, 3.6vw, 48px); line-height: 1.08;
  letter-spacing: -0.005em; color: var(--ink); margin-bottom: 26px; max-width: 540px;
}
.service-entry h3 em { font-style: normal; color: var(--accent); }
.service-entry .service-copy p { font-size: 17px; line-height: 1.7; color: var(--muted); }
.service-entry .service-copy p + p { margin-top: 18px; }
.service-entry .service-copy p strong { color: var(--ink); }
.service-entry .explore { margin-top: 30px; }

/* Real Cost Ranges - visible editorial rows (no JS) */
.cost-rows {
  margin-top: 8px;
}
.cost-row {
  display: grid;
  grid-template-columns: minmax(0,1fr) 200px 150px;
  gap: 28px;
  align-items: baseline;
  padding: 26px 0;
}
.cost-row .c-cat {
  font-family: var(--font-display);
  font-weight: 500; font-size: clamp(19px, 2vw, 24px); color: var(--ink); line-height: 1.25;
}
.cost-row .c-cat span {
  display: block; font-family: var(--font-sans);
  font-size: 14px; color: var(--muted); font-weight: 400; line-height: 1.5; margin-top: 6px;
}
.cost-row .c-median {
  font-family: var(--font-display);
  font-weight: 500; font-size: clamp(24px, 2.6vw, 34px); color: var(--ink);
  letter-spacing: -0.01em; text-align: right;
}
.cost-row .c-n {
  font-family: var(--font-sans);
  color: var(--muted);
  text-align: right;
}
@media (max-width: 760px) {
  .cost-row { grid-template-columns: 1fr auto; gap: 8px 20px; }
  .cost-row .c-cat { grid-column: 1 / -1; }
  .cost-row .c-median { text-align: left; }
  .cost-row .c-n { text-align: right; }
}
.cost-foot { margin-top: 40px; max-width: 760px; }
.cost-foot p { font-size: 17px; line-height: 1.7; color: var(--muted); }
.cost-foot .pull {
  font-family: var(--font-display);
  font-style: normal;
  font-size: clamp(22px, 2.4vw, 30px);
  color: var(--ink);
  line-height: 1.4;
  margin: 28px 0;
}
.cost-foot .explore { margin-top: 8px; }

/* How We Work - five editorial steps */
.how-steps {
  max-width: 960px;
}
.how-step {
  padding: 30px 0;
  display: grid;
  grid-template-columns: 250px 1fr;
  gap: 48px;
  align-items: baseline;
}
@media (max-width: 680px) { .how-step { grid-template-columns: 1fr; gap: 10px; } }
.how-step .step-num {
  font-family: var(--font-display);
  font-style: normal; font-weight: 400; font-size: 44px; color: var(--gold); line-height: 1;
}
.how-step h3 {
  font-family: var(--font-display);
  font-weight: 500; font-size: clamp(20px, 2vw, 24px); color: var(--ink); line-height: 1.15;
}
.how-step p { font-size: 15px; line-height: 1.6; color: var(--muted); }

/* Where We Work - two regions */
.regions { display: grid; grid-template-columns: 1fr 1fr; gap: 64px; }
@media (max-width: 760px) { .regions { grid-template-columns: 1fr; gap: 40px; } }
.region {
  padding-top: 28px;
}
.region .region-label {
  font-family: var(--font-sans);
  font-size: 11px; letter-spacing: .28em; text-transform: uppercase;
  font-weight: 700; color: var(--accent); display: block; margin-bottom: 16px;
}
.region h3 {
  font-family: var(--font-display);
  font-weight: 400; font-size: clamp(26px, 3vw, 38px); color: var(--ink);
  line-height: 1.1; margin-bottom: 18px;
}
.region .cities { font-size: 18px; line-height: 1.7; color: var(--ink-soft); }
.regions-note { margin-top: 56px; max-width: 820px; }
.regions-note p { font-size: 17px; line-height: 1.7; color: var(--muted); }
.regions-note p + p { margin-top: 18px; }
.regions-note .explore { margin-top: 28px; }

/* Schedule - close */
.start-questions {
  list-style: none; margin: 0 0 8px; padding: 0;
  max-width: 880px;
  border-top: 1px solid rgba(255,255,255,.18);
}
@media (max-width: 1100px) { .start-questions { grid-template-columns: repeat(2, 1fr); } }
@media (max-width: 620px) { .start-questions { grid-template-columns: 1fr; } }
.start-questions li {
  padding: 22px 2px; border-bottom: 1px solid rgba(255,255,255,.14);
  font-family: var(--font-display);
  font-weight: 400; font-size: clamp(19px, 2vw, 24px); color: #fff; line-height: 1.3;
}
/* Lock the numeral row + text row to equal heights so they read as straight
   lines across the page regardless of how many lines each question wraps to. */
.start-questions li span {
  height: 30px; display: flex; align-items: center; justify-content: center;
}
.start-questions li:last-child { border-right: 0; }
.start-questions li span {
  font-style: normal; color: var(--gold); font-size: 24px; flex-shrink: 0;
}
@media (max-width: 1100px) {
  .start-questions li:nth-child(2n) { border-right: 0; }
}
@media (max-width: 620px) {
  .start-questions li { border-right: 0; }
}
/* Tablet-landscape (e.g. 1024px iPad): when these odd-count grids fall to two
   columns, the lone last item would sit left with empty space on the right.
   Span it across both columns and center it instead. */
@media (min-width: 621px) and (max-width: 1100px) {
  .how-steps .how-step:last-child:nth-child(odd) {
    grid-column: 1 / -1; align-items: center; text-align: center;
  }
  .start-questions li:last-child:nth-child(odd) { grid-column: 1 / -1; }
}

/* ============================================================
   DARK THEME OVERRIDES + REFERENCE-INSPIRED (Bentley / Lotus / white.lockeladder)
   Applies site-wide via the shared stylesheet.
   ============================================================ */

/* --- Header: dark by default (was light paper) --- */
.site-header { background: rgba(17,17,17,.90); border-bottom-color: rgba(255,255,255,.10); }
.site-header.over-hero { background: rgba(0,0,0,0); border-bottom-color: transparent; }
/* Logo is white by default now (dark header); over-hero stays white too. */
.brand-logo { filter: brightness(0) invert(1); }
.site-header.over-hero .brand-logo { filter: brightness(0) invert(1); }

/* --- Heavier, tighter display type for "presence" --- */

.statement-band h2, .ethos-band h2, .cta-section h2 { font-weight: 600; letter-spacing: -0.012em; }

/* --- Primary button = single gold accent (Lotus-yellow analog) --- */
.btn { background: var(--gold); color: #111111; border-color: var(--gold); }
.btn:hover { background: var(--gold-soft); border-color: var(--gold-soft); color: #111111; transform: translateY(-1px); }
.btn.ghost {
  border-color: rgba(255,255,255,.7);
}

.intake-form button,
.intake-form input[type="submit"] {
  border-color: var(--gold);
}

/* --- Surfaces that were hardcoded light, re-skinned dark --- */
.band.cream { background: var(--soft); border-top-color: rgba(255,255,255,.06); }
.band.soft  { background: var(--soft); }
.path-card { background: var(--soft); }
.path-card:hover { background: #1a1a1a; }
.city-tile:hover { background: var(--soft); }
.city-tile.featured { background: var(--gold); color: #111111; }
.city-tile.featured strong { color: #111111; }
.city-tile.featured .city-meta { color: rgba(17,17,17,.72); }
.city-tile.featured .featured-tag { color: rgba(17,17,17,.72); }
.city-tile.featured:hover { background: var(--gold-soft); }

/* keep selects/inputs legible on dark surfaces */
.advisor-controls select, .intake-form input, .intake-form select, .intake-form textarea { color: var(--ink); }
.advisor-controls select option, .intake-form select option { color: #111111; }

/* --- CINEMATIC SERVICE SECTIONS (full-bleed photo + plate caption + dark detail) --- */
.service-cinema-stack { background: #0d0d0d; }
.service-cine {
  position: relative; min-height: 64vh; display: grid; align-items: end;
  overflow: hidden; background: #0d0d0d; scroll-margin-top: 80px;
}
.service-cine .bg {
  position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover;
  filter: saturate(.95); transform: scale(1.03); transition: transform 7s ease;
}
.service-cine:hover .bg { transform: scale(1.09); }
.service-cine .shade {
  position: absolute; inset: 0;
  background:
    linear-gradient(0deg, rgba(0,0,0,.82), rgba(0,0,0,0) 62%),
    linear-gradient(90deg, rgba(0,0,0,.55), rgba(0,0,0,0) 55%);
}
.service-cine .inner {
  position: relative; z-index: 2; max-width: var(--container); margin: 0 auto;
  padding: 120px 36px 60px; color: #fff; width: 100%;
}
.service-cine .service-eyebrow { color: var(--gold); display: block; margin-bottom: 16px; }
.service-cine h3 {
  color: #fff;
  font-family: var(--font-display);
  line-height: .98;
  max-width: 940px;
  margin: 0;
  text-shadow: 0 1px 3px rgba(0,0,0,.3);
}
.service-cine h3 em { font-style: normal; font-weight: 400; color: var(--gold-soft); }
.plate-caption {
  display: block; margin-top: 28px; font-family: var(--font-sans);
  font-size: 11px; letter-spacing: .3em; text-transform: uppercase; font-weight: 700;
  color: rgba(255,255,255,.6);
}
.service-detail {
  padding: 70px 0 92px;
  background: var(--paper);
}
.service-detail .band-inner { max-width: var(--container); }
.service-detail .service-copy { max-width: 780px; }
.service-detail .service-copy p {
  line-height: 1.75;
  color: var(--muted);
}
.service-detail .service-copy p + p { margin-top: 18px; }
.service-detail .service-copy p strong { color: var(--ink); }
.service-detail .explore { margin-top: 30px; }
@media (max-width: 720px) {
  .service-cine { min-height: 58vh; }
  .service-cine .inner { padding: 90px 24px 44px; }
  .service-detail { padding: 48px 0 64px; }
}

/* --- MOTION: scroll reveal ---
   Hero images stay at native scale so they never widen the document on
   desktop, tablet, or phone orientations. */

/* Homepage hero video: sits over the fallback image, plays at native scale
   (no slow zoom), and is hidden for reduced-motion users (image shows). */
.brand-hero .hero-video { animation: none; transform: none; background: #0d0d0d; }
@media (prefers-reduced-motion: reduce) { .brand-hero .hero-video { display: none; } }

/* Mobile hero focal point. On phones the hero is taller than the photo, so
   object-fit: cover crops the SIDES and the horizontal focal point is what
   matters. Each hero can set its own focal point inline via --hp
   (e.g. style="--hp:60% 50%"); it defaults to dead center. */
@media (max-width: 760px) {
  .brand-hero .bg,
  .subpage-hero .bg,
  .hero .hero-bg { object-position: var(--hp, 50% 50%); }
  /* Shorter subpage heroes on phones so the wide photo is cropped far less
     (less zoom) while the headline stays overlaid. The text block is also
     tightened so the hero can sit lower. The homepage (.brand-hero) keeps
     its full-height treatment. */
  .subpage-hero { min-height: 44vh; }
  .subpage-hero .inner { padding-top: 84px; padding-bottom: 36px; }
  .project-hero .hero-inner { padding-top: 84px; padding-bottom: 36px; }
  .subpage-hero .lede { margin-top: 16px; }
  .subpage-hero .actions { margin-top: 24px; }

  /* Enlarged photo hero on phones (opt-in via .hero-tall): a tall, sharp
     full-bleed photo taking over half the screen, with the breadcrumb,
     eyebrow, and headline overlaid. Desktop is unaffected. */
  .subpage-hero.hero-tall { min-height: 59vh; }
  /* Same treatment for the brand-hero pages (brava, pella) and the cost-index
     hero, which use different inner wrappers. The homepage brand-hero has no
     .hero-tall class, so it stays full-height for its video. */
  .brand-hero.hero-tall { min-height: 59vh; }
  .brand-hero.hero-tall .inner { padding-top: 84px; padding-bottom: 36px; }
  .hero.hero-tall { min-height: 59vh; }
  .hero.hero-tall .hero-inner { padding-top: 84px; padding-bottom: 36px; }
}

/* Reveal is only armed once JS adds .reveal-ready to <body>, so no-JS crawlers
   (and reduced-motion users) always see fully visible content. */

@media (prefers-reduced-motion: reduce) {
  body.reveal-ready .reveal { opacity: 1; transform: none; transition: none; }
}

/* legacy .btn.dark was ink(now light)+white text - re-skin to gold accent */
.btn.dark { background: var(--gold); color: #111111; border-color: var(--gold); }
.btn.dark:hover { background: var(--gold-soft); border-color: var(--gold-soft); color: #111111; }

/* --- Typography color balance: white.lockeladder-inspired restraint ---
   Gold stays for real UI accents, buttons, stars, and interaction states.
   Ordinary emphasis and labels read mostly white/off-white/gray. */
h1 em,
h2 em,
h3 em,
.script-mark,
.brand-hero h1 em,
.service-section h2 em,
.subpage-hero h1 em,
.statement-band h2 em,
.ethos-band h2 em,
.cta-section h2 em,
.case-study h2 em,
.hero-inner h1 em,
.city-intro h1 em,
.service-entry h3 em,
.service-cine h3 em {
  color: inherit !important;
}

.eyebrow,
.eyebrow.dark,
.eyebrow.light,
.partners-band .partners-eyebrow,
.partner-card .partner-role,
.product-row .product-label span,
.brand-hero .signals span,
.service-section .service-label,
.service-cine .service-eyebrow,
.card .kicker,
.band.dark .card .kicker,
.index-tab span,
.index-panel .label,
.service-entry .service-eyebrow,
.region .region-label,
.start-questions li span,
.how-step .step-num {
  color: var(--muted) !important;
}

.brand-hero .eyebrow,
.service-section .service-label,
.service-cine .service-eyebrow {
  color: rgba(243,241,234,.72) !important;
}

/* --- User-selected light theme ---
   The default site remains dark. Light mode brightens reading surfaces and the
   solid header while keeping photo heroes, dark CTAs, and footer bands dark. */
body.theme-light {
  --accent: #34373b;
  --copper: #34373b;
  --dark: #0b0b0a;
  --dark2: #161513;
  --dark3: #242220;
  --shadow-soft: 0 1px 2px rgba(0,0,0,.04), 0 14px 34px rgba(20,15,10,.08);
}

body.theme-light .site-header {
  background: rgba(250,250,250,.94);
  border-bottom-color: rgba(17,17,17,.12);
}
body.theme-light .site-header.over-hero {
  background: rgba(0,0,0,0);
  border-bottom-color: transparent;
}
body.theme-light .brand-logo { filter: brightness(0); }
body.theme-light .site-header.over-hero .brand-logo { filter: brightness(0) invert(1); }
body.theme-light .nav-links a { color: var(--ink-soft); }
body.theme-light .site-header.over-hero .nav-links a { color: rgba(255,255,255,.92); }
body.theme-light .nav-cta {
  border-color: var(--ink);
  color: var(--ink);
}
body.theme-light .site-header.over-hero .nav-cta {
  border-color: rgba(255,255,255,.6);
  color: #fff;
}

body.theme-light .band:not(.dark),
body.theme-light .advisor-shell,
body.theme-light .partners-band,
body.theme-light .service-detail,
body.theme-light .path-card {
  background: var(--paper);
}
body.theme-light .band.soft,
body.theme-light .band.cream,
body.theme-light .band.paper,
body.theme-light .path-card,
body.theme-light .city-tile:hover {
  background: var(--soft);
}
body.theme-light .card,
body.theme-light .review,
body.theme-light .faq-item,
body.theme-light .compare th,
body.theme-light .compare td,
body.theme-light .recommendation,
body.theme-light .review-summary {
  border-color: var(--line);
}
body.theme-light .btn.ghost,
body.theme-light .advisor-shell .btn.ghost,
body.theme-light .band:not(.dark) .btn.ghost {
  color: var(--ink);
  border-color: var(--ink);
}
body.theme-light .btn.ghost:hover,
body.theme-light .advisor-shell .btn.ghost:hover,
body.theme-light .band:not(.dark) .btn.ghost:hover {
  background: var(--ink);
  color: #fff;
  border-color: var(--ink);
}
body.theme-light .band.dark,
body.theme-light .site-footer {
  --ink: #ededed;
  --ink-soft: #d6d6d6;
  --muted: #a3a3a3;
  --line: rgba(255,255,255,.14);
  --line-soft: rgba(255,255,255,.07);
}
body.theme-light .band.dark .btn.ghost {
  color: #fff;
  border-color: rgba(255,255,255,.7);
}
body.theme-light .band.dark .btn.ghost:hover {
  background: #fff;
  color: #111111;
  border-color: #fff;
}
body.theme-light .brand-hero .eyebrow,
body.theme-light .service-section .service-label,
body.theme-light .service-cine .service-eyebrow {
  color: rgba(243,241,234,.72) !important;
}

/* ============================================================
   4.0 DESIGN LANGUAGE - FINISH LAYER
   Copper selection/focus, square corners, and the analogue
   film-grain + halftone texture from Locke-ladder-main-site-4.0.
   Pure CSS: no DOM elements and no JavaScript, so AI crawlers
   render the full visual layer without executing scripts.
   ============================================================ */

/* Copper text selection (4.0: background #c47b4f on #111) */

/* Visible copper keyboard focus for accessibility (matches 4.0) */
a:focus-visible,
button:focus-visible,
summary:focus-visible,
input:focus-visible,
select:focus-visible,
textarea:focus-visible,
[tabindex]:focus-visible {
  outline: 2px solid var(--copper);
  outline-offset: 3px;
}

/* Square corners everywhere (4.0 --radius: 0) */
.nav-toggle span { border-radius: 0; }

/* Halftone dot texture utility - used sparingly, as in 4.0 */
.halftone {
  background-image: radial-gradient(rgba(237,237,237,0.05) 1px, transparent 1.2px);
  background-size: 5px 5px;
}

/* Fine film-grain overlay, fixed and very subtle (4.0 .grain-overlay).
   Rendered as a body pseudo-element so every page gets it with no markup
   change and no script. pointer-events:none keeps the page fully clickable. */
body::after {
  content: "";
  pointer-events: none;
  position: fixed;
  inset: 0;
  z-index: 60;
  opacity: 0.05;
  mix-blend-mode: screen;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='160' height='160'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.85' numOctaves='2' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E");
}
/* In the optional light theme the grain would invert oddly under screen blend;
   soften it so it stays subtle on bright surfaces. */
body.theme-light::after { opacity: 0.035; mix-blend-mode: multiply; }

/* ============================================================
   BENTLEY-INSPIRED LAYER - photo depth + editorial spacing
   Inspired by bentleymotors.com/bentley-culture: feature photos
   sit on an offset charcoal "plate" so they float off the page,
   with a soft inner underlay gradient for depth, richer hero
   vignettes, and generous negative space. Pure CSS, no JS.
   Appended last so it wins the cascade; safe to tweak/remove.
   ============================================================ */

/* ---- Generous editorial spacing (Bentley negative space) ---- */

.split, .split.reverse { gap: 112px; }
/* Tablet landscape (e.g. iPad horizontal, ~1024–1194px): two columns are kept,
   but the image is capped and the gap tightened so the copy/product list
   beside it doesn't get smooshed against the edge. */
@media (min-width: 881px) and (max-width: 1200px) {
  .split { grid-template-columns: minmax(0, 1fr) minmax(280px, 360px); }
  .split.reverse { grid-template-columns: minmax(280px, 360px) minmax(0, 1fr); }
  .split, .split.reverse { gap: 48px; }
}

@media (max-width: 880px) {
  .band { padding: 104px 0; }
  
  .split, .split.reverse { gap: 44px; }
  .case-study { padding: 88px 0; }
}

/* ---- Feature photos: offset charcoal plate (depth) ---- */
.split .media,
.case-study .case-image:not(.gallery) {
  position: relative;
  overflow: visible;        /* let the plate peek out behind the image */
  isolation: isolate;       /* own stacking context for the layers below */
}
.split .media::before,
.case-study .case-image:not(.gallery)::before {
  content: "";
  position: absolute;
  inset: 28px -28px -28px 28px;
  border: 1px solid var(--line);
  z-index: 0;
}
.split .media > img,
.case-study .case-image:not(.gallery) > img {
  position: relative;
  z-index: 1;
  display: block;
}
/* Soft inner underlay gradient ON the photo - adds the depth Bentley uses */
.split .media::after,
.case-study .case-image:not(.gallery)::after {
  content: "";
  position: absolute;
  inset: 0;                 /* covers the image box (plate sits behind) */
  z-index: 2;
  pointer-events: none;
  background:
    linear-gradient(180deg, rgba(8,8,8,0) 52%, rgba(8,8,8,.36) 100%),
    radial-gradient(135% 115% at 50% 4%, rgba(0,0,0,0) 58%, rgba(0,0,0,.22) 100%);
}
/* The ::after must hug the image, not the negatively-inset plate area.
   Pin it to the image height by matching the media box (img defines it). */
.split .media,
.case-study .case-image:not(.gallery) { line-height: 0; }

/* Mobile: drop the offset plate so nothing overflows the viewport,
   keep the subtle inner underlay for depth. */
@media (max-width: 880px) {
  .split .media::before,
  .case-study .case-image:not(.gallery)::before { display: none; }
  .split .media,
  .case-study .case-image:not(.gallery) { overflow: hidden; }
}

/* ---- Cropping: slightly more cinematic landscape feature crops ---- */
.split .media.landscape img { aspect-ratio: 3 / 2; object-fit: cover; }

/* ---- Richer full-bleed hero vignette (depth under the type) ---- */
.brand-hero .shade,
.service-cine .shade,
.subpage-hero .shade,
.hero-shade {
  background:
    linear-gradient(180deg, rgba(0,0,0,.52) 0%, rgba(0,0,0,0) 32%, rgba(0,0,0,0) 50%, rgba(0,0,0,.88) 100%),
    radial-gradient(140% 125% at 50% 30%, rgba(0,0,0,0) 46%, rgba(0,0,0,.42) 100%),
    linear-gradient(90deg, rgba(0,0,0,.55), rgba(0,0,0,.04) 56%);
}

/* ---- Gallery photos: consistent depth without an offset plate ----
   Tight grids (proof galleries, case-study galleries) can't take the
   offset plate, so they get a thin frame + inner vignette so EVERY
   content photo on the site reads with the same depth. */
.proof-gallery figure { border: 1px solid var(--line); }
.proof-gallery figure::before {
  content: "";
  position: absolute;
  inset: 0;
  z-index: 1;                 /* above the image, below the caption */
  pointer-events: none;
  background:
    linear-gradient(180deg, rgba(0,0,0,.20) 0%, rgba(0,0,0,0) 26%),
    radial-gradient(130% 120% at 50% 0%, rgba(0,0,0,0) 60%, rgba(0,0,0,.22) 100%);
}
.proof-gallery figcaption { z-index: 2; }
.case-study .case-image.gallery img { border: 1px solid var(--line); }

/* ============================================================
   COWORKER 4.0 LOOK - final override layer
   Matches the live Emergent Home design (locke-ladder-home):
   lighter Termina headings, Mona Sans sentence-case nav + buttons,
   paper-filled primary CTAs, copper reserved for eyebrows/numbers,
   even legible hero wash. CSS only - no markup/content/schema change.
   Appended last so it wins the cascade.
   ============================================================ */

/* ---- Headings: Termina 500, tight tracking, capped sizes, upright ---- */
h1 {
  font-weight: 500;
  letter-spacing: -0.025em;
}
h2 {
  font-weight: 500;
  letter-spacing: -0.025em;
}
h3 { font-weight: 500; letter-spacing: -0.02em; }
.brand-hero h1 {
  font-weight: 500;
  letter-spacing: -0.025em;
}
.subpage-hero h1, .hero-inner h1, .city-intro h1 { font-weight: 500; letter-spacing: -0.025em; }
.service-cine h3 {
  font-weight: 500;
  letter-spacing: -0.022em;
}
.statement-band h2, .ethos-band h2, .cta-section h2, .case-study h2,
.partners-band h3, .service-entry h3 { font-weight: 500; letter-spacing: -0.02em; }
/* Upright headline accents */
h1 em, h2 em, h3 em,
.brand-hero h1 em, .service-cine h3 em, .subpage-hero h1 em,
.case-study h2 em, .hero-inner h1 em, .city-intro h1 em,
.statement-band h2 em, .ethos-band h2 em, .cta-section h2 em {
  font-style: normal; color: inherit;
}

/* ---- Nav links: Mona Sans, sentence case, soft light ---- */
.nav-links a {
  font-family: var(--font-sans);
  font-size: 14px; font-weight: 400; letter-spacing: 0.02em;
  text-transform: none; color: rgba(237,237,237,0.72);
}
.site-header.over-hero .nav-links a { color: rgba(237,237,237,0.82); }
.nav-links a:hover,
.nav-links a[aria-current="page"] { color: var(--ink); }
.nav-links a::after { display: none; }   /* color shift, no underline bar */

/* ---- Primary button: solid paper, dark text, Mona Sans sentence case, square ---- */
.btn, .btn.dark {
  font-family: var(--font-sans);
  background: var(--ink); color: var(--paper);
  border: 1px solid var(--ink);
  text-transform: none; letter-spacing: 0.02em; font-weight: 500; font-size: 14px;
  padding: 16px 28px; min-height: 0; border-radius: 0;
}
.btn:hover, .btn.dark:hover { background: #ffffff; border-color: #ffffff; color: var(--paper); transform: none; }
/* Ghost / secondary: transparent, thin light border */
.btn.ghost {
  background: transparent; color: var(--ink); border: 1px solid rgba(237,237,237,0.4);
}
.btn.ghost:hover { background: var(--ink); color: var(--paper); border-color: var(--ink); }
.btn.ink-ghost { background: transparent; color: var(--ink); border-color: rgba(237,237,237,0.4); }
.btn.ink-ghost:hover { background: var(--ink); color: var(--paper); border-color: var(--ink); }

/* Nav CTA: solid paper "Schedule" button */
.nav-cta {
  font-family: var(--font-sans);
  text-transform: none;
  letter-spacing: 0.02em;
  font-weight: 500;
  font-size: 14px;
  padding: 12px 22px;
  border-radius: 0;
}
.site-header.over-hero .nav-cta { background: var(--ink); color: var(--paper); border-color: var(--ink); }

/* Intake form submit matches primary button */
.intake-form button,
.intake-form input[type="submit"] {
  font-family: var(--font-sans);
  background: var(--ink); color: var(--paper); border: 1px solid var(--ink);
  text-transform: none; letter-spacing: 0.02em; font-weight: 500; border-radius: 6px;
}
.intake-form button:hover,
.intake-form input[type="submit"]:hover { background: #ffffff; border-color: #ffffff; color: var(--paper); }

/* ---- Inline "explore" links: sentence case, copper ---- */
.explore {
  font-family: var(--font-sans);
  text-transform: none; letter-spacing: 0.02em; font-weight: 500; font-size: 13px;
}

/* ---- Eyebrows + service numbers: copper, restrained ---- */
.eyebrow, .eyebrow.dark, .eyebrow.light,
.partners-band .partners-eyebrow, .partner-card .partner-role,
.product-row .product-label span, .service-section .service-label,
.service-cine .service-eyebrow, .service-entry .service-eyebrow,
.card .kicker, .band.dark .card .kicker, .index-tab span, .index-panel .label,
.region .region-label, .case-study .case-meta, .city-stats span, .city-intro .stats span,
.brand-hero .eyebrow {
  color: var(--copper) !important;
  font-size: 12px; letter-spacing: 0.22em; font-weight: 600;
}
.how-step .step-num, .process-step .step-num, .path-card .path-num {
  color: var(--copper); font-style: normal;
}

/* ---- Hero: even, legible wash (replaces the heavy vignette) ---- */
.brand-hero .shade,
.subpage-hero .shade,
.service-cine .shade,
.hero-shade {
  background:
    linear-gradient(180deg, rgba(17,17,17,0.55) 0%, rgba(17,17,17,0.26) 42%, rgba(17,17,17,0.74) 100%),
    linear-gradient(90deg, rgba(17,17,17,0.5) 0%, rgba(17,17,17,0.04) 60%);
}

/* ---- Hero signals: restrained meta row (not giant stat numbers) ---- */
.brand-hero .signals { gap: 44px; margin-top: 52px; padding-top: 26px; border-top: 1px solid rgba(237,237,237,0.18); }
.brand-hero .signals div { font-size: 12px; color: rgba(237,237,237,0.66); }
.brand-hero .signals strong {
  font-family: var(--font-display);
  font-size: 18px; font-weight: 500; color: var(--ink); margin-bottom: 2px;
}

/* ============================================================
   THEME + PHOTO FIXES (v4.2)
   - Primary buttons legible in BOTH light & dark, all header states
   - Offset plate adapts to theme (no black slab in light mode)
   - Per-photo variation for Bentley-style pop
   ============================================================ */

/* ---- Primary buttons: dark-fill+light-text in light mode, all states ---- */
body.theme-light .nav-cta,
body.theme-light .site-header.over-hero .nav-cta,
body.theme-light .btn,
body.theme-light .btn.dark,
body.theme-light .intake-form button,
body.theme-light .intake-form input[type="submit"] {
  background: var(--ink);
  color: var(--paper);
  border-color: var(--ink);
}
body.theme-light .nav-cta:hover,
body.theme-light .btn:hover,
body.theme-light .btn.dark:hover,
body.theme-light .intake-form button:hover,
body.theme-light .intake-form input[type="submit"]:hover {
  background: #000000;
  border-color: #000000;
  color: var(--paper);
}
/* ---- Offset plate: theme-adaptive (was a black slab in light mode) ---- */
.split .media::before,
.case-study .case-image:not(.gallery)::before {
  background: #1c1c1c;                 /* dark mode: subtle lift off #111 */
  border-color: var(--line);
}
body.theme-light .split .media::before,
body.theme-light .case-study .case-image:not(.gallery)::before {
  background: #e6e6e6;                 /* light mode: soft gray plate */
  border-color: rgba(17,17,17,0.14);
}

/* ---- Per-photo VARIATION (Bentley-style pop) ---- */
/* Reverse-layout sections mirror the plate to peek toward the outer edge,
   and carry a faint copper-tinted frame so alternating photos read differently. */
.split.reverse .media::before,
.case-study.reverse .case-image:not(.gallery)::before {
  inset: 28px 28px -28px -28px;        /* peek bottom-LEFT */
  background: #181818;
  border-color: rgba(196,123,79,0.30); /* copper accent edge */
}
body.theme-light .split.reverse .media::before,
body.theme-light .case-study.reverse .case-image:not(.gallery)::before {
  background: #ededed;
  border-color: rgba(196,123,79,0.38);
}
/* Mirror the inner underlay direction on reverse layouts for added variety */
.split.reverse .media::after,
.case-study.reverse .case-image:not(.gallery)::after {
  background:
    linear-gradient(180deg, rgba(8,8,8,0) 52%, rgba(8,8,8,.34) 100%),
    radial-gradient(130% 120% at 12% 8%, rgba(0,0,0,0) 58%, rgba(0,0,0,.24) 100%);
}

/* Gallery figures: vary the weighting image-to-image so each one pops */
.proof-gallery figure:nth-child(3n+1)::before {
  background:
    linear-gradient(180deg, rgba(0,0,0,.24) 0%, rgba(0,0,0,0) 30%),
    radial-gradient(120% 120% at 8% 0%, rgba(0,0,0,0) 60%, rgba(0,0,0,.26) 100%);
}
.proof-gallery figure:nth-child(3n+2)::before {
  background:
    radial-gradient(125% 120% at 88% 100%, rgba(0,0,0,0) 52%, rgba(0,0,0,.30) 100%);
}
.proof-gallery figure:nth-child(3n)::before {
  background:
    linear-gradient(180deg, rgba(0,0,0,0) 48%, rgba(0,0,0,.36) 100%),
    linear-gradient(90deg, rgba(0,0,0,.16) 0%, rgba(0,0,0,0) 34%);
}

/* Light mode: lighten the inner photo underlay so it reads as gentle depth,
   not a heavy black cast (the weighting still varies via the rules above). */
body.theme-light .split .media::after,
body.theme-light .case-study .case-image:not(.gallery)::after {
  background:
    linear-gradient(180deg, rgba(0,0,0,0) 60%, rgba(0,0,0,.16) 100%),
    radial-gradient(130% 120% at 50% 4%, rgba(0,0,0,0) 64%, rgba(0,0,0,.10) 100%);
}
body.theme-light .proof-gallery figure::before { opacity: 0.6; }

/* ============================================================
   HERO LEGIBILITY + STATE-AWARE BUTTONS (v4.3)
   The hero sits on a dark photo in BOTH themes, so its text and
   action buttons must stay light there. The nav CTA flips by
   header state in light mode (light over the photo, dark once
   scrolled onto the solid light header).
   ============================================================ */

/* ---- Hero text always light (was turning black at the bottom in light mode) ---- */
.brand-hero .signals strong,
.subpage-hero .signals strong { color: #f3f3f3; }
.brand-hero .signals div,
.subpage-hero .signals div { color: rgba(255,255,255,0.7); }
body.theme-light .brand-hero .inner,
body.theme-light .brand-hero .lede,
body.theme-light .subpage-hero .inner,
body.theme-light .subpage-hero .lede,
body.theme-light .hero-inner,
body.theme-light .service-cine .inner { color: #ffffff; }

/* ---- Hero ACTION buttons: always light/paper + dark text (pop on the photo) ---- */
.brand-hero .actions .btn:not(.ghost),
.subpage-hero .actions .btn:not(.ghost),
.hero-actions .btn:not(.ghost) {
  background: #ededed; color: #111111; border-color: #ededed;
}
.brand-hero .actions .btn:not(.ghost):hover,
.subpage-hero .actions .btn:not(.ghost):hover,
.hero-actions .btn:not(.ghost):hover {
  background: #ffffff; border-color: #ffffff; color: #111111;
}
/* Hero ghost + explore links stay light-on-photo in both themes */
.brand-hero .actions .btn.ghost,
.subpage-hero .actions .btn.ghost,
.hero-actions .btn.ghost,
body.theme-light .brand-hero .actions .btn.ghost,
body.theme-light .subpage-hero .actions .btn.ghost {
  background: transparent; color: #ffffff; border-color: rgba(255,255,255,0.5);
}
.brand-hero .actions .btn.ghost:hover,
.subpage-hero .actions .btn.ghost:hover,
.hero-actions .btn.ghost:hover {
  background: #ffffff; color: #111111; border-color: #ffffff;
}
.brand-hero .actions .explore,
.subpage-hero .actions .explore,
.hero-actions .explore,
body.theme-light .brand-hero .actions .explore { color: #ffffff; border-color: rgba(255,255,255,0.4); }

/* ---- Nav CTA: state-aware in light mode ---- */
/* Over the dark hero photo: light/paper button with dark text (pops) */
body.theme-light .site-header.over-hero .nav-cta {
  background: var(--paper); color: var(--ink); border-color: var(--paper);
}
body.theme-light .site-header.over-hero .nav-cta:hover {
  background: #ffffff; color: var(--ink); border-color: #ffffff;
}
/* Scrolled onto the solid light header: dark fill + light text (from v4.2) stays */

/* Primary buttons on ALL always-dark contexts = light/paper fill + dark text,
   in both themes (prevents dark-on-dark invisibility in light mode). */
.brand-hero .btn:not(.ghost),
.subpage-hero .btn:not(.ghost),
.hero .btn:not(.ghost),
.band.dark .btn:not(.ghost),
.cta-section .btn:not(.ghost),
.ethos-band .btn:not(.ghost),
.calculator .btn:not(.ghost) {
  background: #ededed; color: #111111; border-color: #ededed;
}
.brand-hero .btn:not(.ghost):hover,
.subpage-hero .btn:not(.ghost):hover,
.hero .btn:not(.ghost):hover,
.band.dark .btn:not(.ghost):hover,
.cta-section .btn:not(.ghost):hover,
.ethos-band .btn:not(.ghost):hover,
.calculator .btn:not(.ghost):hover {
  background: #ffffff; color: #111111; border-color: #ffffff;
}

/* ============================================================
   HERO BUTTONS: transparent over the photo (v4.4)
   The primary hero buttons + the nav CTA while over the hero are
   transparent with white text, a hairline border, and a text-shadow
   so they're legible on any part of the image instead of a white box.
   ============================================================ */
.brand-hero .actions .btn:not(.ghost),
.subpage-hero .actions .btn:not(.ghost),
.hero-actions .btn:not(.ghost),
.site-header.over-hero .nav-cta,
body.theme-light .site-header.over-hero .nav-cta {
  background: transparent;
  color: #ffffff;
  border: 1px solid rgba(255,255,255,0.65);
  text-shadow: 0 1px 4px rgba(0,0,0,0.5);
}
.brand-hero .actions .btn:not(.ghost):hover,
.subpage-hero .actions .btn:not(.ghost):hover,
.hero-actions .btn:not(.ghost):hover,
.site-header.over-hero .nav-cta:hover,
body.theme-light .site-header.over-hero .nav-cta:hover {
  background: rgba(255,255,255,0.14);
  border-color: #ffffff;
  color: #ffffff;
  text-shadow: 0 1px 4px rgba(0,0,0,0.5);
}

/* ============================================================
   TEAM GRID + VIDEO FACADE (v4.5)
   Team page photo grid and a lightweight, crawlable video facade
   (poster + play button; the iframe loads only on click via a tiny
   progressive-enhancement script). No-JS users get a link to YouTube.
   ============================================================ */

/* ---- Team grid ---- */
.team-grid {
  display: grid;
  grid-template-columns: repeat(4, minmax(0,1fr));
  border-top: 1px solid var(--line);
  border-left: 1px solid var(--line);
}
@media (max-width: 1000px) { .team-grid { grid-template-columns: repeat(3, 1fr); } }
@media (max-width: 720px) { .team-grid { grid-template-columns: repeat(2, 1fr); } }
@media (max-width: 440px) { .team-grid { grid-template-columns: 1fr; } }
.team-member {
  border-right: 1px solid var(--line);
  border-bottom: 1px solid var(--line);
  padding: 22px 22px 26px;
  display: flex;
  flex-direction: column;
  gap: 16px;
}
.team-photo, .team-monogram {
  aspect-ratio: 4 / 5;
  width: 100%;
  object-fit: cover;
  display: block;
  filter: grayscale(1) contrast(1.02);
  transition: filter .4s ease;
}
.team-member:hover .team-photo { filter: grayscale(0); }
.team-monogram {
  display: flex; align-items: center; justify-content: center;
  background: var(--soft);
  font-family: var(--font-display);
  font-weight: 500; font-size: 44px; letter-spacing: -0.02em;
  color: var(--copper);
}
.team-member strong {
  font-family: var(--font-display);
  font-weight: 500; font-size: 20px; letter-spacing: -0.01em;
  color: var(--ink); line-height: 1.15;
}

/* ---- Video facade ---- */
.video-embed { display: flex; flex-direction: column; gap: 14px; }
.video-embed .eyebrow { margin: 0; }
.video-frame {
  position: relative;
  aspect-ratio: 16 / 9;
  width: 100%;
  overflow: hidden;
  background: #0d0d0d;
}
.video-facade { position: absolute; inset: 0; display: block; cursor: pointer; }
.video-facade img { width: 100%; height: 100%; object-fit: cover; display: block; opacity: 0.86; transition: opacity .3s ease, transform 6s ease; }
.video-facade:hover img { opacity: 1; transform: scale(1.03); }
.video-play {
  position: absolute; top: 50%; left: 50%; transform: translate(-50%,-50%);
  width: 74px; height: 74px; border-radius: 50%;
  background: rgba(17,17,17,0.55); border: 1px solid rgba(255,255,255,0.7);
  display: flex; align-items: center; justify-content: center;
  transition: background .25s ease, transform .25s ease;
}
.video-facade:hover .video-play { background: var(--copper); transform: translate(-50%,-50%) scale(1.06); }
.video-play::after {
  content: ""; display: block;
  width: 0; height: 0; margin-left: 5px;
  border-style: solid; border-width: 12px 0 12px 20px;
  border-color: transparent transparent transparent #ffffff;
}
.video-frame iframe { position: absolute; inset: 0; width: 100%; height: 100%; border: 0; }
.video-embed figcaption {
  font-family: var(--font-sans);
  font-size: 13px; color: var(--muted); letter-spacing: 0.04em;
}
/* Two videos side by side where space allows */
.video-pair { display: grid; grid-template-columns: 1fr 1fr; gap: 32px; }
@media (max-width: 820px) { .video-pair { grid-template-columns: 1fr; gap: 28px; } }

.video-feature {
  display: grid;
  grid-template-columns: minmax(0, .82fr) minmax(0, 1.18fr);
  gap: 36px;
  align-items: center;
  margin-top: 58px;
  padding-top: 34px;
  border-top: 1px solid var(--line);
}
.video-feature h3 {
  max-width: 560px;
  margin: 8px 0 12px;
  font-family: var(--font-display);
  font-size: clamp(28px, 3vw, 44px);
  font-weight: 500;
  line-height: 1.02;
}
.video-feature p:not(.eyebrow) {
  max-width: 620px;
  color: var(--muted);
}
@media (max-width: 900px) {
  .video-feature {
    grid-template-columns: 1fr;
    gap: 24px;
    margin-top: 42px;
  }
}

/* ============================================================
   NAV CTA blends with the solid header on scroll (v4.6)
   Scrolled (solid header): transparent so the header color shows
   through, using the header's own text color + a hairline border.
   Over-hero state keeps its transparent-white treatment (v4.4).
   ============================================================ */
.nav-cta {
  background: transparent;
  color: var(--ink);
  border: 1px solid var(--line);
}
.nav-cta:hover {
  background: rgba(237,237,237,0.10);
  border-color: var(--ink);
  color: var(--ink);
}
body.theme-light .nav-cta {
  background: transparent;
  color: var(--ink);
  border-color: rgba(17,17,17,0.28);
}
body.theme-light .nav-cta:hover {
  background: rgba(17,17,17,0.06);
  border-color: var(--ink);
  color: var(--ink);
}

/* ============ CONSOLIDATED font-size-adjust ============
   Body sans renders at 0.52, Termina (display) at 0.41 - formerly repeated per rule. */
.answer-card .figure,
.big5 article span,
.big5 article strong,
.brand-hero .signals strong,
.brand-hero h1,
.brand-text strong,
.brand-text-mark strong,
.calc-output .range-out,
.card h3,
.case-study .case-facts strong,
.case-study .case-lede,
.case-study .case-pull,
.case-study h2,
.city-intro .stats strong,
.city-intro h1,
.city-stats strong,
.city-tile strong,
.compare td strong,
.compare td:last-child,
.confidence,
.cost-foot .pull,
.cost-row .c-cat,
.cost-row .c-median,
.cta-section h2,
.ethos-band .ethos-lede,
.ethos-band h2,
.ethos-stack article h3,
.faq-item summary,
.footer-inner .brand-block strong,
.footer-inner address strong,
.hero-inner h1,
.hero-inner h2,
.how-step .step-num,
.how-step h3,
.index-panel h3,
.index-tab strong,
.intake-disclaimer,
.intro-statement p,
.nav-cta,
.nav-links a,
.note,
.partner-card .partner-name,
.partners-band h3,
.path-card .path-num,
.path-card h3,
.process-step .step-num,
.process-step h3,
.product-row .product-label,
.proof-gallery figcaption strong,
.recommendation h3,
.region h3,
.review p,
.review-summary .big,
.review-summary .breakdown strong,
.script-mark,
.serif,
.service-cine h3,
.service-entry h3,
.service-section .meta strong,
.service-section h2,
.site-header,
.start-questions li,
.stat-row strong,
.statement-band h2,
.subpage-hero h1,
.team-member strong,
.team-monogram,
[style*="--font-display"],
h1, h2, h3, h4,
ul.checklist li::before { font-size-adjust: 0.41; }
.advisor-controls label,
.advisor-controls select,
.answer-card .figure small,
.breadcrumb,
.btn,
.btn, .btn.dark,
.calc-form label,
.calc-form select, .calc-form input[type="range"],
.calc-output .system-label,
.card .arrow,
.card .kicker,
.case-study .case-facts span,
.case-study .case-meta,
.case-study .case-pull cite,
.city-intro .stats span,
.city-stats span,
.city-tile .city-meta,
.city-tile.featured .featured-tag,
.cost-row .c-cat span,
.cost-row .c-n,
.ethos-stack article .ethos-eyebrow,
.explore,
.eyebrow,
.faq-item summary::after,
.footer-bottom,
.index-panel .label,
.index-tab span,
.intake-form button,
.intake-form input, .intake-form select, .intake-form textarea,
.intake-form label,
.intro-statement p.fine,
.nav-cta,
.nav-links a,
.note strong,
.partner-card .partner-role,
.partners-band .partners-eyebrow,
.path-card .arrow,
.plate-caption,
.process-step .step-label,
.product-row .product-label span,
.proof-gallery figcaption span,
.recommendation .rec-label,
.region .region-label,
.review .attrib,
.review-summary .breakdown div,
.service-entry .service-eyebrow,
.service-section .service-label,
.stat-row span,
.video-embed figcaption,
body,
table.compare { font-size-adjust: 0.52; }

/* ============================================================
   5.0 EDITORIAL RESTRAINT LAYER
   Adopted: consistent 112px band rhythm, tighter type scale,
   numbered line-item service index, materials tradeoff rows,
   founder pull-quote, restored light/dark band alternation,
   faster scroll-reveal. CSS-only - no content or schema change.
   Appended last so it wins the cascade.
   ============================================================ */

/* ---- Consistent band rhythm: one 112px module, like the reference ---- */
.band { padding: 112px 0; }
.band.tight { padding: 88px 0; }
.intro-statement { padding: 112px 0; }
.statement-band { padding: 112px 36px; }
.cta-section { padding: 112px 36px; }
.ethos-band { padding: 112px 0; }
.case-study { padding: 112px 0; }
.partners-band { padding: 88px 0; }
.section-head { margin-bottom: 72px; gap: 80px; }
.section-head--single { display: block; }
.roof-system .section-head--single h2 { max-width: 1200px; }
/* "Sys·tem noun" dictionary headword lives inside the section head now (not a
   floating opener). Restore its large display size + dark ink over the generic
   .section-head p rule (font-size) and the roofing-composed color remap. */
body.roofing-composed .roof-system .section-head--single .rsys-define-word,
.roof-system .section-head--single .rsys-define-word {
  margin-top: clamp(56px, 7vw, 104px);
  max-width: none;
  font-family: var(--font-display);
  font-weight: 700;
  font-size: clamp(52px, 6.2vw, 82px);
  line-height: .92;
  letter-spacing: -.025em;
  color: var(--ink);
  text-align: center;
}
.roof-system .section-head--single .rsys-define-meaning {
  margin-top: 28px;
  font-family: var(--font-display);
  font-size: clamp(24px, 2.55vw, 36px);
  line-height: 1.35;
}
@media (max-width: 880px) {
  .band, .intro-statement, .ethos-band, .case-study { padding: 80px 0; }
  .section-head { margin-bottom: 44px; gap: 28px; }
}

/* ---- Restored light/dark alternation (rhythm was flattened) ---- */
:root { --dark2: #191919; }
.band.soft, .band.cream { background: var(--soft); border-top-color: rgba(237,237,237,.05); }
.band.dark, .cta-section, .site-footer { background: #0a0a0a; }
.ethos-band { background: #0a0a0a; }

body.theme-light .band.dark, body.theme-light .cta-section, body.theme-light .site-footer, body.theme-light .ethos-band { background: #0b0b0a; }

/* ---- Type scale: reference-matched (72/48 desktop, calm body) ---- */
h1 { font-size: clamp(40px, 6.4vw, 72px); line-height: 1.0; }
h2 { font-size: clamp(30px, 4vw, 48px); line-height: 1.02; }
.brand-hero h1 { font-size: clamp(44px, 7vw, 76px); line-height: 0.98; }
.subpage-hero h1, .hero-inner h1, .city-intro h1 { font-size: clamp(38px, 5.4vw, 64px); }
.service-cine h3 { font-size: clamp(32px, 4.6vw, 58px); }

.section-head p { font-size: 17px; line-height: 1.7; color: var(--ink-soft); max-width: 440px; }
.brand-hero .lede, .subpage-hero .lede, .hero-inner p.lead { font-size: clamp(16px, 1.4vw, 19px); max-width: 640px; }
.intro-statement p { font-size: clamp(20px, 2vw, 27px); line-height: 1.45; }
.intro-statement p.fine { font-size: 16px; }
.body-flow { font-size: 17px; }
.service-detail .service-copy p { font-size: 17px; }
.card p, .faq-item div.answer { font-size: 16px; }
.case-study .case-body p { font-size: 17px; }

/* ---- Eyebrow: reference-matched (11.5px / 500 / .22em copper) ---- */
.eyebrow, .eyebrow.dark, .eyebrow.light,
.partners-band .partners-eyebrow, .partner-card .partner-role,
.product-row .product-label span, .service-section .service-label,
.service-cine .service-eyebrow, .service-entry .service-eyebrow,
.card .kicker, .index-tab span, .index-panel .label,
.region .region-label, .case-study .case-meta, .city-stats span {
  font-size: 11.5px; font-weight: 500; letter-spacing: 0.22em;
}

/* ---- Numbered service index (reference line-item pattern) ---- */
.line-index { list-style: none; margin: 0; padding: 0; border-bottom: 1px solid var(--line); }
.line-index li { margin: 0; padding: 0; }
.line-index a.line-item {
  display: grid;
  grid-template-columns: 72px minmax(180px, 240px) 1fr;
  gap: 32px;
  align-items: baseline;
  padding: 30px 0;
  transition: padding-left .25s ease;
}
.line-index a.line-item:hover { padding-left: 14px; }
.line-index .li-num {
  font-family: var(--font-sans);
  font-size: 13px; font-weight: 500; letter-spacing: 0.14em;
  color: var(--copper); line-height: 1.6;
}
.line-index .li-title {
  font-family: var(--font-display);
  font-size: 18px; font-weight: 500; letter-spacing: -0.01em;
  color: var(--ink); line-height: 1.25;
  font-size-adjust: 0.41;
}
.line-index .li-desc {
  font-family: var(--font-sans);
  font-size: 15px; line-height: 1.6; color: var(--muted);
  max-width: 620px; margin: 0;
}
.line-index a.line-item:hover .li-title { color: var(--copper); }
@media (max-width: 760px) {
  .line-index a.line-item { grid-template-columns: 44px 1fr; gap: 10px 18px; padding: 24px 0; }
  .line-index .li-desc { grid-column: 2; }
}

/* ---- Materials tradeoff rows ("When it makes sense / The tradeoff") ---- */
.material-rows { border-bottom: 1px solid var(--line); }
.material-row {
  display: grid;
  gap: 40px;
  padding: 44px 0;
  align-items: start;
}
@media (max-width: 980px) {
  .material-row {
  gap: 18px 20px;
  padding: 32px 0;
}
  
}
.material-row .mat-num {
  font-family: var(--font-sans);
  font-size: 13px; font-weight: 500; letter-spacing: 0.14em;
  color: var(--copper); line-height: 1.7;
}
.material-row .mat-name {
  font-family: var(--font-display);
  font-size: clamp(19px, 1.8vw, 23px); font-weight: 500; letter-spacing: -0.012em;
  color: var(--ink); line-height: 1.2;
  font-size-adjust: 0.41;
}
.material-row .mat-meta {
  display: block;
  font-family: var(--font-sans);
  font-size: 12px; letter-spacing: 0.08em; color: var(--muted);
  margin-top: 12px; line-height: 1.7; font-size-adjust: 0.52;
}
.material-row .mat-meta strong { color: var(--ink-soft); font-weight: 500; }
.material-row .mat-label {
  display: block;
  font-family: var(--font-sans);
  font-weight: 500;
  text-transform: uppercase;
  color: rgba(237,237,237,0.4);
  margin-bottom: 14px;
}
body.theme-light .material-row .mat-label { color: rgba(17,17,17,0.4); }
.material-row .mat-col p { font-size: 15px; line-height: 1.65; color: var(--ink-soft); margin: 0; }

/* ---- Founder pull-quote (reference treatment) ---- */
.pull-quote {
  margin: 40px 0 0;
  padding: 4px 0 4px 24px;
  font-family: var(--font-display);
  font-style: normal;
  font-weight: 500;
  font-size: clamp(17px, 1.6vw, 20px);
  line-height: 1.4;
  letter-spacing: -0.008em;
  color: var(--ink);
  font-size-adjust: 0.41;
  max-width: 620px;
}
.band.dark .pull-quote, .ethos-band .pull-quote { color: #ededed; }
.pull-quote cite {
  display: block;
  font-family: var(--font-sans);
  font-style: normal;
  font-weight: 500;
  text-transform: uppercase;
  color: var(--muted);
  margin-top: 18px;
  font-size-adjust: 0.52;
}

/* ---- Scroll reveal: twice as fast, smaller travel ---- */
body.reveal-ready .reveal { opacity: 0; transform: translateY(14px); transition: opacity .4s ease, transform .4s ease; }
body.reveal-ready .reveal.is-visible { opacity: 1; transform: none; }

/* ---- Paragraph rhythm inside editorial splits (reference spacing) ---- */
.split h2 { margin: 16px 0 26px; }
.split p + p { margin-top: 18px; }

/* ---- No italic accents in headings (reference discipline) ---- */
h1 .script-mark, h2 .script-mark, h3 .script-mark,
h1 em, h2 em, h3 em { font-style: normal; color: inherit; }

/* ============================================================
   5.1 CONTAINED TRADE IMAGERY (reference image sizing)
   Full-bleed cinema bands -> contained editorial splits with a
   ~500px 4:5 figure and a quiet plate caption, like the founder
   figure on the reference homepage. CSS + markup, content intact.
   ============================================================ */

.service-editorial-stack { background: var(--paper); }
.service-editorial {
  padding: 96px 0;
  border-top: 1px solid var(--line-soft);
  scroll-margin-top: 90px;
  overflow: hidden;
}
.service-editorial:nth-of-type(even) { background: var(--soft); }

.media-split {
  display: grid;
  grid-template-columns: minmax(0, 480px) 1fr;
  gap: 80px;
  align-items: center;
}
.media-split.reverse { grid-template-columns: 1fr minmax(0, 480px); }
.media-split.reverse .se-figure { order: 2; }
@media (max-width: 880px) {
  .media-split, .media-split.reverse { grid-template-columns: 1fr; gap: 36px; }
  .media-split.reverse .se-figure { order: 0; }
}

.se-figure { margin: 0; }
.se-figure img {
  width: 100%;
  aspect-ratio: 4 / 5;
  object-fit: cover;
  display: block;
  filter: saturate(.96);
}
@media (max-width: 880px) { .se-figure img { aspect-ratio: 4 / 3; } }
.se-figure figcaption,
.founder-figure figcaption {
  margin-top: 12px;
  font-family: var(--font-sans);
  font-weight: 500;
  text-transform: uppercase;
  color: rgba(237,237,237,0.45);
  font-size-adjust: 0.52;
}
body.theme-light .se-figure figcaption,
body.theme-light .founder-figure figcaption { color: rgba(17,17,17,0.45); }
.band.dark .founder-figure figcaption { color: rgba(237,237,237,0.45); }

.se-copy .service-eyebrow {
  display: block;
  font-family: var(--font-sans);
  font-size: 11.5px;
  font-weight: 500;
  letter-spacing: 0.22em;
  text-transform: uppercase;
  color: var(--copper);
  margin-bottom: 16px;
}
.se-copy h3 {
  font-family: var(--font-display);
  font-weight: 500;
  font-size: clamp(26px, 3vw, 40px);
  line-height: 1.05;
  letter-spacing: -0.02em;
  color: var(--ink);
  margin: 0 0 24px;
}
.se-copy h3 em { font-style: normal; color: inherit; }
.se-copy p { font-size: 17px; line-height: 1.7; color: var(--ink-soft); max-width: 580px; }
.se-copy p + p { margin-top: 16px; }
.se-copy p strong { color: var(--ink); }
.se-copy .explore { margin-top: 30px; }

/* Founder figure (reference treatment, used on home + about) */
.founder-figure { margin: 0; }
.founder-figure img {
  width: 100%;
  aspect-ratio: 4 / 5;
  object-fit: cover;
  display: block;
}
/* the founder split sits inside .split - suppress the offset-plate styling
   that targeted .split .media (the figure replaces .media entirely) */
.split .founder-figure { line-height: normal; }

/* ============================================================
   5.2 MOBILE AUDIT FIXES (portrait + landscape)
   - Cost & Scope index tabs: clamp to container (390px overflow)
   - Intake form rows: min-width-safe columns (landscape overflow)
   - Hamburger nav in LANDSCAPE phones (short viewports), not a
     full link row across the top
   ============================================================ */

/* ---- Cost index: never wider than its container ---- */
@media (max-width: 880px) {
  .index-block { grid-template-columns: minmax(0, 1fr); }
  .index-tabs, .index-panel { min-width: 0; max-width: 100%; }
  .index-tab { width: 100%; min-width: 0; box-sizing: border-box; }
  .index-tab.is-active { margin-left: 0; padding-left: 16px; }
  .index-tab:hover { padding-left: 0; }
}

/* ---- Intake form: columns can shrink, controls never overflow ---- */
.intake-form .row { grid-template-columns: repeat(2, minmax(0, 1fr)); }
.intake-form .row.row-single { grid-template-columns: minmax(0, 1fr); }
.intake-form label { min-width: 0; }
.intake-form input, .intake-form select, .intake-form textarea {
  width: 100%; max-width: 100%; min-width: 0; box-sizing: border-box;
}
.intake-form input[type="submit"] { width: auto; }
.form-confirmation {
  display: none;
  margin: 18px 0 0;
  padding: 16px 18px;
  border: 1px solid var(--gold);
  border-radius: 6px;
  background: var(--gold-soft);
  color: var(--ink);
  font-weight: 600;
}
.form-confirmation:target { display: block; }
@media (max-width: 720px) { .intake-form .row { grid-template-columns: minmax(0, 1fr); } }

/* ---- Hamburger nav on landscape phones (short viewport) ----
   Same treatment as portrait mobile: brand + CTA + theme toggle +
   three-bar toggle, links in a dropdown panel. Applies whenever the
   viewport is 520px tall or less, regardless of width. */
@media (min-width: 721px) and (max-height: 520px) {
  .nav { padding: 14px 24px; gap: 16px; position: relative; flex-wrap: wrap; }
  .js .nav { flex-wrap: nowrap; }
  .brand { order: 1; }
  .nav-cta { order: 2; margin-left: auto; }
  .js .nav-toggle { display: flex; order: 4; }
  .nav-links {
    order: 4;
    display: flex;
    position: static;
    flex: 1 0 100%;
    top: 100%;
    left: 0;
    right: 0;
    flex-direction: column;
    gap: 0;
    background: var(--paper);
    border-bottom: 1px solid var(--line);
    box-shadow: var(--shadow-soft);
    padding: 4px 24px 14px;
  }
  .js .nav-links {
    display: none;
    position: absolute;
    flex: 0 1 auto;
  }
  .js .nav.nav-open .nav-links { display: flex; }
  .nav-links a,
  .site-header.over-hero .nav-links a {
    color: var(--ink-soft);
    font-size: 15px;
    letter-spacing: .12em;
    padding: 13px 2px;
    border-bottom: 1px solid var(--line-soft);
  }
  .nav-links a:last-child { border-bottom: 0; }
  .nav-links a::after { display: none; }
}

/* Dropdown menu itself must fit short viewports: scroll inside */
@media (max-height: 520px), (max-width: 720px) {
  .nav-links { max-height: calc(100vh - 76px); overflow-y: auto; }
}

/* ---- Cost index stat row: 2x2 on phones, columns can shrink ---- */
@media (max-width: 720px) {
  
  .stat-row div { border-right: 0; padding-right: 8px; min-width: 0; }
  .stat-row strong { font-size: 22px; }
}
.stat-row { grid-template-columns: repeat(4, minmax(0, 1fr)); }
@media (max-width: 720px) { .stat-row { grid-template-columns: repeat(2, minmax(0, 1fr)); } }

/* ---- Mobile dropdown links: always theme ink, never the over-hero white
   (white-on-white bug when the menu opens over the hero in light theme) ---- */
@media (max-width: 720px), (max-height: 520px) {
  .nav-links a,
  .site-header.over-hero .nav-links a,
  body.theme-light .nav-links a,
  body.theme-light .site-header.over-hero .nav-links a {
    color: var(--ink-soft);
  }
}

/* ============================================================
   5.5 PHOTO-OVERLAY CONTRAST GUARANTEE (both themes)
   Anything sitting on a photo hero is always light: transparent
   buttons with white text + hairline border, white explore links.
   The light-theme solid-dark button overrides previously won the
   cascade on legacy .hero pages (cost + city pages), producing
   black-on-dark-photo CTAs. Appended last; covers every hero type.
   ============================================================ */
.brand-hero .actions .btn,
.subpage-hero .actions .btn,
.hero .hero-actions .btn,
.hero-actions .btn,
body.theme-light .brand-hero .actions .btn,
body.theme-light .subpage-hero .actions .btn,
body.theme-light .hero .hero-actions .btn,
body.theme-light .hero-actions .btn {
  background: transparent;
  color: #ffffff;
  border: 1px solid rgba(255,255,255,0.65);
  text-shadow: 0 1px 4px rgba(0,0,0,0.5);
}
.brand-hero .actions .btn:hover,
.subpage-hero .actions .btn:hover,
.hero .hero-actions .btn:hover,
.hero-actions .btn:hover,
body.theme-light .brand-hero .actions .btn:hover,
body.theme-light .subpage-hero .actions .btn:hover,
body.theme-light .hero .hero-actions .btn:hover,
body.theme-light .hero-actions .btn:hover {
  background: rgba(255,255,255,0.14);
  border-color: #ffffff;
  color: #ffffff;
}
.brand-hero .actions .explore,
.subpage-hero .actions .explore,
.hero-actions .explore,
body.theme-light .brand-hero .actions .explore,
body.theme-light .subpage-hero .actions .explore,
body.theme-light .hero-actions .explore {
  color: #ffffff;
  border-color: rgba(255,255,255,0.4);
}
/* Hero text (eyebrow/lede/breadcrumb) stays light in light theme too */
body.theme-light .hero-inner,
body.theme-light .hero-inner p,
body.theme-light .hero-inner .lead { color: rgba(255,255,255,0.9); }
body.theme-light .hero-inner h1 { color: #ffffff; }

/* CTA buttons placed mid-page on hero-actions rows that sit on SOLID
   surfaces would also match .hero-actions - scope check: only cost.html
   uses .hero-actions outside a hero, inside .band.dark (dark surface),
   where white-on-dark is correct. */

/* .hero-actions rows that sit on SOLID light-capable surfaces
   (.city-intro on city pages, .advisor-shell on roofing) must be
   theme-aware, not always-white */
body.theme-light .city-intro .hero-actions .btn,
body.theme-light .advisor-shell .hero-actions .btn {
  background: var(--ink);
  color: var(--paper);
  border: 1px solid var(--ink);
  text-shadow: none;
}
body.theme-light .city-intro .hero-actions .btn:hover,
body.theme-light .advisor-shell .hero-actions .btn:hover {
  background: #000000; border-color: #000000; color: var(--paper);
}
body.theme-light .city-intro .hero-actions .btn.ghost,
body.theme-light .advisor-shell .hero-actions .btn.ghost {
  background: transparent;
}
body.theme-light .city-intro .hero-actions .explore,
body.theme-light .advisor-shell .hero-actions .explore {
  color: var(--ink); border-color: var(--line);
}

/* ============================================================
   5.6 GHOST BUTTONS: transparent in BOTH themes, readable on
   every surface. The light-theme solid-fill rule (body.theme-light
   .btn) was bleeding into ghosts, which never reset background -
   producing filled, unreadable ghosts on dark bands and the hero.
   ============================================================ */
body.theme-light .btn.ghost,
body.theme-light .btn.ink-ghost {
  background: transparent;
  color: var(--ink);
  border-color: var(--ink);
}
body.theme-light .btn.ghost:hover,
body.theme-light .btn.ink-ghost:hover {
  background: var(--ink);
  color: var(--paper);
  border-color: var(--ink);
}
/* Light theme: ghosts + explore links on ALWAYS-DARK surfaces are white */
body.theme-light .band.dark .btn.ghost,
body.theme-light .cta-section .btn.ghost,
body.theme-light .ethos-band .btn.ghost,
body.theme-light .calculator .btn.ghost,
body.theme-light .site-footer .btn.ghost {
  background: transparent;
  color: #ffffff;
  border-color: rgba(255,255,255,0.55);
}
body.theme-light .band.dark .btn.ghost:hover,
body.theme-light .cta-section .btn.ghost:hover,
body.theme-light .ethos-band .btn.ghost:hover,
body.theme-light .calculator .btn.ghost:hover,
body.theme-light .site-footer .btn.ghost:hover {
  background: #ffffff;
  color: #111111;
  border-color: #ffffff;
}
body.theme-light .band.dark .explore,
body.theme-light .cta-section .explore,
body.theme-light .ethos-band .explore,
body.theme-light .calculator .explore {
  color: #ffffff;
  border-color: rgba(255,255,255,0.4);
}
/* Photo heroes: ghosts always white in both themes (highest specificity) */
body.theme-light .brand-hero .actions .btn.ghost,
body.theme-light .subpage-hero .actions .btn.ghost,
body.theme-light .hero .hero-actions .btn.ghost,
body.theme-light .hero-actions .btn.ghost {
  background: transparent;
  color: #ffffff;
  border-color: rgba(255,255,255,0.55);
  text-shadow: 0 1px 4px rgba(0,0,0,0.5);
}
/* ...except hero-actions rows on solid light surfaces (city pages, advisor) */
body.theme-light .city-intro .hero-actions .btn.ghost,
body.theme-light .advisor-shell .hero-actions .btn.ghost {
  color: var(--ink);
  border-color: var(--ink);
  text-shadow: none;
}

/* ============================================================
   5.7 LUXURY MICRO LAYER
   Hover prefetch lives in site.js. This block: cross-document
   view transitions, copper selection, scroll-progress hairline,
   tabular numerals on all ledger figures. All paint-level -
   no markup, content, or schema surface is affected.
   ============================================================ */

/* Soft cross-page transition (progressive enhancement) */
@view-transition { navigation: auto; }
::view-transition-old(root),
::view-transition-new(root) { animation-duration: .28s; }
@media (prefers-reduced-motion: reduce) {
  ::view-transition-old(root),
  ::view-transition-new(root) { animation: none; }
}

/* Copper selection - both themes */
::selection { background: var(--copper); color: #fff; }
::-moz-selection { background: var(--copper); color: #fff; }

/* Scroll-progress hairline (injected by site.js, aria-hidden) */
.scroll-progress {
  position: fixed;
  top: 0; left: 0;
  width: 100%; height: 2px;
  background: var(--copper);
  transform: scaleX(0);
  transform-origin: left center;
  z-index: 300;
  pointer-events: none;
}

/* Ledger typography: aligned digits wherever numbers carry meaning */
.c-median, .c-n,
.stat-row strong,
.index-panel h3,
.answer-card .figure,
.calc-output .range-out,
.review-summary .big,
.brand-hero .signals strong,
.city-stats strong,
.mat-meta, .mat-row .mat-name + * {
  font-variant-numeric: tabular-nums lining-nums;
}

/* Hanging punctuation on pull quotes (Safari; harmless elsewhere) */
.pull-quote { hanging-punctuation: first; }

/* ============================================================
   6.0 FIELD STRIP - scroll-linked, draggable photo ledger
   (25residences-inspired). All images are real <img> elements
   with alt text in static HTML - the motion is presentation
   only. Coarse pointers and reduced-motion get a native
   horizontally scrollable row instead.
   ============================================================ */
.field-strip { padding: 132px 0 150px; overflow: clip; border-top: 1px solid var(--line-soft); }
.field-strip--bare { padding-top: 24px; border-top: 0; }

/* Asymmetric editorial head - mixed scale, offset placement */
.field-strip-head {
  display: grid;
  grid-template-columns: minmax(0, 1.4fr) minmax(240px, .6fr);
  align-items: end;
  gap: 48px;
  margin-bottom: 84px;
}
.field-strip-head h2 { font-size: clamp(40px, 5.6vw, 84px); line-height: .98; }
.field-strip-head .fs-note {
  font-size: 14px;
  color: var(--muted);
  max-width: 280px;
  justify-self: end;
  padding-bottom: 10px;
  border-bottom: 1px solid var(--line);
}
@media (max-width: 760px) {
  .field-strip-head { grid-template-columns: 1fr; gap: 24px; }
  .field-strip-head .fs-note { justify-self: start; }
}

.fs-stage { cursor: grab; max-width: 100%; overflow: hidden; position: relative; }
.field-strip .fs-stage, .field-strip .fs-stage * {
  user-select: none;
  -webkit-user-select: none;
}
.fs-stage.fs-dragging { cursor: grabbing; }
.fs-track {
  display: flex;
  gap: clamp(14px, 1.8vw, 28px);
  width: max-content;
  padding: 0 36px;
  will-change: transform;
}
.fs-item { margin: 0; flex: 0 0 auto; width: clamp(240px, 26vw, 420px); }
.fs-item img {
  width: 100%; height: auto;
  user-select: none;
  -webkit-user-drag: none;
  pointer-events: none;
}
.fs-item figcaption {
  margin-top: 14px;
  font-family: var(--font-sans);
  text-transform: uppercase;
  color: var(--muted);
  line-height: 1.7;
}
.fs-item figcaption strong {
  display: block;
  color: var(--ink);
  font-weight: 700;
}
/* staggered vertical offsets - the 25residences rhythm */
/* stagger period (3) divides the 9-item set evenly, so the
   pattern is identical across the cloned set - no vertical jump
   at the loop seam. */
.fs-item:nth-child(3n+1) { transform: translateY(0); }
.fs-item:nth-child(3n+2) { transform: translateY(52px); }
.fs-item:nth-child(3n+3) { transform: translateY(-30px); }
.fs-track { padding-top: 40px; padding-bottom: 64px; }

.fs-proof-cta {
  display: flex;
  margin: 14px 36px 0;
}

/* Native fallback: touch devices + reduced motion get a normal scroller */
.fs-native .fs-stage { overflow-x: auto; -webkit-overflow-scrolling: touch; scrollbar-width: thin; cursor: auto; }
.fs-native .fs-track { will-change: auto; }

/* ============================================================
   6.7 VIDEO TRANSCRIPTS - collapsed by default; one hairline
   row of UI. Full text lives in the HTML (and the VideoObject
   transcript property) so crawlers and LLMs read it either way.
   ============================================================ */
.video-transcript {
  max-width: 760px;
  margin: 18px auto 0;
  border-top: 1px solid var(--line);
  border-bottom: 1px solid var(--line);
}
.video-transcript summary {
  list-style: none;
  cursor: pointer;
  padding: 13px 0;
  font-family: var(--font-sans);
  font-size: 11px;
  letter-spacing: .18em;
  text-transform: uppercase;
  font-weight: 700;
  color: var(--muted);
  display: flex;
  justify-content: space-between;
  align-items: center;
}
.video-transcript summary::-webkit-details-marker { display: none; }
.video-transcript summary::after { content: "+"; color: var(--accent); font-size: 16px; font-weight: 400; }
.video-transcript[open] summary::after { content: "−"; }
.vt-body { padding: 6px 0 26px; }
.vt-body p { font-size: 15px; line-height: 1.75; color: var(--muted); max-width: 680px; }
.vt-body p + p { margin-top: 14px; }
.transcript-link { max-width: 760px; margin: 14px auto 0; font-size: 13px; color: var(--muted); }
.transcript-link a { color: var(--accent); border-bottom: 1px solid currentColor; }

/* ============================================================
   6.9 SERVICE FIGURES - offset plate treatment (from the proof
   page case studies), applied to the homepage trade images with
   per-section variation so each plate reads slightly different.
   ============================================================ */
.se-figure {
  position: relative;
  overflow: visible;
  isolation: isolate;
}
.se-figure::before {
  content: "";
  position: absolute;
  inset: 16px -16px -16px 16px;          /* peek bottom-right, subtle */
  background: #1c1c1c;
  border: 1px solid var(--line);
  z-index: 0;
}
.se-figure img { position: relative; z-index: 1; }
/* Caption moves onto the photo (bottom-left) so it never sits on the
   plate edge. On a photo it is always light, in both themes. */
.service-editorial .se-figure figcaption {
  position: absolute;
  left: 18px;
  bottom: 14px;
  z-index: 2;
  margin: 0;
  color: rgba(255, 255, 255, 0.88);
  text-shadow: 0 1px 10px rgba(0, 0, 0, 0.75), 0 0 2px rgba(0, 0, 0, 0.6);
  pointer-events: none;
}
body.theme-light .service-editorial .se-figure figcaption { color: rgba(255, 255, 255, 0.88); }

/* Variation 2 - reverse layouts mirror the plate with a copper edge */
.media-split.reverse .se-figure::before {
  inset: 16px 16px -16px -16px;          /* peek bottom-left, subtle */
  background: #181818;
  border-color: rgba(196, 123, 79, 0.30);
}
/* Variation 3 - every third service section: deeper offset, patina edge */
.service-editorial:nth-of-type(3n) .se-figure::before {
  inset: 20px -20px -20px 20px;
  background: #161616;
  border-color: var(--line);
}
.service-editorial:nth-of-type(3n) .media-split.reverse .se-figure::before {
  inset: 20px 20px -20px -20px;
}

/* Light theme equivalents (mirrors the case-study plate behavior) */
body.theme-light .se-figure::before {
  background: #e6e6e6;
}
body.theme-light .media-split.reverse .se-figure::before { background: #ededed; border-color: rgba(196,123,79,0.38); }
body.theme-light .service-editorial:nth-of-type(3n) .se-figure::before { background: #e9e9e9; border-color: rgba(17,17,17,0.14); }

/* Mobile / portrait tablet: keep the offset plate for depth, but use a smaller
   peek that stays inside the page gutter so it never causes horizontal scroll. */
@media (max-width: 880px) {
  .se-figure::before { inset: 12px -12px -12px 12px; }
  .media-split.reverse .se-figure::before { inset: 12px 12px -12px -12px; }
  .service-editorial:nth-of-type(3n) .se-figure::before { inset: 12px -12px -12px 12px; }
  .service-editorial:nth-of-type(3n) .media-split.reverse .se-figure::before { inset: 12px 12px -12px -12px; }
}

/* ============================================================
   7.2 BRAND CONTENT (about page) - story flow, values list,
   manifesto prose. Ported from lockeladder.com brand pages.
   ============================================================ */
.story-flow { max-width: 760px; }
.story-flow h3 {
  margin: 56px 0 20px;
  font-size: clamp(22px, 2.2vw, 30px);
}
.story-flow h3:first-child { margin-top: 0; }
.story-flow .body-flow + .body-flow { margin-top: 18px; }

.values-list {
  list-style: none;
  margin: 0 auto;
  padding: 0;
  max-width: 860px;
  counter-reset: none;
}
.values-list li {
  display: flex;
  align-items: baseline;
  gap: 32px;
  padding: 26px 0;
  border-bottom: 1px solid var(--line);
  font-family: var(--font-display);
  font-size-adjust: 0.41;
  font-weight: 500;
  font-size: clamp(24px, 3vw, 40px);
  color: var(--ink);
  line-height: 1.1;
}
.values-list li:first-child { border-top: 1px solid var(--line); }
.values-list li span {
  font-style: normal;
  font-weight: 400;
  color: var(--accent);
  font-size: clamp(16px, 1.6vw, 22px);
  min-width: 44px;
}

.manifesto-prose { max-width: 760px; }
.manifesto-prose p { font-size: 17px; line-height: 1.75; color: var(--muted); }
.manifesto-prose p + p { margin-top: 18px; }
.manifesto-prose h3 {
  margin: 56px 0 20px;
}
.manifesto-prose .manifesto-mark {
  font-family: var(--font-display);
  font-size-adjust: 0.41;
  font-weight: 500;
  color: var(--ink);
}
.manifesto-prose .pull-quote { margin: 44px 0; }
.manifesto-sign {
  margin-top: 48px !important;
  font-style: normal;
}
.manifesto-sign strong {
  display: block;
  margin-top: 6px;
  font-style: normal;
  font-family: var(--font-display);
  font-size-adjust: 0.41;
  font-weight: 500;
  font-size: 22px;
}

/* 7.2b - verbatim brand-document typography */
.brand-doc-title { margin-bottom: 36px; }
.manifesto-kicker {
  font-family: var(--font-display);
  font-size-adjust: 0.41;
  font-size: clamp(18px, 1.8vw, 24px);
  color: var(--ink);
  margin: -16px 0 44px;
}
.manifesto-credo {
  margin-top: 28px !important;
  font-family: var(--font-sans);
  font-size: 13px !important;
  letter-spacing: .14em;
  text-transform: uppercase;
  color: var(--muted);
}

/* 7.3b - L&L Story stingers: the big lettering from the live page */
.story-stinger {
  margin: 72px 0 24px;
  font-family: var(--font-serif);
  font-size-adjust: 0.41;
  font-weight: 700;
  font-size: clamp(34px, 4.6vw, 68px);
  line-height: 1;
  letter-spacing: -.015em;
  color: var(--ink);
  max-width: 720px;
}
.story-flow .story-stinger:first-child { margin-top: 0; }

/* ============================================================
   5.7 PROJECT-PROOF SHOWCASE CAROUSEL (RR off-grid pattern)
   First section under the project-proof hero. Slides are the six
   case studies; captions crossfade in a panel that masks the next
   slide, leaving a peek strip; dots carry a countdown ring that
   drives the autoplay. Theme-aware (panel = --paper, ink dots).
   Without JS: first image shows, all captions render statically.
   ============================================================ */
.pp-show { position: relative; background: var(--paper); padding: 0 0 96px; border-bottom: 1px solid var(--line-soft); }
.proof-page #main-content { display: flex; flex-direction: column; }
.proof-page .proof-carousel-hero {
  --pp-hero-offset: 112px;
  order: -1;
  padding-top: var(--pp-hero-offset);
  background: transparent !important;
  border-bottom: 0;
}
.proof-page .proof-carousel-hero .pp-frame { width: 53.8vw; }
.proof-page .proof-carousel-hero .pp-panel { display: none; background: transparent; }
.pp-frame { position: relative; overflow: hidden; }
.pp-track {
  display: flex;
  will-change: transform;
  transition: transform 1s cubic-bezier(.165,.84,.44,1);
  touch-action: pan-y;
  user-select: none;
}
.pp-track.no-anim { transition: none; }
.pp-slide { flex: 0 0 53.8vw; cursor: grab; }
.pp-slide > .proof-cap { display: none; }
.pp-slide--clone { pointer-events: none; }
.pp-slide .pp-img {
  width: 100%;
  height: min(39.5vw, 72vh);
  overflow: hidden;
  background: var(--soft);
}
.pp-slide img {
  width: 100%; height: 100%;
  object-fit: cover; display: block;
  -webkit-user-drag: none;
  pointer-events: none;
  filter: grayscale(100%);
}
.pp-slide > img {
  height: min(39.5vw, 72vh);
  object-fit: cover;
}
.pp-peek {
  --pp-peek-slide-width: 53.8vw;
  position: absolute;
  z-index: 1;
  top: var(--pp-hero-offset, 0px);
  right: 0;
  width: 8vw;
  height: min(39.5vw, 72vh);
  overflow: hidden;
  pointer-events: none;
}
.pp-peek img {
  position: absolute;
  inset: 0;
  width: var(--pp-peek-slide-width);
  max-width: none;
  height: 100%;
  display: block;
  object-fit: cover;
  filter: grayscale(100%);
  transform: translate3d(0, 0, 0);
  transition: transform 1s cubic-bezier(.165,.84,.44,1);
}
.pp-peek .pp-peek-next { transform: translate3d(100%, 0, 0); }
.pp-peek.is-transitioning .pp-peek-current { transform: translate3d(-100%, 0, 0); }
.pp-peek.is-transitioning .pp-peek-next { transform: translate3d(0, 0, 0); }
.pp-panel {
  position: absolute;
  top: 0; bottom: 0;
  left: 53.8vw; right: 8vw;
  background: var(--paper);
  z-index: 2;
  pointer-events: none;
  display: none;                       /* armed by JS */
}
.pp-ready .pp-panel { display: block; }
.proof-page .proof-carousel-hero.pp-ready .pp-panel { display: none; }

.pp-captions { padding: 48px 36px 0; max-width: 720px; }
.pp-ready .pp-captions {
  position: absolute;
  z-index: 3;
  top: calc(var(--pp-hero-offset, 0px) + clamp(48px, 7vw, 100px));
  left: calc(53.8vw + clamp(32px, 4.4vw, 64px));
  right: calc(8vw + clamp(24px, 3vw, 48px));
  padding: 0; max-width: none;
}
.pp-cap { padding: 0 0 40px; }
.pp-ready .pp-cap {
  position: absolute; inset: 0 auto auto 0; width: 100%;
  padding: 0;
  opacity: 0;
  transition: opacity .5s ease;
  pointer-events: none;
}
.pp-ready .pp-cap.is-active { opacity: 1; pointer-events: auto; }
.pp-cap .pp-kicker {
  display: block;
  font-family: var(--font-sans);
  font-size: 11px; font-weight: 500;
  letter-spacing: .22em; text-transform: uppercase;
  color: var(--copper);
  margin-bottom: 16px;
}
.pp-cap h3 {
  font-family: var(--font-display);
  font-weight: 500;
  font-size: clamp(17px, 1.5vw, 22px);
  letter-spacing: -0.012em;
  line-height: 1.3;
  color: var(--ink);
  margin: 0;
}
.pp-cap p {
  font-size: 14px; line-height: 1.8;
  color: var(--muted);
  margin: 18px 0 0;
  max-width: 430px;
}
.pp-cta {
  display: inline-flex;
  align-items: center;
  gap: 16px;
  margin-top: 30px;
  color: var(--ink);
  font-family: var(--font-sans);
  font-size: 11px; font-weight: 500;
  letter-spacing: .25em; text-transform: uppercase;
}
.pp-cta .pp-ring {
  width: 34px; height: 34px; flex: 0 0 34px;
  position: relative;
  display: inline-flex; align-items: center; justify-content: center;
  color: var(--ink);
}
.pp-cta .pp-ring svg.circ { position: absolute; inset: 0; transform: rotate(-90deg); }
.pp-cta .pp-ring svg.circ circle {
  fill: none; stroke: currentColor; stroke-width: 1;
  stroke-dasharray: 101; stroke-dashoffset: 0;
  transition: stroke-dashoffset .6s cubic-bezier(.165,.84,.44,1);
}
.pp-cta:hover .pp-ring svg.circ circle { stroke-dashoffset: 101; }
.pp-cta .pp-ring svg.arr { width: 14px; height: 14px; }

/* dots: centered under the image column; ring = countdown timer */
.pp-dots {
  width: 53.8vw;
  display: none;
  justify-content: center;
  gap: 15px;
  margin-top: 30px;
  color: var(--ink);
}
.pp-ready .pp-dots { display: flex; }
.pp-dot {
  appearance: none; border: 0; background: transparent;
  width: 16px; height: 16px; padding: 0;
  cursor: pointer;
  position: relative;
  color: inherit;
  display: inline-flex; align-items: center; justify-content: center;
}
.pp-dot i {
  width: 6.4px; height: 6.4px;
  border-radius: 50%;
  background: currentColor;
  opacity: .4;
  transition: opacity .3s;
}
.pp-dot:hover i { opacity: .75; }
.pp-dot.is-active i { opacity: 1; }
.pp-dot svg { position: absolute; inset: 0; transform: rotate(-90deg); }
.pp-dot svg circle {
  fill: none; stroke: currentColor; stroke-width: 1;
  stroke-dasharray: 44; stroke-dashoffset: 44;
}
.pp-dot.is-active svg circle { animation: pp-ringdraw 4000ms linear forwards; }
@keyframes pp-ringdraw { to { stroke-dashoffset: 0; } }

/* narrow screens: image full-bleed, dots, caption below */
@media (max-width: 900px) {
  .proof-page .proof-carousel-hero { --pp-hero-offset: 88px; }
  .proof-page .proof-carousel-hero .pp-frame { width: 91vw; }
  .pp-slide { flex-basis: 91vw; }
  .pp-slide .pp-img { height: 62vw; }
  .pp-slide > img { height: 62vw; }
  .pp-peek { --pp-peek-slide-width: 91vw; width: 9vw; height: 62vw; }
  .pp-ready .pp-panel { display: none; }
  .pp-ready .pp-captions {
    position: relative;
    inset: auto;
    left: 0; right: 0;
    min-height: 250px;
    margin: 6px 7vw 0;
  }
  .pp-dots { width: 91vw; margin-top: 26px; }
}

@media (prefers-reduced-motion: reduce) {
  .pp-track, .pp-ready .pp-cap { transition: none; }
  .pp-dot.is-active svg circle { animation: none; stroke-dashoffset: 0; }
}

/* Material Fit Advisor - honest alternative line */
.rec-alt {
  margin-top: 18px;
  padding-top: 16px;
  border-top: 1px solid var(--line);
  font-size: 14px;
  color: var(--muted);
  font-style: normal;
  font-family: var(--font-display); font-size-adjust: 0.41;
}

/* Local-office contact line on city/area page heroes */
.office-line {
  margin-top: 18px;
  display: flex;
  align-items: baseline;
  gap: 12px;
  flex-wrap: wrap;
  font-family: var(--font-sans); font-size-adjust: 0.52;
  font-size: 13px;
}
.office-line span {
  letter-spacing: 0.22em;
  text-transform: uppercase;
  font-weight: 600;
  color: var(--muted);
}
.office-line a {
  font-family: var(--font-display); font-size-adjust: 0.41;
  font-size: 20px;
  font-weight: 500;
  letter-spacing: -0.01em;
  color: var(--copper);
}
.office-line a:hover { color: var(--gold-soft); }

/* Material guide: collapsible panels hold full-width comparison tables */
#material-guide .faq-item .answer { max-width: none; padding-bottom: 28px; }
#material-guide .faq-item .answer .table-wrap { margin-top: 4px; }

/* ============================================================
   BLOG / JOURNAL
   ============================================================ */
.blog-grid {
  display: grid;
  grid-template-columns: repeat(3, minmax(0,1fr));
  gap: 48px 32px;
}
@media (max-width: 980px) { .blog-grid { grid-template-columns: repeat(2, 1fr); } }
@media (max-width: 640px) { .blog-grid { grid-template-columns: 1fr; } }
.blog-card { display: flex; flex-direction: column; gap: 16px; }
.blog-card .blog-thumb {
  aspect-ratio: 3 / 2;
  width: 100%;
  object-fit: cover;
  filter: grayscale(0.35) contrast(1.02);
  transition: filter .4s ease;
}
.blog-card:hover .blog-thumb { filter: grayscale(0); }
.blog-card .blog-date {
  font-family: var(--font-sans); font-size-adjust: 0.52;
  font-size: 11px; letter-spacing: 0.22em; text-transform: uppercase;
  font-weight: 600; color: var(--copper);
}
.blog-card h3 {
  font-family: var(--font-display); font-size-adjust: 0.41;
  font-weight: 500; font-size: clamp(20px, 2.2vw, 26px);
  letter-spacing: -0.01em; line-height: 1.2; color: var(--ink);
}
.blog-card p { font-size: 16px; line-height: 1.6; color: var(--muted); }
.blog-card .arrow { margin-top: 4px; }

/* Article reading column */
.article-body { max-width: 760px; }
.article-body > p {
  font-size: 18px; line-height: 1.78; color: var(--ink-soft); margin: 0 0 20px;
}
.article-body > p:first-of-type { font-size: 21px; line-height: 1.7; color: var(--ink); }
.article-body h2 {
  font-family: var(--font-display); font-size-adjust: 0.41;
  font-weight: 500; font-size: clamp(26px, 3vw, 36px); letter-spacing: -0.015em;
  line-height: 1.15; color: var(--ink); margin: 52px 0 16px;
}
.article-body h3 {
  font-family: var(--font-display); font-size-adjust: 0.41;
  font-weight: 500; font-size: clamp(20px, 2.2vw, 25px); letter-spacing: -0.01em;
  line-height: 1.25; color: var(--ink); margin: 36px 0 12px;
}
.article-body ul, .article-body ol { margin: 8px 0 20px; padding-left: 0; list-style: none; }
.article-body ul li, .article-body ol li {
  position: relative; padding-left: 28px; margin-bottom: 12px;
  font-size: 17px; line-height: 1.65; color: var(--ink-soft);
}
.article-body ul li::before {
  content: "–"; position: absolute; left: 0; top: 0; color: var(--copper); font-weight: 600;
}
.article-body ol { counter-reset: a; }
.article-body ol li { counter-increment: a; }
.article-body ol li::before {
  content: counter(a); position: absolute; left: 0; top: 0;
  font-family: var(--font-display); font-size-adjust: 0.41; color: var(--copper); font-weight: 500;
}
.article-body li strong, .article-body p strong { color: var(--ink); }
.article-body .note { margin: 28px 0; }
.article-meta {
  display: flex; gap: 16px; align-items: center; flex-wrap: wrap;
  font-family: var(--font-sans); font-size-adjust: 0.52;
  font-size: 12px; letter-spacing: 0.16em; text-transform: uppercase; color: rgba(255,255,255,0.72);
  margin-top: 18px;
}
.article-source { font-size: 13px; color: var(--muted); font-style: normal; }

/* Nav polish: continuous hover target + copper current-page state. */
.nav-links {
  align-items: stretch;
  cursor: pointer;
}

.nav-links a {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  line-height: 1;
  white-space: nowrap;
  cursor: pointer;
}

.nav-links a * {
  cursor: inherit;
}

@media (min-width: 721px) and (min-height: 521px) {
  .nav-links {
    gap: 0;
    margin-inline: -15px;
  }

  .nav-links a {
    padding: 8px 15px;
    min-height: 34px;
  }
}

.nav-links a:hover,
.nav-links a[aria-current="page"],
.nav-cta[aria-current="page"] {
  color: var(--accent);
}

.site-header.over-hero .nav-links a:hover,
.site-header.over-hero .nav-links a[aria-current="page"],
.site-header.over-hero .nav-cta[aria-current="page"] {
  color: var(--gold-soft);
}

body.theme-light .nav-links a:hover,
body.theme-light .nav-links a[aria-current="page"],
body.theme-light .nav-cta[aria-current="page"] {
  color: var(--accent);
}

@media (max-width: 720px), (max-height: 520px) {
  .nav-links a[aria-current="page"],
  .site-header.over-hero .nav-links a[aria-current="page"],
  body.theme-light .nav-links a[aria-current="page"],
  body.theme-light .site-header.over-hero .nav-links a[aria-current="page"] {
    color: var(--accent);
  }
}

/* Project detail pages */
.project-hero .bg {
  filter: contrast(1.06) saturate(.96);
  transform-origin: center center;
}

.project-hero .shade {
  background:
    linear-gradient(180deg, rgba(13,13,13,.74) 0%, rgba(13,13,13,.42) 44%, rgba(13,13,13,.9) 100%),
    linear-gradient(90deg, rgba(13,13,13,.76) 0%, rgba(13,13,13,.22) 58%, rgba(13,13,13,.46) 100%);
}

.project-hero .hero-inner {
  max-width: 980px;
}

.project-hero h1,
.project-hero .lede {
  text-shadow: 0 2px 22px rgba(0,0,0,.55);
}

.project-fact-band {
  padding-top: 48px;
  padding-bottom: 48px;
}

.project-facts {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  border-top: 1px solid var(--line);
  border-left: 1px solid var(--line);
}

.project-facts div {
  min-height: 132px;
  padding: 24px;
  background: rgba(255,255,255,0.025);
}

.project-facts span {
  display: block;
  margin-bottom: 14px;
  font-family: var(--font-sans);
  font-size: 11px;
  letter-spacing: 0.2em;
  text-transform: uppercase;
  color: var(--accent);
}

.project-facts strong {
  display: block;
  max-width: 26ch;
  font-family: var(--font-display);
  font-size-adjust: 0.41;
  font-weight: 500;
  font-size: clamp(18px, 1.8vw, 24px);
  line-height: 1.2;
  color: var(--ink);
}

.project-story-grid {
  display: grid;
  max-width: 1120px;
  margin-left: auto;
  margin-right: auto;
  grid-template-columns: minmax(240px, 360px) minmax(0, 720px);
  gap: clamp(36px, 6vw, 72px);
  align-items: start;
}

.project-side {
  position: sticky;
  top: 120px;
  justify-self: end;
  max-width: 360px;
}

.project-side h2 {
  font-family: var(--font-display);
  font-size-adjust: 0.41;
  font-weight: 500;
  font-size: clamp(30px, 4vw, 54px);
  line-height: 1.05;
  letter-spacing: -0.02em;
  margin: 0 0 22px;
  color: var(--ink);
}

.project-side p:not(.eyebrow) {
  color: var(--muted);
  font-size: 17px;
  line-height: 1.7;
}

.project-article {
  max-width: 820px;
}

.project-gallery-band {
  background: var(--dark);
  padding-top: clamp(124px, 9vw, 168px);
}

.project-gallery-band .section-heading {
  max-width: 1240px;
  margin-left: auto;
  margin-right: auto;
  margin-bottom: clamp(42px, 5vw, 68px);
}

.project-gallery-grid {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: clamp(24px, 2.5vw, 32px);
  max-width: 1240px;
  margin: 0 auto;
}

.project-gallery-grid figure {
  margin: 0;
  background: var(--soft);
}

.project-gallery-grid img {
  width: 100%;
  aspect-ratio: 4 / 3;
  object-fit: cover;
  filter: grayscale(0.24) contrast(1.04);
}

.project-gallery-grid figcaption {
  display: flex;
  justify-content: space-between;
  gap: 18px;
  padding: 16px 18px 18px;
  color: var(--muted);
  font-size: 13px;
  line-height: 1.45;
}

.project-gallery-grid figcaption strong {
  color: var(--ink);
}

@media (max-width: 900px) {
  .project-facts,
  .project-story-grid,
  .project-gallery-grid {
    grid-template-columns: 1fr;
  }

  .project-gallery-band {
    padding-top: 96px;
  }

  .project-gallery-grid {
    gap: 28px;
  }

  .project-side {
    position: static;
  }

  .project-gallery-grid figcaption {
    display: block;
  }

  .project-gallery-grid figcaption span {
    display: block;
    margin-top: 4px;
  }
}

/* Partner logos shown in place of the brand name (brand stays in img alt + JSON-LD) */
.partner-card .partner-name { display:flex; align-items:center; justify-content:center; min-height:48px; }
.partner-card .partner-logo {
  height: 42px;
  width: auto;
  max-width: 175px;
  object-fit: contain;
  display: block;
  border-radius: 6px;
  image-rendering: auto;
  transform: translateZ(0);
}
@media (max-width:600px) { .partner-card .partner-logo { height:34px; } }
.partner-grid--window-logos .partner-name,
.partner-grid--siding-logos .partner-name {
  min-height: 76px;
}
.partner-grid--window-logos {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
}
.partner-grid--window-logos .partner-card {
  flex: 0 0 calc((100% - 108px) / 4);
  min-width: 0;
}
.partner-grid--window-logos .partner-logo,
.partner-grid--siding-logos .partner-logo {
  height: 64px;
  max-width: 270px;
}
.partner-grid--window-logos .partner-logo--therma-tru {
  height: 62px;
  max-width: 260px;
}
.partner-grid--window-logos .partner-logo--softlite {
  height: 74px;
  max-width: 310px;
}
.partner-grid--window-logos .partner-logo--simonton {
  height: 46px;
  max-width: 220px;
}
.partner-grid--window-logos .partner-logo--waudena {
  height: 76px;
  max-width: 200px;
}
/* Roofing partner logos: Brava sized close to the Malarkey badges (78px). */
.partner-card .partner-logo--brava { height: 76px; max-width: 200px; }
.partner-card .partner-logo--malarkey { height: 54px; max-width: 230px; }
.partner-card .partner-logo--wilco { height: 82px; max-width: 190px; }
@media (max-width:600px) {
  .partner-grid--window-logos .partner-card {
    flex-basis: calc((100% - 36px) / 2);
  }
  .partner-grid--window-logos .partner-name,
  .partner-grid--siding-logos .partner-name {
    min-height: 62px;
  }
  .partner-grid--window-logos .partner-logo,
  .partner-grid--siding-logos .partner-logo {
    height: 52px;
    max-width: 220px;
  }
  .partner-grid--window-logos .partner-logo--therma-tru {
    height: 52px;
    max-width: 220px;
  }
  .partner-grid--window-logos .partner-logo--softlite {
    height: 60px;
    max-width: 255px;
  }
  .partner-grid--window-logos .partner-logo--simonton {
    height: 38px;
    max-width: 185px;
  }
  .partner-grid--window-logos .partner-logo--waudena {
    height: 62px;
    max-width: 165px;
  }
  .partner-card .partner-logo--brava { height: 62px; }
  .partner-card .partner-logo--malarkey { height: 46px; }
  .partner-card .partner-logo--wilco { height: 68px; }
}
@media (max-width:480px) {
  .partner-grid--window-logos .partner-card { flex-basis: 100%; }
}

/* Reverse (white) partner logos like Wilco sit on a dark tile so they read in both light and dark mode */
.partner-card .partner-logo--reverse { background:#26231f; padding:8px 12px; border-radius:8px; box-sizing:content-box; }
/* Partner logo trims are baked into the display assets so edges stay even in dark mode. */
body.theme-dark .partner-card .partner-logo:not(.partner-logo--reverse) {
  filter: none;
}

/* center the lone 5th partner card under the first row (Windows & Doors) */
.partner-grid--5 .partner-card:last-child { grid-column: 1 / -1; justify-self: center; max-width: 320px; border: 0; }

/* ===== Brava Excellence Award credential band ===== */
.award-band {
  background: var(--paper);
  padding: 104px 36px;
}
.award-band--cream { background: var(--cream, var(--paper)); }
.award-inner {
  max-width: 1100px;
  margin: 0 auto;
  display: grid;
  grid-template-columns: minmax(0, 1.02fr) minmax(0, 1fr);
  gap: clamp(36px, 5vw, 76px);
  align-items: center;
}
/* Feature treatment (Brava page): make the award the hero of the band */
.award-band--feature { padding: 120px 36px; }
.award-band--feature .award-inner {
  max-width: 1240px;
  grid-template-columns: minmax(0, 1.62fr) minmax(0, 1fr);
}
.award-figure {
  position: relative;
  margin: 0;
  isolation: isolate;
}
.award-figure::before {
  content: "";
  position: absolute;
  inset: 16px -16px -16px 16px;          /* depth plate, matches .se-figure */
  background: #1c1c1c;
  border: 1px solid var(--line);
  z-index: 0;
}
body.theme-light .award-figure::before { background: #d9d1c0; border-color: rgba(97,64,37,.22); }
.award-figure img {
  position: relative;
  z-index: 1;
  display: block;
  width: 100%;
  height: auto;
}
.award-copy .eyebrow { margin: 0; }
.award-copy h2 {
  font-family: var(--font-display);
  font-weight: 400;
  font-size: clamp(30px, 3.4vw, 48px);
  line-height: 1.14;
  letter-spacing: -0.005em;
  margin: 14px 0 0;
}
.award-copy h2 em { font-style: normal; color: var(--accent); }
.award-copy p {
  font-size: 18px;
  line-height: 1.7;
  margin: 22px 0 0;
  color: var(--muted);
  max-width: 56ch;
}
.award-copy .explore { margin-top: 26px; display: inline-block; }
@media (max-width: 880px) {
  .award-band { padding: 72px 24px; }
  .award-inner { grid-template-columns: 1fr; gap: 40px; }
  .award-figure::before { inset: 12px -12px -12px 12px; }
}

/* ============ AWARD-WINNING BRAND / WHO WE ARE (home split) ============
   Two mirrored portraits of the same man face each other across a cream
   field, with the copy set between them. The section wakes to full colour on
   hover and each portrait steps forward when pointed at. Inspired by the
   on-track / off-track split on landonorris.com. */
.visually-hidden {
  position: absolute !important;
  width: 1px; height: 1px;
  margin: -1px; padding: 0; border: 0;
  clip: rect(0 0 0 0); clip-path: inset(50%);
  overflow: hidden; white-space: nowrap;
}

/* Reveal wrapper: scopes the award split's sticky pin so it un-sticks the
   moment the consult band below has fully scrolled over it (see #who-we-are +
   #quick-consult in index.html). position:relative makes this the sticky
   containing block; no stacking context so the children's own z-indexes
   (award 3, form 4) still compare — the form paints over the pinned award. */
.scroll-reveal { position: relative; }

.brand-split {
  /* Pin to the top of the viewport while the consult band scrolls up over it.
     Sticks within .scroll-reveal, so it releases once the form has fully
     covered it and both scroll away together. */
  position: sticky;
  top: 0;
  isolation: isolate;
  /* above #namesake's z-index:2 so the seam-straddling awards paint over
     the dark quote band instead of sliding behind it */
  z-index: 3;
  /* visible so the .bs-float awards can straddle the seam with the namesake
     band above; html/body overflow-x:clip catches the portraits' slide-in */
  overflow: visible;
  background: transparent; /* let the fixed topo field read through */
  /* Fill the viewport while pinned so the consult band below starts exactly at
     the bottom edge (off-screen) instead of peeking in before the reveal — the
     900px cap left a strip of the form showing on taller laptop screens. The
     content is grid-centred, so extra height just re-centres it. */
  min-height: 100svh;
  display: grid;
  align-items: center;
  padding: 120px 36px;
}

/* Flanking portraits, anchored to the bottom edge, facing centre */
/* .bs-side wrappers carry the scroll-parallax transform (written each frame
   by the #who-we-are script); the img inside keeps the hover scale so the
   two never fight over one transform. */
.bs-portrait-stage {
  position: absolute;
  inset: 0;
  z-index: 0;
  overflow: hidden;
  pointer-events: none;
}
.bs-side {
  position: absolute;
  bottom: 0;
  height: clamp(360px, 82%, 860px);
  z-index: 0;
  will-change: transform;
}
.bs-side--left  { left: max(-48px, -3vw); }
.bs-side--right { right: max(-48px, -3vw); }
.bs-portrait {
  height: 100%;
  width: auto;
  filter: grayscale(0.4) contrast(1.02);
  opacity: 0.9;
  transition: filter .5s ease, opacity .5s ease, transform .6s cubic-bezier(.2,.7,.2,1);
}
.bs-side--left .bs-portrait  { transform-origin: bottom left; }
.bs-side--right .bs-portrait { transform-origin: bottom right; }
.brand-split:hover .bs-portrait { filter: grayscale(0) contrast(1.02); opacity: 1; }
.bs-portrait:hover { transform: scale(1.035); }

/* Centred copy. The section has one lead thought and a quieter identity line,
   rather than two headlines competing for equal visual weight. */
.bs-center {
  position: relative;
  z-index: 2;
  will-change: transform;
  width: 100%;
  max-width: 1120px;
  margin: 0 auto;
  display: block;
}
.bs-award {
  position: absolute;
  top: clamp(104px, 13vh, 178px);
  left: 50%;
  z-index: 3;
  margin: 0;
  white-space: nowrap;
  font-family: var(--font-serif);
  font-size: clamp(25px, 2.7vw, 40px);
  font-weight: 400;
  line-height: 1;
  color: #050505;
  pointer-events: none;
  transform: translateX(-50%);
}

.bs-col { will-change: transform, opacity; }
.bs-col--left { grid-area: left; justify-self: center; text-align: center; }
.bs-col--right { grid-area: right; justify-self: center; text-align: center; }

.bs-head {
  margin: 0;
  font-family: var(--font-display);
  font-weight: 700;
  font-size: clamp(29px, 3.7vw, 52px);
  line-height: .96;
  letter-spacing: -0.01em;
  color: #050505;
}
/* The lead statement owns the composition; the identity line beneath it
   supplies context without asking the eye to compare two large headlines. */
.bs-col--left .bs-head {
  font-size: clamp(40px, 5vw, 70px);
  font-weight: 700;
  line-height: .92;
}
.bs-identity {
  margin: 0;
  font-family: var(--font-serif);
  font-size: clamp(21px, 2vw, 30px);
  font-weight: 400;
  line-height: 1.1;
  color: #514c45;
}
.bs-detail { grid-area: detail; max-width: 1120px; margin: 0 auto; text-align: center; }
.bs-sub {
  margin: 0;
  font-size: 14px;
  line-height: 1.48;
  color: #514c45;
}
.bs-sub em { font-style: italic; }
.bs-detail .bs-sub { max-width: 58ch; margin: 0 auto; }
.bs-manifesto {
  max-width: 34ch;
  margin: 0 auto;
  font-family: var(--font-sans);
  font-size: clamp(28px, 2.8vw, 42px);
  font-weight: 500;
  line-height: 1.14;
  color: #30363a;
}
.bs-cta {
  display: inline-flex;
  align-items: center;
  margin-top: 20px;
  padding-bottom: 4px;
  border-bottom: 2px solid currentColor;
  font-family: var(--font-sans);
  font-size: 13px;
  font-weight: 700;
  letter-spacing: .02em;
  text-transform: none;
  color: #050505;
  text-decoration: none;
  transition: color .2s ease, border-color .2s ease;
}
.bs-cta:hover { color: var(--muted); }

@media (max-width: 880px) {
  .brand-split {
    /* Same reveal fix as desktop: fill the viewport while pinned so the consult
       band starts at the bottom edge (off-screen) instead of peeking in. Padding
       trimmed from 156/260 so the centred copy + the now-larger faces fit inside
       one viewport height. */
    min-height: 100svh;
    padding: 120px 22px 190px;
  }
  /* Larger flanking faces on phones — they read as the two sides of the brand
     rather than small accents. */
  .bs-side { height: clamp(290px, 66vw, 440px); }
  .bs-side--left  { left: -24px; }
  .bs-side--right { right: -24px; }
  .bs-portrait { opacity: .95; filter: grayscale(0); }
  .bs-center {
    max-width: 36ch;
  }
  .bs-col, .bs-col--left, .bs-col--right { justify-self: center; text-align: center; max-width: 100%; }
  .bs-detail .bs-sub { margin-left: auto; margin-right: auto; }
  .bs-cta { justify-content: center; }
}
@media (max-width: 420px) {
  .bs-side { height: clamp(250px, 70vw, 320px); }
  .brand-split { padding-bottom: 150px; }
}
@media (prefers-reduced-motion: reduce) {
  .bs-portrait, .bs-cta { transition: none; }
  .bs-portrait:hover { transform: none; }
}

/* ============ AWARD-WINNING MANIFESTO BEATS ============
   The manifesto plays in two centred beats on scroll: line A holds, then
   crossfades to line B + the CTA. (The consult-card growth + form reveal live
   in the "AWARD → CONSULT UNIFIED PIN" block at the end of this file.) The
   static defaults below keep a readable scene on narrow screens, reduced-motion
   and no-JS. */

/* Default: both manifesto lines stack and read together as the full statement. */
.bs-manifesto-stack { display: block; }
.bs-line { margin: 0; }
.bs-line--b { margin-top: 20px; }
.bs-line--b .bs-manifesto { margin-bottom: 0; }
/* Pin extender — only takes up space in mobile mode (see the mobile block); on
   desktop the whole .sr-stage pins instead, so it stays collapsed. */
.sr-spacer { display: none; }

@media (min-width: 981px) {
  /* Both lines share one centred grid cell so they crossfade in place; the
     block sizes to the taller line so nothing jumps. justify-items:center is
     what keeps a max-width'd line horizontally centred (stretch would pin it
     to the start — that was line A reading left-aligned). */
  html.award-seq-ready .bs-manifesto-stack {
    display: grid;
    justify-items: center;
    align-items: center;
  }
  html.award-seq-ready .bs-line {
    grid-area: 1 / 1;
    margin: 0;
    justify-self: center;
    align-self: center;
    text-align: center;
    /* No max-width here: the wrapper's `ch` resolves against the tiny inherited
       font, not the manifesto font, which made line B far narrower. Let the
       shared .bs-manifesto (34ch of the manifesto font) size BOTH lines so they
       are exactly the same width. */
  }
  html.award-seq-ready .bs-line--b .bs-manifesto { margin: 0 auto; }
  html.award-seq-ready .bs-line--a { opacity: var(--seq-text-a, 1); }
  html.award-seq-ready .bs-line--b { opacity: var(--seq-text-b, 0); }
}

/* MOBILE simplified beats (< 981px): #who-we-are PINS (its base position:sticky)
   while the .sr-spacer scrolls; the two lines crossfade in one centred grid cell
   over that pinned run. NO growing card — afterwards the consult section slides
   up and covers this section (normal flow, higher z-index), the classic reveal.
   The controller drives the crossfade from the spacer's rect. */
@media (max-width: 980px) {
  html.award-seq-mobile .sr-spacer { display: block; height: 120svh; }
  /* The pinned scene must track the LIVE (dynamic) viewport, not the small
     viewport: with 100svh the section stays svh-tall, so when the mobile
     address bar hides mid-scroll the viewport grows and the bottom-anchored
     head cutouts float above the real screen bottom. 100dvh keeps the section
     — and therefore the faces at its bottom edge — flush with the screen in
     both Chrome and Safari as the bar shows/hides. */
  html.award-seq-mobile .brand-split { min-height: 100dvh; }
  html.award-seq-mobile .bs-manifesto-stack {
    display: grid;
    justify-items: center;
    align-items: center;
  }
  html.award-seq-mobile .bs-line {
    grid-area: 1 / 1;
    margin: 0;
    justify-self: center;
    align-self: center;
    text-align: center;
  }
  html.award-seq-mobile .bs-line--b .bs-manifesto { margin: 0 auto; }
  html.award-seq-mobile .bs-line--a { opacity: var(--seq-text-a, 1); }
  html.award-seq-mobile .bs-line--b { opacity: var(--seq-text-b, 0); }
}

/* ============ AMBIENT AWARD FLOATS (inside #who-we-are) ============
   The four award cutouts drift around the brand split like the logo field
   behind the namesake quote. Each figure is the parallax carrier (the
   #who-we-are script writes its transform on scroll); the img inside runs the
   idle bob + resting tilt, so the two transforms never collide. They sit
   between the portraits (z 0) and the copy (z 2). */
.bs-float {
  position: absolute;
  margin: 0;
  z-index: 1;
  pointer-events: none;
  will-change: transform;
}
.bs-float img {
  display: block;
  width: 100%;
  height: auto;
  filter: drop-shadow(0 18px 30px rgba(0, 0, 0, 0.28));
  transform: rotate(var(--rot, 0deg));
  animation: award-bob var(--dur, 8s) ease-in-out infinite;
  will-change: transform;
}
@keyframes award-bob {
  0%, 100% { transform: translateY(calc(var(--bob, 8px) * -1)) rotate(var(--rot, 0deg)); }
  50%      { transform: translateY(var(--bob, 8px)) rotate(var(--rot, 0deg)); }
}
/* The row rides the border with the namesake quote band above: each figure
   anchors to the section's top edge and its img is pulled up by roughly half
   its own height (margin-top % resolves against the figure's WIDTH, so the
   pull scales with the clamp), leaving the object half in the dark band and
   half in this one. The bob then carries it in and out of each. */
.bs-float--brava    { width: clamp(96px, 10.5vw, 165px); top: 0; left: 12%; }
.bs-float--angi     { width: clamp(78px, 8.4vw, 130px);  top: 0; left: 35%; }
.bs-float--nextdoor { width: clamp(80px, 8.6vw, 132px);  top: 0; right: 35%; }
.bs-float--indiana  { width: clamp(82px, 8.8vw, 136px);  top: 0; right: 12%; }
/* half-height pulls, staggered a touch so the row isn't a ruler line
   (aspect ratios: brava .855, angi 1.176, nextdoor 1.164, indiana 1.187) */
.bs-float--brava img    { margin-top: -40%; }
.bs-float--angi img     { margin-top: -64%; }
.bs-float--nextdoor img { margin-top: -52%; }
.bs-float--indiana img  { margin-top: -62%; }
/* The Indiana crystal reads as near-white glass; a soft dark aura keeps its
   edges defined against the light topo field. */
.bs-float--indiana img { filter: drop-shadow(0 18px 30px rgba(0, 0, 0, 0.42)) drop-shadow(0 0 16px rgba(20, 24, 22, 0.4)); }

@media (prefers-reduced-motion: reduce) {
  .bs-float img { animation: none; transform: rotate(var(--rot, 0deg)); }
}

@media (max-width: 880px) {
  /* Phones: just the two headline awards, small, riding the same seam with
     the quote band; four would crowd it. */
  .bs-float--brava    { width: 74px; top: 0; left: 6%; }
  .bs-float--indiana  { width: 54px; top: 0; right: 8%; }
  .bs-float--angi, .bs-float--nextdoor { display: none; }
}

/* ===== Mobile homepage hero restructure (phones only) =====
   Title sits over the lower half of the vertical video; the meta row drops
   below the video on a solid panel; the body paragraph reveals on first
   scroll. Wrappers are display:contents by default, so desktop layout, no-JS,
   and crawler/desktop renders show the full hero unchanged (SEO/LLM intact). */
.brand-hero .hero-head, .brand-hero .hero-rest { display: contents; }

/* Homepage only (.brand-hero has no .hero-tall); other brand-hero pages
   (brava, pella) fall under the generic .hero-tall block below. */
@media (max-width: 720px) {
  .brand-hero:not(.hero-tall) { display: block; min-height: 0; background: #0d0d0d; }
  /* Video as large as possible; ~10vh peek of the meta panel hints at scroll. */
  .brand-hero:not(.hero-tall) .bg, .brand-hero:not(.hero-tall) .shade { height: 90vh; bottom: auto; }
  .brand-hero:not(.hero-tall) .inner { padding: 0; max-width: none; margin: 0; }

  .brand-hero:not(.hero-tall) .hero-head {
    display: flex; flex-direction: column; justify-content: flex-end; gap: 12px;
    min-height: 90vh; padding: 0 24px 30px; position: relative; z-index: 2;
  }
  .brand-hero:not(.hero-tall) .hero-rest {
    display: flex; flex-direction: column; gap: 24px; position: relative; z-index: 2;
    background: #0d0d0d; padding: 26px 24px 44px;
  }
  /* Below the video: meta row first, then body copy, then the CTAs — which stay
     off the opening screen entirely. */
  .brand-hero:not(.hero-tall) .hero-rest .signals { order: 1; margin-top: 0; }
  .brand-hero:not(.hero-tall) .hero-rest .lede    { order: 2; margin: 0; }
  .brand-hero:not(.hero-tall) .hero-rest .actions { order: 3; margin: 0; }

  /* Body copy fades in on first scroll. Its space is reserved (no display
     toggle), so revealing it never shifts the buttons or anything else. */
  html.js .brand-hero:not(.hero-tall) .lede {
    opacity: 0; transform: translateY(10px);
    transition: opacity .55s ease, transform .55s ease;
  }
  html.js.hero-revealed .brand-hero:not(.hero-tall) .lede { opacity: 1; transform: none; }
}
/* Reduced motion: show the body immediately, no fade. */
@media (max-width: 720px) and (prefers-reduced-motion: reduce) {
  html.js .brand-hero:not(.hero-tall) .lede { opacity: 1; transform: none; transition: none; }
}

/* ===== Mobile hero treatment for inner pages (phones) =====
   Mirrors the homepage: a large hero photo with the breadcrumb / eyebrow /
   heading pinned to the lower portion, and the body paragraph revealing on
   first scroll so the image leads. Applies to every .hero-tall hero (service,
   brand, project, cost). The homepage .brand-hero has no .hero-tall, so it
   keeps its own video treatment. Body text stays in the DOM — the display
   toggle is gated to html.js + phones, so desktop/crawler renders are full. */
@media (max-width: 720px) {
  .subpage-hero.hero-tall,
  .brand-hero.hero-tall,
  .hero.hero-tall { min-height: 86vh; }
  /* Content is already bottom-pinned (the hero is display:grid; align-items:end),
     so the breadcrumb/eyebrow/heading sit in the lower portion of the taller
     image automatically. */

  html.js .hero-tall:not(.hero-split) .lede,
  html.js .hero-tall:not(.hero-split) .lead { display: none; }
  html.js.hero-revealed .hero-tall:not(.hero-split) .lede,
  html.js.hero-revealed .hero-tall:not(.hero-split) .lead {
    display: block; animation: heroBodyIn .55s ease both;
  }
}
@media (max-width: 720px) and (prefers-reduced-motion: reduce) {
  html.js .hero-tall:not(.hero-split) .lede,
  html.js .hero-tall:not(.hero-split) .lead { display: block; animation: none; }
}
@keyframes heroBodyIn { from { opacity: 0; transform: translateY(8px); } to { opacity: 1; transform: none; } }

/* ===== Cost index on mobile: the stats panel is relocated by JS to sit
   directly beneath the active category (a dropdown), so the median is on
   screen without scrolling past all six tabs. ===== */
@media (max-width: 880px) {
  .index-tabs > .index-panel {
    gap: 18px;
    margin: 4px 0 2px;
    padding: 20px 2px 24px;
    border-bottom: 1px solid var(--line);
    animation: indexPanelIn .28s ease both;
  }
  .index-tabs > .index-panel .note { margin-top: 0; }
}
@media (max-width: 880px) and (prefers-reduced-motion: reduce) {
  .index-tabs > .index-panel { animation: none; }
}
@keyframes indexPanelIn { from { opacity: 0; transform: translateY(-4px); } to { opacity: 1; transform: none; } }

/* ===== Background texture (decorative, CSS-only, zero assets) =====
   .tex-dots — fine blueprint dot-grid for dark editorial/data bands.
   Sits behind content, fades at the top/bottom edges, and adapts to theme. */
.tex-dots { position: relative; isolation: isolate; }
.tex-dots::before {
  content: ""; position: absolute; inset: 0; z-index: 0; pointer-events: none;
  background-image: radial-gradient(currentColor 0.9px, transparent 1.1px);
  background-size: 22px 22px;
  color: #ededed; opacity: 0.05;
  -webkit-mask-image: linear-gradient(180deg, transparent, #000 14%, #000 86%, transparent);
          mask-image: linear-gradient(180deg, transparent, #000 14%, #000 86%, transparent);
}
body.theme-light .tex-dots::before { color: #111; opacity: 0.06; }
.tex-dots > * { position: relative; z-index: 1; }

/* ===== Editorial image breaks (long-form pages) =====
   .ed-quote — image + pulled-line diptych (the workhorse).
   .ed-plate — contained image with an optional caption beneath it.
   .ed-break — breakout wrapper used inside the narrow article column. */
.ed-break { width: 100%; }
.article-body .ed-break { margin: 60px 0; }

.ed-quote { display: grid; grid-template-columns: 1.05fr 1fr; align-items: stretch; border-top: 1px solid var(--line); }
.ed-quote .ed-q { display: flex; flex-direction: column; justify-content: center; padding: 40px 48px 40px 0; }
.ed-kicker {
  color: var(--accent);
  margin-bottom: 22px;
}
.ed-quote blockquote { margin: 0; font-family: var(--font-display); font-weight: 400; font-size: clamp(23px, 2.5vw, 33px); line-height: 1.2; letter-spacing: -0.005em; color: var(--ink, #f3f3f3); }
.ed-quote .ed-media img { display: block; width: 100%; height: 100%; min-height: 340px; object-fit: cover; filter: saturate(0.97); }

.ed-plate {
  width: calc(100% - 48px);
  max-width: 1200px;
  margin: clamp(48px, 7vw, 96px) auto;
}
.article-body .ed-plate { margin-left: auto; margin-right: auto; }
.ed-plate img { display: block; width: 100%; height: auto; max-height: 680px; object-fit: cover; }
.ed-plate .ed-shade { display: none; }
.ed-plate .ed-pt { max-width: 760px; padding: 22px 0 0; }
.ed-plate .ed-num { font-family: var(--font-display); font-size: 13px; letter-spacing: 0.2em; color: var(--accent); display: block; margin-bottom: 12px; }
.ed-plate h3 { font-family: var(--font-display); font-weight: 400; font-size: clamp(26px, 3.4vw, 42px); line-height: 1.08; letter-spacing: -0.01em; color: var(--ink); margin: 0; }

@media (max-width: 820px) {
  .article-body .ed-break { margin: 44px 0; }
  .ed-quote { grid-template-columns: 1fr; }
  .ed-quote .ed-media { order: 1; }
  .ed-quote .ed-q { order: 2; padding: 26px 0 4px; }
  .ed-quote .ed-media img { min-height: 260px; }
  .photo-break,
  .ed-plate { width: calc(100% - 32px); }
  .ed-plate .ed-pt { padding-top: 18px; }
}

/* ---- Hamburger menu: two links per row, taller tap targets ----
   Lays the dropdown links out in a 2-column grid to save vertical space and
   leave room for more pages. Each button is a little taller so it stays easy
   to tap. Applies to portrait phones, portrait iPads / tablets (up to 959px,
   where the nav is still collapsed into the hamburger), and short-viewport
   landscape phones. The `.site-header` scope keeps these rules ahead of the
   tablet drawer rules above. */
@media (max-width: 959px), (max-height: 520px) {
  .nav.nav-open .nav-links,
  .js .nav.nav-open .nav-links {
    display: grid;
    grid-template-columns: 1fr 1fr;
    column-gap: 14px;
    row-gap: 0;
    align-items: stretch;
  }
  .nav.nav-open .nav-links,
  .js .nav.nav-open .nav-links {
    position: fixed;
    top: 84px;
    left: 0 !important;
    right: 0 !important;
    width: auto !important;
    max-width: none;
    transform: none;
  }
  .site-header .nav-links a,
  .site-header.over-hero .nav-links a {
    min-height: 56px;
    padding: 16px 8px;
    text-align: center;
    border-bottom: 1px solid var(--line-soft);
  }
  /* Only drop the divider on the final item; the rest read as clean rows. */
  .site-header .nav-links a:last-child { border-bottom: 0; }
}

/* ---- Mobile drawer: constant link text size regardless of header state ----
   Over the hero, `.site-header.over-hero .nav-links a` (higher specificity)
   sized phone drawer links at 15px / .12em. Once scrolled past the hero the
   header drops .over-hero and the links fell back to the 14px / .02em base
   rule, so the open menu text visibly shrank. Pin both states to the same
   size on phones. (Tablets, min-width 600px, keep their larger 20px drawer
   text via the iPad nav block above, so this is scoped below 600px.) */
@media (max-width: 599px) {
  .site-header .nav-links a,
  .site-header.over-hero .nav-links a {
    font-size: 15px;
    letter-spacing: .12em;
  }
}

/* ============ TRADES NAV DROPDOWN ============
   Consolidates Roofing / Windows / Siding / Gutters under one "Trades" menu.
   Desktop: opens on hover, focus-within, or click (.open). Mobile/iPad: the
   panel becomes an inline accordion inside the hamburger drawer. */
.nav-trades { position: relative; display: inline-flex; align-items: center; }

.nav-trades-toggle {
  /* Use the `font` shorthand (not the font-family longhand): on macOS Chrome a
     <button> keeps its system font unless the shorthand resets it, which made
     "Trades" render in a fallback face slightly smaller than the other links. */
  font: 400 14px/1 var(--font-sans);
  letter-spacing: .02em;
  color: rgba(237, 237, 237, 0.72);
  background: transparent;
  border: 0;
  cursor: pointer;
  display: inline-flex;
  align-items: center;
  gap: 6px;
  padding: 8px 15px;
  min-height: 34px;
  transition: color .2s ease;
}
.site-header.over-hero .nav-trades-toggle { color: rgba(237, 237, 237, 0.82); }
body.theme-light .nav-trades-toggle { color: var(--ink-soft); }
body.theme-light .site-header.over-hero .nav-trades-toggle { color: rgba(237, 237, 237, 0.82); }

.nav-trades-toggle:hover,
.nav-trades:focus-within .nav-trades-toggle,
.nav-trades.open .nav-trades-toggle { color: var(--ink); }
.nav-trades.is-active .nav-trades-toggle { color: var(--accent); }
.site-header.over-hero .nav-trades-toggle:hover,
.site-header.over-hero .nav-trades:focus-within .nav-trades-toggle,
.site-header.over-hero .nav-trades.open .nav-trades-toggle,
.site-header.over-hero .nav-trades.is-active .nav-trades-toggle { color: var(--gold-soft); }

/* Caret */
.nav-caret {
  width: 0;
  height: 0;
  border-left: 3px solid transparent;
  border-right: 3px solid transparent;
  border-top: 4px solid currentColor;
  opacity: .7;
  transition: transform .2s ease;
}
.nav-trades.open .nav-caret { transform: rotate(180deg); }

/* Desktop dropdown panel */
.nav-dropdown {
  position: absolute;
  top: 100%;
  left: 50%;
  transform: translateX(-50%) translateY(6px);
  display: flex;
  flex-direction: column;
  min-width: 196px;
  padding: 6px;
  background: var(--paper);
  border: 1px solid var(--line);
  box-shadow: var(--shadow-soft);
  opacity: 0;
  visibility: hidden;
  pointer-events: none;
  transition: opacity .18s ease, transform .18s ease;
  z-index: 200;
}
/* Click-driven only: the dropdown opens/closes via the .open class (toggled in
   site.js), plus outside-click and Escape. Hover/focus openers were removed
   because, on hover/focus-capable devices, they pinned the panel open and made
   a second click unable to close it. */
.nav-trades.open .nav-dropdown {
  opacity: 1;
  visibility: visible;
  pointer-events: auto;
  transform: translateX(-50%) translateY(2px);
}
/* Invisible bridge filling the gap between the toggle and the panel, so the
   pointer stays within the menu while moving down to click a link. */
.nav-dropdown::before {
  content: "";
  position: absolute;
  left: -12px;
  right: -12px;
  top: -14px;
  height: 16px;
}
.nav-dropdown a {
  display: block;
  white-space: nowrap;
  font-family: var(--font-sans);
  letter-spacing: .02em;
  color: var(--ink-soft);
  text-decoration: none;
  transition: color .15s ease, background .15s ease;
}
.nav-dropdown a::after { display: none; }
/* The dropdown panel has its own (paper) background, so its links must keep
   dark-on-light text even when the header is over a dark hero — otherwise the
   over-hero "white nav links" rule made them white-on-white in light mode. */

.nav-dropdown a:hover { color: var(--ink); background: var(--soft); }
.nav-dropdown a[aria-current="page"] { color: var(--accent); background: var(--soft); }

/* Landscape iPads / small laptops: match the compressed nav link sizing. */
@media (min-width: 960px) and (max-width: 1280px) {
  .nav-trades-toggle { font-size: 13px; letter-spacing: .03em; padding: 8px 6px; }
}

/* ---- Mobile / iPad drawer: NO Trades grouping ----
   The "Trades" dropdown is desktop-only. In the hamburger drawer the four
   trade pages stay as individual links exactly as before: the toggle button is
   hidden and the wrapper/panel use display:contents so the links flow back
   into the .nav-links 2-column grid alongside Culture, Clients, Cost, and Proof. */
@media (max-width: 959px), (max-height: 520px) {
  .nav-trades,
  .nav-dropdown { display: contents; }
  /* The desktop panel is visibility:hidden/opacity:0 until opened; those inherit
     down to the links even under display:contents, so re-show them here. */
  .nav-dropdown {
    visibility: visible;
    opacity: 1;
    pointer-events: auto;
  }
  .nav-trades-toggle { display: none; }
  .nav-dropdown::before { display: none; }
  /* Undo the desktop dropdown-link styling so the trade links render like every
     other drawer link (centered grid cell), not a left-aligned block. */
  .nav-dropdown a {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    white-space: normal;
    background: transparent;
  }
  /* The dropdown's last link (Gutters) isn't the drawer's last item, so keep its
     row divider instead of letting :last-child strip it. */
  .site-header .nav-dropdown a:last-child { border-bottom: 1px solid var(--line-soft); }
}

/* ============ PORTFOLIO GRID (full-bleed, two-up) ============
   Inspired by the spacing/aspect ratio of a 2-column editorial portfolio:
   edge-to-edge tiles, ~1.42:1 landscape ratio, tight 5px gaps. Hover reveals a
   project caption over a soft gradient (no drop shadow). */
.portfolio { width: 100%; }
.portfolio-grid {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 5px;
}
.portfolio-grid figure {
  position: relative;
  margin: 0;
  aspect-ratio: 1.42 / 1;
  overflow: hidden;
  background: var(--soft);
  contain: paint;
}
.portfolio-grid img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
}
/* Caption (location + title) is always visible over a soft bottom gradient.
   No hover zoom, no shadow. */
.portfolio-grid figcaption {
  position: absolute;
  inset: 0;
  display: flex;
  flex-direction: column;
  justify-content: flex-end;
  gap: 3px;
  padding: 22px 24px;
  color: #fff;
  opacity: 1;
  background: linear-gradient(to top, rgba(0, 0, 0, .62), rgba(0, 0, 0, .15) 45%, rgba(0, 0, 0, 0) 75%);
  pointer-events: none;
}
.portfolio-grid figcaption strong {
  font-family: var(--font-sans);
  font-weight: 600;
  font-size: 18px;
  letter-spacing: .01em;
  line-height: 1.2;
}
.portfolio-grid figcaption span {
  font-family: var(--font-sans);
  font-weight: 400;
  font-size: 12px;
  letter-spacing: .14em;
  text-transform: uppercase;
  color: rgba(255, 255, 255, .82);
}
/* Phones: single column, captions stay visible (no hover to trigger them). */
@media (max-width: 760px) {
  .portfolio-grid { grid-template-columns: 1fr; gap: 4px; }
  .portfolio-grid figcaption { opacity: 1; }
  .portfolio-grid figcaption strong { font-size: 16px; }
}

/* ============ PROOF CASE-STUDY GRID ============
   Curated 3-up grid for the Project Proof case studies, matching the
   portfolio gallery treatment: tight gaps, photo tiles with a title +
   one-line caption over a soft bottom gradient. Each tile links to the
   full case-study page. */
.proof-grid {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  grid-auto-rows: clamp(240px, 24vw, 330px);
  grid-auto-flow: row dense;
  gap: 3px;
}
body.topo-page .proof-gallery-section,
body.topo-page .proof-gallery-section .proof-grid {
  background: transparent;
}
.proof-grid .proof-tile {
  position: relative;
  display: block;
  grid-row: span 1;
  overflow: hidden;
  background: var(--soft);
  color: #fff;
  text-decoration: none;
}
/* Editorial variation: first tile is a tall feature, last spans full width. */
.proof-grid .proof-tile:first-child { grid-row: span 2; }
.proof-grid .proof-tile:last-child { grid-column: 1 / -1; }
.proof-grid .proof-tile img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
}
.proof-grid .proof-cap {
  position: absolute;
  inset: 0;
  display: flex;
  flex-direction: column;
  justify-content: flex-end;
  gap: 8px;
  padding: 28px 28px 30px;
  background: linear-gradient(to top, rgba(0, 0, 0, .84), rgba(0, 0, 0, .28) 52%, rgba(0, 0, 0, 0) 80%);
  pointer-events: none;
}
.proof-grid .proof-tile strong {
  font-family: var(--font-sans);
  font-weight: 600;
  font-size: 24px;
  line-height: 1.15;
  letter-spacing: .01em;
}
.proof-grid .proof-note {
  font-family: var(--font-sans);
  font-weight: 400;
  font-size: 15px;
  line-height: 1.45;
  color: rgba(255, 255, 255, .92);
  max-width: 32ch;
}
.proof-grid .proof-tile:focus-visible { outline: 2px solid var(--accent); outline-offset: -3px; }
@media (max-width: 1000px) {
  .proof-grid { grid-template-columns: repeat(2, 1fr); grid-auto-rows: clamp(240px, 34vw, 300px); }
}
@media (max-width: 640px) {
  .proof-grid { grid-template-columns: 1fr; grid-auto-rows: auto; gap: 4px; }
  .proof-grid .proof-tile,
  .proof-grid .proof-tile:first-child,
  .proof-grid .proof-tile:last-child { grid-row: auto; grid-column: auto; aspect-ratio: 4 / 3; }
  .proof-grid .proof-cap { padding: 22px; }
  .proof-grid .proof-tile strong { font-size: 20px; }
}

/* ============ PORTFOLIO LIGHTBOX ============ */
.portfolio-tile { cursor: pointer; }
.portfolio-tile:focus-visible { outline: 2px solid var(--accent); outline-offset: -3px; }

/* Portfolio gallery overlay — every photo of one project at once, scrollable,
   arranged as a tight puzzle mosaic (like the proof page). */
.gallery-overlay { position: fixed; inset: 0; z-index: 1000; display: none; }
.gallery-overlay.open { display: block; }
.gallery-overlay .g-backdrop { position: absolute; inset: 0; background: rgba(8, 8, 8, .96); }
.gallery-scroll {
  position: absolute; inset: 0; z-index: 1;
  overflow-y: auto; -webkit-overflow-scrolling: touch;
}
.gallery-head {
  position: sticky; top: 0; z-index: 2;
  display: flex; align-items: center; justify-content: space-between; gap: 16px;
  padding: 16px 24px 26px;
  background: linear-gradient(180deg, rgba(8, 8, 8, .94), rgba(8, 8, 8, .55) 60%, rgba(8, 8, 8, 0));
  pointer-events: none;
}
.gallery-head > div { pointer-events: none; }
.gallery-head .g-title { color: #fff; font-family: var(--font-sans); font-weight: 600; font-size: 16px; letter-spacing: .01em; }
.gallery-head .g-count { color: rgba(255, 255, 255, .6); font-size: 11px; letter-spacing: .18em; text-transform: uppercase; margin-left: 10px; }
.gallery-close {
  pointer-events: auto;
  background: rgba(255, 255, 255, .08); border: 1px solid rgba(255, 255, 255, .25);
  color: #fff; font-size: 26px; line-height: 1; width: 44px; height: 44px;
  cursor: pointer; opacity: .9; transition: background .2s, opacity .2s;
  display: flex; align-items: center; justify-content: center;
}
.gallery-close:hover { opacity: 1; background: rgba(255, 255, 255, .18); }
/* Dense grid: equal columns always fill each row (no right-edge dead space),
   variation comes from some photos spanning 2 columns and/or 2 rows. */
.gallery-mosaic {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  grid-auto-rows: clamp(150px, 13vw, 210px);
  grid-auto-flow: dense;
  gap: 4px;
  max-width: 1700px; margin: -14px auto 0; padding: 0 4px 64px;
}
.gallery-mosaic img {
  width: 100%; height: 100%; display: block;
  object-fit: cover; background: #161616;
  grid-column: span 1; grid-row: span 1;
  cursor: pointer;
}

/* ============================================================
   LIGHTBOX: single large photo + scrollable filmstrip
   ============================================================ */
.lightbox { position: fixed; inset: 0; z-index: 1100; display: none; }
.lightbox.open { display: block; }
.lightbox .lb-backdrop { position: absolute; inset: 0; background: rgba(6, 6, 6, .97); }
.lb-stage {
  position: absolute; left: 0; right: 0; top: 0; bottom: 132px;
  display: flex; align-items: center; justify-content: center;
  padding: 24px 64px; z-index: 1;
}
.lb-stage img {
  max-width: 100%; max-height: 100%;
  object-fit: contain; display: block;
  box-shadow: 0 24px 80px rgba(0, 0, 0, .6);
}
.lb-close {
  position: absolute; top: 16px; right: 20px; z-index: 3;
  background: rgba(255, 255, 255, .08); border: 1px solid rgba(255, 255, 255, .25);
  color: #fff; font-size: 26px; line-height: 1; width: 44px; height: 44px;
  cursor: pointer; opacity: .9; transition: background .2s, opacity .2s;
  display: flex; align-items: center; justify-content: center;
}
.lb-close:hover { opacity: 1; background: rgba(255, 255, 255, .18); }
.lb-nav {
  position: absolute; top: calc(50% - 66px); transform: translateY(-50%); z-index: 3;
  background: rgba(255, 255, 255, .08); border: 1px solid rgba(255, 255, 255, .25);
  color: #fff; font-size: 34px; line-height: 1; width: 52px; height: 52px;
  cursor: pointer; opacity: .85; transition: background .2s, opacity .2s;
  display: flex; align-items: center; justify-content: center;
}
.lb-nav:hover { opacity: 1; background: rgba(255, 255, 255, .18); }
.lb-prev { left: 16px; }
.lb-next { right: 16px; }
.lb-strip {
  position: absolute; left: 0; right: 0; bottom: 0; z-index: 2;
  display: flex; gap: 8px; align-items: center;
  height: 132px; padding: 16px 18px;
  overflow-x: auto; overflow-y: hidden;
  background: linear-gradient(0deg, rgba(6, 6, 6, .96), rgba(6, 6, 6, .6) 70%, rgba(6, 6, 6, 0));
  scrollbar-width: thin; scrollbar-color: rgba(255, 255, 255, .3) transparent;
}
.lb-strip::-webkit-scrollbar { height: 8px; }
.lb-strip::-webkit-scrollbar-thumb { background: rgba(255, 255, 255, .3); border-radius: 4px; }
.lb-thumb {
  flex: 0 0 auto; width: 132px; height: 100px; padding: 0;
  border: 2px solid transparent; background: #161616; cursor: pointer;
  opacity: .55; transition: opacity .2s, border-color .2s;
}
.lb-thumb img { width: 100%; height: 100%; object-fit: cover; display: block; }
.lb-thumb:hover { opacity: .85; }
.lb-thumb.active { opacity: 1; border-color: #fff; }
@media (max-width: 640px) {
  .lb-stage { padding: 16px 12px; bottom: 104px; }
  .lb-nav { width: 44px; height: 44px; font-size: 28px; }
  .lb-strip { height: 104px; padding: 12px; }
  .lb-thumb { width: 104px; height: 78px; }
}
/* Repeating size pattern; grid-auto-flow:dense backfills so rows stay full. */
.gallery-mosaic img:nth-child(6n+1) { grid-column: span 2; grid-row: span 2; }
.gallery-mosaic img:nth-child(6n+4) { grid-column: span 2; }
.gallery-mosaic img:nth-child(10n+8) { grid-row: span 2; }
@media (max-width: 1100px) { .gallery-mosaic { grid-template-columns: repeat(3, 1fr); } }
@media (max-width: 640px) {
  .gallery-mosaic { grid-template-columns: repeat(2, 1fr); grid-auto-rows: clamp(130px, 34vw, 200px); }
  .gallery-mosaic img:nth-child(6n+1) { grid-row: span 2; }
}

/* ============================================================
   HOMEPAGE SERVICE PHOTO BACKING PLATES (v15.0)
   Each homepage service keeps its own project photo. The office
   texture fills the offset "plate" that sits behind that photo —
   a textured shadow / tracing of the image, in the spirit of the
   site's existing offset tracing plates and Bentley's About
   section. No full-section backgrounds; the section itself stays
   on the normal alternating surface and keeps its normal text.
   ============================================================ */
/* Deepen the offset a touch so the textured edge reads as a plate. */
.service-editorial.se-textured .se-figure::before {
  display: block;
  inset: 26px -26px -26px 26px;          /* peek bottom-right */
  background-color: #161618;
  background-size: contain;
  background-position: center;
  background-repeat: no-repeat;
}
.service-editorial.se-textured .media-split.reverse .se-figure::before {
  inset: 26px 26px -26px -26px;          /* peek bottom-left on reversed rows */
}
/* A soft scrim over the texture plate keeps it reading as a quiet
   shadow of the photo rather than a second competing image. */
.service-editorial.se-textured .se-figure::after {
  content: "";
  position: absolute;
  inset: 26px -26px -26px 26px;
  z-index: 0;
  background: linear-gradient(135deg, rgba(13,13,15,.30), rgba(13,13,15,.55));
  pointer-events: none;
}
.service-editorial.se-textured .media-split.reverse .se-figure::after {
  inset: 26px 26px -26px -26px;
  background: linear-gradient(225deg, rgba(13,13,15,.30), rgba(13,13,15,.55));
}
.service-editorial.se-textured .se-figure img { position: relative; z-index: 1; }
@media (max-width: 880px) {
  .service-editorial.se-textured .se-figure::before,
  .service-editorial.se-textured .se-figure::after {
    inset: 12px -12px -12px 12px;
  }
  .service-editorial.se-textured .media-split.reverse .se-figure::before,
  .service-editorial.se-textured .media-split.reverse .se-figure::after {
    inset: 12px 12px -12px -12px;
  }
}

/* Per-service texture fill (dark theme). */
.service-editorial.se-textured.bg-roofing .se-figure::before {
  background-image: url("images/officebg-roofing.jpg?v=2");
  background-image: -webkit-image-set(url("images/officebg-roofing.webp?v=2") type("image/webp"), url("images/officebg-roofing.jpg?v=2") type("image/jpeg"));
  background-image: image-set(url("images/officebg-roofing.webp?v=2") type("image/webp"), url("images/officebg-roofing.jpg?v=2") type("image/jpeg"));
}
.service-editorial.se-textured.bg-windows .se-figure::before {
  background-image: url("images/officebg-windows.jpg?v=2");
  background-image: -webkit-image-set(url("images/officebg-windows.webp?v=2") type("image/webp"), url("images/officebg-windows.jpg?v=2") type("image/jpeg"));
  background-image: image-set(url("images/officebg-windows.webp?v=2") type("image/webp"), url("images/officebg-windows.jpg?v=2") type("image/jpeg"));
}
.service-editorial.se-textured.bg-siding .se-figure::before {
  background-image: url("images/officebg-siding.jpg?v=2");
  background-image: -webkit-image-set(url("images/officebg-siding.webp?v=2") type("image/webp"), url("images/officebg-siding.jpg?v=2") type("image/jpeg"));
  background-image: image-set(url("images/officebg-siding.webp?v=2") type("image/webp"), url("images/officebg-siding.jpg?v=2") type("image/jpeg"));
}
.service-editorial.se-textured.bg-gutters .se-figure::before {
  background-image: url("images/officebg-gutters.jpg?v=2");
  background-image: -webkit-image-set(url("images/officebg-gutters.webp?v=2") type("image/webp"), url("images/officebg-gutters.jpg?v=2") type("image/jpeg"));
  background-image: image-set(url("images/officebg-gutters.webp?v=2") type("image/webp"), url("images/officebg-gutters.jpg?v=2") type("image/jpeg"));
}
.service-editorial.se-textured.bg-insurance .se-figure::before {
  background-image: url("images/officebg-insurance.jpg?v=2");
  background-image: -webkit-image-set(url("images/officebg-insurance.webp?v=2") type("image/webp"), url("images/officebg-insurance.jpg?v=2") type("image/jpeg"));
  background-image: image-set(url("images/officebg-insurance.webp?v=2") type("image/webp"), url("images/officebg-insurance.jpg?v=2") type("image/jpeg"));
}
.service-editorial.se-textured.bg-commercial .se-figure::before {
  background-image: url("images/officebg-commercial.jpg?v=2");
  background-image: -webkit-image-set(url("images/officebg-commercial.webp?v=2") type("image/webp"), url("images/officebg-commercial.jpg?v=2") type("image/jpeg"));
  background-image: image-set(url("images/officebg-commercial.webp?v=2") type("image/webp"), url("images/officebg-commercial.jpg?v=2") type("image/jpeg"));
}

/* Light theme: lightened textures + a pale scrim so the plate matches
   the light surface while keeping the hue. */
body.theme-light .service-editorial.se-textured .se-figure::before {
  background-color: #e9e9e9;
  background-size: cover;
  background-position: center;
}
body.theme-light .service-editorial.se-textured .se-figure::after {
  background: linear-gradient(135deg, rgba(250,250,250,.30), rgba(250,250,250,.50));
}
body.theme-light .service-editorial.se-textured .media-split.reverse .se-figure::after {
  background: linear-gradient(225deg, rgba(250,250,250,.30), rgba(250,250,250,.50));
}
body.theme-light .service-editorial.se-textured.bg-roofing .se-figure::before {
  background-image: url("images/officebg-roofing-light.jpg?v=2");
  background-image: -webkit-image-set(url("images/officebg-roofing-light.webp?v=2") type("image/webp"), url("images/officebg-roofing-light.jpg?v=2") type("image/jpeg"));
  background-image: image-set(url("images/officebg-roofing-light.webp?v=2") type("image/webp"), url("images/officebg-roofing-light.jpg?v=2") type("image/jpeg"));
}
body.theme-light .service-editorial.se-textured.bg-windows .se-figure::before {
  background-image: url("images/officebg-windows-light.jpg?v=2");
  background-image: -webkit-image-set(url("images/officebg-windows-light.webp?v=2") type("image/webp"), url("images/officebg-windows-light.jpg?v=2") type("image/jpeg"));
  background-image: image-set(url("images/officebg-windows-light.webp?v=2") type("image/webp"), url("images/officebg-windows-light.jpg?v=2") type("image/jpeg"));
}
body.theme-light .service-editorial.se-textured.bg-siding .se-figure::before {
  background-image: url("images/officebg-siding-light.jpg?v=2");
  background-image: -webkit-image-set(url("images/officebg-siding-light.webp?v=2") type("image/webp"), url("images/officebg-siding-light.jpg?v=2") type("image/jpeg"));
  background-image: image-set(url("images/officebg-siding-light.webp?v=2") type("image/webp"), url("images/officebg-siding-light.jpg?v=2") type("image/jpeg"));
}
body.theme-light .service-editorial.se-textured.bg-gutters .se-figure::before {
  background-image: url("images/officebg-gutters-light.jpg?v=2");
  background-image: -webkit-image-set(url("images/officebg-gutters-light.webp?v=2") type("image/webp"), url("images/officebg-gutters-light.jpg?v=2") type("image/jpeg"));
  background-image: image-set(url("images/officebg-gutters-light.webp?v=2") type("image/webp"), url("images/officebg-gutters-light.jpg?v=2") type("image/jpeg"));
}
body.theme-light .service-editorial.se-textured.bg-insurance .se-figure::before {
  background-image: url("images/officebg-insurance-light.jpg?v=2");
  background-image: -webkit-image-set(url("images/officebg-insurance-light.webp?v=2") type("image/webp"), url("images/officebg-insurance-light.jpg?v=2") type("image/jpeg"));
  background-image: image-set(url("images/officebg-insurance-light.webp?v=2") type("image/webp"), url("images/officebg-insurance-light.jpg?v=2") type("image/jpeg"));
}
body.theme-light .service-editorial.se-textured.bg-commercial .se-figure::before {
  background-image: url("images/officebg-commercial-light.jpg?v=2");
  background-image: -webkit-image-set(url("images/officebg-commercial-light.webp?v=2") type("image/webp"), url("images/officebg-commercial-light.jpg?v=2") type("image/jpeg"));
  background-image: image-set(url("images/officebg-commercial-light.webp?v=2") type("image/webp"), url("images/officebg-commercial-light.jpg?v=2") type("image/jpeg"));
}

/* ============================================================
   SHARED ACCENT PALETTE
   Every page inherits the homepage's graphite links and accents,
   with the same silver treatment for buttons and active states.
   The accent-* body classes remain for layout-only page styling.
   ============================================================ */

/* ============================================================
   FULL-SECTION BACKGROUND PHOTOS (restored, v15.1)
   The dark material backdrops behind four homepage services:
     roofing → slate   windows → window elevation
     siding  → shake    commercial → blueprint
   These sit at the section level (behind everything), while the
   office-texture plate still tucks behind each section's photo.
   Stays dark in both themes (veil + light copy); light mode uses
   the lightened backdrop under a pale veil with dark copy.
   ============================================================ */
.service-editorial.secbg {
  position: relative;
  background-color: #161618;
  background-size: cover;
  background-position: center;
  background-repeat: no-repeat;
  isolation: isolate;
}
.service-editorial.secbg::before {
  content: "";
  position: absolute;
  inset: 0;
  z-index: 0;
  background: linear-gradient(180deg, rgba(13,13,15,.82) 0%, rgba(13,13,15,.66) 52%, rgba(13,13,15,.80) 100%);
  pointer-events: none;
}
.service-editorial.secbg > .band-inner { position: relative; z-index: 1; }

.service-editorial.secbg.secbg-slate {
  background-image: url("images/homebg-roofing.jpg");
  background-image: -webkit-image-set(url("images/homebg-roofing.webp") type("image/webp"), url("images/homebg-roofing.jpg") type("image/jpeg"));
  background-image: image-set(url("images/homebg-roofing.webp") type("image/webp"), url("images/homebg-roofing.jpg") type("image/jpeg"));
}
.service-editorial.secbg.secbg-window {
  background-image: url("images/homebg-windows.jpg");
  background-image: -webkit-image-set(url("images/homebg-windows.webp") type("image/webp"), url("images/homebg-windows.jpg") type("image/jpeg"));
  background-image: image-set(url("images/homebg-windows.webp") type("image/webp"), url("images/homebg-windows.jpg") type("image/jpeg"));
}
.service-editorial.secbg.secbg-siding {
  background-image: url("images/homebg-siding.jpg");
  background-image: -webkit-image-set(url("images/homebg-siding.webp") type("image/webp"), url("images/homebg-siding.jpg") type("image/jpeg"));
  background-image: image-set(url("images/homebg-siding.webp") type("image/webp"), url("images/homebg-siding.jpg") type("image/jpeg"));
}
.service-editorial.secbg.secbg-blueprint {
  background-image: url("images/homebg-commercial.jpg");
  background-image: -webkit-image-set(url("images/homebg-commercial.webp") type("image/webp"), url("images/homebg-commercial.jpg") type("image/jpeg"));
  background-image: image-set(url("images/homebg-commercial.webp") type("image/webp"), url("images/homebg-commercial.jpg") type("image/jpeg"));
}
.service-editorial.secbg.secbg-gutters {
  background-image: url("images/gutter_pattern_dark.png");
}
.service-editorial.secbg.secbg-insurance {
  background-image: url("images/homebg-insurance.jpg");
  background-image: -webkit-image-set(url("images/homebg-insurance.webp") type("image/webp"), url("images/homebg-insurance.jpg") type("image/jpeg"));
  background-image: image-set(url("images/homebg-insurance.webp") type("image/webp"), url("images/homebg-insurance.jpg") type("image/jpeg"));
}

/* Copy stays light over the dark backdrop (both themes in dark mode). */
.service-editorial.secbg .se-copy h3 { color: #ffffff; }
.service-editorial.secbg .se-copy p { color: #e0e0e0; }
.service-editorial.secbg .se-copy p strong { color: #ffffff; }
.service-editorial.secbg .se-copy .service-eyebrow { color: var(--gold); }
.service-editorial.secbg .se-copy .explore.dark { color: #ededed; border-color: rgba(237,237,237,.30); }
.service-editorial.secbg .se-copy .explore.dark:hover { color: var(--gold); border-color: var(--gold); }

/* Light theme: lightened backdrop, pale veil, dark copy. */
body.theme-light .service-editorial.secbg { background-color: #e9e9e9; }
body.theme-light .service-editorial.secbg::before {
  background: linear-gradient(180deg, rgba(248,248,248,.60) 0%, rgba(248,248,248,.46) 52%, rgba(248,248,248,.58) 100%);
}
body.theme-light .service-editorial.secbg.secbg-slate {
  background-image: url("images/homebg-roofing-light.jpg");
  background-image: -webkit-image-set(url("images/homebg-roofing-light.webp") type("image/webp"), url("images/homebg-roofing-light.jpg") type("image/jpeg"));
  background-image: image-set(url("images/homebg-roofing-light.webp") type("image/webp"), url("images/homebg-roofing-light.jpg") type("image/jpeg"));
}
body.theme-light .service-editorial.secbg.secbg-window {
  background-image: url("images/homebg-windows-light.jpg");
  background-image: -webkit-image-set(url("images/homebg-windows-light.webp") type("image/webp"), url("images/homebg-windows-light.jpg") type("image/jpeg"));
  background-image: image-set(url("images/homebg-windows-light.webp") type("image/webp"), url("images/homebg-windows-light.jpg") type("image/jpeg"));
}
body.theme-light .service-editorial.secbg.secbg-siding {
  background-image: url("images/homebg-siding-light.jpg");
  background-image: -webkit-image-set(url("images/homebg-siding-light.webp") type("image/webp"), url("images/homebg-siding-light.jpg") type("image/jpeg"));
  background-image: image-set(url("images/homebg-siding-light.webp") type("image/webp"), url("images/homebg-siding-light.jpg") type("image/jpeg"));
}
body.theme-light .service-editorial.secbg.secbg-blueprint {
  background-image: url("images/homebg-commercial-light.jpg");
  background-image: -webkit-image-set(url("images/homebg-commercial-light.webp") type("image/webp"), url("images/homebg-commercial-light.jpg") type("image/jpeg"));
  background-image: image-set(url("images/homebg-commercial-light.webp") type("image/webp"), url("images/homebg-commercial-light.jpg") type("image/jpeg"));
}
body.theme-light .service-editorial.secbg.secbg-gutters {
  background-image: url("images/gutter_pattern_light.png");
}
body.theme-light .service-editorial.secbg.secbg-insurance {
  background-image: url("images/homebg-insurance-light.jpg");
  background-image: -webkit-image-set(url("images/homebg-insurance-light.webp") type("image/webp"), url("images/homebg-insurance-light.jpg") type("image/jpeg"));
  background-image: image-set(url("images/homebg-insurance-light.webp") type("image/webp"), url("images/homebg-insurance-light.jpg") type("image/jpeg"));
}
body.theme-light .service-editorial.secbg .se-copy h3 { color: var(--ink); }
body.theme-light .service-editorial.secbg .se-copy p { color: var(--ink-soft); }
body.theme-light .service-editorial.secbg .se-copy p strong { color: var(--ink); }
body.theme-light .service-editorial.secbg .se-copy .service-eyebrow { color: var(--copper); }
body.theme-light .service-editorial.secbg .se-copy .explore.dark { color: var(--ink); border-color: var(--line); }
body.theme-light .service-editorial.secbg .se-copy .explore.dark:hover { color: var(--accent); border-color: var(--accent); }

/* ============================================================
   FOUNDER / ETHOS TEXTURE PLATE + CULTURE ACCENT (v15.2)
   The red woven-linen office texture backs the founder (ethos)
   photo on the homepage as an offset shadow plate, and is the
   accent color for the Culture page.
   ============================================================ */
.founder-figure.fig-linen { position: relative; }
.founder-figure.fig-linen::before {
  content: "";
  position: absolute;
  inset: 26px -26px -26px 26px;
  z-index: 0;
  background-color: #161618;
  background-size: cover;
  background-position: center;
  background-repeat: no-repeat;
  border: 1px solid var(--line);
  background-image: url("images/officebg-culture.jpg?v=2");
  background-image: -webkit-image-set(url("images/officebg-culture.webp?v=2") type("image/webp"), url("images/officebg-culture.jpg?v=2") type("image/jpeg"));
  background-image: image-set(url("images/officebg-culture.webp?v=2") type("image/webp"), url("images/officebg-culture.jpg?v=2") type("image/jpeg"));
}
.founder-figure.fig-linen::after {
  content: "";
  position: absolute;
  inset: 26px -26px -26px 26px;
  z-index: 0;
  background: linear-gradient(135deg, rgba(13,13,15,.30), rgba(13,13,15,.55));
  pointer-events: none;
}
.founder-figure.fig-linen img { position: relative; z-index: 1; }
/* Caption sits on the photo (bottom-left), above the texture plate. */
.founder-figure.fig-linen figcaption {
  position: absolute;
  left: 18px;
  bottom: 14px;
  z-index: 2;
  margin: 0;
  color: rgba(255,255,255,.9);
  text-shadow: 0 1px 10px rgba(0,0,0,.75), 0 0 2px rgba(0,0,0,.6);
}
body.theme-light .founder-figure.fig-linen figcaption { color: rgba(255,255,255,.9); }
@media (max-width: 880px) {
  .founder-figure.fig-linen::before,
  .founder-figure.fig-linen::after { inset: 12px -12px -12px 12px; }
}
/* The ethos band stays dark in both themes, so this plate keeps the full
   (dark) texture + dark scrim regardless of the light/dark toggle. */

/* Culture page accent — red woven linen */

/* ============================================================
   PEOPLE / CREW IMAGERY (v16.0)
   Real faces build trust: a homepage crew band, a Culture team
   grid of field-bio cards, and crew shots woven into service
   pages. Editorial, B&W-friendly, framed simply.
   ============================================================ */
/* Homepage feature + supporting strip */
.crew-feature { margin: 0 0 22px; position: relative; }
.crew-feature img {
  width: 100%; display: block; object-fit: cover;
  aspect-ratio: 3 / 2; border: 1px solid var(--line);
}
.crew-feature figcaption,
.crew-strip figcaption {
  margin-top: 12px;
  font-family: var(--font-sans);
  text-transform: uppercase;
  color: var(--muted);
}
.crew-strip { display: grid; grid-template-columns: repeat(3, 1fr); gap: 22px; }
.crew-strip figure { margin: 0; }
.crew-strip img {
  width: 100%; display: block; object-fit: cover;
  aspect-ratio: 3 / 2; border: 1px solid var(--line);
}
@media (max-width: 760px) {
  .crew-strip { grid-template-columns: 1fr; gap: 26px; }
  .crew-feature img { aspect-ratio: 4 / 3; }
}

/* Culture: field-bio card grid (distinct from the .team-grid roster) */
.bio-cards { display: grid; grid-template-columns: repeat(3, 1fr); gap: 22px; margin: 0 0 12px; }
.bio-cards figure { margin: 0; }
.bio-cards img {
  width: 100%; height: auto; display: block;
  border: 1px solid var(--line); border-radius: 4px;
}
@media (max-width: 820px) { .bio-cards { grid-template-columns: 1fr 1fr; } }
@media (max-width: 520px) { .bio-cards { grid-template-columns: 1fr; max-width: 380px; margin-inline: auto; } }

/* Service pages: a single woven crew figure — contained for negative space */
.crew-figure { margin: 0 auto; max-width: 1040px; }
.crew-figure img {
  width: 100%; display: block; object-fit: cover;
  aspect-ratio: 3 / 2; border: 1px solid var(--line);
}
.crew-figure figcaption {
  margin-top: 12px; font-family: var(--font-sans);
  font-size: 11px; letter-spacing: .22em; text-transform: uppercase; color: var(--muted);
}
/* Portrait variant (e.g., the inspection/measure shot) shows at natural ratio */
.crew-figure.portrait { max-width: 540px; margin-inline: auto; }
.crew-figure.portrait img { aspect-ratio: auto; }
@media (max-width: 700px) { .crew-figure img { aspect-ratio: 4 / 3; } .crew-figure.portrait img { aspect-ratio: auto; } }

/* ============================================================
   ROOFING PAGE COMPOSED THEME TEST
   A page-scoped trial: no visitor theme toggle, just an intentional
   dark/light editorial rhythm for /roofing/ while the rest of the site
   keeps the existing theme system.
   ============================================================ */
body.roofing-composed {
  --roof-light-paper: #eee9dd;
  --roof-light-soft: #e2dbcc;
  --roof-light-ink: #1d1a15;
  --roof-light-text: #38332b;
  --roof-light-muted: #625a4e;
  --roof-light-line: rgba(29,26,21,.17);
  --roof-dark-paper: #171410;
  --roof-dark-soft: #211d18;
  --roof-dark-ink: #ece6d8;
  --roof-dark-text: #d2cab9;
  --roof-dark-muted: #a99f8d;
  --roof-dark-line: rgba(236,230,216,.16);
}

body.roofing-composed .site-header:not(.over-hero):not(.roofing-header-dark) {
  /* Same frosted scrim as the homepage header. */
  background: rgba(250, 250, 248, 0.62);
  -webkit-backdrop-filter: blur(16px) saturate(108%);
  backdrop-filter: blur(16px) saturate(108%);
  border-bottom-color: transparent;
}

body.roofing-composed .site-header:not(.over-hero) .brand,
body.roofing-composed .site-header:not(.over-hero) .nav-links a,
body.roofing-composed .site-header:not(.over-hero) .nav-trades-toggle {
  color: var(--roof-light-ink);
}

body.roofing-composed .site-header:not(.over-hero) .brand-logo {
  filter: brightness(0);
}

body.roofing-composed .site-header:not(.over-hero) .nav-cta {
  background: var(--roof-light-ink);
  border-color: var(--roof-light-ink);
  color: var(--roof-light-paper);
}

body.roofing-composed .site-header:not(.over-hero) .nav-toggle span {
  background: var(--roof-light-ink);
}

body.roofing-composed .site-header.roofing-header-dark:not(.over-hero) {
  background: rgba(23,20,16,.94);
  border-bottom-color: rgba(236,230,216,.14);
}

body.roofing-composed .site-header.roofing-header-dark:not(.over-hero) .brand,
body.roofing-composed .site-header.roofing-header-dark:not(.over-hero) .nav-links a,
body.roofing-composed .site-header.roofing-header-dark:not(.over-hero) .nav-trades-toggle {
  color: rgba(236,230,216,.86);
}

body.roofing-composed .site-header.roofing-header-dark:not(.over-hero) .brand-logo {
  filter: brightness(0) invert(1);
}

body.roofing-composed .site-header.roofing-header-dark:not(.over-hero) .nav-cta {
  background: var(--roof-dark-ink);
  border-color: var(--roof-dark-ink);
  color: var(--roof-dark-paper);
}

body.roofing-composed .site-header.roofing-header-dark:not(.over-hero) .nav-toggle span {
  background: var(--roof-dark-ink);
}

body.roofing-composed .site-header.roofing-header-dark:not(.over-hero) .nav-trades-toggle:hover,
body.roofing-composed .site-header.roofing-header-dark:not(.over-hero) .nav-trades.open .nav-trades-toggle,
body.roofing-composed .site-header.roofing-header-dark:not(.over-hero) .nav-links a:hover,
body.roofing-composed .site-header.roofing-header-dark:not(.over-hero) .nav-links a[aria-current="page"] {
  color: var(--gold-soft);
}

body.roofing-composed .site-header.roofing-header-dark:not(.over-hero) .nav-dropdown,
body.roofing-composed .site-header.roofing-header-dark:not(.over-hero) .nav.nav-open .nav-links {
  background: rgba(23,20,16,.98);
  border-color: rgba(236,230,216,.14);
}

body.roofing-composed .site-header.roofing-header-dark:not(.over-hero) .nav-dropdown a {
  color: rgba(236,230,216,.84);
}

body.roofing-composed .roofing-light,
body.roofing-composed .partners-band.roofing-light,
body.roofing-composed .advisor-shell.roofing-light {
  --ink: var(--roof-light-ink);
  --ink-soft: var(--roof-light-text);
  --muted: var(--roof-light-muted);
  --line: var(--roof-light-line);
  --line-soft: rgba(23,22,19,.08);
  --paper: var(--roof-light-paper);
  --soft: var(--roof-light-soft);
  background: var(--roof-light-paper);
  color: var(--roof-light-text);
  border-top-color: rgba(23,22,19,.10);
}

body.roofing-composed .roofing-light.soft {
  background: var(--roof-light-soft);
}

body.roofing-composed .roofing-light h1,
body.roofing-composed .roofing-light h2,
body.roofing-composed .roofing-light h3,
body.roofing-composed .roofing-light h4,
body.roofing-composed .roofing-light .mat-name,
body.roofing-composed .roofing-light .faq-item summary,
body.roofing-composed .roofing-light .review .attrib strong {
  color: var(--roof-light-ink);
}

body.roofing-composed .roofing-light p,
body.roofing-composed .roofing-light .card p,
body.roofing-composed .roofing-light .section-head p,
body.roofing-composed .roofing-light .material-row .mat-col p,
body.roofing-composed .roofing-light .faq-item div.answer {
  color: var(--roof-light-muted);
}

body.roofing-composed .roofing-light .card,
body.roofing-composed .roofing-light .material-row,
body.roofing-composed .roofing-light .review,
body.roofing-composed .roofing-light .faq-item,
body.roofing-composed .roofing-light .compare th,
body.roofing-composed .roofing-light .compare td,
body.roofing-composed .roofing-light .recommendation {
  border-color: var(--roof-light-line);
}

body.roofing-composed .roofing-light .review,
body.roofing-composed .roofing-light .faq-item,
body.roofing-composed .roofing-light .recommendation,
body.roofing-composed .roofing-light .advisor-controls {
  background: transparent;
}

body.roofing-composed .roofing-light input,
body.roofing-composed .roofing-light select,
body.roofing-composed .roofing-light textarea {
  background: #fffdf7;
  color: var(--roof-light-ink);
  border-color: var(--roof-light-line);
}

body.roofing-composed .roofing-light .btn,
body.roofing-composed .roofing-light .hero-actions .btn {
  background: var(--roof-light-ink);
  border-color: var(--roof-light-ink);
  color: var(--roof-light-paper);
}

body.roofing-composed .roofing-light .btn:hover,
body.roofing-composed .roofing-light .hero-actions .btn:hover {
  background: #000;
  border-color: #000;
  color: var(--roof-light-paper);
}

body.roofing-composed .roofing-light .btn.ghost,
body.roofing-composed .roofing-light .hero-actions .btn.ghost {
  background: transparent;
  color: var(--roof-light-ink);
  border-color: var(--roof-light-ink);
}

body.roofing-composed .roofing-light .btn.ghost:hover,
body.roofing-composed .roofing-light .hero-actions .btn.ghost:hover {
  background: var(--roof-light-ink);
  color: var(--roof-light-paper);
}

body.roofing-composed .roofing-dark,
body.roofing-composed .award-band.roofing-dark {
  --ink: var(--roof-dark-ink);
  --ink-soft: var(--roof-dark-text);
  --muted: var(--roof-dark-muted);
  --line: var(--roof-dark-line);
  --line-soft: rgba(247,245,239,.07);
  --paper: var(--roof-dark-paper);
  --soft: var(--roof-dark-soft);
  background: var(--roof-dark-paper);
  color: var(--roof-dark-text);
  border-top-color: rgba(247,245,239,.10);
}

body.roofing-composed .roofing-dark h1,
body.roofing-composed .roofing-dark h2,
body.roofing-composed .roofing-dark h3,
body.roofing-composed .roofing-dark h4,
body.roofing-composed .roofing-dark .faq-item summary,
body.roofing-composed .roofing-dark .video-transcript summary {
  color: var(--roof-dark-ink);
}

body.roofing-composed .roofing-dark p,
body.roofing-composed .roofing-dark .card p,
body.roofing-composed .roofing-dark .section-head p,
body.roofing-composed .roofing-dark .video-transcript p {
  color: var(--roof-dark-muted);
}

body.roofing-composed .roofing-dark .card,
body.roofing-composed .roofing-dark .video-embed,
body.roofing-composed .roofing-dark .video-transcript,
body.roofing-composed .roofing-dark .faq-item {
  border-color: var(--roof-dark-line);
}

body.roofing-composed .roofing-dark .video-embed,
body.roofing-composed .roofing-dark .video-transcript,
body.roofing-composed .roofing-dark .recommendation {
  background: rgba(255,255,255,.035);
}

body.roofing-composed .roofing-dark .video-embed,
body.roofing-composed .roofing-dark .video-transcript,
body.roofing-composed .roofing-dark .video-transcript .vt-body {
  background: transparent;
}

body.roofing-composed .roofing-dark .video-transcript {
  border-top-color: rgba(236,230,216,.18);
  border-bottom-color: rgba(236,230,216,.18);
}

body.roofing-composed .roofing-dark .video-embed figcaption {
  color: var(--roof-dark-muted);
}

body.roofing-composed .roofing-dark .btn,
body.roofing-composed .roofing-dark .hero-actions .btn {
  background: var(--roof-dark-ink);
  border-color: var(--roof-dark-ink);
  color: var(--roof-dark-paper);
}

body.roofing-composed .roofing-dark .btn.ghost,
body.roofing-composed .roofing-dark .hero-actions .btn.ghost {
  background: transparent;
  color: var(--roof-dark-ink);
  border-color: rgba(241,238,231,.72);
}

body.roofing-composed .roofing-dark .btn.ghost:hover,
body.roofing-composed .roofing-dark .hero-actions .btn.ghost:hover {
  background: var(--roof-dark-ink);
  color: var(--roof-dark-paper);
  border-color: var(--roof-dark-ink);
}

body.roofing-composed .roofing-dark .crew-figure img,
body.roofing-composed .roofing-dark .video-frame,
body.roofing-composed .roofing-dark .media img,
body.roofing-composed .award-band.roofing-dark img {
  border-color: rgba(247,245,239,.16);
}

body.roofing-composed .award-band.roofing-dark .award-inner {
  color: var(--roof-dark-text);
}

body.roofing-composed .award-band.roofing-dark .award-copy p {
  color: var(--roof-dark-muted);
}

body.roofing-composed .ed-plate + .roofing-light {
  border-top: 0;
}

body.roofing-composed .roofing-light .ed-break.ed-quote {
  background: transparent;
}

body.roofing-composed .roofing-light .ed-q blockquote {
  color: var(--roof-light-ink);
}

body.roofing-composed .advisor-shell.roofing-light {
  border: 0;
  padding: 112px 0;
}

body.roofing-composed .roofing-light .advisor-body {
  background: #f4efe4;
  border: 1px solid rgba(29,26,21,.18);
  border-radius: 14px;
  box-shadow: 0 28px 70px rgba(29,26,21,.18), 0 2px 0 rgba(255,255,255,.36) inset;
  padding: 46px;
  gap: 58px;
}

body.roofing-composed .roofing-light .advisor-body::before {
  display: none;
}

body.roofing-composed .roofing-light .advisor-controls {
  gap: 0;
}

body.roofing-composed .roofing-light .advisor-controls label {
  padding: 20px 0;
  border-bottom: 0;
  color: rgba(29,26,21,.56);
}

body.roofing-composed .roofing-light .advisor-controls label:first-child {
  padding-top: 0;
}

body.roofing-composed .roofing-light .advisor-controls label:last-child {
  border-bottom: 0;
  padding-bottom: 0;
}

body.roofing-composed .roofing-light .advisor-controls select {
  background: transparent;
  border: 0;
  border-radius: 0;
  color: var(--roof-light-ink);
  padding: 8px 0;
  margin-top: 2px;
}

body.roofing-composed .roofing-light .recommendation {
  background: transparent;
  border: 0;
  border-radius: 0;
  box-shadow: none;
  border-left: 0;
  padding: 0;
}

body.roofing-composed .roofing-light .recommendation .rec-label,
body.roofing-composed .roofing-light .material-row .mat-label {
  color: rgba(29,26,21,.52);
}

body.roofing-composed .roofing-light .recommendation h3 {
  color: var(--roof-light-ink);
}

body.roofing-composed .roofing-light .recommendation li,
body.roofing-composed .roofing-light .rec-alt {
  color: var(--roof-light-muted);
}

body.roofing-composed .roofing-light .review {
  background: transparent;
  border: 0;
  padding-top: 28px;
}

body.roofing-composed .roofing-light .review p {
  font-family: var(--font-sans);
  font-size: 17px;
  line-height: 1.68;
  font-weight: 400;
  color: var(--roof-light-text);
}

body.roofing-composed .roofing-light .review .stars {
  color: var(--google-gold);
}

body.roofing-composed .roofing-light .review .attrib {
  color: rgba(29,26,21,.58);
}

body.roofing-composed .roofing-light .faq-block {
  border-top-color: var(--roof-light-line);
}

body.roofing-composed .roofing-light .faq-item {
  background: transparent;
  border-bottom-color: var(--roof-light-line);
}

body.roofing-composed .roofing-light .faq-item summary {
  color: var(--roof-light-ink);
}

body.roofing-composed .roofing-light .faq-item div.answer,
body.roofing-composed .roofing-light .faq-item div.answer p,
body.roofing-composed .roofing-light .compare th,
body.roofing-composed .roofing-light .compare td {
  color: var(--roof-light-muted);
}

body.roofing-composed .roofing-light .faq-item div.answer strong,
body.roofing-composed .roofing-light .compare strong {
  color: var(--roof-light-ink);
}

body.roofing-composed .roofing-light .compare th,
body.roofing-composed .roofing-light .compare td {
  background: transparent;
  border-color: var(--roof-light-line);
}

body.roofing-composed .roofing-light .table-wrap {
  border-color: var(--roof-light-line);
}

body.roofing-composed #material-guide .faq-block {
  max-width: none;
}

body.roofing-composed #material-guide .faq-item .answer {
  padding-bottom: 36px;
}

@media (max-width: 880px) {
  body.roofing-composed .roofing-light .advisor-body {
    gap: 34px;
    border-radius: 10px;
    padding: 28px;
  }

body.roofing-composed .roofing-light .recommendation {
    border-left: 0;
    border-top: 0;
    padding: 0;
  }
}

/* ============================================================
   IMAGE-FIRST HERO PATTERN
   Hero photos carry the emotional first impression. The headline stays over
   the image; the explanatory copy, CTAs, proof points, and article metadata
   sit in a visible crawlable panel directly below.
   ============================================================ */
.hero-split {
  --hero-image-height: 100vh;
  position: relative;
  display: block;
  min-height: 0;
  overflow: visible;
  background: var(--paper);
  isolation: isolate;
}

.brand-hero.hero-split,
.brand-hero.hero-tall.hero-split,
.subpage-hero.hero-tall.hero-split,
.hero.hero-tall.hero-split {
  display: block;
  min-height: 0;
}

.hero-split[style*="min-height:52vh"] {
  --hero-image-height: 52vh;
}

.hero-split[style*="min-height:480px"] {
  --hero-image-height: 480px;
}

.hero-split .bg,
.hero-split .hero-bg,
.hero-split .shade,
.hero-split .hero-shade {
  position: absolute;
  inset: 0 0 auto;
  width: 100%;
  height: var(--hero-image-height);
}

.hero-split .bg,
.hero-split .hero-bg {
  object-fit: cover;
  filter: contrast(1.02) saturate(1.02);
  transform: none;
}

.hero-split .shade,
.hero-split .hero-shade,
.hero-split.project-hero .shade {
  background:
    linear-gradient(180deg, rgba(17,17,17,.20) 0%, rgba(17,17,17,.06) 44%, rgba(17,17,17,.76) 100%),
    linear-gradient(90deg, rgba(17,17,17,.52) 0%, rgba(17,17,17,.06) 58%, rgba(17,17,17,.18) 100%);
}

.hero-split .inner,
.hero-split .hero-inner {
  position: relative;
  z-index: 2;
  width: 100%;
  max-width: none;
  margin: 0;
  padding: 0;
  color: inherit;
}

.hero-split .hero-head {
  min-height: var(--hero-image-height);
  max-width: var(--container);
  margin: 0 auto;
  padding: clamp(150px, 18vh, 220px) 36px clamp(54px, 8vh, 92px);
  display: flex;
  flex-direction: column;
  justify-content: flex-end;
  align-items: flex-start;
  color: #fff;
}

.hero-split .hero-head .breadcrumb,
.hero-split .hero-head .eyebrow {
  position: relative;
  z-index: 2;
}

.hero-split .hero-head h1,
.hero-split .hero-head h2 {
  color: #fff;
  max-width: 1040px;
  text-shadow: none;
}

/* Homepage opening title: a single wide, cinematic Termina line. The
   responsive tracking stays inside the frame without wrapping. */
.brand-hero.hero-split .hero-head {
  position: relative;
  max-width: none;
  padding: 0 clamp(12px, 2.5vw, 36px);
  align-items: stretch;
  justify-content: center;
}
.brand-hero.hero-split .hero-land-title {
  width: 100%;
  max-width: none;
  margin: 0;
  color: #fff;
  font-family: var(--font-display);
  font-size: clamp(11px, 2.6vw, 46px);
  font-weight: 500;
  line-height: 1;
  letter-spacing: clamp(.1em, calc((78vw - 17ch) / 26), .52em);
  text-align: center;
  text-transform: uppercase;
  white-space: nowrap;
  text-shadow: 0 2px 24px rgba(0,0,0,.52);
}
.hero-scroll-cue {
  position: absolute;
  left: 50%;
  bottom: clamp(16px, 3vh, 32px);
  z-index: 3;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 5px;
  color: #fff;
  font-family: var(--font-sans);
  font-size: clamp(11px, .8vw, 14px);
  font-weight: 700;
  letter-spacing: .2em;
  line-height: 1;
  text-transform: uppercase;
  text-shadow: none;
  transform: translateX(-50%);
}
.hero-scroll-cue b {
  font-family: var(--font-sans);
  font-size: clamp(24px, 2vw, 34px);
  font-weight: 400;
  line-height: .75;
  animation: hero-scroll-nudge 1.15s ease-in-out infinite;
}
@keyframes hero-scroll-nudge {
  0%, 100% { transform: translateY(0); }
  50% { transform: translateY(7px); }
}
@media (prefers-reduced-motion: reduce) {
  .hero-scroll-cue b { animation: none; }
}

.hero-split .hero-rest {
  position: relative;
  z-index: 3;
  max-width: var(--container);
  margin: 0 auto;
  padding: 42px 36px 50px;
  display: grid;
  grid-template-columns: minmax(0, 820px) minmax(240px, 1fr);
  gap: 24px 56px;
  align-items: start;
  background: var(--paper);
  color: var(--ink);
  border-top: 1px solid var(--line);
  box-shadow: 0 0 0 100vmax var(--paper);
  clip-path: inset(0 -100vmax);
}

.hero-split .hero-rest .lede,
.hero-split .hero-rest .lead,
html.js .hero-split .hero-rest .lede,
html.js .hero-split .hero-rest .lead,
html.js.hero-revealed .hero-split .hero-rest .lede,
html.js.hero-revealed .hero-split .hero-rest .lead {
  display: block !important;
  grid-column: 1;
  max-width: 820px;
  margin: 0;
  color: var(--ink-soft);
  font-size: clamp(17px, 1.25vw, 20px);
  line-height: 1.68;
  opacity: 1;
  transform: none;
  animation: none;
  transition: none;
}

.hero-split .hero-rest .actions,
.hero-split .hero-rest .hero-actions {
  grid-column: 2;
  grid-row: 1;
  margin: 0 !important;
  justify-content: flex-start !important;
  align-self: start;
}

.hero-split .hero-rest .article-meta,
.hero-split .hero-rest > .eyebrow {
  grid-column: 1 / -1;
  margin: 0;
}

.hero-split .hero-rest .signals {
  grid-column: 1 / -1;
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
  gap: 24px 36px;
  margin: 10px 0 0;
  padding-top: 24px;
  border-top: 1px solid var(--line);
  color: var(--muted);
}

.hero-split .hero-rest .signals div {
  max-width: none;
  color: var(--muted);
}

.hero-split .hero-rest .signals strong {
  color: var(--ink);
}

.hero-split .hero-rest a:not(.btn) {
  text-decoration-thickness: 1px;
  text-underline-offset: 4px;
}

/* Pella moves the opening/planning read below its three full-bleed product images. */
.pella-opening-note {
  background: var(--paper);
  border-top: 1px solid var(--line);
  border-bottom: 1px solid var(--line);
}
.pella-opening-note-inner {
  max-width: var(--container);
  margin: 0 auto;
  padding: clamp(46px, 6vw, 88px) 36px;
  display: grid;
  grid-template-columns: minmax(0, 820px) minmax(240px, 1fr);
  gap: 26px 56px;
  align-items: start;
}
.pella-opening-note .lede {
  grid-column: 1;
  margin: 0;
  color: var(--ink-soft);
  font-size: clamp(17px, 1.25vw, 20px);
  line-height: 1.68;
}
.pella-opening-note .actions {
  grid-column: 2;
  grid-row: 1;
  display: flex;
  flex-wrap: wrap;
  gap: 22px;
  align-items: center;
}
.pella-opening-note .actions .btn.ghost {
  background: transparent;
  border-color: var(--ink);
  color: var(--ink);
}
.pella-opening-note .actions .explore {
  color: var(--ink);
  border-color: rgba(17,17,17,.36);
  transform: none;
}
.pella-opening-note .signals {
  grid-column: 1 / -1;
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
  gap: 24px 36px;
  margin: 8px 0 0;
  padding-top: 24px;
  border-top: 1px solid var(--line);
  color: var(--muted);
}
.pella-opening-note .signals span {
  display: block;
  margin-bottom: 10px;
  font-size: 10px;
  text-transform: uppercase;
}
.pella-opening-note .signals strong {
  display: block;
  color: var(--ink);
  line-height: 1;
}
.pella-cost-head .pella-cost-lede {
  max-width: none;
  width: 100%;
  margin: 28px 0 0;
}
@media (max-width: 900px) {
  .pella-opening-note-inner { grid-template-columns: 1fr; padding: 42px 7vw; }
  .pella-opening-note .actions { grid-column: 1; grid-row: auto; }
}

@media (max-width: 900px) {
  .hero-split {
    --hero-image-height: 100vh;
    --hero-image-height: max(100svh, 640px);
  }

  .hero-split.cost-hero {
    --hero-image-height: max(100svh, 760px);
  }

  .hero-split.brava-hero,
  .hero-split.pella-hero {
    --hero-image-height: max(100svh, 760px);
  }

  .hero-split[style*="min-height:52vh"],
  .subpage-hero.hero-split[style*="min-height:52vh"] {
    --hero-image-height: 52vh;
  }

  .hero-split[style*="min-height:480px"] {
    --hero-image-height: 480px;
  }

  .hero-split .hero-head {
    min-height: var(--hero-image-height);
    padding: 120px 24px 44px;
  }

  .hero-split.cost-hero .hero-head {
    padding-bottom: 180px;
  }

  .hero-split.brava-hero .hero-head,
  .hero-split.pella-hero .hero-head {
    padding-bottom: 180px;
  }

  .hero-split .hero-rest {
    position: relative;
    z-index: 3;
    display: grid;
    grid-template-columns: 1fr;
    gap: 24px;
    padding: 30px 24px 42px;
    background: var(--paper);
    color: var(--ink);
    border-top: 1px solid var(--line);
    box-shadow: 0 0 0 100vmax var(--paper);
    clip-path: inset(0 -100vmax);
  }

  .hero-split .hero-rest .lede,
  .hero-split .hero-rest .lead,
  .hero-split .hero-rest .actions,
  .hero-split .hero-rest .hero-actions {
    grid-column: 1;
    grid-row: auto;
  }

  .hero-split .hero-rest .actions,
  .hero-split .hero-rest .hero-actions {
    width: 100%;
  }

  .brand-hero.hero-split:not(.hero-tall) .bg,
  .brand-hero.hero-split:not(.hero-tall) .shade {
    height: var(--hero-image-height);
  }

  .brand-hero.hero-split:not(.hero-tall) .hero-head {
    min-height: var(--hero-image-height);
    padding: 120px 24px 44px;
  }

  .brand-hero.hero-split:not(.hero-tall) .hero-rest {
    display: grid;
    grid-template-columns: 1fr;
    gap: 24px;
    padding: 30px 24px 42px;
  }

  .brand-hero.hero-split:not(.hero-tall) .hero-rest .lede,
  .brand-hero.hero-split:not(.hero-tall) .hero-rest .actions,
  .brand-hero.hero-split:not(.hero-tall) .hero-rest .signals {
    order: initial;
    margin: 0;
  }
}

@media (max-width: 560px) {
  .hero-split {
    --hero-image-height: 100vh;
    --hero-image-height: max(100svh, 620px);
  }

  .hero-split.cost-hero {
    --hero-image-height: max(100svh, 780px);
  }

  .hero-split.brava-hero,
  .hero-split.pella-hero {
    --hero-image-height: max(100svh, 780px);
  }

  .hero-split[style*="min-height:52vh"],
  .subpage-hero.hero-split[style*="min-height:52vh"] {
    --hero-image-height: 52vh;
  }

  .hero-split[style*="min-height:480px"] {
    --hero-image-height: 480px;
  }

  .hero-split .hero-head {
    min-height: var(--hero-image-height);
    padding: 108px 20px 36px;
  }

  .hero-split.cost-hero .hero-head {
    padding-bottom: 200px;
  }

  .hero-split.brava-hero .hero-head,
  .hero-split.pella-hero .hero-head {
    padding-bottom: 190px;
  }

  .hero-split.cost-hero .hero-head h1 {
    font-size: clamp(32px, 9vw, 42px);
    line-height: 1.08;
  }

  .hero-split.brava-hero .hero-head h1,
  .hero-split.pella-hero .hero-head h1 {
    font-size: clamp(34px, 9.4vw, 44px);
    line-height: 1.08;
  }

  .hero-split .hero-rest {
    padding: 26px 20px 38px;
  }

  .hero-split .hero-rest .signals {
    grid-template-columns: 1fr;
  }

  .brand-hero.hero-split:not(.hero-tall) .hero-head {
    padding: 108px 20px 36px;
  }

  .brand-hero.hero-split:not(.hero-tall) .hero-rest {
    padding: 26px 20px 38px;
  }
}

/* ============================================================
   HEROES IN FULL COLOR (no scrim/vignette over hero photo or video).
   A soft text-shadow keeps headline/eyebrow/lede legible without
   tinting the image itself.
   ============================================================ */
.brand-hero .shade,
.subpage-hero .shade,
.service-cine .shade,
.project-hero .shade,
.hero-split .shade { background: none !important; box-shadow: none !important; }
.brand-hero .inner,
.subpage-hero .inner,
.service-cine .inner,
.project-hero .inner,
.hero-split .inner { text-shadow: 0 1px 2px rgba(0,0,0,.30), 0 2px 22px rgba(0,0,0,.45); }

/* Commercial page: pinned sketch-to-photo hero reveal. */
.commercial-sketch-reveal.subpage-hero.hero-tall.hero-split {
  --commercial-photo-clip: 100%;
  --commercial-image-scale: 1.018;
  min-height: 0;
  background: var(--paper);
}

.commercial-sketch-reveal .commercial-hero-reveal-track {
  position: relative;
}

.commercial-sketch-reveal .commercial-hero-pin {
  position: sticky;
  top: 0;
  height: 100svh;
  min-height: 100svh;
  overflow: hidden;
  isolation: isolate;
}

.commercial-sketch-reveal .commercial-hero-reveal {
  position: absolute;
  inset: 0;
  z-index: 0;
  overflow: hidden;
  contain: paint;
  background: #f7f7f4;
}

.commercial-sketch-reveal .commercial-hero-reveal__layer,
.commercial-sketch-reveal .commercial-hero-reveal__layer img {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
}

.commercial-sketch-reveal .commercial-hero-reveal__layer {
  overflow: hidden;
  contain: paint;
  backface-visibility: hidden;
}

.commercial-sketch-reveal .commercial-hero-reveal__layer img {
  object-fit: cover;
  object-position: center center;
  transform-origin: center center;
  backface-visibility: hidden;
}

.commercial-sketch-reveal .commercial-hero-reveal__sketch img {
  filter: contrast(1.04) brightness(1.015);
  transform: scale(var(--commercial-image-scale));
  will-change: transform;
}

.commercial-sketch-reveal .commercial-hero-reveal__photo {
  clip-path: inset(var(--commercial-photo-clip) 0 0 0);
  will-change: clip-path;
}

.commercial-sketch-reveal .commercial-hero-reveal__photo img {
  transform: scale(var(--commercial-image-scale));
  will-change: transform;
}

.commercial-sketch-reveal .commercial-hero-reveal__line {
  display: none;
}

.commercial-sketch-reveal .shade {
  z-index: 1;
  height: 100svh;
}

.commercial-sketch-reveal .inner {
  z-index: 2;
}

.commercial-sketch-reveal .hero-head {
  min-height: 100svh;
}

.commercial-sketch-reveal .commercial-hero-scroll-space {
  height: 150svh;
}

.commercial-sketch-reveal .commercial-hero-rest-inner {
  position: relative;
  z-index: 4;
}

@media (prefers-reduced-motion: reduce) {
  .commercial-sketch-reveal.subpage-hero.hero-tall.hero-split {
    --commercial-photo-clip: 0%;
    --commercial-image-scale: 1;
    min-height: auto;
  }

  .commercial-sketch-reveal .commercial-hero-pin {
    position: relative;
  }

  .commercial-sketch-reveal .commercial-hero-scroll-space {
    display: none;
  }

}

/* ============================================================
   FIXED LIGHT-DOMINANT SITE SYSTEM
   The visitor-facing light/dark mode has been retired. Light is
   the site-wide base; dark surfaces remain intentional section
   pacing through .band.dark, .roofing-dark, cta/footer bands, and
   photo heroes.
   ============================================================ */
:root { color-scheme: light; }

.band.dark,
.cta-section,
.ethos-band,
.site-footer,
.calculator {
  --ink: #ededed;
  --ink-soft: #d6d6d6;
  --muted: #a3a3a3;
  --line: rgba(255,255,255,.14);
  --line-soft: rgba(255,255,255,.07);
  color: var(--ink-soft);
}

.band.dark h1,
.band.dark h2,
.band.dark h3,
.band.dark h4,
.cta-section h1,
.cta-section h2,
.cta-section h3,
.cta-section h4,
.ethos-band h1,
.ethos-band h2,
.ethos-band h3,
.ethos-band h4,
.site-footer h1,
.site-footer h2,
.site-footer h3,
.site-footer h4,
.calculator h1,
.calculator h2,
.calculator h3,
.calculator h4 {
  color: var(--ink);
}

.band.dark p,
.band.dark li,
.band.dark .section-head p,
.cta-section p,
.cta-section li,
.ethos-band p,
.ethos-band li,
.site-footer p,
.site-footer li,
.calculator p,
.calculator li {
  color: var(--muted);
}

.band.dark .eyebrow,
.band.dark .eyebrow.dark,
.cta-section .eyebrow,
.cta-section .eyebrow.dark,
.ethos-band .eyebrow,
.ethos-band .eyebrow.dark,
.site-footer .eyebrow,
.site-footer .eyebrow.dark,
.calculator .eyebrow,
.calculator .eyebrow.dark,
.roofing-dark .eyebrow,
.roofing-dark .eyebrow.dark,
.award-band.roofing-dark .eyebrow,
.award-band.roofing-dark .eyebrow.dark {
  color: rgba(237,237,237,.68) !important;
}

/* Homepage rhythm after retiring the global theme switch.
   Keep the site light-dominant overall, but give the first half of the
   homepage stronger dark beats so it does not read as a long pale run. */
body.home-composed .intro-statement {
  --ink: #ededed;
  --ink-soft: #d6d0c4;
  --muted: #aaa294;
  --line: rgba(237,237,237,.14);
  --line-soft: rgba(237,237,237,.08);
  background: #14110e;
  color: var(--ink-soft);
  border-top-color: rgba(237,237,237,.12);
  border-bottom-color: rgba(237,237,237,.12);
}

body.home-composed .intro-statement p {
  color: var(--ink);
}

body.home-composed .intro-statement p.fine {
  color: var(--muted);
}

body.home-composed #services {
  background: #f0ece3;
}

body.home-composed .service-editorial-stack {
  background: #f0ece3;
}

body.home-composed .service-editorial.secbg:nth-of-type(odd) {
  --ink: #ededed;
  --ink-soft: #ddd5c7;
  --muted: #aaa294;
  --line: rgba(237,237,237,.14);
  --line-soft: rgba(237,237,237,.08);
  background-color: #15120f;
  color: var(--ink-soft);
  border-top-color: rgba(237,237,237,.10);
}

body.home-composed .service-editorial.secbg:nth-of-type(odd)::before {
  opacity: .18;
  mix-blend-mode: screen;
}

body.home-composed .service-editorial.secbg:nth-of-type(odd) .se-copy h3,
body.home-composed .service-editorial.secbg:nth-of-type(odd) .se-copy p strong {
  color: var(--ink);
}

body.home-composed .service-editorial.secbg:nth-of-type(odd) .se-copy p {
  color: var(--ink-soft);
}

body.home-composed .service-editorial.secbg:nth-of-type(odd) .se-copy .service-eyebrow,
body.home-composed .service-editorial.secbg:nth-of-type(odd) .se-figure figcaption {
  color: rgba(237,237,237,.68);
}

body.home-composed .service-editorial.secbg:nth-of-type(odd) .se-copy .explore.dark {
  color: var(--ink);
  border-color: rgba(237,237,237,.34);
}

body.home-composed .service-editorial.secbg:nth-of-type(odd) .se-copy .explore.dark:hover {
  color: #ffffff;
  border-color: #ffffff;
}

body.article-composed .article-next-step .section-head,
body.journal-composed .journal-next-step .section-head {
  margin-bottom: 36px;
}

body.article-composed .article-next-step .hero-actions,
body.journal-composed .journal-next-step .hero-actions {
  margin-top: 0;
}

body.article-composed .article-next-step .explore,
body.journal-composed .journal-next-step .explore {
  color: var(--ink);
  border-color: var(--line);
}

body.article-composed .article-next-step .explore:hover,
body.journal-composed .journal-next-step .explore:hover {
  color: var(--accent);
  border-color: var(--accent);
}

body.theme-light.ai-composed main > section.band:nth-of-type(3n) .ai-wrap h2,
body.theme-light.ai-composed main > section.band:nth-of-type(3n) .ai-wrap h3,
body.theme-light.ai-composed main > section.band:nth-of-type(3n) .ai-table td,
body.theme-light.ai-composed main > section.band:nth-of-type(3n) .ai-table td.v,
body.theme-light.ai-composed main > section.band:nth-of-type(3n) .ai-boilerplate strong {
  color: var(--ink);
}

body.theme-light.ai-composed main > section.band:nth-of-type(3n) .ai-wrap p,
body.theme-light.ai-composed main > section.band:nth-of-type(3n) .ai-wrap li,
body.theme-light.ai-composed main > section.band:nth-of-type(3n) .ai-boilerplate {
  color: var(--ink-soft);
}

body.theme-light.ai-composed main > section.band:nth-of-type(3n) .ai-table th,
body.theme-light.ai-composed main > section.band:nth-of-type(3n) .ai-note {
  color: var(--muted);
}

body.theme-light.ai-composed main > section.band:nth-of-type(3n) .ai-table th,
body.theme-light.ai-composed main > section.band:nth-of-type(3n) .ai-table td,
body.theme-light.ai-composed main > section.band:nth-of-type(3n) .ai-qa {
  border-color: var(--line);
}

/* Main nav page rhythm. These are intentionally page-specific section beats,
   but they share one surface language so the nav pages feel related. */
body.theme-light .site-header.surface-header-dark:not(.over-hero) {
  background: rgba(20,17,14,.94);
  border-bottom-color: rgba(237,237,237,.14);
}

body.theme-light .site-header.surface-header-dark:not(.over-hero) .brand,
body.theme-light .site-header.surface-header-dark:not(.over-hero) .nav-links a,
body.theme-light .site-header.surface-header-dark:not(.over-hero) .nav-trades-toggle {
  color: rgba(237,237,237,.86);
}

body.theme-light .site-header.surface-header-dark:not(.over-hero) .brand-logo {
  filter: brightness(0) invert(1);
}

body.theme-light .site-header.surface-header-dark:not(.over-hero) .nav-cta {
  background: #ededed;
  border-color: #ededed;
  color: #14110e;
}

body.theme-light .site-header.surface-header-dark:not(.over-hero) .nav-toggle span {
  background: #ededed;
}

body.theme-light .site-header.surface-header-dark:not(.over-hero) .nav-links a:hover,
body.theme-light .site-header.surface-header-dark:not(.over-hero) .nav-links a[aria-current="page"],
body.theme-light .site-header.surface-header-dark:not(.over-hero) .nav-trades-toggle:hover,
body.theme-light .site-header.surface-header-dark:not(.over-hero) .nav-trades.open .nav-trades-toggle,
body.theme-light .site-header.surface-header-dark:not(.over-hero) .nav-trades.is-active .nav-trades-toggle {
  color: var(--gold-soft);
}

body.theme-light .site-header.surface-header-dark:not(.over-hero) .nav-dropdown,
body.theme-light .site-header.surface-header-dark:not(.over-hero) .nav.nav-open .nav-links {
  background: rgba(20,17,14,.98);
  border-color: rgba(237,237,237,.14);
}

body.theme-light .site-header.surface-header-dark:not(.over-hero) .nav-dropdown a {
  color: rgba(237,237,237,.82);
}

body.theme-light main > section.band.nav-dark,
body.theme-light main > section.statement-band.nav-dark,
body.theme-light main > section.partners-band.nav-dark,
body.theme-light main > section.portfolio.nav-dark {
  --ink: #ededed;
  --ink-soft: #d6d0c4;
  --muted: #aaa294;
  --line: rgba(237,237,237,.16);
  --line-soft: rgba(237,237,237,.08);
  --soft: rgba(255,255,255,.055);
  background: #14110e;
  color: var(--ink-soft);
  border-top-color: rgba(237,237,237,.12);
  border-bottom-color: rgba(237,237,237,.12);
}

section.nav-dark h1,
section.nav-dark h2,
section.nav-dark h3,
section.nav-dark h4,
section.nav-dark .partner-name,
section.nav-dark .product-label,
section.nav-dark .review .attrib strong,
section.nav-dark .faq-item summary,
section.nav-dark .path-card h3,
section.nav-dark .process-step h3 {
  color: var(--ink);
}

section.nav-dark p,
section.nav-dark li,
section.nav-dark .section-head p,
section.nav-dark .body-flow,
section.nav-dark .partner-blurb,
section.nav-dark .product-body p,
section.nav-dark .review p,
section.nav-dark .faq-item div.answer,
section.nav-dark .path-card p,
section.nav-dark .process-step p {
  color: var(--ink-soft);
}

section.nav-dark .eyebrow,
section.nav-dark .eyebrow.dark,
section.nav-dark .partners-eyebrow,
section.nav-dark .partner-role,
section.nav-dark .product-label span,
section.nav-dark .review .attrib,
section.nav-dark .path-card .arrow,
section.nav-dark .process-step .step-label {
  color: rgba(237,237,237,.68) !important;
}

section.nav-dark .card,
section.nav-dark .partner-card,
section.nav-dark .review,
section.nav-dark .faq-item,
section.nav-dark .path-card,
section.nav-dark .process-step {
  background: rgba(255,255,255,.045);
  border-color: var(--line);
}

section.nav-dark .path-card:hover {
  background: rgba(255,255,255,.075);
}

section.nav-dark .product-row {
  border-color: var(--line);
}

section.nav-dark .crew-figure img,
section.nav-dark .media img {
  box-shadow: 0 24px 70px rgba(0,0,0,.28);
}

section.nav-dark a,
section.nav-dark .explore,
section.nav-dark .explore.dark,
section.nav-dark .faq-item div.answer a {
  color: rgba(237,237,237,.86);
}

section.nav-dark .explore,
section.nav-dark .explore.dark {
  border-color: rgba(237,237,237,.34);
}

section.nav-dark .explore:hover,
section.nav-dark .explore.dark:hover {
  color: #ffffff;
  border-color: #ffffff;
}

section.nav-dark .btn.ghost {
  color: var(--ink);
  border-color: rgba(237,237,237,.42);
}

/* ============================================================
   ACCESSIBLE TYPE PASS
   Older homeowners and property owners need comfortable reading
   sizes across phones, tablets, and desktop. This final layer wins
   over the earlier compact editorial/nav rules without changing
   the page structure.
   ============================================================ */

/* Main reading copy */
p { font-size: 18px; line-height: 1.72; }
.section-head p,
.service-detail .service-copy p,
.service-entry .service-copy p,
.case-study .case-body p,
.se-copy p,
.manifesto-prose p,
.regions-note p,
.cost-foot p,
.product-row .product-body p {
  font-size: 18px;
  line-height: 1.72;
}
.card p,
.faq-item div.answer,
.path-card p,
.blog-card p,
.ethos-stack article p,
.process-step p,
.how-step p,
.material-row .mat-col p,
.vt-body p {
  font-size: 17px;
  line-height: 1.7;
}

/* Desktop navigation */
.site-header .nav-links a,
.site-header.over-hero .nav-links a,
body.theme-light .site-header .nav-links a,
body.theme-light .site-header.over-hero .nav-links a,
.nav-trades-toggle {
  font-size: 16px;
  line-height: 1.25;
  letter-spacing: .01em;
}
.nav-links {
  box-sizing: border-box;
  max-width: 100vw;
}
.nav-cta,
body.theme-light .nav-cta {
  font-size: 15px;
  line-height: 1.2;
  min-height: 46px;
}
.nav-dropdown a {
  font-size: 16px;
  line-height: 1.3;
  padding: 13px 18px;
}

/* Keep the larger nav from crowding: tablets and small laptops use the drawer. */
@media (max-width: 1180px), (max-height: 560px) {
  .nav {
    flex-wrap: nowrap;
    gap: 16px;
    position: relative;
  }
  .brand { order: 1; }
  .nav-cta {
    order: 2;
    margin-left: auto;
    white-space: nowrap;
  }
  .js .nav-toggle {
    display: flex;
    order: 4;
  }
  .nav-links {
    order: 5;
    flex: 1 0 100%;
    display: flex;
    flex-direction: column;
    gap: 0;
    position: static;
    background: var(--paper);
    border-bottom: 1px solid var(--line);
    box-shadow: var(--shadow-soft);
    padding: 8px 24px 18px;
  }
  .js .nav-links {
    display: none;
    position: fixed;
    top: 84px;
    left: 0 !important;
    right: 0 !important;
    width: auto !important;
    max-width: none;
    flex: 0 1 auto;
    max-height: calc(100vh - 84px);
    overflow-y: auto;
    transform: none;
  }
  .js .nav.nav-open .nav-links {
    display: grid;
    grid-template-columns: 1fr 1fr;
    column-gap: 14px;
    row-gap: 0;
    align-items: stretch;
  }
  .site-header .nav-links a,
  .site-header.over-hero .nav-links a,
  body.theme-light .site-header .nav-links a,
  body.theme-light .site-header.over-hero .nav-links a {
    color: var(--ink-soft);
    font-size: 18px;
    line-height: 1.25;
    letter-spacing: .04em;
    min-height: 60px;
    padding: 18px 8px;
    text-align: center;
    border-bottom: 1px solid var(--line-soft);
  }
  .site-header .nav-links a::after { display: none; }
  .nav-trades,
  .nav-dropdown { display: contents; }
  .nav-dropdown {
    visibility: visible;
    opacity: 1;
    pointer-events: auto;
  }
  .nav-trades-toggle { display: none; }
  .nav-dropdown::before { display: none; }
  .nav-dropdown a {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    white-space: normal;
    background: transparent;
  }
}

@media (min-width: 600px) and (max-width: 1180px) {
  .nav-toggle {
    width: 56px;
    height: 56px;
    padding: 13px;
  }
  .nav-toggle span { width: 30px; }
  .site-header .nav-links,
  body.theme-light .site-header.surface-header-dark:not(.over-hero) .nav.nav-open .nav-links {
    padding: 12px 30px 26px;
  }
  .site-header .nav-links a,
  .site-header.over-hero .nav-links a,
  body.theme-light .site-header .nav-links a,
  body.theme-light .site-header.over-hero .nav-links a {
    font-size: 20px;
    min-height: 66px;
    padding: 22px 8px;
  }
}

@media (min-width: 960px) and (max-width: 1180px) and (min-height: 561px) {
  .nav.nav-open .nav-links,
  .js .nav.nav-open .nav-links {
    left: 15px !important;
    right: 15px !important;
  }
}

@media (max-width: 599px) {
  .nav { padding: 16px 20px; }
  .nav-cta {
    font-size: 14px;
    min-height: 42px;
    padding: 11px 14px;
  }
  .site-header .nav-links a,
  .site-header.over-hero .nav-links a,
  body.theme-light .site-header .nav-links a,
  body.theme-light .site-header.over-hero .nav-links a {
    font-size: 18px;
    letter-spacing: .04em;
    min-height: 58px;
    padding: 17px 6px;
  }
}

@media (max-width: 380px) {
  .nav { padding-inline: 16px; gap: 8px; }
  .nav-cta {
    font-size: 13px;
    padding-inline: 12px;
  }
  .site-header .nav-links a,
  .site-header.over-hero .nav-links a {
    font-size: 17px;
  }
}

/* ============================================================
   "BLOOD IN THE MACHINE" — de-template pass v1
   Strips the AI luxury-template tells: accent-word headlines,
   wide-tracked kicker labels, → arrow ghost links, glassy hairline
   cards, and the decorative stat row. Direction: bold & opinionated
   (plain confident statements, strong contrast, fewer flourishes).
   Full-bleed hero photography is intentionally left as-is.
   Appended last so these rules win on equal specificity.
   ============================================================ */

/* (1) Kill the "one accent word" headline gimmick — the emphasized
   word now reads in the same color and weight as the rest of the line,
   including on the per-section copper/orange accent pages. */
h1 em, h2 em, h3 em,
.brand-hero h1 em,
.split h2 em, .split h3 em,
.card h3 em,
.service-section h3 em, .service-cine h3 em,
.script-mark {
  color: inherit;
  font-style: normal;
  font-weight: inherit;
}

/* (2) Eyebrow / kicker labels — drop the tiny wide-tracked template
   look for a tight, heavy, intentional label. */
.eyebrow, .eyebrow.dark,
.service-eyebrow,
.card .kicker, .band.dark .card .kicker,
.index-tab span, .index-panel .label {
  letter-spacing: .02em;
  font-weight: 800;
  font-size: 12px;
}

/* (3) Buttons + links — no → arrows, heavier outlines, confident weight. */
.explore::after, .card .arrow::after { content: none; }
.explore, .explore.dark {
  font-weight: 800;
  letter-spacing: .02em;
  border-bottom-width: 2px;
}
.explore:hover, .explore.dark:hover { gap: 16px; }
.card .arrow {
  letter-spacing: .02em;
  font-weight: 800;
  border-bottom-width: 2px;
}
.btn {
  letter-spacing: .02em;
  font-weight: 800;
}
.btn.ghost, .btn.ink-ghost { border-width: 2px; }

/* (4) Hero "signals" meta row — plain text, no gold tint, no wide tracking. */
.brand-hero .signals span {
  color: rgba(255,255,255,.6);
  letter-spacing: .02em;
  font-weight: 700;
}

/* (5) Cards — solid, assertive top divider instead of a faint hairline. */

.band.dark .card { border-top-color: rgba(255,255,255,.5); }

/* (6) Cut the extreme uppercase tracking that ran across the site. */
h4,
.nav-links a,
.partners-band .partners-eyebrow {
  letter-spacing: .04em;
}

/* ============================================================
   CONTRAST SAFETY PASS
   Transparent hero navigation and alternating light editorial
   surfaces need explicit contrast rules after the type layer.
   ============================================================ */

.site-header.over-hero .brand,
body.theme-light .site-header.over-hero .brand {
  color: #ffffff;
  text-shadow: 0 1px 10px rgba(0,0,0,.72), 0 0 2px rgba(0,0,0,.62);
}

.site-header.over-hero .nav-links a,
body.theme-light .site-header.over-hero .nav-links a,
.site-header.over-hero .nav-trades-toggle,
body.theme-light .site-header.over-hero .nav-trades-toggle {
  color: #ffffff;
  font-weight: 700;
  text-shadow: 0 1px 10px rgba(0,0,0,.78), 0 0 2px rgba(0,0,0,.72);
}

.site-header.over-hero .nav-links a:hover,
.site-header.over-hero .nav-links a[aria-current="page"],
.site-header.over-hero .nav-trades-toggle:hover,
.site-header.over-hero .nav-trades:focus-within .nav-trades-toggle,
.site-header.over-hero .nav-trades.open .nav-trades-toggle,
.site-header.over-hero .nav-trades.is-active .nav-trades-toggle,
body.theme-light .site-header.over-hero .nav-links a:hover,
body.theme-light .site-header.over-hero .nav-links a[aria-current="page"],
body.theme-light .site-header.over-hero .nav-trades-toggle:hover,
body.theme-light .site-header.over-hero .nav-trades:focus-within .nav-trades-toggle,
body.theme-light .site-header.over-hero .nav-trades.open .nav-trades-toggle,
body.theme-light .site-header.over-hero .nav-trades.is-active .nav-trades-toggle {
  color: #ffffff;
}

.site-header.over-hero .nav-cta,
body.theme-light .site-header.over-hero .nav-cta {
  background: rgba(9,9,9,.24);
  border-color: rgba(255,255,255,.84);
  color: #ffffff;
  text-shadow: 0 1px 8px rgba(0,0,0,.72);
  box-shadow: 0 10px 30px rgba(0,0,0,.18);
}

@supports ((backdrop-filter: blur(8px)) or (-webkit-backdrop-filter: blur(8px))) {
  .site-header.over-hero .nav-cta,
  body.theme-light .site-header.over-hero .nav-cta,
  .site-header.over-hero .nav-toggle,
  body.theme-light .site-header.over-hero .nav-toggle {
    -webkit-backdrop-filter: blur(8px);
    backdrop-filter: blur(8px);
  }
}

.site-header.over-hero .nav-toggle,
body.theme-light .site-header.over-hero .nav-toggle {
  background: rgba(9,9,9,.22);
  border-color: rgba(255,255,255,.48);
  box-shadow: 0 10px 30px rgba(0,0,0,.18);
}

.site-header.over-hero .nav-toggle span,
body.theme-light .site-header.over-hero .nav-toggle span {
  box-shadow: 0 1px 5px rgba(0,0,0,.58);
}

.site-header.over-hero .nav-dropdown a,
body.theme-light .site-header.over-hero .nav-dropdown a {
  color: var(--ink-soft);
  font-weight: 600;
  text-shadow: none;
}
.brand-hero.hero-split .hero-amp {
  display: inline-block;
  margin: 0 .08em;
  font-family: var(--font-sans);
  font-weight: 500;
  letter-spacing: 0;
  transform: translateY(-.03em);
}

.site-header.over-hero .nav-dropdown a:hover,
body.theme-light .site-header.over-hero .nav-dropdown a:hover {
  color: var(--ink);
}

body.theme-light .band:not(.dark):not(.nav-dark),
body.theme-light .service-detail,
body.theme-light .partners-band:not(.nav-dark),
body.theme-light .advisor-shell,
body.theme-light .path-card {
  --ink: #171717;
  --ink-soft: #303030;
  --muted: #5d5d5d;
  --line: rgba(17,17,17,.16);
  color: var(--ink-soft);
}

body.home-composed .service-editorial.secbg:nth-of-type(even) {
  --ink: #171717;
  --ink-soft: #303030;
  --muted: #5d554c;
  --line: rgba(17,17,17,.18);
  --line-soft: rgba(17,17,17,.10);
  background-color: #e8e3d8;
  color: var(--ink-soft);
}

body.home-composed .service-editorial.secbg:nth-of-type(even)::before {
  opacity: .72;
  background: linear-gradient(180deg, rgba(246,243,236,.82) 0%, rgba(232,227,216,.70) 52%, rgba(246,243,236,.76) 100%);
  mix-blend-mode: normal;
}

body.home-composed .service-editorial.secbg:nth-of-type(even) .se-copy h3,
body.home-composed .service-editorial.secbg:nth-of-type(even) .se-copy p strong {
  color: var(--ink);
}

body.home-composed .service-editorial.secbg:nth-of-type(even) .se-copy p {
  color: var(--ink-soft);
}

body.home-composed .service-editorial.secbg:nth-of-type(even) .se-copy .service-eyebrow {
  color: #51483f;
}

body.home-composed .service-editorial.secbg:nth-of-type(even) .se-copy .explore.dark {
  color: var(--ink);
  border-color: rgba(17,17,17,.38);
}

body.home-composed .service-editorial.secbg:nth-of-type(even) .se-copy .explore.dark:hover {
  color: #000000;
  border-color: #000000;
}

@media (max-width: 1180px), (max-height: 560px) {
  .site-header.over-hero .nav.nav-open .nav-links a,
  body.theme-light .site-header.over-hero .nav.nav-open .nav-links a,
  .site-header.over-hero .nav.nav-open .nav-dropdown a,
  body.theme-light .site-header.over-hero .nav.nav-open .nav-dropdown a {
    color: var(--ink-soft);
    text-shadow: none;
  }

  .site-header.over-hero .nav.nav-open .nav-links a:hover,
  .site-header.over-hero .nav.nav-open .nav-links a[aria-current="page"],
  body.theme-light .site-header.over-hero .nav.nav-open .nav-links a:hover,
  body.theme-light .site-header.over-hero .nav.nav-open .nav-links a[aria-current="page"] {
    color: var(--ink);
  }
}

/* Homepage service contrast guard.
   The light theme swaps in light service background images, so the homepage
   dark/light rhythm has to be declared by section identity instead of relying
   on section order. */
body.home-composed #roofing.service-editorial.secbg,
body.home-composed #siding.service-editorial.secbg,
body.home-composed #commercial.service-editorial.secbg {
  --ink: #ffffff;
  --ink-soft: #e7e1d6;
  --muted: #c9c0b1;
  --line: rgba(255,255,255,.24);
  --line-soft: rgba(255,255,255,.12);
  background-color: #111111;
  color: var(--ink-soft);
}

body.home-composed #roofing.service-editorial.secbg::before,
body.home-composed #siding.service-editorial.secbg::before,
body.home-composed #commercial.service-editorial.secbg::before {
  opacity: 1;
  background: linear-gradient(180deg, rgba(8,8,8,.78) 0%, rgba(8,8,8,.68) 48%, rgba(8,8,8,.82) 100%);
  mix-blend-mode: normal;
}

body.home-composed #roofing.service-editorial.secbg .se-copy h3,
body.home-composed #siding.service-editorial.secbg .se-copy h3,
body.home-composed #commercial.service-editorial.secbg .se-copy h3,
body.home-composed #roofing.service-editorial.secbg .se-copy p strong,
body.home-composed #siding.service-editorial.secbg .se-copy p strong,
body.home-composed #commercial.service-editorial.secbg .se-copy p strong {
  color: var(--ink);
}

body.home-composed #roofing.service-editorial.secbg .se-copy p,
body.home-composed #siding.service-editorial.secbg .se-copy p,
body.home-composed #commercial.service-editorial.secbg .se-copy p {
  color: var(--ink-soft);
}

body.home-composed #roofing.service-editorial.secbg .se-copy .service-eyebrow,
body.home-composed #siding.service-editorial.secbg .se-copy .service-eyebrow,
body.home-composed #commercial.service-editorial.secbg .se-copy .service-eyebrow {
  color: #d2c7b7;
}

body.home-composed #roofing.service-editorial.secbg .se-copy .explore.dark,
body.home-composed #siding.service-editorial.secbg .se-copy .explore.dark,
body.home-composed #commercial.service-editorial.secbg .se-copy .explore.dark {
  color: var(--ink);
  border-color: rgba(255,255,255,.48);
}

body.home-composed #roofing.service-editorial.secbg .se-copy .explore.dark:hover,
body.home-composed #siding.service-editorial.secbg .se-copy .explore.dark:hover,
body.home-composed #commercial.service-editorial.secbg .se-copy .explore.dark:hover {
  color: #ffffff;
  border-color: #ffffff;
}

body.home-composed #windows-doors.service-editorial.secbg,
body.home-composed #gutters.service-editorial.secbg,
body.home-composed #insurance-claims.service-editorial.secbg {
  --ink: #171717;
  --ink-soft: #303030;
  --muted: #5d554c;
  --line: rgba(17,17,17,.18);
  --line-soft: rgba(17,17,17,.10);
  background-color: #e8e3d8;
  color: var(--ink-soft);
}

body.home-composed #windows-doors.service-editorial.secbg::before,
body.home-composed #gutters.service-editorial.secbg::before,
body.home-composed #insurance-claims.service-editorial.secbg::before {
  opacity: .78;
  background: linear-gradient(180deg, rgba(246,243,236,.84) 0%, rgba(232,227,216,.74) 52%, rgba(246,243,236,.80) 100%);
  mix-blend-mode: normal;
}

body.home-composed #windows-doors.service-editorial.secbg .se-copy h3,
body.home-composed #gutters.service-editorial.secbg .se-copy h3,
body.home-composed #insurance-claims.service-editorial.secbg .se-copy h3,
body.home-composed #windows-doors.service-editorial.secbg .se-copy p strong,
body.home-composed #gutters.service-editorial.secbg .se-copy p strong,
body.home-composed #insurance-claims.service-editorial.secbg .se-copy p strong {
  color: var(--ink);
}

body.home-composed #windows-doors.service-editorial.secbg .se-copy p,
body.home-composed #gutters.service-editorial.secbg .se-copy p,
body.home-composed #insurance-claims.service-editorial.secbg .se-copy p {
  color: var(--ink-soft);
}

body.home-composed #windows-doors.service-editorial.secbg .se-copy .service-eyebrow,
body.home-composed #gutters.service-editorial.secbg .se-copy .service-eyebrow,
body.home-composed #insurance-claims.service-editorial.secbg .se-copy .service-eyebrow {
  color: #51483f;
}

body.home-composed #windows-doors.service-editorial.secbg .se-copy .explore.dark,
body.home-composed #gutters.service-editorial.secbg .se-copy .explore.dark,
body.home-composed #insurance-claims.service-editorial.secbg .se-copy .explore.dark {
  color: var(--ink);
  border-color: rgba(17,17,17,.40);
}

body.home-composed #windows-doors.service-editorial.secbg .se-copy .explore.dark:hover,
body.home-composed #gutters.service-editorial.secbg .se-copy .explore.dark:hover,
body.home-composed #insurance-claims.service-editorial.secbg .se-copy .explore.dark:hover {
  color: #000000;
  border-color: #000000;
}

body.theme-light .band.cream:not(.dark):not(.nav-dark),
body.theme-light .band.soft:not(.dark):not(.nav-dark),
body.theme-light .band.paper:not(.dark):not(.nav-dark) {
  --ink: #171717;
  --ink-soft: #303030;
  --muted: #5d5d5d;
  color: var(--ink-soft);
}

body.theme-light .band.cream:not(.dark):not(.nav-dark) :where(h1,h2,h3,h4,h5,h6,strong,.mat-name,.faq-item summary),
body.theme-light .band.soft:not(.dark):not(.nav-dark) :where(h1,h2,h3,h4,h5,h6,strong,.mat-name,.faq-item summary),
body.theme-light .band.paper:not(.dark):not(.nav-dark) :where(h1,h2,h3,h4,h5,h6,strong,.mat-name,.faq-item summary) {
  color: var(--ink);
}

body.theme-light .band.cream:not(.dark):not(.nav-dark) :where(p,li,dd,td,.section-head p,.card p,.faq-item div.answer,.lede,.body-flow),
body.theme-light .band.soft:not(.dark):not(.nav-dark) :where(p,li,dd,td,.section-head p,.card p,.faq-item div.answer,.lede,.body-flow),
body.theme-light .band.paper:not(.dark):not(.nav-dark) :where(p,li,dd,td,.section-head p,.card p,.faq-item div.answer,.lede,.body-flow) {
  color: var(--ink-soft);
}

/* Under-hero action rows sit on the light hero-rest panel, not on the photo.
   They need dark controls even though the preceding photo hero uses white
   controls for contrast. */
.hero-split .hero-rest .actions .btn,
.hero-split .hero-rest .hero-actions .btn,
body.theme-light .hero-split .hero-rest .actions .btn,
body.theme-light .hero-split .hero-rest .hero-actions .btn {
  background: var(--ink);
  border-color: var(--ink);
  color: var(--paper);
  text-shadow: none;
}

.hero-split .hero-rest .actions .btn:hover,
.hero-split .hero-rest .hero-actions .btn:hover,
body.theme-light .hero-split .hero-rest .actions .btn:hover,
body.theme-light .hero-split .hero-rest .hero-actions .btn:hover {
  background: #000000;
  border-color: #000000;
  color: var(--paper);
}

.hero-split .hero-rest .actions .btn.ghost,
.hero-split .hero-rest .hero-actions .btn.ghost,
.hero-split .hero-rest .actions .btn.ink-ghost,
.hero-split .hero-rest .hero-actions .btn.ink-ghost,
body.theme-light .hero-split .hero-rest .actions .btn.ghost,
body.theme-light .hero-split .hero-rest .hero-actions .btn.ghost,
body.theme-light .hero-split .hero-rest .actions .btn.ink-ghost,
body.theme-light .hero-split .hero-rest .hero-actions .btn.ink-ghost {
  background: transparent;
  border-color: var(--ink);
  color: var(--ink);
  text-shadow: none;
}

.hero-split .hero-rest .actions .btn.ghost:hover,
.hero-split .hero-rest .hero-actions .btn.ghost:hover,
.hero-split .hero-rest .actions .btn.ink-ghost:hover,
.hero-split .hero-rest .hero-actions .btn.ink-ghost:hover,
body.theme-light .hero-split .hero-rest .actions .btn.ghost:hover,
body.theme-light .hero-split .hero-rest .hero-actions .btn.ghost:hover,
body.theme-light .hero-split .hero-rest .actions .btn.ink-ghost:hover,
body.theme-light .hero-split .hero-rest .hero-actions .btn.ink-ghost:hover {
  background: var(--ink);
  border-color: var(--ink);
  color: var(--paper);
}

.hero-split .hero-rest .actions .explore,
.hero-split .hero-rest .hero-actions .explore,
body.theme-light .hero-split .hero-rest .actions .explore,
body.theme-light .hero-split .hero-rest .hero-actions .explore {
  color: var(--ink);
  border-color: rgba(17,17,17,.36);
  text-shadow: none;
}

.hero-split .hero-rest .actions .explore:hover,
.hero-split .hero-rest .hero-actions .explore:hover,
body.theme-light .hero-split .hero-rest .actions .explore:hover,
body.theme-light .hero-split .hero-rest .hero-actions .explore:hover {
  color: #000000;
  border-color: #000000;
}

/* Trades dropdown consistency.
   The header itself changes color over hero, dark, and light sections. The
   opened desktop menu should not inherit those surface colors; otherwise the
   toggle and individual links pick up mixed hover/current highlights. */
@media (min-width: 1181px) and (min-height: 561px) {
  .site-header .nav-trades.open .nav-dropdown {
    --nav-menu-bg: #ededed;
    --nav-menu-text: #2f2f2f;
    --nav-menu-hover: #eeeeee;
    --nav-menu-border: rgba(17,17,17,.16);
    background: var(--nav-menu-bg);
    border-color: var(--nav-menu-border);
    box-shadow: 0 18px 48px rgba(0,0,0,.16);
  }

  .site-header .nav-dropdown a,
  .site-header.over-hero .nav-dropdown a,
  body.theme-light .site-header .nav-dropdown a,
  body.theme-light .site-header.over-hero .nav-dropdown a,
  body.theme-light .site-header.surface-header-dark:not(.over-hero) .nav-dropdown a,
  body.roofing-composed .site-header.roofing-header-dark:not(.over-hero) .nav-dropdown a {
    color: var(--nav-menu-text);
    background: transparent;
    font-weight: 600;
    text-shadow: none;
  }

  .site-header .nav-dropdown a:hover,
  .site-header .nav-dropdown a:focus-visible,
  .site-header.over-hero .nav-dropdown a:hover,
  .site-header.over-hero .nav-dropdown a:focus-visible,
  body.theme-light .site-header .nav-dropdown a:hover,
  body.theme-light .site-header .nav-dropdown a:focus-visible,
  body.theme-light .site-header.over-hero .nav-dropdown a:hover,
  body.theme-light .site-header.over-hero .nav-dropdown a:focus-visible,
  body.theme-light .site-header.surface-header-dark:not(.over-hero) .nav-dropdown a:hover,
  body.theme-light .site-header.surface-header-dark:not(.over-hero) .nav-dropdown a:focus-visible,
  body.roofing-composed .site-header.roofing-header-dark:not(.over-hero) .nav-dropdown a:hover,
  body.roofing-composed .site-header.roofing-header-dark:not(.over-hero) .nav-dropdown a:focus-visible {
    color: var(--nav-menu-text);
    background: var(--nav-menu-hover);
    outline: 0;
  }

  .site-header .nav-dropdown a[aria-current="page"],
  .site-header.over-hero .nav-dropdown a[aria-current="page"],
  body.theme-light .site-header .nav-dropdown a[aria-current="page"],
  body.theme-light .site-header.over-hero .nav-dropdown a[aria-current="page"],
  body.theme-light .site-header.surface-header-dark:not(.over-hero) .nav-dropdown a[aria-current="page"],
  body.roofing-composed .site-header.roofing-header-dark:not(.over-hero) .nav-dropdown a[aria-current="page"] {
    color: var(--nav-menu-text);
    background: transparent;
    box-shadow: inset 2px 0 0 var(--nav-menu-border);
  }

  .site-header:not(.over-hero):not(.surface-header-dark) .nav-trades.open .nav-trades-toggle,
  body.theme-light .site-header:not(.over-hero):not(.surface-header-dark) .nav-trades.open .nav-trades-toggle {
    color: var(--ink-soft);
  }

  .site-header.over-hero .nav-trades.open .nav-trades-toggle,
  body.theme-light .site-header.over-hero .nav-trades.open .nav-trades-toggle {
    color: #ededed;
  }

  body.theme-light .site-header.surface-header-dark:not(.over-hero) .nav-trades.open .nav-trades-toggle,
  body.roofing-composed .site-header.roofing-header-dark:not(.over-hero) .nav-trades.open .nav-trades-toggle {
    color: rgba(237,237,237,.86);
  }
}

/* Final Trades menu correction: no filled hover rows, and no dark inherited
   menu surface in dark-header states. */
@media (min-width: 1181px) and (min-height: 561px) {
  .site-header .nav-trades.open .nav-dropdown,
  .site-header.over-hero .nav-trades.open .nav-dropdown,
  body.theme-light .site-header .nav-trades.open .nav-dropdown,
  body.theme-light .site-header.over-hero .nav-trades.open .nav-dropdown,
  body.theme-light .site-header.surface-header-dark:not(.over-hero) .nav-trades.open .nav-dropdown,
  body.roofing-composed .site-header.roofing-header-dark:not(.over-hero) .nav-trades.open .nav-dropdown {
    --nav-menu-bg: #ededed;
    --nav-menu-text: #2f2f2f;
    --nav-menu-border: rgba(17,17,17,.18);
    background: #ededed !important;
    border-color: var(--nav-menu-border);
    color: var(--nav-menu-text);
  }

  .site-header .nav-trades.open .nav-dropdown a,
  .site-header.over-hero .nav-trades.open .nav-dropdown a,
  body.theme-light .site-header .nav-trades.open .nav-dropdown a,
  body.theme-light .site-header.over-hero .nav-trades.open .nav-dropdown a,
  body.theme-light .site-header.surface-header-dark:not(.over-hero) .nav-trades.open .nav-dropdown a,
  body.roofing-composed .site-header.roofing-header-dark:not(.over-hero) .nav-trades.open .nav-dropdown a {
    background: transparent !important;
    color: var(--nav-menu-text) !important;
    box-shadow: none;
    text-decoration: none;
    text-shadow: none;
  }

  .site-header .nav-trades.open .nav-dropdown a:hover,
  .site-header .nav-trades.open .nav-dropdown a:focus-visible,
  .site-header.over-hero .nav-trades.open .nav-dropdown a:hover,
  .site-header.over-hero .nav-trades.open .nav-dropdown a:focus-visible,
  body.theme-light .site-header .nav-trades.open .nav-dropdown a:hover,
  body.theme-light .site-header .nav-trades.open .nav-dropdown a:focus-visible,
  body.theme-light .site-header.over-hero .nav-trades.open .nav-dropdown a:hover,
  body.theme-light .site-header.over-hero .nav-trades.open .nav-dropdown a:focus-visible,
  body.theme-light .site-header.surface-header-dark:not(.over-hero) .nav-trades.open .nav-dropdown a:hover,
  body.theme-light .site-header.surface-header-dark:not(.over-hero) .nav-trades.open .nav-dropdown a:focus-visible,
  body.roofing-composed .site-header.roofing-header-dark:not(.over-hero) .nav-trades.open .nav-dropdown a:hover,
  body.roofing-composed .site-header.roofing-header-dark:not(.over-hero) .nav-trades.open .nav-dropdown a:focus-visible {
    background: transparent !important;
    color: #111111 !important;
    outline: 0;
    text-decoration: underline;
    text-decoration-color: rgba(17,17,17,.42);
    text-decoration-thickness: 1px;
    text-underline-offset: 5px;
  }

  .site-header .nav-trades.open .nav-dropdown a[aria-current="page"],
  .site-header.over-hero .nav-trades.open .nav-dropdown a[aria-current="page"],
  body.theme-light .site-header .nav-trades.open .nav-dropdown a[aria-current="page"],
  body.theme-light .site-header.over-hero .nav-trades.open .nav-dropdown a[aria-current="page"],
  body.theme-light .site-header.surface-header-dark:not(.over-hero) .nav-trades.open .nav-dropdown a[aria-current="page"],
  body.roofing-composed .site-header.roofing-header-dark:not(.over-hero) .nav-trades.open .nav-dropdown a[aria-current="page"] {
    background: transparent !important;
    color: #111111 !important;
    box-shadow: inset 2px 0 0 var(--nav-menu-border);
    text-decoration: none;
  }
}

/* ============================================================
   OVERSIZED STATEMENT TYPE + SCROLL PARALLAX  (v7)
   Two progressive enhancements, both safe for SEO/no-JS:
   - .mega-statement: big display type used strategically, with
     generous negative space (narrow measure + large margins).
   - [data-parallax] / [data-parallax-x]: transform-only scroll
     "push / pull". JS sets the transform; content stays in normal
     flow, so crawlers and no-JS users see everything in place.
   All motion is disabled under prefers-reduced-motion.
   ============================================================ */

/* --- Oversized statement (opt-in per heading) --- */
.mega-statement,
h1.mega-statement,
h2.mega-statement,
.section-head h2.mega-statement,
.center.section-head h2.mega-statement,
.statement-band h2.mega-statement {
  font-family: var(--font-display);
  font-weight: 800;
  font-size: clamp(40px, 6.6vw, 108px);
  line-height: .96;
  letter-spacing: -0.022em;
  max-width: 18ch;
  text-wrap: balance;
}
.center.section-head h2.mega-statement {
  margin-left: auto;
  margin-right: auto;
}
.roofing-opening .mega-statement {
  margin-left: auto;
  margin-right: auto;
  text-align: center;
}
.proof-opening-statement {
  background: transparent !important;
  text-align: center;
}
.proof-opening-statement .inner {
  max-width: var(--container);
}
.proof-opening-statement .mega-statement {
  margin: 0 auto;
  color: var(--ink);
  text-align: center;
}
/* Strategic breathing room around the big statements. */
.section-head h2.mega-statement { margin-bottom: 8px; }

/* --- Parallax base --- */
[data-parallax],
[data-parallax-x] { will-change: transform; }

/* Hero photo gets a little overscan so vertical parallax never
   exposes an edge. Desktop only; phones keep the static hero. */
@media (min-width: 900px) {
  .brand-hero .bg[data-parallax] {
    height: 120%;
    top: -10%;
  }
}

@media (prefers-reduced-motion: reduce) {
  [data-parallax],
  [data-parallax-x] { transform: none !important; }
  .brand-hero .bg[data-parallax] { height: 100%; top: 0; }
}

/* Homepage service plates: keep the original photographic plates.
   The fixed light theme should not swap these offset image plates to the
   washed-out light variants; only the surrounding section surface changes. */

body.theme-light.home-composed .service-editorial.se-textured.bg-roofing .se-figure::before {
  background-image: url("images/officebg-roofing.jpg?v=2");
  background-image: -webkit-image-set(url("images/officebg-roofing.webp?v=2") type("image/webp"), url("images/officebg-roofing.jpg?v=2") type("image/jpeg"));
  background-image: image-set(url("images/officebg-roofing.webp?v=2") type("image/webp"), url("images/officebg-roofing.jpg?v=2") type("image/jpeg"));
}

body.theme-light.home-composed .service-editorial.se-textured.bg-windows .se-figure::before {
  background-image: url("images/officebg-windows.jpg?v=2");
  background-image: -webkit-image-set(url("images/officebg-windows.webp?v=2") type("image/webp"), url("images/officebg-windows.jpg?v=2") type("image/jpeg"));
  background-image: image-set(url("images/officebg-windows.webp?v=2") type("image/webp"), url("images/officebg-windows.jpg?v=2") type("image/jpeg"));
}

body.theme-light.home-composed .service-editorial.se-textured.bg-siding .se-figure::before {
  background-image: url("images/officebg-siding.jpg?v=2");
  background-image: -webkit-image-set(url("images/officebg-siding.webp?v=2") type("image/webp"), url("images/officebg-siding.jpg?v=2") type("image/jpeg"));
  background-image: image-set(url("images/officebg-siding.webp?v=2") type("image/webp"), url("images/officebg-siding.jpg?v=2") type("image/jpeg"));
}

body.theme-light.home-composed .service-editorial.se-textured.bg-gutters .se-figure::before {
  background-image: url("images/officebg-gutters.jpg?v=2");
  background-image: -webkit-image-set(url("images/officebg-gutters.webp?v=2") type("image/webp"), url("images/officebg-gutters.jpg?v=2") type("image/jpeg"));
  background-image: image-set(url("images/officebg-gutters.webp?v=2") type("image/webp"), url("images/officebg-gutters.jpg?v=2") type("image/jpeg"));
}

body.theme-light.home-composed .service-editorial.se-textured.bg-commercial .se-figure::before {
  background-image: url("images/officebg-commercial.jpg?v=2");
  background-image: -webkit-image-set(url("images/officebg-commercial.webp?v=2") type("image/webp"), url("images/officebg-commercial.jpg?v=2") type("image/jpeg"));
  background-image: image-set(url("images/officebg-commercial.webp?v=2") type("image/webp"), url("images/officebg-commercial.jpg?v=2") type("image/jpeg"));
}

body.theme-light.home-composed .service-editorial.se-textured.bg-insurance .se-figure::before {
  background-image: url("images/officebg-insurance.jpg?v=2");
  background-image: -webkit-image-set(url("images/officebg-insurance.webp?v=2") type("image/webp"), url("images/officebg-insurance.jpg?v=2") type("image/jpeg"));
  background-image: image-set(url("images/officebg-insurance.webp?v=2") type("image/webp"), url("images/officebg-insurance.jpg?v=2") type("image/jpeg"));
}

/* Start page path cards sit on a dark nav section. Later light-card guards set
   dark text variables on .path-card itself, so restate the dark tokens here. */

body.theme-light .article-next-step,
body.theme-light .journal-next-step {
  --ink: #1d1a15;
  --ink-soft: #38332b;
  --muted: #625a4e;
  --line: rgba(29,26,21,.17);
  --line-soft: rgba(29,26,21,.09);
  background: var(--paper);
  color: var(--ink-soft);
}

body.theme-light .article-next-step :where(h1,h2,h3,h4,strong),
body.theme-light .journal-next-step :where(h1,h2,h3,h4,strong) {
  color: var(--ink);
}

body.theme-light .article-next-step :where(p,li),
body.theme-light .journal-next-step :where(p,li) {
  color: var(--ink-soft);
}

body.theme-light .article-next-step .btn,
body.theme-light .journal-next-step .btn {
  background: var(--ink);
  border-color: var(--ink);
  color: var(--paper);
}

body.theme-light section.band.dark.article-next-step,
body.theme-light section.band.dark.journal-next-step {
  --ink: #1d1a15;
  --ink-soft: #38332b;
  --muted: #625a4e;
  --line: rgba(29,26,21,.17);
  background: var(--paper);
  color: var(--ink-soft);
}

body.theme-light section.band.dark.article-next-step :where(h1,h2,h3,h4,strong),
body.theme-light section.band.dark.journal-next-step :where(h1,h2,h3,h4,strong) {
  color: var(--ink) !important;
}

body.theme-light section.band.dark.article-next-step :where(p,li),
body.theme-light section.band.dark.journal-next-step :where(p,li) {
  color: var(--ink-soft) !important;
}

body.theme-light section.band.dark.article-next-step .btn,
body.theme-light section.band.dark.journal-next-step .btn {
  background: var(--ink) !important;
  border-color: var(--ink) !important;
  color: var(--paper) !important;
}

body.theme-light section.band.dark.article-next-step .explore,
body.theme-light section.band.dark.journal-next-step .explore,
body.theme-light .award-band:not(.roofing-dark) .explore {
  color: var(--ink) !important;
  border-color: var(--line) !important;
}

body.theme-light section.band.dark.article-next-step .explore:hover,
body.theme-light section.band.dark.journal-next-step .explore:hover,
body.theme-light .award-band:not(.roofing-dark) .explore:hover {
  color: var(--accent) !important;
  border-color: var(--accent) !important;
}

body.theme-light .band.dark .kicker,
body.theme-light .band.dark .card .kicker,
body.theme-light .nav-dark .kicker,
body.theme-light .nav-dark .card .kicker {
  color: rgba(236,230,216,.76) !important;
}

body.theme-light .review .stars,
body.theme-light .review-summary .stars {
  color: var(--google-gold);
}

body.theme-light.ai-composed main > section.band:not(.dark):not(.nav-dark):not(:nth-of-type(3n)) a {
  color: var(--ink);
}

body.theme-light.ai-composed main > section.band:not(.dark):not(.nav-dark):not(:nth-of-type(3n)) a:hover {
  color: var(--accent);
}

body.roofing-composed .roofing-dark :where(li,dd,td,.body-flow),
body.roofing-composed .roofing-dark .checklist li {
  color: var(--roof-dark-text) !important;
}

body.roofing-composed .roofing-dark .explore.dark {
  color: var(--roof-dark-ink) !important;
  border-color: rgba(236,230,216,.42) !important;
}

body.roofing-composed .roofing-dark .explore.dark:hover {
  color: var(--gold-soft) !important;
  border-color: var(--gold-soft) !important;
}

body.theme-light.article-composed .article-body h3 {
  color: var(--ink) !important;
}

body.theme-light.article-composed .article-body .hero-actions .btn,
body.theme-light.journal-composed .journal-card .btn {
  background: var(--ink) !important;
  border-color: var(--ink) !important;
  color: var(--paper) !important;
}

body.theme-light.article-composed .article-body .hero-actions .explore {
  color: var(--ink) !important;
  border-color: var(--line) !important;
}

body.theme-light.article-composed .article-body .hero-actions .explore:hover {
  color: var(--accent) !important;
  border-color: var(--accent) !important;
}

body.theme-light.ai-composed main > section.band:nth-of-type(3n) a,
body.theme-light.ai-composed main > section.band:nth-of-type(3n) .ai-services li a,
body.theme-light.ai-composed main > section.band:nth-of-type(3n) [style*="color:var(--copper)"] {
  color: rgba(237,237,237,.9) !important;
}

/* Homepage service texture restore.
   Keep the warm-paper system elsewhere, but return the homepage service bands
   to their pre-warm-texture treatment: visible light background textures with
   a lighter veil, not darkened or flattened section plates. */
body.theme-light.home-composed .service-editorial.secbg,
body.theme-light.home-composed #roofing.service-editorial.secbg,
body.theme-light.home-composed #windows-doors.service-editorial.secbg,
body.theme-light.home-composed #siding.service-editorial.secbg,
body.theme-light.home-composed #gutters.service-editorial.secbg,
body.theme-light.home-composed #commercial.service-editorial.secbg,
body.theme-light.home-composed #insurance-claims.service-editorial.secbg {
  --ink: #171717;
  --ink-soft: #303030;
  --muted: #5d554c;
  --line: rgba(17,17,17,.18);
  --line-soft: rgba(17,17,17,.10);
  background-color: #e9e9e9;
  background-size: cover;
  background-position: center;
  background-repeat: no-repeat;
  color: var(--ink-soft);
}

body.theme-light.home-composed .service-editorial.secbg::before,
body.theme-light.home-composed #roofing.service-editorial.secbg::before,
body.theme-light.home-composed #windows-doors.service-editorial.secbg::before,
body.theme-light.home-composed #siding.service-editorial.secbg::before,
body.theme-light.home-composed #gutters.service-editorial.secbg::before,
body.theme-light.home-composed #commercial.service-editorial.secbg::before,
body.theme-light.home-composed #insurance-claims.service-editorial.secbg::before {
  opacity: 1;
  background: linear-gradient(180deg, rgba(248,248,248,.60) 0%, rgba(248,248,248,.46) 52%, rgba(248,248,248,.58) 100%);
  mix-blend-mode: normal;
}

body.theme-light.home-composed #roofing.service-editorial.secbg {
  background-image: url("images/homebg-roofing-light.jpg");
  background-image: -webkit-image-set(url("images/homebg-roofing-light.webp") type("image/webp"), url("images/homebg-roofing-light.jpg") type("image/jpeg"));
  background-image: image-set(url("images/homebg-roofing-light.webp") type("image/webp"), url("images/homebg-roofing-light.jpg") type("image/jpeg"));
}

body.theme-light.home-composed #windows-doors.service-editorial.secbg {
  background-image: url("images/homebg-windows-light.jpg");
  background-image: -webkit-image-set(url("images/homebg-windows-light.webp") type("image/webp"), url("images/homebg-windows-light.jpg") type("image/jpeg"));
  background-image: image-set(url("images/homebg-windows-light.webp") type("image/webp"), url("images/homebg-windows-light.jpg") type("image/jpeg"));
}

body.theme-light.home-composed #siding.service-editorial.secbg {
  background-image: url("images/homebg-siding-light.jpg");
  background-image: -webkit-image-set(url("images/homebg-siding-light.webp") type("image/webp"), url("images/homebg-siding-light.jpg") type("image/jpeg"));
  background-image: image-set(url("images/homebg-siding-light.webp") type("image/webp"), url("images/homebg-siding-light.jpg") type("image/jpeg"));
}

body.theme-light.home-composed #gutters.service-editorial.secbg {
  background-image: url("images/gutter_pattern_light.png");
}

body.theme-light.home-composed #commercial.service-editorial.secbg {
  background-image: url("images/homebg-commercial-light.jpg");
  background-image: -webkit-image-set(url("images/homebg-commercial-light.webp") type("image/webp"), url("images/homebg-commercial-light.jpg") type("image/jpeg"));
  background-image: image-set(url("images/homebg-commercial-light.webp") type("image/webp"), url("images/homebg-commercial-light.jpg") type("image/jpeg"));
}

body.theme-light.home-composed #insurance-claims.service-editorial.secbg {
  background-image: url("images/homebg-insurance-light.jpg");
  background-image: -webkit-image-set(url("images/homebg-insurance-light.webp") type("image/webp"), url("images/homebg-insurance-light.jpg") type("image/jpeg"));
  background-image: image-set(url("images/homebg-insurance-light.webp") type("image/webp"), url("images/homebg-insurance-light.jpg") type("image/jpeg"));
}

body.theme-light.home-composed .service-editorial.secbg .se-copy h3,
body.theme-light.home-composed .service-editorial.secbg .se-copy p strong {
  color: var(--ink);
}

body.theme-light.home-composed .service-editorial.secbg .se-copy p {
  color: var(--ink-soft);
}

body.theme-light.home-composed .service-editorial.secbg .se-copy .service-eyebrow {
  color: var(--copper);
}

body.theme-light.home-composed .service-editorial.secbg .se-copy .explore.dark {
  color: var(--ink);
  border-color: var(--line);
}

body.theme-light.home-composed .service-editorial.secbg .se-copy .explore.dark:hover {
  color: var(--accent);
  border-color: var(--accent);
}

body.theme-light #paths.nav-dark .path-card:hover {
  background: rgba(255,255,255,.075);
}

body.theme-light #paths.nav-dark .path-card h3,
body.theme-light #paths.nav-dark .path-card p strong {
  color: var(--ink);
}

body.theme-light #paths.nav-dark .path-card p {
  color: var(--ink-soft);
}

body.theme-light #paths.nav-dark .path-card .path-num,
body.theme-light #paths.nav-dark .path-card .arrow {
  color: rgba(237,237,237,.68);
  border-color: rgba(237,237,237,.22);
}

body.theme-light #paths.nav-dark .path-card a {
  color: rgba(237,237,237,.86);
  border-color: rgba(237,237,237,.34);
}

/* Hero eyebrows are page labels, not accent decorations. Keep them for context,
   but make them readable over photo heroes instead of copper/gold on dark image. */
.brand-hero .eyebrow,
.subpage-hero .eyebrow,
.hero.hero-split .eyebrow,
.project-hero .eyebrow {
  color: rgba(255,255,255,.82) !important;
  text-shadow: 0 1px 2px rgba(0,0,0,.42), 0 8px 24px rgba(0,0,0,.32);
}

.brand-hero .eyebrow a,
.subpage-hero .eyebrow a,
.hero.hero-split .eyebrow a,
.project-hero .eyebrow a {
  color: inherit !important;
  text-decoration-color: rgba(255,255,255,.48) !important;
}

/* --- Oversized hero statement, single emphasis ---
   One semantic <h1> (full sentence stays in the DOM for crawlers).
   The whole line is set large and uniform; one key phrase is scaled
   up + heavier to pull the eye, the rest stays even. */
.brand-hero h1.hero-statement {
  font-weight: 600;
  font-size: clamp(38px, 5.6vw, 90px);
  line-height: 1.02;
  letter-spacing: -.015em;
  max-width: 16ch;
  text-shadow: 0 1px 2px rgba(0,0,0,.28);
}
.brand-hero h1.hero-statement .hl-emph {
  font-weight: 800;
  font-size: 1.42em;
  letter-spacing: -.03em;
}

/* Trade subpage heroes: same oversized statement treatment. These
   h1s already wrap their key phrase in <em>, so the <em> becomes the
   single emphasized phrase (larger + heavier), the rest stays even. */
.subpage-hero h1.hero-statement {
  font-weight: 600;
  font-size: clamp(34px, 5vw, 82px);
  line-height: 1.04;
  letter-spacing: -.015em;
  max-width: 17ch;
}
.subpage-hero h1.hero-statement em {
  font-style: normal;
  font-weight: 800;
  font-size: 1.3em;
  letter-spacing: -.03em;
  color: inherit;
}

/* Overscan so vertical parallax on the subpage hero photo never
   exposes an edge (desktop only). The gutter hero is bottom-anchored
   with its own framing, so it is intentionally NOT given data-parallax. */
@media (min-width: 900px) {
  .subpage-hero .bg[data-parallax] {
    height: 120%;
    top: -10%;
  }
}
@media (prefers-reduced-motion: reduce) {
  .subpage-hero .bg[data-parallax] { height: 100%; top: 0; }
}

/* Shared warm paper system.
   The roofing page established the warmer light palette; those token values
   now live in :root as the site-wide base (see top of file), and the base
   `body` rule paints --paper / --ink-soft. Dark surfaces opt back into dark
   tokens explicitly. */

body.theme-light .site-header:not(.over-hero):not(.surface-header-dark):not(.roofing-header-dark) {
  /* Match the homepage over-hero frosted scrim so the header reads the same
     on every page. */
  background: rgba(250, 250, 248, 0.62);
  -webkit-backdrop-filter: blur(16px) saturate(108%);
  backdrop-filter: blur(16px) saturate(108%);
  border-bottom-color: transparent;
}

/* These groups intentionally also catch dark-via-:nth-of-type sections
   (which lack a .dark class), pinning their line/token values; the
   ai-composed 3n / dark-panel blocks below re-skin the genuinely dark ones.
   Do not fold these into :root — they participate in that cascade. */
body.theme-light main > section.band:not(.dark):not(.nav-dark),
body.theme-light .service-detail,
body.theme-light .partners-band:not(.nav-dark),
body.theme-light .advisor-shell,
body.theme-light .award-band--cream,
body.theme-light .pp-show,
body.theme-light .city-intro {
  --ink: #1d1a15;
  --ink-soft: #38332b;
  --muted: #625a4e;
  --line: rgba(29,26,21,.17);
  --line-soft: rgba(29,26,21,.09);
  background: var(--paper);
  color: var(--ink-soft);
}

body.theme-light main > section.band.soft:not(.dark):not(.nav-dark),
body.theme-light main > section.band.cream:not(.dark):not(.nav-dark),
body.theme-light main > section.band.paper:not(.dark):not(.nav-dark),
body.theme-light main > section:not(.nav-dark) .path-card,
body.theme-light .city-tile:hover,
body.theme-light.home-composed .service-editorial.secbg:nth-of-type(even) {
  --ink: #1d1a15;
  --ink-soft: #38332b;
  --muted: #625a4e;
  --line: rgba(29,26,21,.17);
  --line-soft: rgba(29,26,21,.09);
  background: var(--soft);
  color: var(--ink-soft);
}

body.theme-light.home-composed .service-editorial.secbg:nth-of-type(even) {
  background-color: var(--soft);
}
body.theme-light.ai-composed main > section.band:nth-of-type(3n) {
  --ink: #ededed;
  --ink-soft: #d6d0c4;
  --muted: #aaa294;
  --line: rgba(237,237,237,.14);
  --line-soft: rgba(237,237,237,.08);
  --soft: rgba(255,255,255,.045);
  background: #14110e !important;
  color: var(--ink-soft) !important;
}

body.theme-light.ai-composed main > section.band:nth-of-type(3n) :where(h1,h2,h3,h4,h5,h6,strong),
body.theme-light.ai-composed main > section.band:nth-of-type(3n) .ai-table td,
body.theme-light.ai-composed main > section.band:nth-of-type(3n) .ai-table td.v {
  color: var(--ink) !important;
}

body.theme-light.ai-composed main > section.band:nth-of-type(3n) :where(p,li,dd,td,.ai-lead,.ai-boilerplate,.ai-wrap p,.ai-wrap li) {
  color: var(--ink-soft) !important;
}

body.theme-light.ai-composed main > section.band:nth-of-type(3n) :where(.ai-table th,.ai-note) {
  color: var(--muted) !important;
}

body.theme-light.ai-composed main > section.band:nth-of-type(3n) :where(a,.ai-services li a) {
  color: rgba(237,237,237,.9) !important;
}

body.theme-light.ai-composed main > section.band:nth-of-type(3n) :where(p,li,dd,td,th,.ai-note,.ai-lead,.ai-boilerplate,.ai-wrap p,.ai-wrap li) {
  color: #d6d0c4 !important;
}

body.theme-light.ai-composed main > section.band:nth-of-type(3n) :where(h1,h2,h3,h4,h5,h6,strong,.ai-table td.v) {
  color: #ededed !important;
}

body.theme-light.ai-composed main > section.band:nth-of-type(3n) :where(a,.ai-services li a,[style*="color:var(--copper)"]) {
  color: #ededed !important;
}

body.theme-light.ai-composed main > section.ai-dark-panel {
  --ink: #ededed;
  --ink-soft: #d6d0c4;
  --muted: #aaa294;
  --line: rgba(237,237,237,.14);
  --line-soft: rgba(237,237,237,.08);
  --soft: rgba(255,255,255,.045);
  background: #14110e !important;
  color: var(--ink-soft) !important;
}

body.theme-light.ai-composed main > section.ai-dark-panel :where(h1,h2,h3,h4,h5,h6,strong,.ai-table td,.ai-table td.v) {
  color: #ededed !important;
}

body.theme-light.ai-composed main > section.ai-dark-panel :where(p,li,dd,th,.ai-note,.ai-lead,.ai-boilerplate,.ai-wrap p,.ai-wrap li) {
  color: #d6d0c4 !important;
}

body.theme-light.ai-composed main > section.ai-dark-panel.ai-cost-scope .ai-num td.v {
  color: #d6d0c4 !important;
}

body.theme-light.ai-composed main > section.ai-dark-panel :where(a,.ai-services li a,[style*="color:var(--copper)"]) {
  color: #ededed !important;
}

body.theme-light .se-figure::before {
  background-color: var(--soft);
  border-color: rgba(29,26,21,.14);
}

body.theme-light .media-split.reverse .se-figure::before,
body.theme-light .service-editorial:nth-of-type(3n) .se-figure::before {
  background-color: #d9d1c0;
  border-color: rgba(97,64,37,.26);
}

@media (min-width: 1181px) and (min-height: 561px) {
  body.theme-light .site-header .nav-trades.open .nav-dropdown,
  body.theme-light .site-header.over-hero .nav-trades.open .nav-dropdown {
    --nav-menu-bg: #ededed;
    --nav-menu-text: #38332b;
    --nav-menu-border: rgba(29,26,21,.18);
    background: #ededed !important;
  }
}

/* Preserve the dark start-page cards after the shared light-card rule above. */
body.theme-light #paths.nav-dark .path-card {
  --ink: #ededed;
  --ink-soft: #d6d0c4;
  --muted: #aaa294;
  --line: rgba(237,237,237,.16);
  background: rgba(255,255,255,.045);
  border-color: var(--line);
  color: var(--ink-soft);
}

/* Homepage service texture depth balance.
   Roofing, siding, and commercial need more plate depth than the lighter
   companion sections, but less contrast than the old dark-mode treatment. */
body.theme-light.home-composed #roofing.service-editorial.secbg,
body.theme-light.home-composed #siding.service-editorial.secbg,
body.theme-light.home-composed #commercial.service-editorial.secbg {
  --ink: #ffffff;
  --ink-soft: #e7e1d6;
  --muted: #c9c0b1;
  --line: rgba(255,255,255,.24);
  --line-soft: rgba(255,255,255,.12);
  background-color: #151412;
  color: var(--ink-soft);
}

body.theme-light.home-composed #roofing.service-editorial.secbg::before,
body.theme-light.home-composed #siding.service-editorial.secbg::before,
body.theme-light.home-composed #commercial.service-editorial.secbg::before {
  opacity: .92;
}

body.theme-light.home-composed #roofing.service-editorial.secbg::after,
body.theme-light.home-composed #siding.service-editorial.secbg::after,
body.theme-light.home-composed #commercial.service-editorial.secbg::after {
  background:
    linear-gradient(180deg, rgba(15,14,13,.64) 0%, rgba(15,14,13,.50) 50%, rgba(15,14,13,.66) 100%);
}

body.theme-light.home-composed #roofing.service-editorial.secbg::before {
  background-image: url("images/homebg-roofing.jpg");
  background-image: -webkit-image-set(url("images/homebg-roofing.webp") type("image/webp"), url("images/homebg-roofing.jpg") type("image/jpeg"));
  background-image: image-set(url("images/homebg-roofing.webp") type("image/webp"), url("images/homebg-roofing.jpg") type("image/jpeg"));
}

body.theme-light.home-composed #siding.service-editorial.secbg::before {
  background-image: url("images/homebg-siding.jpg");
  background-image: -webkit-image-set(url("images/homebg-siding.webp") type("image/webp"), url("images/homebg-siding.jpg") type("image/jpeg"));
  background-image: image-set(url("images/homebg-siding.webp") type("image/webp"), url("images/homebg-siding.jpg") type("image/jpeg"));
}

body.theme-light.home-composed #commercial.service-editorial.secbg::before {
  background-image: url("images/homebg-commercial.jpg");
  background-image: -webkit-image-set(url("images/homebg-commercial.webp") type("image/webp"), url("images/homebg-commercial.jpg") type("image/jpeg"));
  background-image: image-set(url("images/homebg-commercial.webp") type("image/webp"), url("images/homebg-commercial.jpg") type("image/jpeg"));
}

body.theme-light.home-composed #roofing.service-editorial.secbg .service-eyebrow,
body.theme-light.home-composed #siding.service-editorial.secbg .service-eyebrow,
body.theme-light.home-composed #commercial.service-editorial.secbg .service-eyebrow {
  color: #d2c7b7;
}

body.theme-light.home-composed #roofing.service-editorial.secbg .se-copy h3,
body.theme-light.home-composed #roofing.service-editorial.secbg .se-copy p strong,
body.theme-light.home-composed #siding.service-editorial.secbg .se-copy h3,
body.theme-light.home-composed #siding.service-editorial.secbg .se-copy p strong,
body.theme-light.home-composed #commercial.service-editorial.secbg .se-copy h3,
body.theme-light.home-composed #commercial.service-editorial.secbg .se-copy p strong {
  color: var(--ink);
}

body.theme-light.home-composed #roofing.service-editorial.secbg .se-copy p,
body.theme-light.home-composed #siding.service-editorial.secbg .se-copy p,
body.theme-light.home-composed #commercial.service-editorial.secbg .se-copy p {
  color: var(--ink-soft);
}

body.theme-light.home-composed #roofing.service-editorial.secbg .explore.dark,
body.theme-light.home-composed #siding.service-editorial.secbg .explore.dark,
body.theme-light.home-composed #commercial.service-editorial.secbg .explore.dark {
  color: var(--ink);
  border-color: rgba(255,255,255,.48);
}

body.theme-light.home-composed #roofing.service-editorial.secbg .explore.dark:hover,
body.theme-light.home-composed #siding.service-editorial.secbg .explore.dark:hover,
body.theme-light.home-composed #commercial.service-editorial.secbg .explore.dark:hover {
  background: rgba(255,255,255,.96);
  border-color: rgba(255,255,255,.96);
  color: #171717;
}

/* Page-specific visual corrections after removing theme modes. */
body.theme-light.accent-commercial .commercial-opening-plate::before {
  background-color: #2f3234;
  border-color: rgba(29,26,21,.30);
}

body.theme-light.accent-commercial .split.reverse .commercial-opening-plate::before {
  background: #2f3234;
  border-color: rgba(29,26,21,.30);
}

body.theme-light.accent-commercial .commercial-opening-plate::after {
  background:
    linear-gradient(180deg, rgba(8,8,8,0) 56%, rgba(8,8,8,.26) 100%),
    radial-gradient(130% 120% at 12% 8%, rgba(0,0,0,0) 58%, rgba(0,0,0,.18) 100%);
}

body.theme-light.accent-commercial .split.reverse .commercial-opening-plate::after {
  background:
    linear-gradient(180deg, rgba(8,8,8,0) 56%, rgba(8,8,8,.26) 100%),
    radial-gradient(130% 120% at 12% 8%, rgba(0,0,0,0) 58%, rgba(0,0,0,.18) 100%);
}

/* Copy on solid surfaces should stay crisp. Hero text shadows only belong on
   image-backed hero heads, not on the under-hero copy panels or normal bands. */
.hero-split .hero-rest,
.hero-split .hero-rest :where(p,a,li,span,strong,em,h1,h2,h3,h4,h5,h6,.lede,.lead,.eyebrow,.signals) {
  text-shadow: none !important;
}

main > section:not(.brand-hero):not(.subpage-hero):not(.hero):not(.project-hero):not(.service-cine) :where(p,a,li,span,strong,em,h1,h2,h3,h4,h5,h6,.lede,.lead,.eyebrow,.section-head,.card) {
  text-shadow: none !important;
}

.proof-grid .proof-tile,
.proof-grid .proof-cap,
.proof-grid .proof-cap :where(strong, span, em, .proof-note) {
  color: #ffffff !important;
}

.brand-hero .brava-verify-line,
body.theme-light .brand-hero.hero-split .hero-rest .brava-verify-line,
body.theme-light .brand-hero.hero-split .hero-rest > .brava-verify-line {
  color: #111111 !important;
  text-shadow: none !important;
}

.brand-hero .brava-verify-link,
.brand-hero .brava-verify-link:visited,
body.theme-light .brand-hero.hero-split .hero-rest .brava-verify-link,
body.theme-light .brand-hero.hero-split .hero-rest .brava-verify-link:visited {
  color: #111111 !important;
  text-decoration-color: rgba(17,17,17,.58) !important;
  text-shadow: none !important;
}

.brand-hero .brava-verify-link:hover,
.brand-hero .brava-verify-link:focus-visible,
body.theme-light .brand-hero.hero-split .hero-rest .brava-verify-link:hover,
body.theme-light .brand-hero.hero-split .hero-rest .brava-verify-link:focus-visible {
  color: #000000 !important;
  text-decoration-color: #000000 !important;
  text-shadow: none !important;
}

/* Homepage hero video should own the first viewport. The solid under-hero
   panel must not parallax away from the next section and expose video behind it. */
body.home-composed .brand-hero.hero-split {
  --hero-image-height: 100vh;
  background: #0d0d0d;
}

@supports (height: 100svh) {
  body.home-composed .brand-hero.hero-split {
    --hero-image-height: 100svh;
  }
}

body.home-composed .brand-hero.hero-split .bg,
body.home-composed .brand-hero.hero-split .hero-video,
body.home-composed .brand-hero.hero-split .shade {
  height: calc(var(--hero-image-height) + 16vh);
  top: -8vh;
}

body.home-composed .brand-hero.hero-split .hero-head {
  min-height: var(--hero-image-height);
}

body.home-composed .brand-hero.hero-split .hero-rest {
  transform: none !important;
}

/* Homepage opening frame: the short lower reveal makes the end of the video
   unmistakable and exposes the next section as a clear invitation to scroll. */
body.home-composed .brand-hero.hero-split {
  --hero-image-height: calc(100vh - clamp(34px, 5vh, 72px)) !important;
  --hero-frame-stroke: clamp(5px, .55vw, 10px);
  position: relative;
  top: auto;
  z-index: auto;
  overflow: visible;
  border: 0;
  border-radius: 0;
  background: #0d0d0d;
}
body.home-composed .brand-hero.hero-split::before {
  content: "";
  position: absolute;
  inset: 0;
  z-index: 0;
  display: block;
  background: #858585;
  border-radius: 0 0 clamp(28px, 4vw, 58px) clamp(28px, 4vw, 58px);
}
body.home-composed .brand-hero.hero-split .bg,
body.home-composed .brand-hero.hero-split .hero-video,
body.home-composed .brand-hero.hero-split .shade {
  z-index: 1;
  top: 0;
  left: 0;
  right: 0;
  width: 100%;
  height: calc(var(--hero-image-height) - var(--hero-frame-stroke));
  border: 0;
  border-radius: 0 0 clamp(28px, 4vw, 58px) clamp(28px, 4vw, 58px);
  clip-path: inset(0 0 0 0 round 0 0 clamp(28px, 4vw, 58px) clamp(28px, 4vw, 58px));
}
body.home-composed .brand-hero.hero-split::after {
  display: none;
}
body.home-composed #namesake {
  position: relative;
  z-index: 2;
  background: #0d0d0d;
}
@supports (height: 100svh) {
  body.home-composed .brand-hero.hero-split {
    --hero-image-height: calc(100svh - clamp(34px, 5vh, 72px)) !important;
  }
}

@media (max-width: 720px) {
  body.theme-light.home-composed .brand-hero.hero-split .hero-rest {
    --ink: #ededed;
    --ink-soft: #d6d6d6;
    --muted: rgba(237,237,237,.68);
    --line: rgba(237,237,237,.18);
    background: #0d0d0d;
    color: var(--ink-soft);
    border-top-color: rgba(237,237,237,.12);
    box-shadow: 0 0 0 100vmax #0d0d0d;
  }

  body.theme-light.home-composed .brand-hero.hero-split .hero-rest .lede,
  body.theme-light.home-composed .brand-hero.hero-split .hero-rest .signals div {
    color: var(--ink-soft);
  }

  body.theme-light.home-composed .brand-hero.hero-split .hero-rest .signals span {
    color: rgba(237,237,237,.62);
  }

  body.theme-light.home-composed .brand-hero.hero-split .hero-rest .signals strong {
    color: var(--ink);
  }

  body.theme-light.home-composed .brand-hero.hero-split .hero-rest .actions .explore {
    color: var(--ink);
    border-color: rgba(237,237,237,.45);
  }

  body.theme-light.home-composed .brand-hero.hero-split .hero-rest .actions .btn {
    background: #ededed;
    border-color: #ededed;
    color: #111111;
  }

  body.theme-light.home-composed .brand-hero.hero-split .hero-rest .actions .btn:hover {
    background: #ffffff;
    border-color: #ffffff;
    color: #111111;
  }
}

/* Image plate balance pass.
   Keep the offset depth, but move light-section plates into the warm paper
   family so they do not read as harsh slabs against the rest of the page. */
body.theme-light .split .media::before,
body.theme-light .case-study .case-image:not(.gallery)::before,
body.theme-light .se-figure::before {
  background: #ded7c8;
  border-color: rgba(29,26,21,.16);
}

body.theme-light .split.reverse .media::before,
body.theme-light .case-study.reverse .case-image:not(.gallery)::before,
body.theme-light .media-split.reverse .se-figure::before,
body.theme-light .service-editorial:nth-of-type(3n) .se-figure::before {
  background: #e7e0d2;
  border-color: rgba(97,64,37,.22);
}

body.theme-light.accent-commercial .commercial-opening-plate::before,
body.theme-light.accent-commercial .split.reverse .commercial-opening-plate::before {
  background: #d8d0c1;
  border-color: rgba(97,64,37,.20);
}

body.theme-light.accent-commercial .commercial-opening-plate::after,
body.theme-light.accent-commercial .split.reverse .commercial-opening-plate::after {
  background:
    linear-gradient(180deg, rgba(0,0,0,0) 62%, rgba(29,26,21,.14) 100%),
    radial-gradient(130% 120% at 12% 8%, rgba(0,0,0,0) 62%, rgba(29,26,21,.08) 100%);
}

body.roofing-composed .roofing-dark .split .media::before {
  background: #29241d;
  border-color: rgba(247,245,239,.16);
}

body.roofing-composed .roofing-dark .split.reverse .media::before {
  background: #211d18;
  border-color: rgba(196,123,79,.24);
}

body.roofing-composed .award-band.roofing-dark .award-figure::before {
  background: #29241d;
  border-color: rgba(247,245,239,.16);
}

/* Homepage service plates are intentionally fixed to the original photo-backed
   treatment and should not inherit the broader light-page plate balancing. */
body.theme-light.home-composed .service-editorial.se-textured .se-figure::before {
  inset: 26px -26px -26px 26px;
  background-color: #161618;
  background-size: cover;
  background-position: center;
  background-repeat: no-repeat;
  border-color: var(--line);
  opacity: 1;
  filter: none;
}

body.theme-light.home-composed .service-editorial.se-textured .media-split.reverse .se-figure::before {
  inset: 26px 26px -26px -26px;
  border-color: rgba(196,123,79,.30);
}

body.theme-light.home-composed .service-editorial.se-textured:nth-of-type(3n) .se-figure::before {
  border-color: var(--line);
}

body.theme-light.home-composed .service-editorial.se-textured .se-figure::after {
  inset: 26px -26px -26px 26px;
  background: linear-gradient(135deg, rgba(13,13,15,.30), rgba(13,13,15,.55));
  mix-blend-mode: normal;
}

body.theme-light.home-composed .service-editorial.se-textured .media-split.reverse .se-figure::after {
  inset: 26px 26px -26px -26px;
  background: linear-gradient(225deg, rgba(13,13,15,.30), rgba(13,13,15,.55));
}

@media (max-width: 880px) {
  body.theme-light.home-composed .service-editorial.se-textured .se-figure::before,
  body.theme-light.home-composed .service-editorial.se-textured .se-figure::after {
    inset: 12px -12px -12px 12px;
  }

  body.theme-light.home-composed .service-editorial.se-textured .media-split.reverse .se-figure::before,
  body.theme-light.home-composed .service-editorial.se-textured .media-split.reverse .se-figure::after {
    inset: 12px 12px -12px -12px;
  }
}

/* ============================================================
   OVER-HERO HEADER: BENTLEY-STYLE BLUR SCRIM (final override)
   Replaces the transparent header + heavy per-link text-shadow
   with a frosted blur and a subtle top-down dark gradient that
   sits a touch darker than the hero image behind it. This keeps
   the nav legible without the "drop shadow" on the links.
   Appended last so it wins over the earlier cascade.
   ============================================================ */
.site-header.over-hero,
body.theme-light .site-header.over-hero {
  background: rgba(250, 250, 248, 0.62);
  -webkit-backdrop-filter: blur(16px) saturate(108%);
  backdrop-filter: blur(16px) saturate(108%);
  border-bottom: 0;
  border-bottom-color: transparent;
  box-shadow: none;
}

/* Drop the drop-shadow + the forced bold weight: the light scrim
   now carries the contrast, and links should read at normal weight. */
.site-header.over-hero .brand,
.site-header.over-hero .nav-links a,
.site-header.over-hero .nav-trades-toggle,
.site-header.over-hero .nav-cta,
body.theme-light .site-header.over-hero .brand,
body.theme-light .site-header.over-hero .nav-links a,
body.theme-light .site-header.over-hero .nav-trades-toggle,
body.theme-light .site-header.over-hero .nav-cta {
  text-shadow: none;
}
.site-header.over-hero .nav-links a,
.site-header.over-hero .nav-trades-toggle,
body.theme-light .site-header.over-hero .nav-links a,
body.theme-light .site-header.over-hero .nav-trades-toggle {
  font-weight: 400;
}

/* Light frosted band => black text/logo. */
.site-header.over-hero .brand,
.site-header.over-hero .nav-links a,
.site-header.over-hero .nav-trades-toggle,
body.theme-light .site-header.over-hero .brand,
body.theme-light .site-header.over-hero .nav-links a,
body.theme-light .site-header.over-hero .nav-trades-toggle {
  color: #111111;
}
.site-header.over-hero .nav-links a:hover,
.site-header.over-hero .nav-links a[aria-current="page"],
body.theme-light .site-header.over-hero .nav-links a:hover,
body.theme-light .site-header.over-hero .nav-links a[aria-current="page"] {
  color: #000000;
}
/* Black logo on the light band (was inverted to white). */
.site-header.over-hero .brand-logo,
body.theme-light .site-header.over-hero .brand-logo {
  filter: brightness(0);
}
/* Hamburger bars back to dark on the light band. */
.site-header.over-hero .nav-toggle span,
body.theme-light .site-header.over-hero .nav-toggle span {
  background: #111111;
}

/* CTA on the light band: dark outline + dark text. */
.site-header.over-hero .nav-cta,
body.theme-light .site-header.over-hero .nav-cta {
  background: transparent;
  color: #111111;
  border-color: rgba(17, 17, 17, 0.55);
  box-shadow: none;
}
.site-header.over-hero .nav-cta:hover,
body.theme-light .site-header.over-hero .nav-cta:hover {
  background: rgba(17, 17, 17, 0.06);
  border-color: #111111;
  color: #111111;
}

/* ============================================================
   CENTERED SCRIPT NAV MARK
   Malbon-inspired header pass: compact edge navigation, centered
   wordmark, no separate Home item, and the square mark moved to
   the footer.
   ============================================================ */
.site-header .nav {
  max-width: none;
  min-height: 82px;
  padding: 14px clamp(20px, 2.8vw, 46px);
  position: relative;
  gap: clamp(16px, 2vw, 30px);
}

.nav-script-brand {
  position: absolute;
  left: 50%;
  top: 50%;
  z-index: 3;
  display: inline-flex;
  width: clamp(172px, 15vw, 240px);
  max-width: 30vw;
  transform: translate(-50%, -50%);
  align-items: center;
  justify-content: center;
  background: #151515;
  -webkit-mask: url("/assets/images/locke-ladder-script-nav.webp") center / contain no-repeat;
  mask: url("/assets/images/locke-ladder-script-nav.webp") center / contain no-repeat;
}

.nav-script-brand img {
  width: 100%;
  height: auto;
  display: block;
  object-fit: contain;
  opacity: 0;
}

.site-header .nav-links {
  flex: 1 1 auto;
  display: grid;
  grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
  column-gap: clamp(220px, 26vw, 380px);
  align-items: center;
}

.site-header .nav-group {
  display: flex;
  align-items: center;
  gap: clamp(4px, .45vw, 8px);
  min-width: 0;
}

.site-header .nav-group-left { justify-content: flex-start; }
.site-header .nav-group-right { justify-content: flex-end; }

.site-header .nav-links a,
.site-header .nav-trades-toggle {
  white-space: nowrap;
}

.site-header .nav-trades-toggle {
  font-family: var(--font-sans);
  font-size: 16px;
  line-height: 1.25;
  font-weight: 400;
  letter-spacing: .01em;
  text-transform: none;
  min-height: 0;
}

.site-header.over-hero .nav-trades-toggle:hover,
.site-header.over-hero .nav-trades:focus-within .nav-trades-toggle,
.site-header.over-hero .nav-trades.open .nav-trades-toggle,
.site-header.over-hero .nav-trades.is-active .nav-trades-toggle,
body.theme-light .site-header.over-hero .nav-trades-toggle:hover,
body.theme-light .site-header.over-hero .nav-trades:focus-within .nav-trades-toggle,
body.theme-light .site-header.over-hero .nav-trades.open .nav-trades-toggle,
body.theme-light .site-header.over-hero .nav-trades.is-active .nav-trades-toggle {
  color: #111111;
}

.site-header .nav-links a::after {
  display: none;
}

.site-header .nav-cta {
  white-space: nowrap;
}

.schedule-ribbon {
  position: fixed;
  right: 0;
  top: 82px;
  z-index: 140;
  display: flex;
  flex-direction: row;
  align-items: center;
  height: 44px;
  width: auto;
  background: transparent;
  color: #ededed;
  box-shadow: 0 16px 42px rgba(0,0,0,.20);
}

.schedule-ribbon.is-hidden {
  box-shadow: none;
}

.schedule-ribbon-close {
  order: 2;
  flex: 0 0 42px;
  width: 42px;
  height: 44px;
  border: 0;
  border-left: 1px solid rgba(237,237,237,.18);
  background: #111111;
  color: #ededed;
  cursor: pointer;
  font-family: var(--font-sans);
  font-size: 0;
  line-height: 1;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  position: relative;
  z-index: 2;
}

.schedule-ribbon-close::before {
  content: "\2192";
  font-size: 18px;
  line-height: 1;
}

.schedule-ribbon.is-hidden .schedule-ribbon-close::before {
  content: "\2190";
}

.schedule-ribbon-close:hover,
.schedule-ribbon-close:focus-visible {
  background: #111111;
  color: #ededed;
  outline: 0;
}

.schedule-ribbon .nav-cta,
.site-header.over-hero .schedule-ribbon .nav-cta,
body.theme-light .schedule-ribbon .nav-cta,
body.theme-light .site-header.over-hero .schedule-ribbon .nav-cta {
  order: 1;
  width: auto;
  min-height: 44px;
  height: 44px;
  padding: 0 22px;
  border: 0;
  background: #111111;
  color: #ededed;
  box-shadow: none;
  display: flex;
  align-items: center;
  justify-content: center;
  writing-mode: horizontal-tb;
  transform: none;
  text-transform: uppercase;
  letter-spacing: .05em;
  font-weight: 800;
  font-size: 13px;
  line-height: 1;
  text-align: center;
  transition: transform .24s ease, opacity .18s ease;
  will-change: transform;
}

.schedule-ribbon.is-hidden .nav-cta {
  opacity: 0;
  pointer-events: none;
  transform: translateX(100%);
}

.schedule-ribbon .nav-cta:hover,
.site-header.over-hero .schedule-ribbon .nav-cta:hover,
body.theme-light .schedule-ribbon .nav-cta:hover,
body.theme-light .site-header.over-hero .schedule-ribbon .nav-cta:hover {
  background: #111111;
  color: #ededed;
  border: 0;
}

.site-header .schedule-ribbon,
body.theme-light .site-header .schedule-ribbon,
body.theme-light .site-header.surface-header-dark:not(.over-hero) .schedule-ribbon,
body.roofing-composed .site-header.roofing-header-dark:not(.over-hero) .schedule-ribbon {
  background: transparent;
  color: #ededed;
}

.site-header .schedule-ribbon .nav-cta,
.site-header.over-hero .schedule-ribbon .nav-cta,
body.theme-light .site-header .schedule-ribbon .nav-cta,
body.theme-light .site-header.over-hero .schedule-ribbon .nav-cta,
body.theme-light .site-header.surface-header-dark:not(.over-hero) .schedule-ribbon .nav-cta,
body.roofing-composed .site-header.roofing-header-dark:not(.over-hero) .schedule-ribbon .nav-cta {
  background: #111111;
  border: 0;
  color: #ededed;
}

.site-header .schedule-ribbon .nav-cta:hover,
.site-header.over-hero .schedule-ribbon .nav-cta:hover,
body.theme-light .site-header .schedule-ribbon .nav-cta:hover,
body.theme-light .site-header.over-hero .schedule-ribbon .nav-cta:hover,
body.theme-light .site-header.surface-header-dark:not(.over-hero) .schedule-ribbon .nav-cta:hover,
body.roofing-composed .site-header.roofing-header-dark:not(.over-hero) .schedule-ribbon .nav-cta:hover {
  background: #111111;
  border: 0;
  color: #ededed;
}

@media (min-width: 1181px) and (min-height: 561px) {
  .site-header .nav-group-left .nav-dropdown {
    left: 0;
    transform: translateY(6px);
  }

  .site-header .nav-group-left .nav-trades.open .nav-dropdown {
    transform: translateY(2px);
  }
}

body.theme-light .site-header.surface-header-dark:not(.over-hero) .nav-script-brand,
body.roofing-composed .site-header.roofing-header-dark:not(.over-hero) .nav-script-brand {
  background: #fafaf8;
}

body.theme-light .site-header.surface-header-dark:not(.over-hero) .nav-links a,
body.theme-light .site-header.surface-header-dark:not(.over-hero) .nav-trades-toggle,
body.roofing-composed .site-header.roofing-header-dark:not(.over-hero) .nav-links a,
body.roofing-composed .site-header.roofing-header-dark:not(.over-hero) .nav-trades-toggle {
  color: rgba(237,237,237,.86);
}

body.theme-light .site-header.surface-header-dark:not(.over-hero) .nav-links a:hover,
body.theme-light .site-header.surface-header-dark:not(.over-hero) .nav-links a[aria-current="page"],
body.theme-light .site-header.surface-header-dark:not(.over-hero) .nav-trades-toggle:hover,
body.theme-light .site-header.surface-header-dark:not(.over-hero) .nav-trades:focus-within .nav-trades-toggle,
body.theme-light .site-header.surface-header-dark:not(.over-hero) .nav-trades.open .nav-trades-toggle,
body.theme-light .site-header.surface-header-dark:not(.over-hero) .nav-trades.is-active .nav-trades-toggle,
body.roofing-composed .site-header.roofing-header-dark:not(.over-hero) .nav-links a:hover,
body.roofing-composed .site-header.roofing-header-dark:not(.over-hero) .nav-links a[aria-current="page"],
body.roofing-composed .site-header.roofing-header-dark:not(.over-hero) .nav-trades-toggle:hover,
body.roofing-composed .site-header.roofing-header-dark:not(.over-hero) .nav-trades:focus-within .nav-trades-toggle,
body.roofing-composed .site-header.roofing-header-dark:not(.over-hero) .nav-trades.open .nav-trades-toggle,
body.roofing-composed .site-header.roofing-header-dark:not(.over-hero) .nav-trades.is-active .nav-trades-toggle {
  color: #ffffff;
}

.footer-brand-logo {
  width: 86px;
  max-height: none;
  filter: brightness(0) invert(1);
  opacity: .94;
}

@media (min-width: 1181px) and (max-width: 1320px) {
  .site-header .nav {
    padding-inline: 20px;
    gap: 16px;
  }

  .site-header .nav-links {
    column-gap: clamp(190px, 24vw, 310px);
  }

  .site-header .nav-group {
    gap: 4px;
  }

}

@media (max-width: 1180px), (max-height: 560px) {
  .site-header .nav {
    min-height: 72px;
    padding: 10px 18px;
    justify-content: space-between;
  }

  .nav-script-brand {
    width: clamp(112px, 19vw, 160px);
    max-width: 36vw;
  }

  .js .site-header .nav-toggle {
    order: 1;
    display: flex;
  }

  .site-header .nav-script-brand {
    order: 3;
  }

  .site-header .nav-links {
    order: 4;
    position: absolute;
    top: 100%;
    left: 0;
    right: 0;
    display: none;
    grid-template-columns: repeat(2, minmax(0, 1fr));
    gap: 0;
    margin: 0;
    padding: 14px 24px 24px;
    background: rgba(250, 250, 248, .98);
    border-top: 1px solid rgba(17,17,17,.10);
    border-bottom: 1px solid rgba(17,17,17,.14);
    box-shadow: 0 22px 44px rgba(0,0,0,.12);
  }

  .js .site-header .nav.nav-open .nav-links {
    display: grid;
  }

  .site-header .nav-group,
  .site-header .nav-trades,
  .site-header .nav-dropdown {
    display: contents;
  }

  .site-header .nav-trades-toggle,
  .site-header .nav-dropdown::before {
    display: none;
  }

  .site-header .nav-dropdown {
    visibility: visible;
    opacity: 1;
    pointer-events: auto;
  }

  .site-header .nav-links a,
  .site-header.over-hero .nav-links a,
  body.theme-light .site-header .nav-links a,
  body.theme-light .site-header.over-hero .nav-links a,
  .site-header .nav-dropdown a,
  .site-header.over-hero .nav-dropdown a {
    min-height: 54px;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    padding: 15px 8px;
    border-bottom: 1px solid rgba(17,17,17,.10);
    color: #171717;
    background: transparent;
    box-shadow: none;
    text-shadow: none;
    text-decoration: none;
  }

  .schedule-ribbon {
    top: 72px;
    height: 42px;
  }

  .schedule-ribbon-close {
    height: 42px;
  }

  .schedule-ribbon .nav-cta,
  .site-header.over-hero .schedule-ribbon .nav-cta,
  body.theme-light .schedule-ribbon .nav-cta,
  body.theme-light .site-header.over-hero .schedule-ribbon .nav-cta {
    min-height: 42px;
    height: 42px;
  }
}

@media (max-width: 520px) {
  .site-header .nav {
    min-height: 66px;
    padding-inline: 12px;
  }

  .nav-script-brand {
    width: clamp(96px, 29vw, 118px);
  }

  .site-header .nav-links {
    padding-inline: 16px;
  }

  .schedule-ribbon {
    top: 66px;
    height: 40px;
  }

  .schedule-ribbon-close {
    flex-basis: 38px;
    width: 38px;
    height: 40px;
  }

  .schedule-ribbon-close::before {
    font-size: 17px;
  }

  .schedule-ribbon .nav-cta,
  .site-header.over-hero .schedule-ribbon .nav-cta,
  body.theme-light .schedule-ribbon .nav-cta,
  body.theme-light .site-header.over-hero .schedule-ribbon .nav-cta {
    min-height: 40px;
    height: 40px;
    padding: 0 16px;
    font-size: 12px;
  }
}

/* ============ TRADE HERO (Db Journey pattern · 2026-07 handoff) ============
   Light, quiet hero: oversized subject image anchored to one side, real HTML
   copy in the open white space. No text baked into images. Copy defaults to
   lower-left; .trade-hero--copy-right places it center-right for images whose
   subject sits on the left (windows, culture).
   Per-image framing is tuned with CSS vars on the section element:
     --hero-object-position-desktop / --hero-object-position-mobile        */

.trade-hero {
  position: relative;
  min-height: max(100svh, 720px);
  overflow: hidden;
  background: #f7f7f5;
  display: grid;
  align-items: end;
}

.trade-hero__image {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
  object-position: var(--hero-object-position-desktop, center center);
}

.trade-hero__content {
  position: relative;
  z-index: 2;
  max-width: 560px;
  padding: 120px clamp(24px, 6vw, 96px) clamp(48px, 11vh, 140px);
}

.trade-hero--copy-right {
  align-items: center;
  justify-items: end;
}
.trade-hero--copy-right .trade-hero__content {
  padding-bottom: 0;
}
/* Optional per-hero desktop zoom: anchors the image to the right edge and
   oversizes it, pushing a left-side subject further left, away from the copy.
   Set e.g. --hero-zoom-desktop: 114% inline on the section. */
.trade-hero--copy-right .trade-hero__image {
  left: auto;
  right: 0;
  width: var(--hero-zoom-desktop, 100%);
  max-width: none;
}

.trade-hero__kicker {
  margin: 0 0 12px;
  font-family: var(--font-display);
  font-size: 11px;
  line-height: 1;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  font-weight: 700;
  color: #050505;
}

.trade-hero__title {
  margin: 0;
  font-family: var(--font-display);
  font-weight: 400;
  font-size: clamp(36px, 4vw, 64px);
  line-height: 0.98;
  letter-spacing: 0;
  color: #050505;
}
.trade-hero__title em { font-style: normal; color: #6f6a63; }

.trade-hero__body {
  margin: 16px 0 0;
  max-width: 34rem;
  font-size: clamp(15px, 1.1vw, 18px);
  line-height: 1.4;
  color: #333;
}

/* Product-type carousel directly beneath the trade hero: horizontal scroller
   of tall labeled cards (one per product kind), hidden native scrollbar,
   slim centered progress bar. Destined for every trade page. */
.type-carousel {
  background: #f7f7f5;
  padding: clamp(28px, 5vh, 56px) 0 clamp(26px, 4vh, 46px);
}
.tc-scroller {
  display: flex;
  flex-wrap: nowrap;
  gap: 10px;
  overflow-x: auto;
  scroll-behavior: smooth;
  scrollbar-width: none;
  -webkit-overflow-scrolling: touch;
  padding: 0 clamp(24px, 6vw, 96px);
  margin-bottom: 18px;
  cursor: grab; /* invites the grab-and-drag gesture (see setupTypeCarousel) */
}
.tc-scroller::-webkit-scrollbar { display: none; }
/* While dragging: hard cursor + no smooth-scroll lag, and kill selection/ghosting
   so a mouse drag scrolls instead of highlighting text or dragging the image. */
.tc-scroller.is-dragging { cursor: grabbing; scroll-behavior: auto; }
.tc-scroller.is-dragging,
.tc-scroller.is-dragging * { cursor: grabbing; user-select: none; }
.tc-item {
  position: relative;
  flex: 0 0 auto;
  width: clamp(240px, 28vw, 400px);
  aspect-ratio: 2 / 3;
  overflow: hidden;
  background: #14140f;
  text-decoration: none;
  user-select: none;
  -webkit-user-select: none;
}
.tc-item img {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
  object-position: var(--tc-pos, 50% 50%);
  transition: transform 0.6s ease;
  -webkit-user-drag: none;
  user-select: none;
  pointer-events: none; /* the <a> owns the gesture; the image never starts a native drag */
}
.tc-item:hover img,
.tc-item:focus-visible img { transform: scale(1.04); }
.tc-overlay {
  position: absolute;
  left: 0;
  right: 0;
  bottom: 0;
  padding: 44px 20px 18px;
  background: linear-gradient(to top, rgba(0, 0, 0, 0.65), rgba(0, 0, 0, 0));
}
.tc-overlay h3 {
  margin: 0 0 8px;
  font-family: var(--font-display);
  font-weight: 500;
  text-transform: uppercase;
  letter-spacing: 0.02em;
  font-size: clamp(15px, 1.4vw, 22px);
  line-height: 1.2;
  color: #fff;
}
.tc-overlay h3 { margin-bottom: 10px; }
.tc-explore {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-height: 28px;
  padding: 0 14px;
  border-radius: 100px;
  background: #fff;
  color: #14140f;
  font-family: var(--font-display);
  font-size: 10.5px;
  font-weight: 700;
  letter-spacing: 0.04em;
  text-transform: uppercase;
  transition: background 0.25s ease;
}
.tc-item:hover .tc-explore,
.tc-item:focus-visible .tc-explore { background: #ece9e2; }
.tc-scrollbar {
  position: relative;
  width: min(30%, 320px);
  height: 4px;
  margin: 0 auto;
  background: #e4e1da;
  border-radius: 2px;
  cursor: grab;
  touch-action: none; /* we drive the scrub; don't let a bar-drag scroll the page */
}
.tc-scrollbar:active { cursor: grabbing; }
/* Bigger invisible grab target around the 4px groove, without shifting layout.
   Events on it still target .tc-scrollbar, so the scrubber picks them up. */
.tc-scrollbar::before {
  content: "";
  position: absolute;
  left: 0;
  right: 0;
  top: -11px;
  bottom: -11px;
}
.tc-thumb {
  position: absolute;
  top: 0;
  left: 0;
  height: 100%;
  width: 30%;
  background: #14140f;
  border-radius: 2px;
  pointer-events: none; /* let the press fall through to the track/scrubber */
}

/* ===== Storefront: native product/material disclosures =====
   Each product is a real <details>/<summary> element. Product copy is present
   in the initial HTML and every card remains operable when JavaScript is off.
   CSS orders an open panel after its visual card row. */
/* Full-bleed to the viewport edges (html/body use overflow-x:clip). The heading
   above stays inside .band-inner; only the grid breaks out. */
.storefront {
  display: grid;
  grid-template-columns: repeat(4, minmax(0, 1fr));
  column-gap: 2px;
  row-gap: 2px; /* hairline grid: matches column-gap so the drawer opens flush under the row */
  align-items: stretch;
  /* Full-bleed, zoom-safe: body uses CSS zoom (var(--z)) at >=1680px, which
     multiplies vw. Divide the viewport units by --z so this resolves to the
     TRUE viewport width instead of overshooting. */
  width: calc(100vw / var(--z, 1));
  margin-inline: calc(50% - (50vw / var(--z, 1)));
  padding-inline: 14px;
  box-sizing: border-box;
}
@media (max-width: 1200px) { .storefront { grid-template-columns: repeat(3, minmax(0, 1fr)); } }
@media (max-width: 760px)  { .storefront { grid-template-columns: repeat(2, minmax(0, 1fr)); } }

/* Fill partial final rows. <details> uses display:contents below, so grid spans
   belong to its <summary>, which is the visible product tile. */
.storefront { --sf-cards-per-row: 4; }
@media (min-width: 1201px) {
  .storefront:has(> .sf-card:nth-last-child(1 of .sf-card):nth-child(4n + 1 of .sf-card)) > .sf-card:nth-last-child(1 of .sf-card) { --sf-card-aspect: 3 / 1; }
  .storefront:has(> .sf-card:nth-last-child(1 of .sf-card):nth-child(4n + 1 of .sf-card)) > .sf-card:nth-last-child(1 of .sf-card) > .sf-card__summary { grid-column: span 4; }
  .storefront:has(> .sf-card:nth-last-child(1 of .sf-card):nth-child(4n + 2 of .sf-card)) { grid-template-columns: repeat(8, minmax(0, 1fr)); }
  .storefront:has(> .sf-card:nth-last-child(1 of .sf-card):nth-child(4n + 2 of .sf-card)) > .sf-card > .sf-card__summary { grid-column: span 2; }
  .storefront:has(> .sf-card:nth-last-child(1 of .sf-card):nth-child(4n + 2 of .sf-card)) > .sf-card:nth-last-child(-n + 2 of .sf-card) { --sf-card-aspect: 3 / 2; }
  .storefront:has(> .sf-card:nth-last-child(1 of .sf-card):nth-child(4n + 2 of .sf-card)) > .sf-card:nth-last-child(-n + 2 of .sf-card) > .sf-card__summary { grid-column: span 4; }
  .storefront:has(> .sf-card:nth-last-child(1 of .sf-card):nth-child(4n + 3 of .sf-card)) { grid-template-columns: repeat(12, minmax(0, 1fr)); }
  .storefront:has(> .sf-card:nth-last-child(1 of .sf-card):nth-child(4n + 3 of .sf-card)) > .sf-card > .sf-card__summary { grid-column: span 3; }
  .storefront:has(> .sf-card:nth-last-child(1 of .sf-card):nth-child(4n + 3 of .sf-card)) > .sf-card:nth-last-child(-n + 3 of .sf-card) { --sf-card-aspect: 1 / 1; }
  .storefront:has(> .sf-card:nth-last-child(1 of .sf-card):nth-child(4n + 3 of .sf-card)) > .sf-card:nth-last-child(-n + 3 of .sf-card) > .sf-card__summary { grid-column: span 4; }
}
@media (min-width: 761px) and (max-width: 1200px) {
  .storefront { --sf-cards-per-row: 3; }
  .storefront:has(> .sf-card:nth-last-child(1 of .sf-card):nth-child(3n + 1 of .sf-card)) > .sf-card:nth-last-child(1 of .sf-card) { --sf-card-aspect: 9 / 4; }
  .storefront:has(> .sf-card:nth-last-child(1 of .sf-card):nth-child(3n + 1 of .sf-card)) > .sf-card:nth-last-child(1 of .sf-card) > .sf-card__summary { grid-column: span 3; }
  .storefront:has(> .sf-card:nth-last-child(1 of .sf-card):nth-child(3n + 2 of .sf-card)) { grid-template-columns: repeat(6, minmax(0, 1fr)); }
  .storefront:has(> .sf-card:nth-last-child(1 of .sf-card):nth-child(3n + 2 of .sf-card)) > .sf-card > .sf-card__summary { grid-column: span 2; }
  .storefront:has(> .sf-card:nth-last-child(1 of .sf-card):nth-child(3n + 2 of .sf-card)) > .sf-card:nth-last-child(-n + 2 of .sf-card) { --sf-card-aspect: 9 / 8; }
  .storefront:has(> .sf-card:nth-last-child(1 of .sf-card):nth-child(3n + 2 of .sf-card)) > .sf-card:nth-last-child(-n + 2 of .sf-card) > .sf-card__summary { grid-column: span 3; }
}
@media (max-width: 760px) {
  .storefront { --sf-cards-per-row: 2; }
  .storefront:has(> .sf-card:nth-last-child(1 of .sf-card):nth-child(2n + 1 of .sf-card)) > .sf-card:nth-last-child(1 of .sf-card) { --sf-card-aspect: 3 / 2; }
  .storefront:has(> .sf-card:nth-last-child(1 of .sf-card):nth-child(2n + 1 of .sf-card)) > .sf-card:nth-last-child(1 of .sf-card) > .sf-card__summary { grid-column: span 2; }
}
.sf-card {
  display: contents;
  --sf-row: 1;
}
/* Chromium exposes the disclosure body through this pseudo-element. Flatten it
   too so a closed native details body never consumes an empty grid cell. */
.sf-card::details-content { display: contents; }
@media (min-width: 1201px) {
  .storefront > .sf-card:nth-child(n + 5):nth-child(-n + 8) { --sf-row: 2; }
  .storefront > .sf-card:nth-child(n + 9):nth-child(-n + 12) { --sf-row: 3; }
  .storefront > .sf-card:nth-child(n + 13):nth-child(-n + 16) { --sf-row: 4; }
  .storefront > .sf-card:nth-child(n + 17):nth-child(-n + 20) { --sf-row: 5; }
}
@media (min-width: 761px) and (max-width: 1200px) {
  .storefront > .sf-card:nth-child(n + 4):nth-child(-n + 6) { --sf-row: 2; }
  .storefront > .sf-card:nth-child(n + 7):nth-child(-n + 9) { --sf-row: 3; }
  .storefront > .sf-card:nth-child(n + 10):nth-child(-n + 12) { --sf-row: 4; }
  .storefront > .sf-card:nth-child(n + 13):nth-child(-n + 15) { --sf-row: 5; }
  .storefront > .sf-card:nth-child(n + 16):nth-child(-n + 18) { --sf-row: 6; }
}
@media (max-width: 760px) {
  .storefront > .sf-card:nth-child(n + 3):nth-child(-n + 4) { --sf-row: 2; }
  .storefront > .sf-card:nth-child(n + 5):nth-child(-n + 6) { --sf-row: 3; }
  .storefront > .sf-card:nth-child(n + 7):nth-child(-n + 8) { --sf-row: 4; }
  .storefront > .sf-card:nth-child(n + 9):nth-child(-n + 10) { --sf-row: 5; }
  .storefront > .sf-card:nth-child(n + 11):nth-child(-n + 12) { --sf-row: 6; }
  .storefront > .sf-card:nth-child(n + 13):nth-child(-n + 14) { --sf-row: 7; }
  .storefront > .sf-card:nth-child(n + 15):nth-child(-n + 16) { --sf-row: 8; }
  .storefront > .sf-card:nth-child(n + 17):nth-child(-n + 18) { --sf-row: 9; }
}
.sf-card__summary {
  position: relative;
  display: flex;
  flex-direction: column;
  background: transparent;
  overflow: hidden;
  scroll-margin-top: 120px;
  cursor: pointer;
  list-style: none;
  order: calc((var(--sf-row) * 2) - 1);
}
.sf-card__summary::marker { content: ""; }
.sf-card__summary::-webkit-details-marker { display: none; }
.sf-card__summary:focus-visible { outline: 3px solid var(--accent); outline-offset: -3px; z-index: 4; }
.sf-card__media {
  position: relative;
  display: block;
  aspect-ratio: var(--sf-card-aspect, 3 / 4); /* final rows widen without growing taller */
  overflow: hidden;
  background: #eeecea;
}
.sf-card__media img {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
  transition: transform 0.6s ease;
}
.sf-card__summary:hover .sf-card__media img { transform: scale(1.045); }
/* Label overlaid on the photo so each card is one self-contained retail tile.
   Absolutely positioned, so card height is driven purely by the media aspect-ratio
   and every tile stays exactly the same size. */
.sf-card__head {
  position: absolute;
  inset: auto 0 0 0;
  z-index: 2;
  display: flex;
  flex-direction: column; /* name over tag, left-aligned; pill sits in the reserved right gutter */
  align-items: flex-start;
  justify-content: flex-end;
  gap: 4px;
  padding: 44px 128px 14px 13px; /* right pad reserves the bottom-right corner for the pill */
  box-sizing: border-box;
  background: linear-gradient(to top, rgba(12, 12, 8, 0.78) 0%, rgba(12, 12, 8, 0.42) 42%, rgba(12, 12, 8, 0) 100%);
  pointer-events: none; /* nothing interactive here — let the photo take the hover */
}
.sf-card__name {
  margin: 0;
  font-family: var(--font-display);
  font-weight: 500;
  text-transform: uppercase;
  letter-spacing: 0.02em;
  font-size: clamp(13px, 1vw, 15px);
  line-height: 1.2;
  /* This ARIA heading is an on-photo label, so it must stay white. */
  color: #fff !important;
  text-shadow: 0 1px 10px rgba(0, 0, 0, 0.35);
  display: -webkit-box;
  -webkit-line-clamp: 2; /* keep long names from pushing the card taller */
  line-clamp: 2;
  -webkit-box-orient: vertical;
  overflow: hidden;
}
.sf-card__tag {
  font-size: 10.5px;
  letter-spacing: 0.02em;
  color: rgba(255, 255, 255, 0.82);
  text-shadow: 0 1px 10px rgba(0, 0, 0, 0.35);
  white-space: nowrap;
}
/* Learn-more pill overlaid on the photo (bottom-right) — in the label's scrim, clear of the name. */
.sf-card__more {
  position: absolute;
  right: 12px;
  bottom: 12px;
  z-index: 3;
  display: inline-flex;
  align-items: center;
  gap: 7px;
  min-height: 30px;
  padding: 0 14px;
  border: 0;
  border-radius: 100px;
  background: #fff;
  color: #14140f;
  font-family: var(--font-display);
  font-size: 10px;
  font-weight: 700;
  letter-spacing: 0.04em;
  text-transform: uppercase;
  cursor: pointer;
  box-shadow: 0 2px 10px rgba(0, 0, 0, 0.18);
  transition: background 0.2s ease, color 0.2s ease;
}
.sf-card__more:hover { background: #f2f0ea; }
.sf-card[open] .sf-card__more {
  background: #14140f;
  color: #fff;
}
.sf-chev {
  width: 12px;
  height: 12px;
  transition: transform 0.3s ease;
}
.sf-card[open] .sf-chev { transform: rotate(180deg); }
/* Narrow tiles: collapse the pill to a compact chevron so it never crowds the name. */
@media (max-width: 760px) {
  .sf-card__more span { display: none; }
  .sf-card__more {
    padding: 0;
    width: 34px;
    min-width: 34px;
    justify-content: center;
    gap: 0;
  }
  .sf-card__head { padding-right: 58px; }
}
/* Native disclosure panel. Closed state comes from <details>; the explicit
   selectors make the fallback deterministic in every browser. */
.sf-card:not([open]) > .sf-panel { display: none; }
.sf-card[open] > .sf-panel {
  display: grid;
  grid-column: 1 / -1;
  grid-template-rows: 1fr;
  order: calc(var(--sf-row) * 2);
  animation: sf-panel-in 0.28s ease both;
}
@keyframes sf-panel-in {
  from { opacity: 0; transform: translateY(-6px); }
  to { opacity: 1; transform: translateY(0); }
}
@media (prefers-reduced-motion: reduce) {
  .sf-card[open] > .sf-panel { animation: none; }
}
.sf-panel__inner { overflow: hidden; }
.sf-panel__pad {
  padding: 26px clamp(14px, 2vw, 34px) 30px;
  border-block: 1px solid #ddd9d0;
  background: #f4f2ee;
}
.sf-panel__pad > *:first-child { margin-top: 0; }
.sf-panel__pad p {
  margin: 10px 0 0;
  max-width: 68ch;
  font-size: 14px;
  line-height: 1.65;
  color: #45433d;
}
.sf-panel__pad .sf-sub {
  margin-top: 20px;
  font-family: var(--font-display);
  font-size: 10.5px;
  font-weight: 700;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  color: #8a8578;
}
.sf-panel__pad .sf-panel-link {
  color: #26251f;
  font-family: var(--font-sans);
  font-size: 11px;
  font-weight: 700;
  letter-spacing: .16em;
  text-transform: uppercase;
  text-decoration: none;
  border-bottom: 1px solid currentColor;
}

.trade-hero__actions {
  display: flex;
  gap: 10px;
  flex-wrap: wrap;
  margin-top: 28px;
}

.trade-hero__button {
  min-height: 42px;
  padding: 0 18px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  border-radius: 6px;
  background: #050505;
  color: #fff;
  font-family: var(--font-display);
  font-size: 13px;
  font-weight: 700;
  text-decoration: none;
}
.trade-hero__button:hover { background: #2b2b2b; }

.trade-hero__button--secondary {
  background: transparent;
  color: #050505;
  border: 1px solid currentColor;
}
.trade-hero__button--secondary:hover { background: rgba(5,5,5,.06); }

.trade-hero__button:focus-visible {
  outline: 2px solid #050505;
  outline-offset: 3px;
}

/* Copy-right heroes (subject on the left) run out of quiet space sooner, so
   they switch to the stacked layout below 1100px. */
@media (max-width: 1099px) {
  .trade-hero--copy-right {
    min-height: 100svh;
    display: flex;
    flex-direction: column;
    align-items: stretch;
  }

  .trade-hero--copy-right picture {
    display: block;
    position: relative;
    flex: 1 1 auto;
    min-height: 46svh;
  }

  .trade-hero--copy-right .trade-hero__image {
    left: 0;
    right: 0;
    width: 100%;
    max-width: 100%;
    object-position: var(--hero-object-position-mobile, center center);
  }

  .trade-hero--copy-right .trade-hero__content {
    flex: 0 0 auto;
    max-width: 100%;
    padding: 26px 22px max(42px, calc(24px + env(safe-area-inset-bottom)));
  }
}

@media (max-width: 767px) {
  /* Full-bleed mobile hero, matching the site's other heroes: image fills the
     viewport, copy overlays the lower area. Per-image framing comes from
     --hero-object-position-mobile. */
  .trade-hero,
  .trade-hero--copy-right {
    min-height: 100svh;
    display: grid;
    align-items: end;
    justify-items: start;
  }

  .trade-hero picture,
  .trade-hero--copy-right picture {
    display: contents;
  }

  .trade-hero__image,
  .trade-hero--copy-right .trade-hero__image {
    left: 0;
    right: 0;
    width: 100%;
    max-width: none;
    object-position: var(--hero-object-position-mobile, center center);
  }

  /* Soft paper fade (not a dark gradient) so the copy stays legible over any
     crop without regrading the photography. */
  .trade-hero::after {
    content: "";
    position: absolute;
    left: 0;
    right: 0;
    bottom: 0;
    height: 46%;
    background: linear-gradient(0deg, rgba(247,247,245,.94) 0%, rgba(247,247,245,.72) 55%, rgba(247,247,245,0) 100%);
    pointer-events: none;
    z-index: 1;
  }

  .trade-hero__content,
  .trade-hero--copy-right .trade-hero__content {
    max-width: min(100%, 400px);
    padding: 96px 22px max(42px, calc(24px + env(safe-area-inset-bottom)));
  }

  .trade-hero__title {
    font-size: clamp(34px, 10.5vw, 46px);
  }
}

/* ============ TEAM ROSTER GALLERY (staggered columns · hover reveal) ============
   Staircase column offsets + per-column scroll drift are applied by site.js
   ([data-roster-parallax]). Hover cross-fades the color image over the
   grayscale base. */
.roster-grid {
  display: grid;
  grid-template-columns: repeat(4, minmax(0, 1fr));
  gap: clamp(18px, 2.2vw, 30px);
  padding-bottom: 160px; /* breathing room for the scroll drift */
  margin-top: 56px;
}
@media (max-width: 1000px) { .roster-grid { grid-template-columns: repeat(3, 1fr); padding-bottom: 140px; } }
@media (max-width: 720px) { .roster-grid { grid-template-columns: repeat(2, 1fr); padding-bottom: 90px; } }
@media (max-width: 440px) { .roster-grid { grid-template-columns: 1fr; padding-bottom: 0; } }

.roster-card {
  transition: border-color .6s ease;
  will-change: transform;
}

.roster-frame {
  position: relative;
  aspect-ratio: 4 / 5;
  overflow: hidden;
}
.roster-photo {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
}
.roster-photo.is-base { filter: grayscale(1) contrast(1.02); }
/* Color image floods down from the top with a curved leading edge.
   The image itself stays perfectly still — only the clip moves. */
.roster-photo.is-reveal {
  clip-path: ellipse(100% 0% at 50% 0%);
  transition: clip-path .75s cubic-bezier(.65, .05, 0, 1);
}
.roster-card:hover .roster-photo.is-reveal,
.roster-card:focus-within .roster-photo.is-reveal {
  clip-path: ellipse(100% 120% at 50% 0%);
}
@media (hover: none) {
  .roster-photo.is-reveal { clip-path: ellipse(100% 120% at 50% 0%); }
}

.roster-monogram {
  position: absolute;
  inset: 0;
  display: flex;
  align-items: center;
  justify-content: center;
  background: var(--soft);
  font-family: var(--font-display);
  font-weight: 500;
  font-size: 40px;
  letter-spacing: -0.02em;
  color: var(--copper);
}

.roster-name {
  margin: 14px 2px 2px;
  text-align: right;
  font-family: var(--font-display);
  font-weight: 600;
  font-size: 11px;
  line-height: 1.2;
  letter-spacing: .09em;
  text-transform: uppercase;
  color: var(--muted);
  transition: color .6s ease;
}
.roster-card:hover .roster-name { color: var(--ink); }

@media (prefers-reduced-motion: reduce) {
  .roster-photo.is-reveal { transition: none; }
}

/* Variant for images whose subject runs to the top of the frame (siding,
   windows): shifts the image down so the fixed nav doesn't cover the product. */
.trade-hero--image-below-nav .trade-hero__image {
  top: 56px;
}

@media (min-width: 768px) and (max-width: 1099px) {
  .trade-hero--copy-right.trade-hero--image-below-nav picture {
    margin-top: 56px;
  }
  .trade-hero--copy-right.trade-hero--image-below-nav .trade-hero__image {
    top: 0;
  }
}

@media (max-width: 767px) {
  .trade-hero--image-below-nav .trade-hero__image {
    top: 42px;
  }
}

/* ============================================================
   LARGE-SCREEN PROPORTIONAL SCALING
   The design system is built on fixed px sizes around a 1380px
   container, tuned for ~1440px viewports. On wider screens the
   layout used to sit small in the middle with dead margins.
   CSS `zoom` on <body> scales the whole px-based layout (type,
   spacing, images) proportionally. Media queries still evaluate
   against real viewport px, so mobile/tablet breakpoints are
   unaffected. Browsers without zoom support keep today's layout.

   IMPORTANT: zoom also multiplies viewport units (vh/svh/vw),
   so anything sized to the real screen (full-height heroes, the
   vw-proportioned project-proof carousel) would overshoot by the
   zoom factor. The compensation block below divides those rules
   by --z so they keep resolving to the true viewport.

   Steps keep the 1380px container at ~88-93% of the effective
   viewport, matching how it fills a 1440px screen.
   ============================================================ */
/* STANDARD-SCALING MIGRATION (2026-07-23): the whole-page `body { zoom }` hack
   was removed. It magnified the fixed-px 1380 design on wide screens, but zoom
   also multiplied vh/svh/vw, so every full-height section overshot unless it was
   hand-compensated with ÷var(--z) — and Chrome/Safari resolved that differently,
   which is what cut the faces (and other bands) off at large sizes. --z is now
   pinned to 1 at every width, so all the calc(100svh / var(--z)) rules below
   collapse to plain 100svh and viewport units mean one true screen in every
   browser. Big-screen scale is now handled the standard way (fluid clamp() type
   + max-width container) instead of magnification. */
:root { --z: 1; }

@media (min-width: 1680px) {

  /* --- viewport-unit compensation (÷ --z restores true screen size) --- */

  /* Full/partial-height heroes and bands */
  .brand-hero { min-height: calc(100vh / var(--z)); }
  .hero { min-height: calc(78vh / var(--z)); }
  .subpage-hero { min-height: calc(78vh / var(--z)); }
  .service-section { min-height: calc(88vh / var(--z)); }
  .service-cine { min-height: calc(64vh / var(--z)); }
  .manifesto-feature { min-height: clamp(560px, calc(88vh / var(--z)), 860px); }
  .photo-break > img,
  .ed-plate img { height: auto; }
  .trade-hero { min-height: max(calc(100svh / var(--z)), 720px); }
  /* Homepage brand-split (the flanking portraits): its 100svh was NOT being
     divided by --z, so body zoom rendered the section 1.25–1.6× taller than a
     true screen. The portraits anchor to the section's bottom edge, so that
     overshoot pushed the faces below the fold (worse the wider the screen, and
     worse in Safari, which resolves zoomed viewport units differently). Keep it
     exactly one true viewport tall so the faces stay framed in both engines. */
  .brand-split { min-height: calc(100svh / var(--z)); }

  /* Split heroes driven by --hero-image-height */
  .hero-split { --hero-image-height: calc(100vh / var(--z)); }
  .hero-split[style*="min-height:52vh"] {
    --hero-image-height: calc(52vh / var(--z));
    min-height: calc(52vh / var(--z)) !important; /* beats the inline style */
  }
  body.home-composed .brand-hero.hero-split { --hero-image-height: calc(100vh / var(--z)); }
  @supports (height: 100svh) {
    body.home-composed .brand-hero.hero-split { --hero-image-height: calc(100svh / var(--z)); }
  }
  body.home-composed .brand-hero.hero-split .shade {
    height: calc(var(--hero-image-height) + (16vh / var(--z)));
    top: calc(-8vh / var(--z));
  }

  /* Commercial scrollytelling (pinned full-screen stage) */
  .commercial-sketch-reveal .commercial-hero-pin {
    height: calc(100svh / var(--z));
    min-height: calc(100svh / var(--z));
  }
  .commercial-sketch-reveal .shade { height: calc(100svh / var(--z)); }
  .commercial-sketch-reveal .hero-head { min-height: calc(100svh / var(--z)); }
  .commercial-sketch-reveal .commercial-hero-scroll-space { height: calc(150svh / var(--z)); }

  /* Project-proof carousel: keep its vw proportions true to the screen */
  .pp-slide { flex-basis: calc(53.8vw / var(--z)); }
  .pp-slide .pp-img { height: calc(min(39.5vw, 72vh) / var(--z)); }
  .pp-slide > img { height: calc(min(39.5vw, 72vh) / var(--z)); }
  .proof-page .proof-carousel-hero .pp-frame { width: calc(53.8vw / var(--z)); }
  .proof-page .proof-carousel-hero .pp-peek {
    --pp-peek-slide-width: calc(53.8vw / var(--z));
    width: calc(8vw / var(--z));
    height: calc(min(39.5vw, 72vh) / var(--z));
  }
  .pp-panel { left: calc(53.8vw / var(--z)); right: calc(8vw / var(--z)); }
  .pp-dots { width: calc(53.8vw / var(--z)); }
}

/* ============================================================
   STAGE 2 — STANDARD FLUID FILL (2026-07-23, now SITE-WIDE)
   Replaces the deleted body-zoom magnification with the standard,
   bounded approach: on wide screens the content container widens and
   the display type scales UP — but every value is a clamp() with a
   floor and ceiling, so it can never break at any size, and it only
   engages at >=1680px so the common <=1600px layout is untouched.
   Rolled out from homepage-only to every page (2026-07-23) once the
   homepage feel was approved; hero selectors cover all hero types
   (.brand-hero home; .subpage-hero/.hero-inner/.city-intro subpages;
   .service-cine service pages). Text blocks keep their own max-width
   caps (.body-flow 760, .service-copy 780…) so widening the container
   never over-runs reading lines. Values are dialled to taste.
   ============================================================ */
@media (min-width: 1680px) {
  /* Width: content column grows with the screen (up to ~2000) so it keeps
     pace with the full-bleed media and doesn't read as a lost island. */
  :root { --container: min(92vw, 2000px); }

  /* Display type: ceilings lifted so headings fill big screens. */
  .brand-hero h1 { font-size: clamp(76px, 5vw, 108px); }
  .subpage-hero h1, .hero-inner h1, .city-intro h1 { font-size: clamp(64px, 4.4vw, 92px); }
  .trade-hero__title { font-size: clamp(64px, 4.2vw, 88px); }
  .privacy-hero h1 { font-size: clamp(88px, 4vw, 104px); }
  .service-cine h3 { font-size: clamp(58px, 3.8vw, 82px); }
  h2 { font-size: clamp(48px, 3.4vw, 68px); }
  .brand-hero .lede, .subpage-hero .lede, .hero-inner p.lead { font-size: clamp(19px, 1.35vw, 26px); }
  .bs-manifesto { font-size: clamp(42px, 3vw, 60px); }
  .intro-statement p { font-size: clamp(27px, 1.75vw, 36px); }

  /* Body copy: a gentle lift so paragraphs don't read tiny beside the
     larger headings on big monitors (text stays width-capped for reading). */
  .body-flow,
  .service-detail .service-copy p,
  .service-entry .service-copy p,
  .case-study .case-body p { font-size: clamp(17px, 1.05vw, 20px); }
}

/* ---- Ultra-wide tier (>=2560: 4K / ultrawide) ----
   Display type keeps growing so it commands the extra width instead of
   floating small in a big field ("spread out"). Still bounded. Site-wide. */
@media (min-width: 2560px) {
  .brand-hero h1 { font-size: clamp(108px, 4.4vw, 140px); }
  .subpage-hero h1, .hero-inner h1, .city-intro h1 { font-size: clamp(92px, 3.8vw, 116px); }
  .trade-hero__title { font-size: clamp(88px, 3.4vw, 112px); }
  .privacy-hero h1 { font-size: clamp(104px, 3.2vw, 120px); }
  .service-cine h3 { font-size: clamp(82px, 3.2vw, 104px); }
  h2 { font-size: clamp(68px, 3vw, 88px); }
  .brand-hero .lede, .subpage-hero .lede, .hero-inner p.lead { font-size: clamp(26px, 1.2vw, 32px); }
  .bs-manifesto { font-size: clamp(60px, 2.7vw, 78px); }
  .intro-statement p { font-size: clamp(36px, 1.6vw, 44px); }
  .body-flow,
  .service-detail .service-copy p,
  .service-entry .service-copy p,
  .case-study .case-body p { font-size: clamp(20px, 0.95vw, 24px); }
}

/* NOTE: a hard shell cap (max-width on main) was tried and removed — it put dead
   margins beside the full-bleed hero on >2560 screens, which read as the hero
   being "cut off". Full-bleed media must FILL the screen. "Spread out" is instead
   addressed by pushing the fluid content/type scale further on very wide screens
   (below) so the content keeps pace with the width and doesn't feel sparse. */

/* ============================================================
   HOMEPAGE DE-TEMPLATE PASS (v21.33) — scoped to body.home-composed
   Kills decorative hairlines, retires tiny-caps eyebrows, un-boxes
   sections. Separation now comes from scale, whitespace, and the
   existing band color changes instead of 1px rules. Interactive
   separators (FAQ rows) are kept. Other pages are unaffected.
   ============================================================ */

/* ---- Hero signals: no rule line, slightly larger fine print ---- */
body.home-composed .brand-hero .signals { border-top: 0; padding-top: 0; margin-top: 56px; }
body.home-composed .brand-hero .signals div { font-size: 14px; max-width: 230px; }
body.home-composed .brand-hero .signals strong { font-size: 24px; margin-bottom: 4px; }
body.home-composed .brand-hero .signals span { font-size: 11px; letter-spacing: .16em; }

/* ---- Intro statement: band change is the separator ---- */
body.home-composed .intro-statement { border-bottom: 0; }

/* ---- Service editorials: eyebrow becomes a display-face label ---- */
body.home-composed .se-copy .service-eyebrow {
  font-family: var(--font-display);
  font-size: clamp(20px, 1.8vw, 25px);
  font-weight: 500;
  letter-spacing: 0;
  text-transform: none;
}
body.home-composed .se-figure figcaption,
body.home-composed .founder-figure figcaption {
  font-size: 13px;
  letter-spacing: .14em;
}

/* ---- Crew photos: no photo borders, larger captions ---- */
body.home-composed .crew-feature img,
body.home-composed .crew-strip img { border: 0; }
body.home-composed .crew-feature figcaption,
body.home-composed .crew-strip figcaption { font-size: 13px; letter-spacing: .14em; }

/* ---- Cost rows: the numbers carry the table, not the rules ---- */
body.home-composed .cost-rows { border-top: 0; margin-top: 0; }
body.home-composed .cost-row { border-bottom: 0; padding: 20px 0; }
body.home-composed .cost-row { grid-template-columns: minmax(0, 1fr) auto; }
body.home-composed .cost-row .c-median { font-size: clamp(28px, 3vw, 40px); }
body.home-composed .cost-row .c-n {
  font-size: 13px;
  letter-spacing: .03em;
  text-transform: none;
  font-weight: 500;
}
body.home-composed .cost-foot .pull {
  border-left: 0;
  padding-left: 0;
  font-size: clamp(24px, 2.6vw, 34px);
  line-height: 1.3;
}

/* ---- How we work: whitespace replaces the ruled rows ---- */
body.home-composed .how-steps { border-top: 0; }
body.home-composed .how-step { border-bottom: 0; padding: 34px 0; }
body.home-composed .how-step h3 { font-size: clamp(24px, 2.2vw, 30px); }
body.home-composed .how-step p { font-size: 17px; }

/* ---- Founder pull quote: scale instead of the left bar ---- */
body.home-composed .pull-quote {
  border-left: 0;
  padding-left: 0;
  font-size: clamp(20px, 1.9vw, 25px);
  line-height: 1.35;
}
body.home-composed .pull-quote cite { font-size: 12px; letter-spacing: .16em; }

/* ---- Reviews: floating quotes, sentence-case attribution ---- */
body.home-composed .review { border-top: 0; padding-top: 0; }
body.home-composed .review p { font-size: clamp(22px, 1.8vw, 26px); line-height: 1.45; }
body.home-composed .review .stars { font-size: 15px; }
body.home-composed .review .attrib {
  font-size: 13px;
  letter-spacing: .04em;
  text-transform: none;
  font-weight: 500;
}
body.home-composed .review .attrib strong { letter-spacing: .02em; }

/* ---- Field-strip captions ---- */
body.home-composed .fs-item figcaption { font-size: 13px; letter-spacing: .1em; }
body.home-composed .fs-item figcaption strong { letter-spacing: .1em; }

/* ---- Regions: h3 scale separates the two columns ---- */
body.home-composed .region { border-top: 0; padding-top: 0; }

/* ---- FAQ: keep row rules (interactive), drop the heavy top bar ---- */
body.home-composed .faq-block { border-top: 0; }

/* ---- Start questions: large display lines, no rules ---- */
body.home-composed .start-questions { border-top: 0; }
body.home-composed .start-questions li {
  border-bottom: 0;
  border-right: 0;
  padding: 16px 0;
  font-size: clamp(24px, 2.6vw, 36px);
}

/* ============================================================
   HOMEPAGE SCROLL LIFE (v21.34) — paired with the inline driver
   at the end of index.html. Word reveal, opposing marquee, and
   the end-of-page color turn. Static-safe without JS.
   ============================================================ */

/* ---- Word reveal: words sit as ghosts until scroll lights them ---- */
body.home-composed .wr-on .wr-word {
  color: rgba(23, 23, 23, .16);
  transition: color .3s ease;
}
body.home-composed .wr-on .wr-word.lit { color: inherit; }
/* Dark-band variant (namesake quote): ghosts read on #14110e */
body.home-composed .statement-band.nav-dark .wr-on .wr-word { color: rgba(237, 237, 237, .14); }
body.home-composed .statement-band.nav-dark .wr-on .wr-word.lit { color: inherit; }

/* Zoom-rounding guard: at zoomed large-screen sizes, fractional section
   heights can open a 1px body-colored gap between adjacent dark sections.
   Overlap the hero -> quote -> intro seams so no hairline can appear. */
body.home-composed #namesake { margin-top: 0; }
body.home-composed #namesake + .intro-statement { margin-top: -1px; }
body.home-composed #namesake,
body.home-composed #proof,
body.home-composed .service-editorial-stack {
  content-visibility: visible;
}

/* ---- Live background: a fixed surface the page sits on. Two big
   tint pools (warm clay / cool slate, both near the paper tone)
   drift slowly with scroll. Cream
   sections go transparent so content genuinely rides above it;
   dark chapters stay opaque and materialize over it. ---- */
body.home-composed { background: transparent; }
body.home-composed .live-bg {
  position: fixed;
  inset: 0;
  z-index: 0;
  background: var(--paper);
  overflow: hidden;
  pointer-events: none;
  contain: strict;
  isolation: isolate;
}
body.home-composed main,
body.home-composed .site-footer {
  position: relative;
  z-index: 1;
}
/* Topographic WebGL canvas fills the live surface. */
body.home-composed .live-bg .topo-gl {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  display: block;
  pointer-events: none;
  transform: translateZ(0);
}
/* The old animated blurred-gradient layer is superseded by the topo canvas.
   Disabling it removes a perpetual full-screen 18px blur animation (perf). */
body.home-composed .live-bg::after { display: none; }

/* ---- Namesake quote: the white LL monogram "writes in" behind the John Locke
   quote as you scroll through the section, forming a quiet break before the
   intro copy. The left->right reveal (clip-path) and fade are driven by scroll
   position in JS. Tune: --ll-opacity (faintness), width. ---- */
body.home-composed #namesake {
  --ll-opacity: 0.50;   /* peak opacity of the monogram behind the quote */
  position: relative;
  padding: 0;
}
/* The stage centers the quote + monogram. When pinned (motion allowed) it
   becomes sticky so the section "holds" while the sequence plays out. */
body.home-composed #namesake .ns-stage {
  position: relative;
  display: grid;
  place-items: center;
  min-height: 86vh;
  padding: 120px 36px;
  overflow: hidden;
}
body.home-composed #namesake.ns-pinned .ns-stage {
  position: sticky;
  top: 0;
  height: calc(100vh / var(--z, 1)); /* ÷ --z: body zoom multiplies vh, keep the pinned stage one true screen */
  min-height: 0;
}
body.home-composed #namesake .ll-ink {
  position: absolute;
  top: 50%;
  left: 50%;
  width: min(48vw, 440px);
  height: auto;
  aspect-ratio: 1 / 1;
  transform: translate(-50%, -50%);
  z-index: 0;                        /* behind the quote text */
  pointer-events: none;
  overflow: visible;
}
/* The outline (.ll-stroke) is traced by one continuous line as you scroll,
   then the solid fill (.ll-fill) fades in. Both driven by the #namesake script. */
body.home-composed #namesake .ll-fill   { opacity: 0; }
body.home-composed #namesake .ll-stroke { opacity: 0; }
body.home-composed #namesake .inner {
  position: relative;
  z-index: 1;                        /* quote text stays above the monogram */
}
@media (prefers-reduced-motion: reduce) {
  body.home-composed #namesake .ll-fill   { opacity: var(--ll-opacity); }
  body.home-composed #namesake .ll-stroke { display: none; }
}
/* ---- Magnetic LL mesh behind the namesake quote. Component CSS/JS live in
   assets/magnetic-ll-field/ (vendored handoff — don't edit; override here).
   The stage is the pointer host, so it needs its own stacking context. ---- */
body.home-composed #namesake .ns-stage { isolation: isolate; }
body.home-composed #namesake .magnetic-ll-field {
  z-index: 0;   /* back layer: below the traced monogram (z0, later in DOM) and quote (.inner, z1) */
  --ll-signal-color: #34373b;   /* pointer-active marks + dot: site charcoal, not handoff green */
  --ll-line-color: #34373b;     /* connection lines too — copper isn't a brand color */
}

/* ---- Intro statement: charcoal "highlighter" reveal. Each row is dark text
   on the light surface; as it scrolls into view a charcoal band wipes across
   it (alternating sides) and the text flips light. The band + light text are a
   clipped duplicate injected by JS (.hl-fill). Tune --hl-color / --hl-text. ---- */
.hl-para {
  --hl-color: #1c1915;   /* charcoal highlight */
  --hl-text: #f4f1ea;    /* text on the charcoal while it passes */
  font-size: clamp(16px, 1.4vw, 19px);   /* smaller than the default statement copy */
  line-height: 1.55;
}
.hl-para .hl-row {
  position: relative;
  display: block;
  width: max-content;
  max-width: 100%;
  white-space: nowrap;          /* one detected line; no re-wrap */
  overflow: hidden;             /* clip the passing highlight band */
  padding: 0 0.14em;
}
/* Base text is hidden until the highlight passes; then it's revealed (dark on light). */
.hl-para .hl-base { color: var(--ink); opacity: 0; }
/* The charcoal band + light text sweeps across, then fades out (does not stay). */
.hl-para .hl-fill {
  position: absolute;
  inset: 0;
  box-sizing: border-box;
  padding: 0 0.14em;
  background: var(--hl-color);
  color: var(--hl-text);
  white-space: nowrap;
  clip-path: inset(0 100% 0 0);
  opacity: 1;
  pointer-events: none;
}
@keyframes hlFillL { 0%{clip-path:inset(0 100% 0 0);opacity:1} 45%{clip-path:inset(0 0 0 0);opacity:1} 100%{clip-path:inset(0 0 0 0);opacity:0} }
@keyframes hlFillR { 0%{clip-path:inset(0 0 0 100%);opacity:1} 45%{clip-path:inset(0 0 0 0);opacity:1} 100%{clip-path:inset(0 0 0 0);opacity:0} }
@keyframes hlBaseIn { 0%,45%{opacity:0} 100%{opacity:1} }
.hl-para .hl-row.rev .hl-base { animation: hlBaseIn 1.1s forwards; }
.hl-para .hl-row.from-left.rev  .hl-fill { animation: hlFillL 1.1s forwards; }
.hl-para .hl-row.from-right.rev .hl-fill { animation: hlFillR 1.1s forwards; }
@media (prefers-reduced-motion: reduce) {
  .hl-para .hl-base { opacity: 1; }
  .hl-para .hl-fill { display: none; }
}

body.home-composed .live-bg::after {
  content: "";
  position: absolute;
  inset: -14%;
  pointer-events: none;
}

body.home-composed .live-bg::after {
  background:
    linear-gradient(105deg, rgba(97, 52, 37, 0) 0%, rgba(97, 52, 37, .075) 34%, rgba(97, 52, 37, 0) 56%),
    linear-gradient(288deg, rgba(47, 50, 52, 0) 10%, rgba(47, 50, 52, .07) 46%, rgba(47, 50, 52, 0) 72%);
  opacity: .72;
  filter: blur(18px);
  transform: translate3d(-3%, -2%, 0);
  animation: liveCurrentDrift 30s ease-in-out infinite alternate;
}

@keyframes liveCurrentDrift {
  0% { opacity: .54; transform: translate3d(-4%, -2%, 0) scale(1); }
  45% { opacity: .78; transform: translate3d(2%, 1.5%, 0) scale(1.035); }
  100% { opacity: .62; transform: translate3d(4%, -1%, 0) scale(1.015); }
}

body.home-composed .live-bg .topo-map {
  position: absolute;
  inset: -8%;
  width: 116%;
  height: 116%;
  overflow: visible;
  fill: none;
  stroke: #2d302f;
  stroke-linecap: round;
  stroke-linejoin: round;
  mix-blend-mode: multiply;
  pointer-events: none;
  opacity: .58;
}
body.home-composed .live-bg .topo-island {
  transform-box: fill-box;
  transform-origin: center;
  will-change: transform, opacity;
}
body.home-composed .live-bg .topo-island path {
  stroke-width: .92;
  stroke-opacity: .25;
  vector-effect: non-scaling-stroke;
}
body.home-composed .live-bg .topo-island .topo-major {
  stroke-width: 1.28;
  stroke-opacity: .32;
}
body.home-composed .live-bg .topo-island .topo-faint {
  stroke-width: .72;
  stroke-opacity: .16;
}

body.home-composed .live-bg i {
  position: absolute;
  display: block;
  transform-origin: center;
  will-change: transform, opacity;
  backface-visibility: hidden;
}
body.home-composed .live-bg i:first-child {
  width: 145vw;
  height: 145vw;
  /* warm clay — copper family, no gold */
  background: radial-gradient(closest-side, rgba(166, 140, 120, .62), rgba(166, 140, 120, .16) 46%, rgba(166, 140, 120, 0) 76%);
  top: -48vw;
  left: -42vw;
}
body.home-composed .live-bg i:last-child {
  width: 132vw;
  height: 132vw;
  /* cool slate */
  background: radial-gradient(closest-side, rgba(138, 150, 158, .58), rgba(138, 150, 158, .14) 44%, rgba(138, 150, 158, 0) 76%);
  bottom: -48vw;
  right: -42vw;
}

@media (prefers-reduced-motion: reduce) {
  body.home-composed .live-bg::after {
    animation: none;
  }
}
/* Cream surfaces ride the live layer. The home re-skin gives most
   sections explicit opaque backgrounds — cleared here, section by
   section, so the whole light run of the page sits on the surface. */
body.home-composed .band.cream,
body.home-composed .band.paper,
body.home-composed .breather,
body.home-composed .home-marquee,
body.home-composed #services,
body.home-composed #crew,
body.home-composed #cost,
body.home-composed #proof,
body.home-composed #areas,
body.home-composed #faq,
body.home-composed main > .band,
body.home-composed main > .band.tight,
body.home-composed .service-editorial-stack { background: transparent; }
/* Dark chapters materialize over the surface instead of swapping paper */
body.home-composed #ethos.band.dark.js-fade,
body.home-composed #community.band.dark.js-fade,
body.home-composed #start.band.dark.js-fade { background-color: rgba(11, 11, 10, 0); }
body.home-composed #ethos.band.dark.js-fade.is-dark,
body.home-composed #community.band.dark.js-fade.is-dark,
body.home-composed #start.band.dark.js-fade.is-dark { background-color: rgba(11, 11, 10, 1); }

/* ---- Emptiness as pacing ---- */
/* The namesake quote gets a full dark room of its own. Base height is one
   screen (also the reduced-motion fallback); when pinned it grows tall so the
   sticky stage can hold while the quote and monogram fill in. */
body.home-composed #namesake { min-height: calc(86vh / var(--z, 1)); }
body.home-composed #namesake.ns-pinned { min-height: calc(200vh / var(--z, 1)); }
/* Near-empty breathers between chapters: just the dot texture and air.
   No background of their own — they ride the live-bg surface. */
body.home-composed .breather {
  min-height: calc(38vh / var(--z, 1));
}
body.home-composed .intro-statement { padding: 140px 0 150px; }

/* ---- Opposing marquee (rides the live-bg surface) ---- */
body.home-composed .home-marquee {
  overflow: hidden;
  padding: 120px 0 130px;
}
body.home-composed .home-marquee.mq-pin-on {
  min-height: clamp(420px, 72vh, 680px);
  padding: 0;
}
body.home-composed .home-marquee.mq-pin-on .mq-pin-stage {
  position: sticky;
  top: clamp(92px, 16vh, 150px);
  height: clamp(220px, 36vh, 360px);
  display: grid;
  align-content: center;
  gap: clamp(8px, 2vh, 18px);
  overflow: hidden;
  padding: 0;
}
body.home-composed .mq-row {
  white-space: nowrap;
  width: max-content;
  font-family: var(--font-display);
  font-weight: 800;
  font-size: clamp(60px, calc(8.6vw / var(--z, 1)), 148px);
  line-height: 1.06;
  letter-spacing: -0.02em;
  color: var(--ink);
  margin-left: -400px;
  will-change: transform;
}
body.home-composed .mq-b {
  color: transparent;
  -webkit-text-stroke: 2px rgba(23, 23, 23, .5);
}

body.home-composed .field-strip.fs-pin-on {
  min-height: var(--fs-pin-height, calc(225vh / var(--z, 1))); /* ÷ --z: true scroll range under body zoom */
  padding: 0;
  overflow: visible;
}
body.home-composed .field-strip.fs-pin-on .fs-stage {
  position: sticky;
  top: calc(clamp(118px, 15vh, 168px) / var(--z, 1)); /* ÷ --z: keep the pinned stage on the true screen */
  overflow: hidden;
  padding: 26px 0 40px;
}
body.home-composed .field-strip.fs-scroll-pin .fs-stage {
  top: 118px;
}
body.home-composed #proof .field-strip.fs-pin-on .fs-track {
  padding-top: 18px;
  padding-bottom: 18px;
}
body.home-composed #proof .field-strip.fs-pin-on .fs-item {
  /* ÷ --z: the pinned stage is content-sized, so the zoomed cards would
     grow it past one screen and clip while pinned — keep them true-size */
  width: calc(clamp(260px, 29vw, 460px) / var(--z, 1));
}
body.home-composed #proof .field-strip.fs-pin-on .fs-proof-cta {
  margin-left: clamp(36px, 5vw, 84px);
}

/* ---- Chapter color turns: the dark chapters (founder, community,
   start) fade paper -> dark as they enter, instead of hard-cutting.
   Class .js-fade is added by JS, so no-JS keeps the default dark
   bands. One slow ease, triggered early — a dimming, not an effect.
   Text, buttons, and captions transition with the surface. ---- */
body.home-composed .band.dark.js-fade {
  background-color: var(--paper);
  transition: background-color 1.1s ease;
}
body.home-composed .band.dark.js-fade h2,
body.home-composed .band.dark.js-fade p,
body.home-composed .band.dark.js-fade li,
body.home-composed .band.dark.js-fade blockquote,
body.home-composed .band.dark.js-fade cite,
body.home-composed .band.dark.js-fade figcaption,
body.home-composed .band.dark.js-fade .btn.ghost,
body.home-composed .band.dark.js-fade .explore {
  transition: color 1.1s ease, border-color 1.1s ease, background-color 1.1s ease;
}
body.home-composed .band.dark.js-fade:not(.is-dark) h2 { color: #171717; }
body.home-composed .band.dark.js-fade:not(.is-dark) p { color: #6b6b6b; }
body.home-composed .band.dark.js-fade:not(.is-dark) li { color: #171717; }
body.home-composed .band.dark.js-fade:not(.is-dark) blockquote { color: #171717; }
body.home-composed .band.dark.js-fade:not(.is-dark) cite,
body.home-composed .band.dark.js-fade:not(.is-dark) figcaption { color: #6b6b6b; }
body.home-composed .band.dark.js-fade:not(.is-dark) .btn.ghost {
  color: #171717;
  border-color: #171717;
}
body.home-composed .band.dark.js-fade:not(.is-dark) .explore { color: #171717; }
body.home-composed .band.dark.js-fade.is-dark { background-color: #0b0b0a; }

/* ============================================================
   SITE-WIDE DE-TEMPLATE PASS (v21.35)
   Extends the homepage pass to every page: decorative hairlines
   and box frames removed, eyebrow-tier labels moved to the
   display face at readable sizes, grids that leaned on shared
   borders get real gaps. KEPT: buttons, form fields, FAQ rows,
   index tabs (interactive), the .compare data table, and the
   site header rule. Offset photo plates keep their solid slab,
   lose their outline.
   ============================================================ */

/* ---- Section/band separators: color + whitespace do this job ---- */
.band { border-top: 0; }
.statement-band { border-top: 0; }
.award-band { border-top: 0; }
.partners-band { border-top: 0; border-bottom: 0; }
.intro-statement { border-bottom: 0; }
.service-entry { border-top: 0; }
.service-detail { border-bottom: 0; }
.case-study { border-top: 0; }

/* ---- Row separators out; padding keeps the rhythm ---- */
.product-list { border-top: 0; }
.product-row { border-bottom: 0; }
.material-row { border-top: 0; border-bottom: 0; }
.values-list li { border: 0; }
.values-list li:first-child { border-top: 0; }
.ethos-stack article { border-top: 0; padding-top: 0; }
.line-index a.line-item { border-top: 0; border-bottom: 0; }
.review { border-top: 0; padding-top: 0; }
.review-summary { border-top: 0; border-bottom: 0; }
.faq-block { border-top: 0; }
.city-stats { border: 0; padding: 0; }
.city-stats div { border-bottom: 0; padding-bottom: 0; }
.city-intro .stats { border: 0; padding: 0; }
.city-intro .stats div { border-bottom: 0; }
.rec-alt { border-left: 0; padding-left: 0; }
.recommendation { border-left: 0; padding-left: 0; }
@media (max-width: 880px) { .recommendation { border-top: 0; } }
.cost-rows { border-top: 0; }
.cost-row { border-bottom: 0; }
.how-steps { border-top: 0; }
.how-step { border-bottom: 0; }
.region { border-top: 0; }
.pull-quote { border-left: 0; padding-left: 0; }
.cost-foot .pull { border-left: 0; padding-left: 0; }

/* ---- Shared-border grids become gapped grids ---- */
.partner-grid { border-top: 0; gap: 20px 36px; }
.partner-card,
.partner-grid--roofing .partner-card { border-right: 0; border-bottom: 0; }
@media (max-width: 880px) { .partner-card { border-right: 0; } }
.stat-row { border-top: 0; gap: 0 28px; }
.stat-row div { border-right: 0; }
.process-timeline { border-top: 0; gap: 0 44px; }
.process-step { border-right: 0; }
@media (max-width: 880px) { .process-step { border-bottom: 0; } }
.big5 { border-top: 0; }
.big5 article { border-right: 0; }
.city-grid { border-top: 0; border-left: 0; gap: 22px 32px; }
.city-tile { border-right: 0; border-bottom: 0; }
.path-grid { border: 0; gap: 28px 36px; }
.path-card { border: 0; }
.team-grid { border: 0; gap: 32px 36px; }
.team-member { border: 0; }
.project-facts { border: 0; gap: 20px 32px; padding: 0; }
.project-facts div { border-bottom: 0; border-right: 0; }
.case-study .case-facts { border: 0; padding: 0; }
.case-study .case-facts div { border-bottom: 0; }

/* ---- Boxes and frames off; content sits on the band ---- */
.advisor-shell { border: 0; }
.advisor-body { border-top: 0; }
.calc-output { border-left: 0; }
@media (max-width: 880px) { .calc-output { border-top: 0; } }
/* .intake-form keeps its card frame (padding/hairline/radius/shadow) — the
   one surface that should read as its own sheet on the band. */
.video-frame { border: 0; }
.video-transcript { border: 0; }
.blog-card .blog-thumb { border: 0; }
.project-gallery-grid figure { border: 0; }
.bio-cards img, .crew-figure img { border: 0; }
.crew-feature img, .crew-strip img { border: 0; }
.award-figure img { border: 0; }
.roster-card { border: 0; padding: 0; }
.roster-card:hover, .roster-card:focus-within { border-color: transparent; }

/* Offset depth plates: solid slab stays, outline goes */
.split .media::before,
.case-study .case-image:not(.gallery)::before,
.se-figure::before,
.award-figure::before { border: 0; }

/* Roofing-page re-skin repeats several of the above with higher
   specificity; null them at the same specificity. */
body.roofing-composed .roofing-light .advisor-body { border-top: 0; }
body.roofing-composed .roofing-light .advisor-controls { border: 0; }
body.roofing-composed .roofing-light .recommendation { border-left: 0; border-top: 0; padding-left: 0; }
body.roofing-composed .roofing-light .review { border-top: 0; }
body.roofing-composed .roofing-light .ed-q blockquote { border-left: 0; padding-left: 0; }

/* ---- Eyebrow-tier labels: display face, readable size, no tracking ---- */
.eyebrow, .eyebrow.dark, .eyebrow.light,
.partners-band .partners-eyebrow,
.service-eyebrow,
.card .kicker, .band.dark .card .kicker,
.index-panel .label,
.plate-caption {
  font-family: var(--font-display);
  font-size: clamp(17px, 1.4vw, 21px);
  font-weight: 500;
  letter-spacing: 0;
  text-transform: none;
}

/* ---- Cards (city/climate columns): no ruled tops ---- */
.card { border-top: 0; padding-top: 0; }
.band.dark .card { border-top: 0; }

/* ---- Roofing editorial: kicker joins the label restyle,
   numbered material rows lose their numerals ---- */
.ed-kicker {
  font-family: var(--font-display);
  font-size: clamp(17px, 1.4vw, 21px);
  font-weight: 500;
  letter-spacing: 0;
  text-transform: none;
}
.material-row .mat-num { display: none; }
.material-row { grid-template-columns: minmax(200px, 1.05fr) 1fr 1fr; }
@media (max-width: 980px) {
  .material-row { grid-template-columns: 1fr; }
  .material-row .mat-col { grid-column: auto; }
}
.material-row .mat-label { font-size: 13px; letter-spacing: .1em; }

/* ---- De-center pass (sitewide): display copy rags left where the
   WHOLE moment is composed that way. The rule is coherence, not
   left-alignment everywhere: sections whose body is inherently
   symmetric (logo walls, centered intros over symmetric grids)
   stay fully centered — a lone left header over centered content
   reads as a mistake, not a choice. ---- */
.statement-band { text-align: left; }
.cta-section {
  text-align: left;
  padding-left: max(36px, calc((100vw / var(--z, 1) - 1160px) / 2));
}
.cta-section h2 { margin-left: 0; }
.cta-section p { margin-left: 0; }
.cta-section .actions { justify-content: flex-start; }
.process-step { text-align: left; }
.process-step .step-num { display: none; }
.manifesto-feature { text-align: left; }
/* Partners band and .center intros stay centered (symmetric bodies). */

/* ---- Quote breaks: statement bands carrying a pulled quote ---- */
.statement-band .break-quote {
  margin: 0;
  padding: 0;
  border: 0;
  font-family: var(--font-display);
  font-weight: 400;
  font-size: clamp(34px, 4.4vw, 62px);
  line-height: 1.15;
  letter-spacing: -0.01em;
  color: var(--ink);
  max-width: 17ch;
  text-align: left;
}
.statement-band .break-quote cite {
  display: block;
  font-family: var(--font-sans);
  font-style: normal;
  font-size: 13px;
  font-weight: 600;
  letter-spacing: .12em;
  text-transform: uppercase;
  color: var(--muted);
  margin-top: 26px;
  text-align: left;
}
/* The namesake quote calls out Locke's point without introducing a new accent
   color into the otherwise monochrome dark chapter. */
body.home-composed #namesake .namesake-action {
  color: #aeb4b8;
  font-weight: 600;
}
.statement-band .break-note {
  max-width: 560px;
  margin: 44px 0 0 auto;
  font-size: 17px;
  line-height: 1.7;
  color: var(--muted);
  text-align: left;
}
@media (max-width: 760px) {
  .statement-band .break-note { margin-left: 0; }
}

/* ---- Fine print up from 10-11px; tracking eased ---- */
.se-figure figcaption, .founder-figure figcaption { font-size: 13px; letter-spacing: .14em; }
.fs-item figcaption { font-size: 13px; letter-spacing: .1em; }
.fs-item figcaption strong { letter-spacing: .1em; }
.crew-feature figcaption, .crew-strip figcaption { font-size: 13px; letter-spacing: .14em; }
.review .attrib { font-size: 13px; letter-spacing: .04em; text-transform: none; font-weight: 500; }
.review .attrib strong { letter-spacing: .02em; }
.review-summary .breakdown div { font-size: 13px; letter-spacing: .06em; text-transform: none; }
.cost-row .c-n { font-size: 13px; letter-spacing: .03em; text-transform: none; font-weight: 500; }
.index-tab span { font-size: 12px; letter-spacing: .12em; }
.stat-row span { font-size: 12px; letter-spacing: .12em; }
.pull-quote cite { font-size: 12px; letter-spacing: .16em; }

/* ============================================================
   HOMEPAGE LIVE SURFACE REPAIR (v21.51)
   The first live-bg pass worked mostly in breathers because later
   light-theme rules repainted ordinary homepage sections with solid
   paper/soft backgrounds. This final contract lets the normal light
   run ride the fixed surface, while preserving the hero, dark chapters,
   cards, forms, image plates, and intentionally photo-backed moments.
   ============================================================ */
body.theme-light.home-composed {
  background: transparent;
}

body.theme-light.home-composed .live-bg {
  background: #ededed; /* matches topo COL_TOP; fallback if WebGL is unavailable */
}

body.theme-light.home-composed :where(
  .intro-statement,
  .home-marquee,
  .breather,
  .service-editorial-stack
) {
  background: transparent !important;
  background-color: transparent !important;
}

body.theme-light.home-composed .intro-statement p {
  color: var(--ink);
}

body.theme-light.home-composed .intro-statement p.fine {
  color: var(--muted);
}

body.theme-light.home-composed main > section.band:not(.dark):not(.nav-dark),
body.theme-light.home-composed main > section.partners-band:not(.nav-dark),
body.theme-light.home-composed main > section.statement-band:not(.nav-dark) {
  background: transparent !important;
  background-color: transparent !important;
}

body.theme-light.home-composed :where(
  #services,
  #crew,
  #cost,
  #proof,
  #areas,
  #faq
) {
  background: transparent !important;
  background-color: transparent !important;
}

/* Service/trade cards keep their own material textures and image-backed
   section treatment. The live surface surrounds them; it should not flatten
   their backgrounds. */

/* Keep readable surfaces as surfaces. The live background should surround
   components, not erase component boundaries. */
body.theme-light.home-composed :where(
  .card,
  .path-card,
  .review,
  .faq-item,
  .process-step,
  .partner-card,
  .intake-form,
  .advisor-shell,
  .se-figure::before
) {
  background-clip: padding-box;
}

/* ============================================================
   Site-wide topographic surface. Extends the homepage topo look
   to the main service/nav pages. Enabled per page with the body
   class `topo-page` (the canvas + shader are injected by site.js).
   Everything here is scoped to `.topo-page`, so removing the class
   from a page fully reverts it.
   ============================================================ */
body.topo-page { background: transparent; }
body.topo-page .live-bg {
  position: fixed;
  inset: 0;
  z-index: 0;
  background: #ededed;          /* matches the topo top color; fallback if WebGL is off */
  overflow: hidden;
  pointer-events: none;
  contain: strict;
  isolation: isolate;
}
body.topo-page main,
body.topo-page .site-footer {
  position: relative;
  z-index: 1;
}
body.topo-page .live-bg .topo-gl {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  display: block;
  pointer-events: none;
  transform: translateZ(0);
}
/* Open light sections up so the topo shows through. Every top-level light
   section goes transparent; dark sections (.dark, .nav-dark, any *-dark, plus
   inherently-dark CTA/ethos bands with light text), the hero image band, and
   the interactive advisor tool keep their own background. */
body.topo-page main > section:not([class*="hero"]):not(.advisor-shell):not(.dark):not(.nav-dark):not([class*="-dark"]):not(.cta-section):not(.ethos-band),
body.topo-page main > .band:not(.dark):not(.nav-dark):not([class*="-dark"]):not(.cta-section):not(.ethos-band),
body.topo-page main > .breather,
body.topo-page main > .intro-statement,
body.topo-page main > .home-marquee,
body.topo-page main > .service-editorial-stack {
  background: transparent !important;
}

body.topo-page main > section.advisor-shell {
  background: transparent !important;
}

/* (Proof carousel keeps its original cream copy panel; the topo does not sit
   behind the carousel copy — reverted after the layout could not be made
   reliable across the peek-carousel's slide positions.) */

/* ============ SHAPED FOOTER (house facade cutout with content inside) ============
   The footer IS the house facade, traced from the Burr Ridge house photo at
   true proportions: twin steep gables with slope chimneys, charcoal gutter lines riding the
   rooflines (straight across the chimneys) with the downspout dropping
   from the low end of the left roofline down the middle (beside where the door sits), and
   the right gable reading as a lighter set-back plane behind the left (both roofs at equal pitch). Content is placed with percentages of
   the house box so it scales with the shape; the downspout splits the two
   content stacks like the entry does in the photo. */
.site-footer.footer-shaped,
body.theme-light .site-footer.footer-shaped {
  background: transparent;
  padding: 0;
  margin-top: 0;
  overflow-anchor: none;
}
.footer-shaped .footer-house {
  position: relative;
  width: min(1200px, calc(100% - 24px));
  margin: 72px auto 0;
  color: #c4c4c4;
  contain: layout paint;
}
.footer-shaped .fh-shape {
  display: block;
  width: 100%;
  height: auto;
}
.fh-logo {
  position: absolute;
  left: 23.4%;
  top: 35.5%;
  transform: translateX(-50%);
  width: clamp(44px, 7.5%, 88px);
  height: auto;
}
.fh-word {
  position: absolute;
  left: 63.4%;
  top: 37.5%;
  transform: translateX(-50%);
  color: #fff;
  font-family: var(--font-display);
  font-weight: 500;
  font-size: clamp(13px, 1.9vw, 22px);
  letter-spacing: .18em;
  text-transform: uppercase;
  white-space: nowrap;
}
.fh-left {
  position: absolute;
  left: 4.5%;
  right: 56%;
  top: 48.4%;
  display: flex;
  flex-direction: column;
  gap: 2.2em;
}
.fh-right {
  position: absolute;
  left: 51.5%;
  right: 14%;
  top: 48.4%;
  display: flex;
  flex-direction: column;
  gap: 2.2em;
}
.fh-left, .fh-right {
  font-size: clamp(11px, 1.35vw, 15px);
  line-height: 1.55;
}
.fh-offices {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 8%;
}
.fh-left h4, .fh-right h4 {
  color: #fff;
  font-size: clamp(9px, .95vw, 12px);
  font-weight: 700;
  letter-spacing: .22em;
  text-transform: uppercase;
  margin: 0 0 .7em;
}
.fh-left p { margin: 0; }
.fh-right address { font-style: normal; }
.fh-left a, .fh-right a { color: #c4c4c4; transition: color .2s; }
.fh-left a:hover, .fh-right a:hover { color: var(--gold); }
.fh-left ul, .fh-right ul { list-style: none; margin: 0; padding: 0; columns: 2; column-gap: 1.8em; }
.fh-left li, .fh-right li { margin-bottom: .5em; break-inside: avoid; white-space: nowrap; }
.fh-social { display: flex; gap: 10px; margin-top: .2em; }
.fh-social a { border: 1px solid #333333; padding: .25em .55em; font-size: .85em; letter-spacing: .05em; }
.fh-social a:hover { background: var(--gold); border-color: var(--gold); color: #111111; }

/* Review marquee along the foundation of the house (no rules above/below) */
.footer-shaped .footer-reviews {
  position: absolute;
  left: 4%;
  right: 7%;
  bottom: 1.5%;
  overflow: hidden;
  padding: 4px 0;
}
.fr-track {
  display: flex;
  width: max-content;
  animation: fr-marquee 150s linear infinite;
  will-change: transform;
}
.footer-reviews:hover .fr-track { animation-play-state: paused; }
@media (prefers-reduced-motion: reduce) {
  .fr-track {
    animation: none;
    transform: none;
    will-change: auto;
  }
}
@keyframes fr-marquee { to { transform: translateX(-50%); } }
.fr-group {
  display: flex;
  align-items: baseline;
  gap: 72px;
  padding-right: 72px;
}
.fr-item {
  display: flex;
  align-items: baseline;
  gap: 12px;
  white-space: nowrap;
  font-size: clamp(11px, 1.2vw, 14.5px);
  color: #c4c4c4;
}
.fr-stars { color: var(--google-gold); font-size: .85em; letter-spacing: .2em; }
.fr-meta { color: #8a8a8a; font-size: .9em; letter-spacing: .04em; }

/* Legal row outside the house, on the page background */
.footer-shaped .footer-bottom {
  max-width: min(1200px, calc(100% - 24px));
  border-top: 0;
  margin: 6px auto 0;
  padding: 4px 4px 18px;
  color: #8a8a8a;
  font-size: 12.5px;
}
body.theme-light .footer-shaped .footer-bottom { color: #6b6b6b; }

/* Small screens: the percent overlay gets too cramped — fall back to a plain
   dark block with the same content flowing normally. */
@media (max-width: 760px) {
  .footer-shaped .fh-shape { display: none; }
  .footer-shaped .footer-house {
    background: #0a0a0a;
    width: calc(100% - 24px);
    padding: 40px 20px 0;
  }
  .fh-logo, .fh-word, .fh-left, .fh-right { position: static; transform: none; }
  .fh-logo { width: 52px; margin-bottom: 14px; }
  .fh-word { margin-bottom: 24px; font-size: 17px; }
  .fh-left { margin-bottom: 26px; }
  .fh-left, .fh-right { gap: 26px; font-size: 13px; }
  .footer-shaped .footer-reviews {
    position: static;
    margin: 30px -20px 0;
    padding: 4px 0 22px;
  }
}

/* ============================================================
   BRAVA EXCELLENCE AWARD — editorial collage (roofing + project pages)
   Big display headline + overlapping Brava-house photography.
   Theme-adaptive: inherits roofing-dark or cream palette from the section.
   ============================================================ */
/* Transparent so the site's topographic background shows through.
   Colours come from each page's own --accent / --ink / --muted tokens. */
.bea { overflow: clip; background: transparent; }

.bea .bea-inner {
  max-width: 1240px;
  margin: 0 auto;
  display: grid;
  grid-template-columns: minmax(0, 1fr) minmax(0, 1.06fr);
  gap: clamp(32px, 5vw, 72px);
  align-items: center;
}

/* Copy column */
.bea-copy { min-width: 0; }
.bea-kicker {
  margin: 0;
  color: var(--accent);
  font-weight: 700;
  letter-spacing: .14em;
  text-transform: uppercase;
  font-size: 13px;
}
.bea-title {
  font-family: var(--font-display);
  text-transform: uppercase;
  font-weight: 700;
  font-size: clamp(40px, 6.2vw, 100px);
  line-height: .92;
  letter-spacing: -.02em;
  overflow-wrap: break-word;
  margin: 16px 0 0;
  color: var(--ink);
}
.bea-title span { color: var(--accent); }
.bea-lead {
  font-size: 18px;
  line-height: 1.7;
  color: var(--muted);
  margin: 22px 0 0;
  max-width: 46ch;
}
.bea-cta { margin-top: 28px; }

/* Collage column — award is the large image, barrel-tile roof overlaps it */
.bea-collage {
  position: relative;
  min-width: 0;
  height: clamp(540px, 50vw, 740px);
}
.bea-word {
  position: absolute;
  left: 6%;
  bottom: -3%;
  z-index: 0;
  font-family: var(--font-display);
  font-weight: 800;
  font-size: clamp(120px, 15vw, 240px);
  line-height: .8;
  letter-spacing: -.04em;
  color: transparent;
  -webkit-text-stroke: 2px var(--accent);
  text-stroke: 2px var(--accent);
  opacity: .16;
  pointer-events: none;
  user-select: none;
}
.bea-fig {
  position: absolute;
  margin: 0;
  overflow: hidden;
  border: 1px solid var(--line);
  background: var(--soft);
  box-shadow: 0 24px 54px rgba(0,0,0,.20);
  border-radius: 3px;
  will-change: transform;
  backface-visibility: hidden;
}
.brava-page .bea-fig {
  border: 0;
  background: transparent;
  box-shadow: none;
  border-radius: 0;
}
.bea-fig img {
  display: block;
  width: 100%;
  height: 100%;
  object-fit: cover;
}
.bea-fig--main { top: 4%;  left: 4%;    width: 80%; height: 76%; z-index: 1; }  /* award — large base */
/* topdown — overlaps the award's top-right corner and runs to the true screen edge.
   right offset breaks out of the centred container; .bea's overflow:clip trims it
   exactly at the viewport edge. */
.bea-fig--a    { top: 0; left: 64%; right: min(-44px, 612px - 50vw); height: 44%; z-index: 3; }
.bea-fig--b    { left: -3%; bottom: 2%; width: 30%; height: 34%; z-index: 2; }  /* third — clips bottom-left corner, smaller */

@media (max-width: 980px) {
  .bea .bea-inner { grid-template-columns: 1fr; gap: 34px; }
  .bea-collage { height: auto; display: grid; grid-template-columns: 1fr 1fr; gap: 12px; }
  .bea-fig,
  .bea-fig--main, .bea-fig--a, .bea-fig--b {
    position: static; inset: auto; top: auto; right: auto; bottom: auto; left: auto;
    width: auto; height: auto;
    transform: none !important;
    box-shadow: 0 16px 34px rgba(0,0,0,.16);
  }
  .bea-fig--main { grid-column: 1 / -1; aspect-ratio: 1.86; }
  .bea-fig--a { aspect-ratio: 1.6; }
  .bea-fig--b { aspect-ratio: 1.6; }
  .bea-word { display: none; }
}

/* ============ TV FOOTER — bumpout wordmark + centered scene ============
   Dark card inset from the page edges with a stepped bumpout tab at top
   center (script wordmark); the strip above carries a gradient whose glow
   and rays converge on the bump. The Carmel office photo sits centered
   with the two office addresses flanking it. The Frame TV is off (black)
   in the photo; the link block is mapped onto the screen by a homography
   in site.js (#tvf-scene / #tvf-screen). Screen-corner fractions live in
   site.js (QUAD). Photo: 5416x5424. */
.site-footer.tvf,
body.theme-light .site-footer.tvf {
  --tvf-card-bg: #101010;
  --tvf-radius: clamp(16px, 2vw, 28px);
  --tvf-drop: clamp(22px, 2.4vw, 34px);   /* how far the photo dips below the card */
  --tvf-bpad: clamp(16px, 1.8vw, 26px);   /* bottom bump plateau beyond the photo column */
  --tvf-bsweep: clamp(48px, 6vw, 80px);   /* bottom bump sweep width */
  /* The footer stays in the same body-zoom coordinate system as the rest of
     the page. A former inverse zoom here caused WebKit to compress the TV
     grid while Chromium rendered it normally. site.js supplies a parse-safe
     pixel min-height after converting the visible viewport by --z. */
  zoom: 1;
  position: relative;
  display: flex;
  flex-direction: column;
  min-height: 100vh;
  padding: 0;
  /* starts as the section-above tone (seam-free) and slowly cross-fades to
     the opposite tone, pulling the eye down into the card */
  background: linear-gradient(to bottom,
    var(--dark) 0%,
    var(--dark) 12%,
    rgb(15, 15, 14) 19.3%,
    rgb(27, 26, 24) 26.7%,
    rgb(45, 44, 40) 34.0%,
    rgb(67, 65, 60) 41.3%,
    rgb(92, 89, 83) 48.7%,
    rgb(118, 115, 107) 56.0%,
    rgb(145, 141, 131) 63.3%,
    rgb(170, 165, 154) 70.7%,
    rgb(192, 186, 174) 78.0%,
    rgb(210, 204, 190) 85.3%,
    rgb(222, 215, 200) 92.7%,
    var(--soft) 100%);
  overflow-anchor: none;
}
@supports (height: 100svh) {
  .site-footer.tvf {
    min-height: 100svh;
  }
}
/* Mobile browsers collapse their toolbars at the page bottom, so svh
   (bars-expanded viewport) leaves a sliver of the section above showing
   over the footer. lvh = bars-collapsed viewport — exactly the screen you
   see when scrolled to the end. Identical to vh/svh on desktop. */
@supports (height: 100lvh) {
  .site-footer.tvf { min-height: 100lvh; }
}

/* ---- Strip above the card: absorbs spare viewport height ---- */
.tvf-approach {
  flex: 1 0 auto;
  min-height: clamp(36px, 3.2vw, 46px);
}

/* ---- Light-page variant: pages whose last band is cream cross-fade the
   other way, light down to dark (class set in the page markup) ---- */
.site-footer.tvf.tvf-on-light,
body.theme-light .site-footer.tvf.tvf-on-light {
  background: linear-gradient(to bottom,
    var(--soft) 0%,
    var(--soft) 6%,
    rgb(222, 215, 200) 12.7%,
    rgb(210, 204, 190) 19.3%,
    rgb(192, 186, 174) 26.0%,
    rgb(170, 165, 154) 32.7%,
    rgb(145, 141, 131) 39.3%,
    rgb(118, 115, 107) 46.0%,
    rgb(92, 89, 83) 52.7%,
    rgb(67, 65, 60) 59.3%,
    rgb(45, 44, 40) 66.0%,
    rgb(27, 26, 24) 72.7%,
    rgb(15, 15, 14) 79.3%,
    var(--dark) 86%,
    var(--dark) 100%);
}
.site-footer.tvf.tvf-on-light .tvf-bottom { color: #b5b0a4; }

/* ---- The card ---- */
.tvf-card {
  position: relative;
  width: 100%; /* flex column + auto margins would otherwise shrink-to-fit */
  display: flow-root; /* BFC: keeps the bump's negative margin from collapsing */
  max-width: calc(100% - 2 * clamp(12px, 2.8vw, 41px));
  margin: 0 auto;
  /* the flattening layer on top forces the bottom edge to exact
     --tvf-card-bg so it meets the flat-#101010 bump-out dip with no
     seam — the low radial tint would otherwise leave the card a couple
     shades lighter than the dip */
  background:
    linear-gradient(to top, #101010, #101010 12px, rgba(16,16,16,0) 160px),
    radial-gradient(60% 80% at 82% 25%, rgba(166,140,120,.06), transparent 70%),
    radial-gradient(55% 75% at 72% 85%, rgba(138,150,158,.05), transparent 70%),
    var(--tvf-card-bg);
  border-radius: var(--tvf-radius);
}

/* ---- Top bumpout: a single stretched SVG shape — S-curves with
   horizontal tangents at both ends, so there are no corner/fillet
   junctions to produce spikes or hairlines ---- */
.tvf-bump {
  --tvf-bump-h: clamp(26px, 2.8vw, 38px);
  position: relative;
  z-index: 2;
  width: fit-content;
  height: calc(var(--tvf-bump-h) + 2px); /* 2px bleed into the card kills the seam */
  margin: calc(-1 * var(--tvf-bump-h)) auto 0;
  display: flex; align-items: center; justify-content: center;
  padding: 2px clamp(80px, 9vw, 130px) 0; /* the sweeps live inside the padding */
  background: url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 400 40" preserveAspectRatio="none"><path d="M0,40C40,40,40,0,80,0L320,0C360,0,360,40,400,40Z" fill="%23101010"/></svg>') center / 100% 100% no-repeat;
}
.site-footer .tvf-bump-brand {
  font-family: var(--font-display);
  font-weight: 800;
  font-size: clamp(11.5px, 1.05vw, 15px);
  letter-spacing: .18em;
  text-transform: uppercase;
  white-space: nowrap;
  color: var(--ink);
  text-shadow: 0 0 18px rgba(237,237,237,.18);
}

/* ---- Offices flanking the centered scene ---- */
.tvf-main {
  position: relative;
  display: grid;
  grid-template-columns: minmax(195px, 1fr) minmax(0, 5.2fr) minmax(195px, 1fr);
  align-items: stretch;
  gap: clamp(14px, 2vw, 30px);
  max-width: 1460px;
  margin: 0 auto;
  padding: 0 clamp(16px, 2.2vw, 36px) 0;
}
.tvf-office {
  min-width: 0;
  /* NO min-height:100% here — it's circular in a grid row (the item's
     min-height depends on the row height that depends on the items) and
     WebKit resolves it against a stale pass, freezing the row too tall.
     The default stretch alignment already gives the offices full row
     height in every engine. */
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  text-align: center;
}
.site-footer .tvf-office-heading {
  font-family: var(--font-display); font-weight: 600;
  font-size: clamp(15px, 1.35vw, 19px); letter-spacing: .14em; text-transform: uppercase;
  color: #a8a8a8; margin: 0 0 12px;
}
.tvf-office address {
  min-height: 5.25em; /* reserve the same three-line address block on both sides */
  font-style: normal; font-size: clamp(14.5px, 1.25vw, 17px); line-height: 1.75; color: var(--ink-soft);
}
.tvf-office a { color: var(--ink); text-decoration: none; }
.tvf-office a:hover { text-decoration: underline; }
/* Large screens: the offices' vw clamps hit their px caps around 1400px
   and stop growing, while the TV column keeps scaling in --tvu — so the
   flanking Carmel / Burr Ridge blocks read undersized on big monitors.
   Size them in the same --tvu unit (set in layout px by site.js on the
   footer root as well as the screen) so they scale with the rest of the
   footer. max() floors keep them from ever dropping below today's caps;
   the px var-fallbacks reproduce today's caps for the pre-JS frame. cqw
   is NOT a safe fallback here — the offices sit outside the .tvf-screen
   container, and Safari mis-resolves cqw under the body zoom anyway. */
@media (min-width: 1680px) {
  .site-footer .tvf-office-heading { font-size: max(19px, calc(3.05 * var(--tvu, 6.23px))); }
  .tvf-office address { font-size: max(17px, calc(2.65 * var(--tvu, 6.42px))); }
}

/* ---- Photo pane (centered) ---- */
.tvf-scene {
  /* crop window of the photo (0-1 fractions), symmetric around the TV
     center (x=0.49); some top wall trimmed to keep pane proportions */
  --crop-x: 0.000;
  --crop-y: 0.140;
  --crop-w: 0.980;
  --crop-h: 0.860;
  grid-column: 2;
  grid-row: 1;
  z-index: 1;
  /* explicit width: WebKit otherwise resolves this aspect-ratio'd grid item
     from the ROW height (set by the short office columns) and derives a
     collapsed width, instead of stretching to the 5.2fr track like Chromium
     — the whole card folds to ~180px wide / ~130px tall */
  width: 100%;
  margin-bottom: calc(-1 * var(--tvf-drop)); /* dips into the bottom bumpout */
  position: relative;
  overflow: hidden;
  /* parse-safe static fallback first: engines that can't parse calc()/var()
     inside <ratio> drop the second declaration at parse time and keep this
     one (value = (5416*.980)/(5424*.860); recompute if crops change) */
  aspect-ratio: 1.1379;
  aspect-ratio: calc((5416 * var(--crop-w)) / (5424 * var(--crop-h)));
  background: #0d0d0d;
}
/* COMPAT: aspect-ratio needs iOS 15 / Safari 15. On older iPads the pane
   collapses to zero height (all its children are absolute) and the photo
   vanishes. Percentage padding-top reproduces the same ratio everywhere —
   %-padding resolves against WIDTH, and absolute children position against
   the padding box, so the crop math is unaffected. Scoped to >640px: the
   phone layout gets an explicit height from site.js instead. */
@supports not (aspect-ratio: 1 / 1) {
  @media (min-width: 641px) {
    .tvf-scene {
      height: 0;
      padding-top: calc(100% * (5424 * var(--crop-h)) / (5416 * var(--crop-w)));
    }
  }
}
/* ---- Bottom bumpout: single stretched SVG dip below the card edge;
   the photo extends down into it ---- */
.tvf-bump-bottom {
  grid-column: 2;
  grid-row: 1;
  align-self: end;
  position: relative;
  z-index: 0;
  pointer-events: none;
  height: calc(var(--tvf-drop) + 2px); /* 2px bleed up into the card kills the seam */
  margin: 0 calc(-1 * (var(--tvf-bpad) + var(--tvf-bsweep))) calc(-1 * var(--tvf-drop));
  background: url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1000 34" preserveAspectRatio="none"><path d="M0,0C33,0,33,34,67,34L933,34C967,34,967,0,1000,0Z" fill="%23101010"/></svg>') center / 100% 100% no-repeat;
}

/* ---- Photo, cropped and positioned inside the pane ---- */
.tvf-scene > .tvf-photo {
  position: absolute;
  display: block;
  max-width: none;
  height: auto;
  width: calc(100% / var(--crop-w));
  left: calc(-100% * var(--crop-x) / var(--crop-w));
  top: calc(-100% * var(--crop-y) / var(--crop-h));
  filter: saturate(.96);
}
/* Old/low-RAM tablets (2GB iPads): the filter forces a second GPU buffer
   the size of the decoded photo — combined with a long image-heavy page
   it can push WebKit past its image-memory budget and the photo silently
   never paints. The .96 saturation is imperceptible; drop it here. */
@media (max-width: 1366px) {
  .tvf-scene > .tvf-photo { filter: none; }
}
.tvf-scene::after {
  content: "";
  position: absolute; inset: 0;
  pointer-events: none;
  box-shadow: inset 0 0 0 1px rgba(237,237,237,.07);
  background:
    linear-gradient(to top, rgba(10,10,10,.35), rgba(10,10,10,0) 16%),
    linear-gradient(to bottom, rgba(10,10,10,.22), rgba(10,10,10,0) 12%);
}
.tvf-scene.no-photo .tvf-photo { display: none; }
.tvf-scene.no-photo {
  background: repeating-linear-gradient(90deg, #141414 0 14px, #101010 14px 28px);
}

/* ---- Link text, mapped onto the screen ---- */
.tvf-screen {
  position: absolute;
  transform-origin: 0 0;
  z-index: 2;
  -webkit-text-size-adjust: 100%;
  text-size-adjust: 100%;
  display: flex;
  flex-direction: column;
  padding: 2% 2% 4.5% 5%;
  container-type: inline-size;
  background: radial-gradient(110% 80% at 35% 10%, rgba(120,140,160,.05), rgba(0,0,0,0) 60%);
}
.tvf-screen a, .tvf-screen span, .tvf-screen h4 {
  text-shadow: 0 0 10px rgba(200,220,255,.14);
}
.tvf-screen-head {
  display: flex; align-items: baseline; justify-content: space-between;
  flex-shrink: 0;
  gap: calc(1.8 * var(--tvu, 1cqw));
  padding-bottom: 1%;
  margin-bottom: 4.5%;
}
.tvf-logo-link {
  display: block;
  align-self: center;
  transition: opacity .15s ease;
}
.tvf-logo-link:hover { opacity: .8; }
.tvf-logo {
  height: calc(10 * var(--tvu, 1cqw));
  width: auto;
  display: block;
}
.tvf-cols {
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  justify-content: space-between;
  gap: calc(2.4 * var(--tvu, 1cqw));
  flex: 1;
  min-height: 0;
  align-content: center;
}
.site-footer .tvf-col h2 {
  font-family: var(--font-display);
  font-weight: 500;
  font-size: calc(2.4 * var(--tvu, 1cqw));
  letter-spacing: .16em;
  text-transform: uppercase;
  color: #909090;
  margin-bottom: calc(2.6 * var(--tvu, 1cqw));
  transform: translateY(calc(.7 * var(--tvu, 1cqw)));
}
.tvf-col ul {
  list-style: none; padding: 0; margin: 0;
  display: grid;
  grid-auto-flow: column;
  column-gap: calc(2.8 * var(--tvu, 1cqw));
}
/* One link per line. These used to run across the screen as a flex-wrap row,
   but the type AND the gaps both scale with the screen box, so the row was
   always ~19% wider than the box and orphaned the last link onto a second
   line at every desktop size. A single column cannot rag, at any width, and
   it matches the stacked treatment phones already get. */
.tvf-col--explore ul {
  display: grid;
  grid-auto-flow: row;
  grid-template-columns: minmax(0, max-content);
  justify-items: start;
  gap: calc(0.6 * var(--tvu, 1cqw)) 0;
  width: auto;
}
/* Stacking the five links costs ~3x the height the old single strip used, and
   the TV screen box is a FIXED quad (site.js maps it onto the photo), so the
   column has to earn that height back from its own leading rather than grow:
   .tvf-cols is flex:1 between the logo head and the socials foot, and anything
   taller than that box overflows straight onto the socials row.

   Font size is deliberately untouched — the height comes out of leading, not
   legibility, so the 981-1240 block still gets to bump the type for touch.

   The DOUBLED class is load-bearing: .tvf-col--explore is ONE class, so a bare
   `.tvf-col--explore li` ties `.tvf-col li` on specificity and then loses on
   source order (and the 981-1240 touch-bump block further down would beat it
   too). The second class makes these hold wherever they sit in the file.

   >=641px covers every layout that sizes this list in --tvu against the fixed
   quad, tablet portrait included — at 820x1180 the untightened stack overlapped
   the socials by 2px, so >=981px was not enough. Below 641px the phone layout
   takes over: the screen height is auto and derived from its own content there,
   so a taller stack just makes the footer taller and needs none of this.

   Verify by measuring .tvf-col--explore ul against .tvf-cols and
   .tvf-screen-foot after layout() runs — not by eye. */
@media (min-width: 641px) {
  .tvf-col.tvf-col--explore li { line-height: 1.25; }
  .tvf-col.tvf-col--explore a { padding: calc(.2 * var(--tvu, 1cqw)) 0; }
  .tvf-col.tvf-col--explore ul { gap: calc(.3 * var(--tvu, 1cqw)) 0; }
  .site-footer .tvf-col.tvf-col--explore h2 { margin-bottom: calc(1.8 * var(--tvu, 1cqw)); }
}
.tvf-col li { font-size: calc(2.9 * var(--tvu, 1cqw)); line-height: 1.65; }
.tvf-col a {
  display: inline-block;
  color: var(--ink-soft);
  text-decoration: none;
  font-size: calc(2.9 * var(--tvu, 1cqw));
  padding: calc(.5 * var(--tvu, 1cqw)) 0;
  white-space: nowrap;
  transition: color .15s ease, transform .15s ease;
}
.tvf-col a:hover { color: #fff; transform: translateX(2px); }
.tvf-screen-foot {
  display: flex; align-items: center; justify-content: space-between;
  flex-shrink: 0;
  gap: calc(1.5 * var(--tvu, 1cqw));
  padding-top: 1%;
  margin-top: 1%;
  transform: translateY(calc(3.4 * var(--tvu, 1cqw)));
}
.tvf-social { display: flex; flex-wrap: wrap; align-items: baseline; gap: calc(1.6 * var(--tvu, 1cqw)) calc(2.6 * var(--tvu, 1cqw)); }
.site-footer .tvf-social .tvf-social-label {
  font-family: var(--font-display);
  font-weight: 500;
  flex-basis: 100%;
  font-size: calc(2.2 * var(--tvu, 1cqw));
  letter-spacing: .16em;
  text-transform: uppercase;
  color: #909090;
  margin-right: 0;
}
.tvf-social a.tvf-social-link {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  border: 0;
  padding: 0;
  line-height: 0;
  transition: transform .15s ease, opacity .15s ease;
}
.tvf-social-icon {
  width: clamp(22px, calc(4.1 * var(--tvu, 1cqw)), 38px);
  height: clamp(22px, calc(4.1 * var(--tvu, 1cqw)), 38px);
  display: block;
}
.tvf-social a.tvf-social-link:hover { background: transparent; border-color: transparent; transform: scale(1.12); opacity: .9; }

/* ---- Review marquee: rides the card's bottom edge (same spot as when it
   overlaid the photo column) but absolutely positioned against .tvf-card,
   so it spans the full card edge-to-edge without adding a row — the card's
   height and shape are untouched. No scrim/shadow behind it. ---- */
.tvf .footer-reviews {
  position: absolute;
  left: 0;
  right: 0;
  bottom: 38px;
  z-index: 2;
  overflow: hidden;
  margin: 0;
  padding: 10px 0 8px;
  background: none;
}
.tvf .fr-item { gap: 14px; font-size: clamp(13px, 1.35vw, 16.5px); }
.tvf .fr-stars { color: var(--google-gold); }

/* Pinned Google-reviews chip anchors the marquee: the "G" mark + a real link
   to the Google profile stay put on the left while the testimonials scroll in
   a clipping viewport beside it — so every page with the marquee carries a
   "See all of our reviews" link to Google. */
.tvf .footer-reviews { display: flex; align-items: center; gap: clamp(14px, 2vw, 30px); }
.fr-viewport { flex: 1 1 auto; min-width: 0; overflow: hidden; }
.fr-google {
  flex: 0 0 auto;
  display: inline-flex;
  align-items: center;
  gap: 8px;
  padding-left: clamp(14px, 3vw, 44px);
  font-family: var(--font-sans);
  font-size: clamp(12px, 1.2vw, 14px);
  letter-spacing: .01em;
  color: #eaeaea;
  white-space: nowrap;
  border-bottom: 1px solid transparent;
  transition: color .2s, border-color .2s;
}
.fr-google .g-logo { height: 16px; }
.fr-google:hover { color: #fff; border-color: rgba(255,255,255,.55); }
@media (max-width: 640px) {
  .fr-google { padding-left: 4px; font-size: 12px; gap: 6px; }
}

/* Credentials occupy the review marquee's former position; the matching
   review row now rides directly above it. */
.tvf .footer-credentials {
  position: absolute;
  left: 0;
  right: 0;
  bottom: 0;
  z-index: 2;
  overflow: hidden;
  margin: 0;
  padding: 10px 0 8px;
  background: none;
}
.footer-credentials .fr-track { animation-direction: reverse; }
.footer-credentials:hover .fr-track { animation-play-state: paused; }

/* ---- Legal row ---- */
.tvf .tvf-bottom {
  display: flex; justify-content: space-between; align-items: center; gap: 8px;
  width: 100%; /* flex column + auto margins would otherwise shrink-to-fit */
  margin: 0;
  min-height: calc(var(--tvf-drop) + 12px);
  padding: 8px clamp(20px, 3vw, 44px);
  color: #55503f; font-size: 12.5px;
  font-variant-numeric: tabular-nums lining-nums;
}
/* the copy sits on either side of the bottom bumpout (side lanes are
   ~175px at any viewport since the bump tracks the photo column) */
.tvf .tvf-bottom > div { max-width: 168px; }
.tvf .tvf-bottom > div:last-child { text-align: right; }
/* Keep the appended legal link intact so "Policy" never orphans onto its
   own line below "Privacy" in the narrow bottom lane. */
.tvf .tvf-bottom a[href='/privacy-policy/'] { white-space: nowrap; }

/* ---- Narrow landscape band (iPad landscape, small desktop windows):
   the offices' 195px column floor starves the photo column here, which
   shrinks the TV and its link type below touch size. Relax the floor so
   the photo takes the width back, and scale the link rows up — the TV
   has vertical slack to absorb them ---- */
@media (min-width: 981px) and (max-width: 1366px) {
  .tvf-main { grid-template-columns: minmax(150px, .9fr) minmax(0, 5.2fr) minmax(150px, .9fr); }
}
/* Touch-size bump for the TV links on narrow landscape iPads. Capped at
   3.0 (not 3.4): the two link groups (Services / Explore & Areas) span the
   full screen width via justify-content:space-between, and the font is
   sized as a fraction of that width (--tvu). MEASURE the multiplier against
   the homography-MAPPED screen width (screen.offsetWidth AFTER layout() runs
   in site.js) — once the card is sized to the true visible height the TV
   screen box is NARROW (~528px on a 1024×648 iPad), and the longest items
   ("Cost & Scope Index", "Service Areas") clip on the right at 3.4 (~48px
   over) → "Service Areas" became "Service Are". At 3.0, with the tighter
   sub-column gap, the two groups leave ~30px natural slack in that box, so
   nothing clips even if the engine renders text a touch wider. */
@media (min-width: 981px) and (max-width: 1240px) {
  .tvf-col li { font-size: calc(3.0 * var(--tvu, 1cqw)); }
  .tvf-col a { font-size: calc(3.0 * var(--tvu, 1cqw)); padding: calc(.7 * var(--tvu, 1cqw)) 0; }
  .tvf-col ul { column-gap: calc(2.2 * var(--tvu, 1cqw)); }
}

/* ---- iPad landscape: keep the aspect-locked card SMALLER than the screen
   (user request 2026-07-14) — a deliberate 87vw width cap so the whole TV
   image shows at a smaller size and the legal side copy stays uncovered.
   Earlier this band trimmed the photo's side crop to make the pane taller
   and fill the height, but that cut the speakers' outer edges and the
   enlarged card's bump-out covered the bottom legal copy; both are undone
   here. A modest empty approach strip above the card is the accepted trade
   for a fully-visible, contained image on a short 4:3 screen. ---- */
@media (min-width: 981px) and (max-width: 1366px) and (orientation: landscape) {
  /* the height-derived term caps the card so the aspect-locked pane can
     never outgrow the screen: pane height ≈ (card − ~360px chrome) / 0.969
     must fit the VISIBLE height minus the approach floor + legal row.
     Height source is --tvf-vh (window.innerHeight, set by the "Footer height
     cap" JS in site.js) — the ONLY reliable visible height here. CSS
     viewport units overstate it on iPad: this band is iPad landscape, and
     (a) iPad Safari never collapses its toolbar/tab bar on scroll (unlike
     iPhone), so lvh is ~one toolbar too tall, and (b) on older iPad Safari
     (<15.4) svh doesn't exist and 100vh resolves to the toolbar-HIDDEN
     "large" viewport. Either way the aspect-locked card was sized for a
     taller screen than is actually visible → TV bottom + legal corners
     clipped below the fold. Fallback chain for the pre-JS frame: --tvf-vh
     unset → svh (accurate on Safari 15.4+); svh unparseable (old Safari) →
     the plain-vh first declaration. Once JS runs (every engine) --tvf-vh
     wins with real px.
     RESERVE (75px) = approach floor (~44px) + legal row (~55px) − the drop
     overlap (~33px, the scene dips into the legal lane).
     87vw WIDTH cap (user request 2026-07-14, "make the whole image
     smaller"): the card is deliberately held to 87% of the viewport width
     so it reads smaller AND — critically — the ~6.5vw side lanes stay clear
     of the .tvf-bottom legal copy. The bottom bump-out tracks the scene
     width; at full card width it painted OVER the legal corners (dark on
     dark → the copy vanished). Capping by VIEWPORT WIDTH (not just height)
     keeps that clearance a constant proportion across the band, so the
     legal stays uncovered at 1024/1194/1366 alike. The 1.138 factor is the
     pane W/H at the DEFAULT full-width crop (the landscape side-crop that
     trimmed the speakers is removed below); re-derive it if the crop
     changes. The height term still guards very short viewports; --tvf-vh is
     the reliable visible height (see the JS note above). */
  .tvf-card { max-width: min(87vw, calc(100% - 2 * clamp(10px, 1.6vw, 24px)), calc((100vh - 75px) * 1.138 + 360px)); }
  .tvf-card { max-width: min(87vw, calc(100% - 2 * clamp(10px, 1.6vw, 24px)), calc((var(--tvf-vh, 100svh) - 75px) * 1.138 + 360px)); }
  .site-footer.tvf { min-height: var(--tvf-vh, 100svh); }
  /* Slim the bottom bump-out so its dark dip never reaches the legal side
     lanes (pairs with the 87vw cap above). */
  .tvf-bump-bottom { --tvf-bpad: 8px; --tvf-bsweep: 22px; }
  .tvf-main {
    grid-template-columns: minmax(140px, .8fr) minmax(0, 5.6fr) minmax(140px, .8fr);
    gap: clamp(12px, 1.4vw, 22px);
  }
  .tvf-office address { font-size: 13.5px; }
  .site-footer .tvf-office-heading { font-size: 14px; }
  /* NO landscape side-crop: the old --crop-x:.080/--crop-w:.835 trimmed the
     outer edges of BOTH speakers (~55px each side on a 1024w iPad) to make
     the pane taller — the user saw the right speaker cut off. Using the
     default full-width crop shows the whole image; it reads smaller and is
     fully visible. site.js reads the crop vars from computed style, so the
     homography + self-heal follow the default automatically. */
}

/* ---- Tablet: photo spans the card, offices side by side below.
   Also applies to PORTRAIT viewports up to iPad Pro 12.9" width (1366px):
   portrait proportions can't feed the desktop 3-column row enough height,
   so the card ends up tiny under a huge empty approach strip ---- */
@media (max-width: 980px), (max-width: 1366px) and (orientation: portrait) {
  .tvf-main {
    grid-template-columns: 1fr 1fr;
    align-items: start; /* offices top-align so their headings sit level */
    padding-bottom: clamp(24px, 3vw, 40px);
  }
  .tvf-office { min-height: auto; }
  .tvf-office address { min-height: 0; }
  .tvf-scene { grid-row: 1; grid-column: 1 / -1; margin-bottom: 0; }
  .tvf-bump-bottom { display: none; }
  /* offices sit below the photo here, so the marquee flows after them */
  .tvf .footer-reviews {
    position: static;
    grid-column: 1 / -1;
    grid-row: auto;
    align-self: auto;
    margin: 0;
    border-radius: 0;
    padding: 20px 0;
    background: none;
  }
  .tvf .footer-credentials {
    position: static;
    grid-column: 1 / -1;
    grid-row: auto;
    align-self: auto;
    margin: -20px 0 0;
    padding: 20px 0;
    background: none;
  }
  .tvf .tvf-bottom { min-height: 0; flex-wrap: wrap; }
  .tvf .tvf-bottom > div { max-width: none; }
  .tvf .tvf-bottom > div:last-child { text-align: left; }
}
@media (max-width: 640px) {
  /* Phones: the photo is cut mid-screen and the black TV screen continues
     below it as a CSS extension (bg/border colors sampled from the photo),
     so the links stay "on the TV" at a readable, tappable size.
     Crop is symmetric around the TV center (x=0.49). site.js switches from
     the homography to static positioning at this breakpoint and reserves
     the extension height via margin-bottom on the scene. */
  .tvf-approach { min-height: 48px; }
  .tvf-bump { --tvf-bump-h: 24px; padding: 2px 48px 0; }
  .site-footer .tvf-bump-brand { font-size: 11px; }
  .tvf-scene {
    --crop-x: 0.0685; --crop-w: 0.860; --crop-y: 0.100; --crop-h: 0.370;
    /* keep overflow: hidden (Safari-safe); site.js gives the scene an
       explicit height that includes the screen extension, and clips the
       photo to a strip with clip-path. aspect-ratio MUST be off here:
       with an explicit height it would derive the width and blow the
       scene out sideways. */
    aspect-ratio: auto;
    min-height: 120vw; /* pre-JS placeholder, JS sets the real height */
  }
  /* fade the cut photo edge into the card background at the sides;
     --tvf-strip-h is set by site.js to the visible photo strip height */
  .tvf-scene::after {
    inset: auto 0 auto 0;
    top: 0;
    height: var(--tvf-strip-h, 100%);
    box-shadow: none;
    background: linear-gradient(to bottom, rgba(16,16,16,0) 55%, rgba(16,16,16,.55) 82%, #101010);
  }
  .tvf-screen {
    /* the box covers the photo's TV completely (bezel included), so the
       CSS border IS the bezel — nothing from the photo pokes out */
    background: #0c0b0b;
    border: solid #262626;
    border-width: 3px 3px 5px;
    padding: 14px 16px 20px;
  }
  .tvf-logo { height: 40px; }
  .tvf-screen-head { margin-bottom: 14px; }
  .site-footer .tvf-col h2 { font-size: 11px; margin-bottom: 10px; transform: translateY(3px); }
  .tvf-cols { gap: 18px; align-content: start; }
  .tvf-col ul { display: block; }
  .tvf-col li { font-size: 15px; }
  .tvf-col a { font-size: 15px; padding: 5px 0; }
  .tvf-screen-foot { margin-top: 16px; padding-top: 10px; gap: 10px; transform: translateY(12px); }
  .site-footer .tvf-social .tvf-social-label { font-size: 11px; }
  .tvf-social { gap: 10px 12px; }
  .tvf-social a { font-size: 12px; padding: .35em .7em; }
}
@media (max-width: 480px) {
  .tvf-main { grid-template-columns: 1fr; gap: 24px; }
}
@media (max-width: 374px) {
  .tvf-col li { font-size: 13.5px; }
  .tvf-col a { font-size: 13.5px; }
  .tvf-cols { gap: 14px; }
}

/* ============================================================
   EDITORIAL FLOW PASS (2026-07) — chromeless Q+A ledger,
   material-row grouping, manifesto re-set.
   Separation by scale + whitespace: no rules, no boxes, no kickers.
   ============================================================ */

/* Q+A ledger (roofing #drivers) */
body.roofing-composed .section-disclosure {
  margin: 0;
  border-top: 1px solid var(--roof-light-line);
  border-bottom: 1px solid var(--roof-light-line);
}
body.roofing-composed .section-disclosure > summary {
  list-style: none;
  display: grid;
  grid-template-columns: minmax(0, 1fr) minmax(280px, .72fr) auto;
  gap: 20px 36px;
  align-items: center;
  padding: 26px 0;
  color: var(--roof-light-ink);
  cursor: pointer;
}
body.roofing-composed .section-disclosure > summary::-webkit-details-marker { display: none; }
body.roofing-composed .section-disclosure > summary::after {
  content: "+";
  font-family: var(--font-display);
  font-size: 26px;
  font-weight: 400;
  line-height: 1;
  color: var(--accent);
}
body.roofing-composed .section-disclosure[open] > summary::after { content: "−"; }
.section-disclosure__title {
  font-family: var(--font-display);
  font-size: clamp(20px, 2vw, 27px);
  font-weight: 500;
  line-height: 1.15;
  color: inherit;
}
.section-disclosure__meta {
  font-family: var(--font-sans);
  font-size: 13px;
  line-height: 1.55;
  color: var(--roof-light-muted);
}
.section-disclosure__body {
  padding: 24px 0 10px;
}
.section-disclosure__body > .q-ledger,
.section-disclosure__body > .rsys-opener {
  margin-top: 0;
}
@media (max-width: 760px) {
  body.roofing-composed .section-disclosure > summary {
    grid-template-columns: minmax(0, 1fr) auto;
    gap: 10px 20px;
    padding: 22px 0;
  }
  .section-disclosure__meta {
    grid-column: 1 / -1;
    padding-right: 36px;
  }
  .section-disclosure__body { padding-top: 18px; }
}

.q-ledger {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: 64px 96px;
  margin-top: 56px;
}
.q-ledger h3 {
  font-family: var(--font-display);
  font-weight: 500;
  font-size: clamp(21px, 1.9vw, 26px);
  line-height: 1.2;
  color: var(--ink);
  max-width: 21em;
}
.q-ledger p {
  margin-top: 14px;
  font-size: 16px;
  line-height: 1.68;
  color: var(--muted);
  max-width: 50ch;
}
body.roofing-composed .roofing-light .q-ledger h3 { color: var(--roof-light-ink); }
body.roofing-composed .roofing-light .q-ledger p { color: var(--roof-light-muted); }
@media (max-width: 860px) {
  .q-ledger { grid-template-columns: 1fr; gap: 44px; margin-top: 40px; }
}

/* ============ ROOF SYSTEM (roofing page) ============
   Editorial rebuild of the "layer by layer" component section: a dictionary
   opener + exploded assembly diagram, then six numbered layers. Colors ride
   the .roofing-light token remap, so var(--ink/--muted/--line) resolve warm. */
.rsys-opener {
  display: grid;
  grid-template-columns: minmax(0, 0.9fr) minmax(0, 1.1fr);
  gap: 40px 56px;
  align-items: start;
  margin-top: 52px;
  padding-bottom: 52px;
  border-bottom: 1px solid var(--line);
}
.rsys-opener-text { align-self: center; }
.rsys-define-word {
  font-family: var(--font-display);
  font-weight: 700;
  font-size: clamp(52px, 6.2vw, 82px);
  line-height: .92;
  color: var(--ink);
  letter-spacing: -.025em;
}
.rsys-define-word span {
  display: inline-block;
  font-family: var(--font-sans);
  font-weight: 700;
  font-size: clamp(13px, 1.15vw, 17px);
  letter-spacing: .24em;
  text-transform: uppercase;
  color: var(--accent);
  vertical-align: middle;
  margin-left: 18px;
  transform: translateY(-0.35em);
}
.rsys-define-meaning {
  margin-top: 28px;
  font-family: var(--font-display);
  font-size: clamp(24px, 2.55vw, 36px);
  line-height: 1.35;
  color: var(--ink-soft);
  max-width: 34ch;
}
.rsys-define-note {
  margin-top: 20px;
  font-size: 16px;
  line-height: 1.72;
  color: var(--muted);
  max-width: 48ch;
}
/* Let the roof-system definition and context use the full editorial measure. */
.roof-system .rsys-define-meaning,
.roof-system .rsys-define-note {
  max-width: none;
}
.roof-system .rsys-define-meaning {
  margin-inline: auto;
  text-align: center;
}

.rsys-list {
  list-style: none;
  margin: 0;
  padding: 0;
}
.rsys-item {
  display: grid;
  grid-template-columns: 200px 1fr;
  gap: 44px;
  padding: 42px 0;
  border-bottom: 1px solid var(--line);
  align-items: start;
}
/* items that carry a project photo: numeral | copy | photo, photo side
   alternates via .shot-left (numeral stays first in both directions) */
.rsys-item.has-shot {
  grid-template-columns: 200px minmax(0, 1fr) minmax(0, 1fr);
  gap: 44px;
  align-items: start;
}
.rsys-item.has-shot.shot-left .rsys-shot { order: 2; }
.rsys-item.has-shot.shot-left .rsys-body { order: 3; }
.rsys-shot { margin: 0; }
.rsys-shot img {
  display: block;
  width: 100%;
  height: auto;
  aspect-ratio: 4 / 3;
  object-fit: cover;
  border: 1px solid var(--line);
}
.rsys-shot figcaption {
  margin-top: 11px;
  font-family: var(--font-sans);
  font-size: 12.5px;
  letter-spacing: .01em;
  line-height: 1.5;
  color: var(--muted);
}
.rsys-index { display: flex; flex-direction: column; gap: 12px; }
.rsys-tag {
  font-family: var(--font-sans);
  font-size: 12px;
  letter-spacing: .22em;
  text-transform: uppercase;
  font-weight: 700;
  color: var(--accent);
  line-height: 1.4;
}
.rsys-body h3 {
  font-family: var(--font-display);
  font-weight: 500;
  font-size: clamp(27px, 3vw, 37px);
  line-height: 1.12;
  color: var(--ink);
  margin: 0 0 18px;
}
.rsys-number {
  color: var(--accent);
  font: inherit;
  margin-right: .28em;
}
.rsys-body p {
  font-size: 17px;
  line-height: 1.68;
  color: var(--muted);
  max-width: 64ch;
}
.rsys-body p + p { margin-top: 14px; }
.rsys-body strong { color: var(--ink); }
.rsys-sub {
  margin: 24px 0 10px;
  font-family: var(--font-sans);
  font-size: 12px;
  letter-spacing: .16em;
  text-transform: uppercase;
  font-weight: 700;
  color: var(--ink-soft);
}
.rsys-checks {
  margin: 16px 0;
  padding: 0;
  list-style: none;
  display: grid;
  gap: 11px;
  max-width: 56ch;
}
.rsys-checks li {
  position: relative;
  padding-left: 28px;
  font-size: 16px;
  line-height: 1.45;
  color: var(--muted);
}
.rsys-checks li::before {
  content: "+";
  position: absolute;
  left: 0;
  top: -1px;
  font-family: var(--font-display);
  font-weight: 500;
  color: var(--ink);
}
.rsys-fn {
  font-size: .82em;
  vertical-align: super;
  color: var(--ink);
  text-decoration: none;
}
.rsys-fn:hover { color: var(--gold); }
.rsys-note {
  margin-top: 16px;
  font-size: 13px;
  line-height: 1.5;
  color: var(--muted);
  opacity: .82;
}
.rsys-close {
  margin-top: 46px;
  font-size: 17px;
  line-height: 1.6;
  color: var(--ink-soft);
  max-width: 60ch;
}
.rsys-close a {
  color: var(--ink);
  text-decoration: underline;
  text-underline-offset: 3px;
  text-decoration-thickness: 1px;
}
.rsys-close a:hover { color: var(--gold); }

/* keep the definition meaning a touch darker than default body copy under the
   roofing-light token remap (its element-level p rule would flatten it) */
body.roofing-composed .roof-system .rsys-define-meaning { color: var(--roof-light-text); }
body.roofing-composed .roof-system .rsys-close { color: var(--roof-light-text); }

@media (max-width: 900px) {
  .rsys-opener { grid-template-columns: 1fr; gap: 20px; padding-bottom: 40px; }
  .rsys-item.has-shot { grid-template-columns: 1fr; gap: 22px; align-items: start; }
  /* stack in reading order regardless of desktop photo side: copy, then photo */
  .rsys-item.has-shot .rsys-body,
  .rsys-item.has-shot.shot-left .rsys-body { order: 2; }
  .rsys-item.has-shot .rsys-shot,
  .rsys-item.has-shot.shot-left .rsys-shot { order: 3; }
  .rsys-shot img { max-width: 560px; }
}
@media (max-width: 720px) {
  .rsys-item,
  .rsys-item.has-shot { grid-template-columns: 1fr; gap: 16px; padding: 34px 0; }
  .rsys-index { flex-direction: row; align-items: baseline; gap: 16px; }
}

/* Condensed, always-open roof system (dropdown removed). Two compact columns of
   layers, tighter type, and the large project photos dropped so the whole
   section reads at a fraction of the original height. */
.roof-system--flat .rsys-opener { margin-top: 40px; padding-bottom: 36px; }
.roof-system--flat .rsys-list {
  display: grid;
  grid-template-columns: 1fr 1fr;
  column-gap: 64px;
}
.roof-system--flat .rsys-item,
.roof-system--flat .rsys-item.has-shot {
  display: block;
  grid-template-columns: none;
  gap: 0;
  padding: 26px 0;
}
.roof-system--flat .rsys-index { flex-direction: row; align-items: baseline; gap: 12px; margin-bottom: 10px; }
.roof-system--flat .rsys-index { display: none; }
.roof-system--flat .rsys-body h3 { font-size: clamp(21px, 2.1vw, 26px); margin: 0 0 10px; }
.roof-system--flat .rsys-body p { font-size: 15.5px; line-height: 1.6; max-width: none; }
.roof-system--flat .rsys-body p + p { margin-top: 10px; }
.roof-system--flat .rsys-sub { margin: 16px 0 8px; }
.roof-system--flat .rsys-checks { margin: 12px 0; gap: 8px; }
.roof-system--flat .rsys-checks li { font-size: 15px; padding-left: 24px; }
.roof-system--flat .rsys-shot { display: none; }
.roof-system--flat .rsys-close { margin-top: 30px; }

/* The exploded assembly becomes a calm, cursor-following reference on desktop.
   The same source image remains in the document flow for touch and keyboard
   visitors, where a pointer-only interaction would otherwise disappear. */
.rsys-layer-art {
  margin: 0 auto 46px;
  max-width: 760px;
  text-align: center;
}
.rsys-layer-art img {
  display: block;
  width: 100%;
  height: auto;
  border: 1px solid var(--line);
}
.rsys-layer-art figcaption {
  margin-top: 12px;
  color: var(--muted);
  font-size: 13px;
  line-height: 1.5;
}
.rsys-cursor-preview {
  position: fixed;
  top: 0;
  left: 0;
  z-index: 120;
  width: min(430px, 33vw);
  aspect-ratio: 16 / 10;
  overflow: hidden;
  pointer-events: none;
  opacity: 0;
  visibility: hidden;
  transform: translate3d(-500px, -500px, 0);
  transition: opacity 160ms ease, visibility 0s linear 160ms;
  will-change: transform, opacity;
}
.rsys-cursor-preview.is-visible {
  opacity: 1;
  visibility: visible;
  transition-delay: 0s;
}
.rsys-cursor-preview img,
.rsys-cursor-preview video {
  display: block;
  width: 100%;
  height: 100%;
  object-fit: cover;
}
.roof-system--flat .rsys-item.is-cursor-active .rsys-body h3 {
  color: var(--accent);
}
@media (hover: hover) and (pointer: fine) and (prefers-reduced-motion: no-preference) {
  .rsys-layer-art {
    display: none;
  }
}
@media (prefers-reduced-motion: reduce) {
  .rsys-cursor-preview { display: none; }
}
@media (max-width: 760px) {
  .roof-system--flat .rsys-list { grid-template-columns: 1fr; column-gap: 0; }
}

/* Specialty material rows tucked behind the site's details pattern */
.material-more { border-top: 1px solid var(--line); }
.material-more > summary {
  list-style: none;
  cursor: pointer;
  padding: 34px 0;
  font-family: var(--font-display);
  font-weight: 500;
  font-size: clamp(19px, 1.8vw, 23px);
  color: var(--ink);
}
.material-more > summary::-webkit-details-marker { display: none; }
.material-more > summary {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 32px;
}
.material-more > summary .mat-meta {
  display: block;
  margin-top: 10px;
  font-family: var(--font-sans);
  font-weight: 400;
  font-size: 12px;
  letter-spacing: 0.08em;
  line-height: 1.7;
  color: var(--muted);
}
body.roofing-composed .roofing-light .material-more > summary .mat-meta { color: var(--roof-light-muted); }
.material-more .mm-cta {
  display: inline-block;
  margin-top: 16px;
  font-family: var(--font-sans);
  font-size: 12px;
  font-weight: 800;
  letter-spacing: .02em;
  text-transform: uppercase;
  color: var(--accent);
  border-bottom: 2px solid var(--accent);
  padding-bottom: 6px;
  transition: color .2s, border-color .2s;
}
.material-more .mm-cta::before {
  content: "+";
  display: inline-block;
  margin-right: 8px;
  font-weight: 800;
  transition: transform .25s ease;
}
.material-more[open] .mm-cta::before { transform: rotate(45deg); }
.material-more[open] .mm-cta .mm-cta-label { display: none; }
.material-more[open] .mm-cta::after { content: "Collapse"; }
.material-more > summary:hover .mm-cta { color: var(--ink); border-color: var(--ink); }

/* Portfolio: full-width feature tiles every seventh slot break the 2-up rhythm */
.portfolio-grid .pt-feature {
  grid-column: 1 / -1;
  aspect-ratio: 2.15 / 1;
}
.portfolio-grid .pt-feature figcaption {
  padding: 34px 38px;
  background: linear-gradient(to top, rgba(0, 0, 0, .58), rgba(0, 0, 0, .12) 38%, rgba(0, 0, 0, 0) 65%);
}
.portfolio-grid .pt-feature figcaption strong {
  font-family: var(--font-display);
  font-weight: 500;
  font-size: clamp(22px, 2.2vw, 30px);
}
.portfolio-grid .pt-feature figcaption span { font-size: 13px; }
@media (max-width: 760px) {
  .portfolio-grid .pt-feature { aspect-ratio: 1.42 / 1; }
  .portfolio-grid .pt-feature figcaption { padding: 22px 24px; }
  .portfolio-grid .pt-feature figcaption strong { font-size: 18px; }
}
body.roofing-composed .roofing-light .material-more { border-color: var(--roof-light-line); }
body.roofing-composed .roofing-light .material-more > summary { color: var(--roof-light-ink); }

/* Manifesto re-set: narrower measure, statement lines punctuate the scroll */
.manifesto-prose p { max-width: 62ch; }
.manifesto-prose .manifesto-mark {
  max-width: none;
  margin: 56px 0;
  font-size: clamp(24px, 2.6vw, 38px);
  line-height: 1.15;
}
.manifesto-prose h3 { margin-top: 72px; font-size: clamp(24px, 2.6vw, 38px); }

/* Culture page: center the long-form brand documents and enlarge reading text */
body.accent-culture #story .band-inner,
body.accent-culture #manifesto .band-inner {
  max-width: 1160px;
}
body.accent-culture .story-flow,
body.accent-culture .manifesto-prose {
  max-width: none;
}
body.accent-culture .story-flow .body-flow,
body.accent-culture .manifesto-prose > p:not([class]) {
  max-width: none;
  font-size: 21px;
  line-height: 1.8;
}
body.accent-culture .story-flow .story-stinger { max-width: none; }
body.accent-culture .manifesto-kicker { font-size: clamp(20px, 2vw, 26px); }
body.accent-culture .why-journey .section-head {
  display: block;
  text-align: center;
}
body.accent-culture .why-journey__title {
  max-width: 16ch;
  margin-left: auto;
  margin-right: auto;
  font-size: clamp(52px, 8vw, 132px);
}
body.accent-culture .manifesto-feature .eyebrow {
  color: #ffffff !important;
  background: transparent;
  font-weight: 800;
  text-shadow: 0 2px 18px rgba(0,0,0,.95), 0 0 3px rgba(0,0,0,.95);
}
body.accent-culture #community .section-head--single > p {
  max-width: 960px;
}
/* Culture credo: a transparent post-carousel-style statement moment. */
body.accent-culture .credo-highlight {
  background: transparent !important;
}
body.accent-culture .credo-highlight .inner {
  max-width: 1160px;
  text-align: center;
}
body.accent-culture .credo-highlight .mega-statement {
  max-width: 19ch;
  margin-left: auto;
  margin-right: auto;
}
body.accent-culture .credo-highlight__quote {
  margin: 48px auto 0;
  font-family: var(--font-display);
  font-weight: 800;
  font-size: clamp(30px, 4.2vw, 64px);
  line-height: .98;
  letter-spacing: -0.02em;
  color: var(--ink);
  max-width: 20ch;
  text-align: center;
}
body.accent-culture .credo-highlight__quote cite {
  margin-top: 20px;
  font-family: var(--font-serif);
  font-size: clamp(17px, 1.7vw, 24px);
  font-weight: 700;
  line-height: 1.2;
  letter-spacing: 0;
  color: var(--muted);
}
@media (max-width: 640px) {
  body.accent-culture .story-flow .body-flow,
  body.accent-culture .manifesto-prose > p:not([class]) { font-size: 18px; }
}

/* ============ NAV HOVER FLIP (sans -> serif) ============ */
/* Each nav label is split by site.js into per-letter spans in two stacked
   faces. On hover the sans letters slide up out of the clipped line while
   their Brier (serif) twins rise in from below, each letter a beat behind
   the last, so the word turns over in a small wave. Without JS the links
   render as plain text and every existing nav style still applies. */
.nav-flip {
  display: inline-grid;
  /* Clip the slide vertically only: negative horizontal inset leaves room
     for italic serif glyphs to lean past the last letter's box. */
  clip-path: inset(0 -0.25em);
  pointer-events: none; /* clicks land on the <a> even mid-wave */
}
.nav-flip-face {
  grid-area: 1 / 1;
  white-space: nowrap;
  text-align: center;
}
/* Rest state sits light; the serif face arrives italic and a step heavier.
   Over a hero photo the contrast-safety layer boosts nav weight to 700, so
   both faces get a heavier counterpart there to stay legible on imagery. */
.nav-flip-sans { font-weight: 300; }
.nav-flip-serif {
  font-family: var(--font-serif);
  font-style: italic;
  font-weight: 500;
}
.site-header.over-hero .nav-flip-sans { font-weight: 500; }
.site-header.over-hero .nav-flip-serif { font-weight: 600; }
/* Screen-reader copy of the label; both animated faces are aria-hidden. */
.nav-flip-sr {
  position: absolute;
  width: 1px;
  height: 1px;
  overflow: hidden;
  clip-path: inset(50%);
  white-space: nowrap;
}
.nav-flip-face > span {
  display: inline-block;
  transition: transform .4s cubic-bezier(.6, .05, .25, 1);
  transition-delay: calc(var(--i) * 28ms);
}
.nav-flip-serif > span { transform: translateY(110%); }
.nav-links a:hover .nav-flip-sans > span,
.nav-links a:focus-visible .nav-flip-sans > span,
.nav-trades-toggle:hover .nav-flip-sans > span,
.nav-trades:focus-within .nav-trades-toggle .nav-flip-sans > span,
.nav-trades.open .nav-trades-toggle .nav-flip-sans > span {
  transform: translateY(-110%);
}
.nav-links a:hover .nav-flip-serif > span,
.nav-links a:focus-visible .nav-flip-serif > span,
.nav-trades-toggle:hover .nav-flip-serif > span,
.nav-trades:focus-within .nav-trades-toggle .nav-flip-serif > span,
.nav-trades.open .nav-trades-toggle .nav-flip-serif > span {
  transform: translateY(0);
}
@media (prefers-reduced-motion: reduce) {
  .nav-flip-face > span { transition: none; }
}

/* ============ SERVICE-AREA MAP BACKGROUNDS ============
   These two bands deliberately cover the live topo canvas with the supplied
   office-area maps. No overlay or tint is applied to either SVG. */
body.topo-page #indianapolis[data-service-map],
body.topo-page #chicago[data-service-map] {
  min-height: 100svh;
  background-color: #10100f !important;
  background-position: 50% 50%;
  background-repeat: no-repeat;
  /* Keep the supplied metropolitan road network intact. `cover` was cropping
     the outer connections, most noticeably in the Burr Ridge map. */
  background-size: contain;
  background-attachment: fixed;
}
/* A permanent dark base stays beneath the city layers during the service-area
   sequence. It keeps the divider black while one map retires before the other
   appears, with no chance for the light topo canvas to show through. */
body.topo-page main { position: relative; z-index: 3; }
.service-map-stage {
  position: fixed;
  inset: 0;
  z-index: 2;
  pointer-events: none;
  visibility: hidden;
  opacity: 0;
  background-color: #10100f;
  background-position: 50% 50%;
  background-repeat: no-repeat;
  background-size: contain;
  transition: none;
}
body.service-map-ready .service-map-stage { visibility: visible; }
body.service-map-ready .service-map-stage[data-active="true"] { opacity: 1; }
.service-map-stage[data-map="indianapolis"] {
  background-image: url("images/north-indianapolis-service-area.svg?v=8");
}
.service-map-stage[data-map="chicago"] {
  background-image: url("images/burr-ridge-service-area.svg?v=8");
}
.service-map-stage[data-map="transition"] {
  z-index: 1;
  background-image: none;
}
body.topo-page #indianapolis[data-service-map] {
  background-image: url("images/north-indianapolis-service-area.svg?v=8") !important;
}
body.topo-page #chicago[data-service-map] {
  background-image: url("images/burr-ridge-service-area.svg?v=8") !important;
}
/* This must follow the fallback images above: when JS is running, the only
   map artwork is the fixed stage. The section itself remains transparent. */
body.topo-page.service-map-ready #indianapolis[data-service-map],
body.topo-page.service-map-ready #chicago[data-service-map] {
  background-color: transparent !important;
  background-image: none !important;
}
/* Light copy is intentional here: the map is a dark field, not a panel. */
body.topo-page [data-service-map],
body.topo-page [data-service-map] h2,
body.topo-page [data-service-map] h2 em,
body.topo-page [data-service-map] p,
body.topo-page [data-service-map] li,
body.topo-page [data-service-map] li strong,
body.topo-page [data-service-map] .city-tile strong {
  color: #ededed !important;
}
body.topo-page [data-service-map] .eyebrow.dark,
body.topo-page [data-service-map] .city-meta,
body.topo-page [data-service-map] .city-tile.featured .city-meta,
body.topo-page [data-service-map] .city-tile.featured .featured-tag {
  color: rgba(237,237,237,.66) !important;
}
body.topo-page [data-service-map] .btn.ink-ghost {
  color: #ededed !important;
  border-color: rgba(237,237,237,.72) !important;
  background: transparent !important;
}
body.topo-page [data-service-map] .btn.ink-ghost:hover {
  color: #10100f !important;
  background: #ededed !important;
  border-color: #ededed !important;
}
.service-area-map-content {
  display: block;
  max-width: 760px;
}
body.topo-page [data-service-map] .city-grid {
  gap: 10px 28px;
  background: transparent !important;
}
body.topo-page [data-service-map] .city-tile,
body.topo-page [data-service-map] .city-tile.featured,
body.theme-light [data-service-map] .city-tile.featured {
  padding: 18px 0;
  background: transparent !important;
  box-shadow: none !important;
  border: 0 !important;
  color: var(--ink);
}
body.topo-page [data-service-map] .city-tile strong,
body.topo-page [data-service-map] .city-tile.featured strong { color: var(--ink); }
body.topo-page [data-service-map] .city-tile.featured .city-meta,
body.topo-page [data-service-map] .city-tile.featured .featured-tag { color: var(--muted); }
@media (max-width: 880px) {
  body.topo-page #indianapolis[data-service-map],
  body.topo-page #chicago[data-service-map] { background-attachment: scroll; }
}
@media (prefers-reduced-motion: reduce) {
  body.topo-page #indianapolis[data-service-map],
  body.topo-page #chicago[data-service-map],
  .service-map-stage { transition: none; }
}

/* Dark lead-ins allow the live topo field to settle before each map begins. */
body.topo-page main > .office-map-intro,
body.topo-page main > .metro-break {
  min-height: clamp(320px, 55vh, 560px);
  display: grid;
  place-items: center;
  background: #10100f !important;
  color: rgba(255,255,255,.74);
}
body.topo-page main > #service-area-metro-break {
  position: relative;
  z-index: 2;
  background-color: #10100f !important;
  background-image: none !important;
}
.office-map-intro { position: relative; z-index: 2; }
.office-map-intro {
  min-height: clamp(500px, 72vh, 780px) !important;
  background: linear-gradient(
    to bottom,
    rgba(16,16,15,0) 0%,
    rgba(16,16,15,.08) 16%,
    rgba(16,16,15,.36) 42%,
    rgba(16,16,15,.76) 70%,
    #10100f 100%
  ) !important;
}
.office-map-intro .metro-break-inner { color: rgba(237,237,237,.74); }
.metro-break-inner {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: clamp(16px, 3vw, 42px);
  width: min(760px, calc(100% - 72px));
  font-family: var(--font-sans);
  font-size: 10px;
  font-weight: 700;
  letter-spacing: .2em;
  text-transform: uppercase;
  text-align: center;
}
@media (max-width: 540px) {
  .metro-break-inner { gap: 14px; letter-spacing: .14em; }
}

/* The homepage intro rides the light topographic background, so it must not
   inherit the light-on-dark text tokens from its earlier dark-band treatment. */
body.theme-light.home-composed .intro-statement {
  --ink: #171717;
  --ink-soft: #3f3d39;
  --muted: #716c64;
  --line: rgba(23, 23, 23, .14);
  --line-soft: rgba(23, 23, 23, .08);
}

/* ============ INSTAGRAM BAND (homepage) ============ */
/* Populated by the inline script in index.html from /api/instagram; the
   whole section stays [hidden] until posts actually arrive. */
/* Pinned horizontal gallery (landonorris.com-style). The section is made tall
   by the script; .insta-stage sticks to the viewport and vertical scroll drifts
   the scattered .insta-track sideways. Progress is measured from element rects
   (a ratio), so it stays correct under the body CSS zoom used at >=1680px. */
.insta-band {
  border-top: 1px solid var(--line-soft);
  padding: 0;
  position: relative;
  /* Top clearance so placed photos/copy never hide behind the 77px sticky nav. */
  --insta-safe: 92px;
}
.insta-band[hidden] { display: none; }

.insta-stage {
  position: -webkit-sticky;
  position: sticky;
  top: 0;
  height: 100vh;
  min-height: 620px;
  overflow: hidden;
  display: flex;
  align-items: stretch;
}
.insta-track {
  display: flex;
  align-items: stretch;
  height: 100%;
  /* Base air between items; each item also carries its own extra offset so the
     horizontal rhythm is irregular, never an even grid. */
  gap: clamp(30px, 3vw, 64px);
  padding-inline: clamp(40px, 9vw, 220px);
  will-change: transform;
}
/* Every item is a full-height lane; the photo/text is placed at an explicit
   vertical position inside it, so the tops never line up into a straight row. */
.insta-cell {
  flex: 0 0 auto;
  position: relative;
  height: 100%;
  margin-left: calc(var(--ml, 0) * 1vh);
}
/* The placed group (the photo frame, or note text) floats at --top down the lane,
   offset below the sticky nav so the top row is never clipped. --top is measured
   from the safe band start (just under the nav). */
.insta-place {
  position: absolute;
  left: 0;
  right: 0;
  top: calc(var(--insta-safe, 92px) + var(--top, 12) * 1vh);
}

/* ---- photo frames (big live posts + small candid accents) ---- */
/* Width is expressed in vh so both dimensions scale with the pinned viewport;
   height falls out of the aspect ratio. This keeps the vertical scatter (--top,
   also in vh) provably inside the stage at any screen height. Both --w and --ar
   are written by the script: live posts keep the exact shape they were published
   in — 9:16 for reel covers, 4:5 / 1:1 / up to 1.91:1 for stills — fitted inside
   a max box, so a post is never cropped to a house ratio. */
.insta-cell--photo { width: calc(var(--w, 40) * 1vh); }
.insta-frame {
  position: relative;
  display: block;
  overflow: hidden;
  aspect-ratio: var(--ar, 1 / 1);
  /* No card/backing behind the photo — the image sits directly on the topo
     paper, like landonorris.com. (Kept transparent, no fill, no radius.) */
  background: transparent;
}
/* Slightly oversized so the per-image parallax translate never reveals an edge. */
/* Oversized by a FIXED 20px each side (not a %), so the per-image parallax
   translate — capped well under 20px in the script — can never shift the photo
   far enough to uncover an edge of the frame. The frame matches the photo's own
   ratio, so this 40px overshoot is the only crop a live post ever takes. */
.insta-frame img {
  position: absolute;
  top: 0;
  left: -20px;
  width: calc(100% + 40px);
  max-width: none;   /* defeat the global img{max-width:100%} that would cap the oversize */
  height: 100%;
  object-fit: cover;
  will-change: transform;
  transition: filter .5s ease;
}
a.insta-frame:hover img,
a.insta-frame:focus-visible img { filter: brightness(1.05); }
/* No caption or label prints over a post — the photos carry themselves and the
   caption lives in the alt text only. Hovering just lifts the photo slightly. */
.insta-badge {
  position: absolute;
  top: 14px;
  right: 14px;
  width: 34px;
  height: 34px;
  display: grid;
  place-items: center;
  border-radius: 50%;
  background: rgba(29,26,21,.55);
}
.insta-badge::before {
  content: '';
  display: block;
  width: 0; height: 0;
  margin-left: 3px;
  border-style: solid;
  border-width: 6px 0 6px 10px;
  border-color: transparent transparent transparent #fff;
}
/* ---- text panels ---- */
.insta-cell--note {
  width: calc(var(--w, 34) * 1vh);
  font-family: var(--font-serif);
  font-size: clamp(24px, 2.3vw, 38px);
  line-height: 1.08;
  color: var(--ink);
}
.insta-cell--headline,
.insta-cell--follow {
  display: flex;
  flex-direction: column;
  justify-content: center;   /* full-height lane → text reads vertically centred */
  /* Keep the centred text inside the nav-safe band so nothing tucks behind it. */
  padding-block: var(--insta-safe, 92px) 24px;
}
.insta-cell--headline { width: min(460px, 82vw); }
.insta-cell--follow { width: min(340px, 78vw); }
.insta-cell--headline .mega-statement {
  margin: 0;
  font-size: clamp(46px, 5.2vw, 104px);
  line-height: .94;
}
.insta-kicker {
  font-family: var(--font-sans);
  font-size: 13px;
  letter-spacing: .18em;
  text-transform: uppercase;
  color: var(--muted);
  margin-bottom: 18px;
}
.insta-lede {
  margin: 22px 0 0;
  max-width: 30ch;
  font-family: var(--font-sans);
  font-size: 16px;
  line-height: 1.6;
  color: var(--muted);
}
.insta-scrollcue {
  display: inline-flex;
  align-items: center;
  gap: 12px;
  margin-top: 34px;
  font-family: var(--font-sans);
  font-size: 12px;
  letter-spacing: .18em;
  text-transform: uppercase;
  color: var(--ink);
}
.insta-cell--follow h3 {
  margin: 0;
  font-family: var(--font-serif);
  font-size: clamp(30px, 3vw, 46px);
  line-height: 1.02;
  color: var(--ink);
}
.insta-cell--follow p {
  margin: 16px 0 26px;
  font-family: var(--font-sans);
  font-size: 16px;
  line-height: 1.6;
  color: var(--muted);
}
.insta-cell--follow .explore { align-self: flex-start; }

/* ---- HUD: post counter + progress bar, pinned to the stage ---- */
.insta-hud {
  position: absolute;
  left: 0; right: 0;
  bottom: clamp(20px, 3.2vh, 42px);
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 11px;
  pointer-events: none;
}
.insta-hud-idx {
  display: flex;
  align-items: baseline;
  gap: 7px;
  font-family: var(--font-sans);
  font-size: 13px;
  letter-spacing: .12em;
  color: var(--muted);
}
.insta-hud-idx b { color: var(--ink); font-weight: 600; }
.insta-hud-idx em { font-style: normal; opacity: .45; }
.insta-hud-idx i { font-style: normal; }
.insta-hud-bar {
  width: min(220px, 42vw);
  height: 2px;
  background: var(--line-soft);
  overflow: hidden;
}
.insta-hud-bar i {
  display: block;
  height: 100%;
  width: 100%;
  background: var(--ink);
  transform: scaleX(0);
  transform-origin: left center;
}

/* ---- reduced-motion / no-JS-pin fallback: a plain horizontal scroller.
   The vertical scatter is dropped so photos simply flow in a readable row. ---- */
.insta-native .insta-stage {
  position: static;
  height: auto;
  overflow-x: auto;
  overflow-y: hidden;
  align-items: flex-start;
  padding-block: clamp(40px, 6vh, 90px);
  -webkit-overflow-scrolling: touch;
}
.insta-native .insta-track { transform: none !important; height: auto; align-items: flex-start; }
.insta-native .insta-cell { height: auto; margin-left: 0; }
.insta-native .insta-place { position: static; top: auto; }
.insta-native .insta-hud { display: none; }
.insta-native .insta-frame img { transform: none !important; left: 0; width: 100%; }

@media (prefers-reduced-motion: reduce) {
  .insta-frame img { transition: none; }
}
@media (max-width: 760px) {
  .insta-track { gap: 16px; padding-inline: 16px; }
}

/* ============ HOMEPAGE QUICK CONSULT ============ */
.quick-consult-band {
  position: relative;
  /* The house image now runs behind the complete consult experience. */
  z-index: 4;
  min-height: 100svh;
  padding: 0;
  overflow: hidden;
  background: #101116;
  color: #f3f3f1;
}
.quick-consult-stage {
  position: relative;
  min-height: 100svh;
}
.quick-consult-title {
  position: absolute;
  z-index: 3;
  top: clamp(70px, 7vw, 108px);
  /* Centre the heading over the right-hand form surface, not the image seam. */
  left: 73%;
  width: max-content;
  max-width: 92vw;
  margin: 0;
  transform: translate3d(-50%, 0, 0);
  color: #fff !important;
  font-size: clamp(76px, 10.8vw, 166px);
  line-height: .84;
  letter-spacing: .09em;
  white-space: nowrap;
  pointer-events: none;
  text-shadow: 0 3px 20px rgba(0,0,0,.36);
  will-change: transform;
}
.quick-consult-visual {
  position: absolute;
  inset: 0;
  z-index: 0;
  overflow: hidden;
  background: #202126;
}
.quick-consult-visual > img {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
  object-position: 54% center;
  /* Keep the full-bleed house image crisp; the form panel blurs only the
     portion that sits beneath it. */
  filter: saturate(.98) contrast(.98) brightness(.88);
}
.quick-consult-visual-shade {
  position: absolute;
  inset: 0;
  background:
    linear-gradient(180deg, rgba(8,8,10,.14) 0%, rgba(8,8,10,.18) 45%, rgba(8,8,10,.42) 100%),
    linear-gradient(90deg, rgba(8,8,10,.04) 0%, rgba(8,8,10,.12) 100%);
}
.quick-consult-visual-copy {
  position: absolute;
  z-index: 1;
  left: clamp(28px, 4.5vw, 78px);
  right: clamp(28px, 4.5vw, 78px);
  top: clamp(38px, 5.5vw, 82px);
}
.quick-consult-visual-copy p {
  margin: 18px 0 0;
  color: #fff;
  font-family: var(--font-sans);
  font-size: 15px;
  font-weight: 450;
  letter-spacing: 0;
  text-transform: none;
  text-shadow: 0 2px 18px rgba(0,0,0,.48);
}
.quick-consult-visual-copy .quick-consult-no-spam {
  color: #fff !important;
  opacity: 1;
  font-weight: 500;
}
.quick-consult-visual-copy .quick-consult-estimate {
  max-width: 520px;
  margin: 0;
  color: #fff;
  font-family: var(--font-display);
  font-size: clamp(25px, 2.4vw, 39px);
  font-weight: 500;
  line-height: 1.1;
  letter-spacing: -.035em;
  text-shadow: 0 2px 22px rgba(0,0,0,.55);
}
.quick-consult-panel {
  position: relative;
  z-index: 2;
  display: flex;
  flex-direction: column;
  justify-content: flex-start;
  width: min(54%, 1050px);
  min-height: 100svh;
  margin-left: auto;
  min-width: 0;
  padding: clamp(210px, 16.5vw, 258px) clamp(32px, 4.5vw, 78px) clamp(38px, 4vw, 60px);
  /* The photo remains visible under the form, but this pane diffuses it enough
     to make every label and field easy to read. */
  background: linear-gradient(90deg, rgba(16,17,22,.4), rgba(16,17,22,.52));
  -webkit-backdrop-filter: blur(7px);
  backdrop-filter: blur(7px);
}
.quick-consult-form {
  display: grid;
  gap: clamp(20px, 2vw, 28px);
  width: min(100%, 900px);
  margin-inline: auto;
  padding: 0;
  border: 0;
  background: transparent;
}
.quick-consult-sentence,
.quick-consult-choice-group legend {
  color: #f3f3f1;
  font-family: var(--font-sans);
  font-size: clamp(19px, 1.65vw, 26px);
  font-weight: 390;
  line-height: 1.42;
  letter-spacing: -.025em;
}
.quick-consult-sentence {
  display: flex;
  align-items: baseline;
  flex-wrap: wrap;
  gap: 10px;
}
.quick-consult-name-row { flex-wrap: nowrap; }
.quick-consult-line {
  flex: 1 1 170px;
  min-width: 120px;
  border-bottom: 0;
  background-image: radial-gradient(circle, rgba(255,255,255,.62) .75px, transparent 1px);
  background-position: left bottom;
  background-repeat: repeat-x;
  background-size: 10px 2px;
}
.quick-consult-line--contact { flex-basis: 210px; }
.quick-consult-line--address { flex-basis: 360px; }
.quick-consult-line--note { flex-basis: 320px; }
.quick-consult-line:focus-within { background-image: linear-gradient(#fff, #fff); background-size: 100% 1px; }
.quick-consult-name-line {
  display: grid;
  grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
  column-gap: 22px;
  flex: 1 1 340px;
  min-width: 240px;
  border-bottom: 0;
}
.quick-consult-name-line label {
  min-width: 0;
  background-image: radial-gradient(circle, rgba(255,255,255,.62) .75px, transparent 1px);
  background-position: left bottom;
  background-repeat: repeat-x;
  background-size: 10px 2px;
}
.quick-consult-name-line label:focus-within { background-image: linear-gradient(#fff, #fff); background-size: 100% 1px; }
.quick-consult-name-line label + label { margin-left: 0; }
.quick-consult-name-line input,
.quick-consult-line input {
  width: 100%;
  min-width: 0;
  margin: 0;
  padding: 2px 2px 7px;
  border: 0;
  border-radius: 0;
  outline: 0;
  background: transparent;
  color: #fff;
  font-family: var(--font-sans);
  font-size: clamp(17px, 1.35vw, 21px);
  font-weight: 430;
  line-height: 1.35;
}
.quick-consult-name-line input::placeholder,
.quick-consult-line input::placeholder { color: rgba(243,243,241,.38); opacity: 1; }
.quick-consult-choice-group {
  min-width: 0;
  margin: 0;
  padding: 0;
  border: 0;
}
.quick-consult-choice-group legend {
  width: 100%;
  margin: 0 0 11px;
  padding: 0;
}
.quick-consult-options {
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
}
.quick-consult-options label {
  position: relative;
  display: inline-flex;
  align-items: center;
  cursor: pointer;
}
.quick-consult-options input {
  position: absolute;
  width: 1px;
  height: 1px;
  margin: 0;
  opacity: 0;
  pointer-events: none;
}
.quick-consult-options span {
  display: inline-flex;
  align-items: center;
  min-height: 37px;
  padding: 7px 14px 8px;
  border: 1px solid rgba(255,255,255,.45);
  border-radius: 999px;
  color: rgba(255,255,255,.78);
  background: transparent;
  font-family: var(--font-sans);
  font-size: clamp(13px, .95vw, 15px);
  line-height: 1.15;
  transition: color .18s ease, background .18s ease, border-color .18s ease, transform .18s ease;
}
.quick-consult-options label:hover span {
  color: #fff;
  border-color: #f3f0e9;
  transform: translateY(-1px);
}
.quick-consult-options input:checked + span {
  border-color: #f3f3f1;
  background: #f3f3f1;
  color: #101116;
}
.quick-consult-options input:focus-visible + span { outline: 2px solid #fff; outline-offset: 3px; }
.quick-consult-contact-row {
  display: grid;
  grid-template-columns: 1fr;
  gap: 14px;
}
.quick-consult-contact-row .quick-consult-sentence {
  align-content: start;
}
.quick-consult-footer {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 24px;
  padding-top: 18px;
  border-top: 1px solid rgba(243,243,241,.16);
}
.quick-consult-consent {
  display: grid;
  grid-template-columns: 17px minmax(0, 1fr);
  gap: 11px;
  max-width: 430px;
  color: rgba(243,243,241,.61);
  font-family: var(--font-sans);
  font-size: 11px;
  line-height: 1.45;
}
.quick-consult-consent input { width: 16px; height: 16px; margin: 1px 0 0; accent-color: #f3f3f1; }
.quick-consult-consent a { color: #f3f3f1; text-decoration: underline; text-underline-offset: 2px; }
.quick-consult-footer button,
.quick-consult-footer input[type="submit"] {
  flex: 0 0 auto;
  min-height: 50px;
  border: 1px solid #f3f3f1;
  border-radius: 6px;
  padding: 14px 20px;
  background: #f3f3f1;
  color: #101116;
  font-family: var(--font-sans);
  font-size: 14px;
  font-weight: 650;
  cursor: pointer;
  transition: background .18s ease, color .18s ease, border-color .18s ease;
}
.quick-consult-footer button:hover,
.quick-consult-footer input[type="submit"]:hover { background: #fff; border-color: #fff; color: #101116; }
.quick-consult-footer button:focus-visible,
.quick-consult-footer input[type="submit"]:focus-visible { outline: 2px solid #fff; outline-offset: 3px; }
.quick-consult-footer button:disabled,
.quick-consult-footer input[type="submit"]:disabled { opacity: .55; cursor: not-allowed; }
.quick-consult-form .form-status {
  min-height: 0;
  margin: -14px 0 0;
  color: rgba(243,243,241,.74);
}
.form-status--overlay {
  position: absolute !important;
  width: 1px !important;
  height: 1px !important;
  margin: -1px !important;
  padding: 0 !important;
  overflow: hidden !important;
  clip: rect(0 0 0 0) !important;
  white-space: nowrap !important;
  border: 0 !important;
}
.quick-consult-required {
  margin: -23px 0 0;
  color: rgba(243,243,241,.42);
  font-family: var(--font-sans);
  font-size: 10px;
  line-height: 1.4;
}
.quick-consult-confirmation {
  position: fixed;
  inset: 0;
  z-index: 10000;
  display: none;
  align-items: center;
  justify-items: center;
  box-sizing: border-box;
  overflow-y: auto;
  padding: 24px;
  background: rgba(7,8,11,.72);
  -webkit-backdrop-filter: blur(10px);
  backdrop-filter: blur(10px);
  color: #f3f3f1;
  outline: 0;
}
.quick-consult-confirmation.is-visible,
.quick-consult-confirmation:target { display: grid; }
.quick-consult-confirmation__content {
  width: min(100%, 560px);
  box-sizing: border-box;
  padding: clamp(28px, 4vw, 46px);
  border: 1px solid rgba(255,255,255,.25);
  border-radius: 14px;
  background: rgba(21,23,29,.9);
  box-shadow: 0 24px 72px rgba(0,0,0,.4);
  text-align: center;
}
.quick-consult-confirmation__check {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 46px;
  height: 46px;
  margin: 0 auto 18px;
  border-radius: 999px;
  background: #f3f3f1;
  color: #101116;
  font-size: 24px;
  line-height: 1;
}
.quick-consult-confirmation__title {
  margin: 0 0 8px;
  color: #fff;
  font-family: var(--font-sans);
  font-size: clamp(21px, 1.9vw, 28px);
  font-weight: 460;
  letter-spacing: -.02em;
}
.quick-consult-confirmation__note {
  max-width: 46ch;
  margin: 0 auto;
  color: rgba(243,243,241,.72);
  font-family: var(--font-sans);
  font-size: 15px;
  line-height: 1.5;
}
.quick-consult-confirmation__note a { color: #fff; text-decoration: underline; text-underline-offset: 2px; }
.quick-consult-confirmation__dismiss {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-height: 42px;
  margin-top: 26px;
  padding: 9px 16px;
  border: 1px solid rgba(255,255,255,.65);
  border-radius: 6px;
  color: #fff;
  font-family: var(--font-sans);
  font-size: 14px;
  font-weight: 600;
  text-decoration: none;
}
.quick-consult-confirmation__dismiss:hover { background: #fff; color: #101116; }
.quick-consult-confirmation__dismiss:focus-visible { outline: 2px solid #fff; outline-offset: 3px; }

/* JavaScript delivery feedback is a viewport overlay. It must never consume
   space in a form whose panel is deliberately viewport-sized or scroll-pinned. */
.form-delivery-overlay[hidden] { display: none; }
.form-delivery-overlay {
  position: fixed;
  inset: 0;
  z-index: 10001;
  display: grid;
  place-items: center;
  box-sizing: border-box;
  overflow-y: auto;
  padding: 24px;
  background: rgba(7,8,11,.72);
  -webkit-backdrop-filter: blur(10px);
  backdrop-filter: blur(10px);
}
.form-delivery-overlay__dialog {
  width: min(100%, 560px);
  box-sizing: border-box;
  padding: clamp(28px, 4vw, 46px);
  border: 1px solid rgba(255,255,255,.25);
  border-radius: 14px;
  background: rgba(21,23,29,.94);
  box-shadow: 0 24px 72px rgba(0,0,0,.4);
  color: #f3f3f1;
  font-family: var(--font-sans);
  text-align: center;
}
.form-delivery-overlay__mark {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 46px;
  height: 46px;
  margin: 0 auto 18px;
  border-radius: 999px;
  background: #f3f3f1;
  color: #101116;
  font-size: 24px;
  line-height: 1;
}
.form-delivery-overlay[data-state="error"] .form-delivery-overlay__mark {
  background: #f0c4b7;
  color: #6b1d15;
}
.form-delivery-overlay__title {
  margin: 0 0 8px;
  color: #fff;
  font-size: clamp(21px, 1.9vw, 28px);
  font-weight: 500;
  letter-spacing: -.02em;
}
.form-delivery-overlay__message {
  max-width: 46ch;
  margin: 0 auto;
  color: rgba(243,243,241,.78);
  font-size: 15px;
  line-height: 1.5;
}
.form-delivery-overlay__dismiss {
  min-height: 42px;
  margin-top: 26px;
  padding: 9px 16px;
  border: 1px solid rgba(255,255,255,.65);
  border-radius: 6px;
  background: transparent;
  color: #fff;
  font: 600 14px var(--font-sans);
  cursor: pointer;
}
.form-delivery-overlay__dismiss:hover { background: #fff; color: #101116; }
.form-delivery-overlay__dismiss:focus-visible { outline: 2px solid #fff; outline-offset: 3px; }

/* The same pill-style choice lives in the detailed Schedule form, using its
   light-surface colors so the shared interaction stays recognizable. */
.intake-form .meeting-format { margin-top: 2px; }
.intake-form .meeting-format legend { color: var(--muted); }
.intake-form .meeting-format-options label {
  position: relative;
  display: block;
  flex: 1;
  min-width: 0;
}
.intake-form .meeting-format-options input {
  position: absolute;
  width: auto;
  height: auto;
  margin: 0;
  opacity: 0;
  pointer-events: none;
}
.intake-form .meeting-format-options span {
  display: flex;
  align-items: center;
  justify-content: center;
  min-height: 48px;
  padding: 10px 14px;
  border: 1px solid var(--line);
  color: var(--ink-soft);
  background: transparent;
}
.intake-form .meeting-format-options input:checked + span {
  border-color: var(--ink);
  background: var(--ink);
  color: var(--paper);
}
.intake-form .meeting-format-options input:focus-visible + span { outline: 2px solid var(--ink); outline-offset: 2px; }

@media (max-width: 980px) {
  .quick-consult-band { min-height: 0; }
  .quick-consult-title { top: clamp(70px, 10vw, 92px); left: 50%; font-size: clamp(68px, 14vw, 112px); }
  .quick-consult-visual-copy { display: none; }
  .quick-consult-panel {
    width: 100%;
    min-height: 0;
    padding: clamp(160px, 22vw, 210px) clamp(28px, 8vw, 76px) clamp(56px, 9vw, 88px);
    background: rgba(16,17,22,.52);
  }
}
@media (max-width: 680px) {
  .quick-consult-title { top: 66px; font-size: clamp(58px, 17vw, 86px); }
  .quick-consult-panel { padding: 138px 24px 60px; }
  .quick-consult-form { gap: 31px; }
  .quick-consult-name-row { flex-wrap: wrap; }
  .quick-consult-name-row > span { width: 100%; }
  .quick-consult-options { gap: 8px; }
  .quick-consult-options span { min-height: 39px; padding: 7px 13px 8px; }
  .quick-consult-contact-row { grid-template-columns: 1fr; gap: 30px; }
  .quick-consult-footer { align-items: stretch; flex-direction: column; padding-top: 22px; }
  .quick-consult-footer button,
  .quick-consult-footer input[type="submit"] { width: 100%; }
  .quick-consult-required { margin-top: -17px; }
}
@media (prefers-reduced-motion: reduce) {
  .quick-consult-options span { transition: none; }
  .quick-consult-options label:hover span { transform: none; }
}

/* Photo-first consult arrival. JavaScript only arms this treatment for visitors
   who have not requested reduced motion, keeping the complete form readable
   without JavaScript. The image stays locked in place; its full-bleed glass
   surface appears only after the photograph has filled the screen. */
html.quick-consult-scroll-ready .quick-consult-visual > img {
  inset: 0;
  height: 100%;
  object-position: 50% 46%;
  filter: saturate(1.04) contrast(1.04) brightness(.98);
  transform: none;
  will-change: auto;
}
html.quick-consult-scroll-ready .quick-consult-visual-shade,
html.quick-consult-scroll-ready .quick-consult-visual-copy,
html.quick-consult-scroll-ready .quick-consult-title,
html.quick-consult-scroll-ready .quick-consult-panel {
  opacity: 0;
}
html.quick-consult-scroll-ready .quick-consult-visual-shade {
  transition: opacity .8s ease;
}
html.quick-consult-scroll-ready .quick-consult-title {
  z-index: 3;
  left: 50%;
  transform: translate3d(-50%, 14px, 0) scale(.92);
  letter-spacing: .08em;
  transition: opacity .6s ease .08s, transform .7s cubic-bezier(.18,.82,.22,1) .08s, letter-spacing .7s ease .08s;
}
html.quick-consult-scroll-ready .quick-consult-visual-copy {
  z-index: 3;
  transform: translate3d(0, 12px, 0);
  transition: opacity .55s ease .28s, transform .6s ease .28s;
}
html.quick-consult-scroll-ready .quick-consult-panel {
  width: 100%;
  min-height: 100svh;
  margin-left: 0;
  padding-inline: clamp(28px, 10vw, 180px);
  overflow: hidden;
  background: linear-gradient(135deg, rgba(12,13,17,.66), rgba(16,17,22,.48));
  -webkit-backdrop-filter: blur(14px) saturate(.84);
  backdrop-filter: blur(14px) saturate(.84);
  pointer-events: none;
  visibility: hidden;
  transform: none;
  transition: opacity .58s ease, visibility 0s linear .58s;
}
html.quick-consult-scroll-ready .quick-consult-panel::before {
  content: none;
}
html.quick-consult-scroll-ready .quick-consult-panel .quick-consult-form {
  opacity: 0;
  transform: translate3d(0, 16px, 0);
  transition: opacity .55s ease .3s, transform .65s ease .3s;
}
html.quick-consult-scroll-ready .quick-consult-band.is-settled .quick-consult-visual-shade,
html.quick-consult-scroll-ready .quick-consult-band.is-settled .quick-consult-visual-copy,
html.quick-consult-scroll-ready .quick-consult-band.is-settled .quick-consult-title,
html.quick-consult-scroll-ready .quick-consult-band.is-settled .quick-consult-panel {
  opacity: 1;
}
html.quick-consult-scroll-ready .quick-consult-band.is-settled .quick-consult-title,
html.quick-consult-scroll-ready .quick-consult-band.is-settled .quick-consult-visual-copy {
  transform: none;
}
html.quick-consult-scroll-ready .quick-consult-band.is-settled .quick-consult-title {
  transform: translate3d(-50%, 0, 0);
  letter-spacing: .09em;
}
html.quick-consult-scroll-ready .quick-consult-band.is-settled .quick-consult-panel {
  transform: none;
}
html.quick-consult-scroll-ready .quick-consult-band.is-settled .quick-consult-panel {
  pointer-events: auto;
  visibility: visible;
  transition-delay: 0s;
}
html.quick-consult-scroll-ready .quick-consult-band.is-settled .quick-consult-panel .quick-consult-form {
  opacity: 1;
  transform: none;
}
html.quick-consult-scroll-ready .quick-consult-required {
  color: #fff;
}

/* On desktop the photograph/form becomes a deliberate one-screen stop. The
   outer section adds a short hold for the reveal, then releases promptly back
   into the page. The two-column form keeps every control inside the frame. */
@media (min-width: 981px) {
  html.quick-consult-scroll-ready .quick-consult-band {
    height: 155svh;
    min-height: 155svh;
    overflow: visible;
  }
  html.quick-consult-scroll-ready .quick-consult-stage {
    position: sticky;
    top: 0;
    height: 100svh;
    min-height: 100svh;
    overflow: hidden;
  }
  html.quick-consult-scroll-ready .quick-consult-panel {
    position: absolute;
    inset: 0;
    height: 100%;
    min-height: 0;
    padding: clamp(290px, 33vh, 312px) clamp(44px, 8vw, 140px) 20px;
    overflow-y: auto;
  }
  html.quick-consult-scroll-ready .quick-consult-title {
    top: clamp(126px, 14.5vh, 142px);
    font-size: clamp(74px, 8.8vw, 134px);
  }
  html.quick-consult-scroll-ready .quick-consult-visual-copy {
    top: clamp(192px, 24vh, 224px);
    left: 50%;
    right: auto;
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 5px;
    width: max-content;
    max-width: 90vw;
    transform: translate3d(-50%, 12px, 0);
    text-align: center;
    white-space: nowrap;
  }
  html.quick-consult-scroll-ready .quick-consult-visual-copy p {
    margin: 0;
  }
  html.quick-consult-scroll-ready .quick-consult-visual-copy .quick-consult-estimate {
    max-width: none;
  }
  html.quick-consult-scroll-ready .quick-consult-band.is-settled .quick-consult-visual-copy {
    transform: translate3d(-50%, 0, 0);
  }
  html.quick-consult-scroll-ready .quick-consult-form {
    grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
    gap: clamp(18px, 2.4vh, 25px) clamp(46px, 5vw, 76px);
    width: min(100%, 1180px);
  }
  html.quick-consult-scroll-ready .quick-consult-name-row {
    grid-column: 1;
    grid-row: 1;
  }
  html.quick-consult-scroll-ready .quick-consult-choice-group:not(.quick-consult-choice-group--meeting) {
    grid-column: 1 / -1;
    grid-row: 2;
  }
  html.quick-consult-scroll-ready .quick-consult-choice-group--meeting {
    grid-column: 2;
    grid-row: 1;
  }
  html.quick-consult-scroll-ready .quick-consult-contact-row {
    grid-column: 1;
    grid-row: 3;
    gap: 13px;
  }
  html.quick-consult-scroll-ready .quick-consult-address-row {
    grid-column: 2;
    grid-row: 3;
  }
  html.quick-consult-scroll-ready .quick-consult-note-row {
    grid-column: 1 / -1;
    grid-row: 4;
  }
  html.quick-consult-scroll-ready .quick-consult-footer,
  html.quick-consult-scroll-ready .quick-consult-required {
    grid-column: 1 / -1;
  }
  html.quick-consult-scroll-ready .quick-consult-footer {
    grid-row: 5;
    padding-top: 17px;
  }
  html.quick-consult-scroll-ready .quick-consult-required {
    grid-row: 6;
    margin: -4px 0 0;
  }
  html.quick-consult-scroll-ready .quick-consult-sentence,
  html.quick-consult-scroll-ready .quick-consult-choice-group legend {
    font-size: clamp(17px, 1.25vw, 21px);
  }
  html.quick-consult-scroll-ready .quick-consult-options span {
    min-height: 32px;
    padding: 5px 11px 6px;
    font-size: clamp(12px, .82vw, 14px);
  }

  html.quick-consult-scroll-ready .quick-consult-form {
    grid-template-columns: minmax(0, 1fr);
    width: min(100%, 760px);
    gap: 14px;
  }
  html.quick-consult-scroll-ready .quick-consult-name-row,
  html.quick-consult-scroll-ready .quick-consult-choice-group:not(.quick-consult-choice-group--meeting),
  html.quick-consult-scroll-ready .quick-consult-choice-group--meeting,
  html.quick-consult-scroll-ready .quick-consult-contact-row,
  html.quick-consult-scroll-ready .quick-consult-address-row,
  html.quick-consult-scroll-ready .quick-consult-note-row,
  html.quick-consult-scroll-ready .quick-consult-footer,
  html.quick-consult-scroll-ready .quick-consult-required {
    grid-column: 1;
    grid-row: auto;
  }
  html.quick-consult-scroll-ready .quick-consult-contact-row { gap: 8px; }
  html.quick-consult-scroll-ready .quick-consult-footer { padding-top: 10px; }
}

/* ============ HOMEPAGE SERVICE AREAS ============ */
body.home-composed #areas .section-head {
  display: block;
  margin-bottom: clamp(42px, 5vw, 68px);
}
body.home-composed #areas .section-head h2 {
  max-width: 760px;
  margin: 0;
}
body.home-composed #areas .regions {
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: clamp(42px, 7vw, 110px);
  max-width: 1120px;
}
body.home-composed #areas .region h3 {
  margin: 0 0 16px;
  font-size: clamp(23px, 2.3vw, 32px);
  line-height: 1.18;
}
body.home-composed #areas .region .cities {
  max-width: 470px;
  margin: 0;
  color: var(--muted);
  font-size: 16px;
  line-height: 1.65;
}
body.home-composed #areas .regions-note {
  max-width: none;
  margin-top: clamp(40px, 5vw, 64px);
}
body.home-composed #areas .regions-note .explore { margin-top: 0; }

@media (max-width: 760px) {
  body.home-composed #areas .regions {
    grid-template-columns: 1fr;
    gap: 34px;
  }
  body.home-composed #areas .region h3 { margin-bottom: 10px; }
  body.home-composed #areas .regions-note { margin-top: 38px; }
}

/* ============ SECTION SEPARATORS ============
   Major page chapters are separated by space, color, and imagery—never rules. */
main > section,
main > section::before,
main > section::after,
main > div,
main + .site-footer {
  border-top: 0 !important;
  border-bottom: 0 !important;
}

/* ============ HOMEPAGE DOCKED NAV: UPWARD MENUS ============
   Before it reaches the viewport top, the homepage header is docked directly
   beneath the hero video. Its menus should open back over the video rather
   than cover the content that follows. Once the header is sticky at the top,
   the usual downward-opening navigation remains in use. */
@media (min-width: 1181px) and (min-height: 561px) {
  body.home-composed .site-header.nav-opens-up .nav-group-left .nav-dropdown {
    top: auto;
    bottom: 100%;
    transform: translateY(-6px);
  }

  body.home-composed .site-header.nav-opens-up .nav-group-left .nav-trades.open .nav-dropdown {
    transform: translateY(-2px);
  }

  body.home-composed .site-header.nav-opens-up .nav-group-left .nav-dropdown::before {
    top: auto;
    bottom: -14px;
  }
}

@media (max-width: 1180px), (max-height: 560px) {
  body.home-composed .site-header.nav-opens-up .nav-links {
    top: auto;
    bottom: 100%;
    max-height: calc(100svh - var(--home-nav-dock-height, 72px));
    overflow-y: auto;
  }
}

/* ============ WINDOWS: TYPE GUIDE ============
   No ruled catalogue grid: the type names create the rhythm, while the
   project image gives the shorter door-and-glass run a visual counterweight. */
body.accent-windows #products .split {
  display: block;
}
body.accent-windows #products .split > div:first-child > h2 {
  max-width: 760px;
  font-size: clamp(44px, 5.4vw, 76px);
}
body.accent-windows #products .split > div:first-child > p:not(.eyebrow) {
  max-width: 34rem;
  margin: 0 0 clamp(54px, 6vw, 94px);
  color: var(--muted);
  font-size: clamp(18px, 1.45vw, 21px);
  line-height: 1.5;
}
body.accent-windows #products .product-list {
  display: grid;
  grid-template-columns: repeat(12, minmax(0, 1fr));
  align-items: start;
  gap: clamp(58px, 7vw, 108px) clamp(28px, 4vw, 64px);
}
body.accent-windows #products .product-row {
  display: block;
  min-width: 0;
  padding: 0;
  border: 0;
}
body.accent-windows #products .product-row:nth-child(1),
body.accent-windows #products .product-row:nth-child(4) { grid-column: 1 / span 4; }
body.accent-windows #products .product-row:nth-child(2),
body.accent-windows #products .product-row:nth-child(5) {
  grid-column: 5 / span 4;
  margin-top: clamp(24px, 3vw, 52px);
}
body.accent-windows #products .product-row:nth-child(3),
body.accent-windows #products .product-row:nth-child(6) { grid-column: 9 / -1; }
body.accent-windows #products .product-row:nth-child(7) {
  grid-column: 1 / span 4;
  grid-row: 3;
  margin-top: clamp(20px, 3vw, 48px);
}
body.accent-windows #products .product-row:nth-child(8) { grid-column: 1 / span 4; grid-row: 4; }
body.accent-windows #products .product-row:nth-child(9) { grid-column: 1 / span 4; grid-row: 5; }
body.accent-windows #products .product-label {
  margin: 0 0 13px;
  font-size: clamp(27px, 2.5vw, 38px);
  line-height: 1.04;
}
body.accent-windows #products .product-label span {
  margin: 0 0 13px;
  font-size: 16px;
  letter-spacing: 0;
  text-transform: none;
}
body.accent-windows #products .product-body p {
  max-width: 28ch;
  margin: 0;
  color: var(--muted);
  font-size: 18px;
  line-height: 1.5;
}
body.accent-windows #products .product-list .media {
  grid-column: 5 / -1;
  grid-row: 3 / span 3;
  width: auto;
  margin: clamp(18px, 2vw, 36px) 0 0;
}
body.accent-windows #products .product-list .media img {
  aspect-ratio: 3 / 2;
}

@media (max-width: 980px) {
  body.accent-windows #products .product-list {
    grid-template-columns: repeat(2, minmax(0, 1fr));
    gap: 58px 40px;
  }
  body.accent-windows #products .product-row:nth-child(n) {
    grid-column: auto;
    grid-row: auto;
    margin-top: 0;
  }
  body.accent-windows #products .product-list .media {
    grid-column: 1 / -1;
    grid-row: auto;
    width: min(100%, 720px);
    margin: 8px 0 0 auto;
  }
}

@media (max-width: 640px) {
  body.accent-windows #products .product-list { grid-template-columns: 1fr; gap: 46px; }
  body.accent-windows #products .product-label { font-size: clamp(28px, 8vw, 36px); }
  body.accent-windows #products .product-list .media {
    grid-column: 1;
    width: 100%;
    margin-top: 14px;
  }
}

/* ============ SIDING + COMMERCIAL: EDITORIAL GUIDES ============
   These are short field guides, not rows in a catalogue. The image shares
   the composition with the final items so the page never becomes a long,
   boxed text rail. */
body.accent-siding #products .split,
body.accent-commercial .commercial-process .split,
body.accent-commercial .commercial-scope .split {
  display: block;
}
body.accent-siding #products .split > div:first-child > h2,
body.accent-commercial .commercial-process .split > div:first-child > h2,
body.accent-commercial .commercial-scope .split > div:first-child > h2 {
  max-width: 760px;
  font-size: clamp(44px, 5.4vw, 76px);
}
body.accent-siding #products .split > div:first-child > p:not(.eyebrow),
body.accent-commercial .commercial-process .split > div:first-child > p:not(.eyebrow),
body.accent-commercial .commercial-scope .split > div:first-child > p:not(.eyebrow) {
  max-width: 34rem;
  margin: 0 0 clamp(54px, 6vw, 94px);
  color: var(--muted);
  font-size: clamp(18px, 1.45vw, 21px);
  line-height: 1.5;
}

body.accent-siding #products .product-list,
body.accent-commercial .commercial-scope .product-list {
  display: grid;
  grid-template-columns: repeat(12, minmax(0, 1fr));
  align-items: start;
  gap: clamp(58px, 7vw, 108px) clamp(28px, 4vw, 64px);
}
body.accent-siding #products .product-row,
body.accent-commercial .commercial-scope .product-row,
body.accent-commercial .commercial-process .product-row {
  display: block;
  min-width: 0;
  padding: 0;
  border: 0;
}
body.accent-siding #products .product-label,
body.accent-commercial .commercial-scope .product-label,
body.accent-commercial .commercial-process .product-label {
  margin: 0 0 13px;
  font-size: clamp(27px, 2.5vw, 38px);
  line-height: 1.04;
}
body.accent-siding #products .product-body p,
body.accent-commercial .commercial-scope .product-body p,
body.accent-commercial .commercial-process .product-body p {
  max-width: 28ch;
  margin: 0;
  color: var(--muted);
  font-size: 18px;
  line-height: 1.5;
}

body.accent-siding #products .product-row:nth-child(1),
body.accent-commercial .commercial-scope .product-row:nth-child(1) { grid-column: 1 / span 4; }
body.accent-siding #products .product-row:nth-child(2),
body.accent-commercial .commercial-scope .product-row:nth-child(2) {
  grid-column: 5 / span 4;
  margin-top: clamp(24px, 3vw, 52px);
}
body.accent-siding #products .product-row:nth-child(3),
body.accent-commercial .commercial-scope .product-row:nth-child(3) { grid-column: 9 / -1; }
body.accent-siding #products .product-row:nth-child(4),
body.accent-commercial .commercial-scope .product-row:nth-child(4) {
  grid-column: 1 / span 4;
  grid-row: 2;
  margin-top: clamp(20px, 3vw, 48px);
}
body.accent-siding #products .product-row:nth-child(5),
body.accent-commercial .commercial-scope .product-row:nth-child(5) { grid-column: 1 / span 4; grid-row: 3; }
body.accent-commercial .commercial-scope .product-row:nth-child(6) { grid-column: 1 / span 4; grid-row: 4; }
body.accent-siding #products .product-list .media,
body.accent-commercial .commercial-scope .product-list .media {
  grid-column: 5 / -1;
  width: auto;
  margin: clamp(18px, 2vw, 36px) 0 0;
}
body.accent-siding #products .product-list .media { grid-row: 2 / span 2; }
body.accent-commercial .commercial-scope .product-list .media { grid-row: 2 / span 3; }
body.accent-siding #products .product-list .media img,
body.accent-commercial .commercial-scope .product-list .media img { aspect-ratio: 3 / 2; }

body.accent-commercial .commercial-process .product-list {
  display: grid;
  grid-template-columns: repeat(12, minmax(0, 1fr));
  align-items: start;
  gap: clamp(58px, 7vw, 108px) clamp(28px, 4vw, 64px);
}
body.accent-commercial .commercial-process .product-row:nth-child(1) { grid-column: 1 / span 4; }
body.accent-commercial .commercial-process .product-row:nth-child(2) {
  grid-column: 5 / span 4;
  margin-top: clamp(24px, 3vw, 52px);
}
body.accent-commercial .commercial-process .product-row:nth-child(3) { grid-column: 1 / span 4; grid-row: 2; }
body.accent-commercial .commercial-process .product-row:nth-child(4) {
  grid-column: 5 / span 4;
  grid-row: 2;
  margin-top: clamp(24px, 3vw, 52px);
}
body.accent-commercial .commercial-process .product-list .media {
  grid-column: 9 / -1;
  grid-row: 1 / span 2;
  width: auto;
  margin: 0;
}
body.accent-commercial .commercial-process .product-list .media img {
  aspect-ratio: 3 / 4;
  object-fit: cover;
}

@media (max-width: 980px) {
  body.accent-siding #products .product-list,
  body.accent-commercial .commercial-process .product-list,
  body.accent-commercial .commercial-scope .product-list {
    grid-template-columns: repeat(2, minmax(0, 1fr));
    gap: 58px 40px;
  }
  body.accent-siding #products .product-row:nth-child(n),
  body.accent-commercial .commercial-process .product-row:nth-child(n),
  body.accent-commercial .commercial-scope .product-row:nth-child(n) {
    grid-column: auto;
    grid-row: auto;
    margin-top: 0;
  }
  body.accent-siding #products .product-list .media,
  body.accent-commercial .commercial-process .product-list .media,
  body.accent-commercial .commercial-scope .product-list .media {
    grid-column: 1 / -1;
    grid-row: auto;
    width: min(100%, 720px);
    margin: 8px 0 0 auto;
  }
  body.accent-commercial .commercial-process .product-list .media img { aspect-ratio: 3 / 2; }
}

@media (max-width: 640px) {
  body.accent-siding #products .product-list,
  body.accent-commercial .commercial-process .product-list,
  body.accent-commercial .commercial-scope .product-list { grid-template-columns: 1fr; gap: 46px; }
  body.accent-siding #products .product-label,
  body.accent-commercial .commercial-process .product-label,
  body.accent-commercial .commercial-scope .product-label { font-size: clamp(28px, 8vw, 36px); }
  body.accent-siding #products .product-list .media,
  body.accent-commercial .commercial-process .product-list .media,
  body.accent-commercial .commercial-scope .product-list .media {
    grid-column: 1;
    width: 100%;
    margin-top: 14px;
  }
}

/* ============================================================
   HAIRLINE SECTION-DIVIDER REMOVAL (v31.53)
   Drops the remaining decorative 1px horizontal rules that the
   earlier de-template pass didn't reach — the roofing editorial
   blocks (disclosure brackets, System opener, layer rows) and the
   .ed-quote top rule used on long-form pages. Separation comes from
   whitespace + band color, matching the site-wide de-template pass.
   Placed at end-of-file so it out-orders the definitions at ~12337+.
   KEPT: framed cards (.advisor-body, .intake-form), FAQ accordion
   rows, buttons, links, and photo/figure frames — none are dividers.
   ============================================================ */
body.roofing-composed .section-disclosure { border-top: 0; border-bottom: 0; }
.rsys-opener { border-bottom: 0; }
.rsys-item { border-bottom: 0; }
.ed-quote { border-top: 0; }

/* ============ SIDING + GUTTERS: SYSTEM INTRODUCTIONS ============ */
body.accent-siding .siding-intro,
body.accent-gutters .gutter-analysis {
  padding: clamp(76px, 10vw, 148px) 36px;
  background: transparent !important;
  text-align: center;
}
body.accent-siding .siding-intro .band-inner,
body.accent-gutters .gutter-analysis .band-inner { max-width: 1060px; }
body.accent-siding .siding-intro h2,
body.accent-gutters .gutter-analysis h2 {
  max-width: 18ch;
  margin: 0 auto;
  font-family: var(--font-display);
  font-size: clamp(42px, 6.2vw, 88px);
  font-weight: 700;
  line-height: 1.04;
  letter-spacing: -0.03em;
  color: #24282c;
  text-wrap: balance;
}
@media (max-width: 640px) {
  body.accent-siding .siding-intro,
  body.accent-gutters .gutter-analysis { padding-inline: 24px; }
}

/* ============ WINDOWS: FOUNDER EXPERIENCE ============ */
body.accent-windows .window-founder-note {
  padding: clamp(76px, 10vw, 148px) 36px;
  background: transparent !important;
}
body.accent-windows .window-founder-note .band-inner { max-width: 1180px; }
.window-founder-note__intro {
  max-width: 1050px;
  margin: 0 auto;
  text-align: center;
}
.window-founder-note__intro h2 {
  margin: 0;
  font-family: var(--font-display);
  font-size: clamp(30px, 3.8vw, 58px);
  font-weight: 400;
  line-height: 1.06;
  letter-spacing: -.035em;
  color: #171b1e;
}
.window-founder-note__intro strong { font-weight: 700; color: inherit; }
.window-founder-note__quote { margin: clamp(54px, 7vw, 96px) 0 0; }
.window-founder-note__lead {
  max-width: 26ch;
  margin: 0 0 clamp(30px, 4vw, 48px);
  font-family: var(--font-serif);
  font-size: clamp(28px, 3.2vw, 44px);
  font-style: italic;
  font-weight: 400;
  line-height: 1.05;
  color: #24282c;
}
.window-founder-note__lessons {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: clamp(28px, 4vw, 64px);
  margin: 0;
  padding: 0;
  list-style: none;
}
.window-founder-note__lessons li { min-width: 0; }
.window-founder-note__lessons span {
  display: block;
  margin-bottom: 18px;
  font-family: var(--font-sans);
  font-size: 12px;
  font-weight: 700;
  letter-spacing: .14em;
  color: #727b82;
}
.window-founder-note__lessons p {
  margin: 0;
  font-size: clamp(16px, 1.3vw, 19px);
  line-height: 1.55;
  color: #343a3f;
}
.window-founder-note__close {
  max-width: 60ch;
  margin: clamp(42px, 5vw, 68px) 0 0 auto;
  font-family: var(--font-display);
  font-size: clamp(24px, 2.55vw, 38px);
  font-weight: 600;
  line-height: 1.12;
  letter-spacing: -.025em;
  color: #24282c;
}
.window-founder-note__quote cite {
  display: block;
  margin-top: 18px;
  font-family: var(--font-sans);
  font-size: 12px;
  font-style: normal;
  font-weight: 700;
  letter-spacing: .12em;
  text-transform: uppercase;
  color: #727b82;
}
@media (max-width: 760px) {
  body.accent-windows .window-founder-note { padding: 74px 24px 82px; }
  .window-founder-note__lessons { grid-template-columns: 1fr; gap: 30px; }
  .window-founder-note__close { margin-left: 0; }
}

body.accent-windows #partners .partners-copy {
  max-width: 680px;
  margin: -16px auto 4px;
  font-size: clamp(16px, 1.3vw, 19px);
  line-height: 1.55;
  text-align: center;
  color: #4d5358;
}

body.accent-windows .sf-panel__pad--window {
  display: grid;
  gap: clamp(26px, 3.5vw, 48px);
  padding: clamp(30px, 4vw, 54px);
}
body.accent-windows .sf-panel__pad--window p {
  max-width: none;
  font-size: clamp(15px, 1.15vw, 18px);
  line-height: 1.6;
}
body.accent-windows .sf-panel__pad--window .sf-sub {
  margin-top: 0;
  font-size: clamp(13px, 1vw, 15px);
}
.sf-panel__pad--in-depth {
  display: grid;
  gap: clamp(26px, 3.5vw, 48px);
  padding: clamp(30px, 4vw, 54px);
}
.sf-panel__pad--in-depth p {
  max-width: none;
  font-size: clamp(15px, 1.15vw, 18px);
  line-height: 1.6;
}
.sf-panel__pad--in-depth .sf-sub {
  margin-top: 0;
  font-size: clamp(13px, 1vw, 15px);
}
.product-panel__intro { max-width: 72ch; }
.product-panel__columns {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: clamp(32px, 6vw, 108px);
}
.product-panel__columns > div { min-width: 0; }
.window-panel__intro { max-width: 72ch; }
.window-panel__columns {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: clamp(32px, 6vw, 108px);
}
.window-panel__columns > div { min-width: 0; }
.window-panel__term {
  max-width: 78ch;
  color: #666157;
}
.window-panel__term a { color: inherit; }
.material-definition {
  max-width: 78ch;
  margin-top: 28px;
  color: #666157;
}
.material-definition p {
  font-size: clamp(15px, 1.15vw, 18px);
  line-height: 1.6;
}
.material-definition .sf-sub {
  margin-bottom: 6px;
  font-size: clamp(13px, 1vw, 15px);
}
.material-definition a { color: inherit; }
@media (max-width: 760px) {
  body.accent-windows .sf-panel__pad--window { padding: 28px 20px 32px; }
  .sf-panel__pad--in-depth { padding: 28px 20px 32px; }
  .product-panel__columns { grid-template-columns: 1fr; gap: 32px; }
  .window-panel__columns { grid-template-columns: 1fr; gap: 32px; }
}

/* Commercial take */
body.accent-commercial .commercial-take {
  padding: clamp(84px, 10vw, 154px) 0 clamp(92px, 11vw, 170px);
}
body.accent-commercial .commercial-take .band-inner { max-width: 930px; }
body.accent-commercial .commercial-take__quote {
  margin: 0;
  color: #171b1e;
}
body.accent-commercial .commercial-take__quote p {
  max-width: 52ch;
  margin: 0;
  font-size: clamp(20px, 1.8vw, 28px);
  line-height: 1.36;
}
body.accent-commercial .commercial-take__quote .commercial-take__lead {
  max-width: 24ch;
  font-family: var(--font-serif);
  font-size: clamp(38px, 5.2vw, 72px);
  font-weight: 400;
  line-height: .99;
  letter-spacing: -.045em;
}
body.accent-commercial .commercial-take__quote p + p { margin-top: 22px; }
body.accent-commercial .commercial-take__quote p:last-child {
  color: #30363a;
  font-style: italic;
}
body.accent-commercial .commercial-fit-note {
  max-width: 52ch;
  margin: clamp(38px, 5vw, 66px) 0 0;
  color: #30363a;
  font-family: var(--font-sans);
  font-size: clamp(15px, 1.15vw, 18px);
  font-weight: 600;
  line-height: 1.5;
}
@media (max-width: 760px) {
  body.accent-commercial .commercial-take { padding: 74px 0 82px; }
  body.accent-commercial .commercial-take__quote p { font-size: clamp(20px, 5.6vw, 27px); }
  body.accent-commercial .commercial-take__quote .commercial-take__lead { font-size: clamp(38px, 11vw, 56px); }
}

/* Commercial: direct before/after proof from the former live commercial page. */
body.accent-commercial .commercial-before-after {
  padding: clamp(36px, 5vw, 64px) 36px;
  background: transparent !important;
  color: var(--ink);
}
body.accent-commercial .commercial-before-after .band-inner { max-width: 1180px; }
.commercial-before-after__head {
  display: grid;
  grid-template-columns: minmax(0, 1fr) minmax(240px, .48fr);
  align-items: end;
  gap: 36px 72px;
  margin-bottom: clamp(34px, 5vw, 60px);
}
.commercial-before-after__head .eyebrow { color: var(--muted); }
.commercial-before-after__head h2 {
  max-width: 15ch;
  margin: 14px 0 0;
  color: var(--ink);
  font-size: clamp(38px, 5vw, 68px);
  line-height: .99;
}
.commercial-before-after__head h2 em { color: inherit; }
.commercial-before-after__head > p {
  max-width: 31ch;
  margin: 0;
  color: var(--muted);
  font-size: clamp(16px, 1.25vw, 18px);
  line-height: 1.5;
}
.commercial-before-after__comparison {
  --comparison-position: 60%;
  position: relative;
  margin: 0;
  overflow: hidden;
  isolation: isolate;
  aspect-ratio: 1152 / 767;
  border: 1px solid #ededed;
  border-radius: 33px;
  background: #111;
  cursor: ew-resize;
}
.commercial-before-after__comparison > img,
.commercial-before-after__before,
.commercial-before-after__before img {
  position: absolute;
  inset: 0;
  display: block;
  width: 100%;
  height: 100%;
}
.commercial-before-after__comparison > img,
.commercial-before-after__before img { object-fit: cover; }
.commercial-before-after__before {
  clip-path: inset(0 calc(100% - var(--comparison-position)) 0 0);
  will-change: clip-path;
}
.commercial-before-after__divider {
  position: absolute;
  z-index: 2;
  top: 0;
  bottom: 0;
  left: var(--comparison-position);
  width: 2px;
  background: #f5f2eb;
  box-shadow: 0 0 14px rgba(0, 0, 0, .42);
  pointer-events: none;
}
.commercial-before-after__divider::before {
  content: "↔";
  position: absolute;
  top: 50%;
  left: 50%;
  display: grid;
  width: 48px;
  height: 48px;
  place-items: center;
  transform: translate(-50%, -50%);
  border: 2px solid #f5f2eb;
  border-radius: 50%;
  background: #202426;
  color: #f5f2eb;
  font-family: var(--font-sans);
  font-size: 22px;
  line-height: 1;
  box-shadow: 0 2px 18px rgba(0, 0, 0, .34);
}
.commercial-before-after__label {
  position: absolute;
  z-index: 2;
  top: 20px;
  padding: 8px 11px;
  background: rgba(24, 27, 28, .78);
  color: #fff;
  font-size: 10px;
  font-weight: 700;
  letter-spacing: .16em;
  line-height: 1;
  text-transform: uppercase;
  pointer-events: none;
}
.commercial-before-after__label--before { left: 20px; }
.commercial-before-after__label--after { right: 20px; }
.commercial-before-after__control {
  position: absolute;
  z-index: 3;
  inset: 0;
  width: 100%;
  height: 100%;
  margin: 0;
  appearance: none;
  -webkit-appearance: none;
  background: transparent;
  cursor: ew-resize;
}
.commercial-before-after__control::-webkit-slider-runnable-track { height: 100%; background: transparent; }
.commercial-before-after__control::-moz-range-track { height: 100%; background: transparent; }
.commercial-before-after__control::-webkit-slider-thumb {
  width: 48px;
  height: 48px;
  appearance: none;
  -webkit-appearance: none;
  opacity: 0;
}
.commercial-before-after__control::-moz-range-thumb {
  width: 48px;
  height: 48px;
  border: 0;
  opacity: 0;
}
.commercial-before-after__control:focus-visible { outline: 3px solid #f5f2eb; outline-offset: -6px; }
@media (max-width: 760px) {
  body.accent-commercial .commercial-before-after { padding: 28px 24px 44px; }
  .commercial-before-after__head { grid-template-columns: 1fr; gap: 20px; }
  .commercial-before-after__head h2 { font-size: clamp(38px, 11vw, 56px); }
  .commercial-before-after__comparison { border-radius: 22px; }
  .commercial-before-after__label { top: 12px; padding: 7px 8px; font-size: 9px; }
  .commercial-before-after__label--before { left: 12px; }
  .commercial-before-after__label--after { right: 12px; }
  .commercial-before-after__divider::before { width: 42px; height: 42px; font-size: 19px; }
}

/* With the repeated project photo removed, let the commercial process read as
   a compact two-column sequence instead of holding space for a photo plate. */
body.accent-commercial .commercial-process {
  padding: clamp(58px, 7vw, 96px) 36px;
}
body.accent-commercial .commercial-process .split > div:first-child > p:not(.eyebrow) {
  margin-bottom: clamp(34px, 4vw, 52px);
}
body.accent-commercial .commercial-process .product-list {
  grid-template-columns: repeat(2, minmax(0, 1fr));
  max-width: 880px;
  gap: clamp(32px, 4vw, 54px) clamp(32px, 7vw, 104px);
}
body.accent-commercial .commercial-process .product-row:nth-child(n) {
  grid-column: auto;
  grid-row: auto;
  margin-top: 0;
}
@media (max-width: 640px) {
  body.accent-commercial .commercial-process { padding: 52px 24px 58px; }
  body.accent-commercial .commercial-process .product-list {
    grid-template-columns: 1fr;
    gap: 30px;
  }
}

/* Commercial product systems */
body.accent-commercial .commercial-products {
  padding: clamp(84px, 10vw, 150px) 36px;
}
body.accent-commercial .commercial-products .band-inner { max-width: 1180px; }
body.accent-commercial .commercial-products h2 {
  max-width: 18ch;
  margin: 14px 0 clamp(46px, 6vw, 82px);
  font-size: clamp(38px, 5vw, 68px);
  line-height: .99;
}
.commercial-products__grid {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: clamp(36px, 5vw, 74px) clamp(28px, 4vw, 64px);
}
.commercial-products__grid h3 {
  margin: 0 0 12px;
  font-size: clamp(25px, 2.25vw, 35px);
  line-height: 1.05;
}
.commercial-products__grid p {
  max-width: 30ch;
  margin: 0;
  color: var(--muted);
  font-size: clamp(16px, 1.25vw, 18px);
  line-height: 1.5;
}
@media (max-width: 760px) {
  body.accent-commercial .commercial-products { padding: 74px 24px 82px; }
  .commercial-products__grid { grid-template-columns: 1fr; gap: 34px; }
}

/* Insurance editorial take */
body.accent-insurance .insurance-take {
  padding: clamp(84px, 10vw, 154px) 36px clamp(92px, 11vw, 170px);
  background: var(--paper);
}
body.accent-insurance .insurance-take .band-inner { max-width: 930px; }
.insurance-take__copy { color: #171b1e; }
.insurance-take__copy p {
  max-width: 52ch;
  margin: 0;
  font-size: clamp(20px, 1.8vw, 28px);
  line-height: 1.36;
}
.insurance-take__copy p + p { margin-top: 22px; }
.insurance-take__copy .insurance-take__lead {
  max-width: 25ch;
  margin-top: 18px;
  font-family: var(--font-serif);
  font-size: clamp(38px, 5.2vw, 72px);
  font-weight: 400;
  line-height: .99;
  letter-spacing: -.045em;
}
.insurance-take__warning {
  color: #30363a;
  font-style: italic;
}
.insurance-take__warning strong { color: #171b1e; }
@media (max-width: 760px) {
  body.accent-insurance .insurance-take { padding: 74px 24px 82px; }
  .insurance-take__copy p { font-size: clamp(20px, 5.6vw, 27px); }
  .insurance-take__copy .insurance-take__lead { font-size: clamp(38px, 11vw, 56px); }
}

/* Service areas: intentionally dark and free of the site-wide topo/map layer. */
body.service-areas-page,
body.service-areas-page main {
  background: #10100f;
  color: #ededed;
}
body.service-areas-page .service-areas-hero {
  --hero-image-height: max(100svh, 720px);
  background: #10100f;
}
body.service-areas-page .service-areas-hero .hero-head h1 {
  max-width: 1250px;
  font-size: clamp(72px, 11vw, 164px);
  line-height: .92;
  letter-spacing: -.055em;
}
body.service-areas-page .service-areas-hero .hero-head h1 em { color: #ededed; }
body.service-areas-page .service-areas-photo {
  position: relative;
  z-index: 4;
  padding: clamp(28px, 5vw, 76px) clamp(20px, 5vw, 96px);
  margin-bottom: calc(-1 * clamp(88px, 12vw, 184px));
  background-color: #10100f;
  background-image: url("images/north-indianapolis-service-area.svg?v=8");
  background-position: 50% 50%;
  background-repeat: no-repeat;
  background-size: clamp(960px, 100vw, 1600px) auto;
  background-attachment: fixed;
}
body.service-areas-page .service-areas-photo::after {
  display: none;
}
body.service-areas-page .service-areas-photo img {
  width: min(100%, 1320px);
  height: auto;
  margin: 0 auto;
  object-fit: cover;
  object-position: 50% 50%;
}
body.service-areas-page .service-area-region {
  padding: clamp(96px, 12vw, 176px) 0;
  background: #10100f;
}
body.service-areas-page .service-area-region + .service-area-region {
  margin-top: clamp(120px, 18vw, 280px);
  padding-top: clamp(120px, 18vw, 280px);
}
body.service-areas-page .service-area-divider {
  position: relative;
  z-index: 3;
  min-height: clamp(320px, 48vw, 680px);
  padding: clamp(40px, 6vw, 96px) clamp(24px, 5vw, 96px);
  display: flex;
  flex-direction: column;
  justify-content: space-between;
  background: #050505;
  color: #ededed;
}
body.service-areas-page .service-area-divider p {
  margin: 0;
  color: inherit;
  font-family: var(--font-display);
  font-size: clamp(54px, 10.5vw, 166px);
  font-weight: 500;
  line-height: .88;
  letter-spacing: -.065em;
}
body.service-areas-page .service-area-divider p:last-child { align-self: flex-end; text-align: right; }
body.service-areas-page .band:not(.cta-section) {
  background: #10100f;
}
body.service-areas-page .band :where(h1,h2,h3,h4,strong,.city-tile strong),
body.service-areas-page .faq-item summary {
  color: #ededed;
}
body.service-areas-page .band :where(p,li,.body-flow,.city-meta,.faq-item div.answer),
body.service-areas-page .faq-item div.answer {
  color: rgba(237,237,237,.74);
}
body.service-areas-page .band .eyebrow.dark { color: rgba(237,237,237,.6); }
body.service-areas-page .band .city-grid { gap: 12px; }
body.service-areas-page .band .city-tile,
body.service-areas-page .band .city-tile.featured {
  min-height: 116px;
  padding: 20px;
  background: #191918;
  color: #ededed;
}
body.service-areas-page .band .city-tile:hover,
body.service-areas-page .band .city-tile.featured:hover { background: #242422; }
body.service-areas-page .band .city-tile.featured :where(strong,.city-meta,.featured-tag) { color: inherit; }
body.service-areas-page .band .city-meta,
body.service-areas-page .band .city-tile.featured .city-meta,
body.service-areas-page .band .city-tile.featured .featured-tag { color: rgba(237,237,237,.58); }
body.service-areas-page .band .btn.ink-ghost {
  color: #ededed;
  border-color: rgba(237,237,237,.55);
  background: transparent;
}
body.service-areas-page .band .btn.ink-ghost:hover {
  color: #10100f;
  background: #ededed;
  border-color: #ededed;
}
/* Add a matching card here whenever a new city gets its own local page. */
body.service-areas-page .area-guide-directory {
  margin-top: clamp(72px, 9vw, 132px);
  padding-top: 26px;
}
body.service-areas-page .area-guide-label,
body.service-areas-page .area-guide-kicker {
  display: block;
  margin: 0;
  color: rgba(237,237,237,.6);
  font-family: var(--font-sans);
  font-size: 11px;
  font-weight: 700;
  letter-spacing: .2em;
  line-height: 1.2;
  text-transform: uppercase;
}
body.service-areas-page .area-guide-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 320px), 1fr));
  gap: 16px;
  margin-top: 20px;
}
body.service-areas-page .area-guide-card {
  min-height: 224px;
  padding: 28px;
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  background: rgba(5,5,5,.88);
  border: 1px solid rgba(237,237,237,.24);
  transition: background .2s ease, border-color .2s ease, transform .2s ease;
}
body.service-areas-page .area-guide-card:hover {
  background: #20201e;
  border-color: rgba(237,237,237,.72);
  transform: translateY(-3px);
}
body.service-areas-page .area-guide-card strong {
  margin-top: 18px;
  color: #ffffff;
  font-family: var(--font-display);
  font-size: clamp(28px, 3vw, 42px);
  font-weight: 500;
  line-height: 1;
  letter-spacing: -.04em;
}
body.service-areas-page .area-guide-copy {
  max-width: 36ch;
  margin-top: 14px;
  color: rgba(237,237,237,.72);
  font-size: 15px;
  line-height: 1.5;
}
body.service-areas-page .area-guide-link {
  margin-top: auto;
  padding-top: 26px;
  color: #ffffff;
  font-family: var(--font-sans);
  font-size: 12px;
  font-weight: 700;
  letter-spacing: .08em;
  text-transform: uppercase;
}
body.service-areas-page .area-guide-link::after { content: " →"; }
body.service-areas-page .faq-item { border-bottom-color: rgba(237,237,237,.18); }
body.service-areas-page .faq-item div.answer strong { color: #ededed; }
body.service-areas-page .faq-item div.answer a { color: #ededed; }
body.service-areas-page .nav-script-brand { background: #ffffff; }
@media (max-width: 720px) {
  body.service-areas-page .service-areas-hero { --hero-image-height: max(78svh, 600px); }
  body.service-areas-page .service-areas-hero .hero-head h1 { font-size: clamp(62px, 16vw, 100px); }
  body.service-areas-page .service-area-region + .service-area-region {
    margin-top: 96px;
    padding-top: 96px;
  }
  body.service-areas-page .service-area-divider { min-height: 300px; }
  body.service-areas-page .service-area-divider p { font-size: clamp(50px, 15vw, 84px); }
}

/* Keep the two service-area vectors: they sit on the dark page surface rather
   than participating in the retired topographic background. */
body.service-areas-page #indianapolis.service-area-region,
body.service-areas-page #chicago.service-area-region {
  min-height: 100svh;
  background-color: #10100f;
  background-position: 50% 50%;
  background-repeat: no-repeat;
  background-size: clamp(960px, 100vw, 1600px) auto;
  background-attachment: fixed;
}
body.service-areas-page #indianapolis.service-area-region {
  background-image: url("images/north-indianapolis-service-area.svg?v=8");
  padding-top: calc(clamp(96px, 12vw, 176px) + clamp(88px, 12vw, 184px));
}
body.service-areas-page #chicago.service-area-region {
  background-image: url("images/burr-ridge-service-area.svg?v=8");
}
body.service-areas-page .service-area-region {
  position: relative;
  isolation: isolate;
  overflow: hidden;
}
body.service-areas-page .service-area-region .band-inner {
  position: relative;
  z-index: 2;
}
body.service-areas-page .map-truck-stage {
  position: fixed;
  inset: 0;
  z-index: 1;
  visibility: hidden;
  pointer-events: none;
}
body.service-areas-page .service-area-region.is-map-active .map-truck-stage { visibility: visible; }
body.service-areas-page .map-truck {
  position: absolute;
  width: clamp(110px, 10vw, 156px);
  pointer-events: none;
  filter: drop-shadow(0 8px 11px rgba(0,0,0,.42));
  opacity: .92;
  will-change: transform;
}
body.service-areas-page .map-truck img { width: 100%; height: auto; }
@media (max-width: 880px) {
  body.service-areas-page .service-areas-photo,
  body.service-areas-page #indianapolis.service-area-region,
  body.service-areas-page #chicago.service-area-region {
    background-size: 125% auto;
    background-attachment: scroll;
  }
  body.service-areas-page .map-truck-stage { display: none; }
}
@media (prefers-reduced-motion: reduce) {
  body.service-areas-page .map-truck { transition: none; }
}

/* Final CTAs use the same compact rectangular controls as the Windows & Doors
   hero, whether the action began as a button or an editorial text link. */
.cta-section .actions { gap: 10px; }
.cta-section .actions .btn,
.cta-section .actions .explore,
.bottom-cta .hero-actions .btn,
.bottom-cta .hero-actions .explore {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-height: 42px;
  padding: 0 18px;
  border-radius: 6px;
  font-family: var(--font-display);
  font-size: 13px;
  font-weight: 700;
  letter-spacing: normal;
  line-height: 1.2;
  text-transform: none;
}
.cta-section .actions .explore,
.bottom-cta .hero-actions .explore {
  gap: 0;
  padding-bottom: 0;
  border: 1px solid rgba(255,255,255,.62);
  color: #fff;
}
.cta-section .actions .explore::after,
.bottom-cta .hero-actions .explore::after { content: none; }
.cta-section .actions .explore:hover,
.bottom-cta .hero-actions .explore:hover {
  gap: 0;
  background: #fff;
  border-color: #fff;
  color: #111;
}

.schedule-paths-heading {
  white-space: nowrap;
  font-size: clamp(17px, 3.4vw, 58px);
  letter-spacing: -.04em;
}

/* Schedule page: choice paths and the proposal process are deliberately open
   editorial grids, rather than oversized cards or an orphaned final step. */
.schedule-paths .section-head,
.schedule-process .section-head { margin-bottom: clamp(42px, 5vw, 64px); }
.schedule-paths .path-grid {
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: clamp(30px, 4vw, 58px);
  border: 0;
}
.schedule-paths .path-card {
  min-height: 0;
  padding: 22px 0 0;
  gap: 16px;
  background: transparent !important;
  border: 0;
}
.schedule-paths .path-card:hover {
  padding-left: 0;
  background: transparent !important;
}
.schedule-paths .path-card .path-label {
  display: block;
  font-size: 20px;
  font-family: var(--font-display);
  font-weight: 700;
  color: var(--ink-soft);
  line-height: 1.1;
}
.schedule-paths .path-card h3 {
  font-size: clamp(23px, 2.05vw, 31px);
  line-height: 1.1;
}
.schedule-paths .path-card p { font-size: 16px; line-height: 1.6; }
.schedule-paths .path-card p a {
  text-decoration: underline;
  text-decoration-thickness: 1px;
  text-underline-offset: .16em;
}
.schedule-process .process-timeline {
  grid-template-columns: repeat(4, minmax(0, 1fr));
  gap: clamp(26px, 3.6vw, 56px);
}
.schedule-process .process-step {
  min-height: 0;
  padding: 0;
  background: transparent;
  border: 0;
}
.schedule-process .process-step .step-num {
  width: auto;
  height: auto;
  display: block;
  margin: 0 0 18px;
  border: 0;
  border-radius: 0;
  color: var(--accent);
  font-family: var(--font-display);
  font-size: 18px;
  font-weight: 700;
  letter-spacing: .04em;
  line-height: 1;
}
.schedule-process .process-step .step-label {
  margin-bottom: 12px;
  color: var(--accent);
}
.schedule-process .process-step h3 {
  margin-bottom: 14px;
  font-size: clamp(23px, 2.05vw, 30px);
  line-height: 1.1;
}
.schedule-process .process-step p { font-size: 16px; line-height: 1.6; }
@media (max-width: 980px) {
  .schedule-paths .path-grid,
  .schedule-process .process-timeline { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}
@media (max-width: 620px) {
  .schedule-paths .path-grid,
  .schedule-process .process-timeline { grid-template-columns: 1fr; }
  .schedule-paths .path-card + .path-card,
  .schedule-process .process-step + .process-step { margin-top: 8px; }
}

/* The material-fit reference is deliberately a long, human-readable guide.
   Keep it on a light surface even when it lands on the AI page's automatic
   every-third-section dark rhythm. */
body.theme-light.ai-composed main > section.band.ai-material-fit:nth-of-type(3n) {
  --ink: #1d1a15;
  --ink-soft: #38332b;
  --muted: #625a4e;
  --line: rgba(29,26,21,.17);
  --line-soft: rgba(29,26,21,.09);
  --soft: #e2dbcc;
  background: var(--soft) !important;
  color: var(--ink-soft) !important;
}
body.theme-light.ai-composed main > section.band.ai-material-fit:nth-of-type(3n) :where(h1,h2,h3,h4,h5,h6,strong,.ai-table td,.ai-table td.v) {
  color: #1d1a15 !important;
}
body.theme-light.ai-composed main > section.band.ai-material-fit:nth-of-type(3n) :where(p,li,dd,td,th,.ai-note,.ai-lead,.ai-boilerplate,.ai-wrap p,.ai-wrap li) {
  color: #38332b !important;
}
body.theme-light.ai-composed main > section.band.ai-material-fit:nth-of-type(3n) :where(.ai-table th,.ai-note) {
  color: #625a4e !important;
}
body.theme-light.ai-composed main > section.band.ai-material-fit:nth-of-type(3n) :where(a,.ai-services li a,[style*="color:var(--copper)"]) {
  color: #34373b !important;
}
body.theme-light.ai-composed main > section.band.ai-material-fit:nth-of-type(3n) .ai-table th,
body.theme-light.ai-composed main > section.band.ai-material-fit:nth-of-type(3n) .ai-table td {
  border-color: rgba(29,26,21,.17) !important;
}
#roof-material-fit { scroll-margin-top: 112px; }

/* ============ AWARD → CONSULT UNIFIED PIN (desktop) ============
   #who-we-are (the award scene: faces, trophies, label, two manifesto beats)
   and #quick-consult (the consult photo + form) share ONE sticky stage. Scroll
   progress: manifesto beats → the consult photo card grows from the centre and
   simply COVERS the faces (they do not fade) → the form settles onto that SAME
   card → the pin releases and the page scrolls normally into #services.
   Scoped with #ids and placed at end of file so it wins over the base
   .quick-consult / .brand-split rules and the older scroll-ready block. Armed
   only on desktop by the controller (html.award-seq-ready). */
@media (min-width: 981px) {
  html.award-seq-ready .scroll-reveal { height: 340svh; }   /* pin length */
  html.award-seq-ready .sr-stage {
    position: sticky;
    top: 0;
    height: 100svh;
    overflow: visible;       /* let the seam-straddling award floats show */
    isolation: isolate;
    /* Paint above #namesake (position:relative; z-index:2) so the award floats
       that straddle the seam sit OVER the dark quote band — this is the z-index
       the old sticky .brand-split used to carry before both sections moved into
       this shared stage. */
    z-index: 3;
  }

  /* Layer 1 — the award scene. */
  html.award-seq-ready #who-we-are.brand-split {
    position: absolute;
    inset: 0;
    min-height: 0;
    z-index: 1;
    padding: 120px 36px;
  }

  /* Layer 2 — the consult card (the growing photo) + the form, over the scene.
     Transparent background so the faces read around the small card; the JS
     enables pointer events only once the form is in. */
  html.award-seq-ready #quick-consult.quick-consult-band {
    position: absolute;
    inset: 0;
    min-height: 0;
    height: 100%;
    z-index: 2;
    overflow: visible;
    background: transparent;
    pointer-events: none;
  }
  html.award-seq-ready #quick-consult .quick-consult-stage {
    position: static;
    min-height: 0;
    height: 100%;
  }

  /* The photo card. The controller scales it from a small centred rectangle out
     to full-bleed (covering the faces) and drives opacity + corner radius.
     Everything else about the consult surface — the frosted panel, the title,
     the single-column compact form and its is-settled reveal — is left to the
     ORIGINAL `quick-consult-scroll-ready` rules (the controller adds that class
     too), so the form renders exactly as it did before. */
  html.award-seq-ready #quick-consult .quick-consult-visual {
    position: absolute;
    inset: 0;
    z-index: 0;
    overflow: hidden;
    opacity: 0;
    transform: scale(0.18);
    transform-origin: center center;
    will-change: transform, opacity;
    background: transparent;
    box-shadow: 0 44px 130px rgba(8, 8, 10, 0.5);
  }
}
