/* =========================================================================
   POLYJACKS — "Warm Craftsman Elevated" premium stylesheet
   Locked palette (Foam Amber) — no new hues, only tints/shades via rgba.
   Drop-in replacement: every class name + structural role preserved.
   ========================================================================= */

:root{
  /* ---- locked brand colors (DO NOT ADD NEW HUES) ---- */
  --slate:#64748b; --amber:#f97316; --amber-l:#fb923c; --amber-d:#ea580c;
  --navy:#0f172a; --navy-2:#1e293b; --cream:#fff7ed; --ink:#0f172a;
  --line:#e5e7eb; --white:#fff; --good:#16a34a;
  /* WCAG-AA shades of the SAME locked amber hue (orange-700/800 on the ramp
     already in use: 400=#fb923c 500=#f97316 600=#ea580c 900=#7c2d12) */
  --amber-700:#c2410c; --amber-800:#9a3412;

  /* ---- rgb channels of the SAME locked colors, for layered rgba() work ---- */
  --navy-rgb:15,23,42; --navy2-rgb:30,41,59; --amber-rgb:249,115,22;
  --amberl-rgb:251,146,60; --amberd-rgb:234,88,12; --ink-rgb:15,23,42;
  --good-rgb:22,163,74; --cream-rgb:255,247,237;

  --font:'Roboto','Segoe UI',-apple-system,system-ui,'Helvetica Neue',Arial,sans-serif;
  /* display stack for headings — system-only (no webfont; outbound fetch forbidden).
     Segoe UI Variable Display gives optical-size-tuned headings on Win11. */
  --font-display:'Segoe UI Variable Display','Segoe UI',Inter,Roboto,system-ui,-apple-system,'Helvetica Neue',Arial,sans-serif;
  --wrap:1080px;

  /* ---- layered, premium shadow scale (­--shadow keeps its name so every
     selector that already references var(--shadow) is upgraded for free) ---- */
  --shadow-sm:0 1px 2px rgba(var(--navy-rgb),.06),0 2px 6px rgba(var(--navy-rgb),.05);
  --shadow:0 2px 6px rgba(var(--navy-rgb),.06),0 18px 40px -12px rgba(var(--navy-rgb),.22);
  --shadow-lg:0 10px 20px rgba(var(--navy-rgb),.10),0 30px 60px -18px rgba(var(--navy-rgb),.30);
  --shadow-amber:0 1px 0 rgba(255,255,255,.4) inset,0 10px 24px rgba(var(--amber-rgb),.38),0 3px 8px rgba(var(--amber-rgb),.26);

  --radius-sm:10px; --radius-md:14px; --radius-lg:20px; --radius-xl:26px;
  --ease:cubic-bezier(.22,.8,.24,1);

  /* ---- decorative data-URI textures (all built from locked hues only) ---- */
  --tex-dots:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='26' height='26'%3E%3Ccircle cx='2' cy='2' r='1.3' fill='%230f172a' fill-opacity='.10'/%3E%3C/svg%3E");
  --tex-topo:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='220' height='64'%3E%3Cpath d='M0 16 Q 27.5 6 55 16 T 110 16 T 165 16 T 220 16' stroke='%230f172a' stroke-opacity='.07' stroke-width='1.4' fill='none'/%3E%3Cpath d='M0 38 Q 27.5 28 55 38 T 110 38 T 165 38 T 220 38' stroke='%230f172a' stroke-opacity='.055' stroke-width='1.4' fill='none'/%3E%3Cpath d='M0 55 Q 27.5 47 55 55 T 110 55 T 165 55 T 220 55' stroke='%23f97316' stroke-opacity='.08' stroke-width='1.4' fill='none'/%3E%3C/svg%3E");
  --tex-topo-dark:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='220' height='64'%3E%3Cpath d='M0 16 Q 27.5 6 55 16 T 110 16 T 165 16 T 220 16' stroke='%23fff7ed' stroke-opacity='.06' stroke-width='1.4' fill='none'/%3E%3Cpath d='M0 38 Q 27.5 28 55 38 T 110 38 T 165 38 T 220 38' stroke='%23fff7ed' stroke-opacity='.045' stroke-width='1.4' fill='none'/%3E%3Cpath d='M0 55 Q 27.5 47 55 55 T 110 55 T 165 55 T 220 55' stroke='%23f97316' stroke-opacity='.12' stroke-width='1.4' fill='none'/%3E%3C/svg%3E");
  --tex-grain:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='140' height='140'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.85' numOctaves='2' stitchTiles='stitch'/%3E%3CfeColorMatrix type='matrix' values='0 0 0 0 0  0 0 0 0 0  0 0 0 0 0  0 0 0 0.6 0'/%3E%3C/filter%3E%3Crect width='140' height='140' filter='url(%23n)'/%3E%3C/svg%3E");
}

*{box-sizing:border-box}
/* UX R3 D2/D3: auto (instant) anchor scroll. The only same-page jumps sitewide are
   #book (790, the highest-intent CTA — smooth animated ~1.6s over ~13 mobile screens
   on the homepage), the #main skip-link (a11y — instant is preferred), and one
   #counties link; none benefit from smooth, and #book was the audited defect. */
html{scroll-behavior:auto}
body{
  margin:0;background:var(--cream);color:var(--ink);font-family:var(--font);
  line-height:1.6;font-size:16px;-webkit-font-smoothing:antialiased;
  -moz-osx-font-smoothing:grayscale;text-rendering:optimizeLegibility;
  position:relative;
}
/* whole-page tactile paper grain — barely-there, adds craftsman texture */
body::before{
  content:'';position:fixed;inset:0;z-index:2;pointer-events:none;
  opacity:.035;mix-blend-mode:multiply;background-image:var(--tex-grain);
  background-size:140px 140px;
}
a{color:inherit}
img{max-width:100%;display:block}
.wrap{max-width:var(--wrap);margin:0 auto;padding:0 20px;position:relative;z-index:1}
/* offset in-page CTA jumps so the sticky header never covers the #book / #estimate heading (UX ledger item 2) */
#book,#estimate,#risk-book{scroll-margin-top:96px}
/* VISUAL R4 D4: every auto-generated content H2 carries an id="s-..." anchor; give them the
   same sticky-header offset so shared/bookmarked deep links and Google 'jump to section' SERP
   links land the heading below the header instead of hidden behind it. */
main h2[id]{scroll-margin-top:96px}

h1,h2,h3,h4{font-family:var(--font-display)}
h1,h2,h3{color:var(--navy);line-height:1.14;margin:0;font-weight:800;letter-spacing:-.015em}
p{margin:0}

.kicker{
  font-size:12.5px;letter-spacing:.16em;text-transform:uppercase;color:var(--amber-700);
  font-weight:800;display:inline-flex;align-items:center;gap:8px;
}
.kicker::before{
  content:'';width:7px;height:7px;border-radius:50%;
  background:linear-gradient(135deg,var(--amber-l),var(--amber-d));
  box-shadow:0 0 0 3px rgba(var(--amber-rgb),.18);
}
.stars{color:var(--amber-700);letter-spacing:1px}

/* T2 ledger (breadcrumb-UI): visible trail matching the BreadcrumbList JSON-LD, sitting
   right under the inner-page hero. A <nav>, never a <section> — must not perturb the
   section:nth-of-type(odd/even) cream/white band alternation. */
.breadcrumb{background:var(--white);border-bottom:1px solid var(--line);font-size:13px;position:relative;z-index:1}
.breadcrumb .wrap{display:flex;align-items:center;flex-wrap:wrap;gap:6px;padding:12px 24px}
.breadcrumb a{color:var(--slate);text-decoration:none}
.breadcrumb a:hover{color:var(--navy);text-decoration:underline}
.breadcrumb .sep{color:var(--line)}
.breadcrumb [aria-current="page"]{color:var(--navy);font-weight:700}

/* focus visibility, everywhere */
a:focus-visible,button:focus-visible,.btn:focus-visible,summary:focus-visible{
  outline:2.5px solid var(--amber-d);outline-offset:3px;border-radius:6px;
}

/* =========================================================================
   BUTTONS
   ========================================================================= */
.btn{
  display:inline-flex;align-items:center;justify-content:center;gap:9px;padding:15px 30px;border-radius:9999px;min-height:52px;
  font-weight:800;font-size:15.5px;letter-spacing:-.005em;text-decoration:none;cursor:pointer;
  border:none;font-family:inherit;position:relative;
  transition:transform .28s var(--ease),box-shadow .28s var(--ease),filter .2s,background .2s,color .2s;
  will-change:transform;
}
.btn:active{transform:translateY(1px) scale(.99)}
.btn-primary{
  /* AA: white 15.5px/800 text — lightest stop #c2410c = 5.18:1, darkest #9a3412 = 7.32:1 */
  background:linear-gradient(135deg,var(--amber-700),var(--amber-800));
  color:#fff;box-shadow:var(--shadow-amber);
}
.btn-primary:hover{
  transform:translateY(-3px);
  box-shadow:0 1px 0 rgba(255,255,255,.45) inset,0 18px 34px rgba(var(--amber-rgb),.46),0 5px 12px rgba(var(--amber-rgb),.3);
}
.btn-ghost{background:#fff;color:var(--navy);border:1.5px solid var(--navy);box-shadow:0 2px 8px rgba(var(--navy-rgb),.07)}
.btn-ghost:hover{background:var(--navy);color:#fff;transform:translateY(-3px);box-shadow:0 14px 26px rgba(var(--navy-rgb),.28)}
.btn-call{background:linear-gradient(135deg,var(--navy),var(--navy-2));color:#fff;box-shadow:0 12px 26px rgba(var(--navy-rgb),.38)}
.btn-call:hover{transform:translateY(-3px);box-shadow:0 18px 34px rgba(var(--navy-rgb),.44)}
.btn-white{background:#fff;color:var(--navy);box-shadow:0 8px 18px rgba(var(--navy-rgb),.14)}
.btn-white:hover{transform:translateY(-3px);box-shadow:0 14px 26px rgba(var(--navy-rgb),.2)}
.btn:hover{filter:brightness(1.02)}

/* =========================================================================
   HEADER + NAV + DROPDOWNS
   ========================================================================= */
header{
  position:sticky;top:0;z-index:40;background:rgba(var(--cream-rgb),.88);
  backdrop-filter:blur(12px) saturate(1.4);-webkit-backdrop-filter:blur(12px) saturate(1.4);
  border-bottom:1px solid var(--line);
  box-shadow:0 1px 0 rgba(255,255,255,.6) inset,0 8px 24px -18px rgba(var(--navy-rgb),.35);
}
/* VISUAL R2 D3: padding-top/bottom ONLY — the header div is `class="wrap nav"`, and a
   `padding:13px 0` shorthand here zeroed .wrap's `padding:0 20px` side gutters, edge-hugging
   the logo/phone at the viewport edge on mobile. Split so .wrap's 20px sides survive. */
.nav{display:flex;align-items:center;justify-content:space-between;gap:16px;padding-top:13px;padding-bottom:13px}
.logo{display:flex;align-items:center;text-decoration:none}
.logo-img{height:40px;width:auto;display:block;transition:transform .3s var(--ease)}
.logo:hover .logo-img{transform:scale(1.03)}
.nav .links{display:flex;gap:20px;font-weight:650;font-size:14.5px;align-items:center}
.nav .links>a{
  /* UX R2 D5: nav links were var(--slate) #64748b on the cream header = 4.48:1 (fails WCAG AA
     4.5:1 for 14.5px semibold text). #57667d is a darker shade of the SAME slate hue -> 5.49:1. */
  text-decoration:none;color:#57667d;position:relative;padding:6px 0;transition:color .2s;
}
.nav .links>a::after{
  content:'';position:absolute;left:0;right:0;bottom:0;height:2px;border-radius:2px;
  background:linear-gradient(90deg,var(--amber),var(--amber-d));
  transform:scaleX(0);transform-origin:left;transition:transform .28s var(--ease);
}
.nav .links>a:hover{color:var(--navy)}
.nav .links>a:hover::after{transform:scaleX(1)}
.drop{position:relative}
.drop .menu{
  position:absolute;top:calc(100% + 12px);left:-12px;background:#fff;border:1px solid var(--line);
  border-radius:var(--radius-md);box-shadow:var(--shadow-lg);padding:9px;min-width:236px;
  display:flex;flex-direction:column;gap:2px;z-index:50;
  opacity:0;visibility:hidden;transform:translateY(8px) scale(.98);transform-origin:top left;
  transition:opacity .24s var(--ease),transform .24s var(--ease),visibility 0s linear .24s;
}
.drop .menu a{padding:10px 13px;border-radius:9px;white-space:nowrap;text-decoration:none;color:var(--slate);font-weight:600;font-size:14px;transition:background .18s,color .18s,padding-left .18s}
.drop .menu a:hover{background:var(--cream);color:var(--navy);padding-left:16px}
.drop:hover .menu{opacity:1;visibility:visible;transform:translateY(0) scale(1);transition:opacity .24s var(--ease),transform .24s var(--ease),visibility 0s}
.nav .act{display:flex;gap:10px;align-items:center}
.phone{font-weight:800;color:var(--navy);text-decoration:none;white-space:nowrap;transition:color .2s}
.phone:hover{color:var(--amber-d)}
@media(max-width:900px){ .nav .links{display:none} .nav .act .btn-primary{display:none} }

/* =========================================================================
   HERO (home)
   ========================================================================= */
/* Owner ruling 11 (2026-07-10): BIG full-bleed hero image + deep navy overlay,
   text on top — DEFAULT hero style. VISUAL R3 D2: the high-res generated/real
   heroes have landed (gen* stems 1376-1400px wide, real stems 843-1400px), so the
   old placeholder-era softening blur now only degrades a genuinely sharp photo and
   was removed. A tiny 2% cover zoom is kept purely to guarantee no sub-pixel edge
   gap under the overlay (object-fit:cover already fills). */
.hero{
  position:relative;isolation:isolate;overflow:hidden;background:var(--navy);
  display:flex;align-items:center;min-height:70vh;padding:84px 0 64px;
}
.hero-bg{
  position:absolute;inset:0;z-index:0;width:100%;height:100%;
  object-fit:cover;object-position:center;
  transform:scale(1.02);
}
.hero-overlay{
  position:absolute;inset:0;z-index:1;pointer-events:none;
  background:linear-gradient(100deg,rgba(var(--navy-rgb),.92) 0%,rgba(var(--navy-rgb),.88) 52%,rgba(var(--navy-rgb),.70) 100%);
}
.hero-overlay::after{
  content:'';position:absolute;inset:0;opacity:.55;
  background-image:var(--tex-topo-dark);background-position:top left;
  -webkit-mask-image:linear-gradient(to bottom,black,transparent 78%);
  mask-image:linear-gradient(to bottom,black,transparent 78%);
}
.hero-content{position:relative;z-index:2;width:100%}
.hero .kicker{color:var(--cream)}
.hero h1{font-size:clamp(32px,4.6vw,50px);margin:.3em 0 .32em;letter-spacing:-.03em;color:#fff;max-width:14.5em}
.lede{font-size:17.5px;color:var(--slate);margin:0 0 22px;max-width:37em;line-height:1.65}
.hero .lede{color:rgba(255,255,255,.92);max-width:38em}
.hero .cta{display:flex;gap:12px;flex-wrap:wrap;margin-bottom:20px;align-items:center}
.hero .btn-ghost{background:rgba(255,255,255,.06);color:#fff;border-color:rgba(255,255,255,.85)}
.hero .btn-ghost:hover{background:#fff;color:var(--navy);border-color:#fff}
.trust{display:flex;flex-wrap:wrap;gap:9px 12px;font-size:13px;color:var(--slate);font-weight:650;align-items:center}
.trust .pill{
  display:inline-flex;align-items:center;gap:7px;background:#fff;border:1px solid var(--line);
  border-radius:999px;padding:7px 13px;box-shadow:var(--shadow-sm);transition:transform .2s var(--ease),box-shadow .2s;
}
.trust .pill:hover{transform:translateY(-2px);box-shadow:var(--shadow-sm),0 6px 14px rgba(var(--navy-rgb),.1)}
.hero .trust{color:#fff}
.hero .trust .pill{background:rgba(255,255,255,.10);border-color:rgba(255,255,255,.30);color:#fff;box-shadow:none}
.hero .trust .pill:hover{box-shadow:none;background:rgba(255,255,255,.16)}
.hero-media{
  border-radius:var(--radius-xl);overflow:hidden;background:linear-gradient(165deg,#fff,var(--cream));
  border:2px solid transparent;
  background-image:linear-gradient(165deg,#fff,var(--cream)),linear-gradient(135deg,var(--amber-l),var(--navy-2));
  background-origin:border-box;background-clip:padding-box,border-box;
  box-shadow:var(--shadow-lg);position:relative;
}
.hero-media::before{
  content:'';position:absolute;top:12px;left:12px;right:12px;bottom:12px;border-radius:calc(var(--radius-xl) - 8px);
  box-shadow:0 2px 10px rgba(var(--navy-rgb),.14) inset;pointer-events:none;z-index:2;
}
.hero-media iframe{width:100%;height:360px;border:0;display:block;position:relative;z-index:1}
@media(max-width:900px){ .hero h1{font-size:30px} .hero-media iframe{height:270px} .hero{min-height:0;padding:52px 0 40px} }

/* E5 RULING-16: compact full-bleed image hero on inner pages — SAME locked
   .hero/.hero-bg/.hero-overlay/.hero-content system as the homepage, just a shorter
   band (an allowed compact application of the locked system). The inner heroes use
   the DEFAULT .hero-overlay scrim (navy .92 -> .88 -> .70), darker than the homepage's
   tuned scrim, so light text contrast is >= the signed-off homepage. */
.hero--inner{min-height:auto;padding:clamp(44px,6vw,66px) 0 clamp(30px,4.5vw,46px)}
.hero--inner h1{font-size:clamp(27px,3.7vw,40px);max-width:17em}
.hero--inner .lede{font-size:16.5px;max-width:41em}
@media(max-width:900px){ .hero--inner{padding:40px 0 30px} }

/* optional hero illustration wrapper — see integration_notes for placement */
.hero-art{display:flex;justify-content:center;align-items:center;margin:6px 0 8px;position:relative;z-index:1}
.hero-art svg{width:100%;max-width:560px;height:auto;filter:drop-shadow(0 18px 30px rgba(var(--navy-rgb),.16))}

/* =========================================================================
   PAGE HERO (inner pages)
   ========================================================================= */
.phero{padding:46px 0 10px;position:relative;overflow:hidden}
.phero::before{
  content:'';position:absolute;top:-40px;right:-60px;width:340px;height:340px;z-index:0;pointer-events:none;
  background:radial-gradient(circle,rgba(var(--amber-rgb),.22),rgba(var(--amber-rgb),0) 70%);
}
/* Amber-blob variants — dimmer glow on blog/about/contact so inner pages read
   visually distinct from service pages (report-card D-06) */
.phero--blog::before{opacity:.4}
.phero--about::before{opacity:.55}
.phero--contact::before{opacity:.3}
.phero .wrap{position:relative;z-index:1}
.phero h1{font-size:clamp(28px,4vw,37px);letter-spacing:-.025em;margin:.22em 0 .12em;max-width:16em}
.phero .lede{margin-top:.5em}
@media(max-width:720px){ .phero h1{font-size:26px} }

/* H6: compact fact card fills the phero's dead right half at desktop widths.
   Hidden below 1080px — hero text (h1 16em / lede 37em) never reaches it above that. */
.phero-stat{display:none}
@media(min-width:1080px){
  .phero-stat{
    display:flex;flex-direction:column;gap:13px;
    position:absolute;right:20px;top:50%;transform:translateY(-50%);
    width:250px;padding:18px 20px;
    background:#fff;border:1px solid rgba(var(--navy-rgb),.08);
    border-radius:var(--radius-md);box-shadow:0 12px 28px rgba(var(--navy-rgb),.10);
  }
  .phero-stat .ps-num{display:block;font-weight:800;font-size:19px;color:var(--ink);letter-spacing:-.01em}
  .phero-stat .ps-lbl{display:block;font-size:12.5px;color:var(--slate);margin-top:1px}
}

/* =========================================================================
   SECTION RHYTHM — alternating surfaces + whisper textures + soft seams
   (pure CSS; needs no HTML change — see integration_notes)
   ========================================================================= */
section{padding:46px 0;position:relative}
section:not(.hero):not(.phero)::after{
  content:'';position:absolute;inset:0;pointer-events:none;z-index:0;
}
section:not(.hero):not(.phero):nth-of-type(odd){background:var(--cream)}
section:not(.hero):not(.phero):nth-of-type(odd)::after{background-image:var(--tex-dots)}
section:not(.hero):not(.phero):nth-of-type(even){background:#fff}
section:not(.hero):not(.phero):nth-of-type(even)::after{background-image:var(--tex-topo)}
section:not(.hero):not(.phero)::before{
  content:'';position:absolute;top:0;left:0;right:0;height:1px;z-index:1;
  background:linear-gradient(90deg,transparent,rgba(var(--navy-rgb),.10) 20%,rgba(var(--navy-rgb),.10) 80%,transparent);
}

.sec-head{text-align:center;max-width:660px;margin:0 auto 30px;position:relative;z-index:1}
.sec-head h2{font-size:clamp(24px,3vw,31px);margin:.25em 0}
.sec-head p{color:#5b6b81;margin:.5em 0 0;font-size:16px;line-height:1.6}

/* =========================================================================
   BOOKING EMBED (Workiz)
   One shared iframe styling for the sitewide #book section. Desktop keeps the
   tall calendar so the whole widget shows without an inner scroll; phones drop
   to roughly one screen (<=640px) so the booking moment isn't buried under a
   full screen of dead space (UX audit defect #2).
   ========================================================================= */
.book-embed{width:100%;min-height:900px;border:0;border-radius:14px;background:#fff;box-shadow:0 10px 30px rgba(15,23,42,.08)}
@media(max-width:640px){ .book-embed{min-height:660px} }
/* #book preamble spacing (UX R3 D2): desktop unchanged; on phones the kicker+h2+lede+
   trust-pills stack pushed the iframe to y=434 so only ~50% of the 660px widget cleared
   the fixed call bar on landing. Compact the preamble on <=640px so materially more of
   the booking form is visible the moment a visitor lands on #book. */
#book{background:var(--cream);padding:52px 0 44px}
#book .book-lede{text-align:center;color:var(--slate);margin:0 0 16px}
#book .book-trust{justify-content:center;margin:0 0 18px}
@media(max-width:640px){
  #book{padding:28px 0 40px}
  #book .sec-head{margin-bottom:8px}
  #book .book-lede{font-size:14.5px;line-height:1.5;margin:0 0 10px}
  #book .book-trust{margin:0 0 10px;gap:6px 8px}
  #book .book-trust .pill{font-size:11.5px;padding:5px 9px}
}

/* =========================================================================
   PROSE
   ========================================================================= */
.prose{padding:28px 0;position:relative;z-index:1}
.prose h2{font-size:clamp(21px,2.6vw,26px);margin:0 0 .55em;letter-spacing:-.02em}
.prose p{font-size:16.5px;color:#334155;margin:0 0 1.1em;line-height:1.7}
.prose ul,.prose ol{margin:0 0 1.2em;padding-left:1.3em}
.prose li{margin:.4em 0;color:#334155;line-height:1.65}
.prose strong{color:var(--navy)}
.prose+.prose{padding-top:0}

/* =========================================================================
   CARDS / SERVICE ICONS
   ========================================================================= */
.cards{display:grid;grid-template-columns:repeat(auto-fit,minmax(210px,1fr));gap:18px;position:relative;z-index:1}
.card{
  background:#fff;border:1px solid var(--line);border-radius:var(--radius-lg);padding:26px 22px;
  box-shadow:var(--shadow);position:relative;overflow:hidden;
  transition:transform .38s var(--ease),box-shadow .38s var(--ease),border-color .3s;
  animation:riseIn .6s var(--ease) both;
}
.card::before{
  content:'';position:absolute;inset:0;opacity:0;transition:opacity .38s;pointer-events:none;
  background:linear-gradient(160deg,rgba(var(--amber-rgb),.08),transparent 45%);
}
.card:hover{transform:translateY(-7px);box-shadow:var(--shadow-lg);border-color:rgba(var(--amber-rgb),.35)}
.card:hover::before{opacity:1}
.card .ic{
  width:56px;height:56px;border-radius:15px;display:grid;place-items:center;color:var(--navy);margin-bottom:6px;
  background:linear-gradient(135deg,rgba(var(--amber-rgb),.20),rgba(var(--amber-rgb),.06));
  box-shadow:inset 0 1px 0 rgba(255,255,255,.5);
  transition:transform .4s var(--ease),background .4s,color .4s;
}
.card .ic svg{width:30px;height:30px;display:block}
.card:hover .ic{background:linear-gradient(135deg,var(--navy),var(--navy-2));color:var(--amber-l);transform:scale(1.07) rotate(-4deg)}
.card h3{font-size:18.5px;margin:11px 0 7px;letter-spacing:-.01em}
.card p{margin:0 0 12px;font-size:14.5px;color:var(--slate);line-height:1.6}
.card a{font-weight:800;color:var(--amber-700);text-decoration:none;font-size:14px;display:inline-flex;align-items:center;gap:5px;transition:gap .2s,color .2s}
.card a::after{content:'→';transition:transform .25s var(--ease)}
.card a:hover{color:var(--navy)}
.card a:hover::after{transform:translateX(3px)}
/* pin the link row to the card bottom so "Read the guide" rows align across a card row */
.card{display:flex;flex-direction:column}
.card>a{margin-top:auto;align-self:flex-start}
/* blog hub category color-coding: amber = residential topics, navy = commercial */
.card.cat-res{border-left:4px solid var(--amber)}
.card.cat-com{border-left:4px solid var(--navy)}

/* stagger the entrance very slightly */
.cards .card:nth-child(2),.steps .step:nth-child(2),.reviews .review:nth-child(2){animation-delay:.06s}
.cards .card:nth-child(3),.steps .step:nth-child(3),.reviews .review:nth-child(3){animation-delay:.12s}
.cards .card:nth-child(4),.steps .step:nth-child(4),.reviews .review:nth-child(4){animation-delay:.18s}
.cards .card:nth-child(5),.reviews .review:nth-child(5){animation-delay:.24s}
.cards .card:nth-child(6),.reviews .review:nth-child(6){animation-delay:.3s}
@keyframes riseIn{from{opacity:0;transform:translateY(16px)}to{opacity:1;transform:translateY(0)}}

/* =========================================================================
   STEPS
   ========================================================================= */
.steps{display:grid;grid-template-columns:repeat(4,1fr);gap:16px;counter-reset:s;position:relative;z-index:1}
.steps::before{
  content:'';position:absolute;top:34px;left:8%;right:8%;height:2px;z-index:0;
  background:repeating-linear-gradient(90deg,rgba(var(--navy-rgb),.16) 0 10px,transparent 10px 20px);
}
.step{
  background:#fff;border:1px solid var(--line);border-radius:var(--radius-lg);padding:24px 18px 20px;position:relative;
  box-shadow:var(--shadow-sm);transition:transform .35s var(--ease),box-shadow .35s var(--ease);animation:riseIn .6s var(--ease) both;
}
.step:hover{transform:translateY(-5px);box-shadow:var(--shadow)}
.step::before{
  counter-increment:s;content:counter(s);position:absolute;top:-16px;left:20px;width:34px;height:34px;border-radius:50%;
  background:linear-gradient(135deg,var(--amber-l),var(--amber-d));color:#7c2d12;font-weight:900;display:grid;place-items:center;
  box-shadow:0 6px 14px rgba(var(--amber-rgb),.4),0 0 0 4px var(--cream);font-size:14.5px;
}
.step h3{font-size:16.5px;margin:10px 0 5px;letter-spacing:-.01em}
.step p{font-size:13.5px;color:var(--slate);margin:0;line-height:1.55}
@media(max-width:720px){ .steps{grid-template-columns:1fr 1fr} .steps::before{display:none} }

/* =========================================================================
   COMPARISON TABLE (navy premium block)
   ========================================================================= */
.compare{
  background:linear-gradient(160deg,var(--navy),var(--navy-2));color:#f1f5f9;border-radius:var(--radius-xl);
  padding:36px 34px;position:relative;overflow:hidden;box-shadow:var(--shadow-lg);z-index:1;
}
.compare::before{
  content:'';position:absolute;inset:0;pointer-events:none;opacity:.9;background-image:var(--tex-topo-dark);
}
.compare::after{
  content:'';position:absolute;top:-90px;right:-60px;width:320px;height:320px;pointer-events:none;
  background:radial-gradient(circle,rgba(var(--amber-rgb),.18),rgba(var(--amber-rgb),0) 70%);
}
.compare h2{color:#fff;position:relative;z-index:1}
.compare .tbl{position:relative;z-index:1;border-radius:var(--radius-md);margin-top:18px}
/* SEO/UX mobile-overflow fix: broaden from `.compare .tbl` to `.tbl` so EVERY
   comparison table gets mobile scroll-containment regardless of ancestor markup
   (the polyjacking-vs-mudjacking / mudjacking-holes pages wrap .tbl without a
   .compare ancestor -> table{min-width:520px} forced 540px page overflow at 390). */
@media(max-width:640px){.tbl{overflow-x:auto}}
table{width:100%;border-collapse:separate;border-spacing:0;min-width:520px}
th,td{padding:13px 16px;text-align:left;border-bottom:1px solid rgba(255,255,255,.12);font-size:14px}
thead th{
  color:var(--amber-l);font-size:12.5px;text-transform:uppercase;letter-spacing:.08em;
  background:rgba(255,255,255,.05);border-bottom:1px solid rgba(255,255,255,.18);
}
tbody tr{transition:background .2s}
tbody tr:hover{background:rgba(255,255,255,.05)}
tbody tr:nth-child(even){background:rgba(255,255,255,.025)}
tbody tr:last-child td{border-bottom:none}
td.win{color:#dcfce7;font-weight:750}
td.win::before{content:'✓';display:inline-block;margin-right:7px;color:var(--good);font-weight:900}
.compare caption{caption-side:top;text-align:left;color:var(--amber-l);font-size:12.5px;letter-spacing:.03em;padding:0 2px 12px}

/* =========================================================================
   CTA BAND
   ========================================================================= */
.band{
  background:linear-gradient(135deg,var(--amber-l),var(--amber) 55%,var(--amber-d));
  border-radius:var(--radius-xl);padding:34px 36px;display:flex;justify-content:space-between;align-items:center;
  gap:22px;flex-wrap:wrap;position:relative;overflow:hidden;z-index:1;
  box-shadow:0 20px 50px -14px rgba(var(--amber-rgb),.5),inset 0 1px 0 rgba(255,255,255,.35);
}
.band::before{
  content:'';position:absolute;inset:0;pointer-events:none;opacity:.5;mix-blend-mode:overlay;background-image:var(--tex-grain);background-size:140px 140px;
}
.band::after{
  content:'';position:absolute;bottom:-70px;left:-40px;width:260px;height:260px;pointer-events:none;
  background:radial-gradient(circle,rgba(255,255,255,.35),rgba(255,255,255,0) 70%);
}
.band>*{position:relative;z-index:1}
/* Body ink on the amber gradient card. #7c2d12 computed only 4.14/3.34/2.63
   across the #fb923c/#f97316/#ea580c stops (worst 2.63 at amber-d) — below AA.
   Deepened to #3a1206 (same warm orange hue, R>G>B): 7.31/5.90/4.65, worst 4.65 ≥4.5. */
.band h2{color:#3a1206}
.band p{margin:7px 0 0;color:#3a1206;font-weight:650}
.band .kicker{color:#3a1206}
.band .cta{display:flex;gap:12px;flex-wrap:wrap}

/* =========================================================================
   REVIEWS
   ========================================================================= */
.reviews{display:grid;grid-template-columns:repeat(auto-fit,minmax(250px,1fr));gap:18px;position:relative;z-index:1}
.review{
  background:#fff;border:1px solid var(--line);border-radius:var(--radius-lg);padding:24px 22px 22px;position:relative;
  box-shadow:var(--shadow-sm);transition:transform .35s var(--ease),box-shadow .35s var(--ease);overflow:hidden;animation:riseIn .6s var(--ease) both;
}
.review:hover{transform:translateY(-6px);box-shadow:var(--shadow)}
.review::before{
  content:'\201C';position:absolute;top:-6px;right:14px;font-size:74px;line-height:1;color:rgba(var(--amber-rgb),.14);
  font-family:Georgia,'Times New Roman',serif;font-weight:800;pointer-events:none;
}
.review .stars{font-size:16.5px}
.review p{font-size:14.5px;margin:9px 0 13px;color:#334155;line-height:1.6;position:relative}
.review .who{font-weight:750;color:var(--navy);font-size:13.5px}

/* =========================================================================
   CHIPS / AREA COLUMNS
   ========================================================================= */
.chips{display:flex;flex-wrap:wrap;gap:9px;margin-top:14px;position:relative;z-index:1}
.chip{
  background:#fff;border:1px solid var(--line);border-radius:999px;padding:6px 13px;font-size:13px;
  color:var(--slate);text-decoration:none;transition:all .22s var(--ease);box-shadow:var(--shadow-sm);
}
a.chip:hover{border-color:var(--amber);color:var(--navy);transform:translateY(-2px);box-shadow:0 6px 14px rgba(var(--amber-rgb),.2)}
.area-cols{display:grid;grid-template-columns:1fr 1fr;gap:30px;position:relative;z-index:1}
.area-cols h3{margin:0 0 6px;font-size:18.5px;letter-spacing:-.01em}
@media(max-width:720px){ .area-cols{grid-template-columns:1fr} }

/* =========================================================================
   FAQ
   ========================================================================= */
.faq{position:relative;z-index:1}
.faq details{
  background:#fff;border:1px solid var(--line);border-radius:var(--radius-md);padding:4px 20px;margin-bottom:12px;
  box-shadow:var(--shadow-sm);transition:box-shadow .28s,border-color .28s;
}
.faq details:hover{box-shadow:var(--shadow)}
.faq details[open]{border-color:rgba(var(--amber-rgb),.4);box-shadow:var(--shadow)}
.faq summary{
  font-weight:750;color:var(--navy);cursor:pointer;padding:16px 0;list-style:none;font-size:15.5px;
  display:flex;align-items:center;justify-content:space-between;gap:14px;
}
.faq summary::-webkit-details-marker{display:none}
.faq summary::after{
  content:'+';flex:none;width:30px;height:30px;border-radius:50%;display:grid;place-items:center;
  color:var(--amber-d);font-weight:900;font-size:17px;background:rgba(var(--amber-rgb),.12);
  transition:transform .35s var(--ease),background .3s,color .3s;
}
.faq details[open] summary::after{content:'\2013';transform:rotate(180deg);background:var(--navy);color:var(--amber-l)}
.faq .fa{color:var(--slate);font-size:14.5px;padding-bottom:16px;line-height:1.65}
.faq .fa p{margin:0 0 .75em}

/* =========================================================================
   FOOTER
   ========================================================================= */
footer{
  background:linear-gradient(195deg,var(--navy-2),var(--navy) 55%,var(--ink));color:#cbd5e1;padding:48px 0 30px;margin-top:24px;
  position:relative;overflow:hidden;
}
footer::before{content:'';position:absolute;top:0;left:0;right:0;height:3px;background:linear-gradient(90deg,transparent,var(--amber) 25%,var(--amber-l) 50%,var(--amber) 75%,transparent)}
footer::after{content:'';position:absolute;inset:0;pointer-events:none;opacity:.7;background-image:var(--tex-topo-dark)}
footer .wrap{position:relative;z-index:1}
footer h3{color:#fff;font-size:14.5px;margin:0 0 13px;text-transform:uppercase;letter-spacing:.07em;font-weight:800}
footer a{color:#cbd5e1;text-decoration:none;transition:color .2s,transform .2s;display:inline-block}
footer a:hover{color:var(--amber-l);transform:translateX(2px)}
.fsocial{display:flex;gap:14px;margin-top:14px}
.fsocial a{color:#94a3b8;display:inline-flex}
.fsocial a:hover{color:var(--amber-l);transform:none}
.fgrid{display:grid;grid-template-columns:2fr 1fr 1fr;gap:28px}
.fgrid p{line-height:1.7}
.fnote{border-top:1px solid rgba(255,255,255,.14);margin-top:28px;padding-top:18px;font-size:12.5px;color:#94a3b8}
@media(max-width:720px){ .fgrid{grid-template-columns:1fr;gap:26px} }

/* =========================================================================
   MOBILE CALL BAR
   ========================================================================= */
.callbar{
  position:fixed;bottom:0;left:0;right:0;z-index:50;display:none;gap:9px;
  padding:11px 11px calc(11px + env(safe-area-inset-bottom,0px));
  background:linear-gradient(180deg,var(--navy-2),var(--navy));
  box-shadow:0 -10px 26px rgba(var(--navy-rgb),.35);
  border-top:1px solid rgba(var(--amber-rgb),.35);
}
.callbar a{flex:1;text-align:center;justify-content:center}
@media(max-width:900px){ .callbar{display:flex} body{padding-bottom:76px} }
/* UX R5 D2: the homepage hero is the only template with a 3-button .cta stack
   (Book/Diagnose/Call). At <=900px the fixed .callbar already offers Call, so the
   redundant hero Call button pushed the 3rd trust pill down under the callbar
   (pill bottom 779.98 vs callbar top 766.20 = ~13.8px overlap at 390x844 on load).
   Drop the redundant hero Call on mobile -> restores the 2-button pattern every
   other page uses and lifts the trust row clear of the call bar. */
@media(max-width:900px){ .hero-phone{display:none} }

/* =========================================================================
   IMAGE-SLOT — styled placeholder for future before/after photography
   Drop a real <img> inside .img-slot and it fills/covers automatically;
   until then the branded placeholder pattern + icon renders.
   ========================================================================= */
.img-slot{
  position:relative;aspect-ratio:4/3;border-radius:var(--radius-lg);overflow:hidden;
  background:linear-gradient(160deg,#fff,var(--cream));border:1.5px dashed rgba(var(--navy-rgb),.22);
  display:grid;place-items:center;box-shadow:var(--shadow-sm);
}
.img-slot::before{content:'';position:absolute;inset:0;background-image:var(--tex-dots);opacity:.8;pointer-events:none}
.img-slot__icon{width:25%;max-width:64px;height:auto;color:var(--navy);opacity:.3;position:relative;z-index:1}
.img-slot__label{
  position:absolute;bottom:12px;left:12px;right:12px;font-size:11.5px;font-weight:750;letter-spacing:.06em;
  text-transform:uppercase;color:var(--navy);opacity:.45;text-align:center;z-index:1;
}
.img-slot img{position:relative;z-index:2;width:100%;height:100%;object-fit:cover;display:block}
.img-slot img ~ .img-slot__icon,.img-slot img ~ .img-slot__label{display:none}
.img-slot--wide{aspect-ratio:16/9}
.img-slot--square{aspect-ratio:1/1}
.img-slot--tall{aspect-ratio:3/4}

/* =========================================================================
   A11Y — skip-to-content link (H7): visually hidden until keyboard focus
   ========================================================================= */
.skip-link{position:absolute;left:-9999px;top:0;z-index:200;background:var(--navy);color:var(--white);
  font:700 15px/1 var(--font);padding:12px 20px;border-radius:0 0 10px 0;text-decoration:none}
.skip-link:focus{left:0;outline:3px solid var(--amber);outline-offset:2px}

/* =========================================================================
   DECORATIVE SECTION DIVIDERS (optional inline SVG placement — see notes)
   ========================================================================= */
.section-divider{display:block;width:100%;height:auto;line-height:0;position:relative;z-index:1;margin:-6px 0}
.section-divider svg{display:block;width:100%;height:auto}

/* =========================================================================
   MOTION SAFETY
   ========================================================================= */
@media (prefers-reduced-motion: reduce){
  *,*::before,*::after{animation-duration:.01ms !important;animation-iteration-count:1 !important;transition-duration:.01ms !important;scroll-behavior:auto !important}
}


/* ---- mobile hamburger menu (added) ---- */
.nav-toggle{display:none;background:#fff;border:1.5px solid var(--line);border-radius:11px;width:48px;height:48px;font-size:22px;line-height:1;color:var(--navy);cursor:pointer;align-items:center;justify-content:center;box-shadow:var(--shadow-sm)}
.nav-toggle:hover{border-color:var(--amber);color:var(--amber-d)}
@media(max-width:900px){
  .nav{position:relative}
  .nav-toggle{display:inline-flex}
  .nav .links{display:none;position:absolute;top:calc(100% + 10px);left:0;right:0;background:#fff;border:1px solid var(--line);border-radius:16px;box-shadow:var(--shadow-lg);flex-direction:column;align-items:stretch;gap:2px;padding:12px;z-index:60}
  .nav .links.open{display:flex;animation:navdrop .18s ease}
  @keyframes navdrop{from{opacity:0;transform:translateY(-6px)}to{opacity:1;transform:none}}
  .nav .links>a{padding:13px 14px;border-radius:10px;font-size:16px;color:var(--navy);font-weight:700}
  .nav .links>a:active{background:var(--cream)}
  .nav .links .drop{position:static}
  .nav .links .drop>a{padding:13px 14px;border-radius:10px;font-size:16px;color:var(--navy);font-weight:700;display:block}
  /* VISUAL R2 D4: mobile submenus are ACCORDIONS — collapsed by default, expanded only
     when the parent .drop gets .open (toggled by tapping its link; JS in base()). Was
     display:flex unconditionally, which unfurled both full submenus (Services + Learn,
     ~17 links) the instant the hamburger opened, burying Service Areas/Diagnose/About
     ~450px down. */
  .nav .links .drop .menu{position:static;display:none;box-shadow:none;border:0;border-radius:0;padding:0 0 8px 14px;min-width:0;background:transparent;opacity:1;visibility:visible;transform:none;transition:none}
  .nav .links .drop .menu a{padding:9px 12px;font-size:14.5px;color:var(--slate)}
  .nav .links .drop.open .menu{display:flex}
}

/* ---- ≤430px header fit: logo 40→32px, phone 16→13.5px, nav gap 16→8px
   (phone number was clipping at the 390px viewport edge) ---- */
@media(max-width:430px){
  .logo-img{height:32px}
  /* SEO R4 DED2 (ledger tap-target): live .phone height was 21.6px (font 13.5 x LH 1.6,
     padding 0) — 45% of the ~48px guideline. Vertical padding on this inline flex child
     lifts its getBoundingClientRect tap height to ~49.6px (13px would only reach 47.6). */
  .phone{font-size:13.5px;padding:14px 0}
  .nav{gap:8px}
}


/* =========================================================================
   NAVY CONTRAST BANDS — owner ruling 12. Wave D3 shipped this on the homepage;
   VISUAL R3 D1 extends the same rhythm to the inner-page template (see the
   .band--navy.prose overrides at the end of this block) so city/money/guide
   pages no longer run all-cream until the two footer bands.
   Deep-navy sections alternating with cream/white. Solid backgrounds on
   purpose so every contrast pair is deterministic: section = --navy
   #0f172a, cards = --navy-2 #1e293b. All pairs computed ≥4.5:1 (evidence
   in the D3 unit log). The :not() chain matches the specificity of the
   nth-of-type alternation rules above so source order wins the tie.
   ========================================================================= */
section.band--navy:not(.hero):not(.phero){background:var(--navy)}
section.band--navy:not(.hero):not(.phero)::after{background-image:var(--tex-topo-dark);opacity:.8}
/* the light↔dark boundary seam: a 2px amber hairline replaces the navy one
   (the wave-amber SVG divider is NOT used against navy — no cream wave on
   dark; homepage carries no .section-divider divs, verified at build) */
section.band--navy:not(.hero):not(.phero)::before{height:2px;background:linear-gradient(90deg,transparent,rgba(var(--amber-rgb),.55) 18%,rgba(var(--amber-rgb),.55) 82%,transparent)}
.band--navy h2,.band--navy h3{color:#f8fafc}
.band--navy p{color:#e2e8f0}
.band--navy .sec-head p{color:#cbd5e1}
.band--navy .kicker{color:var(--amber-l)}
.band--navy .kicker::before{box-shadow:0 0 0 3px rgba(var(--amber-rgb),.28)}
.band--navy a:not(.btn){color:var(--amber-l)}
/* light card frame for light-background diagrams (IL01) sitting on navy */
.band--navy .img-lightcard{background:#fff;border-radius:var(--radius-md);padding:16px;box-shadow:0 18px 44px rgba(0,0,0,.45)}
/* review cards restyled for the dark surface */
.band--navy .review{background:var(--navy-2);border-color:rgba(255,255,255,.14);box-shadow:0 14px 34px rgba(0,0,0,.35)}
.band--navy .review:hover{box-shadow:0 20px 44px rgba(0,0,0,.45)}
.band--navy .review::before{color:rgba(var(--amberl-rgb),.28)}
.band--navy .review p{color:#e2e8f0}
.band--navy .review .who{color:#fff7ed}
.band--navy .stars{color:var(--amber-l)}
/* the amber CTA card keeps its own dark-amber ink when riding a navy band
   (re-override: the generic .band--navy text rules above would tie .band's) */
.band--navy .band h2,.band--navy .band p{color:#3a1206}
/* VISUAL R2 D5 (ruling 12/20 navy rhythm): the homepage comparison block is promoted
   from a navy CARD floating on a cream section to a full band--navy SECTION, so the
   mid-page reads as a section-level dark hit and breaks the long light run. The .compare
   card was ALREADY navy-on-navy content (h2 #fff, td.win #dcfce7, hairline borders — all
   light-on-dark, WCAG unchanged); here we just drop its now-redundant card chrome so the
   table sits directly on the band. Leaves the why-sinks section cream (its documented
   anti-double-dark decision stands) — the compare band's neighbours are both cream. */
/* UX R3 D1: keep overflow HIDDEN here (was visible). The base .compare{overflow:hidden}
   clips the decorative .compare::after amber glow (top:-90px;right:-60px); the navy-band
   variant's overflow:visible let that glow bleed 60px past the right edge, giving the
   homepage a 60px horizontal-scroll bug at 390px. The table's own scroll is handled
   independently by .compare .tbl{overflow-x:auto}. */
.band--navy .compare{background:none;border-radius:0;box-shadow:none;padding:0;overflow:hidden}
.band--navy .compare::before{display:none}
/* VISUAL R3 D1 (ruling 12/20 navy rhythm, sitewide): the inner-page template promotes ONE
   early body PROSE section to band--navy (render_content_page/render_city/render_article),
   giving every city/money/guide page a navy hit in its first half instead of only the two
   footer bands. The generic rules above already recolor h2/h3/p/.kicker/a for navy; a prose
   section additionally carries lists, bold and blockquotes — recolor those so the block is
   fully WCAG-AA light-on-navy. Scoped with the .prose compound so the structural navy bands
   (compare/reviews/video/cta) are byte-for-byte untouched. Full section padding (prose is
   normally 28px) so the promoted block reads as a proper band. */
.band--navy.prose{padding:46px 0}
.band--navy.prose li{color:#e2e8f0}
.band--navy.prose strong{color:#fff}
.band--navy.prose blockquote{color:#e2e8f0;border-left-color:var(--amber)}

/* ---- Quick Answer (AEO) callout ---- */
.qa-wrap{padding:20px 0 4px}
.quick-answer{background:var(--cream);border:1px solid var(--line);border-left:5px solid var(--amber);border-radius:14px;padding:18px 22px;box-shadow:var(--shadow-sm)}
.quick-answer .qa-label{display:inline-block;font-size:11.5px;font-weight:800;letter-spacing:.14em;text-transform:uppercase;color:var(--amber-700);margin-bottom:6px}
.quick-answer p{margin:0;font-size:17px;line-height:1.6;color:var(--ink);font-weight:500}
@media(max-width:640px){.quick-answer p{font-size:15.5px}}
/* MERGE-moonshot: per-city KC Settlement Risk Index block — a .quick-answer variant
   with multiple paragraphs + a small sourced-citation line (city pages, sitewide). */
.msi-city-data p{margin:0 0 .6em}
.msi-city-data p:last-child{margin-bottom:0}
.msi-src{margin-top:2px}
.msi-src small{font-size:12.5px;line-height:1.5;color:var(--slate);font-weight:400}
