/* ============================================================
   RISERVA — style.css
     1. Custom properties (palette, type, spacing)
     2. Reset
     3. Base typography
     4. Layout helpers + logo mark
     5. Header (desktop)
     6. Sticky behaviour
     7. Mobile hamburger + overlay menu
     8. Sections
        8a masthead · 8b food/set/dessert menus · 8c set toggle
        8d wine (cellar) · 8e functions
     9. Motion / footer
    10. Responsive breakpoints
   ============================================================ */


/* ------------------------------------------------------------
   1. CUSTOM PROPERTIES  — the single source of truth.
   One palette across the whole site: cream ground, brass and sand golds,
   ink text. No tonal inversion anywhere. Every colour pair is measured —
   the ratios are noted inline.
   ------------------------------------------------------------ */
:root {
  /* Palette — values chosen against WCAG AA (see README / audit) */
  --cream:  #F7F5EF;   /* page background                              */
  --linen:  #EFE9DC;   /* one warm step deeper — arrival bands only    */
  --brass:  #876A2B;   /* gold accent + text on cream   — 4.67:1 AA    */
  --sand:      #7C6926; /* readable muted TEXT on cream  — 4.93:1 AA    */
  --sand-soft: #C4AC7C; /* DECORATIVE gold — on CREAM/WHITE only (arrows,
                           masthead tagline, form hairline, status dot). Warm-
                           on-warm against --linen, so never use it there.  */
  --ink:    #2A2622;   /* body text on cream            — 13.77:1 AAA  */
  /* One palette: cream / brass / sand / ink. The old dark wine-list tokens
     were deleted — the wine list is cream like the rest of the site. */

  /* Derived neutral (mixed from the palette — no new hex) */
  --muted: color-mix(in srgb, var(--ink) 68%, var(--cream));  /* descriptor text — 5.07:1 AA on cream */

  /* Type families */
  --font-display: "Cormorant Garamond", Georgia, serif;
  --font-body:    "Jost", system-ui, sans-serif;

  /* Fluid type scale — clamp(min, preferred, max) */
  --step--1: clamp(0.78rem, 0.75rem + 0.15vw, 0.86rem);
  --step-0:  clamp(1rem,    0.96rem + 0.2vw,  1.13rem);
  --step-1:  clamp(1.25rem, 1.15rem + 0.5vw,  1.6rem);
  --step-2:  clamp(1.75rem, 1.5rem + 1.2vw,   2.5rem);
  --step-3:  clamp(2.5rem,  2rem + 2.6vw,     4rem);
  --step-4:  clamp(3.5rem,  2.5rem + 5vw,     6.5rem);

  /* Spacing scale — 4px base */
  --sp-1:  0.25rem;  --sp-2:  0.5rem;   --sp-3:  0.75rem;  --sp-4:  1rem;
  --sp-6:  1.5rem;   --sp-8:  2rem;     --sp-12: 3rem;     --sp-16: 4rem;
  --sp-24: 6rem;     --sp-32: 8rem;

  /* Widths */
  --measure: 68ch;
  --layout:  1080px;

  /* Motif */
  --rule: 1px solid var(--brass);

  /* Header height (offsets anchor scrolling) */
  --header-h: 4.5rem;
}


/* ------------------------------------------------------------
   2. RESET
   ------------------------------------------------------------ */
*, *::before, *::after { box-sizing: border-box; }
* { margin: 0; }
html { -webkit-text-size-adjust: 100%; scroll-behavior: smooth; }
body { min-height: 100vh; line-height: 1.5; -webkit-font-smoothing: antialiased; }
img, picture, svg { display: block; max-width: 100%; }
button { font: inherit; color: inherit; background: none; border: none; cursor: pointer; }
a { color: inherit; text-decoration: none; }
ul, ol { list-style: none; padding: 0; }
:target { scroll-margin-top: var(--header-h); }

/* SVG <symbol> defs — invisible but referenceable by <use>.
   NOT display:none (that breaks <use> in some engines). */
.svg-defs { position: absolute; width: 0; height: 0; overflow: hidden; }

/* Keyboard focus — a brass ring on every focusable element. (Form inputs
   override this with their own brass underline; see .field …:focus-visible.)
   The ring inherits the ground-aware --brass, so it is deep gold on cream
   and brand gold inside the cellar. */
:focus-visible { outline: 2px solid var(--brass); outline-offset: 3px; }

/* Body scroll-lock while the wine dialog is open (pins position exactly). */
body.scroll-locked { position: fixed; left: 0; right: 0; width: 100%; overflow: hidden; }

/* Screen-reader-only — present in the a11y tree, invisible on screen. */
.visually-hidden {
  position: absolute;
  width: 1px; height: 1px;
  padding: 0; margin: -1px;
  overflow: hidden;
  clip: rect(0 0 0 0);
  white-space: nowrap;
  border: 0;
}

/* Skip link — off-screen until focused, then pinned top-left. */
.skip-link {
  position: fixed;
  left: var(--sp-4);
  top: -6rem;
  z-index: 300;
  background: var(--ink);
  color: var(--cream);
  padding: var(--sp-3) var(--sp-6);
  font-family: var(--font-body);
  font-size: var(--step--1);
  letter-spacing: 0.1em;
  text-transform: uppercase;
  transition: top 0.2s ease;
}
.skip-link:focus-visible { top: var(--sp-4); outline-offset: 2px; }


/* ------------------------------------------------------------
   3. BASE TYPOGRAPHY
   ------------------------------------------------------------ */
body {
  font-family: var(--font-body);
  font-weight: 300;
  font-size: var(--step-0);
  color: var(--ink);
  background: var(--cream);
}
h1, h2, h3 { font-family: var(--font-display); font-weight: 300; line-height: 1.1; }


/* ------------------------------------------------------------
   4. LAYOUT HELPERS + LOGO MARK
   ------------------------------------------------------------ */
.section {
  max-width: var(--layout);
  margin-inline: auto;
  padding: var(--sp-24) var(--sp-6);
}
.rule-short {
  border: 0;
  border-top: var(--rule);
  width: 60px;
  margin: var(--sp-6) auto 0;
}

/* The arch logo (currentColor inherits the local text colour).
   Sized by height only; width follows the viewBox aspect ratio. */
/* width:auto on a viewBox-less <svg> defaults to 300px; aspect-ratio makes
   the box hug the mark's true width (monogram 142.7:216). --xl overrides
   for the lockup symbol (200.92:292.961). */
.mark { color: var(--brass); width: auto; height: 24px; aspect-ratio: 142.7 / 216; }
.mark--xs { height: 24px; }   /* footer            */
.mark--sm { height: 28px; }   /* header            */
.mark--md { height: 60px; }   /* conversion bands  */
.mark--lg { height: 90px; }   /* masthead          */
.mark--xl { height: 150px; aspect-ratio: 200.92 / 292.961; }  /* closing band — full lockup, wordmark legible */


/* ------------------------------------------------------------
   5. HEADER (desktop)
   ------------------------------------------------------------ */
.site-header {
  position: absolute;
  top: 0; left: 0; right: 0;
  z-index: 100;
  background: var(--cream);
}
.header-inner {
  max-width: 1140px;
  margin-inline: auto;
  min-height: var(--header-h);
  padding: var(--sp-4) 2rem;
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 2rem;
}
.brand { display: flex; align-items: center; gap: var(--sp-3); flex: none; }
.brand .mark { color: var(--brass); }
.wordmark {
  font-family: var(--font-display);
  font-weight: 400;
  font-size: var(--step-1);
  letter-spacing: 0.35em;
  color: var(--ink);
  padding-left: 0.35em;
}
.nav-desktop { display: flex; align-items: center; gap: var(--sp-8); }

/* Plain text links — brass underline on hover */
.nav-desktop a:not(.btn-book) {
  font-size: var(--step--1);
  letter-spacing: 0.12em;
  text-transform: uppercase;
  color: var(--ink);
  padding-bottom: 2px;
  border-bottom: 1px solid transparent;
  transition: border-color 0.2s ease, color 0.2s ease;
}
.nav-desktop a:not(.btn-book):visited { color: var(--ink); }   /* never let :visited restyle the nav */
.nav-desktop a:not(.btn-book):hover,
.nav-desktop a:not(.btn-book):focus-visible { color: var(--brass); border-bottom-color: var(--brass); }

/* Gift Cards — a text link, not a button (one CTA only). Sand outbound arrow. */
.nav-desktop a { white-space: nowrap; }
.ext-arrow { color: var(--sand-soft); font-size: 0.85em; }

/* Book Now — the only styled button. Ink outline, fills on hover. */
.btn-book {
  font-size: var(--step--1);
  letter-spacing: 0.12em;
  text-transform: uppercase;
  color: var(--ink);
  border: 1px solid var(--ink);
  padding: var(--sp-2) var(--sp-4);
  transition: background 0.2s ease, color 0.2s ease;
}
.btn-book:hover { background: var(--ink); color: var(--cream); }


/* ------------------------------------------------------------
   6. STICKY BEHAVIOUR  (JS flips data-stuck once masthead passes)
   ------------------------------------------------------------ */
.site-header[data-stuck="true"] {
  position: fixed;
  animation: drop-in 0.3s ease;
  border-bottom: var(--rule);
}
@keyframes drop-in { from { transform: translateY(-100%); } to { transform: translateY(0); } }


/* ------------------------------------------------------------
   7. MOBILE HAMBURGER + OVERLAY MENU
   ------------------------------------------------------------ */
.hamburger {
  display: none;
  flex-direction: column;
  justify-content: center;
  gap: 5px;
  width: 2rem; height: 2rem;
}
.hamburger span { display: block; height: 1px; width: 100%; background: var(--ink); }

.mobile-menu {
  position: fixed;
  inset: 0;
  z-index: 200;
  background: var(--cream);
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: var(--sp-8);
  opacity: 0;
  visibility: hidden;
  transition: opacity 0.25s ease, visibility 0.25s ease;
}
.mobile-menu[data-open="true"] { opacity: 1; visibility: visible; }
.mobile-close {
  position: absolute;
  top: var(--sp-6); right: var(--sp-6);
  font-size: var(--step-2);
  line-height: 1;
  color: var(--ink);
}
.mobile-nav { display: flex; flex-direction: column; align-items: center; gap: var(--sp-6); text-align: center; }
.mobile-nav a {
  font-family: var(--font-display);
  font-weight: 300;
  font-size: var(--step-3);
  letter-spacing: 0.05em;
  color: var(--ink);
}
.mobile-nav a:hover { color: var(--brass); }
.mobile-nav .btn-book { font-family: var(--font-body); font-size: var(--step-0); margin-top: var(--sp-4); }


/* ------------------------------------------------------------
   8. SECTIONS
   ------------------------------------------------------------ */

/* --- 8a. Masthead — typographic hero + arch mark + epigraph --- */
#masthead {
  position: relative;
  min-height: 100vh;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  text-align: center;
  padding: var(--sp-24) var(--sp-6);
  background: var(--cream);
}
.masthead-mark { margin: 0 auto var(--sp-8); }
.masthead-title {
  font-family: var(--font-display);
  font-weight: 300;
  font-size: clamp(3rem, 14vw, 11rem);
  line-height: 1;
  letter-spacing: 0.15em;
  color: var(--ink);
  padding-left: 0.15em;
}
.masthead-title span { display: inline-block; }
.masthead-tagline {
  margin-top: var(--sp-8);
  font-size: var(--step--1);
  text-transform: uppercase;
  letter-spacing: 0.28em;
  color: var(--sand-soft);   /* decorative — must recede beneath the wordmark, not compete */
}
.masthead-rule { border: 0; border-top: var(--rule); width: 60px; margin: var(--sp-8) auto; }
.masthead-epigraph {
  max-width: 40ch;
  margin-inline: auto;
  font-family: var(--font-display);
  font-style: italic;
  font-weight: 400;
  font-size: var(--step-2);
  line-height: 1.3;
  color: var(--brass);
}
.masthead-cue {
  position: absolute;
  bottom: var(--sp-12);
  left: 50%;
  transform: translateX(-50%);
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: var(--sp-3);
  font-size: var(--step--1);
  text-transform: uppercase;
  letter-spacing: 0.25em;
  color: var(--muted);
}
.masthead-cue-rule { width: 1px; height: 40px; background: var(--brass); }
.masthead-cue:hover { color: var(--brass); }


/* --- 8b. Menus (Food / Set / Dessert) — dl, dotted leaders --- */
.menu-head { text-align: center; margin-bottom: var(--sp-16); }
.menu-head h2 { font-size: var(--step-2); letter-spacing: 0.03em; }

/* #food: explicit two-column layout (left/right groups fixed) */
.food-grid {
  max-width: var(--layout);
  margin-inline: auto;
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 0 var(--sp-16);
}
.menu-single { max-width: 620px; margin-inline: auto; }   /* #dessert */

/* Course heading row: name left; note or price right; brass rule beneath */
.course-head {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: var(--sp-4);
  border-bottom: var(--rule);
  padding-bottom: var(--sp-2);
  margin: var(--sp-16) 0 var(--sp-4);
}
.course-name {
  font-family: var(--font-display);
  font-weight: 400;
  font-size: var(--step-1);
  color: var(--brass);
}
.course-note {
  font-family: var(--font-body);
  font-weight: 400;
  font-size: 0.65rem;
  text-transform: uppercase;
  letter-spacing: 0.2em;
  color: var(--sand);
  text-align: right;
}
.course-price {
  font-family: var(--font-body);
  font-weight: 300;
  font-size: var(--step-0);
  font-variant-numeric: tabular-nums;
  color: var(--brass);
}

/* Priced item row: dt (dish) · CSS dotted leader · dd (price).
   dt uses display:contents so its text + ::after leader become
   flex siblings of the price. No dot characters in the HTML. */
.course-list { margin: 0; }
.menu-item {
  display: flex;
  align-items: baseline;
  gap: var(--sp-3);
  padding: var(--sp-2) 0;
  font-family: var(--font-body);
  font-weight: 300;
  font-size: var(--step-0);
  line-height: 1.35;
  color: var(--ink);
}
.menu-item dt { display: contents; }
.menu-item dt::after {
  content: "";
  flex: 1 1 var(--sp-16);
  align-self: flex-end;
  margin-bottom: 0.32em;
  border-bottom: 1px dotted var(--brass);
}
.menu-item dd {
  flex: 0 0 auto;
  font-family: var(--font-body);
  font-weight: 300;
  font-variant-numeric: tabular-nums;
  color: var(--brass);
  white-space: nowrap;
}
.menu-item dd.mp { font-variant-caps: small-caps; letter-spacing: 0.05em; color: var(--sand); }

/* No-price row (Sides): plain, no leader */
.menu-item--plain { display: block; }
.menu-item--plain dt { display: block; }
.menu-item--plain dt::after { content: none; }

/* Indented sub-item (e.g. "with liqueur +8") */
.menu-item--sub { padding-left: var(--sp-6); color: var(--muted); }

/* Footnotes + seasonal note */
.menu-foot {
  max-width: var(--layout);
  margin: var(--sp-8) auto 0;
  font-size: 0.8rem;
  font-style: italic;
  color: var(--sand);
  text-align: center;
}
.menu-foot .mp { font-style: normal; font-variant-caps: small-caps; letter-spacing: 0.05em; }
.menu-note {
  max-width: var(--layout);
  margin: var(--sp-6) auto 0;
  font-family: var(--font-display);
  font-style: italic;
  font-size: var(--step-0);
  color: var(--muted);
  text-align: center;
}


/* --- 8c. Set-menu two-panel toggle --------------------------- */
.set-toggle {
  display: flex;
  justify-content: center;
  gap: var(--sp-8);
  margin-bottom: var(--sp-12);
}
.set-toggle [role="tab"] {
  font-family: var(--font-body);
  font-weight: 300;
  font-size: var(--step--1);
  text-transform: uppercase;
  letter-spacing: 0.18em;
  color: var(--muted);
  padding: var(--sp-2) 0;
  border-bottom: 1px solid transparent;
  transition: color 0.2s ease, border-color 0.2s ease;
}
.set-toggle [role="tab"] span { color: var(--brass); margin-left: var(--sp-2); font-variant-numeric: tabular-nums; white-space: nowrap; }
.set-toggle [role="tab"]:hover { color: var(--ink); }
.set-toggle [role="tab"][aria-selected="true"] { color: var(--ink); border-bottom-color: var(--ink); }

.set-panels { max-width: 620px; margin-inline: auto; }
.js-toggle .set-panels { display: grid; }
.js-toggle .set-panel {
  grid-area: 1 / 1;
  opacity: 0;
  visibility: hidden;
  transition: opacity 200ms ease, visibility 0s linear 200ms;
}
.js-toggle .set-panel.is-active { opacity: 1; visibility: visible; transition: opacity 200ms ease, visibility 0s; }
.set-heading {
  font-family: var(--font-display);
  font-weight: 300;
  font-size: var(--step-2);
  text-align: center;
}
.js-toggle .set-heading { display: none; }
.set-price {
  font-family: var(--font-display);
  font-weight: 300;
  font-size: var(--step-3);
  color: var(--brass);
  text-align: center;
  margin-bottom: var(--sp-8);
  font-variant-numeric: tabular-nums;
  white-space: nowrap;
}

/* Set-menu dishes carry no price — plain lines, no leader */
.set-list { margin: 0; }
.set-list dt {
  font-family: var(--font-body);
  font-weight: 300;
  font-size: var(--step-0);
  line-height: 1.35;
  color: var(--ink);
  padding: var(--sp-2) 0;
}

/* Set-menu conversion CTA */
.set-cta { text-align: center; margin-top: var(--sp-16); }
.set-cta .rule-short { margin-bottom: var(--sp-8); }
.set-cta p { color: var(--muted); margin-bottom: var(--sp-6); }
.btn-book--lg { font-size: var(--step-0); padding: var(--sp-3) var(--sp-8); }


/* --- 8d. Cellar — the wine list. The on-page invitation sits on a
   full-bleed linen ground (one tonal step off cream, an "arrival"); no
   border where it meets cream — the abutting grounds are the edge. The
   dialog stays cream (it floats above the page, see #wine-list). ---- */
#cellar { background: var(--linen); }

/* Invited band — a short section; the full list lives in the dialog.
   The sp-32 (8rem) vertical padding gives the linen room to breathe. */
.cellar-invite {
  max-width: var(--measure);
  margin-inline: auto;
  padding: var(--sp-32) var(--sp-6);
  text-align: center;
}
.cellar-invite .mark { margin: 0 auto var(--sp-8); }
.cellar-invite h2 { font-size: var(--step-2); letter-spacing: 0.03em; color: var(--ink); }
.cellar-invite-epigraph {
  margin-top: var(--sp-6);
  font-family: var(--font-display);
  font-style: italic;
  font-size: var(--step-1);
  color: var(--brass);
}
.cellar-invite-note {
  margin: var(--sp-6) auto var(--sp-12);
  max-width: 48ch;
  font-weight: 300;
  line-height: 1.7;
  color: var(--ink);
}
.cellar-open {
  font-family: var(--font-body);
  font-size: 0.8rem;
  letter-spacing: 0.25em;
  text-transform: uppercase;
  color: var(--brass);
  border: 1px solid var(--brass);
  padding: 1.25rem 3rem;
  transition: background 0.2s ease, color 0.2s ease;
}
.cellar-open:hover { background: var(--brass); color: var(--cream); }

/* The wine-list dialog. Flex column: fixed head + scrolling body.
   Cream ground on the base rule so it also applies when the dialog
   renders inline without JS (overriding the UA white default). */
#wine-list {
  padding: 0;
  border: 0;
  border-radius: 0;
  background: var(--linen);   /* interior one step deeper than cream — lifts every row off the ground */
  color: var(--ink);
}
#wine-list[open] {
  display: flex;
  flex-direction: column;
  inset: 0;
  margin: auto;                 /* centre the modal — native <dialog> sits top-left */
  width: min(92vw, 1200px);
  height: 92vh;
  max-width: none;              /* override the UA max-width/height: calc(100% - 6px) */
  max-height: none;
  padding: 0;
  border: 1px solid var(--brass);
  overflow: hidden;
}
#wine-list::backdrop {
  background: rgb(42 38 34 / 0.6);
  backdrop-filter: blur(8px);
  -webkit-backdrop-filter: blur(8px);
}
.dialog-head {
  flex: none;
  display: flex;
  align-items: center;
  gap: var(--sp-4);
  padding: var(--sp-4) var(--sp-6);
  border-bottom: 1px solid var(--brass);
  background: var(--cream);
}
.dialog-head .mark { flex: none; }
.dialog-title {
  font-family: var(--font-display);
  font-size: var(--step-1);
  letter-spacing: 0.04em;
  color: var(--brass);
  margin-right: auto;   /* push the close button to the far edge */
}
.dialog-close {
  flex: none;
  width: 48px; height: 48px;
  display: flex; align-items: center; justify-content: center;
  font-size: var(--step-2);
  line-height: 1;
  color: var(--ink);
  transition: color 0.2s ease;
}
.dialog-close:hover { color: var(--brass); }

/* Below the fixed head: a flex row [ fixed rail | scrolling list ]. The
   scroll lives on .cellar-content — NOT on <dialog> or .dialog-body — so
   the rail never scrolls away with the list. min-height:0 lets the flex
   children actually shrink and hand their overflow to the list. */
.dialog-body { flex: 1 1 auto; min-height: 0; display: flex; justify-content: center; overflow: hidden; }

/* rail (220) + list (820) = 1040, centred in the dialog with even margins.
   flex-basis caps the shell so the list uses its full width instead of
   collapsing narrow with all the slack dumped on one side. */
.cellar-shell {
  flex: 0 1 1040px;
  min-width: 0;      /* shrink to the dialog width instead of the rail's intrinsic width */
  min-height: 0;
  display: flex;
  gap: 0;            /* spacing lives in the rail/content padding around the hairline */
}

/* Left rail — a fixed 220px column with a full-height brass hairline on its
   right edge; only the list beside it scrolls. Padding-top aligns the first
   item with the first section heading, not the middle of the panel. */
.cellar-rail {
  flex: 0 0 220px;
  align-self: stretch;
  overflow-y: auto;
  border-right: 1px solid var(--brass);
  padding: var(--sp-16) var(--sp-6) var(--sp-12) var(--sp-6);
}
/* Right column — THE scroll container, capped at 820px and left-aligned
   to the rail so prices sit close to the content (no dotted leader). */
.cellar-content {
  flex: 1 1 auto;
  min-width: 0;
  min-height: 0;
  max-width: 820px;
  overflow-y: auto;
  padding: var(--sp-16) var(--sp-6) var(--sp-24) var(--sp-12);
}
.cellar-rail ul { display: flex; flex-direction: column; gap: var(--sp-4); }
.cellar-rail a {
  font-family: var(--font-body);
  font-weight: 300;
  font-size: 0.8rem;
  letter-spacing: 0.15em;
  color: var(--sand);   /* inactive rail — sand so it reads on linen; opacity keeps it quieter than the active brass */
  opacity: 0.6;
  padding-left: var(--sp-3);
  border-left: 2px solid transparent;
  transition: opacity 0.2s ease, color 0.2s ease, border-color 0.2s ease;
}
.cellar-rail a:hover { opacity: 1; }
/* Active: full brass, heavier, with an obvious 2px brass bar on the left. */
.cellar-rail a.is-current { opacity: 1; color: var(--brass); font-weight: 400; border-left-color: var(--brass); }

/* Section + category heading */
.cellar-cat {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: var(--sp-4);
  margin: var(--sp-24) 0 var(--sp-6);
  padding-bottom: var(--sp-2);
  border-bottom: var(--rule);
}
.cellar-section:first-of-type .cellar-cat { margin-top: var(--sp-4); }
.cellar-cat h3 {
  font-family: var(--font-display);
  font-weight: 400;
  font-size: var(--step-2);
  letter-spacing: 0.02em;
  color: var(--brass);
}
.cellar-cat-note {
  font-family: var(--font-display);
  font-style: italic;
  font-size: var(--step-0);
  color: var(--brass);
}
/* Region / appellation sub-heading — one tier below the brass variety
   heading: sand, not brass, so the grape name reads as the section. */
.cellar-sub {
  font-family: var(--font-body);
  font-weight: 400;
  font-size: var(--step--1);
  text-transform: uppercase;
  letter-spacing: 0.15em;
  color: var(--sand);
  margin: var(--sp-8) 0 var(--sp-2);
}
.cellar-sub-note { font-variant: normal; text-transform: none; letter-spacing: 0.04em; color: var(--sand); font-size: 0.72em; margin-left: var(--sp-2); }
.cellar-list { margin: 0; }

/* One wine row — flat on desktop (w-line wrappers use display:contents),
   two lines on mobile. */
.wine {
  display: flex;
  align-items: baseline;
  flex-wrap: nowrap;              /* rows never wrap */
  gap: 0 var(--sp-3);
  padding: 0.85rem 0;
  font-family: var(--font-body);
  font-weight: 300;
  font-size: 0.95rem;
  line-height: 1.5;
}
.w-line1, .w-line2 { display: contents; }
/* One face per row — all Jost. Cormorant is heading-only now. */
.w-vintage  { flex: 0 0 4ch; text-align: right; color: var(--brass); font-weight: 300; font-variant-numeric: tabular-nums; }
.w-producer { flex: none; text-transform: uppercase; letter-spacing: 0.1em; color: var(--ink); font-weight: 400; }
.w-cuvee    { flex: none; color: var(--ink); font-weight: 300; }   /* NOT italic, NOT Cormorant — the change */
.w-region   { flex: 1 1 auto; min-width: 0; color: var(--sand); font-weight: 300;
              overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.w-variety  { flex: none; color: var(--sand); font-weight: 300; text-align: right; white-space: nowrap; }
.w-price    { flex: 0 0 auto; min-width: 5ch; color: var(--brass); font-weight: 400; font-variant-numeric: tabular-nums; text-align: right; white-space: nowrap; }   /* heavier than the row — anchors the right edge */

/* Cocktails / spirits (.drink): two lines — name over ingredients — with the
   price pinned top-right. The single-line wine layout collapses them otherwise. */
.wine.drink { display: block; position: relative; }
.drink .w-line1 { display: block; padding-right: 5ch; }
.drink .w-line2 { display: block; margin-top: 3px; }
.drink .w-producer { text-transform: none; letter-spacing: 0.02em; font-size: 1rem; color: var(--ink); }
.drink .w-region { color: var(--sand); font-size: 0.85rem; overflow: visible; white-space: normal; text-overflow: clip; }
.drink .w-price { position: absolute; top: 0; right: 0; min-width: 0; color: var(--brass); }

/* Regional essays — full-width, centred, big vertical breathing room.
   Introduce the variety they precede (Piemonte → Nebbiolo, Toscana →
   Sangiovese). No map: a single brass hairline sits above the region name. */
.cellar-essay {
  margin: var(--sp-16) 0;
  padding: var(--sp-24) var(--sp-6);
  text-align: center;
}
.cellar-map-rule { border: 0; border-top: var(--rule); width: 180px; margin: 0 auto var(--sp-8); }
.cellar-region {
  font-family: var(--font-display);
  font-weight: 300;
  font-size: clamp(2.5rem, 8vw, 6rem);
  letter-spacing: 0.2em;
  color: var(--brass);
  margin-bottom: var(--sp-12);
  padding-left: 0.2em;
}
.cellar-essay-body {
  font-family: var(--font-display);
  font-weight: 300;
  font-size: var(--step-1);
  line-height: 1.7;
  max-width: 62ch;
  margin-inline: auto;
  color: var(--ink);
}
.wine-close {
  margin-top: var(--sp-24);
  text-align: center;
  font-family: var(--font-display);
  font-style: italic;
  font-size: var(--step-1);
  color: var(--brass);
}


/* --- 8e. Functions — ivory again; conversion band + form ----- */
.conversion-band { max-width: var(--measure); margin-inline: auto; text-align: center; }
.conversion-band .mark { margin: 0 auto var(--sp-6); }
.conversion-band h2 { font-size: var(--step-2); letter-spacing: 0.03em; }
.conversion-band p { font-weight: 300; line-height: 1.7; margin-top: var(--sp-6); text-align: left; }
.conversion-band strong { font-weight: 400; color: var(--brass); }

/* Functions sub-section headings — Capacity / Set Menus / Make an Enquiry.
   One shared style; the blocks below share the same centred 620px measure. */
.functions-subhead { font-family: var(--font-display); font-weight: 300; font-size: var(--step-2); text-align: center; margin-bottom: var(--sp-12); }
#functions .menu-single, .set-menus { max-width: 620px; margin: var(--sp-24) auto 0; }

/* CAPACITY — reuses .course-head (the 1px brass rule) + .menu-item (the dotted
   leader). Only the SEATED / STANDING labels are new: Jost caps, brass, tracked. */
.capacity-head {
  font-family: var(--font-body);
  font-weight: 400;
  font-size: var(--step--1);
  text-transform: uppercase;
  letter-spacing: 0.2em;
  color: var(--brass);
}

/* One quiet line above the set-menu toggle */
.set-note {
  font-family: var(--font-body);
  font-size: var(--step--1);
  letter-spacing: 0.04em;
  color: var(--sand);
  text-align: center;
  margin-bottom: var(--sp-8);
}

.enquiry { max-width: 680px; margin: var(--sp-24) auto 0; }
.form-grid { display: grid; grid-template-columns: 1fr 1fr; gap: var(--sp-8) var(--sp-6); }
.field--full { grid-column: 1 / -1; }
.field label {
  display: block;
  font-family: var(--font-body);
  font-size: var(--step--1);
  text-transform: uppercase;
  letter-spacing: 0.12em;
  color: var(--muted);
  margin-bottom: var(--sp-2);
  transition: color 0.2s ease, transform 0.2s ease;
}
.field:has(:focus-visible) label { color: var(--brass); transform: translateY(-2px); }
.field input, .field select, .field textarea {
  width: 100%;
  font-family: var(--font-body);
  font-weight: 300;
  font-size: var(--step-0);
  color: var(--ink);
  background: transparent;
  border: 0;
  border-bottom: 1px solid var(--sand-soft);   /* decorative hairline — brass is too strong here */
  border-radius: 0;
  padding: 0 0 9px;
  transition: border-color 0.2s ease;
}
.field textarea { resize: vertical; min-height: 6rem; line-height: 1.5; }
.field input:focus-visible, .field select:focus-visible, .field textarea:focus-visible {
  outline: none;                       /* replaced by the brass underline below */
  border-bottom: 1px solid var(--brass);
}
.field select {
  appearance: none;
  padding-right: 18px;
  background-image:
    linear-gradient(45deg, transparent 50%, var(--brass) 50%),
    linear-gradient(135deg, var(--brass) 50%, transparent 50%);
  background-size: 5px 5px, 5px 5px;
  background-position: right 6px center, right 1px center;
  background-repeat: no-repeat;
}
.form-submit { margin-top: var(--sp-4); font-family: var(--font-body); }
.btn-book:disabled { opacity: 0.5; cursor: default; }
.form-error { margin-top: var(--sp-8); font-size: var(--step-0); color: var(--ink); text-align: center; }
.form-error a { color: var(--ink); border-bottom: 1px solid var(--brass); }
.form-done {
  padding: var(--sp-16) 0;
  text-align: center;
  font-family: var(--font-display);
  font-weight: 300;
  font-size: var(--step-2);
  line-height: 1.4;
  color: var(--ink);
}
.enquiry-call { margin-top: var(--sp-8); text-align: center; font-size: var(--step--1); letter-spacing: 0.08em; color: var(--muted); }
.enquiry-call a { color: var(--ink); border-bottom: 1px solid var(--brass); }


/* --- 8f. Visit — three columns, no map --------------------- */
.visit-grid {
  max-width: var(--layout);
  margin-inline: auto;
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: var(--sp-16) var(--sp-8);
}
.visit-label {
  font-family: var(--font-body);
  font-weight: 400;
  font-size: var(--step--1);
  text-transform: uppercase;
  letter-spacing: 0.2em;
  color: var(--brass);
  margin-bottom: var(--sp-6);
}
.visit-col p { font-weight: 300; line-height: 1.9; }
.visit-col p + p { margin-top: var(--sp-4); }
.visit-col a { color: var(--ink); transition: color 0.2s ease; }
.visit-col a:hover { color: var(--brass); }
.visit-arrow { color: var(--brass); letter-spacing: 0.06em; }
.visit-arrow:hover { color: var(--ink); }

/* Live status — the "dot" is a 6px brass square: this site has no radius. */
.hours-status {
  display: flex;
  align-items: center;
  gap: var(--sp-2);
  margin-top: var(--sp-6);
  text-transform: uppercase;
  letter-spacing: 0.18em;
  font-size: var(--step--1);
  color: var(--ink);
}
.status-dot { width: 6px; height: 6px; background: var(--brass); flex: none; }
.hours-status.is-closed .status-dot { background: var(--sand-soft); opacity: 0.6; }
.hours-status.is-closed { color: var(--muted); }

/* --- 8g. Closing band — final CTA on the linen arrival ground.
   8rem vertical padding keeps the colour a band, not a stripe. ---- */
.closing-band {
  background: var(--linen);
  color: var(--ink);
  text-align: center;
  padding: var(--sp-32) var(--sp-6);
}
.closing-band .mark { margin: 0 auto var(--sp-12); }

/* --- 8h. Partners — quiet Cormorant wordmark row ----------- */
.partners { text-align: center; }
.partners-head {
  font-family: var(--font-body);
  font-weight: 400;
  font-size: var(--step--1);
  text-transform: uppercase;
  letter-spacing: 0.24em;
  color: var(--muted);
  margin-bottom: var(--sp-12);
}
.partners-row {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  gap: var(--sp-12);
}
.partners-row a {
  font-family: var(--font-display);
  font-weight: 400;
  font-size: var(--step-1);
  text-transform: uppercase;
  letter-spacing: 0.25em;
  color: var(--sand);
  transition: color 0.2s ease;
}
.partners-row a:hover { color: var(--brass); }

/* Compact the wine-dialog head on narrow screens (mark carries identity). */
@media (max-width: 600px) {
  .dialog-head { gap: var(--sp-3); padding: var(--sp-3) var(--sp-4); }
  .dialog-head .mark, .dialog-title { display: none; }   /* mark is carried by the invite */
  .dialog-close { margin-left: auto; width: 44px; height: 44px; }
}


/* ------------------------------------------------------------
   9a. MOTION
   Initial-hidden states live inside no-preference so reduced-motion
   users get everything visible at full opacity.
   ------------------------------------------------------------ */
@media (prefers-reduced-motion: no-preference) {
  .masthead-mark,
  .masthead-title span,
  .masthead-tagline,
  .masthead-rule,
  .masthead-epigraph {
    opacity: 0;
    animation: rise-in 600ms cubic-bezier(0.16, 1, 0.3, 1) forwards;
  }
  .masthead-mark { animation-delay: 0ms; }
  .masthead-title span:nth-child(1) { animation-delay: 200ms; }
  .masthead-title span:nth-child(2) { animation-delay: 240ms; }
  .masthead-title span:nth-child(3) { animation-delay: 280ms; }
  .masthead-title span:nth-child(4) { animation-delay: 320ms; }
  .masthead-title span:nth-child(5) { animation-delay: 360ms; }
  .masthead-title span:nth-child(6) { animation-delay: 400ms; }
  .masthead-title span:nth-child(7) { animation-delay: 440ms; }
  .masthead-tagline  { animation-delay: 900ms;  }
  .masthead-rule     { animation-delay: 1100ms; }
  .masthead-epigraph { animation-delay: 1300ms; }
  .masthead-cue { animation: breathe 3s ease-in-out 1.8s infinite alternate; }

  .reveal { opacity: 0; transform: translateY(24px); transition: opacity 700ms ease, transform 700ms cubic-bezier(0.16, 1, 0.3, 1); }
  .reveal.is-visible { opacity: 1; transform: none; }
}
@keyframes rise-in { from { opacity: 0; transform: translateY(0.6em); } to { opacity: 1; transform: translateY(0); } }
@keyframes breathe { from { opacity: 0.25; } to { opacity: 1; } }


/* ------------------------------------------------------------
   9b. FOOTER — small type, wide letter-spacing, muted.
   ------------------------------------------------------------ */
.site-footer {
  border-top: var(--rule);
  padding: var(--sp-16) var(--sp-6) var(--sp-12);
  color: var(--muted);
  font-size: var(--step--1);
  letter-spacing: 0.08em;
}
.footer-inner {
  max-width: var(--layout);
  margin-inline: auto;
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: var(--sp-8);
}
.footer-block { line-height: 1.9; }
.site-footer a { color: var(--muted); transition: color 0.2s ease; }
.site-footer a:hover { color: var(--brass); }
.footer-mark { margin: var(--sp-12) auto 0; }
.footer-copy {
  max-width: var(--layout);
  margin: var(--sp-4) auto 0;
  text-align: center;
  text-transform: uppercase;
  letter-spacing: 0.2em;
}


/* ------------------------------------------------------------
   10. RESPONSIVE BREAKPOINTS  (mobile-first overrides)
   ------------------------------------------------------------ */
@media (max-width: 767px) {
  /* Full-bleed dialog. 100dvh, not 100vh — iOS Safari's URL bar lies about vh. */
  #wine-list[open] { width: 100vw; height: 100dvh; border: 0; }
  /* Stack: rail becomes a horizontal snap-scroller pinned under the head,
     content scrolls below it. */
  .cellar-shell { flex-direction: column; gap: 0; }
  .cellar-rail {
    flex: none;
    align-self: stretch;
    overflow-x: auto;
    overflow-y: hidden;
    scroll-snap-type: x proximity;
    background: var(--cream);
    border-right: 0;                /* horizontal bar → no vertical hairline */
    border-bottom: var(--rule);
    padding: var(--sp-3) var(--sp-4);
  }
  .cellar-rail ul { flex-direction: row; flex-wrap: nowrap; gap: var(--sp-6); }
  .cellar-rail a { border-left: 0; padding-left: 0; white-space: nowrap; scroll-snap-align: start; }
  .cellar-rail a.is-current { border-left: 0; }
  .cellar-content { padding: var(--sp-8) var(--sp-4) var(--sp-16); }
  /* Close ✕ — 48×48 tap target on mobile. */
  .dialog-close { width: 48px; height: 48px; }
}

/* Wine row → two lines on small screens */
@media (max-width: 640px) {
  .wine { display: block; padding: var(--sp-3) 0; }
  /* No region on line 1 to absorb slack, so let a long cuvee wrap to its own
     sub-line here rather than overflow the narrow dialog. */
  .w-line1 { display: flex; flex-wrap: wrap; align-items: baseline; gap: var(--sp-2); }
  .w-line2 { display: flex; align-items: baseline; gap: var(--sp-2); margin-top: 3px; }
  .w-line2 .w-variety::before { content: "·"; color: var(--sand); margin-right: var(--sp-2); }
}

@media (max-width: 768px) {
  .nav-desktop { display: none; }
  .hamburger   { display: flex; }

  .food-grid { grid-template-columns: 1fr; }

  .form-grid { grid-template-columns: 1fr; }

  .visit-grid { grid-template-columns: 1fr; gap: var(--sp-12); }

  .footer-inner { grid-template-columns: 1fr 1fr; gap: var(--sp-8) var(--sp-6); }
}

@media (max-width: 420px) {
  .footer-inner { grid-template-columns: 1fr; }
}

/* ------------------------------------------------------------
   11. MOBILE RESERVE BAR — sticky booking CTA on small screens.
   Variant B (live): brass ground, cream text — cream/brass is 4.67:1 (AA).
   Variant A (alt): set --bar-bg:var(--ink); --bar-fg:var(--brass); but brass
     on ink is only 2.95:1 — fails AA and reads muddy, so it's not the default.
   (The dialog is a modal in the top layer, so it always covers this.)
   ------------------------------------------------------------ */
.reserve-bar { display: none; }
@media (max-width: 767px) {
  .reserve-bar {
    --bar-bg: var(--brass);
    --bar-fg: var(--cream);
    display: block;
    position: fixed;
    left: 0; right: 0; bottom: 0;
    z-index: 150;
    background: var(--bar-bg);
    color: var(--bar-fg);
    box-shadow: 0 -1px 0 rgb(42 38 34 / 0.12);
    text-align: center;
    padding: 1rem;
    padding-bottom: calc(1rem + env(safe-area-inset-bottom));  /* clear the home indicator */
    font-family: var(--font-body);
    font-size: 0.8rem;
    letter-spacing: 0.2em;
    text-transform: uppercase;
    /* Hidden while the masthead is on screen; revealed once it scrolls out.
       Driven purely off the header's data-stuck flag, which the EXISTING
       sticky-header IntersectionObserver already toggles — no second observer.
       The header precedes .reserve-bar in <body>, so ~ reaches it. */
    transform: translateY(100%);
    transition: transform 0.3s ease;
  }
  .site-header[data-stuck="true"] ~ .reserve-bar { transform: translateY(0); }

  /* Reserve room under the copyright so the fixed bar never covers it
     (bar height + the iPhone home-indicator inset). */
  .site-footer { padding-bottom: calc(56px + env(safe-area-inset-bottom)); }
}

@media (prefers-reduced-motion: reduce) {
  html { scroll-behavior: auto; }
  * { animation: none !important; transition: none !important; }
}
