/* ==========================================================================
   Davidov & Cohen Law — dcnyclaw.com
   Design tokens + component styles
   ========================================================================== */

:root {
  /* Surfaces */
  --cream: #faf9f6;
  --white: #fff;
  --line: #e5e1d8;
  --line-soft: #d9d5ca;

  /* Ink */
  --ink: #232823;
  --ink-head: #14211b;
  --ink-body: #4c534d;
  --ink-muted: #5a6058;
  --ink-faint: #8a8f88;

  /* Green */
  --green: #1e5c40;
  --green-mid: #2e7d54;
  --green-dark: #15442f;
  --green-darker: #143f2c;
  --green-deep: #14211b;
  --green-light: #9fc7ad;
  --green-hover: #7fc49d;

  /* Gold */
  --gold: #a8863c;
  --gold-light: #c9a54c;
  --gold-bright: #e8c979;
  --gold-dark: #8a6a1a;
  --star: #f5b301;

  /* Gradients */
  --grad-green: linear-gradient(135deg, var(--green-mid), var(--green-dark));
  --grad-gold: linear-gradient(90deg, var(--gold-light), var(--gold-dark));

  /* Type */
  --serif: 'Source Serif 4', Georgia, serif;
  --sans: 'Public Sans', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;

  /* Layout */
  --wrap: 1200px;
  --wrap-wide: 1280px;
  --gutter: clamp(20px, 3.5vw, 48px);
  --header-h: 83px;
}

/* ---------- Base ---------- */

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

body {
  margin: 0;
  background: var(--cream);
  font-family: var(--sans);
  color: var(--ink);
  -webkit-font-smoothing: antialiased;
}

a { color: var(--green); text-decoration: none; }
a:hover { color: var(--green-darker); }

img, video { max-width: 100%; }

h1, h2, h3 { font-family: var(--serif); font-weight: 600; color: var(--ink-head); }

section { position: relative; overflow: hidden; }

.wrap { position: relative; max-width: var(--wrap); margin: 0 auto; padding: 0 var(--gutter); }
.wrap--wide { max-width: var(--wrap-wide); }

/* Once the viewport is wide enough that max-width alone leaves a comfortable
   margin, drop the gutter so sections get their full content width back.
   Below these thresholds the gutter is what keeps text off the screen edge. */
@media (min-width: 1296px) {
  .wrap { padding-left: 0; padding-right: 0; }
  .wrap--wide { padding-left: var(--gutter); padding-right: var(--gutter); }
}
@media (min-width: 1376px) {
  .wrap--wide { padding-left: 0; padding-right: 0; }
}

/* The 1200px cap was drawn for a ~1280px screen. On anything larger it stops
   being a max-width and starts being dead margin — 240px a side at 1680px.
   Let the container grow with the viewport instead, still bounded so it never
   sprawls on an ultrawide. */
@media (min-width: 1400px) {
  :root { --wrap: min(1600px, 88vw); --wrap-wide: min(1680px, 92vw); }
}

/* Set by the inline script in <head>, cleared the moment the hero timeline is
   built (or by its own failsafe). Hiding these in the stylesheet rather than
   from deferred JS is what stops the copy painting once before it animates. */
.anim-pending .hero .kicker,
.anim-pending .hero h1,
.anim-pending .hero-copy p,
.anim-pending .hero-actions a,
.anim-pending #practice-title,
.anim-pending .practice-head p { opacity: 0; }
.anim-pending .practice-head .rule { transform: scaleX(0); }

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

/* Decorative halftone dot field used across sections */
.dots {
  position: absolute; inset: 0; pointer-events: none;
}

/* ---------- Shared type ---------- */

.kicker {
  font-size: 12.5px; font-weight: 700; letter-spacing: .12em;
  text-transform: uppercase; color: var(--gold); margin-bottom: 14px;
}
.kicker--light { color: var(--gold-light); }
.kicker--bright { color: var(--gold-bright); }
.kicker--green { color: var(--green); font-size: 13px; letter-spacing: .14em; }

.rule {
  width: 44px; height: 3px; background: var(--grad-gold);
}
.rule--green { background: var(--grad-green); }

.section-title {
  font-size: clamp(32px, 4vw, 48px); line-height: 1.12;
  margin: 0 0 16px; text-wrap: balance;
}
.section-lede {
  font-size: clamp(16px, 1.6vw, 19px); line-height: 1.6;
  color: var(--ink-body); margin: 0;
}

/* ---------- Buttons ---------- */

.btn {
  display: inline-block; font-weight: 600; border-radius: 6px;
  white-space: nowrap; font-family: inherit; cursor: pointer;
  border: none; transition: box-shadow .3s ease, background .25s ease, color .25s ease;
}

.btn--primary {
  background: var(--grad-green); color: var(--white);
  box-shadow: 0 3px 12px rgba(30, 92, 64, .3);
}
.btn--primary:hover { color: var(--white); box-shadow: 0 6px 18px rgba(30, 92, 64, .45); }

.btn--solid {
  background: var(--green-dark); color: var(--white); border-radius: 8px;
}
.btn--solid:hover { background: var(--green); color: var(--white); }

.btn--ghost {
  border: 1.5px solid var(--green); color: var(--green); background: transparent;
}
.btn--ghost:hover { background: var(--green); color: var(--white); }

.btn--outline {
  border: 1.5px solid #c9c4b8; color: var(--ink-head); font-weight: 700;
}
.btn--outline:hover { border-color: var(--green); color: var(--green); }

.btn--white {
  background: var(--white); color: var(--green-dark); font-weight: 700; border-radius: 8px;
}
.btn--white:hover { background: #f0ede4; color: var(--green-dark); }

.btn--lg { font-size: 16px; padding: 16px 32px; }
.btn--md { font-size: 15px; padding: 14px 28px; }
.btn--sm { font-size: 14.5px; padding: 12px 26px; }

.link-arrow { font-weight: 600; font-size: 15px; }

/* ==========================================================================
   Header
   ========================================================================== */

.site-header {
  position: fixed; top: 0; left: 0; right: 0; z-index: 50;
  background: rgba(250, 249, 246, .94);
  /* Safari did not ship unprefixed backdrop-filter until 18. Without the
     -webkit- pair the header does not frost on iOS 16/17 — the 94% opaque
     background keeps it legible either way, but the frost is the intended
     look and the codebase already pairs them on the figcaption. */
  -webkit-backdrop-filter: blur(10px);
  backdrop-filter: blur(10px);
  border-bottom: 1px solid var(--line);
  box-shadow: none;
  transition: box-shadow .35s ease;
}
.site-header.is-scrolled { box-shadow: 0 12px 40px rgba(20, 33, 27, .14); }

.header-inner {
  max-width: var(--wrap); margin: 0 auto;
  padding: 14px var(--gutter);
  display: flex; align-items: center; gap: clamp(12px, 1.6vw, 32px);
}

/* The wordmark carries a fine-serif tagline that turns to mush below ~48px,
   so the logo gets first claim on the header's width. */
.header-logo { flex: none; }
/* Only the preferred and maximum values grow. The 46px floor is load-bearing:
   the mark is 4.5:1, so every pixel of height costs 4.5 of width, and at 375px
   the row has about 15px to spare once the phone glyph and the toggle are in.
   4.8vw does not pass 46px until ~958px, which is above the point the nav
   collapses to the toggle, so nothing below desktop changes at all. */
.header-logo img { height: clamp(52px, 4.8vw, 60px); width: auto; display: block; }

/* Bare phone glyph — replaces the spelled-out number where space is tight.
   No chrome, so the box stays only as a 44px touch target. */
.header-call {
  display: none; flex: none;
  width: 44px; height: 44px;
  background: none; border: 0; color: var(--green);
  align-items: center; justify-content: center;
}
.header-call:hover { color: var(--green-mid); }

.nav {
  display: flex; align-items: center; gap: clamp(12px, 1.5vw, 24px);
  flex: 1; justify-content: center;
  font-size: 14.5px; font-weight: 500; white-space: nowrap;
}
/* :not(.menu-cta) so this doesn't outrank .btn--white on the menu's CTA */
.nav > a:not(.menu-cta), .nav-trigger { color: var(--ink); }
.nav > a:not(.menu-cta):hover, .nav-trigger:hover { color: var(--green); }

/* Both live inside the mobile menu only — the desktop bar has its own CTA
   and already shows the phone number as text */
.menu-cta, .menu-call { display: none; }

.header-phone {
  font-weight: 700; font-size: 15px; color: var(--green-dark);
  white-space: nowrap; padding: 8px 10px; border-radius: 6px; flex: none;
}
.header-cta { font-size: 14px; padding: 11px 20px; flex: none; box-shadow: 0 2px 8px rgba(30, 92, 64, .25); }

/* Between the mobile breakpoint and full desktop there isn't room for both
   calls to action — the phone number wins, since it converts directly. */
@media (max-width: 1120px) and (min-width: 901px) {
  .header-cta { display: none; }
}

/* Practice-areas mega menu */
.nav-drop { position: relative; }
.nav-trigger { display: inline-block; }

.mega {
  position: absolute; top: 100%; left: 50%;
  transform: translateX(-50%) translateY(6px);
  opacity: 0; pointer-events: none;
  transition: opacity .22s ease, transform .22s ease;
  background: var(--white); border: 1px solid var(--line);
  border-radius: 12px; box-shadow: 0 20px 50px rgba(20, 33, 27, .16);
  padding: 22px 26px; width: 640px; z-index: 60;
}
.nav-drop:hover .mega, .nav-drop:focus-within .mega, .mega.is-open {
  opacity: 1; pointer-events: auto; transform: translateX(-50%) translateY(0);
}
.mega-title {
  font-size: 11.5px; font-weight: 700; letter-spacing: .1em;
  text-transform: uppercase; color: var(--gold); margin-bottom: 12px;
}
.mega-grid {
  display: grid; grid-template-columns: repeat(3, 1fr);
  gap: 6px 20px; font-size: 13.5px;
}
.mega-grid a { color: #3e453f; padding: 5px 0; }
.mega-grid a:hover { color: var(--green); }

/* Mobile nav toggle */
/* Bare rule lines — the 44px box is only there as a touch target */
.nav-toggle {
  display: none; flex: none; width: 44px; height: 44px;
  border: 0; background: none; cursor: pointer;
  align-items: center; justify-content: center;
  color: var(--green);
}
.nav-toggle:hover { color: var(--green-mid); }
.nav-toggle span {
  display: block; width: 24px; height: 2px; background: currentColor;
  position: relative;
}
.nav-toggle span::before, .nav-toggle span::after {
  content: ''; position: absolute; left: 0; width: 24px; height: 2px;
  background: currentColor;
}
.nav-toggle span::before { top: -7px; }
.nav-toggle span::after { top: 7px; }

/* ==========================================================================
   Hero
   ========================================================================== */

.hero { background: var(--cream); }

.hero-media { position: absolute; left: 0; right: 0; top: var(--header-h); bottom: 0; }
.hero-media video {
  width: 100%; height: 100%; object-fit: cover;
  /* Anchoring to the top wasted 9.8% of the frame on empty facade above their
     heads while cutting the bottom 35%. Nudging down trades that headroom for
     more of the attorneys; 22% keeps ~2% clearance above the hair. */
  object-position: center 22%; display: block;
}
.hero-scrim {
  position: absolute; inset: 0; pointer-events: none;
  background: linear-gradient(90deg,
    rgba(250, 249, 246, .88) 0%,
    rgba(250, 249, 246, .55) 34%,
    rgba(250, 249, 246, 0) 52%);
}

.hero-grid {
  position: relative; max-width: var(--wrap); margin: 0 auto;
  padding: 0 var(--gutter);
  display: grid; grid-template-columns: 1.1fr .9fr; gap: 40px; align-items: end;
}
.hero-copy { padding: 170px 0; }
.hero-spacer { min-height: 600px; }

/* Taller hero = less of the clip cropped away vertically, so more of the
   attorneys shows without pushing their heads toward the header. Desktop only:
   the mobile hero sizes its clip by aspect-ratio and a floor here would just
   add empty space under the buttons. */
@media (min-width: 901px) {
  /* align-items on .hero-grid defaults to end, which would dump every pixel
     of that min-height above the copy — centring splits it instead. */
  .hero-grid { min-height: min(84vh, 820px); align-items: center; }
  .hero-copy { padding: 140px 0; }
}

.hero h1 {
  font-size: clamp(34px, 4.6vw, 52px); line-height: 1.12;
  margin: 0 0 22px; text-wrap: balance;
}
.hero p {
  font-size: 18px; line-height: 1.65; color: var(--ink-body);
  margin: 0 0 34px; max-width: 52ch;
}
.hero-actions { display: flex; gap: 16px; align-items: center; flex-wrap: wrap; }

/* ==========================================================================
   Practice areas
   ========================================================================== */

#practice {
  background: var(--white);
  border-top: 1px solid var(--line); border-bottom: 1px solid var(--line);
}
#practice .dots {
  background:
    repeating-radial-gradient(circle at 118% -30%, transparent 0 34px, rgba(30, 92, 64, .10) 34px 36px),
    repeating-radial-gradient(circle at -18% 112%, transparent 0 42px, rgba(30, 92, 64, .08) 42px 44px);
  -webkit-mask-image: linear-gradient(120deg, #000 0%, transparent 44%, transparent 60%, #000 100%);
  mask-image: linear-gradient(120deg, #000 0%, transparent 44%, transparent 60%, #000 100%);
}

/* Vertical only — these sit on the same element as .wrap, so using the padding
   shorthand here would wipe out its horizontal gutter. */
.section-pad { padding-top: 88px; padding-bottom: 96px; }
.section-pad--lg { padding-top: 96px; padding-bottom: 92px; }

.practice-head { max-width: 640px; margin: 0 auto 40px; text-align: center; }
.practice-head .rule { margin: 0 auto 20px; transform: scaleX(0); }

/* Alternating video + copy rows */
.pillar {
  display: grid; align-items: center; gap: 40px; margin: 0 0 64px;
}
.pillar--media-left { grid-template-columns: 1.45fr 1fr; }
.pillar--media-right { grid-template-columns: 1.25fr 1.2fr; }
.pillar:first-of-type { margin-top: 8px; }
.pillar:last-of-type { margin-bottom: 0; }

.pillar video {
  width: 100%; display: block;
  mix-blend-mode: multiply;
  -webkit-mask-image: radial-gradient(ellipse 68% 64% at 50% 52%, #000 55%, transparent 88%);
  mask-image: radial-gradient(ellipse 68% 64% at 50% 52%, #000 55%, transparent 88%);
}
/* The white key is baked into practice-crash.mp4 now. It used to be an SVG
   filter: url(#whitekey), which Safari does not reliably apply to a <video>
   that is also blended and masked — so the clip's checkerboard backdrop showed
   through there while Chrome keyed it out. mix-blend-mode below drops the flat
   white in every browser. */
.pillar video.is-crash { transform: scale(1.12); }
.pillar video.is-work { transform: scale(1.25); }

.pillar-copy--inset { padding-left: 110px; }
.pillar h3 {
  font-size: clamp(24px, 2.8vw, 32px); line-height: 1.2; margin: 0 0 14px;
}
.pillar p {
  font-size: 15.5px; line-height: 1.65; color: var(--ink-body); margin: 0 0 22px;
}

/* "We also handle" panel */
.also {
  margin: 72px 0 0; background: var(--grad-green);
  border-radius: 14px; padding: 52px 56px 48px;
  box-shadow: 0 12px 36px rgba(21, 68, 47, .25);
}
.also-title {
  font-family: var(--serif); font-weight: 600; font-size: 26px;
  color: var(--white); margin-bottom: 28px;
}
.also-grid {
  display: grid; grid-template-columns: repeat(4, 1fr);
  gap: 14px 32px; font-size: 15.5px;
}
.also-item {
  display: flex; align-items: center; gap: 10px; color: #eef4ee;
}
.also-item span { color: var(--gold-bright); flex: none; }

.also-foot {
  display: flex; align-items: center; justify-content: space-between;
  gap: 32px; flex-wrap: wrap;
  border-top: 1px solid rgba(255, 255, 255, .16);
  margin-top: 36px; padding-top: 32px;
}
.also-foot p {
  font-family: var(--serif); font-weight: 600; font-size: 28px;
  line-height: 1.25; color: var(--white); text-wrap: balance; margin: 0;
}
.also-foot .btn { font-size: 18px; padding: 16px 34px; }

/* ==========================================================================
   Prior results
   ========================================================================== */

/* Also #pa-results / #pa-reviews: the practice-area copies of these sections
   carry a pa- prefix so their ids do not collide with the homepage anchors the
   nav points at. Without these the deep-green base never applied and the
   section rendered as washed-out grey. */
#results,
#pa-results { background: linear-gradient(160deg, var(--green-deep) 0%, var(--green-dark) 100%); }

.results-media { position: absolute; inset: 0; pointer-events: none; overflow: hidden; }
/* Sits behind three paragraphs of body copy — dropped from .34 so the motion
   reads as texture rather than something competing for attention. */
.results-media video,
/* Practice-area pages use a still frame instead of the clip. The video is
   12.6MB, and pulling it onto 22 more routes was not worth the motion. */
.results-media img { width: 100%; height: 100%; object-fit: cover; opacity: .26; }
.results-media::after {
  content: ''; position: absolute; inset: 0;
  background: linear-gradient(160deg, rgba(20, 33, 27, .55) 0%, rgba(21, 68, 47, .6) 100%);
}

.results-grid {
  display: grid; grid-template-columns: 1fr 1.6fr; gap: 64px; align-items: start;
}
.results-grid h2 {
  font-size: clamp(36px, 4.8vw, 56px); line-height: 1.12;
  color: var(--white); margin: 0 0 24px; text-wrap: balance;
}
.results-grid .rule { background: linear-gradient(90deg, var(--gold-light), var(--gold-dark)); }
.results-body {
  font-size: 16.5px; line-height: 1.8; color: #d7ded8;
  border-left: 1px solid rgba(201, 165, 76, .35); padding-left: 44px;
}
/* max-width holds a readable measure once the container grows past 1200 */
.results-body p { margin: 0 0 20px; max-width: 68ch; }
.results-body p:last-child { margin: 0; }

/* ==========================================================================
   Reviews
   ========================================================================== */

#reviews,
#pa-reviews { background: var(--cream); border-bottom: 1px solid var(--line); }
#reviews .dots,
#pa-reviews .dots {
  background: repeating-radial-gradient(circle at 112% -25%, transparent 0 36px, rgba(30, 92, 64, .08) 36px 38px);
  -webkit-mask-image: linear-gradient(220deg, #000 0%, transparent 45%);
  mask-image: linear-gradient(220deg, #000 0%, transparent 45%);
}

.reviews-head {
  display: grid; grid-template-columns: 1fr auto;
  align-items: end; gap: 40px; margin-bottom: 56px;
}
.reviews-head h2 { font-size: clamp(32px, 4vw, 48px); line-height: 1.12; margin: 0; text-wrap: balance; }

.google-badge {
  background: var(--white); border: 1px solid var(--line); border-radius: 14px;
  padding: 22px 30px; display: flex; align-items: center; gap: 20px;
  box-shadow: 0 10px 30px rgba(20, 33, 27, .06);
}
.google-wordmark { font-size: 21px; font-weight: 600; letter-spacing: -.01em; }
.google-divider { width: 1px; height: 40px; background: var(--line); }
.google-score {
  font-family: var(--serif); font-size: 26px; font-weight: 600; color: var(--ink-head);
}
.stars { color: var(--star); letter-spacing: 2px; }

/* auto-fit rather than three fixed columns: the live feed returns up to five
   cards and the count can change, so the track count has to follow the content */
.reviews-grid {
  display: grid; gap: 24px; align-items: stretch;
  grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
}

.review {
  /* blockquote carries a UA default of `margin: 1em 40px` — left alone it eats
     80px out of every card's width and inflates the gaps between them. */
  margin: 0;
  background: var(--white); border: 1px solid var(--line); border-radius: 14px;
  padding: 34px 34px 30px; display: flex; flex-direction: column;
  transition: border-color .25s ease, box-shadow .25s ease;
}
.review:hover { border-color: var(--green); box-shadow: 0 10px 30px rgba(20, 33, 27, .08); }
.review .quote-mark {
  font-family: var(--serif); font-size: 60px; line-height: .6;
  color: var(--gold-light); margin: 8px 0 16px;
}
.review p { font-size: 15.5px; line-height: 1.7; color: #3e453f; margin: 0 0 22px; flex: 1; }

/* No drop shadow: a tinted glow under one card in a row of flat ones read as a
   halo rather than depth. The dark fill already sets it apart. */
.review--feature {
  background: linear-gradient(160deg, var(--green), var(--green-dark));
  border: none; padding: 40px 42px;
  box-shadow: none;
}
.review--feature:hover { box-shadow: none; }
.review--feature .quote-mark { font-size: 76px; margin: 10px 0 18px; }
.review--feature p {
  font-family: var(--serif); font-size: 21px; line-height: 1.55; color: var(--white); margin: 0 0 26px;
}

.review-author { display: flex; align-items: center; gap: 12px; }
.review--feature .review-author { gap: 14px; }
.avatar {
  width: 40px; height: 40px; border-radius: 50%;
  display: flex; align-items: center; justify-content: center;
  font-weight: 700; font-size: 15px; color: var(--white); flex: none;
}
.review--feature .avatar {
  width: 44px; height: 44px; font-size: 16px;
  background: var(--gold-light); color: var(--green-deep);
}
.avatar--green { background: var(--green); }
.avatar--gold { background: var(--gold); }
.review-meta { font-size: 12.5px; color: var(--ink-faint); }
.review--feature .review-meta { font-size: 13px; color: var(--green-light); }

/* Author identity, required to be shown alongside any Google review */
.review-name {
  font-size: 13.5px; font-weight: 600; color: var(--ink-head);
  margin: 2px 0 1px; display: block;
}
a.review-name:hover { color: var(--green); text-decoration: underline; }
.review--feature .review-name { color: var(--white); }
.review--feature a.review-name:hover { color: var(--gold-bright); }
.avatar--photo { object-fit: cover; background: var(--line); }
.review--feature .avatar--photo { width: 44px; height: 44px; }

/* ==========================================================================
   Coverage map
   ========================================================================== */

#coverage { background: var(--white); border-bottom: 1px solid var(--line); }
#coverage .dots {
  background: repeating-radial-gradient(circle at -10% -20%, transparent 0 36px, rgba(30, 92, 64, .07) 36px 38px);
  -webkit-mask-image: linear-gradient(135deg, #000 0%, transparent 40%);
  mask-image: linear-gradient(135deg, #000 0%, transparent 40%);
}

.coverage-grid {
  display: grid; grid-template-columns: 1.5fr 1fr; gap: 56px; align-items: center;
  padding: 96px 0 100px;
}
.coverage-grid h2 {
  font-size: clamp(30px, 3.6vw, 42px); line-height: 1.15;
  margin: 0 0 18px; text-wrap: balance;
}
.coverage-grid p { font-size: 15.5px; line-height: 1.7; color: var(--ink-body); margin: 0; }

/* No fixed min-height: the SVG scales with width, so on a phone a 520px floor
   left ~320px of dead space under the map. It sizes to its own content now,
   and the negative margin absorbs the empty band the 3D tilt leaves above and
   below the artwork (the box stays upright; only the render is foreshortened). */
ny-map-3d { display: block; margin-block: -5%; }

.areas { border-top: 1px solid var(--line); padding-top: 56px; }
.areas-list {
  columns: 5; column-gap: 40px;
  font-size: 15px; line-height: 2.15; font-weight: 700;
  color: var(--green); white-space: nowrap;
}
/* A name must never be split across two columns */
.areas-list div { cursor: default; transition: color .2s ease; break-inside: avoid; }
.areas-list div:hover { color: var(--gold); }
/* Closing note for the coverage list — same green panel treatment as the
   "we also handle" block in the practice section, so the two CTAs read as one
   recurring device rather than two different ideas. */
.areas-cta {
  margin-top: 48px;
  display: flex; align-items: center; justify-content: space-between;
  gap: 32px; flex-wrap: wrap;
  background: var(--grad-green);
  border-radius: 16px;
  padding: 36px 40px;
  box-shadow: 0 12px 36px rgba(21, 68, 47, .25);
}
.areas-cta-copy { flex: 1 1 380px; }
.areas-cta h3 {
  font-size: clamp(21px, 2.3vw, 27px); line-height: 1.25;
  margin: 0 0 10px; color: var(--white); text-wrap: balance;
}
.areas-cta p {
  font-size: 15.5px; line-height: 1.65; color: #d7ded8;
  margin: 0; max-width: 56ch;
}
.areas-cta-actions { display: flex; gap: 12px; flex-wrap: wrap; flex: none; }

/* ==========================================================================
   Attorneys / team
   ========================================================================== */

#team { background: var(--cream); }
#team .dots {
  background: repeating-radial-gradient(circle at -8% 115%, transparent 0 36px, rgba(30, 92, 64, .07) 36px 38px);
  -webkit-mask-image: linear-gradient(30deg, #000 0%, transparent 42%);
  mask-image: linear-gradient(30deg, #000 0%, transparent 42%);
}

.team-head {
  display: flex; align-items: end; justify-content: space-between;
  gap: 24px; margin-bottom: 48px;
}
.team-head h2 { font-size: clamp(32px, 4vw, 48px); line-height: 1.12; margin: 0; }

.attorneys { display: flex; flex-direction: column; gap: 88px; }
.attorney { display: grid; gap: 72px; align-items: center; }
.attorney--photo-left { grid-template-columns: 1.15fr 1fr; }
.attorney--photo-right { grid-template-columns: 1fr 1.15fr; }

.attorney-photo { position: relative; }
.attorney-frame { position: absolute; }
.attorney--photo-left .attorney-frame { top: 22px; left: -22px; right: 22px; bottom: -22px; }
.attorney--photo-right .attorney-frame { top: 22px; left: 22px; right: -22px; bottom: -22px; }
.attorney-frame svg { display: block; overflow: visible; }

.attorney-img {
  position: relative; height: 460px; border-radius: 2px; overflow: hidden;
  box-shadow: 0 24px 60px rgba(20, 33, 27, .18);
}
.attorney-img img { width: 100%; height: 100%; object-fit: cover; display: block; }

.attorney-role {
  font-family: var(--serif); font-size: 15px; font-style: italic;
  color: var(--gold); margin-bottom: 10px;
}
.attorney h3 {
  font-size: clamp(30px, 3.6vw, 42px); line-height: 1.1; margin: 0 0 18px;
}
.attorney .rule { margin-bottom: 22px; }
.attorney p { font-size: 16px; line-height: 1.75; color: var(--ink-body); margin: 0 0 24px; }

.creds {
  display: flex; flex-direction: column; gap: 8px;
  margin-bottom: 26px; font-size: 14px; color: var(--ink-muted);
}
.creds div { display: flex; align-items: center; gap: 10px; }
.creds div::before {
  content: ''; width: 5px; height: 5px; background: var(--gold-light);
  border-radius: 50%; flex: none;
}

/* Staff carousel */
.staff { margin-top: 120px; }
.staff h3 { font-size: clamp(28px, 3.2vw, 38px); margin: 0 0 12px; text-align: center; }
.staff > p { font-size: 17px; color: var(--ink-muted); margin: 0 0 36px; text-align: center; }

/* No edge mask. It used to fade the rail to transparent at both ends, which
   over the cream page read as a white wash sitting on top of the first and last
   cards — and it dimmed their names even when the rail wasn't scrollable.
   Removing it is also the most portable answer: there is no longer any
   mask-image support to depend on. */
/* Full-bleed rail, same idea as the reviews carousel: cancel the container
   inset with a negative margin so the cards run off the edge of the screen
   instead of being sliced at the content boundary, then hand the inset back as
   padding so the first card still lines up with the heading above it.
   --rail-inset is the distance from the screen edge to that content edge, and
   it has to stay a length rather than a percentage — scroll-padding resolves
   percentages against the scrollport, which is the full viewport here, so a
   percentage would compute to zero. */
/* A static grid rather than a horizontal scroll rail, on the client's
   instruction — the scroll read as fussy on desktop. Five across on a wide
   screen, folding to three then two as it narrows. */
.staff-rail {
  display: grid;
  grid-template-columns: repeat(5, 1fr);
  gap: 20px;
  padding: 6px 0 4px;
}
@media (max-width: 1040px) { .staff-rail { grid-template-columns: repeat(3, 1fr); } }

.staff-card {
  position: relative; width: auto; aspect-ratio: 238 / 330;
  border-radius: 14px; overflow: hidden;
  background: #e9e6dc;
  /* <figure> carries a UA margin of 1em 40px; zeroed so the grid gap is the
     only spacing between cards. */
  margin: 0;
}
.staff-card img { width: 100%; height: 100%; object-fit: cover; display: block; }
.staff-card figcaption {
  position: absolute; left: 0; right: 0; bottom: 0;
  padding: 44px 18px 16px;
  background: linear-gradient(180deg, rgba(20, 33, 27, 0), rgba(20, 33, 27, .82));
  pointer-events: none;
}
.staff-name { font-weight: 600; font-size: 15.5px; color: var(--white); }
.staff-title { font-size: 12.5px; color: #c9d4cc; margin-top: 2px; }

/* ---------- Staff placeholders ----------
   No photographs for the support team, so the card carries a brand mark instead
   of a face. Tinted to the palette rather than left grey, and the scrim is
   dropped — a dark gradient only earns its keep over a photograph. */
/* Deeper than it was. The old top stop (#f3f6f3) sat within a few points of the
   cream page behind it, so the card had no visible top edge and looked like it
   faded out. The hairline keeps the shape crisp without darkening the fill. */
.staff-card--ph {
  background: linear-gradient(165deg, #e6efe9, #d6e3db);
  box-shadow: inset 0 0 0 1px rgba(30, 92, 64, .09);
}

.staff-ph {
  position: absolute; inset: 0;
  display: grid; place-items: center;
  padding-bottom: 46px;            /* clears the caption so the mark reads centred */
}
.staff-avatar {
  display: block; width: 112px; height: 112px;
  border-radius: 50%; overflow: hidden;
  background: rgba(30, 92, 64, .06);
  box-shadow: inset 0 0 0 1px rgba(168, 134, 60, .38);
}
/* The ellipse is wider than the circle on purpose — overflow crops it into
   shoulders, which is cheaper and cleaner than a per-card clipPath id. */
.staff-avatar svg { display: block; width: 100%; height: 100%; fill: rgba(30, 92, 64, .3); }

.staff-card--ph figcaption { background: none; padding: 0 18px 18px; }
.staff-card--ph .staff-name { color: var(--ink-head); }
.staff-card--ph .staff-title { color: var(--green); }

/* On phones the grid is dropped for the horizontal swipe rail the client wants.
   Placed after the base rules so it wins the cascade there. Bleeds to the screen
   edge, and snaps, like the reviews rail. */
@media (max-width: 700px) {
  .staff-rail {
    --rail-inset: var(--gutter);
    display: flex; grid-template-columns: none; gap: 14px;
    overflow-x: auto; overscroll-behavior-x: contain;
    scroll-snap-type: x mandatory;
    margin-inline: calc(-1 * var(--rail-inset));
    padding: 6px var(--rail-inset) 18px;
    scroll-padding-inline: var(--rail-inset);
    scrollbar-width: none;
  }
  .staff-rail::-webkit-scrollbar { display: none; }
  .staff-card { flex: none; width: 220px; scroll-snap-align: start; }
}

/* ==========================================================================
   Why choose us
   ========================================================================== */

#why-us {
  background: linear-gradient(180deg, #8f8f8f 0%, #5a5a5a 100%);
  border-top: 1px solid var(--line); border-bottom: 1px solid var(--line);
}
.why-media { position: absolute; inset: 0; overflow: hidden; }
.why-media video { position: absolute; display: block; }
.why-blur { inset: 0; width: 100%; height: 100%; object-fit: cover; filter: blur(40px); }
.why-main {
  top: 0; bottom: 0; left: 0; height: 100%; width: 56%;
  object-fit: cover; object-position: 62% top;
  -webkit-mask-image: linear-gradient(90deg, #000 80%, transparent 100%);
  mask-image: linear-gradient(90deg, #000 80%, transparent 100%);
}
.why-media::after {
  content: ''; position: absolute; inset: 0;
  background: linear-gradient(90deg, rgba(70, 70, 70, 0) 46%, rgba(60, 60, 60, .45) 62%, rgba(50, 50, 50, .6) 100%);
}

.why-grid { display: grid; grid-template-columns: 1.3fr 1fr; gap: 64px; align-items: center; }
.why-grid h2 {
  font-size: clamp(30px, 3.4vw, 40px); line-height: 1.15;
  color: var(--white); margin: 0 0 22px; text-wrap: balance;
}
.why-copy { font-size: 15px; line-height: 1.75; color: #f0f0ee; }
.why-copy p { margin: 0 0 16px; }
.why-copy p:last-child { margin: 0; }
.why-copy h3 { font-size: 20px; color: var(--white); margin: 0 0 10px; }

/* ==========================================================================
   Contact
   ========================================================================== */

#contact-us { background: var(--cream); border-bottom: 1px solid var(--line); }
#contact-us .dots {
  background: repeating-radial-gradient(circle at 108% 118%, transparent 0 36px, rgba(30, 92, 64, .07) 36px 38px);
  -webkit-mask-image: linear-gradient(215deg, #000 0%, transparent 42%);
  mask-image: linear-gradient(215deg, #000 0%, transparent 42%);
}

.contact-head { max-width: 640px; margin-bottom: 52px; }
.contact-head h2 { font-size: clamp(32px, 4vw, 48px); line-height: 1.12; margin: 0 0 16px; }
.contact-head p { font-size: 16.5px; line-height: 1.65; color: var(--ink-body); margin: 0; }

.contact-grid { display: grid; grid-template-columns: .9fr 1.4fr; gap: 36px; align-items: stretch; }

.contact-card {
  background: linear-gradient(165deg, var(--green), var(--green-dark));
  border-radius: 16px; padding: 44px 40px;
  display: flex; flex-direction: column; gap: 36px;
  box-shadow: 0 16px 44px rgba(21, 68, 47, .25);
}
.contact-item { display: flex; gap: 18px; }
.contact-icon {
  flex: none; width: 46px; height: 46px; border-radius: 12px;
  background: rgba(201, 165, 76, .18);
  display: flex; align-items: center; justify-content: center;
}
.contact-label {
  font-size: 12px; font-weight: 700; letter-spacing: .1em;
  text-transform: uppercase; color: var(--green-light); margin-bottom: 6px;
}
.contact-value { font-size: 15px; line-height: 1.6; color: var(--white); }
.contact-card a { color: var(--white); }
.contact-card a.is-phone { font-size: 19px; font-weight: 700; }
.contact-card a.is-email { font-size: 15px; font-weight: 600; }
.contact-card a.is-directions {
  display: inline-block; margin-top: 8px; font-size: 14px;
  font-weight: 600; color: var(--gold-bright);
}
.contact-note { font-size: 13px; color: var(--green-light); margin-top: 4px; }
.contact-rating {
  margin-top: auto; border-top: 1px solid rgba(255, 255, 255, .14);
  padding-top: 24px; display: flex; align-items: center; gap: 12px;
}
.contact-rating span:last-child { font-size: 13.5px; color: #c9d4cc; }

/* Form */
.contact-form {
  background: var(--white); border: 1px solid var(--line); border-radius: 16px;
  padding: 44px 46px; box-shadow: 0 10px 30px rgba(20, 33, 27, .06);
}
.form-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 22px 24px; }
.field--full { grid-column: 1 / -1; }
.field label {
  display: block; font-size: 13.5px; font-weight: 600;
  color: var(--ink-head); margin-bottom: 8px;
}
.req { color: #c0392b; }
.field input, .field textarea {
  width: 100%; border: 1px solid var(--line-soft); border-radius: 8px;
  padding: 13px 16px; font-size: 15px; color: var(--ink);
  background: var(--cream); font-family: inherit;
  transition: border-color .2s ease, background .2s ease;
}
.field textarea { resize: vertical; }
.field input:focus, .field textarea:focus {
  outline: none; border-color: var(--green); background: var(--white);
}
.form-foot {
  grid-column: 1 / -1; display: flex; align-items: center;
  justify-content: space-between; gap: 20px; flex-wrap: wrap;
}
.form-foot button { font-size: 15.5px; padding: 15px 34px; }
.form-foot span { font-size: 13px; color: var(--ink-faint); }
/* Netlify replaces the empty div with Google's widget, which is a fixed
   304x78 iframe — it does not shrink. Reserving the height stops the button
   jumping down when it loads, and below 420px the form's inner column is
   narrower than 304px, so it is scaled from the left rather than allowed to
   push the whole card wider than the phone. */
.form-recaptcha { min-height: 78px; }
@media (max-width: 420px) {
  .form-recaptcha {
    transform: scale(.85); transform-origin: left top;
    min-height: 0; height: 66px;
  }
}
.form-status { grid-column: 1 / -1; font-size: 14px; margin: 0; }
.form-status.is-error { color: #c0392b; }
.form-status.is-ok { color: var(--green); }

.map-embed {
  margin-top: 36px; position: relative; border-radius: 16px; overflow: hidden;
  border: 1px solid var(--line); box-shadow: 0 10px 30px rgba(20, 33, 27, .08);
  /* Holds the frame's shape and gives it a surface of its own, so the moment
     before the tiles arrive reads as a map still loading rather than a hole in
     the page. The iframe is opaque and covers this once it paints. */
  background: #eceee9;
}
/* Fades in on load rather than snapping from blank to tiles. */
.map-embed iframe {
  border: 0; display: block; width: 100%; height: 380px;
  opacity: 0; transition: opacity .35s ease;
}
.map-embed.is-loaded iframe,
.map-embed noscript iframe { opacity: 1; }

@media (prefers-reduced-motion: reduce) {
  .map-embed iframe { transition: none; }
}

/* ==========================================================================
   FAQ
   ========================================================================== */

.faq { background: var(--white); border-top: 1px solid var(--line); }
.faq .dots {
  background: repeating-radial-gradient(circle at -8% -15%, transparent 0 36px, rgba(30, 92, 64, .07) 36px 38px);
  -webkit-mask-image: linear-gradient(140deg, #000 0%, transparent 40%);
  mask-image: linear-gradient(140deg, #000 0%, transparent 40%);
}
.faq-grid { display: grid; grid-template-columns: .75fr 1.25fr; gap: 72px; align-items: start; }
.faq-aside { position: sticky; top: 120px; }
.faq-aside h2 {
  font-size: clamp(30px, 3.8vw, 46px); line-height: 1.12;
  margin: 0 0 18px; text-wrap: balance;
}
.faq-aside p { font-size: 16px; line-height: 1.65; color: var(--ink-body); margin: 0 0 28px; }

.faq-list { display: flex; flex-direction: column; }
.faq-item { border-bottom: 1px solid var(--line); padding: 26px 0; }
.faq-item:last-child { border-bottom: none; }
.faq-item summary {
  font-family: var(--serif); font-size: 21px; font-weight: 600; color: var(--ink-head);
  display: flex; justify-content: space-between; align-items: center;
  gap: 16px; cursor: pointer; list-style: none;
}
.faq-item summary::-webkit-details-marker { display: none; }
.faq-q { display: flex; align-items: baseline; gap: 18px; }
.faq-num { font-family: var(--serif); font-size: 15px; color: var(--gold-light); font-weight: 600; }
.faq-toggle {
  flex: none; width: 32px; height: 32px; border-radius: 50%;
  border: 1.5px solid var(--green); color: var(--green); font-size: 18px;
  display: flex; align-items: center; justify-content: center;
  font-family: var(--sans);
}
.faq-item p {
  font-size: 15.5px; line-height: 1.75; color: var(--ink-body);
  margin: 16px 0 0; padding-left: 42px; max-width: 76ch;
}

/* ==========================================================================
   Footer
   ========================================================================== */

.site-footer {
  background: linear-gradient(180deg, #1a5138 0%, var(--green-dark) 100%);
  color: #b9cdc0;
}
.footer-inner { max-width: var(--wrap); margin: 0 auto; padding: 64px var(--gutter) 32px; }
.footer-grid {
  display: grid; grid-template-columns: 1.4fr 1fr 1fr 1.2fr; gap: 48px;
  padding-bottom: 44px; border-bottom: 1px solid rgba(255, 255, 255, .14);
}
/* Driven by width, with the height following, so the ratio can never be forced.
   Fixing the height was the thing distorting it: the brand column is only 211px
   at 901px, so max-width:100% squeezed the width to 211 while height held it at
   56, squashing the mark to 3.77:1 against its true 4.52:1. Sized this way it
   simply gets smaller in a narrow column instead of deforming, and takes the
   300px cap wherever the column allows — bigger than the old 56px height
   everywhere that actually had the room. */
.footer-brand img {
  width: min(100%, 300px); height: auto;
  display: block; margin-bottom: 18px;
}
.footer-brand p { font-size: 15px; line-height: 1.65; margin: 0; }

.footer-heading {
  font-size: 13px; font-weight: 700; letter-spacing: .1em;
  text-transform: uppercase; color: #e8e6e0; margin-bottom: 14px;
}
.footer-links { display: flex; flex-direction: column; gap: 10px; font-size: 15.5px; }
/* Lifted from #9aa59c, which sat at 3.4:1 on this gradient and failed AA. */
.footer-links a { color: #b3c0b7; }
.footer-links a:hover { color: var(--green-hover); }
.footer-links a.is-phone { color: var(--green-hover); font-weight: 700; }

/* Was #6b776e, which measured 1.97:1 against the top of the footer gradient —
   effectively unreadable. Small print still has to clear 4.5:1; the hierarchy
   against the links above comes from the size, not from dimming it out. */
.footer-legal { font-size: 12.5px; line-height: 1.7; color: #b0bcb4; margin: 28px 0 0; }
.footer-copy { font-size: 12.5px; color: #b0bcb4; margin: 14px 0 0; }

/* ==========================================================================
   Responsive
   ========================================================================== */

@media (max-width: 1080px) {
  .areas-list { columns: 4; }
  .also-grid { grid-template-columns: repeat(3, 1fr); }
  /* auto-fit on the base rule already reflows here; no override needed */
}

@media (max-width: 900px) {
  :root { --header-h: 74px; }

  .nav-toggle { display: flex; order: 3; }
  .header-phone { display: none; }
  .header-call { display: flex; order: 2; margin-left: auto; }
  .header-cta { display: none; }

  /* --- Full-screen menu, revealed as a circle from the toggle ------------
     .site-header carries backdrop-filter, which makes it the containing block
     for fixed descendants — a position:fixed overlay would be trapped inside
     the 73px bar. The header is itself fixed at the viewport origin, so an
     absolute child sized in vw/dvh covers the screen and the blur survives.
     z-index -1 keeps it above the header's own background (so the bar turns
     green too) but below the logo and toggle, which stay clickable. */
  .nav {
    position: absolute; top: 0; left: 0; z-index: -1;
    width: 100vw; height: 100vh; height: 100dvh;
    display: flex; flex-direction: column; align-items: stretch; gap: 0;
    padding: calc(var(--header-h) + 30px) var(--gutter) 40px;
    overflow-y: auto; overscroll-behavior: contain;
    /* Top-aligned, not centred. Centring buried the first item 245px down and,
       once the practice-areas panel is open, pushed it above the scroll
       container's start edge where it could never be reached. */
    justify-content: flex-start;
    background: linear-gradient(155deg, #1e6244 0%, #15442f 48%, #14211b 100%);
    /* --menu-x/y/r are measured from the toggle in JS */
    clip-path: circle(0px at var(--menu-x, 100%) var(--menu-y, 36px));
    visibility: hidden;
    transition: clip-path .5s cubic-bezier(.4, 0, .2, 1), visibility 0s .5s;
  }
  .nav.is-open {
    visibility: visible;
    clip-path: circle(var(--menu-r, 150vmax) at var(--menu-x, 100%) var(--menu-y, 36px));
    transition: clip-path .62s cubic-bezier(.22, 1, .36, 1), visibility 0s;
  }

  /* :not(.menu-cta) — this selector outranks .btn--white, so without the
     exclusion the CTA renders white text on its white fill. */
  .nav > a:not(.menu-cta), .nav-trigger {
    font-family: var(--serif); font-size: clamp(25px, 6.4vw, 34px);
    font-weight: 600; color: var(--white); padding: 14px 0;
    border-bottom: 1px solid rgba(255, 255, 255, .13);
  }
  .nav > a:not(.menu-cta):hover, .nav-trigger:hover { color: var(--gold-bright); }
  .nav-trigger { display: block; }

  /* Each row lifts in behind the expanding circle */
  .nav > a, .nav > .nav-drop, .nav > .menu-cta {
    opacity: 0; transform: translateY(22px);
    transition: opacity .3s ease, transform .45s cubic-bezier(.16, 1, .3, 1);
  }
  .nav.is-open > a, .nav.is-open > .nav-drop, .nav.is-open > .menu-cta {
    opacity: 1; transform: none;
  }
  .nav.is-open > *:nth-child(1) { transition-delay: .12s; }
  .nav.is-open > *:nth-child(2) { transition-delay: .18s; }
  .nav.is-open > *:nth-child(3) { transition-delay: .24s; }
  .nav.is-open > *:nth-child(4) { transition-delay: .30s; }
  .nav.is-open > *:nth-child(5) { transition-delay: .36s; }
  .nav.is-open > *:nth-child(6) { transition-delay: .42s; }
  .nav.is-open > *:nth-child(7) { transition-delay: .48s; }

  .menu-call { display: block; }
  .menu-cta {
    display: block; margin-top: 28px; text-align: center;
    font-size: 16px; padding: 16px 24px;
  }

  .nav-drop { position: static; }
  /* display can't be transitioned, so the panel collapses by height instead —
     JS measures it and sets the pixel value, which keeps the easing honest
     rather than guessing a max-height. */
  .mega {
    position: static; width: auto; opacity: 1;
    pointer-events: auto; background: none; box-shadow: none; border: none;
    display: block; padding: 0;
    height: 0; overflow: hidden;
    transition: height .42s cubic-bezier(.22, 1, .36, 1);
  }
  /* The base .mega.is-open rule re-applies translateX(-50%), which is only
     right for the absolutely-positioned desktop panel. In flow it drags the
     list half its width off-screen. */
  .mega, .mega.is-open, .nav-drop:hover .mega { transform: none; }
  /* Padding moves onto the children — on .mega it would show at height 0 */
  .mega-title { color: var(--gold-bright); padding-top: 8px; }
  .mega-grid { grid-template-columns: 1fr 1fr; font-size: 14px; padding-bottom: 18px; }
  .mega-grid a { color: #cfe0d5; }
  .mega-grid a:hover { color: var(--white); }

  /* Caret flips to point up while the panel is open */
  .nav-trigger .caret {
    display: inline-block; transition: transform .38s cubic-bezier(.22, 1, .36, 1);
  }
  .nav-trigger[aria-expanded="true"] .caret { transform: rotate(180deg); }

  /* Bars fold into an X. Sequenced rather than simultaneous — running the
     slide and the rotation together reads as a muddle. Opening slides the
     outer bars together first, then rotates them; closing unrotates first,
     then slides them back apart. */
  .nav-toggle span::before, .nav-toggle span::after {
    transition: top .22s ease .2s, transform .2s cubic-bezier(.4, 0, .2, 1) 0s;
  }
  .nav-toggle[aria-expanded="true"] span::before,
  .nav-toggle[aria-expanded="true"] span::after {
    top: 0;
    transition: top .2s ease 0s, transform .24s cubic-bezier(.34, 1.3, .64, 1) .18s;
  }
  .nav-toggle[aria-expanded="true"] span::before { transform: rotate(45deg); }
  .nav-toggle[aria-expanded="true"] span::after { transform: rotate(-45deg); }

  /* Middle bar drops out immediately on open, returns only once the outer
     bars have finished separating again on close. */
  .nav-toggle span { transition: background-color .14s ease .36s; }
  .nav-toggle[aria-expanded="true"] span {
    background: transparent; transition: background-color .1s ease 0s;
  }

  /* Header sits on the green while the menu is open.
     On close the circle collapses toward the toggle, so each element is
     uncovered at a different moment — measured at 0.29s (logo), 0.38s (phone)
     and 0.50s (toggle, dead centre). Each holds its light colour until its own
     patch of green has actually gone, otherwise it turns green while still on
     green and disappears for half a second. */
  body.menu-open { overflow: hidden; }
  body.menu-open .site-header { box-shadow: none !important; }

  .header-logo img {
    transform-origin: left center;
    transition: filter .18s ease .28s,
                transform .45s cubic-bezier(.22, 1, .36, 1) .06s;
  }
  .header-call {
    transition: color .18s ease .36s, opacity .2s ease .3s, visibility 0s .5s;
  }
  .nav-toggle { transition: color .18s ease .46s; }

  /* The phone glyph steps aside so the wordmark has room to grow — it only
     had 35px of clearance, which capped the logo at a barely-visible 1.18x.
     The number moves into the menu itself, so nothing is lost. */
  body.menu-open .header-call {
    opacity: 0; visibility: hidden; pointer-events: none;
    transition: opacity .18s ease, visibility 0s;
  }
  body.menu-open .header-logo img {
    filter: brightness(0) invert(1);
    transform: scale(1.35);
    transition: filter .18s ease, transform .5s cubic-bezier(.22, 1, .36, 1);
  }
  body.menu-open .nav-toggle { color: var(--white); transition-delay: 0s; }

  /* The menu list scrolls, and with nothing solid behind the bar the items ran
     straight into the wordmark on the way up. This is an opaque strip across the
     header that the list disappears behind.

     It repeats the menu's own gradient rather than a flat colour, sized to the
     viewport and anchored top-left exactly as .nav is, so the strip and the
     panel below it are the same surface with no seam where they meet. The mask
     softens the bottom edge so items fade out instead of being guillotined. */
  body.menu-open .site-header::after {
    content: ''; position: absolute; top: 0; left: 0; right: 0;
    height: calc(var(--header-h) + 20px);
    background: linear-gradient(155deg, #1e6244 0%, #15442f 48%, #14211b 100%);
    background-size: 100vw 100dvh;
    background-position: top left;
    background-repeat: no-repeat;
    -webkit-mask-image: linear-gradient(180deg, #000 calc(100% - 20px), transparent 100%);
    mask-image: linear-gradient(180deg, #000 calc(100% - 20px), transparent 100%);
    z-index: 0; pointer-events: none;
  }
  /* ::after is generated last, so it would otherwise paint over these two. */
  body.menu-open .header-logo,
  body.menu-open .nav-toggle { position: relative; z-index: 1; }

  /* The two attorneys occupy 49%-98% of the frame width, so the crop is
     right-aligned. That span is 48% of the clip, which means the video can't
     be taller than about 100vw before one of them falls outside a phone-width
     window — hence the height cap rather than a full-bleed background.
     The copy then sits over the clip's lower edge, well clear of their faces. */
  .hero { display: block; padding-top: var(--header-h); }
  .hero-spacer { display: none; }
  .hero-scrim { display: none; }

  /* Sized by ratio, not a pixel height. With object-fit:cover the visible
     slice of the clip is width/(1.793 x height), so a fixed height meant the
     crop loosened as the viewport widened and the empty cityscape on the left
     crept back in. A fixed ratio holds the same crop at every width.
     0.92 puts the left attorney just inside the frame edge. */
  .hero-media {
    position: relative; overflow: hidden;
    top: auto; left: auto; right: auto; bottom: auto;
    aspect-ratio: 1.12; max-height: 74vh;
  }
  /* object-fit alone can only crop one axis, and cropping the left dead space
     that way forces a very tall box. The extra scale crops the facade above
     their heads too (hair starts 9.8% down, this takes 5.4%), which buys back
     ~70-120px of height so the copy sits higher. Origin pins the right edge. */
  .hero-media video {
    width: 100%; height: 100%;
    object-fit: cover; object-position: 100% center;
    transform: scale(1.22); transform-origin: 100% 30%;
  }
  /* Fades the clip into the cream so the overlaid copy reads as one surface.
     Kept shallow — a taller fade washes out most of both suits. */
  .hero-media::after {
    content: ''; position: absolute; left: 0; right: 0; bottom: 0;
    height: 22%; pointer-events: none;
    background: linear-gradient(180deg,
      rgba(250, 249, 246, 0) 0%,
      rgba(250, 249, 246, .45) 40%,
      rgba(250, 249, 246, .90) 74%,
      var(--cream) 100%);
  }

  /* Overlap only as far as the near-opaque end of the fade, so the kicker
     never lands on the mid-tone of their suits. */
  .hero-grid {
    grid-template-columns: 1fr;
    position: relative; z-index: 1; margin-top: -22px;
  }
  .hero-copy { padding: 0 0 36px; }

  .pillar, .pillar--media-left, .pillar--media-right { grid-template-columns: 1fr; gap: 28px; }
  .pillar--media-right .pillar-copy { order: 2; }
  .pillar-copy--inset { padding-left: 0; }

  .also { padding: 40px 28px 36px; }
  .also-grid { grid-template-columns: 1fr 1fr; }

  .results-grid { grid-template-columns: 1fr; gap: 32px; }
  .results-body { border-left: none; padding-left: 0; }

  /* 56px between the heading block and the cards is desktop breathing room;
     on a phone it just pushes the reviews further down the scroll. */
  .reviews-head { grid-template-columns: 1fr; align-items: start; margin-bottom: 24px; gap: 14px; }

  /* Stripped back to a plain rating line. As a full-width white card it sat
     directly on top of the review cards and read as card-on-card clutter. */
  .google-badge {
    background: none; border: 0; box-shadow: none;
    border-radius: 0; padding: 0; gap: 12px;
  }
  .google-wordmark { font-size: 18px; }
  .google-divider { height: 26px; }
  .google-score { font-size: 21px; }

  /* Stacked, five review cards make this section enormous to scroll past.
     Swap the grid for a snap rail — same pattern as the staff carousel.
     Negative margin + matching padding lets cards bleed to the screen edge
     while the first one still lines up with the rest of the page. */
  .reviews-grid {
    display: flex; grid-template-columns: none;
    gap: 14px;
    overflow-x: auto; overscroll-behavior-x: contain;
    scroll-snap-type: x mandatory;
    margin-inline: calc(-1 * var(--gutter));
    padding: 4px var(--gutter) 16px;
    /* Snap points ignore container padding, so without this the first card
       rests flush against the screen edge instead of on the page gutter. */
    scroll-padding-inline: var(--gutter);
    scrollbar-width: none;
  }
  .reviews-grid::-webkit-scrollbar { display: none; }
  .reviews-grid > .review {
    flex: 0 0 auto;
    width: min(80vw, 320px);
    scroll-snap-align: start;
  }
  /* The peek of the next card is the only affordance that there's more to
     see, so don't let a card fill the viewport edge to edge. */
  .reviews-grid > .review--feature { width: min(80vw, 320px); }

  /* Condensed for the rail. Desktop keeps the roomier proportions — here the
     cards are narrower, so the same padding and type ran them absurdly tall. */
  .reviews-grid .review { padding: 22px 22px 18px; }
  .reviews-grid .review--feature { padding: 24px 24px 20px; }

  .reviews-grid .quote-mark { font-size: 40px; margin: 0 0 10px; }
  .reviews-grid .review--feature .quote-mark { font-size: 46px; margin: 0 0 12px; }

  /* Cards in a flex rail all stretch to the tallest, so one long review would
     inflate every card. Clamp the visible lines to keep the rail compact — the
     full text stays in the DOM and the author name links to it on Google. */
  .reviews-grid .review p {
    font-size: 14.5px; line-height: 1.6; margin: 0 0 16px;
    display: -webkit-box; -webkit-box-orient: vertical;
    -webkit-line-clamp: 6; overflow: hidden;
  }
  .reviews-grid .review--feature p { font-size: 16px; line-height: 1.55; }

  .reviews-grid .avatar { width: 34px; height: 34px; font-size: 13px; }
  .reviews-grid .review--feature .avatar { width: 36px; height: 36px; font-size: 14px; }
  .reviews-grid .review--feature .avatar--photo { width: 36px; height: 36px; }

  /* Heading first on mobile. In the two-column desktop layout the map sits to
     the left of the copy, but stacked it lands above the heading, so the
     section opens with an unexplained map. */
  .coverage-grid { grid-template-columns: 1fr; gap: 24px; padding: 56px 0 40px; }
  .coverage-grid > div { order: -1; }
  /* Three columns here too — at tablet widths two left the tracks far wider
     than any town name needs. */
  .areas-list { columns: 3; column-gap: 18px; font-size: 14px; }

  .attorney, .attorney--photo-left, .attorney--photo-right { grid-template-columns: 1fr; gap: 28px; }
  .attorney--photo-right .attorney-photo { order: -1; }
  .attorney-frame { display: none; }
  /* A 460px portrait eats an entire phone screen before any copy appears, but a
     fixed height against a fluid width swung the frame's ratio from 0.93 at
     375px to 2.33 at 900px — and past the photo's own 1.79 the crop switches
     from the sides to the top and bottom, taking the top of both partners'
     heads off. Scaling the height with the viewport holds the ratio at or below
     1.82 across the whole range, so the full height of the photo is always in
     frame and only the sides are ever trimmed. */
  /* 470 rather than the desktop 460: at the top of this range the frame is
     837px wide, and 837 / 1.792 = 467, so 470 is what keeps the ratio just
     under the photo's own and the vertical crop at exactly zero. */
  .attorney-img { height: clamp(320px, 62vw, 470px); }
  .attorneys { gap: 64px; }
  .staff { margin-top: 72px; }

  .why-grid { grid-template-columns: 1fr; gap: 0; }
  .why-grid > div:first-child { display: none; }
  .why-main { width: 100%; -webkit-mask-image: none; mask-image: none; opacity: .5; }

  /* The desktop scrim is a left-to-right gradient that shades only the column
     the copy sits in. Stacked on a phone the copy spans the full width, so the
     start of every line was landing on bare, brightly lit marble. A flat scrim
     covers the whole frame instead, which is what makes the body text legible
     over the statue's highlights rather than just over its shadows. */
  .why-media::after {
    background: linear-gradient(180deg, rgba(23, 29, 26, .54), rgba(23, 29, 26, .64));
  }
  /* Lets the scrim stay light enough to actually see the statue. The shadow
     only bites where a glyph meets a bright highlight, so the copy holds up
     over the marble without flattening the image behind it. Contrast is still
     carried by the scrim — this is on top of 4.5:1, not instead of it. */
  #why-us .why-grid h2,
  #why-us .why-copy,
  #why-us .why-copy h3,
  #why-us .kicker { text-shadow: 0 1px 3px rgba(10, 14, 12, .7); }

  .contact-grid { grid-template-columns: 1fr; }
  .contact-form { padding: 32px 24px; }
  .contact-card { padding: 32px 24px; gap: 28px; }
  .form-grid { grid-template-columns: 1fr; }

  .faq-grid { grid-template-columns: 1fr; gap: 40px; }
  .faq-aside { position: static; }
  .faq-item summary { font-size: 18px; }
  .faq-item p { padding-left: 0; }

  .footer-grid { grid-template-columns: 1fr 1fr; gap: 32px; }

  .section-pad, .section-pad--lg { padding-top: 56px; padding-bottom: 56px; }
}

@media (max-width: 560px) {
  /* Wide tracking pushes the longer kickers onto an orphaned second line */
  .kicker { font-size: 11.5px; letter-spacing: .1em; }
  .kicker--green { font-size: 11.5px; letter-spacing: .1em; }

  /* Two columns of long practice-area names exceed the viewport here */
  .mega-grid { grid-template-columns: 1fr; }

  /* Logo, call glyph and toggle share the row. The two 44px targets and the
     gaps are fixed, so the logo gets whatever is left: (vw - 148) / 4.52. At
     339px that works out to 42.2px, which is why the floor here is 42 and not
     higher — there is literally 1px to spare at that width. Above it the mark
     scales, and 12vw is the steepest slope that still clears the limit at the
     bottom of this range. Caps at 52 to meet the base rule's 52 without a jump. */
  .header-logo img { height: clamp(42px, 12vw, 52px); }
  .header-inner { gap: 10px; }

  /* Scaled-up clips crop too aggressively at this width */
  .pillar video.is-crash, .pillar video.is-work { transform: scale(1.04); }

  /* These clips frame their subject small with a lot of empty headroom, which
     reads as a dead gap on a narrow screen. Crop to a wider box to fill it. */
  .pillar video { aspect-ratio: 16 / 9; object-fit: cover; }

  /* Grid/flex children default to min-width:auto, so a nowrap button or a
     wide badge can force its track past the viewport. Let them shrink. */
  .also { padding: 32px 20px 28px; }
  .also-foot { flex-direction: column; align-items: stretch; gap: 20px; }
  .also-foot p { font-size: 22px; }
  .also-foot .btn { text-align: center; white-space: normal; font-size: 16px; padding: 14px 18px; }

  .reviews-head > *, .reviews-grid > * { min-width: 0; }
  .google-badge { padding: 16px 18px; gap: 14px; }
  .google-badge > div { min-width: 0; }
  /* Three columns. Measured across all 146 names: at 12px/700 in a 105px
     column only 3 of them (2%) need a second line, and going smaller barely
     improves on that while costing legibility. Line-height stays open so
     three columns don't read as cramped. */
  .areas-list {
    columns: 3; column-gap: 10px; white-space: normal;
    font-size: 12px; line-height: 2;
  }
  /* Hanging indent on the three names that need a second line, so the runover
     ("Gardens", "Station") reads as a continuation and not its own place. */
  .areas-list div { padding-left: 9px; text-indent: -9px; }

  .areas-cta { padding: 26px 22px; margin-top: 36px; gap: 22px; }
  .areas-cta-actions { flex: 1 0 100%; }
  .areas-cta-actions .btn { flex: 1 0 100%; text-align: center; }
  .footer-grid { grid-template-columns: 1fr; }
  .hero-actions .btn { flex: 1 0 100%; text-align: center; }
  .team-head { flex-direction: column; align-items: start; }
}

/* The header row is flex-wrap:wrap so the nav can drop below it, which means
   the browser wraps the toggle onto its own line rather than shrinking the
   logo. The 42px logo (190px wide) plus two 44px touch targets, gaps and
   gutters needs a 339px viewport — below that, step the logo down so all
   three stay on one row. Deliberately under 360px so common phone widths
   keep the full-size logo. */
@media (max-width: 338px) {
  /* 6px gaps here, so the budget is (vw - 140) / 4.52 — 31px at 280, 38px at
     312. 36 clears every width this rule realistically sees down to 300. */
  .header-logo img { height: 36px; }
  .header-inner { gap: 6px; }
}

/* Respect reduced-motion preferences */
@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after {
    animation-duration: .01ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: .01ms !important;
    scroll-behavior: auto !important;
  }
}

/* ==========================================================================
   Practice-area pages (/practice-areas/ and each sub-route)
   ========================================================================== */

.pa-hero {
  background: var(--cream);
  border-bottom: 1px solid var(--line);
  padding: calc(var(--header-h) + 48px) 0 52px;
  position: relative; overflow: hidden;
}
/* One faint arc set in the hero only. Two overlapping layers crosshatched into
   something busy, and running it behind the body copy as well made a page of
   long-form reading harder than it needed to be — so the reading area is clean
   and the texture is confined to the banner. */
.pa-hero .dots {
  background: repeating-radial-gradient(circle at 112% -22%, transparent 0 44px, rgba(30, 92, 64, .045) 44px 46px);
}

/* Copy beside the photograph rather than a headline over an empty band with a
   floating picture underneath it. */
.pa-hero-grid {
  display: grid; grid-template-columns: 1.05fr 1fr;
  gap: 48px; align-items: center;
  max-width: 1160px; margin-inline: auto;
}
.pa-hero-copy { min-width: 0; }
.pa-hero-actions { display: flex; flex-wrap: wrap; gap: 12px; margin-top: 26px; }
.crumbs { max-width: 1160px; margin-inline: auto; }
.pa-hero h1 {
  font-size: clamp(32px, 4.4vw, 50px); line-height: 1.12;
  margin: 0 0 18px; text-wrap: balance;
}
.pa-lede {
  font-size: clamp(16px, 1.7vw, 19px); line-height: 1.65;
  color: var(--ink-body); margin: 0; max-width: 62ch;
}

.crumbs {
  font-size: 13.5px; color: var(--ink-faint);
  margin-bottom: 22px; display: flex; flex-wrap: wrap; gap: 8px;
}
.crumbs a { color: var(--ink-muted); }
.crumbs a:hover { color: var(--green); }
.crumbs [aria-current] { color: var(--ink-head); font-weight: 600; }

/* Holding note — goes away with the placeholder copy */
.pa-placeholder {
  margin: 28px 0 0; padding: 14px 18px;
  border-left: 3px solid var(--gold-light);
  background: rgba(201, 165, 76, .09);
  font-size: 14.5px; line-height: 1.6; color: var(--ink-muted);
  max-width: 62ch;
}

/* --- Practice-area page body --- */

.pa-figure {
  margin: 0; position: relative; border-radius: 14px; overflow: hidden;
  border: 1px solid var(--line); box-shadow: 0 14px 36px rgba(20, 33, 27, .10);
}
/* height:auto is load-bearing. The img carries width/height attributes so the
   browser can reserve space before it loads, but those act as a presentational
   hint — with a width AND a height in play, aspect-ratio is ignored and the
   picture rendered at its full 1013px height on a 348px-wide phone. */
.pa-figure img {
  display: block; width: 100%; height: auto;
  aspect-ratio: 16 / 9; object-fit: cover;
}
/* Sits on the picture rather than under it. The gradient does the legibility
   work on its own — backdrop-filter is a bonus where it is supported, and the
   caption stays readable where it is not. */
.pa-figure figcaption {
  position: absolute; left: 0; right: 0; bottom: 0;
  padding: 30px 18px 14px;
  font-size: 13px; line-height: 1.45; color: #fff;
  background: linear-gradient(180deg, rgba(12, 18, 15, 0) 0%, rgba(12, 18, 15, .62) 45%, rgba(12, 18, 15, .82) 100%);
  -webkit-backdrop-filter: blur(2px);
  backdrop-filter: blur(2px);
  text-shadow: 0 1px 3px rgba(0, 0, 0, .55);
}

.pa-body { background: var(--white); padding: 72px 0; position: relative; overflow: hidden; }
/* Centred reading column rather than the full container. Left to the wrap's own
   width the paragraphs ran to a 68ch measure against a 1267px box, which left
   nearly 600px of dead space down the right and blew the photograph up to
   1267x713. 800px keeps the measure around 70 characters, sizes the picture
   sensibly, and drops the card grid to two columns where it reads better. */
.pa-body .wrap > * { max-width: 800px; margin-inline: auto; }
.pa-body .wrap > * + * { margin-top: 56px; }

.pa-prose h2 {
  font-size: clamp(24px, 2.8vw, 32px); line-height: 1.2; margin: 0 0 16px;
}
.pa-prose h3 {
  font-size: clamp(18px, 2vw, 21px); line-height: 1.3; margin: 0 0 10px;
  color: var(--ink-head);
}
/* No ch cap here — the 800px column above already sets the measure, and a second
   limit inside it just reintroduced the ragged right edge. */
.pa-prose p {
  font-size: 16.5px; line-height: 1.75; color: var(--ink-body);
  margin: 0 0 16px;
}
.pa-prose p:last-child { margin-bottom: 0; }

/* How we help — one card per way the firm actually moves the case forward */
.pa-help-grid {
  display: grid; gap: 20px; margin-top: 28px;
  grid-template-columns: repeat(auto-fit, minmax(260px, 1fr));
}
.pa-help-card {
  padding: 26px 24px; border-radius: 12px;
  background: var(--cream); border: 1px solid var(--line);
}
.pa-help-card h3 { margin: 0 0 8px; font-size: 17.5px; }
.pa-help-card p { margin: 0; font-size: 15px; line-height: 1.7; max-width: none; }
.pa-help-num {
  display: block; font-family: var(--serif); font-size: 15px;
  font-weight: 700; color: var(--gold); margin-bottom: 10px;
}

/* Plain checklist for "cases we take" / "injuries we see" */
.pa-list { list-style: none; padding: 0; margin: 22px 0 0; display: grid; gap: 10px;
  grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); }
.pa-list li {
  position: relative; padding-left: 26px;
  font-size: 15.5px; line-height: 1.6; color: var(--ink-body);
}
.pa-list li::before {
  content: ''; position: absolute; left: 4px; top: .55em;
  width: 7px; height: 7px; border-radius: 50%; background: var(--gold);
}

/* Native details/summary so the answers are in the DOM for search engines and
   readable with JS off. */
.pa-faqs .pa-faq {
  border-bottom: 1px solid var(--line); padding: 0;
}
.pa-faqs .pa-faq:first-of-type { border-top: 1px solid var(--line); }
.pa-faq summary {
  cursor: pointer; list-style: none;
  padding: 18px 34px 18px 0; position: relative;
  font-size: 17px; font-weight: 600; color: var(--ink-head); line-height: 1.45;
}
.pa-faq summary::-webkit-details-marker { display: none; }
.pa-faq summary::after {
  content: '+'; position: absolute; right: 6px; top: 50%; transform: translateY(-50%);
  font-size: 22px; font-weight: 400; color: var(--green); line-height: 1;
}
.pa-faq[open] summary::after { content: '−'; }
.pa-faq summary:hover { color: var(--green); }
.pa-faq summary:focus-visible { outline: 2px solid var(--green-mid); outline-offset: 2px; }
.pa-faq p { margin: 0 0 18px; font-size: 16px; line-height: 1.75; }

/* --- Hub index --- */

.pa-index { background: var(--white); padding: 72px 0 80px; }
.pa-grid {
  display: grid; gap: 20px;
  grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
}
.pa-card {
  display: flex; flex-direction: column;
  border: 1px solid var(--line); border-radius: 14px;
  padding: 26px 26px 22px; background: var(--cream);
  transition: border-color .25s ease, box-shadow .25s ease, transform .25s ease;
}
.pa-card:hover {
  border-color: var(--green); box-shadow: 0 12px 30px rgba(20, 33, 27, .09);
  transform: translateY(-2px);
}
.pa-card h2 {
  font-size: 20px; line-height: 1.25; margin: 0 0 10px; color: var(--ink-head);
}
.pa-card p {
  font-size: 14.5px; line-height: 1.6; color: var(--ink-body); margin: 0 0 18px; flex: 1;
}
.pa-card-go { font-size: 14px; font-weight: 600; color: var(--green); }

/* --- Shared closing CTA --- */

.pa-cta {
  background: var(--grad-green); color: var(--white);
  padding: 72px 0 76px; text-align: center;
}
.pa-cta h2 {
  font-size: clamp(28px, 3.4vw, 40px); color: var(--white); margin: 0 0 14px;
}
.pa-cta p {
  font-size: 16.5px; line-height: 1.6; color: #d7ded8;
  margin: 0 auto 30px; max-width: 52ch;
}
.pa-cta-actions {
  display: flex; gap: 16px; justify-content: center; flex-wrap: wrap;
}
.btn--ghost-light {
  border: 1.5px solid rgba(255, 255, 255, .5); color: var(--white); background: transparent;
}
.btn--ghost-light:hover { background: var(--white); color: var(--green-dark); }

/* The "we also handle" chips are links now, not plain text */
.also-item:hover { color: var(--white); }
.also-item:hover span { color: var(--white); }

@media (max-width: 900px) {
  .pa-hero { padding: calc(var(--header-h) + 36px) 0 40px; }
  /* The hero grid had no stacking rule, so the two columns held all the way
     down. The figure column kept shrinking while the caption stayed the same
     size: at 375px the picture was 138x78 and the caption 195px, so it covered
     two and a half times the image it sits on. One column gives the photograph
     the full measure back. */
  .pa-hero-grid { grid-template-columns: 1fr; gap: 28px; }
  /* With the caption over a short wide picture rather than a tall narrow one,
     the 30px lead-in for the gradient is more than it needs. */
  .pa-figure figcaption { padding: 22px 14px 12px; }
  .pa-index { padding: 48px 0 56px; }
  .pa-cta { padding: 52px 0 56px; }
  .pa-cta-actions .btn { flex: 1 0 100%; text-align: center; }
  /* Pull the body content up nearer the hero photo — with the reveal gone the
     72px gap read as dead space under the picture on a phone. */
  .pa-body { padding-top: 36px; }
}

@media (max-width: 560px) {
  /* Keep the two hero CTAs on one row instead of stacking. Equal-width, and
     tightened just enough that "Tell us what happened" and the phone number
     each sit on a single line at 375px. align-items:stretch keeps both the
     same height if one ever wraps. */
  .pa-hero-actions { flex-wrap: nowrap; align-items: stretch; gap: 10px; }
  .pa-hero-actions .btn {
    flex: 1 1 0; min-width: 0;
    padding: 13px 8px; font-size: 13.5px;
    text-align: center; line-height: 1.25;
  }
}
@media (max-width: 360px) {
  /* Very narrow phones (SE-class): tighten a touch more so the labels never
     spill past the button edge. */
  .pa-hero-actions .btn { padding: 12px 4px; font-size: 12px; }
}

/* ==========================================================================
   Form submission confirmation (/thanks/)
   ========================================================================== */
.thanks-page {
  background: var(--cream);
  padding: calc(var(--header-h) + 90px) 0 110px;
  min-height: 68vh;
  display: flex;
  align-items: center;
  position: relative;
  overflow: hidden;
}
.thanks-card {
  max-width: 640px;
  margin-inline: auto;
  text-align: center;
  position: relative;
  z-index: 1;
}
.thanks-mark {
  width: 88px; height: 88px;
  margin: 0 auto 30px;
  border-radius: 50%;
  background: var(--green-dark);
  display: grid; place-items: center;
  box-shadow: 0 14px 34px rgba(20, 33, 27, .22);
}
.thanks-mark svg { width: 44px; height: 44px; display: block; }
.thanks-page h1 {
  font-size: clamp(34px, 5vw, 54px);
  line-height: 1.1;
  color: var(--ink-head);
  margin: 0 0 20px;
}
.thanks-lead {
  font-size: clamp(17px, 2vw, 20px);
  line-height: 1.65;
  color: var(--ink-body);
  margin: 0 auto;
  max-width: 46ch;
}
.thanks-divider {
  width: 62px; height: 3px;
  background: var(--gold-light);
  border-radius: 2px;
  margin: 36px auto;
}
.thanks-sub {
  font-size: 15px;
  color: var(--ink-muted);
  margin: 0 0 22px;
}
.thanks-actions {
  display: flex; flex-wrap: wrap; gap: 14px;
  justify-content: center;
}
.thanks-home {
  display: inline-block;
  margin-top: 36px;
  color: var(--green);
  font-weight: 600;
  font-size: 15px;
}
.thanks-home:hover { color: var(--green-dark); }
@media (max-width: 480px) {
  .thanks-actions .btn { flex: 1 0 100%; text-align: center; }
}

/* ==========================================================================
   Language toggle button (English ⇄ Spanish)
   ========================================================================== */
.i18n-toggle {
  position: fixed;
  right: 20px; bottom: 20px;
  z-index: 60;
  display: inline-flex; align-items: center; gap: 8px;
  padding: 11px 16px;
  font-family: var(--sans);
  font-size: 14px; font-weight: 700; letter-spacing: .02em;
  color: var(--white);
  background: var(--green-dark);
  border: 1px solid rgba(255, 255, 255, .16);
  border-radius: 999px;
  box-shadow: 0 10px 30px rgba(20, 33, 27, .28);
  cursor: pointer;
  transition: transform .18s ease, background .18s ease, box-shadow .18s ease;
}
.i18n-toggle:hover { background: var(--green); transform: translateY(-2px); box-shadow: 0 14px 34px rgba(20, 33, 27, .34); }
.i18n-toggle:active { transform: translateY(0); }
.i18n-toggle:focus-visible { outline: 3px solid var(--gold-light); outline-offset: 2px; }
.i18n-toggle svg { display: block; opacity: .92; }
.i18n-toggle .i18n-label { line-height: 1; }
/* Keep clear of the menu button on small screens; shrink a touch */
@media (max-width: 560px) {
  .i18n-toggle { right: 14px; bottom: 14px; padding: 10px 14px; font-size: 13px; }
}
@media (prefers-reduced-motion: reduce) {
  .i18n-toggle { transition: none; }
  .i18n-toggle:hover { transform: none; }
}
