/* =============================================================
   Manchester End of Tenancy — site styles
   Editorial / property aesthetic. Restrained palette, single
   Prussian-blue accent, warm neutrals, type-led layout.
   ============================================================= */

/* ---------- 1. Tokens ---------- */
:root {
  /* Colours — neutrals warm-tinted (cream, stone, ink), accent is a
     deliberate cool note for editorial warm-cool contrast.
     OKLCH is canonical here (impeccable doctrine: never #000/#fff). */
  --surface:        oklch(97% 0.004 60);
  --surface-2:      oklch(92% 0.006 60);
  --surface-3:      oklch(88% 0.007 55);
  --text-2:         oklch(54% 0.008 50);
  --text-1:         oklch(20% 0.010 50);
  --rule:           oklch(85% 0.008 50);

  --accent:         oklch(34% 0.10 230);   /* Prussian Blue — primary brand accent */
  --accent-strong:  oklch(28% 0.115 228);  /* hover / active — ~6 L pts darker */
  --accent-soft:    oklch(34% 0.10 230 / 0.18);


  /* Typography */
  --font-display:   "Fraunces", "GT Sectra", Georgia, serif;
  --font-body:      "Inter", "Söhne", -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
  --font-tabular:   "Inter", -apple-system, sans-serif;

  /* Scale */
  --size-display:   clamp(2.5rem, 6vw, 4.5rem);
  --size-headline:  clamp(1.875rem, 4vw, 2.875rem);
  --size-title:     1.25rem;
  --size-body:      1.0625rem;
  --size-label:     0.8125rem;

  /* Spacing — single ladder, used directly */
  --s-1:  4px;
  --s-2:  8px;
  --s-3:  12px;
  --s-4:  16px;
  --s-5:  24px;
  --s-6:  32px;
  --s-7:  48px;
  --s-8:  64px;
  --s-9:  96px;
  --s-10: 128px;
  --s-11: 160px;

  /* Geometry */
  --r-sm: 6px;
  --r-md: 10px;
  --r-lg: 16px;
  --r-pill: 999px;

  /* Container */
  --container: 1180px;
  --container-narrow: 920px;

  /* Motion (Responsive energy per DESIGN.md) */
  --ease: cubic-bezier(0.16, 1, 0.3, 1);
  --ease-out: cubic-bezier(0.22, 1, 0.36, 1);
  --dur-quick: 200ms;
  --dur-base: 360ms;
  --dur-slow: 560ms;

  /* Shadow vocabulary — sparing, warm-tinted */
  --shadow-hover: 0 12px 32px -16px oklch(20% 0.010 50 / 0.20),
                  0 4px 12px -8px oklch(20% 0.010 50 / 0.10);
  --shadow-focus: 0 0 0 3px var(--accent-soft);
}

/* ---------- 2. Reset + base ---------- */
*, *::before, *::after { box-sizing: border-box; }
* { margin: 0; padding: 0; }

html {
  font-family: var(--font-body);
  font-size: 16px;
  line-height: 1.6;
  color: var(--text-1);
  background: var(--surface);
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  font-feature-settings: "ss01", "ss02", "cv11";
  scroll-behavior: smooth;
  /* Anchor targets land below the sticky header instead of behind it. */
  scroll-padding-top: 88px;
}

body {
  min-height: 100dvh;
  /* No overflow-x rule here: `overflow-x: hidden` on <body> in this layout
     promotes <body> to a scroll container, which intermittently breaks
     fragment-anchor scrolling (e.g. clicking #quote-wizard). The site has no
     elements that horizontally overflow at any breakpoint, so clipping is
     unnecessary. The JS hash-link handler in js/site.js is the safety net. */
}

img, svg { display: block; max-width: 100%; }
ul, ol { list-style: none; }
button { font: inherit; background: none; border: 0; cursor: pointer; color: inherit; }
input, textarea, select { font: inherit; color: inherit; }
a { color: inherit; text-decoration: none; }

/* Visually-hidden helper for SR-only labels */
.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;
}

::selection {
  background: var(--accent-soft);
  color: var(--text-1);
}

/* ---------- 2b. Skip link ----------
   First focusable element on every page. Off-screen by default; pops in
   on keyboard focus so users with a keyboard or screen reader can jump
   past the nav chrome straight to <main>. */
.skip-link {
  position: absolute;
  left: -9999px;
  top: 0;
  z-index: 100;
  background: var(--text-1);
  color: var(--surface);
  padding: var(--s-3) var(--s-5);
  text-decoration: none;
  border-radius: var(--r-sm);
  font-weight: 500;
}
.skip-link:focus,
.skip-link:focus-visible {
  left: var(--s-4);
  top: var(--s-4);
  outline: none;
  box-shadow: var(--shadow-focus);
}

/* ---------- 3. Typography ---------- */
.display {
  font-family: var(--font-display);
  font-size: var(--size-display);
  font-weight: 300;
  line-height: 1.04;
  letter-spacing: -0.022em;
  color: var(--text-1);
}

.headline {
  font-family: var(--font-display);
  font-size: var(--size-headline);
  font-weight: 400;
  line-height: 1.12;
  letter-spacing: -0.012em;
}

.title {
  font-family: var(--font-display);
  font-size: var(--size-title);
  font-weight: 500;
  line-height: 1.3;
  letter-spacing: -0.005em;
}

.body {
  font-size: var(--size-body);
  line-height: 1.65;
  color: var(--text-1);
  max-width: 64ch;
}

.body--muted { color: var(--text-2); }

.label {
  font-size: var(--size-label);
  font-weight: 500;
  letter-spacing: 0.05em;
  text-transform: uppercase;
  color: var(--text-2);
  font-feature-settings: "ss01", "tnum";
}

.tabular {
  font-feature-settings: "tnum", "ss01";
  font-variant-numeric: tabular-nums;
}

.lowercase { text-transform: lowercase; }

/* Accent underline on a single keyword */
.accent-underline {
  position: relative;
  white-space: nowrap;
}
.accent-underline::after {
  content: "";
  position: absolute;
  left: 0; right: 0;
  bottom: 0.06em;
  height: 0.18em;
  background: var(--accent);
  z-index: -1;
  opacity: 0.85;
}

/* ---------- 4. Layout primitives ---------- */
.container {
  width: 100%;
  max-width: var(--container);
  margin: 0 auto;
  padding-inline: var(--s-5);
}
@media (min-width: 768px) {
  .container { padding-inline: var(--s-7); }
}

.container--narrow {
  max-width: var(--container-narrow);
}

.section {
  padding-block: var(--s-9);
}
@media (min-width: 768px) {
  .section { padding-block: var(--s-10); }
}

.section--surface-2 { background: var(--surface-2); }
.section--surface-3 { background: var(--surface-3); }

.divider {
  width: 100%;
  height: 1px;
  background: var(--rule);
  border: 0;
}

/* ---------- 5. Buttons ---------- */
.btn {
  display: inline-flex;
  align-items: center;
  gap: var(--s-2);
  padding: var(--s-4) var(--s-6);
  border-radius: var(--r-pill);
  font-weight: 500;
  font-size: 0.9375rem;
  letter-spacing: -0.005em;
  transition: background var(--dur-quick) var(--ease),
              color var(--dur-quick) var(--ease),
              transform var(--dur-quick) var(--ease),
              box-shadow var(--dur-quick) var(--ease);
  white-space: nowrap;
  min-height: 48px;
}

.btn:focus-visible {
  outline: none;
  box-shadow: var(--shadow-focus);
}

.btn--primary {
  background: var(--text-1);
  color: var(--surface);
}
.btn--primary:hover {
  background: var(--accent);
  transform: translateY(-1px);
}

.btn--ghost {
  background: transparent;
  color: var(--text-1);
  border: 1px solid var(--text-1);
}
.btn--ghost:hover {
  background: var(--text-1);
  color: var(--surface);
}

.btn--lg {
  padding: var(--s-5) var(--s-7);
  font-size: 1rem;
  min-height: 56px;
}

/* ---------- 6. Header ---------- */
.site-header {
  position: sticky;
  top: 0;
  z-index: 30;
  background: oklch(97% 0.004 60 / 0.92);
  backdrop-filter: saturate(140%) blur(8px);
  -webkit-backdrop-filter: saturate(140%) blur(8px);
  border-bottom: 1px solid transparent;
  transition: border-color var(--dur-quick) var(--ease);
}
.site-header.is-scrolled {
  border-bottom-color: var(--rule);
}

.site-header__inner {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--s-5);
  padding-block: var(--s-4);
}

.wordmark {
  font-family: var(--font-display);
  font-weight: 500;
  font-size: 1.375rem;
  letter-spacing: -0.015em;
  color: var(--text-1);
}
.wordmark span {
  color: var(--accent);
}

.nav {
  display: none;
  align-items: center;
  gap: var(--s-6);
}
@media (min-width: 880px) {
  .nav { display: flex; }
}

.nav a {
  font-size: 0.9375rem;
  color: var(--text-1);
  position: relative;
  padding-block: var(--s-2);
}
.nav a::after {
  content: "";
  position: absolute;
  inset: auto 0 0 0;
  height: 1px;
  background: var(--accent);
  transform: scaleX(0);
  transform-origin: left;
  transition: transform var(--dur-base) var(--ease);
}
.nav a:hover::after,
.nav a:focus-visible::after { transform: scaleX(1); }

.header-phone {
  display: none;
  font-size: 0.9375rem;
  color: var(--text-1);
}
.header-phone .label {
  display: block;
  margin-bottom: 2px;
}
.header-phone strong {
  font-weight: 500;
  color: var(--text-1);
}
@media (min-width: 1024px) {
  .header-phone { display: block; text-align: right; }
}

/* Mobile nav toggle */
.nav-toggle {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 48px;
  height: 48px;
  border-radius: var(--r-sm);
  color: var(--text-1);
}
.nav-toggle svg { width: 22px; height: 22px; }
@media (min-width: 880px) {
  .nav-toggle { display: none; }
}

.mobile-nav {
  display: none;
  position: fixed;
  inset: 0;
  background: var(--surface);
  z-index: 40;
  padding: var(--s-7);
  /* Let the drawer scroll on short viewports. Once the Areas accordion is
     expanded (17 links × 48px ≈ 800px on top of the 4 top-level links and
     the close button), content can exceed an iPhone-SE-sized viewport.
     safe-area-inset-bottom keeps the last item clear of the home indicator. */
  overflow-y: auto;
  padding-bottom: max(var(--s-7), env(safe-area-inset-bottom));
  flex-direction: column;
  gap: var(--s-5);
}
.mobile-nav.is-open { display: flex; }
.mobile-nav__close {
  align-self: flex-end;
  width: 48px;
  height: 48px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
}
.mobile-nav a {
  font-family: var(--font-display);
  font-size: 1.75rem;
  font-weight: 400;
  color: var(--text-1);
  /* Touch-target minimum applied at the base, not gated behind a
     max-width media query. The drawer is itself mobile-only (hamburger
     hidden above 880px), so this only affects users actually using it. */
  min-height: 48px;
  display: flex;
  align-items: center;
}
.mobile-nav .label { color: var(--text-2); }

/* ---------- 7. Hero ---------- */
.hero {
  padding-block: var(--s-8) var(--s-9);
  position: relative;
}
@media (min-width: 768px) {
  .hero { padding-block: var(--s-9) var(--s-10); }
}

.hero__inner {
  display: grid;
  grid-template-columns: 1fr;
  gap: var(--s-8);
  align-items: end;
}
@media (min-width: 880px) {
  .hero__inner {
    grid-template-columns: minmax(0, 1.7fr) minmax(0, 1fr);
    gap: var(--s-9);
  }
}

.hero__eyebrow {
  margin-bottom: var(--s-5);
  color: var(--accent);
}

.hero__headline {
  margin-bottom: var(--s-6);
}

.hero__sub {
  margin-bottom: var(--s-7);
  font-size: 1.0625rem;
  color: var(--text-2);
  max-width: 52ch;
  line-height: 1.65;
}
@media (min-width: 768px) {
  .hero__sub { font-size: 1.125rem; }
}

.hero__ctas {
  display: flex;
  flex-wrap: wrap;
  gap: var(--s-3);
}

/* Macro detail card — replaces stock photo until real provided.
   Renders an editorial "address card" composition with a thin
   accent rule, evoking a property listing detail. */
.macro {
  position: relative;
  aspect-ratio: 4 / 5;
  background: var(--surface-2);
  border-radius: var(--r-md);
  overflow: hidden;
  isolation: isolate;
  padding: var(--s-7);
  display: flex;
  flex-direction: column;
  justify-content: space-between;
  box-shadow: var(--shadow-hover);
}
@media (min-width: 880px) {
  .macro { aspect-ratio: 3 / 4; }
}

.macro::before {
  content: "";
  position: absolute;
  inset: 0;
  background:
    radial-gradient(120% 80% at 80% 10%, oklch(99% 0.003 60) 0%, transparent 60%),
    radial-gradient(80% 50% at 20% 100%, oklch(85% 0.020 230 / 0.10) 0%, transparent 70%);
  z-index: -1;
}
.macro::after {
  content: "";
  position: absolute;
  inset: 0;
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='160' height='160' viewBox='0 0 160 160'><filter id='n'><feTurbulence type='fractalNoise' baseFrequency='0.85' numOctaves='2' stitchTiles='stitch'/><feColorMatrix values='0 0 0 0 0.20 0 0 0 0 0.18 0 0 0 0 0.16 0 0 0 0.06 0'/></filter><rect width='160' height='160' filter='url(%23n)'/></svg>");
  opacity: 0.7;
  mix-blend-mode: multiply;
  z-index: -1;
}

.macro__rule {
  width: 32px;
  height: 1px;
  background: var(--accent);
}

.macro__line {
  display: block;
  font-family: var(--font-display);
  font-size: 1.125rem;
  font-weight: 400;
  color: var(--text-1);
  line-height: 1.4;
}
.macro__line + .macro__line { margin-top: var(--s-2); }
.macro__small {
  font-family: var(--font-body);
  font-size: var(--size-label);
  font-weight: 500;
  letter-spacing: 0.05em;
  text-transform: uppercase;
  color: var(--text-2);
}

.macro__bottom {
  display: flex;
  flex-direction: column;
  gap: var(--s-3);
}

/* ---------- 8. Trust band ---------- */
.trust-band {
  background: var(--text-1);
  color: var(--surface);
  padding-block: var(--s-5);
  overflow: hidden;
}
.trust-band__inner {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  gap: var(--s-3) var(--s-7);
  font-size: 0.875rem;
  letter-spacing: 0.02em;
  font-weight: 400;
}
.trust-band__item {
  display: inline-flex;
  align-items: center;
  gap: var(--s-3);
  color: oklch(85% 0.005 60);
}
.trust-band__item::before {
  content: "";
  display: inline-block;
  width: 4px;
  height: 4px;
  border-radius: 50%;
  background: var(--accent);
}
.trust-band__item:first-child::before { display: none; }
@media (max-width: 600px) {
  .trust-band__item::before { display: none; }
}

/* ---------- 9. Service feature ---------- */
.feature {
  padding-block: var(--s-9);
}
@media (min-width: 768px) {
  .feature { padding-block: var(--s-10); }
}

.feature__inner {
  display: grid;
  grid-template-columns: 1fr;
  gap: var(--s-7);
  align-items: center;
}
@media (min-width: 880px) {
  .feature__inner {
    grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
    gap: var(--s-9);
  }
}

.feature--mirror .feature__inner > .feature__media {
  order: -1;
}
@media (min-width: 880px) {
  .feature--mirror .feature__inner > .feature__media {
    order: 0;
  }
}

.feature__eyebrow {
  margin-bottom: var(--s-4);
  color: var(--accent);
}

.feature__headline {
  margin-bottom: var(--s-5);
  max-width: 14ch;
}

.feature__body {
  margin-bottom: var(--s-6);
}

.feature__list {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: var(--s-3) var(--s-5);
  margin-bottom: var(--s-7);
  font-size: 0.9375rem;
}
.feature__list li {
  display: flex;
  align-items: baseline;
  gap: var(--s-3);
  color: var(--text-2);
  line-height: 1.5;
}
.feature__list li::before {
  content: "";
  display: inline-block;
  width: 6px;
  height: 6px;
  border-radius: 50%;
  background: var(--accent);
  flex-shrink: 0;
  transform: translateY(-2px);
}

/* Feature media — same SVG noise / editorial card style as macro */
.feature__media {
  position: relative;
  aspect-ratio: 4 / 5;
  background: var(--surface-2);
  border-radius: var(--r-md);
  overflow: hidden;
  isolation: isolate;
  padding: var(--s-7);
  display: flex;
  align-items: flex-end;
  box-shadow: var(--shadow-hover);
}
@media (min-width: 880px) {
  .feature__media { aspect-ratio: 5 / 6; }
}

.feature__media--alt {
  background: var(--surface-3);
}

.feature__media::before {
  content: "";
  position: absolute;
  inset: 0;
  background:
    radial-gradient(100% 70% at 70% 0%, oklch(99% 0.003 60) 0%, transparent 60%),
    radial-gradient(80% 50% at 30% 100%, oklch(85% 0.020 230 / 0.12) 0%, transparent 70%);
  z-index: -1;
}
.feature__media::after {
  content: "";
  position: absolute;
  inset: 0;
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='200' height='200' viewBox='0 0 200 200'><filter id='n'><feTurbulence type='fractalNoise' baseFrequency='0.7' numOctaves='2' stitchTiles='stitch'/><feColorMatrix values='0 0 0 0 0.20 0 0 0 0 0.18 0 0 0 0 0.16 0 0 0 0.05 0'/></filter><rect width='200' height='200' filter='url(%23n)'/></svg>");
  opacity: 0.65;
  mix-blend-mode: multiply;
  z-index: -1;
}

.feature__media-caption {
  display: flex;
  align-items: center;
  gap: var(--s-3);
  font-family: var(--font-display);
  font-size: 1.0625rem;
  color: var(--text-1);
}
.feature__media-caption .dot {
  width: 8px;
  height: 8px;
  border-radius: 50%;
  background: var(--accent);
}

/* ---------- 10. Tertiary services index ---------- */
.tertiary {
  padding-block: var(--s-9);
}

.tertiary__heading {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: var(--s-5);
  margin-bottom: var(--s-7);
  flex-wrap: wrap;
}
.tertiary__heading p {
  color: var(--text-2);
  font-size: 0.9375rem;
}

.tertiary__list { border-top: 1px solid var(--rule); }

.tertiary__item {
  display: grid;
  grid-template-columns: auto 1fr auto;
  align-items: center;
  gap: var(--s-5);
  padding: var(--s-6) 0;
  border-bottom: 1px solid var(--rule);
  transition: padding-inline var(--dur-base) var(--ease);
}
.tertiary__item:hover {
  padding-inline-start: var(--s-3);
}
@media (max-width: 600px) {
  .tertiary__item {
    grid-template-columns: 1fr auto;
    gap: var(--s-3) var(--s-4);
  }
  .tertiary__item__num { display: none; }
}

.tertiary__item__num {
  font-family: var(--font-body);
  font-feature-settings: "tnum";
  font-variant-numeric: tabular-nums;
  font-size: 0.8125rem;
  color: var(--text-2);
  letter-spacing: 0.05em;
}

.tertiary__item__name {
  font-family: var(--font-display);
  font-size: 1.5rem;
  font-weight: 400;
  color: var(--text-1);
  letter-spacing: -0.01em;
  line-height: 1.2;
}
@media (min-width: 768px) {
  .tertiary__item__name { font-size: 1.875rem; }
}

.tertiary__item__desc {
  grid-column: 2;
  color: var(--text-2);
  font-size: 0.9375rem;
  margin-top: 4px;
  line-height: 1.5;
  max-width: 56ch;
}
@media (max-width: 600px) {
  .tertiary__item__desc { grid-column: 1 / -1; }
}

.tertiary__item__cta {
  display: inline-flex;
  align-items: center;
  gap: var(--s-2);
  font-size: 0.875rem;
  color: var(--text-1);
  white-space: nowrap;
  transition: gap var(--dur-base) var(--ease), color var(--dur-quick) var(--ease);
}
.tertiary__item:hover .tertiary__item__cta {
  gap: var(--s-3);
  color: var(--accent);
}
.tertiary__item__cta svg {
  width: 14px;
  height: 14px;
  stroke: currentColor;
  stroke-width: 1.5;
  fill: none;
  stroke-linecap: round;
  stroke-linejoin: round;
}

/* ---------- 11. Testimonials ---------- */
.quotes { padding-block: var(--s-9); }

.quotes__inner {
  display: grid;
  grid-template-columns: 1fr;
  gap: var(--s-8);
}
@media (min-width: 880px) {
  .quotes__inner {
    grid-template-columns: 1fr 1fr;
    gap: var(--s-9);
  }
}

.quote {
  display: flex;
  flex-direction: column;
  gap: var(--s-5);
}
.quote__mark {
  font-family: var(--font-display);
  font-size: 4.5rem;
  font-weight: 300;
  line-height: 0.8;
  color: var(--accent);
  font-style: italic;
}
.quote__body {
  font-family: var(--font-display);
  font-size: clamp(1.375rem, 2.4vw, 1.75rem);
  font-weight: 300;
  font-style: italic;
  line-height: 1.4;
  color: var(--text-1);
  letter-spacing: -0.005em;
  max-width: 36ch;
}
.quote__attr {
  display: flex;
  align-items: center;
  gap: var(--s-3);
  font-size: 0.875rem;
  color: var(--text-2);
}
.quote__attr strong {
  color: var(--text-1);
  font-weight: 500;
}
.quote__stars {
  color: var(--accent);
  font-size: 0.9rem;
  letter-spacing: 0.1em;
}

/* ---------- 12. About snippet ---------- */
.about {
  padding-block: var(--s-9);
}

.about__inner {
  display: grid;
  grid-template-columns: 1fr;
  gap: var(--s-6);
  align-items: end;
}
@media (min-width: 880px) {
  .about__inner {
    grid-template-columns: minmax(0, 1.2fr) minmax(0, 1fr);
    gap: var(--s-9);
  }
}

.about__headline { max-width: 16ch; margin-bottom: var(--s-2); }
.about__body { color: var(--text-2); margin-bottom: var(--s-5); }
.about__link {
  display: inline-flex;
  align-items: center;
  gap: var(--s-2);
  font-size: 0.9375rem;
  color: var(--text-1);
  border-bottom: 1px solid var(--text-1);
  padding-bottom: 2px;
  transition: color var(--dur-quick) var(--ease), border-color var(--dur-quick) var(--ease);
}
.about__link:hover { color: var(--accent); border-color: var(--accent); }

/* ---------- 13. Areas magazine index ---------- */
.areas {
  padding-block: var(--s-9);
}

.areas__heading {
  display: grid;
  grid-template-columns: 1fr;
  gap: var(--s-5);
  margin-bottom: var(--s-8);
}
@media (min-width: 768px) {
  .areas__heading {
    grid-template-columns: minmax(0, 2fr) minmax(0, 1fr);
    gap: var(--s-9);
    align-items: end;
  }
}
.areas__heading p {
  color: var(--text-2);
  font-size: 0.9375rem;
  max-width: 38ch;
}

.areas__list {
  border-top: 1px solid var(--rule);
  display: grid;
  grid-template-columns: 1fr;
  column-gap: var(--s-9);
}
@media (min-width: 600px) {
  .areas__list { grid-template-columns: 1fr 1fr; }
}
@media (min-width: 1024px) {
  .areas__list { grid-template-columns: 1fr 1fr 1fr; }
}

.areas__item {
  display: flex;
  align-items: baseline;
  gap: var(--s-4);
  padding: var(--s-5) 0;
  border-bottom: 1px solid var(--rule);
  font-family: var(--font-display);
  font-size: 1.5rem;
  font-weight: 400;
  letter-spacing: -0.005em;
  color: var(--text-1);
  font-style: italic;
  position: relative;
  transition: color var(--dur-base) var(--ease), padding-left var(--dur-base) var(--ease);
}
.areas__item::before {
  content: "";
  width: 5px;
  height: 5px;
  border-radius: 50%;
  background: var(--accent);
  flex-shrink: 0;
  transform: translateY(-4px);
}
.areas__item:hover {
  color: var(--accent);
  padding-left: var(--s-3);
}
.areas__item__arrow {
  margin-left: auto;
  font-style: normal;
  font-family: var(--font-body);
  font-size: 1rem;
  opacity: 0;
  transition: opacity var(--dur-base) var(--ease), transform var(--dur-base) var(--ease);
}
.areas__item:hover .areas__item__arrow {
  opacity: 1;
  transform: translateX(2px);
}

/* ---------- 14. Quote wizard ---------- */
.wizard {
  background: var(--surface-2);
  padding-block: var(--s-9);
  scroll-margin-top: 80px;
}
@media (min-width: 768px) {
  .wizard { padding-block: var(--s-10); }
}

.wizard__inner {
  background: var(--surface);
  border-radius: var(--r-lg);
  padding: var(--s-7) var(--s-5);
  box-shadow: var(--shadow-hover);
}
@media (min-width: 768px) {
  .wizard__inner { padding: var(--s-9) var(--s-8); }
}

.wizard__head {
  display: flex;
  flex-direction: column;
  gap: var(--s-3);
  margin-bottom: var(--s-7);
}
@media (min-width: 600px) {
  .wizard__head {
    flex-direction: row;
    align-items: end;
    justify-content: space-between;
  }
}
.wizard__counter {
  font-feature-settings: "tnum";
  font-variant-numeric: tabular-nums;
}

.wizard__progress {
  height: 2px;
  width: 100%;
  background: var(--rule);
  border-radius: 1px;
  margin-bottom: var(--s-7);
  overflow: hidden;
}
.wizard__progress-bar {
  height: 100%;
  width: 20%;
  background: var(--accent);
  transition: width var(--dur-slow) var(--ease);
  transform-origin: left;
}

.wizard__step {
  display: none;
}
.wizard__step.is-active {
  display: block;
  animation: stepIn var(--dur-base) var(--ease);
}
@keyframes stepIn {
  from { opacity: 0; transform: translateY(8px); }
  to { opacity: 1; transform: translateY(0); }
}

.wizard__question {
  font-family: var(--font-display);
  font-size: clamp(1.625rem, 3.5vw, 2.5rem);
  font-weight: 300;
  line-height: 1.15;
  letter-spacing: -0.015em;
  margin-bottom: var(--s-7);
  max-width: 22ch;
  color: var(--text-1);
}

.wizard__chips {
  display: flex;
  flex-wrap: wrap;
  gap: var(--s-2);
  margin-bottom: var(--s-7);
}

.chip {
  display: inline-flex;
  align-items: center;
  padding: var(--s-3) var(--s-5);
  border: 1px solid var(--rule);
  border-radius: var(--r-pill);
  font-size: 0.9375rem;
  background: var(--surface);
  color: var(--text-1);
  cursor: pointer;
  transition: background var(--dur-quick) var(--ease),
              border-color var(--dur-quick) var(--ease),
              color var(--dur-quick) var(--ease),
              transform var(--dur-quick) var(--ease);
  min-height: 48px;
}
.chip:hover {
  border-color: var(--text-1);
}
.chip:focus-visible {
  outline: none;
  box-shadow: var(--shadow-focus);
}
.chip.is-selected {
  background: var(--text-1);
  color: var(--surface);
  border-color: var(--text-1);
}

.wizard__inputs {
  display: grid;
  gap: var(--s-4);
  grid-template-columns: 1fr;
  margin-bottom: var(--s-7);
}
@media (min-width: 600px) {
  .wizard__inputs { grid-template-columns: 1fr 1fr; }
}

.field {
  display: flex;
  flex-direction: column;
  gap: var(--s-2);
}
.field__label {
  font-size: var(--size-label);
  font-weight: 500;
  letter-spacing: 0.05em;
  text-transform: uppercase;
  color: var(--text-2);
}
.field__input {
  padding: var(--s-4) var(--s-5);
  background: var(--surface);
  border: 1px solid var(--rule);
  border-radius: var(--r-sm);
  font-size: 1rem;
  color: var(--text-1);
  transition: border-color var(--dur-quick) var(--ease), box-shadow var(--dur-quick) var(--ease);
}
.field__input:focus-visible {
  outline: none;
  border-color: var(--text-1);
  box-shadow: var(--shadow-focus);
}
.field__hint {
  font-size: 0.8125rem;
  color: var(--text-2);
}
.field__error {
  font-size: 0.8125rem;
  color: oklch(50% 0.15 25);
  font-weight: 500;
  margin-top: 2px;
}
.field__error[hidden] {
  display: none;
}
.field__input[aria-invalid="true"] {
  border-color: oklch(50% 0.15 25);
}

.wizard__actions {
  display: flex;
  gap: var(--s-3);
  justify-content: space-between;
  align-items: center;
  flex-wrap: wrap;
}
.wizard__back {
  font-size: 0.9375rem;
  color: var(--text-2);
  display: inline-flex;
  align-items: center;
  gap: var(--s-2);
  padding: var(--s-3) 0;
  min-height: 48px;
  visibility: hidden;
}
.wizard__back.is-visible { visibility: visible; }
.wizard__back:hover { color: var(--text-1); }

.wizard__alt {
  text-align: center;
  margin-top: var(--s-6);
  font-size: 0.9375rem;
  color: var(--text-2);
}
.wizard__alt a {
  color: var(--text-1);
  border-bottom: 1px solid var(--text-1);
  padding-bottom: 1px;
}
.wizard__alt a:hover { color: var(--accent); border-color: var(--accent); }

/* Trust microbar under the wizard heading. One muted line on desktop;
   allowed to wrap to two on narrow screens. No links. */
.wizard__trustbar {
  margin: var(--s-3) 0 0;
  font-size: 0.8125rem;
  line-height: 1.5;
  color: var(--text-2);
}
.wizard__trustbar span[aria-hidden] {
  color: var(--accent);
}

/* The wizard section is the target of #quote-form anchor scrolls; keep
   its heading clear of the sticky header when scrolled into view. */
.wizard {
  scroll-margin-top: 96px;
}

/* ---------- Round 2: wizard calculator components ----------
   New components for the calculator-style wizard rebuild:
   - .wizard__price-reveal: step 1 instant-price panel
   - .wizard__chips--stacked + .chip--block: vertical chip layout for
     condition fork (step 2) and priced extras (step 5)
   - .wizard__banner: contextual messaging boxes (heavy condition,
     out-of-area, photo contract, photo skip)
   - .wizard__field-label: section heading inside merged step 3
   - .wizard__photo-skip: opt-out link for the photo branch
   - .wizard__total: live running total on step 5
   - .wizard__summary__total: headline price recap on step 6
   - .wizard__consent: dispute-protection checkbox row
*/

.wizard__price-reveal {
  margin-top: var(--s-6);
  padding: var(--s-6) var(--s-7);
  background: var(--accent-soft);
  border-radius: var(--r-md);
  text-align: center;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: var(--s-3);
}
.wizard__price-reveal__label {
  color: var(--accent);
  margin: 0;
}
.wizard__price-reveal__value {
  font-size: 3rem;
  line-height: 1;
  margin: 0;
  color: var(--text-1);
}
.wizard__price-reveal__hint {
  max-width: 42ch;
  color: var(--text-2);
  font-size: 0.9375rem;
  margin: 0;
}
/* Neutral default state before a size is picked: "From £189". The prefix
   is hidden by JS as soon as a property size is selected. */
.wizard__price-reveal__from {
  font-size: 1.375rem;
  font-weight: 400;
  letter-spacing: 0;
  margin-right: var(--s-1);
}
.wizard__price-reveal__from[hidden] {
  display: none;
}
.wizard__price-reveal__cta {
  margin-top: var(--s-3);
}

/* Property profile checkboxes inside the price-reveal panel. Sit between
   the hint copy and the Continue CTA. Left-aligned in a center-aligned
   parent so the multi-line check labels read naturally. */
.wizard__profile {
  width: 100%;
  margin-top: var(--s-4);
  padding-top: var(--s-5);
  border-top: 1px solid oklch(85% 0.012 60 / 0.6);
  text-align: left;
}
.wizard__profile[hidden] {
  display: none;
}
/* Surcharge checklist sits inside a native <details>, closed by default.
   JS opens it when any flag is already ticked (restored state, back nav). */
.wizard__profile__summary {
  cursor: pointer;
  font-size: 0.9375rem;
  font-weight: 500;
  color: var(--text-1);
  padding: var(--s-2) 0;
  min-height: 44px;
  display: flex;
  align-items: center;
}
.wizard__profile__summary:hover {
  color: var(--accent);
}
.wizard__profile__summary:focus-visible {
  outline: none;
  box-shadow: var(--shadow-focus);
  border-radius: var(--r-sm);
}
.wizard__profile__details[open] .wizard__profile__summary {
  margin-bottom: var(--s-3);
}
.wizard__profile__intro {
  font-size: 0.875rem;
  line-height: 1.55;
  color: var(--text-2);
  margin: 0 0 var(--s-4);
}
.wizard__profile__check {
  display: flex;
  align-items: flex-start;
  gap: var(--s-3);
  padding: var(--s-3);
  margin: 0 calc(var(--s-3) * -1);
  border-radius: var(--r-md);
  cursor: pointer;
  min-height: 48px;
  transition: background var(--dur-quick) var(--ease);
}
.wizard__profile__check:hover {
  background: oklch(98% 0.005 60 / 0.6);
}
.wizard__profile__check[hidden] {
  display: none;
}
.wizard__profile__check input[type="checkbox"] {
  margin: 3px 0 0;
  width: 18px;
  height: 18px;
  accent-color: var(--accent);
  flex-shrink: 0;
  cursor: pointer;
}
.wizard__profile__check__body {
  display: flex;
  flex-direction: column;
  gap: var(--s-1);
}
.wizard__profile__check__label {
  font-size: 0.9375rem;
  font-weight: 500;
  color: var(--text-1);
  line-height: 1.4;
}
.wizard__profile__check__sub {
  font-size: 0.8125rem;
  line-height: 1.55;
  color: var(--text-2);
}

.wizard__chips--stacked {
  flex-direction: column;
  align-items: stretch;
}

.chip--block {
  width: 100%;
  justify-content: space-between;
  text-align: left;
  padding: var(--s-4) var(--s-5);
  border-radius: var(--r-md);
  flex-direction: row;
  align-items: center;
  gap: var(--s-4);
  white-space: normal;
}
.chip--block .chip__main {
  display: flex;
  flex-direction: column;
  flex: 1;
  gap: 2px;
  min-width: 0;
}
.chip--block .chip__label {
  font-size: 1rem;
  font-weight: 500;
  display: block;
}
.chip--block .chip__sub {
  display: block;
  font-size: 0.8125rem;
  color: var(--text-2);
  margin-top: 2px;
  font-weight: 400;
  line-height: 1.4;
}
.chip--block.is-selected .chip__main .chip__sub {
  color: oklch(85% 0.005 60);
}
.chip--block.is-selected .chip__sub {
  color: oklch(85% 0.005 60);
}
.chip--block .chip__price {
  font-size: 0.9375rem;
  font-weight: 500;
  color: var(--text-2);
  flex-shrink: 0;
}
.chip--block.is-selected .chip__price {
  color: var(--surface);
}

.wizard__field-label {
  font-size: var(--size-label);
  font-weight: 500;
  letter-spacing: 0.05em;
  text-transform: uppercase;
  color: var(--text-2);
  margin-bottom: var(--s-3);
}

.wizard__banner {
  margin-top: var(--s-5);
  padding: var(--s-4) var(--s-5);
  border-radius: var(--r-md);
  border-left: 3px solid var(--accent);
  background: var(--accent-soft);
  font-size: 0.9375rem;
  color: var(--text-1);
}
.wizard__banner p {
  margin: 0;
}
.wizard__banner strong {
  color: var(--accent);
}
.wizard__banner--heavy {
  border-left-color: oklch(70% 0.13 60);
  background: oklch(95% 0.04 60);
}
.wizard__banner--heavy strong {
  color: oklch(50% 0.13 50);
}
.wizard__banner--out {
  border-left-color: oklch(60% 0.10 50);
  background: oklch(94% 0.03 50);
}
.wizard__banner--out strong {
  color: oklch(45% 0.10 50);
}
.wizard__banner--skip {
  border-left-color: oklch(60% 0.13 30);
  background: oklch(95% 0.04 30);
}
.wizard__banner--skip strong {
  color: oklch(45% 0.15 25);
}
.wizard__banner--contract {
  margin-bottom: var(--s-5);
  margin-top: 0;
}
.wizard__banner--block {
  border-left-color: var(--accent);
  background: var(--accent-soft);
}
.wizard__banner--block strong {
  color: var(--accent);
}
.wizard__banner__cta {
  display: inline-flex;
  align-items: center;
  gap: var(--s-2);
  margin-top: var(--s-4);
}
.wizard__banner--block .wizard__banner__alt {
  font-size: 0.8125rem;
  color: var(--text-2);
  margin-top: var(--s-3);
}

/* GDPR Art. 13 notice at the point of submission. Sits between Turnstile
   and the submit button. Quiet, factual, with a Privacy Policy link. */
.wizard__privacy-notice {
  font-size: 0.8125rem;
  line-height: 1.55;
  color: var(--text-2);
  text-align: center;
  margin: 0 0 var(--s-5);
}
.wizard__privacy-notice a {
  color: var(--text-1);
  text-decoration: underline;
  text-decoration-color: var(--surface-3);
  text-decoration-thickness: 1px;
  text-underline-offset: 3px;
  transition: color var(--dur-quick) var(--ease), text-decoration-color var(--dur-quick) var(--ease);
}
.wizard__privacy-notice a:hover {
  color: var(--accent);
  text-decoration-color: var(--accent);
}

/* Success card headline focus ring (SR users land here after submit). */
.wizard__success__headline:focus-visible {
  outline: none;
  box-shadow: var(--shadow-focus);
  border-radius: var(--r-sm);
}

/* Skip-photos affordance: a <button> for accessibility, styled as a muted
   underlined text link sitting under the primary action row. The morph to
   "Actually, I will send photos to lock the price" is unchanged. */
.wizard__photo-skip {
  display: block;
  width: 100%;
  margin: var(--s-4) auto 0;
  padding: var(--s-2) var(--s-3);
  background: transparent;
  border: none;
  color: var(--text-2);
  font-family: inherit;
  font-size: 0.9375rem;
  text-align: center;
  text-decoration: underline;
  text-underline-offset: 3px;
  text-decoration-color: var(--rule);
  cursor: pointer;
  min-height: 44px;
  transition: color var(--dur-quick) var(--ease), text-decoration-color var(--dur-quick) var(--ease);
}
.wizard__photo-skip:hover {
  color: var(--text-1);
  text-decoration-color: var(--text-2);
}
.wizard__photo-skip:focus-visible {
  outline: none;
  box-shadow: var(--shadow-focus);
  border-radius: var(--r-sm);
}
.wizard__photo-skip[aria-pressed="true"] {
  color: var(--accent);
  text-decoration-color: var(--accent);
}
.wizard__photo-skip[hidden] {
  display: none;
}

.wizard__total {
  margin-bottom: var(--s-6);
  padding: var(--s-5) var(--s-6);
  background: var(--surface-2);
  border-radius: var(--r-md);
  text-align: center;
}
.wizard__total .label {
  margin: 0;
  color: var(--text-2);
}
.wizard__total__value {
  font-size: 2.5rem;
  line-height: 1;
  margin: var(--s-2) 0;
  color: var(--text-1);
}
.wizard__total__breakdown {
  margin: 0;
  font-size: 0.8125rem;
  color: var(--text-2);
  max-width: 50ch;
  margin-left: auto;
  margin-right: auto;
}

.wizard__summary__total {
  font-size: 2rem;
  line-height: 1;
  margin: var(--s-3) 0 var(--s-2) 0;
  color: var(--text-1);
}
.wizard__summary__total__note {
  display: block;
  font-size: 0.8125rem;
  font-weight: 400;
  color: var(--text-2);
  margin-top: 4px;
  font-family: var(--font-body);
}

.wizard__consent {
  margin-top: var(--s-5);
  padding: var(--s-4) var(--s-5);
  background: var(--accent-soft);
  border-radius: var(--r-md);
}
/* The consent wrap also has .field .field--full which both set display: flex,
   overriding the browser's UA [hidden] { display: none }. Re-assert it
   explicitly so the locked-branch-only checkbox actually hides on the
   on-arrival branch. */
.wizard__consent[hidden] {
  display: none;
}
.wizard__consent__label {
  display: flex;
  align-items: flex-start;
  gap: var(--s-3);
  cursor: pointer;
}
.wizard__consent__label input[type="checkbox"] {
  flex-shrink: 0;
  width: 20px;
  height: 20px;
  margin-top: 2px;
  accent-color: var(--accent);
  cursor: pointer;
}
.wizard__consent__text {
  font-size: 0.9375rem;
  color: var(--text-1);
  line-height: 1.5;
}
.wizard__consent input[type="checkbox"][aria-invalid="true"] {
  outline: 2px solid oklch(50% 0.15 25);
  outline-offset: 2px;
}

/* SPECIALIST referral consent. Shown only when state.condition is
   'Specialist case'. Soft-fallback by design: if the customer leaves it
   unticked we still capture the lead and phone them for verbal consent
   before sharing details with a partner. See js/site.js validateCurrentStep. */
.wizard__specialist-consent {
  margin-top: var(--s-4);
}
.wizard__consent__heading {
  display: block;
  margin-bottom: var(--s-3);
  font-size: 0.9375rem;
  color: var(--text-1);
}
.wizard__consent__fallback {
  margin-top: var(--s-3);
  padding-top: var(--s-3);
  border-top: 1px solid oklch(85% 0.03 60);
  font-size: 0.8125rem;
  color: var(--text-2);
  line-height: 1.5;
}

.date-input {
  display: none;
  margin-top: var(--s-3);
}
.date-input.is-visible {
  display: block;
}

/* ---------- 15. Footer ---------- */
.footer {
  background: var(--text-1);
  color: oklch(85% 0.005 60);
  padding-block: var(--s-9) var(--s-7);
}

.footer a { color: oklch(85% 0.005 60); }
.footer a:hover { color: var(--surface); }

.footer__top {
  display: grid;
  grid-template-columns: 1fr;
  gap: var(--s-8);
  margin-bottom: var(--s-8);
}
@media (min-width: 768px) {
  .footer__top {
    /* 5 columns: brand · Quick Links · Areas Covered · More Areas · Contact Us.
       Brand and Contact get slightly more room; the three middle list cols stay narrow. */
    grid-template-columns: minmax(0, 1.3fr) minmax(0, 0.85fr) minmax(0, 0.95fr) minmax(0, 0.95fr) minmax(0, 1.2fr);
    gap: var(--s-6);
  }
}

.footer__brand .wordmark {
  color: var(--surface);
  margin-bottom: var(--s-4);
  display: block;
}
.footer__brand .wordmark span { color: var(--accent); }

.footer__address {
  font-size: 0.9375rem;
  line-height: 1.7;
  color: oklch(78% 0.005 60);
  font-style: normal;
}
.footer__address strong { color: var(--surface); font-weight: 500; }

.footer__col h3 {
  font-family: var(--font-body);
  font-size: var(--size-label);
  font-weight: 500;
  letter-spacing: 0.05em;
  text-transform: uppercase;
  color: var(--surface);
  margin-bottom: var(--s-4);
}
.footer__col ul { display: flex; flex-direction: column; gap: var(--s-2); font-size: 0.9375rem; }

.footer__map {
  width: 100%;
  aspect-ratio: 4 / 3;
  background: oklch(35% 0.010 50);
  border-radius: var(--r-sm);
  overflow: hidden;
  border: 0;
  display: block;
}

/* Placeholder card while GMB Share→Embed URL is pending */
.footer__map--placeholder {
  display: flex;
  flex-direction: column;
  justify-content: space-between;
  padding: var(--s-5);
  background:
    linear-gradient(135deg, oklch(28% 0.012 50) 0%, oklch(22% 0.010 50) 100%);
  color: oklch(92% 0.005 60);
  text-decoration: none;
  transition: transform var(--dur-quick) var(--ease), background var(--dur-quick) var(--ease);
  position: relative;
  overflow: hidden;
}
.footer__map--placeholder::before {
  content: "";
  position: absolute;
  top: -40%;
  right: -20%;
  width: 80%;
  height: 80%;
  background: radial-gradient(circle, var(--accent-soft) 0%, transparent 70%);
  pointer-events: none;
}
.footer__map--placeholder:hover {
  transform: translateY(-2px);
  background: linear-gradient(135deg, oklch(30% 0.012 50) 0%, oklch(24% 0.010 50) 100%);
}

.footer__legal {
  display: flex;
  justify-content: space-between;
  flex-wrap: wrap;
  gap: var(--s-3);
  padding-top: var(--s-5);
  border-top: 1px solid oklch(35% 0.010 50);
  font-size: 0.8125rem;
  color: oklch(70% 0.005 60);
}
.footer__legal a { color: oklch(70% 0.005 60); }
.footer__legal a:hover { color: var(--surface); }

/* Social links in the footer brand block. Quiet editorial label+icon
   links that match the muted address tone on `.footer__address`. */
.footer__social {
  display: flex;
  flex-wrap: wrap;
  gap: var(--s-4);
  margin-top: var(--s-5);
}
.footer__social a {
  display: inline-flex;
  align-items: center;
  gap: var(--s-2);
  font-size: 0.875rem;
  color: oklch(78% 0.005 60);
  letter-spacing: 0.01em;
  transition: color var(--dur-quick) var(--ease);
}
.footer__social a:hover { color: var(--surface); }
.footer__social a:focus-visible {
  outline: none;
  color: var(--surface);
  box-shadow: var(--shadow-focus);
  border-radius: 2px;
}
.footer__social svg {
  width: 16px;
  height: 16px;
  fill: currentColor;
  flex-shrink: 0;
}

/* ---------- 15b. Mobile sticky CTA bar ----------
   Bottom-fixed action bar shown only on phones. Single full-width
   "Get a free quote" pill that scrolls to #quote-form. Hides when
   the wizard is in view. */
.mobile-cta-bar {
  display: none;
  position: fixed;
  left: 0;
  right: 0;
  bottom: 0;
  z-index: 50;
  background: var(--text-1);
  color: var(--surface);
  padding:
    var(--s-3)
    var(--s-4)
    calc(var(--s-3) + env(safe-area-inset-bottom, 0px));
  align-items: center;
  gap: var(--s-3);
  border-top: 1px solid oklch(35% 0.010 50);
  box-shadow: 0 -8px 24px -12px rgba(0, 0, 0, 0.25);
  transition: transform var(--dur-base) var(--ease);
}

.mobile-cta-bar.is-hidden {
  transform: translateY(120%);
  pointer-events: none;
}

.mobile-cta-bar__quote {
  flex: 1;
  display: inline-flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--s-3);
  padding: var(--s-3) var(--s-5);
  background: var(--surface);
  color: var(--text-1);
  border-radius: var(--r-pill);
  text-decoration: none;
  min-height: 52px;
  font-weight: 500;
  font-size: 0.9375rem;
  letter-spacing: -0.005em;
  transition: background var(--dur-quick) var(--ease),
              transform var(--dur-quick) var(--ease);
}
.mobile-cta-bar__quote:hover { background: var(--surface-2); }
.mobile-cta-bar__quote:active { transform: scale(0.98); }
.mobile-cta-bar__quote:focus-visible {
  outline: none;
  box-shadow: var(--shadow-focus);
}

.mobile-cta-bar__primary { white-space: nowrap; }

.mobile-cta-bar__arrow {
  display: inline-flex;
  color: var(--accent);
  flex-shrink: 0;
}

@media (max-width: 768px) {
  .mobile-cta-bar { display: flex; }
  /* Reserve space at the bottom of the document so the bar never
     overlaps the last line of the footer. Bar height ~76px + any
     device safe-area inset. */
  body { padding-bottom: calc(76px + env(safe-area-inset-bottom, 0px)); }
}

/* ---------- 17. Entrance animations (responsive motion) ---------- */
.reveal {
  opacity: 0;
  transform: translateY(16px);
  transition: opacity var(--dur-slow) var(--ease), transform var(--dur-slow) var(--ease);
}
.reveal.is-visible {
  opacity: 1;
  transform: translateY(0);
}

/* ---------- 18a. Page hero (smaller than home hero, used on sub-pages) ---------- */
.page-hero {
  padding-block: var(--s-9) var(--s-8);
}
@media (min-width: 768px) {
  .page-hero { padding-block: var(--s-10) var(--s-9); }
}

.page-hero__inner {
  display: grid;
  grid-template-columns: 1fr;
  gap: var(--s-7);
  align-items: end;
}
@media (min-width: 880px) {
  .page-hero__inner {
    grid-template-columns: minmax(0, 1.6fr) minmax(0, 1fr);
    gap: var(--s-9);
  }
}

.page-hero__crumbs {
  display: flex;
  align-items: center;
  gap: var(--s-3);
  margin-bottom: var(--s-5);
  font-size: 0.8125rem;
  color: var(--text-2);
  flex-wrap: wrap;
}
.page-hero__crumbs a {
  color: var(--text-2);
  border-bottom: 1px solid transparent;
  padding-bottom: 1px;
  transition: color var(--dur-quick) var(--ease), border-color var(--dur-quick) var(--ease);
}
.page-hero__crumbs a:hover { color: var(--text-1); border-color: var(--text-1); }
.page-hero__crumbs span[aria-hidden] { color: var(--text-2); opacity: 0.5; }

.page-hero__headline {
  font-size: clamp(2.25rem, 5.5vw, 4rem);
  font-weight: 300;
  line-height: 1.07;
  letter-spacing: -0.02em;
  margin-bottom: var(--s-5);
  color: var(--text-1);
  font-family: var(--font-display);
  max-width: 18ch;
}

.page-hero__sub {
  font-size: 1.0625rem;
  line-height: 1.65;
  color: var(--text-2);
  max-width: 50ch;
  margin-bottom: var(--s-6);
}

.page-hero__ctas {
  display: flex;
  flex-wrap: wrap;
  gap: var(--s-3);
}

.page-hero__sidecard {
  background: var(--surface-2);
  padding: var(--s-6);
  border-radius: var(--r-md);
  display: flex;
  flex-direction: column;
  gap: var(--s-4);
}
.page-hero__sidecard h3 {
  font-family: var(--font-body);
  font-size: var(--size-label);
  font-weight: 500;
  letter-spacing: 0.05em;
  text-transform: uppercase;
  color: var(--text-2);
  margin-bottom: 0;
}
.page-hero__sidecard ul {
  display: flex;
  flex-direction: column;
  gap: var(--s-2);
  font-size: 0.9375rem;
  color: var(--text-1);
}
.page-hero__sidecard ul li {
  display: flex;
  align-items: baseline;
  gap: var(--s-3);
}
.page-hero__sidecard ul li::before {
  content: "";
  display: inline-block;
  width: 5px; height: 5px;
  border-radius: 50%;
  background: var(--accent);
  flex-shrink: 0;
  transform: translateY(-2px);
}

/* ---------- 18b. Body sections (sub-pages) ---------- */
.copy {
  padding-block: var(--s-9);
}
.copy__inner {
  display: grid;
  grid-template-columns: 1fr;
  gap: var(--s-7);
}
@media (min-width: 880px) {
  .copy__inner {
    grid-template-columns: minmax(0, 1fr) minmax(0, 2fr);
    gap: var(--s-9);
  }
}
.copy__label {
  font-size: var(--size-label);
  font-weight: 500;
  letter-spacing: 0.05em;
  text-transform: uppercase;
  color: var(--text-2);
}
.copy__heading {
  font-family: var(--font-display);
  font-size: clamp(1.75rem, 3vw, 2.25rem);
  font-weight: 300;
  line-height: 1.18;
  letter-spacing: -0.012em;
  color: var(--text-1);
  margin-bottom: var(--s-5);
  max-width: 22ch;
}
.copy__body p {
  margin-bottom: var(--s-4);
  color: var(--text-1);
  line-height: 1.7;
  font-size: 1.0625rem;
  max-width: 64ch;
}
.copy__body p:last-child { margin-bottom: 0; }
.copy__body p strong { color: var(--text-1); font-weight: 500; }

/* What's included — long checklist on service pages */
.included {
  padding-block: var(--s-9);
  background: var(--surface-2);
}
.included__heading {
  margin-bottom: var(--s-7);
  display: grid;
  grid-template-columns: 1fr;
  gap: var(--s-3);
}
@media (min-width: 768px) {
  .included__heading {
    grid-template-columns: minmax(0, 1.4fr) minmax(0, 1fr);
    gap: var(--s-7);
    align-items: end;
  }
}
.included__heading p {
  color: var(--text-2);
  font-size: 0.9375rem;
  max-width: 40ch;
}

.included__groups {
  display: grid;
  grid-template-columns: 1fr;
  gap: var(--s-7);
  border-top: 1px solid var(--rule);
  padding-top: var(--s-7);
}
@media (min-width: 768px) {
  .included__groups { grid-template-columns: 1fr 1fr; }
}
@media (min-width: 1024px) {
  .included__groups { grid-template-columns: 1fr 1fr 1fr; }
}

.included__group h3 {
  font-family: var(--font-display);
  font-size: 1.5rem;
  font-weight: 400;
  letter-spacing: -0.005em;
  color: var(--text-1);
  margin-bottom: var(--s-4);
}
.included__group ul {
  display: flex;
  flex-direction: column;
  gap: var(--s-2);
  font-size: 0.9375rem;
}
.included__group ul li {
  display: flex;
  align-items: baseline;
  gap: var(--s-3);
  color: var(--text-2);
  line-height: 1.5;
}
.included__group ul li::before {
  content: "";
  display: inline-block;
  width: 5px; height: 5px;
  border-radius: 50%;
  background: var(--accent);
  flex-shrink: 0;
  transform: translateY(-3px);
}

/* What to expect — premium "honesty" section */
.expect {
  padding-block: var(--s-9);
}
.expect__inner {
  display: grid;
  grid-template-columns: 1fr;
  gap: var(--s-7);
}
@media (min-width: 880px) {
  .expect__inner {
    grid-template-columns: minmax(0, 1fr) minmax(0, 1.4fr);
    gap: var(--s-9);
  }
}
.expect__row {
  display: grid;
  grid-template-columns: auto 1fr;
  gap: var(--s-5);
  padding: var(--s-5) 0;
  border-bottom: 1px solid var(--rule);
}
.expect__row:last-child { border-bottom: 0; }
.expect__num {
  font-family: var(--font-display);
  font-size: 1.5rem;
  font-weight: 400;
  color: var(--accent);
  font-feature-settings: "tnum";
  font-variant-numeric: tabular-nums;
  font-style: italic;
  line-height: 1.2;
}
.expect__row h3 {
  font-family: var(--font-display);
  font-size: 1.25rem;
  font-weight: 500;
  margin-bottom: var(--s-2);
  color: var(--text-1);
}
.expect__row p {
  font-size: 0.9375rem;
  color: var(--text-2);
  line-height: 1.6;
}

/* FAQ — uses native <details>/<summary> */
.faq {
  padding-block: var(--s-9);
}
.faq__heading { margin-bottom: var(--s-7); max-width: 24ch; }

.faq__item {
  border-bottom: 1px solid var(--rule);
  padding: var(--s-5) 0;
}
.faq__item:first-child { border-top: 1px solid var(--rule); }
.faq__item summary {
  list-style: none;
  cursor: pointer;
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--s-5);
  font-family: var(--font-display);
  font-size: 1.25rem;
  font-weight: 400;
  color: var(--text-1);
  padding-block: var(--s-2);
  line-height: 1.3;
}
.faq__item summary::-webkit-details-marker { display: none; }
.faq__item summary::after {
  content: "+";
  font-family: var(--font-body);
  font-size: 1.5rem;
  font-weight: 300;
  color: var(--accent);
  transition: transform var(--dur-base) var(--ease);
  flex-shrink: 0;
}
.faq__item[open] summary::after { transform: rotate(45deg); }
.faq__answer {
  padding-top: var(--s-4);
  font-size: 0.9375rem;
  line-height: 1.7;
  color: var(--text-2);
  max-width: 64ch;
}
.faq__answer p + p { margin-top: var(--s-3); }

/* Areas served block — compact list on service pages */
.areas-served {
  padding-block: var(--s-9);
  background: var(--surface-2);
}
.areas-served__heading { margin-bottom: var(--s-6); max-width: 24ch; }
.areas-served__list {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: var(--s-3) var(--s-7);
}
@media (min-width: 768px) {
  .areas-served__list { grid-template-columns: repeat(5, minmax(0, 1fr)); }
}
.areas-served__list a {
  font-family: var(--font-display);
  font-style: italic;
  font-size: 1.125rem;
  color: var(--text-1);
  border-bottom: 1px solid transparent;
  padding-bottom: 2px;
  transition: color var(--dur-quick) var(--ease), border-color var(--dur-quick) var(--ease);
}
.areas-served__list a:hover {
  color: var(--accent);
  border-color: var(--accent);
}

/* Contact cards (large tappable) */
.contact-cards {
  padding-block: var(--s-9);
}
.contact-cards__grid {
  display: grid;
  grid-template-columns: 1fr;
  gap: var(--s-4);
  margin-top: var(--s-7);
}
@media (min-width: 768px) {
  .contact-cards__grid { grid-template-columns: repeat(3, minmax(0, 1fr)); }
}
.contact-card {
  display: flex;
  flex-direction: column;
  gap: var(--s-3);
  padding: var(--s-7) var(--s-6);
  background: var(--surface-2);
  border-radius: var(--r-md);
  transition: background var(--dur-quick) var(--ease), transform var(--dur-quick) var(--ease), box-shadow var(--dur-quick) var(--ease);
  color: var(--text-1);
  position: relative;
  overflow: hidden;
  isolation: isolate;
}
.contact-card:hover {
  background: var(--surface-3);
  transform: translateY(-2px);
  box-shadow: var(--shadow-hover);
}
.contact-card .label { color: var(--text-2); }
.contact-card__value {
  font-family: var(--font-display);
  font-size: clamp(1.5rem, 2.4vw, 2rem);
  font-weight: 400;
  line-height: 1.2;
  color: var(--text-1);
  letter-spacing: -0.01em;
}
.contact-card__value.tabular { font-feature-settings: "tnum"; font-variant-numeric: tabular-nums; }
.contact-card__hint {
  font-size: 0.875rem;
  color: var(--text-2);
  margin-top: auto;
}

/* Office hours table */
.hours {
  padding-block: var(--s-9);
  background: var(--surface-2);
}
.hours__list {
  display: grid;
  grid-template-columns: 1fr;
  gap: 0;
  max-width: 480px;
  margin-top: var(--s-5);
}
.hours__row {
  display: grid;
  grid-template-columns: 1fr auto;
  padding: var(--s-3) 0;
  border-bottom: 1px solid var(--rule);
  font-size: 0.9375rem;
}
.hours__row strong { font-weight: 500; color: var(--text-1); }
.hours__row span { color: var(--text-2); font-feature-settings: "tnum"; font-variant-numeric: tabular-nums; }

/* Testimonials gallery (full set on About page) */
.gallery {
  padding-block: var(--s-9);
}
.gallery__grid {
  display: grid;
  grid-template-columns: 1fr;
  gap: var(--s-7);
  margin-top: var(--s-7);
}
@media (min-width: 768px) {
  .gallery__grid { grid-template-columns: 1fr 1fr; }
}
.gallery__quote {
  display: flex;
  flex-direction: column;
  gap: var(--s-3);
  padding-bottom: var(--s-7);
  border-bottom: 1px solid var(--rule);
}
.gallery__quote blockquote {
  font-family: var(--font-display);
  font-style: italic;
  font-size: 1.25rem;
  font-weight: 300;
  line-height: 1.45;
  color: var(--text-1);
  letter-spacing: -0.005em;
}
.gallery__quote figcaption {
  font-size: 0.875rem;
  color: var(--text-2);
  display: flex;
  align-items: center;
  gap: var(--s-3);
}
.gallery__quote figcaption strong { color: var(--text-1); font-weight: 500; }
.gallery__quote .stars { color: var(--accent); letter-spacing: 0.1em; font-size: 0.9rem; }

.gallery__avatars-hero {
  margin: var(--s-7) auto var(--s-9);
  max-width: 480px;
  text-align: center;
}
.gallery__avatars-hero img {
  width: 100%;
  height: auto;
  display: block;
  border-radius: var(--r-md);
}
.gallery__avatars-hero figcaption {
  margin-top: var(--s-3);
  font-family: var(--font-body);
  font-size: var(--size-label);
  font-weight: 500;
  letter-spacing: 0.05em;
  text-transform: uppercase;
  color: var(--text-2);
}

/* Cross-link to neighbouring area pages */
.crosslinks {
  padding-block: var(--s-9);
}
.crosslinks__list {
  display: grid;
  grid-template-columns: 1fr;
  gap: var(--s-3);
  margin-top: var(--s-5);
}
@media (min-width: 768px) {
  .crosslinks__list { grid-template-columns: repeat(3, minmax(0, 1fr)); }
}
.crosslinks__link {
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: var(--s-5) var(--s-5);
  border: 1px solid var(--rule);
  border-radius: var(--r-md);
  font-family: var(--font-display);
  font-size: 1.25rem;
  color: var(--text-1);
  transition: border-color var(--dur-quick) var(--ease), background var(--dur-quick) var(--ease), transform var(--dur-quick) var(--ease);
}
.crosslinks__link:hover {
  border-color: var(--text-1);
  background: var(--surface-2);
  transform: translateY(-1px);
}
.crosslinks__link svg {
  width: 14px; height: 14px;
  stroke: currentColor; stroke-width: 1.5;
  fill: none; stroke-linecap: round; stroke-linejoin: round;
  opacity: 0.5;
}

/* ---------- 17b. Photo variants — drop noise pattern, host real <img> / <picture> ---------- */
/* Add the --photo modifier alongside the base class to swap the editorial card for a photograph.
   Existing aspect-ratio, border-radius and box-shadow tokens are inherited from the base rule. */

.macro--photo,
.feature__media--photo {
  padding: 0;
  display: block;
}
.macro--photo::before,
.macro--photo::after,
.feature__media--photo::before,
.feature__media--photo::after { display: none; }

.macro--photo > picture,
.macro--photo > img,
.feature__media--photo > picture,
.feature__media--photo > img {
  display: block;
  width: 100%;
  height: 100%;
}
.macro--photo picture img,
.macro--photo > img,
.feature__media--photo picture img,
.feature__media--photo > img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
  border-radius: inherit;
}

.page-hero__sidecard--photo {
  padding: 0;
  aspect-ratio: 4 / 5;
  overflow: hidden;
  isolation: isolate;
  box-shadow: var(--shadow-hover);
  background: var(--surface-2);
}
.page-hero__sidecard--photo > picture,
.page-hero__sidecard--photo > img {
  display: block;
  width: 100%;
  height: 100%;
}
.page-hero__sidecard--photo picture img,
.page-hero__sidecard--photo > img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
  border-radius: inherit;
}

/* Tertiary 3-up feature tiles (home page only) */
.tertiary__features {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: var(--s-6);
  margin-bottom: var(--s-9);
}
@media (max-width: 768px) {
  .tertiary__features {
    grid-template-columns: 1fr;
    gap: var(--s-5);
    margin-bottom: var(--s-7);
  }
}
.tertiary__features__item {
  display: block;
  text-decoration: none;
  color: inherit;
}
.tertiary__features__media {
  aspect-ratio: 1 / 1;
  border-radius: var(--r-md);
  overflow: hidden;
  background: var(--surface-2);
  margin-bottom: var(--s-4);
  box-shadow: var(--shadow-hover);
  transition: transform var(--dur-base) var(--ease);
}
.tertiary__features__item:hover .tertiary__features__media {
  transform: translateY(-2px);
}
.tertiary__features__media img {
  width: 100%; height: 100%; object-fit: cover; display: block;
}
.tertiary__features__caption {
  font-family: var(--font-display);
  font-size: 1.0625rem;
  color: var(--text-1);
  line-height: 1.3;
}
.tertiary__features__sub {
  font-family: var(--font-body);
  font-size: 0.875rem;
  color: var(--text-2);
  margin-top: 4px;
  line-height: 1.5;
}

/* Inline figures used in copy sections (about story, home about block) */
.inline-figure {
  margin: 0;
  border-radius: var(--r-md);
  overflow: hidden;
  box-shadow: var(--shadow-hover);
  background: var(--surface-2);
  isolation: isolate;
}
.inline-figure > picture,
.inline-figure > img { display: block; width: 100%; height: 100%; }
.inline-figure picture img,
.inline-figure > img {
  width: 100%; height: 100%;
  object-fit: cover;
  display: block;
}
.inline-figure--portrait { aspect-ratio: 1 / 1; }
.inline-figure--landscape { aspect-ratio: 4 / 3; }

/* ---------- 18. Reduced motion ---------- */
@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after {
    animation-duration: 0.001ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: 0.001ms !important;
    scroll-behavior: auto !important;
  }
  .reveal { opacity: 1; transform: none; }
}

/* =============================================================
   19. MOBILE OPTIMISATION PASS (<= 600px)
   The default section padding ladder is desktop-first. Without
   these overrides every section carries 96 + 96 = 192px of empty
   padding on a 375px phone, pushing the page to 18+ screens of
   scrolling. This block tightens spacing for thumb-scrolling,
   compresses trust band, reshapes hero photo aspect-ratio,
   collapses the tertiary dual pattern, halves the footer area
   list. Desktop and tablet are untouched.
   ============================================================= */
@media (max-width: 600px) {
  /* --- Section padding ladder: 96 -> 48 --- */
  .feature, .quotes, .about, .areas, .faq, .wizard,
  .copy, .included, .expect, .areas-served, .crosslinks,
  .contact-cards, .hours, .gallery, .tertiary {
    padding-block: var(--s-7);
  }

  /* --- Hero: less padding, tighter inner stack, shorter photo aspect --- */
  .hero { padding-block: var(--s-6) var(--s-7); }
  .hero__inner { gap: var(--s-6); }
  .hero__eyebrow { margin-bottom: var(--s-3); }
  .hero__headline { margin-bottom: var(--s-4); }
  .hero__sub { margin-bottom: var(--s-5); font-size: 1rem; }
  .macro,
  .macro--photo { aspect-ratio: 16 / 10; }

  /* --- Page hero (sub-pages) --- */
  .page-hero { padding-block: var(--s-7); }
  .page-hero__inner { gap: var(--s-6); }
  .page-hero__headline { margin-bottom: var(--s-4); }
  .page-hero__sub { margin-bottom: var(--s-5); font-size: 1rem; }
  .page-hero__sidecard,
  .page-hero__sidecard--photo { aspect-ratio: 16 / 10; }
  /* Portrait variant (about page) keeps the photo's natural 4:5 so faces
     don't get top-and-bottom-cropped by object-fit: cover. */
  .page-hero__sidecard--portrait { aspect-ratio: 4 / 5; }

  /* --- Trust band: was 34% padding-to-content; halve it --- */
  .trust-band { padding-block: var(--s-3); }
  .trust-band__inner { gap: var(--s-2) var(--s-5); font-size: 0.8125rem; }

  /* --- Footer: tighter on mobile. Quick Links (2nd col) and the two
         area lists (3rd + 4th cols) all get 2-column inner layouts so the
         footer doesn't tower. Brand and Contact stay full-width. --- */
  .footer { padding-block: var(--s-7) var(--s-5); }
  .footer__top { gap: var(--s-6); margin-bottom: var(--s-6); }
  .footer__address { font-size: 0.875rem; line-height: 1.6; }
  .footer__col h3 { margin-bottom: var(--s-3); }
  .footer__col ul { gap: var(--s-2); }
  .footer__col:nth-child(2) ul,
  .footer__col:nth-child(3) ul,
  .footer__col:nth-child(4) ul {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: var(--s-2) var(--s-5);
  }
  .footer__map { aspect-ratio: auto; height: 180px; }

  /* --- Tertiary: collapse the dual pattern + 2-column the cards.
         The 3-up cards (.tertiary__features) are kept (visually richer
         on mobile). The numbered list below repeats the same 4 items
         in a tap-row pattern; redundant on mobile, hidden here. The
         cards go 2-up on mobile (3 cards = 1 row of 2 + 1 alone) which
         halves the section height vs stacked-1-col. --- */
  .tertiary__list { display: none; }
  .tertiary__features {
    margin-bottom: 0;
    grid-template-columns: 1fr 1fr;
    gap: var(--s-3);
  }
  .tertiary__features__media { aspect-ratio: 4 / 5; }
  .tertiary__heading { margin-bottom: var(--s-5); }

  /* --- Feature blocks: tighter inner spacing + shorter photo aspect --- */
  .feature__inner { gap: var(--s-5); }
  .feature__eyebrow { margin-bottom: var(--s-3); }
  .feature__headline { margin-bottom: var(--s-3); }
  .feature__body { margin-bottom: var(--s-4); }
  .feature__list { margin-bottom: var(--s-5); gap: var(--s-2) var(--s-4); }
  .feature__media,
  .feature__media--photo { aspect-ratio: 16 / 10; }

  /* --- Included (service-page checklist) --- */
  .included__heading { margin-bottom: var(--s-5); }
  .included__groups { gap: var(--s-5); padding-top: var(--s-5); }
  .included__group h3 { margin-bottom: var(--s-3); }

  /* --- Expect rows (4-step process on service pages) --- */
  .expect__inner { gap: var(--s-5); }
  .expect__row { padding: var(--s-4) 0; gap: var(--s-4); }

  /* --- Quotes: smaller mark, tighter stacks --- */
  .quotes__inner { gap: var(--s-6); }
  .quote { gap: var(--s-3); }
  .quote__mark { font-size: 3rem; line-height: 0.6; }

  /* --- About: tighter sidecard. The 3 stats stacked vertically take
         ~280px on mobile; flow them horizontally as a 3-up row instead
         (each stat ~110px wide, total height ~110px). --- */
  .about__inner { gap: var(--s-5); }
  .about__headline { margin-bottom: var(--s-3); }
  .about__body { margin-bottom: var(--s-4); }
  .about__inner > div:last-child {
    border-left: 0 !important;
    padding-left: 0 !important;
    border-top: 1px solid var(--rule);
    padding-top: var(--s-5) !important;
  }
  .about__inner > div:last-child dl {
    grid-template-columns: 1fr 1fr 1fr !important;
    gap: var(--s-3) var(--s-3) !important;
    align-items: end !important;
  }
  .about__inner > div:last-child dl > div {
    display: flex !important;
    flex-direction: column !important;
    justify-content: flex-end !important;
    height: 100%;
  }
  .about__inner > div:last-child dl .display {
    font-size: 1.875rem !important;
  }

  /* --- Areas list: tighter row padding --- */
  .areas__heading { margin-bottom: var(--s-5); gap: var(--s-3); }
  .areas__item { padding: var(--s-4) 0; font-size: 1.25rem; }

  /* --- Wizard: tighter inner spacing --- */
  .wizard__inner { padding: var(--s-6) var(--s-5); }
  .wizard__head { margin-bottom: var(--s-5); }
  .wizard__progress { margin-bottom: var(--s-5); }
  .wizard__question { margin-bottom: var(--s-5); font-size: 1.5rem; }
  .wizard__chips { margin-bottom: var(--s-5); }
  .wizard__inputs { margin-bottom: var(--s-5); }

  /* --- FAQ: tighter rows + slightly smaller summary type --- */
  .faq__heading { margin-bottom: var(--s-5); }
  .faq__item { padding: var(--s-4) 0; }
  .faq__item summary { font-size: 1.0625rem; padding-block: var(--s-1); min-height: 48px; }

  /* --- Copy block (used in per-page copy sections) --- */
  .copy__inner { gap: var(--s-5); }
  .copy__heading { margin-bottom: var(--s-3); font-size: 1.625rem; }
  .copy__body p { margin-bottom: var(--s-3); font-size: 1rem; }

  /* --- Areas-served (compact list on service pages) --- */
  .areas-served__heading { margin-bottom: var(--s-4); }

  /* --- Touch targets: nav + mobile nav --- */
  .mobile-nav a { min-height: 48px; display: flex; align-items: center; }
  .areas-served__list a { min-height: 48px; display: inline-flex; align-items: center; }

  /* --- Reveal animations: disable on small phones for reliability.
         IntersectionObserver threshold/rootMargin combinations have an
         intermittent failure mode on iOS Safari low-power; on small
         viewports the animations are also less perceptible. Render
         instantly instead. --- */
  .reveal { opacity: 1; transform: none; transition: none; }
}

/* =============================================================
   20. Additions for Manchester End of Tenancy Cleaning
   - Areas dropdown in primary nav
   - Mobile nav areas accordion
   - Quote form (select styling + status message)
   - Cookie consent banner
   - Crosslinks arrow SVG sizing
   ============================================================= */

/* ---------- 20a. Header areas dropdown ---------- */
.nav__dropdown {
  position: relative;
}
.nav__dropdown-toggle {
  font-family: inherit;
  font-size: 0.9375rem;
  color: var(--text-1);
  padding-block: var(--s-2);
  display: inline-flex;
  align-items: center;
  gap: var(--s-2);
  position: relative;
}
.nav__dropdown-toggle::after {
  content: "";
  position: absolute;
  inset: auto 0 0 0;
  height: 1px;
  background: var(--accent);
  transform: scaleX(0);
  transform-origin: left;
  transition: transform var(--dur-base) var(--ease);
}
.nav__dropdown-toggle:hover::after,
.nav__dropdown-toggle:focus-visible::after,
.nav__dropdown.is-open .nav__dropdown-toggle::after {
  transform: scaleX(1);
}
.nav__dropdown-toggle svg {
  transition: transform var(--dur-quick) var(--ease);
}
.nav__dropdown.is-open .nav__dropdown-toggle svg {
  transform: rotate(180deg);
}
.nav__dropdown-panel {
  position: absolute;
  top: calc(100% + var(--s-3));
  left: 50%;
  transform: translateX(-50%) translateY(-4px);
  background: var(--surface);
  border: 1px solid var(--rule);
  border-radius: var(--r-md);
  box-shadow: var(--shadow-hover);
  padding: var(--s-3);
  min-width: 260px;
  display: none;
  grid-template-columns: 1fr 1fr;
  gap: var(--s-1) var(--s-3);
  z-index: 35;
}
.nav__dropdown.is-open .nav__dropdown-panel {
  display: grid;
  animation: dropdownIn var(--dur-base) var(--ease);
}
@keyframes dropdownIn {
  from { opacity: 0; transform: translateX(-50%) translateY(-8px); }
  to   { opacity: 1; transform: translateX(-50%) translateY(-4px); }
}
.nav__dropdown-panel a {
  font-size: 0.875rem;
  padding: var(--s-2) var(--s-3);
  color: var(--text-1);
  border-radius: var(--r-sm);
  white-space: nowrap;
  transition: background var(--dur-quick) var(--ease), color var(--dur-quick) var(--ease);
}
.nav__dropdown-panel a:hover,
.nav__dropdown-panel a:focus-visible {
  background: var(--surface-2);
  color: var(--accent);
  outline: none;
}

.nav__cta {
  font-weight: 500;
  color: var(--accent) !important;
}

/* ---------- 20b. Mobile nav areas accordion ---------- */
.mobile-nav__areas {
  font-family: var(--font-display);
  font-size: 1.75rem;
  font-weight: 400;
  color: var(--text-1);
}
.mobile-nav__areas summary {
  list-style: none;
  cursor: pointer;
  display: inline-flex;
  align-items: center;
  gap: var(--s-3);
  padding-block: var(--s-2);
  min-height: 48px;
}
.mobile-nav__areas summary::-webkit-details-marker { display: none; }
.mobile-nav__areas summary svg {
  transition: transform var(--dur-quick) var(--ease);
}
.mobile-nav__areas[open] summary svg {
  transform: rotate(180deg);
}
.mobile-nav__areas > div {
  display: flex;
  flex-direction: column;
  gap: var(--s-2);
  padding-top: var(--s-3);
  padding-left: var(--s-4);
  border-left: 1px solid var(--rule);
  margin-top: var(--s-3);
}
.mobile-nav__areas > div a {
  font-family: var(--font-body);
  font-size: 1rem;
  color: var(--text-1);
  padding-block: var(--s-2);
  min-height: 48px;
  display: flex;
  align-items: center;
}

/* ---------- 20c. Quote form (select + status) ---------- */
.quote-form select.field__input {
  appearance: none;
  -webkit-appearance: none;
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='%23555' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><polyline points='6 9 12 15 18 9'/></svg>");
  background-repeat: no-repeat;
  background-position: right var(--s-4) center;
  padding-right: var(--s-7);
  cursor: pointer;
}
.quote-form textarea.field__input {
  resize: vertical;
  min-height: 80px;
  font-family: inherit;
}
.quote-form .wizard__inputs {
  margin-bottom: var(--s-5);
}
.quote-form__status {
  font-size: 0.9375rem;
  line-height: 1.5;
}

/* ---------- 20d. Cookie consent banner ----------
   Compact bottom-right card on desktop, full-width bar on mobile. Cream
   surface to sit calmly against the page rather than a heavy dark slab.
   --------------------------------------------------------------------- */
.cookie-banner {
  position: fixed;
  left: auto;
  right: var(--s-4);
  bottom: var(--s-4);
  z-index: 60;
  background: var(--surface);
  color: var(--text-1);
  border: 1px solid var(--surface-3);
  border-radius: var(--r-md);
  box-shadow: 0 14px 40px -16px oklch(20% 0.04 60 / 0.30);
  padding: var(--s-4) var(--s-5);
  display: none;
  max-width: 440px;
  width: calc(100% - var(--s-8));
}
.cookie-banner.is-visible {
  display: block;
  animation: cookieIn var(--dur-base) var(--ease);
}
@keyframes cookieIn {
  from { opacity: 0; transform: translateY(12px); }
  to   { opacity: 1; transform: translateY(0); }
}
.cookie-banner__inner {
  display: flex;
  flex-direction: column;
  gap: var(--s-4);
}
.cookie-banner__copy {
  font-size: 0.875rem;
  line-height: 1.55;
  margin: 0;
  color: var(--text-2);
}
.cookie-banner__copy a {
  color: var(--text-1);
  text-decoration: underline;
  text-decoration-color: var(--surface-3);
  text-decoration-thickness: 1px;
  text-underline-offset: 3px;
  transition: color var(--dur-quick) var(--ease), text-decoration-color var(--dur-quick) var(--ease);
}
.cookie-banner__copy a:hover {
  color: var(--accent);
  text-decoration-color: var(--accent);
}
.cookie-banner__actions {
  display: flex;
  gap: var(--s-2);
  align-items: center;
  justify-content: flex-end;
}
/* ICO/PECR consent parity: Accept and Reject must have equal visual
   weight, so rejection is "as easy as" acceptance. Both buttons share
   identical treatment (outlined, equal padding/weight). The modifier
   classes remain for semantic targeting but carry no visual difference. */
.cookie-banner__btn {
  font-family: inherit;
  font-size: 0.875rem;
  font-weight: 500;
  min-height: 44px;
  padding: var(--s-2) var(--s-4);
  border-radius: var(--r-sm);
  border: 1px solid var(--text-1);
  background: transparent;
  color: var(--text-1);
  cursor: pointer;
  transition: background var(--dur-quick) var(--ease), color var(--dur-quick) var(--ease), box-shadow var(--dur-quick) var(--ease);
}
.cookie-banner__btn:hover {
  background: var(--text-1);
  color: var(--surface);
}
.cookie-banner__btn:focus-visible {
  outline: none;
  box-shadow: var(--shadow-focus);
}
@media (max-width: 600px) {
  .cookie-banner {
    left: var(--s-3);
    right: var(--s-3);
    bottom: calc(var(--s-3) + 76px + env(safe-area-inset-bottom, 0px));
    max-width: none;
    width: auto;
    padding: var(--s-4);
  }
  .cookie-banner__actions {
    flex-direction: column-reverse;
    align-items: stretch;
  }
  .cookie-banner__btn {
    width: 100%;
    min-height: 48px;
  }
}

/* ---------- 20e. Crosslinks arrow ---------- */
.crosslinks__link svg {
  width: 14px;
  height: 14px;
  stroke: currentColor;
  stroke-width: 1.5;
  fill: none;
  stroke-linecap: round;
  stroke-linejoin: round;
  opacity: 0.5;
}

/* ---------- 20f. Tertiary item cta svg fix (used in areas grid) ---------- */
.tertiary__item__cta svg {
  width: 14px;
  height: 14px;
  stroke: currentColor;
  stroke-width: 1.5;
  fill: none;
  stroke-linecap: round;
  stroke-linejoin: round;
}

/* ---------- 20g. Cookie footer link colour fix ---------- */
.footer__legal #cookieSettingsLink {
  color: oklch(70% 0.005 60);
  cursor: pointer;
}
.footer__legal #cookieSettingsLink:hover {
  color: var(--surface);
}

/* ---------- 20h. Brand wordmark with worker bee mark ----------
   Horizontal lockup: terracotta worker bee + Fraunces wordmark.
   "Manchester" sits at standard weight, "End of Tenancy" is the
   emphasized italic — matches the vertical inspiration's hierarchy
   while fitting a single-line nav constraint. */
.wordmark--bee {
  display: inline-flex;
  align-items: center;
  gap: var(--s-3);
  line-height: 1;
  font-family: var(--font-display);
  font-weight: 400;
  letter-spacing: -0.012em;
  color: var(--text-1);
}
/* Bee sits in a soft Prussian blue badge to soften it on cream and
   give the brand mark proper weight against the wordmark text. */
.wordmark__bee {
  width: 40px;
  height: 40px;
  flex-shrink: 0;
  display: block;
  background: var(--accent-soft);
  padding: 6px;
  border-radius: 10px;
  box-sizing: content-box;
}
.wordmark__text {
  font-size: 1.0625rem;
  font-weight: 500;
  line-height: 1.05;
  display: inline-flex;
  flex-direction: column;
  letter-spacing: -0.005em;
}
.wordmark__text em {
  font-style: italic;
  font-weight: 400;
  font-size: 1.125rem;
  color: var(--text-1);
  letter-spacing: -0.012em;
  margin-top: 1px;
}
@media (min-width: 640px) {
  .wordmark__bee { width: 44px; height: 44px; padding: 7px; border-radius: 11px; }
  .wordmark__text { font-size: 1rem; }
  .wordmark__text em { font-size: 1.25rem; }
}

/* Footer variant — larger badge, slightly more opaque background so it
   reads against the dark footer ground. */
.wordmark--footer {
  margin-bottom: var(--s-4);
  color: var(--surface);
}
.wordmark--footer .wordmark__bee {
  width: 48px;
  height: 48px;
  padding: 8px;
  border-radius: 12px;
  background: oklch(34% 0.10 230 / 0.32);
}
.wordmark--footer .wordmark__text { color: var(--surface); }
.wordmark--footer .wordmark__text em { color: var(--surface); }

/* Tighter on very narrow phones so the wordmark never wraps */
@media (max-width: 380px) {
  .wordmark--bee { gap: var(--s-2); }
  .wordmark__bee { width: 32px; height: 32px; padding: 5px; border-radius: 8px; }
  .wordmark__text { font-size: 0.875rem; }
  .wordmark__text em { font-size: 0.9375rem; }
}

/* ---------- 20i. Hero trust strip + reviews badge ----------
   Under-the-CTA microcopy showing rating + review count + key trust signals.
   The reviews-badge variant sits above the testimonials grid as the
   review-section heading anchor. */
.hero__trust {
  margin-top: var(--s-6);
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--s-3);
  font-size: 0.9375rem;
  line-height: 1.55;
  color: var(--text-2);
  max-width: 60ch;
}
.hero__trust strong {
  color: var(--text-1);
  font-weight: 500;
}
.hero__trust-stars {
  color: var(--accent);
  font-size: 1rem;
  letter-spacing: 0.05em;
  flex-shrink: 0;
}

.reviews-badge {
  display: inline-flex;
  align-items: center;
  gap: var(--s-3);
  padding: var(--s-3) var(--s-5);
  background: var(--accent-soft);
  border-radius: var(--r-pill);
  font-size: 0.9375rem;
  color: var(--text-1);
  width: auto;
  margin-left: auto;
  margin-right: auto;
}
.reviews-badge strong {
  font-weight: 500;
}
.reviews-badge__stars {
  color: var(--accent);
  letter-spacing: 0.05em;
  font-size: 1rem;
}
@media (max-width: 600px) {
  .hero__trust {
    font-size: 0.875rem;
    gap: var(--s-2);
  }
  .reviews-badge {
    font-size: 0.875rem;
    padding: var(--s-2) var(--s-4);
  }
}

/* ---------- 21. Hero price ribbon ----------
   Single line of price chips under the hero subtitle, above the CTAs.
   Editorial — small label-sized text with bullet separators, tabular numerals.
   Wraps on narrow viewports without crowding the headline. */
.hero__prices {
  margin-bottom: var(--s-6);
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  gap: var(--s-3);
  font-size: 0.9375rem;
  color: var(--text-1);
  line-height: 1.4;
  max-width: 64ch;
}
/* Tighten the gap between subtitle and prices: subtitle's own bottom-margin
   already provides breathing room, so the price ribbon doesn't need a top margin. */
.hero__sub + .hero__prices {
  margin-top: calc(var(--s-5) * -1);
}
.hero__prices > span {
  white-space: nowrap;
}
.hero__prices > span[aria-hidden] {
  color: var(--text-2);
  opacity: 0.6;
}
@media (max-width: 600px) {
  .hero__prices {
    font-size: 0.875rem;
    gap: var(--s-2);
  }
}

/* ---------- 22. Hero mini-form (3-chip quick-start) ----------
   Sits below the trust strip on the home hero. Three property-size chips
   that link into the wizard with ?property_type=… pre-set. The wizard
   handler reads the query, pre-selects the chip, and the auto-advance
   logic jumps the user past steps 1 and 2 to step 3 (area). */
.hero__mini-form {
  margin-top: var(--s-6);
  padding-top: var(--s-5);
  border-top: 1px solid var(--rule);
}
.hero__mini-form__heading {
  margin-bottom: var(--s-3);
  color: var(--text-2);
}
.hero__mini-form__chips {
  display: flex;
  flex-wrap: wrap;
  gap: var(--s-2);
}

/* ---------- 23. Chip — large variant ----------
   Extension of the existing .chip used in the quote wizard. Larger touch
   target, embedded price tag on the right, anchor (link) semantics for
   the mini-form rather than button semantics. */
.chip--lg {
  padding: var(--s-3) var(--s-5);
  font-size: 1rem;
  min-height: 48px;
  gap: var(--s-4);
  font-weight: 500;
  text-decoration: none;
}
.chip--lg:hover {
  background: var(--text-1);
  color: var(--surface);
  border-color: var(--text-1);
}
.chip__price {
  color: var(--accent);
  font-weight: 500;
  font-size: 0.9375rem;
}
.chip--lg:hover .chip__price {
  color: var(--surface);
}

/* ---------- 24. Sub-areas grid (per area page) ----------
   Replaces the inline comma-separated sub-area list with H3 sub-headings
   in a 3 / 2 / 1 column grid. Restrained — these are keyword-relevant
   text, not page headings. Border-led layout keeps visual rhythm calm. */
.sub-areas {
  margin-top: var(--s-7);
}
.sub-areas__intro {
  color: var(--text-2);
  font-size: 0.9375rem;
  margin-bottom: var(--s-4);
}
.sub-areas__grid {
  display: grid;
  grid-template-columns: 1fr;
  gap: var(--s-2);
}
@media (min-width: 600px) {
  .sub-areas__grid {
    grid-template-columns: 1fr 1fr;
  }
}
@media (min-width: 880px) {
  .sub-areas__grid {
    grid-template-columns: 1fr 1fr 1fr;
  }
}
.sub-area {
  font-family: var(--font-body);
  font-size: 0.9375rem;
  font-weight: 500;
  color: var(--text-1);
  letter-spacing: -0.005em;
  padding: var(--s-3) var(--s-4);
  background: var(--surface-2);
  border-radius: var(--r-sm);
  margin: 0;
  line-height: 1.4;
}

/* ---------- 25. Add-ons block ----------
   Compact "Common add-ons" list shown beneath pricing on home + area pages.
   Pre-empts the "you didn't tell me the oven was extra" objection. */
.addons-block {
  background: var(--surface-2);
  border-radius: var(--r-md);
  padding: var(--s-5) var(--s-6);
  max-width: 560px;
  margin: 0 auto;
}
.addons-block__heading {
  margin-bottom: var(--s-3);
  color: var(--text-2);
}
.addons-block__list {
  display: flex;
  flex-direction: column;
  gap: var(--s-2);
}
.addons-block__list li {
  display: flex;
  justify-content: space-between;
  gap: var(--s-4);
  font-size: 0.9375rem;
  color: var(--text-1);
  padding-block: var(--s-2);
  border-bottom: 1px solid var(--rule);
}
.addons-block__list li:last-child {
  border-bottom: 0;
}
.addons-block__price {
  color: var(--text-2);
  font-weight: 500;
  white-space: nowrap;
}

/* ---------- 26. Wizard — what-happens-next block ----------
   Reassurance below the submit button. Three numbered steps. */
.wizard__next-steps {
  margin-top: var(--s-6);
  padding: var(--s-5) var(--s-5);
  background: var(--surface-2);
  border-radius: var(--r-md);
}
.wizard__next-steps__heading {
  margin-bottom: var(--s-3);
  color: var(--text-2);
}
.wizard__next-steps__list {
  list-style: decimal;
  padding-left: var(--s-5);
  display: flex;
  flex-direction: column;
  gap: var(--s-2);
  font-size: 0.9375rem;
  color: var(--text-1);
  line-height: 1.55;
}
.wizard__next-steps__list li {
  padding-left: var(--s-2);
}

/* ---------- 27. Mobile hero — hide decorative photo aside below 600px ----------
   On iPhone SE width (375px), the hero is already tall with eyebrow + H1 +
   subtitle + price ribbon + 3 CTAs + trust strip + 3-chip mini-form. The
   decorative photo pushes the trust band well below the fold. Hide it on
   small viewports so the mini-form is the visual anchor and the trust band
   stays close to the CTAs. The photo remains on tablet and desktop. */
@media (max-width: 600px) {
  .hero .macro--photo {
    display: none;
  }
  .hero__sub + .hero__prices {
    margin-top: 0;
  }
}

/* ---------- 28. Blog index ----------
   List of posts on /blog.html. Stacked cards (no thumbnails, reading-flow). */
.blog-index {
  padding-block: var(--s-9);
}
@media (min-width: 768px) {
  .blog-index { padding-block: var(--s-10); }
}
.blog-index__list {
  display: flex;
  flex-direction: column;
  gap: var(--s-6);
}
.blog-card {
  background: var(--surface);
  border: 1px solid var(--rule);
  border-radius: var(--r-md);
  transition: border-color var(--dur-quick) var(--ease),
              transform var(--dur-quick) var(--ease),
              box-shadow var(--dur-quick) var(--ease);
}
.blog-card:hover {
  border-color: var(--text-1);
  transform: translateY(-2px);
  box-shadow: var(--shadow-hover);
}
.blog-card__link {
  display: block;
  padding: var(--s-6) var(--s-7);
  color: var(--text-1);
}
@media (max-width: 600px) {
  .blog-card__link { padding: var(--s-5); }
}
.blog-card__meta {
  margin-bottom: var(--s-3);
  color: var(--text-2);
}
.blog-card__title {
  font-family: var(--font-display);
  font-size: clamp(1.375rem, 2.4vw, 1.75rem);
  font-weight: 400;
  line-height: 1.2;
  letter-spacing: -0.012em;
  margin-bottom: var(--s-3);
  color: var(--text-1);
}
.blog-card__excerpt {
  color: var(--text-2);
  font-size: 1rem;
  line-height: 1.6;
  margin-bottom: var(--s-4);
  max-width: 64ch;
}
.blog-card__cta {
  display: inline-flex;
  align-items: center;
  gap: var(--s-2);
  font-size: 0.9375rem;
  font-weight: 500;
  color: var(--accent);
}
.blog-card:hover .blog-card__cta { gap: var(--s-3); }

/* ---------- 29. Post hero (smaller, reading-focused) ---------- */
.post-hero {
  padding-block: var(--s-9) var(--s-7);
}
@media (min-width: 768px) {
  .post-hero { padding-block: var(--s-10) var(--s-8); }
}
.post-hero__meta {
  margin-bottom: var(--s-4);
  color: var(--text-2);
}
.post-hero__headline {
  max-width: 26ch;
}
/* Default post hero is text-only, single column. When a heroImage is set on
   the post, the --with-image modifier flips to the standard 2-column page-hero
   layout (text left, image right) on desktop. Stacks on mobile. */
.post-hero .page-hero__inner {
  grid-template-columns: 1fr;
}
@media (min-width: 880px) {
  .post-hero .page-hero__inner--with-image {
    grid-template-columns: minmax(0, 1.4fr) minmax(0, 1fr);
    gap: var(--s-9);
    align-items: start;
  }
}
.post-hero__image {
  /* Slightly tighter aspect ratio than area page heroes; reads as
     editorial book-jacket rather than full landing-page hero */
  aspect-ratio: 4 / 5;
}
.post-hero__updated {
  margin-top: var(--s-5);
  color: var(--text-2);
  font-size: 0.875rem;
  display: inline-flex;
  align-items: center;
  gap: var(--s-2);
}
.post-hero__updated-label {
  color: var(--text-2);
}
.post-hero__updated time {
  color: var(--text-1);
  font-weight: 500;
}

/* ---------- 30. Post body — long-form typography ----------
   Single column, ~65ch max line length, generous leading. Heading ladder
   from h2 down. Lists, tables, blockquotes styled editorial. */
.post-body {
  padding-block: var(--s-7) var(--s-9);
}
@media (min-width: 768px) {
  .post-body { padding-block: var(--s-8) var(--s-10); }
}
.post-body__inner {
  font-size: 1.0625rem;
  line-height: 1.7;
  color: var(--text-1);
  max-width: 65ch;
  margin: 0 auto;
}
@media (min-width: 768px) {
  .post-body__inner { font-size: 1.125rem; }
}
.post-body__inner > * + * {
  margin-top: var(--s-5);
}
.post-body__inner > h2 + *,
.post-body__inner > h3 + * {
  margin-top: var(--s-4);
}
.post-body__inner h2 {
  font-family: var(--font-display);
  font-size: clamp(1.5rem, 2.6vw, 1.875rem);
  font-weight: 400;
  line-height: 1.2;
  letter-spacing: -0.012em;
  margin-top: var(--s-8);
  margin-bottom: var(--s-2);
  color: var(--text-1);
}
.post-body__inner h3 {
  font-family: var(--font-display);
  font-size: 1.25rem;
  font-weight: 500;
  line-height: 1.3;
  letter-spacing: -0.005em;
  margin-top: var(--s-6);
  margin-bottom: var(--s-2);
  color: var(--text-1);
}
.post-body__inner p {
  margin-bottom: 0;
}
.post-body__inner ul,
.post-body__inner ol {
  padding-left: var(--s-6);
  list-style: revert;
}
.post-body__inner ul li,
.post-body__inner ol li {
  margin-bottom: var(--s-2);
  padding-left: var(--s-2);
}
.post-body__inner ul li::marker { color: var(--accent); }
.post-body__inner ol li::marker { color: var(--accent); font-weight: 500; }
.post-body__inner strong {
  color: var(--text-1);
  font-weight: 500;
}
.post-body__inner a {
  color: var(--accent);
  border-bottom: 1px solid currentColor;
  padding-bottom: 1px;
  transition: color var(--dur-quick) var(--ease);
}
.post-body__inner a:hover {
  color: var(--accent-strong);
}
/* Markdown blockquotes are used as AEO callout boxes (Quick Answer, "In most
   Manchester rentals", landlord/agent callouts). Distinct visual treatment so
   AI engines and human scanners both spot them immediately. */
.post-body__inner blockquote {
  background: var(--accent-soft);
  border-left: 4px solid var(--accent);
  border-radius: var(--r-md);
  padding: var(--s-5) var(--s-6);
  margin-block: var(--s-6);
  font-style: normal;
  color: var(--text-1);
  font-size: 1rem;
  line-height: 1.65;
}
.post-body__inner blockquote > p {
  margin-bottom: var(--s-3);
}
.post-body__inner blockquote > p:last-child {
  margin-bottom: 0;
}
.post-body__inner blockquote strong:first-child {
  color: var(--accent);
  font-weight: 600;
  letter-spacing: -0.005em;
}
@media (max-width: 600px) {
  .post-body__inner blockquote {
    padding: var(--s-4) var(--s-5);
    font-size: 0.9375rem;
  }
}
.post-body__inner hr {
  border: 0;
  height: 1px;
  background: var(--rule);
  margin-block: var(--s-7);
}
.post-body__inner table {
  width: 100%;
  border-collapse: collapse;
  margin-block: var(--s-5);
  font-size: 0.9375rem;
  font-feature-settings: "tnum";
}
.post-body__inner thead th {
  text-align: left;
  border-bottom: 2px solid var(--text-1);
  padding: var(--s-3) var(--s-2);
  font-weight: 500;
  color: var(--text-1);
}
.post-body__inner tbody td {
  border-bottom: 1px solid var(--rule);
  padding: var(--s-3) var(--s-2);
  vertical-align: top;
}
.post-body__inner tbody tr:last-child td {
  border-bottom: 0;
}
@media (max-width: 600px) {
  /* Tables get hairy on phones — allow horizontal scroll instead. */
  .post-body__inner table {
    display: block;
    overflow-x: auto;
    white-space: nowrap;
  }
}
.post-body__inner code {
  font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
  font-size: 0.875em;
  background: var(--surface-2);
  padding: 2px 6px;
  border-radius: 4px;
}
/* First paragraph (the Quick Answer) gets lede weight */
.post-body__inner > p:first-child {
  font-size: 1.125rem;
  line-height: 1.6;
  color: var(--text-1);
}
@media (min-width: 768px) {
  .post-body__inner > p:first-child { font-size: 1.1875rem; }
}

/* ---------- 31. Post CTA + cross-link grid ---------- */
.post-cta {
  padding-block: var(--s-8);
}
.post-cta__inner {
  text-align: center;
  max-width: 60ch;
  margin: 0 auto;
}
.post-cta__inner .copy__label { margin-bottom: var(--s-3); }
.post-cta__inner .copy__heading { margin-bottom: var(--s-4); }
.post-cta__inner .body {
  margin-bottom: var(--s-6);
  margin-left: auto;
  margin-right: auto;
}
.post-cta__actions {
  display: flex;
  gap: var(--s-3);
  justify-content: center;
  flex-wrap: wrap;
}

.post-more {
  padding-block: var(--s-8) var(--s-9);
}
.post-more__heading {
  margin-bottom: var(--s-6);
}
.post-more__grid {
  display: grid;
  grid-template-columns: 1fr;
  gap: var(--s-4);
}
@media (min-width: 768px) {
  .post-more__grid { grid-template-columns: 1fr 1fr 1fr; gap: var(--s-5); }
}
.post-more__card {
  display: flex;
  flex-direction: column;
  gap: var(--s-3);
  padding: var(--s-5);
  background: var(--surface);
  border: 1px solid var(--rule);
  border-radius: var(--r-md);
  color: var(--text-1);
  transition: border-color var(--dur-quick) var(--ease),
              transform var(--dur-quick) var(--ease);
}
.post-more__card:hover {
  border-color: var(--text-1);
  transform: translateY(-2px);
}
.post-more__card .label { color: var(--text-2); }
.post-more__card h3 {
  font-family: var(--font-display);
  font-size: 1.0625rem;
  font-weight: 500;
  line-height: 1.3;
  letter-spacing: -0.005em;
  color: var(--text-1);
}
.post-more__cta {
  display: inline-flex;
  align-items: center;
  gap: var(--s-2);
  font-size: 0.875rem;
  font-weight: 500;
  color: var(--accent);
  margin-top: auto;
}


/* ---------- 32. Wizard photos + summary + success ----------
   Wizard expansion: optional photo upload step (4), summary card
   at the top of the contact step (5), and the post-submit success
   card that replaces the form contents on a successful POST. */

.wizard__sub {
  color: var(--text-2);
  max-width: 56ch;
  margin-bottom: var(--s-6);
  font-size: 0.9375rem;
  line-height: 1.6;
}

.wizard__photos {
  display: flex;
  flex-direction: column;
  gap: var(--s-4);
  margin-bottom: var(--s-5);
}

.wizard__photo-input {
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: var(--s-2);
  padding: var(--s-6) var(--s-5);
  border: 2px dashed var(--rule);
  border-radius: var(--r-md);
  background: var(--surface);
  cursor: pointer;
  text-align: center;
  transition: border-color var(--dur-quick) var(--ease),
              background var(--dur-quick) var(--ease);
}
.wizard__photo-input:hover {
  border-color: var(--accent);
  background: var(--surface-2);
}
.wizard__photo-input:focus-within {
  outline: none;
  border-color: var(--accent);
  box-shadow: var(--shadow-focus);
}
.wizard__photo-input.is-compressing {
  pointer-events: none;
  opacity: 0.75;
  border-style: solid;
  border-color: var(--accent);
  cursor: progress;
}
.wizard__photo-input.is-compressing .wizard__photo-input__primary {
  color: var(--accent);
  font-variant-numeric: tabular-nums;
}

.wizard__photo-input__icon {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 48px;
  height: 48px;
  border-radius: 50%;
  background: var(--accent-soft);
  color: var(--accent);
  margin-bottom: var(--s-2);
}

.wizard__photo-input__primary {
  font-size: 1rem;
  font-weight: 500;
  color: var(--text-1);
}

.wizard__photo-input__hint {
  font-size: 0.8125rem;
  color: var(--text-2);
  font-variant-numeric: tabular-nums;
}

.wizard__photo-list {
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  gap: var(--s-3);
  list-style: none;
  padding: 0;
  margin: 0;
}
@media (min-width: 600px) {
  .wizard__photo-list { grid-template-columns: repeat(3, 1fr); }
}

.wizard__photo-thumb {
  position: relative;
  aspect-ratio: 1 / 1;
  border-radius: var(--r-md);
  overflow: hidden;
  background: var(--surface-2);
}
.wizard__photo-thumb img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
}

.wizard__photo-remove {
  position: absolute;
  top: var(--s-2);
  right: var(--s-2);
  width: 28px;
  height: 28px;
  border-radius: 50%;
  background: rgba(20, 20, 20, 0.75);
  color: #fff;
  border: none;
  cursor: pointer;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  transition: background var(--dur-quick) var(--ease);
}
.wizard__photo-remove:hover { background: rgba(20, 20, 20, 0.95); }
.wizard__photo-remove:focus-visible {
  outline: none;
  box-shadow: var(--shadow-focus);
}

/* ---------- Summary card on step 5 ---------- */
.wizard__summary {
  padding: var(--s-5);
  background: var(--surface-2);
  border-radius: var(--r-md);
  margin-bottom: var(--s-6);
}
.wizard__summary__heading {
  margin: 0 0 var(--s-3);
}
.wizard__summary__list {
  display: flex;
  flex-direction: column;
  gap: var(--s-2);
  font-size: 0.9375rem;
  list-style: none;
  padding: 0;
  margin: 0;
}
.wizard__summary__list li {
  display: flex;
  justify-content: space-between;
  align-items: center;
  gap: var(--s-3);
  color: var(--text-1);
}
.wizard__summary__edit {
  background: none;
  border: none;
  padding: 0;
  cursor: pointer;
  color: var(--accent);
  font-size: 0.875rem;
  font-weight: 500;
  text-decoration: none;
}
.wizard__summary__edit:hover { text-decoration: underline; }
.wizard__summary__edit:focus-visible {
  outline: none;
  box-shadow: var(--shadow-focus);
  border-radius: var(--r-sm);
}

/* ---------- Success card ---------- */
.wizard__success {
  padding: var(--s-7) var(--s-5);
  text-align: center;
}

.wizard__success__icon {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 72px;
  height: 72px;
  border-radius: 50%;
  background: var(--accent-soft);
  color: var(--accent);
  margin: 0 auto var(--s-5);
}

.wizard__success__headline {
  font-family: var(--font-display);
  font-size: 2rem;
  line-height: 1.15;
  color: var(--text-1);
  margin: 0 0 var(--s-4);
}
.wizard__success__headline:focus { outline: none; }

.wizard__success__lede {
  color: var(--text-2);
  max-width: 50ch;
  margin: 0 auto var(--s-7);
  font-size: 1rem;
  line-height: 1.6;
}

.wizard__success__section {
  text-align: left;
  max-width: 460px;
  margin: 0 auto var(--s-6);
}
.wizard__success__section .label {
  margin-bottom: var(--s-3);
}

.wizard__success__section--summary {
  background: var(--surface-2);
  padding: var(--s-4) var(--s-5);
  border-radius: var(--r-sm);
}

.wizard__success__summary {
  font-size: 1rem;
  line-height: 1.6;
  color: var(--text-1);
  margin: 0;
}

.wizard__success__steps {
  padding-left: var(--s-5);
  margin: 0;
  display: flex;
  flex-direction: column;
  gap: var(--s-2);
  color: var(--text-1);
  line-height: 1.5;
}

.wizard__success__actions {
  display: flex;
  flex-wrap: wrap;
  gap: var(--s-3);
}

.wizard__success__followup {
  color: var(--text-2);
  font-size: 0.875rem;
  max-width: 50ch;
  margin: 0 auto;
  text-align: center;
}
.wizard__success__followup a {
  color: var(--accent);
  text-decoration: underline;
}


/* ---------- 32b. Wizard notes textarea ----------
   Optional free-text notes field on step 5. Sits below the contact
   inputs as a full-width row regardless of the 2-col layout above. */

.field.field--full {
  grid-column: 1 / -1;
  margin-bottom: var(--s-5);
}

.field__input--textarea {
  min-height: 96px;
  line-height: 1.5;
  resize: vertical;
  font-family: inherit;
}

.field__label-optional {
  font-weight: 400;
  text-transform: none;
  letter-spacing: 0;
  color: var(--text-2);
  font-size: 0.75rem;
  margin-left: var(--s-2);
}

/* ----------------------------------------------------------------
   Inline editorial CTA
   Used on area pages (after each deepContent H2 sub-section) and in
   blog posts (injected at natural breakpoints). Text-link style with
   an arrow that nudges on hover. Uses existing accent + soft tokens;
   no new design tokens introduced. The wrap centres the CTA in its
   own vertical rhythm so it doesn't fight the prose around it.
   ---------------------------------------------------------------- */
.inline-cta-wrap {
  margin: var(--s-7) 0;
  text-align: left;
}
.inline-cta {
  display: inline-flex;
  align-items: center;
  gap: 0.5em;
  font-size: 1.0625rem;
  font-weight: 500;
  color: var(--accent);
  text-decoration: none;
  padding-bottom: 0.2em;
  border-bottom: 2px solid var(--accent-soft);
  transition: border-color var(--dur-quick) var(--ease), color var(--dur-quick) var(--ease);
}
.inline-cta:hover,
.inline-cta:focus {
  border-bottom-color: var(--accent);
  outline: none;
}
.inline-cta:focus-visible {
  outline: 2px solid var(--accent);
  outline-offset: 4px;
  border-radius: 2px;
}
.inline-cta__arrow {
  display: inline-block;
  transition: transform var(--dur-quick) var(--ease);
  font-variant-numeric: tabular-nums;
}
.inline-cta:hover .inline-cta__arrow {
  transform: translateX(3px);
}
@media (prefers-reduced-motion: reduce) {
  .inline-cta__arrow,
  .inline-cta {
    transition: none;
  }
}

/* ---- Mobile-first layout refinements (June 2026) ---- */

/* Four-card pricing summary: 4-up desktop, 2x2 on mobile.
   minmax(0, 1fr) lets cards shrink below their min-content width;
   without it the 3rem price text forces the second column past the
   container edge on phones. */
.tertiary__features--quad { grid-template-columns: repeat(4, minmax(0, 1fr)); }
.tertiary__features--quad .tertiary__features__caption,
.tertiary__features--quad .tertiary__features__sub { text-align: center; }
@media (max-width: 900px) {
  .tertiary__features--quad { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--s-4); }
  .tertiary__features--quad .tertiary__features__media { padding: var(--s-5) !important; }
  .tertiary__features--quad .display { font-size: 2rem !important; }
}

/* Two-card includes section: side by side at every width */
.tertiary__features--duo { grid-template-columns: repeat(2, minmax(0, 1fr)); }
@media (max-width: 768px) {
  .tertiary__features--duo { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--s-4); }
}

/* Mid-page quote links */
.inline-cta-block { text-align: center; padding-bottom: var(--s-8); }

/* Areas grid: collapse past six entries on small screens only */
.areas__toggle { display: none; }
@media (max-width: 599px) {
  .areas__list[data-collapsed] .areas__item:not(.areas__item--featured) { display: none; }
  .areas__toggle { display: inline-flex; margin-top: var(--s-5); }
}

/* ---- Wizard mobile compaction (June 2026) ----
   Target: every step at or near one phone screen. The furniture was
   sized for desktop generosity; on mobile it forced 1.3 to 1.6 screens
   per step and constant scroll correction. */
@media (max-width: 768px) {
  .wizard { padding-block: var(--s-7); }
  .wizard__chips { gap: 6px; margin-bottom: var(--s-5); }
  .wizard__chips .chip { padding: var(--s-2) var(--s-4); font-size: 0.875rem; }
  .wizard__chips--stacked .chip,
  .wizard__chips .chip--block { padding: var(--s-3) var(--s-4); }
  .chip--block .chip__sub { font-size: 0.8125rem; line-height: 1.35; }
  .wizard__price-reveal { margin-top: var(--s-4); padding: var(--s-4) var(--s-5); }
}

/* ---- Wizard structural mobile fixes (June 2026, round 2) ---- */

/* Sticky action bar: Continue/Back pin to the viewport bottom inside the
   wizard, so tall steps never need a scroll-to-advance. Mobile only. */
@media (max-width: 768px) {
  .wizard__actions {
    position: sticky;
    bottom: 0;
    z-index: 5;
    flex-wrap: wrap;
    justify-content: center;
    gap: var(--s-7);
    background: var(--surface-2);
    border-top: 1px solid var(--rule);
    padding: var(--s-3) 0 max(var(--s-3), env(safe-area-inset-bottom));
    margin-top: var(--s-4);
  }
  .wizard__actions .wizard__photo-skip { flex-basis: 100%; text-align: center; margin-top: var(--s-2); }
}

/* Area chips: featured six + "All areas" expander on mobile; desktop shows
   everything and never sees the toggle. */
.wizard__chips-toggle { display: none; }
@media (max-width: 768px) {
  .wizard__chips--collapsible:not(.wizard__chips--expanded) .chip--more { display: none; }
  .wizard__chips--collapsible:not(.wizard__chips--expanded) .wizard__chips-toggle { display: inline-flex; color: var(--accent); border-style: dashed; }
}

/* Step 6 summary: heading + total always visible; the row list collapses
   on mobile behind the Show details toggle. */
.wizard__summary__toggle { display: none; }
@media (max-width: 768px) {
  .wizard__summary__toggle {
    display: inline-block;
    background: none;
    border: none;
    padding: 0;
    margin: var(--s-2) 0 0;
    font-size: 0.875rem;
    color: var(--accent);
    text-decoration: underline;
    text-underline-offset: 3px;
    cursor: pointer;
  }
  .wizard__summary:not(.wizard__summary--expanded) .wizard__summary__list { display: none; }
}

/* Notes field starts compact, grows on focus */
@media (max-width: 768px) {
  #contactNotes { min-height: 56px; transition: min-height 0.15s ease; }
  #contactNotes:focus { min-height: 112px; }
}

/* Consent modules: the long retract email cannot wrap by default and
   forces the box past the viewport edge on phones. */
.wizard__consent { min-width: 0; }
.wizard__consent .field__label,
.wizard__consent p { overflow-wrap: anywhere; }

/* Consent modules on mobile: tick centred ABOVE the text so the copy gets
   the full width of the box instead of being squeezed beside the checkbox. */
@media (max-width: 768px) {
  .wizard__consent__label { flex-direction: column; align-items: center; gap: var(--s-3); }
  .wizard__consent__label input[type="checkbox"] { width: 24px; height: 24px; margin: 0; flex-shrink: 0; }
  .wizard__consent__text { width: 100%; }
}
