/* =====================================================================
   TOKENS
   ===================================================================== */
:root {
  /* Dark surfaces: refined charcoal, matches Ennios's brand primary (#333) but
     a hair deeper for typographic contrast on screen. */
  --ink: #2A2A2A;
  --ink-soft: #3A3A3A;
  --ink-bevel: #4A4A4A;

  /* Light surfaces: clean white with one subtle off-white step. */
  --paper: #FFFFFF;
  --paper-alt: #F6F4F0;
  --rule: #E6E3DE;

  /* Body text */
  --text: #2A2A2A;
  --text-soft: #6B6B6B;

  /* Cream: used for body copy on dark surfaces (so it doesn't shout). */
  --cream: #F2EEE6;
  --cream-soft: #E8E4DA;

  /* Gold: the single accent, used sparingly and only on dark surfaces. */
  --gold: #C9A063;
  --gold-soft: #A88450;
  --gold-glow: rgba(201, 160, 99, .38);

  /* Kept defined but no longer applied (left here so the token can be
     reintroduced for a seasonal palette without re-plumbing the file. */
  --maroon: #5E120B;
  --forest: #0C3D1C;

  --display: 'belda-normal', 'Times New Roman', 'Georgia', serif;
  --display-cond: 'belda-condensed', 'belda-normal', serif;
  --body: 'General Sans', -apple-system, system-ui, 'Segoe UI', sans-serif;
  --sidebar-w: 320px;
  --maxw: 1280px;
  --ease: cubic-bezier(.22, .61, .36, 1);
}

* { box-sizing: border-box; margin: 0; padding: 0; }

html, body { height: 100%; }
html {
  /* Deliberately NO global `scroll-behavior: smooth`. On a physical
     mouse wheel it animates every single wheel notch, so each click
     "snaps" to its destination instead of scrolling continuously —
     reads as steppy/clunky on a wheel mouse (trackpads mask it).
     Native wheel scrolling is the responsive default and what people
     expect. In-page anchor jumps are smoothed in JS for the specific
     links that benefit (see app.js), so "jump to section" still glides
     without hijacking the wheel. */
  scroll-padding-top: 24px;
  /* Clip any off-canvas content (booking panels, slide-out drawers,
     marquee tracks) so it can't push the document wider than the
     viewport. `clip` is the modern equivalent of `hidden` that does
     NOT establish a new scrolling context, so position:sticky on the
     hero and the scroll-stack pattern keep working. Without this,
     the SevenRooms booking panel sitting at translateX(100%) was
     adding ~390px to body scrollWidth on mobile and breaking every
     viewport-relative calculation (sidebar fixed positioning,
     bottom-nav width, hero sticky thresholds, the home-feature
     image alignment, etc.). */
  overflow-x: clip;
}
body {
  overscroll-behavior-y: contain;
  overflow-x: clip;
}
body {
  font-family: var(--body);
  font-weight: 400;
  font-size: 14.5px;
  line-height: 1.55;
  color: var(--text);
  background: var(--paper);
  font-feature-settings: 'ss01' 1, 'ss02' 1, 'cv11' 1;
  -webkit-font-smoothing: antialiased;
  text-rendering: optimizeLegibility;
}
img, svg { display: block; max-width: 100%; }
a { color: inherit; text-decoration: none; }
button { font: inherit; color: inherit; background: none; border: 0; cursor: pointer; }

/* =====================================================================
   LENIS smooth-scroll support classes (added by the library on <html>).
   Deliberately NO `.lenis.lenis-smooth iframe { pointer-events: none }`
   rule — the stock Lenis CSS ships it, but it would disable clicks
   inside the SevenRooms booking iframe, which the live PPC depends on.
   We pause Lenis when the booking panel opens anyway, so we don't need
   it. [data-lenis-prevent] marks any inner scroller (e.g. the booking
   iframe wrap) that should keep its own native scroll.
   ===================================================================== */
html.lenis, html.lenis body { height: auto; }
.lenis.lenis-smooth { scroll-behavior: auto !important; }
.lenis.lenis-smooth [data-lenis-prevent] { overscroll-behavior: contain; }
.lenis.lenis-stopped { overflow: hidden; }

/* =====================================================================
   SHARED PRIMITIVES
   ===================================================================== */
.eyebrow {
  font-family: var(--body);
  font-weight: 600;
  font-size: 12px;
  letter-spacing: .22em;
  text-transform: uppercase;
  color: var(--gold);
}
.eyebrow.dark { color: var(--text-soft); letter-spacing: .28em; }
.stars {
  letter-spacing: .35em;
  color: var(--gold);
  font-size: 14px;
}
h1, h2, h3, h4 {
  font-family: var(--display);
  font-weight: 400;
  color: inherit;
  letter-spacing: -0.012em;
  line-height: 1.05;
  /* Balance heading line lengths so styled fragments (e.g. an italic
     gold <em> at the end of an H2) don't end up alone on their own
     line. Native CSS — silently no-op on older browsers, takes effect
     in Chrome, Edge, Safari, Firefox 121+. */
  text-wrap: balance;
}
h1 { font-weight: 300; }
h3, h4 { font-weight: 500; letter-spacing: -0.005em; }
.display-1 { font-size: clamp(40px, 6.2vw, 88px); }
.display-2 { font-size: clamp(32px, 4.4vw, 60px); }
.display-3 { font-size: clamp(24px, 2.4vw, 34px); }
em.script, .script,
h1 em, h2 em, h3 em {
  font-family: var(--display);
  font-style: italic;
  font-weight: 400;
  color: var(--gold);
}
.lede {
  font-size: clamp(14.5px, 1.02vw, 17px);
  line-height: 1.65;
  color: var(--text-soft);
  font-weight: 400;
  max-width: 50ch;
}

.btn {
  display: inline-flex;
  align-items: center;
  gap: 14px;
  padding: 16px 30px;
  border: 1px solid var(--gold);
  color: var(--cream);
  font-family: var(--body);
  font-weight: 500;
  font-size: 13px;
  letter-spacing: .22em;
  text-transform: uppercase;
  background: transparent;
  transition: background .28s var(--ease), color .28s var(--ease), letter-spacing .28s var(--ease);
}
.btn:hover { background: var(--gold); color: var(--ink); letter-spacing: .26em; }
.btn.solid { background: var(--gold); color: var(--ink); }
.btn.solid:hover { background: var(--cream); border-color: var(--cream); color: var(--ink); }
.btn.ghost { color: var(--text); border-color: var(--ink); }
.btn.ghost:hover { background: var(--ink); color: var(--cream); }

/* Default .btn text color is cream — fine on dark backgrounds (hero,
   cta-arch, reservation strip, crabby, home-heritage-strip), invisible
   on light/paper backgrounds. The selectors below override the
   outline (non-solid) .btn to use dark text + dark border in every
   light-background container, so the text is readable. .btn.solid
   (gold background + ink text) always reads either way and is left
   alone. */
.welcome .btn:not(.solid),
.home-feature .btn:not(.solid),
.story-copy .btn:not(.solid),
.heritage-timeline .btn:not(.solid),
.timeline-event .btn:not(.solid),
.timeline-event__cta .btn:not(.solid),
.old-town-strip .btn:not(.solid),
.experience-grid .btn:not(.solid),
.experience-tile .btn:not(.solid),
.group-bookings .btn:not(.solid),
.group-tile .btn:not(.solid),
.contact-info .btn:not(.solid),
.offer-card .btn:not(.solid),
.offers-foot .btn:not(.solid),
.menu-panel .btn:not(.solid) {
  color: var(--ink);
  border-color: var(--ink);
}
.welcome .btn:not(.solid):hover,
.home-feature .btn:not(.solid):hover,
.story-copy .btn:not(.solid):hover,
.heritage-timeline .btn:not(.solid):hover,
.timeline-event .btn:not(.solid):hover,
.timeline-event__cta .btn:not(.solid):hover,
.old-town-strip .btn:not(.solid):hover,
.experience-grid .btn:not(.solid):hover,
.experience-tile .btn:not(.solid):hover,
.group-bookings .btn:not(.solid):hover,
.group-tile .btn:not(.solid):hover,
.contact-info .btn:not(.solid):hover,
.offer-card .btn:not(.solid):hover,
.offers-foot .btn:not(.solid):hover,
.menu-panel .btn:not(.solid):hover {
  background: var(--ink);
  color: var(--cream);
  border-color: var(--ink);
}

/* Arch primitive: single source of truth.
   Matches the Ennios building's Victorian-warehouse window shape:
   a tall portrait rectangle (3:5) with a SHALLOW segmental arch on top,
   not a Roman half-circle. Vertical radius is 12% of height so the
   arch rise is roughly 20% of the box width (a chord of a large circle).
   Combined with 50% horizontal radius this produces a flattened ellipse
   cap that reads as the same shape as the windows above the awnings. */
.arch {
  border-radius: 50% 50% 0 0 / 12% 12% 0 0;
  overflow: hidden;
  isolation: isolate;
}
.arch-img {
  position: relative;
  aspect-ratio: 3 / 5;
  background: #2A2220;
}
.arch-img img {
  width: 100%; height: 100%; object-fit: cover;
}

/* =====================================================================
   SIDEBAR (desktop) / DRAWER (mobile)
   ===================================================================== */
.sidebar {
  position: fixed;
  inset: 0 auto 0 0;
  width: var(--sidebar-w);
  background: var(--ink);
  color: var(--cream);
  display: flex;
  flex-direction: column;
  align-items: stretch;
  padding: 36px 30px 32px;
  z-index: 60;
  border-right: 1px solid rgba(244, 236, 222, .06);
  transition:
    width .45s var(--ease),
    padding .45s var(--ease);
  /* Last-resort scroll safety: if the viewport is genuinely too short
     to fit the compressed sidebar (rare, but possible at <600px tall),
     allow vertical scrolling within the sidebar rather than clipping
     the foot. Scrollbar is hidden via the WebKit pseudo-element below
     so the chrome doesn't intrude on the design. */
  overflow-y: auto;
  scrollbar-width: none;
}
.sidebar::-webkit-scrollbar { display: none; }
.sidebar::before {
  content: '';
  position: absolute;
  inset: 0;
  background:
    radial-gradient(120% 60% at 50% 0%, rgba(201, 160, 99, .06), transparent 60%),
    radial-gradient(80% 50% at 50% 100%, rgba(255, 255, 255, .04), transparent 65%);
  pointer-events: none;
}
.sidebar > * { position: relative; }

.brand {
  display: block;
  text-align: center;
  margin: 6px auto 18px;
  padding: 0 6px;
}
.brand img {
  width: 100%;
  max-width: 240px;
  height: auto;
  margin: 0 auto;
  filter: brightness(0) invert(1);
}

.nav {
  list-style: none;
  flex: 1;
  display: flex;
  flex-direction: column;
  gap: 2px;
  margin-top: 12px;
}
.nav a {
  display: flex;
  align-items: center;
  gap: 14px;
  padding: 9px 18px;
  font-size: 14px;
  letter-spacing: .06em;
  color: var(--cream);
  border-left: 1px solid transparent;
  transition: border-color .25s var(--ease), color .25s var(--ease), padding-left .25s var(--ease);
}
.nav a:hover, .nav a.active {
  border-left-color: var(--gold);
  color: var(--gold);
  padding-left: 16px;
}
.nav-icon {
  flex-shrink: 0;
  opacity: .75;
  transition: opacity .25s var(--ease), color .25s var(--ease);
}
.nav a:hover .nav-icon,
.nav a.active .nav-icon { opacity: 1; }
.nav-label { white-space: nowrap; }

.sidebar-foot {
  margin-top: 18px;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 10px;
  padding-top: 18px;
  border-top: 1px solid rgba(244, 236, 222, .08);
}
.sidebar-foot .phone-badge {
  width: 44px; height: 44px;
  border-radius: 50%;
  background: transparent;
  border: 1px solid var(--gold);
  display: grid; place-items: center;
  color: var(--gold);
}
.sidebar-foot .phone-num {
  font-family: var(--body);
  font-weight: 500;
  font-size: 14px;
  color: var(--cream);
  letter-spacing: .02em;
}
.sidebar-foot .phone-hint {
  font-size: 10px;
  letter-spacing: .25em;
  text-transform: uppercase;
  color: rgba(244, 236, 222, .55);
}
.sidebar-foot .socials {
  display: flex; gap: 10px;
  margin-top: 8px;
}
.sidebar-foot .socials a {
  width: 30px; height: 30px;
  border-radius: 50%;
  display: grid; place-items: center;
  color: var(--cream);
  border: 1px solid rgba(244, 236, 222, .18);
  transition: border-color .25s var(--ease), color .25s var(--ease);
}
.sidebar-foot .socials a:hover { color: var(--gold); border-color: var(--gold); }

/* Mobile top bar (hidden by default on desktop) */
.topbar { display: none; }
.drawer-scrim { display: none; }

/* =====================================================================
   MAIN
   ===================================================================== */
main {
  margin-left: var(--sidebar-w);
  min-height: 100vh;
  transition: margin-left .45s var(--ease);
}

/* =====================================================================
   HERO
   ===================================================================== */
.hero {
  position: relative;
  height: 100vh;
  min-height: 660px;
  max-height: 980px;
  overflow: hidden;
  isolation: isolate;
  color: var(--cream);
}
.hero-slides {
  /* Extends 15% above the hero so the parallax translate (image moves
     slightly downward as the user scrolls down — slower than content)
     never reveals a gap at the hero top. The hero has overflow: hidden. */
  position: absolute;
  top: -15%; bottom: 0;
  left: 0; right: 0;
}
/* Legacy: image slides (still used as a fallback if no .hero-video) */
.hero-slide {
  position: absolute; inset: 0;
  background-size: cover;
  background-position: center;
  opacity: 0;
  transition: opacity 1.4s var(--ease), transform 12s linear;
  transform: scale(1.04);
}
.hero-slide.active {
  opacity: 1;
  transform: scale(1.12);
}

/* Hero video sequencer: dual-buffer crossfade.
   Two <video> elements stacked; the one with .is-active is opaque,
   the other (preloading the next clip) is hidden. On 'ended' the JS
   flips .is-active between them — the CSS opacity transition does
   the actual fade, eliminating the poster flash that a single-element
   src-swap caused. object-fit:cover crops the 16:9 source to the
   hero's display aspect. */
.hero-video {
  position: absolute; inset: 0;
  width: 100%; height: 100%;
  object-fit: cover;
  background: var(--ink);
  display: block;
}

/* Dark overlay over whatever media is below (image slide or video).
   Previously lived on .hero-slide::after; promoted to its own element
   so the tint is rendered exactly once regardless of media type. */
.hero-tint {
  position: absolute; inset: 0;
  pointer-events: none;
  background:
    linear-gradient(180deg, rgba(27,22,20,.35) 0%, rgba(27,22,20,.05) 30%, rgba(27,22,20,.55) 100%),
    radial-gradient(80% 60% at 50% 50%, transparent 30%, rgba(27,22,20,.55) 100%);
}
/* Subpage heroes use background-image .hero-slide divs (no .hero-tint
   element). Without an overlay the headline competes with whatever
   slide frame is on screen. ::after on .hero-slides supplies the same
   tint where it's needed. The :has(.hero-slide) guard means the rule
   doesn't fire on the homepage, whose .hero-slides contains a <video>
   plus a real .hero-tint sibling. */
.hero-slides:has(.hero-slide)::after {
  content: '';
  position: absolute;
  inset: 0;
  pointer-events: none;
  background:
    linear-gradient(180deg, rgba(27,22,20,.55) 0%, rgba(27,22,20,.25) 35%, rgba(27,22,20,.80) 100%),
    radial-gradient(80% 60% at 50% 50%, transparent 25%, rgba(27,22,20,.55) 100%);
}
.hero-inner {
  position: relative;
  height: 100%;
  display: grid;
  /* Mobile default: arch sits centred (vertically and horizontally).
     Desktop override below moves it to bottom-right so the video can
     breathe at full size. */
  place-items: center;
  padding: 72px 36px 130px;
}
.hero-arch {
  /* Same segmental-arch shape as the building windows.
     Compact by default — the lede paragraph is hidden so the arch only
     needs to hold the small star row, the headline, and the CTA. */
  position: relative;
  width: min(480px, 80vw);
  aspect-ratio: 4 / 5;
  padding: clamp(28px, 3.5vw, 48px);
  display: flex;
  flex-direction: column;
  justify-content: center;
  align-items: center;
  text-align: center;
  gap: 18px;
  border-radius: 50% 50% 8px 8px / 16% 16% 8px 8px;
  background: rgba(27, 22, 20, .42);
  backdrop-filter: blur(8px) saturate(1.05);
  -webkit-backdrop-filter: blur(8px) saturate(1.05);
  border: 1px solid var(--gold-glow);
  box-shadow: inset 0 0 0 1px rgba(244,236,222,.04), 0 30px 80px rgba(0,0,0,.35);
}
.hero-arch::before {
  content: '';
  position: absolute;
  inset: 8px;
  border: 1px solid rgba(244,236,222,.08);
  border-radius: 50% 50% 4px 4px / 16% 16% 4px 4px;
  pointer-events: none;
}
.hero-arch h1 {
  font-size: clamp(28px, 3.6vw, 44px);
  font-weight: 400;
}
.hero-arch h1 em {
  font-style: italic;
  color: var(--gold);
  font-weight: 500;
}
/* Lede paragraph is kept in the DOM (it's the meaningful subhead for
   search engines and assistive tech) but hidden visually — the
   headline carries the message on its own and the visible page lets
   the video take centre stage. */
.hero-arch .lede {
  position: absolute;
  width: 1px; height: 1px;
  padding: 0; margin: -1px;
  overflow: hidden;
  clip: rect(0, 0, 0, 0);
  white-space: nowrap;
  border: 0;
}

/* Secondary "View the menus" style link sitting under the primary
   Book a table CTA in the hero arch. Italic, gold, with an underline
   on hover — quietly classy rather than a competing button. */
.hero-arch__sublink {
  font-family: var(--display);
  font-style: italic;
  font-size: 14px;
  color: var(--gold);
  text-decoration: none;
  letter-spacing: 0;
  margin-top: -4px;
  border-bottom: 1px solid transparent;
  padding-bottom: 1px;
  transition: border-color .25s var(--ease);
}
.hero-arch__sublink:hover { border-bottom-color: var(--gold); }

/* Desktop: the arch becomes a smaller bottom-right inset so the video
   reads as the primary element. Compact width (~360px), the headline
   sized to properly fill the arch (~34px). Anchored to the
   bottom-right corner with generous padding so it doesn't kiss the
   screen edge.
   721px (not 720) so this never overlaps the max-width:720 mobile
   blocks — at exactly 720px both used to apply simultaneously. */
@media (min-width: 721px) {
  .hero-inner {
    place-items: end end;
    padding: 96px 72px 88px;
  }
  .hero-arch {
    width: 360px;
    aspect-ratio: 4 / 5;
    padding: 32px 32px 40px;
    gap: 18px;
  }
  /* Headline sized so it wraps to ~four lines inside the arch:
     "An / Italian welcome / on the / old waterfront" — properly
     fills the vertical space rather than sitting small in the middle. */
  .hero-arch h1 {
    font-size: 44px;
    line-height: 1.04;
    letter-spacing: -0.018em;
  }
  .hero-arch .stars { font-size: 11px; letter-spacing: .42em; }
}

/* Mobile: drop the glass arch entirely — the headline floats over the
   slightly darker video tint, much bigger, no glass chrome. Lets the
   video carry the moment without a frame fighting it. */
@media (max-width: 720px) {
  /* Stop the hero spilling below the viewport on load. Mobile 100vh
     includes the address-bar height before it collapses, so the
     loaded hero ended up taller than the visible area. 85vh keeps a
     peek of the next section visible (good "there's more below"
     signal) and the max-height caps it on taller phones. */
  .hero {
    height: 85vh;
    min-height: 520px;
    max-height: 720px;
  }
  /* Vertically + horizontally centred — the logo (now after the
     headline) and the H1 read as one composed block in the middle of
     the hero. */
  .hero-inner {
    place-items: center;
    padding: 0 24px;
  }
  .hero-arch {
    width: 100%;
    max-width: 100%;
    aspect-ratio: auto;
    padding: 0;
    gap: 24px;
    background: transparent;
    backdrop-filter: none;
    -webkit-backdrop-filter: none;
    border: 0;
    box-shadow: none;
    border-radius: 0;
  }
  .hero-arch::before { display: none; }
  /* Bigger headline so it wraps to ~four lines:
     "An / Italian welcome / on the / old waterfront". */
  .hero-arch h1 {
    font-size: clamp(46px, 12.5vw, 68px);
    line-height: 1.02;
    text-shadow: 0 2px 24px rgba(0,0,0,.55);
  }
  /* Smaller logo, sits below the headline. */
  .hero-logo {
    height: 32px;
    margin: 4px auto 0;
  }
  /* Slightly deeper tint on mobile so the white headline stays legible
     against any frame of the video. */
  .hero-tint {
    background:
      linear-gradient(180deg, rgba(27,22,20,.55) 0%, rgba(27,22,20,.40) 30%, rgba(27,22,20,.75) 100%),
      radial-gradient(70% 55% at 50% 45%, rgba(27,22,20,.10) 30%, rgba(27,22,20,.55) 100%);
  }

  /* RESERVATION STRIP — mobile-only compact layout.
     6-col grid: label spans full width, check-in/out take 3 cols each
     on row 2, then adults/children/book-a-room sit on row 3 as
     2+2+2. Uses display:contents on the inner wrappers so the field
     and CTA elements participate directly in the strip's grid. */
  .reservation-inner {
    display: grid;
    grid-template-columns: repeat(6, 1fr);
    gap: 12px 10px;
    align-items: end;
  }
  .reservation-label {
    grid-column: 1 / -1;
    margin: 0;
  }
  .reservation-fields,
  .reservation-ctas {
    display: contents;
  }
  .reservation-fields .field:nth-child(1) { grid-column: span 3; }
  .reservation-fields .field:nth-child(2) { grid-column: span 3; }
  .reservation-fields .field:nth-child(3) { grid-column: span 2; }
  .reservation-fields .field:nth-child(4) { grid-column: span 2; }
  .reservation-ctas .btn.solid {
    grid-column: span 2;
    margin: 0;
    padding: 14px 8px;
    font-size: 11px;
    letter-spacing: .16em;
    white-space: nowrap;
    align-self: end;
  }
  /* Tighten the field internals so adults/children fit in 2 cols each. */
  .reservation .field { margin: 0; }
  .reservation .field select,
  .reservation .field input { padding: 8px 0; font-size: 15px; }
  .reservation .field label { font-size: 9.5px; letter-spacing: .18em; }
}

/* SUBTLE FILM GRAIN over the hero video.
   Inline SVG with feTurbulence: a 200x200 fractal-noise pattern
   tiled across the hero. Low opacity + overlay blend mode adds
   organic texture without darkening or noisifying the image. Static
   (not animated) so there's no CPU cost beyond first paint, no
   accessibility concern. */
.hero::after {
  content: '';
  position: absolute;
  inset: 0;
  pointer-events: none;
  z-index: 2;
  background-image: url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='220' height='220'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='2' stitchTiles='stitch'/%3E%3CfeColorMatrix values='0 0 0 0 0  0 0 0 0 0  0 0 0 0 0  0 0 0 .55 0'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E");
  background-size: 220px 220px;
  opacity: .18;
  mix-blend-mode: overlay;
}

.hero-meta {
  position: absolute;
  bottom: 36px;
  left: 0; right: 0;
  display: flex;
  justify-content: space-between;
  align-items: flex-end;
  padding: 0 48px;
  pointer-events: none;
  color: rgba(244, 236, 222, .8);
  font-size: 12px;
  letter-spacing: .22em;
  text-transform: uppercase;
}
/* =====================================================================
   RESERVATION STRIP
   ===================================================================== */
.reservation {
  background: var(--ink);
  color: var(--cream);
  padding: 38px clamp(32px, 5vw, 72px);
  position: relative;
  /* Rounded top corners give it the "card sliding up over the hero"
     look. Desktop sticky behaviour below flattens these once pinned. */
  border-top-left-radius: 18px;
  border-top-right-radius: 18px;
  /* Gold "card behind" peek — a 2px-above box-shadow that follows the
     rounded top corners. Using box-shadow (not a ::after with negative
     z-index) is the only way to keep the gold strictly BEHIND the
     reservation's ink background. A negative-z-index pseudo would render
     on top of the background once the reservation forms a stacking
     context (which it does via sticky + z-index below). */
  box-shadow: 0 -2px 0 0 var(--gold);
  transition: border-radius .4s ease, box-shadow .35s ease;
}
.reservation::before {
  content: '';
  position: absolute;
  inset: 0;
  background:
    linear-gradient(180deg, rgba(0,0,0,.25), transparent 30%, rgba(201,160,99,.06) 100%);
  pointer-events: none;
  border-top-left-radius: inherit;
  border-top-right-radius: inherit;
}
/* Pinned state: hide the gold peek as the corners flatten. */
.reservation.is-pinned { box-shadow: 0 0 0 0 transparent; }
.reservation-inner {
  position: relative;
  max-width: var(--maxw);
  margin: 0 auto;
  display: grid;
  grid-template-columns: auto 1fr auto;
  gap: 32px;
  align-items: center;
}
.reservation-label {
  font-family: var(--display);
  font-style: italic;
  font-size: 22px;
  letter-spacing: -0.01em;
}
.reservation-fields {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: 18px;
}
/* The .reservation--tables variant (restaurant page) has 2 fields
   (date + time) — party size is collected by the SevenRooms widget
   inside the slide-out panel, so the strip just gathers the bits
   needed to deep-link the iframe. */
.reservation--tables .reservation-fields {
  grid-template-columns: repeat(2, 1fr);
}
.field label {
  display: block;
  font-size: 10.5px;
  letter-spacing: .26em;
  text-transform: uppercase;
  color: rgba(244, 236, 222, .55);
  margin-bottom: 6px;
}
.field input, .field select {
  width: 100%;
  background: transparent;
  border: 0;
  border-bottom: 1px solid rgba(244, 236, 222, .2);
  color: var(--cream);
  font-family: var(--display);
  font-size: 17px;
  padding: 6px 0;
  font-weight: 400;
}
.field input:focus, .field select:focus {
  outline: 0;
  border-bottom-color: var(--gold);
}
.field input[type="date"]::-webkit-calendar-picker-indicator {
  filter: invert(.85) sepia(.4) saturate(2) hue-rotate(0deg);
  cursor: pointer;
}
.reservation-ctas {
  display: flex; gap: 12px; flex-wrap: wrap; justify-content: flex-end;
}

/* =====================================================================
   WELCOME
   ===================================================================== */
.welcome {
  padding: clamp(96px, 10vw, 168px) clamp(32px, 5vw, 72px);
  background: var(--paper);
}
.welcome-inner {
  max-width: var(--maxw);
  margin: 0 auto;
  display: grid;
  grid-template-columns: 1fr 1.4fr 1fr;
  gap: clamp(32px, 4.5vw, 72px);
  align-items: center;
}
.welcome-center {
  text-align: center;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 22px;
}
.welcome-center h2 {
  max-width: 14ch;
  font-size: clamp(32px, 3.6vw, 52px);
}
.welcome-center h2 em { font-style: italic; color: var(--gold); font-weight: 500; }
.welcome-rating {
  margin-top: 12px;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 8px;
}
.welcome-rating .label {
  font-size: 13px; color: var(--text-soft);
}
.welcome-side .arch-img { aspect-ratio: 3 / 5; }

/* =====================================================================
   AMENITIES (three arch cards)
   ===================================================================== */
.amenities {
  padding: clamp(48px, 7vw, 88px) clamp(32px, 5vw, 72px) clamp(96px, 10vw, 168px);
  background: var(--paper);
}
.amenities-grid {
  max-width: var(--maxw);
  margin: 0 auto;
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: clamp(24px, 2.6vw, 40px);
}
.amenity-card {
  border: 1px solid var(--rule);
  background: #fff;
  padding: 56px 40px 44px;
  text-align: center;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 14px;
  transition: transform .35s var(--ease), border-color .35s var(--ease), box-shadow .35s var(--ease);
}
.amenity-card:hover {
  transform: translateY(-4px);
  border-color: var(--gold);
  box-shadow: 0 24px 48px -28px rgba(94,18,11,.2);
}
.amenity-icon {
  /* Same segmental shape (3:5 + 12% v-radius) as every other arch on
     the page. Width 72 → height 120, reading as a small window. */
  width: 72px;
  aspect-ratio: 3 / 5;
  background: var(--ink);
  border-radius: 50% 50% 4px 4px / 12% 12% 4px 4px;
  display: grid;
  place-items: center;
  color: var(--cream);
  margin-bottom: 6px;
  padding-top: 14px;
  box-shadow: inset 0 -10px 24px rgba(0,0,0,.3);
}
.amenity-card h3 {
  font-size: clamp(20px, 1.4vw, 24px);
  letter-spacing: .01em;
}
.amenity-card p {
  color: var(--text-soft);
  font-size: 14px;
  max-width: 28ch;
}

/* =====================================================================
   STORY
   ===================================================================== */
.story {
  background: var(--ink);
  color: var(--cream);
  padding: clamp(112px, 11vw, 192px) clamp(32px, 5vw, 72px);
  position: relative;
  overflow: hidden;
}
.story::before {
  content: '';
  position: absolute;
  top: -200px; right: -200px;
  width: 720px; height: 720px;
  background: radial-gradient(closest-side, rgba(201,160,99,.12), transparent 70%);
  pointer-events: none;
}
.story-inner {
  position: relative;
  max-width: var(--maxw);
  margin: 0 auto;
  display: grid;
  grid-template-columns: 1.1fr 1fr;
  gap: clamp(48px, 6.5vw, 112px);
  align-items: center;
}
.story-copy h2 {
  font-size: clamp(34px, 4vw, 58px);
  margin: 16px 0 24px;
}
.story-copy h2 em { font-style: italic; color: var(--gold); font-weight: 500; }
.story-copy p {
  color: rgba(244,236,222,.75);
  font-size: clamp(15px, 1.05vw, 17px);
  line-height: 1.75;
  max-width: 56ch;
}
.story-copy p + p { margin-top: 18px; }
.story-copy .signature {
  margin-top: 30px;
  display: inline-flex;
  flex-direction: column;
  gap: 4px;
}
.story-copy .signature .name {
  font-family: var(--display);
  font-style: italic;
  font-size: 24px;
  color: var(--gold);
}
.story-copy .signature .role {
  font-size: 11px;
  letter-spacing: .28em;
  text-transform: uppercase;
  color: rgba(244,236,222,.55);
}
.story-portrait {
  position: relative;
  max-width: 420px;
  justify-self: end;
}
.story-portrait .arch-img {
  aspect-ratio: 3 / 4;
  border: 1px solid var(--gold-glow);
}
.story-portrait::before {
  content: '';
  position: absolute;
  inset: 16px -16px -16px 16px;
  border: 1px solid var(--gold-glow);
  border-radius: 50% 50% 4px 4px / 12% 12% 4px 4px;
  pointer-events: none;
}

/* =====================================================================
   ROOMS
   ===================================================================== */
.rooms {
  padding: clamp(112px, 11vw, 192px) clamp(32px, 5vw, 72px);
  background: var(--paper-alt);
}
.rooms-head {
  max-width: var(--maxw);
  margin: 0 auto clamp(36px, 5vw, 64px);
  display: grid;
  grid-template-columns: 1fr auto;
  gap: 24px;
  align-items: end;
}
.rooms-head h2 {
  font-size: clamp(32px, 3.8vw, 54px);
  max-width: 18ch;
  color: var(--ink);
}
.rooms-head h2 em { font-style: italic; color: var(--ink); font-weight: 500; }
.rooms-head .lede { color: var(--text); }
.rooms-grid {
  max-width: var(--maxw);
  margin: 0 auto;
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: clamp(24px, 2.4vw, 36px);
}
.room-card {
  display: flex;
  flex-direction: column;
  gap: 14px;
}
.room-card .arch-img {
  aspect-ratio: 3 / 4;
  border: 1px solid rgba(42,42,42,.12);
  transition: transform .4s var(--ease);
}
.room-card:hover .arch-img { transform: translateY(-4px); }
.room-card .arch-img img { transition: transform .8s var(--ease); }
.room-card:hover .arch-img img { transform: scale(1.05); }
.room-card h3 {
  font-size: 19px;
  color: var(--ink);
  margin-top: 4px;
}
.room-card .meta {
  font-size: 11.5px;
  letter-spacing: .2em;
  text-transform: uppercase;
  color: var(--text-soft);
}
.room-card .price {
  margin-top: 6px;
  font-family: var(--display);
  font-style: italic;
  color: var(--ink);
  font-size: 16px;
}

/* =====================================================================
   AWARDS
   ===================================================================== */
.awards {
  padding: clamp(96px, 10vw, 144px) clamp(32px, 5vw, 72px);
  background: var(--paper);
  border-top: 1px solid var(--rule);
  border-bottom: 1px solid var(--rule);
}
.awards-inner {
  max-width: var(--maxw);
  margin: 0 auto;
}
.awards-head {
  text-align: center;
  margin-bottom: 48px;
  display: flex;
  flex-direction: column;
  gap: 10px;
  align-items: center;
}
.awards-head h3 {
  font-size: clamp(24px, 2.4vw, 36px);
  color: var(--ink);
  font-weight: 400;
  max-width: 28ch;
}
.awards-group + .awards-group { margin-top: 56px; }
.awards-label {
  font-family: var(--body);
  text-align: center;
  font-size: 11px;
  letter-spacing: .32em;
  text-transform: uppercase;
  color: var(--text-soft);
  margin-bottom: 28px;
  position: relative;
}
/* No flanking rules: they were positioned for the short "AA Recognition"
   label and cut through the longer "Over 12 years…" wording. Removed at
   Kirsty's request (2026-07-02). */
.awards-row {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: clamp(24px, 3vw, 56px);
  align-items: center;
  justify-items: center;
}
/* AA Recognition (primary) row: just the three current AA logos.
   Flex layout with centred justification + capped row width so they
   sit close together in the centre of the page rather than spread
   sparsely across the full content area. */
.awards-row.primary {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  gap: clamp(20px, 3vw, 56px);
  max-width: 560px;
  margin: 0 auto;
}
.awards-row.primary img { height: 104px; width: auto; }
.awards-row.secondary img { max-height: 56px; max-width: 100%; }
.awards-row img {
  object-fit: contain;
  filter: opacity(.92);
  transition: filter .3s var(--ease), transform .3s var(--ease);
}
.awards-row img:hover { filter: opacity(1); transform: translateY(-2px); }
/* Corriere della Sera ships as white-on-transparent; invert for white bg. */
.awards-row img[src*="corriere"] { filter: invert(1) opacity(.85); }
.awards-row img[src*="corriere"]:hover { filter: invert(1) opacity(1); }

/* "As seen in" press strip — quiet, monochrome, infinite-scroll marquee.
   .press-strip wraps the marquee and the label.
   .press-marquee provides the overflow clip + side-fade masking.
   .press-marquee__track is a flex row holding two identical __set
   children; CSS animation slides the track left by 50% (= width of
   one set), wrapping seamlessly. Pauses on hover.
   Everything inside the marquee is forced to grayscale + reduced
   opacity, so the row reads as one editorial whisper rather than a
   colourful logo collage. */
.press-strip { padding: 0 clamp(16px, 3vw, 48px); }

/* Standalone press-strip section (above the awards scroll-stack so
   the CTA arch can't overlap it on mobile). */
.press-section {
  padding: clamp(48px, 6vw, 88px) clamp(32px, 5vw, 72px);
  background: var(--paper, #f7f3ec);
  border-top: 1px solid var(--rule);
  border-bottom: 1px solid var(--rule);
}
.press-section__inner {
  max-width: var(--maxw);
  margin: 0 auto;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 18px;
}
.press-section .awards-label {
  position: relative;
  font-family: var(--body);
  font-size: 11px;
  letter-spacing: .32em;
  text-transform: uppercase;
  color: var(--text-soft);
}

.press-marquee {
  margin-top: 18px;
  overflow: hidden;
  position: relative;
  mask-image: linear-gradient(
    to right,
    transparent 0,
    #000 8%,
    #000 92%,
    transparent 100%
  );
  -webkit-mask-image: linear-gradient(
    to right,
    transparent 0,
    #000 8%,
    #000 92%,
    transparent 100%
  );
}
.press-marquee__track {
  display: flex;
  gap: clamp(56px, 6vw, 96px);
  width: max-content;
  animation: press-marquee 48s linear infinite;
}
.press-marquee:hover .press-marquee__track { animation-play-state: paused; }
.press-marquee__set {
  display: flex;
  align-items: center;
  gap: clamp(56px, 6vw, 96px);
  flex-shrink: 0;
}
.press-marquee__set img,
.press-marquee__set .press-placeholder {
  height: 40px;
  width: auto;
  max-width: none;
  filter: grayscale(1) opacity(.65);
  transition: filter .3s var(--ease);
}
.press-marquee:hover .press-marquee__set img,
.press-marquee:hover .press-marquee__set .press-placeholder {
  filter: grayscale(1) opacity(.85);
}
.press-marquee__set img[src*="corriere"] {
  filter: grayscale(1) invert(1) opacity(.6);
}
.press-marquee:hover .press-marquee__set img[src*="corriere"] {
  filter: grayscale(1) invert(1) opacity(.85);
}
.press-marquee__set .press-placeholder {
  font-family: var(--display);
  font-size: 19px;
  font-style: italic;
  color: rgba(42, 42, 42, .95);
  text-align: center;
  letter-spacing: .01em;
  line-height: 1.05;
  display: flex;
  flex-direction: column;
  justify-content: center;
  white-space: nowrap;
  height: 40px;
}
.press-marquee__set .press-placeholder small {
  font-family: var(--body);
  display: block;
  font-size: 8px;
  letter-spacing: .28em;
  text-transform: uppercase;
  font-style: normal;
  margin-top: 2px;
  color: rgba(42, 42, 42, .55);
}
@keyframes press-marquee {
  from { transform: translateX(0); }
  to   { transform: translateX(calc(-50% - clamp(28px, 3vw, 48px))); }
}
@media (prefers-reduced-motion: reduce) {
  .press-marquee__track { animation: none; }
  .press-marquee {
    mask-image: none;
    -webkit-mask-image: none;
  }
}

/* =====================================================================
   CTA ARCH
   ===================================================================== */
.cta-arch {
  position: relative;
  padding: clamp(144px, 13vw, 224px) clamp(32px, 5vw, 72px);
  text-align: center;
  color: var(--cream);
  overflow: hidden;
  isolation: isolate;
}
.cta-arch-bg {
  position: absolute;
  inset: 0;
  background: url('img/hero-109.webp') center/cover no-repeat;
  transform: scale(1.05);
  z-index: -2;
}
.cta-arch::before {
  content: '';
  position: absolute; inset: 0;
  background: linear-gradient(180deg, rgba(27,22,20,.7), rgba(27,22,20,.6));
  z-index: -1;
}
.cta-arch h2 {
  font-size: clamp(36px, 4.6vw, 64px);
  max-width: 22ch;
  margin: 0 auto 14px;
}
.cta-arch h2 em { font-style: italic; color: var(--gold); font-weight: 500; }
.cta-arch p {
  color: rgba(244,236,222,.75);
  margin-bottom: 36px;
  font-size: 14px;
  letter-spacing: .24em;
  text-transform: uppercase;
}

/* =====================================================================
   FOOTER
   ===================================================================== */
footer.site-foot {
  background: var(--ink);
  color: rgba(244, 236, 222, .7);
  padding: clamp(88px, 9vw, 128px) clamp(32px, 5vw, 72px) 40px;
  font-size: 14px;
  /* Matching rounded top corners — same card-lift visual as the
     reservation strip. The section above the footer (typically the
     cta-arch) shows through the cut-out corners. */
  border-top-left-radius: 18px;
  border-top-right-radius: 18px;
  position: relative;
  z-index: 3;
}
.foot-inner {
  max-width: var(--maxw);
  margin: 0 auto;
  display: grid;
  grid-template-columns: 1.5fr 1fr 1fr 1fr;
  gap: clamp(28px, 4vw, 64px);
  align-items: start;
}
.foot-brand img.logo {
  max-width: 180px;
  margin-bottom: 18px;
  filter: brightness(0) invert(1);
}
.foot-brand p {
  max-width: 32ch;
  line-height: 1.7;
}
.foot-col h4 {
  font-family: var(--body);
  font-size: 11.5px;
  letter-spacing: .28em;
  text-transform: uppercase;
  font-weight: 600;
  color: var(--gold);
  margin-bottom: 18px;
}
.foot-col ul { list-style: none; display: flex; flex-direction: column; gap: 10px; }
.foot-col a:hover { color: var(--cream); }
/* Legal company line — sits under the Visit address (Kirsty, for legal
   reasons). Small and muted so it reads as fine print, not nav. */
.foot-legal {
  margin-top: 18px;
  font-size: 12px;
  line-height: 1.6;
  color: rgba(244, 236, 222, .45);
}
/* Payment-method logos: small colour card marks above the bottom bar
   (Kirsty request). The card SVGs are 780x500; height drives the size. */
.foot-payments {
  max-width: var(--maxw);
  margin: 44px auto 0;
  display: flex;
  align-items: center;
  gap: 16px;
}
.foot-payments__label {
  font-family: var(--body);
  font-size: 11.5px;
  letter-spacing: .22em;
  text-transform: uppercase;
  color: rgba(244, 236, 222, .5);
}
.foot-payments__logos { display: inline-flex; gap: 10px; align-items: center; }
.foot-payments__logos img { height: 26px; width: auto; display: block; border-radius: 3px; }
@media (max-width: 720px) {
  .foot-payments { flex-direction: column; gap: 12px; margin-top: 36px; text-align: center; align-items: center; }
}
.foot-bottom {
  max-width: var(--maxw);
  margin: 60px auto 0;
  border-top: 1px solid rgba(244,236,222,.1);
  padding-top: 22px;
  display: flex;
  justify-content: space-between;
  align-items: center;
  font-size: 12px;
  color: rgba(244,236,222,.45);
  letter-spacing: .06em;
}
.foot-bottom .ornament {
  /* Tiny version of the segmental window arch (3:5 + 12% v-radius). */
  width: 22px;
  aspect-ratio: 3 / 5;
  border-radius: 50% 50% 0 0 / 12% 12% 0 0;
  border: 1px solid var(--gold);
}

/* =====================================================================
   RESPONSIVE
   ===================================================================== */
@media (max-width: 1180px) {
  .reservation-inner { grid-template-columns: 1fr; gap: 18px; }
  .reservation-fields { grid-template-columns: repeat(4, 1fr); }
  .reservation-ctas { justify-content: flex-start; }
  .rooms-grid { grid-template-columns: repeat(2, 1fr); }
}

@media (max-width: 1024px) {
  :root { --sidebar-w: 0px; }
  .sidebar {
    transform: translateX(-100%);
    width: 280px;
    transition: transform .35s var(--ease);
    /* Height tracks the visible viewport (100dvh) so the tablet drawer
       scrolls if the nav is ever taller than the screen (e.g. landscape),
       rather than clipping the foot behind the browser chrome. */
    top: 0;
    bottom: auto;
    height: 100vh;      /* fallback for browsers without dvh support */
    height: 100dvh;
    overscroll-behavior: contain;
    -webkit-overflow-scrolling: touch;
  }
  .sidebar.open { transform: translateX(0); }
  .drawer-scrim {
    display: block;
    position: fixed;
    inset: 0;
    background: rgba(27,22,20,.65);
    backdrop-filter: blur(2px);
    opacity: 0;
    pointer-events: none;
    transition: opacity .3s var(--ease);
    z-index: 55;
  }
  .drawer-scrim.show { opacity: 1; pointer-events: auto; }
  main { margin-left: 0; padding-top: 64px; }
  .topbar {
    display: flex;
    align-items: center;
    justify-content: space-between;
    height: 64px;
    padding: 0 18px;
    background: var(--ink);
    color: var(--cream);
    position: fixed;
    top: 0; left: 0; right: 0;
    z-index: 50;
    border-bottom: 1px solid rgba(244,236,222,.08);
  }
  .topbar .brand-line {
    display: block;
    height: 38px;
  }
  .topbar .brand-line img {
    height: 38px;
    width: auto;
    filter: brightness(0) invert(1);
  }
  .topbar .hamburger {
    width: 40px; height: 40px;
    display: grid; place-items: center;
    border: 1px solid rgba(244,236,222,.18);
    border-radius: 50%;
  }
  .topbar .topbar-phone {
    width: 40px; height: 40px;
    display: grid; place-items: center;
    border: 1px solid var(--gold);
    border-radius: 50%;
    color: var(--gold);
  }

  .hero { min-height: 600px; }
  .welcome-inner { grid-template-columns: 1fr; }
  .welcome-side { display: none; }
  .amenities-grid { grid-template-columns: 1fr; max-width: 480px; margin-inline: auto; }
  .story-inner { grid-template-columns: 1fr; }
  .story-portrait { justify-self: center; max-width: 320px; }
  .rooms-grid { grid-template-columns: repeat(2, 1fr); }
  .rooms-head { grid-template-columns: 1fr; }
  .foot-inner { grid-template-columns: 1fr 1fr; }
}

@media (max-width: 640px) {
  /* Phone: tighten hero-inner horizontal padding and constrain the grid track
     to the parent width. Without minmax(0, 1fr) the auto track expands to the
     arch's intrinsic 92vw width and the cell starts at the left padding edge,
     pushing the arch off-screen right. */
  .hero-inner {
    padding-left: 16px;
    padding-right: 16px;
    grid-template-columns: minmax(0, 1fr);
  }
  .hero-arch {
    width: min(420px, 100%);
    aspect-ratio: 4 / 5;
    padding: 28px 22px;
    border-radius: 50% 50% 6px 6px / 26% 26% 6px 6px;
  }
  .hero-meta { padding: 0 20px; bottom: 22px; font-size: 11px; }
  .reservation-fields { grid-template-columns: 1fr 1fr; }
  .rooms-grid { grid-template-columns: 1fr; max-width: 340px; margin-inline: auto; }
  .awards-row { grid-template-columns: repeat(2, 1fr); row-gap: 32px; }
  .awards-row.primary img { max-height: 90px; }
  .awards-row.secondary img { max-height: 54px; }
  .foot-inner { grid-template-columns: 1fr; }
  .foot-bottom { flex-direction: column; gap: 14px; text-align: center; }
}

/* =====================================================================
   PAGE-LOAD REVEAL
   ===================================================================== */
/* Pure opacity fade — no slide. The hero-arch children fade in
   sequentially over .9s each (with staggered delay), drifting up
   from a translateY was previously a bit of an over-cooked entrance
   and read as restless rather than calm. */
@keyframes lift {
  from { opacity: 0; }
  to { opacity: 1; }
}
.hero-arch > * { opacity: 0; animation: lift .9s var(--ease) forwards; }
.hero-arch > *:nth-child(1) { animation-delay: .25s; }
.hero-arch > *:nth-child(2) { animation-delay: .45s; }
.hero-arch > *:nth-child(3) { animation-delay: .65s; }
.hero-arch > *:nth-child(4) { animation-delay: .85s; }

/* =====================================================================
   ROOM LISTINGS: Booking.com-style horizontal cards for the rooms page.
   ===================================================================== */
.room-listings {
  max-width: var(--maxw);
  margin: 0 auto;
  display: flex;
  flex-direction: column;
  gap: clamp(32px, 4vw, 56px);
}
.room-listing {
  display: grid;
  grid-template-columns: 44% 1fr;
  gap: clamp(28px, 3.5vw, 56px);
  background: #fff;
  border: 1px solid var(--rule);
  border-radius: 2px;
  overflow: hidden;
  transition: box-shadow .35s var(--ease), transform .35s var(--ease);
}
.room-listing:hover {
  box-shadow: 0 24px 60px -36px rgba(42, 42, 42, .25);
  transform: translateY(-2px);
}
.room-listing__photo {
  aspect-ratio: 4 / 3;
  background: var(--ink-soft);
  overflow: hidden;
}
.room-listing__photo img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
  transition: transform .8s var(--ease);
}
.room-listing:hover .room-listing__photo img { transform: scale(1.04); }
.room-listing__content {
  padding: clamp(32px, 3vw, 48px) clamp(32px, 3vw, 48px) clamp(32px, 3vw, 48px) 0;
  display: flex;
  flex-direction: column;
  min-width: 0;
}
.room-listing__title {
  font-family: var(--display);
  font-weight: 400;
  font-size: clamp(26px, 2.2vw, 34px);
  color: var(--ink);
  letter-spacing: -0.01em;
  margin: 0 0 10px;
  line-height: 1.1;
}
.room-listing__meta {
  display: flex;
  flex-wrap: wrap;
  gap: 18px 22px;
  font-size: 11.5px;
  color: var(--text-soft);
  margin-bottom: 20px;
  text-transform: uppercase;
  letter-spacing: .18em;
  font-weight: 500;
}
.room-listing__meta-item {
  display: inline-flex;
  align-items: center;
  gap: 7px;
}
.room-listing__meta-item svg { color: var(--gold-soft); }
.room-listing__amenities {
  display: flex;
  flex-wrap: wrap;
  gap: 14px 22px;
  padding: 18px 0;
  border-top: 1px solid var(--rule);
  border-bottom: 1px solid var(--rule);
  margin-bottom: 22px;
}
.room-listing__amenity {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  font-size: 13px;
  color: var(--text);
}
.room-listing__amenity svg { color: var(--text-soft); flex-shrink: 0; }
.room-listing__description {
  font-size: 13.5px;
  line-height: 1.7;
  color: var(--text-soft);
  margin-bottom: 26px;
  flex: 1;
}
.room-listing__footer {
  display: flex;
  justify-content: space-between;
  align-items: flex-end;
  gap: 20px;
  flex-wrap: wrap;
}
.room-listing__price {
  display: flex;
  flex-direction: column;
  gap: 2px;
}
.room-listing__price-from {
  font-size: 10.5px;
  letter-spacing: .28em;
  text-transform: uppercase;
  color: var(--text-soft);
}
.room-listing__price-value {
  font-family: var(--display);
  font-style: italic;
  font-size: 26px;
  color: var(--ink);
  line-height: 1;
}
.room-listing__price-note {
  font-size: 11.5px;
  color: var(--text-soft);
  margin-top: 4px;
  letter-spacing: .04em;
}
.room-listing__cta { white-space: nowrap; }

@media (max-width: 1024px) {
  .room-listing { grid-template-columns: 1fr; gap: 0; }
  .room-listing__photo { aspect-ratio: 16 / 10; }
  .room-listing__content { padding: clamp(24px, 3vw, 32px); }
}

/* =====================================================================
   MENU LIST: a tidy grid of menu PDFs.
   ===================================================================== */
.menu-list {
  max-width: var(--maxw);
  margin: 0 auto;
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
  gap: clamp(20px, 2.2vw, 28px);
}
.menu-card {
  display: flex;
  flex-direction: column;
  gap: 10px;
  padding: 32px 28px 28px;
  background: #fff;
  border: 1px solid var(--rule);
  text-decoration: none;
  color: inherit;
  transition: border-color .3s var(--ease), transform .3s var(--ease), box-shadow .3s var(--ease);
}
.menu-card:hover {
  border-color: var(--gold);
  transform: translateY(-3px);
  box-shadow: 0 18px 40px -28px rgba(42, 42, 42, .25);
}
.menu-card__icon {
  width: 48px;
  aspect-ratio: 3 / 5;
  border-radius: 50% 50% 2px 2px / 12% 12% 2px 2px;
  background: var(--ink);
  display: grid;
  place-items: center;
  color: var(--cream);
  margin-bottom: 6px;
}
.menu-card__title {
  font-family: var(--display);
  font-weight: 400;
  font-size: 22px;
  color: var(--ink);
  line-height: 1.2;
}
.menu-card__note {
  font-size: 12px;
  letter-spacing: .18em;
  text-transform: uppercase;
  color: var(--text-soft);
}
.menu-card__action {
  margin-top: 8px;
  font-family: var(--body);
  font-size: 11.5px;
  font-weight: 600;
  letter-spacing: .22em;
  text-transform: uppercase;
  color: var(--gold-soft);
}

/* =====================================================================
   BOOKING PANEL: slides in from the right when "Book this room" is clicked.
   ===================================================================== */
.booking-panel-backdrop {
  position: fixed;
  inset: 0;
  background: rgba(27, 22, 20, .55);
  backdrop-filter: blur(4px);
  -webkit-backdrop-filter: blur(4px);
  z-index: 100;
  opacity: 0;
  pointer-events: none;
  transition: opacity .35s var(--ease);
}
.booking-panel-backdrop.open {
  opacity: 1;
  pointer-events: auto;
}
.booking-panel {
  position: fixed;
  top: 0;
  right: 0;
  bottom: 0;
  width: 480px;
  max-width: 100%;
  background: #fff;
  color: var(--text);
  z-index: 101;
  transform: translateX(100%);
  transition: transform .42s var(--ease);
  display: flex;
  flex-direction: column;
  border-top-left-radius: 18px;
  border-bottom-left-radius: 18px;
  box-shadow: -32px 0 80px -32px rgba(0, 0, 0, .35);
  overflow: hidden;
}
.booking-panel.open { transform: translateX(0); }
.booking-panel__header {
  display: flex;
  justify-content: space-between;
  align-items: flex-start;
  padding: 28px 32px 22px;
  border-bottom: 1px solid var(--rule);
  gap: 16px;
}
.booking-panel__head-meta {
  display: flex;
  flex-direction: column;
  gap: 4px;
  min-width: 0;
}
.booking-panel__eyebrow {
  font-family: var(--body);
  font-size: 10.5px;
  letter-spacing: .28em;
  text-transform: uppercase;
  color: var(--text-soft);
  margin-bottom: 6px;
}
.booking-panel__title {
  font-family: var(--display);
  font-weight: 400;
  font-size: 26px;
  line-height: 1.15;
  color: var(--ink);
  letter-spacing: -0.01em;
  margin: 0;
}
.booking-panel__sub {
  margin-top: 8px;
  font-size: 11px;
  letter-spacing: .18em;
  text-transform: uppercase;
  color: var(--text-soft);
}
.booking-panel__close {
  width: 38px;
  height: 38px;
  border-radius: 50%;
  border: 1px solid var(--rule);
  background: transparent;
  color: var(--text-soft);
  display: grid;
  place-items: center;
  cursor: pointer;
  flex-shrink: 0;
  transition: border-color .22s var(--ease), color .22s var(--ease);
}
.booking-panel__close:hover {
  border-color: var(--ink);
  color: var(--ink);
}
.booking-panel__photo {
  aspect-ratio: 16 / 9;
  /* Cap the photo on short viewports (landscape phones): without this,
     header + 16:9 photo consumed the whole fixed-height panel and the
     form/CTA collapsed to a sliver. */
  max-height: 32vh;
  max-height: 32dvh;
  background: var(--ink-soft);
  overflow: hidden;
  flex-shrink: 0;
}
.booking-panel__photo img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
}
.booking-panel__body {
  padding: 28px 32px 32px;
  display: flex;
  flex-direction: column;
  gap: 24px;
  flex: 1;
  overflow-y: auto;
}
.booking-panel__form {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 18px 20px;
}
.booking-panel__form .field {
  display: flex;
  flex-direction: column;
  gap: 8px;
}
.booking-panel__form label {
  font-size: 10.5px;
  letter-spacing: .24em;
  text-transform: uppercase;
  color: var(--text-soft);
}
.booking-panel__form input,
.booking-panel__form select {
  border: 0;
  border-bottom: 1px solid var(--rule);
  font-family: var(--display);
  font-size: 17px;
  padding: 8px 0;
  background: transparent;
  color: var(--ink);
  width: 100%;
}
.booking-panel__form input:focus,
.booking-panel__form select:focus {
  outline: 0;
  border-bottom-color: var(--gold);
}
.booking-panel__form input[type="date"]::-webkit-calendar-picker-indicator {
  cursor: pointer;
  filter: invert(.35);
}
.booking-panel__price-row {
  display: flex;
  justify-content: space-between;
  align-items: flex-end;
  gap: 16px;
  padding: 18px 0;
  border-top: 1px solid var(--rule);
  border-bottom: 1px solid var(--rule);
}
.booking-panel__price-from {
  font-size: 10.5px;
  letter-spacing: .28em;
  text-transform: uppercase;
  color: var(--text-soft);
  margin-bottom: 2px;
}
.booking-panel__price-value {
  font-family: var(--display);
  font-style: italic;
  font-size: 24px;
  color: var(--ink);
  line-height: 1;
}
.booking-panel__price-note {
  font-size: 11.5px;
  color: var(--text-soft);
  text-align: right;
  max-width: 14ch;
  line-height: 1.4;
}
.booking-panel__cta-wrap {
  display: flex;
  flex-direction: column;
  gap: 12px;
  margin-top: auto;
}
.booking-panel__cta {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 14px;
  padding: 18px 28px;
  background: var(--ink);
  color: var(--cream);
  font-family: var(--body);
  font-size: 13px;
  font-weight: 500;
  letter-spacing: .22em;
  text-transform: uppercase;
  border: 0;
  cursor: pointer;
  transition: background .25s var(--ease), color .25s var(--ease), letter-spacing .25s var(--ease);
}
.booking-panel__cta:hover {
  background: var(--gold);
  color: var(--ink);
  letter-spacing: .26em;
}
.booking-panel__footnote {
  font-size: 11.5px;
  color: var(--text-soft);
  line-height: 1.55;
  text-align: center;
}

/* The room-listing photo is now a button — keep it visually a clickable image */
button.room-listing__photo {
  border: 0;
  padding: 0;
  background: var(--ink-soft);
  cursor: pointer;
  text-align: left;
  width: 100%;
}

@media (max-width: 640px) {
  .booking-panel {
    width: 100%;
    border-radius: 0;
  }
  .booking-panel__header { padding: 22px 24px 18px; }
  .booking-panel__body { padding: 22px 24px 26px; }
}

/* "Your stay" indicator — shows under the rooms heading once dates exist */
.your-stay {
  margin-top: 18px;
  display: inline-block;
  padding: 10px 18px;
  background: var(--ink);
  color: var(--cream);
  font-family: var(--body);
  font-size: 11.5px;
  font-weight: 500;
  letter-spacing: .18em;
  text-transform: uppercase;
  border-radius: 999px;
}

/* =====================================================================
   MENU BROWSER: tabbed, fully browsable menus baked into the page.
   ===================================================================== */
.menu-browser {
  padding: clamp(60px, 8vw, 110px) clamp(24px, 5vw, 64px) clamp(80px, 9vw, 120px);
  background: var(--paper-alt);
  position: relative;
}
.menu-browser__inner {
  max-width: 980px;
  margin: 0 auto;
}

/* --- Tabs --------------------------------------------------------- */
.menu-tabs-wrap {
  position: sticky;
  top: 0;
  z-index: 5;
  margin: 0 calc(clamp(24px, 5vw, 64px) * -1) clamp(28px, 4vw, 44px);
  padding: 0 clamp(24px, 5vw, 64px);
  background: var(--paper-alt);
  border-bottom: 1px solid var(--rule);
}
.menu-tabs {
  display: flex;
  gap: 6px;
  overflow-x: auto;
  scrollbar-width: none;
  -ms-overflow-style: none;
  max-width: 980px;
  margin: 0 auto;
  padding: 14px 0 0;
}
.menu-tabs::-webkit-scrollbar { display: none; }
.menu-tab {
  appearance: none;
  background: transparent;
  border: 0;
  border-bottom: 2px solid transparent;
  font-family: var(--display);
  font-weight: 400;
  font-size: clamp(15px, 1.4vw, 17px);
  color: var(--text-soft);
  letter-spacing: .01em;
  padding: 14px 18px 16px;
  cursor: pointer;
  white-space: nowrap;
  transition: color .25s var(--ease), border-color .25s var(--ease);
}
.menu-tab:hover { color: var(--ink); }
.menu-tab.is-active {
  color: var(--ink);
  border-bottom-color: var(--gold);
}
.menu-tab:focus-visible {
  outline: 2px solid var(--gold);
  outline-offset: 2px;
  border-radius: 4px;
}

/* --- Panels ------------------------------------------------------- */
.menu-panels { position: relative; }
.menu-panel {
  display: none;
  animation: menuFade .35s var(--ease);
}
.menu-panel.is-active { display: block; }
@keyframes menuFade {
  from { opacity: 0; transform: translateY(8px); }
  to   { opacity: 1; transform: translateY(0); }
}
.menu-panel__head {
  text-align: center;
  margin-bottom: clamp(32px, 5vw, 56px);
}
.menu-panel__title {
  font-family: var(--display);
  font-weight: 400;
  font-size: clamp(30px, 4vw, 42px);
  color: var(--ink);
  line-height: 1.1;
  margin: 0 0 12px;
}
.menu-panel__subtitle {
  font-family: var(--body);
  color: var(--text-soft);
  font-size: 14.5px;
  line-height: 1.55;
  max-width: 56ch;
  margin: 0 auto;
}

/* --- Sections ----------------------------------------------------- */
.menu-section {
  margin: 0 0 clamp(36px, 4.5vw, 56px);
  padding: 0;
}
.menu-section__head {
  display: flex;
  align-items: baseline;
  gap: 14px;
  margin: 0 0 18px;
  padding-bottom: 12px;
  border-bottom: 1px solid var(--rule);
}
.menu-section__title {
  font-family: var(--display);
  font-style: italic;
  font-weight: 500;
  font-size: clamp(22px, 2.3vw, 28px);
  color: var(--ink);
  letter-spacing: .005em;
  margin: 0;
  line-height: 1.1;
}
.menu-section__sub {
  font-family: var(--body);
  font-size: 11.5px;
  letter-spacing: .22em;
  text-transform: uppercase;
  color: var(--gold-soft);
  font-weight: 500;
}
.menu-section__intro {
  font-family: var(--body);
  color: var(--text-soft);
  font-size: 14px;
  margin: -6px 0 18px;
  font-style: italic;
}
.menu-section__notes {
  font-family: var(--body);
  color: var(--text-soft);
  font-size: 13px;
  margin: 14px 0 0;
  font-style: italic;
  line-height: 1.55;
}

/* --- Items -------------------------------------------------------- */
.menu-items {
  list-style: none;
  padding: 0;
  margin: 0;
  display: flex;
  flex-direction: column;
  gap: 16px;
}
.menu-item {
  padding: 4px 0;
}
.menu-item__line {
  display: flex;
  align-items: baseline;
  gap: 10px;
}
.menu-item__name {
  font-family: var(--display);
  font-weight: 500;
  font-size: clamp(15.5px, 1.45vw, 17px);
  color: var(--ink);
  line-height: 1.3;
  /* Must be allowed to shrink and wrap: specials names come from the
     Google Sheet, so length is unbounded. flex-shrink:0 let a long name
     push the price out of the column at >720px. */
  min-width: 0;
}
.menu-item__tags {
  display: inline-flex;
  gap: 4px;
  margin-left: 8px;
  vertical-align: baseline;
}
.menu-item__tag {
  display: inline-block;
  padding: 1px 6px;
  font-family: var(--body);
  font-size: 9.5px;
  font-weight: 600;
  letter-spacing: .12em;
  text-transform: uppercase;
  color: var(--gold-soft);
  background: var(--cream);
  border: 1px solid var(--cream-soft);
  border-radius: 3px;
  line-height: 1.4;
  /* Cursor: default rather than the conventional "help" question-mark
     cursor. The title="" attribute still produces a native browser
     tooltip on hover, just without the ? that signals it. The
     interaction reads as quieter and less confusing for users who
     haven't seen the help-cursor convention before. */
}
.menu-item__leader {
  flex: 1 1 auto;
  border-bottom: 1px dotted var(--rule);
  align-self: end;
  margin: 0 4px 6px;
  min-width: 18px;
}
.menu-item__price {
  font-family: var(--display);
  font-weight: 500;
  font-size: clamp(15.5px, 1.45vw, 17px);
  color: var(--ink);
  white-space: nowrap;
  flex-shrink: 0;
  text-align: right;
}
.menu-item__price-value { display: inline; }
.menu-item__pricenote {
  display: block;
  font-family: var(--body);
  font-style: italic;
  font-size: 11.5px;
  font-weight: 400;
  color: var(--text-soft);
  letter-spacing: .01em;
  margin-top: 2px;
}
.menu-item__desc {
  font-family: var(--body);
  color: var(--text-soft);
  font-size: 13.5px;
  line-height: 1.55;
  margin-top: 4px;
  padding-right: 12%;
}
.menu-item__pair {
  font-family: var(--body);
  color: var(--gold-soft);
  font-size: 12px;
  letter-spacing: .04em;
  margin-top: 4px;
  font-style: italic;
}

/* --- Panel footer (PDF link + notes) ------------------------------ */
.menu-panel__notes {
  font-family: var(--body);
  color: var(--text-soft);
  font-size: 13px;
  font-style: italic;
  text-align: center;
  margin: clamp(28px, 4vw, 40px) auto 0;
  max-width: 56ch;
  line-height: 1.6;
}
.menu-panel__foot {
  margin-top: clamp(32px, 4.5vw, 48px);
  padding-top: clamp(20px, 3vw, 28px);
  border-top: 1px solid var(--rule);
  display: flex;
  gap: 16px;
  flex-wrap: wrap;
  justify-content: center;
}
.menu-panel__pdf {
  font-family: var(--body);
  font-size: 11.5px;
  font-weight: 600;
  letter-spacing: .22em;
  text-transform: uppercase;
  color: var(--ink);
  text-decoration: none;
  padding: 12px 22px;
  border: 1px solid var(--ink);
  transition: background .25s var(--ease), color .25s var(--ease);
}
.menu-panel__pdf:hover {
  background: var(--ink);
  color: var(--cream);
}

/* --- Legend + allergen notice ------------------------------------- */
.menu-legend {
  margin-top: clamp(60px, 7vw, 90px);
  padding-top: clamp(28px, 4vw, 40px);
  border-top: 1px solid var(--rule);
  display: flex;
  flex-wrap: wrap;
  gap: 14px 22px;
  justify-content: center;
}
.legend-chip {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  font-family: var(--body);
  font-size: 12.5px;
  color: var(--text-soft);
}
.legend-chip__tag {
  display: inline-block;
  padding: 2px 7px;
  font-size: 9.5px;
  font-weight: 600;
  letter-spacing: .12em;
  text-transform: uppercase;
  color: var(--gold-soft);
  background: var(--cream);
  border: 1px solid var(--cream-soft);
  border-radius: 3px;
}
.menu-allergens {
  font-family: var(--body);
  font-style: italic;
  color: var(--text-soft);
  font-size: 12.5px;
  line-height: 1.6;
  max-width: 60ch;
  text-align: center;
  margin: 18px auto 0;
}

/* --- Mobile tweaks ------------------------------------------------ */
@media (max-width: 720px) {
  .menu-section__head {
    flex-direction: column;
    align-items: flex-start;
    gap: 4px;
  }
  .menu-item__line {
    flex-wrap: wrap;
  }
  .menu-item__name {
    flex: 1 1 auto;
  }
  .menu-item__leader {
    display: none;
  }
  .menu-item__desc {
    padding-right: 0;
  }
  .menu-tab {
    padding: 12px 14px 14px;
    font-size: 15px;
  }
}

/* =====================================================================
   GALLERY: masonry via CSS columns + filter chips + lightbox.
   ===================================================================== */
.gallery-section {
  padding: clamp(60px, 7vw, 110px) clamp(24px, 5vw, 64px) clamp(80px, 9vw, 130px);
  background: var(--paper);
}

/* --- Filter chips: editorial italic text, not generic buttons --- */
.gallery-chips {
  max-width: var(--maxw);
  margin: 0 auto clamp(40px, 5vw, 60px);
  display: flex;
  flex-wrap: wrap;
  gap: 4px 28px;
  justify-content: center;
  border-bottom: 1px solid var(--rule);
  padding-bottom: 18px;
}
.gallery-chip {
  appearance: none;
  background: transparent;
  border: 0;
  border-bottom: 1.5px solid transparent;
  padding: 8px 4px 10px;
  font-family: var(--display);
  font-style: italic;
  font-weight: 400;
  font-size: clamp(15px, 1.3vw, 17px);
  color: var(--text-soft);
  letter-spacing: -0.005em;
  cursor: pointer;
  transition: color .25s var(--ease), border-color .25s var(--ease);
}
.gallery-chip:hover { color: var(--ink); }
.gallery-chip.is-active {
  color: var(--ink);
  border-bottom-color: var(--gold);
}
.gallery-chip:focus-visible {
  outline: 2px solid var(--gold);
  outline-offset: 2px;
}

/* --- Masonry: CSS columns lays out top-to-bottom per column --- */
.gallery-masonry {
  max-width: var(--maxw);
  margin: 0 auto;
  column-count: 3;
  column-gap: clamp(14px, 1.4vw, 22px);
}
@media (max-width: 1000px) {
  .gallery-masonry { column-count: 2; }
}
@media (max-width: 560px) {
  .gallery-masonry { column-count: 1; }
}

.gallery-figure {
  position: relative;
  display: block;
  margin: 0 0 clamp(14px, 1.4vw, 22px);
  break-inside: avoid;
  -webkit-column-break-inside: avoid;
  page-break-inside: avoid;
  overflow: hidden;
  background: var(--paper-alt);
  cursor: zoom-in;
}
/* Hidden start state only under html.js — no-JS visitors must still see
   the photos (app.js is the only thing that adds .is-visible). */
.js .gallery-figure {
  opacity: 0;
  transform: translateY(14px);
  transition: opacity .8s var(--ease), transform .8s var(--ease);
}
.gallery-figure.is-visible {
  opacity: 1;
  transform: translateY(0);
}
.gallery-figure.is-hidden { display: none; }
.gallery-figure img {
  display: block;
  width: 100%;
  height: auto;
  transition: transform .9s var(--ease);
}
.gallery-figure:hover img {
  transform: scale(1.025);
}

/* Subtle vignette + caption appearing on hover */
.gallery-caption {
  position: absolute;
  inset: auto 0 0 0;
  padding: 32px 18px 14px;
  color: var(--cream);
  background: linear-gradient(to top, rgba(0,0,0,.65) 0%, rgba(0,0,0,0) 90%);
  opacity: 0;
  transition: opacity .35s var(--ease);
  pointer-events: none;
}
.gallery-figure:hover .gallery-caption,
.gallery-figure:focus-within .gallery-caption {
  opacity: 1;
}
.gallery-caption__text {
  display: block;
  font-family: var(--display);
  font-style: italic;
  font-weight: 400;
  font-size: 14.5px;
  line-height: 1.35;
}

/* =====================================================================
   LIGHTBOX
   ===================================================================== */
.lightbox {
  position: fixed;
  inset: 0;
  background: rgba(20, 18, 16, .96);
  z-index: 200;
  display: flex;
  align-items: center;
  justify-content: center;
  opacity: 0;
  pointer-events: none;
  transition: opacity .3s var(--ease);
  padding: clamp(40px, 5vw, 80px);
}
.lightbox.is-open {
  opacity: 1;
  pointer-events: auto;
}
.lightbox__figure {
  max-width: 92vw;
  max-height: 88vh;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 18px;
  margin: 0;
}
.lightbox__img {
  max-width: 92vw;
  max-height: 80vh;
  width: auto;
  height: auto;
  display: block;
  object-fit: contain;
  box-shadow: 0 30px 60px -20px rgba(0,0,0,.5);
}
.lightbox__caption {
  font-family: var(--display);
  font-style: italic;
  color: var(--cream);
  font-size: 15px;
  text-align: center;
}
.lightbox__close,
.lightbox__nav {
  position: absolute;
  background: transparent;
  border: 1px solid rgba(244, 236, 222, .25);
  color: var(--cream);
  width: 48px;
  height: 48px;
  border-radius: 50%;
  display: flex;
  align-items: center;
  justify-content: center;
  cursor: pointer;
  transition: background .25s var(--ease), border-color .25s var(--ease);
}
.lightbox__close:hover,
.lightbox__nav:hover {
  background: rgba(244, 236, 222, .08);
  border-color: var(--gold);
  color: var(--gold);
}
.lightbox__close {
  top: 28px;
  right: 28px;
}
.lightbox__nav--prev { left: 28px; top: 50%; transform: translateY(-50%); }
.lightbox__nav--next { right: 28px; top: 50%; transform: translateY(-50%); }
@media (max-width: 720px) {
  .lightbox { padding: 20px; }
  .lightbox__nav { width: 40px; height: 40px; }
  .lightbox__nav--prev { left: 10px; }
  .lightbox__nav--next { right: 10px; }
  .lightbox__close { top: 14px; right: 14px; }
}

/* =====================================================================
   OFFERS: editorial cards with arch-framed media + flowing copy.
   ===================================================================== */
.offers-section {
  padding: clamp(60px, 7vw, 110px) clamp(24px, 5vw, 64px) clamp(60px, 7vw, 90px);
  background: var(--paper);
}
.offer-list {
  max-width: 1080px;
  margin: 0 auto;
  display: flex;
  flex-direction: column;
  gap: clamp(80px, 9vw, 130px);
}
.offer-card {
  display: grid;
  grid-template-columns: minmax(0, 1fr) minmax(0, 1.1fr);
  gap: clamp(40px, 5vw, 80px);
  align-items: center;
}
.offer-card--flip { grid-template-columns: minmax(0, 1.1fr) minmax(0, 1fr); }
.offer-card--flip .offer-card__media { order: 2; }
.offer-card--flip .offer-card__body { order: 1; }
.offer-card__media .arch-img {
  width: 100%;
  aspect-ratio: 4 / 5;
}
.offer-card__media .arch-img img {
  width: 100%;
  height: 100%;
  object-fit: cover;
}
.offer-card__eyebrow {
  font-family: var(--body);
  font-size: 11.5px;
  font-weight: 600;
  letter-spacing: .26em;
  text-transform: uppercase;
  color: var(--gold-soft);
  margin-bottom: 14px;
}
.offer-card__title {
  font-family: var(--display);
  font-style: italic;
  font-weight: 400;
  font-size: clamp(30px, 3.4vw, 46px);
  line-height: 1.05;
  letter-spacing: -0.018em;
  color: var(--ink);
  margin: 0 0 18px;
}
.offer-card__lede {
  font-family: var(--body);
  font-size: clamp(15px, 1.2vw, 18px);
  line-height: 1.55;
  color: var(--ink);
  font-weight: 400;
  max-width: 38ch;
  margin: 0 0 18px;
}
.offer-card__body-text {
  font-family: var(--body);
  font-size: 14px;
  line-height: 1.7;
  color: var(--text-soft);
  max-width: 42ch;
  margin: 0 0 24px;
}
.offer-card__price {
  font-family: var(--display);
  font-style: italic;
  font-size: clamp(15.5px, 1.2vw, 18px);
  color: var(--gold-soft);
  margin-bottom: 26px;
  padding-bottom: 18px;
  border-bottom: 1px solid var(--rule);
  max-width: 36ch;
}
.offer-card .btn.ghost {
  border-color: var(--ink);
  color: var(--ink);
  background: transparent;
}
.offer-card .btn.ghost:hover {
  background: var(--ink);
  color: var(--cream);
}
.offers-foot {
  max-width: var(--maxw);
  margin: clamp(60px, 7vw, 100px) auto 0;
  padding-top: clamp(36px, 4vw, 56px);
  border-top: 1px solid var(--rule);
  text-align: center;
  font-family: var(--body);
  color: var(--text-soft);
  font-size: 14px;
  line-height: 1.7;
}
.offers-foot a { color: var(--ink); text-decoration: underline; text-decoration-color: var(--rule); text-underline-offset: 3px; }
.offers-foot a:hover { text-decoration-color: var(--gold); }
@media (max-width: 820px) {
  .offer-card,
  .offer-card--flip {
    grid-template-columns: 1fr;
    gap: 32px;
  }
  .offer-card--flip .offer-card__media { order: 1; }
  .offer-card--flip .offer-card__body { order: 2; }
  .offer-card__media .arch-img { aspect-ratio: 5 / 6; max-width: 420px; margin: 0 auto; }
}

/* Table-booking panel CSS removed 2026-06-16: the custom slide-out was replaced
   by the official SevenRooms widget (see docs/tracking.md). The rooms booking
   panel uses the shared .booking-panel rules below and is unaffected. */

/* =====================================================================
   HOMEPAGE LANDSCAPE FEATURE: the wide exterior shot mid-page.
   Two-column layout, image left, copy right (or stacked on mobile).
   The arch sits in a horizontal landscape ratio rather than the
   portrait 3:5 used elsewhere on the site.
   ===================================================================== */
.home-feature {
  padding: clamp(72px, 8vw, 130px) clamp(32px, 5vw, 72px);
  background: var(--paper);
}
.home-feature__inner {
  max-width: 1180px;
  margin: 0 auto;
  display: grid;
  grid-template-columns: minmax(0, 1.25fr) minmax(0, 1fr);
  gap: clamp(40px, 5vw, 80px);
  align-items: center;
}
/* Mirror variant: image on the right, copy on the left. Used on the
   homepage rooms feature so it visually rhymes with the exterior
   section above it without being a left/right copy. Source order
   stays media-then-copy (image-first on mobile stack); on desktop we
   explicitly place media in column 2 and copy in column 1. */
.home-feature--reverse .home-feature__inner {
  grid-template-columns: minmax(0, 1fr) minmax(0, 1.25fr);
}
.home-feature--reverse .home-feature__media { grid-column: 2; grid-row: 1; }
.home-feature--reverse .home-feature__copy  { grid-column: 1; grid-row: 1; }
.home-feature__media {
  position: relative;
}
.home-feature__media .arch-img {
  width: 100%;
  aspect-ratio: 16 / 10;
  border-radius: 50% 50% 2px 2px / 18% 18% 2px 2px;
  overflow: hidden;
}
.home-feature__media .arch-img img {
  width: 100%;
  height: 100%;
  object-fit: cover;
}
.home-feature__eyebrow {
  font-family: var(--body);
  font-size: 11.5px;
  font-weight: 600;
  letter-spacing: .26em;
  text-transform: uppercase;
  color: var(--gold-soft);
  margin-bottom: 14px;
}
.home-feature__eyebrow em {
  font-family: var(--display);
  font-style: italic;
  font-weight: 400;
  font-size: clamp(17px, 1.6vw, 22px);
  letter-spacing: .01em;
  text-transform: none;
  color: var(--gold);
  margin-right: 6px;
  vertical-align: -2px;
}
.home-feature__title {
  font-family: var(--display);
  font-weight: 300;
  font-size: clamp(32px, 3.8vw, 48px);
  line-height: 1.05;
  letter-spacing: -0.015em;
  color: var(--ink);
  margin: 0 0 18px;
}
.home-feature__title em {
  font-style: italic;
  font-weight: 400;
  color: var(--gold);
}
.home-feature__body {
  font-family: var(--body);
  font-size: 14.5px;
  line-height: 1.7;
  color: var(--text-soft);
  margin: 0 0 26px;
  max-width: 42ch;
}
.home-feature__address {
  font-family: var(--display);
  font-style: italic;
  font-size: 16px;
  color: var(--ink);
  margin: 0 0 20px;
  line-height: 1.5;
}
/* The default .btn is cream-on-transparent with a gold border — that
   washes out against the white home-feature background. Override to
   the ink palette here so the CTA reads cleanly. */
.home-feature .btn:not(.solid) {
  color: var(--ink);
  border-color: var(--ink);
}
.home-feature .btn:not(.solid):hover {
  background: var(--ink);
  color: var(--cream);
  border-color: var(--ink);
}
@media (max-width: 820px) {
  /* Reset both the default and the --reverse variant to a single column
     on mobile. The --reverse selector has higher specificity than the
     default, so it has to be listed explicitly here or the desktop
     two-column rule keeps winning at narrow widths. */
  .home-feature__inner,
  .home-feature--reverse .home-feature__inner {
    grid-template-columns: 1fr;
    gap: 32px;
  }
  .home-feature--reverse .home-feature__media,
  .home-feature--reverse .home-feature__copy {
    grid-column: auto;
    grid-row: auto;
  }
  .home-feature__media .arch-img { aspect-ratio: 16 / 11; }
  /* On mobile the eyebrow above the headline is decorative and the
     headline carries the message on its own — hide the eyebrow to
     reduce stack height in these sections. */
  .home-feature__eyebrow { display: none; }
}

/* =====================================================================
   SCROLL REVEALS: lightweight, varied. NOT a uniform "fade-up
   everything" stack (that's the AI-default per the design rubric).
   Variants intentionally use different durations, easings and distances
   so the rhythm of the page reveal isn't mechanical.
   ===================================================================== */
/* Initial hidden states are gated on html.js (set by an inline script in
   <head>): without scripting nothing ever adds .is-visible, so content
   must stay visible rather than sit at opacity 0 forever. Each variant is
   self-sufficient (the HTML uses them without the .reveal base class). */
.js .reveal {
  opacity: 0;
  transform: translateY(28px);
  transition:
    opacity 1.1s var(--ease),
    transform 1.1s var(--ease);
  will-change: opacity, transform;
}
.reveal.is-visible {
  opacity: 1;
  transform: none;
}

/* Variant: subtle fade only, no movement. For things that already have
   their own visual weight (hero arches, big imagery). */
.js .reveal--fade {
  opacity: 0;
  transform: none;
  transition: opacity 1.4s var(--ease);
}
.reveal--fade.is-visible { opacity: 1; }

/* Variant: slow + gentle. Used for editorial copy blocks. */
.js .reveal--soft {
  opacity: 0;
  transform: translateY(18px);
  transition:
    opacity 1.4s cubic-bezier(.16, .68, .24, 1),
    transform 1.4s cubic-bezier(.16, .68, .24, 1);
}
.reveal--soft.is-visible { opacity: 1; transform: none; }

/* Variant: sideways drift for items in a flanked layout. */
.js .reveal--right {
  opacity: 0;
  transform: translateX(-20px);
  transition:
    opacity 1.1s var(--ease),
    transform 1.1s var(--ease);
}
.reveal--right.is-visible { opacity: 1; transform: none; }
.js .reveal--left {
  opacity: 0;
  transform: translateX(20px);
  transition:
    opacity 1.1s var(--ease),
    transform 1.1s var(--ease);
}
.reveal--left.is-visible { opacity: 1; transform: none; }

/* Stagger helpers — applied to children of a .reveal-group container.
   The JS adds .is-visible to each child in turn with a small step so a
   row of items cascades rather than appearing in unison. */
.reveal-group > .reveal[data-stagger="1"] { transition-delay: .08s; }
.reveal-group > .reveal[data-stagger="2"] { transition-delay: .16s; }
.reveal-group > .reveal[data-stagger="3"] { transition-delay: .24s; }
.reveal-group > .reveal[data-stagger="4"] { transition-delay: .32s; }

@media (prefers-reduced-motion: reduce) {
  .reveal,
  .reveal--fade,
  .reveal--soft,
  .reveal--right,
  .reveal--left,
  .gallery-figure {
    opacity: 1 !important;
    transform: none !important;
    transition: none !important;
  }
}

/* =====================================================================
   MOBILE EDITORIAL CLEANUPS
   Hide repetitive / decorative chrome on mobile only. All elements
   remain in the DOM (so SEO + screen readers are unaffected) — just
   suppressed visually to give the small screen room to breathe.
   ===================================================================== */
@media (max-width: 720px) {
  /* Homepage reservation strip is a ROOMS booking layout (check-in /
     check-out / adults / children — none of which apply to a table
     booking). The duplicate "Book a table" CTA there is redundant on
     mobile, where the dedicated SevenRooms triggers elsewhere on the
     page and the full-menu sheet are more discoverable. Keep "Book a
     room" as the single primary.
     The .reservation--tables variant (restaurant page) uses #booknow1
     as its ONLY CTA — don't hide it there. */
  .reservation:not(.reservation--tables) .reservation-ctas #booknow1 { display: none; }

  /* Room listings (/rooms/): every room shares the identical six-amenity
     grid (Wi-Fi, TV, AC, shower, heat, tea/coffee). Showing it four
     times stacks 24 amenity chips on a small screen for no extra
     information. Hide on mobile — the description blurb plus the
     bed / size / max-guests meta row carry the real per-room info. */
  .room-listing__amenities { display: none; }

  /* Awards section: the secondary "Featured & Reviewed" row (Corriere /
     Google / Tripadvisor / Booking.com logos) was supporting trust
     signal on desktop; was hidden on mobile to avoid visual noise.
     That row has been replaced by the As Seen In press marquee
     (.press-strip), which we DO want on mobile (it's the brand-trust
     piece Kirsty asked for). Scope the rule to exclude .press-strip. */
  .awards-group + .awards-group:not(.press-strip) { display: none; }

  /* Footer: the "Explore" column duplicates the sidebar nav (which is
     in the burger drawer on mobile). Hide it; keep "Visit" and "Reach
     us" since those carry contact info you actually want at the foot
     of every page. Using :last-child here is robust even if .foot-brand
     ever moves; nth-of-type would mis-count because .foot-brand is also
     a div. */
  .foot-inner .foot-col:last-child { display: none; }

  /* Homepage story signature: on the homepage Krystoff is visible in
     the portrait directly beside the copy, so the "Krystoff · General
     Manager · Ennios" caption is redundant on mobile. Other pages'
     signatures (restaurant tagline, bar's Ellis Wines context, rooms'
     Telegraph quote) carry actual information and stay visible. */
  #story .signature { display: none; }
}

/* =====================================================================
   STICKY HERO + STICKY RESERVATION STRIP
   Hero pins at viewport top while content slides up over it — applies
   on both desktop and mobile so the user's "card slides up over the
   hero" effect works everywhere. The reservation strip's sticky-pin
   behaviour (flatten corners on contact with the top) is desktop-only:
   on mobile the strip simply scrolls past with the rest of the page.
   ===================================================================== */
.hero {
  position: sticky;
  top: 0;
  z-index: 0;
}
/* Sections, scroll-stack wrappers, and the footer that follow the hero
   ride above it in z-index. Targeting these tags specifically so we
   don't accidentally drag fixed-position siblings like the
   table-booking <aside> panel or its backdrop into normal flow. */
main > .hero ~ section:not(.reservation),
main > .hero ~ .scroll-stack,
main > .hero ~ .site-foot {
  position: relative;
  z-index: 2;
}
/* Sticky pin only on wide desktop (>1180px). Between 721–1180px the
   strip stacks into label / fields / CTA rows (the max-width:1180 rule
   above) — pinned in that stacked form it ate ~40% of an iPad-landscape
   viewport. Below 1181 it scrolls away naturally with the page. */
@media (min-width: 1181px) {
  main > .reservation {
    position: sticky;
    top: -1px;
    z-index: 5;
  }
  .reservation.is-pinned {
    border-top-left-radius: 0;
    border-top-right-radius: 0;
  }
}
/* Narrower viewports: explicitly non-sticky, sitting in normal flow
   above the sticky hero. Ensures z-index puts it over the hero as it
   scrolls. */
@media (max-width: 1180px) {
  main > .reservation {
    position: relative;
    z-index: 5;
  }
}

/* =====================================================================
   MOBILE BOTTOM NAV — app-style tab bar
   Visible only <720px. Fixed at viewport bottom; replaces the topbar +
   sidebar drawer combo on mobile. Honours iPhone safe-area inset so
   the bar sits above the home indicator on iOS.
   ===================================================================== */
.bottom-nav {
  display: none;
  position: fixed;
  bottom: 0;
  left: 0;
  right: 0;
  background: var(--ink);
  z-index: 50;
  padding: 8px 0 calc(8px + env(safe-area-inset-bottom));
  border-top: 1px solid rgba(244, 236, 222, .08);
  /* No rounded corners — sits flush at the very bottom of the screen. */
}
.bottom-nav__item {
  display: flex;
  flex: 1;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: 4px;
  padding: 6px 4px 4px;
  color: rgba(244, 236, 222, .58);
  text-decoration: none;
  font-family: var(--body);
  font-size: 10px;
  letter-spacing: .14em;
  text-transform: uppercase;
  font-weight: 500;
  transition: color .25s var(--ease);
  min-height: 48px;  /* touch target */
}
.bottom-nav__item:active,
.bottom-nav__item:hover {
  color: var(--cream);
}
.bottom-nav__item.is-active {
  color: var(--gold);
}
.bottom-nav__icon {
  width: 22px;
  height: 22px;
}
.bottom-nav__label {
  line-height: 1;
}

@media (max-width: 720px) {
  /* Show bottom nav, hide the old topbar + sidebar drawer on mobile. */
  .bottom-nav { display: flex; }
  .topbar { display: none; }
  .sidebar { display: none; }
  .drawer-scrim { display: none; }
  /* Push body content up so it isn't covered by the fixed bottom nav. */
  body {
    padding-bottom: calc(62px + env(safe-area-inset-bottom));
  }
  /* Remove main's desktop left-margin AND the 64px padding-top that was
     reserved for the now-hidden mobile topbar. */
  main {
    margin-left: 0;
    padding-top: 0;
  }
}

/* =====================================================================
   HERO LOGO (mobile) — replaces the 5-star decoration above the
   headline. Hidden by default; shown only inside the hero-arch on
   mobile. Subpages may not have the <img class="hero-logo"> element
   yet; the CSS gracefully no-ops when it's not present.
   ===================================================================== */
.hero-logo { display: none; }
@media (max-width: 720px) {
  .hero-arch .stars { display: none; }
  .hero-arch .btn { display: none; }
  .hero-logo {
    display: block;
    height: 48px;
    width: auto;
    margin: 0 auto 8px;
    opacity: .92;
  }
}

/* =====================================================================
   ROUNDED-CORNER GAP FILLERS — universal (desktop + mobile)
   The reservation strip and footer have rounded TOP corners. Their
   natural document position places those corners exactly at the
   boundary between sections, so the cut-out triangles would reveal
   the body background (white) showing through. Pulling each element
   up 18px makes its top 18px overlap the section above, so the
   cut-out corners reveal that section's background instead of a gap.
   ===================================================================== */
.reservation,
footer.site-foot {
  margin-top: -18px;
}
.reservation { padding-top: 56px; }
footer.site-foot { padding-top: calc(clamp(88px, 9vw, 128px) + 18px); }

/* =====================================================================
   MOBILE TOPBAR — smart hide on scroll
   Visible at top; hides when user scrolls down (away from top);
   reappears the moment user scrolls back up. Gives content room to
   breathe while keeping nav one swipe away.
   ===================================================================== */
.topbar {
  transition: transform .3s var(--ease);
}
.topbar.is-hidden {
  transform: translateY(-110%);
}

/* =====================================================================
   MOBILE RESERVATION STRIP — compact one-row CTA layout
   Placed at the END of the file so this @media block wins source-
   order over the earlier `@media (max-width: 1180px)` and
   `@media (max-width: 640px)` blocks which override .reservation-inner
   and .reservation-fields grid templates.
   6-col grid: label spans full width, check-in/out take 3 cols each
   on row 2, then adults / children / Book a Room sit on row 3 as
   2+2+2. display:contents on the inner wrappers flattens .field and
   .btn into the parent grid.
   ===================================================================== */
@media (max-width: 720px) {
  .reservation-inner {
    display: grid;
    grid-template-columns: repeat(6, 1fr);
    gap: 12px 10px;
    align-items: end;
  }
  .reservation-label {
    grid-column: 1 / -1;
    margin: 0 0 4px;
  }
  .reservation-fields,
  .reservation-ctas {
    display: contents;
  }
  .reservation-fields .field:nth-child(1) { grid-column: span 3; }
  .reservation-fields .field:nth-child(2) { grid-column: span 3; }
  .reservation-fields .field:nth-child(3) { grid-column: span 2; }
  .reservation-fields .field:nth-child(4) { grid-column: span 2; }
  /* Full-row CTA (same treatment as the rooms variant below): in the
     tight span-2 slot the nowrap "Book a room" label overflowed the
     button on narrow phones (clipped at ~360px, broken at 320px). */
  .reservation-ctas .btn.solid {
    grid-column: 1 / -1;
    margin: 0;
    padding: 14px 18px;
    font-size: 12px;
    letter-spacing: .22em;
    white-space: nowrap;
    align-self: start;
  }
  .reservation .field { margin: 0; }
  /* 16px minimum: anything smaller makes iOS Safari zoom the page when
     a date/select field is focused. */
  .reservation .field select,
  .reservation .field input { padding: 8px 0; font-size: 16px; }
  .reservation .field label {
    font-size: 9.5px;
    letter-spacing: .18em;
    margin-bottom: 4px;
  }

  /* TABLES variant (restaurant page) — Date + Time + Book sit on a
     single row (2 cols each in the 6-col grid). The Book button
     replaces the Party-size field; SevenRooms collects party size
     inside the slide-out widget.
     Override text-indent to match this variant's wider letter-spacing
     (.18em vs .14em on the rooms variant) so the "Book" label sits
     optically centred inside the button. */
  .reservation--tables .reservation-fields .field:nth-child(1) { grid-column: span 2; }
  .reservation--tables .reservation-fields .field:nth-child(2) { grid-column: span 2; }
  .reservation--tables .reservation-ctas .btn.solid {
    grid-column: span 2;
    padding: 14px 6px;
    font-size: 11.5px;
    letter-spacing: .18em;
    white-space: nowrap;
    align-self: end;
    text-indent: 0.18em;
    justify-content: center;
  }

  /* ROOMS variant (rooms page) — 4 fields + a single Book-a-room CTA
     that spans the full row beneath, so the text doesn't get clipped
     by the tight 2-col slot the homepage variant uses. */
  .reservation--rooms .reservation-ctas .btn.solid {
    grid-column: 1 / -1;
    padding: 14px 18px;
    font-size: 12px;
    letter-spacing: .22em;
    align-self: start;
  }
}

/* =====================================================================
   SCROLL-STACK — mobile-only sticky/slide-over transitions
   Two pair wrappers on the homepage:
     1) .welcome (sticky) ← .story (slides up over)
     2) .awards  (sticky) ← .cta-arch (slides up over)
   The wrapper acts as the containing block for the sticky element, so
   the pinned section RELEASES once the wrapper's bottom edge passes
   the viewport top. Without the wrapper, the sticky section would
   pin for the rest of the page.
   Desktop: wrapper is inert — just z-index plumbing so its sections
   still paint above the sticky hero.
   ===================================================================== */
@media (max-width: 720px) {
  /* First child = the sticky underneath section. Pins at top:0 while
     the second child slides up over it. */
  .scroll-stack > section:first-child {
    position: sticky;
    top: 0;
    z-index: 1;
  }
  /* Second child = the overlapping card. Rounded top corners + the
     same 2px gold edge as the reservation strip so the family of
     "card sliding up over" transitions reads as one design language. */
  .scroll-stack > section:last-child {
    position: relative;
    z-index: 2;
    border-top-left-radius: 18px;
    border-top-right-radius: 18px;
    box-shadow: 0 -2px 0 0 var(--gold);
  }
  /* The story section has a radial-gradient overlay (::before) that
     uses top: -200px / right: -200px positioning — without overflow
     hidden, the new rounded corners would be cut by that overlay's
     extension. .story already sets overflow: hidden, so its rounded
     corners actually clip the gradient. Same for .cta-arch which has
     overflow: hidden + isolation: isolate. Nothing extra to do. */
}

/* =====================================================================
   MOBILE FINE-TUNING — vertical rhythm + small fixes
   Targeted reductions to the generous desktop padding scales that
   render as too-large gaps at narrow widths. Footer rounded corners
   and overlap trick are also dropped on mobile since the cta-arch
   above already carries the "card sliding up" treatment.
   ===================================================================== */
@media (max-width: 720px) {
  /* The story (the dark "hosted in Southampton" section) has very
     generous desktop padding (clamp(112px, 11vw, 192px)). At 430px
     wide its top reads as a chasm. Pull it right in — the story
     now sits hard against where it slides up over the welcome. */
  .story { padding-top: 32px; }

  /* The awards ("Quietly recognised") gap is moderate by comparison:
     less drastic, just a tighten. */
  .awards { padding-top: 64px; }

  /* Reservation strip's universal 56px top padding overrides the
     base 38px to make room for the rounded-corner overlap trick on
     desktop. On mobile it's too much breathing room above the
     "Reservation" label — tighten it. */
  .reservation { padding-top: 28px; }

  /* Book-a-room button: letter-spacing trails a sliver of space
     AFTER the last letter, making centred text look pushed left.
     text-indent equal to the letter-spacing rebalances the optical
     centre by pushing the whole string right by one space-unit. */
  .reservation-ctas .btn.solid { text-indent: 0.14em; }

  /* Footer: drop the rounded top corners and the -18px overlap.
     The cta-arch above already carries the rounded-card treatment,
     so the footer can sit flush. Also halve the top padding — the
     scale was set to leave room for the overlap that's now gone.
     Bump padding-bottom so the Kombu credit clears the fixed
     bottom-nav (html/body { height: 100% } means body padding-bottom
     can't be relied on once content overflows — the last footer row
     itself has to leave the space). */
  footer.site-foot {
    border-top-left-radius: 0;
    border-top-right-radius: 0;
    margin-top: 0;
    padding-top: 48px;
    padding-bottom: calc(110px + env(safe-area-inset-bottom));
  }

  /* Drop the segmental-window-arch ornament that sat between the
     copyright line and the Kombu credit. In the stacked-column
     mobile foot-bottom it became visual noise rather than flourish.
     Desktop keeps the ornament — see the desktop override below. */
  .foot-bottom .ornament { display: none; }

  /* foot-bottom layout: tighten the gap between the copyright line
     and the Kombu credit so they read as a single attribution block,
     and tag the Kombu link in gold so it's obviously clickable. */
  .foot-bottom {
    gap: 4px;
    margin-top: 40px;
    padding-top: 18px;
  }
  .foot-credit a {
    color: var(--gold);
    text-decoration: none;
  }
  .foot-credit a:hover { text-decoration: underline; }

  /* Welcome section — mobile layout. Goal:
     [ H1                ] [          ]
     [ stars + rating    ] [   IMG    ]
     [ ........ body lede full width ........ ]
     The image (the dessert flat-lay) lives beside the H1/stars stack;
     the body text drops to a third row that spans the full width.
     display: contents on .welcome-center flattens its children so the
     h2, p.lede, and .welcome-rating become direct grid items of
     .welcome-inner — that's what lets us reposition them individually. */
  .welcome .welcome-inner {
    grid-template-columns: 1fr 0.42fr;
    column-gap: 18px;
    row-gap: 16px;
    align-items: start;
    text-align: left;
  }
  .welcome .welcome-side:first-child { display: none; }
  /* display: contents flattens .welcome-center so its children become
     direct grid items of .welcome-inner. text-align is reset to left
     here so it cascades to the h2 and the rating label — without this
     they inherit the desktop centre alignment via .welcome-center. */
  .welcome .welcome-center {
    display: contents;
    text-align: left;
  }

  /* Italian sub-label sits in the left column above the H2 when
     present (e.g. heritage and travel-cruise welcome sections). Pin
     it explicitly so it doesn't auto-flow into the image column or
     inherit the desktop centre-alignment. */
  .welcome .welcome-center .sub-label {
    grid-column: 1;
    grid-row: 1;
    justify-self: start;
    text-align: left;
    margin: 0 0 8px;
  }
  .welcome .welcome-center .sub-label + h2 { grid-row: 2; }
  .welcome .welcome-center .sub-label ~ .welcome-rating { grid-row: 3; }

  .welcome .welcome-center h2 {
    grid-column: 1;
    grid-row: 1;
    max-width: none;
    margin: 0;
    text-align: left;
  }
  .welcome .welcome-center .welcome-rating {
    grid-column: 1;
    grid-row: 2;
    align-items: flex-start;
    text-align: left;
    margin-top: 4px;
  }
  .welcome .welcome-center .welcome-rating .stars,
  .welcome .welcome-center .welcome-rating .label {
    text-align: left;
  }
  .welcome .welcome-center .lede {
    /* Sit in the left column only, matching the width of the H1 +
       stars stack above. Left-aligned to read consistently with the
       rest of the page. grid-row omitted so auto-flow handles
       sections with multiple .lede paragraphs (e.g. contact page,
       which has both an address block and a phone/email block) —
       they stack into rows 3, 4, … instead of all colliding on row 3. */
    grid-column: 1;
    margin: 14px 0 0;
    text-align: left;
    max-width: none;
  }
  /* Spacing for additional .lede paragraphs in the same welcome-center
     (tighter than the gap between rating → first lede). */
  .welcome .welcome-center .lede + .lede { margin-top: 8px; }

  .welcome .welcome-side:last-child {
    display: block;
    grid-column: 2;
    /* Span all three rows so the image extends the full height of
       the left-column stack instead of leaving a gap beside the body
       lede. `span 3` rather than `1 / -1` because there's no explicit
       grid-template-rows — without that, -1 collapses to row 1's end. */
    grid-row: 1 / span 3;
    align-self: stretch;
  }
  /* Free the arch-img from its global 3/5 aspect-ratio so it stretches
     to fill the grid area's full height. */
  .welcome .welcome-side:last-child .arch-img {
    aspect-ratio: auto;
    height: 100%;
  }
  /* Shift the dessert flat-lay further right so the pink ice-cream
     scoop is properly centred in the slim mobile crop. */
  .welcome .welcome-side:last-child .arch-img img {
    /* Source is ~1000x625 landscape with the cake-slice and pink
       ice-cream centred around X≈40% of the source width. The slim
       mobile container crops ~23% of the source horizontally, so an
       object-position X of ~40% lands the dessert in the middle of
       the visible frame. */
    object-position: 40% 45%;
  }

  /* Scroll-stack overlap — pull the second card up 18px so its rounded
     top corners sit OVER the section above, hiding the body background
     that would otherwise show through the cut-out corner triangles
     (the "dodgy edge" the user spotted at the bottom of welcome).
     Mirrors the universal reservation strip and footer overlap trick. */
  .scroll-stack > section:last-child {
    margin-top: -18px;
  }
  /* Compensate the story's existing 32px mobile padding-top so the
     visual gap from card edge to headline stays put despite the new
     overlap. The .cta-arch already has very generous mobile top
     padding (clamp(144px, …)) so its content-to-edge spacing already
     absorbs the 18px overlap without looking cramped. */
  .scroll-stack > .story { padding-top: 50px; }
}

/* =====================================================================
   FULL-SCREEN MENU OVERLAY (mobile)
   Triggered by the right-most bottom-nav item (.bottom-nav__menu-trigger).
   Slides up from below to cover the full viewport, listing every page
   on the site. Always present in the DOM but hidden via transform +
   visibility so it doesn't block interaction when closed.
   ===================================================================== */
.bottom-nav__menu-trigger {
  /* Strip default <button> chrome only — leave font properties alone
     so the .bottom-nav__item rule (applied via the same element's
     other class) defines the label's typography. Anything set here
     would override .bottom-nav__item via source order and leak the
     browser UA defaults back in. */
  background: transparent;
  border: 0;
  cursor: pointer;
}

.fullmenu {
  position: fixed;
  inset: 0;
  /* Height tracks the VISIBLE viewport. inset:0 alone is 100vh, which on
     tall phones extends behind the browser chrome, pushing the foot below
     the fold. 100dvh matches the visible area so the overlay scrolls. */
  height: 100vh;
  height: 100dvh;
  background: var(--ink);
  color: var(--cream);
  z-index: 100;
  display: flex;
  flex-direction: column;
  /* Centred-when-it-fits, top-aligned-and-scrollable when taller than
     the screen (plain 'center' clipped the top AND bottom items —
     Offers/Gifts/Contact — and made them unreachable). iOS Safari does
     not support 'safe center' on justify-content, so the centring is
     done with auto margins on the first/last in-flow children below,
     which behave as safe centring in every browser. */
  justify-content: flex-start;
  align-items: center;
  text-align: center;
  padding: 56px 24px calc(32px + env(safe-area-inset-bottom));
  transform: translateY(100%);
  visibility: hidden;
  transition: transform .42s var(--ease), visibility 0s linear .42s;
  overflow-y: auto;
  overscroll-behavior: contain;
  -webkit-overflow-scrolling: touch;
}
.fullmenu.is-open {
  transform: translateY(0);
  visibility: visible;
  transition: transform .42s var(--ease), visibility 0s linear 0s;
}
.fullmenu::before {
  /* Same warm radial glow used in .story — keeps the brand feel
     consistent with the dark sections of the site. */
  content: '';
  position: absolute;
  inset: -10% -10% auto auto;
  width: 80vw;
  aspect-ratio: 1;
  background: radial-gradient(closest-side, rgba(201,160,99,.10), transparent 70%);
  pointer-events: none;
}
.fullmenu__close {
  position: absolute;
  top: 18px;
  right: 18px;
  width: 42px;
  height: 42px;
  display: flex;
  align-items: center;
  justify-content: center;
  background: transparent;
  border: 1px solid rgba(244,236,222,.2);
  border-radius: 50%;
  color: var(--cream);
  cursor: pointer;
  transition: background .25s var(--ease), border-color .25s var(--ease);
}
.fullmenu__close:hover {
  background: rgba(244,236,222,.06);
  border-color: var(--gold);
}
.fullmenu__brand {
  display: block;
  /* margin-top:auto pairs with .fullmenu__foot's margin-bottom:auto:
     together they safe-centre the menu block (centred when it fits,
     top-aligned + scrollable when it overflows) in every browser. */
  margin: auto auto 24px;
  max-width: 116px;
  position: relative;
}
.fullmenu__brand img { width: 100%; height: auto; display: block; }
.fullmenu__nav {
  display: flex;
  flex-direction: column;
  gap: 10px;
  position: relative;
}
.fullmenu__nav a {
  font-family: var(--display);
  font-size: 21px;
  letter-spacing: -.01em;
  line-height: 1.15;
  color: var(--cream);
  text-decoration: none;
  transition: color .25s var(--ease);
}
.fullmenu__nav a:hover { color: var(--gold); }
.fullmenu__nav a.is-active {
  color: var(--gold);
  font-style: italic;
}
.fullmenu__ext {
  font-size: 14px;
  color: var(--gold);
  margin-left: 4px;
  vertical-align: top;
  letter-spacing: 0;
}
.fullmenu__foot {
  margin-top: 24px;
  margin-bottom: auto; /* see .fullmenu__brand — safe-centring pair */
  display: flex;
  flex-direction: column;
  gap: 4px;
  align-items: center;
  position: relative;
}
.fullmenu__phone {
  font-family: var(--display);
  font-style: italic;
  font-size: 18px;
  color: var(--gold);
  text-decoration: none;
}
.fullmenu__addr {
  font-size: 10.5px;
  letter-spacing: .26em;
  text-transform: uppercase;
  color: rgba(244,236,222,.5);
}
/* Lock body scroll when the menu is open. */
body.fullmenu-open { overflow: hidden; }

/* =====================================================================
   CONTACT MAP
   Custom-styled Leaflet map (Carto Positron tiles — clean grayscale)
   with a gold Ennios pin and a small overlay card. Sandwiched between
   the contact address welcome and the "A presto" CTA arch. Homepage
   "Find us on the map" button jumps straight to #map.
   ===================================================================== */
.contact-map {
  position: relative;
  z-index: 2;
  background: var(--paper-alt, var(--paper));
  padding: 0;
  scroll-margin-top: 24px;
  overflow: hidden;
}
.contact-map__canvas {
  width: 100%;
  height: clamp(380px, 62vh, 580px);
  background: #efebe4;
}
/* The Leaflet attribution / zoom controls — make them feel less like
   default Leaflet chrome and more like part of the design. */
.contact-map .leaflet-container {
  font-family: var(--body);
  background: #efebe4;
}
.contact-map .leaflet-control-attribution {
  background: rgba(244, 236, 222, .8);
  font-size: 10px;
  color: var(--text-soft, #6d655c);
  padding: 4px 8px;
}
.contact-map .leaflet-control-attribution a { color: var(--ink); }
.contact-map .leaflet-control-zoom a {
  background: var(--cream);
  border: 1px solid rgba(0, 0, 0, .12);
  color: var(--ink);
  font-family: var(--body);
}
.contact-map .leaflet-control-zoom a:hover {
  background: var(--gold);
  color: var(--cream);
}

/* Map overlay card with name, address, get-directions link. Floats
   over the map's top-left so the geography is still visible behind. */
.contact-map__card {
  position: absolute;
  top: 24px;
  left: 24px;
  z-index: 500;
  background: var(--cream);
  color: var(--ink);
  padding: 18px 22px 16px;
  max-width: 260px;
  border-radius: 4px;
  box-shadow: 0 22px 48px rgba(27, 22, 20, .22);
  font-family: var(--body);
}
.contact-map__name {
  font-family: var(--display);
  font-style: italic;
  font-size: 24px;
  line-height: 1;
  color: var(--ink);
  margin-bottom: 8px;
}
.contact-map__addr {
  font-size: 13px;
  line-height: 1.55;
  color: var(--text);
}
.contact-map__directions {
  display: inline-block;
  margin-top: 12px;
  font-size: 10.5px;
  font-weight: 500;
  letter-spacing: .22em;
  text-transform: uppercase;
  color: var(--gold);
  text-decoration: none;
  border-bottom: 1px solid transparent;
  padding-bottom: 2px;
  transition: border-color .25s var(--ease);
}
.contact-map__directions:hover { border-bottom-color: var(--gold); }

/* Mobile: pull the overlay card inward and make it smaller so it
   doesn't crowd the map. */
@media (max-width: 720px) {
  .contact-map__card {
    top: 16px;
    left: 16px;
    right: 16px;
    max-width: none;
    padding: 14px 16px 14px;
  }
  .contact-map__name { font-size: 20px; }
  .contact-map__addr { font-size: 12px; }
}

/* Custom gold pin marker. The :pulse expands and fades behind the
   dot for a subtle attention-pull. */
.ennios-pin {
  position: relative;
  width: 28px;
  height: 28px;
}
.ennios-pin__dot {
  position: absolute;
  inset: 8px;
  background: var(--gold);
  border: 2px solid var(--cream);
  border-radius: 50%;
  box-shadow: 0 2px 6px rgba(27, 22, 20, .45);
}
.ennios-pin__pulse {
  position: absolute;
  inset: 0;
  border: 2px solid var(--gold);
  border-radius: 50%;
  opacity: 0.5;
  animation: ennios-pin-pulse 2.6s ease-out infinite;
}
@keyframes ennios-pin-pulse {
  0%   { transform: scale(0.4); opacity: 0.7; }
  100% { transform: scale(1.8); opacity: 0; }
}
@media (prefers-reduced-motion: reduce) {
  .ennios-pin__pulse { animation: none; opacity: 0; }
}

/* =====================================================================
   CONTACT INFO — opening hours + press, side-by-side
   Sits between the contact welcome card and the map. Two columns at
   desktop, stacked at mobile. Mirrors the .welcome-inner padding so
   the page reads as one rhythm.
   ===================================================================== */
.contact-info {
  padding: clamp(48px, 7vw, 96px) clamp(32px, 5vw, 72px);
  background: var(--paper, #f7f3ec);
}
.contact-info__inner {
  max-width: var(--maxw);
  margin: 0 auto;
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: clamp(32px, 4.5vw, 80px);
  align-items: start;
}
.contact-info__col h2 {
  font-size: clamp(28px, 2.8vw, 40px);
  margin: 6px 0 18px;
}
.contact-info__col h2 em { font-style: italic; color: var(--gold); font-weight: 500; }
.contact-info__col p { color: var(--text-soft); max-width: 38ch; }

/* Italian script sub-label. Italic gold display script sitting above
   the page H1 or major section H2. Bare, no ornaments — the script
   on its own reads as refined; flanking it with fleurons or stars
   reads as tacky. */
.contact-info .sub-label,
.sub-label {
  display: inline-block;
  font-family: var(--display);
  font-style: italic;
  font-weight: 400;
  font-size: clamp(17px, 1.6vw, 22px);
  letter-spacing: 0.02em;
  color: var(--gold);
  text-transform: none;
  line-height: 1;
  opacity: .95;
}
.hero-arch .sub-label {
  font-size: clamp(20px, 1.9vw, 26px);
  margin-bottom: 14px;
  letter-spacing: .01em;
  color: var(--gold);
  text-shadow: 0 1px 12px rgba(0,0,0,.35);
}
.welcome-center .sub-label,
.story-copy .sub-label,
.rooms-head .sub-label {
  margin-bottom: 10px;
}

.hours-list {
  list-style: none;
  margin: 18px 0 14px;
  padding: 0;
  border-top: 1px solid var(--rule);
}
.hours-list li {
  display: flex;
  justify-content: space-between;
  align-items: baseline;
  gap: 16px;
  padding: 12px 0;
  border-bottom: 1px solid var(--rule);
}
.hours-label {
  font-weight: 500;
  letter-spacing: 0.01em;
}
.hours-times {
  color: var(--text-soft);
  font-feature-settings: "tnum" 1, "lnum" 1;
}
.hours-note {
  font-size: 13px;
  color: var(--text-soft);
  font-style: italic;
  margin-top: 12px;
}

.press-contact {
  margin-top: 18px;
  padding: 18px 22px;
  border: 1px solid var(--rule);
  background: #fff;
  border-radius: 4px;
  display: flex;
  flex-direction: column;
  gap: 6px;
}
.press-contact__role {
  font-size: 12px;
  letter-spacing: 0.1em;
  text-transform: uppercase;
  color: var(--text-soft);
}
.press-contact a {
  color: var(--ink, #2a2a2a);
  text-decoration: underline;
  text-underline-offset: 3px;
  text-decoration-thickness: 1px;
}

@media (max-width: 820px) {
  .contact-info__inner {
    grid-template-columns: 1fr;
    gap: 40px;
  }
}

/* =====================================================================
   SIDEBAR — collapse-on-scroll (desktop only)
   JS sets body.sidebar-collapsed once the hero has scrolled past. We
   shrink --sidebar-w from 320px to 68px; both .sidebar (its own width)
   and main (its left margin) read that variable, so they animate
   together. Brand, nav and footer all shrink to slim-rail form. The
   sidebar's :hover state re-expands the sidebar only (not main), so
   the expanded panel overlaps content rather than shoving it sideways
   on every mouse-over.
   Scoped to min-width:1025px — below that the sidebar is the hamburger
   drawer, and these rules were stripping the drawer's nav labels and
   shrinking the brand on tablets (broken-looking drawer on iPad). The
   JS that toggles the class is gated to the same 1025px breakpoint.
   ===================================================================== */
@media (min-width: 1025px) {
  body.sidebar-collapsed { --sidebar-w: 68px; }

  body.sidebar-collapsed .sidebar { padding: 30px 10px 24px; }

  body.sidebar-collapsed .brand { margin: 4px auto 22px; }
  body.sidebar-collapsed .brand img {
    max-width: 38px;
    transition: max-width .45s var(--ease);
  }
  .brand img { transition: max-width .45s var(--ease); }

  body.sidebar-collapsed .nav { margin-top: 12px; gap: 6px; }
  body.sidebar-collapsed .nav a {
    justify-content: center;
    gap: 0;
    padding: 11px 0;
    border-left: 0;
  }
  body.sidebar-collapsed .nav a:hover,
  body.sidebar-collapsed .nav a.active { padding-left: 0; }
  body.sidebar-collapsed .nav-label {
    display: none;
  }
  body.sidebar-collapsed .nav-icon {
    width: 18px;
    height: 18px;
    opacity: .65;
  }
  body.sidebar-collapsed .nav a:hover .nav-icon,
  body.sidebar-collapsed .nav a.active .nav-icon {
    opacity: 1;
    color: var(--gold);
  }

  body.sidebar-collapsed .sidebar-foot { gap: 6px; padding-top: 12px; }
  body.sidebar-collapsed .sidebar-foot .phone-num,
  body.sidebar-collapsed .sidebar-foot .phone-hint { display: none; }
  body.sidebar-collapsed .sidebar-foot .phone-badge { width: 36px; height: 36px; }
  body.sidebar-collapsed .sidebar-foot .socials { gap: 6px; margin-top: 4px; }
  body.sidebar-collapsed .sidebar-foot .socials a {
    width: 24px; height: 24px;
  }
  body.sidebar-collapsed .sidebar-foot .socials a svg { width: 12px; height: 12px; }
  body.sidebar-collapsed .dal-1866 { display: none; }

  /* Hover-expand: only the sidebar grows, main stays at margin-left:68px.
     Setting an explicit width here wins over width:var(--sidebar-w) on the
     element rule because this is more specific. */
  body.sidebar-collapsed .sidebar:hover,
  body.sidebar-collapsed .sidebar:focus-within {
    width: 320px;
    padding: 36px 30px 32px;
    box-shadow: 0 0 36px rgba(0, 0, 0, .35);
    z-index: 70;
  }
  body.sidebar-collapsed .sidebar:hover .brand,
  body.sidebar-collapsed .sidebar:focus-within .brand { margin: 8px auto 36px; }
  body.sidebar-collapsed .sidebar:hover .brand img,
  body.sidebar-collapsed .sidebar:focus-within .brand img { max-width: 240px; }
  body.sidebar-collapsed .sidebar:hover .nav,
  body.sidebar-collapsed .sidebar:focus-within .nav { margin-top: 24px; gap: 4px; }
  body.sidebar-collapsed .sidebar:hover .nav a,
  body.sidebar-collapsed .sidebar:focus-within .nav a {
    justify-content: flex-start;
    gap: 14px;
    padding: 11px 18px;
    border-left: 1px solid transparent;
  }
  body.sidebar-collapsed .sidebar:hover .nav-label,
  body.sidebar-collapsed .sidebar:focus-within .nav-label { display: inline; }
  body.sidebar-collapsed .sidebar:hover .nav-icon,
  body.sidebar-collapsed .sidebar:focus-within .nav-icon { width: 16px; height: 16px; }
  body.sidebar-collapsed .sidebar:hover .sidebar-foot,
  body.sidebar-collapsed .sidebar:focus-within .sidebar-foot {
    gap: 10px;
    padding-top: 18px;
  }
  body.sidebar-collapsed .sidebar:hover .sidebar-foot .phone-num,
  body.sidebar-collapsed .sidebar:focus-within .sidebar-foot .phone-num { display: block; }
  body.sidebar-collapsed .sidebar:hover .sidebar-foot .phone-badge,
  body.sidebar-collapsed .sidebar:focus-within .sidebar-foot .phone-badge {
    width: 44px; height: 44px;
  }
  body.sidebar-collapsed .sidebar:hover .sidebar-foot .socials,
  body.sidebar-collapsed .sidebar:focus-within .sidebar-foot .socials {
    gap: 10px; margin-top: 8px;
  }
  body.sidebar-collapsed .sidebar:hover .sidebar-foot .socials a,
  body.sidebar-collapsed .sidebar:focus-within .sidebar-foot .socials a {
    width: 30px; height: 30px;
  }
  body.sidebar-collapsed .sidebar:hover .sidebar-foot .socials a svg,
  body.sidebar-collapsed .sidebar:focus-within .sidebar-foot .socials a svg {
    width: 14px; height: 14px;
  }
  body.sidebar-collapsed .sidebar:hover .dal-1866,
  body.sidebar-collapsed .sidebar:focus-within .dal-1866 { display: flex; }
}

@media (prefers-reduced-motion: reduce) {
  .sidebar,
  main { transition: none; }
  .sidebar .brand img { transition: none; }
}

/* =====================================================================
   SIDEBAR — vertical compression for shorter laptop viewports.
   The full sidebar at default sizes is ~800px tall (brand + tricolour
   + 11 nav items + foot + Dal 1866 mark). Many laptops have 700-720px
   usable viewport height. Without intervention the foot block clips
   off the bottom. Three breakpoints progressively tighten everything
   so the nav fits comfortably; below 600px tall, overflow-y:auto
   handles the rare overflow without showing a scrollbar.
   Width-scoped (min-width:720px) so mobile-drawer behaviour is
   unaffected. */
@media (min-width: 721px) and (max-height: 820px) {
  .sidebar { padding: 24px 26px 22px; }
  .brand { margin: 4px auto 18px; }
  .brand img { max-width: 190px; }
  .tricolour-rule--sidebar { width: 42px; margin: 0 auto 14px; }
  .nav { margin-top: 14px; gap: 2px; }
  .nav a { padding: 9px 18px; }
  .sidebar-foot { padding-top: 12px; gap: 8px; }
  .sidebar-foot .phone-badge { width: 40px; height: 40px; }
  .dal-1866 { padding-top: 10px; margin: 4px auto 0; }
  .dal-1866__top { font-size: 14px; }
}

@media (min-width: 721px) and (max-height: 720px) {
  .sidebar { padding: 18px 22px 18px; }
  .brand img { max-width: 160px; }
  .brand { margin: 2px auto 12px; }
  .tricolour-rule--sidebar { width: 36px; margin: 0 auto 10px; }
  .nav { margin-top: 8px; gap: 1px; }
  .nav a { padding: 7px 18px; font-size: 13.5px; }
  .nav-icon { width: 15px; height: 15px; }
  .sidebar-foot { padding-top: 10px; gap: 6px; }
  .sidebar-foot .phone-badge { width: 36px; height: 36px; }
  .sidebar-foot .phone-num { font-size: 13px; }
  .sidebar-foot .socials { gap: 8px; margin-top: 4px; }
  .sidebar-foot .socials a { width: 26px; height: 26px; }
  .dal-1866 { padding-top: 8px; }
  .dal-1866__top { font-size: 13px; }
  .dal-1866__bot { font-size: 8px; letter-spacing: 0.22em; }
}

@media (min-width: 721px) and (max-height: 640px) {
  .sidebar { padding: 14px 20px 14px; }
  .brand img { max-width: 140px; }
  .brand { margin: 0 auto 8px; }
  .tricolour-rule--sidebar { display: none; }
  .nav a { padding: 6px 18px; font-size: 13px; }
  .sidebar-foot .socials { display: none; }
  .dal-1866 { display: none; }
}

/* =====================================================================
   ITALIAN-AUTHENTICITY POLISH
   ===================================================================== */

/* Italian script sub-labels above page-defining headings.
   Pairs e.g. "Cucina" with "An Italian welcome…", "Camere" with "Ten
   bedrooms, above the ristorante". Italic display font, gold-toned,
   relaxed letter-spacing. Used as a sibling element that sits one line
   above an h1 or h2, separated by a small margin. The base styling is
   already set on .sub-label (for the contact-info section); this
   layer adds the hero-arch variant which sits inside the centred hero
   stack and needs extra breathing room. */
.hero-arch .sub-label,
.welcome-center .sub-label,
.story-copy .sub-label,
.rooms-head .sub-label,
.offers-section .sub-label {
  display: block;
  margin: 0 auto 8px;
  text-align: inherit;
}
.hero-arch .sub-label { color: var(--gold); opacity: .9; }

/* "Dal 1866 · Famiglia Ennios" mark.
   Appears in the sidebar foot above the phone number, and in the
   site footer beside the © year. Two-line stamp: italic script
   "Dal 1866" on top, small-caps "FAMIGLIA ENNIOS" below. Both lines
   share gold/cream tones depending on the surface. */
.dal-1866 {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 2px;
  margin: 6px auto 4px;
  padding-top: 14px;
  border-top: 1px solid rgba(244, 236, 222, .12);
  width: 100%;
}
.dal-1866__top {
  font-family: var(--display, 'general-sans', serif);
  font-style: italic;
  font-size: 15px;
  color: var(--gold);
  letter-spacing: .04em;
  line-height: 1;
}
.dal-1866__bot {
  font-size: 9px;
  letter-spacing: .26em;
  text-transform: uppercase;
  color: rgba(244, 236, 222, .55);
  margin-top: 2px;
}

/* Footer variant (light background, less ornament). */
.foot-bottom .dal-1866 {
  border-top: none;
  padding-top: 0;
  margin: 0;
  width: auto;
  flex-direction: row;
  gap: 10px;
  align-items: baseline;
}
.foot-bottom .dal-1866__bot {
  color: rgba(244, 236, 222, .45);
  margin-top: 0;
}

/* =====================================================================
   DROP CAPS — Italian Renaissance editorial touch.
   Applied to the first paragraph of LEFT-ALIGNED content blocks only.
   Centred text (welcome-center) is excluded because the floated drop
   cap and the per-line re-centring don't agree visually — the body
   below the cap drifts off-axis. Story + home-feature blocks are
   left-aligned so the wrap is clean.
   ===================================================================== */
.story-copy p:first-of-type::first-letter,
.home-feature__body::first-letter {
  font-family: var(--display);
  font-style: italic;
  font-weight: 400;
  font-size: 3.6em;
  float: left;
  line-height: 0.85;
  margin: 0.08em 0.12em -0.05em -0.04em;
  color: var(--gold);
  text-shadow: 0 1px 1px rgba(0, 0, 0, .03);
}

@media (max-width: 720px) {
  .story-copy p:first-of-type::first-letter,
  .home-feature__body::first-letter {
    font-size: 3.1em;
    margin: 0.06em 0.1em -0.05em -0.04em;
  }
}

/* =====================================================================
   ITALIAN TRICOLOUR ACCENT — discreet, used sparingly.
   A short 3px-tall green-white-red bar sits under select headers as
   a quiet Italian flag echo. CSS-only via linear-gradient.
   Variants:
   - default: section-header pairing
   - --sidebar: lives under the Ennios brand mark in the sidebar
   - --hero: lives inside hero-arch under the page H1
   ===================================================================== */
.tricolour-rule {
  display: block;
  width: 64px;
  height: 3px;
  margin: 8px auto 0;
  background: linear-gradient(
    to right,
    #008C45 0%,
    #008C45 33.33%,
    #F4F5F0 33.33%,
    #F4F5F0 66.66%,
    #CD212A 66.66%,
    #CD212A 100%
  );
  border-radius: 1px;
  opacity: .85;
}
/* Sidebar variant: sits under the brand mark, before the nav.
   Slightly narrower so it tracks the logo width, with a touch
   more breathing room above and below. */
.tricolour-rule--sidebar {
  width: 48px;
  margin: 0 auto 8px;
  opacity: .8;
  transition: width .45s var(--ease), opacity .25s var(--ease);
}
/* When sidebar collapses, shrink the tricolour to fit the slim rail.
   Same 1025px scope as the rest of the collapsed-state styling so the
   tablet drawer is never affected. */
@media (min-width: 1025px) {
  body.sidebar-collapsed .tricolour-rule--sidebar {
    width: 24px;
    opacity: .65;
  }
  body.sidebar-collapsed .sidebar:hover .tricolour-rule--sidebar,
  body.sidebar-collapsed .sidebar:focus-within .tricolour-rule--sidebar {
    width: 48px;
    opacity: .8;
  }
}
/* CTA-arch variant: sits between the H2 and the phone line on the
   homepage closing CTA. Lifted slightly with mt/mb so it reads as a
   small finishing flourish, not a divider. */
.tricolour-rule--cta {
  margin: 14px auto 6px;
  width: 72px;
  opacity: .9;
}
/* Hero variant: lives inside .hero-arch between the Benvenuto
   sub-label and the H1. Slightly wider so it reads as a deliberate
   Italian flag accent under the script word; sits on a dark hero
   background so the white middle stripe pops cleanly. */
.tricolour-rule--hero {
  margin: 10px auto 14px;
  width: 56px;
  opacity: .95;
  box-shadow: 0 1px 6px rgba(0, 0, 0, .25);
}

/* =====================================================================
   EXPERIENCE GRID (Travel & Cruise) — 4 tiles in a row at desktop,
   stacking to 2 columns then 1 on narrower screens. Each tile is a
   portrait image with the title + sub-label + body laid below.
   ===================================================================== */
.experience-grid {
  padding: clamp(64px, 7vw, 112px) clamp(32px, 5vw, 72px);
  background: #fff;
}
.experience-grid__head {
  max-width: 760px;
  margin: 0 auto clamp(40px, 5vw, 72px);
  text-align: center;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 14px;
}
.experience-grid__head h2 {
  font-size: clamp(28px, 3vw, 44px);
  line-height: 1.15;
  color: var(--ink);
  font-weight: 400;
}
.experience-grid__head h2 em {
  font-style: italic;
  color: var(--gold);
  font-weight: 500;
}
.experience-grid__inner {
  max-width: var(--maxw);
  margin: 0 auto;
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: clamp(20px, 2.4vw, 36px);
}
.experience-tile {
  display: flex;
  flex-direction: column;
  gap: 16px;
}
.experience-tile__media .arch-img {
  aspect-ratio: 3 / 4;
}
.experience-tile__media .arch-img img {
  width: 100%;
  height: 100%;
  object-fit: cover;
}
.experience-tile__body {
  display: flex;
  flex-direction: column;
  gap: 8px;
}
.experience-tile__body h3 {
  font-family: var(--display);
  font-size: clamp(20px, 1.7vw, 26px);
  font-weight: 400;
  line-height: 1.2;
  color: var(--ink);
}
.experience-tile__body p {
  color: var(--text-soft);
  font-size: 14.5px;
  line-height: 1.6;
}
@media (max-width: 980px) {
  .experience-grid__inner { grid-template-columns: repeat(2, 1fr); }
}
@media (max-width: 560px) {
  .experience-grid__inner { grid-template-columns: 1fr; }
}

/* =====================================================================
   CRABBY CABS — dark partner section. White-on-transparent wordmark
   needs a dark backdrop. Two-column at desktop (logo + brand on the
   left, copy on the right), stacked on mobile.
   ===================================================================== */
.crabby {
  padding: clamp(64px, 7vw, 112px) clamp(32px, 5vw, 72px);
  background: linear-gradient(135deg, #1a1a1a 0%, #2a2a2a 100%);
  color: var(--cream);
  position: relative;
}
.crabby::before {
  content: '';
  position: absolute;
  inset: 0;
  background:
    radial-gradient(60% 50% at 80% 20%, rgba(201, 160, 99, .08), transparent 60%),
    radial-gradient(50% 40% at 20% 80%, rgba(255, 255, 255, .04), transparent 60%);
  pointer-events: none;
}
.crabby__inner {
  max-width: var(--maxw);
  margin: 0 auto;
  display: grid;
  grid-template-columns: 1fr 1.4fr;
  gap: clamp(32px, 4vw, 64px);
  align-items: center;
  position: relative;
}
.crabby__brand {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 14px;
  text-align: center;
}
.crabby__logo {
  width: 100%;
  max-width: 260px;
  height: auto;
  filter: drop-shadow(0 6px 24px rgba(0,0,0,.4));
}
.crabby__brand .sub-label {
  color: var(--gold);
  opacity: .85;
}
.crabby__copy h2 {
  font-size: clamp(28px, 3vw, 42px);
  line-height: 1.15;
  color: var(--cream);
  font-weight: 400;
  margin-bottom: 18px;
}
.crabby__copy h2 em {
  font-style: italic;
  color: var(--gold);
}
.crabby__copy p {
  color: rgba(244, 236, 222, .85);
  font-size: 15.5px;
  line-height: 1.65;
  max-width: 56ch;
}
.crabby__copy .crabby__direct {
  color: var(--gold);
  font-weight: 600;
  font-size: 14px;
  line-height: 1.55;
  letter-spacing: .01em;
  max-width: 56ch;
  margin-top: 18px;
}
.crabby__ctas {
  display: flex;
  gap: 12px;
  margin-top: 22px;
  flex-wrap: wrap;
}
.crabby .btn {
  border-color: var(--cream);
  color: var(--cream);
}
.crabby .btn:hover { border-color: var(--gold); color: var(--gold); }
.crabby .btn.solid {
  background: var(--gold);
  color: var(--ink);
  border-color: var(--gold);
}
.crabby .btn.solid:hover { background: transparent; color: var(--gold); }
.crabby__note { font-size: 0; height: 0; }
@media (max-width: 820px) {
  .crabby__inner { grid-template-columns: 1fr; gap: 36px; text-align: center; }
  .crabby__copy { text-align: center; }
  .crabby__copy p { margin: 0 auto; }
  .crabby__ctas { justify-content: center; }
}

/* =====================================================================
   GROUP BOOKINGS (on the offers page) — 4-tile grid for Corporates,
   Birthdays, Christmas, Wedding Breakfasts.
   ===================================================================== */
.group-bookings {
  padding: clamp(64px, 7vw, 112px) clamp(32px, 5vw, 72px);
  background: var(--paper, #f7f3ec);
  border-top: 1px solid var(--rule);
}
.group-bookings__head {
  max-width: 760px;
  margin: 0 auto clamp(40px, 5vw, 72px);
  text-align: center;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 14px;
}
.group-bookings__head h2 {
  font-size: clamp(28px, 3vw, 44px);
  line-height: 1.15;
  color: var(--ink);
  font-weight: 400;
}
.group-bookings__head h2 em { font-style: italic; color: var(--gold); font-weight: 500; }
.group-bookings__head .lede { color: var(--text-soft); max-width: 60ch; }
.group-bookings__head .tricolour-rule { margin-top: 12px; }
.group-bookings__grid {
  max-width: var(--maxw);
  margin: 0 auto;
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: clamp(20px, 2.4vw, 36px);
}
.group-tile {
  display: flex;
  flex-direction: column;
  background: #fff;
  border: 1px solid var(--rule);
  border-radius: 4px;
  overflow: hidden;
  transition: transform .3s var(--ease), box-shadow .3s var(--ease);
}
.group-tile:hover {
  transform: translateY(-4px);
  box-shadow: 0 16px 36px rgba(0, 0, 0, .08);
}
.group-tile__media .arch-img {
  aspect-ratio: 4 / 3;
  border-radius: 0;
}
.group-tile__media .arch-img img {
  width: 100%;
  height: 100%;
  object-fit: cover;
}
.group-tile__body {
  padding: 22px 22px 26px;
  display: flex;
  flex-direction: column;
  gap: 10px;
  flex: 1;
}
.group-tile__body h3 {
  font-family: var(--display);
  font-size: clamp(20px, 1.8vw, 26px);
  font-weight: 400;
  line-height: 1.2;
  color: var(--ink);
}
.group-tile__body p {
  color: var(--text-soft);
  font-size: 14.5px;
  line-height: 1.6;
  flex: 1;
}
.group-tile__body .btn { align-self: flex-start; margin-top: 6px; }
@media (max-width: 980px) {
  .group-bookings__grid { grid-template-columns: repeat(2, 1fr); }
}
@media (max-width: 560px) {
  .group-bookings__grid { grid-template-columns: 1fr; }
}

/* =====================================================================
   OLD TOWN strip — small association block on the heritage page.
   Logo placeholder on the left, brief copy + CTA on the right.
   ===================================================================== */
.old-town-strip {
  padding: clamp(48px, 5vw, 80px) clamp(32px, 5vw, 72px);
  background: #fff;
  border-top: 1px solid var(--rule);
  border-bottom: 1px solid var(--rule);
}
.old-town-strip__inner {
  max-width: 980px;
  margin: 0 auto;
  display: grid;
  grid-template-columns: 200px 1fr;
  gap: clamp(28px, 4vw, 64px);
  align-items: center;
}
.old-town-strip__badge {
  display: flex;
  align-items: center;
  justify-content: center;
}
.old-town-strip__logo {
  width: 100%;
  max-width: 180px;
  height: auto;
  display: block;
}
.old-town-strip__copy h3 {
  font-family: var(--display);
  font-size: clamp(22px, 2vw, 30px);
  font-weight: 400;
  line-height: 1.2;
  color: var(--ink);
  margin: 6px 0 10px;
}
.old-town-strip__copy h3 em { font-style: italic; color: var(--gold); }
.old-town-strip__copy p {
  color: var(--text-soft);
  font-size: 15px;
  line-height: 1.6;
  margin-bottom: 14px;
  max-width: 50ch;
}
@media (max-width: 720px) {
  .old-town-strip__inner { grid-template-columns: 1fr; text-align: center; }
  .old-town-strip__badge { max-width: 180px; margin: 0 auto; }
  .old-town-strip__copy p { margin-left: auto; margin-right: auto; }
}

/* =====================================================================
   HOMEPAGE HERITAGE STRIP — modest cinematic band between the two
   home-features. Loops the same heritage.mp4 used on the heritage
   page hero, but sized small enough to whisper rather than dominate.
   Two-column at desktop, stacks on mobile.
   ===================================================================== */
.home-heritage-strip {
  padding: clamp(48px, 6vw, 96px) clamp(32px, 5vw, 72px);
  background: var(--ink, #2a2a2a);
  color: var(--cream);
  position: relative;
}
.home-heritage-strip__inner {
  max-width: var(--maxw);
  margin: 0 auto;
  display: grid;
  grid-template-columns: 1.2fr 1fr;
  gap: clamp(32px, 4vw, 72px);
  align-items: center;
}
.home-heritage-strip__video {
  position: relative;
  aspect-ratio: 16 / 9;
  max-height: 360px;
  overflow: hidden;
  border-radius: 4px;
  background: #1a1a1a;
}
.home-heritage-strip__video video {
  width: 100%;
  height: 100%;
  object-fit: cover;
}
.home-heritage-strip__copy {
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  gap: 14px;
}
.home-heritage-strip__copy h2 {
  font-size: clamp(24px, 2.6vw, 36px);
  line-height: 1.15;
  color: var(--cream);
  font-weight: 400;
  max-width: 18ch;
}
.home-heritage-strip__copy h2 em {
  font-style: italic;
  color: var(--gold);
}
.home-heritage-strip__copy p {
  color: rgba(244, 236, 222, .8);
  font-size: 15.5px;
  line-height: 1.6;
  max-width: 38ch;
}
.home-heritage-strip__copy .sub-label {
  color: var(--gold);
  opacity: .9;
}
.home-heritage-strip .btn {
  border-color: var(--cream);
  color: var(--cream);
  margin-top: 6px;
}
.home-heritage-strip .btn:hover {
  border-color: var(--gold);
  color: var(--gold);
}
@media (max-width: 820px) {
  .home-heritage-strip__inner { grid-template-columns: 1fr; }
  .home-heritage-strip__video { max-height: 240px; }
}

/* =====================================================================
   HERITAGE TIMELINE — vertical alternating cards with a centred rule.
   Inspired by The Ritz London's history page. Each event sits on one
   side of a thin central vertical line; year-marker bubbles sit on the
   line itself. Desktop alternates left/right via .timeline-event--left
   / --right modifiers. Mobile collapses to a single column with the
   line shifted to the left edge.
   ===================================================================== */
.heritage-timeline {
  padding: clamp(64px, 8vw, 128px) clamp(20px, 5vw, 72px);
  background: var(--paper, #f7f3ec);
  position: relative;
}
.heritage-timeline__head {
  max-width: 760px;
  margin: 0 auto clamp(48px, 6vw, 96px);
  text-align: center;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 16px;
}
.heritage-timeline__head h2 {
  font-size: clamp(28px, 3.6vw, 52px);
  line-height: 1.1;
  color: var(--ink);
  font-weight: 400;
}
.heritage-timeline__head h2 em {
  font-style: italic;
  color: var(--gold);
  font-weight: 500;
}
.heritage-timeline__head .lede {
  color: var(--text-soft);
  max-width: 58ch;
  margin: 0 auto;
}
.heritage-timeline__head .tricolour-rule { margin-top: 18px; }

.heritage-timeline__list {
  position: relative;
  list-style: none;
  padding: 0;
  margin: 0 auto;
  max-width: 1180px;
}
/* Centre vertical line on desktop. Single thin gold-tinted rule that
   the year-marker bubbles sit on. */
.heritage-timeline__list::before {
  content: '';
  position: absolute;
  top: 0;
  bottom: 0;
  left: 50%;
  width: 1px;
  background: linear-gradient(
    to bottom,
    transparent 0,
    rgba(201, 160, 99, .25) 6%,
    rgba(201, 160, 99, .35) 50%,
    rgba(201, 160, 99, .25) 94%,
    transparent 100%
  );
  transform: translateX(-50%);
}

.timeline-event {
  position: relative;
  display: grid;
  grid-template-columns: 1fr 116px 1fr;
  gap: clamp(20px, 3vw, 48px);
  align-items: start;
  margin: 0 0 clamp(64px, 8vw, 112px);
}
.timeline-event:last-child { margin-bottom: 0; }

.timeline-event__year {
  grid-column: 2;
  display: flex;
  justify-content: center;
  align-items: flex-start;
  position: relative;
  z-index: 1;
}
.timeline-event__year span {
  font-family: var(--display);
  font-style: italic;
  font-weight: 400;
  font-size: clamp(26px, 2.6vw, 40px);
  color: var(--gold);
  background: var(--paper, #f7f3ec);
  padding: 8px 14px;
  letter-spacing: 0.01em;
  white-space: nowrap;
  line-height: 1;
}

.timeline-event__content {
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  gap: 14px;
}
.timeline-event--left .timeline-event__content {
  grid-column: 1;
  grid-row: 1;
  text-align: right;
  align-items: flex-end;
  padding-right: 4px;
}
.timeline-event--right .timeline-event__content {
  grid-column: 3;
  grid-row: 1;
  text-align: left;
  padding-left: 4px;
}
.timeline-event__content h3 {
  font-family: var(--display);
  font-size: clamp(22px, 2vw, 30px);
  font-weight: 400;
  line-height: 1.2;
  color: var(--ink);
  max-width: 22ch;
}
.timeline-event__content p {
  color: var(--text-soft);
  max-width: 38ch;
  font-size: 15.5px;
  line-height: 1.65;
}
.timeline-event__content .sub-label { margin-bottom: 4px; }
.timeline-event__cta {
  display: flex;
  gap: 12px;
  margin-top: 12px;
  flex-wrap: wrap;
}
/* Small italic caption under the body — used for image provenance
   (e.g. "Thomas Rowlandson's c.1794 drawing"). Different from the
   gold sub-label above the heading; this is a quiet credit line below. */
.timeline-event__caption {
  font-size: 12.5px;
  color: var(--text-soft);
  font-style: italic;
  line-height: 1.55;
  margin-top: 8px;
  padding-top: 8px;
  border-top: 1px dashed var(--rule);
  max-width: 38ch;
}
.timeline-event--left .timeline-event__caption {
  margin-left: auto;
}
/* Inline range marker on year cells (e.g. 1833–1840). Sits slightly
   smaller than the primary year so 1833 reads as the anchor. */
.timeline-event__year-range {
  font-size: 0.6em;
  letter-spacing: 0.04em;
  display: inline-block;
  margin-left: 2px;
  vertical-align: 0.18em;
  color: rgba(201, 160, 99, 0.75);
}
.timeline-event--left .timeline-event__cta { justify-content: flex-end; }

.timeline-event__media {
  position: relative;
}
.timeline-event--left .timeline-event__media {
  grid-column: 3;
  grid-row: 1;
}
.timeline-event--right .timeline-event__media {
  grid-column: 1;
  grid-row: 1;
}
.timeline-event__media .arch-img {
  aspect-ratio: 4 / 5;
  max-width: 380px;
}
.timeline-event--left .timeline-event__media .arch-img { margin-left: 0; margin-right: auto; }
.timeline-event--right .timeline-event__media .arch-img { margin-right: 0; margin-left: auto; }
.timeline-event__media .arch-img img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  filter: sepia(0.08) contrast(1.02);
}
/* Per-image framing nudges. The 19th-century dock map is wider than
   it is tall — the default centre crop hides the Town Quay end of
   the harbour (the part that's relevant to the heritage story) and
   shows the later dock-company expansions on the right instead.
   Anchor the cover-crop to the left so the Town Quay area stays in
   frame. */
.welcome-side .arch-img img.img-shift-left,
.timeline-event__media .arch-img img.img-shift-left {
  object-position: left center;
}
/* Mirror for the restaurant-page painting: the framed waiter sits in
   the right half of the source image, with a window on the left.
   Default centre-cover-crop puts the white wall between them in
   frame. Anchor to the right so the painting fills the view. */
.story-portrait .arch-img img.img-shift-right,
.welcome-side .arch-img img.img-shift-right {
  object-position: right center;
}

.heritage-timeline__foot {
  max-width: 740px;
  margin: clamp(56px, 6vw, 80px) auto 0;
  text-align: center;
  border-top: 1px solid var(--rule);
  padding-top: 28px;
}
.heritage-credits {
  font-size: 12.5px;
  color: var(--text-soft);
  line-height: 1.6;
  font-style: italic;
}

/* Mobile: collapse to single column, line on left edge.
   The year-marker bubble used to sit on the vertical rule via a tight
   36px column + translateX(-9px) shift. That broke once date ranges
   like "1554-1620" or "1833-1840" entered the timeline: the wider
   year text overflowed its column and visually crashed into the
   sub-label of the next row. The fix is two-fold: (1) hide the
   range-secondary year on mobile so the bubble shows just the anchor
   year, (2) move the year cell off the rule line entirely on mobile
   and sit it inline above the heading. The line is decorative only
   at this width. */
@media (max-width: 820px) {
  .heritage-timeline__list::before {
    left: 18px;
    transform: none;
  }
  .timeline-event {
    grid-template-columns: 36px 1fr;
    gap: 14px;
    margin-bottom: 56px;
  }
  .timeline-event__year {
    grid-column: 1;
    grid-row: 1;
    justify-content: flex-start;
    padding-top: 2px;
  }
  .timeline-event__year span {
    font-size: 20px;
    padding: 4px 6px;
    background: var(--paper);
    transform: translateX(-9px);
    line-height: 1.1;
  }
  .timeline-event__year-range {
    display: none;
  }
  .timeline-event--left .timeline-event__content,
  .timeline-event--right .timeline-event__content {
    grid-column: 2;
    grid-row: 1;
    text-align: left;
    align-items: flex-start;
    padding: 0;
  }
  .timeline-event--left .timeline-event__cta { justify-content: flex-start; }
  .timeline-event--left .timeline-event__media,
  .timeline-event--right .timeline-event__media {
    grid-column: 2;
    grid-row: 2;
    margin-top: 18px;
  }
  .timeline-event__media .arch-img {
    aspect-ratio: 16 / 11;
    max-width: 100%;
    margin: 0 !important;
  }
}

/* =====================================================================
   HERO ENNIOS-LOGO — slow fade-in on page load (mobile)
   The hero-arch's default `lift` keyframe animation cascade fades all
   the arch children in over .9s with .25–.85s stagger. The Ennios
   mark deserves a slower, more deliberate reveal. Override the
   default child rule with a long, gentle pure-opacity fade from t=0.
   ===================================================================== */
@keyframes hero-logo-slow-fade {
  from { opacity: 0; }
  to   { opacity: 1; }
}
.hero-arch > .hero-logo {
  opacity: 0;
  animation: hero-logo-slow-fade 4s ease-out forwards;
  animation-delay: 0s;
}

/* =====================================================================
   GUEST REVIEWS — small, quiet review band. Sits between the Le camere
   feature and the As-seen-in press marquee on the homepage. Designed
   to hold 1, 2 or 3+ cards without restructuring: one card centres,
   two sit side-by-side, three+ wrap into a 3-column grid on desktop.
   Mobile is always single-column.
   ===================================================================== */
.reviews {
  padding: clamp(56px, 6vw, 96px) clamp(24px, 5vw, 72px);
  background: var(--paper, #f7f3ec);
  border-top: 1px solid var(--rule);
  border-bottom: 1px solid var(--rule);
}
.reviews-inner {
  max-width: var(--maxw);
  margin: 0 auto;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: clamp(32px, 4vw, 48px);
}
.reviews-head {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 12px;
  text-align: center;
}
.reviews-head h2 {
  margin: 0;
  font-family: var(--display);
  font-weight: 400;
  font-size: clamp(28px, 3.4vw, 40px);
  line-height: 1.15;
  color: var(--ink);
  text-wrap: balance;
}
.reviews-head h2 em {
  font-style: italic;
  color: var(--gold, #b08a3b);
}

/* Grid: auto-fit. With the 320px minmax + the section's content max-width,
   the grid sits 3-across at desktop, 2-across at tablet, 1 column on
   mobile. A single card centres at its 560px cap; two share a row. */
.reviews-grid {
  width: 100%;
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(min(320px, 100%), 1fr));
  gap: clamp(20px, 2.4vw, 32px);
  justify-items: center;
}

.review-card {
  background: var(--cream, #faf6ee);
  border: 1px solid var(--rule);
  padding: clamp(22px, 2.6vw, 32px);
  max-width: 560px;
  width: 100%;
  display: flex;
  flex-direction: column;
  gap: 16px;
  position: relative;
}
/* Hairline gold accent at the top of every card so the section reads
   as "recognition" without needing a heavy treatment. */
.review-card::before {
  content: "";
  position: absolute;
  top: -1px;
  left: 0;
  right: 0;
  height: 2px;
  background: var(--gold, #b08a3b);
  opacity: .55;
}

.review-card__stars {
  font-size: 14px;
  letter-spacing: .25em;
  color: var(--gold, #b08a3b);
  line-height: 1;
}

.review-card__quote {
  margin: 0;
  font-family: var(--display);
  font-style: italic;
  font-weight: 400;
  font-size: clamp(14px, 1.15vw, 16px);
  line-height: 1.6;
  color: var(--ink);
  text-wrap: pretty;
}
/* Italian-style typographic quote marks rather than the plain "" already
   in the screenshot — feels more editorial than transactional. */
.review-card__quote::before { content: "« "; color: var(--gold, #b08a3b); }
.review-card__quote::after  { content: " »"; color: var(--gold, #b08a3b); }

.review-card__attr {
  display: flex;
  flex-direction: column;
  gap: 2px;
  padding-top: 14px;
  border-top: 1px solid var(--rule);
}
.review-card__author {
  font-family: var(--body);
  font-size: 14px;
  font-weight: 500;
  letter-spacing: .01em;
  color: var(--ink);
}
.review-card__source {
  font-family: var(--body);
  font-size: 11px;
  letter-spacing: .18em;
  text-transform: uppercase;
  color: var(--text-soft);
}

/* Mobile: tighter card padding, slightly smaller heading. */
@media (max-width: 720px) {
  .reviews { padding: 48px 18px; }
  .reviews-grid { grid-template-columns: 1fr; }
  .review-card { max-width: 100%; }
}

/* =====================================================================
   ANNOUNCEMENT BANNER (home) — sheet-driven, hidden until live.
   ===================================================================== */
.announce {
  background: var(--ink);
  color: var(--cream);
  border-bottom: 1px solid var(--gold-glow);
}
.announce[hidden] { display: none; }
/* Rolling ticker (Kirsty, 2026-07-02). cms.js replaces the static skeleton
   with .announce__sr (one visually-hidden accessible copy) + .announce__track
   (aria-hidden, message repeated in two identical halves; translateX(-50%)
   loops seamlessly). Duration is set inline by cms.js for constant speed. */
.announce__inner {
  padding: 11px 0;
  overflow: hidden;
  display: flex;
  align-items: center;
}
.announce__sr {
  position: absolute;
  width: 1px; height: 1px;
  padding: 0; margin: -1px;
  overflow: hidden;
  clip: rect(0 0 0 0);
  white-space: nowrap;
  border: 0;
}
.announce__track {
  display: inline-flex;
  align-items: center;
  white-space: nowrap;
  will-change: transform;
  animation: announceRoll 40s linear infinite;
}
.announce:hover .announce__track { animation-play-state: paused; }
.announce__group {
  display: inline-flex;
  align-items: center;
  gap: 28px;
  padding-right: 28px;
}
@keyframes announceRoll {
  from { transform: translateX(0); }
  to   { transform: translateX(-50%); }
}
.announce__dot {
  width: 7px; height: 7px; border-radius: 50%;
  background: var(--gold); flex-shrink: 0;
}
.announce__msg,
.announce__item {
  font-family: var(--body);
  font-size: 13px;
  font-weight: 500;
  letter-spacing: .05em;
}
.announce__item { flex-shrink: 0; }
@media (prefers-reduced-motion: reduce) {
  /* Static banner: no scroll, first copy readable at the left edge. */
  .announce__track { animation: none; padding-left: 24px; }
}
@media (max-width: 560px) {
  .announce__msg, .announce__item { font-size: 12px; letter-spacing: .03em; }
}

/* =====================================================================
   OPENING HOURS BAND (home) — lunch highlight + hours grid.
   ===================================================================== */
.hours-band {
  background: var(--ink);
  color: var(--cream);
  padding: clamp(52px, 7vw, 96px) clamp(20px, 5vw, 60px);
}
.hours-band__inner {
  max-width: var(--maxw);
  margin: 0 auto;
  display: grid;
  grid-template-columns: 1fr 1.25fr;
  gap: clamp(30px, 5vw, 68px);
  align-items: center;
}
.hours-band__lead .sub-label { margin-bottom: 12px; }
.hours-band__lead h2 {
  font-family: var(--display);
  font-weight: 400;
  font-size: clamp(30px, 4vw, 46px);
  line-height: 1.05;
  margin: 0 0 14px;
}
.hours-band__lead h2 em { font-style: italic; color: var(--gold); }
.hours-band__lunch {
  font-family: var(--body);
  font-size: clamp(15px, 1.5vw, 17px);
  line-height: 1.6;
  color: rgba(242, 238, 230, .82);
  max-width: 34ch;
}
.hours-band__lunch strong { color: var(--gold); font-weight: 600; }
.hours-band__grid {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: clamp(16px, 2.5vw, 30px);
}
.hours-col {
  display: flex;
  flex-direction: column;
  gap: 7px;
  padding-left: 18px;
  border-left: 1px solid rgba(201, 160, 99, .35);
}
.hours-col__label {
  font-family: var(--display);
  font-style: italic;
  font-size: 20px;
  color: var(--gold);
  margin-bottom: 3px;
}
.hours-col__time {
  font-family: var(--body);
  font-size: 13.5px;
  letter-spacing: .01em;
  color: rgba(242, 238, 230, .85);
}
@media (max-width: 860px) {
  .hours-band__inner { grid-template-columns: 1fr; gap: 30px; text-align: center; }
  .hours-band__lunch { max-width: none; }
  .hours-col { border-left: 0; padding-left: 0; align-items: center; }
}
@media (max-width: 560px) {
  .hours-band__grid { grid-template-columns: 1fr; gap: 22px; }
  .hours-col { padding-bottom: 18px; border-bottom: 1px solid rgba(201,160,99,.18); }
  .hours-col:last-child { border-bottom: 0; padding-bottom: 0; }
}

/* =====================================================================
   PARTY MENU downloads (top of the Party panel) + pre-order form button.
   ===================================================================== */
.menu-panel__downloads {
  display: flex;
  gap: clamp(18px, 3vw, 36px);
  flex-wrap: wrap;
  justify-content: center;
  margin: 4px auto clamp(30px, 4vw, 46px);
  padding-bottom: clamp(22px, 3vw, 30px);
  border-bottom: 1px solid var(--rule);
}
.menu-dl-group {
  display: flex;
  flex-direction: column;
  gap: 10px;
  align-items: stretch;
  min-width: 220px;
}
.menu-panel__pdf--form {
  border-style: dashed;
  border-color: var(--gold-soft);
  color: var(--gold-soft);
}
.menu-panel__pdf--form:hover {
  background: var(--gold-soft);
  color: var(--cream);
  border-style: solid;
}
@media (max-width: 560px) {
  .menu-dl-group { min-width: 0; width: 100%; }
}

/* Sheet-driven specials container — reuses .menu-section styling. */
.specials-live[hidden] { display: none; }
[data-specials-fallback][hidden] { display: none; }


/* =====================================================================
   PRIVACY & LEGAL page — plain editorial text page, ported from the
   old WP /privacy-legal-information/ + /gpdr/ pages.
   ===================================================================== */
.legal-page {
  background: var(--paper);
  padding: clamp(96px, 12vw, 150px) 24px clamp(64px, 8vw, 110px);
}
.legal-page__inner {
  max-width: 720px;
  margin: 0 auto;
}
.legal-page__head { margin-bottom: clamp(28px, 4vw, 48px); }
.legal-page h1 {
  font-family: var(--display);
  font-weight: 400;
  font-size: clamp(30px, 4.6vw, 46px);
  line-height: 1.08;
  color: var(--ink);
  margin: 0;
}
.legal-page h1 em { font-style: italic; color: var(--gold-soft); }
.legal-page h2 {
  font-family: var(--display);
  font-weight: 500;
  font-size: clamp(21px, 2.4vw, 26px);
  color: var(--ink);
  margin: clamp(36px, 5vw, 56px) 0 8px;
  padding-top: clamp(20px, 3vw, 30px);
  border-top: 1px solid var(--rule);
}
.legal-page h3 {
  font-family: var(--body);
  font-weight: 600;
  font-size: 12px;
  letter-spacing: .16em;
  text-transform: uppercase;
  color: var(--gold-soft);
  margin: 28px 0 6px;
}
.legal-page p,
.legal-page li {
  font-family: var(--body);
  font-size: 15px;
  line-height: 1.75;
  color: var(--ink-soft);
  margin: 0 0 12px;
}
.legal-page ul { padding-left: 20px; margin: 0 0 12px; }
.legal-page a { color: var(--gold-soft); text-underline-offset: 3px; }

/* =====================================================================
   ROBBIE SCZABO live-music dates (restaurant page, sheet-driven).
   Chips stay hidden until cms.js finds upcoming dates in the sheet.
   ===================================================================== */
.robbie-dates { margin: 4px 0 24px; }
.robbie-dates[hidden] { display: none; }
.robbie-dates__label {
  display: block;
  font-family: var(--body);
  font-size: 11px;
  font-weight: 600;
  letter-spacing: .18em;
  text-transform: uppercase;
  color: var(--gold-soft);
  margin-bottom: 10px;
}
.robbie-dates__list {
  list-style: none;
  margin: 0;
  padding: 0;
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
}
.robbie-dates__item {
  padding: 7px 14px;
  border: 1px solid var(--gold-soft);
  border-radius: 999px;
  font-family: var(--body);
  font-size: 13px;
  color: var(--ink-soft);
  background: var(--cream);
  white-space: nowrap;
}

/* Bottom-anchored cover crop: the offers wedding photo has the couple
   in the doorway at the very bottom of a square frame — a centre crop
   loses them. */
.arch-img img.img-shift-bottom {
  object-position: center bottom;
  /* The couple stands in the doorway at the base of a six-storey facade —
     zoom in on the lower-centre so they read at tile size. */
  transform: scale(1.7);
  transform-origin: center bottom;
}
/* Top-anchored: Robbie's face and hat sit in the upper half of his
   portrait — a centre crop decapitates the hat. */
.arch-img img.img-shift-top { object-position: center top; }
/* Robbie's live-music portrait is a tall photo; the default landscape
   home-feature frame (16/10) cropped his chin. Give this one a portrait
   frame so his face sits properly inside it. */
.home-feature--robbie .home-feature__media .arch-img { aspect-ratio: 4 / 5; }
.home-feature--robbie .home-feature__media .arch-img img { object-position: center 12%; }

/* =====================================================================
   CONTACT ENQUIRY FORM (Kirsty, 2026-07-03)
   ===================================================================== */
.enquiry {
  background: var(--paper);
  padding: clamp(56px, 7vw, 100px) 24px;
  border-top: 1px solid var(--rule);
}
.enquiry__inner { max-width: 860px; margin: 0 auto; }
.enquiry__inner h2 {
  font-family: var(--display);
  font-weight: 400;
  font-size: clamp(26px, 3.6vw, 38px);
  color: var(--ink);
  margin: 10px 0 10px;
}
.enquiry__inner h2 em { font-style: italic; color: var(--gold-soft); }
.enquiry__lede {
  font-family: var(--body);
  font-size: 15px;
  line-height: 1.7;
  color: var(--ink-soft);
  max-width: 560px;
  margin: 0 0 28px;
}
.enquiry-form__grid {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 18px 20px;
}
.enquiry-form .field { display: flex; flex-direction: column; gap: 7px; }
.enquiry-form .field--full { grid-column: 1 / -1; }
.enquiry-form .field__label {
  font-family: var(--body);
  font-size: 11px;
  font-weight: 600;
  letter-spacing: .16em;
  text-transform: uppercase;
  color: var(--gold-soft);
}
.enquiry-form input,
.enquiry-form select,
.enquiry-form textarea {
  font-family: var(--body);
  font-size: 16px; /* 16px minimum — below this iOS Safari zooms on focus */
  color: var(--ink);
  background: var(--paper);
  border: 1px solid var(--rule);
  border-radius: 4px;
  padding: 12px 14px;
  width: 100%;
  transition: border-color .2s var(--ease);
}
.enquiry-form textarea { resize: vertical; min-height: 96px; }
.enquiry-form input:focus,
.enquiry-form select:focus,
.enquiry-form textarea:focus {
  outline: none;
  border-color: var(--gold);
}
.enquiry-form__hp {
  position: absolute !important;
  left: -9999px !important;
  width: 1px; height: 1px;
  opacity: 0;
  pointer-events: none;
}
.enquiry-form__foot {
  margin-top: 24px;
  display: flex;
  align-items: center;
  gap: 18px;
  flex-wrap: wrap;
}
.enquiry-form__status {
  font-family: var(--body);
  font-size: 14px;
  font-style: italic;
  color: var(--ink-soft);
}
@media (max-width: 640px) {
  .enquiry-form__grid { grid-template-columns: 1fr; }
}
