/* hedgerow-core.css — Slater bundle for hedgerowhouse
 * Generated 2026-09-14 from the live Site Settings head at
 * hedgerowhouse.webflow.io. Paste this into a Slater CSS file, then delete the
 * matching blocks from Webflow Site Settings > Custom Code > Head.
 *
 * DROPPED, DO NOT MIGRATE: the "Mobile nav open state" block keyed on
 * [data-nav-status] and .nav-toggle. Verified dead on 2026-09-14: zero matches
 * for either selector across 10 pages. It drives the OLD nav, which the two
 * "Nav Bar - New" components replaced. Delete it from Site Settings; do not
 * carry it here. Same for its partner footer script (see hedgerow-core.js).
 *
 * Everything below is live and load-bearing. Do NOT strip the !important
 * flags: they are the only reason .journal-cards and .accom-body-grid take
 * effect at all. Removing them puts /journal back to 561px and the suite pages
 * to 401px. See website/mobile-fixes.css.
 *
 * NOTE ON LOAD ORDER: this must be a STYLESHEET in <head>, not CSS injected by
 * a deferred script. These rules govern first paint on mobile; injecting them
 * after paint flashes the unstyled, overflowing layout.
 */

/* ─── TEMPORARY RESPONSIVE STOPGAP — added 2026-08-25 by Ikigai ─────────────
   REMOVE THIS BLOCK once the same rules are set in the Designer. Owner:
   Elliott. Tracked on HED-79. Spec: 2026-08-24-mobile-tablet-pass.md

   Why it is here and not in the Designer, which is where it belongs: the
   Webflow MCP cannot write breakpoint-scoped styles. It silently writes every
   value to the BASE breakpoint whatever breakpoint you ask for, so authoring
   this through the API would have corrupted desktop styling site-wide.

   Every selector below was measured in a real browser at 991/767/390, before
   and after, on the published site. Nothing here is guessed.
   ─────────────────────────────────────────────────────────────────────────── */
@media (max-width: 767px) {

  /* two-column grids that squash below ~160px per track */
  .contact-grid,
  .form-row,
  .container-large.text-media-grid,
  .tm-grid,
  .tm-media,
  .accom-body-grid,
  .accom-media-grid,
  .session-hero-grid,
  .session-detail-grid,
  .getting-here-grid,
  .booking-row {
    grid-template-columns: 1fr;
  }

  /* three-up card grids drop to two before going single */
  .more-grid,
  .extras-grid {
    grid-template-columns: repeat(2, 1fr);
  }

  /* flex rows that never wrapped */
  .section-header-grid,
  .footer-form,
  .nl-form,
  .booking-actions,
  .accom-hero-head {
    flex-wrap: wrap;
  }

  /* 24 Aug sections. These are flex rows, not grids, which is why they were
     held back from the first pass until they were published and measurable.
     Unstacked they gave a 70px overflow on the homepage, 98px Flower Farm
     cards and an 86px values column on About. */
  .split-intro,
  .values-row {
    flex-direction: column;
  }

  .split-intro-left,
  .split-intro-right,
  .story-card,
  .values-left,
  .values-list {
    width: 100%;
    max-width: 100%;
  }

  .ff-cards {
    flex-wrap: wrap;
  }

  .ff-card {
    flex: 1 1 100%;
  }
}

@media (max-width: 479px) {

  .more-grid,
  .extras-grid,
  .listing-grid {
    grid-template-columns: 1fr;
  }
}

/* ─── TEMPORARY, same owner and same fate as the block above ────────────────
   Responsive rules for the homepage sections built 25 Aug against the Figma
   frames. Here for the same reason: the API cannot write breakpoint styles.
   Move into the Designer and delete alongside the block above. HED-79.
   ─────────────────────────────────────────────────────────────────────────── */
@media (max-width: 991px) {
  .stays-grid {
    grid-template-columns: 1fr;
  }

  .stays-media {
    aspect-ratio: 16 / 10;
  }
}

@media (max-width: 767px) {
  .things-cards {
    grid-template-columns: repeat(2, 1fr);
  }

  .journal-cards {
    grid-template-columns: 1fr;
  }
}

@media (max-width: 479px) {
  .stays-cards {
    grid-template-columns: 1fr;
  }

  .stays-card-img {
    aspect-ratio: 2 / 1;
  }

  .things-cards {
    grid-template-columns: 1fr;
  }

  .things-card-img {
    aspect-ratio: 2 / 1;
  }
}

/* ─── TEMPORARY, fourth in the series. Same owner and same fate as the three
   blocks above: move into the Designer, then delete. Owner: Elliott. HED-79.
   Added 2026-09-11 by Ikigai. Source of record and full diagnosis:
   ikigai/clients/hedgerow-house/website/mobile-fixes.css

   MIGRATE TO SLATER. This belongs in a Slater project for hedgerowhouse, the
   way tinyseeds.je runs project 17662. No Slater project exists for this site
   yet, so it is inline here to ship before soft launch. Once Slater is wired
   up, move all four blocks there and delete them from Site Settings.

   Every rule below was measured in Playwright at an iPhone 14 viewport on the
   published site, before and after, with the rest of this head in place.
   Nothing is guessed. Result: 9 of 13 overflowing pages brought back to 390px,
   and footer tap targets under 44px went 12 to 0 on all 24 pages.

   Note on !important: the .journal-cards and .accom-body-grid rules in the
   blocks above are already present but WITHOUT !important, and they lose to
   Webflow's generated class rules. They have never taken effect. The versions
   here carry !important, and removing it puts /journal back to 561px and the
   suite pages back to 401px. Verified both ways.
   ─────────────────────────────────────────────────────────────────────────── */
@media (max-width: 767px) {

  /* /about-jersey and /things-to-do rendered at 1320px, 3.4x a 390px screen:
     a four-column grid with fixed 312px tracks and width 1296px. */
  .related-pages-list,
  .feature-cards-4-col {
    grid-template-columns: 1fr !important;
    width: auto !important;
    max-width: 100% !important;
  }

  /* /journal at 561px: a three-column grid that never collapses. */
  .journal-cards {
    grid-template-columns: 1fr !important;
    width: auto !important;
    max-width: 100% !important;
  }

  .w-dyn-list {
    max-width: 100% !important;
  }

  /* Footer links measured 230x20px against a 44px minimum. Padding rather
     than height so the footer column keeps its visual rhythm. */
  .footer-flink,
  .footer-col a {
    padding-top: 12px !important;
    padding-bottom: 12px !important;
    display: inline-block !important;
  }

  /* Accommodation suites, 682px to 715px: .accom-features-row is a flex row
     whose cards do not wrap, and the body grid keeps its desktop split. */
  .accom-features-row {
    flex-wrap: wrap !important;
  }

  .accom-features-card {
    flex: 1 1 100% !important;
    min-width: 0 !important;
  }

  .accom-body-grid {
    grid-template-columns: 1fr !important;
  }

  .accom-included {
    max-width: 100% !important;
  }

  /* /pick-your-own at 525px. These read as deliberate horizontal runs rather
     than broken layout, so they are CONTAINED, not restacked. If they are
     meant to stack on mobile, use flex-wrap: wrap on the wrappers instead. */
  .hiw_cards-wrapper,
  .seasons_flowers-wrapper,
  .seasons_flowers-panel {
    max-width: 100% !important;
    overflow-x: hidden !important;
  }

  /* Suite page header: a no-wrap flex row holding the title block (230px)
     beside the "Sleeps N" badge (113px), from a left offset of 80px. */
  .container-wrapper-4 {
    flex-wrap: wrap !important;
  }

  .container-wrapper-4>* {
    min-width: 0 !important;
  }
}

/* ─── STICKY NAV — added 2026-09-11 by Ikigai. HED-79, owner Elliott. ───────
   The nav already had position:sticky;top:0;z-index:100 on .nav-section and it
   has never worked, on any page. Cause: .nav-section's parent wrapper is
   exactly as tall as the nav itself (84px desktop, 76px mobile), and a sticky
   element can only travel inside its parent's box. Zero distance to travel.
   Fix is to move the sticky one level up, onto the [data-nav-instance] wrapper,
   whose parent is <body>. Sticky keeps the element in flow, so there is no
   layout shift and no padding compensation anywhere.
   The homepage is the exception: its wrapper sits inside section.hero-home,
   which has overflow:hidden, so sticky cannot work there. Fixed is used
   instead, which costs nothing because that nav already overlays the hero.
   Verified pinned at 1440 and 390 on /, /about, /journal, /events/halloween
   and /accommodation/blampied-suite. */
[data-nav-instance] {
  position: sticky;
  top: 0;
  z-index: 100;
}

.hero-home>[data-nav-instance] {
  position: fixed;
  left: 0;
  right: 0;
}

[data-nav-instance] .nav-section {
  transition: background-color .25s ease, box-shadow .25s ease;
}

/* Scrolled state, LIGHT VARIANT ONLY. The light nav is transparent with white
   links, a white logo and a white-outlined CTA, all designed against a dark
   hero photo. Pinned over bone page content they are invisible, so the .nav-
   is-scrolled class (set by the footer script) restores the same colours the
   default variant already uses. The default variant needs none of this: it is
   already opaque bone. */
[data-nav-instance].nav-is-scrolled .nav-section-light {
  background-color: #E9E4DC;
  box-shadow: 0 1px 0 rgba(43, 42, 38, .10);
}

[data-nav-instance].nav-is-scrolled .nav-link-light {
  color: #3B4A3E;
}

[data-nav-instance].nav-is-scrolled .nav-cta {
  color: #3B4A3E !important;
  border-color: #3B4A3E !important;
}

/* ═══════════════════════════════════════════════════════════════════════════
   APPENDED 2026-09-17. Everything below was shipped between 14 and 17 Sep as
   REGISTERED WEBFLOW SCRIPTS that inject a <style> tag at runtime. That was a
   workaround for the Site Settings head being near its ~10,000 character cap,
   not a design choice. Injecting layout CSS from JS means it lands AFTER first
   paint, so mobile flashes the unstyled layout on every page.

   Moving it here fixes that: as a linked stylesheet it is in <head> before
   paint. Each block names the registered script it replaces. Remove those
   scripts from applied site scripts only after this file is live and verified.
   ═══════════════════════════════════════════════════════════════════════════ */

/* ─── replaces registered script: hh_mobile_qa_fixes_17_sep ─────────────────
   Mobile QA pass, 17 Sep. Centres the section-header text stack under 991px,
   unstacks the text-media grid under 767px, and swaps the mobile-menu logo to
   the dark SVG (the light one was invisible on the bone overlay). */
@media screen and (max-width:991px) {

  .text-header-wrapper,
  .text-header-wrapper * {
    text-align: center
  }

  .body-xl.on-media,
  .body-l.text-header-leader,
  .stays-card-meta {
    text-align: center
  }

  .accom-card-title+.stays-card-meta {
    text-align: center
  }
}

@media screen and (max-width:767px) {
  .text-media-wrapper {
    grid-template-columns: 1fr !important
  }

  .tm-media {
    grid-template-columns: 1fr !important;
    padding-bottom: 0 !important
  }

  .tm-img-tall {
    height: auto !important;
    margin-top: 0 !important;
    aspect-ratio: 4/3
  }

  .tm-stack {
    grid-template-rows: auto auto
  }

  .tm-img-upper,
  .tm-img-lower {
    height: auto !important
  }
}

.mm-overlay .mm-header img {
  content: url("https://cdn.prod.website-files.com/6a291a7495a7301b841da979/6a8db084c2f201be31946029_hedgerow_house-logo-dark.svg")
}

/* ─── replaces registered script: hh_newsletter_and_footer_mobile ───────────
   Newsletter heading centring, and footer type sizes / two-column footer grid
   below 479px. */
.nl-head {
  text-align: center
}

.container-lg.nl-inner {
  justify-content: center
}

@media screen and (max-width:767px) {
  .footer-col-title {
    font-size: 14px
  }

  .footer-copy {
    font-size: 15px
  }

  .footer-flink {
    font-size: 1rem
  }
}

@media screen and (max-width:479px) {
  .footer-grid {
    grid-template-columns: 1fr 1fr
  }

  .footer-brand {
    grid-column: 1 / -1
  }
}

/* ─── replaces registered script: hh_header_height_mobile_v3 ────────────────
   Page headers ran to nearly a full mobile viewport before any content. This
   drops the min-height, pins the illustration to the bottom-right and caps it
   at 96px (80px under 479px). */
@media screen and (max-width:767px) {
  .section-header {
    min-height: auto;
    padding-top: 96px;
    padding-bottom: var(--space--2xl)
  }

  .section-header-panel {
    padding-top: var(--space--m);
    padding-bottom: var(--space--m)
  }

  .section-header-grid {
    position: relative
  }

  .section-header-illustration {
    position: absolute;
    right: 0;
    bottom: 0;
    width: auto;
    margin: 0;
    pointer-events: none;
    justify-content: flex-end;
    align-items: flex-end
  }

  .section-header-illustration img {
    width: auto !important;
    max-width: 96px;
    max-height: 96px;
    height: auto;
    object-fit: contain;
    opacity: .9
  }

  .section-header-copy {
    width: 100%;
    padding-top: 0;
    padding-bottom: 116px
  }
}

@media screen and (max-width:479px) {
  .section-header {
    padding-top: 92px
  }

  .section-header-illustration img {
    max-width: 80px;
    max-height: 80px
  }

  .section-header-copy {
    padding-bottom: 100px
  }
}

/* ─── replaces registered script: hh_form_states_and_button_spacing ─────────
   Webflow's default success/error boxes are unstyled red and green. These are
   the brand parchment equivalents. Also the standing 12px gap between a
   textimg block's copy and its button (20px on mobile). */
.w-form-fail {
  background-color: #F8F4EF;
  border: 1px solid #9B7F72;
  border-radius: 10px;
  padding: 16px 18px;
  margin-top: 16px;
  color: #3B4A3E;
  text-align: left
}

.w-form-done {
  background-color: #F8F4EF;
  border: 1px solid #96A480;
  border-radius: 10px;
  padding: 20px 18px;
  margin-top: 16px;
  color: #3B4A3E;
  text-align: center
}

.w-form-fail div,
.w-form-done div {
  color: #3B4A3E
}

.textimg-text .btn,
.textimg-copy .btn {
  margin-top: 12px
}

@media screen and (max-width:767px) {

  .textimg-text .btn,
  .textimg-copy .btn {
    margin-top: 20px
  }
}

/* ─── replaces registered script: hh_legal_embed_centring ───────────────────*/
#hh-legal-embed {
  width: 100%
}

/* ─── replaces the CSS half of: hh_hide_dead_bento_ctas ─────────────────────
   Buttons whose CMS link was never set render as href="#". The JS half removes
   them from the DOM; this rule stops them flashing before it runs. Keep both:
   the rule alone leaves an unreachable element in the tab order. */
.tm-card a.btn[href="#"],
.textimg-text a.btn[href="#"],
.textimg-copy a.btn[href="#"] {
  display: none !important
}

/* ─── replaces the CSS half of: hh_newsletter_mailchimp_and_validation ──────
   The newsletter block: input colours, the validation message, the social row
   and the privacy line. Two layouts share these classes — the footer band
   (.section-container.nl, stacked and centred) and the homepage hero inline
   form (.hero-home .newsletter-inline, two columns). The overrides for each
   follow the shared base. Validation text is #f0c6b4: measured 6.01:1 on the
   green. Do NOT reuse .w-form-fail's #8a4526 here, it measures 1.32:1 on this
   background and is invisible. */
.nl-input {
  color: #3b4a3e
}

.nl-input::placeholder {
  color: #acacac;
  opacity: 1
}

.hh-nl-msg {
  display: none;
  width: 100%;
  margin: 8px 0 0;
  font-size: 15px;
  line-height: 1.4;
  color: #f0c6b4;
  text-align: left
}

.hh-nl-msg.is-shown {
  display: block
}

.nl-form.hh-invalid .nl-input {
  box-shadow: 0 0 0 2px #c8775a
}

.nl-form {
  flex-wrap: wrap
}

.heading-3.nl-head {
  padding-top: 24px
}

.body-m.nl-copy {
  margin-bottom: 24px
}

.nl-inner img {
  width: 150px;
  height: auto
}

@media screen and (max-width:767px) {
  .section-container.is-green.nl {
    padding-top: 48px;
    padding-bottom: 48px
  }

  .nl-inner img {
    width: 120px
  }

  .heading-3.nl-head {
    padding-top: 16px
  }
}

/* shared social row + privacy line */
.hh-social-row {
  display: flex;
  justify-content: space-between;
  align-items: center;
  gap: 24px;
  flex-wrap: wrap;
  width: 100%;
  margin-top: 28px
}

.hh-socials {
  display: flex;
  gap: 8px;
  justify-content: flex-start;
  align-items: center;
  flex-wrap: wrap;
  margin: 0
}

.hh-legal {
  flex: 0 1 380px;
  margin: 0;
  color: #e9e4dc;
  font-size: 14px;
  line-height: 1.5;
  text-align: right
}

.hh-legal a {
  color: #f8f4ef;
  text-decoration: underline;
  text-underline-offset: 2px
}

.hh-legal a:hover {
  color: #fff
}

.hh-socials-label {
  margin: 0 8px 0 0;
  color: #f8f4ef;
  white-space: nowrap
}

@media screen and (max-width:600px) {
  .hh-socials-label {
    width: 100%;
    margin: 0 0 12px;
    text-align: center;
    white-space: normal
  }
}

.hh-socials a {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 44px;
  height: 44px;
  color: #f8f4ef;
  border: 1px solid #f8f4ef;
  border-radius: 999px;
  transition: color .14s cubic-bezier(.2, .8, .2, 1), background-color .14s cubic-bezier(.2, .8, .2, 1), border-color .14s cubic-bezier(.2, .8, .2, 1), transform .14s cubic-bezier(.2, .8, .2, 1)
}

.hh-socials a:hover,
.hh-socials a:focus-visible {
  color: #3b4a3e;
  background-color: #f8f4ef;
  border-color: #f8f4ef;
  transform: translateY(-2px)
}

.hh-socials a:focus-visible {
  outline: 2px solid #f8f4ef;
  outline-offset: 2px
}

.hh-socials svg {
  width: 20px;
  height: 20px
}

@media screen and (max-width:767px) {
  .hh-socials {
    gap: 10px
  }
}

@media screen and (max-width:767px) {
  .hh-social-row {
    justify-content: center;
    gap: 16px
  }

  .hh-socials {
    justify-content: center;
    width: 100%
  }

  .hh-legal {
    flex: 1 1 100%;
    text-align: center;
    order: -1
  }
}

/* footer band: stacked, centred, privacy line above the icons and tight to
   the input (margin-top:0 here is deliberate, it is what closes the 59px gap
   under the email field down to 31px) */
.section-container.nl .hh-social-row {
  flex-direction: column;
  justify-content: center;
  gap: 18px;
  margin-top: 0
}

.section-container.nl .hh-socials {
  justify-content: center;
  width: 100%
}

.section-container.nl .hh-legal {
  flex: 0 1 auto;
  max-width: 520px;
  margin: 0 auto;
  text-align: center;
  order: -1
}

/* homepage hero inline form: two columns, icons under the heading, privacy
   line under the input. The calc() widths also stop the privacy box wrapping
   onto its own line: at 1440 the row is 1212px and 578+56+578 fills it
   exactly, so any margin added to the legal tips it over and it drops. */
.hero-home .newsletter-inline .container-wrapper-9 {
  flex-wrap: wrap
}

/* The form centres its input whenever it has slack, which put the input 16px
   right of the form's own left edge at 1440 and flush with it below that. That
   moving target is why aligning the privacy line with a margin never held.
   Pin the input flush instead, then the legal can align to a fixed edge. */
.hero-home .newsletter-inline .nl-form {
  justify-content: flex-start
}

.hero-home .newsletter-inline .hh-social-row {
  width: 100%;
  gap: 56px;
  margin-top: 32px;
  align-items: flex-start
}

.hero-home .newsletter-inline .hh-socials {
  flex: 0 1 calc(50% - 28px);
  justify-content: center
}

/* The row is space-between, so the legal is pinned to the row's RIGHT edge and
   its left position is a function of its own width. Matching the socials'
   basis (50% - 28px) therefore makes legal-left land exactly on form-left,
   which is now input-left. Measured 0px offset at 992/1100/1200/1280/1366/1440.
   Do not "simplify" this back to a margin-left: it only agrees at one width.
   margin-top:-34px holds the line where it was after the row gained 20px. */
.hero-home .newsletter-inline .hh-legal {
  flex: 0 1 calc(50% - 28px);
  text-align: left;
  margin-left: 0;
  margin-top: -34px
}

@media screen and (max-width:991px) {
  .hero-home .newsletter-inline .hh-social-row {
    gap: 16px
  }

  .hero-home .newsletter-inline .hh-socials,
  .hero-home .newsletter-inline .hh-legal {
    flex: 1 1 100%;
    justify-content: center;
    text-align: center;
    max-width: none;
    margin-left: 0;
    margin-top: 0
  }

  .hero-home .newsletter-inline .hh-legal {
    order: -1
  }
}

/* mobile nav, from the same script: burger bars go dark once the nav has a
   bone background, and the open menu's logo must not shift */
[data-nav-instance].nav-is-scrolled .mm-toggle-bar-light {
  background-color: #3b4a3e
}

.mm-header {
  padding-left: 16px
}

.mm-header .nav-logo-img {
  width: 263px
}

.mm-overlay .mm-body {
  flex: 0 1 auto
}

/* ─── replaces registered script: hh_play_sessions_book_layout ──────────────
   /sheepshed/play-sessions only. The Session details panel sat inside the
   booking area, left-aligned and narrower than everything around it. order:-1
   lifts it above the "Book now" heading; the 960px centred column matches the
   body copy and the Bookeo widget below it. Scoped by #book, which is the
   booking section's own id. */
#book .legal-brief {
  order: -1;
  width: 960px;
  max-width: 100%;
  margin: 0 auto 48px
}

@media screen and (max-width:991px) {
  #book .legal-brief {
    width: 100%;
    margin-bottom: 32px
  }
}

/* ─── replaces registered script: hh_hide_our_story_timeline_temp ───────────
   TEMPORARY, 17 Sep. /about/our-story's "Along the way." timeline is hidden
   until the archive photography arrives. Three of its seven entries (2013
   snow, 2025 pre-build, 2026 timber frame) have no image and rendered as
   captioned gaps. DELETE THIS RULE and the matching registered script the day
   the photographs land — nothing else needs changing, the timeline is intact
   underneath. Owner: client (archive photography). */
section.hh-tl {
  display: none !important
}

/* ─── replaces registered script: hh_consistency_pass_17_sep ───────────────
   Three findings from the 17 Sep spacing sweep across 19 pages. */

/* 1. The textimg block ships in two variants. .textimg-copy is a flex column
   with gap:56px (24px under 767px) and its button carries margin-top:12px
   (20px mobile). One variant ALSO puts margin-bottom:32px on .textimg-text,
   so the same component rendered a 100px copy-to-button gap on /flower-farm,
   /pick-your-own, /venue-hire and /about, against 68px on /weddings. Flex
   margins do not collapse, hence 56+32+12. Zeroing it lands every instance on
   68px desktop / 44px mobile. On /sheepshed .textimg-text is the last child
   with no button, so this also removes 32px of dead space under it. */
.textimg-copy .textimg-text {
  margin-bottom: 0
}

/* 2. section.featured_pages is the white card band on / and /about/about-jersey.
   It was the only section on either page with zero vertical padding at desktop,
   so the white ran flush to the cards and read as a mis-set band rather than a
   panel. Every neighbouring section is 120/120. Mobile already had 56/56 from a
   breakpoint rule, so this is scoped to >=992px to leave that alone. */
@media screen and (min-width:992px) {
  section.featured_pages {
    padding-top: 120px;
    padding-bottom: 120px
  }
}

/* 3. Marquee copy was 14px desktop / 12px mobile and hard to read. The bar's
   line-height is fixed (48px / 42px), so the type grows without the bar
   moving — verified unclipped at both widths on / and /sheepshed. The
   descendant selector is load-bearing: a bare .hh-mq__i loses to a rule in
   Webflow's own stylesheet, which is cross-origin and so invisible to a
   document.styleSheets scan. Do not flatten it, and do not reach for
   !important — the extra class is enough. */
.hh-mq .hh-mq__static,
.hh-mq .hh-mq__i,
.hh-mq .hh-mq__d {
  font-size: 17px;
  letter-spacing: .17px
}

@media screen and (max-width:767px) {

  .hh-mq .hh-mq__static,
  .hh-mq .hh-mq__i,
  .hh-mq .hh-mq__d {
    font-size: 15px;
    letter-spacing: .15px
  }
}

/* ─── DESKTOP HEADER HEIGHT — 17 Sep ───────────────────────────────────────
   Interior page headers ran taller than the viewport: /about and /our-story
   measured 957px and 955px against a 900px screen (106%), with the h1 sitting
   280px below the nav. Three causes, all fixed here and none of them the
   photograph:

   1. min-height:765px (85vh) was a floor that short pages could not go under.
      /sheepshed and /venue-hire both sat at exactly 765 with room to spare.
   2. .section-header-copy carried 80px padding top AND bottom — 160px of pure
      inset before any content.
   3. The illustration is 480px tall and sits IN FLOW beside the copy, with the
      grid centring the two against each other, so it set a floor of its own.

   Measured at 1440x900 after this block: /sheepshed 765 -> 583 (85% -> 65% of
   viewport), /venue-hire 765 -> 675, /about 957 -> 893, /accommodation
   835 -> 771. Nav-to-h1 gap drops by 32-91px depending on the page.

   Scoped to >=992px on purpose: the mobile header was tuned separately on
   17 Sep (hh_header_height_mobile_v3) and must not be disturbed. */
@media screen and (min-width:992px) {
  .section-header {
    min-height: auto
  }

  .section-header-copy {
    padding-top: 48px;
    padding-bottom: 48px
  }

  .section-header-illustration img {
    max-height: 340px;
    width: auto;
    height: auto
  }
}

/* ─── LIGHT NAV CONTRAST SCRIM — 17 Sep ────────────────────────────────────
   The light nav is transparent with a white logo, white links and a
   white-outlined CTA, designed against a dark hero photo. On the brighter
   photographs (the About tractor shot especially) it was close to illegible.

   This lays a soft dark gradient behind the nav only, fading to nothing by
   220px so it reads as the top edge of the photograph rather than a bar. The
   inset starts at -88px because .section-header carries margin-top:-88px to
   run the photo up behind the nav; the scrim has to cover that too or it
   stops short of the top of the screen.

   It must disappear once scrolled: .nav-is-scrolled gives the nav a solid bone
   background and dark links, and the scrim under that would be a dark smear.
   Verified at 400px scroll: opacity 0, background rgb(233,228,220).

   The light variant only. The default nav is already opaque bone. */
[data-nav-instance] .nav-section-light {
  position: relative
}

[data-nav-instance] .nav-section-light::before {
  content: "";
  position: absolute;
  inset: -88px 0 auto 0;
  height: 220px;
  background: linear-gradient(to bottom, rgba(20, 26, 21, .55) 0%, rgba(20, 26, 21, .32) 45%, rgba(20, 26, 21, 0) 100%);
  pointer-events: none;
  z-index: 0;
  transition: opacity .25s ease;
}

[data-nav-instance] .nav-section-light>* {
  position: relative;
  z-index: 1
}

[data-nav-instance].nav-is-scrolled .nav-section-light::before {
  opacity: 0
}

/* The marquee is a sibling ABOVE the light nav inside the same sticky wrapper,
   and it is position:static / z-index:auto. The nav is z-index:100, so the
   scrim — a child of the nav — painted straight over the parchment bar and
   dirtied it. Lifting the marquee above the nav's stacking context keeps the
   scrim where it belongs: behind the nav, below the marquee.
   Homepage and /sheepshed only carry a visible marquee; elsewhere .hh-mq
   collapses to 0 height, so this rule costs nothing there. */
.hh-mq {
  position: relative;
  z-index: 101
}

/* ─── 2-COLUMN TEXT SECTION, EDGE PADDING — 17 Sep ─────────────────────────
   The "More than a farm stay" block ran its left column hard against the
   viewport: ._2col_text-left measured left:0, so the paragraph touched the
   screen edge with no gutter at all. Its .container-lg carries no horizontal
   padding, unlike the rest of the site (.section-header insets 32px, the
   newsletter row sits at 164 in a 1440 viewport).

   64px above 1200px, 32px below, applied to the container so both columns
   move together and the right card stays symmetric. Measured at 1440: text
   left 0 -> 64, right column ends 1376, page still 1440 wide with no
   horizontal overflow.

   Scoped to ._2col_text so no other use of .container-lg is affected. */
._2col_text .container-lg {
  padding-left: 32px;
  padding-right: 32px
}

@media screen and (min-width:1200px) {
  ._2col_text .container-lg {
    padding-left: 64px;
    padding-right: 64px
  }
}

/* ═══════════════════════════════════════════════════════════════════════════
   INTERACTION LAYER — added 2026-09-17 (staging first)
   Styling for the five behaviours in hedgerow-core.js. Brand palette only:
   green #3B4A3E, bone #E9E4DC, parchment #F8F4EF, ink #202020.
   ═══════════════════════════════════════════════════════════════════════════ */

/* ─── 1. DIRECTIONAL BUTTON HOVER ──────────────────────────────────────────
   The site's one button variant is .btn.is-outline: transparent, 2px #202020
   border, 80px radius, position:static, overflow:visible. The circle has to be
   clipped by the pill, so the button becomes a positioned, clipping context.
   The layers are injected by the JS; these rules only dress them.

   Colours: the circle fills with brand green and the label flips to parchment.
   The reference used lime on near-black, which has no equivalent here. */
a.btn[data-hh-btn],
button.btn[data-hh-btn] {
  position: relative;
  overflow: hidden;
  isolation: isolate;
}

.hh-btn__circle-wrap {
  position: absolute;
  inset: 0;
  border-radius: inherit;
  overflow: hidden;
  pointer-events: none;
  z-index: 0;
}

.hh-btn__circle {
  position: absolute;
  top: 50%;
  left: 50%;
  display: block;
  aspect-ratio: 1;
  width: 140%;
  border-radius: 50%;
  background-color: #3B4A3E;
  transform: translate(-50%, -50%) scale(0) rotate(.001deg);
  transition: transform .7s cubic-bezier(.625, .05, 0, 1);
  pointer-events: none;
}

.hh-btn__text {
  position: relative;
  z-index: 1;
  display: inline-flex;
  align-items: center;
  transition: color .7s cubic-bezier(.625, .05, 0, 1);
}

a.btn[data-hh-btn]:hover .hh-btn__circle,
a.btn[data-hh-btn]:focus-visible .hh-btn__circle,
button.btn[data-hh-btn]:hover .hh-btn__circle,
button.btn[data-hh-btn]:focus-visible .hh-btn__circle {
  transform: translate(-50%, -50%) scale(1) rotate(.001deg);
}

a.btn[data-hh-btn]:hover .hh-btn__text,
a.btn[data-hh-btn]:focus-visible .hh-btn__text,
button.btn[data-hh-btn]:hover .hh-btn__text,
button.btn[data-hh-btn]:focus-visible .hh-btn__text {
  color: #F8F4EF;
}

@media (prefers-reduced-motion: reduce) {
  .hh-btn__circle {
    transition: none
  }
}

/* ─── 2. CARD AND IMAGE HOVER ──────────────────────────────────────────────
   Cards currently have no hover state at all, so nothing reads as clickable.
   A slow, slight zoom plus a small darkening is enough; anything more fights
   the photography.

   The image wrapper must clip or the zoom bleeds past the card corner. Three
   of the four card types already clip (.journal-card, .accom-card-img-wrap);
   .related-pages-card and .launcher_card-content do not, so they are given
   overflow:hidden here. .nav-logo is deliberately excluded. */
.journal-card,
.accom-card-img-wrap,
.related-pages-card,
.launcher_card-content {
  overflow: hidden;
}

.journal-card img,
.accom-card-link img,
.related-pages-card-link img,
.launcher_card-rest img,
.launcher_card-grow img,
.launcher_card-discover img,
.launcher_card-nourish img {
  transition: transform .65s cubic-bezier(.2, .8, .2, 1), filter .45s ease;
  will-change: transform;
}

@media (hover:hover) and (pointer:fine) {

  .journal-card:hover img,
  .accom-card-link:hover img,
  .related-pages-card-link:hover img,
  .launcher_card-rest:hover img,
  .launcher_card-grow:hover img,
  .launcher_card-discover:hover img,
  .launcher_card-nourish:hover img {
    transform: scale(1.045);
    filter: brightness(.92);
  }

  .journal-card:focus-visible img,
  .accom-card-link:focus-visible img,
  .related-pages-card-link:focus-visible img {
    transform: scale(1.045);
    filter: brightness(.92);
  }
}

@media (prefers-reduced-motion: reduce) {

  .journal-card img,
  .accom-card-link img,
  .related-pages-card-link img,
  .launcher_card-rest img,
  .launcher_card-grow img,
  .launcher_card-discover img,
  .launcher_card-nourish img {
    transition: filter .45s ease;
  }

  .journal-card:hover img,
  .accom-card-link:hover img,
  .related-pages-card-link:hover img {
    transform: none
  }
}

/* ─── 3. FOOTER PARALLAX ───────────────────────────────────────────────────
   The JS moves footer.footer-section into .hh-footer-wrap and adds the dark
   layer. The wrapper clips so the footer can be drawn up from below without
   showing above its own top edge. */
.hh-footer-wrap {
  position: relative;
  overflow: hidden
}

.hh-footer-dark {
  position: absolute;
  inset: 0;
  background-color: #202020;
  opacity: 0;
  pointer-events: none;
}

/* ─── 4. IMAGE PARALLAX ────────────────────────────────────────────────────
   The JS only animates images whose parent already clips. Add this attribute
   to any wrapper to opt another image in — it sets the clip the check needs.
      <div data-hh-parallax> ... <img> ... </div>                            */
[data-hh-parallax] {
  overflow: hidden
}

/* ─── 5. BENTO LIGHTBOX ────────────────────────────────────────────────────
   Generated entirely by the JS from the three .tm-media images, so there is
   no duplicated markup in the Designer to keep in step. */
.hh-lb {
  position: fixed;
  inset: 0;
  z-index: 9999;
  display: none;
  align-items: center;
  justify-content: center;
  background-color: rgba(20, 26, 21, .88);
  padding: 2rem 2rem 6rem;
}

.hh-lb.is-open {
  display: flex
}

.hh-lb__stage {
  position: relative;
  width: min(92vw, 1200px);
  height: calc(100svh - 10rem)
}

.hh-lb__item {
  position: absolute;
  inset: 0;
  margin: 0;
  display: flex;
  align-items: center;
  justify-content: center;
  visibility: hidden;
  opacity: 0;
  transition: opacity .35s ease;
}

.hh-lb__item.is-active {
  visibility: visible;
  opacity: 1
}

.hh-lb__item img {
  max-width: 100%;
  max-height: 100%;
  width: auto;
  height: auto;
  object-fit: contain;
  border-radius: 10px;
}

.hh-lb__nav {
  position: absolute;
  left: 2rem;
  right: 2rem;
  bottom: 2rem;
  display: flex;
  align-items: center;
  justify-content: space-between;
  color: #F8F4EF;
  font-size: 15px;
}

.hh-lb__mid {
  display: flex;
  gap: 1.5rem;
  align-items: center
}

.hh-lb__btn {
  font: inherit;
  color: inherit;
  background: none;
  border: 0;
  cursor: pointer;
  padding: .5rem .25rem;
  text-decoration: underline;
  text-underline-offset: 3px;
}

.hh-lb__btn:hover,
.hh-lb__btn:focus-visible {
  color: #fff
}

.hh-lb__btn:focus-visible {
  outline: 2px solid #F8F4EF;
  outline-offset: 3px;
  border-radius: 4px
}

.hh-lb__count {
  opacity: .75
}

@media screen and (max-width:767px) {
  .hh-lb {
    padding: 1rem 1rem 5rem
  }

  .hh-lb__stage {
    width: 94vw;
    height: calc(100svh - 9rem)
  }

  .hh-lb__nav {
    left: 1rem;
    right: 1rem;
    bottom: 1.25rem;
    font-size: 14px
  }

  .hh-lb__mid {
    gap: 1rem
  }
}

/* ─── SECTION RHYTHM, DESKTOP — 17 Sep ─────────────────────────────────────
   Nathan flagged the white band between the two homepage card rows twice. The
   cause is not one section: EVERY top-level section carries 120px of padding
   top AND bottom, so wherever two of them stack the visitor sees 240px of
   empty page. Measured on the homepage before this block, six of the ten
   junctions were a 240px band.

   Dropping the pair to 80px each gives a 160px band — still generous, still
   the same rhythm, but no longer a hole. Homepage measured 10,443 -> 9,883px,
   and no junction now exceeds 160.

   NOTE ON SPECIFICITY: this supersedes the 120px set on section.featured_pages
   in the consistency pass above. That rule is more specific than a bare class,
   which is why the first attempt at this left two 240px bands in place — hence
   `body > ...` here. If you change one, check the other.

   The green newsletter band keeps its own 72px; it was already tighter and
   reads correctly against the colour change. Mobile is untouched — the
   breakpoint work on 17 Sep set those values deliberately.

   .content_header was missed on the first pass and left /accommodation,
   /sheepshed and /flower-farm at a 200px band while every other page sat at
   160. It only appears on interior pages, which is why a homepage-only check
   did not catch it — a reminder to measure the rule on every page it can
   touch, not just the one that prompted it. */
@media screen and (min-width:992px) {

  body>.launcher,
  body>._2col_text,
  body>.stays_featured,
  body>.text-media,
  body>.content_header,
  body>section.featured_pages,
  body>.section-container {
    padding-top: 80px;
    padding-bottom: 80px
  }

  body>.section-container.is-green.nl {
    padding-top: 72px;
    padding-bottom: 72px
  }
}
