/* 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 } }