/* =====================================================
   BUSHSCAPES — Safari Lodge Design System
   ===================================================== */

:root {
  /* Palette — olive bushveld + charcoal */
  --ink: #2d332b;
  --ink-2: #4f594d;
  --ink-3: #7b8476;
  --bone: #d8dacf;
  --cream: #f3f0e7;
  --paper: #ffffff;
  --teal: #8c9500;
  --teal-deep: #5c6100;
  --teal-light: #bec253;
  --gold: #a5ad00;
  --gold-light: #d7dc62;
  /* Split-style headline accent (Derek round-6) — one step lighter than
     --teal-deep so the green word reads clearly against the ink beside it. */
  --green-accent: #8c9500;
  --coral: #b16a3a;
  --line: rgba(45, 51, 43, 0.11);
  --line-strong: rgba(45, 51, 43, 0.20);
  --shadow-soft: 0 18px 60px rgba(45, 51, 43, 0.08);
  --shadow-strong: 0 30px 90px rgba(45, 51, 43, 0.16);

  /* Type */
  --font-display: "Cormorant Garamond", "Cormorant", "Times New Roman", Georgia, serif;
  --font-body: "Manrope", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;

  /* Layout */
  --container: min(1240px, calc(100vw - 48px));
  --container-narrow: min(960px, calc(100vw - 48px));
  --radius-sm: 4px;
  --radius: 8px;
  --radius-lg: 18px;

  /* Lodge-profile shell geometry. Hoisted out of .lodge-shell in round 11 so
     the header can derive its icon positions from the SAME tokens the pricing
     rail lays itself out with — see --chrome-icon-offset below. */
  --rail-w: 332px;
  --rail-gap: 44px;
  --lodge-gutter: max(24px, calc((100vw - var(--container)) / 2));

  /* Header sizes */
  --header-h: 76px;
  /* .site-header's own horizontal padding, as a token so --chrome-icon-offset
     can subtract it. Re-declared in the >= 1100px block below. */
  --header-pad: max(24px, calc((100vw - 1280px) / 2));

  /* === Derek round 11 (A1) — one header-icon geometry for every layout =====
     He marked the menu icon as centred on the mid-point of the lodge-profile
     info/pricing rail, and the search icon mirrored about the logo.

     The rail is grid column 4 of .lodge-shell (gutter | 1fr | gap | rail |
     gutter), so its mid-point sits --lodge-gutter + --rail-w / 2 in from the
     shell's right edge. .lodge-shell is a block in <body>, and .site-header is
     position: fixed with left/right: 0, so both boxes end at exactly the same
     x — scrollbar or not. The toggles are positioned against
     .site-header-inner (which must stay position: relative, see the iPad scrim
     note at .site-header--fade), so the header's own padding comes back off.
     Pages with no rail get the identical computed constant from the identical
     expression, so the two can never drift. */
  --chrome-icon-offset: calc(var(--lodge-gutter) + var(--rail-w) / 2 - var(--header-pad));

  /* === Derek round 11 (A2/A3) — one standard hero headline ================
     Title case at the "What Makes Bushscapes Different" size. Every hero h1
     on the site resolves to this token; nothing re-states the clamp. */
  --h1-hero: clamp(2.9rem, 6.6vw, 5.4rem);
  --h1-hero-lh: 0.98;

  /* === Derek round 11 (A4) — one standard hero height + scroll chevron ==== */
  --hero-h: 100svh;
  --hero-chevron-inset: 30px;
  /* Bottom padding that keeps hero copy clear of the bottom-centred chevron.
     Matches the 52px of air the Home hero already leaves (110px padding vs a
     28px glyph 30px off the floor), which is the look Derek signed off. */
  --hero-copy-clear: clamp(84px, 12svh, 116px);

  /* Easing */
  --ease-out: cubic-bezier(0.22, 1, 0.36, 1);
  --ease-soft: cubic-bezier(0.4, 0, 0.2, 1);
}

* { box-sizing: border-box; }
html {
  width: 100%;
  max-width: 100%;
  overflow-x: hidden;
  scroll-behavior: smooth;
}
body {
  margin: 0;
  width: 100%;
  max-width: 100%;
  overflow-x: hidden;
  color: var(--ink);
  background: var(--cream);
  font-family: var(--font-body);
  font-size: 16px;
  font-weight: 400;
  line-height: 1.65;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  letter-spacing: -0.005em;
}
main,
.site-header,
.site-footer {
  max-width: 100%;
  overflow-x: clip;
}
@supports (overflow: clip) {
  html,
  body {
    overflow-x: clip;
  }
}
img, video { max-width: 100%; display: block; }
a { color: inherit; text-decoration: none; transition: color 0.2s var(--ease-out); }
button { font: inherit; cursor: pointer; }

/* Locked scroll when drawers open */
body.no-scroll { overflow: hidden; }

/* =========================
   TYPOGRAPHY
   ========================= */
h1, h2, h3, h4, h5, h6 {
  margin: 0;
  font-family: var(--font-display);
  font-weight: 400;
  line-height: 1.05;
  letter-spacing: -0.012em;
  color: var(--ink);
}
.display em {
  font-style: italic;
  font-weight: 400;
  color: var(--teal-deep);
}
/* Derek round-6 split-style headings ("About …", "Our Verdict", "Take a
   closer look…", "Then you might also like…") — the accent word(s) go italic
   in the lighter green. The em.hl-accent leg out-specifies .display em above
   so lodge pages get the lighter cut while static pages keep --teal-deep. */
.hl-accent,
.display em.hl-accent {
  font-style: italic;
  font-weight: 400;
  color: var(--green-accent, #8c9500);
}
h1, .h1 { font-size: clamp(2.5rem, 6vw, 4.6rem); }
h2, .h2 { font-size: clamp(2.1rem, 4.6vw, 3.7rem); }
h3, .h3 { font-size: clamp(1.45rem, 2.4vw, 1.85rem); }
p { margin: 0 0 1em; }
.lede {
  max-width: 56ch;
  margin-top: 18px;
  color: var(--ink-2);
  font-size: clamp(1.02rem, 1.4vw, 1.12rem);
  line-height: 1.7;
}

.eyebrow {
  display: inline-block;
  margin: 0 0 18px;
  color: var(--teal-deep);
  font-family: var(--font-body);
  font-size: 0.74rem;
  font-weight: 600;
  letter-spacing: 0.22em;
  text-transform: uppercase;
}
.eyebrow.light { color: var(--gold-light); }

/* =========================
   BUTTONS
   ========================= */
.hero-cta,
.cta-button {
  display: inline-flex;
  align-items: center;
  gap: 12px;
  padding: 16px 28px;
  border: 1px solid currentColor;
  border-radius: 999px;
  color: var(--cream);
  font-family: var(--font-body);
  font-size: 0.86rem;
  font-weight: 600;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  background: transparent;
  transition: background 0.3s var(--ease-out), color 0.3s var(--ease-out), transform 0.3s var(--ease-out);
}
.hero-cta:hover,
.cta-button:hover {
  background: var(--cream);
  color: var(--ink);
  transform: translateY(-2px);
}
.hero-cta.dark {
  color: var(--ink);
  border-color: var(--ink);
}
.hero-cta.dark:hover {
  background: var(--ink);
  color: var(--cream);
}
.hero-cta span,
.cta-button span { transition: transform 0.3s var(--ease-out); }
.hero-cta:hover span,
.cta-button:hover span { transform: translateX(4px); }

.ghost-link {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  color: var(--teal-deep);
  font-size: 0.84rem;
  font-weight: 600;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  border-bottom: 1px solid var(--line-strong);
  padding-bottom: 6px;
  transition: color 0.2s, border-color 0.2s;
}
.ghost-link:hover { color: var(--ink); border-color: var(--ink); }
.ghost-link span { transition: transform 0.3s var(--ease-out); }
.ghost-link:hover span { transform: translateX(4px); }

/* =========================
   HEADER
   ========================= */
.site-header {
  position: fixed;
  top: 0;
  left: 0;
  right: 0;
  z-index: 60;
  height: var(--header-h);
  display: flex;
  align-items: center;
  padding: 0 var(--header-pad);
  background: var(--cream);
  border-bottom: 1px solid var(--line);
  color: var(--ink);
  transition: box-shadow 0.4s var(--ease-out);
}
.site-header.is-scrolled {
  box-shadow: 0 6px 30px rgba(45, 51, 43, 0.06);
}

.desktop-nav {
  display: none;
}

/* Page body offset to clear the fixed header */
body { padding-top: var(--header-h); }
body.no-scroll { padding-right: 0; }

.site-header-inner {
  display: grid;
  grid-template-columns: 44px 1fr 44px;
  align-items: center;
  gap: 16px;
  width: 100%;
}

.brand {
  display: flex;
  justify-content: center;
  align-items: center;
}
.brand img {
  height: 42px;
  width: auto;
  filter: none;
  image-rendering: auto;
}
.footer-brand img { filter: none; }

.header-btn {
  width: 44px;
  height: 44px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  /* UA stylesheets give <button> padding:1px 6px, which with border-box 44px
     capped the flex content box at 32px — the reason two successive icon-size
     bumps (26px, 32px->34px) painted identical pixels on phones. */
  padding: 0;
  border: 1px solid currentColor;
  border-radius: 999px;
  background: transparent;
  color: var(--ink);
  opacity: 0.85;
  transition: opacity 0.2s, background 0.3s var(--ease-out), color 0.3s var(--ease-out);
}
.header-btn:hover {
  opacity: 1;
  background: var(--ink);
  color: var(--cream);
}
.menu-toggle { justify-self: end; }
.search-toggle { justify-self: start; }
/* Round 11 (A1): the lodge-profile bars — bolder and wider — are now the
   site-wide set. (The third <i> and the heavier magnifier stroke live in the
   markup; the sweep stage adds those.) */
.menu-bars { display: inline-grid; gap: 4px; width: 20px; align-items: center; }
.menu-bars i { display: block; width: 20px; height: 2px; background: currentColor; border-radius: 1px; }

/* === Derek round 11 (A1) — icon positions, one rule for every layout ======
   Was scoped to body.lodge-page (round 3). Un-scoped here: Derek asked for
   "those same positions on all layouts". Driven entirely by
   --chrome-icon-offset, derived at :root from the rail's own tokens.

   Only >= 1025px: below that the header is the 44px | 1fr | 44px grid with
   the toggles at the padding edges, which is right for phones and tablets. */
@media (min-width: 1025px) {
  .site-header-inner {
    display: flex;
    justify-content: center;
    /* Deliberate, and required in BOTH directions: it keeps the round-10 iPad
       scrim fix working (the header content has to out-paint the z-index: 0
       ::before), and it makes the containing block for the toggles the same
       element on every page so --chrome-icon-offset has one meaning. */
    position: relative;
    z-index: 1;
  }
  .search-toggle,
  .menu-toggle {
    position: absolute;
    top: 50%;
    margin: 0;
  }
  .menu-toggle {
    right: var(--chrome-icon-offset);
    transform: translate(50%, -50%);
  }
  .search-toggle {
    left: var(--chrome-icon-offset);
    transform: translate(-50%, -50%);
  }
}

@media (min-width: 1100px) {
  :root {
    --header-h: 88px;
    --header-pad: max(28px, calc((100vw - 1360px) / 2));
  }

  .site-header {
    background: rgba(243, 240, 231, 0.94);
    backdrop-filter: blur(18px);
  }

  .site-header-inner {
    grid-template-columns: 46px minmax(0, 1fr) 46px;
    gap: clamp(18px, 2.2vw, 34px);
  }

  .brand img {
    height: 46px;
  }

  .desktop-nav {
    display: none;
  }

  .desktop-nav-left {
    justify-content: flex-end;
  }

  .desktop-nav-right {
    justify-content: flex-start;
  }

  .desktop-nav a {
    position: relative;
    display: inline-flex;
    align-items: center;
    min-height: 42px;
    padding: 12px 0;
    color: var(--ink-2);
    font-size: 0.68rem;
    font-weight: 700;
    letter-spacing: 0.14em;
    line-height: 1;
    text-transform: uppercase;
    white-space: nowrap;
    transition: color 0.22s var(--ease-out);
  }

  .desktop-nav a::after {
    content: "";
    position: absolute;
    left: 0;
    right: 0;
    bottom: 6px;
    height: 1px;
    background: var(--gold);
    transform: scaleX(0);
    transform-origin: center;
    transition: transform 0.28s var(--ease-out);
  }

  .desktop-nav a:hover {
    color: var(--ink);
  }

  .desktop-nav a:hover::after,
  .desktop-nav a[aria-current="page"]::after {
    transform: scaleX(1);
  }

  .desktop-nav .desktop-enquire {
    min-height: 42px;
    padding: 0 17px;
    border: 1px solid rgba(45, 51, 43, 0.22);
    border-radius: 999px;
    color: var(--cream);
    background: var(--ink);
    box-shadow: 0 12px 30px rgba(45, 51, 43, 0.12);
  }

  .desktop-nav .desktop-enquire::after {
    display: none;
  }

  .desktop-nav .desktop-enquire:hover {
    color: var(--ink);
    background: var(--gold-light);
    border-color: var(--gold-light);
  }

  .header-btn {
    width: 46px;
    height: 46px;
    background: rgba(255, 255, 255, 0.18);
  }
}

/* =========================
   MENU OVERLAY (used by both full menu + search)
   ========================= */
.menu-overlay {
  position: fixed;
  inset: 0;
  z-index: 70;
  background: rgba(45, 51, 43, 0.55);
  backdrop-filter: blur(3px);
  opacity: 0;
  pointer-events: none;
  transition: opacity 0.4s var(--ease-out);
}
.menu-overlay.is-active {
  opacity: 1;
  pointer-events: auto;
}

/* =========================
   MENU DRAWER (right icon)
   Derek round-6: no longer a full-screen fade — a partial-width panel that
   flies in FROM THE RIGHT (mirroring the search drawer), reaching the very
   top of the screen over the header. (Class name kept — it appears in 200+
   committed static pages.)
   ========================= */
.menu-fullscreen {
  position: fixed;
  top: 0;
  right: 0;
  bottom: 0;
  left: auto;
  z-index: 75;
  width: min(900px, 100vw);
  background: rgba(45, 51, 43, 0.97);
  backdrop-filter: blur(6px);
  color: var(--cream);
  transform: translateX(100%);
  transition: transform 0.55s var(--ease-out);
  box-shadow: -30px 0 80px rgba(45, 51, 43, 0.18);
  overflow-y: auto;
}
.menu-fullscreen.is-open {
  transform: translateX(0);
}
.menu-close {
  position: absolute;
  top: 24px;
  right: 24px;
  z-index: 80;
  width: 46px;
  height: 46px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  background: transparent;
  border: 1px solid rgba(250, 246, 236, 0.4);
  border-radius: 999px;
  color: var(--cream);
  transition: background 0.3s var(--ease-out);
}
.menu-close:hover { background: rgba(250, 246, 236, 0.12); }

.menu-fullscreen-inner {
  width: 100%;
  display: grid;
  grid-template-columns: 1.05fr 0.95fr;
  gap: 48px;
  padding: 72px 48px 48px;
  align-items: start;
}

.menu-col-browse { display: flex; flex-direction: column; gap: 0; }
.menu-col-utility {
  display: flex;
  flex-direction: column;
  gap: 30px;
  padding-top: 8px;
}

/* Browse component (shared between menu + search) */
.browse {
  display: flex;
  flex-direction: column;
  gap: 0;
  color: var(--cream);
}
.browse-search {
  display: flex;
  align-items: center;
  margin-bottom: 14px;
}
.browse-search input {
  width: 100%;
  height: 52px;
  padding: 0 22px;
  border: 1px solid rgba(250, 246, 236, 0.42);
  border-radius: 4px;
  background: transparent;
  color: var(--cream);
  font-family: var(--font-body);
  font-size: 1rem;
  font-style: italic;
  font-weight: 400;
  letter-spacing: 0.02em;
  outline: none;
  transition: border-color 0.2s, background 0.2s;
}
.browse-search input::placeholder { color: rgba(250, 246, 236, 0.55); font-style: italic; }
.browse-search input:focus { border-color: var(--gold-light); background: rgba(250, 246, 236, 0.04); }

.browse-list {
  max-height: 0;
  overflow: hidden;
  display: flex;
  flex-direction: column;
  transition: max-height 0.4s var(--ease-out), margin 0.2s;
  border: 1px solid rgba(250, 246, 236, 0.12);
  border-radius: 4px;
  background: rgba(45, 51, 43, 0.5);
}
.browse-list.is-active { max-height: 360px; overflow-y: auto; margin-bottom: 14px; }
.browse-list a {
  display: flex;
  flex-direction: column;
  gap: 2px;
  padding: 11px 18px;
  border-bottom: 1px solid rgba(250, 246, 236, 0.1);
  color: rgba(250, 246, 236, 0.88);
  font-size: 0.92rem;
  transition: background 0.2s, color 0.2s;
}
.browse-list a:last-child { border-bottom: 0; }
.browse-list a:hover { background: rgba(250, 246, 236, 0.06); color: var(--gold-light); }
.browse-list a.is-hidden { display: none; }
.browse-list .lodge-name { font-weight: 600; color: var(--cream); }
.browse-list .lodge-loc { font-size: 0.74rem; color: rgba(250, 246, 236, 0.5); letter-spacing: 0.06em; text-transform: uppercase; }
.browse-empty {
  padding: 13px 18px;
  color: rgba(250, 246, 236, 0.68);
  font-size: 0.9rem;
}

.browse-section {
  border-bottom: 1px solid rgba(250, 246, 236, 0.16);
}
.browse-toggle {
  width: 100%;
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 16px;
  /* Derek round-6: condensed drawers — tighter heading/sub-heading rhythm. */
  padding: 12px 4px;
  background: transparent;
  border: 0;
  color: var(--gold-light);
  font-family: var(--font-body);
  font-size: 1.05rem;
  font-weight: 700;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  text-align: left;
  cursor: pointer;
  transition: color 0.2s;
}
.browse-toggle:hover { color: var(--gold); }
.browse-toggle svg {
  transition: transform 0.3s var(--ease-out);
  color: var(--gold-light);
}
.browse-section.is-open .browse-toggle svg { transform: rotate(180deg); }
.browse-body {
  max-height: 0;
  overflow: hidden;
  transition: max-height 0.5s var(--ease-out);
}
.browse-section.is-open .browse-body { max-height: 1400px; }
.browse-row { padding: 0; }
.browse-link {
  display: block;
  padding: 5px 0 5px 22px;
  color: rgba(250, 246, 236, 0.92);
  font-family: var(--font-body);
  font-size: 0.92rem;
  font-weight: 500;
  letter-spacing: 0.12em;
  line-height: 1.3;
  text-transform: uppercase;
  transition: color 0.2s, padding-left 0.3s var(--ease-out);
}
.browse-link:hover { color: var(--gold-light); padding-left: 30px; }
.browse-children { padding: 2px 0 10px 38px; }
.browse-children a {
  display: block;
  padding: 2px 0;
  color: rgba(250, 246, 236, 0.6);
  font-size: 0.85rem;
  letter-spacing: 0.01em;
  line-height: 1.35;
  text-transform: none;
}
.browse-children a:hover { color: var(--cream); }

/* Menu utility column */
.menu-enquire {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  align-self: flex-start;
  padding: 14px 26px;
  background: transparent;
  border: 1.5px solid var(--gold-light);
  color: var(--gold-light);
  border-radius: 4px;
  font-family: var(--font-body);
  font-size: 0.86rem;
  font-weight: 700;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  transition: background 0.3s var(--ease-out), color 0.3s var(--ease-out);
}
.menu-enquire:hover { background: var(--gold-light); color: var(--ink); }
.menu-utility-list {
  display: flex;
  flex-direction: column;
  gap: 12px;
}
.menu-utility-list a {
  color: var(--cream);
  font-family: var(--font-body);
  font-size: 0.92rem;
  font-weight: 600;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  transition: color 0.2s, padding-left 0.3s var(--ease-out);
}
.menu-utility-list a:hover { color: var(--gold-light); padding-left: 4px; }

.menu-newsletter {
  display: flex;
  flex-direction: column;
  gap: 12px;
  padding-top: 12px;
}
.menu-newsletter-eyebrow {
  color: var(--cream);
  font-size: 0.78rem;
  font-weight: 700;
  letter-spacing: 0.2em;
  text-transform: uppercase;
}
.menu-newsletter-form {
  display: flex;
  flex-direction: column;
  gap: 12px;
  align-items: flex-start;
}
.menu-newsletter-form input {
  width: min(320px, 100%);
  height: 46px;
  padding: 0 18px;
  border: 1px solid rgba(250, 246, 236, 0.4);
  border-radius: 4px;
  background: transparent;
  color: var(--cream);
  font-family: var(--font-body);
  font-size: 0.94rem;
  font-style: italic;
  outline: none;
  transition: border-color 0.2s;
}
.menu-newsletter-form input::placeholder { color: rgba(250, 246, 236, 0.5); }
.menu-newsletter-form input:focus { border-color: var(--gold-light); }
.menu-newsletter-form button {
  align-self: flex-start;
  padding: 12px 28px;
  background: var(--gold-light);
  color: var(--ink);
  border: 0;
  border-radius: 4px;
  font-family: var(--font-body);
  font-size: 0.82rem;
  font-weight: 700;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  transition: background 0.3s var(--ease-out);
}
.menu-newsletter-form button:hover { background: var(--gold); color: var(--ink); }

.menu-contact {
  display: flex;
  flex-direction: column;
  gap: 4px;
  padding-top: 4px;
}
.menu-contact a {
  color: var(--cream);
  font-family: var(--font-body);
  font-size: 0.96rem;
  font-weight: 500;
  letter-spacing: 0.02em;
  transition: color 0.2s;
}
.menu-contact a:hover { color: var(--gold-light); }

.menu-social {
  display: flex;
  gap: 14px;
  padding-top: 6px;
}
.menu-social a {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 40px;
  height: 40px;
  color: var(--cream);
  transition: color 0.2s, transform 0.3s var(--ease-out);
}
.menu-social a:hover { color: var(--gold-light); transform: translateY(-2px); }

/* =========================
   FLY-IN SEARCH (slim left drawer)
   ========================= */
.search-drawer {
  position: fixed;
  /* Derek round-6: the drawer runs to the very top of the screen, over the
     header (z-index 75 beats the header's 60). */
  top: 0;
  left: 0;
  bottom: 0;
  z-index: 75;
  width: min(440px, 100vw);
  background: rgba(45, 51, 43, 0.97);
  backdrop-filter: blur(6px);
  color: var(--cream);
  transform: translateX(-100%);
  transition: transform 0.55s var(--ease-out);
  box-shadow: 30px 0 80px rgba(45, 51, 43, 0.18);
  overflow-y: auto;
}
.search-drawer.is-open { transform: translateX(0); }
.search-drawer .menu-close { color: var(--cream); border-color: rgba(250, 246, 236, 0.4); }
.search-drawer-inner {
  padding: 70px 40px 40px;
  display: flex;
  flex-direction: column;
  gap: 12px;
}

/* =========================
   HERO — HOME (Derek's bottom-left layout)
   ========================= */
.hero-home {
  position: relative;
  height: calc(100vh - var(--header-h) - 42px);
  min-height: 620px;
  display: flex;
  align-items: flex-end;
  justify-content: flex-start;
  padding: 90px max(40px, calc((100vw - 1280px) / 2 + 16px)) 110px;
  color: var(--cream);
  overflow: hidden;
  isolation: isolate;
}
.hero-video {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
  z-index: -2;
}
/* Veil lightened (Derek 12 Aug): "the video (and images on other pages) are
   currently too dark ... let's try it at perhaps half it's current darkness".
   Split rather than halved flat, because the two gradients do different jobs.
   The 180deg one is what actually dims the picture, so it takes the full 50%
   cut. The 90deg one is a narrow wash down the left edge that exists only to
   back the headline, which is left-aligned over it — halving that as well left
   cream type sitting on pale fever-tree bark and effectively unreadable. It
   comes down more gently and fades out sooner, so the frame reads lighter while
   the words keep their footing. */
.hero-veil {
  position: absolute;
  inset: 0;
  z-index: -1;
  background:
    linear-gradient(180deg, rgba(45, 51, 43, 0.09) 0%, rgba(45, 51, 43, 0.025) 35%, rgba(45, 51, 43, 0.2) 75%, rgba(45, 51, 43, 0.39) 100%),
    linear-gradient(90deg, rgba(45, 51, 43, 0.46) 0%, rgba(45, 51, 43, 0.14) 45%, rgba(45, 51, 43, 0.0) 100%);
}
.hero-home-video .hero-veil {
  background:
    linear-gradient(180deg, rgba(45, 51, 43, 0.06) 0%, rgba(45, 51, 43, 0.025) 34%, rgba(45, 51, 43, 0.21) 72%, rgba(45, 51, 43, 0.39) 100%),
    linear-gradient(90deg, rgba(45, 51, 43, 0.48) 0%, rgba(45, 51, 43, 0.16) 45%, rgba(45, 51, 43, 0) 100%);
}
.hero-content {
  max-width: 720px;
  display: flex;
  flex-direction: column;
  gap: 14px;
  text-align: left;
}
.hero-eyebrow {
  display: inline-block;
  font-family: var(--font-body);
  font-size: 0.84rem;
  font-weight: 500;
  letter-spacing: 0.32em;
  text-transform: uppercase;
  color: rgba(250, 246, 236, 0.92);
  text-shadow: 0 2px 14px rgba(45, 51, 43, 0.5);
}
/* Round 11 (A2): was the only ALL-CAPS h1 on the site, at 112px. Title case at
   the standard size now. text-transform AND the +0.005em tracking both go —
   the positive value only existed to open up capitals; title case wants the
   global -0.012em, which it now inherits from the h1 rule above rather than
   re-stating. (The copy itself, "Escape to the Bush", is a markup change.) */
.hero-headline {
  font-family: var(--font-display);
  font-weight: 500;
  /* Derek, 12 Aug and chased 18 Aug: "I wanted to try the headline on the Home
     Page in italics". Scoped to .hero-headline, which only index.html uses, so
     the other page headlines (.page-hero-content h1) stay upright. The nested
     <em> already italicises for accent, so this is the whole line rather than
     a fragment of it. */
  font-style: italic;
  font-size: var(--h1-hero);
  line-height: var(--h1-hero-lh);
  color: var(--cream);
  /* Tightened alongside the halved veil (round 13). Derek asked for a lighter
     video and noted the darkness was there "to make the headlines easier to
     read" — carrying the contrast on the glyphs instead of the whole frame
     keeps the words readable without putting the weight back over the film. */
  text-shadow: 0 2px 10px rgba(45, 51, 43, 0.72), 0 4px 30px rgba(45, 51, 43, 0.5);
  margin: 6px 0 0;
}
.hero-headline em { font-style: italic; font-weight: 400; color: var(--gold-light); }
.hero-sub {
  max-width: 56ch;
  margin: 18px 0 0;
  font-size: clamp(0.95rem, 1.2vw, 1.05rem);
  color: rgba(250, 246, 236, 0.86);
  line-height: 1.6;
  letter-spacing: 0.01em;
  text-shadow: 0 2px 14px rgba(45, 51, 43, 0.4);
}
.lodge-hero-copy h1,
.lodge-hero-copy h1 em { color: var(--cream); }
.lodge-hero-copy h1 { text-shadow: 0 2px 24px rgba(45, 51, 43, 0.35); }

.hero-video-toggle {
  position: absolute;
  right: 24px;
  bottom: 24px;
  width: 38px;
  height: 38px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  border: 1px solid rgba(250, 246, 236, 0.4);
  border-radius: 999px;
  background: rgba(45, 51, 43, 0.3);
  color: var(--cream);
  transition: background 0.3s var(--ease-out);
}
.hero-video-toggle:hover { background: rgba(45, 51, 43, 0.6); }

.hero-scroll {
  position: absolute;
  left: 50%;
  bottom: 30px;
  transform: translateX(-50%);
  display: inline-flex;
  align-items: center;
  justify-content: center;
  color: rgba(250, 246, 236, 0.92);
  animation: scroll-bob 2.6s infinite var(--ease-soft);
}
.hero-scroll:hover { color: var(--cream); }
@keyframes scroll-bob {
  0%, 100% { transform: translate(-50%, 0); }
  50% { transform: translate(-50%, 8px); }
}

/* =========================
   PAGE HERO (inner pages)
   ========================= */
.page-hero {
  position: relative;
  min-height: 52vh;
  display: flex;
  align-items: flex-end;
  padding: 80px max(24px, calc((100vw - 1280px) / 2)) 60px;
  color: var(--cream);
  background-size: cover;
  background-position: center;
  isolation: isolate;
}
.page-hero.compact { min-height: 38vh; }
/* The "large images on the top of the other pages" half of Derek's note, on the
   same split as .hero-veil: the 180deg picture-dimmer takes the full 50% cut,
   the 90deg headline backing eases off rather than halving. */
.page-hero-veil {
  position: absolute;
  inset: 0;
  z-index: -1;
  background:
    linear-gradient(90deg, rgba(45, 51, 43,0.62) 0%, rgba(45, 51, 43,0.26) 55%, rgba(45, 51, 43,0.05) 100%),
    linear-gradient(180deg, rgba(45, 51, 43,0.225) 0%, rgba(45, 51, 43,0.0) 30%, rgba(45, 51, 43,0.275) 100%);
}
.page-hero-content {
  max-width: 760px;
  display: flex;
  flex-direction: column;
  gap: 14px;
}
/* Round 11 (A2): the ~46-page default. Was 70.4px. */
.page-hero-content h1 {
  font-size: var(--h1-hero);
  line-height: var(--h1-hero-lh);
  color: var(--cream);
  /* Same trade as .hero-headline — the page veils halved in round 13. */
  text-shadow: 0 2px 10px rgba(45, 51, 43, 0.72), 0 4px 30px rgba(45, 51, 43, 0.5);
}
.page-hero-content h1 em { color: var(--gold-light); }
.page-hero-content p {
  max-width: 60ch;
  color: rgba(250, 246, 236, 0.92);
  font-size: 1.04rem;
}
.page-hero.destination-landing {
  min-height: 72vh;
  padding-bottom: 76px;
  background-position: center;
}
.destination-landing .page-hero-veil {
  background:
    linear-gradient(90deg, rgba(45, 51, 43,0.82) 0%, rgba(45, 51, 43,0.42) 48%, rgba(45, 51, 43,0.08) 100%),
    linear-gradient(180deg, rgba(45, 51, 43,0.32) 0%, rgba(45, 51, 43,0.02) 34%, rgba(45, 51, 43,0.68) 100%);
}
.destination-hero-content {
  max-width: 820px;
}
/* Round 11 (A2): destinations/south-africa/ landing. Was 102.4px. Note this
   rule only ever reaches ONE page — the 29 reserve pages put
   .destination-hero-content on a .lodge-hero-copy, and .lodge-hero-copy h1
   below wins on source order at equal specificity. Both now take the token. */
.destination-hero-content h1 {
  font-size: var(--h1-hero);
  line-height: var(--h1-hero-lh);
}
.destination-hero-content p {
  max-width: 66ch;
  font-size: clamp(1.04rem, 1.5vw, 1.22rem);
  line-height: 1.68;
}
.destination-hero-meta {
  display: flex;
  flex-wrap: wrap;
  gap: 10px;
  margin-top: 10px;
}
.destination-hero-meta span {
  display: inline-flex;
  align-items: center;
  min-height: 40px;
  padding: 10px 14px;
  border: 1px solid rgba(250, 246, 236, 0.24);
  border-radius: 999px;
  background: rgba(45, 51, 43, 0.24);
  color: rgba(250, 246, 236, 0.9);
  backdrop-filter: blur(10px);
  font-size: 0.78rem;
  font-weight: 600;
  letter-spacing: 0.06em;
  text-transform: uppercase;
}
.destination-hero-meta strong {
  margin-right: 5px;
  color: var(--gold-light);
  font-size: 1rem;
}
.destination-hero-actions {
  display: flex;
  flex-wrap: wrap;
  gap: 12px;
  margin-top: 10px;
}
.destination-hero-actions .hero-cta {
  background: var(--cream);
  color: var(--ink);
  border-color: var(--cream);
}
.destination-hero-actions .hero-cta.secondary {
  background: rgba(45, 51, 43, 0.18);
  color: var(--cream);
  border-color: rgba(250, 246, 236, 0.54);
}
.destination-gallery-hero {
  --lodge-photo-h: calc(100svh - var(--header-h));
  --destination-card-overlap: clamp(220px, 34svh, 324px);
  display: block;
  min-height: 0;
  padding-top: calc(var(--lodge-photo-h) - var(--destination-card-overlap));
  background-image: none !important;
  color: var(--ink);
}
.lodge-hero.destination-gallery-hero[data-lodge-hero-slider] {
  overflow: visible;
}
.destination-gallery-hero .lodge-hero-slide,
.destination-gallery-hero .lodge-hero-veil {
  inset: 0 0 auto;
  height: var(--lodge-photo-h);
}
.destination-gallery-hero .lodge-hero-slide {
  background-position: center;
}
.destination-gallery-hero .lodge-hero-veil {
  background:
    linear-gradient(180deg, rgba(45, 51, 43, 0.12) 0%, rgba(45, 51, 43, 0.02) 38%, rgba(45, 51, 43, 0.46) 100%),
    linear-gradient(90deg, rgba(45, 51, 43, 0.22) 0%, rgba(45, 51, 43, 0) 54%);
}
.destination-gallery-hero .lodge-hero-copy {
  width: min(860px, calc(100vw - 48px));
  max-width: 860px;
  gap: 16px;
  padding: 34px 42px 38px;
  border: 1px solid rgba(45, 51, 43, 0.08);
  border-radius: 24px 24px 8px 8px;
  background: rgba(255, 255, 255, 0.96);
  color: var(--ink);
  box-shadow: 0 22px 62px rgba(45, 51, 43, 0.16);
  backdrop-filter: blur(16px);
}
.destination-gallery-hero .lodge-hero-copy.reveal {
  opacity: 1;
  transform: none;
}
.destination-gallery-hero .lodge-hero-inner {
  position: relative;
  z-index: 3;
  padding: 0 max(24px, calc((100vw - 1280px) / 2)) 82px;
}
.destination-gallery-hero .lodge-hero-gallery-link {
  top: calc(var(--lodge-photo-h) - var(--destination-card-overlap) - 92px);
  right: auto;
  bottom: auto;
  left: max(24px, calc((100vw - 1280px) / 2));
  width: max-content;
  height: auto;
}
.destination-gallery-hero .lodge-hero-kicker {
  padding: 0;
  border: 0;
  border-radius: 0;
  color: var(--teal-deep);
  background: transparent;
  backdrop-filter: none;
}
.destination-gallery-hero .lodge-hero-copy h1,
.destination-gallery-hero .lodge-hero-copy h1 em {
  color: var(--ink);
  text-shadow: none;
}
.destination-gallery-hero .destination-hero-content p {
  color: var(--ink-2);
  text-shadow: none;
}
.destination-gallery-hero .destination-hero-meta span {
  border-color: var(--line);
  background: rgba(248, 249, 245, 0.92);
  color: var(--ink-2);
  backdrop-filter: none;
}
.destination-gallery-hero .destination-hero-meta strong {
  color: var(--teal-deep);
}
.destination-gallery-hero .destination-hero-actions .hero-cta {
  background: var(--ink);
  color: var(--cream);
  border-color: var(--ink);
}
.destination-gallery-hero .destination-hero-actions .hero-cta.secondary {
  background: transparent;
  color: var(--ink);
  border-color: var(--ink);
}
.destination-gallery-section {
  padding-top: 78px;
}

.destination-intro {
  display: grid;
  grid-template-columns: minmax(0, 1fr) 420px;
  gap: 56px;
  align-items: start;
  padding: 86px max(24px, calc((100vw - 1280px) / 2));
  background: var(--cream);
  border-bottom: 1px solid var(--line);
}
.destination-intro-copy {
  max-width: 760px;
}
.destination-intro-copy h2 {
  font-size: clamp(2.2rem, 4.8vw, 4.4rem);
  margin-bottom: 18px;
}
.destination-intro-copy p {
  max-width: 68ch;
  color: var(--ink-2);
  font-size: 1.04rem;
  line-height: 1.78;
}
.destination-region-pills {
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
  margin-top: 24px;
}
.destination-region-pills span {
  padding: 8px 12px;
  border: 1px solid var(--line-strong);
  border-radius: 999px;
  color: var(--teal-deep);
  background: rgba(255, 255, 255, 0.56);
  font-size: 0.78rem;
  font-weight: 700;
  letter-spacing: 0.08em;
  text-transform: uppercase;
}
.destination-proof-grid {
  display: grid;
  gap: 12px;
}
.destination-proof-grid div {
  display: grid;
  grid-template-columns: 46px minmax(0, 1fr);
  gap: 14px;
  align-items: start;
  padding: 20px;
  border: 1px solid var(--line);
  border-radius: var(--radius);
  background: var(--paper);
  box-shadow: var(--shadow-soft);
}
.destination-proof-grid strong {
  color: var(--gold);
  font-family: var(--font-display);
  font-size: 1.8rem;
  font-weight: 400;
  line-height: 1;
}
.destination-proof-grid span {
  color: var(--ink-2);
  line-height: 1.55;
}
.destination-listing {
  padding-top: 78px;
}

/* =========================
   ESCAPE SPLIT SECTION (below-fold opener)
   ========================= */
.escape-split {
  display: grid;
  grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
  gap: 60px;
  align-items: center;
  padding: 110px max(24px, calc((100vw - 1280px) / 2));
}
.escape-image {
  aspect-ratio: 4 / 5;
  background-size: cover;
  background-position: center;
  border-radius: 2px;
  box-shadow: var(--shadow-soft);
}
.escape-copy { max-width: 540px; }
.escape-headline {
  font-family: var(--font-display);
  font-weight: 500;
  font-size: clamp(2.8rem, 5.4vw, 4.6rem);
  line-height: 1.02;
  color: var(--ink);
  margin: 0 0 24px;
}
.escape-headline em {
  font-style: italic;
  font-weight: 400;
  color: var(--gold);
}
.escape-copy p {
  color: var(--ink-2);
  font-size: 1.04rem;
  line-height: 1.78;
}

/* =========================
   PROMISE CAROUSEL (5 blocks)
   ========================= */
.promise {
  position: relative;
  background: var(--bone);
  padding: 60px max(24px, calc((100vw - 1280px) / 2)) 90px;
}
.promise-title-h {
  text-align: center;
  font-family: var(--font-body);
  font-weight: 700;
  font-size: clamp(1.2rem, 2vw, 1.55rem);
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--ink);
  margin: 0 0 50px;
}
.promise-track {
  display: grid;
  grid-template-columns: 56px minmax(0, 1fr) 56px;
  gap: 18px;
  align-items: center;
}
.promise-viewport {
  overflow: hidden;
}
.promise-rail {
  display: flex;
  gap: 36px;
  transition: transform 0.6s var(--ease-out);
  will-change: transform;
}
.promise-slide {
  flex: 0 0 calc((100% - 72px) / 3);
  display: flex;
  flex-direction: column;
  align-items: center;
  text-align: center;
  gap: 14px;
  padding: 10px 14px 22px;
}
.promise-badge {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 44px;
  height: 44px;
  border-radius: 999px;
  background: var(--gold);
  color: var(--ink);
  font-family: var(--font-body);
  font-size: 1.1rem;
  font-weight: 700;
  letter-spacing: 0;
  box-shadow: 0 4px 14px rgba(200, 154, 63, 0.3);
}
.promise-title {
  font-family: var(--font-body);
  font-size: 0.96rem;
  font-weight: 700;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--ink);
  margin: 6px 0 0;
}
.promise-copy {
  margin: 0;
  color: var(--ink-2);
  font-size: 0.94rem;
  line-height: 1.7;
  max-width: 30ch;
}
.promise-arrow {
  width: 50px;
  height: 50px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  border: 1px solid var(--line-strong);
  border-radius: 999px;
  background: transparent;
  color: var(--ink);
  transition: background 0.3s var(--ease-out), color 0.3s var(--ease-out), border-color 0.3s var(--ease-out), opacity 0.2s;
  justify-self: center;
}
.promise-arrow:hover {
  background: var(--ink);
  color: var(--cream);
  border-color: var(--ink);
}
.promise-arrow:disabled {
  opacity: 0.25;
  cursor: not-allowed;
}
.promise-dots {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 0;
  margin-top: 24px;
}
.promise-dot {
  position: relative;
  width: 44px;
  height: 44px;
  padding: 0;
  border: 0;
  border-radius: 999px;
  background: transparent;
  cursor: pointer;
}
.promise-dot::before {
  content: "";
  position: absolute;
  inset: 18px;
  border-radius: inherit;
  background: rgba(45, 51, 43, 0.3);
  transition: background 0.3s var(--ease-out), transform 0.3s var(--ease-out);
}
.promise-dot.is-active::before {
  background: var(--gold);
  transform: scale(1.4);
}
.promise-dot:focus-visible {
  outline: 2px solid var(--gold);
  outline-offset: -8px;
}

.whatsapp-float {
  position: fixed;
  right: max(18px, env(safe-area-inset-right));
  bottom: max(18px, env(safe-area-inset-bottom));
  z-index: 60;
  display: inline-flex;
  align-items: center;
  gap: 10px;
  min-height: 46px;
  padding: 0 18px;
  border-radius: 999px;
  background: #25d366;
  color: #2d332b;
  font-weight: 800;
  font-size: 0.82rem;
  letter-spacing: 0.04em;
  text-transform: uppercase;
  box-shadow: 0 16px 34px rgba(45, 51, 43, 0.24);
}
.whatsapp-float:hover {
  transform: translateY(-2px);
  color: #2d332b;
}
.whatsapp-float svg {
  width: 20px;
  height: 20px;
  flex: 0 0 auto;
}

@media (max-width: 640px) {
  .whatsapp-float {
    width: 54px;
    min-height: 54px;
    justify-content: center;
    padding: 0;
    border-radius: 50%;
  }
  .whatsapp-float span {
    position: absolute;
    width: 1px;
    height: 1px;
    overflow: hidden;
    clip: rect(0 0 0 0);
    white-space: nowrap;
  }
  .whatsapp-float svg {
    width: 24px;
    height: 24px;
  }
}

/* =========================
   SECTIONS
   ========================= */
.section {
  padding: 110px max(24px, calc((100vw - 1280px) / 2));
}
.section.tinted { background: var(--bone); }

.section-head {
  max-width: 680px;
  margin-bottom: 52px;
}
.section-head.centered {
  margin-left: auto;
  margin-right: auto;
  text-align: center;
}
.section-head h2 { font-size: clamp(2rem, 4vw, 3.6rem); }

/* =========================
   DESTINATION GRID
   ========================= */
.destination-grid {
  display: grid;
  grid-template-columns: 1.4fr 1fr 1fr;
  grid-template-rows: 1fr 1fr;
  gap: 18px;
  min-height: 580px;
}
.destination-grid .card:nth-child(1) { grid-row: span 2; }
.destination-grid .card:nth-child(2) { grid-column: 2; }
.destination-grid .card:nth-child(3) { grid-column: 3; }
.destination-grid .card:nth-child(4) { grid-column: 2; }
.destination-grid .card:nth-child(5) { grid-column: 3; }

/* =========================
   CARDS (universal)
   ========================= */
.card {
  position: relative;
  background: var(--paper);
  border-radius: var(--radius);
  overflow: hidden;
  display: flex;
  flex-direction: column;
  border: 1px solid var(--line);
  transition: transform 0.5s var(--ease-out), box-shadow 0.5s var(--ease-out);
}
.card:hover {
  transform: translateY(-4px);
  box-shadow: var(--shadow-soft);
}
.card-media-wrap {
  position: relative;
  overflow: hidden;
  background: var(--bone);
}
.card-media {
  position: relative;
  display: block;
  aspect-ratio: 4 / 3;
  overflow: hidden;
  background: var(--bone);
}
.card-media img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  transition: transform 0.8s var(--ease-out);
}
.card:hover .card-media img { transform: scale(1.06); }
.favourite-button {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 8px;
  min-height: 44px;
  padding: 11px 16px;
  border: 1px solid rgba(250, 246, 236, 0.58);
  border-radius: 999px;
  color: var(--cream);
  background: rgba(45, 51, 43, 0.26);
  backdrop-filter: blur(12px);
  font-size: 0.74rem;
  font-weight: 800;
  letter-spacing: 0.12em;
  line-height: 1;
  text-transform: uppercase;
  transition: background 0.25s var(--ease-out), color 0.25s var(--ease-out), border-color 0.25s var(--ease-out), transform 0.25s var(--ease-out);
}
.favourite-button:hover {
  transform: translateY(-1px);
  background: rgba(250, 246, 236, 0.95);
  color: var(--ink);
  border-color: rgba(250, 246, 236, 0.95);
}
.favourite-button.is-saved {
  color: var(--ink);
  background: var(--gold-light);
  border-color: var(--gold-light);
}
.favourite-button.is-saved svg path {
  fill: currentColor;
}
.card-favourite {
  position: absolute;
  top: 14px;
  right: 14px;
  z-index: 3;
  min-height: 40px;
  padding: 9px 13px;
  color: var(--cream);
  box-shadow: 0 16px 32px rgba(45, 51, 43, 0.18);
}
.card-body {
  flex: 1;
  display: flex;
  flex-direction: column;
  gap: 6px;
  padding: 22px 22px 24px;
}
.card-meta {
  font-size: 0.74rem;
  font-weight: 600;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--teal-deep);
}
.card-title {
  font-family: var(--font-display);
  font-size: 1.55rem;
  font-weight: 500;
  line-height: 1.15;
  margin: 4px 0 6px;
}
.card-title a { color: var(--ink); }
.card-excerpt {
  flex: 1;
  margin: 0 0 20px;
  color: var(--ink-2);
  font-size: 0.94rem;
  line-height: 1.65;
}
.card-foot {
  display: flex;
  justify-content: space-between;
  align-items: flex-end;
  gap: 14px;
  padding-top: 16px;
  border-top: 1px solid var(--line);
}
.card-price {
  display: flex;
  flex-direction: column;
  gap: 2px;
  line-height: 1.1;
  min-width: 0;
}
.price-topline {
  display: flex;
  align-items: center;
  gap: 8px;
  flex-wrap: wrap;
}
.price-label {
  font-size: 0.7rem;
  font-weight: 500;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  color: var(--ink-3);
}
.save-badge {
  display: inline-flex;
  align-items: center;
  min-height: 22px;
  padding: 4px 8px;
  border-radius: 999px;
  background: rgba(165, 173, 0, 0.14);
  color: var(--teal-deep);
  font-size: 0.64rem;
  font-weight: 700;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  white-space: nowrap;
}
.price-amount {
  font-family: var(--font-body);
  font-size: 1.4rem;
  font-weight: 600;
  color: var(--ink);
  letter-spacing: -0.005em;
}
.price-normal {
  color: var(--ink-3);
  font-size: 0.72rem;
  text-decoration: line-through;
  text-decoration-thickness: 1px;
  text-decoration-color: rgba(79, 89, 77, 0.45);
}
.price-unit {
  font-size: 0.72rem;
  color: var(--ink-3);
}
.card-enquire {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  color: var(--teal-deep);
  font-size: 0.78rem;
  font-weight: 600;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  padding-bottom: 2px;
  border-bottom: 1px solid var(--teal-deep);
  transition: gap 0.3s var(--ease-out), color 0.3s var(--ease-out);
}
.card-enquire:hover {
  gap: 10px;
  color: var(--ink);
  border-color: var(--ink);
}

/* Derek round-6 — lodge cards: green price with "per person sharing/night"
   directly beneath it, "Normally R…" strikethrough, the Save-% chip at the
   bottom, the site's green Enquire pill, and a stretched title link making the
   whole card clickable.

   Round 10 (2026-08-06): unscoped from .section-related to .lodge-grid. Derek
   asked for this card "wherever lodges are listed anywhere on the website",
   so the ~40 static listing pages were rebaked onto the same markup by
   scripts/round10-rebuild-cards.cjs. .destination-grid is a different card and
   is deliberately not covered. The Save heart (.card-favourite, z-index 3)
   stays above the stretched link. */
.lodge-grid .card { position: relative; }
.lodge-grid .price-amount { color: var(--green-accent, #8c9500); }
.lodge-grid .card-price { gap: 3px; }
.lodge-grid .card-price .save-badge { margin-top: 6px; align-self: flex-start; }
.lodge-grid .card-enquire {
  position: relative;
  z-index: 2;
  background: var(--gold, #a5ad00);
  color: #fff;
  font-size: 0.74rem;
  font-weight: 800;
  padding: 11px 18px;
  border-bottom: 0;
  border-radius: 999px;
  transition: background 0.3s var(--ease-out);
}
.lodge-grid .card-enquire:hover {
  gap: 6px;
  background: var(--teal-deep, #5c6100);
  color: #fff;
}
.lodge-grid .card-title a::after {
  content: "";
  position: absolute;
  inset: 0;
  z-index: 1;
}

/* Destination grid cards have image filling full card */
.destination-grid .card {
  position: relative;
  border: 0;
  background: var(--ink);
  color: var(--cream);
  display: block;
  overflow: hidden;
  cursor: pointer;
}
.destination-grid .card-media-wrap {
  position: absolute;
  inset: 0;
}
.destination-grid .card-media {
  position: absolute;
  inset: 0;
  aspect-ratio: auto;
  display: block;
}
.destination-grid .card-media::after {
  content: "";
  position: absolute;
  inset: 0;
  background: linear-gradient(180deg, rgba(45, 51, 43,0) 35%, rgba(45, 51, 43,0.92) 100%);
  pointer-events: none;
  z-index: 1;
}
.destination-grid .card-body {
  position: absolute;
  left: 0;
  right: 0;
  bottom: 0;
  z-index: 2;
  padding: 28px 26px;
  background: transparent;
  display: flex;
  flex-direction: column;
  gap: 4px;
  pointer-events: none;
}
.destination-grid .card-meta { color: var(--gold-light); }
.destination-grid .card-title { color: var(--cream); font-size: 1.85rem; margin: 6px 0 4px; }
.destination-grid .card-title a { color: var(--cream); }
.destination-grid .card-excerpt { color: rgba(250, 246, 236, 0.85); margin-bottom: 0; font-size: 0.92rem; max-width: 36ch; }
.destination-grid .card-foot,
.destination-grid .card-price,
.destination-grid .card-favourite,
.destination-grid .card-enquire { display: none; }
.destination-grid .card:hover .card-media img { transform: scale(1.05); }

/* =========================
   IDEA PILLS
   ========================= */
.idea-cloud {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  gap: 14px;
  max-width: 1080px;
  margin: 0 auto;
}
.idea-pill {
  display: inline-flex;
  align-items: center;
  padding: 13px 24px;
  background: var(--paper);
  border: 1px solid var(--line);
  border-radius: 999px;
  font-family: var(--font-body);
  font-size: 0.92rem;
  font-weight: 500;
  color: var(--ink);
  letter-spacing: 0.01em;
  transition: all 0.3s var(--ease-out);
}
.idea-pill:hover {
  background: var(--ink);
  color: var(--cream);
  transform: translateY(-2px);
}

/* =========================
   LODGE GRID + TOOLBAR
   ========================= */
.lodge-grid {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: 28px;
}
.toolbar {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 18px;
  margin-bottom: 36px;
  flex-wrap: wrap;
}
.toolbar-search {
  flex: 1;
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 0 18px;
  height: 50px;
  max-width: 480px;
  border: 1px solid var(--line-strong);
  border-radius: 999px;
  background: var(--paper);
}
.toolbar-search svg { color: var(--ink-3); flex: 0 0 auto; }
.toolbar-search input {
  flex: 1;
  border: 0;
  background: transparent;
  font-family: var(--font-body);
  font-size: 0.96rem;
  outline: none;
  color: var(--ink);
}
.toolbar-search input::placeholder { color: var(--ink-3); }
.toolbar-count {
  font-size: 0.82rem;
  font-weight: 600;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--ink-2);
}
.catalogue-filters {
  display: grid;
  gap: 18px;
  margin: -16px 0 38px;
  padding: 20px;
  border: 1px solid var(--line);
  border-radius: var(--radius);
  background: rgba(255, 255, 255, 0.72);
  box-shadow: 0 18px 46px rgba(45, 51, 43, 0.07);
}
.filter-controls {
  display: grid;
  grid-template-columns: repeat(5, minmax(150px, 1fr));
  gap: 12px;
}
.filter-control {
  display: flex;
  min-width: 0;
  flex-direction: column;
  gap: 7px;
}
.filter-control span,
.filter-group-label {
  color: var(--teal-deep);
  font-size: 0.62rem;
  font-weight: 800;
  letter-spacing: 0.15em;
  line-height: 1;
  text-transform: uppercase;
}
.filter-control select {
  width: 100%;
  height: 46px;
  padding: 0 38px 0 14px;
  border: 1px solid var(--line-strong);
  border-radius: var(--radius-sm);
  color: var(--ink);
  background: var(--paper);
  font-family: var(--font-body);
  font-size: 0.9rem;
  outline: none;
}
.filter-control select:focus {
  border-color: var(--teal-deep);
  box-shadow: 0 0 0 3px rgba(42, 128, 137, 0.12);
}
.filter-bottom {
  display: flex;
  align-items: flex-end;
  justify-content: space-between;
  gap: 16px;
}
.filter-chip-group {
  display: flex;
  flex: 1;
  flex-wrap: wrap;
  gap: 9px;
  min-width: 0;
}
.filter-group-label {
  flex: 0 0 100%;
}
.filter-chip {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  min-height: 38px;
  padding: 8px 12px;
  border: 1px solid var(--line);
  border-radius: 999px;
  background: var(--paper);
  color: var(--ink-2);
  font-size: 0.78rem;
  font-weight: 700;
  letter-spacing: 0.03em;
  white-space: nowrap;
  cursor: pointer;
}
.filter-chip input {
  width: 15px;
  height: 15px;
  accent-color: var(--teal-deep);
}
.filter-chip:has(input:checked) {
  border-color: rgba(42, 128, 137, 0.28);
  background: rgba(42, 128, 137, 0.1);
  color: var(--ink);
}
.filter-reset {
  min-height: 40px;
  padding: 10px 15px;
  border: 1px solid var(--ink);
  border-radius: 999px;
  background: transparent;
  color: var(--ink);
  font-size: 0.72rem;
  font-weight: 800;
  letter-spacing: 0.12em;
  text-transform: uppercase;
}
.filter-reset:hover {
  background: var(--ink);
  color: var(--cream);
}
.filter-empty {
  margin: -12px 0 28px;
  padding: 22px;
  border: 1px solid var(--line);
  border-radius: var(--radius);
  background: var(--paper);
  color: var(--ink-2);
  text-align: center;
}
.filter-empty.is-hidden {
  display: none;
}
.card.is-hidden { display: none; }

/* =========================
   REVIEWS SECTION
   reviews scroll on LEFT, sticky video on RIGHT (Derek's layout)
   ========================= */
.reviews-head {
  text-align: center;
  max-width: 760px;
  margin: 0 auto 56px;
}
.reviews-head h2 {
  font-family: var(--font-body);
  font-size: clamp(1.4rem, 2.4vw, 1.85rem);
  font-weight: 700;
  letter-spacing: 0.18em;
  text-transform: uppercase;
}
.reviews-head .lede { margin: 18px auto 0; }
.reviews-layout {
  display: grid;
  grid-template-columns: minmax(0, 1fr) 420px;
  gap: 60px;
  align-items: start;
}
.reviews-side {
  position: sticky;
  top: calc(var(--header-h) + 24px);
  display: flex;
  flex-direction: column;
  gap: 18px;
}
.reviews-video {
  position: relative;
  overflow: hidden;
  aspect-ratio: 4 / 5;
  background: var(--ink);
  border-radius: 2px;
  box-shadow: var(--shadow-soft);
}
.reviews-video img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  opacity: 0.9;
}
.reviews-play {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  width: 70px;
  height: 70px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  border-radius: 999px;
  background: rgba(250, 246, 236, 0.92);
  color: var(--ink);
}
.reviews-side .ghost-link { align-self: flex-start; }

.reviews-stream {
  display: flex;
  flex-direction: column;
  gap: 28px;
}
.review-row {
  display: grid;
  grid-template-columns: 200px minmax(0, 1fr);
  gap: 0;
  align-items: start;
}
.review-row:nth-child(even) {
  grid-template-columns: minmax(0, 1fr) 200px;
}
.review-row:nth-child(even) .review-tag {
  order: 2;
  margin: 28px 0 0 -28px;
}
.review-row:nth-child(even) .review-card {
  order: 1;
}
.review-tag {
  position: relative;
  z-index: 2;
  display: flex;
  flex-direction: column;
  gap: 4px;
  padding: 16px 20px;
  margin: 28px -28px 0 0;
  background: var(--gold);
  color: var(--ink);
  border-radius: 2px;
  align-self: start;
}
.review-tag strong {
  font-family: var(--font-body);
  font-size: 0.94rem;
  font-weight: 700;
  letter-spacing: 0.06em;
  text-transform: uppercase;
}
.review-tag span {
  font-size: 0.78rem;
  font-weight: 500;
  color: rgba(45, 51, 43, 0.7);
}
.review-card {
  margin: 0;
  padding: 28px 32px;
  background: var(--paper);
  border: 1px solid var(--line);
  border-radius: 2px;
  box-shadow: var(--shadow-soft);
}
.review-lead {
  margin: 0 0 12px;
  font-family: var(--font-body);
  font-size: 1.04rem;
  font-weight: 700;
  color: var(--ink);
  line-height: 1.45;
}
.review-body {
  margin: 0;
  color: var(--ink-2);
  font-size: 0.94rem;
  line-height: 1.7;
}

/* =========================
   CLIENT FEEDBACK PAGE
   ========================= */
.feedback-hero {
  min-height: 66vh;
  background-position: center 42%;
}
.feedback-hero .page-hero-veil {
  background:
    linear-gradient(90deg, rgba(45, 51, 43, 0.82) 0%, rgba(45, 51, 43, 0.46) 50%, rgba(45, 51, 43, 0.12) 100%),
    linear-gradient(180deg, rgba(45, 51, 43, 0.28) 0%, rgba(45, 51, 43, 0.0) 34%, rgba(45, 51, 43, 0.7) 100%);
}
.feedback-hero-actions {
  display: flex;
  flex-wrap: wrap;
  gap: 12px;
  margin-top: 12px;
}
.feedback-hero-actions .hero-cta.secondary {
  background: rgba(250, 246, 236, 0.12);
  color: var(--cream);
}
.feedback-hero-actions .hero-cta.secondary:hover {
  background: var(--cream);
  color: var(--ink);
}
.feedback-proof {
  padding-top: 84px;
}
.feedback-proof-layout {
  display: grid;
  grid-template-columns: minmax(0, 0.9fr) minmax(420px, 1fr);
  gap: 64px;
  align-items: end;
}
.feedback-proof-copy h2 {
  max-width: 620px;
  font-size: clamp(2.2rem, 4.4vw, 4rem);
}
.feedback-proof-copy p {
  max-width: 58ch;
  margin-top: 20px;
  color: var(--ink-2);
  font-size: 1.02rem;
  line-height: 1.72;
}
.feedback-proof-grid {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  border-top: 1px solid var(--line);
  border-bottom: 1px solid var(--line);
}
.feedback-proof-item {
  min-height: 158px;
  padding: 28px 22px;
  border-left: 1px solid var(--line);
}
.feedback-proof-item:first-child { border-left: 0; }
.feedback-proof-item strong {
  display: block;
  margin-bottom: 14px;
  font-family: var(--font-display);
  font-size: clamp(2.4rem, 5vw, 4.2rem);
  font-weight: 500;
  line-height: 0.9;
  color: var(--teal-deep);
}
.feedback-proof-item span {
  display: block;
  max-width: 13ch;
  color: var(--ink-2);
  font-size: 0.78rem;
  font-weight: 700;
  letter-spacing: 0.1em;
  line-height: 1.55;
  text-transform: uppercase;
}
.feedback-featured {
  display: grid;
  grid-template-columns: minmax(0, 1.1fr) minmax(380px, 0.9fr);
  min-height: 620px;
  background: var(--ink);
  color: var(--cream);
}
.feedback-featured-image {
  min-height: 460px;
}
.feedback-featured-image img {
  width: 100%;
  height: 100%;
  object-fit: cover;
}
.feedback-featured-quote {
  display: flex;
  flex-direction: column;
  justify-content: center;
  gap: 22px;
  margin: 0;
  padding: clamp(54px, 7vw, 96px);
}
.feedback-featured-quote p {
  margin: 0;
  font-family: var(--font-display);
  font-size: clamp(2.2rem, 3.6vw, 3.5rem);
  font-weight: 400;
  line-height: 1.04;
  color: var(--cream);
}
.feedback-featured-quote cite {
  max-width: 34ch;
  color: rgba(250, 246, 236, 0.72);
  font-style: normal;
  font-size: 0.86rem;
  font-weight: 700;
  letter-spacing: 0.12em;
  line-height: 1.6;
  text-transform: uppercase;
}
.feedback-reviews .section-head {
  max-width: 760px;
}
.feedback-review-grid {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: 18px;
}
.feedback-review {
  display: flex;
  min-height: 300px;
  flex-direction: column;
  justify-content: space-between;
  gap: 28px;
  padding: 28px;
  background: var(--paper);
  border: 1px solid var(--line);
  border-radius: 6px;
  box-shadow: var(--shadow-soft);
}
.feedback-review-kicker {
  color: var(--teal-deep);
  font-size: 0.72rem;
  font-weight: 800;
  letter-spacing: 0.12em;
  line-height: 1.45;
  text-transform: uppercase;
}
.feedback-review blockquote {
  margin: 0;
  color: var(--ink);
  font-family: var(--font-display);
  font-size: clamp(1.45rem, 2.2vw, 2rem);
  line-height: 1.12;
}
.feedback-gallery-section {
  padding-top: 92px;
  padding-bottom: 110px;
}
.feedback-gallery-grid {
  display: grid;
  grid-template-columns: 1.2fr 0.8fr 0.8fr;
  grid-auto-rows: minmax(230px, 26vw);
  gap: 18px;
}
.feedback-gallery-item {
  position: relative;
  min-height: 230px;
  margin: 0;
  overflow: hidden;
  border-radius: 6px;
  background: var(--ink);
}
.feedback-gallery-item-large {
  grid-row: span 2;
}
.feedback-gallery-item img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  transition: transform 0.8s var(--ease-out);
}
.feedback-gallery-item:hover img {
  transform: scale(1.035);
}
.feedback-gallery-item::after {
  content: "";
  position: absolute;
  inset: 0;
  background: linear-gradient(180deg, rgba(45, 51, 43, 0.0) 44%, rgba(45, 51, 43, 0.78) 100%);
}
.feedback-gallery-item figcaption {
  position: absolute;
  left: 22px;
  right: 22px;
  bottom: 20px;
  z-index: 1;
  color: var(--cream);
  font-size: 0.88rem;
  font-weight: 700;
  letter-spacing: 0.04em;
  line-height: 1.45;
}
.feedback-cta {
  padding-bottom: 82px;
}
.feedback-related {
  padding-top: 74px;
}

/* =========================
   ABOUT PAGE
   ========================= */
.about-hero {
  min-height: calc(100svh - var(--header-h));
  padding-bottom: 142px;
  background-position: center;
}
.about-hero .page-hero-veil {
  background:
    linear-gradient(90deg, rgba(45, 51, 43, 0.86) 0%, rgba(45, 51, 43, 0.44) 48%, rgba(45, 51, 43, 0.08) 100%),
    linear-gradient(180deg, rgba(45, 51, 43, 0.26) 0%, rgba(45, 51, 43, 0.04) 36%, rgba(45, 51, 43, 0.78) 100%);
}
.about-hero-content {
  max-width: 900px;
}
/* Round 11 (A3): About Us keeps its two-size split — the "We sell just one
   thing." lead stays at 65px (see .about-hero-lead in css/_r8-about.css, which
   is sized in em off this) while the second sentence takes the 86px standard. */
.about-hero-content h1 {
  max-width: 820px;
  font-size: var(--h1-hero);
  line-height: var(--h1-hero-lh);
}
.about-hero-content p {
  max-width: 680px;
  font-size: clamp(1.05rem, 1.6vw, 1.25rem);
  line-height: 1.68;
}
.about-hero-actions {
  display: flex;
  flex-wrap: wrap;
  gap: 12px;
  margin-top: 14px;
}
.about-hero-secondary {
  background: rgba(45, 51, 43, 0.2);
  color: var(--cream);
  border-color: rgba(250, 246, 236, 0.64);
  backdrop-filter: blur(10px);
}
.about-intro {
  position: relative;
  z-index: 3;
  display: grid;
  grid-template-columns: minmax(0, 1fr) 430px;
  gap: 18px;
  align-items: stretch;
  width: min(1280px, calc(100vw - 48px));
  margin: -94px auto 0;
  padding-bottom: 100px;
}
.about-intro-card {
  padding: 46px 52px 50px;
  border: 1px solid rgba(45, 51, 43, 0.08);
  border-radius: var(--radius);
  background: rgba(255, 255, 255, 0.96);
  box-shadow: 0 24px 70px rgba(45, 51, 43, 0.16);
  backdrop-filter: blur(16px);
}
.about-intro-card.reveal,
.about-proof-grid.reveal {
  opacity: 1;
  transform: none;
}
.about-intro-card h2 {
  max-width: 780px;
  margin-bottom: 20px;
  font-size: clamp(2.5rem, 5.8vw, 5rem);
}
.about-intro-card p {
  max-width: 760px;
  color: var(--ink-2);
  font-size: 1.04rem;
  line-height: 1.78;
}
.about-proof-grid {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: 12px;
}
.about-proof-grid div {
  display: flex;
  flex-direction: column;
  justify-content: space-between;
  min-height: 168px;
  padding: 24px;
  border: 1px solid var(--line);
  border-radius: var(--radius);
  background: rgba(248, 249, 245, 0.96);
  box-shadow: 0 18px 50px rgba(45, 51, 43, 0.1);
}
.about-proof-grid strong {
  color: var(--gold);
  font-family: var(--font-display);
  font-size: clamp(2.5rem, 4.5vw, 3.7rem);
  font-weight: 400;
  line-height: 0.95;
}
.about-proof-grid span {
  color: var(--ink-2);
  font-size: 0.92rem;
  line-height: 1.55;
}
.about-story {
  display: grid;
  grid-template-columns: minmax(0, 0.88fr) minmax(0, 1.12fr);
  gap: 58px;
  align-items: center;
  padding-top: 0;
}
.about-story-copy {
  max-width: 560px;
}
.about-story-copy h2 {
  margin-bottom: 22px;
  font-size: clamp(2.5rem, 5vw, 4.7rem);
}
.about-story-copy p {
  color: var(--ink-2);
  font-size: 1.04rem;
  line-height: 1.78;
}
.about-story-copy .ghost-link {
  margin-top: 14px;
}
.about-story-media {
  height: clamp(420px, 44vw, 560px);
  border-radius: var(--radius);
  overflow: hidden;
  box-shadow: var(--shadow-soft);
}
.about-story-media img {
  width: 100%;
  height: 100%;
  object-fit: cover;
}
.about-values {
  padding-top: 96px;
}
.about-value-grid {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: 22px;
}
.about-value {
  display: flex;
  flex-direction: column;
  min-height: 100%;
  overflow: hidden;
  border: 1px solid var(--line);
  border-radius: var(--radius);
  background: var(--paper);
  box-shadow: 0 18px 54px rgba(45, 51, 43, 0.08);
}
.about-value img {
  width: 100%;
  aspect-ratio: 4 / 3;
  object-fit: cover;
}
.about-value div {
  display: flex;
  flex: 1;
  flex-direction: column;
  gap: 10px;
  padding: 26px 26px 30px;
}
.about-value span {
  color: var(--gold);
  font-family: var(--font-display);
  font-size: 2.2rem;
  line-height: 0.9;
}
.about-value h3 {
  font-size: 1.7rem;
}
.about-value p {
  margin: 0;
  color: var(--ink-2);
  line-height: 1.68;
}
.about-network {
  display: grid;
  grid-template-columns: minmax(0, 0.9fr) minmax(360px, 1.1fr);
  gap: 56px;
  align-items: center;
  padding-bottom: 76px;
}
.about-network-copy h2 {
  margin-bottom: 22px;
  font-size: clamp(2.3rem, 4.6vw, 4.2rem);
}
.about-network-copy p {
  max-width: 640px;
  color: var(--ink-2);
  font-size: 1.04rem;
  line-height: 1.78;
}
.about-network-grid {
  display: grid;
  gap: 12px;
}
.about-network-grid a {
  display: grid;
  grid-template-columns: minmax(130px, 220px) minmax(0, 1fr);
  gap: 22px;
  align-items: center;
  min-height: 118px;
  padding: 26px;
  border: 1px solid rgba(250, 246, 236, 0.12);
  border-radius: var(--radius);
  background: var(--ink);
  transition: transform 0.3s var(--ease-out), box-shadow 0.3s var(--ease-out), background 0.3s var(--ease-out);
}
.about-network-grid a:hover {
  transform: translateY(-2px);
  background: #242b25;
  box-shadow: var(--shadow-soft);
}
.about-network-grid img {
  max-width: 220px;
  max-height: 48px;
  object-fit: contain;
}
.about-network-grid span {
  color: rgba(250, 246, 236, 0.82);
  font-size: 0.84rem;
  font-weight: 700;
  letter-spacing: 0.1em;
  text-transform: uppercase;
}
.section-cta.about-cta {
  padding-top: 20px;
  padding-bottom: 112px;
}
.about-cta .cta-card {
  max-width: 1040px;
}

/* =========================
   CTA BLOCK
   ========================= */
.section-cta { padding-top: 60px; padding-bottom: 130px; }
.cta-card {
  max-width: 920px;
  margin: 0 auto;
  padding: 70px 60px;
  background: var(--ink);
  color: var(--cream);
  border-radius: var(--radius);
  text-align: center;
  position: relative;
  overflow: hidden;
}
.cta-card::before {
  content: "";
  position: absolute;
  inset: 0;
  background:
    radial-gradient(ellipse at top right, rgba(200, 154, 63, 0.18), transparent 60%),
    radial-gradient(ellipse at bottom left, rgba(42, 128, 137, 0.22), transparent 65%);
  z-index: 0;
}
.cta-card > * { position: relative; z-index: 1; }
.cta-card .eyebrow { color: var(--gold-light); }
.cta-card h2 { color: var(--cream); font-size: clamp(2.2rem, 4.4vw, 3.8rem); }
.cta-card h2 em { color: var(--gold-light); }
.cta-card p { max-width: 520px; margin: 18px auto 28px; color: rgba(250, 246, 236, 0.85); }

/* =========================
   LODGE PROFILE PAGE
   ========================= */
.lodge-hero {
  position: relative;
  min-height: 62vh;
  display: flex;
  align-items: flex-end;
  background-size: cover;
  background-position: center;
  color: var(--cream);
  isolation: isolate;
}
.lodge-hero[data-lodge-hero-slider] {
  overflow: hidden;
  background-color: var(--ink);
}
.lodge-hero-slide {
  position: absolute;
  inset: 0;
  z-index: 0;
  background-size: cover;
  background-position: center;
  opacity: 0;
  transform: scale(1.01);
  transition: opacity 0.55s var(--ease-out), transform 1.2s var(--ease-out);
}
.lodge-hero-slide.is-active {
  opacity: 1;
  transform: scale(1);
}
/* Derek, 18 Aug: "yes, if you can please lighten the lodge images on the PC
   version". He had noticed lodge heroes looking brighter on his phone than his
   monitor, and he was right — the <=720px rule below has long carried much
   lighter stops (0.12/0.02/0.38) while this one sat at 0.48/0.14/0.78. The two
   now match, so a lodge photo reads the same on both. Nothing sits on this
   veil at desktop width: the name and price live in the pricing rail. */
.lodge-hero-veil {
  position: absolute;
  inset: 0;
  z-index: -1;
  background:
    linear-gradient(180deg, rgba(45, 51, 43,0.12) 0%, rgba(45, 51, 43,0.02) 42%, rgba(45, 51, 43,0.38) 100%),
    linear-gradient(90deg, rgba(45, 51, 43,0.24) 0%, rgba(45, 51, 43,0.04) 62%, rgba(45, 51, 43,0) 100%);
}
.lodge-hero[data-lodge-hero-slider] .lodge-hero-veil {
  z-index: 1;
  pointer-events: none;
}
.lodge-hero-inner {
  position: relative;
  z-index: 2;
  width: 100%;
  padding: 60px max(24px, calc((100vw - 1280px) / 2));
}
.lodge-hero-copy {
  max-width: 760px;
  display: flex;
  flex-direction: column;
  gap: 18px;
}
.lodge-hero-kicker {
  display: inline-flex;
  align-items: center;
  width: fit-content;
  padding: 7px 11px;
  border: 1px solid rgba(250, 246, 236, 0.32);
  border-radius: 999px;
  color: var(--cream);
  background: rgba(45, 51, 43, 0.18);
  backdrop-filter: blur(10px);
  font-size: 0.68rem;
  font-weight: 800;
  letter-spacing: 0.16em;
  line-height: 1;
  text-transform: uppercase;
}
.lodge-loc {
  display: inline-block;
  font-size: 0.78rem;
  font-weight: 600;
  letter-spacing: 0.22em;
  text-transform: uppercase;
  color: var(--gold-light);
}
/* Round 11 (A2): the 29 reserve pages land here, not on
   .destination-hero-content h1. Was 76.8px. */
.lodge-hero-copy h1 {
  font-size: var(--h1-hero);
  line-height: var(--h1-hero-lh);
  color: var(--cream);
}
.lodge-meta-row {
  display: flex;
  gap: 32px;
  flex-wrap: wrap;
  margin-top: 8px;
}
.lodge-meta-cell {
  display: flex;
  flex-direction: column;
  gap: 4px;
}
.lodge-meta-cell span {
  font-size: 0.7rem;
  font-weight: 600;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--gold-light);
}
.lodge-meta-cell strong {
  font-family: var(--font-display);
  font-size: 2.2rem;
  font-weight: 400;
  color: var(--cream);
  line-height: 1;
}
.lodge-meta-cell strong small {
  font-size: 1.1rem;
  font-weight: 300;
  opacity: 0.7;
  margin-left: 2px;
}
.lodge-meta-cell small:not(strong small) {
  font-size: 0.72rem;
  color: rgba(250, 246, 236, 0.7);
  margin-top: 4px;
}
.lodge-meta-cell .lodge-rate-save {
  color: var(--gold-light);
  font-weight: 700;
}
.lodge-hero .hero-cta.dark {
  align-self: flex-start;
  color: var(--cream);
  border-color: rgba(250, 246, 236, 0.72);
  background: rgba(45, 51, 43, 0.28);
  backdrop-filter: blur(10px);
}
.lodge-hero .hero-cta.dark:hover {
  background: var(--cream);
  color: var(--ink);
}
.lodge-hero-controls {
  position: absolute;
  top: 24px;
  right: max(24px, calc((100vw - 1280px) / 2));
  z-index: 4;
  display: inline-flex;
  align-items: center;
  gap: 9px;
  min-height: 50px;
  padding: 7px 10px;
  border: 1px solid rgba(250, 246, 236, 0.25);
  border-radius: 999px;
  color: var(--cream);
  background: rgba(45, 51, 43, 0.32);
  backdrop-filter: blur(16px);
  box-shadow: 0 18px 42px rgba(45, 51, 43, 0.18);
}
.lodge-hero-arrow {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 36px;
  height: 36px;
  border: 1px solid rgba(250, 246, 236, 0.34);
  border-radius: 999px;
  /* Was the self-referential `color: currentColor` — suspected of resolving
     wrong on iOS while the chevrons still used currentColor strokes. The
     chevrons are explicit cream now; keep the color chain simple anyway. */
  color: inherit;
  background: rgba(250, 246, 236, 0.08);
  transition: background 0.2s var(--ease-out), transform 0.2s var(--ease-out);
}
.lodge-hero-arrow:hover {
  transform: translateY(-1px);
  background: rgba(250, 246, 236, 0.18);
}
.lodge-hero-dots {
  display: flex;
  align-items: center;
  gap: 5px;
}
.lodge-hero-dot {
  width: 6px;
  height: 6px;
  padding: 0;
  border: 0;
  border-radius: 999px;
  background: rgba(250, 246, 236, 0.42);
  transition: width 0.2s var(--ease-out), background 0.2s var(--ease-out);
}
.lodge-hero-dot.is-active {
  width: 18px;
  background: var(--gold-light);
}
.lodge-hero-count {
  min-width: 46px;
  color: rgba(250, 246, 236, 0.88);
  font-size: 0.78rem;
  font-weight: 800;
  letter-spacing: 0.08em;
}
.lodge-favourite-button {
  position: absolute;
  top: 26px;
  left: max(24px, calc((100vw - 1280px) / 2));
  z-index: 4;
}
.lodge-hero-gallery-link {
  position: absolute;
  left: max(24px, calc((100vw - 1280px) / 2));
  bottom: 132px;
  z-index: 4;
  display: inline-flex;
  align-items: center;
  min-height: 42px;
  padding: 11px 18px;
  border: 1px solid rgba(250, 246, 236, 0.54);
  border-radius: 999px;
  color: var(--cream);
  background: rgba(45, 51, 43, 0.2);
  backdrop-filter: blur(12px);
  font-size: 0.74rem;
  font-weight: 800;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  transition: background 0.25s var(--ease-out), color 0.25s var(--ease-out);
}
.lodge-hero-gallery-link:hover {
  background: var(--cream);
  color: var(--ink);
}

.lodge-hero[data-lodge-hero-slider]:not(.destination-gallery-hero) {
  --lodge-photo-h: calc(100svh - var(--header-h));
  --lodge-card-overlap: clamp(220px, 34svh, 324px);
  display: block;
  min-height: 0;
  padding-top: calc(var(--lodge-photo-h) - var(--lodge-card-overlap));
  overflow: visible;
  background-image: none !important;
  color: var(--ink);
}
.lodge-hero[data-lodge-hero-slider]:not(.destination-gallery-hero) .lodge-hero-slide,
.lodge-hero[data-lodge-hero-slider]:not(.destination-gallery-hero) .lodge-hero-veil {
  inset: 0 0 auto;
  height: var(--lodge-photo-h);
}
.lodge-hero[data-lodge-hero-slider]:not(.destination-gallery-hero) .lodge-hero-slide {
  background-position: center;
}
.lodge-hero[data-lodge-hero-slider]:not(.destination-gallery-hero) .lodge-hero-veil {
  background:
    linear-gradient(180deg, rgba(45, 51, 43, 0.12) 0%, rgba(45, 51, 43, 0.02) 38%, rgba(45, 51, 43, 0.46) 100%),
    linear-gradient(90deg, rgba(45, 51, 43, 0.22) 0%, rgba(45, 51, 43, 0) 54%);
}
.lodge-hero[data-lodge-hero-slider]:not(.destination-gallery-hero) .lodge-hero-inner {
  position: relative;
  z-index: 3;
  padding: 0 max(24px, calc((100vw - 1280px) / 2)) 82px;
}
.lodge-hero[data-lodge-hero-slider]:not(.destination-gallery-hero) .lodge-hero-copy {
  width: min(860px, calc(100vw - 48px));
  max-width: 860px;
  gap: 16px;
  padding: 34px 42px 38px;
  border: 1px solid rgba(45, 51, 43, 0.08);
  border-radius: 24px 24px 8px 8px;
  background: rgba(255, 255, 255, 0.96);
  color: var(--ink);
  box-shadow: 0 22px 62px rgba(45, 51, 43, 0.16);
  backdrop-filter: blur(16px);
}
.lodge-hero[data-lodge-hero-slider]:not(.destination-gallery-hero) .lodge-hero-copy.reveal {
  opacity: 1;
  transform: none;
}
.lodge-hero[data-lodge-hero-slider]:not(.destination-gallery-hero) .lodge-hero-gallery-link {
  top: calc(var(--lodge-photo-h) - var(--lodge-card-overlap) - 92px);
  right: auto;
  bottom: auto;
  left: max(24px, calc((100vw - 1280px) / 2));
  width: max-content;
  height: auto;
}
.lodge-hero[data-lodge-hero-slider]:not(.destination-gallery-hero) .lodge-hero-kicker {
  padding: 0;
  border: 0;
  border-radius: 0;
  color: var(--teal-deep);
  background: transparent;
  backdrop-filter: none;
}
.lodge-hero[data-lodge-hero-slider]:not(.destination-gallery-hero) .lodge-loc {
  color: var(--teal-deep);
}
.lodge-hero[data-lodge-hero-slider]:not(.destination-gallery-hero) .lodge-hero-copy h1,
.lodge-hero[data-lodge-hero-slider]:not(.destination-gallery-hero) .lodge-hero-copy h1 em {
  color: var(--ink);
  text-shadow: none;
}
.lodge-hero[data-lodge-hero-slider]:not(.destination-gallery-hero) .lodge-meta-row {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, max-content));
  gap: 12px;
  width: 100%;
}
.lodge-hero[data-lodge-hero-slider]:not(.destination-gallery-hero) .lodge-meta-cell {
  min-width: 190px;
  padding: 16px 18px;
  border: 1px solid var(--line);
  border-radius: var(--radius);
  background: rgba(248, 249, 245, 0.92);
  backdrop-filter: none;
}
.lodge-hero[data-lodge-hero-slider]:not(.destination-gallery-hero) .lodge-meta-cell span {
  color: var(--teal-deep);
}
.lodge-hero[data-lodge-hero-slider]:not(.destination-gallery-hero) .lodge-meta-cell strong {
  color: var(--ink);
}
.lodge-hero[data-lodge-hero-slider]:not(.destination-gallery-hero) .lodge-meta-cell strong small {
  color: var(--ink-3);
  opacity: 1;
}
.lodge-hero[data-lodge-hero-slider]:not(.destination-gallery-hero) .lodge-meta-cell small:not(strong small) {
  color: var(--ink-3);
}
.lodge-hero[data-lodge-hero-slider]:not(.destination-gallery-hero) .lodge-meta-cell .lodge-rate-save {
  color: var(--teal-deep);
}
.lodge-hero[data-lodge-hero-slider]:not(.destination-gallery-hero) .hero-cta.dark {
  width: fit-content;
  max-width: 100%;
  color: var(--cream);
  border-color: var(--ink);
  background: var(--ink);
}

.lodge-tabs {
  position: sticky;
  top: var(--header-h);
  z-index: 30;
  margin-top: 0;
  background: rgba(250, 246, 236, 0.96);
  backdrop-filter: blur(14px);
  border-bottom: 1px solid var(--line);
}
.lodge-tabs-inner {
  display: flex;
  align-items: center;
  gap: 8px;
  padding: 0 max(24px, calc((100vw - 1280px) / 2));
  max-width: 100vw;
  overflow-x: auto;
  /* The pricing rail overlays the row's right side on desktop — keep the
     Enquire pill clear of it (see the .lodge-shell override below). */
  /* Swipeable strip: keep the scroll, never paint a scrollbar (macOS
     "always show scroll bars" drew a grey track under the tabs). */
  scrollbar-width: none;
  -ms-overflow-style: none;
}
.lodge-tabs-inner::-webkit-scrollbar {
  display: none;
  width: 0;
  height: 0;
}
.lodge-tabs-inner a {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  padding: 18px 16px;
  font-size: 0.78rem;
  font-weight: 600;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--ink-2);
  white-space: nowrap;
  transition: color 0.2s;
  border-bottom: 2px solid transparent;
}
.lodge-tabs-inner a:hover,
.lodge-tabs-inner a.is-active { color: var(--ink); }
.lodge-tabs-inner a.is-active { border-bottom-color: var(--teal-deep); }
.lodge-tabs-inner .lodge-tab-enquire {
  margin-left: auto;
  background: var(--ink);
  color: var(--cream);
  padding: 12px 22px;
  border-radius: 999px;
  border-bottom: 0;
  margin-top: 6px;
  margin-bottom: 6px;
}
.lodge-tabs-inner .lodge-tab-enquire:hover {
  background: var(--teal-deep);
  color: var(--cream);
}

.lodge-verdict {
  padding-top: 82px;
  padding-bottom: 88px;
}
.lodge-verdict .section-head {
  max-width: 895px;
}
/* Derek round-6: the verdict text block left-aligns with the MIDDLE of the
   circular rating icons below (75px = half the 150px ratings column, whose
   110px circles are centred). Desktop only — below 1025px the grid stacks
   and the circles centre, so the indent would look broken. */
@media (min-width: 1025px) {
  .lodge-page .lodge-verdict .section-head { padding-left: 75px; }
  .lodge-page .lodge-verdict:has(.verdict-2col--noratings) .section-head { padding-left: 0; }
}
.rating-grid {
  display: grid;
  grid-template-columns: repeat(5, minmax(0, 1fr));
  gap: 12px;
  margin-bottom: 26px;
}
.rating-chip {
  min-width: 0;
  padding: 20px 18px;
  background: var(--paper);
  border: 1px solid var(--line);
  border-radius: var(--radius);
  box-shadow: var(--shadow-soft);
}
.rating-chip strong {
  display: block;
  margin-bottom: 8px;
  font-family: var(--font-display);
  font-size: 2.25rem;
  font-weight: 400;
  line-height: 1;
  color: var(--teal-deep);
}
.rating-chip span {
  display: block;
  color: var(--ink-2);
  font-size: 0.7rem;
  font-weight: 700;
  letter-spacing: 0.12em;
  line-height: 1.35;
  text-transform: uppercase;
}
.rating-chip.is-overall {
  background: var(--ink);
  border-color: var(--ink);
}
.rating-chip.is-overall strong,
.rating-chip.is-overall span {
  color: var(--cream);
}
.hot-not-grid {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: 18px;
}
.verdict-list {
  padding: 28px;
  background: rgba(255, 255, 255, 0.72);
  border: 1px solid var(--line);
  border-radius: var(--radius);
}
.verdict-list h3 {
  margin-bottom: 16px;
  font-size: 1.75rem;
}
.verdict-list.positives h3 { color: var(--teal-deep); }
.verdict-list.negatives h3 { color: var(--coral); }
.verdict-list ul,
.lodge-detail-block ul {
  margin: 0;
  padding-left: 1.1em;
}
.verdict-list li,
.lodge-detail-block li {
  margin-bottom: 10px;
  color: var(--ink-2);
}
.verdict-list li::marker,
.lodge-detail-block li::marker {
  color: var(--teal-deep);
}

.lodge-body {
  display: grid;
  grid-template-columns: minmax(0, 1fr) 340px;
  gap: 64px;
  align-items: start;
}
.lodge-article,
.lodge-verdict,
.section-gallery,
.lodge-aside {
  scroll-margin-top: calc(var(--header-h) + 88px);
}
.lodge-article {
  max-width: 740px;
  font-size: 1.06rem;
  line-height: 1.8;
  color: var(--ink-2);
}
.lodge-article h2 {
  font-size: clamp(2.2rem, 4vw, 3.4rem);
  margin-bottom: 24px;
  color: var(--ink);
}
.lodge-article p { margin: 0 0 1.2em; }
.profile-lead {
  /* Derek round-6: the profile intro paragraph reads in the brand green —
     the dark cut keeps ~4.9:1 contrast on the cream page background. */
  color: var(--teal-deep, #5c6100);
  font-size: 1.2rem;
  line-height: 1.75;
}
.lodge-article p:first-of-type::first-letter {
  font-family: var(--font-display);
  font-size: 3.2em;
  font-weight: 400;
  float: left;
  line-height: 0.85;
  padding: 6px 12px 0 0;
  color: var(--teal-deep);
}
.lodge-article .profile-lead::first-letter {
  float: none;
  padding: 0;
  font-family: inherit;
  font-size: inherit;
  line-height: inherit;
  color: inherit;
}

.lodge-aside {
  position: sticky;
  top: calc(var(--header-h) + 80px);
  display: flex;
  flex-direction: column;
  gap: 22px;
}
.lodge-card {
  background: var(--paper);
  border: 1px solid var(--line);
  border-radius: var(--radius);
  padding: 28px 26px;
  display: flex;
  flex-direction: column;
  gap: 18px;
  box-shadow: var(--shadow-soft);
}
.lodge-card-eyebrow {
  font-size: 0.72rem;
  font-weight: 600;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--teal-deep);
}
.lodge-fact {
  display: flex;
  flex-direction: column;
  gap: 4px;
  padding-bottom: 14px;
  border-bottom: 1px solid var(--line);
}
.lodge-fact:last-of-type { border-bottom: 0; padding-bottom: 0; }
.lodge-fact span {
  font-size: 0.72rem;
  font-weight: 500;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  color: var(--ink-3);
}
.lodge-fact strong {
  font-family: var(--font-display);
  font-size: 1.35rem;
  font-weight: 500;
  /* Derek round-6: tighter leading when a Quick Info value wraps to 2+ lines
     (was inheriting the body's 1.65). */
  line-height: 1.25;
  color: var(--ink);
}
.lodge-rate-card {
  gap: 20px;
}
.rate-summary-grid {
  display: flex;
  flex-direction: column;
  gap: 14px;
}
.rate-sections {
  display: flex;
  flex-direction: column;
  gap: 16px;
  padding-top: 2px;
}
.rate-section {
  display: flex;
  flex-direction: column;
  gap: 10px;
  padding-top: 16px;
  border-top: 1px solid var(--line);
}
.rate-section h3 {
  font-family: var(--font-body);
  font-size: 0.78rem;
  font-weight: 700;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--ink);
}
.rate-line {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: 14px;
  padding: 10px 0;
  border-bottom: 1px solid rgba(79, 89, 77, 0.12);
}
.rate-line:last-of-type {
  border-bottom: 0;
}
.rate-line span {
  color: var(--ink-2);
  font-size: 0.88rem;
  line-height: 1.35;
}
.rate-line strong {
  color: var(--ink);
  font-size: 1rem;
  font-weight: 700;
  white-space: nowrap;
}
.rate-context,
.rate-note {
  margin: 0;
  color: var(--ink-3);
  font-size: 0.82rem;
  line-height: 1.55;
}
.lodge-card-cta {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  padding: 14px 22px;
  background: var(--ink);
  color: var(--cream);
  border-radius: 999px;
  font-size: 0.78rem;
  font-weight: 600;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  transition: background 0.3s var(--ease-out);
}
.lodge-card-cta:hover { background: var(--teal-deep); }

.anchor-alias {
  position: absolute;
  width: 1px;
  height: 1px;
  overflow: hidden;
  pointer-events: none;
}
.lodge-detail-block {
  display: flex;
  flex-direction: column;
  gap: 10px;
  padding-top: 2px;
}
.lodge-detail-block + .lodge-detail-block {
  padding-top: 16px;
  border-top: 1px solid var(--line);
}
.lodge-detail-block h3 {
  font-family: var(--font-body);
  font-size: 0.78rem;
  font-weight: 700;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--ink);
}
.useful-link-list {
  display: flex;
  flex-direction: column;
  gap: 10px;
}
.useful-link-card {
  display: flex;
  flex-direction: column;
  gap: 2px;
  padding: 12px 14px;
  border: 1px solid var(--line);
  border-radius: var(--radius-sm);
  color: var(--ink);
  background: rgba(245, 241, 232, 0.48);
}
.useful-link-card:hover {
  border-color: var(--teal-deep);
  color: var(--teal-deep);
}
.useful-link-card span {
  font-weight: 700;
}
.useful-link-card small {
  color: var(--ink-3);
  line-height: 1.45;
}

.lodge-tags {
  display: flex;
  flex-direction: column;
  gap: 12px;
}
.lodge-tags-label {
  font-size: 0.72rem;
  font-weight: 600;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--ink-3);
}
.lodge-tags > div {
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
}
.lodge-tags a {
  padding: 6px 12px;
  border: 1px solid var(--line-strong);
  border-radius: 999px;
  font-size: 0.78rem;
  font-weight: 500;
  color: var(--ink-2);
  transition: all 0.2s;
}
.lodge-tags a:hover {
  background: var(--ink);
  color: var(--cream);
  border-color: var(--ink);
}

/* =========================
   GALLERY + LIGHTBOX
   ========================= */
.gallery-grid {
  display: grid;
  grid-template-columns: repeat(4, minmax(0, 1fr));
  gap: 12px;
}
.gallery-grid .gallery-thumb:nth-child(1),
.gallery-grid .gallery-thumb:nth-child(8) {
  grid-column: span 2;
  grid-row: span 2;
}
.gallery-thumb {
  position: relative;
  display: block;
  width: 100%;
  aspect-ratio: 4 / 3;
  padding: 0;
  border: 0;
  border-radius: var(--radius-sm);
  overflow: hidden;
  background: var(--bone);
  cursor: zoom-in;
}
.gallery-thumb img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  transition: transform 0.6s var(--ease-out), filter 0.3s var(--ease-out);
}
.gallery-thumb:hover img { transform: scale(1.05); filter: brightness(1.05); }

.lightbox {
  position: fixed;
  inset: 0;
  z-index: 100;
  background: rgba(45, 51, 43, 0.95);
  display: none;
  align-items: center;
  justify-content: center;
}
.lightbox.is-open { display: flex; }
.lightbox-stage {
  width: 90vw;
  height: 80vh;
  display: flex;
  align-items: center;
  justify-content: center;
  position: relative;
  z-index: 1;
}
.lightbox-slide {
  position: absolute;
  inset: 0;
  display: flex;
  align-items: center;
  justify-content: center;
  opacity: 0;
  transition: opacity 0.4s var(--ease-out);
}
.lightbox-slide.is-active { opacity: 1; }
.lightbox-slide img {
  max-width: 100%;
  max-height: 100%;
  object-fit: contain;
  border-radius: var(--radius-sm);
  pointer-events: none;
}
.lightbox-close, .lightbox-prev, .lightbox-next {
  position: fixed;
  z-index: 5;
  width: 50px;
  height: 50px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  background: rgba(250, 246, 236, 0.12);
  border: 1px solid rgba(250, 246, 236, 0.3);
  border-radius: 999px;
  color: var(--cream);
  transition: background 0.3s var(--ease-out);
  touch-action: manipulation;
  -webkit-tap-highlight-color: transparent;
}
.lightbox-close:hover, .lightbox-prev:hover, .lightbox-next:hover { background: rgba(250, 246, 236, 0.25); }
.lightbox-close { top: 28px; right: 28px; }
.lightbox-prev { top: 50%; left: 28px; transform: translateY(-50%); }
.lightbox-next { top: 50%; right: 28px; transform: translateY(-50%); }

/* =========================
   ENQUIRY FORM
   ========================= */
.section-enquiry { padding-top: 80px; }
.enquiry-layout {
  display: grid;
  grid-template-columns: minmax(0, 1fr) 340px;
  gap: 48px;
  align-items: start;
}
.enquiry-form-card {
  background: var(--paper);
  border: 1px solid var(--line);
  border-radius: var(--radius);
  padding: 48px;
  box-shadow: var(--shadow-soft);
}
.enquiry-form-card h2 {
  margin: 14px 0 28px;
  font-size: clamp(1.8rem, 3.4vw, 2.8rem);
}
.enquiry-form { display: grid; gap: 22px; }
.enquiry-form label {
  display: grid;
  gap: 8px;
  font-size: 0.78rem;
  font-weight: 600;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  color: var(--ink-2);
}
.enquiry-form input,
.enquiry-form textarea {
  width: 100%;
  min-height: 50px;
  padding: 14px 16px;
  border: 1px solid var(--line-strong);
  border-radius: var(--radius-sm);
  background: var(--cream);
  font-family: var(--font-body);
  font-size: 1rem;
  font-weight: 400;
  color: var(--ink);
  text-transform: none;
  letter-spacing: 0;
  transition: border-color 0.2s, background 0.2s;
}
.enquiry-form input:focus,
.enquiry-form textarea:focus {
  outline: 0;
  border-color: var(--ink);
  background: var(--paper);
}
.enquiry-form textarea {
  resize: vertical;
  min-height: 100px;
  line-height: 1.5;
}
.form-grid {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: 18px;
}
.checkbox-line {
  display: flex !important;
  align-items: center;
  gap: 12px;
  text-transform: none !important;
  letter-spacing: 0 !important;
  font-weight: 500 !important;
  color: var(--ink-2);
}
.checkbox-line input { width: 18px; min-height: 18px; }
.honeypot { position: absolute; left: -10000px; opacity: 0; }
.form-status {
  padding: 14px 16px;
  border: 1px solid var(--line);
  border-radius: var(--radius-sm);
  background: rgba(79, 93, 53, 0.08);
  color: var(--ink);
  font-size: 0.95rem;
  line-height: 1.45;
}
.form-status.is-error {
  border-color: rgba(153, 54, 43, 0.35);
  background: rgba(153, 54, 43, 0.1);
  color: #783126;
}
.form-status.is-success {
  border-color: rgba(79, 93, 53, 0.35);
  background: rgba(79, 93, 53, 0.12);
  color: var(--olive-deep);
}
.enquiry-form button {
  margin-top: 8px;
  align-self: flex-start;
  padding: 16px 32px;
  background: var(--ink);
  color: var(--cream);
  border: 0;
  border-radius: 999px;
  font-family: var(--font-body);
  font-size: 0.86rem;
  font-weight: 600;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  transition: background 0.3s var(--ease-out), transform 0.3s var(--ease-out);
}
.enquiry-form button:hover {
  background: var(--teal-deep);
  transform: translateY(-2px);
}

.contact-panel {
  position: sticky;
  top: calc(var(--header-h) + 24px);
  display: flex;
  flex-direction: column;
  gap: 22px;
  padding: 32px 28px;
  background: var(--bone);
  border-radius: var(--radius);
}
.contact-panel > .eyebrow { margin-bottom: 6px; }
.contact-panel div {
  display: flex;
  flex-direction: column;
  gap: 3px;
}
.contact-panel span {
  font-size: 0.7rem;
  font-weight: 600;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--ink-3);
}
.contact-panel strong {
  font-family: var(--font-display);
  font-size: 1.2rem;
  font-weight: 500;
  color: var(--ink);
}
.contact-panel a { color: inherit; transition: color 0.2s; }
.contact-panel a:hover { color: var(--teal-deep); }

/* =========================
   FOOTER
   ========================= */
.footer {
  background: var(--ink);
  color: rgba(250, 246, 236, 0.78);
  padding: 80px max(24px, calc((100vw - 1280px) / 2)) 36px;
}
.footer-inner {
  display: grid;
  grid-template-columns: 1.2fr 2fr;
  gap: 60px;
  padding-bottom: 50px;
  border-bottom: 1px solid rgba(250, 246, 236, 0.12);
}
/* Derek's white lockup (emailed 12 Aug) replaces the filter trick here. The
   footer ran the two-tone colour logo through brightness(0) invert(1) — every
   pixel forced white, alpha untouched. That renders cleanly enough; the reason
   to drop it is simply that this is now the real artwork he supplied rather
   than the colour mark with its colour beaten out of it. Swapped via
   content: url() so it lands without rewriting the <img> on 209 pages, and the
   img keeps its alt text.

   32px rather than the 44px the filtered mark used, because the two files are
   different lockups: the white one's wordmark is 82% of its artwork height
   against the two-tone's 59%. At 44px "bushscapes" would have jumped 39%
   larger. Matching on the type keeps the footer reading exactly as it did. */
.footer-brand img {
  content: url("/assets/logo-bushscapes-mono-white.png");
  height: 32px;
  width: auto;
  margin-bottom: 16px;
}
.footer-brand p {
  max-width: 320px;
  font-size: 0.92rem;
  line-height: 1.65;
  color: rgba(250, 246, 236, 0.66);
}
/* Derek round 10 (2026-08-06 15:15 / 15:19): "incorporate on this footer the
   links to our social media accounts as well as a newsletter sign-up
   mechanism ... perhaps similar what is currently on our menu for these items,
   but make the social media icons bigger than they appear here."

   Deliberately mirrors .menu-newsletter-form / .menu-social so the drawer and
   the footer read as one component — the icons are the one intentional
   difference, at 44px against the drawer's 40px with a 26px glyph vs 22px.

   NOTE: like the drawer's, this form does not post anywhere yet — there is no
   newsletter endpoint in api/. It is presentational until one exists. */
.footer-newsletter {
  margin-top: 28px;
}
.footer-newsletter-form {
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  gap: 12px;
}
.footer-newsletter-form input {
  width: min(320px, 100%);
  height: 46px;
  padding: 0 18px;
  border: 1px solid rgba(250, 246, 236, 0.4);
  border-radius: 4px;
  background: transparent;
  color: var(--cream);
  font-family: var(--font-body);
  font-size: 0.94rem;
  font-style: italic;
  outline: none;
  transition: border-color 0.2s;
}
.footer-newsletter-form input:focus {
  border-color: var(--gold-light);
}
.footer-newsletter-form button {
  align-self: flex-start;
  padding: 12px 28px;
  border: 0;
  border-radius: 4px;
  background: var(--gold-light);
  color: var(--ink);
  font-family: var(--font-body);
  font-size: 0.82rem;
  font-weight: 700;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  cursor: pointer;
  transition: background 0.3s var(--ease-out);
}
.footer-newsletter-form button:hover {
  background: var(--cream);
}
.footer-social {
  display: flex;
  gap: 14px;
  margin-top: 22px;
}
.footer-social a {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 44px;
  height: 44px;
  color: var(--cream);
  transition: color 0.2s, transform 0.3s var(--ease-out);
}
.footer-social a:hover {
  color: var(--gold-light);
  transform: translateY(-2px);
}
.sr-only {
  position: absolute;
  width: 1px;
  height: 1px;
  margin: -1px;
  padding: 0;
  overflow: hidden;
  clip: rect(0, 0, 0, 0);
  white-space: nowrap;
  border: 0;
}
.footer-cols {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: 36px;
}
.footer-col {
  display: flex;
  flex-direction: column;
  gap: 8px;
}
.footer-label {
  margin-bottom: 8px;
  font-size: 0.72rem;
  font-weight: 600;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--gold-light);
}
.footer-col a {
  color: rgba(250, 246, 236, 0.75);
  font-size: 0.92rem;
  transition: color 0.2s, padding-left 0.3s var(--ease-out);
}
.footer-col a:hover { color: var(--cream); padding-left: 4px; }
.footer-network {
  padding: 28px 0;
  border-bottom: 1px solid rgba(250, 246, 236, 0.12);
  display: flex;
  align-items: center;
  gap: 28px;
  flex-wrap: wrap;
  overflow: hidden;
}
.footer-network-logos {
  display: flex;
  gap: 20px 24px;
  flex-wrap: wrap;
  align-items: center;
  min-width: 0;
}
.footer-network-logos img {
  height: 28px;
  width: auto;
  max-width: min(220px, 100%);
  object-fit: contain;
  opacity: 0.82;
  transition: opacity 0.3s;
}
.footer-network-logos img:hover { opacity: 0.95; }
.footer-bottom {
  padding-top: 24px;
  display: flex;
  justify-content: space-between;
  gap: 18px;
  flex-wrap: wrap;
  font-size: 0.78rem;
  color: rgba(250, 246, 236, 0.78);
}
.footer-powered a {
  color: rgba(250, 246, 236, 0.94);
  text-decoration: underline;
  text-underline-offset: 3px;
}
.footer-powered a:hover { color: var(--cream); }

/* =========================
   REVEAL ANIMATIONS
   ========================= */
.reveal {
  opacity: 0;
  transform: translateY(28px);
  transition: opacity 0.9s var(--ease-out), transform 0.9s var(--ease-out);
}
.reveal.is-visible {
  opacity: 1;
  transform: none;
}

/* =========================
   RESPONSIVE
   ========================= */
@media (max-width: 1080px) {
  .section { padding: 88px max(24px, calc((100vw - 1080px) / 2)); }
  .escape-split { grid-template-columns: 1fr; gap: 36px; padding: 80px 24px; }
  .escape-image { aspect-ratio: 16 / 10; max-width: 600px; }
  .destination-grid {
    grid-template-columns: 1fr 1fr;
    grid-template-rows: auto;
    min-height: 0;
  }
  .destination-grid .card,
  .destination-grid .card:nth-child(1),
  .destination-grid .card:nth-child(2),
  .destination-grid .card:nth-child(3),
  .destination-grid .card:nth-child(4),
  .destination-grid .card:nth-child(5) {
    grid-row: auto;
    grid-column: auto;
  }
  .destination-grid .card { aspect-ratio: 4 / 5; }
  .reviews-layout { grid-template-columns: 1fr; gap: 40px; }
  .reviews-side { position: static; max-width: 520px; margin: 0 auto; }
  .reviews-video { aspect-ratio: 16 / 9; }
  .review-row, .review-row:nth-child(even) {
    grid-template-columns: 1fr;
    gap: 0;
  }
  .review-tag, .review-row:nth-child(even) .review-tag {
    margin: 0;
    align-self: stretch;
    border-radius: 2px 2px 0 0;
  }
  .review-row:nth-child(even) .review-tag, .review-row:nth-child(even) .review-card {
    order: unset;
  }
  .feedback-proof-layout,
  .feedback-featured {
    grid-template-columns: 1fr;
  }
  .feedback-proof-grid {
    grid-template-columns: repeat(3, minmax(0, 1fr));
  }
  .feedback-featured {
    min-height: 0;
  }
  .feedback-review-grid {
    grid-template-columns: repeat(2, minmax(0, 1fr));
  }
  .feedback-gallery-grid {
    grid-template-columns: 1fr 1fr;
    grid-auto-rows: minmax(240px, 38vw);
  }
  .feedback-gallery-item-large {
    grid-column: span 2;
    grid-row: auto;
  }
  .about-intro {
    grid-template-columns: 1fr;
    gap: 14px;
    padding-bottom: 82px;
  }
  .about-proof-grid {
    grid-template-columns: repeat(4, minmax(0, 1fr));
  }
  .about-story,
  .about-network {
    grid-template-columns: 1fr;
    gap: 40px;
  }
  .about-story {
    padding-top: 0;
  }
  .about-story-copy {
    max-width: 760px;
  }
  .about-story-media {
    height: clamp(360px, 58vw, 460px);
  }
  .about-value-grid {
    grid-template-columns: 1fr;
  }
  .about-value {
    display: grid;
    grid-template-columns: minmax(260px, 0.85fr) minmax(0, 1fr);
  }
  .about-value img {
    height: 100%;
    aspect-ratio: auto;
  }
  .destination-intro {
    grid-template-columns: 1fr;
    gap: 32px;
  }
  .lodge-body { grid-template-columns: 1fr; gap: 40px; }
  .lodge-aside { position: static; }
  .rating-grid { grid-template-columns: repeat(3, minmax(0, 1fr)); }
  .hot-not-grid { grid-template-columns: 1fr; }
  .enquiry-layout { grid-template-columns: 1fr; }
  .contact-panel { position: static; }
  .lodge-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .filter-controls {
    grid-template-columns: repeat(2, minmax(0, 1fr));
  }
  .promise-slide { flex: 0 0 calc((100% - 36px) / 2); }
  .menu-fullscreen-inner { grid-template-columns: 1fr; gap: 40px; padding: 56px 32px; }
}
@media (max-width: 720px) {
  /* Derek round 11 (A2) — the phone half of "one standard headline".
     Four per-page clamps used to survive down here and beat the token by
     source order, so at 720px the same four pages he complained about still
     rendered at 64 / 69.6 / 47.5 / 58.4px. One shared mobile value instead;
     it keeps the size Home already used, which is the one he signed off. */
  :root { --header-h: 64px; --h1-hero: clamp(2.4rem, 12vw, 4rem); }
  .section { padding: 64px 20px; }
  .promise { padding: 50px 20px 70px; }
  .promise-title-h { margin-bottom: 36px; }
  .promise-track { grid-template-columns: 42px minmax(0, 1fr) 42px; gap: 6px; }
  .promise-arrow { width: 40px; height: 40px; }
  .page-hero { padding: 60px 20px 36px; min-height: 40vh; }
  .feedback-hero {
    min-height: 64svh;
    background-position: 42% center;
  }
  .feedback-hero-actions {
    flex-direction: column;
    align-items: stretch;
    gap: 10px;
  }
  .feedback-hero-actions .hero-cta {
    justify-content: center;
    min-height: 46px;
    padding: 14px 18px;
    font-size: 0.72rem;
  }
  .feedback-proof-layout {
    gap: 32px;
  }
  .feedback-proof-copy h2 {
    font-size: clamp(2.2rem, 12vw, 3.5rem);
  }
  .feedback-proof-grid,
  .feedback-review-grid,
  .feedback-gallery-grid {
    grid-template-columns: 1fr;
  }
  .feedback-proof-item {
    min-height: 0;
    padding: 22px 0;
    border-top: 1px solid var(--line);
    border-left: 0;
  }
  .feedback-proof-item:first-child {
    border-top: 0;
  }
  .feedback-proof-item span {
    max-width: none;
  }
  .feedback-featured-image {
    min-height: 300px;
  }
  .feedback-featured-quote {
    padding: 46px 24px 52px;
  }
  .feedback-featured-quote p {
    font-size: clamp(1.9rem, 9vw, 2.55rem);
  }
  .feedback-review {
    min-height: 0;
    padding: 24px 22px;
  }
  .feedback-review blockquote {
    font-size: clamp(1.45rem, 8vw, 2rem);
  }
  .feedback-gallery-section {
    padding-top: 64px;
    padding-bottom: 72px;
  }
  .feedback-gallery-item,
  .feedback-gallery-item-large {
    grid-column: auto;
    grid-row: auto;
    min-height: 260px;
  }
  .about-hero {
    min-height: calc(100svh - var(--header-h));
    padding: 58px 20px 118px;
    background-position: center;
  }
  .about-hero-content h1 {
    font-size: var(--h1-hero);
    line-height: 0.96;
  }
  .about-hero-content p {
    font-size: 1rem;
    line-height: 1.62;
  }
  .about-hero-actions {
    display: grid;
    grid-template-columns: 1fr;
    width: 100%;
    gap: 10px;
  }
  .about-hero-actions .hero-cta {
    justify-content: center;
    min-height: 48px;
    padding: 14px 18px;
    font-size: 0.72rem;
    text-align: center;
  }
  .about-intro {
    width: calc(100vw - 40px);
    margin-top: -74px;
    padding-bottom: 62px;
  }
  .about-intro-card {
    padding: 30px 26px 32px;
  }
  .about-intro-card h2 {
    font-size: clamp(2.25rem, 11vw, 3.5rem);
  }
  .about-intro-card p,
  .about-story-copy p,
  .about-network-copy p {
    font-size: 0.98rem;
  }
  .about-proof-grid {
    grid-template-columns: repeat(2, minmax(0, 1fr));
    gap: 8px;
  }
  .about-proof-grid div {
    min-height: 150px;
    padding: 18px 16px;
  }
  .about-proof-grid strong {
    font-size: clamp(2.1rem, 10vw, 3rem);
  }
  .about-proof-grid span {
    font-size: 0.78rem;
    line-height: 1.45;
  }
  .about-story {
    padding-top: 0;
    gap: 28px;
  }
  .about-story-copy h2,
  .about-network-copy h2 {
    font-size: clamp(2.25rem, 11vw, 3.45rem);
  }
  .about-story-media {
    height: 300px;
  }
  .about-values {
    padding-top: 64px;
  }
  .about-value {
    display: flex;
  }
  .about-value img {
    height: auto;
    aspect-ratio: 4 / 3;
  }
  .about-value div {
    padding: 22px 20px 24px;
  }
  .about-value h3 {
    font-size: 1.46rem;
  }
  .about-network {
    gap: 28px;
  }
  .about-network-grid a {
    grid-template-columns: 1fr;
    gap: 14px;
    min-height: 0;
    padding: 22px 20px;
  }
  .about-network-grid img {
    max-width: 190px;
    max-height: 42px;
  }
  .about-network-grid span {
    font-size: 0.72rem;
  }
  .section-cta.about-cta {
    padding-top: 0;
    padding-bottom: 80px;
  }
  .page-hero.destination-landing {
    min-height: 68svh;
    padding: 58px 20px 42px;
  }
  .destination-hero-content {
    gap: 12px;
  }
  .destination-hero-content h1 {
    font-size: var(--h1-hero);
  }
  .destination-hero-content p {
    font-size: 1rem;
    line-height: 1.62;
  }
  .destination-hero-meta {
    gap: 7px;
  }
  .destination-hero-meta span {
    min-height: 34px;
    padding: 8px 10px;
    font-size: 0.62rem;
    letter-spacing: 0.05em;
  }
  .destination-hero-actions {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: 8px;
    width: 100%;
  }
  .destination-hero-actions .hero-cta {
    justify-content: center;
    min-height: 44px;
    padding: 12px 10px;
    font-size: 0.68rem;
    letter-spacing: 0.08em;
    text-align: center;
  }
  .destination-intro {
    padding: 58px 20px 46px;
  }
  .destination-intro-copy h2 {
    font-size: clamp(2.2rem, 11vw, 3.4rem);
  }
  .destination-intro-copy p {
    font-size: 0.98rem;
  }
  .destination-proof-grid div {
    padding: 16px;
  }
  .hero-home { padding: 70px 24px 80px; height: calc(100svh - var(--header-h) - 42px); }
  .hero-headline { font-size: var(--h1-hero); }
  .lodge-hero {
    min-height: 62svh;
    background-position: center top;
  }
  .lodge-hero-inner {
    padding: 36px 20px 34px;
  }
  .lodge-hero-copy {
    gap: 14px;
  }
  .lodge-loc {
    font-size: 0.68rem;
    letter-spacing: 0.16em;
    line-height: 1.55;
  }
  .lodge-hero-copy h1 {
    font-size: var(--h1-hero);
  }
  .lodge-meta-row {
    display: grid;
    grid-template-columns: repeat(2, minmax(0, 1fr));
    gap: 12px;
    width: 100%;
  }
  .lodge-meta-cell {
    min-width: 0;
    padding: 12px;
    border: 1px solid rgba(250, 246, 236, 0.22);
    border-radius: var(--radius-sm);
    background: rgba(45, 51, 43, 0.2);
    backdrop-filter: blur(8px);
  }
  .lodge-meta-cell span {
    font-size: 0.62rem;
    letter-spacing: 0.12em;
  }
  .lodge-meta-cell small:not(strong small) {
    line-height: 1.25;
  }
  .lodge-hero .hero-cta.dark {
    width: 100%;
    justify-content: center;
    padding: 14px 16px;
    font-size: 0.74rem;
  }
  .lodge-hero[data-lodge-hero-slider] {
    --lodge-photo-h: clamp(430px, 66svh, 560px);
    display: block;
    min-height: 0;
    padding-top: calc(var(--lodge-photo-h) - 48px);
    background-image: none !important;
    color: var(--ink);
    overflow: visible;
  }
  .lodge-hero[data-lodge-hero-slider] .lodge-hero-slide,
  .lodge-hero[data-lodge-hero-slider] .lodge-hero-veil {
    inset: 0 0 auto;
    height: var(--lodge-photo-h);
  }
  .lodge-hero[data-lodge-hero-slider] .lodge-hero-slide {
    background-position: center;
  }
  .lodge-hero[data-lodge-hero-slider] .lodge-hero-veil {
    background:
      linear-gradient(180deg, rgba(45, 51, 43, 0.12) 0%, rgba(45, 51, 43, 0.02) 36%, rgba(45, 51, 43, 0.38) 100%),
      linear-gradient(90deg, rgba(45, 51, 43, 0.24) 0%, rgba(45, 51, 43, 0) 48%);
  }
  .lodge-hero-controls {
    top: 18px;
    right: 16px;
    gap: 6px;
    min-height: 52px;
    max-width: calc(100vw - 136px);
    padding: 7px 9px;
  }
  .lodge-hero-dots {
    display: none;
  }
  .lodge-hero-count {
    min-width: 42px;
    font-size: 0.76rem;
  }
  .lodge-hero-arrow {
    width: 37px;
    height: 37px;
  }
  .lodge-favourite-button {
    top: 18px;
    left: 16px;
    min-height: 46px;
    padding: 12px 16px;
  }
  .lodge-hero-gallery-link {
    top: calc(var(--lodge-photo-h) - 94px);
    bottom: auto;
    left: 20px;
    min-height: 42px;
    padding: 11px 18px;
    background: rgba(45, 51, 43, 0.18);
  }
  .lodge-hero-inner {
    position: relative;
    z-index: 3;
    padding: 0 20px 30px;
  }
  .lodge-hero-copy {
    max-width: none;
    gap: 14px;
    padding: 26px 28px 28px;
    border: 1px solid rgba(45, 51, 43, 0.08);
    border-radius: 22px 22px 0 0;
    background: rgba(255, 255, 255, 0.96);
    color: var(--ink);
    box-shadow: 0 22px 62px rgba(45, 51, 43, 0.16);
    backdrop-filter: blur(16px);
  }
  .lodge-hero-kicker {
    padding: 0;
    border: 0;
    border-radius: 0;
    color: var(--teal-deep);
    background: transparent;
    backdrop-filter: none;
    font-size: 0.64rem;
  }
  .lodge-hero-copy .lodge-loc {
    color: var(--teal-deep);
  }
  .lodge-hero-copy h1 {
    color: var(--ink);
    text-shadow: none;
    font-size: var(--h1-hero);
    line-height: 0.96;
  }
  .lodge-hero[data-lodge-hero-slider] .lodge-meta-row {
    display: grid;
    grid-template-columns: repeat(2, minmax(0, 1fr));
    gap: 12px;
    width: 100%;
  }
  .lodge-hero[data-lodge-hero-slider] .lodge-meta-cell {
    min-width: 0;
    padding: 16px 14px;
    border: 1px solid var(--line);
    border-radius: var(--radius);
    background: rgba(248, 249, 245, 0.92);
    backdrop-filter: none;
  }
  .lodge-hero[data-lodge-hero-slider] .lodge-meta-cell span {
    color: var(--teal-deep);
    font-size: 0.6rem;
    letter-spacing: 0.12em;
  }
  .lodge-hero[data-lodge-hero-slider] .lodge-meta-cell strong {
    color: var(--ink);
    font-size: clamp(1.65rem, 7vw, 2.25rem);
  }
  .lodge-hero[data-lodge-hero-slider] .lodge-meta-cell strong small {
    color: var(--ink-3);
    opacity: 1;
  }
  .lodge-hero[data-lodge-hero-slider] .lodge-meta-cell small:not(strong small) {
    color: var(--ink-3);
    line-height: 1.32;
  }
  .lodge-hero[data-lodge-hero-slider] .lodge-meta-cell .lodge-rate-save {
    color: var(--teal-deep);
  }
  .lodge-hero[data-lodge-hero-slider]:not(.destination-gallery-hero) {
    --lodge-photo-h: calc(100svh - var(--header-h));
    --lodge-card-overlap: clamp(220px, 34svh, 324px);
    padding-top: calc(var(--lodge-photo-h) - var(--lodge-card-overlap));
  }
  .lodge-hero[data-lodge-hero-slider]:not(.destination-gallery-hero) .lodge-hero-inner {
    padding: 0 20px 30px;
  }
  .lodge-hero[data-lodge-hero-slider]:not(.destination-gallery-hero) .lodge-hero-copy {
    width: 100%;
    max-width: none;
    gap: 14px;
    padding: 26px 28px 28px;
    border-radius: 22px 22px 0 0;
  }
  .lodge-hero[data-lodge-hero-slider]:not(.destination-gallery-hero) .lodge-hero-copy h1 {
    font-size: var(--h1-hero);
    line-height: 0.96;
  }
  .lodge-hero[data-lodge-hero-slider]:not(.destination-gallery-hero) .lodge-meta-row {
    grid-template-columns: repeat(2, minmax(0, 1fr));
  }
  .lodge-hero[data-lodge-hero-slider]:not(.destination-gallery-hero) .lodge-meta-cell {
    min-width: 0;
    padding: 16px 14px;
  }
  .lodge-hero[data-lodge-hero-slider]:not(.destination-gallery-hero) .hero-cta.dark {
    width: 100%;
    max-width: 100%;
    min-width: 0;
    flex-wrap: wrap;
    justify-content: center;
    min-height: 54px;
    padding: 15px 18px;
    font-size: 0.72rem;
    text-align: center;
  }
  .lodge-hero[data-lodge-hero-slider]:not(.destination-gallery-hero) .lodge-hero-gallery-link {
    top: calc(var(--lodge-photo-h) - var(--lodge-card-overlap) - 92px);
    right: auto;
    bottom: auto;
    left: 20px;
    width: max-content;
    height: auto;
  }
  .lodge-hero.destination-gallery-hero[data-lodge-hero-slider] {
    --lodge-photo-h: calc(100svh - var(--header-h));
    --destination-card-overlap: clamp(220px, 34svh, 324px);
    padding-top: calc(var(--lodge-photo-h) - var(--destination-card-overlap));
  }
  .destination-gallery-hero .lodge-hero-inner {
    padding-bottom: 30px;
  }
  .destination-gallery-hero .lodge-hero-gallery-link {
    top: calc(var(--lodge-photo-h) - var(--destination-card-overlap) - 92px);
    right: auto;
    bottom: auto;
    left: 20px;
    width: max-content;
    height: auto;
  }
  .destination-gallery-hero .destination-hero-content p {
    color: var(--ink-2);
  }
  .destination-gallery-hero .destination-hero-meta {
    gap: 8px;
  }
  .destination-gallery-hero .destination-hero-meta span {
    min-height: 36px;
    border-color: var(--line);
    background: rgba(248, 249, 245, 0.92);
    color: var(--ink-2);
    backdrop-filter: none;
    font-size: 0.62rem;
  }
  .destination-gallery-hero .destination-hero-meta strong {
    color: var(--teal-deep);
  }
  .destination-gallery-hero .destination-hero-actions {
    display: grid;
    grid-template-columns: 1fr;
    width: 100%;
  }
  .destination-gallery-hero .destination-hero-actions .hero-cta {
    min-width: 0;
    max-width: 100%;
    justify-content: center;
    min-height: 48px;
    padding: 14px 16px;
    text-align: center;
  }
  .destination-gallery-hero .destination-hero-actions .hero-cta.secondary {
    border-color: var(--ink);
    background: transparent;
    color: var(--ink);
  }
  .lodge-hero[data-lodge-hero-slider] .hero-cta.dark {
    width: 100%;
    justify-content: center;
    min-height: 54px;
    padding: 15px 18px;
    border-color: var(--ink);
    color: var(--cream);
    background: var(--ink);
    font-size: 0.72rem;
    text-align: center;
  }
  .lodge-tabs {
    top: var(--header-h);
    padding: 8px 10px;
    box-shadow: 0 12px 30px rgba(45, 51, 43, 0.08);
  }
  .lodge-tabs-inner {
    display: grid;
    grid-template-columns: repeat(5, minmax(0, 1fr));
    gap: 4px;
    width: 100%;
    padding: 0;
    overflow: visible;
  }
  .lodge-tabs-inner a {
    min-width: 0;
    min-height: 44px;
    padding: 10px 2px;
    border: 1px solid var(--line);
    border-radius: 999px;
    background: rgba(255, 255, 255, 0.62);
    font-size: 0.56rem;
    letter-spacing: 0.05em;
    line-height: 1;
    text-align: center;
    white-space: nowrap;
  }
  .lodge-tabs-inner a.is-active {
    border-color: var(--teal-deep);
    background: rgba(42, 128, 137, 0.1);
  }
  .lodge-tabs-inner .lodge-tab-enquire {
    margin: 0;
    padding: 10px 4px;
    min-height: 44px;
    border: 1px solid var(--ink);
    background: var(--ink);
    color: var(--cream);
  }
  .lodge-body {
    padding-top: 28px;
  }
  .lodge-card {
    padding: 22px 20px;
    gap: 14px;
  }
  .lodge-article,
  .lodge-verdict,
  .section-gallery,
  .lodge-aside {
    scroll-margin-top: calc(var(--header-h) + 74px);
  }
  .rating-grid {
    grid-template-columns: repeat(2, minmax(0, 1fr));
    gap: 8px;
  }
  .rating-chip {
    padding: 16px 14px;
  }
  .rating-chip strong {
    font-size: 1.85rem;
  }
  .verdict-list {
    padding: 22px 20px;
  }
  .profile-lead {
    font-size: 1.08rem;
  }
  .escape-split { padding: 64px 20px; gap: 24px; }
  .escape-headline { font-size: clamp(2.2rem, 9vw, 3rem); margin-bottom: 16px; }
  .lodge-grid { grid-template-columns: 1fr; gap: 22px; }
  .promise-rail { gap: 16px; }
  .promise-slide { flex: 0 0 100%; padding: 14px 14px 18px; }
  .destination-grid { grid-template-columns: 1fr; }
  .search-drawer { width: 100vw; }
  .search-drawer-inner { padding: 56px 22px 30px; }
  .menu-fullscreen-inner { padding: 40px 22px; gap: 28px; }
  .menu-newsletter-form input { width: 100%; }
  .section-cta { padding: 60px 20px 80px; }
  .cta-card { padding: 48px 28px; }
  .footer-inner { grid-template-columns: 1fr; gap: 40px; }
  .footer-cols { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 28px; }
  .footer-network {
    align-items: flex-start;
    gap: 16px;
  }
  .footer-network-logos {
    width: 100%;
    gap: 18px;
  }
  .footer-network-logos img {
    flex: 0 1 calc((100% - 18px) / 2);
    max-width: calc((100% - 18px) / 2);
    height: 24px;
  }
  .gallery-grid { grid-template-columns: 1fr 1fr; }
  .gallery-grid .gallery-thumb:nth-child(1),
  .gallery-grid .gallery-thumb:nth-child(8) {
    grid-column: auto;
    grid-row: auto;
  }
  .lightbox {
    z-index: 200;
    min-height: 100dvh;
  }
  .lightbox-stage {
    width: 100vw;
    height: 76dvh;
    padding: 0 18px;
  }
  .lightbox-close {
    top: calc(env(safe-area-inset-top, 0px) + 42px);
    right: 18px;
    width: 58px;
    height: 58px;
  }
  .lightbox-prev,
  .lightbox-next {
    width: 46px;
    height: 46px;
  }
  .lightbox-prev { left: 14px; }
  .lightbox-next { right: 14px; }
  .lodge-meta-cell strong { font-size: 1.7rem; }
  .lodge-article p:first-of-type::first-letter {
    font-size: 2.6em;
    padding: 4px 8px 0 0;
  }
  .enquiry-form-card { padding: 28px 22px; }
  .form-grid { grid-template-columns: 1fr; }
  .toolbar { flex-direction: column; align-items: stretch; }
  .toolbar-search { max-width: 100%; }
  .catalogue-filters {
    margin-top: -18px;
    padding: 16px;
    border-radius: var(--radius-sm);
  }
  .filter-controls {
    grid-template-columns: 1fr;
    gap: 10px;
  }
  .filter-bottom {
    align-items: stretch;
    flex-direction: column;
  }
  .filter-chip-group {
    gap: 8px;
  }
  .filter-chip {
    flex: 1 1 calc(50% - 8px);
    justify-content: flex-start;
    min-width: 0;
    white-space: normal;
  }
  .filter-reset {
    width: 100%;
  }
}

/* Print + 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; }
}

/* Lodge sub-nav: the lodge name sits at the far left of the sticky bar,
   pushing the section links + green Enquire button to the right (Derek). */
.lodge-tab-name {
  font-weight: 700;
  font-size: 0.95rem;
  color: var(--ink, #2d332b);
  margin-right: auto;
  padding: 0 0.4rem;
  white-space: nowrap;
  align-self: center;
}

/* Round 13 (Derek 12 Aug). Both are phone-only and off by default: the wide
   layout keeps its five tabs, and the pricing rail beside the hero already
   carries the name/location/price that .lodge-hero-id echoes. */
.lodge-hero-id { display: none; }
/* Scoped through .lodge-tabs-inner deliberately: the bare class loses to the
   `.lodge-tabs-inner a` display rule above, which would leave both tab sets on
   screen at once. */
.lodge-tabs-inner .lodge-tab--compact { display: none; }

/* === Lodge detail redesign v2 — full-height pricing strip (Derek 2026-07-20) ===
   The shell is one grid: hero spans the full width in row 1, the sticky tabs
   strip is row 2, left content is row 3, then solid block / gallery / related.
   The pricing rail occupies the right column spanning rows 1-3, so the dark
   glass strip overlays the hero's right side from the very top of the page,
   sticks below the header while scrolling, and releases at the solid block. */
.lodge-shell {
  /* --rail-w / --rail-gap / --lodge-gutter now live at :root (round 11, A1) so
     the header can position its icons off the same numbers. Do not re-declare
     them here — the header would silently stop tracking the rail. */
  --lodge-tabs-h: 57px;
  display: grid;
  grid-template-columns: var(--lodge-gutter) minmax(0, 1fr) var(--rail-gap) var(--rail-w) var(--lodge-gutter);
  grid-template-rows: auto var(--lodge-tabs-h) auto auto auto auto;
}
.lodge-shell > .lodge-hero { grid-column: 1 / -1; grid-row: 1; }
.lodge-shell > .lodge-tabs {
  grid-column: 1 / -1;
  grid-row: 2 / -1;
  align-self: start;
  height: var(--lodge-tabs-h);
}
.lodge-shell > .lodge-main-left { grid-column: 2; grid-row: 3; min-width: 0; }
.lodge-shell > .lodge-pricing-rail { grid-column: 4; grid-row: 1 / 4; position: relative; z-index: 31; }
.lodge-shell > .lodge-solid-block { grid-column: 1 / -1; grid-row: 4; }
.lodge-shell > .section-gallery { grid-column: 1 / -1; grid-row: 5; }
.lodge-shell > .section-related { grid-column: 1 / -1; grid-row: 6; }

/* Tabs strip inside the shell: fixed height, links stop before the rail.
   Rail clearance MUST come from margin, not padding — overflowing flex
   content paints straight across padding, which let the Enquire pill slide
   under the pricing strip at mid viewports. The margin narrows the
   scrollport itself so nothing can render beneath the rail; below ~1360px
   the lodge name leaves the row so the tabs + pill fit without scrolling. */
.lodge-shell .lodge-tabs-inner {
  height: calc(var(--lodge-tabs-h) - 1px);
  overflow-y: hidden;
  padding-left: var(--lodge-gutter);
  padding-right: 12px;
}
@media (min-width: 1025px) {
  .lodge-shell .lodge-tabs-inner {
    margin-right: calc(var(--lodge-gutter) + var(--rail-w) + 18px);
  }
}
@media (min-width: 1025px) and (max-width: 1360px) {
  .lodge-shell .lodge-tab-name { display: none; }
}
.lodge-shell .lodge-tabs-inner a:not(.lodge-tab-enquire) { padding-top: 0; padding-bottom: 0; height: 100%; }

/* Hero variant: pure photo slider — the lodge info lives in the strip. */
.lodge-hero[data-lodge-hero-slider].lodge-hero--strip {
  display: block;
  min-height: 0;
  height: clamp(540px, calc(100svh - var(--header-h)), 840px);
  padding-top: 0;
  overflow: hidden;
  background-image: none !important;
  color: var(--cream);
}
.lodge-hero[data-lodge-hero-slider].lodge-hero--strip .lodge-hero-slide,
.lodge-hero[data-lodge-hero-slider].lodge-hero--strip .lodge-hero-veil {
  inset: 0;
  height: 100%;
}
.lodge-hero[data-lodge-hero-slider].lodge-hero--strip .lodge-hero-veil {
  background:
    linear-gradient(180deg, rgba(45, 51, 43, 0.18) 0%, rgba(45, 51, 43, 0) 38%, rgba(45, 51, 43, 0.44) 100%),
    linear-gradient(90deg, rgba(45, 51, 43, 0.2) 0%, rgba(45, 51, 43, 0) 55%);
}
.lodge-hero[data-lodge-hero-slider].lodge-hero--strip .lodge-hero-controls {
  top: 22px;
  right: calc(var(--lodge-gutter) + var(--rail-w) + var(--rail-gap));
  bottom: auto;
  left: auto;
}
.lodge-hero[data-lodge-hero-slider].lodge-hero--strip .lodge-hero-gallery-link {
  top: auto;
  bottom: 30px;
  left: var(--lodge-gutter);
  right: auto;
  width: max-content;
  height: auto;
}

/* The pricing strip: dark glass over the hero, sticky below the header, capped
   to the viewport with the rate list scrolling inside and the CTA always
   pinned at the bottom. */
.pricing-rail-inner {
  display: flex;
  flex-direction: column;
  background: rgba(38, 43, 36, 0.9);
  -webkit-backdrop-filter: blur(14px);
  backdrop-filter: blur(14px);
  color: #fff;
  border: 1px solid rgba(255, 255, 255, 0.1);
  border-radius: 18px;
  padding: 24px 22px 18px;
  box-shadow: 0 26px 70px rgba(20, 24, 18, 0.34);
}
/* Derek/Jarryd round-7b: no internal scrollbar — the strip runs its full
   natural length (max-height cap removed); it still pins below the header
   and releases at the solid block. */
.lodge-shell .pricing-rail-inner {
  position: sticky;
  top: calc(var(--header-h) + 14px);
}
.pricing-rail-head { flex: 0 0 auto; }
.pricing-rail-kicker {
  display: block;
  font-size: 0.62rem;
  font-weight: 800;
  letter-spacing: 0.2em;
  text-transform: uppercase;
  color: var(--gold-light, #d7dc62);
}
.pricing-rail-title {
  margin: 8px 0 6px;
  font-family: var(--font-display);
  font-size: 1.95rem;
  font-weight: 400;
  line-height: 1.04;
  color: #fff;
}
.pricing-rail-loc {
  display: block;
  font-size: 0.63rem;
  font-weight: 600;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  line-height: 1.7;
  color: rgba(255, 255, 255, 0.62);
}
.pricing-rail-meta {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 14px;
  margin-top: 14px;
  padding-top: 13px;
  border-top: 1px solid rgba(255, 255, 255, 0.14);
}
.pricing-rail-rating { display: inline-flex; align-items: baseline; }
.pricing-rail-rating strong {
  font-family: var(--font-display);
  font-size: 2rem;
  font-weight: 400;
  line-height: 1;
  color: var(--gold-light, #d7dc62);
}
.pricing-rail-rating small { font-size: 0.78rem; color: rgba(255, 255, 255, 0.55); margin-left: 1px; }
.pricing-rail-from { display: flex; flex-direction: column; align-items: flex-end; text-align: right; }
.pricing-rail-from span {
  font-size: 0.58rem;
  font-weight: 700;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: rgba(255, 255, 255, 0.6);
}
.pricing-rail-from strong {
  /* Derek round-6: the From price is Manrope Semi Bold, a step bigger, and
     green (the strip's bright accent) instead of white. */
  font-family: var(--font-body);
  font-size: 2.25rem;
  font-weight: 600;
  line-height: 1;
  margin-top: 3px;
  color: var(--gold-light, #d7dc62);
}
.pricing-rail-from small { font-size: 0.62rem; color: rgba(255, 255, 255, 0.6); margin-top: 4px; }
/* Derek round-6: two lines — "Normal Price R13 750" in white, then the
   saving as a white-on-green rectangular block beneath it. */
.pricing-rail-save {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 6px;
  margin-top: 10px;
  font-size: 0.72rem;
  font-weight: 700;
}
.pricing-rail-save-normal { color: #fff; }
.pricing-rail-save-badge {
  display: inline-block;
  background: var(--gold, #a5ad00);
  color: #fff;
  text-transform: uppercase;
  letter-spacing: 0.1em;
  padding: 4px 10px;
  border-radius: 3px;
}

/* Rate list. Round-7b: no internal scrolling — the strip grows to its full
   content length instead of capping and painting a scrollbar. */
.pricing-rail-scroll {
  flex: 1 1 auto;
  overflow-y: visible;
}
@media (min-width: 1025px) {
  /* The rates list is what actually scrolls; the lodge name and From-price
     above it stay put. min-height:0 is required or a flex child refuses to
     shrink below its content and nothing scrolls. overscroll-behavior stops
     the page taking over the moment the list bottoms out, which is the part
     he described as "without moving down the page as a whole". */
  .pricing-rail-scroll {
    min-height: 0;
    overflow-y: auto;
    overscroll-behavior: contain;
    scrollbar-width: thin;
  }
}

/* Rate rows on the dark strip: white amounts, readable labels, tight rhythm.
   (Scoped overrides — the base .rate-* rules style the old light card.) */
.pricing-rail-inner .rate-sections { display: flex; flex-direction: column; gap: 0; margin-top: 14px; padding-top: 0; border-top: 0; }
.pricing-rail-inner .rate-section { gap: 0; margin: 0; padding: 11px 0 9px; border-top: 1px solid rgba(255, 255, 255, 0.13); }
.pricing-rail-inner .rate-section h3 {
  margin: 0 0 3px;
  font-family: var(--font-body);
  font-size: 0.65rem;
  font-weight: 800;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  color: var(--gold-light, #d7dc62);
}
.pricing-rail-inner .rate-line {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: 12px;
  padding: 5px 0;
  border-bottom: 1px solid rgba(255, 255, 255, 0.09);
}
.pricing-rail-inner .rate-line:last-of-type { border-bottom: 0; }
/* Derek round-6: everything inside the price categories reads in full white
   (labels/context/notes were translucent grey-white); the size difference
   against the 18px semi-bold amounts carries the hierarchy. */
.pricing-rail-inner .rate-line span { color: #fff; font-size: 0.8rem; line-height: 1.4; }
.pricing-rail-inner .rate-line strong { color: #fff; font-size: 1.125rem; font-weight: 600; white-space: nowrap; }
.pricing-rail-inner .rate-context { margin: 2px 0 0; color: #fff; font-size: 0.68rem; line-height: 1.5; }
.pricing-rail-inner .rate-note { margin: 10px 0 2px; color: #fff; font-size: 0.66rem; line-height: 1.5; }

/* Left column: the shell already provides the gutters. */
.lodge-main-left { display: grid; gap: 8px; }
.lodge-shell .lodge-main-left .section { padding-left: 0; padding-right: 0; }
.lodge-shell .lodge-verdict { padding-top: 62px; padding-bottom: 58px; }
.lodge-shell .lodge-profile { padding-top: 48px; padding-bottom: 84px; }

/* Our Verdict: frozen ratings column + hot/not stack. */
.verdict-2col { display: grid; grid-template-columns: 150px minmax(0,1fr); gap: 26px; align-items: start; }
.verdict-ratings-col { position: sticky; top: calc(var(--header-h) + var(--lodge-tabs-h, 57px) + 18px); }
.verdict-ratings-col .rating-grid { display: grid; grid-template-columns: 1fr; gap: 12px; }
.hot-not-stack { display: grid; gap: 28px; }
.verdict-list h3 { display: flex; align-items: center; gap: 8px; }
.verdict-thumb.up { color: var(--teal, #8c9500); }
/* Old-site design uses the same olive green for both thumbs (Derek round-2). */
.verdict-thumb.down { color: var(--teal, #8c9500); }

/* Divider band + pull quote (Derek round-4) — the old site's layout restored:
   an UNOBSTRUCTED image on the left, the quote on a block of solid brand dark
   on the right, the whole band edge-to-edge so it genuinely divides the page.

   Full-bleed technique: the band sits inside .lodge-main-left, which is grid
   column 2 of .lodge-shell, so it is inset by --lodge-gutter on the left and by
   (gutter + rail-gap + rail-w) on the right. Negative margins built from those
   same custom properties pull it back to both viewport edges exactly — no
   100vw, so no scrollbar-induced horizontal overflow. The sticky rates rail
   (z-index 31 on .lodge-shell > .lodge-pricing-rail) still paints above the
   band, which is the one overlap Derek asked for. */
.lodge-quote-block {
  /* Width of the band the sticky rail does NOT cover — the image and the quote
     column are proportioned against this rather than the full viewport, so the
     text is not squeezed to nothing as the viewport narrows. */
  --quote-usable: calc(100% - var(--lodge-gutter) - var(--rail-w));
  position: relative;
  display: grid;
  grid-template-columns: calc(var(--quote-usable) * 0.5) minmax(0, 1fr);
  align-items: stretch;
  min-height: 420px;
  margin: 56px 0;
  margin-left: calc(-1 * var(--lodge-gutter));
  margin-right: calc(-1 * (var(--lodge-gutter) + var(--rail-gap) + var(--rail-w)));
}
.lodge-quote-block--noimage { grid-template-columns: minmax(0, 1fr); }
.lodge-quote-media { background-size: cover; background-position: center; }
.lodge-quote-panel {
  display: flex;
  align-items: center;
  background: var(--ink, #2d332b);
  /* Right padding clears the rail column so the quote is never behind it. */
  padding: clamp(44px, 5vw, 76px) calc(var(--lodge-gutter) + var(--rail-w) + 28px) clamp(44px, 5vw, 76px) clamp(32px, 3.4vw, 60px);
}
.lodge-pull-quote {
  margin: 0;
  color: var(--cream, #f3f0e7);
  font-family: var(--font-display);
  font-style: italic;
  font-size: clamp(1.35rem, 2.05vw, 2.05rem);
  line-height: 1.34;
}
/* Derek round-6: the quotation mark is a SOLID inline SVG at the head of the
   first line — text starts right after it, its bottom sits on the first
   line's baseline, and wrapped lines return to the blockquote's left edge
   (= the mark's left edge). Replaces the old ::before glyph that hung on its
   own line above the quote. Keep the height <= ~0.8em so line 1 keeps the
   1.34 rhythm. */
.lodge-pull-quote .pull-quote-mark {
  display: inline-block;
  height: 0.72em;
  width: auto;
  vertical-align: baseline;
  margin-right: 0.22em;
  color: var(--gold-light, #d7dc62);
}

/* Lodge Profile: quick info + main copy with Load More. */
.profile-2col { display: grid; grid-template-columns: 220px minmax(0,1fr); gap: 32px; align-items: start; }
.profile-quickinfo { position: sticky; top: calc(var(--header-h) + var(--lodge-tabs-h, 57px) + 18px); background: var(--cream, #f3f0e7); border-radius: 14px; padding: 20px; }
.profile-quickinfo .lodge-card-eyebrow { display: block; margin-bottom: 12px; }
.profile-body-copy.is-clamped { position: relative; max-height: 420px; overflow: hidden; }
/* Derek round-6: the fade ramps into the CREAM page background (was white —
   it ended in a visible white block on cream). Keep in step with the body
   background var(--cream). */
.profile-body-copy.is-clamped::after { content: ""; position: absolute; inset: auto 0 0 0; height: 120px; background: linear-gradient(to bottom, rgba(243, 240, 231, 0), var(--cream, #f3f0e7)); }
.profile-body-copy.is-open { max-height: none; }
.profile-body-copy.is-open::after { display: none; }
/* Derek round-6: Load More is centred with a rule extending from either
   side; the button takes the pricing strip's dark grey with a white label. */
.load-more-row { display: flex; align-items: center; gap: 18px; margin-top: 18px; }
.load-more-row::before,
.load-more-row::after { content: ""; flex: 1 1 0; height: 1px; background: var(--line-strong, rgba(45, 51, 43, 0.2)); }
.load-more-row.is-hidden { display: none; }
.load-more-btn { display: inline-flex; background: rgba(38, 43, 36, 0.9); border: 0; color: #fff; font-weight: 700; padding: 10px 26px; border-radius: 999px; cursor: pointer; transition: background 0.3s var(--ease-out); }
.load-more-btn:hover { background: var(--ink, #2d332b); }
.load-more-btn.is-hidden { display: none; }

/* Solid colour block: useful links / booking notes / child policy. Carries the
   #details anchor (positioned parent for the .anchor-alias span). */
.lodge-solid-block { position: relative; background: var(--gold, #a5ad00); color: var(--ink, #2d332b); margin-top: 8px; scroll-margin-top: calc(var(--header-h) + var(--lodge-tabs-h, 57px)); }
.solid-block-inner { max-width: var(--container); margin: 0 auto; padding: 56px 24px; display: grid; grid-template-columns: repeat(3,1fr); gap: 40px; }
.solid-col h3 { font-family: var(--font-display); font-size: 1.4rem; margin: 0 0 14px; }
.solid-col ul { margin: 0; padding-left: 18px; }
.solid-col li { margin-bottom: 6px; }
/* Derek round-6: Useful Links are icon + text rows (old-site pattern) — no
   more light-green button blocks. Sits directly on the gold band, ink text. */
.solid-useful .useful-link-list { display: grid; gap: 18px; }
.useful-link-row { display: flex; align-items: flex-start; gap: 14px; color: var(--ink, #2d332b); }
.useful-link-row .useful-link-icon { flex: 0 0 auto; width: 38px; height: 38px; margin-top: 2px; }
.useful-link-text { display: block; min-width: 0; }
.useful-link-text strong { display: block; font-weight: 700; }
.useful-link-text small { display: block; opacity: 0.78; line-height: 1.45; }
.useful-link-row:hover .useful-link-text strong { text-decoration: underline; }

/* Stacked layout (<=1024px): the rail becomes a normal-flow dark rates card
   directly after the hero — same contrast, compact spacing, amounts visible. */
@media (max-width: 1024px) {
  .lodge-shell {
    grid-template-columns: 100%;
    grid-template-rows: auto var(--lodge-tabs-h) auto auto auto auto auto;
  }
  .lodge-shell > .lodge-hero { grid-column: 1; grid-row: 1; }
  .lodge-shell > .lodge-tabs { grid-column: 1; grid-row: 2 / -1; }
  .lodge-shell > .lodge-pricing-rail { grid-column: 1; grid-row: 3; z-index: auto; padding: 18px 20px 4px; }
  .lodge-shell > .lodge-main-left { grid-column: 1; grid-row: 4; }
  .lodge-shell > .lodge-solid-block { grid-column: 1; grid-row: 5; }
  .lodge-shell > .section-gallery { grid-column: 1; grid-row: 6; }
  .lodge-shell > .section-related { grid-column: 1; grid-row: 7; }
  .lodge-shell .lodge-tabs-inner { padding-left: 20px; padding-right: 20px; }
  .lodge-shell .lodge-tab-name { display: none; }
  .lodge-shell .lodge-main-left .section { padding-left: 20px; padding-right: 20px; }

  .lodge-hero[data-lodge-hero-slider].lodge-hero--strip { height: clamp(400px, 58svh, 620px); }
  /* The browse pill and the View-All link are a pair on this row, so they get
     one height and one baseline — Derek: "the 2 elements dealing with the image
     gallery ... are not aligned". They were 53px and 44px tall. */
  .lodge-hero[data-lodge-hero-slider].lodge-hero--strip .lodge-hero-controls,
  .lodge-hero[data-lodge-hero-slider].lodge-hero--strip .lodge-hero-gallery-link {
    top: auto;
    bottom: var(--lodge-hero-row-b, 20px);
    display: flex;
    align-items: center;
    justify-content: center;
    min-height: 44px;
    height: 44px;
    box-sizing: border-box;
  }
  .lodge-hero[data-lodge-hero-slider].lodge-hero--strip .lodge-hero-controls {
    left: 16px;
    right: auto;
  }
  .lodge-hero[data-lodge-hero-slider].lodge-hero--strip .lodge-hero-gallery-link {
    left: auto;
    right: 16px;
  }
  /* Derek round-13: from 1024 down the pricing rail drops BELOW the hero, so
     the opening screen was a photo with nothing on it — "there is no indication
     of which lodge you are looking at". Name / location / From-price sit over
     the hero instead, above the gallery controls. */
  .lodge-hero[data-lodge-hero-slider].lodge-hero--strip .lodge-hero-id {
    display: flex;
    flex-direction: column;
    gap: 3px;
    position: absolute;
    z-index: 2;
    left: 16px;
    right: 16px;
    bottom: var(--lodge-hero-id-b, 76px);
    color: #fff;
    text-shadow: 0 1px 14px rgba(45, 51, 43, 0.6);
  }
  .lodge-hero-id-name {
    font-family: var(--font-display, inherit);
    font-size: clamp(1.5rem, 6.4vw, 2rem);
    font-weight: 600;
    line-height: 1.08;
  }
  .lodge-hero-id-loc {
    font-size: 0.7rem;
    letter-spacing: 0.14em;
    text-transform: uppercase;
    opacity: 0.92;
  }
  .lodge-hero-id-from {
    margin-top: 3px;
    font-size: 0.92rem;
  }
  .lodge-hero-id-from strong { font-weight: 700; }
  .lodge-hero-id-from small { font-size: 0.68rem; opacity: 0.86; }

  .lodge-shell .pricing-rail-inner { position: static; max-height: none; padding: 22px 20px 16px; }
  .pricing-rail-title { font-size: 1.75rem; }

  .verdict-2col, .profile-2col { grid-template-columns: 1fr; }
  .verdict-ratings-col, .profile-quickinfo { position: static; }
  .verdict-ratings-col .rating-grid { grid-template-columns: repeat(auto-fit, minmax(120px,1fr)); }
  .solid-block-inner { grid-template-columns: 1fr; gap: 28px; }
}

/* Small screens: the tabs collapse to the 5-pill grid (Gallery / Verdict /
   Profile / More Info / Enquire) — the lodge name lives in the rates card
   directly below the hero, so it leaves the bar. */
@media (max-width: 720px) {
  /* The docked bar owns the bottom 61px of the screen, so everything that sits
     on the hero's bottom edge is lifted clear of it. */
  .lodge-shell {
    --lodge-tabs-h: 61px;
    --lodge-hero-row-b: 81px;
    --lodge-hero-id-b: 137px;
  }
  .lodge-shell .lodge-tabs-inner {
    height: auto;
    overflow: visible;
    padding: 0;
  }
  .lodge-shell .lodge-tabs-inner a:not(.lodge-tab-enquire) {
    height: auto;
    padding: 10px 2px;
  }
  .lodge-shell > .lodge-pricing-rail { padding: 16px 16px 2px; }
  .lodge-shell .pricing-rail-inner { padding: 20px 18px 14px; }

  /* === Derek round-13: the lodge menu on a phone ===
     It used to sit in the page just under a 400-620px hero, i.e. below the fold,
     so opening a lodge showed no menu at all. It now rides the bottom of the
     screen while the hero is up and re-docks under the header once the hero has
     gone by ("On scrolling down, the menu system will fix itself to the top of
     the screen under the header"). The grid track it used to occupy keeps its
     height, so taking it out of flow shifts nothing. */
  .lodge-shell > .lodge-tabs {
    position: fixed;
    top: auto;
    right: 0;
    bottom: 0;
    left: 0;
    height: auto;
    z-index: 40;
    box-shadow: 0 -10px 30px rgba(45, 51, 43, 0.16);
  }
  .lodge-shell > .lodge-tabs.is-docked-top {
    top: var(--header-h);
    bottom: auto;
    box-shadow: 0 12px 30px rgba(45, 51, 43, 0.1);
  }
  /* Four labels, his order: Lodge Profile / Gallery / Pricing / Enquire Now. */
  .lodge-tabs-inner .lodge-tab--wide { display: none; }
  .lodge-tabs-inner .lodge-tab--compact { display: inline-flex; }
  .lodge-shell .lodge-tabs-inner { grid-template-columns: repeat(4, minmax(0, 1fr)); }

  /* Past the pricing block the name returns, on its own band of colour beneath
     the buttons rather than as a fifth tab. */
  .lodge-shell .lodge-tabs.is-past-pricing .lodge-tab-name {
    display: block;
    grid-column: 1 / -1;
    /* It is the first child in source order (that is where the wide layout
       wants it, at the left of the row), so it has to be ordered last to sit
       BENEATH the buttons — "there it will remain fixed beneath the menu
       system as the user scrolls further down". */
    order: 9;
    margin: 8px -10px -8px;
    padding: 7px 12px;
    background: var(--ink);
    color: var(--cream);
    font-size: 0.72rem;
    font-weight: 600;
    letter-spacing: 0.1em;
    text-transform: uppercase;
    text-align: center;
    overflow: hidden;
    text-overflow: ellipsis;
  }

  /* Overall belongs in the middle of the top row, not the left corner, so the
     three-across grid reads symmetrically (Derek). Source order is untouched —
     screen readers still meet the overall score first. */
  .verdict-ratings-col .rating-grid > .rating-circle { order: 3; }
  .verdict-ratings-col .rating-grid > .rating-circle.is-lead-sub { order: 1; }
  .verdict-ratings-col .rating-grid > .rating-circle.is-overall { order: 2; }
}

/* Compact rating chips for the frozen Verdict column (Derek polish). */
.verdict-ratings-col .rating-grid { gap: 10px; }
.verdict-ratings-col .rating-chip { padding: 12px 14px; border-radius: 12px; }
.verdict-ratings-col .rating-chip strong { font-size: 1.6rem; line-height: 1; }
.verdict-ratings-col .rating-chip span { font-size: .62rem; letter-spacing: .1em; }

/* Force the frozen rating column to a compact single-column stack (override the
   site-wide .rating-grid auto-fit + .rating-chip min-width). Desktop only —
   in the stacked layout the chips flow as a wrapping grid. */
@media (min-width: 1025px) {
  .verdict-ratings-col .rating-grid { grid-template-columns: 1fr !important; gap: 14px !important; }
}
.verdict-ratings-col .rating-chip { min-width: 0 !important; width: 100% !important; padding: 12px 14px !important; }
.verdict-ratings-col .rating-chip strong { font-size: 1.55rem !important; }

/* === Derek round-2 (2026-07-20): graduated-fade header, circular ratings ===
   Round 8 (2026-08-01): Derek asked for this header on every page, so the
   selectors moved off body.lodge-page onto body.header-fade /
   .site-header--fade, which the sweep added to every committed page and to
   bushscapes-gen/shell.html. The lodge-hero rules below stay lodge-only. */

/* -- A. Graduated-fade header (every page) ---------------------------------
   No solid bar at page top: the hero starts at y=0 and the header row (white
   search icon / white logo / white hamburger) floats on a vertical gradient
   that melts from dark to fully transparent by ~150px. On scroll it becomes
   the old site's solid dark grey bar (#3b434e). */
body.header-fade { padding-top: 0; }
.site-header--fade {
  background: transparent;
  border-bottom: 0;
  -webkit-backdrop-filter: none;
  backdrop-filter: none;
  color: #fff;
  transition: background-color 0.35s var(--ease-soft), box-shadow 0.4s var(--ease-out);
}
/* Derek round 10 (2026-08-06 14:49), from his iPad: "the darker strip used on
   the header does not graduate as it should from dark at the top to fading
   completely lower down as it does on the PC version - instead it renders as a
   bar with a consistent level of transparency".

   The scrim is 150px tall but the header box is only 76px, so it relies on
   overflowing its parent — and it did that from a z-index:-1 layer inside a
   position:fixed element, which WebKit composites separately and clips to the
   element box. Clipped to 76px you see the top half of the gradient only:
   0.62 → ~0.35 alpha, i.e. a fairly even dark band ending in a hard edge —
   exactly what he photographed. Chromium paints the overflow, which is why it
   looks right on the PC.

   Painting order is preserved without the negative layer: the scrim sits at
   z-index 0 and .site-header-inner is lifted above it (below). */
.site-header--fade::before {
  content: "";
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
  height: 150px;
  background: linear-gradient(
    180deg,
    rgba(28, 32, 30, 0.62) 0%,
    rgba(28, 32, 30, 0.44) 42%,
    rgba(28, 32, 30, 0.2) 72%,
    rgba(28, 32, 30, 0) 100%
  );
  pointer-events: none;
  z-index: 0;
  opacity: 1;
  transition: opacity 0.35s var(--ease-soft);
}
.site-header--fade .site-header-inner {
  position: relative;
  z-index: 1;
}
.site-header--fade.is-scrolled {
  background-color: #3b434e;
  box-shadow: 0 10px 30px rgba(20, 24, 28, 0.24);
}
.site-header--fade.is-scrolled::before { opacity: 0; }
/* Round-3: plain white icons — no circular chip around search / menu. */
.header-fade .header-btn {
  color: #fff;
  opacity: 0.92;
  border: 0;
  background: transparent;
}
.header-fade .header-btn:hover {
  opacity: 1;
  background: transparent;
  color: #fff;
}
/* Round 8: the non-lodge heroes were built to start below a 76px solid bar, so
   with the header now floating they need that height back as top padding to
   keep the headline clear of the logo row. .page-hero is bottom-aligned, so
   this only matters for the short/compact variants. */
.header-fade .page-hero { padding-top: calc(var(--header-h) + 40px); }
.header-fade .page-hero.compact { min-height: 46vh; }
/* Hero starts at the very top now, so it may fill the full viewport height. */
.lodge-page .lodge-hero[data-lodge-hero-slider].lodge-hero--strip {
  height: clamp(540px, 100svh, 840px);
}
/* Round-3: the browse control is a compact [<] 1/6 [>] pill on the LEFT of
   the page at the hero's vertical middle, with the "View All Photos (N)"
   link directly beneath it. (Desktop only — the stacked layout keeps the
   controls along the hero bottom.) */
@media (min-width: 1025px) {
  .lodge-page .lodge-hero[data-lodge-hero-slider].lodge-hero--strip .lodge-hero-controls {
    top: 50%;
    bottom: auto;
    left: var(--lodge-gutter, 24px);
    right: auto;
    transform: translateY(-50%);
    gap: 4px;
    min-height: 40px;
    padding: 4px 6px;
  }
  .lodge-page .lodge-hero--strip .lodge-hero-arrow {
    width: 30px;
    height: 30px;
    border: 0;
    background: transparent;
  }
  .lodge-page .lodge-hero--strip .lodge-hero-count {
    min-width: 40px;
    text-align: center;
    font-size: 0.74rem;
  }
  .lodge-page .lodge-hero[data-lodge-hero-slider].lodge-hero--strip .lodge-hero-gallery-link {
    top: calc(50% + 34px);
    bottom: auto;
    left: var(--lodge-gutter, 24px);
    right: auto;
    min-height: 36px;
    padding: 8px 15px;
    font-size: 0.68rem;
  }
}

/* -- B. Circular overall-rating badge in the pricing strip ----------------
   Round-3 (old-site icon): olive circle with a ring of SMALL DOTS (the
   .dot-ring SVG emitted by the generator), a big Montserrat Light score, a
   short white separator line, then OVERALL. Centred above the lodge name. */
.dot-ring {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  pointer-events: none;
}
.rail-rating-badge {
  position: relative;
  flex: 0 0 auto;
  width: 104px;
  height: 104px;
  margin: 14px auto 10px;
  border-radius: 50%;
  background: var(--gold, #a5ad00);
  color: #fff;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: 0;
  text-align: center;
}
.rail-rating-badge .dot-ring { color: rgba(255, 255, 255, 0.9); }
/* Round-6 proportions (Derek's reference): the divider is a bolder, longer
   line pinned to the circle's true centre; the number sits just above it,
   heavier (Montserrat 500), the label just below. Mirrors .rating-circle. */
.rail-rating-badge strong {
  position: absolute;
  left: 0;
  right: 0;
  bottom: 50%;
  /* Round-7: number tucked closer to the centre line. */
  margin-bottom: 2px;
  font-family: "Montserrat", var(--font-body);
  font-size: 2.15rem;
  font-weight: 500;
  line-height: 1;
  letter-spacing: -0.01em;
}
.rail-rating-badge::after {
  content: "";
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  /* Round-7: longer and thicker for prominence. */
  width: 46px;
  height: 3px;
  background: rgba(255, 255, 255, 0.9);
}
/* Round-7: the OVERALL label matches the verdict rating circles exactly. */
.rail-rating-badge span {
  position: absolute;
  left: 0;
  right: 0;
  top: 50%;
  margin-top: 7px;
  font-size: 0.78rem;
  font-weight: 700;
  letter-spacing: 0.1em;
  line-height: 1.25;
  text-transform: uppercase;
  opacity: 0.95;
}
/* Lodge name block is centred in the strip (round-3), so the meta centres too. */
.lodge-page .pricing-rail-meta { justify-content: center; }
.lodge-page .pricing-rail-from { align-items: center; text-align: center; }

/* -- C. Circular OUR RATINGS icons in the frozen verdict column ------------
   Round-6 proportions (Derek's reference): denser dot ring (50 dots, from
   the generator), the dividing line bolder/longer and pinned to the circle's
   TRUE CENTRE, the number heavier (Montserrat 500) just above the line, and
   a bigger label just below it — "LUXURY & STYLE" / "GAME VIEWING" wrap to
   two lines. White on the olive overall circle, olive on the white
   sub-rating circles. The column keeps its sticky freeze. */
.verdict-ratings-heading {
  display: block;
  margin: 0 0 18px;
  font-size: 18px;
  font-weight: 700;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--ink);
  text-align: center;
}
.lodge-page .verdict-ratings-col .rating-grid { justify-items: center; }
.rating-circle {
  position: relative;
  width: 110px;
  height: 110px;
  flex: 0 0 auto;
  border-radius: 50%;
  background: #fff;
  border: 0;
  box-shadow: var(--shadow-soft);
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: 0;
  padding: 12px;
  text-align: center;
}
.rating-circle .dot-ring { color: var(--gold, #a5ad00); }
.rating-circle strong {
  position: absolute;
  left: 0;
  right: 0;
  bottom: 50%;
  /* Round-7: number tucked closer to the centre line for balance. */
  margin-bottom: 2px;
  font-family: "Montserrat", var(--font-body);
  font-size: 1.9rem;
  font-weight: 500;
  line-height: 1;
  color: var(--ink);
}
.rating-circle::after {
  content: "";
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  /* Round-7: longer and thicker for prominence. */
  width: 48px;
  height: 3px;
  background: var(--gold, #a5ad00);
}
.rating-circle span {
  position: absolute;
  left: 0;
  right: 0;
  top: 50%;
  margin: 7px auto 0;
  max-width: 96px;
  /* Round-7: category labels bigger again for legibility. */
  font-size: 0.78rem;
  font-weight: 700;
  letter-spacing: 0.1em;
  line-height: 1.25;
  text-transform: uppercase;
  color: var(--ink-2);
}
.rating-circle.is-overall {
  background: var(--gold, #a5ad00);
}
.rating-circle.is-overall .dot-ring { color: rgba(255, 255, 255, 0.9); }
.rating-circle.is-overall strong { font-size: 2.1rem; }
.rating-circle.is-overall::after { background: rgba(255, 255, 255, 0.9); }
.rating-circle.is-overall strong,
.rating-circle.is-overall span { color: #fff; }
/* Rating-less lodges: the verdict grid collapses to the hot/not stack. */
.verdict-2col.verdict-2col--noratings { grid-template-columns: minmax(0, 1fr); }

/* Stacked layout: circles flow horizontally and wrap. */
@media (max-width: 1024px) {
  .lodge-page .verdict-ratings-col .rating-grid {
    display: flex;
    flex-wrap: wrap;
    justify-content: center;
    gap: 14px;
  }
  .verdict-ratings-heading { margin-bottom: 14px; }
}
@media (max-width: 720px) {
  .rating-circle { width: 100px; height: 100px; padding: 10px; }
  .rating-circle strong { font-size: 1.4rem; }
  .rating-circle.is-overall strong { font-size: 1.6rem; }
  .rating-circle span { font-size: 0.7rem; max-width: 84px; }
  .rating-circle::after { width: 40px; }
  .lodge-page .verdict-ratings-col .rating-grid { gap: 12px; }
}

/* -- D. Solid block heading (the More Info tab's landing) ------------------ */
.solid-block-heading {
  margin: 0;
  padding: 56px 24px 0;
  font-family: var(--font-body);
  font-size: 0.95rem;
  font-weight: 700;
  letter-spacing: 0.26em;
  text-transform: uppercase;
  text-align: center;
  color: var(--ink);
}
.lodge-solid-block .solid-block-inner { padding-top: 34px; }

/* === Derek round-3 (2026-07-21): header icon rework, full-height translucent
   strip, rate context + includes, left browse control, tabs-row CTA, verdict
   typography, solid thumb markers ===
   Scoped to body.lodge-page (bushscapes-gen/shell.html only). */

/* -- Header: this block used to hold the lodge-only icon rework (bolder bars,
   menu centred over the strip column, search mirrored). Derek round 11 (A1)
   asked for exactly that on every layout, so it moved up to the base header
   rules near .menu-bars / .site-header-inner and is driven by
   --chrome-icon-offset. Nothing lodge-specific is left; deliberately empty.

   It was also WRONG here from round 10 onwards: the iPad scrim fix put
   position: relative on .site-header-inner, which re-parented these absolutely
   positioned toggles off .site-header, so `right: gutter + 166px` was short by
   the header's own padding (40px at 1440, 120px at 1600, 280px at 1920). The
   replacement subtracts --header-pad and lands on the rail mid-point exactly. */

/* -- The info/pricing strip: no floating island. It runs squared from the very
   top of the page down through the tabs bar (hero height + tabs height), more
   transparent so the hero photos read through, and continues as the sticky
   full-height strip while scrolling (releasing at the solid block as before). */
@media (min-width: 1025px) {
  .lodge-page .pricing-rail-inner {
    position: sticky;
    top: 0;
    /* Round-7b made this min-height so the strip would GROW for longer rate
       lists rather than cap and scroll. Derek asked for that reversed on
       18 Aug: "we need to make the info/rates bar scrollable if your cursor is
       on this bar ie. when there are many rates and it doesn't all fit on the
       page, then you can scroll down within this bar without moving down the
       page as a whole." So it keeps the squared look up to the height of the
       screen and scrolls inside beyond that — the min-height is clamped to the
       viewport, because a min-height larger than the max wins and would leave
       nothing to scroll. */
    min-height: min(
      calc(clamp(540px, 100svh, 840px) + var(--lodge-tabs-h, 57px)),
      100svh
    );
    max-height: 100svh;
    background: rgba(35, 40, 33, 0.7);
    border: 0;
    border-left: 1px solid rgba(255, 255, 255, 0.08);
    border-right: 1px solid rgba(255, 255, 255, 0.08);
    border-radius: 0;
    padding: calc(var(--header-h) + 2px) 22px 22px;
  }
}
/* Lodge name: ALL CAPS, centred in the strip. Round-6: 36px, dropping to
   32px on very long names (the generator adds --long at >= 25 chars). */
.lodge-page .pricing-rail-title {
  margin: 10px 0 4px;
  font-size: 2.25rem;
  line-height: 1.06;
  letter-spacing: 0.03em;
  text-transform: uppercase;
  text-align: center;
}
.lodge-page .pricing-rail-title--long { font-size: 2rem; }
.lodge-page .pricing-rail-loc { text-align: center; }
.lodge-page .pricing-rail-save { text-align: center; }

/* Rate lines: the CMS room-type context sits under the date label. */
.pricing-rail-inner .rate-line-label {
  display: flex;
  flex-direction: column;
  gap: 1px;
}
.pricing-rail-inner .rate-line-context {
  color: #fff;
  font-size: 0.68rem;
  line-height: 1.45;
}

/* Includes list: after the rate sections, before the SA-residents note. */
.pricing-rail-inner .rail-includes {
  margin-top: 4px;
  padding: 11px 0 2px;
  border-top: 1px solid rgba(255, 255, 255, 0.13);
}
.pricing-rail-inner .rail-includes h3 {
  margin: 0 0 6px;
  font-family: var(--font-body);
  font-size: 0.65rem;
  font-weight: 800;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  color: var(--gold-light, #d7dc62);
}
.pricing-rail-inner .rail-includes ul { margin: 0; padding-left: 16px; }
.pricing-rail-inner .rail-includes li {
  margin: 0 0 3px;
  font-size: 0.78rem;
  line-height: 1.45;
  color: #fff;
}
.pricing-rail-inner .rail-includes li::marker { color: var(--gold-light, #d7dc62); }

/* -- Tabs row: the green Enquire Now (moved down from the strip) replaces the
   black pill at the right end of the row. The label is WHITE on the Bushscapes
   green (Derek 2026-07-23). The hover used to lighten to --gold-light, which
   white cannot sit on, so it now deepens instead — the label stays white
   through both states rather than flipping to dark ink on hover. */
.lodge-page .lodge-tabs-inner .lodge-tab-enquire {
  background: var(--gold, #a5ad00);
  color: #fff;
  font-weight: 800;
}
.lodge-page .lodge-tabs-inner .lodge-tab-enquire:hover {
  background: var(--teal-deep, #5c6100);
  color: #fff;
}
@media (max-width: 720px) {
  .lodge-page .lodge-tabs-inner .lodge-tab-enquire {
    border-color: var(--gold, #a5ad00);
    background: var(--gold, #a5ad00);
    color: #fff;
  }
}

/* -- Our Verdict (Derek round-6): "Our" regular serif in ink, "Verdict"
   italic in the accent green (via the inner em.hl-accent); "The honest
   Bushscapes take." the smaller sub-title tucked closer beneath. */
.lodge-page .verdict-title {
  margin: 0;
  font-family: var(--font-display);
  font-style: normal;
  font-weight: 400;
  font-size: clamp(2.6rem, 4.5vw, 3.8rem);
  line-height: 1.02;
  color: var(--ink);
}
.lodge-page .verdict-sub {
  margin: 4px 0 0;
  font-family: var(--font-display);
  font-size: clamp(1.25rem, 1.8vw, 1.5rem);
  line-height: 1.3;
  color: var(--ink-2);
}
.lodge-page .verdict-sub + .lede { margin-top: 14px; }

/* What's Hot / What's Not: ALL CAPS, bigger, bolder, both the same Bushscapes
   olive green (the darker cut of the --gold family for legibility on white). */
.lodge-page .verdict-list h3 {
  margin-bottom: 16px;
  font-family: var(--font-body);
  font-size: 1.25rem;
  font-weight: 800;
  letter-spacing: 0.1em;
  text-transform: uppercase;
}
.lodge-page .verdict-list.positives h3,
.lodge-page .verdict-list.negatives h3 { color: var(--teal, #8c9500); }

/* Solid filled thumbs (Derek's olive Facebook-like design) replace the
   bullets: thumbs-up on Hot items, the same thumb flipped on Not items. */
.lodge-page .verdict-list ul { list-style: none; padding-left: 0; }
.lodge-page .verdict-list li {
  display: flex;
  align-items: flex-start;
  gap: 10px;
  margin-bottom: 12px;
}
.li-thumb {
  flex: 0 0 auto;
  width: 20px;
  height: 20px;
  margin-top: 1px;
  color: var(--teal, #8c9500);
}
.li-thumb.down { transform: rotate(180deg); }

/* === Derek round-4 (2026-07-21): full-bleed divider band, tighter More Info
   block with Booking Notes, bigger gallery/related headings, larger 16:9
   lightbox ===
   Scoped to body.lodge-page (bushscapes-gen/shell.html only) except where the
   rule has to reach a shared component. */

/* -- A. Divider band: stack image over quote below the two-column shell, where
   .lodge-main-left already spans the full width so no bleed maths is needed. */
@media (max-width: 1024px) {
  .lodge-quote-block {
    grid-template-columns: minmax(0, 1fr);
    min-height: 0;
    margin: 36px 0;
  }
  .lodge-quote-media { min-height: clamp(220px, 44vw, 380px); }
  .lodge-quote-panel { padding: clamp(34px, 7vw, 52px) 20px; }
}

/* -- D. "More Information" block: bigger main heading, bolder sub-headings, and
   a materially tighter band. Most of the height was the generic .section
   padding (110px top AND bottom) sitting under the block's own padding — the
   band carried ~330px of vertical chrome. Dropping the section padding and
   tightening the rest takes that to ~106px, so it reads as a strip rather than
   a screenful. Columns are auto-fit so a lodge missing Booking Notes or Child
   Policy re-flows to fill the row instead of leaving a hole (40 of the 135
   published lodges render two columns, one renders a single column). */
.lodge-solid-block {
  padding-top: 0;
  padding-bottom: 0;
}
.solid-block-heading {
  padding: 40px 24px 0;
  font-size: clamp(1.4rem, 2.6vw, 2rem);
  letter-spacing: 0.14em;
}
.lodge-solid-block .solid-block-inner {
  padding-top: 24px;
  padding-bottom: 44px;
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 250px), 1fr));
  gap: 30px 44px;
}
/* Cormorant only ships to 600 here, and semibold serif still reads light at
   this size — the sub-headings borrow the What's Hot / What's Not treatment
   (body font, heavy, uppercase) so "bolder" is unambiguous. */
.solid-col h3 {
  margin: 0 0 14px;
  font-family: var(--font-body);
  font-size: 1.02rem;
  font-weight: 800;
  letter-spacing: 0.09em;
  text-transform: uppercase;
}

/* -- E/G. Gallery + related section eyebrows ("Gallery", "Like this lodge?")
   step up from the 0.74rem site default. */
.lodge-page .section-gallery .section-head .eyebrow,
.lodge-page .section-related .section-head .eyebrow {
  margin-bottom: 14px;
  font-size: 1.12rem;
  font-weight: 700;
  letter-spacing: 0.15em;
}

/* -- F. Lightbox: a 16:9 stage grown to very nearly the whole viewport. The old
   90vw x 80vh contain box rendered a 1920x1080 photo at 1280x720 on a 1440x900
   screen — 71% of the viewport — because reserving side room for the arrows
   capped it. The arrows now float OVER the photo (given a darker scrim + blur
   so they stay legible against any image), which frees the stage to reach ~86%.
   The <img> fills the stage, so its rendered box is exactly 16:9. */
.lightbox-stage {
  width: min(calc(100vw - 36px), calc((100vh - 36px) * 16 / 9));
  height: auto;
  aspect-ratio: 16 / 9;
}
.lightbox-slide img {
  width: 100%;
  height: 100%;
  max-width: none;
  max-height: none;
  object-fit: contain;
}
.lightbox-close,
.lightbox-prev,
.lightbox-next {
  background: rgba(28, 32, 26, 0.55);
  border-color: rgba(250, 246, 236, 0.45);
  -webkit-backdrop-filter: blur(6px);
  backdrop-filter: blur(6px);
}
.lightbox-close:hover,
.lightbox-prev:hover,
.lightbox-next:hover { background: rgba(28, 32, 26, 0.82); }
.lightbox-close { top: 20px; right: 20px; }
.lightbox-prev { left: 20px; }
.lightbox-next { right: 20px; }
@media (max-width: 720px) {
  .lightbox-stage {
    width: min(calc(100vw - 12px), calc((100dvh - 140px) * 16 / 9));
    height: auto;
    padding: 0;
  }
}




/* === Derek 19 Aug: the lodge page on a phone, second pass ===
   Four sizing notes, measured at 375px before changing anything. Appended after
   the round8-partials marker on purpose, so a fold cannot drop them the way it
   dropped the "1" rule.

   His words, and what each was actually measuring:
   "bigger lodge name"                  the hero name was 24px
   "gallery icons to be made same
    height"                             the arrows were 37px against a 44px
                                        View All Photos button, so they sat short
                                        inside a 44px row. #23 equalised the two
                                        wrappers, not the arrows themselves
   "menu buttons to have bigger font
    and over 2 lines where necessary"   the four buttons were 9px with nowrap
   "bigger magnifying glass icon"       22px glyph in a 44px button. The svg
                                        carries width/height attributes in the
                                        markup of all 210 pages; CSS outranks a
                                        presentation attribute, so one rule here
                                        beats regenerating every page
   ============================================================ */
@media (max-width: 1024px) {
  .lodge-hero-id-name {
    font-size: clamp(1.85rem, 8vw, 2.5rem);
  }

  /* Match the View All Photos button exactly, which is also the 44px minimum
     tap target. */
  .lodge-hero-arrow {
    width: 44px;
    height: 44px;
  }

  /* 9px was unreadable. Wrapping is allowed now, so "Lodge Profile" and
     "Enquire Now" take two lines instead of being squeezed; min-height is a
     floor, not a cap, so the bar grows to fit rather than clipping. */
  .lodge-tabs-inner a {
    font-size: 0.72rem;
    line-height: 1.15;
    white-space: normal;
    hyphens: none;
  }

  /* Two of the four wrap and two do not, so left alone the row ends up with
     48px and 44px pills side by side. Stretch them to the tallest instead. */
  .lodge-tabs-inner {
    align-items: stretch;
  }
  .lodge-tabs-inner a {
    height: 100%;
  }

  /* Derek 20 Aug 14:25, third report of "still small". The real ceiling was
     the UA button padding (fixed at .header-btn); flex-shrink could still
     squeeze an inline svg, so pin it. The markup sweep also tightened the
     viewBox to the drawn glyph, so 34px of box is ~32px of visible magnifier
     now, versus ~27px before. */
  .search-toggle svg {
    width: 34px;
    height: 34px;
    flex: 0 0 auto;
  }
}




/* === Derek 19 Aug: the rates-bar scrollbar sits on the prices ===
   "this is too close to the actual prices - I would move the bar to the right,
   probably to the border of the shaded bar as indicated on the screenshot".

   The scroller is a child of .pricing-rail-inner, so its right edge, and with it
   the scrollbar, sat inside that element's horizontal padding, i.e. right up
   against the figures. Pulling the scroller out into the padding with a negative
   margin and putting the same value back as its own padding moves the scrollbar
   to the strip's edge while the rate rows keep their inset.
   ============================================================ */
.pricing-rail-scroll {
  --rail-scroll-pad: 20px;
  margin-right: calc(var(--rail-scroll-pad) * -1);
  padding-right: var(--rail-scroll-pad);
}
@media (max-width: 1200px) {
  /* .pricing-rail-inner drops to 18px of side padding here. */
  .pricing-rail-scroll {
    --rail-scroll-pad: 18px;
  }
}



/* === Derek 20 Aug — lodge hero gallery controls on phones =================
   12:00: "why don't we just use the version of this left hand button that we
   use on the PC version of the site, which is more simple, compact and the
   arrows are more legible too." And 11:35 (iPhone SE): the browse pill and
   VIEW ALL PHOTOS overlapped. Same compact pill as desktop, tightened so the
   pair fits a 375px screen side by side; VIEW ALL is anchored right and can
   ellipsize instead of spilling off-screen. */
@media (max-width: 560px) {
  .lodge-hero[data-lodge-hero-slider].lodge-hero--strip .lodge-hero-controls {
    left: 14px;
    right: auto;
    gap: 6px;
    padding: 4px 8px;
    min-height: 44px;
  }
  .lodge-hero[data-lodge-hero-slider].lodge-hero--strip .lodge-hero-arrow {
    width: 32px;
    height: 32px;
  }
  .lodge-hero[data-lodge-hero-slider].lodge-hero--strip .lodge-hero-count {
    min-width: 34px;
    font-size: 0.76rem;
  }
  .lodge-hero[data-lodge-hero-slider].lodge-hero--strip .lodge-hero-gallery-link {
    left: auto;
    right: 14px;
    max-width: calc(100vw - 188px);
    padding: 10px 14px;
    font-size: 0.7rem;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
  }
}

/* === Derek 20 Aug 10:47 — lightbox on a phone held in landscape ===========
   "the size that the gallery images appear when looking at your mobile in
   landscape need to be made bigger (I would even suggest we use the entire
   screen, even if the left and right scrolling arrows are then positioned
   over the images rather than alongside them)". The stage takes the whole
   viewport; the fixed arrows/close now sit over the photo. */
@media (orientation: landscape) and (max-height: 540px) {
  .lightbox-stage {
    width: 100vw;
    height: 100svh;
  }
  .lightbox-slide img {
    max-width: 100vw;
    max-height: 100svh;
    border-radius: 0;
  }
  .lightbox-close { top: 14px; right: 14px; }
  .lightbox-prev { left: 14px; }
  .lightbox-next { right: 14px; }
}

/* === Derek 20 Aug — hero eyebrow, two rounds =============================
   14:23 PC: "can we make this 'IT'S TIME TO' slightly bigger font please"
   (0.84rem -> 1rem from 1025px up).
   15:45 PC, with a target instead of a nudge: "let's work on a font size that
   will result in the line finishing above the middle of the 'e' at the end of
   'escape' in the headline below". So this is measured, not guessed: at 1rem
   the eyebrow stopped short of the "c".

   Letter-spacing matters here: 0.32em is applied after the last letter too, so
   the element box runs wider than the visible text. The measurement targets
   the right edge of the "O" glyph in "TO", which is what Derek is reading.

   Sized off --h1-hero rather than a fixed rem on purpose. The headline is
   clamp(2.9rem, 6.6vw, 5.4rem), so it grows with the viewport up to 1309px and
   is flat above it. A fixed eyebrow size would only hit Derek's mark at one
   window width and drift at every other. The ratio below lands the last glyph
   on the centre of the final "e" at 1280, 1440 and 1920 alike.

   14:23 mobile: "narrow the gap a bit ... by about 25%" — the measured box gap
   is 14px column gap + the h1's own 6px top margin = 20px; -5px netted 15px.
   15:51: "narrow the gap by another 25%" from that 15px, so 11.25px, which is
   -8.75px against the same 20px base. Still nothing else in the column moves. */
@media (min-width: 1025px) {
  .hero-content .hero-eyebrow { font-size: calc(var(--h1-hero) * 0.23); }
}
@media (max-width: 1024px) {
  .hero-content .hero-eyebrow { margin-bottom: -8.75px; }
}

/* === Derek 20 Aug 15:46 — magnifying glass on mobile ======================
   "went from too small to now a little bit too big - can we try shrinking it
   by 25%". 34px -> 25.5px, exactly a quarter off. The 14:25 fixes that got it
   here stay: .header-btn keeps its padding reset and the svg keeps
   flex: 0 0 auto, so this is the drawn size changing and nothing else.
   Desktop is untouched — he only ever called out mobile. */
@media (max-width: 1024px) {
  .search-toggle svg { width: 25.5px; height: 25.5px; }
}

/* === Derek 20 Aug 14:58 + 15:01 — full-resolution heroes on desktop =======
   "let's try the images all uncompressed ... on the PC version", after two
   screengrabs of the same photo rendering softer on the new site than the old.

   It was resolution, not compression: the widest derivative is 1280w, so a
   full-bleed hero on a 1920px monitor was upscaled 1.5x, and 3x on a retina
   panel. The originals are 1920w+ and already deployed, so above 1100px the
   hero paints from the original file instead.

   `--hero-lg` is only ever written together with .has-hero-full (see
   generate.mjs heroFullClass/heroFullVar and rewrite-derived-refs.mjs
   addFullResHeroes), so the var always resolves where this rule applies.
   !important is needed because the 1280w fallback is an inline style, and that
   inline declaration is deliberately kept: if this stylesheet ever fails to
   load, every hero still paints. */
@media (min-width: 1100px) {
  .has-hero-full { background-image: var(--hero-lg) !important; }
}



/* === Derek 25 Aug 13:59 — the dark filter, on Bushscapes this time =======
   "Just want to check whether this has been activated across both sites,
   Barefoot and Bushscapes? ... I went back (on a different PC to avoid
   potential caching issues) to look at the image number 6/10 for Karongwe
   River Lodge ... and this image is still definitely darker on the new
   website than it appears on the current."

   He is right, and he ruled out caching himself before asking. The reduction
   shipped to Barefoot only; this stylesheet never got it, so every Bushscapes
   lodge hero was still carrying the full 0.44 veil.

   Same treatment as Barefoot, in this site's ink (45, 51, 43): peak darkening
   drops from 0.44 to 0.17, and on desktop it goes to a 0.1 wash at the very
   bottom edge only. The veil cannot go entirely, because on a phone the lodge
   name, location and From price sit ON the photo. That contrast moves onto the
   glyphs instead, so the picture underneath comes back up.

   Scoped to match .lodge-hero[data-lodge-hero-slider].lodge-hero--strip
   .lodge-hero-veil, which is the rule that actually paints these heroes. A
   bare .lodge-hero-veil loses to it and changes nothing on screen.

   Appended after the round8 END marker on purpose: build-round8-assets.cjs
   only replaces content between its two markers, so this survives a re-fold. */
.lodge-hero[data-lodge-hero-slider] .lodge-hero-veil,
.lodge-hero[data-lodge-hero-slider]:not(.destination-gallery-hero) .lodge-hero-veil,
.lodge-hero[data-lodge-hero-slider].lodge-hero--strip .lodge-hero-veil {
  background:
    linear-gradient(180deg, rgba(45, 51, 43, 0.05) 0%, rgba(45, 51, 43, 0) 40%, rgba(45, 51, 43, 0.17) 100%),
    linear-gradient(90deg, rgba(45, 51, 43, 0.07) 0%, rgba(45, 51, 43, 0) 52%);
}

@media (min-width: 1025px) {
  .lodge-hero[data-lodge-hero-slider] .lodge-hero-veil,
  .lodge-hero[data-lodge-hero-slider]:not(.destination-gallery-hero) .lodge-hero-veil,
  .lodge-hero[data-lodge-hero-slider].lodge-hero--strip .lodge-hero-veil {
    background:
      linear-gradient(180deg, rgba(45, 51, 43, 0) 0%, rgba(45, 51, 43, 0) 62%, rgba(45, 51, 43, 0.1) 100%);
  }
}

.lodge-hero-id-name,
.lodge-hero-id-loc,
.lodge-hero-id-from {
  text-shadow: 0 1px 3px rgba(45, 51, 43, 0.72), 0 2px 12px rgba(45, 51, 43, 0.55);
}

/* >>> round8-partials (generated by scripts/build-round8-assets.cjs) */

/* --- css/_r8-about.css --- */
/* === Derek round-8 — About Us page =======================================
   Page-level spacing only. The stat split itself is styled in
   css/_r8-components.css and must not be re-specified here.

   The old intro card (.about-intro) slid up over the hero on a -94px margin,
   which is why .about-hero carried 142px of bottom padding and .about-story
   carried padding-top: 0. Round 8 replaces that card with the shared
   .r8-stat-split sitting in normal flow, so the hero no longer needs the
   room underneath it and the new band needs its own.
   ========================================================================= */

/* Hero now stands alone. The header is transparent and overlays the hero
   (body.header-fade), so let it fill the viewport rather than stopping a
   header's height short of the fold. */
.about-hero {
  min-height: 100svh;
  padding-bottom: clamp(64px, 8vh, 104px);
}

/* Copy + counting stat blocks, directly below the hero. */
.about-stats {
  padding-top: clamp(64px, 7vw, 104px);
  padding-bottom: clamp(64px, 7vw, 104px);
}

/* "We Know Because We Go" leads with three paragraphs above the picture
   blocks, so the centred head needs more room than the 680px default. */
.about-values-head {
  max-width: 880px;
}

.about-values-head p {
  margin: 18px 0 0;
  color: var(--ink-2);
  font-size: 1.02rem;
  line-height: 1.75;
}

@media (max-width: 700px) {
  .about-values-head p {
    font-size: 0.98rem;
    line-height: 1.7;
  }
}

/* === Derek round 10 (2026-08-06) ========================================= */

/* 15:49 — "the headline reads poorly. So I would suggest breaking it up into
   2 parts: the first sentence appears in slightly smaller font and there is
   also a small gap to the second line, which then appears in a bigger font".
   Sizes are in em so both legs still track the h1's clamp. The small
   "Bushscapes" eyebrow above it was deleted in the same message. */
.about-hero-title {
  display: flex;
  flex-direction: column;
}

/* Round 11 (A3): the h1 dropped 108.8px -> 86.4px, so the ratio has to go up
   to hold the lead at the 65px Derek asked to keep: 65 / 86.4 = 0.752.
   Still em, so both legs keep tracking the h1's clamp together.
   NO letter-spacing here on purpose — the -0.012em on the h1 is inherited as
   a resolved px value, and re-declaring it would recompute against 65px and
   diverge from the rest of the headline. */
.about-hero-lead {
  font-size: 0.752em;
  line-height: 1.15;
  margin-bottom: 0.34em;
}

/* 15:55 — "to balance things visually I would move the 4 boxes on the right
   down - I would suggest that we align the top line of the boxes with the top
   of the lower case letters of the heading alongside".

   The boxes start level with the eyebrow, so they have to clear the eyebrow
   (line-box + its 18px margin) plus the heading's own top-of-box to
   top-of-lower-case drop. That total turns out to be near-flat across the
   range — ~51px at 1100 and ~53px at 1440 — because the heading's clamp caps
   out at 3.7rem above ~1287px while the eyebrow block never scales. Measured
   against a canvas x-height for the actual rendered font, this lands within
   ~1px at 1100 and 1440 and within ~3px in between.
   Only above 900px, where the split is actually two columns. */
@media (min-width: 900px) {
  .about-stats .r8-stat-grid {
    margin-top: clamp(50px, 3.7vw, 54px);
  }
}


/* --- css/_r8-alllodges.css --- */
/* === Derek round-8 — All Lodges A-Z index (2026-08-01) ====================
   Derek, 31 Jul: the 135-card listing "takes up a massive amount of space and
   people will have to scroll forever". This replaces it with a plain A-Z name
   index — a sticky letter rail, then one group per letter with the names in
   columns. No pictures, no prices, no ratings.
   Concatenated into css/styles.css at build time.
   ========================================================================= */

.r8-az {
  padding-top: 72px;
  padding-bottom: 110px;
}

/* The count chip sits to the right of the reused .toolbar-search. */
.r8-az .toolbar {
  margin-bottom: 26px;
}

/* -- Sticky letter rail ---------------------------------------------------
   Sticks under the fixed 76px header. It spans the section's content box,
   which is exactly the width the name columns occupy, so the list scrolls
   cleanly underneath it. */
.r8-az-jump {
  position: sticky;
  top: var(--header-h);
  z-index: 20;
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 2px;
  padding: 10px 0;
  border-top: 1px solid var(--line);
  border-bottom: 1px solid var(--line);
  background: var(--cream);
}

.r8-az-jump-link {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-width: 32px;
  height: 32px;
  padding: 0 7px;
  border-radius: 999px;
  font-family: var(--font-body);
  font-size: 0.8rem;
  font-weight: 600;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  text-decoration: none;
  color: var(--ink);
  white-space: nowrap;
  transition: background-color 0.25s var(--ease-soft), color 0.25s var(--ease-soft);
}

a.r8-az-jump-link:hover,
a.r8-az-jump-link:focus-visible {
  background: rgba(140, 149, 0, 0.14);
  color: var(--teal-deep);
}

a.r8-az-jump-link.is-current {
  background: var(--teal);
  color: #fff;
}

/* Letters with no lodges — rendered so the alphabet stays intact, but muted
   and inert. Same treatment for letters a live search has emptied out. The
   `a` on the last two selectors matches the specificity of .is-current above,
   so a muted letter never keeps the highlighted pill. */
.r8-az-jump-link.is-empty,
a.r8-az-jump-link.is-empty,
a.r8-az-jump-link.is-filtered-out {
  color: var(--ink-3);
  opacity: 0.42;
  background: transparent;
  pointer-events: none;
}

/* -- Letter groups -------------------------------------------------------- */
.r8-az-groups {
  margin-top: 4px;
}

.r8-az-group {
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  gap: 12px;
  padding: 30px 0;
  border-bottom: 1px solid var(--line);
  /* --r8-az-rail-h is measured and published by js/_r8-alllodges.js, because
     the rail wraps to two or three rows on narrow screens; 72px is only the
     single-row desktop case and left the heading behind the rail on mobile. */
  scroll-margin-top: calc(var(--header-h) + var(--r8-az-rail-h, 72px) + 16px);
}

.r8-az-group:last-child {
  border-bottom: 0;
}

@media (min-width: 820px) {
  .r8-az-group {
    grid-template-columns: 116px minmax(0, 1fr);
    gap: 0 44px;
    padding: 36px 0;
  }
}

.r8-az-letter {
  margin: 0;
  font-family: var(--font-display);
  font-weight: 400;
  font-size: clamp(1.9rem, 4vw, 2.9rem);
  line-height: 1;
  color: var(--green-accent);
}

.r8-az-list {
  margin: 0;
  padding: 0;
  list-style: none;
  columns: 3;
  column-gap: 44px;
}

@media (max-width: 1080px) {
  .r8-az-list {
    columns: 2;
    column-gap: 32px;
  }
}

@media (max-width: 620px) {
  .r8-az-list {
    columns: 1;
  }
}

.r8-az-item {
  break-inside: avoid;
  -webkit-column-break-inside: avoid;
  page-break-inside: avoid;
}

.r8-az-item a {
  position: relative;
  display: inline-block;
  padding: 6px 0;
  color: var(--ink);
  font-size: 1.01rem;
  line-height: 1.45;
  text-decoration: none;
  transition: color 0.2s var(--ease-soft);
}

.r8-az-item a::after {
  content: "";
  position: absolute;
  left: 0;
  right: 0;
  bottom: 4px;
  height: 1px;
  background: currentColor;
  transform: scaleX(0);
  transform-origin: left center;
  transition: transform 0.32s var(--ease-out);
}

.r8-az-item a:hover,
.r8-az-item a:focus-visible {
  color: var(--teal-deep);
}

.r8-az-item a:hover::after,
.r8-az-item a:focus-visible::after {
  transform: scaleX(1);
}

/* Hidden by the live search. .r8-az-group carries display:grid, so it needs an
   explicit rule to honour the hidden attribute. */
.r8-az-item[hidden],
.r8-az-group[hidden] {
  display: none;
}

.r8-az-empty {
  margin: 44px 0 0;
  color: var(--ink-2);
  font-size: 1.02rem;
}

.r8-az-empty[hidden] {
  display: none;
}

@media (prefers-reduced-motion: reduce) {
  .r8-az-item a::after {
    transition: none;
  }
}


/* --- css/_r8-components.css --- */
/* === Derek round-8 shared components (2026-08-01) =========================
   Two blocks recur across the home page, Client Feedback, About Us and the new
   What Makes Bushscapes Different page, so they live here once and get
   concatenated into styles.css at build time.

   A. .r8-stat-split  — copy on the left, a grid of counting number blocks on
      the right. This is the "About Us" design Derek pointed at, generalised so
      it takes 3, 4 or 6 blocks.
   B. .r8-reviews     — full-bleed review strip that alternates image-left /
      image-right as it rotates, on a 12s timer with manual arrows.
   ========================================================================= */

/* -- A. Copy + counting stat blocks --------------------------------------- */
.r8-stat-split {
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  gap: 40px;
  align-items: start;
}

@media (min-width: 900px) {
  .r8-stat-split {
    grid-template-columns: minmax(0, 1.05fr) minmax(0, 1fr);
    gap: clamp(48px, 6vw, 96px);
  }
}

.r8-stat-copy .eyebrow {
  display: block;
  margin-bottom: 18px;
}

.r8-stat-copy h2 {
  margin: 0 0 22px;
}

.r8-stat-copy p {
  margin: 0 0 18px;
  color: var(--ink-2);
  font-size: 1.02rem;
  line-height: 1.75;
}

.r8-stat-copy p:last-child {
  margin-bottom: 0;
}

.r8-stat-grid {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: 1px;
  background: var(--line);
  border: 1px solid var(--line);
}

/* Three blocks read better in a single row than as 2 + 1 orphan. */
.r8-stat-grid[data-r8-stats="3"] {
  grid-template-columns: repeat(3, minmax(0, 1fr));
}

@media (max-width: 640px) {
  .r8-stat-grid,
  .r8-stat-grid[data-r8-stats="3"] {
    grid-template-columns: repeat(2, minmax(0, 1fr));
  }
}

.r8-stat {
  display: flex;
  flex-direction: column;
  gap: 10px;
  padding: clamp(20px, 2.4vw, 30px);
  background: var(--cream);
}

.r8-stat strong {
  font-family: var(--font-display, "Cormorant Garamond", serif);
  font-size: clamp(2.1rem, 3.4vw, 3rem);
  font-weight: 400;
  line-height: 1;
  color: var(--green-accent, #8c9500);
  font-variant-numeric: tabular-nums;
}

.r8-stat span {
  font-size: 0.82rem;
  line-height: 1.55;
  color: var(--ink-2);
}

/* -- B. Alternating review strip ------------------------------------------ */
.r8-reviews {
  position: relative;
  padding: 0;
}

.r8-reviews-viewport {
  position: relative;
  overflow: hidden;
}

.r8-review {
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  min-height: 420px;
}

@media (min-width: 900px) {
  .r8-review {
    grid-template-columns: minmax(0, 1.15fr) minmax(0, 1fr);
    min-height: 520px;
  }
  /* Mirror every second review so the strip flips image-left / image-right. */
  .r8-review:nth-child(even) .r8-review-media {
    order: 2;
  }
  .r8-review:nth-child(even) .r8-review-copy {
    order: 1;
  }
  /* Derek round 10 (2026-08-06 14:35): the track widths used to stay put while
     only the ORDER flipped, so the media sat in the 1.15fr track when it was on
     the left and the 1fr track when it was on the right — same height, less
     width, hence "obviously squatter". He picked the left-hand proportion to
     keep, so mirror the tracks along with the order: the media is always the
     1.15fr column and the copy always the 1fr one. This is also what stops the
     quote "becoming too stretched out across the screen" on the flipped rows,
     since the copy no longer inherits the wider track. */
  .r8-review:nth-child(even) {
    grid-template-columns: minmax(0, 1fr) minmax(0, 1.15fr);
  }
}

/* Round 8 laid out only the active slide and took the rest out of flow, so the
   viewport tracked the active slide's height. Derek round 10 (2026-08-06
   16:39) asks for the pictures to be a consistent shape across the strip, and
   that height-per-slide behaviour is what stops them being: a short quote gave
   a 416px row and a long one 552px, so the same-width image came out a
   different shape on every rotation.

   Stacking every slide in one grid cell instead means the viewport takes the
   tallest slide once and holds it, so all ten images render at identical
   dimensions. Height is uniform rather than 16:9 exactly — 7 of the 10 review
   quotes are too long to fit a 16:9 row, so a true 16:9 would need the review
   copy clamped. */
.r8-reviews-viewport {
  display: grid;
}

.r8-review {
  grid-area: 1 / 1;
  opacity: 0;
  visibility: hidden;
  transition: opacity 0.7s var(--ease-soft, ease);
}

.r8-review.is-active {
  opacity: 1;
  visibility: visible;
}

.r8-review-media {
  background-size: cover;
  background-position: center;
  min-height: 260px;
}

/* Vertical padding is tighter than horizontal (round 10). With every slide now
   sharing the tallest one's height, the longest quote sets the picture shape
   for the whole strip — trimming the top/bottom padding pulls that back to
   roughly the 3:2 the left-hand image had before, which is the proportion
   Derek said he wanted kept. */
.r8-review-copy {
  display: flex;
  flex-direction: column;
  justify-content: center;
  gap: 14px;
  padding: clamp(26px, 3.4vw, 50px) clamp(30px, 4.5vw, 68px);
  background: var(--ink, #2d332b);
  color: var(--cream, #f6f4ee);
}

/* Derek round 10 (2026-08-06 16:39): "I would increase the font size in which
   the client name appears to make it more prominent." */
.r8-review-name {
  font-family: var(--font-display, "Cormorant Garamond", serif);
  font-size: clamp(1.6rem, 2vw, 2rem);
  line-height: 1.15;
  color: var(--gold-light, #cbd7a4);
}

.r8-review-source {
  font-size: 0.62rem;
  font-weight: 700;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  opacity: 0.6;
}

.r8-review-lead {
  margin: 6px 0 0;
  font-family: var(--font-display, "Cormorant Garamond", serif);
  font-size: clamp(1.5rem, 2.4vw, 2.1rem);
  font-style: italic;
  line-height: 1.35;
}

.r8-review-body {
  margin: 0;
  font-size: 0.95rem;
  line-height: 1.75;
  opacity: 0.86;
}

.r8-reviews-arrow {
  position: absolute;
  top: 50%;
  z-index: 3;
  display: grid;
  place-items: center;
  width: 46px;
  height: 46px;
  padding: 0;
  transform: translateY(-50%);
  border: 0;
  border-radius: 999px;
  background: rgba(255, 255, 255, 0.9);
  color: var(--ink, #2d332b);
  cursor: pointer;
  transition: background-color 0.24s var(--ease-out, ease);
}

.r8-reviews-arrow:hover {
  background: #fff;
}

.r8-reviews-arrow[data-r8-reviews-prev] {
  left: 18px;
}

.r8-reviews-arrow[data-r8-reviews-next] {
  right: 18px;
}

/* Derek round 10 (2026-08-06 14:44), from his iPad screenshot: "the left arrow
   appears over the text of the quote obscuring it, rather than next to it".

   Below 900px the strip collapses to one column, so the copy panel spans the
   full width — and the arrows, pinned to the section's vertical centre, land
   on top of the quote. (Above 900px they sit in the copy panel's generous side
   padding, clear of the text.) Drop them to a control row along the bottom of
   the panel instead, and reserve the height so nothing can run under them. */
@media (max-width: 899px) {
  .r8-reviews-arrow {
    top: auto;
    bottom: 22px;
    transform: none;
  }
  .r8-reviews-arrow[data-r8-reviews-prev] {
    right: 76px;
    left: auto;
  }
  .r8-reviews-arrow[data-r8-reviews-next] {
    right: 18px;
  }
  .r8-review-copy {
    padding-bottom: 92px;
  }
}

@media (prefers-reduced-motion: reduce) {
  .r8-review {
    transition: none;
  }
}

/* Derek, 18 Aug: in the sixth block the Cormorant "1" reads as a capital I.
   He did not want the heading font changed anywhere else, so only that numeral
   swaps to the body sans, where a one is unmistakable. Keyed off the count
   value the markup already carries, so it applies wherever the number is 1 and
   nowhere else. Sized down a touch because the sans sets optically larger than
   the serif at the same value.

   Lives in this partial, not in css/styles.css: the built file is regenerated
   from these partials between the round8-partials markers, so a rule written
   straight into it survives until the next fold and then vanishes. That is what
   happened to this one — it was in the built file only, so re-running the
   asset build silently reverted Derek's fix. */
.r8-stat strong[data-r8-count="1"] {
  font-family: var(--font-body, "Manrope", sans-serif);
  font-size: clamp(1.85rem, 3vw, 2.6rem);
  font-weight: 300;
  letter-spacing: -0.01em;
  /* Derek, 19 Aug: "it needs to be aligned with the text in the block to the
     left (both the number 1, as well as the 3 lines of text alongside, lie
     slightly above the corresponding text in the block to the left)".
     .r8-stat strong sets line-height: 1, so shrinking the font-size above also
     shrank the line box, 41.6px against the serif's 48px, and everything under
     it rode up ~7px. Repeating the SIBLING clamp as an explicit line-height
     restores an identical box at every width while the glyph stays smaller. */
  line-height: clamp(2.1rem, 3.4vw, 3rem);
}


/* --- css/_r8-destinations.css --- */
/* === Derek round-8 — destination / reserve heroes (2026-08-01) ============
   "Rather than having a big white block covering the pic at the top, I would
   instead have the headline and copy appearing over the image as we have done
   elsewhere." — Derek, 31 Jul, against a screenshot of the Klaserie hero.

   Deleting the .destination-intro band below the hero (done in the HTML) was
   only half of it: the hero's own copy still sat in an opaque white card that
   covered the bottom ~39% of the photo. That card IS the white block he
   circled. This unwraps it into white text straight on the image, matching the
   .page-hero + .page-hero-veil treatment used on the getaway-idea pages he
   pointed at as the example to copy.
   ========================================================================= */

/* The copy used to be a card that deliberately overhung the bottom of the photo,
   so the hero was photo height PLUS the card's overhang. Now the copy sits over
   the image, so it has to start far enough up to finish inside it — and the hero
   is capped to the photo so it never runs past the fold. */
.destination-gallery-hero {
  --destination-card-overlap: clamp(260px, 38svh, 400px);
  max-height: var(--lodge-photo-h);
  overflow: hidden;
}

.destination-gallery-hero .lodge-hero-inner {
  padding-bottom: clamp(36px, 6svh, 64px);
}

.destination-gallery-hero .lodge-hero-copy {
  width: min(860px, calc(100vw - 48px));
  max-width: 860px;
  gap: 16px;
  padding: 0;
  border: 0;
  border-radius: 0;
  background: transparent;
  color: var(--cream);
  box-shadow: none;
  -webkit-backdrop-filter: none;
  backdrop-filter: none;
}

/* Readability now comes from the veil rather than a panel, so it has to carry
   more weight at the bottom where the copy sits. */
.destination-gallery-hero .lodge-hero-veil {
  background:
    linear-gradient(180deg, rgba(28, 32, 30, 0.46) 0%, rgba(28, 32, 30, 0.12) 34%, rgba(28, 32, 30, 0.78) 100%),
    linear-gradient(90deg, rgba(28, 32, 30, 0.5) 0%, rgba(28, 32, 30, 0.08) 62%);
}

.destination-gallery-hero .lodge-hero-copy .lodge-hero-kicker {
  color: var(--gold-light);
}

.destination-gallery-hero .lodge-hero-copy h1,
.destination-gallery-hero .lodge-hero-copy p {
  color: var(--cream);
}

.destination-gallery-hero .lodge-hero-copy p {
  max-width: 62ch;
  text-shadow: 0 1px 24px rgba(20, 24, 22, 0.45);
}

/* The meta chips were restyled light-on-white for the card (styles.css:997 and
   the <=720px block at :4052). Over the photo that reads as leftover buttons —
   put them back to the base dark-glass treatment the rest of the site uses for
   chips on imagery, at both breakpoints. */
.destination-gallery-hero .destination-hero-meta {
  border-top: 1px solid rgba(255, 255, 255, 0.22);
  margin-top: 18px;
  padding-top: 18px;
}

.destination-gallery-hero .destination-hero-meta span {
  border-color: rgba(250, 246, 236, 0.24);
  background: rgba(28, 32, 30, 0.34);
  color: rgba(250, 246, 236, 0.92);
  -webkit-backdrop-filter: blur(10px);
  backdrop-filter: blur(10px);
}

/* The <=720px block at styles.css:4052 repeats the light treatment, so it has
   to be answered inside a media query of its own. */
@media (max-width: 720px) {
  .destination-gallery-hero .destination-hero-meta span {
    border-color: rgba(250, 246, 236, 0.24);
    background: rgba(28, 32, 30, 0.34);
    color: rgba(250, 246, 236, 0.92);
    -webkit-backdrop-filter: blur(10px);
    backdrop-filter: blur(10px);
  }
}

.destination-gallery-hero .destination-hero-meta strong {
  color: var(--gold-light);
}

/* The hero copy opts out of the scroll-reveal (it is above the fold), which the
   original card rule handled; keep that now the card is gone. */
.destination-gallery-hero .lodge-hero-copy.reveal {
  opacity: 1;
  transform: none;
}

/* "Where To Stay" was the only h2 between the h1 and the lodge card h3s. The
   band is gone, so the listing carries its own heading to keep the document
   outline intact — see the markup change in destinations/**\/index.html. */
.destination-listing .destination-listing-head {
  margin-bottom: 26px;
}

.destination-listing .destination-listing-head h2 {
  margin: 0;
}


/* --- css/_r8-feedback.css --- */
/* === Derek round-8 — Client Feedback ======================================
   /client-feedback/ — hero without the button pair, the copy + counting stats
   band (shared component A), the alternating review strip (shared component B)
   and a three-batch rotator for the short feedback snippets.

   The two shared components are styled in css/_r8-components.css and must not
   be re-specified here. Folded into css/styles.css by
   scripts/build-round8-assets.cjs.
   ========================================================================= */

/* -- Hero ------------------------------------------------------------------
   The two CTAs that used to sit under the hero copy are gone, so the block is
   shorter; give the hero a little more height so it still reads as a full
   picture rather than a band. The header is transparent and floats over it
   (body.header-fade), so the veil carries extra weight along the top edge to
   keep the white logo and icons legible. */
.feedback-hero {
  min-height: min(78svh, 760px);
  padding-bottom: clamp(56px, 7vw, 92px);
}

.feedback-hero .page-hero-veil {
  background:
    linear-gradient(90deg, rgba(45, 51, 43, 0.82) 0%, rgba(45, 51, 43, 0.46) 50%, rgba(45, 51, 43, 0.12) 100%),
    linear-gradient(180deg, rgba(45, 51, 43, 0.46) 0%, rgba(45, 51, 43, 0.04) 36%, rgba(45, 51, 43, 0.74) 100%);
}

/* This partial is concatenated onto the end of styles.css, so it lands after
   the 720px block that already sizes this hero for phones. Re-assert those
   values rather than letting the desktop rule above leak down. */
@media (max-width: 720px) {
  .feedback-hero {
    min-height: 64svh;
    padding-bottom: 36px;
    background-position: 42% center;
  }
}

/* -- Copy + counting stat blocks ------------------------------------------
   Sits directly below the hero, and the review strip below it runs full bleed
   with no padding of its own, so this band owns the gap on both sides. */
.feedback-stats {
  padding-top: clamp(64px, 7vw, 104px);
  padding-bottom: clamp(64px, 7vw, 104px);
}

/* The longest value here is "20 000 +", and three blocks share the right-hand
   column, so at the shared component's size the "+" drops onto a line of its
   own. Widen the stat column a little and hold each number on one line. */
@media (min-width: 900px) {
  .feedback-stats .r8-stat-split {
    grid-template-columns: minmax(0, 1fr) minmax(0, 1.08fr);
  }
}

.feedback-stats .r8-stat strong {
  font-size: clamp(1.9rem, 2.6vw, 2.4rem);
  white-space: nowrap;
}

/* "Click here" — the only link in the body copy, so it needs to read as one
   without shouting over the paragraph. */
.feedback-stats .r8-stat-copy a {
  color: var(--green-accent);
  text-decoration: underline;
  text-decoration-thickness: 1px;
  text-underline-offset: 3px;
  transition: color 0.24s var(--ease-out);
}

.feedback-stats .r8-stat-copy a:hover {
  color: var(--teal-deep);
}

/* -- Snippet rotator -------------------------------------------------------
   18 snippets shown six at a time in three batches. Each batch is an ordinary
   .feedback-review-grid; only the active one is in flow, so the viewport takes
   the height of what is on screen rather than the tallest batch. With no JS the
   markup already carries .is-active on the first batch, so batch one shows. */
.r8-snips {
  position: relative;
}

.r8-snips-viewport {
  position: relative;
}

.r8-snips-batch {
  position: absolute;
  inset: 0;
  opacity: 0;
  visibility: hidden;
  pointer-events: none;
  transition: opacity 0.6s var(--ease-soft);
}

.r8-snips-batch.is-active {
  position: relative;
  opacity: 1;
  visibility: visible;
  pointer-events: auto;
}

.r8-snips-controls {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 20px;
  margin-top: clamp(28px, 3.4vw, 42px);
}

.r8-snips-arrow {
  display: grid;
  place-items: center;
  width: 42px;
  height: 42px;
  padding: 0;
  border: 1px solid var(--line-strong);
  border-radius: 999px;
  background: var(--paper);
  color: var(--ink);
  cursor: pointer;
  transition:
    background-color 0.24s var(--ease-out),
    border-color 0.24s var(--ease-out),
    color 0.24s var(--ease-out);
}

.r8-snips-arrow:hover {
  border-color: var(--green-accent);
  background: var(--green-accent);
  color: var(--cream);
}

.r8-snips-dots {
  display: flex;
  align-items: center;
  gap: 9px;
}

.r8-snips-dot {
  width: 9px;
  height: 9px;
  padding: 0;
  border: 0;
  border-radius: 999px;
  background: var(--line-strong);
  cursor: pointer;
  transition:
    width 0.32s var(--ease-out),
    background-color 0.32s var(--ease-out);
}

.r8-snips-dot:hover {
  background: var(--ink-3);
}

.r8-snips-dot.is-active {
  width: 26px;
  background: var(--green-accent);
}

@media (max-width: 700px) {
  .r8-snips-controls {
    gap: 16px;
  }
}

@media (prefers-reduced-motion: reduce) {
  .r8-snips-batch,
  .r8-snips-dot {
    transition: none;
  }
}

/* -- Closing band ----------------------------------------------------------
   The page now ends on the snippet rotator followed by the tinted "More to
   explore" cards, so the background change carries the join and no extra rule
   is needed. Nothing to add here — left as a marker so the next round knows
   the omission is deliberate. */

/* Shared component A drops to two columns under 640px, which leaves the third
   stat alone in row 2 with a dead cell painting the grid's rule colour. The
   what-makes-bushscapes-different partial solves the identical 3-up case by
   letting the last block span the row; do the same here. */
@media (max-width: 640px) {
  .feedback-stats .r8-stat-grid[data-r8-stats="3"] .r8-stat:last-child {
    grid-column: 1 / -1;
  }
  /* nowrap is safe once the wide values are not sharing a half-width cell, but
     the two that still do need to be allowed to shrink rather than overflow. */
  .feedback-stats .r8-stat strong {
    font-size: clamp(1.5rem, 7vw, 1.9rem);
  }
}

/* Inactive batches are taken out of flow, so the container height snapped to
   the incoming batch while the outgoing one was still fading — moving the
   arrows, the dots and everything below on every advance. */
.r8-snips-viewport {
  min-height: 220px;
}

@media (min-width: 900px) {
  .r8-snips-viewport {
    min-height: 260px;
  }
}

/* === Derek round 10 (2026-08-06 16:31) ===================================
   "Again we need to lower the 3 boxes on the right to basically centre it
   vertically against the bulk of the text/headline to the left."

   Note this is deliberately NOT the same as About Us / What Makes Bushscapes
   Different, where he asked for the box top to line up with the heading.
   Here he asked for vertical centring, so the shared .r8-stat-split's
   align-items: start is overridden rather than a margin added. */
@media (min-width: 900px) {
  .feedback-stats .r8-stat-split {
    align-items: center;
  }
}


/* --- css/_r8-home.css --- */
/* === Derek round-8 — Home page ===========================================
   Page-level styling only. The two shared blocks used here (.r8-stat-split
   and .r8-reviews) are styled in css/_r8-components.css and must not be
   re-specified below.

   Covers:
     1. the rotating hero headline (two client phrasings, soft cross-fade)
     2. spacing for the stat band that replaced .escape-split
     3. picture blocks for the "5 Reasons" carousel slides
     4. the short heading that sits above the full-bleed review strip
   ========================================================================= */

/* -- 1. Rotating hero headline -------------------------------------------- */
/* Both lines ship in the HTML and are stacked in one grid cell, so the
   heading never renders empty and the hero does not jump height when the
   lines swap. Line 2 is the longer of the two, so it sets the box. */
body.is-home .hero-content {
  max-width: 820px;
}

.r8-hero-rotator {
  display: grid;
  /* Bottom-aligned so the taller line's spare height sits above the heading,
     over the video, instead of opening a gap above the sub-paragraph. */
  align-items: end;
  font-size: clamp(2.4rem, 6.2vw, 4.6rem);
}

.r8-hero-line {
  grid-area: 1 / 1;
  opacity: 0;
  /* visibility is deliberately NOT transitioned: it flips instantly so the
     outgoing line leaves the moment the class does, and only the incoming line
     animates. Transitioning both opacities cross-faded two different strings
     on top of each other for the whole 0.9s. */
  visibility: hidden;
  transition: opacity 0.9s var(--ease-soft);
}

.r8-hero-line.is-active {
  opacity: 1;
  visibility: visible;
}

@media (prefers-reduced-motion: reduce) {
  .r8-hero-line {
    transition: none;
  }
}

@media (max-width: 700px) {
  .r8-hero-rotator {
    font-size: clamp(2rem, 9vw, 2.9rem);
  }
}

@media (prefers-reduced-motion: reduce) {
  .r8-hero-line {
    transition: none;
  }
}

/* -- 2. Copy + counting stat blocks, directly below the hero -------------- */
.r8-home-stats {
  padding-top: clamp(64px, 7vw, 104px);
  padding-bottom: clamp(64px, 7vw, 104px);
}

/* -- 3. "5 Reasons" slides now carry a picture ---------------------------- */
/* The rail, arrows and dots keep the markup and JS hooks they already had —
   only the inside of each slide changes, so the 3-up / 2-up / 1-up paging in
   js/main.js still measures the same flex basis. */
.promise-slide {
  align-items: stretch;
  gap: 0;
  padding: 0;
  text-align: left;
}

.promise-media {
  position: relative;
  margin-bottom: 20px;
  aspect-ratio: 4 / 3;
  overflow: hidden;
  border-radius: var(--radius);
  background: rgba(45, 51, 43, 0.06);
}

.promise-media img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  transition: transform 0.9s var(--ease-out);
}

.promise-slide:hover .promise-media img {
  transform: scale(1.04);
}

/* The number badge moves onto the picture so the slide leads with the image. */
.promise-slide .promise-badge {
  position: absolute;
  left: 16px;
  bottom: 16px;
}

.promise-slide .promise-title {
  margin: 0 0 10px;
}

.promise-slide .promise-copy {
  max-width: none;
}

@media (max-width: 700px) {
  .promise-media {
    margin-bottom: 16px;
  }
}

@media (prefers-reduced-motion: reduce) {
  .promise-media img,
  .promise-slide:hover .promise-media img {
    transition: none;
    transform: none;
  }
}

/* -- 3b. Derek round 10 (2026-08-06 14:12) — "5 Reasons" typography -------
   "I would change the font in the various headlines to that used elsewhere for
   consistency. So the '5 Reasons to Book with Bushscapes' should appear in the
   usual Comorant Garamond font with '5 Reason' in green italic and the
   remainder in the standard font in dark grey. Then for the sub-headings:
   'It's cheaper'; 'It's easier and faster' etc etc: these can also be in
   Cormorant Garamond font, similar to what has been done in this section of
   the 'About Us' page" — i.e. .about-value h3, which is plain Cormorant at
   1.7rem (it just inherits the global h1–h6 font-family).

   Both of these had been explicitly opted OUT of the display face into the
   body face with uppercase + letterspacing, so the overrides have to be
   undone rather than merely added to. Capitalisation is left as authored. */
.promise-title-h {
  font-family: var(--font-display);
  font-weight: 400;
  font-size: clamp(2.1rem, 4.6vw, 3.7rem);
  letter-spacing: -0.012em;
  text-transform: none;
  line-height: 1.05;
}

.promise-slide .promise-title {
  font-family: var(--font-display);
  font-weight: 400;
  font-size: 1.7rem;
  letter-spacing: -0.012em;
  text-transform: none;
  line-height: 1.15;
}

@media (max-width: 700px) {
  .promise-slide .promise-title {
    font-size: 1.46rem;
  }
}

/* -- 4. Heading above the full-bleed review strip ------------------------- */
.r8-reviews-intro {
  padding-bottom: clamp(30px, 3.5vw, 46px);
}

.r8-reviews-intro .section-head {
  margin-bottom: 0;
}

/* .promise-slide's padding:0 above is unconditional, and because this partial
   is folded in after styles.css's media queries it silently cancelled the
   <=720px rule at styles.css:4163. Put that back. */
@media (max-width: 720px) {
  .promise-slide {
    padding: 14px 14px 18px;
  }
}


/* --- css/_r8-price.css --- */
/* === Derek round-8 — /price-range/ (2026-08-01) ===========================
   Derek, 31 Jul: "when we look by price band, no results are currently being
   shown ... it then sorts and displays them in price order (lowest to highest)
   ... the various price bands exist as a sort of sub-menu at the top of the
   displayed lodges so making it easy to go from one price band to another."

   The whole catalogue is baked into the page in ascending from-price order and
   js/_r8-price.js hides what falls outside ?lw=/?hi=. Everything here styles
   the band sub-menu; the cards themselves reuse the site's listing classes.
   ========================================================================= */

/* -- Band sub-menu --------------------------------------------------------
   Sticks under the fixed 76px header so a band is always one click away while
   scrolling 100+ cards. z-index stays under the header's 60. */
.r8-price-bands {
  position: sticky;
  top: var(--header-h);
  z-index: 40;
  background: var(--cream);
  border-bottom: 1px solid var(--line);
}

.r8-price-bands-inner {
  display: flex;
  align-items: center;
  gap: 8px;
  padding: 14px max(24px, calc((100vw - 1280px) / 2));
  overflow-x: auto;
  -webkit-overflow-scrolling: touch;
  scrollbar-width: none;
}

.r8-price-bands-inner::-webkit-scrollbar {
  display: none;
}

.r8-price-band {
  flex: 0 0 auto;
  padding: 9px 18px;
  border: 1px solid var(--line-strong);
  border-radius: 999px;
  background: transparent;
  color: var(--ink-2);
  font-family: var(--font-body);
  font-size: 0.8rem;
  font-weight: 700;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  text-decoration: none;
  white-space: nowrap;
  transition:
    background-color 0.28s var(--ease-out),
    border-color 0.28s var(--ease-out),
    color 0.28s var(--ease-out);
}

.r8-price-band:hover,
.r8-price-band:focus-visible {
  border-color: var(--ink);
  color: var(--ink);
}

.r8-price-band.is-active {
  border-color: var(--teal);
  background: var(--teal);
  color: var(--cream);
}

.r8-price-band.is-active:hover,
.r8-price-band.is-active:focus-visible {
  border-color: var(--teal-deep);
  background: var(--teal-deep);
  color: var(--cream);
}

@media (max-width: 640px) {
  .r8-price-bands-inner {
    padding-top: 11px;
    padding-bottom: 11px;
  }

  .r8-price-band {
    padding: 8px 15px;
    font-size: 0.74rem;
  }
}

/* -- Results section ------------------------------------------------------
   The band bar already separates the hero from the grid, so the standard
   110px .section top padding is more air than this page needs. */
.r8-price-results {
  padding-top: 60px;
}

/* Count reads "19 of 135 lodges" while a band or a search is narrowing the
   grid — the toolbar keeps the site-standard treatment otherwise. */
.r8-price-results .toolbar {
  margin-bottom: 30px;
}

.r8-price-empty {
  margin: 0 0 28px;
}

/* Filtering reuses the site's .card.is-hidden rule, so with no JS every card
   stays visible and the page still answers "cheapest first" — the cards are
   baked into the document in ascending from-price order. */


/* --- css/_r8-ratings.css --- */
/* === Derek round-8 — rating icons, per-label optimisation (2026-07-29) ====
   "The ratings icons where the category is one word (ie Overall, Setting and
   Romance) the dividing line is actually positioned a little lower in the
   circle compared to the ratings which appear over 2 lines (ie Luxury & Style
   and Game Viewing) where the dividing line is positioned slightly up and more
   towards the centre of the circle. The important thing that this allows is
   the use of a bigger font size which makes the words easier to read whilst
   still retaining enough space so they don't get too close to the dotted
   circular boundary line. ... With the 2 line categories (and with Game
   Viewing in particular) these words can move slightly closer to the central
   dividing line as currently there is a distinct difference between the
   distance from the central line up to the number compared to downwards to the
   top of the letters." — Derek, 29 Jul

   Round 7 moved every circle together; this splits them. The shape class comes
   from bushscapes-gen/scripts/generate.mjs, which knows whether the label is
   one word or two.
   ========================================================================= */

/* -- One-word labels: divider drops below centre --------------------------
   The single line needs less room underneath, so the extra space goes to the
   number above — which is what lets both grow. */
.rating-circle.is-single::after {
  top: 55%;
}

.rating-circle.is-single strong {
  bottom: 45%;
  margin-bottom: 3px;
  font-size: 2.08rem;
}

.rating-circle.is-single span {
  top: 55%;
  margin-top: 6px;
  font-size: 0.86rem;
}

.rating-circle.is-overall.is-single strong {
  font-size: 2.28rem;
}

/* -- Two-line labels: divider stays at the centre -------------------------
   and the words come up to meet it. The old 7px top margin against the
   number's 2px bottom margin is the asymmetry Derek is describing. */
.rating-circle.is-wrap::after {
  top: 50%;
}

.rating-circle.is-wrap strong {
  bottom: 50%;
  margin-bottom: 3px;
  font-size: 1.98rem;
}

.rating-circle.is-wrap span {
  top: 50%;
  margin-top: 3px;
  max-width: 100px;
  font-size: 0.82rem;
  line-height: 1.18;
}

/* The stacked/mobile circle is 100px, so the same split applies at a smaller
   scale rather than inheriting the desktop sizes. */
@media (max-width: 1024px) {
  .rating-circle.is-single strong { font-size: 1.52rem; }
  .rating-circle.is-overall.is-single strong { font-size: 1.7rem; }
  .rating-circle.is-single span { font-size: 0.75rem; margin-top: 5px; }
  .rating-circle.is-wrap strong { font-size: 1.46rem; }
  .rating-circle.is-wrap span { font-size: 0.72rem; margin-top: 3px; max-width: 88px; }
}

/* The frozen Verdict column packs the circles tighter, so hold them clear of
   the dotted ring there too. */
.verdict-ratings-col .rating-circle.is-wrap span { max-width: 94px; }

/* === Derek round-11 item D — the no-rates state on lodge profile pages =====
   "Some lodges carry no rates at all... show 'Call Us for Rates' in the rail,
   vertically centred so the strip does not look empty." — Derek, 11 Aug,
   against Thakadu River Camp (123643.jpeg), modelled on the legacy WP site's
   "Call now for pricing" (123829.jpeg).

   WHY THIS LIVES IN A FILE CALLED "ratings": every other rail rule is
   hand-authored in css/styles.css above the round-8 fold marker, which would be
   the cohesive home — but other agents are editing that same region of that same
   file for items A-C in this checkout right now, and this partial is exclusively
   mine. It also settles the source-order hazard structurally: the folded block
   lands at the END of styles.css, so these rules are unambiguously AFTER both of
   the equal-specificity rules that set `top` on .pricing-rail-inner
   (styles.css:4465 and :5124) rather than inserted between them. Nothing here
   sets `top`, `position` or `min-height`, so sticky behaviour on all 135 lodge
   pages is untouched.

   The centring deliberately does NOT go on .pricing-rail-inner: that is the flex
   parent of .pricing-rail-head, so centring it would push the rating badge and
   the lodge H1 down the strip on these 5 lodges only, breaking their alignment
   against the hero and against the other 130. It goes on this new flex child,
   which sits AFTER the head and absorbs the leftover height.
   ========================================================================= */

.pricing-rail-callout {
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: 14px;
  padding: 20px 0 4px;
  text-align: center;
}

.pricing-rail-callout-msg {
  margin: 0;
  font-family: var(--font-display);
  font-size: 1.5rem;
  font-weight: 400;
  line-height: 1.22;
  color: #fff;
}

/* Tappable on mobile — the number is the site's own, the one every page already
   hardcodes in the slide-out menu contact block. */
.pricing-rail-callout-tel {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  padding: 9px 17px;
  border: 1px solid rgba(255, 255, 255, 0.24);
  border-radius: 999px;
  font-family: var(--font-body);
  font-size: 1rem;
  font-weight: 600;
  letter-spacing: 0.01em;
  color: var(--gold-light, #d7dc62);
  text-decoration: none;
  transition: background-color 0.2s ease, border-color 0.2s ease, color 0.2s ease;
}

.pricing-rail-callout-tel:hover,
.pricing-rail-callout-tel:focus-visible {
  background: var(--gold, #a5ad00);
  border-color: transparent;
  color: #fff;
}

.pricing-rail-callout-icon { flex: 0 0 auto; }

/* King's Camp's "2 Night minimum stay." — full white like every other bit of
   category context on the strip (Derek round-6); the size gap carries the
   hierarchy. */
.pricing-rail-callout-note {
  margin: 0;
  font-size: 0.72rem;
  line-height: 1.5;
  color: #fff;
}

/* The strip only HAS spare height to centre in at >= 1025px — that is where
   .lodge-page .pricing-rail-inner gets its
   min-height: calc(clamp(540px, 100svh, 840px) + tabs) (styles.css:5130).
   Below that breakpoint the inner is position:static with no min-height, so
   flex: 1 would have nothing to distribute; the block just sits under the head
   at its content height, which is the right answer there. Same breakpoint,
   deliberately. */
@media (min-width: 1025px) {
  .lodge-page .pricing-rail-callout {
    flex: 1 1 auto;
    padding: 8px 0 26px;
  }
}


/* --- css/_r8-wmbd.css --- */
/* === Derek round-8: What Makes Bushscapes Different =======================
   /what-makes-bushscapes-different/ — hero, the copy + counting stats section
   (shared component A, styled in _r8-components.css) and a copy-left /
   image-right closing section.
   Folded into css/styles.css by scripts/build-round8-assets.cjs.
   ========================================================================= */

/* -- Hero ------------------------------------------------------------------
   Header is transparent and floats over this, so the veil carries a little
   extra weight along the top edge to keep the white logo and icons legible
   against the sunset sky. */
.wmbd-hero {
  min-height: min(86svh, 800px);
  padding-bottom: clamp(64px, 8vw, 104px);
  background-position: center;
}

.wmbd-hero .page-hero-veil {
  background:
    linear-gradient(90deg, rgba(45, 51, 43, 0.84) 0%, rgba(45, 51, 43, 0.44) 50%, rgba(45, 51, 43, 0.1) 100%),
    linear-gradient(180deg, rgba(45, 51, 43, 0.46) 0%, rgba(45, 51, 43, 0.06) 38%, rgba(45, 51, 43, 0.76) 100%);
}

.wmbd-hero-content {
  max-width: 880px;
}

/* Round 11 (A2): this page's size IS the new site-wide standard — Derek
   picked it. Same numbers, now read from --h1-hero at :root so the other six
   h1 rules cannot drift away from it again. */
.wmbd-hero-content h1 {
  max-width: 800px;
  font-size: var(--h1-hero);
  line-height: var(--h1-hero-lh);
}

.wmbd-hero-content p {
  max-width: 660px;
  font-size: clamp(1.02rem, 1.5vw, 1.18rem);
  line-height: 1.72;
}

/* -- Stats section ---------------------------------------------------------
   The closing section supplies its own top padding, so drop this one's
   bottom padding rather than stacking two full .section gaps. */
.wmbd-stats {
  padding-bottom: 0;
}

/* Shared component A falls back to two columns under 640px. With three blocks
   that leaves a dead fourth cell showing the grid's rule colour, so let the
   last block span the row instead. Page-scoped: the shared rule is untouched. */
@media (max-width: 640px) {
  .wmbd-stats .r8-stat-grid[data-r8-stats="3"] .r8-stat:last-child {
    grid-column: 1 / -1;
  }
}

/* -- Real People, Real Advice: copy left, image right ---------------------- */
.wmbd-advice {
  display: grid;
  grid-template-columns: minmax(0, 0.95fr) minmax(0, 1.05fr);
  gap: clamp(40px, 5vw, 64px);
  align-items: center;
  padding-top: clamp(72px, 8vw, 110px);
}

.wmbd-advice-copy {
  max-width: 620px;
}

.wmbd-advice-copy .eyebrow {
  display: block;
}

.wmbd-advice-copy h2 {
  margin-bottom: 22px;
  font-size: clamp(2.4rem, 4.6vw, 4.2rem);
}

.wmbd-advice-copy p {
  margin: 0 0 18px;
  color: var(--ink-2);
  font-size: 1.04rem;
  line-height: 1.78;
}

.wmbd-advice-copy p:last-child {
  margin-bottom: 0;
}

.wmbd-advice-media {
  height: clamp(420px, 46vw, 580px);
  border-radius: var(--radius);
  overflow: hidden;
  box-shadow: var(--shadow-soft);
}

.wmbd-advice-media img {
  width: 100%;
  height: 100%;
  object-fit: cover;
}

@media (max-width: 900px) {
  .wmbd-advice {
    grid-template-columns: minmax(0, 1fr);
    gap: 34px;
  }
  .wmbd-advice-media {
    height: clamp(300px, 62vw, 440px);
  }
}

/* === Derek round 10 (2026-08-06 16:19) ===================================
   "the 3 boxes on the right look too high relative to the text on the left
   making it look unbalanced. I would bring the 3 boxes down align the top
   line of the box with the top of the text as indicated in the attached."

   Same treatment as .about-stats — see the note in css/_r8-about.css for how
   the offset is derived. Kept in step with that page deliberately: Derek
   asked for the two in near-identical words on the same afternoon. */
@media (min-width: 900px) {
  .wmbd-stats .r8-stat-grid {
    margin-top: clamp(50px, 3.7vw, 54px);
  }
}


/* --- css/_r8-zz-pwa.css --- */
/* === "Add to home screen" install card (Jarryd, 2026-08-31) ================
   Injected by js/_r8-zz-pwa.js. Pinned to the bottom of the screen, above the
   safe-area inset so it clears the iPhone home indicator; a small corner card
   on desktop rather than a full-width band.
   ========================================================================= */
.pwa-install {
  position: fixed;
  right: 12px;
  bottom: calc(14px + env(safe-area-inset-bottom));
  left: 12px;
  z-index: 45;
  margin: 0 auto;
  max-width: 27rem;
  /* Positioning wrapper only — clicks pass through to the page around the card. */
  pointer-events: none;
}

/* On a phone the lodge menu rides the bottom of the screen (see the round-13
   block above), so the card has to sit above it. Once that menu re-docks under
   the header the bottom of the screen is free again. */
@media (max-width: 720px) {
  body.lodge-page .pwa-install {
    bottom: calc(80px + env(safe-area-inset-bottom));
  }
  body.lodge-page:has(.lodge-tabs.is-docked-top) .pwa-install {
    bottom: calc(14px + env(safe-area-inset-bottom));
  }
}

@media (min-width: 721px) {
  .pwa-install {
    right: auto;
    left: 20px;
    bottom: 20px;
    margin: 0;
  }
}

.pwa-install-card {
  overflow: hidden;
  border: 1px solid var(--line);
  border-radius: var(--radius-lg);
  background: var(--paper);
  box-shadow: var(--shadow-strong);
  font-family: var(--font-body);
  pointer-events: auto;
  animation: pwa-install-in 0.24s ease-out both;
}

@keyframes pwa-install-in {
  from { opacity: 0; transform: translateY(10px); }
  to { opacity: 1; transform: none; }
}

@media (prefers-reduced-motion: reduce) {
  .pwa-install-card { animation: none; }
}

.pwa-install-row {
  display: flex;
  gap: 12px;
  align-items: center;
  padding: 13px 14px;
}

.pwa-install-icon {
  flex: 0 0 44px;
  width: 44px;
  height: 44px;
  border: 1px solid var(--line);
  border-radius: 13px;
  object-fit: cover;
}

.pwa-install-copy {
  flex: 1 1 auto;
  min-width: 0;
}

.pwa-install-title {
  margin: 0;
  color: var(--ink);
  font-size: 0.9rem;
  font-weight: 700;
  letter-spacing: -0.01em;
}

.pwa-install-sub {
  margin: 2px 0 0;
  overflow: hidden;
  color: var(--ink-3);
  font-size: 0.78rem;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.pwa-install-cta {
  display: inline-flex;
  flex: 0 0 auto;
  gap: 6px;
  align-items: center;
  padding: 9px 15px;
  border: 0;
  border-radius: 999px;
  background: var(--gold);
  color: var(--ink);
  font-family: inherit;
  font-size: 0.83rem;
  font-weight: 700;
  cursor: pointer;
  transition: background-color 0.2s ease, transform 0.2s ease;
}

.pwa-install-cta:hover {
  background: var(--gold-light);
  transform: translateY(-1px);
}

.pwa-install-cta:focus-visible {
  outline: 2px solid var(--ink);
  outline-offset: 2px;
}

.pwa-install-close {
  display: inline-flex;
  flex: 0 0 auto;
  align-items: center;
  justify-content: center;
  width: 30px;
  height: 30px;
  padding: 0;
  border: 0;
  border-radius: 999px;
  background: transparent;
  color: var(--ink-3);
  cursor: pointer;
}

.pwa-install-close:hover {
  background: var(--cream);
  color: var(--ink);
}

.pwa-install-close:focus-visible {
  outline: 2px solid var(--ink);
  outline-offset: 2px;
}

.pwa-install-steps {
  padding: 12px 15px 14px;
  border-top: 1px solid var(--line);
  background: var(--cream);
  color: var(--ink);
  font-size: 0.78rem;
}

.pwa-install-steps-title {
  margin: 0 0 7px;
  font-weight: 700;
}

.pwa-install-steps ol {
  margin: 0;
  padding-left: 1.1rem;
}

.pwa-install-steps li {
  margin: 0 0 4px;
  line-height: 1.45;
}

.pwa-install-steps li:last-child {
  margin-bottom: 0;
}

.pwa-install-steps svg {
  display: inline-block;
  margin: 0 1px;
  color: var(--teal);
  vertical-align: -2px;
}

/* Phone sizing. On a 375px screen the icon, the copy, the pill and the dismiss
   button are competing for one row, and "Get the Bushscapes app" only fits on a
   single line once everything else is tightened — measured, not guessed. A
   longer brand name wraps to a second line rather than being truncated: a
   clipped brand reads as a bug, a wrapped one does not. */
@media (max-width: 430px) {
  .pwa-install {
    right: 8px;
    left: 8px;
  }
  .pwa-install-row {
    gap: 10px;
    padding: 11px;
  }
  .pwa-install-icon {
    flex-basis: 38px;
    width: 38px;
    height: 38px;
    border-radius: 11px;
  }
  .pwa-install-title { font-size: 0.82rem; }
  .pwa-install-sub { font-size: 0.72rem; }
  .pwa-install-cta {
    gap: 5px;
    padding: 8px 11px;
    font-size: 0.78rem;
  }
  .pwa-install-close {
    width: 26px;
    height: 26px;
  }
}

@media print {
  .pwa-install { display: none; }
}


/* --- css/_r8-zz-round11.css --- */
/* === Derek round 11 (A4) — one standard hero height + scroll chevron ======
   "Hero image (video on Home) currently a different height on every page.
    Standard: runs to the bottom of the screen, with the small white downward
    chevron centred at the bottom, as Home already does. About Us is the
    reference. Exception: lodge profile pages."   [10:55, 10:58]

   Both halves of the premise are wrong, so this implements what he MEANS
   rather than what he described:
     - Home is NOT full height. It is calc(100vh - 88px - 42px) = 770px in a
       900px viewport, stopping 130px short. It IS the only page carrying the
       chevron, which is what he actually noticed.
     - About Us IS full height (100svh) but has NO chevron, and its <= 720px
       rule re-asserts calc(100svh - var(--header-h)), so it is not full height
       on phones either.
   Full height AND a chevron therefore go on every page, Home included.

   Filed here, in the last partial alphabetically, because the per-page heights
   live in _r8-about / _r8-feedback / _r8-wmbd and in <= 720px blocks inside
   styles.css. One rule that outranks all of them beats seven edits that each
   have to be kept in step. scripts/build-round8-assets.cjs globs '_r8-*' and
   sorts, so '_r8-zz-round11.css' folds last — verified against that script.

   NOT converted, and why:
     - body.lodge-page profiles: Derek's stated exception (the tabs bar owns
       the bottom of the screen). The 840px cap at .lodge-hero--strip is left
       alone; note that .lodge-page .pricing-rail-inner repeats the same
       clamp(540px, 100svh, 840px) expression in its min-height and the two
       have to move together if that cap is ever changed.
     - contact-us/thank-you + the 16 testimonials pages: their hero background
       is assets/source-images/icon-social-f.png, a social icon rather than a
       photo. At 100svh with background-size: cover that renders as one
       enormous magnified glyph. Excluded by attribute until they get real
       imagery — see the note in the sweep report.
     - price-range: the sticky .r8-price-bands picker sits flush under the
       hero, and a full-height hero pushes it below the fold, which is the
       exact objection Derek raised about lodge sub-menus. Excluded on
       structure (:has(+ .r8-price-bands)) rather than by page name.
   ========================================================================= */

/* -- Home: video hero to the fold. Its own chevron markup already exists. */
.hero-home {
  height: var(--hero-h);
}

/* -- Every .page-hero layout (about-us, client-feedback, what-makes-...,
      the 12 getaway-ideas, accommodation index, destinations landing,
      booking-enquiry, contact-us, easier-and-cheaper, special-sa-rates,
      tailor-made-for-you, personal-lodge-reviews, privacy-policy, terms).
      The two :not() legs are the exclusions above; they also lift the
      specificity to 0,3,0, which is what lets one rule outrank
      .header-fade .page-hero.compact and every per-page min-height. */
.page-hero:not([style*="icon-social-f"]):not(:has(+ .r8-price-bands)) {
  min-height: var(--hero-h);
  padding-bottom: var(--hero-copy-clear);
}

/* -- The 29 reserve / destination pages. These are .lodge-hero, not
      .page-hero: the photo is a top-anchored layer of --lodge-photo-h and the
      section adds padding-top to sit the copy over its lower third. Simpler to
      make it behave like .page-hero — bottom-aligned copy in a 100svh box with
      the photo filling it — than to keep three interlocking length calcs in
      step, and it guarantees exactly 100svh instead of 100svh +/- the copy. */
.lodge-hero.destination-gallery-hero[data-lodge-hero-slider] {
  --lodge-photo-h: var(--hero-h);
  display: flex;
  align-items: flex-end;
  min-height: var(--hero-h);
  max-height: none;
  padding-top: 0;
}

.lodge-hero.destination-gallery-hero[data-lodge-hero-slider] .lodge-hero-slide,
.lodge-hero.destination-gallery-hero[data-lodge-hero-slider] .lodge-hero-veil {
  inset: 0;
  height: 100%;
}

.destination-gallery-hero .lodge-hero-inner {
  padding-bottom: var(--hero-copy-clear);
}

/* Knock-on from A1. The reserve slider's [<] 1/8 [>] pill sits at top: 24px,
   right: --lodge-gutter, i.e. under the floating header and hard against the
   right gutter. That was clear of the old far-right menu icon; the icon now
   sits on the rail mid-point, which lands inside the pill. Drop the pill below
   the header rather than move the icon — the icon position is the thing Derek
   specified. (Lodge profiles are unaffected: their controls are pinned to the
   left of the rail column already.) */
.destination-gallery-hero .lodge-hero-controls {
  top: calc(var(--header-h) + 16px);
}

/* -- The chevron ----------------------------------------------------------
   Same glyph as the Home hero's inline SVG (M6 9l6 6 6-6, 1.6 stroke, round
   caps) at the same 28px, so nothing on the page can tell the two apart.

   Drawn as a pseudo-element rather than markup: this stage owns CSS only, and
   a decorative down-arrow has no anchor target on an inner page anyway. If the
   sweep stage later adds real <a class="hero-scroll"> elements, the
   :not(:has(.hero-scroll)) guard stands the pseudo down so no page ends up
   with two.

   z-index 4 is load-bearing on the reserve pages: .lodge-hero-veil there is
   z-index 1 and .lodge-hero-inner is 3, so anything below 4 paints underneath.
   On .page-hero the veil is z-index -1 under isolation: isolate, so it would
   have been fine either way — one value for both keeps it out of the next
   round's way. */
.page-hero:not([style*="icon-social-f"]):not(:has(+ .r8-price-bands)):not(:has(.hero-scroll))::after,
.lodge-hero.destination-gallery-hero[data-lodge-hero-slider]:not(:has(.hero-scroll))::after {
  content: "";
  position: absolute;
  left: 50%;
  bottom: var(--hero-chevron-inset);
  z-index: 4;
  width: 28px;
  height: 28px;
  margin-left: -14px;
  opacity: 0.92;
  background: center / 28px 28px no-repeat
    url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M6 9l6 6 6-6' fill='none' stroke='%23faf6ec' stroke-width='1.6' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
  pointer-events: none;
  animation: hero-chevron-bob 2.6s infinite var(--ease-soft);
}

/* The Home hero's own chevron animates via translate(-50%, y) because it is
   centred with a transform; the pseudo is centred with margin-left, so it gets
   a plain translateY of the same 8px over the same 2.6s. */
@keyframes hero-chevron-bob {
  0%,
  100% {
    transform: translateY(0);
  }
  50% {
    transform: translateY(8px);
  }
}

@media (prefers-reduced-motion: reduce) {
  .page-hero::after,
  .destination-gallery-hero::after {
    animation: none;
  }
}

/* .hero-scroll has no z-index of its own, which is fine inside .hero-home
   (isolation: isolate, veil at -1) but would paint under the veil on any
   .lodge-hero. Give the real element the same stacking as the pseudo so the
   sweep stage can drop <a class="hero-scroll"> into any hero and have it
   land correctly. */
.hero-scroll {
  z-index: 4;
}


/* --- css/_r8-zz-round13.css --- */
/* Round 13 — Derek, 2026-08-26.
   ------------------------------------------------------------------------
   "When you click on an 'enquire now' button ... I don't think it's necessary
   to have a big image here and to make the user scroll down to get to the
   actual enquiry form. Instead the page should already open on the form."

   The booking-enquiry hero was a full-viewport photo: .page-hero picks up
   min-height:var(--hero-h) — 100svh — from the shared rule in styles.css, so
   the form began below the fold at every window size. The photo and the scroll
   chevron are gone from the markup; this turns what is left into a plain
   heading band.

   Sorted last of the _r8- partials on purpose (zz), so it folds after
   _r8-zz-round11.css and wins on order rather than on !important.

   Specificity note: the shared .page-hero rule is 0,3,0 because of its two
   :not() legs, so these need three classes to beat it. */

.page-hero.compact.page-hero--form {
  min-height: 0;
  padding-top: calc(var(--header-h) + 26px);
  padding-bottom: 22px;
  color: var(--ink);
  background: none;
  align-items: flex-start;
}

.page-hero.compact.page-hero--form .page-hero-veil {
  display: none;
}

/* The chevron is drawn as a pseudo-element on .page-hero; there is nothing
   below to scroll to now. */
.page-hero.compact.page-hero--form::after {
  content: none;
}

/* .eyebrow.light is cream, for reading over a photo. On the bare band it would
   be invisible. */
.page-hero.compact.page-hero--form .eyebrow.light {
  color: var(--teal-deep);
}

/* The display heading is sized for a full-bleed photo hero. On a heading band
   it is just distance between the header and the first field, so it comes down
   to a page title. */
.page-hero.compact.page-hero--form .page-hero-content {
  gap: 6px;
}

.page-hero.compact.page-hero--form h1.display {
  font-size: clamp(1.9rem, 3.4vw, 2.6rem);
  line-height: 1.1;
  margin: 0;
}

.page-hero.compact.page-hero--form p {
  margin: 0;
  max-width: 60ch;
}

/* Newsletter sign-up feedback (Derek, 2026-08-27). The forms had no way to say
   anything at all before; this is the line that appears under them. */
.newsletter-status {
  margin: 8px 0 0;
  flex-basis: 100%;
  font-size: 0.78rem;
  line-height: 1.4;
  color: rgba(255, 255, 255, 0.78);
}
.newsletter-status.is-error {
  color: #f0b8a0;
}
.footer-newsletter-form .newsletter-status,
.menu-newsletter-form .newsletter-status {
  order: 99;
}

/* <<< round8-partials */
