@font-face{font-family:"Bricolage Grotesque";font-style:normal;font-weight:600 800;font-display:swap;src:url("/assets/fonts/bricolage-grotesque-latin.woff2") format("woff2");unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD}
@font-face{font-family:"Public Sans";font-style:normal;font-weight:400 700;font-display:swap;src:url("/assets/fonts/public-sans-latin.woff2") format("woff2");unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD}
:root{--scrim:rgba(22,48,90,0.66);--scrim-soft:rgba(22,48,90,0.3);--primary:#16305a;--on-primary:#ffffff;--brand-text:#16305a;--accent:#1265c7;--cta:#f59b14;--cta-ink:#10161d;--cta-light:#16305a;--cta-light-ink:#ffffff;--deep:#16305a;--ink:#0c131f;--tint:#f1f3f5;--tint-2:#e3e6eb;--line:#d5dae1;--font-display:"Bricolage Grotesque","Arial Narrow",Arial,sans-serif;--font-body:"Public Sans",Arial,sans-serif}
*,*::before,*::after{box-sizing:border-box}
:root{--ease:cubic-bezier(.22,1,.36,1);--r:16px;--text:#2b3139;--muted:#505a66;--z-bar:30;--z-sticky:40;--z-skip:50;--bar-h:60px;--sec:64px}
html{-webkit-text-size-adjust:100%;scroll-padding-top:88px;scroll-padding-bottom:var(--bar-h)}
body{margin:0;font-family:var(--font-body);font-size:1.0625rem;line-height:1.65;color:var(--text);background:#fff;padding-bottom:var(--bar-h);overflow-x:hidden}
img{max-width:100%;height:auto;display:block}
a{color:var(--brand-text);text-underline-offset:3px}
h1,h2,h3{font-family:var(--font-display);line-height:1.08;color:var(--ink);margin:0 0 .5em;font-weight:760;letter-spacing:-.022em;text-wrap:balance;overflow-wrap:break-word}
h1{font-size:clamp(2.2rem,1.3rem + 4.2vw,4.4rem);font-weight:800}
h2{font-size:clamp(1.75rem,1.25rem + 2vw,2.75rem)}
h3{font-size:1.3rem;letter-spacing:-.012em}
p{margin:0 0 1em;text-wrap:pretty}
.wrap{max-width:1180px;margin:0 auto;padding:0 20px}
.skip{position:absolute;left:-9999px}
.skip:focus{left:12px;top:12px;background:#fff;color:var(--ink);padding:10px 14px;z-index:var(--z-skip);border-radius:8px}
.ico{width:1.2em;height:1.2em;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;flex:none}
:focus-visible{outline:3px solid var(--cta);outline-offset:3px}
.sentinel{position:absolute;top:0;left:0;width:1px;height:1px;pointer-events:none}

/* header — fixed height; only background/shadow change on scroll */
/* Opaque white at every scroll position, above the hero overlay and the call bar. */
.site-header{position:sticky;top:0;z-index:var(--z-sticky);background:#fff;border-bottom:1px solid var(--line);transition:box-shadow .25s var(--ease)}
.site-header.scrolled{box-shadow:0 12px 28px -18px rgba(10,14,20,.45)}
.bar{height:68px;display:flex;align-items:center;gap:12px;position:relative}
.brand{margin-right:auto;display:flex;align-items:center;text-decoration:none;min-width:0}
.logo{height:40px;width:auto;max-width:180px;object-fit:contain;object-position:left center}
.logo-boxed{background:#fff;padding:4px 8px;border-radius:8px}
.wordmark{font-family:var(--font-display);font-weight:800;font-size:1.3rem;color:var(--ink);letter-spacing:-.02em;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block}
.nav{display:none}
.nav-list{list-style:none;margin:0;padding:0;display:flex;align-items:center;gap:2px}
.nav-list>li{position:relative}
.nav-list>li>a,.nav-disc{display:inline-flex;align-items:center;gap:7px;color:var(--ink);text-decoration:none;font:inherit;font-weight:600;line-height:1.3;white-space:nowrap;padding:8px 12px;border:0;cursor:pointer;background:linear-gradient(currentColor,currentColor) 12px calc(100% - 4px)/0 2px no-repeat;transition:background-size .25s var(--ease),color .2s}
/* Every :hover rule sits in @media (hover:hover) and (pointer:fine). On iOS a
   :hover that moves or restyles the thing tapped eats the first tap (the
   "double tap" bug), so touch screens never see a hover state at all. */
.nav-list>li>a[aria-current=page],.nav-disc[aria-expanded=true]{color:var(--brand-text);background-size:calc(100% - 24px) 2px}
@media (hover:hover) and (pointer:fine){.nav-list>li>a:hover,.nav-disc:hover{color:var(--brand-text);background-size:calc(100% - 24px) 2px}}
.nav-disc::after{content:"";width:7px;height:7px;border-right:2px solid currentColor;border-bottom:2px solid currentColor;transform:translateY(-2px) rotate(45deg);transition:transform .25s var(--ease)}
.nav-disc[aria-expanded=true]::after{transform:translateY(2px) rotate(225deg)}
/* Services submenu (W3C disclosure). app.js owns it via [hidden] +
   aria-expanded; an author display rule would beat the UA [hidden], so say it. */
.submenu,.submenu ul{list-style:none;margin:0;padding:0}
.submenu[hidden]{display:none}
.submenu a{display:block;color:var(--ink);text-decoration:none;font-weight:650;line-height:1.3;border-radius:8px;transition:background-color .2s,color .2s}
.submenu a[aria-current=page]{color:var(--brand-text);background:var(--tint)}
@media (hover:hover) and (pointer:fine){.submenu a:hover{color:var(--brand-text);background:var(--tint)}}
.submenu ul a{font-weight:500;font-size:.94rem;color:var(--muted)}
.header-call{min-height:44px;padding:0 12px}
.header-call span{display:none}
.menu-btn{display:inline-flex;align-items:center;justify-content:center;width:44px;height:44px;border:1px solid var(--line);border-radius:10px;background:#fff;color:var(--ink);cursor:pointer}
.menu-btn .ico{width:22px;height:22px}
/* Mobile menu: the JS button toggles .open; without JS a hidden checkbox and
   its label do the same, so the list stays collapsed until tapped either way.
   The bar is the .wrap, so the panel spans its padding box (left/right 0). */
.menu-toggle{position:absolute;width:1px;height:1px;opacity:0;pointer-events:none}
html.js .menu-toggle,html.js .menu-label,html:not(.js) button.menu-btn{display:none}
.menu-toggle:focus-visible~.menu-label{outline:2px solid var(--brand-text);outline-offset:2px}
@media (max-width:899.98px){
html.js .nav.open,.menu-toggle:checked~.nav{display:flex;flex-direction:column;position:absolute;top:100%;left:0;right:0;background:#fff;padding:8px 20px 16px;box-shadow:0 16px 28px -18px rgba(10,14,20,.5);border-top:1px solid var(--line);max-height:calc(100svh - 68px);overflow-y:auto;overscroll-behavior:contain}
.nav-list{flex-direction:column;align-items:stretch;gap:0}
.nav-list>li>a,.nav-disc{display:flex;width:100%;padding:14px 0;border-bottom:1px solid var(--line);background:none}
.nav-disc{justify-content:space-between;text-align:left}
.nav-disc::after{margin-right:6px}
.submenu{padding:6px 0 10px;border-bottom:1px solid var(--line)}
.submenu a{padding:11px 12px}
.submenu ul{padding-left:14px}
.submenu ul a{padding:8px 12px}
/* No JS: the Services list sits open inside the checkbox menu. */
html:not(.js) .nav-disc{cursor:default;color:var(--muted);font-size:.86rem;letter-spacing:.06em;text-transform:uppercase;padding-bottom:6px;border-bottom:0}
html:not(.js) .nav-disc::after{display:none}
}

/* buttons */
.btn{display:inline-flex;align-items:center;justify-content:center;gap:10px;min-height:52px;padding:0 24px;border-radius:12px;font-weight:700;font-size:1.02rem;line-height:1.2;text-decoration:none;border:2px solid transparent;cursor:pointer;transition:transform .2s var(--ease),box-shadow .2s var(--ease),background-color .2s,border-color .2s}
@media (hover:hover) and (pointer:fine){.btn:hover{transform:translateY(-2px);box-shadow:0 12px 24px -14px rgba(5,7,10,.55)}}
.btn:active{transform:translateY(0) scale(.98);box-shadow:none}
.btn-cta{background:var(--cta);color:var(--cta-ink)}
.btn-ghost{color:inherit;border-color:color-mix(in srgb,currentColor 60%,transparent);background:color-mix(in srgb,currentColor 6%,transparent)}
@media (hover:hover) and (pointer:fine){.btn-ghost:hover{border-color:currentColor;background:color-mix(in srgb,currentColor 12%,transparent)}}
.btn-solid{background:var(--cta-light);color:var(--cta-light-ink)}
.btn-outline{background:#fff;color:var(--brand-text);border-color:var(--brand-text)}
.ctas{display:flex;flex-wrap:wrap;gap:12px;margin:26px 0 0}
.ctas .btn{flex:1 1 200px}
.kicker{font-weight:700;font-size:.9rem;letter-spacing:.06em;text-transform:uppercase;color:var(--brand-text);margin:0 0 16px;display:flex;align-items:center;gap:12px}
.kicker::before{content:"";flex:none;width:28px;height:3px;border-radius:2px;background:var(--accent)}

/* home hero */
@keyframes rise{from{transform:translateY(20px)}to{transform:none}}
.hero-copy>*{animation:rise .55s var(--ease) both}
.hero-copy>:nth-child(2){animation-delay:70ms}
.hero-copy>:nth-child(3){animation-delay:140ms}
.hero-copy>:nth-child(4){animation-delay:210ms}
.hero-copy>:nth-child(5){animation-delay:280ms}
.hero{position:relative;color:#fff;overflow:hidden;background:var(--deep)}
.hero h1{color:inherit;max-width:14ch}
.hero .kicker{color:inherit;opacity:.92}
.hero-sub{font-size:clamp(1.1rem,1rem + .5vw,1.3rem);max-width:38ch;color:color-mix(in srgb,currentColor 92%,transparent);margin:0}
.hero-phone{margin:18px 0 0;color:color-mix(in srgb,currentColor 88%,transparent);font-size:.98rem}
.hero-phone a{color:inherit;font-weight:700}
.hero-photo{min-height:min(86svh,720px);display:flex;align-items:flex-end}
.hero-media,.hero-media img{position:absolute;inset:0;width:100%;height:100%}
.hero-media img{object-fit:cover;object-position:center 40%}
/* --scrim is the deep brand color at the alpha render.mjs checked the H1
   against (≥ 4.5:1 even over a white pixel); the copy sits on that stop. */
.hero-scrim{position:absolute;inset:0;background:linear-gradient(to top,var(--scrim) 0%,var(--scrim) 72%,var(--scrim-soft) 100%)}
.hero-photo .wrap{position:relative;width:100%}
.hero-photo .hero-copy{padding:140px 0 44px}
.hero-photo .hero-sub{max-width:34ch}
.hero-photo .ctas .btn{flex:1 1 150px}
.hero-illo,.split-art{color:var(--on-primary);background:radial-gradient(circle at 85% 15%,color-mix(in srgb,var(--primary) 82%,#fff) 0,transparent 55%),radial-gradient(color-mix(in srgb,var(--on-primary) 9%,transparent) 1.2px,transparent 1.4px) 0 0/22px 22px,linear-gradient(150deg,var(--primary) 0%,color-mix(in srgb,var(--primary) 80%,#000) 100%)}
.hero-grid{display:grid;gap:8px;padding:56px 20px 40px}
.hero-art{color:inherit;max-width:380px;margin:8px auto 0;width:100%}
/* Split hero (Unit 9.6 A): a photo under 1400px long side never goes full
   bleed — the copy sits on a brand-dark panel, the photo in a framed box no
   wider than the variant it loads (max-width set inline from the source). */
.hero-split{color:#fff;background:radial-gradient(circle at 88% 12%,color-mix(in srgb,var(--primary) 70%,transparent) 0,transparent 60%),var(--deep)}
.hero-split .hero-grid{padding:48px 20px 56px;gap:36px}
.hero-split .hero-sub{max-width:34ch}
.hero-frame{margin:0;width:100%;justify-self:center;position:relative}
.hero-frame::before{content:"";position:absolute;inset:14px -14px -14px 14px;border-radius:20px;border:2px solid var(--accent);opacity:.7}
.hero-frame img{position:relative;width:100%;height:auto;object-fit:cover;border-radius:18px;box-shadow:0 30px 60px -30px rgba(0,0,0,.7)}
.hero-frame.f-land img{aspect-ratio:4/3}
.hero-frame.f-square img{aspect-ratio:1}
.hero-frame.f-tall img{aspect-ratio:4/5}
.illo{width:100%;height:auto;display:block}
.illo .il-l{fill:none;stroke:currentColor;stroke-width:4;stroke-linecap:round;stroke-linejoin:round}
.illo .il-s{fill:currentColor;opacity:.1}
.illo .il-a{fill:var(--cta)}

/* trust strip */
/* One row on desktop, at most two on a phone (2 columns, 4 items). */
.trust-strip{background:#fff;border-bottom:1px solid var(--line)}
.trust-strip ul{list-style:none;margin:0;padding:16px 0;display:grid;gap:12px 16px;grid-template-columns:repeat(2,minmax(0,1fr))}
.trust-strip li{display:flex;align-items:center;gap:10px;font-weight:650;font-size:.9rem;color:var(--ink);line-height:1.3;min-width:0}
.trust-strip li:nth-child(n+5){display:none}
.trust-strip .ico{width:28px;height:28px;padding:6px;border-radius:50%;background:color-mix(in srgb,var(--accent) 22%,#fff);color:var(--ink);stroke-width:2.6}

/* services */
/* Section rhythm (Unit 9.6 I): one padding (64 / 96px) and a fixed tone
   order set by render.mjs (data-tone: white, tint, dark). */
.services-sec,.gallery-sec,.faq-sec,.reviews-sec,.about-teaser,.areas-sec,.cta-band,.siblings,.where-next,.city-proof,.work-sec,.count-on{padding:var(--sec) 0}
section[data-tone=white]{background:#fff}
section[data-tone=tint]{background:var(--tint)}
.sec-head{display:grid;gap:8px 56px;margin-bottom:36px;align-items:end}
.sec-head h2{margin:0}
.sec-head h2::before,.gallery-sec .sec-rule::before{content:"";display:block;width:44px;height:4px;border-radius:2px;background:var(--accent);margin:0 0 18px}
.sec-head p{margin:0;max-width:56ch;color:var(--muted);font-size:1.08rem}
.svc-grid{list-style:none;margin:0;padding:0;display:grid;gap:20px;grid-template-columns:repeat(auto-fit,minmax(min(100%,290px),1fr))}
.svc a{display:flex;flex-direction:column;height:100%;text-decoration:none;color:inherit;background:#fff;border:1px solid var(--line);border-radius:var(--r);overflow:hidden;transition:transform .3s var(--ease),box-shadow .3s var(--ease),border-color .3s}
@media (hover:hover) and (pointer:fine){.svc a:hover{transform:translateY(-4px);box-shadow:0 22px 40px -26px rgba(10,14,20,.55);border-color:var(--tint-2)}}
.svc-media{aspect-ratio:4/3;overflow:hidden;background:var(--tint)}
.svc-media img{width:100%;height:100%;object-fit:cover;transition:transform .6s var(--ease)}
@media (hover:hover) and (pointer:fine){.svc a:hover .svc-media img{transform:scale(1.04)}}
/* Compact list cards (no photo for every service): icon left, title, blurb. */
.svc-grid-list{grid-template-columns:repeat(auto-fit,minmax(min(100%,320px),1fr));gap:14px}
.svc-grid-list .svc a{flex-direction:row;align-items:flex-start;gap:16px;padding:20px 20px 20px 18px}
.svc-ico{flex:none;display:grid;place-items:center;width:52px;height:52px;border-radius:14px;background:color-mix(in srgb,var(--accent) 16%,#fff);color:var(--brand-text)}
.svc-ico .ico{width:28px;height:28px;stroke-width:1.7}
.svc-grid-list .svc-body{padding:0}
.svc-grid-list .svc-body h3{font-size:1.15rem;margin:2px 0 6px}
.svc-grid-list .svc-body p{margin:0 0 10px;font-size:.95rem;line-height:1.5}
.svc-grid-list .svc-foot{margin-top:auto}
.svc-grid-list .go{width:32px;height:32px}
.svc-all{display:none;margin:22px 0 0}
.svc-body{padding:20px 22px 22px;display:flex;flex-direction:column;flex:1}
.svc-body h3{margin:0 0 8px}
.svc-body p{color:var(--muted);font-size:.98rem;margin:0 0 18px}
.svc-foot{margin-top:auto;display:flex;align-items:center;justify-content:space-between;gap:12px}
.price{display:inline-block;font-weight:700;font-size:.92rem;color:var(--ink);background:var(--tint-2);border-radius:999px;padding:4px 12px}
.go{width:40px;height:40px;border-radius:50%;display:grid;place-items:center;background:var(--cta-light);color:var(--cta-light-ink);transition:transform .3s var(--ease)}
@media (hover:hover) and (pointer:fine){.svc a:hover .go{transform:translateX(4px)}}

/* about teaser */
.about-teaser{background:var(--primary);color:var(--on-primary)}
.about-teaser h2{color:inherit}
.about-t{display:grid;gap:40px;align-items:center}
.about-t.no-photo{max-width:820px}
.about-t .lede{font-size:clamp(1.15rem,1rem + .5vw,1.35rem);line-height:1.55}
.about-t p{color:color-mix(in srgb,currentColor 92%,transparent)}
.text-link{color:inherit;font-weight:700;display:inline-flex;align-items:center;gap:8px;text-decoration:none;border-bottom:2px solid var(--cta);padding-bottom:2px}
.text-link .ico{transition:transform .25s var(--ease)}
@media (hover:hover) and (pointer:fine){.text-link:hover .ico{transform:translateX(4px)}}
.portrait,.about-portrait{position:relative;margin:0 14px 14px 0;max-width:420px}
.portrait::before,.about-portrait::before{content:"";position:absolute;inset:14px -14px -14px 14px;border-radius:var(--r);background:var(--cta)}
.portrait img,.about-portrait img{position:relative;width:100%;aspect-ratio:4/5;object-fit:cover;border-radius:var(--r)}

/* gallery */
/* Gallery (Unit 9.6 D): uniform 4:3 tiles from the tile variant, captioned. */
.gallery{list-style:none;margin:0;padding:0;display:grid;gap:18px 12px;grid-template-columns:repeat(2,minmax(0,1fr))}
.gallery li{min-width:0}
.gallery figure{margin:0}
.gallery .g-img{display:block;overflow:hidden;border-radius:12px;background:var(--tint-2);aspect-ratio:4/3}
.gallery img{width:100%;height:100%;aspect-ratio:4/3;object-fit:cover;transition:transform .6s var(--ease)}
@media (hover:hover) and (pointer:fine){.gallery li:hover img{transform:scale(1.04)}}
.gallery figcaption{padding:8px 2px 0;color:var(--muted);font-size:.84rem;line-height:1.35}
/* An odd count on two columns: the last tile waits for desktop (lazy, so never loaded). */
.gallery-home li:last-child:nth-child(odd){display:none}
.gallery-foot{margin:28px 0 0}
.areas .areas-more-item{background:transparent;border-style:dashed}
.areas .areas-more-item a,.areas li a{color:inherit}

/* areas */
.areas-sec{background:var(--tint);border-top:1px solid var(--line);border-bottom:1px solid var(--line)}
.areas-sec[data-tone]{border:0}
.areas{list-style:none;margin:0;padding:0;display:flex;flex-wrap:wrap;gap:10px}
.areas li{display:inline-flex;align-items:center;gap:8px;background:#fff;border:1px solid var(--line);border-radius:999px;padding:9px 16px 9px 12px;font-weight:600;color:var(--ink)}
.areas .ico{color:var(--brand-text);width:18px;height:18px}

/* FAQ — native accordion, animated height + chevron */
.faq-wrap{display:grid;gap:16px}
.faqs{border-top:1px solid var(--line)}
.faq{border-bottom:1px solid var(--line)}
.faq h3{margin:0;font-family:var(--font-body);font-size:1.08rem;letter-spacing:0}
.faq button{width:100%;text-align:left;background:none;border:0;padding:20px 48px 20px 0;font:inherit;font-weight:700;line-height:1.4;color:var(--ink);cursor:pointer;position:relative;min-height:56px;transition:color .2s}
@media (hover:hover) and (pointer:fine){.faq button:hover{color:var(--brand-text)}}
.faq button::after{content:"";position:absolute;right:10px;top:50%;width:10px;height:10px;border-right:2.5px solid var(--brand-text);border-bottom:2.5px solid var(--brand-text);transform:translateY(-70%) rotate(45deg);transition:transform .35s var(--ease)}
.faq button[aria-expanded=true]::after{transform:translateY(-30%) rotate(225deg)}
.faq .answer{display:grid;grid-template-rows:0fr;transition:grid-template-rows .35s var(--ease)}
.faq .answer.open{grid-template-rows:1fr}
.faq .answer[hidden]{display:none}
html.js .answer:not(.open)>div{visibility:hidden}
html:not(.js) .answer{grid-template-rows:1fr}
.faq .answer>div{overflow:hidden}
.faq .answer p{margin:0;padding:0 40px 22px 0;color:var(--text);max-width:68ch}

/* CTA band */
.cta-band{background:radial-gradient(circle at 12% 130%,rgba(255,255,255,.14),transparent 50%),repeating-linear-gradient(135deg,rgba(255,255,255,.035) 0 2px,transparent 2px 16px),var(--primary);color:var(--on-primary);border-top:4px solid var(--accent)}
.cta-band h2{color:inherit;margin-bottom:.3em}
.cta-band p{color:color-mix(in srgb,currentColor 92%,transparent);font-size:1.12rem;margin:0;max-width:48ch}
.cta-inner{display:grid;gap:28px;align-items:center}
.cta-phone{display:block;font-family:var(--font-display);font-weight:800;font-size:clamp(1.9rem,1.4rem + 2vw,2.8rem);color:inherit;text-decoration:none;letter-spacing:-.02em;line-height:1}
.cta-side .ctas{margin-top:18px}

/* a section title that isn't an H2 (keyword pages keep 3–8 H2s) — same look */
.sec-title{font-family:var(--font-display);font-size:clamp(1.75rem,1.25rem + 2vw,2.75rem);line-height:1.08;color:var(--ink);margin:0 0 .5em;font-weight:760;letter-spacing:-.022em;text-wrap:balance}
.cta-band .sec-title{color:inherit;margin-bottom:.3em}
.areas-more{margin:22px 0 0}
.areas-sec .text-link{color:var(--ink)}

/* where to next — 2–3 cards above the CTA band; the whole card is the link */
.where-next{border-top:1px solid var(--line)}
.where-next h2{font-size:clamp(1.5rem,1.2rem + 1.2vw,2.1rem)}
.wn-grid{list-style:none;margin:0;padding:0;display:grid;gap:16px;grid-template-columns:repeat(auto-fit,minmax(min(100%,260px),1fr))}
.wn-card{position:relative;background:#fff;border:1px solid var(--line);border-radius:var(--r);padding:22px 22px 20px;transition:transform .3s var(--ease),box-shadow .3s var(--ease),border-color .3s}
@media (hover:hover) and (pointer:fine){.wn-card:hover{transform:translateY(-3px);box-shadow:0 20px 36px -26px rgba(10,14,20,.55);border-color:var(--tint-2)}}
.wn-card a{display:flex;align-items:center;justify-content:space-between;gap:12px;font-family:var(--font-display);font-weight:760;font-size:1.25rem;line-height:1.2;letter-spacing:-.012em;color:var(--ink);text-decoration:none}
.wn-card a::after{content:"";position:absolute;inset:0;border-radius:inherit}
.wn-card a .ico{color:var(--brand-text);transition:transform .25s var(--ease)}
@media (hover:hover) and (pointer:fine){.wn-card:hover a .ico{transform:translateX(4px)}}
.wn-card p{margin:8px 0 0;color:var(--muted);font-size:.98rem;line-height:1.5}

/* /work/ — every gallery photo, captioned */
.work-hero{padding:24px 0 8px}
.work-hero .lede{font-size:1.15rem;max-width:56ch}
.work-sec{padding-top:32px}

/* service-areas hub */
.hub-sec{padding:8px 0 72px}
.hub-sec h2{font-size:clamp(1.5rem,1.2rem + 1.2vw,2.1rem)}

/* gallery: the home shows GALLERY_FIRST photos; /work/ has every one (no JS needed) */
.more-work{margin-top:18px}
.more-work>summary{display:inline-flex;align-items:center;gap:8px;min-height:52px;padding:0 24px;border:2px solid var(--brand-text);border-radius:12px;color:var(--brand-text);font-weight:700;cursor:pointer;list-style:none;transition:background-color .2s}
.more-work>summary::-webkit-details-marker{display:none}
.more-work>summary::after{content:"";width:8px;height:8px;border-right:2.5px solid currentColor;border-bottom:2.5px solid currentColor;transform:translateY(-2px) rotate(45deg);transition:transform .25s var(--ease)}
.more-work[open]>summary::after{transform:translateY(2px) rotate(225deg)}
@media (hover:hover) and (pointer:fine){.more-work>summary:hover{background:var(--tint)}}
.more-work[open]>summary{margin-bottom:14px}
.more-count{font-weight:600;opacity:.75}

/* crumbs */
.crumbs{font-size:.88rem;color:var(--muted);padding-top:20px;padding-bottom:8px}
.crumbs ol{list-style:none;padding:0;margin:0;display:flex;flex-wrap:wrap;gap:6px}
.crumbs li+li::before{content:"/";margin-right:6px;color:var(--line)}
.crumbs a{color:var(--muted)}

/* service page — split hero, body + sticky aside */
.split-hero{padding:28px 0 56px;background:linear-gradient(180deg,#fff 0,var(--tint) 100%)}
.split{display:grid;gap:36px;align-items:center}
.split-copy h1{font-size:clamp(2.1rem,1.4rem + 3vw,3.6rem)}
.split-copy .lede{font-size:1.15rem;max-width:52ch}
.price-tag{margin:0 0 4px}
.price-tag .price{font-size:1rem;background:#fff;border:1px solid var(--line)}
.contact-line{font-size:.95rem;color:var(--muted);margin:16px 0 0}
.split-media{margin:0;border-radius:20px;overflow:hidden;box-shadow:0 30px 60px -36px rgba(10,14,20,.6)}
.split-media img{width:100%;aspect-ratio:4/3;object-fit:cover}
.split-art{padding:28px 36px}
.svc-layout{display:grid;gap:40px;padding-top:64px;padding-bottom:72px}
.svc-main section+section{margin-top:44px}
.svc-main h2{font-size:clamp(1.5rem,1.2rem + 1.2vw,2.1rem)}
.svc-main p{max-width:68ch;font-size:1.08rem}
.svc-faq{padding-top:12px}
.city-body{padding-top:56px;padding-bottom:64px}
.city-main section+section{margin-top:44px}
.city-main h2{font-size:clamp(1.5rem,1.2rem + 1.2vw,2.1rem)}
.city-main p{max-width:68ch;font-size:1.08rem}
.fact-src{color:inherit;text-decoration:underline;text-decoration-thickness:1px;text-underline-offset:2px}
.fact-note{font-size:.7em;line-height:0;vertical-align:super;white-space:nowrap}
.fact-note .fact-src{color:var(--brand-text)}
.city-proof{background:var(--tint-2)}
.proof-reviews{margin:0 0 28px}
/* Unit 9.5 proof: review cards, the rating line, offers. Plain text, no widget, no JS. */
.reviews-sec{background:var(--tint)}
.svc-reviews{margin-top:44px}
.review-grid{display:grid;gap:18px;grid-template-columns:repeat(auto-fit,minmax(260px,1fr));margin-top:18px}
.review-card{margin:0;padding:22px 26px;background:#fff;border-radius:16px;border:1px solid var(--line);max-width:68ch;display:flex;flex-direction:column;justify-content:space-between;gap:12px}
.review-card blockquote{margin:0}
.review-card p{margin:0;font-size:1.08rem;line-height:1.5}
.review-card figcaption{font-weight:700;color:var(--ink)}
.proof-reviews .review-card+.review-card{margin-top:18px}
.rating-line{margin:8px 0 0;font-weight:650;color:var(--ink)}
.rating-line a{color:var(--brand-text);text-decoration:underline;text-underline-offset:3px;white-space:nowrap}
.story-col .rating-line{margin-top:28px}
.hero-since{margin:10px 0 0;font-weight:650}
.warranty-line{display:flex;align-items:center;gap:10px;margin:0 0 6px;font-weight:650}
.warranty-line .ico,.offer-strip .ico{width:22px;height:22px;flex:none;color:var(--brand-text)}
.offer-strip{background:var(--tint-2);border-bottom:1px solid var(--line)}
.offer-strip .wrap{padding-top:14px;padding-bottom:14px;display:flex;flex-wrap:wrap;gap:8px 28px}
.offer-strip p{display:flex;align-items:center;gap:10px;margin:0;font-weight:650;color:var(--ink)}
.trust-strip a{color:inherit;text-decoration:underline;text-underline-offset:3px}
.proof-note{margin:12px 0 0;font-size:.92rem;color:var(--ink);opacity:.8}
.hub-county{font-size:1.1rem;margin:28px 0 10px}
.areas-hub a{color:inherit;text-decoration:underline;text-underline-offset:3px}
.aside-card{background:var(--primary);color:var(--on-primary);border-radius:20px;padding:28px;display:flex;flex-direction:column;gap:12px;box-shadow:0 30px 50px -34px rgba(10,14,20,.7)}
.aside-title{font-family:var(--font-display);font-weight:780;font-size:1.45rem;line-height:1.15;margin:0;letter-spacing:-.015em}
.aside-price{margin:0;font-weight:700;color:var(--cta)}
.aside-card .btn{width:100%}
.aside-link{color:inherit;font-weight:700;text-decoration:none;display:inline-flex;align-items:center;gap:8px;padding:6px 0}
.aside-link .ico{transition:transform .25s var(--ease)}
@media (hover:hover) and (pointer:fine){.aside-link:hover .ico{transform:translateX(4px)}}
.aside-hours{border-top:1px solid color-mix(in srgb,currentColor 22%,transparent);padding-top:12px}
.aside-fine{margin:0;font-size:.88rem;color:color-mix(in srgb,currentColor 80%,transparent)}
.sib-list{list-style:none;margin:0;padding:0;border-top:2px solid var(--ink)}
.sib-list a{display:flex;align-items:center;gap:16px;padding:20px 4px;border-bottom:1px solid var(--line);text-decoration:none;color:var(--ink);font-family:var(--font-display);font-weight:720;font-size:clamp(1.2rem,1rem + .8vw,1.6rem);letter-spacing:-.015em;transition:background-color .25s,padding .25s var(--ease)}
.sib-list a>span:first-child{margin-right:auto}
.sib-list .price{font-family:var(--font-body);letter-spacing:0}
.sib-list .ico{color:var(--brand-text);transition:transform .25s var(--ease)}
@media (hover:hover) and (pointer:fine){.sib-list a:hover{background:var(--tint)}}
@media (hover:hover) and (pointer:fine){.sib-list a:hover .ico{transform:translateX(6px)}}

/* hours list */
.hours{margin:0}
.hours div{display:flex;justify-content:space-between;gap:16px;padding:8px 0;border-bottom:1px dashed var(--line)}
.hours dt{font-weight:700;color:var(--ink)}
.hours dd{margin:0;text-align:right}
.hours-aside div,.hours-foot div{border-bottom-color:color-mix(in srgb,currentColor 20%,transparent);padding:5px 0}
.hours-aside dt,.hours-foot dt{color:inherit}
.hours-note{margin:10px 0 0;font-weight:600}

/* about page — editorial */
.about-hero{padding:24px 0 64px}
.about-grid{display:grid;gap:40px;align-items:center}
.about-copy h1{font-size:clamp(2.4rem,1.5rem + 4vw,4.8rem);max-width:13ch}
.about-lead{font-size:clamp(1.2rem,1.05rem + .6vw,1.5rem);line-height:1.5;color:var(--ink);max-width:40ch}
.about-art{background:var(--tint);border-radius:24px;padding:32px;color:var(--brand-text)}
.story{padding:8px 0 64px}
.story-col{max-width:68ch;font-size:1.15rem;line-height:1.75}
.story-col .dropcap::first-letter{font-family:var(--font-display);font-weight:800;float:left;font-size:3.6em;line-height:.85;margin:6px 12px 0 0;color:var(--brand-text)}
.count-on{background:var(--primary);color:var(--on-primary)}
.count-on h2{color:inherit}
.count-grid{display:grid;gap:20px 56px}
.checks{list-style:none;margin:0;padding:0;display:grid;gap:14px}
.checks li{display:flex;gap:14px;align-items:flex-start;font-weight:650;font-size:1.1rem;line-height:1.4}
.checks .ico{width:28px;height:28px;padding:5px;border-radius:50%;background:var(--cta);color:var(--cta-ink);stroke-width:2.8;margin-top:-2px}
.license{margin:22px 0 0;color:color-mix(in srgb,currentColor 85%,transparent)}

/* contact page */
.contact-hero{padding:24px 0 36px}
.contact-hero .lede{font-size:1.15rem;max-width:52ch}
.contact-sec{padding:0 0 72px}
.contact-grid{display:grid;gap:32px;align-items:start}
.methods{list-style:none;margin:0;padding:0;display:grid;gap:12px}
.method{display:grid;grid-template-columns:48px 1fr;column-gap:16px;align-items:center;padding:18px 20px;border:1px solid var(--line);border-radius:var(--r);text-decoration:none;color:var(--ink);background:#fff;transition:transform .25s var(--ease),box-shadow .25s var(--ease)}
@media (hover:hover) and (pointer:fine){.method:hover{transform:translateY(-3px);box-shadow:0 18px 32px -24px rgba(10,14,20,.55)}}
.method .ico{grid-row:span 2;width:48px;height:48px;padding:12px;border-radius:50%;background:var(--tint-2);color:var(--brand-text)}
.m-label{font-weight:700;font-size:.92rem;color:var(--muted)}
.m-value{font-family:var(--font-display);font-weight:760;font-size:1.25rem;letter-spacing:-.01em;overflow-wrap:anywhere}
.method-main{background:var(--primary);border-color:var(--primary);color:var(--on-primary)}
.method-main .m-label{color:color-mix(in srgb,currentColor 85%,transparent)}
.method-main .ico{background:var(--cta);color:var(--cta-ink)}
.contact-hours{background:var(--tint);border-radius:var(--r);padding:26px 28px}
.contact-hours h2{font-size:1.5rem}

/* Unit 9b: the lead form (brand tokens, 48px+ controls, labels always shown) */
.lead-sec{padding:var(--sec) 0;background:var(--tint)}
.lead-wrap{max-width:780px}
.lf-title{margin:0 0 20px}
.lead-form{display:grid;gap:16px;background:#fff;border:1px solid var(--line);border-radius:var(--r);padding:24px 20px}
.lead-form[hidden]{display:none}
.lf-grid{display:grid;gap:16px}
.lf-row{display:grid;gap:6px;min-width:0}
.lf-row label{font-weight:700;font-size:.95rem;color:var(--ink)}
.lf-opt{font-weight:500;color:var(--muted)}
.lead-form input,.lead-form select,.lead-form textarea{width:100%;min-height:48px;padding:10px 14px;font:inherit;font-size:1rem;color:var(--ink);background:#fff;border:1.5px solid #6b7480;border-radius:10px}
.lead-form textarea{min-height:120px;resize:vertical}
.lead-form [aria-invalid=true]{border-color:#b42318}
.lf-err{margin:0;color:#b42318;font-weight:650;font-size:.95rem}
.lf-err a{color:inherit}
.lf-submit{width:100%;min-height:52px}
.lf-consent{margin:0;font-size:.88rem;line-height:1.5;color:var(--muted)}
.lf-consent a{color:var(--brand-text)}
.lf-done{margin:0;padding:22px 24px;background:#fff;border:1px solid var(--line);border-radius:var(--r);font-size:1.15rem;font-weight:650;color:var(--ink)}
.lf-done a{color:var(--brand-text)}
.lf-hp{position:absolute!important;left:-10000px;top:auto;width:1px;height:1px;overflow:hidden}
.page-form .lead-sec{padding-top:0;background:#fff}
.thanks-hero{padding:48px 0 96px}
@media (min-width:700px){.lf-grid{grid-template-columns:1fr 1fr}.lead-form{padding:32px}.lf-submit{width:auto;justify-self:start;padding:0 40px}}

/* legal */
.legal{max-width:780px;padding-top:24px;padding-bottom:72px}
.legal h1{font-size:clamp(2rem,1.5rem + 2vw,3rem)}
.legal h2{font-size:1.4rem;margin-top:1.6em}
.legal h3{font-size:1.15rem}

/* footer */
.site-footer{background:var(--deep);color:rgba(255,255,255,.78);padding:56px 0 24px;font-size:.96rem}
.site-footer a{color:#fff;text-decoration:none}
@media (hover:hover) and (pointer:fine){.site-footer a:hover{text-decoration:underline}}
.site-footer .cols{display:grid;gap:32px;grid-template-columns:1fr}
.site-footer ul{list-style:none;padding:0;margin:0}
.site-footer li{margin:6px 0}
.site-footer p{margin:0 0 .8em}
.foot-name{font-family:var(--font-display);font-weight:800;font-size:1.5rem;color:#fff;letter-spacing:-.02em;line-height:1.1}
.foot-h{font-weight:700;color:#fff;margin-bottom:10px!important}
.social{display:flex;flex-wrap:wrap;gap:8px 16px}
.site-footer .fine{border-top:1px solid rgba(255,255,255,.14);margin:40px 0 0;padding-top:18px;font-size:.86rem;color:rgba(255,255,255,.62)}
.site-footer .fine a{color:rgba(255,255,255,.85);text-decoration:underline;text-underline-offset:2px}

/* mobile call bar */
/* Hidden (slid down — transform only, no layout shift) while the hero's own
   Call button is on screen: app.js toggles .is-off. */
.callbar{position:fixed;left:0;right:0;bottom:0;display:flex;z-index:var(--z-bar);box-shadow:0 -8px 20px -10px rgba(5,7,10,.4);transition:transform .3s var(--ease)}
.callbar.is-off{transform:translateY(110%)}
.callbar a{flex:1;display:flex;align-items:center;justify-content:center;gap:8px;padding:0 8px;min-height:var(--bar-h);font-weight:800;text-decoration:none;background:var(--cta);color:var(--cta-ink)}
.callbar a+a{background:var(--deep);color:#fff}

/* scroll reveals: app.js adds .pre only to sections still below the fold */
.reveal{transition:opacity .5s var(--ease) calc(var(--i,0) * 70ms),transform .5s var(--ease) calc(var(--i,0) * 70ms)}
.reveal.pre{opacity:0;transform:translateY(20px)}

@media (max-width:599px){
.ctas .btn{flex:1 1 100%}
}
@media (max-width:699.98px){
/* Phones: 6 service cards, then the rest as one line of links. */
.svc-grid>.svc:nth-child(n+7){display:none}
.svc-all{display:block}
}
@media (min-width:700px){
.gallery{gap:22px 16px}
.hero-photo .hero-copy{padding:160px 0 64px}
}
@media (min-width:900px){
body{padding-bottom:0}
html{scroll-padding-bottom:0}
:root{--sec:96px}
.callbar{display:none}
.wrap{padding:0 32px}
.bar{height:80px}
.logo{height:48px;max-width:240px}
html.js .nav,.nav{display:flex}
/* Flush under its item (top:100%, padding inside, no margin) so the pointer
   never crosses a gap between the trigger and the menu. */
.submenu{position:absolute;top:100%;left:0;z-index:5;min-width:300px;max-height:calc(100vh - 110px);overflow-y:auto;padding:10px;background:#fff;border:1px solid var(--line);border-radius:14px;box-shadow:0 26px 44px -26px rgba(10,14,20,.5)}
.submenu a{padding:10px 12px}
.submenu ul{margin:-2px 0 4px;padding-left:14px}
.submenu ul a{padding:7px 12px}
html:not(.js) .submenu{display:none}
.menu-btn{display:none}
.header-call{padding:0 18px}
.trust-strip ul{display:flex;flex-wrap:nowrap;justify-content:space-between;gap:24px;padding:20px 0}
.trust-strip li{font-size:.98rem}
.trust-strip li:nth-child(n+5){display:flex}
.sec-head{grid-template-columns:auto 1fr}
.sec-head p{justify-self:end}
.about-t{grid-template-columns:minmax(300px,400px) 1fr;gap:72px}
.about-t.no-photo{grid-template-columns:1fr}
.gallery{grid-template-columns:repeat(3,minmax(0,1fr))}
.gallery-home li:last-child:nth-child(odd){display:block}
.gallery-few{grid-template-columns:repeat(2,minmax(0,1fr))}
.faq-wrap{grid-template-columns:minmax(260px,1fr) 2fr;gap:56px;align-items:start}
.faq-wrap>h2{position:sticky;top:110px}
.cta-inner{grid-template-columns:1.3fr 1fr;gap:64px}
.hero-photo{min-height:min(86vh,780px)}
/* Left -> right: the copy column (≤ 600px from the gutter) stays on the full --scrim stop. */
.hero-photo .hero-copy{padding:200px 0 96px;max-width:600px}
.hero-scrim{background:linear-gradient(90deg,var(--scrim) 0%,var(--scrim) 52%,var(--scrim-soft) 72%,transparent 100%)}
.hero-split .hero-grid{grid-template-columns:1fr minmax(0,560px);gap:64px;padding:88px 32px 96px}
.hero-grid{grid-template-columns:1.15fr .85fr;align-items:center;gap:48px;padding:96px 32px 104px}
.hero-art{max-width:460px;margin:0 0 0 auto}
.split{grid-template-columns:1.05fr .95fr;gap:64px}
.split-hero{padding:32px 0 80px}
.svc-layout{grid-template-columns:minmax(0,1fr) 340px;gap:72px;padding-top:88px;padding-bottom:96px}
.svc-aside{position:sticky;top:104px;align-self:start}
.city-body{padding-top:80px;padding-bottom:88px}
.about-grid{grid-template-columns:1.25fr .75fr;gap:72px}
.about-hero{padding:40px 0 96px}
.count-grid{grid-template-columns:1fr 1.4fr}
.checks{grid-template-columns:1fr 1fr;gap:20px 32px}
.contact-grid{grid-template-columns:1.2fr .8fr;gap:48px}
.site-footer .cols{grid-template-columns:1.5fr 1.1fr 1fr 1fr;gap:40px}
}
/* No JS on a desktop with a mouse: the Services menu opens on hover. With JS,
   app.js does hover-to-open itself (same media test) and owns [hidden]. */
@media (min-width:900px) and (hover:hover) and (pointer:fine){
html:not(.js) .has-sub:hover>.submenu{display:block}
}
@media (min-width:1100px){
.nav-list{gap:6px}
/* The number fits beside the five nav items from here up; below, the icon button. */
.header-call span{display:inline;white-space:nowrap}
}
@media (prefers-reduced-motion:reduce){
*,*::before,*::after{animation:none!important;transition:none!important;scroll-behavior:auto!important}
.reveal.pre{opacity:1;transform:none}
}
