/* BookDirect shared microsite chrome — header + footer.
   Single source of truth, loaded by BOTH the listing frontpage (index.php) and the guest
   portal (guest-portal/_layout.php + checkout.php), paired with partials/site-chrome.php.
   Keep this the ONLY place header/footer are styled so the two surfaces can never drift.

   Look & feel matches the Webflow reference (book-direct-ltd-3d152c.webflow.io):
   near-black chrome (#21201e) on a spring-wood page (#f7f2ef), body font Inter,
   headings Instrument Sans, nav accents Exo. Fonts are loaded via Google Fonts <link>
   in each shell's <head>; the stacks below fall back to system fonts until then. */

:root {
    --bd-chrome-bg: #21201e;                       /* header/footer near-black */
    --bd-chrome-text: #ffffff;
    --bd-chrome-muted: rgba(247, 242, 239, 0.75);  /* resting nav/footer text */
    --bd-chrome-line: rgba(247, 242, 239, 0.14);   /* hairlines on dark */
    --bd-page-bg: #f7f2ef;                         /* spring-wood page background */
    /* Footer colours follow the header unless the host sets them (Footer Manager). */
    --bd-footer-bg: var(--bd-chrome-bg);
    --bd-footer-text: var(--bd-chrome-text);
    --bd-footer-muted: var(--bd-chrome-muted);
    --bd-footer-line: var(--bd-chrome-line);
    --bd-font-body: 'Inter', system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
    --bd-font-heading: 'Instrument Sans', 'Inter', system-ui, sans-serif;
    --bd-font-accent: 'Exo', 'Inter', system-ui, sans-serif;
    /* --bd-font-menu / --bd-font-button exist only when a host picks them (bd_site_font_tags): the header menu reads
       var(--bd-font-menu, var(--bd-font-accent)), the footer menu and the buttons fall back to the body font. */
    /* ── Fluid layout system (Slice 1, 22 Sep 2026) ──────────────────────────────
       One content measure + one wide measure + a fluid gutter, replacing the scatter of fixed
       820/920/940/1200 caps. Content fills the frame up to a readable max; grids multiply and
       Look·Width "full" bleeds edge-to-edge (later slices). On Template 2 the frame IS the box,
       so these follow --bd-box-w below and the content fills the box (George, 22 Sep). Tunable. */
    --bd-gutter: clamp(1rem, 4vw, 4rem);   /* page side padding: 16 → 64px */
    --bd-content-w: 100%;                   /* content FILLS the frame (minus the gutter) — George, 22 Sep, Slice 5 */
    --bd-wide-w: 100%;                      /* bands / hero / footer fill the frame too */
}
/* Template 2: the frame is the box — content + bands fill the box (1200/1320), not the viewport.
   Must come after :root so it wins for the boxed template. */
body.tpl-boxed { --bd-content-w: var(--bd-box-w, 1200px); --bd-wide-w: var(--bd-box-w, 1200px); }
/* Template 4 keeps its page width (George's earlier call): content + shared chrome follow --bd-page-w
   (1120 / 1280 / 'full' = 100%), not the full-frame fill of the other non-boxed templates. */
body.tpl-onepage { --bd-content-w: var(--bd-page-w, 1120px); --bd-wide-w: var(--bd-page-w, 1120px); }
/* Templates 1 / 3: Content width (Andy via George, 14 Oct) — unset, the content fills the frame as above (the variable is
   never emitted); 1280 / 1120 caps the content column and, like Template 4's Page width, the hero / band text, the footer
   and Wide blocks with it (the home page's content sits in the wide measure). The photos stay edge to edge. Template 3:
   inside the frame beside the menu column. */
body.tpl-top, body.tpl-left { --bd-content-w: var(--bd-content-cap, 100%); --bd-wide-w: var(--bd-content-cap, 100%); }

/* Reference typography: headings in Instrument Sans everywhere (both surfaces load this
   file last, and no page sets a heading font-family, so this wins by cascade). */
h1, h2, h3, h4, h5, h6 { font-family: var(--bd-font-heading); letter-spacing: -0.01em; }
/* Form controls take the page's font (a browser gives them its own: the calendar's day numbers were Arial, 5 Nov 2026). */
button, input, select, textarea { font-family: inherit; }
/* Buttons (Fonts & Colours › Buttons, Andy via George, 5 Nov 2026): the site's call-to-action buttons, the booking card's
   included. Unpicked, the body font as before; loaded after the page styles like the heading rule above, so this wins. */
.bd-btn, .bd-submit, .bd-pay-btn, .bd-verify-btn, .bd-contact__btn, .bd-login__btn, .bd-op-btn, .bd-picker-clear,
.bd-photos-view-all, .bd-reviews-more, .gp-btn { font-family: var(--bd-font-button, var(--bd-font-body)); }
/* ONE <h1> per page (SEO basics, 19 Oct): a heading stepped down to <h2 data-bd-h1> keeps the h1's own size and spacing
   wherever no site rule styles it (zero specificity: any class or tag rule still wins). */
:where(h2[data-bd-h1]) { font-size: 2em; margin-block: 0.67em; }
/* …and a page with no heading of its own gets its title as a visually hidden <h1> (bd_site_one_h1). */
.bd-h1-sr { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; margin: 0; }

.site-header { display: flex; align-items: center; justify-content: space-between; padding: var(--bd-bar-pad, 1rem) var(--bd-gutter); background: var(--bd-chrome-bg); border-bottom: 1px solid var(--bd-chrome-line); position: relative; line-height: normal; }
.site-brand { display: flex; align-items: center; min-height: 32px; text-decoration: none; }
.site-brand:hover { text-decoration: none; }
/* Logo scales with the header: capped height, never wider than the space beside the nav. */
.site-logo { height: auto; max-height: var(--bd-logo-h, 36px); width: auto; max-width: min(220px, 45vw); object-fit: contain; display: block; }
@media (max-width: 640px) { .site-logo { max-height: 28px; max-width: 50vw; } }
.site-brand-title { font-family: var(--bd-font-heading); font-size: 1.1rem; font-weight: 700; color: var(--bd-chrome-text); letter-spacing: -0.01em; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; max-width: 60vw; }

.site-nav { display: flex; gap: 0.25rem; }
.site-nav a { font-family: var(--bd-font-menu, var(--bd-font-accent)); color: var(--bd-chrome-muted); padding: 0.4rem 0.75rem; border-radius: 6px; font-weight: 500; font-size: 0.9rem; transition: background 0.15s, color 0.15s; text-decoration: none; }
.site-nav a:hover { background: rgba(255, 255, 255, 0.08); color: var(--bd-chrome-text); text-decoration: none; }
.site-nav a.active { background: rgba(255, 255, 255, 0.13); color: var(--bd-chrome-text); font-weight: 600; }
/* Auth-state toggle: both link groups are rendered server-side; #site-nav.is-signed-in flips
   which group shows (booking.js toggles the class at checkout, no reload). Keeps the nav
   dynamic — new menu items just need .bd-auth--in or .bd-auth--out, no JS change. block works
   for both the desktop flex row and the mobile column drawer. */
.site-nav .bd-auth--in { display: none; }
.site-nav.is-signed-in .bd-auth--out { display: none; }
.site-nav.is-signed-in .bd-auth--in { display: block; }

.site-hamburger { display: none; flex-direction: column; justify-content: center; gap: 5px; width: 36px; height: 36px; background: none; border: 1px solid var(--bd-chrome-line); border-radius: 6px; cursor: pointer; padding: 7px; }
.site-hamburger span { display: block; height: 2px; background: var(--bd-chrome-text); border-radius: 2px; transition: all 0.3s; }
.site-hamburger.open span:nth-child(1) { transform: rotate(45deg) translate(5px, 5px); }
.site-hamburger.open span:nth-child(2) { opacity: 0; }
.site-hamburger.open span:nth-child(3) { transform: rotate(-45deg) translate(5px, -5px); }
.site-nav-overlay { display: none; }

.site-footer { text-align: center; padding: 1.25rem; background: var(--bd-footer-bg); color: var(--bd-footer-muted); font-size: 0.85rem; border-top: none; line-height: normal; }
/* Classic bar: the three footer columns collapse to the original centred stack
   (social, links, company, copyright); the about column and headings stay hidden. */
.site-footer-grid { display: flex; flex-direction: column; align-items: center; }
.site-footer-col--about, .site-footer-heading, .site-footer-contact { display: none; }
.site-footer-col--contact { order: 1; }
.site-footer-col--links { order: 2; }
.site-footer-links { margin-bottom: 6px; }
.site-footer-links a { font-family: var(--bd-font-menu, var(--bd-font-body)); color: var(--bd-footer-muted); text-decoration: underline; margin: 0 4px; transition: color 0.15s; }
.site-footer-links a:hover { color: var(--bd-footer-text); }
/* Footer Manager (host Design screen): social icons + Stripe company line */
.site-footer-social { display: flex; justify-content: center; gap: 14px; margin-bottom: 10px; }
.site-footer-social a { color: var(--bd-footer-muted); display: inline-flex; padding: 4px; border-radius: 6px; transition: color 0.15s, background 0.15s; }
.site-footer-social a:hover { color: var(--bd-footer-text); background: rgba(255, 255, 255, 0.08); }
.site-footer-social svg { width: 22px; height: 22px; fill: currentColor; display: block; }
.site-footer-company { margin-bottom: 6px; }
.site-footer [hidden] { display: none !important; }

/* ── Template 1 · full-width top header over the hero ─────────────────────────
   The bar floats transparent over the full-height home hero and becomes the solid
   header once you scroll (JS toggles .is-scrolled). Inner pages keep the solid bar. */
body.tpl-top .shell { position: relative; }
body.tpl-top.has-hero .site-header { position: absolute; top: 0; left: 0; right: 0; z-index: 30; background: transparent; border-bottom-color: transparent; transition: background 0.25s, box-shadow 0.25s; }
body.tpl-top.has-hero .site-header.is-scrolled { position: fixed; background: var(--bd-chrome-bg); border-bottom-color: var(--bd-chrome-line); box-shadow: 0 6px 24px rgba(0, 0, 0, 0.18); }
body.tpl-top .site-nav a, body.tpl-onepage .site-nav a, body.tpl-boxed .site-nav a { text-transform: uppercase; letter-spacing: 0.08em; font-size: 0.78rem; font-weight: 600; }
body.tpl-top .site-footer, body.tpl-onepage .site-footer, body.tpl-boxed .site-footer, body.tpl-left .site-footer { text-align: left; padding: 3rem var(--bd-gutter) 1.5rem; font-size: 0.9rem; line-height: 1.6; }
body.tpl-top .site-footer-grid, body.tpl-onepage .site-footer-grid, body.tpl-boxed .site-footer-grid, body.tpl-left .site-footer-grid { display: grid; grid-template-columns: 1.4fr 1fr 1fr; gap: 2.5rem; align-items: start; max-width: var(--bd-wide-w, 1600px); margin: 0 auto; }
body.tpl-top .site-footer-col--about, body.tpl-onepage .site-footer-col--about, body.tpl-boxed .site-footer-col--about, body.tpl-left .site-footer-col--about, body.tpl-top .site-footer-heading, body.tpl-onepage .site-footer-heading, body.tpl-boxed .site-footer-heading, body.tpl-left .site-footer-heading, body.tpl-top .site-footer-contact, body.tpl-onepage .site-footer-contact, body.tpl-boxed .site-footer-contact, body.tpl-left .site-footer-contact { display: block; }
body.tpl-top .site-footer-col--contact, body.tpl-onepage .site-footer-col--contact, body.tpl-boxed .site-footer-col--contact, body.tpl-left .site-footer-col--contact, body.tpl-top .site-footer-col--links, body.tpl-onepage .site-footer-col--links, body.tpl-boxed .site-footer-col--links, body.tpl-left .site-footer-col--links { order: 0; }
body.tpl-top .site-footer-brand, body.tpl-onepage .site-footer-brand, body.tpl-boxed .site-footer-brand, body.tpl-left .site-footer-brand { font-family: var(--bd-font-heading); font-size: 1.25rem; font-weight: 700; color: var(--bd-footer-text); margin-bottom: 0.75rem; }
body.tpl-top .site-footer-about, body.tpl-onepage .site-footer-about, body.tpl-boxed .site-footer-about, body.tpl-left .site-footer-about { margin: 0; max-width: 46ch; }
body.tpl-top .site-footer-heading, body.tpl-onepage .site-footer-heading, body.tpl-boxed .site-footer-heading, body.tpl-left .site-footer-heading { font-family: var(--bd-font-heading); color: var(--bd-footer-text); font-size: 1rem; font-weight: 700; margin-bottom: 0.75rem; }
body.tpl-top .site-footer-links, body.tpl-onepage .site-footer-links, body.tpl-boxed .site-footer-links, body.tpl-left .site-footer-links { display: flex; flex-direction: column; gap: 0.35rem; margin: 0; }
body.tpl-top .site-footer-links a, body.tpl-onepage .site-footer-links a, body.tpl-boxed .site-footer-links a, body.tpl-left .site-footer-links a { text-decoration: none; margin: 0; }
body.tpl-top .site-footer-sep, body.tpl-onepage .site-footer-sep, body.tpl-boxed .site-footer-sep, body.tpl-left .site-footer-sep { display: none; }
/* Over a photo the bar text needs a shadow to read on light images. */
body.tpl-top.has-hero .site-header:not(.is-scrolled) .site-nav a, body.tpl-top.has-hero .site-header:not(.is-scrolled) .site-brand-title { color: #fff; text-shadow: 0 1px 6px rgba(0, 0, 0, 0.55); }
body.tpl-top.has-hero .site-header:not(.is-scrolled) .site-hamburger { border-color: rgba(255, 255, 255, 0.6); }
body.tpl-top.has-hero .site-header:not(.is-scrolled) .site-hamburger span { background: #fff; box-shadow: 0 1px 4px rgba(0, 0, 0, 0.5); }
body.tpl-top .site-footer-contact a, body.tpl-onepage .site-footer-contact a, body.tpl-boxed .site-footer-contact a, body.tpl-left .site-footer-contact a { color: var(--bd-footer-muted); text-decoration: none; }
body.tpl-top .site-footer-contact a:hover, body.tpl-onepage .site-footer-contact a:hover, body.tpl-boxed .site-footer-contact a:hover, body.tpl-left .site-footer-contact a:hover { color: var(--bd-footer-text); }
body.tpl-top .site-footer-social, body.tpl-onepage .site-footer-social, body.tpl-boxed .site-footer-social, body.tpl-left .site-footer-social { justify-content: flex-start; margin: 0.9rem 0 0; }
body.tpl-top .site-footer-bottom, body.tpl-onepage .site-footer-bottom, body.tpl-boxed .site-footer-bottom, body.tpl-left .site-footer-bottom { max-width: var(--bd-wide-w, 1600px); margin: 2rem auto 0; padding-top: 1rem; border-top: 1px solid var(--bd-footer-line); display: flex; justify-content: space-between; gap: 1rem; flex-wrap: wrap; font-size: 0.8rem; }
body.tpl-top .site-footer-company, body.tpl-onepage .site-footer-company, body.tpl-boxed .site-footer-company, body.tpl-left .site-footer-company { margin: 0; }
@media (max-width: 720px) {
    body.tpl-top .site-footer-grid, body.tpl-onepage .site-footer-grid, body.tpl-boxed .site-footer-grid, body.tpl-left .site-footer-grid { grid-template-columns: 1fr; gap: 1.5rem; }
}

/* ── Template 2 · boxed site ────────────────────────────────────────────────
   The whole site sits in a centred 1200px column on a tinted backdrop: the solid bar at
   the top of the box, the home hero and the inner-page bands inside it, 3-column footer
   (shared with Templates 1 / 3 above). Below 1200px the box is simply the viewport. */
body.tpl-boxed { background: #e3e0da; background: var(--bd-box-backdrop, color-mix(in srgb, var(--bg, #f8fafc) 86%, var(--text, #1f2937) 14%)); }
body.tpl-boxed .shell, body.tpl-boxed .gp-shell { max-width: var(--bd-box-w, 1200px); margin: 0 auto; background: var(--bg); box-shadow: 0 0 48px rgba(0, 0, 0, 0.12); }
body.tpl-boxed .bd-page-band { min-height: var(--bd-band-h, clamp(200px, 24vw, 280px)); }
body.tpl-boxed .bd-page-band__inner { padding: 2.5rem 1.5rem 1.75rem; }
/* Guest-portal band: span the box (not the viewport) once the viewport is at least as wide as the box.
   The box width is a layout option (body.box-<w>, --bd-box-w); one block per allowed width. */
@media (min-width: 1000px) { body.tpl-boxed.box-1000.has-band .gp-main .bd-page-band { width: 1000px; margin-left: calc(50% - 500px); } }
@media (min-width: 1100px) { body.tpl-boxed.box-1100.has-band .gp-main .bd-page-band { width: 1100px; margin-left: calc(50% - 550px); } }
@media (min-width: 1200px) { body.tpl-boxed.box-1200.has-band .gp-main .bd-page-band { width: 1200px; margin-left: calc(50% - 600px); } }
@media (min-width: 1320px) { body.tpl-boxed.box-1320.has-band .gp-main .bd-page-band { width: 1320px; margin-left: calc(50% - 660px); } }

/* Template 1 / 2 inner pages: photo band with the page title (bar floating over it on T1). */
.bd-page-band { position: relative; min-height: var(--bd-band-h, clamp(220px, 30vw, 340px)); background-size: cover; background-position: center; display: flex; align-items: flex-end; margin: 0 0 2rem; }
.bd-page-band::before { content: ""; position: absolute; inset: 0; background: linear-gradient(180deg, rgba(0, 0, 0, 0.55) 0%, rgba(0, 0, 0, 0.2) 45%, rgba(0, 0, 0, 0.55) 100%); }
.bd-page-band__inner { position: relative; width: 100%; max-width: var(--bd-wide-w, 1600px); margin: 0 auto; padding: 5rem var(--bd-gutter) 1.75rem; }
.bd-page-band h1 { margin: 0; color: #fff; font-size: clamp(1.6rem, 3.8vw, 2.6rem); line-height: 1.15; letter-spacing: -0.02em; text-shadow: 0 2px 14px rgba(0, 0, 0, 0.45); }
/* Guest-portal pages render inside a centred 920px column — break the band out to full width and up over the column's top padding. */
body.has-band .gp-main .bd-page-band { width: 100vw; margin: -32px 0 2rem calc(50% - 50vw); }
/* Listing pages: <main> carries 2rem 1rem padding — pull the band/hero out to the edges. */
/* Bleed the band to the FRAME edge — the viewport on top/left, the box on boxed — by pulling it out of
   main's fluid gutter (was a flat -1rem that left a ~gutter-wide gap on wide screens). The gutter then
   lives on the band's own __inner, so the band spans edge-to-edge and only its content is inset. (S5) */
body.has-band main:not(.gp-main) > .bd-page-band, body.has-hero main:not(.gp-main) > .bd-hero-banner { margin: -2rem calc(-1 * var(--bd-gutter, 1rem)) 2rem; }
/* Phones (≤768px): main's top padding is 0.75rem there (listing.css), so the pull-out is 0.75rem too — −2rem pulled the hero /
   band 20px too high: over the bottom of the bar on Templates 2 / 3 (the hamburger clipped), off the page on Template 1
   (6 Oct). Before the checkout rule below, which keeps its own flush band. */
@media (max-width: 768px) { body.has-band main:not(.gp-main) > .bd-page-band, body.has-hero main:not(.gp-main) > .bd-hero-banner { margin-top: -0.75rem; } }
/* Checkout: its <main> has no padding, so the band sits flush without the pull-out. */
body.has-band main.bd-checkout-main > .bd-page-band { margin: 0 0 2rem; }
body.has-band main .bd-main > h1:first-child, body.has-band main .bd-main > h2[data-bd-h1]:first-child, body.has-band .gp-title, body.has-band .bd-checkout__h1 { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; }
/* The same heading styled by its host (the Style panel, 4 Nov) comes wrapped, <div class="bd-mod bd-mod--heading">: the wrapper
   takes the place it held, so the band hides the wrapper (its own padding / background with it) — and the hero the listing
   title's, as listing.css does the bare title (main.has-hero .hero .bd-listing-title). */
body.has-band main .bd-main > .bd-mod--heading:first-child, body.has-band main .bd-main > .bd-mod--title:first-child, main.has-hero .hero .bd-mod--title { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; }

/* ── Template 3 · left header ───────────────────────────────────────────────
   A fixed column on the left (logo, stacked links, phone/social at the bottom via the
   footer) with the hero and content filling the right. Below 900px it is the normal
   top bar with the hamburger drawer. */
@media (min-width: 900px) {
    body.tpl-left .site-header { position: fixed; top: 0; left: 0; bottom: 0; width: var(--bd-left-w, 280px); flex-direction: column; align-items: flex-start; justify-content: flex-start; padding: 2.25rem 1.75rem; border-bottom: 0; border-right: 1px solid var(--bd-chrome-line); overflow-y: auto; z-index: 30; }
    body.tpl-left .site-brand { margin-bottom: 2.5rem; min-height: 0; }
    body.tpl-left .site-logo { max-width: 200px; max-height: var(--bd-logo-h-left, 64px); }
    body.tpl-left .site-brand-title { white-space: normal; max-width: none; font-size: 1.3rem; line-height: 1.2; }
    body.tpl-left .site-hamburger { display: none; }
    body.tpl-left .site-nav { position: static; flex-direction: column; align-items: stretch; gap: 0.15rem; width: 100%; }
    body.tpl-left .site-nav a, body.tpl-left .site-nav.is-signed-in .bd-auth--in { display: block; padding: 0.55rem 0.75rem; font-size: 0.82rem; letter-spacing: 0.1em; text-transform: uppercase; border-radius: 6px; }
    body.tpl-left .site-nav .bd-auth--in { display: none; }
    body.tpl-left .site-nav.is-signed-in .bd-auth--out { display: none; }
    body.tpl-left .shell, body.tpl-left .gp-shell { padding-left: var(--bd-left-w, 280px); }
}

/* The drawer menu below 960px (was 720): between 721 and ~950 the top bar carried the property name
   AND every link in one row, and a long name or seven links ran off the right edge — every tablet in
   portrait, all three top-bar templates (George, 16 Sep 2026). 960 covers iPad portrait/landscape-mini
   and matches Template 3's own 900px column threshold. */
@media (max-width: 959px) {
    .site-header { padding: 0.75rem 1rem; }
    .site-hamburger { display: flex; }
    .site-nav { position: fixed; top: 0; right: -300px; width: min(280px, 85vw); height: calc(100 * var(--bd-vh, 1vh)); background: var(--bd-chrome-bg); box-shadow: -4px 0 20px rgba(0, 0, 0, 0.35); z-index: 1000; transition: right 0.3s ease; flex-direction: column; align-items: stretch; gap: 0; padding: 0; }
    .site-nav.open { right: 0; }
    .site-nav a { display: block; padding: 14px 22px; font-size: 1rem; border-radius: 0; border-bottom: 1px solid var(--bd-chrome-line); max-width: none; white-space: normal; }
    .site-nav-overlay { display: none; position: fixed; inset: 0; background: rgba(15, 23, 42, 0.55); z-index: 999; }
    .site-nav-overlay.open { display: block; }
}
/* ── A menu that survives any naming (grapesjs/menu-contract.md, 17 Sep 2026) ──────────────────
   One line per link with an ellipsis; what does not fit folds into "More ▾" (site-chrome.js
   bdFoldNav); when even the brand plus two links will not fit, the JS adds body.bd-nav-drawer and
   the bar becomes the same drawer the rule above shows on narrow screens. */
/* The bar only (≥960): below that the links are the drawer's, which fill its panel and wrap — this rule, later in the
   file, used to cap them at 160px there too (an empty strip right of the list, names cut short; George, 6 Oct 19:36). */
@media (min-width: 960px) { .site-nav a { white-space: nowrap; max-width: 160px; overflow: hidden; text-overflow: ellipsis; } }
/* Until the fold has fitted the menu with the real fonts and logo (bd-nav-wait: set before the bar is parsed, lifted by
   site-chrome.js, 8 Oct): the links keep their place but do not paint, so the first menu anyone sees is the final one.
   An open drawer is never hidden. */
html.bd-nav-wait .site-nav:not(.open), html.bd-nav-wait .site-nav__more { visibility: hidden; }
.site-nav__more { position: relative; display: flex; align-items: center; }
.site-nav__more-btn { font-family: var(--bd-font-menu, var(--bd-font-accent)); color: var(--bd-chrome-muted); background: none; border: 0; padding: 0.4rem 0.75rem; border-radius: 6px; cursor: pointer; font-weight: 500; font-size: 0.9rem; white-space: nowrap; line-height: inherit; }
body.tpl-top .site-nav__more-btn, body.tpl-onepage .site-nav__more-btn, body.tpl-boxed .site-nav__more-btn { text-transform: uppercase; letter-spacing: 0.08em; font-size: 0.78rem; font-weight: 600; }
body.nav-normal .site-nav__more-btn { text-transform: none; letter-spacing: 0; font-size: 0.9rem; font-weight: 500; }
.site-nav__more-btn:hover, .site-nav__more.is-open .site-nav__more-btn { background: rgba(255, 255, 255, 0.08); color: var(--bd-chrome-text); }
body.tpl-top.has-hero .site-header:not(.is-scrolled) .site-nav__more-btn { color: #fff; text-shadow: 0 1px 6px rgba(0, 0, 0, 0.55); }
.site-nav__more-list { display: none; position: absolute; top: calc(100% + 8px); right: 0; min-width: 200px; max-width: 320px; background: var(--bd-chrome-bg); border: 1px solid var(--bd-chrome-line); border-radius: 10px; box-shadow: 0 14px 36px rgba(0, 0, 0, 0.28); padding: 6px; z-index: 1200; flex-direction: column; gap: 2px; }
.site-nav__more.is-open .site-nav__more-list { display: flex; }
.site-nav__more-list a { max-width: none; display: block; padding: 0.55rem 0.75rem; text-shadow: none; }
body.tpl-top.has-hero .site-header:not(.is-scrolled) .site-nav__more-list { background: rgba(24, 24, 24, 0.94); border-color: rgba(255, 255, 255, 0.12); }
body.tpl-top.has-hero .site-header:not(.is-scrolled) .site-nav__more-list a { color: #fff; }
/* The forced drawer: the ≤959px rules again, keyed on the class the JS sets. */
body.bd-nav-drawer .site-header { padding: 0.75rem 1rem; }
body.bd-nav-drawer .site-hamburger { display: flex; }
body.bd-nav-drawer .site-nav { position: fixed; top: 0; right: -300px; width: min(280px, 85vw); height: calc(100 * var(--bd-vh, 1vh)); background: var(--bd-chrome-bg); box-shadow: -4px 0 20px rgba(0, 0, 0, 0.35); z-index: 1000; transition: right 0.3s ease; flex-direction: column; align-items: stretch; gap: 0; padding: 0; }
body.bd-nav-drawer .site-nav.open { right: 0; }
body.bd-nav-drawer .site-nav a { display: block; padding: 14px 22px; font-size: 1rem; border-radius: 0; border-bottom: 1px solid var(--bd-chrome-line); max-width: none; white-space: normal; }
body.bd-nav-drawer .site-nav-overlay { display: none; position: fixed; inset: 0; background: rgba(15, 23, 42, 0.55); z-index: 999; }
body.bd-nav-drawer .site-nav-overlay.open { display: block; }
/* Template 3's column: one line per link, and the list scrolls inside the column once it outgrows the screen. */
@media (min-width: 900px) {
    body.tpl-left .site-nav { flex: 1 1 auto; min-height: 0; overflow-y: auto; }
    body.tpl-left .site-nav a { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; max-width: 100%; }
}

/* ── Layout options (Design screen: per-template controls in Header Manager / Site
   Customizer / Footer Manager). Rendered as body classes + CSS variables by
   partials/site-chrome.php (bd_site_layout_*) and previewed by site-chrome.js. Variables:
   --bd-bar-pad --bd-logo-h --bd-logo-h-left --bd-left-w --bd-hero-vh --bd-hero-k --bd-hero-shade
   --bd-band-h --bd-box-w --bd-box-backdrop --bd-page-w --bd-desc-fold. */
@media (min-width: 960px) {
    /* Menu alignment on the top bars (Template 3's column is excluded). Centred holds only while the
       whole menu fits between two brand-wide columns; otherwise site-chrome.js sets
       body.bd-nav-center-off and the bar is the classic one for that viewport — brand left, menu right,
       More for the rest (grapesjs/menu-contract.md). The side tracks stay 1fr (minimum = the brand):
       before the script runs, minmax(0, 1fr) would lay a long brand over the menu (or, capped, shrink
       it to nothing) — measured 30 Sep; the script measures on the classic bar, never on this grid. */
    body.nav-center:not(.tpl-left):not(.bd-nav-center-off) .site-header { display: grid; grid-template-columns: 1fr auto 1fr; }
    body.nav-center:not(.tpl-left):not(.bd-nav-center-off) .site-brand { justify-self: start; }
    body.nav-center:not(.tpl-left):not(.bd-nav-center-off) .site-nav { justify-self: center; }
    body.nav-spread:not(.tpl-left) .site-nav { flex: 1; justify-content: space-evenly; margin-left: 1.5rem; }
    /* Link style: normal case instead of the uppercase small caps. */
    body.nav-normal .site-nav a { text-transform: none; letter-spacing: 0; font-size: 0.9rem; font-weight: 500; }
}
/* Template 1: the bar scrolls away with the hero instead of turning solid. */
body.tpl-top.bar-hide .site-header.is-scrolled { position: absolute; background: transparent; border-bottom-color: transparent; box-shadow: none; }
body.tpl-top.bar-hide.has-hero .site-header.is-scrolled .site-nav a, body.tpl-top.bar-hide.has-hero .site-header.is-scrolled .site-brand-title { color: #fff; text-shadow: 0 1px 6px rgba(0, 0, 0, 0.55); }
/* Template 3: column alignment and side. */
@media (min-width: 900px) {
    body.tpl-left.left-center .site-header { align-items: center; text-align: center; }
    body.tpl-left.left-center .site-nav a { text-align: center; }
    body.tpl-left.left-right .site-header { left: auto; right: 0; border-right: 0; border-left: 1px solid var(--bd-chrome-line); }
    body.tpl-left.left-right .shell, body.tpl-left.left-right .gp-shell { padding-left: 0; padding-right: var(--bd-left-w, 280px); }
}
/* Template 2: flat box / rounded box (clip-path keeps sticky children working). */
body.tpl-boxed.box-flat .shell, body.tpl-boxed.box-flat .gp-shell { box-shadow: none; }
@media (min-width: 1000px) {
    body.tpl-boxed.box-rounded .shell, body.tpl-boxed.box-rounded .gp-shell { border-radius: 18px; clip-path: inset(0 round 18px); margin-top: 1.5rem; margin-bottom: 1.5rem; min-height: calc(100 * var(--bd-vh, 1vh) - 3rem); }
}
/* Footer: the centred stack instead of the three columns (all templates). */
body.footer-stack .site-footer { text-align: center; padding: 1.25rem; font-size: 0.85rem; line-height: normal; }
body.footer-stack .site-footer-grid { display: flex; flex-direction: column; align-items: center; gap: 0; max-width: none; }
body.footer-stack .site-footer-col--about, body.footer-stack .site-footer-heading, body.footer-stack .site-footer-contact { display: none; }
body.footer-stack .site-footer-col--contact { order: 1; }
body.footer-stack .site-footer-col--links { order: 2; }
body.footer-stack .site-footer-links { display: block; margin: 0 0 6px; }
body.footer-stack .site-footer-links a { text-decoration: underline; margin: 0 4px; }
body.footer-stack .site-footer-sep { display: inline; }
body.footer-stack .site-footer-social { justify-content: center; margin: 0 0 10px; }
body.footer-stack .site-footer-bottom { max-width: none; margin: 0; padding-top: 0; border-top: 0; display: block; }
body.footer-stack .site-footer-company { margin: 0 0 6px; }

/* ── Colour guard (George, 7 Oct — the colours must really show) ─────────────────────────────
   The white surfaces keep their white, but their text follows the site's Text / Accent. When one of those is
   unreadable on white (partials/site-chrome.php bd_site_colour_guard_classes: under 4.5:1 — 2158's white text made
   its booking calendar invisible), these body classes turn it to a dark ink inside them; the host avatar's initial
   (white on the Accent) the same way. Sites whose colours read fine get neither class. The booking card is not one of
   them any more: it wears the site's own colours (listing.css, 13 Oct), so its contrast is the site's. On Template 4
   the checkout form that opens inside it (.bd-pay-panel) is still light-only, so on a light-text site it gets a white
   panel of its own, the way /checkout is. */
body.bd-guard-text :is(.bd-pay-panel, .bd-login__card, .bd-processing-box, .bd-card-element, main.bd-checkout-main, .gp-card, .gp-booking, .gp-thread, .gp-inbox__list, .gp-composer textarea, .gp-field input) { --text: #1e293b; color: #1e293b; }
body.bd-guard-accent :is(.bd-pay-panel, .bd-login__card, .bd-processing-box, .bd-card-element, main.bd-checkout-main, .gp-card, .gp-booking, .gp-thread, .gp-inbox__list, .gp-btn--outline) { --primary: #1e293b; }
body.bd-guard-accent .bd-host-avatar { color: #1e293b; }
body.bd-guard-text .bd-pay-panel { --bd-card: #fff; background: var(--bd-card); padding: 1rem; border-radius: 10px; }

/* Body background on Templates 1 / 3 / 4 (George, 7 Oct — on every template): an own colour paints the canvas around the
   content — the page's side gutters (T1 / T3: <main> keeps the Page background inside its padding) or the space around
   the one-page column (T4) — while Page background stays on the content. "Same as the page" (the default) adds nothing.
   Template 2's Body background is its backdrop (boxBackdrop). The checkout keeps its own white page. */
body.body-own:not(.tpl-boxed) { background: var(--bd-body-bg); }
body.body-own:is(.tpl-top, .tpl-left) main:not(.bd-checkout-main) { background: var(--bg); background-clip: content-box; }
body.body-own.tpl-onepage main > .hero { background: var(--bg); padding-left: 1.5rem; padding-right: 1.5rem; padding-bottom: 1.5rem; }

/* ── Host-typed titles never run off the page (Andy, 22 Oct: a page named with 60 X's, no spaces, ran its band heading off the
   right edge; George 19:03). A word with no break point wraps inside itself, only when nothing else fits: the rule the details
   column already has (listing.css), now on every title this file draws. That means the page band heading, the guest-portal
   title, the one page's section headings, Template 3's column brand, the drawer's links (the bar's keep their one-line ellipsis)
   and the whole footer, whose grid columns may now shrink below a word instead of pushing the next column off the page. */
.bd-page-band__inner, .site-footer-col { min-width: 0; }
.bd-page-band h1, .gp-title, .bd-op-heading, .site-footer {
    overflow-wrap: anywhere;
    word-break: break-word;   /* older WebKit, where `anywhere` is not understood */
}
@media (min-width: 900px) { body.tpl-left .site-brand-title { overflow-wrap: anywhere; word-break: break-word; } }
@media (max-width: 959px) { .site-nav a { overflow-wrap: anywhere; word-break: break-word; } }
body.bd-nav-drawer .site-nav a { overflow-wrap: anywhere; word-break: break-word; }
