/* ============================================================================
   PRIME CHOICE PAINTERS — styles.css (the ONLY stylesheet)
   ----------------------------------------------------------------------------
   HOW THIS FILE IS ORGANISED (jump by searching for the section number):

     1. DESIGN TOKENS ........ all colors, fonts, spacing — EDIT THESE FIRST
     2. RESET & BASE .......... browser defaults, body, links, images
     3. TYPOGRAPHY ............ headings, eyebrow labels, lead text, underline
     4. LAYOUT HELPERS ........ .container, .section, grids, two-column split
     5. BUTTONS ............... .btn and its color variants
     6. HEADER & NAVIGATION ... sticky ivory header, hairline edge, mobile menu
     7. FOOTER ................ navy footer with ivory logo badge
     8. HERO BANDS ............ home hero (with video slot) + inner page heroes
     9. CARDS ................. services, values, gallery tiles, categories,
                                testimonial cards
    10. BEFORE / AFTER SLIDER . the draggable comparison widget
    11. LIGHTBOX .............. fullscreen image viewer for gallery photos
    12. FORMS ................. contact form inputs and states
    13. PAGE BANDS ............ service-area strip, final CTA band, stats row
    14. UTILITIES ............. small single-purpose helper classes

   RESPONSIVE APPROACH: mobile-first. Base styles target phones; styles inside
   @media (min-width: 640px) apply from tablets up, and (min-width: 960px)
   from desktops up. Those are the ONLY two breakpoints — please reuse them.
   ========================================================================== */


/* ============================================================================
   1. DESIGN TOKENS — change the look of the whole site from here
   ----------------------------------------------------------------------------
   Colors, fonts and spacing all live here, matched to the 2026 Brand Kit
   (navy + gold + soft ivory). Re-skinning the whole site = editing these.

   ACCENT RULE (keeps text readable / WCAG AA): on LIGHT backgrounds gold is
   used only for DECORATION (underlines, rules, icon tints, borders) — small
   gold text on ivory fails contrast. Functional accents on light use navy.
   On NAVY backgrounds gold IS the text accent (great contrast there).
   ========================================================================== */
:root {
    /* ---- Brand colors (2026 Brand Kit) ---- */
    --cream:       #F4F2EE;   /* Soft Ivory — page + header background        */
    --cream-deep:  #EBE7DE;   /* slightly deeper ivory: alternating bands     */
    --navy:        #1E2F4D;   /* Deep Navy — headings, dark bands, accents    */
    --navy-deep:   #16233B;   /* darker navy: footer, hover states            */
    --gold:        #C89D4E;   /* Classic Gold — decorative + accent on navy   */
    --gold-soft:   #ECE1C7;   /* pale gold tint for icon circles              */

    /* ---- Text colors ---- */
    --ink:         #2E3345;   /* main body text (dark slate, AA on ivory)     */
    --ink-muted:   #5C6175;   /* secondary text                              */
    --on-dark:     #F1EFEA;   /* body text on navy backgrounds               */
    --on-dark-muted: #B8C0D2; /* secondary text on navy                      */

    /* ---- Borders & shadows ---- */
    --border:      #E4E0D7;   /* hairline borders on ivory                   */
    --shadow-sm:   0 2px 8px   rgba(30, 47, 77, 0.07);
    --shadow-md:   0 10px 30px rgba(30, 47, 77, 0.12);

    /* ---- Fonts (loaded from Google Fonts in each page's <head>) ----
       Brand primary font is TRAJAN PRO (paid Adobe font, no web version).
       Headings use CINZEL as an INTERIM stand-in — a free Google font with the
       same classical Roman-inscription / Trajan look (it's caps-only, so
       headings render in capitals, exactly like Trajan). Swap the ONE line
       below to switch to real Trajan once licensed. Body = Montserrat. */
    --font-display: "Cinzel", Georgia, serif;             /* headings (interim) */
    --font-body:    "Montserrat", Arial, sans-serif;      /* everything else    */

    /* ---- Type scale (clamp = grows smoothly with screen width) ---- */
    --fs-h1:   clamp(2.1rem, 5vw, 3.3rem);
    --fs-h2:   clamp(1.6rem, 3.5vw, 2.3rem);
    --fs-h3:   1.25rem;
    --fs-body: 1rem;
    --fs-small: 0.875rem;

    /* ---- Spacing & shape ---- */
    --space-section: clamp(4rem, 8vw, 7rem);  /* vertical gap between bands  */
    --radius:      8px;       /* cards, inputs (refined, less rounded)        */
    --radius-pill: 999px;     /* pills / tags                                 */
    --container:   1160px;    /* max content width                            */
}


/* ============================================================================
   2. RESET & BASE
   ========================================================================== */
*,
*::before,
*::after { box-sizing: border-box; }

html { scroll-behavior: smooth; }

body {
    margin: 0;
    font-family: var(--font-body);
    font-size: var(--fs-body);
    line-height: 1.65;
    color: var(--ink);
    background: var(--cream);
    -webkit-font-smoothing: antialiased;
}

img {
    max-width: 100%;
    height: auto;
    display: block;
}

a {
    color: var(--navy);
    text-decoration: none;
}
a:hover { text-decoration: underline; }

/* Keyboard users always get a visible focus ring — do not remove */
a:focus-visible,
button:focus-visible,
input:focus-visible,
select:focus-visible,
textarea:focus-visible {
    outline: 3px solid var(--gold);
    outline-offset: 2px;
}

/* Respect users who turn off animations in their OS settings */
@media (prefers-reduced-motion: reduce) {
    *, *::before, *::after {
        animation: none !important;
        transition: none !important;
    }
    html { scroll-behavior: auto; }
}


/* ============================================================================
   3. TYPOGRAPHY
   ========================================================================== */
h1, h2, h3, h4 {
    font-family: var(--font-display);
    color: var(--navy);
    line-height: 1.25;        /* a touch looser — Cinzel is all-caps */
    letter-spacing: 0.01em;   /* subtle spacing suits inscriptional caps */
    margin: 0 0 0.6em;
    overflow-wrap: break-word;
}

h1 { font-size: var(--fs-h1); font-weight: 700; }
h2 { font-size: var(--fs-h2); font-weight: 700; }
h3 { font-size: var(--fs-h3); font-weight: 600; font-family: var(--font-body); }

p { margin: 0 0 1em; }

/* Small ALL-CAPS label that sits above a heading, e.g. "OUR SERVICES".
   Navy on light backgrounds (AA); flips to gold on navy bands (see below). */
.eyebrow {
    display: block;
    font-size: 0.8rem;
    font-weight: 600;
    letter-spacing: 0.22em;
    text-transform: uppercase;
    color: var(--navy);
    margin-bottom: 0.9rem;
}

/* Slightly larger intro paragraph under a section heading */
.lead {
    font-size: 1.1rem;
    color: var(--ink-muted);
    max-width: 46em;
}

/* Centered section heading block (eyebrow + h2 + lead) */
.section-head {
    text-align: center;
    max-width: 720px;
    margin: 0 auto 3rem;
}
.section-head .lead { margin-left: auto; margin-right: auto; }

/* Refined gold rule used under section headings — a thin line split by a small
   diamond, echoing the brand kit. It's a tiny inline SVG embedded right here in
   the CSS, so there's no image file to manage. */
.drip-underline::after {
    content: "";
    display: block;
    width: 104px;
    height: 12px;
    margin: 0.7rem auto 0;
    background: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 120 12"><rect x="0" y="5" width="50" height="2" fill="%23C89D4E"/><rect x="70" y="5" width="50" height="2" fill="%23C89D4E"/><path d="M60 2 L64 6 L60 10 L56 6 Z" fill="%23C89D4E"/></svg>') no-repeat center / contain;
}
/* Left-aligned variant (for headings that are not centered) */
.drip-underline--left::after { margin-left: 0; }

/* On navy backgrounds, headings flip to ivory and the eyebrow flips to gold */
.band--navy h1,
.band--navy h2,
.band--navy h3 { color: var(--cream); }
.band--navy p  { color: var(--on-dark); }
.band--navy .eyebrow { color: var(--gold); }


/* ============================================================================
   4. LAYOUT HELPERS
   ========================================================================== */
/* Centers content and gives it side padding on small screens */
.container {
    max-width: var(--container);
    margin: 0 auto;
    padding: 0 1.25rem;
}

/* One vertical "band" of the page. Stack these to build a page. */
.section { padding: var(--space-section) 0; }

/* Background variants for bands */
.band--deep  { background: var(--cream-deep); }                 /* deeper ivory */
.band--navy  { background: var(--navy); color: var(--on-dark); }/* dark band    */
.band--white { background: #fff; }

/* Responsive card grids: 1 column on phones, 2 on tablets, 3/4 on desktop */
.grid {
    display: grid;
    gap: 1.5rem;
    grid-template-columns: 1fr;
}
@media (min-width: 640px) {
    .grid--2, .grid--3, .grid--4 { grid-template-columns: repeat(2, 1fr); }
}
@media (min-width: 960px) {
    .grid--3 { grid-template-columns: repeat(3, 1fr); }
    .grid--4 { grid-template-columns: repeat(4, 1fr); }
}

/* Two-column "text beside image" layout. Stacks on phones. */
.split {
    display: grid;
    gap: 2.5rem;
    align-items: center;
    grid-template-columns: 1fr;
}
/* Let grid children shrink instead of forcing the track wider than the
   viewport (prevents a long headline from causing horizontal overflow). */
.split > * { min-width: 0; }
@media (min-width: 960px) {
    .split { grid-template-columns: 1fr 1fr; gap: 4rem; }
    .split--reverse > :first-child { order: 2; } /* image on the left instead */
}


/* ============================================================================
   5. BUTTONS
   ----------------------------------------------------------------------------
   Usage:  <a class="btn btn--gold" href="/contact">Get a Free Quote</a>
   Variants: btn--gold (main CTA: gold + navy text) · btn--navy · btn--outline
             (on light) · btn--light (outline for navy backgrounds)
   ========================================================================== */
.btn {
    display: inline-block;
    font-family: var(--font-body);
    font-weight: 600;
    font-size: 1rem;
    letter-spacing: 0.01em;
    padding: 0.8em 1.9em;
    border-radius: 6px;
    border: 2px solid transparent;
    cursor: pointer;
    text-decoration: none;
    transition: transform 0.2s ease, background-color 0.2s ease, color 0.2s ease;
}
.btn:hover { transform: translateY(-2px); text-decoration: none; }

/* Main CTA — gold field with navy text (passes AA) */
.btn--gold   { background: var(--gold); color: var(--navy); }
.btn--gold:hover { background: #B5883C; color: var(--navy); }

.btn--navy   { background: var(--navy); color: var(--cream); }
.btn--navy:hover { background: var(--navy-deep); color: var(--cream); }

.btn--outline { border-color: var(--navy); color: var(--navy); background: transparent; }
.btn--outline:hover { background: var(--navy); color: var(--cream); }

.btn--light  { border-color: var(--cream); color: var(--cream); background: transparent; }
.btn--light:hover { background: var(--cream); color: var(--navy); }

/* A row of buttons with a sensible gap */
.btn-row {
    display: flex;
    flex-wrap: wrap;
    gap: 0.9rem;
    align-items: center;
}


/* ============================================================================
   6. HEADER & NAVIGATION
   ----------------------------------------------------------------------------
   The header is soft ivory (the brand page color) with a hairline bottom
   border for a clean, refined edge. It sticks to the top; JS adds .is-scrolled
   (a soft shadow) once the page is scrolled. The brand lockup is the PC
   monogram image + the wordmark in live text.
   ========================================================================== */
.site-header {
    position: sticky;
    top: 0;
    z-index: 50;
    background: var(--cream);
    border-bottom: 1px solid var(--border);
    transition: box-shadow 0.25s ease;
}
.site-header.is-scrolled { box-shadow: var(--shadow-sm); }

.site-header .container {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 1rem;
    min-height: 76px;
}

/* --- Brand lockup: PC monogram image + wordmark in live text --------------- */
.brand {
    display: flex;
    align-items: center;
    gap: 0.7rem;
    text-decoration: none;
}
.brand:hover { text-decoration: none; }
.brand img { height: 48px; width: auto; }

.brand-name {
    display: flex;
    flex-direction: column;
    line-height: 1.05;
}
.brand-name .brand-top {           /* "PRIME CHOICE" */
    font-family: var(--font-display);
    font-weight: 700;
    font-size: 1.18rem;
    letter-spacing: 0.02em;
    color: var(--navy);
}
.brand-name .brand-sub {           /* "PAINTERS" */
    font-size: 0.62rem;
    font-weight: 600;
    letter-spacing: 0.42em;
    color: var(--navy);
    text-transform: uppercase;
    margin-top: 0.18em;
}

/* --- Desktop navigation ----------------------------------------------------- */
.site-nav { display: none; }                      /* hidden on phones */
@media (min-width: 960px) {
    .site-nav {
        display: flex;
        align-items: center;
        gap: 1.6rem;
    }
    .site-nav a {
        color: var(--navy);
        font-weight: 500;
        font-size: 0.95rem;
        border-bottom: 2px solid transparent;   /* baseline for the gold underline */
        padding-bottom: 3px;
    }
    .site-nav a:hover { color: var(--navy); text-decoration: none; border-bottom-color: var(--gold); }
    /* The current page's link is marked with class="is-active" */
    .site-nav a.is-active {
        color: var(--navy);
        font-weight: 600;
        border-bottom-color: var(--gold);
    }
    /* The "Get a Quote" button in the nav keeps button styling.
       Its navy text must be restated here: the generic ".site-nav a" rule
       above would otherwise win. The button also drops the underline border. */
    .site-nav .btn { font-size: 0.9rem; padding: 0.6em 1.4em; color: var(--navy); border-bottom: 2px solid transparent; }
    .site-nav .btn:hover { color: var(--navy); border-bottom-color: transparent; }
}

/* --- Mobile hamburger button ------------------------------------------------ */
.nav-toggle {
    display: inline-flex;
    flex-direction: column;
    justify-content: center;
    gap: 5px;
    width: 44px;
    height: 44px;
    padding: 10px;
    background: none;
    border: 0;
    cursor: pointer;
}
.nav-toggle span {                /* the three burger lines */
    display: block;
    height: 3px;
    border-radius: 2px;
    background: var(--navy);
    transition: transform 0.25s ease, opacity 0.25s ease;
}
/* Burger turns into an X while the menu is open */
.nav-toggle[aria-expanded="true"] span:nth-child(1) { transform: translateY(8px) rotate(45deg); }
.nav-toggle[aria-expanded="true"] span:nth-child(2) { opacity: 0; }
.nav-toggle[aria-expanded="true"] span:nth-child(3) { transform: translateY(-8px) rotate(-45deg); }
@media (min-width: 960px) { .nav-toggle { display: none; } }

/* --- Mobile slide-down menu ------------------------------------------------- */
.mobile-menu {
    display: none;                /* JS toggles .is-open */
    background: var(--cream);
    border-top: 1px solid var(--border);
    padding: 1rem 1.25rem 1.5rem;
}
.mobile-menu.is-open { display: block; }
.mobile-menu a {
    display: block;
    padding: 0.8rem 0.25rem;
    font-size: 1.05rem;
    font-weight: 500;
    color: var(--navy);
    border-bottom: 1px solid var(--border);
}
.mobile-menu a:hover { text-decoration: none; color: var(--navy); }
.mobile-menu a.is-active {
    color: var(--navy);
    font-weight: 600;
    border-left: 3px solid var(--gold);
    padding-left: 0.6rem;
}
.mobile-menu .btn {
    margin-top: 1rem;
    border-bottom: 0;
    text-align: center;
    color: var(--navy);
}
@media (min-width: 960px) { .mobile-menu { display: none !important; } }


/* ============================================================================
   7. FOOTER — navy, with the stacked logo on a soft-ivory rounded badge
   ========================================================================== */
.site-footer {
    background: var(--navy-deep);
    color: var(--on-dark);
    padding: var(--space-section) 0 0;
    font-size: var(--fs-small);
}
.footer-grid {
    display: grid;
    gap: 2.5rem;
    grid-template-columns: 1fr;
    padding-bottom: 3rem;
}
@media (min-width: 640px) { .footer-grid { grid-template-columns: repeat(2, 1fr); } }
@media (min-width: 960px) { .footer-grid { grid-template-columns: 1.2fr 1fr 1fr 1.2fr; } }

/* The ivory badge that holds the stacked logo */
.footer-badge {
    background: var(--cream);
    border-radius: var(--radius);
    padding: 1.1rem 1.2rem;
    width: 190px;
}

/* Brand tagline under the footer logo — gold on navy (AA-safe) */
.footer-tagline {
    color: var(--gold);
    font-size: 0.72rem;
    font-weight: 600;
    letter-spacing: 0.18em;
    text-transform: uppercase;
    margin: 0.9rem 0 0;
}

.site-footer h4 {
    color: var(--cream);
    font-family: var(--font-body);
    font-size: 0.85rem;
    font-weight: 600;
    letter-spacing: 0.18em;
    text-transform: uppercase;
    margin-bottom: 1rem;
}
.site-footer ul {
    list-style: none;
    margin: 0;
    padding: 0;
}
.site-footer li { margin-bottom: 0.55rem; }
.site-footer a { color: var(--on-dark); }
.site-footer a:hover { color: var(--gold); }
.site-footer p { color: var(--on-dark-muted); }

/* The bottom copyright strip */
.footer-bottom {
    border-top: 1px solid rgba(255, 255, 255, 0.12);
    padding: 1.4rem 0;
    text-align: center;
    color: var(--on-dark-muted);
}
.footer-bottom p { margin: 0; }


/* ============================================================================
   8. HERO BANDS
   ========================================================================== */
/* --- Home hero: navy band with headline + the intro video slot ------------- */
.hero {
    background: var(--navy);
    color: var(--on-dark);
    padding: clamp(3rem, 7vw, 5.5rem) 0;
}
.hero .eyebrow { color: var(--gold); }
.hero h1 { color: var(--cream); }
.hero .lead { color: var(--on-dark); }

/* The video / poster frame. When the real intro video is ready, replace the
   <img> inside .hero-video with a <video> tag (see the comment in index.html). */
.hero-video {
    position: relative;
    border-radius: var(--radius);
    overflow: hidden;
    box-shadow: var(--shadow-md);
}
.hero-video img,
.hero-video video {
    width: 100%;
    height: 100%;
    object-fit: cover;
    aspect-ratio: 16 / 10;
}
/* Small "video coming soon" tag shown on the poster until the video lands */
.hero-video .video-tag {
    position: absolute;
    left: 50%;
    top: 50%;
    transform: translate(-50%, -50%);
    background: rgba(22, 35, 59, 0.85);
    color: var(--cream);
    font-size: 0.85rem;
    font-weight: 600;
    letter-spacing: 0.08em;
    padding: 0.6em 1.3em;
    border-radius: var(--radius-pill);
    white-space: nowrap;
}

/* --- Inner-page hero: shorter navy band with the page title ----------------- */
.page-hero {
    background: var(--navy);
    color: var(--on-dark);
    padding: clamp(2.5rem, 6vw, 4rem) 0;
    text-align: center;
}
.page-hero h1 { color: var(--cream); margin-bottom: 0.3em; }
.page-hero .lead { margin: 0 auto; color: var(--on-dark); } /* grey default is unreadable on navy */
.page-hero .eyebrow { color: var(--gold); }


/* ============================================================================
   9. CARDS
   ========================================================================== */
/* --- Generic card base (white, rounded, soft shadow) ------------------------ */
.card {
    background: #fff;
    border: 1px solid var(--border);
    border-radius: var(--radius);
    padding: 1.8rem;
    box-shadow: var(--shadow-sm);
}

/* --- Value cards (Efficiency / Respect / Detail) ---------------------------- */
.value-card { text-align: center; }
.value-card .value-icon {       /* circle holding an inline SVG icon */
    width: 64px;
    height: 64px;
    margin: 0 auto 1.1rem;
    border-radius: 50%;
    background: var(--gold-soft);
    display: flex;
    align-items: center;
    justify-content: center;
    color: var(--navy);
}
.value-card .value-icon svg { width: 30px; height: 30px; }

/* --- Service cards ----------------------------------------------------------- */
.service-card {
    display: flex;
    flex-direction: column;
    transition: transform 0.25s ease, box-shadow 0.25s ease;
}
.service-card:hover {
    transform: translateY(-4px);
    box-shadow: var(--shadow-md);
}
.service-card .service-icon {
    width: 52px;
    height: 52px;
    border-radius: 12px;
    background: var(--gold-soft);
    color: var(--navy);
    display: flex;
    align-items: center;
    justify-content: center;
    margin-bottom: 1.1rem;
}
.service-card .service-icon svg { width: 26px; height: 26px; }
.service-card p { color: var(--ink-muted); flex-grow: 1; }
.service-card .card-link {       /* "Learn more →" link at the card's bottom */
    font-weight: 600;
    color: var(--navy);
}
.service-card .card-link:hover { color: var(--navy); text-decoration: underline; text-decoration-color: var(--gold); }

/* --- Gallery tiles (photo with caption that appears on hover) --------------- */
.gallery-tile {
    position: relative;
    display: block;
    border-radius: var(--radius);
    overflow: hidden;
    box-shadow: var(--shadow-sm);
}
.gallery-tile img {
    width: 100%;
    aspect-ratio: 4 / 3;
    object-fit: cover;
    transition: transform 0.3s ease;
}
.gallery-tile:hover img { transform: scale(1.05); }
.gallery-tile figcaption {
    position: absolute;
    inset: auto 0 0 0;          /* pinned to the bottom edge */
    padding: 2rem 1rem 0.8rem;
    background: linear-gradient(transparent, rgba(22, 35, 59, 0.88));
    color: var(--cream);
    font-size: 0.9rem;
    font-weight: 500;
}

/* --- Gallery category cards (on the gallery hub page) ------------------------ */
.category-card {
    position: relative;
    display: block;
    border-radius: var(--radius);
    overflow: hidden;
    box-shadow: var(--shadow-sm);
    transition: transform 0.25s ease, box-shadow 0.25s ease;
}
.category-card:hover {
    transform: translateY(-4px);
    box-shadow: var(--shadow-md);
    text-decoration: none;
}
.category-card img {
    width: 100%;
    aspect-ratio: 16 / 10;
    object-fit: cover;
}
.category-card .category-label {
    position: absolute;
    inset: auto 0 0 0;
    padding: 2.4rem 1.2rem 1rem;
    background: linear-gradient(transparent, rgba(22, 35, 59, 0.92));
    color: var(--cream);
}
.category-card .category-label strong {
    display: block;
    font-family: var(--font-display);
    font-size: 1.25rem;
}
.category-card .category-label span {
    font-size: 0.85rem;
    color: var(--gold);
}

/* --- Testimonial / review cards ----------------------------------------------- */
.review-card { position: relative; }
.review-card .review-stars {
    color: var(--gold);
    letter-spacing: 0.15em;
    margin-bottom: 0.8rem;
}
.review-card blockquote {
    margin: 0 0 1.2rem;
    font-size: 1.02rem;
    color: var(--ink);
}
.review-card .review-author {
    display: flex;
    align-items: center;
    gap: 0.8rem;
    font-size: var(--fs-small);
    color: var(--ink-muted);
}
.review-card .review-avatar {     /* colored circle with the customer's initial */
    width: 42px;
    height: 42px;
    border-radius: 50%;
    background: var(--navy);
    color: var(--cream);
    display: flex;
    align-items: center;
    justify-content: center;
    font-weight: 600;
    flex-shrink: 0;
}
/* Placeholder reviews awaiting the client's real Google reviews */
.review-card--placeholder { opacity: 0.62; border-style: dashed; }
.review-card--placeholder blockquote { font-style: italic; }


/* ============================================================================
   10. BEFORE / AFTER SLIDER
   ----------------------------------------------------------------------------
   Markup (see index.html for a live example):
     <div class="ba-slider">
       <img src="...after.jpg" alt="...">                          ← full AFTER photo
       <div class="ba-before-wrap"><img src="...before.jpg" alt="..."></div>  ← BEFORE curtain
       <input class="ba-range" type="range" min="0" max="100" value="50"
              aria-label="Drag to compare before and after">
       <span class="ba-handle" aria-hidden="true"></span>
       <span class="ba-tag ba-tag--before" aria-hidden="true">Before</span>
       <span class="ba-tag ba-tag--after"  aria-hidden="true">After</span>
     </div>
   The AFTER photo fills the frame; the BEFORE photo sits on top inside a
   "curtain" that grows from the left as you drag. So: left = before,
   right = after. The invisible <input type=range> on top makes it draggable
   AND keyboard-accessible for free. main.js syncs everything to its value.
   ========================================================================== */
.ba-slider {
    position: relative;
    border-radius: var(--radius);
    overflow: hidden;
    box-shadow: var(--shadow-md);
    aspect-ratio: 4 / 3;
    user-select: none;
}
.ba-slider img {
    position: absolute;
    inset: 0;
    width: 100%;
    height: 100%;
    object-fit: cover;
}
/* The BEFORE image sits on top inside this curtain, which JS widens/narrows */
.ba-before-wrap {
    position: absolute;
    inset: 0;
    overflow: hidden;
    width: 50%;                 /* JS updates this */
}
.ba-before-wrap img { width: auto; }  /* width set by JS to match the frame */

/* The invisible range input that captures drag + keyboard */
.ba-range {
    position: absolute;
    inset: 0;
    width: 100%;
    height: 100%;
    opacity: 0;
    cursor: ew-resize;
    margin: 0;
    z-index: 3;
}

/* The visible vertical line + round handle */
.ba-handle {
    position: absolute;
    top: 0;
    bottom: 0;
    left: 50%;                  /* JS updates this */
    width: 4px;
    background: var(--cream);
    z-index: 2;
    pointer-events: none;
}
.ba-handle::after {             /* the round grip in the middle */
    content: "\2194";           /* ↔ arrow character */
    position: absolute;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
    width: 44px;
    height: 44px;
    border-radius: 50%;
    background: var(--cream);
    color: var(--navy);
    font-size: 1.2rem;
    display: flex;
    align-items: center;
    justify-content: center;
    box-shadow: var(--shadow-sm);
}

/* The little Before / After corner labels */
.ba-tag {
    position: absolute;
    top: 12px;
    background: rgba(22, 35, 59, 0.82);
    color: var(--cream);
    font-size: 0.75rem;
    font-weight: 600;
    letter-spacing: 0.1em;
    text-transform: uppercase;
    padding: 0.35em 0.9em;
    border-radius: var(--radius-pill);
    z-index: 2;
    pointer-events: none;
}
.ba-tag--before { left: 12px; }
.ba-tag--after  { right: 12px; }


/* ============================================================================
   11. LIGHTBOX (fullscreen photo viewer — markup is created by main.js)
   ========================================================================== */
.lightbox {
    position: fixed;
    inset: 0;
    z-index: 100;
    background: rgba(13, 18, 28, 0.94);
    display: flex;
    align-items: center;
    justify-content: center;
    padding: 2rem;
}
.lightbox img {
    max-width: 92vw;
    max-height: 86vh;
    border-radius: 8px;
    box-shadow: var(--shadow-md);
}
.lightbox button {
    position: absolute;
    background: rgba(244, 242, 238, 0.12);
    color: var(--cream);
    border: 0;
    border-radius: 50%;
    width: 48px;
    height: 48px;
    font-size: 1.4rem;
    cursor: pointer;
    display: flex;
    align-items: center;
    justify-content: center;
}
.lightbox button:hover { background: rgba(244, 242, 238, 0.25); }
.lightbox .lb-close { top: 1rem; right: 1rem; }
.lightbox .lb-prev  { left: 1rem; }
.lightbox .lb-next  { right: 1rem; }
.lightbox .lb-caption {
    position: absolute;
    bottom: 1.2rem;
    left: 50%;
    transform: translateX(-50%);
    color: var(--cream);
    font-size: 0.9rem;
    text-align: center;
    max-width: 80vw;
}


/* ============================================================================
   12. FORMS (contact page)
   ========================================================================== */
.form-grid {
    display: grid;
    gap: 1.1rem;
    grid-template-columns: 1fr;
}
@media (min-width: 640px) {
    .form-grid { grid-template-columns: 1fr 1fr; }
    /* Fields marked .form-full span both columns (e.g. the message box) */
    .form-grid .form-full { grid-column: 1 / -1; }
}

.form-field label {
    display: block;
    font-weight: 600;
    font-size: var(--fs-small);
    color: var(--navy);
    margin-bottom: 0.35rem;
}
.form-field input,
.form-field select,
.form-field textarea {
    width: 100%;
    font: inherit;
    color: var(--ink);
    background: #fff;
    border: 1px solid var(--border);
    border-radius: 6px;
    padding: 0.75em 1em;
}
.form-field input:focus,
.form-field select:focus,
.form-field textarea:focus {
    border-color: var(--navy);
}
.form-field textarea { min-height: 150px; resize: vertical; }

/* The honeypot field is hidden from humans; bots fill it and get rejected.
   Do NOT delete — the form handler checks it. */
.form-hp {
    position: absolute !important;
    left: -9999px !important;
    width: 1px;
    height: 1px;
    overflow: hidden;
}

/* Success / error notices shown after submitting (via ?sent=1 / ?error=...) */
.form-notice {
    border-radius: var(--radius);
    padding: 1rem 1.3rem;
    margin-bottom: 1.5rem;
    font-weight: 500;
}
.form-notice--ok  { background: #E8F4E4; color: #2F6B2A; border: 1px solid #BFDFB8; }
.form-notice--err { background: #FBE9E9; color: #99302A; border: 1px solid #EFC7C5; }


/* ============================================================================
   13. PAGE BANDS
   ========================================================================== */
/* --- Service-area strip: municipality list as little pills ------------------- */
.area-pills {
    display: flex;
    flex-wrap: wrap;
    gap: 0.6rem;
    justify-content: center;
    list-style: none;
    margin: 0;
    padding: 0;
}
.area-pills li {
    background: #fff;
    border: 1px solid var(--border);
    border-radius: var(--radius-pill);
    padding: 0.45em 1.1em;
    font-size: var(--fs-small);
    font-weight: 500;
    color: var(--navy);
}
/* The client's home turf gets a highlighted pill */
.area-pills li.is-home {
    background: var(--navy);
    border-color: var(--navy);
    color: var(--cream);
}

/* --- Final call-to-action band (navy, before the footer) --------------------- */
.cta-band {
    background: var(--navy);
    text-align: center;
    padding: var(--space-section) 0;
}
.cta-band h2 { color: var(--cream); }
.cta-band p  { color: var(--on-dark); max-width: 38em; margin: 0 auto 1.8em; }
.cta-band .btn-row { justify-content: center; }

/* --- Stats row (e.g. "8+ years · 100s of projects") -------------------------- */
.stats-row {
    display: grid;
    gap: 1.5rem;
    grid-template-columns: repeat(2, 1fr);
    text-align: center;
}
@media (min-width: 640px) { .stats-row { grid-template-columns: repeat(4, 1fr); } }
.stat strong {
    display: block;
    font-family: var(--font-display);
    font-size: 2.2rem;
    color: var(--navy);
    line-height: 1.1;
}
.stat span { font-size: var(--fs-small); color: var(--ink-muted); }


/* ============================================================================
   14. UTILITIES — tiny single-purpose helpers
   ========================================================================== */
.text-center { text-align: center; }
.mt-2 { margin-top: 2rem; }
.mt-3 { margin-top: 3rem; }

/* Hide visually but keep available to screen readers */
.visually-hidden {
    position: absolute;
    width: 1px;
    height: 1px;
    margin: -1px;
    padding: 0;
    overflow: hidden;
    clip: rect(0 0 0 0);
    white-space: nowrap;
    border: 0;
}
