/* ==========================================================================
   LIQUID GLASS v2 — LANDING PAGE DESIGN SYSTEM (business-agnostic)
   Apple Liquid Glass aesthetic: deeply frosted translucent panels over a
   soft aurora-mesh backdrop, specular rim highlights, glossy pill controls,
   large continuous radii, system (SF) typography.

   THEMING: edit the :root tokens only. The whole page recolors from
   --brand-mid / --accent-a / --accent-b / --accent-glow and the three
   --aurora-* washes. Nothing below the token block needs touching.

   ACCESSIBILITY GUARDRAILS
   • Any glass surface carrying body text uses --glass-strong (≥0.80 white
     fill) so WCAG AA contrast holds over the busy backdrop. Decorative
     glass may be lighter — never put body copy on light chips.
   • Real backdrop blur only where it is perceptible (header pill, hero
     panels, light cards, sticky bar, lightbox). Near-opaque dark bands and
     tiny chips use plain fills — same look, far fewer GPU layers.
   • @supports fallback for browsers without backdrop-filter; print styles;
     forced-colors support; prefers-reduced-motion and
     prefers-reduced-transparency both honored.

   INSERTION POINTS: every [data-slot] element is an injection container —
   the hosting app replaces ONLY its children. Styling for injected form
   fields is provided via [data-slot="lead-form"] descendant rules, so the
   live form inherits the design with no classes required. Class
   "slots-live" on <body> hides the purple preview tags.

   SECTIONS: styles are grouped per page section (banner comments). Leaving
   the CSS of a deleted HTML section in place is harmless.
   ========================================================================== */

/* ---------- Design tokens ---------- */
:root {
  /* Accent is the ONLY saturated family on the page: buttons, icons, small
     highlights. Page base, headings and dark bands stay neutral so the
     template suits any kind of business. */
  --heading: #16201d;          /* neutral charcoal for headings on light */
  --brand: #0b3d2b;            /* deep accent: reserved moments */
  --brand-mid: #0e6a49;        /* accent: icons, links, highlights (AA on white) */
  --accent-a: #12925f;         /* CTA gradient start */
  --accent-b: #0b6b47;         /* CTA gradient end (AA with white text) */
  --accent-glow: rgba(21, 160, 107, 0.42);
  --tint: #f2f4f5;             /* neutral page base */

  /* Aurora mesh washes — strong enough for the glass blur to visibly
     refract, still composited to pale neutral washes over the light base */
  --aurora-1: rgba(96, 178, 138, 0.46);
  --aurora-2: rgba(116, 146, 162, 0.42);
  --aurora-3: rgba(158, 203, 168, 0.42);

  /* Ink (--muted holds ≥4.5:1 even over the strongest aurora wash) */
  --ink: #1c2523;
  --muted: #4c5751;
  --on-dark: #f3f6f4;
  --on-dark-muted: #bcc7c1;

  /* Glass surfaces */
  --glass: rgba(255, 255, 255, 0.52);          /* decorative / chips */
  --glass-strong: rgba(255, 255, 255, 0.82);   /* text-bearing cards */
  --glass-border: rgba(22, 32, 28, 0.10);
  --glass-blur: 24px;
  --glass-dark: rgba(21, 27, 25, 0.90);        /* neutral charcoal band */
  --glass-dark-border: rgba(255, 255, 255, 0.16);
  --hero-panel: rgba(14, 20, 18, 0.69);        /* dark glass over the photo.
                       How much photo shows through is capped by whichever
                       hero text colour is weakest, measured against a
                       worst-case pure-white photo behind the weakest part of
                       .hero-scrim, with no credit for the blur. That is now
                       --star-on-dark, at 4.80:1 here; it drops under AA 4.5:1
                       below 0.68. The white copy has far more room (7.3:1+),
                       so 0.68 is the hard floor and 0.69 is the shipped value
                       — do not go below it, and re-check this if any hero
                       text is ever re-tinted. The no-blur fallbacks below
                       stay heavier (0.88 / 0.92): without backdrop-filter
                       there is no blur averaging down the photo's bright
                       detail. */

  /* Specular rim: top highlight + faint inner frost */
  --specular: inset 0 1px 0 rgba(255, 255, 255, 0.92),
              inset 0 0 0 1px rgba(255, 255, 255, 0.28);
  --specular-dark: inset 0 1px 0 rgba(255, 255, 255, 0.14),
                   inset 0 0 0 1px rgba(255, 255, 255, 0.05);

  /* Feedback */
  --success: #127a4e;
  --error: #bb3a2b;
  --star: #7a4300;
  --star-on-dark: #ffc94d;     /* the same glyphs on dark glass — --star
                                  measures ~1.5:1 against --hero-panel */

  /* Shape & elevation */
  --radius-xl: 30px;
  --radius-card: 22px;
  --radius-btn: 999px;
  --shadow-soft: 0 4px 16px rgba(12, 42, 32, 0.07), 0 14px 44px rgba(12, 42, 32, 0.10);
  --shadow-lifted: 0 10px 30px rgba(12, 42, 32, 0.15), 0 26px 72px rgba(12, 42, 32, 0.18);

  /* Type — system stack renders SF Pro on Apple devices */
  --font: -apple-system, BlinkMacSystemFont, 'SF Pro Display', 'SF Pro Text',
          'Segoe UI Variable', 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;

  /* Layout */
  --container: 73rem;
  --section-gap: clamp(3.5rem, 6vw, 5.75rem);
  --header-clear: 94px;        /* fixed-header clearance for anchor jumps */
  --hero-pad-b: 4.5rem;        /* hero bottom padding — single source of truth */
  --hero-form-gap: 1.25rem;    /* guaranteed beat between hero panel and form card */
}

/* Cheaper blur on small screens — imperceptible at 375px, kinder to GPUs */
@media (max-width: 720px) {
  :root { --glass-blur: 14px; }
}

/* ---------- Reset / base ---------- */
*, *::before, *::after { box-sizing: border-box; }

html {
  scroll-behavior: smooth;
  scroll-padding-top: calc(var(--header-clear) + 0.75rem);
  scroll-padding-bottom: calc(6.5rem + env(safe-area-inset-bottom));
}

body {
  margin: 0;
  font-family: var(--font);
  font-size: 1.0625rem;
  line-height: 1.65;
  color: var(--ink);
  background-color: var(--tint);
  -webkit-font-smoothing: antialiased;
  text-rendering: optimizeLegibility;
  overflow-x: clip;
}

/* Aurora mesh: fixed, behind everything; glass panels refract it */
.aurora {
  position: fixed;
  inset: 0;
  z-index: -1;
  pointer-events: none;
  background:
    radial-gradient(44rem 32rem at 12% 6%,  var(--aurora-1), transparent 65%),
    radial-gradient(40rem 30rem at 88% 14%, var(--aurora-2), transparent 65%),
    radial-gradient(46rem 36rem at 20% 88%, var(--aurora-3), transparent 65%),
    radial-gradient(38rem 30rem at 78% 70%, var(--aurora-1), transparent 65%),
    linear-gradient(180deg, #f1f7f2 0%, var(--tint) 48%, #e6f1e9 100%);
}

img, svg, video { max-width: 100%; height: auto; display: block; }
/* <picture> wrappers are layout-transparent: sizing rules on the inner
   <img> behave exactly as if it were a direct child */
picture { display: contents; }

h1, h2, h3, h4 {
  line-height: 1.08;
  margin: 0 0 0.6em;
  color: var(--heading);
  font-weight: 800;
  letter-spacing: -0.022em;
  text-wrap: balance;
}
h1 { font-size: clamp(2.25rem, 5.4vw, 4rem); }
h2 { font-size: clamp(1.7rem, 3.6vw, 2.6rem); font-weight: 760; }
h3 { font-size: 1.25rem; letter-spacing: -0.008em; }
h3, h4 { font-weight: 650; }

p { margin: 0 0 1em; max-width: 65ch; }
a { color: var(--brand-mid); }

:focus-visible {
  outline: 3px solid var(--brand-mid);
  outline-offset: 2px;
  border-radius: 6px;
}
/* Dark surfaces: the brand-green ring is invisible on near-black glass */
.glass-dark :focus-visible,
.hero-copy-panel :focus-visible { outline-color: #fff; }

.container { width: min(100% - 2.5rem, var(--container)); margin-inline: auto; }

/* One shared vertical beat between sections */
section, .cta-strip { padding-block: 0 var(--section-gap); }

.section-head { max-width: 46rem; margin-bottom: clamp(2rem, 4vw, 3.25rem); }
.section-head.centered { margin-inline: auto; text-align: center; }
.section-head.centered p { margin-inline: auto; }
.section-head p { color: var(--muted); font-size: 1.1rem; }

.kicker {
  display: inline-flex;
  align-items: center;
  gap: 0.45rem;
  font-size: 0.8125rem;
  font-weight: 700;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  color: var(--brand-mid);
  margin-bottom: 0.9rem;
}

.section-cta { text-align: center; margin-top: 2.5rem; }

.nowrap { white-space: nowrap; }   /* keeps license/credential numbers whole */

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

.skip-link {
  position: absolute;
  top: -100px; left: 1rem;
  z-index: 100;
  padding: 0.7rem 1.2rem;
  background: var(--heading);
  color: #fff;
  border-radius: var(--radius-btn);
  font-weight: 700;
  text-decoration: none;
  transition: top 0.15s ease;
}
.skip-link:focus-visible { top: 0.75rem; }

/* JS-availability gates: .js-only shows only when main.js booted,
   .no-js-only only when it didn't (the head boot script manages html.js) */
html:not(.js) .js-only { display: none; }
html.js .no-js-only { display: none; }

/* ---------- Glass primitives ---------- */
.glass,
.glass-strong {
  background: var(--glass-strong);
  -webkit-backdrop-filter: blur(var(--glass-blur)) saturate(1.7);
  backdrop-filter: blur(var(--glass-blur)) saturate(1.7);
  border: 1px solid var(--glass-border);
  border-radius: var(--radius-xl);
  box-shadow: var(--specular), var(--shadow-soft);
}

.glass-dark {
  background: var(--glass-dark);
  border: 1px solid var(--glass-dark-border);
  border-radius: var(--radius-xl);
  box-shadow: var(--specular-dark), var(--shadow-lifted);
  color: var(--on-dark);
}
.glass-dark h2, .glass-dark h3 { color: var(--on-dark); }
.glass-dark p { color: var(--on-dark-muted); }

/* ---------- Buttons & pills ---------- */
.btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 0.55rem;
  padding: 0.78rem 1.55rem;
  min-height: 44px;
  border: 0;
  border-radius: var(--radius-btn);
  font-family: inherit;
  font-size: 1rem;
  font-weight: 700;
  letter-spacing: 0.005em;
  line-height: 1.2;
  text-decoration: none;
  cursor: pointer;
  white-space: nowrap;
  position: relative;
  transition: transform 0.16s ease, box-shadow 0.16s ease, background-color 0.16s ease;
}
.btn:active { transform: scale(0.975); }

.btn-primary {
  color: #fff;
  background: linear-gradient(180deg, var(--accent-a), var(--accent-b));
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.35),
              0 2px 6px rgba(10, 60, 42, 0.25),
              0 10px 26px var(--accent-glow);
}
.btn-primary:hover {
  transform: translateY(-1px);
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.4),
              0 4px 10px rgba(10, 60, 42, 0.28),
              0 14px 34px var(--accent-glow);
}
.btn-primary:active { transform: scale(0.975); }

.btn-glass {
  color: var(--heading);
  background: rgba(255, 255, 255, 0.62);
  -webkit-backdrop-filter: blur(14px) saturate(1.6);
  backdrop-filter: blur(14px) saturate(1.6);
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.9),
              inset 0 0 0 1px rgba(255, 255, 255, 0.35),
              0 2px 10px rgba(12, 42, 32, 0.10);
}
.btn-glass:hover { background: rgba(255, 255, 255, 0.78); }
/* On dark surfaces the glass button flips to frosted-dark */
.glass-dark .btn-glass,
.hero-copy-panel .btn-glass {
  color: #fff;
  background: rgba(255, 255, 255, 0.14);
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25),
              inset 0 0 0 1px rgba(255, 255, 255, 0.18);
}
.glass-dark .btn-glass:hover,
.hero-copy-panel .btn-glass:hover { background: rgba(255, 255, 255, 0.22); }

.btn-lg { padding: 0.95rem 1.9rem; font-size: 1.0625rem; }
.btn-block { width: 100%; }

.chip {
  display: inline-flex;
  align-items: center;
  padding: 0.28rem 0.85rem;
  border-radius: var(--radius-btn);
  background: rgba(255, 255, 255, 0.6);
  border: 1px solid var(--glass-border);
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.85);
  font-size: 0.9rem;
  font-weight: 600;
  color: var(--heading);
}

.stars { color: var(--star); letter-spacing: 0.08em; }
/* Same class, dark surface: the light-card amber is unreadable there */
.hero-copy-panel .stars,
.glass-dark .stars { color: var(--star-on-dark); }

/* ══════════════════ SECTION: header ══════════════════ */
.site-header {
  position: fixed;
  top: 0; left: 0; right: 0;
  z-index: 50;
  padding-top: 0.75rem;
}
.header-pill {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 1rem;
  padding: 0.6rem 1rem 0.6rem 1.25rem;
  border-radius: var(--radius-btn);
  background: rgba(255, 255, 255, 0.66);
  -webkit-backdrop-filter: blur(var(--glass-blur)) saturate(1.8);
  backdrop-filter: blur(var(--glass-blur)) saturate(1.8);
  border: 1px solid var(--glass-border);
  box-shadow: var(--specular), 0 6px 24px rgba(12, 42, 32, 0.10);
  transition: box-shadow 0.25s ease;
}
.site-header.scrolled .header-pill {
  box-shadow: var(--specular), 0 10px 34px rgba(12, 42, 32, 0.18);
}
.header-logo img { width: clamp(150px, 18vw, 220px); height: auto; }
.header-badge {
  display: inline-flex;
  align-items: center;
  gap: 0.45rem;
  font-size: 0.9rem;
  font-weight: 650;
  color: var(--heading);
  white-space: nowrap;
}
.header-badge .icon { color: var(--brand-mid); flex: none; }
.header-actions { display: flex; align-items: center; gap: 0.9rem; }
.header-phone {
  display: inline-flex;
  align-items: center;
  gap: 0.6rem;
  text-decoration: none;
  color: var(--heading);
}
.header-phone .icon-wrap {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 40px; height: 40px;
  border-radius: 50%;
  color: #fff;
  background: linear-gradient(180deg, var(--accent-a), var(--accent-b));
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.35), 0 4px 12px var(--accent-glow);
  flex: none;
}
.header-phone-text { display: flex; flex-direction: column; line-height: 1.25; }
.phone-label { font-size: 0.75rem; font-weight: 600; color: var(--heading); }
.phone-number { font-size: 1.05rem; font-weight: 800; letter-spacing: -0.01em; white-space: nowrap; }

@media (max-width: 900px) { .header-badge { display: none; } }
@media (max-width: 640px) {
  .phone-label { display: none; }
  .header-cta { display: none; }           /* the sticky bar covers mobile CTA */
  .header-pill { padding: 0.25rem 0.9rem; }   /* absorbs the 44px tap target below */
  .header-phone { min-height: 44px; }
}
@media (max-width: 480px) {
  .header-logo img { width: 118px; }
  .phone-number { font-size: 0.95rem; }
  .header-phone .icon-wrap { width: 34px; height: 34px; }
}

/* ══════════════════ SECTION: hero ══════════════════ */
.hero {
  position: relative;
  display: flex;
  align-items: center;
  min-height: 100vh;
  min-height: 100svh;
  padding: calc(var(--header-clear) + 1.5rem) 0 var(--hero-pad-b);
}
.hero-media { position: absolute; inset: 0; overflow: hidden; }
.hero-img {
  width: 100%; height: 100%;
  object-fit: cover;
  object-position: center;
}
.hero-scrim {
  position: absolute; inset: 0;
  background: linear-gradient(180deg, rgba(10, 14, 13, 0.32) 0%, rgba(10, 14, 13, 0.08) 45%, rgba(10, 14, 13, 0.38) 100%);
}
.hero-grid {
  position: relative;
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  gap: 2.5rem;
  align-items: center;
}
/* Two hero columns only when JS booted (it's what docks the form card
   into the right column) — no-JS/broken-JS desktops get a clean single
   column with the form card below the hero instead of a phantom gap */
@media (min-width: 980px) {
  html.js .hero-grid { grid-template-columns: minmax(0, 1.15fr) minmax(360px, 0.85fr); }
}

.hero-copy-panel {
  padding: clamp(1.5rem, 3.5vw, 2.75rem);
  border-radius: var(--radius-xl);
  background: var(--hero-panel);
  -webkit-backdrop-filter: blur(var(--glass-blur)) saturate(1.5);
  backdrop-filter: blur(var(--glass-blur)) saturate(1.5);
  border: 1px solid rgba(255, 255, 255, 0.16);
  box-shadow: var(--specular-dark), var(--shadow-lifted);
  color: var(--on-dark);
  max-width: 44rem;
}
.hero-copy-panel h1 { color: #fff; margin-bottom: 0.35em; }
.hero-copy-panel h1 .grad {
  background: linear-gradient(92deg, #7fe0b4, #b9f0d4);
  -webkit-background-clip: text;
  background-clip: text;
  color: transparent;
}
/* Pure white, not --on-dark-muted: the hero subhead carries the offer and is
   read over a photo, so it gets the same weight as the H1. The muted token
   still serves the opaque dark bands (.glass-dark p, .stat-label, …). */
.hero-sub { color: #fff; font-size: 1.15rem; margin-bottom: 1.1rem; }

.hero-rating {
  display: inline-flex;
  align-items: center;
  flex-wrap: wrap;              /* narrow screens: the count drops to its own line */
  gap: 0.15rem 0.5rem;
  padding: 0.4rem 1rem;
  margin-bottom: 1.2rem;
  border-radius: var(--radius-btn);
  background: rgba(255, 255, 255, 0.13);
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), inset 0 0 0 1px rgba(255, 255, 255, 0.12);
  font-size: 0.95rem;
}
.hero-rating .count { white-space: nowrap; }  /* wraps as a whole, never mid-phrase */
.hero-rating strong { font-size: 1.05rem; }
.hero-rating .count { color: var(--on-dark); }

.hero-area-pill {
  display: inline-flex;
  align-items: center;
  gap: 0.55rem;
  padding: 0.45rem 1.05rem;
  margin: 0 0 1.1rem;
  border-radius: var(--radius-btn);
  background: rgba(255, 255, 255, 0.13);
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), inset 0 0 0 1px rgba(255, 255, 255, 0.12);
  font-size: 0.95rem;
  color: var(--on-dark);
  max-width: 100%;
}
.hero-area-pill .icon { color: #8fe6bd; flex: none; }

.hero-points { list-style: none; margin: 0 0 1.5rem; padding: 0; display: grid; gap: 0.55rem; }
.hero-points li { display: flex; align-items: baseline; gap: 0.65rem; font-weight: 600; }
.hero-points .icon {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 22px; height: 22px;
  border-radius: 50%;
  background: linear-gradient(180deg, var(--accent-a), var(--accent-b));
  color: #fff;
  flex: none;
  transform: translateY(3px);
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.35);
}

.hero-actions { display: flex; flex-wrap: wrap; gap: 0.9rem; margin-bottom: 1.1rem; }

/* The hidden attribute must always win over the display rule below —
   the pill only ever shows when main.js computed a real open/closed state */
.open-now[hidden] { display: none !important; }
.open-now {
  display: inline-flex;
  align-items: center;
  gap: 0.55rem;
  margin: 0 0 1.1rem;
  font-size: 0.95rem;
  font-weight: 650;
  color: var(--on-dark);
}
.open-dot {
  width: 10px; height: 10px;
  border-radius: 50%;
  background: #35d68d;
  box-shadow: 0 0 0 0 rgba(53, 214, 141, 0.55);
  animation: openPulse 2.4s ease-out infinite;
  flex: none;
}
@keyframes openPulse {
  0%   { box-shadow: 0 0 0 0 rgba(53, 214, 141, 0.55); }
  70%  { box-shadow: 0 0 0 9px rgba(53, 214, 141, 0); }
  100% { box-shadow: 0 0 0 0 rgba(53, 214, 141, 0); }
}

.hero-trust {
  list-style: none;
  margin: 0; padding: 0;
  display: flex;
  flex-wrap: wrap;
  gap: 0.5rem 0.6rem;
}
.trust-item {
  display: inline-flex;
  align-items: center;
  gap: 0.45rem;
  padding: 0.32rem 0.8rem;
  border-radius: var(--radius-btn);
  background: rgba(255, 255, 255, 0.11);
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.16), inset 0 0 0 1px rgba(255, 255, 255, 0.10);
  font-size: 0.875rem;
  font-weight: 600;
  color: var(--on-dark);
}
.hero-trust .icon, .owner-chips .icon { color: #8fe6bd; flex: none; }

/* Mobile hero: the photo frames the panel, it does not push it down.
   The hero is sized by its content here — deliberately NOT min-height:100svh
   with align-items:flex-end. That combination hands every leftover pixel to a
   dead band ABOVE the panel, and the leftover is unbounded: the shorter the
   client's copy and the taller the phone, the further the H1 and the CTA get
   pushed down (291px of dead photo at 600x1096, vs 40px on a narrow phone
   where the copy overflows and there is no leftover at all). Content sizing
   gives every mobile width the same tight header-to-panel beat and lifts the
   form card up into the first screen. The photo still reads: it frames the
   panel on all four sides through the container gutters and the hero padding. */
@media (max-width: 979px) {
  .hero { min-height: 0; padding-top: calc(var(--header-clear) + 0.5rem); }
  .hero-copy-panel { max-width: 100%; }
}
@media (max-width: 640px) {
  :root { --hero-pad-b: 3.5rem; }
  .hero-sub { font-size: 1.05rem; }
  .hero-points li { font-size: 0.98rem; }
  .hero-actions .btn { flex: 1 1 100%; }
}

/* ══════════════════ SECTION: hero-form (lead-form slot) ══════════════════ */
/* <980px: the card sits here, after the hero, pulled up to overlap the
   photo's bottom edge. ≥980px: main.js docks the card inside the hero;
   this wrap then holds nothing. If JS never runs, the card simply stays
   here at every width — fully functional. */
.hero-form-wrap { position: relative; z-index: 5; margin-top: calc(var(--hero-form-gap) - var(--hero-pad-b)); padding-bottom: var(--section-gap); }
/* Docked state — main.js toggles .is-docked whenever the card actually
   sits in the hero dock. The overlap margin and padding then reset, so
   the hero's own bottom padding provides the beat before the next
   section (without this, the leftover negative margin can pull the next
   section over the hero photo at ~1000-1100px). */
.hero-form-wrap.is-docked { margin-top: 0; padding-bottom: 0; }

.hero-form-card {
  background: var(--glass-strong);
  -webkit-backdrop-filter: blur(var(--glass-blur)) saturate(1.7);
  backdrop-filter: blur(var(--glass-blur)) saturate(1.7);
  border: 1px solid var(--glass-border);
  border-radius: var(--radius-xl);
  box-shadow: var(--specular), var(--shadow-lifted);
  padding: clamp(1.5rem, 3vw, 2.25rem);
  max-width: 34rem;
  margin-inline: auto;
}
.hero-form-card h2 { font-size: 1.55rem; margin-bottom: 0.4rem; }
.form-privacy {
  display: flex;
  align-items: baseline;
  gap: 0.5rem;
  font-size: 0.9rem;
  color: var(--muted);
  margin-bottom: 1.25rem;
}
.form-privacy .icon { color: var(--brand-mid); flex: none; transform: translateY(2px); }
.form-speed-note { font-size: 0.9rem; color: var(--muted); text-align: center; margin: 1rem 0 0; }

/* Docked position (main.js moves the card here at ≥980px). While empty
   (mobile/tablet/no-JS) the dock must not render — as a grid item it
   would otherwise add a phantom gap row inside the hero. The div has no
   whitespace children, so :empty matches until the card is docked. */
.hero-form-dock { min-width: 0; }
.hero-form-dock:empty { display: none; }
.hero-form-dock .hero-form-card { margin-inline: auto 0; }

/* Form styling targets BOTH the mock form and any injected live form:
   bare inputs inside the slot inherit the design with no classes. */
[data-slot="lead-form"] { position: relative; }
[data-slot="lead-form"] form { display: grid; gap: 0.95rem; }
[data-slot="lead-form"] label {
  display: block;
  font-size: 0.92rem;
  font-weight: 700;
  color: var(--heading);
  margin-bottom: 0.3rem;
}
[data-slot="lead-form"] label .optional { font-weight: 500; color: var(--muted); }
[data-slot="lead-form"] input,
[data-slot="lead-form"] select,
[data-slot="lead-form"] textarea {
  width: 100%;
  padding: 0.72rem 0.95rem;
  font-family: inherit;
  font-size: 1.0625rem;          /* ≥16px prevents iOS focus zoom */
  color: var(--ink);
  background: rgba(255, 255, 255, 0.85);
  border: 1px solid rgba(22, 32, 28, 0.16);
  border-radius: 14px;
  box-shadow: inset 0 1px 2px rgba(12, 42, 32, 0.05);
  transition: border-color 0.15s ease, box-shadow 0.15s ease;
}
[data-slot="lead-form"] input:focus,
[data-slot="lead-form"] select:focus,
[data-slot="lead-form"] textarea:focus {
  outline: none;
  border-color: var(--brand-mid);
  box-shadow: 0 0 0 3px rgba(18, 146, 95, 0.22);
}
[data-slot="lead-form"] input[aria-invalid="true"] {
  border-color: var(--error);
  box-shadow: 0 0 0 3px rgba(187, 58, 43, 0.15);
}
[data-slot="lead-form"] ::placeholder { color: var(--muted); opacity: 1; }
[data-slot="lead-form"] .field { min-width: 0; }
.field-error { color: var(--error); font-size: 0.88rem; font-weight: 600; margin: 0.35rem 0 0; }
.microcopy { color: var(--muted); font-size: 0.85rem; margin: 0.35rem 0 0; }

/* Mock-form success panel (spec for the injected form's success state) */
.form-success { display: none; text-align: center; padding: 1.5rem 0.5rem 0.5rem; }
.form-success.visible { display: block; }
.lead-form.submitted { display: none; }
.form-success:focus { outline: none; }
.success-icon {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 62px; height: 62px;
  border-radius: 50%;
  margin-bottom: 1rem;
  color: #fff;
  background: linear-gradient(180deg, var(--accent-a), var(--accent-b));
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.35), 0 10px 26px var(--accent-glow);
}
.success-title { font-size: 1.35rem; }
.success-copy { color: var(--muted); margin-inline: auto; }

/* ---------- Insertion-point preview chrome (hidden when slots-live) ---------- */
[data-slot] { position: relative; }
.ip-tag {
  position: absolute;
  top: -0.65rem; left: 1rem;
  z-index: 3;
  padding: 0.1rem 0.7rem;
  border-radius: var(--radius-btn);
  background: #7c3aed;
  color: #fff;
  font-size: 0.72rem;
  font-weight: 800;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  pointer-events: none;
  white-space: nowrap;
}
body:not(.slots-live) [data-slot] {
  outline: 2px dashed rgba(124, 58, 237, 0.55);
  outline-offset: 6px;
  border-radius: 8px;
}
body.slots-live .ip-tag { display: none; }
body.slots-live [data-slot] { outline: none; }

/* ══════════════════ SECTION: trust-strip ══════════════════ */
/* At ≥980px (hero photo edge exposed below the docked form) the badge row
   rides up over the hero, overlapping the photo's bottom edge by roughly
   half a card height — same layering trick as the mobile form card. */
.trust-strip { position: relative; z-index: 6; }
@media (min-width: 980px) {
  /* Only lift when main.js actually docked the form card into the hero —
     otherwise this eats the form card's own section gap instead of the photo. */
  html.js .trust-strip { margin-top: -2.8rem; }  /* ≈ half the badge-row height */
}
/* Explicit column counts (1 → 2+2 → 4) so four badges never strand an
   orphan on its own row the way auto-fit does at in-between widths */
.trust-strip-row {
  list-style: none;
  margin: 0; padding: 0;
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  gap: 0.9rem;
}
@media (min-width: 540px) { .trust-strip-row { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
@media (min-width: 980px) { .trust-strip-row { grid-template-columns: repeat(4, minmax(0, 1fr)); } }
.trust-badge {
  display: flex;
  align-items: center;
  gap: 0.8rem;
  padding: 0.95rem 1.2rem;
  border-radius: var(--radius-card);
  background: var(--glass);
  -webkit-backdrop-filter: blur(var(--glass-blur)) saturate(1.6);
  backdrop-filter: blur(var(--glass-blur)) saturate(1.6);
  border: 1px solid var(--glass-border);
  box-shadow: var(--specular), 0 4px 14px rgba(12, 42, 32, 0.06);
}
.trust-badge .icon { color: var(--brand-mid); flex: none; }
/* Direct child only — nested [data-bind] spans must stay inline, or the
   bound values break onto their own lines */
.trust-badge > span { display: flex; flex-direction: column; line-height: 1.3; min-width: 0; }
.trust-badge strong { font-size: 0.98rem; color: var(--heading); }
.trust-badge small { font-size: 0.82rem; color: var(--muted); }

/* ══════════════════ SECTION: emergency ══════════════════ */
.emergency-card {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: 1.25rem;
  padding: clamp(1.4rem, 3vw, 2rem) clamp(1.4rem, 3.5vw, 2.5rem);
}
.emergency-copy { flex: 1 1 22rem; }
.emergency-copy h2 { font-size: clamp(1.35rem, 2.6vw, 1.8rem); margin-bottom: 0.3rem; }
.emergency-copy p { margin: 0; }
/* The long "Call Now — (number)" label must never overflow tiny screens.
   The button is a flex row (icon | label | phone span), so letting it wrap
   needs flex-wrap too: without it the label and the number stay side by
   side as two columns and each wraps inside itself. The number is one
   flex item and must never be split across lines. */
.emergency-card .btn { max-width: 100%; }
@media (max-width: 460px) {
  .emergency-card .btn-lg {
    white-space: normal;
    text-align: center;
    width: 100%;
    flex-wrap: wrap;
    justify-content: center;
  }
  .emergency-card .btn-lg [data-bind="phone-display"] { white-space: nowrap; }
}
.pulse-dot {
  width: 14px; height: 14px;
  border-radius: 50%;
  background: #35d68d;
  box-shadow: 0 0 0 0 rgba(53, 214, 141, 0.55);
  animation: openPulse 2.4s ease-out infinite;
  flex: none;
}

/* ══════════════════ SECTION: services (cards) ══════════════════ */
.card-grid { display: grid; gap: 1.15rem; }
/* 1 → 2 → 4 columns: keeps 4 or 8 cards perfectly balanced (6 shows as 4+2) */
.card-grid.cols-4 { grid-template-columns: minmax(0, 1fr); }
@media (min-width: 600px)  { .card-grid.cols-4 { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
@media (min-width: 1024px) { .card-grid.cols-4 { grid-template-columns: repeat(4, minmax(0, 1fr)); } }
/* Photo-led service cards: real service photo on top, copy below.
   The photo is clipped to the card radius by overflow: hidden. */
.card {
  display: flex;
  flex-direction: column;
  padding: 0;
  overflow: hidden;
  border-radius: var(--radius-card);
  background: var(--glass-strong);
  -webkit-backdrop-filter: blur(var(--glass-blur)) saturate(1.6);
  backdrop-filter: blur(var(--glass-blur)) saturate(1.6);
  border: 1px solid var(--glass-border);
  box-shadow: var(--specular), var(--shadow-soft);
  transition: transform 0.22s ease, box-shadow 0.22s ease;
}
@media (hover: hover) {
  .card:hover { transform: translateY(-4px); box-shadow: var(--specular), var(--shadow-lifted); }
}
.card-photo {
  width: 100%;
  aspect-ratio: 16 / 10;
  object-fit: cover;             /* 16:10 intrinsic ratio keeps the crop even
                                    where aspect-ratio is unsupported */
  /* opaque hairline covers the sub-pixel seam under a fractional-height
     photo, so the aurora can't bleed through the glass card as a faint
     colored line below the image (most visible on the first services row) */
  box-shadow: 0 1px 0 0 #fbfcfd;
}
.card-body { padding: 1.15rem 1.5rem 1.35rem; }
.card h3 { margin-bottom: 0.4rem; }
.card p { margin: 0; color: var(--muted); font-size: 0.99rem; }

/* ══════════════════ SECTION: results (before/after + gallery) ══════════════════ */
.ba-slider {
  --ba-pos: 50%;
  position: relative;
  margin-inline: auto;
  border-radius: var(--radius-xl);
  overflow: hidden;
  aspect-ratio: 16 / 9;
  max-height: 620px;
  box-shadow: var(--shadow-lifted);
  border: 1px solid rgba(255, 255, 255, 0.4);
}
@media (max-width: 1023px) { .ba-slider { aspect-ratio: 4 / 3; } }
@media (max-width: 767px)  { .ba-slider { aspect-ratio: 1 / 1; } }
/* Engines without aspect-ratio (iOS ≤14): the absolutely-positioned images
   would collapse the box — give it an explicit height instead */
@supports not (aspect-ratio: 1) {
  .ba-slider { height: 56vw; max-height: 620px; }
  @media (max-width: 767px) { .ba-slider { height: 92vw; } }
}
.ba-slider .ba-img {
  position: absolute; inset: 0;
  width: 100%; height: 100%;
  object-fit: cover;
}
.ba-before-wrap {
  position: absolute; inset: 0;
  clip-path: inset(0 calc(100% - var(--ba-pos)) 0 0);
}
.ba-label {
  position: absolute;
  top: 1rem;
  z-index: 2;
  padding: 0.25rem 0.85rem;
  border-radius: var(--radius-btn);
  background: rgba(14, 20, 18, 0.62);
  -webkit-backdrop-filter: blur(8px);
  backdrop-filter: blur(8px);
  color: #fff;
  font-size: 0.82rem;
  font-weight: 800;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  pointer-events: none;
}
.ba-label.before { left: 1rem; }
.ba-label.after { right: 1rem; }
.ba-divider {
  position: absolute;
  top: 0; bottom: 0;
  left: var(--ba-pos);
  width: 2px;
  margin-left: -1px;
  background: rgba(255, 255, 255, 0.95);
  box-shadow: 0 0 12px rgba(0, 0, 0, 0.35);
  pointer-events: none;
}
.ba-handle {
  position: absolute;
  top: 50%; left: var(--ba-pos);
  transform: translate(-50%, -50%);
  width: 52px; height: 52px;
  display: flex;
  align-items: center;
  justify-content: center;
  border-radius: 50%;
  background: rgba(255, 255, 255, 0.82);
  -webkit-backdrop-filter: blur(10px) saturate(1.6);
  backdrop-filter: blur(10px) saturate(1.6);
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.95), 0 6px 18px rgba(0, 0, 0, 0.28);
  color: var(--heading);
  pointer-events: none;
}
.ba-range {
  position: absolute; inset: 0;
  width: 100%; height: 100%;
  margin: 0;
  opacity: 0;
  cursor: ew-resize;
  /* pan-y keeps vertical swipes scrolling the page (no touch dead-zone);
     horizontal drags still drive the range natively */
  touch-action: pan-y pinch-zoom;
  -webkit-appearance: none;
  appearance: none;
}
/* White ring — the handle floats over photos where brand-green vanishes */
.ba-range:focus-visible ~ .ba-handle { outline: 3px solid #fff; outline-offset: 3px; }
/* No JS = nothing drives --ba-pos: hide the interactive affordances and
   leave an honest static 50/50 comparison (labels + divider stay) */
html:not(.js) .ba-range, html:not(.js) .ba-handle { display: none; }
.ba-caption { text-align: center; color: var(--muted); font-size: 0.95rem; margin: 0.9rem auto 3rem; }

.gallery-grid {
  list-style: none;
  margin: 0; padding: 0;
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: 1.15rem;
}
@media (max-width: 1023px) { .gallery-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
@media (max-width: 540px)  { .gallery-grid { grid-template-columns: 1fr; } }
.gallery-link {
  position: relative;
  display: block;
  border-radius: var(--radius-card);
  overflow: hidden;
  aspect-ratio: 4 / 3;
  box-shadow: var(--shadow-soft);
  border: 1px solid rgba(255, 255, 255, 0.45);
}
.gallery-link img {
  width: 100%; height: 100%;
  object-fit: cover;
  transition: transform 0.35s ease;
}
@media (hover: hover) { .gallery-link:hover img { transform: scale(1.04); } }
.gallery-zoom {
  position: absolute;
  right: 0.8rem; bottom: 0.8rem;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 40px; height: 40px;
  border-radius: 50%;
  background: rgba(14, 20, 18, 0.55);
  -webkit-backdrop-filter: blur(8px);
  backdrop-filter: blur(8px);
  color: #fff;
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.22);
}

/* Lightbox */
/* Browsers without <dialog> support render it as a plain block — keep the
   closed lightbox invisible there (gallery links open in a new tab instead) */
dialog:not([open]) { display: none; }
.lightbox { border: 0; padding: 0; background: transparent; max-width: none; max-height: none; }
.lightbox::backdrop { background: rgba(10, 14, 13, 0.78); -webkit-backdrop-filter: blur(10px); backdrop-filter: blur(10px); }
.lightbox-inner { position: relative; display: flex; flex-direction: column; align-items: center; }
.lightbox-img {
  max-width: min(92vw, 1200px);
  max-height: 80vh;
  width: auto; height: auto;
  border-radius: var(--radius-card);
  box-shadow: 0 30px 90px rgba(0, 0, 0, 0.5);
  background: #23302b;
}
.lightbox-btn {
  position: absolute;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 46px; height: 46px;
  border: 0;
  border-radius: 50%;
  background: rgba(255, 255, 255, 0.16);
  -webkit-backdrop-filter: blur(10px);
  backdrop-filter: blur(10px);
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.28), inset 0 0 0 1px rgba(255, 255, 255, 0.16);
  color: #fff;
  cursor: pointer;
}
.lightbox-btn:hover { background: rgba(255, 255, 255, 0.28); }
.lightbox-close { top: -0.4rem; right: -0.4rem; transform: translate(50%, -50%); }
.lightbox-prev { left: 0.6rem; top: 50%; transform: translateY(-50%); }
.lightbox-next { right: 0.6rem; top: 50%; transform: translateY(-50%); }
@media (max-width: 640px) {
  .lightbox-close { top: 0.4rem; right: 0.4rem; transform: none; }
}

/* ══════════════════ SECTION: video ══════════════════ */
.video-frame {
  border-radius: var(--radius-xl);
  overflow: hidden;
  box-shadow: var(--shadow-lifted);
  border: 1px solid rgba(255, 255, 255, 0.4);
  max-width: 62rem;
  margin-inline: auto;
  background: #10201a;
}
.video-frame video { width: 100%; height: auto; aspect-ratio: 16 / 9; }

/* ══════════════════ SECTION: project-preview (slot) ══════════════════ */
/* The hosting app injects the AI preview app into the slot; the card only
   provides the glass surface and the centered 320–560px column the widget
   needs. The mock inside is preview-only chrome (replaced at publish). */
.preview-slot {
  position: relative;            /* anchors the .ip-tag preview label */
  width: 100%;
  max-width: 34rem;              /* 544px — inside the widget's 320–560px band */
  margin-inline: auto;
  padding: 1.5rem;
  border-radius: var(--radius-card);
}
.preview-mock {
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  min-height: 360px;
  text-align: center;
  color: var(--muted);
}
.preview-mock-icon {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 64px; height: 64px;
  border-radius: 20px;
  color: var(--brand-mid);
  background: linear-gradient(180deg, rgba(18, 146, 95, 0.14), rgba(18, 146, 95, 0.07));
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.7), inset 0 0 0 1px rgba(18, 146, 95, 0.12);
}
.preview-mock-title {
  margin: 0.9rem 0 0.3rem;
  font-weight: 800;
  color: var(--heading);
}
.preview-mock-copy { margin: 0; max-width: 34ch; font-size: 0.95rem; }

/* ══════════════════ SECTION: stats ══════════════════ */
.stats-card { padding: clamp(2rem, 4.5vw, 3.5rem); }
.stats-head { margin-bottom: clamp(1.5rem, 3vw, 2.25rem); }
/* Four stats: 2×2 on small screens, one row of 4 from tablet up */
.stat-row {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: 1.5rem;
  text-align: center;
}
@media (min-width: 768px) { .stat-row { grid-template-columns: repeat(4, minmax(0, 1fr)); } }
.stat-number {
  font-size: clamp(2rem, 4.2vw, 3rem);
  font-weight: 800;
  letter-spacing: -0.02em;
  color: #fff;
  line-height: 1.1;
}
.stat-number [data-bind] { color: inherit; }
.stat-label { color: var(--on-dark-muted); font-weight: 600; font-size: 0.95rem; margin-top: 0.3rem; }

/* ══════════════════ SECTION: cta-strip ══════════════════ */
.cta-strip-card {
  padding: clamp(1.75rem, 4vw, 2.5rem);
  text-align: center;
}
.cta-strip-card h2 { font-size: clamp(1.45rem, 2.8vw, 2rem); margin-bottom: 1.1rem; }
.cta-strip-actions { display: flex; flex-wrap: wrap; gap: 1rem; align-items: center; justify-content: center; }
.or-call { color: var(--muted); font-weight: 600; }
.or-call a { font-weight: 800; text-decoration: none; }

/* ══════════════════ SECTION: reviews ══════════════════ */
.review-summary {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 0.5rem;
  flex-wrap: wrap;
  font-size: 1.05rem;
  color: var(--muted);
  margin: -1.5rem auto 2rem;
  text-align: center;
}
.review-summary strong { color: var(--heading); font-size: 1.15rem; }
/* Three mock cards: 1 column, then 3 — never a stranded 2+1 layout.
   (Only preview chrome — the live widget replaces this grid.) */
.review-grid {
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  gap: 1.15rem;
}
@media (min-width: 820px) { .review-grid { grid-template-columns: repeat(3, minmax(0, 1fr)); } }
.review-card {
  padding: 1.5rem 1.4rem;
  border-radius: var(--radius-card);
  background: var(--glass-strong);
  -webkit-backdrop-filter: blur(var(--glass-blur)) saturate(1.6);
  backdrop-filter: blur(var(--glass-blur)) saturate(1.6);
  border: 1px solid var(--glass-border);
  box-shadow: var(--specular), var(--shadow-soft);
}
.review-head { display: flex; align-items: center; gap: 0.8rem; margin-bottom: 0.7rem; }
.review-avatar {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 46px; height: 46px;
  border-radius: 50%;
  background: linear-gradient(180deg, rgba(18, 146, 95, 0.18), rgba(18, 146, 95, 0.10));
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.7), inset 0 0 0 1px rgba(18, 146, 95, 0.14);
  color: var(--brand-mid);
  font-weight: 800;
  font-size: 0.95rem;
  flex: none;
}
.review-name { font-weight: 750; color: var(--heading); }
.review-loc { font-size: 0.85rem; color: var(--muted); }
.review-stars { display: flex; align-items: center; gap: 0.6rem; color: var(--star); font-size: 0.95rem; margin-bottom: 0.6rem; }
.review-date { color: var(--muted); font-size: 0.85rem; }
.review-card blockquote { margin: 0; color: var(--ink); font-size: 0.99rem; }

/* ══════════════════ SECTION: comparison ══════════════════ */
/* Two side-by-side cards: ours carries the accent ring and reads first;
   the "typical company" card is visually muted. Stacks below 820px. */
.compare-duo {
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  gap: 1.15rem;
  align-items: stretch;
  max-width: 60rem;
  margin-inline: auto;
}
@media (min-width: 820px) { .compare-duo { grid-template-columns: 1.08fr 0.92fr; } }
.compare-col { padding: clamp(1.5rem, 3vw, 2.1rem); border-radius: var(--radius-card); }
.compare-col-us {
  background: var(--glass-strong);
  box-shadow: var(--specular),
              inset 0 0 0 2px rgba(18, 146, 95, 0.35),
              var(--shadow-lifted);
}
.compare-col-them { background: var(--glass); }
.compare-col-title {
  display: flex;
  align-items: center;
  gap: 0.6rem;
  font-size: 1.15rem;
  margin-bottom: 1.1rem;
}
.compare-col-us .compare-col-title { color: var(--brand-mid); }
.compare-col-them .compare-col-title { color: var(--muted); }
.compare-col-icon {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 30px; height: 30px;
  border-radius: 50%;
  background: linear-gradient(180deg, var(--accent-a), var(--accent-b));
  color: #fff;
  flex: none;
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.35);
}
.compare-list {
  list-style: none;
  margin: 0; padding: 0;
  display: grid;
  gap: 0.9rem;
}
.compare-list li { display: flex; gap: 0.7rem; align-items: baseline; font-size: 0.99rem; }
.compare-list li > span:last-child { min-width: 0; }
.compare-col-us .compare-list li { color: var(--ink); }
.compare-col-us .compare-list strong { color: var(--heading); }
.compare-col-them .compare-list li { color: var(--muted); }
.compare-list .tick, .compare-list .cross { transform: translateY(4px); }
.tick, .cross {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 22px; height: 22px;
  flex: none;
  margin-right: 0.35rem;
  border-radius: 50%;
  font-size: 0.8rem;
  font-weight: 800;
  vertical-align: -0.3em;
}
.tick { background: rgba(18, 146, 95, 0.16); color: var(--brand-mid); }
.cross { background: rgba(120, 130, 126, 0.14); color: #55605b; }

/* ══════════════════ SECTION: process ══════════════════ */
/* Exactly three steps: 1 column, then 3 — never a stranded 2+1 layout */
.process-grid {
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  gap: 1.15rem;
}
@media (max-width: 819px) { .process-grid { gap: 2.6rem; } }  /* clear the -1.1rem step badge */
@media (min-width: 820px) { .process-grid { grid-template-columns: repeat(3, minmax(0, 1fr)); } }
.process-step { position: relative; padding: 2.1rem 1.6rem 1.6rem; border-radius: var(--radius-card); }
.step-number {
  position: absolute;
  top: -1.1rem; left: 1.4rem;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 44px; height: 44px;
  border-radius: 50%;
  background: linear-gradient(180deg, var(--accent-a), var(--accent-b));
  color: #fff;
  font-weight: 800;
  font-size: 1.15rem;
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.35), 0 8px 20px var(--accent-glow);
}
.process-step h3 { margin: 0.4rem 0 0.45rem; }
.process-step p { margin: 0; color: var(--muted); font-size: 0.99rem; }
.process-grid { padding-top: 1.1rem; }

/* ══════════════════ SECTION: owner ══════════════════ */
.owner-card {
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  gap: clamp(1.5rem, 3vw, 2.5rem);
  padding: clamp(1.5rem, 3.5vw, 2.75rem);
  align-items: center;
}
@media (min-width: 768px) { .owner-card { grid-template-columns: minmax(220px, 300px) minmax(0, 1fr); } }
.owner-photo {
  width: 100%;
  max-width: 300px;
  aspect-ratio: 4 / 5;
  object-fit: cover;
  border-radius: var(--radius-card);
  box-shadow: var(--shadow-soft);
  border: 1px solid rgba(255, 255, 255, 0.5);
  margin-inline: auto;
}
.owner-copy h2 { font-size: clamp(1.45rem, 2.8vw, 2rem); }
.owner-copy p { color: var(--ink); }
.owner-sign { font-weight: 750; color: var(--heading); }
.owner-chips { list-style: none; margin: 1rem 0 0; padding: 0; display: flex; flex-wrap: wrap; gap: 0.5rem; }
.owner-chips .trust-item {
  /* text-only chips: inline-block so the flex gap never pads the words apart */
  display: inline-block;
  background: rgba(18, 146, 95, 0.10);
  color: var(--heading);
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.6), inset 0 0 0 1px rgba(18, 146, 95, 0.12);
}

/* ══════════════════ SECTION: team ══════════════════ */
/* Expanded-bio cards: 1 column on phones, 2 per row from 768px — any EVEN
   member count lands balanced, never an orphan row. From 1024px each card
   turns sideways (portrait left, bio right) so the longer bios read
   comfortably without towering cards. */
.team-grid {
  list-style: none;
  margin: 0; padding: 0;
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  gap: 1.15rem;
  justify-items: center;
}
.team-card {
  display: flex;
  flex-direction: column;
  width: 100%;
  max-width: 26rem;              /* keeps single-column portraits sane on
                                    large phones */
  padding: 0;
  overflow: hidden;              /* clips the portrait to the card radius */
  border-radius: var(--radius-card);
}
.team-photo {
  width: 100%;
  aspect-ratio: 4 / 5;
  object-fit: cover;             /* 4:5 intrinsic ratio keeps the crop even
                                    where aspect-ratio is unsupported */
}
.team-body { padding: 1.1rem 1.25rem 1.3rem; }
@media (min-width: 768px) {
  .team-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .team-card { max-width: none; }
}
@media (min-width: 1024px) {
  .team-card { flex-direction: row; align-items: stretch; }
  .team-photo {
    width: 40%;
    max-width: 15rem;
    aspect-ratio: auto;          /* stretch fills the card's full height;
                                    object-fit keeps the crop centered */
    flex-shrink: 0;
  }
  .team-body { padding: 1.4rem 1.5rem; align-self: center; }
}
.team-name { margin: 0 0 0.2rem; font-size: 1.15rem; }
.team-role {
  margin: 0 0 0.5rem;
  font-size: 0.85rem;
  font-weight: 700;
  letter-spacing: 0.02em;
  color: var(--brand-mid);
}
.team-bio { margin: 0; font-size: 0.92rem; color: var(--muted); }

/* ══════════════════ SECTION: offer ══════════════════ */
.offer-card {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: space-between;
  gap: 1.75rem;
  padding: clamp(1.75rem, 4vw, 3rem);
}
.offer-tag {
  display: inline-block;
  padding: 0.3rem 0.9rem;
  margin-bottom: 0.9rem;
  border-radius: var(--radius-btn);
  background: rgba(53, 214, 141, 0.16);
  box-shadow: inset 0 0 0 1px rgba(53, 214, 141, 0.3);
  color: #8fe6bd;
  font-size: 0.82rem;
  font-weight: 800;
  letter-spacing: 0.08em;
  text-transform: uppercase;
}
.offer-card h2 { margin-bottom: 0.4rem; }
.offer-card p { max-width: 38rem; }
.offer-fine { font-size: 0.85rem; opacity: 0.85; margin-bottom: 0; }
.offer-cta { display: flex; flex-direction: column; gap: 0.8rem; align-items: stretch; min-width: 15rem; }

/* Variant switch: only the variant matching data-offer-mode renders */
.offer-variant { display: none; }
[data-offer-mode="discount"]  .variant-discount  { display: block; }
[data-offer-mode="seasonal"]  .variant-seasonal  { display: block; }
[data-offer-mode="financing"] .variant-financing { display: block; }
[data-offer-mode="scarcity"]  .variant-scarcity  { display: block; }

/* ══════════════════ SECTION: guarantee ══════════════════ */
/* Capped + centered: the card hugs its content instead of stretching the
   full container width and leaving dead space beside the text */
.guarantee-card {
  display: flex;
  align-items: flex-start;
  gap: 1.5rem;
  padding: clamp(1.75rem, 4vw, 2.75rem);
  max-width: 56rem;
  margin-inline: auto;
}
.guarantee-shield {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 84px; height: 84px;
  border-radius: 24px;
  color: var(--brand-mid);
  background: linear-gradient(180deg, rgba(18, 146, 95, 0.15), rgba(18, 146, 95, 0.07));
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.75), inset 0 0 0 1px rgba(18, 146, 95, 0.14);
  flex: none;
}
.guarantee-card h2 { font-size: clamp(1.45rem, 2.8vw, 2rem); }
.guarantee-card p { margin: 0; color: var(--muted); }
@media (max-width: 640px) {
  .guarantee-card { flex-direction: column; }
}

/* ══════════════════ SECTION: area (gbp card + map slot) ══════════════════ */
.gbp-grid {
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  gap: 1.15rem;
  align-items: stretch;
}
@media (min-width: 900px) { .gbp-grid { grid-template-columns: minmax(0, 0.9fr) minmax(0, 1.1fr); } }
.gbp-card {
  display: flex;
  flex-direction: column;
  padding: clamp(1.5rem, 3vw, 2rem);
  border-radius: var(--radius-card);
}
.gbp-name-row { display: flex; align-items: center; gap: 0.7rem; margin-bottom: 1rem; }
.gbp-name-row h3 { margin: 0; font-size: 1.3rem; }
.gbp-pin {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 48px; height: 48px;
  border-radius: 14px;
  color: var(--brand-mid);
  background: linear-gradient(180deg, rgba(18, 146, 95, 0.15), rgba(18, 146, 95, 0.07));
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.7), inset 0 0 0 1px rgba(18, 146, 95, 0.12);
  flex: none;
}
.gbp-info-list { list-style: none; margin: 0 0 1.1rem; padding: 0; display: grid; gap: 0.85rem; }
.gbp-info-list li { display: flex; align-items: baseline; gap: 0.7rem; }
.gbp-info-list .icon { color: var(--brand-mid); flex: none; transform: translateY(3px); }
.gbp-info-list a { font-weight: 750; text-decoration: none; display: inline-flex; align-items: center; min-height: 44px; }
.gbp-hours-week { display: grid; gap: 0.15rem; font-size: 0.95rem; width: 100%; max-width: 21rem; }
.gbp-hours-week div { display: flex; justify-content: space-between; gap: 1rem; }
.gbp-hours-week span:first-child { color: var(--muted); }
.area-chips { display: flex; flex-wrap: wrap; gap: 0.45rem; }
.area-chips.in-card { margin-bottom: 1.4rem; }
.gbp-card-cta { margin-top: auto; }

.map-frame {
  position: relative;
  min-height: 340px;
  border-radius: var(--radius-card);
  overflow: hidden;
  border: 1px solid rgba(255, 255, 255, 0.45);
  box-shadow: var(--shadow-soft);
  background: #e8ede9;
}
.map-frame > img,
.map-frame > iframe {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
  border: 0;
}
@media (max-width: 899px) { .map-frame { min-height: 340px; height: 46vw; max-height: 420px; } }

/* ══════════════════ SECTION: faq ══════════════════ */
.faq-list { max-width: 46rem; margin-inline: auto; display: grid; gap: 0.8rem; }
.faq-item { border-radius: var(--radius-card); padding: 0; overflow: hidden; }
.faq-item summary {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 1rem;
  padding: 1.1rem 1.35rem;
  font-weight: 700;
  color: var(--heading);
  cursor: pointer;
  list-style: none;
  min-height: 44px;
}
.faq-item summary::-webkit-details-marker { display: none; }
.faq-chevron { flex: none; color: var(--brand-mid); transition: transform 0.25s ease; }
.faq-item[open] .faq-chevron { transform: rotate(180deg); }
.faq-body { padding: 0 1.35rem 1.15rem; }
.faq-body p { margin: 0; color: var(--muted); }

/* ══════════════════ SECTION: final-cta ══════════════════ */
.final-card {
  text-align: center;
  padding: clamp(2.25rem, 5vw, 3.75rem);
}
.final-card h2 { font-size: clamp(1.8rem, 3.8vw, 2.8rem); }
.final-sub { margin-inline: auto; font-size: 1.1rem; }
.final-actions { justify-content: center; margin-top: 1.4rem; }
.final-phone-line { margin: 1.1rem auto 0; color: var(--on-dark-muted); }
.final-phone-line a { color: #8fe6bd; font-weight: 800; text-decoration: none; }

/* ══════════════════ SECTION: footer ══════════════════ */
.site-footer { padding-bottom: 2rem; }
.footer-card {
  display: flex;
  flex-direction: column;
  gap: 0.9rem;
  align-items: center;
  text-align: center;
  padding: 1.75rem 1.5rem;
  border-radius: var(--radius-xl);
  font-size: 0.92rem;
  color: var(--muted);
}
.footer-nap { display: flex; flex-direction: column; gap: 0.2rem; align-items: center; }
.footer-biz-name { font-weight: 800; color: var(--heading); font-size: 1.05rem; }
.footer-phone { color: var(--brand-mid); font-weight: 800; text-decoration: none; display: inline-flex; align-items: center; min-height: 44px; }
.footer-legal { display: flex; flex-wrap: wrap; gap: 0.5rem 1.5rem; }
.footer-legal a { color: var(--muted); display: inline-flex; align-items: center; min-height: 44px; }
@media (max-width: 979px) {
  .site-footer { padding-bottom: calc(6.5rem + env(safe-area-inset-bottom)); }
}

/* ══════════════════ SECTION: sticky-bar ══════════════════ */
.sticky-bar {
  position: fixed;
  left: 50%;
  bottom: calc(0.8rem + env(safe-area-inset-bottom));
  transform: translateX(-50%);
  z-index: 60;
  display: flex;
  gap: 0.6rem;
  padding: 0.55rem;
  border-radius: var(--radius-btn);
  background: rgba(255, 255, 255, 0.66);
  -webkit-backdrop-filter: blur(var(--glass-blur)) saturate(1.8);
  backdrop-filter: blur(var(--glass-blur)) saturate(1.8);
  border: 1px solid var(--glass-border);
  box-shadow: var(--specular), 0 12px 34px rgba(12, 42, 32, 0.22);
  transition: transform 0.28s ease, opacity 0.28s ease, visibility 0s;
  width: max-content;
  max-width: calc(100vw - 1.5rem);
}
.sticky-bar .btn { flex: none; }
@media (max-width: 360px) {
  .sticky-bar { gap: 0.4rem; padding: 0.45rem; }
  .sticky-bar .btn { padding-inline: 1.1rem; font-size: 0.95rem; }
}
/* pointer-events alone still leaves the dock in the tab order and the
   a11y tree while it is faded out — visibility takes it out of both, held
   back until the fade finishes so only the hiding direction is delayed */
.sticky-bar.hidden-bar {
  transform: translateX(-50%) translateY(140%);
  opacity: 0;
  visibility: hidden;
  pointer-events: none;
  transition: transform 0.28s ease, opacity 0.28s ease, visibility 0s linear 0.28s;
}
@media (min-width: 980px) { .sticky-bar { display: none; } html { scroll-padding-bottom: 0; } }

/* ══════════════════ Thank-you page ══════════════════ */
.thanks-section {
  min-height: 100vh;
  min-height: 100svh;
  display: flex;
  align-items: center;
  padding: 3rem 0;
}
.thanks-card {
  max-width: 38rem;
  margin-inline: auto;
  text-align: center;
  padding: clamp(2rem, 5vw, 3.25rem);
}
.thanks-icon {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 76px; height: 76px;
  border-radius: 50%;
  margin-bottom: 1.4rem;
  color: #fff;
  background: linear-gradient(180deg, var(--accent-a), var(--accent-b));
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.35), 0 12px 30px var(--accent-glow);
}
.thanks-sub { color: var(--muted); font-size: 1.1rem; margin-inline: auto; }
.thanks-steps {
  list-style: none;
  margin: 2rem 0 0;
  padding: 0;
  display: grid;
  gap: 0.9rem;
  text-align: left;
}
.thanks-steps li { display: flex; gap: 0.9rem; align-items: baseline; }
.thanks-step-num {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 30px; height: 30px;
  border-radius: 50%;
  background: linear-gradient(180deg, rgba(18, 146, 95, 0.16), rgba(18, 146, 95, 0.08));
  box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.7), inset 0 0 0 1px rgba(18, 146, 95, 0.14);
  color: var(--brand-mid);
  font-weight: 800;
  font-size: 0.9rem;
  flex: none;
  transform: translateY(4px);
}

/* ══════════════════ Reveal-on-scroll (JS-gated, subtle, one-time) ══════════════════ */
html.js .reveal {
  opacity: 0;
  transform: translateY(14px);
  transition: opacity 0.38s ease, transform 0.38s ease;
}
html.js .reveal.in { opacity: 1; transform: none; }
/* SAFETY NET (hosting-app contract): anything injected INSIDE a slot is
   always visible, even if it carries a copied .reveal class the observer
   never saw — never remove this rule */
html.js [data-slot] .reveal { opacity: 1; transform: none; }

/* ══════════════════ Degradation & preference fallbacks ══════════════════ */

/* No backdrop-filter → near-solid fills, same hierarchy */
@supports not ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))) {
  .glass, .glass-strong, .card, .review-card, .hero-form-card, .trust-badge,
  .header-pill, .sticky-bar { background: rgba(255, 255, 255, 0.94); }
  .btn-glass { background: rgba(255, 255, 255, 0.94); }
  .hero-copy-panel,
  .hero-copy-panel .btn-glass,
  .glass-dark .btn-glass { background: rgba(14, 20, 18, 0.88); }
  .glass-dark .btn-glass, .hero-copy-panel .btn-glass { background: rgba(255, 255, 255, 0.14); }
}

/* Reduced transparency → same, by preference */
@media (prefers-reduced-transparency: reduce) {
  .glass, .glass-strong, .card, .review-card, .hero-form-card, .trust-badge,
  .header-pill, .sticky-bar { background: rgba(255, 255, 255, 0.97); -webkit-backdrop-filter: none; backdrop-filter: none; }
  .hero-copy-panel { background: rgba(14, 20, 18, 0.92); -webkit-backdrop-filter: none; backdrop-filter: none; }
}

/* Reduced motion → no reveals, no sweeps, no pulses, no smooth scroll */
@media (prefers-reduced-motion: reduce) {
  html { scroll-behavior: auto; }
  html.js .reveal { opacity: 1; transform: none; transition: none; }
  .open-dot, .pulse-dot { animation: none; }
  /* .hidden-bar is (0,2,0) and would otherwise out-specify this reset */
  .btn, .card, .gallery-link img, .faq-chevron,
  .sticky-bar, .sticky-bar.hidden-bar { transition: none; }
  .btn-primary:hover, .card:hover { transform: none; }
}

/* Forced colors (Windows High Contrast) — keep structure visible */
@media (forced-colors: active) {
  .glass, .glass-strong, .glass-dark, .card, .review-card, .hero-form-card,
  .header-pill, .sticky-bar, .trust-badge, .faq-item, .compare-card,
  .hero-copy-panel { border: 1px solid CanvasText; }
  .btn { border: 1px solid CanvasText; }
  .aurora { display: none; }
  /* box-shadow focus rings are stripped in forced colors — restore outlines */
  [data-slot="lead-form"] input:focus,
  [data-slot="lead-form"] select:focus,
  [data-slot="lead-form"] textarea:focus { outline: 2px solid Highlight; }
}

/* Print — quote-friendly, no chrome */
@media print {
  .aurora, .site-header, .sticky-bar, .ip-tag, .skip-link,
  .lightbox, video { display: none !important; }
  body { background: #fff; color: #000; }
  .hero { min-height: 0; padding: 1rem 0; }
  .hero-media { display: none; }
  .hero-copy-panel, .glass, .glass-strong, .glass-dark, .card,
  .review-card, .hero-form-card {
    background: #fff !important;
    color: #000 !important;
    box-shadow: none !important;
    border: 1px solid #999 !important;
    -webkit-backdrop-filter: none !important;
    backdrop-filter: none !important;
  }
  /* the panels above are forced white, so every colour tuned for dark
     glass has to come back to ink here */
  .hero-copy-panel h1, .glass-dark h2, .glass-dark h3, .glass-dark p,
  .hero-copy-panel .stars, .glass-dark .stars, .hero-rating .count,
  .stat-number, .stat-label { color: #000 !important; }
  section, .cta-strip { padding-block: 0 1.5rem; }
}
