/* === variables === */
/* === CSS VARIABLES ===
   Single source of truth for every colour used in CSS *and* JS.
   Loaded on every page that needs the brand/canvas palette — currently
   the public site (via application.html.erb) and the backstage floor-plan
   editor (via edit_floor_plan.html.erb). Kept in its own file so admin
   pages can pull just the variables without inheriting the public site's
   body/section rules from application.css.

   JS reads brand and canvas tokens via getComputedStyle — see
   app/javascript/colors.js. Mailer/PWA-manifest colours stay inline
   because email clients and the manifest parser don't support
   CSS custom properties.

   How this is organised:
   • Brand palette         — the warm-pink + burgundy world the public site lives in.
   • Brand RGB triplets    — same brand colours expressed as channel triplets so we
                             can vary opacity inline (`rgb(var(--rgb-burgundy) / 0.4)`)
                             without minting a new token per alpha step.
   • Derived translucents  — alpha levels that recur often enough to deserve a name
                             (borders, scrollbars, popup overlays, base shadow).
   • Floor-plan canvas     — Konva fills/strokes for the booking + editor canvases.
                             Read in JS through colors.js.
   • Admin / neutral       — non-branded greys used by the Administrate panel and the
                             backstage floor-plan editor — kept distinct so the pink
                             tint of the public theme doesn't bleed into admin tools. */
:root {
  /* Light-only site: opt out of the browser's automatic dark-mode inversion
     (Samsung Internet / Chrome "Auto Dark Theme") so the warm-pink palette
     below is never force-darkened. Backs up the <meta name="color-scheme">
     in the layouts. */
  color-scheme: only light;

  /* — Brand palette (NEUTRAL core defaults) —
     Grayscale placeholders. An instance overrides these via /brand/theme.css
     (see instances/<name>/public/theme.css), linked after the core bundle. */
  --color-bg:             #f5f5f5;  /* page background */
  --color-pink:           #ebebeb;  /* primary surface */
  --color-surface:        #e0e0e0;  /* raised surface, slightly darker */
  --color-burgundy:       #444444;  /* accent (text, CTAs, borders) */
  --color-burgundy-light: #666666;  /* hover variant of accent */
  --color-text:           #1a1a1a;  /* body text */
  --color-text-muted:     #666666;  /* secondary text, captions */
  --color-white:          #ffffff;  /* pure white (menu card surface, table fill) */

  /* — Brand RGB triplets (use as `rgb(var(--rgb-X) / <alpha>)`) —
     These avoid an explosion of `--color-burgundy-12`, `--color-burgundy-40`, … tokens.
     Neutral defaults; overridden per instance via theme.css. */
  --rgb-burgundy:  68 68 68;      /* #444444 */
  --rgb-pink:      235 235 235;   /* #ebebeb */
  --rgb-bg:        245 245 245;   /* #f5f5f5 */
  --rgb-text:      26 26 26;      /* #1a1a1a */
  --rgb-white:     255 255 255;
  --rgb-black:     0 0 0;

  /* — Derived translucents (recurring alpha levels worth naming) — */
  --color-border:           rgb(var(--rgb-burgundy) / 0.12);  /* hairline on pink panels */
  --color-scrollbar:        rgb(var(--rgb-burgundy) / 0.4);   /* scrollbar thumb on light bg */
  --color-scrollbar-hover:  rgb(var(--rgb-burgundy) / 0.7);
  --color-scrollbar-dark:        rgb(var(--rgb-pink) / 0.45); /* scrollbar thumb on dark sections */
  --color-scrollbar-dark-hover:  rgb(var(--rgb-pink) / 0.75);
  --color-popup-backdrop:   rgb(var(--rgb-text) / 0.62);      /* modal/overlay scrim */
  --color-overlay-deep:     rgba(8, 3, 3, 0.93);              /* near-black secret-menu overlay */
  --shadow-soft:            rgb(var(--rgb-black) / 0.1);      /* default section/panel shadow tone */

  /* — Floor-plan canvas (Konva, public booking + admin editor) —
     Mirrored into JS via app/javascript/colors.js; edit values here. */
  --color-canvas-bg:              #e7dcdb;  /* WebGL clear, slightly darker than --color-bg */
  --color-cloth-bg:               #fffdfb;  /* cloth-texture fill, slightly brighter than --color-bg */
  --color-table-fill:             #3fb15f;  /* available / bookable — green */
  --color-table-fill-disabled:    #b8b8b8;  /* unavailable for booking — gray */
  --color-table-fill-selected:    #ffd21f;  /* table chosen for booking — yellow */
  --color-table-fill-editor:      #fff7e0;  /* table fill in the admin editor (warmer to read against the white canvas) */
  --color-table-stroke:           #1f7a3d;  /* available outline — dark green */
  --color-table-stroke-disabled:  #6e6e6e;  /* unavailable outline — dark gray */
  --color-table-label-disabled:   #3d3d3d;  /* unavailable label */
  --color-table-fill-taken:       #d93b3b;  /* taken — red */
  --color-table-stroke-taken:     #8f1d1d;  /* taken outline — dark red */
  --color-table-label-taken:      #ffffff;  /* taken label — light for contrast on red */
  --color-table-border-editor:    #d8c97a;  /* editor banner border (companion to --color-table-fill-editor) */
  --canvas-bg-opacity:            0.8;      /* alpha for floor-plan background image (booking + editor) */

  /* — Admin / neutral greys (Administrate + floor-plan editor) —
     Kept separate from the brand greys so the admin chrome stays neutral. */
  --color-surface-neutral: #fafafa;  /* admin canvas / surface */
  --color-border-neutral:  #cccccc;  /* admin input/canvas border */
  --color-admin-hint:      #6b7280;  /* Administrate field hint */
  --color-admin-label:     #9ca3af;  /* Administrate group label */

  --font-mono: "Courier New", Courier, monospace;
  --font-sans: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
  --font-serif: "CormorantGaramond", Georgia, serif;

  --nav-height: 56px;
  --section-padding: clamp(3rem, 8vw, 6rem);
  --content-max-width: 960px;
}


/* === tokens === */
/* UKOI brand palette. Overrides the neutral core defaults in
   app/assets/stylesheets/variables.css. Loaded first in the instance bundle so
   the design partials (and the core token-driven CSS) resolve to brand colours.
   Folded in from the Phase-4 interim /brand/theme.css. */
:root {
  --color-bg:             #faf5f4;  /* page background, warm off-white */
  --menu-card-paper:      #f9ece8;  /* static menu paper/surround, warm blush (matches the lunch card). Baked into the kitchen/bar card SVG by bin/menu_web_backgrounds and backs the kitchen/bar + cocktails sections */
  --color-pink:           #fce8e6;  /* primary pink surface */
  --color-surface:        #f5e3e1;  /* raised pink surface, slightly darker */
  --color-burgundy:       #a52216;  /* brand accent (text, CTAs, borders) */
  --color-burgundy-light: #c94535;  /* hover variant of brand */

  --rgb-burgundy:  165 34 22;     /* #a52216 */
  --rgb-pink:      252 232 230;   /* #fce8e6 */
  --rgb-bg:        250 245 244;   /* #faf5f4 */
}


/* === fonts === */
/* UKOI brand typography. TTFs live in instances/ukoi/fonts/ (Propshaft asset
   path); url() is rewritten to the fingerprinted path when instance.css is
   served. Core (no instance) has no @font-face, so --font-serif falls back to
   Georgia. */
@font-face {
  font-family: 'CormorantGaramond';
  src: url("/assets/CormorantGaramond-VariableFont_wght-cd2ab63e.ttf") format('truetype');
  font-weight: 100 900;
  font-style: normal;
  font-display: swap;
}

@font-face {
  font-family: 'CormorantGaramond';
  src: url("/assets/CormorantGaramond-Italic-VariableFont_wght-bebd4704.ttf") format('truetype');
  font-weight: 100 900;
  font-style: italic;
  font-display: swap;
}

/* The print cards' typefaces. The names match the TTF basenames, because
   MenuPrint::RunCanvas derives a run's font-family from the very file Prawn
   measured it with — so the browser lays each run out in the print font. */
@font-face {
  font-family: 'InstrumentSerif';
  src: url("/assets/InstrumentSerif-Regular-c830b3a5.ttf") format('truetype');
  font-weight: 400;
  font-style: normal;
  font-display: swap;
}

@font-face {
  font-family: 'InstrumentSerif';
  src: url("/assets/InstrumentSerif-Italic-8858a89b.ttf") format('truetype');
  font-weight: 400;
  font-style: italic;
  font-display: swap;
}

@font-face {
  font-family: 'InstrumentSans';
  src: url("/assets/InstrumentSans-Regular-c43605fb.ttf") format('truetype');
  font-weight: 400;
  font-style: normal;
  font-display: swap;
}

@font-face {
  font-family: 'Poppins';
  src: url("/assets/Poppins-Regular-79840ffb.ttf") format('truetype');
  font-weight: 400;
  font-style: normal;
  font-display: swap;
}


/* === base === */
/*
 * Public-site stylesheet entry point.
 *
 * Component styles live in partials/_*.css and are loaded as separate
 * stylesheets from app/views/layouts/application.html.erb. This file
 * keeps the token-driven html/body base and a couple of cross-cutting
 * utilities. @font-face (brand typography) is instance-supplied — see
 * instances/<name>/stylesheets/fonts.css — so core --font-serif falls back
 * to Georgia. CSS variables live in variables.css (loaded separately so
 * admin pages can pull them in without inheriting these rules).
 */

html {
  scroll-behavior: smooth;
  font-size: 20px;
  /* Auto-hide scrollbar: the thumb is transparent at rest and only appears
     while scrolling (the .is-scrolling class is toggled in javascript/index.js).
     Restores the previous unobtrusive smooth-scroll feel. */
  scrollbar-width: thin;
  scrollbar-color: transparent transparent;
}

html.is-scrolling { scrollbar-color: var(--color-scrollbar) transparent; }
html.is-scrolling.scrollbar--on-dark { scrollbar-color: var(--color-scrollbar-dark) transparent; }

html::-webkit-scrollbar { width: 5px; }
html::-webkit-scrollbar-track { background: transparent; }
html::-webkit-scrollbar-thumb {
  background: transparent;
  border-radius: 99px;
  transition: background 0.4s ease;
}
html.is-scrolling::-webkit-scrollbar-thumb { background: var(--color-scrollbar); }
html.is-scrolling::-webkit-scrollbar-thumb:hover { background: var(--color-scrollbar-hover); }

html.is-scrolling.scrollbar--on-dark::-webkit-scrollbar-thumb { background: var(--color-scrollbar-dark); }
html.is-scrolling.scrollbar--on-dark::-webkit-scrollbar-thumb:hover { background: var(--color-scrollbar-dark-hover); }

body {
  margin: 0;
  padding: 0;
  background-color: var(--color-bg);
  font-family: var(--font-serif);
  font-weight: 700;
  letter-spacing: 0.03em;
  color: var(--color-text);
}

/* Subtle dot grid using brand burgundy — applied via .pattern-bg utility class. */
.pattern-bg::before {
  content: "";
  position: absolute;
  inset: 0;
  background-image: radial-gradient(circle, var(--color-burgundy) 1px, transparent 1px);
  background-size: 22px 22px;
  opacity: 0.06;
  pointer-events: none;
  z-index: 0;
}

.noscript-menu {
  padding: 2rem;
  font-family: var(--font-serif);
  max-width: var(--content-max-width);
  margin: 0 auto;
}


/* === sr_only === */
/* Visually hide content while keeping it in the accessibility tree. */
.sr-only {
  position: absolute;
  width: 1px;
  height: 1px;
  padding: 0;
  margin: -1px;
  overflow: hidden;
  clip: rect(0, 0, 0, 0);
  white-space: nowrap;
  border: 0;
}


/* === section_shared === */
.site-section {
  padding: var(--section-padding) clamp(1rem, 5vw, 3rem);
  max-width: var(--content-max-width);
  margin: 0 auto;
}

.site-section--full-width {
  max-width: none;
  padding-left: 0;
  padding-right: 0;
}

.section-heading {
  font-family: var(--font-serif);
  font-size: clamp(1.3rem, 3vw, 1.7rem);
  font-weight: 700;
  color: var(--color-burgundy);
  letter-spacing: 0.10em;
  margin: 0 0 2rem;
  text-transform: uppercase;
}

#booking .section-heading {
  margin-bottom: 1rem;
}

/* Three sites paint the same 2.5rem burgundy underline. On an instance with
   Locomotive Scroll, the section-heading underline animates in via .is-inview
   (see instances/<name>/stylesheets/scroll_layout.css); core shows it at full
   width. margin-top matches the animated variant so layout is identical. */
.section-heading::after,
.coming-soon__heading::after,
.popup__title::after {
  content: "";
  display: block;
  width: 2.5rem;
  height: 3px;
  background: var(--color-burgundy);
  opacity: 0.45;
}

.section-heading::after { margin-top: 0.6rem; }

.section-subheading {
  font-family: var(--font-serif);
  font-size: 0.9rem;
  font-weight: 700;
  color: var(--color-text);
  letter-spacing: 0.04em;
  text-transform: uppercase;
  margin: 2rem 0 0.5rem;
}

.section-body {
  font-size: 1rem;
  line-height: 1.7;
  color: var(--color-text);
  margin: 0 0 1rem;
}


/* === nav === */
[data-controller="nav"] {
  height: var(--nav-height);
}

#site-nav {
  position: fixed;
  top: 0;
  left: 0;
  right: 0;
  z-index: 100;
  height: var(--nav-height);
  background: var(--color-pink);
  border-bottom: 1px solid var(--color-border);
  display: flex;
  align-items: center;
  padding: 0 clamp(1rem, 4vw, 2.5rem);
  gap: 2rem;
}

.nav__logo {
  display: flex;
  align-items: center;
  text-decoration: none;
  flex-shrink: 0;
}

.nav__logo img {
  display: block;
  height: 22px;
  width: auto;
}

/* Text wordmark shown on the neutral core (no instance logo). */
.nav__logo-text {
  font-family: var(--font-serif);
  font-size: 1.1rem;
  font-weight: 700;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  color: var(--color-burgundy);
}

.nav__links {
  display: flex;
  gap: 1.5rem;
  flex: 1;
}

.nav__links a {
  font-family: var(--font-serif);
  font-size: 17px;
  color: var(--color-text);
  text-decoration: none;
  letter-spacing: 0.03em;
  transition: color 0.2s;
}

.nav__links a:hover {
  color: var(--color-burgundy);
}

.nav__lang {
  display: flex;
  gap: 8px;
  flex-shrink: 0;
}

/* Minimal nav (error pages): no section links, so push the language switch
   to the far right since there's no flex:1 .nav__links spacer. */
.nav--minimal .nav__lang {
  margin-left: auto;
}

.lang-switch__btn {
  color: var(--color-text-muted);
  font-family: var(--font-serif);
  font-size: 17px;
  font-weight: 700;
  letter-spacing: 0.5px;
  text-decoration: none;
  opacity: 0.7;
  transition: opacity 0.2s;
}

.lang-switch__btn:hover {
  opacity: 1;
}

.lang-switch__btn--active {
  color: var(--color-burgundy);
  opacity: 1;
  font-weight: 700;
}

/* Old #lang-switch removed from canvas area */
#lang-switch {
  display: none;
}

/* Mobile menu button (three dots). */
.nav__menu-btn {
  display: none;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: 5px;
  background: none;
  border: none;
  cursor: pointer;
  padding: 8px;
  margin-left: auto;
  flex-shrink: 0;
}

.nav__menu-dot {
  display: block;
  width: 4px;
  height: 4px;
  border-radius: 50%;
  background: var(--color-burgundy);
}

/* Side drawer overlay. */
.nav__overlay {
  position: fixed;
  inset: 0;
  background: rgb(var(--rgb-text) / 0.4);
  z-index: 150;
  opacity: 0;
  pointer-events: none;
  transition: opacity 0.3s ease;
}

.nav__overlay--open {
  opacity: 1;
  pointer-events: auto;
}

/* Side drawer. */
.nav__drawer {
  position: fixed;
  top: 0;
  right: 0;
  width: 260px;
  height: 100%;
  background: var(--color-pink);
  border-left: 1px solid var(--color-border);
  z-index: 200;
  transform: translateX(100%);
  transition: transform 0.3s ease;
  display: flex;
  flex-direction: column;
  padding: var(--nav-height) 2rem 2rem;
  gap: 2rem;
}

.nav__drawer--open {
  transform: translateX(0);
}

.nav__drawer-links {
  display: flex;
  flex-direction: column;
  gap: 0;
}

.nav__drawer-links a {
  font-family: var(--font-serif);
  font-size: 0.95rem;
  font-weight: 700;
  letter-spacing: 0.04em;
  text-transform: uppercase;
  color: var(--color-text);
  text-decoration: none;
  padding: 1rem 0;
  border-bottom: 1px solid var(--color-border);
  transition: color 0.2s;
}

.nav__drawer-links a:first-child {
  border-top: 1px solid var(--color-border);
}

.nav__drawer-links a:hover {
  color: var(--color-burgundy);
}

.nav__drawer-lang {
  display: flex;
  gap: 1rem;
}

@media (max-width: 768px) {
  .nav__links,
  .nav__lang {
    display: none;
  }

  .nav__menu-btn {
    display: flex;
  }
}


/* === hero === */
#hero {
  /* Pinning (position: sticky + full-viewport min-height) is instance design —
     see instances/<name>/stylesheets/scroll_layout.css. Core flows normally. */
  min-height: 60vh;
  background-color: var(--color-pink);
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  text-align: center;
  padding: calc(var(--section-padding) - 30px) clamp(1rem, 5vw, 3rem) calc(var(--section-padding) + 30px);
  overflow: hidden;
}

.hero__brand-mark {
  width: 200px;
  height: 200px;
  animation: fadeUp 0.9s ease both;
}

.hero__brand-mark img {
  width: 100%;
  height: 100%;
}

.hero__name {
  margin: 0 0 1rem;
  position: relative;
  z-index: 1;
  animation: fadeUp 0.9s 0.15s ease both;
}

.hero__name img {
  display: block;
  width: clamp(180px, 40vw, 340px);
  height: auto;
}

/* Text wordmark shown on the neutral core (no instance logo). */
.hero__name-text {
  display: block;
  font-family: var(--font-serif);
  font-size: clamp(2.5rem, 8vw, 5rem);
  font-weight: 700;
  letter-spacing: 0.04em;
  text-transform: uppercase;
  color: var(--color-burgundy);
  line-height: 1;
}

.hero__tagline {
  font-family: var(--font-serif);
  font-size: clamp(1rem, 2.5vw, 1.2rem);
  color: var(--color-text-muted);
  margin: 0 0 2.5rem;
  max-width: 480px;
  line-height: 1.6;
  position: relative;
  z-index: 1;
  animation: fadeUp 0.9s 0.3s ease both;
}

.hero__scroll-hint {
  position: absolute;
  bottom: 5rem;
  left: 50%;
  transform: translateX(-50%);
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 6px;
  text-decoration: none;
  animation: scrollBounce 2.2s 1.2s ease-in-out infinite;
}

.hero__scroll-hint span {
  font-family: var(--font-serif);
  font-size: 13px;
  letter-spacing: 0.10em;
  text-transform: uppercase;
  color: var(--color-burgundy);
  opacity: 0.5;
}

.hero__scroll-hint svg {
  width: 16px;
  height: 16px;
  stroke: var(--color-burgundy);
  opacity: 0.45;
}


/* === animations === */
@keyframes fadeUp {
  from { opacity: 0; transform: translateY(24px); }
  to   { opacity: 1; transform: translateY(0); }
}

@keyframes shimmer {
  from { left: -80%; }
  to   { left: 120%; }
}

@keyframes scrollBounce {
  0%, 100% { transform: translateX(-50%) translateY(0); opacity: 0.5; }
  50%       { transform: translateX(-50%) translateY(7px); opacity: 0.9; }
}

@keyframes revealIn {
  from { opacity: 0; transform: translateY(28px); }
  to   { opacity: 1; transform: translateY(0); }
}


/* === menu_type_switcher === */
.menu__type-switcher {
  display: flex;
  gap: 0.75rem;
  justify-content: safe center;
  padding: 1rem 0;
  z-index: 10;
}

.menu__type-btn {
  display: inline-block;
  padding: 0.45rem 1.25rem;
  border: 1.5px solid var(--color-burgundy);
  border-radius: 99px;
  background: transparent;
  color: var(--color-burgundy);
  font-family: inherit;
  font-size: 0.85rem;
  letter-spacing: 0.05em;
  text-transform: uppercase;
  cursor: pointer;
  transition: background 0.2s ease, color 0.2s ease;
}

.menu__type-btn:hover,
.menu__type-btn--active {
  background: var(--color-burgundy);
  color: var(--color-pink);
}

/* Canvas: overlay at top */
#menu-canvas .menu__type-switcher {
  position: absolute;
  top: 0.25rem;
  left: 0;
  right: 0;

  overflow-x: auto;
  overflow-y: hidden;
  -webkit-overflow-scrolling: touch;
  touch-action: pan-x;

  /* Inline padding so first/last buttons aren't flush against viewport edges */
  padding-inline: 1rem;

  /* Snap each button to centre when scrolling stops */
  scroll-snap-type: x mandatory;
  scroll-padding-inline: 1rem;

  /* Hide scrollbar across browsers */
  scrollbar-width: none;            /* Firefox */
  -ms-overflow-style: none;         /* legacy Edge / IE */
}

#menu-canvas .menu__type-switcher::-webkit-scrollbar {
  display: none;                    /* WebKit / Blink */
}

#menu-canvas .menu__type-btn {
  /* Keep buttons from being shrunk by the flex container */
  flex: 0 0 auto;
  scroll-snap-align: center;
}

/* Static section: pin the switcher absolutely at the top of the section
   so its position stays consistent across layout types. Without this it
   sat at .site-section's padding-top in kitchen/bar (multi-column flow,
   column-span: all) but at y=0 in cocktails (height:100% site-section
   with padding 0), causing a visible jump when switching types. */
#menu-static .menu__type-switcher {
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
}


/* === menu_static === */
/* The static (non-touch) menu. Its pinning (display:contents wrapper +
   position:sticky full-viewport container) is instance design — see
   instances/<name>/stylesheets/scroll_layout.css. Core flows normally: a plain
   white menu block in the document, scrolled through natively. */
.menu-section--static {
  background: var(--color-white);
}

.menu-section--static .site-section {
  width: 100%;
  box-sizing: border-box;
  overflow: hidden;
  columns: 3;
  column-fill: balance;
  column-gap: clamp(0.25rem, 3vw, 3rem);
  margin: 0;
  max-width: none;
  padding: 0 clamp(0.25rem, 1vw, 0.75rem);
  padding-top: clamp(1.25rem, 3vw, 2.25rem);
  padding-bottom: clamp(1.5rem, 4vw, 3rem);
}

.menu-section--static .menu__static-category {
  break-inside: avoid;
  display: grid;
  grid-template-columns: 1fr 1fr;
  column-gap: clamp(0.25rem, 1.25vw, 1.25rem);
  row-gap: 0;
}

.menu-section--static .menu__static-category-name {
  grid-column: 1 / -1;
}

/* Hide the top "Menu" section heading — categories speak for themselves */
.menu-section--static .site-section > .section-heading {
  display: none;
}

/* Hide all type-scoped elements by default; the inline JS in
   _menu_section.html.erb sets `.is-active` on those whose type matches
   the section's data-active-type. */
.menu-section--static .menu__static-group { display: none; }
.menu-section--static .menu__static-group.is-active { display: contents; }

.menu__static-logo {
  break-inside: avoid;
  text-align: center;
  margin-bottom: clamp(0.25rem, 2vw, 2rem);
}

.menu__static-logo--top .menu__static-logo-wordmark {
  width: 80%;
  height: auto;
  margin: 0 auto;
  display: block;
}

.menu__static-logo--top .menu__static-logo-cat-top {
  width: 55%;
  height: auto;
  margin: clamp(0.5rem, 2vw, 1.5rem) auto 0;
  display: block;
}

.menu__static-menu-end {
  break-inside: avoid;
  margin-top: 2rem;
}

.menu__static-logo-tag {
  display: flex;
  align-items: center;
  gap: 0.5rem;
  border: 1px solid var(--color-burgundy);
  margin-bottom: 0.5rem;
}

.menu__static-logo .menu__static-logo-cat {
  width: clamp(1rem, 4vw, 4rem);
  height: auto;
  flex-shrink: 0;
}

.menu__static-logo-info {
  font-family: var(--font-serif);
  font-size: clamp(0.15rem, 0.55vw, 0.6rem);
  font-weight: 100;
  color: var(--color-burgundy);
  line-height: 1;
  letter-spacing: 0;
  white-space: pre-line;
  text-align: left;
  margin: 0;
}

.menu__static-logo-tag-text {
  display: flex;
  flex-direction: column;
  gap: 0.15rem;
  flex: 1 1 auto;
  min-width: 0;
}

.menu__static-allergens-note {
  font-family: var(--font-serif);
  font-size: clamp(0.15rem, 0.55vw, 0.6rem);
  font-weight: 700;
  letter-spacing: 0.05em;
  text-transform: uppercase;
  color: var(--color-burgundy);
  line-height: 1;
}

.menu__static-logo-tag--legend {
  align-items: stretch;
  gap: 0;
  padding: 0;
}

.menu__static-logo-tag--legend .menu__static-logo-tag-col {
  flex: 1 1 0;
  display: flex;
  align-items: center;
  justify-content: center;
  padding: clamp(0.15rem, 0.6vw, 0.3rem) clamp(0.25rem, 1vw, 1rem);
  min-width: 0;
}

.menu__static-logo-tag--legend .menu__static-logo-tag-col + .menu__static-logo-tag-col {
  border-left: 1px solid var(--color-burgundy);
}

.menu__static-diet-legend {
  list-style: none;
  margin: 0;
  padding: 0;
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  gap: clamp(0.2rem, 0.75vw, 0.75rem);
  font-family: var(--font-serif);
  font-size: clamp(0.15rem, 0.55vw, 0.6rem);
  font-weight: 700;
  letter-spacing: 0.05em;
  text-transform: uppercase;
  color: var(--color-burgundy);
  line-height: 1;
}

.menu__static-diet-legend li {
  display: inline-flex;
  flex-direction: column;
  align-items: center;
  gap: 0.2rem;
}

.menu__static-diet-legend-icon {
  width: clamp(0.4rem, 0.9vw, 0.85rem);
  height: clamp(0.4rem, 0.9vw, 0.85rem);
  display: block;
}

.menu__static-logo > img {
  width: 100%;
  height: auto;
}

.menu__static-logo-name {
  font-family: var(--font-serif);
  font-size: clamp(0.8rem, 3.8vw, 3.5rem);
  font-weight: 700;
  text-transform: uppercase;
  color: var(--color-burgundy);
  text-align: center;
  margin: 0;
}

.menu__static-logo-subtitle {
  font-family: var(--font-serif);
  font-size: clamp(0.2rem, 1vw, 0.875rem);
  font-weight: 700;
  color: var(--color-burgundy);
  letter-spacing: 0.02em;
}

/* Each category block — aligns to top of its grid cell */
.menu__static-category {
  align-self: start;
}

/* Category name: large bold centered uppercase — like WOK / GRILL / OVEN in PDF */
.menu__static-category-name {
  font-family: var(--font-serif);
  font-size: clamp(0.64rem, 3.04vw, 2.08rem);
  font-weight: 700;
  text-transform: uppercase;
  color: var(--color-burgundy);
  text-align: center;
  margin: 0;
  padding-bottom: clamp(0.1rem, 0.75vw, 0.5rem);
}

/* Dish row */
.menu__static-dish {
  padding: clamp(0.02rem, 0.1vw, 0.1rem) 0;
}

.menu__static-dish:last-child {
  padding-bottom: clamp(0.1rem, 0.75vw, 0.75rem);
}

/* Name left, price right — both on baseline */
.menu__static-dish-header {
  display: flex;
  justify-content: space-between;
  align-items: baseline;
  gap: clamp(0.1rem, 0.75vw, 0.75rem);
  margin-bottom: 0;
}

.menu__static-dish-name {
  font-family: var(--font-serif);
  font-size: clamp(0.2rem, 1vw, 0.8rem);
  font-weight: 700;
  color: var(--color-burgundy);
  letter-spacing: 0.02em;
  flex: 1 1 auto;
  min-width: 0;
  /* Names are stored natural-case (the DB is the source of truth for casing);
     the web menu renders them UPPERCASE by design. The canvas menu does the
     same via texture.js (CSS can't restyle canvas-painted text). */
  text-transform: uppercase;
}

/* Serving sizes: parenthetical after dish name, slightly muted, same font */
.menu__static-dish-serving-sizes {
  font-weight: 400;
  opacity: 0.7;
  margin-left: 0.15em;
}

/* Diet icons sit between name and price, baseline-aligned */
.menu__static-dish-header .dish-diet-icons {
  display: inline-flex;
  align-items: center;
  gap: 0.15rem;
  flex-shrink: 0;
}

.menu__static-dish-header .dish-diet-icons__icon {
  width:  clamp(0.4rem, 0.9vw, 0.85rem);
  height: clamp(0.4rem, 0.9vw, 0.85rem);
  display: block;
}

.menu__static-dish-price {
  font-family: var(--font-serif);
  font-size: clamp(0.2rem, 1vw, 0.875rem);
  font-weight: 400;
  color: var(--color-burgundy);
  white-space: nowrap;
  flex-shrink: 0;
}

.menu__static-dish-description {
  font-family: var(--font-serif);
  font-size: clamp(0.15rem, 0.8vw, 0.75rem);
  color: var(--color-burgundy);
  line-height: 1.5;
  margin: 0;
  font-weight: 400;
}


/* === print_card === */
/* The printed card, mirrored on screen. The <svg> viewBox is the card in PDF
   points and every run is placed by MenuPrint::Render itself, so there is no
   geometry here — only the art behind the text, the palette, and how the card
   sits in its section.

   The colours are sampled from the RASTERISED card, not the brand tokens: the
   art went through sRGB -> CMYK -> sRGB for print and came back warmer, and the
   text has to match the art it sits on rather than the theoretical conversion.
   See thoughts/shared/plans/2026-07-09-designer-menu-web-layouts.md (Phase 2). */
.print-card {
  /* Text colours: what the layout's DeviceCMYK rasterises to. The design's own
     hexes are in the comment — the CMYK round-trip moved them, and the text has
     to agree with the PDF it mirrors, not with the pre-press source. */
  --print-card-red: #b21d23;    /* design #a52216 */
  --print-card-cream: #fef1dc;
  --print-card-ink: #511e11;    /* design #3a1410 */
  --print-card-muted: #95604b;  /* design #8a5750 */
  --print-card-rust: #874430;   /* design #7a3b34 */
  --print-card-blush: #e4c8b8;  /* design #e2c6bf */
  --print-card-paper: #eccfc1;  /* hours text on the lunch card's red band */

  position: relative;
  background-repeat: no-repeat;
  /* Registers the art with the viewBox: the SVG fills the box exactly. */
  background-size: 100% 100%;
}

.print-card__art {
  display: block;
  width: 100%;
  height: auto; /* intrinsic, from the viewBox */
}

/* Hinting would nudge glyphs off the baselines Prawn measured. */
.print-card__ink {
  text-rendering: geometricPrecision;
  fill: var(--print-card-red);
}

.print-card__ink--red { fill: var(--print-card-red); }
.print-card__ink--cream { fill: var(--print-card-cream); }
.print-card__ink--ink { fill: var(--print-card-ink); }
.print-card__ink--muted { fill: var(--print-card-muted); }
.print-card__ink--rust { fill: var(--print-card-rust); }
.print-card__ink--paper { fill: var(--print-card-paper); }

.print-card__rule { stroke: var(--print-card-red); }
.print-card__rule--red { stroke: var(--print-card-red); }
.print-card__rule--blush { stroke: var(--print-card-blush); }

/* ── the baked art ─────────────────────────────────────────────────────────
   Rendered by bin/menu_web_backgrounds. The menu card's background.pdf is pure
   vector, so it ships as one resolution-independent SVG — it stays as crisp as
   the live SVG text laid over it, at any browser zoom. The cocktail and lunch
   cards carry real rasters (photos / a toile pattern), so they stay webp
   posters, stepped by the pane's HEIGHT (and DPR) — the card always spans the
   section, so its art tracks height, not width. */
.print-card--menu-p1 { background-image: url("/brand/print_card_menu_p1.svg"); }
.print-card--menu-p2 { background-image: url("/brand/print_card_menu_p2.svg"); }
.print-card--cocktails-p2 { background-image: url("/brand/print_card_cocktails_p2-1280w.webp"); }

@media (min-height: 1000px), (min-resolution: 1.5dppx) {
  .print-card--cocktails-p2 { background-image: url("/brand/print_card_cocktails_p2-1920w.webp"); }
}

@media (min-height: 1500px), (min-resolution: 2dppx) {
  .print-card--cocktails-p2 { background-image: url("/brand/print_card_cocktails_p2-2560w.webp"); }
}

/* The lunch card is a tall 105×297 mm slip: fitted to the pane's height it is
   only a few hundred px across, so it steps by DPR alone. */
.print-card--lunch-p1 { background-image: url("/brand/print_card_lunch_p1-720w.webp"); }

@media (min-resolution: 2dppx) {
  .print-card--lunch-p1 { background-image: url("/brand/print_card_lunch_p1-1080w.webp"); }
}

/* ── the card in its section ───────────────────────────────────────────────
   The section stays the pinned 100svh pane that scroll_layout.css sets up: the
   whole stacked-panel scroll depends on it, because #reservations rides *over*
   the pinned menu. A card is therefore fitted INTO the pane — as wide as the
   pane allows, but never taller than it, so the whole card is on screen at once.
   (Letting the section grow to a full-width A3 card drops it out of the sticky
   stack and #reservations simply follows it down the page.)

   The card is as tall as the pane, minus everything the section reserves around
   it: --print-card-pane-inset above AND below (the air the card floats in), plus
   --print-card-switcher-clear on top of that where the switcher can't sit over
   the art. The SAME values are the .site-section padding, so height and padding
   can't drift: reserve nothing and the card fills the pane; reserve 1rem of
   inset and it is 2rem shorter, sitting 1rem clear of the pane's floor.
   `min(100%, …)` takes over on a viewport too narrow for the resulting width. */
.print-card {
  width: min(100%, calc((100svh
    - var(--print-card-switcher-clear, 0px)
    - 2 * var(--print-card-pane-inset, 0px)) * var(--print-card-aspect, 1)));
}

/* width / height of the card this variant mirrors — the lunch slip is portrait,
   so the same rule sizes it off the pane's height too. */
.print-card--menu-p1,
.print-card--menu-p2 { --print-card-aspect: 1.40999; }
.print-card--cocktails-p2 { --print-card-aspect: 1.40844; }
.print-card--lunch-p1 { --print-card-aspect: 0.35334; }

.menu-section--static:is(
  [data-active-layout="kitchen_menu_layout"],
  [data-active-layout="bar_menu_layout"],
  [data-active-layout="cocktails_menu_layout"],
  [data-active-layout="lunch_menu_layout"],
  [data-active-layout="child_menu_layout"]
) .site-section {
  columns: initial;
  overflow: visible;
  padding: 0;
  padding-top: calc(var(--print-card-switcher-clear, 0px) + var(--print-card-pane-inset, 0px));
  padding-bottom: var(--print-card-pane-inset, 0px);
  display: flex;
  justify-content: center;
}

/* The air the card floats in: the same band above it and below it. Without the
   bottom half a card sized off the pane's full height ends exactly on the pane's
   floor — and, once the padding pushed it down, ran past it and was clipped by
   the section's overflow. Set on the section so the padding and the card's
   height read the same value. */
.menu-section--static:is(
  [data-active-layout="kitchen_menu_layout"],
  [data-active-layout="bar_menu_layout"],
  [data-active-layout="cocktails_menu_layout"],
  [data-active-layout="lunch_menu_layout"],
  [data-active-layout="child_menu_layout"]
) {
  --print-card-pane-inset: 1rem;
}

/* The menu card's top strip is empty paper, so the switcher may sit over it. The
   cocktail card's art band and the lunch card's red header start at the card's
   very top edge — reserve the switcher's height above those two, on top of the
   inset. */
.menu-section--static:is(
  [data-active-layout="cocktails_menu_layout"],
  [data-active-layout="lunch_menu_layout"]
) {
  --print-card-switcher-clear: 3.75rem;
}

/* The colour each section shows in the pane around its card. Keyed off the
   section, not the card: the card's own custom properties don't cascade up.

   Kitchen/bar read --menu-card-paper, the exact token bin/menu_web_backgrounds
   bakes their card's cream page fill from (it is a vector fill), so the card edge
   is seamless. Cocktails sits on the same token — but its card paper is a baked
   WHITE raster, so this is a deliberate seam: the whole static menu reads one
   warm blush even though the cocktail card itself stays white. Lunch matches its
   own baked blush raster. */
.menu-section--static:is(
  [data-active-layout="kitchen_menu_layout"],
  [data-active-layout="bar_menu_layout"],
  [data-active-layout="cocktails_menu_layout"],
  [data-active-layout="child_menu_layout"]
) { background: var(--menu-card-paper); }

.menu-section--static[data-active-layout="lunch_menu_layout"] { background: #f9ece8; }

/* The shared rule collapses an active group to `display: contents`, which would
   drop the card's own box (and its background art). */
.menu-section--static .menu__static-group.print-card.is-active { display: block; }


/* === menu_static_kitchen_menu_layout === */
/* Static-menu pinning (sticky 100vh container) is instance design — see
   instances/<name>/stylesheets/scroll_layout.css. Core flows normally. */
.menu-section--static { background: var(--color-white); }

.menu-section--static .site-section {
  width: 100%;
  box-sizing: border-box;
  overflow: hidden;
  columns: 3;
  column-fill: balance;
  column-gap: clamp(0.25rem, 3vw, 3rem);
  margin: 0;
  max-width: none;
  padding: 0 clamp(0.25rem, 1vw, 0.75rem);
  padding-top: clamp(1.25rem, 3vw, 2.25rem);
  padding-bottom: clamp(1.5rem, 4vw, 3rem);
}

.menu-section--static .menu__static-category {
  break-inside: avoid;
  display: grid;
  grid-template-columns: 1fr 1fr;
  column-gap: clamp(0.25rem, 1.25vw, 1.25rem);
  row-gap: 0;
}

.menu-section--static .menu__static-category-name {
  grid-column: 1 / -1;
}

/* Hide the top "Menu" section heading — categories speak for themselves */
.menu-section--static .site-section > .section-heading {
  display: none;
}

/* Hide all type-scoped elements by default; the inline JS in
   _menu_section.html.erb sets `.is-active` on those whose type matches
   the section's data-active-type. */
.menu-section--static .menu__static-group { display: none; }
.menu-section--static .menu__static-group.is-active { display: contents; }

.menu__static-logo {
  break-inside: avoid;
  text-align: center;
  margin-bottom: clamp(0.25rem, 2vw, 2rem);
}

.menu__static-logo--top .menu__static-logo-wordmark {
  width: 80%;
  height: auto;
  margin: 0 auto;
  display: block;
}

.menu__static-logo--top .menu__static-logo-cat-top {
  width: 55%;
  height: auto;
  margin: clamp(0.5rem, 2vw, 1.5rem) auto 0;
  display: block;
}

.menu__static-menu-end {
  break-inside: avoid;
  margin-top: 2rem;
}

.menu__static-logo-tag {
  display: flex;
  align-items: center;
  gap: 0.5rem;
  border: 1px solid var(--color-burgundy);
  margin-bottom: 0.5rem;
}

.menu__static-logo .menu__static-logo-cat {
  width: clamp(1rem, 4vw, 4rem);
  height: auto;
  flex-shrink: 0;
}

.menu__static-logo-info {
  font-family: var(--font-serif);
  font-size: clamp(0.15rem, 0.55vw, 0.6rem);
  font-weight: 100;
  color: var(--color-burgundy);
  line-height: 1;
  letter-spacing: 0;
  white-space: pre-line;
  text-align: left;
  margin: 0;
}

.menu__static-logo-tag-text {
  display: flex;
  flex-direction: column;
  gap: 0.15rem;
  flex: 1 1 auto;
  min-width: 0;
}

.menu__static-allergens-note {
  font-family: var(--font-serif);
  font-size: clamp(0.15rem, 0.55vw, 0.6rem);
  font-weight: 700;
  letter-spacing: 0.05em;
  text-transform: uppercase;
  color: var(--color-burgundy);
  line-height: 1;
}

.menu__static-logo-tag--legend {
  align-items: stretch;
  gap: 0;
  padding: 0;
}

.menu__static-logo-tag--legend .menu__static-logo-tag-col {
  flex: 1 1 0;
  display: flex;
  align-items: center;
  justify-content: center;
  padding: clamp(0.15rem, 0.6vw, 0.3rem) clamp(0.25rem, 1vw, 1rem);
  min-width: 0;
}

.menu__static-logo-tag--legend .menu__static-logo-tag-col + .menu__static-logo-tag-col {
  border-left: 1px solid var(--color-burgundy);
}

.menu__static-diet-legend {
  list-style: none;
  margin: 0;
  padding: 0;
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  gap: clamp(0.2rem, 0.75vw, 0.75rem);
  font-family: var(--font-serif);
  font-size: clamp(0.15rem, 0.55vw, 0.6rem);
  font-weight: 700;
  letter-spacing: 0.05em;
  text-transform: uppercase;
  color: var(--color-burgundy);
  line-height: 1;
}

.menu__static-diet-legend li {
  display: inline-flex;
  flex-direction: column;
  align-items: center;
  gap: 0.2rem;
}

.menu__static-diet-legend-icon {
  width: clamp(0.4rem, 0.9vw, 0.85rem);
  height: clamp(0.4rem, 0.9vw, 0.85rem);
  display: block;
}

.menu__static-logo > img {
  width: 100%;
  height: auto;
}

.menu__static-logo-name {
  font-family: var(--font-serif);
  font-size: clamp(0.8rem, 3.8vw, 3.5rem);
  font-weight: 700;
  text-transform: uppercase;
  color: var(--color-burgundy);
  text-align: center;
  margin: 0;
}

.menu__static-logo-subtitle {
  font-family: var(--font-serif);
  font-size: clamp(0.2rem, 1vw, 0.875rem);
  font-weight: 700;
  color: var(--color-burgundy);
  letter-spacing: 0.02em;
}

/* Each category block — aligns to top of its grid cell */
.menu__static-category {
  align-self: start;
}

/* Category name: large bold centered uppercase — like WOK / GRILL / OVEN in PDF */
.menu__static-category-name {
  font-family: var(--font-serif);
  font-size: clamp(0.64rem, 3.04vw, 2.08rem);
  font-weight: 700;
  text-transform: uppercase;
  color: var(--color-burgundy);
  text-align: center;
  margin: 0;
  padding-bottom: clamp(0.1rem, 0.75vw, 0.5rem);
}

/* Dish row */
.menu__static-dish {
  padding: clamp(0.02rem, 0.1vw, 0.1rem) 0;
}

.menu__static-dish:last-child {
  padding-bottom: clamp(0.1rem, 0.75vw, 0.75rem);
}

/* Name left, price right — both on baseline */
.menu__static-dish-header {
  display: flex;
  justify-content: space-between;
  align-items: baseline;
  gap: clamp(0.1rem, 0.75vw, 0.75rem);
  margin-bottom: 0;
}

.menu__static-dish-name {
  font-family: var(--font-serif);
  font-size: clamp(0.2rem, 1vw, 0.8rem);
  font-weight: 700;
  color: var(--color-burgundy);
  letter-spacing: 0.02em;
  flex: 1 1 auto;
  min-width: 0;
}

/* Serving sizes: parenthetical after dish name, slightly muted, same font */
.menu__static-dish-serving-sizes {
  font-weight: 400;
  opacity: 0.7;
  margin-left: 0.15em;
}

/* Diet icons sit between name and price, baseline-aligned */
.menu__static-dish-header .dish-diet-icons {
  display: inline-flex;
  align-items: center;
  gap: 0.15rem;
  flex-shrink: 0;
}

.menu__static-dish-header .dish-diet-icons__icon {
  width:  clamp(0.4rem, 0.9vw, 0.85rem);
  height: clamp(0.4rem, 0.9vw, 0.85rem);
  display: block;
}

.menu__static-dish-price {
  font-family: var(--font-serif);
  font-size: clamp(0.2rem, 1vw, 0.875rem);
  font-weight: 400;
  color: var(--color-burgundy);
  white-space: nowrap;
  flex-shrink: 0;
}

.menu__static-dish-description {
  font-family: var(--font-serif);
  font-size: clamp(0.15rem, 0.8vw, 0.75rem);
  color: var(--color-burgundy);
  line-height: 1.5;
  margin: 0;
  font-weight: 400;
}


/* === menu_static_bar_menu_layout === */
/* Static-menu pinning (sticky 100vh container) is instance design — see
   instances/<name>/stylesheets/scroll_layout.css. Core flows normally. */
.menu-section--static { background: var(--color-white); }

.menu-section--static .site-section {
  width: 100%;
  box-sizing: border-box;
  overflow: hidden;
  columns: 3;
  column-fill: balance;
  column-gap: clamp(0.25rem, 3vw, 3rem);
  margin: 0;
  max-width: none;
  padding: 0 clamp(0.25rem, 1vw, 0.75rem);
  padding-top: clamp(1.25rem, 3vw, 2.25rem);
  padding-bottom: clamp(1.5rem, 4vw, 3rem);
}

.menu-section--static .menu__static-category {
  break-inside: avoid;
  display: grid;
  grid-template-columns: 1fr 1fr;
  column-gap: clamp(0.25rem, 1.25vw, 1.25rem);
  row-gap: 0;
}

.menu-section--static .menu__static-category-name {
  grid-column: 1 / -1;
}

/* Hide the top "Menu" section heading — categories speak for themselves */
.menu-section--static .site-section > .section-heading {
  display: none;
}

/* Hide all type-scoped elements by default; the inline JS in
   _menu_section.html.erb sets `.is-active` on those whose type matches
   the section's data-active-type. */
.menu-section--static .menu__static-group { display: none; }
.menu-section--static .menu__static-group.is-active { display: contents; }

.menu__static-logo {
  break-inside: avoid;
  text-align: center;
  margin-bottom: clamp(0.25rem, 2vw, 2rem);
}

.menu__static-logo--top .menu__static-logo-wordmark {
  width: 80%;
  height: auto;
  margin: 0 auto;
  display: block;
}

.menu__static-logo--top .menu__static-logo-cat-top {
  width: 55%;
  height: auto;
  margin: clamp(0.5rem, 2vw, 1.5rem) auto 0;
  display: block;
}

.menu__static-menu-end {
  break-inside: avoid;
  margin-top: 2rem;
}

.menu__static-logo-tag {
  display: flex;
  align-items: center;
  gap: 0.5rem;
  border: 1px solid var(--color-burgundy);
  margin-bottom: 0.5rem;
}

.menu__static-logo .menu__static-logo-cat {
  width: clamp(1rem, 4vw, 4rem);
  height: auto;
  flex-shrink: 0;
}

.menu__static-logo-info {
  font-family: var(--font-serif);
  font-size: clamp(0.15rem, 0.55vw, 0.6rem);
  font-weight: 100;
  color: var(--color-burgundy);
  line-height: 1;
  letter-spacing: 0;
  white-space: pre-line;
  text-align: left;
  margin: 0;
}

.menu__static-logo-tag-text {
  display: flex;
  flex-direction: column;
  gap: 0.15rem;
  flex: 1 1 auto;
  min-width: 0;
}

.menu__static-allergens-note {
  font-family: var(--font-serif);
  font-size: clamp(0.15rem, 0.55vw, 0.6rem);
  font-weight: 700;
  letter-spacing: 0.05em;
  text-transform: uppercase;
  color: var(--color-burgundy);
  line-height: 1;
}

.menu__static-logo-tag--legend {
  align-items: stretch;
  gap: 0;
  padding: 0;
}

.menu__static-logo-tag--legend .menu__static-logo-tag-col {
  flex: 1 1 0;
  display: flex;
  align-items: center;
  justify-content: center;
  padding: clamp(0.15rem, 0.6vw, 0.3rem) clamp(0.25rem, 1vw, 1rem);
  min-width: 0;
}

.menu__static-logo-tag--legend .menu__static-logo-tag-col + .menu__static-logo-tag-col {
  border-left: 1px solid var(--color-burgundy);
}

.menu__static-diet-legend {
  list-style: none;
  margin: 0;
  padding: 0;
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  gap: clamp(0.2rem, 0.75vw, 0.75rem);
  font-family: var(--font-serif);
  font-size: clamp(0.15rem, 0.55vw, 0.6rem);
  font-weight: 700;
  letter-spacing: 0.05em;
  text-transform: uppercase;
  color: var(--color-burgundy);
  line-height: 1;
}

.menu__static-diet-legend li {
  display: inline-flex;
  flex-direction: column;
  align-items: center;
  gap: 0.2rem;
}

.menu__static-diet-legend-icon {
  width: clamp(0.4rem, 0.9vw, 0.85rem);
  height: clamp(0.4rem, 0.9vw, 0.85rem);
  display: block;
}

.menu__static-logo > img {
  width: 100%;
  height: auto;
}

.menu__static-logo-name {
  font-family: var(--font-serif);
  font-size: clamp(0.8rem, 3.8vw, 3.5rem);
  font-weight: 700;
  text-transform: uppercase;
  color: var(--color-burgundy);
  text-align: center;
  margin: 0;
}

.menu__static-logo-subtitle {
  font-family: var(--font-serif);
  font-size: clamp(0.2rem, 1vw, 0.875rem);
  font-weight: 700;
  color: var(--color-burgundy);
  letter-spacing: 0.02em;
}

/* Each category block — aligns to top of its grid cell */
.menu__static-category {
  align-self: start;
}

/* Category name: large bold centered uppercase — like WOK / GRILL / OVEN in PDF */
.menu__static-category-name {
  font-family: var(--font-serif);
  font-size: clamp(0.64rem, 3.04vw, 2.08rem);
  font-weight: 700;
  text-transform: uppercase;
  color: var(--color-burgundy);
  text-align: center;
  margin: 0;
  padding-bottom: clamp(0.1rem, 0.75vw, 0.5rem);
}

/* Dish row */
.menu__static-dish {
  padding: clamp(0.02rem, 0.1vw, 0.1rem) 0;
}

.menu__static-dish:last-child {
  padding-bottom: clamp(0.1rem, 0.75vw, 0.75rem);
}

/* Name left, price right — both on baseline */
.menu__static-dish-header {
  display: flex;
  justify-content: space-between;
  align-items: baseline;
  gap: clamp(0.1rem, 0.75vw, 0.75rem);
  margin-bottom: 0;
}

.menu__static-dish-name {
  font-family: var(--font-serif);
  font-size: clamp(0.2rem, 1vw, 0.8rem);
  font-weight: 700;
  color: var(--color-burgundy);
  letter-spacing: 0.02em;
  flex: 1 1 auto;
  min-width: 0;
}

/* Serving sizes: parenthetical after dish name, slightly muted, same font */
.menu__static-dish-serving-sizes {
  font-weight: 400;
  opacity: 0.7;
  margin-left: 0.15em;
}

/* Diet icons sit between name and price, baseline-aligned */
.menu__static-dish-header .dish-diet-icons {
  display: inline-flex;
  align-items: center;
  gap: 0.15rem;
  flex-shrink: 0;
}

.menu__static-dish-header .dish-diet-icons__icon {
  width:  clamp(0.4rem, 0.9vw, 0.85rem);
  height: clamp(0.4rem, 0.9vw, 0.85rem);
  display: block;
}

.menu__static-dish-price {
  font-family: var(--font-serif);
  font-size: clamp(0.2rem, 1vw, 0.875rem);
  font-weight: 400;
  color: var(--color-burgundy);
  white-space: nowrap;
  flex-shrink: 0;
}

.menu__static-dish-description {
  font-family: var(--font-serif);
  font-size: clamp(0.15rem, 0.8vw, 0.75rem);
  color: var(--color-burgundy);
  line-height: 1.5;
  margin: 0;
  font-weight: 400;
}


/* === menu_static_cocktails_menu_layout === */
/* The cocktails tab renders the printed cocktail card (see print_card.css and
   instances/ukoi/views/menu/menu_layouts/_menu_static_cocktails_menu_layout.html.erb),
   so the hand-built grid that used to live here — full-bleed art background,
   upper/lower cream panels either side of the artwork band — is gone: the card's
   own baked art carries all of it.

   The file stays because instances/ukoi/stylesheets/manifest.txt lists it, and
   because a future cocktails-only tweak belongs here rather than in the shared
   print_card.css. Empty on purpose. */


/* === menu_static_child_menu_layout === */
/* The kids menu is one centred column on the bar's placemat (see the partial):
   cat, then categories, then the UKOI logo. The backdrop
   (print_card_child_p1.svg) is just the placemat — it carries the card's height —
   and the whole column is an <svg> overlay on the card's own 1199.06 × 850.394
   viewBox. Those runs carry all the type (font / size / hscale / colour /
   grayscale rendering) and match the bar's MenuPrint runs exactly, so there is
   nothing to style here but the layers themselves. The sizing / centring /
   section-background machinery it borrows lives in print_card.css (the layout is
   registered in those :is() lists). */

.print-card--child {
  --print-card-aspect: 1.40999;   /* same page as the bar card */
}

/* The placemat: an in-flow <img> that BOTH paints the ground and gives the card
   its height (intrinsic aspect from the SVG), since the overlay above it is
   absolutely positioned. */
.print-card--child .child-card__art {
  display: block;
  width: 100%;
  height: auto;
}

/* The column (cat + categories + logo): an <svg> overlay on the card's viewBox,
   so its <text> runs land exactly where the bar's would. */
.print-card--child .child-card__content {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  pointer-events: none;
}


/* === reservations === */
#reservations {
  position: relative;
  /* Full-viewport height + pin z-index are instance design (scroll_layout.css). */
  background: var(--color-surface);
  box-shadow: 0 -12px 32px var(--shadow-soft);
}

/* Booking-soon overlay: covers only the Q&A grid (absolute, in
   .reservations__grid's coordinate space — the section heading stays
   visible above it) and scrolls with the section. Toggled by
   opacity/pointer-events only — never changes the grid's or section's
   height (ScrollTrigger pins #reservations with pinSpacing:false; a height
   change would corrupt pin geometry). */
.reservations__overlay {
  position: absolute;
  inset: 0;
  z-index: 2;
  display: flex;
  align-items: center;
  justify-content: center;
  padding: clamp(1rem, 5vw, 3rem);
  background: var(--color-surface);
  transition: opacity 0.35s ease;
}

.reservations__overlay--hidden {
  opacity: 0;
  pointer-events: none;
}

.reservations__overlay-card {
  position: relative;
  background: var(--color-bg);
  border: 1px solid var(--color-border);
  padding: clamp(2.25rem, 5vw, 3rem) clamp(1.75rem, 4vw, 2.75rem);
  max-width: 560px;
  width: 100%;
  box-shadow:
    0 1px 0 rgb(var(--rgb-burgundy) / 0.08),
    0 24px 60px -20px rgb(var(--rgb-text) / 0.35);
}

.reservations__overlay-card::after {
  content: "";
  position: absolute;
  top: 0; left: 0; right: 0;
  height: 3px;
  background: var(--color-burgundy);
  opacity: 0.9;
}

.reservations__overlay-close {
  position: absolute;
  top: 0.85rem;
  right: 0.85rem;
  width: 2.25rem;
  height: 2.25rem;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  background: transparent;
  border: 1px solid var(--color-border);
  border-radius: 50%;
  cursor: pointer;
  color: var(--color-text-muted);
  padding: 0;
  transition: color 0.2s ease, border-color 0.2s ease, background 0.2s ease, transform 0.25s ease;
}

.reservations__overlay-close:hover {
  color: var(--color-bg);
  background: var(--color-burgundy);
  border-color: var(--color-burgundy);
  transform: rotate(90deg);
}

.reservations__overlay-close:focus-visible {
  outline: 2px solid var(--color-burgundy);
  outline-offset: 2px;
}

.reservations__overlay-close-icon {
  width: 0.9rem;
  height: 0.9rem;
  stroke: currentColor;
  stroke-width: 1.6;
  stroke-linecap: round;
  fill: none;
  display: block;
  overflow: visible;
}

.reservations__overlay-body {
  font-family: var(--font-serif);
  font-size: clamp(0.95rem, 2vw, 1.05rem);
  line-height: 1.7;
  color: var(--color-text-muted);
  margin: 0;
  padding-right: 1.5rem;
  white-space: pre-line;
}

.reservations__overlay-ninja {
  display: block;
  width: clamp(84px, 18vw, 120px);
  height: auto;
  margin: 1.75rem auto 0;
}

@media (prefers-reduced-motion: reduce) {
  .reservations__overlay,
  .reservations__overlay-close {
    transition: none;
  }
}

.reservations__grid {
  position: relative;        /* containing block for the booking-soon overlay */
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 2rem 3rem;
}

@media (max-width: 600px) {
  .reservations__grid {
    grid-template-columns: 1fr;
  }
}

.reservations__item h3 {
  font-family: var(--font-serif);
  font-size: 0.85rem;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.05em;
  color: var(--color-burgundy);
  margin: 0 0 0.5rem;
}

.reservations__item p {
  font-size: 0.95rem;
  line-height: 1.6;
  color: var(--color-text);
  margin: 0;
}


/* === booking === */
#booking {
  min-height: 100vh;
  min-height: 100svh;
  z-index: 4;
  background: var(--color-surface);
  box-shadow: 0 -12px 32px var(--shadow-soft);
}

/* Booking section uses tighter vertical padding than other sections so the
   fully-revealed form fits within one viewport. */
#booking > .site-section {
  padding-block: clamp(2rem, 5vw, 3.5rem);
}

/* Author classes here set display: block | flex | grid, which outranks
   the UA rule for [hidden]. Re-hide explicitly so the controller's
   hidden=true actually hides the element. */
.booking__floor[hidden],
.booking__layout-tabs[hidden],
.booking__date-first[hidden],
.booking__field[hidden] { display: none; }

/* Visually hidden field — kept in the DOM and the form's submit data, but
   off-screen for sighted users and out-of-tree for AT/keyboard. */
.booking__field--aux {
  position: absolute;
  width: 1px;
  height: 1px;
  margin: -1px;
  padding: 0;
  overflow: hidden;
  opacity: 0;
  pointer-events: none;
  border: 0;
  clip-path: inset(50%);
}

.booking__layout {
  display: flex;
  flex-direction: column;
  gap: 2rem;
  width: 100%;
  min-width: 0;
}

/* Grid/flex items default to min-width: auto, expanding to fit content.
   Without min-width: 0 the 1fr column would inflate to the Konva canvas's
   1200 px design width and overflow .site-section. */
.booking__floors,
.booking__form-panel { min-width: 0; max-width: 100%; }

.booking__floors { width: 100%; }

.booking__canvas-wrap {
  position: relative;
  width: 100%;
  min-height: 240px;
}

/* Per-layout wrap; holds the floor title + the Konva-sized stage box.
   On mobile floors stack; on desktop they sit in a row (see media query). */
.booking__floor {
  display: block;
  margin: 0 auto;
  max-width: 100%;
  padding: 1rem;
  border-radius: 4px;
  background: rgb(var(--rgb-white) / 0.4);
}
.booking__floor + .booking__floor { margin-top: 1.5rem; }

.booking__floor-title {
  font-family: var(--font-serif);
  font-size: 0.85rem;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.05em;
  color: var(--color-burgundy);
  margin: 0 0 0.5rem;
  text-align: center;
}

/* The inline-SVG stage container. The SVG carries a viewBox, so width:100%
   + height:auto scales it to the available width at every breakpoint with
   no JS — this replaces the old Konva #fitStage measure/scale loop. */
.booking__floor-stage { display: block; margin: 0 auto; max-width: 100%; }
.booking__floor-stage svg {
  display: block;
  width: 100%;
  height: auto;       /* viewBox aspect ratio drives height */
  max-width: 100%;
}

.booking__hint {
  padding: 0 1rem;
  color: var(--color-text-muted);
  font-size: 0.95rem;
}

/* Layout selector: a row of pill buttons that switch which floor's SVG
   stage is visible. Hidden when there's only one layout (controller side). */
.booking__layout-tabs {
  display: flex;
  flex-wrap: wrap;
  gap: 0.5rem;
  justify-content: center;
  margin-bottom: 1rem;
}

.booking__layout-tab {
  position: relative;          /* anchor for the iOS-style count badge */
  min-height: 36px;
  padding: 0 1rem;
  background: transparent;
  border: 1px solid var(--color-border);
  border-radius: 999px;
  cursor: pointer;
  font: inherit;
  font-size: 0.85rem;
  color: var(--color-text);
  transition: background 0.15s ease, color 0.15s ease, border-color 0.15s ease;
}

.booking__layout-tab--active {
  background: var(--color-burgundy);
  color: var(--color-pink);
  border-color: var(--color-burgundy);
}

/* iOS-notification-style count badge: small burgundy pill anchored to the
   tab's top-right corner. Only present after a time is picked (controller
   toggles [hidden]); absence of the badge ≠ "0 free". */
.booking__layout-tab__badge {
  position: absolute;
  top: -6px;
  right: -6px;
  min-width: 18px;
  height: 18px;
  padding: 0 5px;
  display: inline-flex;
  justify-content: center;
  box-sizing: border-box;
  border-radius: 999px;
  border: 1px solid var(--color-pink);
  background: var(--color-burgundy);
  color: var(--color-pink);
  font-size: 0.7rem;
  font-weight: 700;
  line-height: 1;
  pointer-events: none;
}

.booking__layout-tab__badge[hidden] { display: none; }

/* Two-tab pill that switches the booking section between table-first and
   date-first entry paths. Lives at the top of the section, ABOVE the
   canvas/form layout, so it spans the full width and reads as a primary
   control. Radio inputs are visually replaced by their <span> labels;
   the input itself stays in the DOM for keyboard / screen-reader semantics. */
.booking__mode-toggle {
  display: flex;
  gap: 0.25rem;
  padding: 0.25rem;
  margin: 0 auto 1rem;
  max-width: 480px;
  background: var(--color-pink);
  border: 1px solid var(--color-border);
  border-radius: 999px;
}

.booking__mode-option {
  flex: 1 1 50%;
  display: flex;
  position: relative;
  cursor: pointer;
}

.booking__mode-option input {
  position: absolute;
  opacity: 0;
  pointer-events: none;
}

.booking__mode-option > span {
  display: flex;
  flex: 1;
  align-items: center;
  justify-content: center;
  text-align: center;
  padding: 0.55rem 0.75rem;
  border-radius: 999px;
  font-size: 0.9rem;
  color: var(--color-text);
  transition: background 0.15s ease, color 0.15s ease;
}

.booking__mode-option input:checked + span {
  background: var(--color-burgundy);
  color: var(--color-pink);
}

.booking__mode-option input:focus-visible + span {
  outline: 2px solid var(--color-burgundy);
  outline-offset: 2px;
}

/* Date-first stage: date / party / duration / time stacked in a single
   column. Fields stack the same way at every breakpoint (no inner grid). */
.booking__date-first {
  margin-bottom: 0.625rem;
}

.booking__date-first .booking__field { margin-bottom: 0.625rem; }

/* Once the start-time pills become available the date_first_hint is
   redundant — the next step (pick a time, then a table) is implicit in
   the pills row itself. Hide the hint so the surfaced controls aren't
   competing with stale instructions. */
[data-booking-form-target="startFieldGlobal"]:not([hidden]) + .booking__hint {
  display: none;
}

.booking__form-panel {
  padding: 0;
}

.booking__summary {
  font-size: 0.95rem;
  line-height: 1.4;
  color: var(--color-text-muted);
  margin: 0;
  /* Hold a consistent control-height baseline so the summary text box
     reads at the same height as the field inputs stacked below it. */
  min-height: 36px;
  display: flex;
  align-items: center;
}

.booking__field {
  display: block;
  margin-bottom: 0.625rem;
  border: 0;
  padding: 0;
}

/* Opt-in horizontal grouping. Wrap two (or more) .booking__field elements in
   a .booking__row to place them side by side (e.g. first name + last name).
   Children flex to equal widths and wrap back to a stack on narrow viewports
   so the width:100% inputs never overflow — no media query needed. The row
   carries the vertical rhythm so grouped fields keep the same spacing as the
   stacked ones around them. Apply manually around whichever fields should
   share a row inside .booking__form-top / .booking__form-bottom. */
.booking__row {
  display: flex;
  flex-wrap: wrap;
  gap: 0.625rem 0.75rem;        /* row-gap when wrapped to a stack / column-gap when side by side */
  margin-bottom: 0.625rem;
}

.booking__row > .booking__field {
  flex: 1 1 0;                  /* equal widths, no per-field minimum: the row's
                                   children always stay on one line and scale
                                   down together, even in the narrow booking
                                   form column / on mobile date-first */
  min-width: 0;                 /* let the 100%-width inputs shrink instead of overflowing */
  margin-bottom: 0;             /* the row owns the bottom spacing */
}

/* A field flagged --wide always takes its own full-width row even inside a
   .booking__row (matches its standalone behaviour for textarea etc.). */
.booking__row > .booking__field--wide {
  flex-basis: 100%;
}

/* Table-first mode reveals fields one step at a time (date → duration →
   start → party size). Without reserving their layout space the rest of
   the form (name, email, phone, …) jumps down on each reveal. Hold each
   progressive field in flow with a min-height baseline; while [hidden],
   the field stays in flow but invisible (visibility: hidden) so siblings
   below stay anchored. The start-time pills field is excluded — its
   height is too variable (number of slots wraps unpredictably) so it
   keeps the default reveal-and-push behavior. Scoped to table-first;
   date-first mode keeps `display: none`. */
[data-booking-form-mode-value="table-first"] [data-booking-form-target="dateField"],
[data-booking-form-mode-value="table-first"] [data-booking-form-target="durationField"],
[data-booking-form-mode-value="table-first"] [data-booking-form-target="partySizeField"] {
  /* Match a static field row: ~19px label + 4px label-margin + 40-44px input
     control ≈ 63-67px. 4rem (64px) lines up empty placeholders with the
     surrounding name/email rows so spacing reads the same whether the field
     is filled or reserved. */
  min-height: 4rem;
}
[data-booking-form-mode-value="table-first"] [data-booking-form-target="dateField"][hidden],
[data-booking-form-mode-value="table-first"] [data-booking-form-target="durationField"][hidden],
[data-booking-form-mode-value="table-first"] [data-booking-form-target="partySizeField"][hidden] {
  display: block;
  visibility: hidden;
}

.booking__field > span,
.booking__field > legend {
  display: block;
  margin-bottom: 0.25rem;
  font-family: var(--font-serif);
  font-size: 0.8rem;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.05em;
  color: var(--color-burgundy);
}

.booking__field input,
.booking__field textarea,
.booking__field select {
  box-sizing: border-box;       /* width: 100% + padding must stay within parent */
  width: 100%;
  padding: 0.6rem 0.75rem;
  border: 1px solid var(--color-border);
  border-radius: 4px;
  background: var(--color-pink);
  color: var(--color-text);
  font: inherit;
  min-height: 44px;
}

.booking__field textarea { min-height: 56px; resize: vertical; }

/* iOS Safari gives <input type="date"> an intrinsic min-width that ignores
   `width: 100%`, causing the field to overflow narrow mobile containers.
   It also injects vertical metrics into the native date control that don't
   respect the shared `min-height: 44px`, so the field renders a few px off
   from the surrounding inputs — pin an explicit height to align them. */
.booking__field input[type="date"] {
  -webkit-appearance: none;
  appearance: none;
  min-width: 0;
  max-width: 100%;
  height: 44px;
}

.booking__field input:focus,
.booking__field textarea:focus,
.booking__field select:focus {
  outline: none;
  border-color: var(--color-burgundy);
}

/* `appearance: base-select` opts into the new customizable native select.
   Browsers without support fall back to the platform's default rendering. */
.booking__field select {
  appearance: base-select;
  cursor: pointer;
  text-align: left;
}

.booking__field select::picker-icon {
  color: var(--color-burgundy);
  transition: transform 0.15s ease;
}

.booking__field select:open::picker-icon { transform: rotate(180deg); }

.booking__field select::picker(select) {
  appearance: base-select;
  border: 1px solid var(--color-border);
  border-radius: 4px;
  background: var(--color-pink);
  padding: 0.25rem;
  box-shadow: 0 8px 24px rgb(var(--rgb-black) / 0.12);
}

.booking__field select option {
  padding: 0.4rem 0.6rem;
  border-radius: 3px;
  color: var(--color-text);
}

.booking__field select option:checked {
  background: var(--color-burgundy);
  color: var(--color-pink);
}

.booking__field select option:hover { background: var(--color-burgundy-light); }

.booking__pills {
  display: flex;
  flex-wrap: wrap;
  gap: 0.5rem;
  align-items: center;
}

/* Empty-state placeholder for pills — shown until the controller injects
   pill buttons (or a hint paragraph). The :empty selector matches only
   when the container has no children, so the placeholder cleanly
   disappears as soon as content lands. */
.booking__pills:empty::before {
  content: attr(data-placeholder);
  color: var(--color-text-muted);
  font-style: italic;
  font-size: 0.95rem;
}

.booking__pill {
  min-height: 30px;
  padding: 0 0.5rem;
  background: transparent;
  border: 1px solid var(--color-border);
  border-radius: 999px;
  cursor: pointer;
  font: inherit;
  color: var(--color-text);
  text-align: center;
}

.booking__pill--selected {
  background: var(--color-burgundy);
  color: var(--color-pink);
  border-color: var(--color-burgundy);
}

/* Warning banner shown directly under the booking heading when bookings
   are temporarily unavailable. */
.booking__notice {
  margin: 1rem 0 1.5rem;
  padding: 0.75rem 1.25rem;
  background: var(--color-pink);
  border: 1px solid var(--color-burgundy);
  border-radius: 4px;
  color: var(--color-burgundy);
  font-size: 0.95rem;
  font-weight: 700;
  text-align: center;
}

.booking__errors {
  margin: 0 0 0.75rem;
  padding: 0;
  list-style: none;
  color: var(--color-burgundy);
  font-size: 0.9rem;
}

.booking__terms {
  display: flex;
  align-items: flex-start;
  gap: 0.5rem;
  margin: 0 0 1rem;
  font-size: 0.85rem;
  line-height: 1.5;
  color: var(--color-text);
}
.booking__terms input[type="checkbox"] {
  margin-top: 0.15rem;
  flex-shrink: 0;
}
.booking__terms a {
  color: var(--color-burgundy);
  font-weight: 700;
  text-decoration: underline;
  text-underline-offset: 2px;
  transition: color 0.2s ease;
}
.booking__terms a:hover {
  color: var(--color-burgundy-light);
  text-decoration: none;
}

.booking__submit {
  display: inline-block;
  padding: 0.6rem 1.6rem;
  min-height: 40px;
  font-family: var(--font-serif);
  font-size: 0.85rem;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.10em;
  background: var(--color-burgundy);
  color: var(--color-pink);
  border: none;
  border-radius: 4px;
  cursor: pointer;
  transition: background 0.2s ease;
}

.booking__submit:hover { background: var(--color-burgundy-light); }
.booking__submit:disabled { opacity: 0.5; }

.booking__submit.is-loading {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 0.6rem;
}
.booking__submit.is-loading::before {
  content: "";
  width: 0.9em;
  height: 0.9em;
  border: 2px solid currentColor;
  border-right-color: transparent;
  border-radius: 50%;
  animation: booking-submit-spin 0.7s linear infinite;
  flex-shrink: 0;
}
@keyframes booking-submit-spin { to { transform: rotate(360deg); } }

/* Mobile — when the user picks the date-first entry path, slot the canvas
   between the date/time selectors and the contact fields:
     date / party / duration / time  →  canvas  →  contact fields  →  book.
   .booking__form-panel and its <form> become display: contents so their
   children (.booking__form-top, .booking__form-bottom, the submit button)
   collapse into flex children of .booking__layout; four order values then
   interleave the canvas between the datetime and contact blocks.
   Table-first keeps the natural canvas-then-form source order. */
@media (max-width: 1023.98px) {
  [data-booking-form-mode-value="date-first"] .booking__form-panel,
  [data-booking-form-mode-value="date-first"] .booking__form-panel > form {
    display: contents;
  }
  /* .booking__layout is already display:flex; flex-direction:column at the
     mobile base — these order values interleave the canvas between the
     datetime block and the contact block. */
  [data-booking-form-mode-value="date-first"] .booking__form-top    { order: 1; }
  [data-booking-form-mode-value="date-first"] .booking__floors      { order: 2; }
  [data-booking-form-mode-value="date-first"] .booking__form-bottom { order: 3; }
  [data-booking-form-mode-value="date-first"] .booking__terms       { order: 4; }
  [data-booking-form-mode-value="date-first"] .booking__submit      { order: 5; }

  .booking__submit { margin-bottom: 5rem; }
}

/* Desktop — canvas (with floor selector tabs above it) on the left,
   booking form panel on the right. */
@media (min-width: 1024px) {
  .booking__layout {
    flex-direction: row;
    align-items: flex-start;
    gap: 2.5rem;
  }

  .booking__floors { flex: 1.4 1 0; min-width: 0; }

  .booking__form-panel {
    flex: 1 1 0;
    min-width: 320px;
    padding: 0;
    position: sticky;
    top: calc(var(--nav-height) + 1rem);
  }

  .booking__canvas-wrap { display: block; }

  .booking__floor {
    margin: 0 auto;
    min-width: 0;
  }
  .booking__floor + .booking__floor { margin-top: 0; }

  .booking__field {
    margin-bottom: 0.625rem;
    min-width: 0;
  }

  .booking__field input,
  .booking__field select,
  .booking__field textarea {
    min-height: 40px;
    padding: 0.45rem 0.7rem;
  }

  .booking__field textarea {
    min-height: 56px;
  }

  /* Mobile rule pins the date input to 44px; bring it down to 40px here so
     it matches the tighter desktop input height. */
  .booking__field input[type="date"] { height: 40px; }
}

/* Flatpickr is injected into <body>, so target its classes at the top level.
   Visual sibling: the .booking__field select::picker(select) dropdown — same
   pink surface, hairline border, soft shadow, and burgundy selected state.
   The `body` prefix bumps specificity above flatpickr's own rules so we win
   the cascade regardless of which stylesheet's preload completes first. */
body .flatpickr-calendar {
  background: var(--color-pink);
  border: 1px solid var(--color-border);
  border-radius: 4px;
  box-shadow: 0 8px 24px rgb(var(--rgb-black) / 0.12);
  color: var(--color-text);
  font-family: var(--font-sans);
  font-weight: 500;
}

body .flatpickr-calendar.arrowTop::before,
body .flatpickr-calendar.arrowBottom::before { border-bottom-color: var(--color-border); border-top-color: var(--color-border); }
body .flatpickr-calendar.arrowTop::after { border-bottom-color: var(--color-pink); }
body .flatpickr-calendar.arrowBottom::after { border-top-color: var(--color-pink); }

body .flatpickr-months {
  background: var(--color-pink);
  border-top-left-radius: 4px;
  border-top-right-radius: 4px;
}

body .flatpickr-months .flatpickr-month {
  background: var(--color-pink);
  color: var(--color-burgundy);
}

body .flatpickr-current-month,
body .flatpickr-current-month .cur-month,
body .flatpickr-current-month .flatpickr-monthDropdown-months,
body .flatpickr-current-month .numInputWrapper input.cur-year {
  color: var(--color-burgundy);
  font-family: var(--font-serif);
  font-weight: 700;
}

body .flatpickr-current-month .numInputWrapper { color: var(--color-burgundy); }

body .flatpickr-monthDropdown-months .flatpickr-monthDropdown-month {
  background: var(--color-pink);
  color: var(--color-text);
}

body .flatpickr-months .flatpickr-prev-month,
body .flatpickr-months .flatpickr-next-month {
  color: var(--color-burgundy);
  fill: var(--color-burgundy);
}

body .flatpickr-months .flatpickr-prev-month svg,
body .flatpickr-months .flatpickr-next-month svg { fill: var(--color-burgundy); }

body .flatpickr-months .flatpickr-prev-month:hover,
body .flatpickr-months .flatpickr-next-month:hover { color: var(--color-burgundy-light); }

body .flatpickr-months .flatpickr-prev-month:hover svg,
body .flatpickr-months .flatpickr-next-month:hover svg { fill: var(--color-burgundy-light); }

body .flatpickr-weekdays { background: var(--color-pink); }

body .flatpickr-weekdaycontainer { background: var(--color-pink); }

body span.flatpickr-weekday {
  background: var(--color-pink);
  color: var(--color-burgundy);
  font-family: var(--font-serif);
  font-size: 0.8rem;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.05em;
}

body .flatpickr-days,
body .dayContainer { background: var(--color-pink); }

body .flatpickr-day {
  border-radius: 4px;
  color: var(--color-text);
  font-weight: 500;
}

body .flatpickr-day:hover,
body .flatpickr-day:focus {
  background: var(--color-burgundy-light);
  border-color: var(--color-burgundy-light);
  color: var(--color-pink);
}

body .flatpickr-day.today {
  border-color: var(--color-burgundy);
  color: var(--color-burgundy);
  font-weight: 700;
}

body .flatpickr-day.today:hover,
body .flatpickr-day.today:focus {
  background: var(--color-burgundy-light);
  border-color: var(--color-burgundy-light);
  color: var(--color-pink);
}

body .flatpickr-day.selected,
body .flatpickr-day.selected:hover,
body .flatpickr-day.selected:focus,
body .flatpickr-day.startRange,
body .flatpickr-day.endRange,
body .flatpickr-day.selected.startRange,
body .flatpickr-day.selected.endRange {
  background: var(--color-burgundy);
  border-color: var(--color-burgundy);
  color: var(--color-pink);
  font-weight: 700;
}

body .flatpickr-day.flatpickr-disabled,
body .flatpickr-day.flatpickr-disabled:hover,
body .flatpickr-day.flatpickr-disabled:focus,
body .flatpickr-day.notAllowed,
body .flatpickr-day.notAllowed.prevMonthDay,
body .flatpickr-day.notAllowed.nextMonthDay {
  background: transparent;
  border-color: transparent;
  color: rgb(var(--rgb-text) / 0.25);
  cursor: default;
}

body .flatpickr-day.prevMonthDay,
body .flatpickr-day.nextMonthDay { color: rgb(var(--rgb-text) / 0.25); }


/* === booking_show === */
/* Standalone confirmation page at /bookings/:uuid. */
.booking-show {
  position: relative;
  min-height: 100vh;
  padding-block: clamp(2rem, 6vw, 4rem);
  background: var(--color-bg);
  box-sizing: border-box;
}

.booking-show .site-section {
  position: relative;
  z-index: 1;
  background: var(--color-surface);
  border-radius: 8px;
  padding: clamp(2rem, 6vw, 3.5rem) clamp(1.5rem, 5vw, 3rem);
  box-shadow: 0 12px 40px rgb(var(--rgb-black) / 0.05);
}

.booking-show__flash {
  margin: 0 0 1.5rem;
  padding: 0.75rem 1rem;
  border-radius: 4px;
  font-size: 0.95rem;
  line-height: 1.5;
}

.booking-show__flash--notice {
  background: var(--color-pink);
  color: var(--color-burgundy);
  border: 1px solid var(--color-border);
}

.booking-show__flash--alert {
  background: var(--color-burgundy);
  color: var(--color-pink);
}

.booking-show__header {
  display: flex;
  align-items: flex-start;
  justify-content: space-between;
  gap: 1rem;
  margin: 0 0 2rem;
}

.booking-show__header .section-heading {
  margin-bottom: 0;
}

.booking-show__calendar-cta {
  flex-shrink: 0;
}

.booking-show__status-row {
  display: flex;
  flex-direction: column;
  align-items: stretch;
  gap: 1rem;
  margin: 0 0 2rem;
}

.booking-show__status {
  display: flex;
  flex-direction: column;
  justify-content: center;
  gap: 0.4rem;
  flex: 1 1 auto;
  margin: 0;
  padding: 1.25rem 1.5rem;
  border-radius: 4px;
  background: rgb(var(--rgb-white) / 0.45);
  font-family: var(--font-serif);
  color: var(--color-text);
}

.booking-show__status-label {
  font-size: 0.8rem;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.14em;
  color: var(--color-burgundy);
}

.booking-show__status-value {
  font-size: clamp(1.5rem, 5vw, 1.7rem);
  font-weight: 700;
  line-height: 1.1;
  letter-spacing: 0.01em;
  text-align: center;
}

.booking-show__status--approved {
  background: var(--color-burgundy);
  color: var(--color-pink);
}

.booking-show__status--approved .booking-show__status-label { color: rgb(var(--rgb-pink) / 0.7); }

.booking-show__status--cancelled {
  background: transparent;
  border: 1px solid var(--color-text-muted);
  color: var(--color-text-muted);
}

.booking-show__status--cancelled .booking-show__status-label { color: var(--color-text-muted); }

.booking-show__details {
  display: grid;
  grid-template-columns: max-content 1fr;
  gap: 0.85rem 1.5rem;
  margin: 0 0 2rem;
  padding: 1.25rem 1.5rem;
  background: rgb(var(--rgb-white) / 0.45);
  border-radius: 4px;
}

.booking-show__details dt {
  font-family: var(--font-serif);
  font-size: 0.78rem;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.05em;
  color: var(--color-burgundy);
  margin: 0;
  align-self: center;
}

.booking-show__details dd {
  font-family: var(--font-serif);
  font-size: 1rem;
  font-weight: 700;
  color: var(--color-text);
  margin: 0;
  align-self: center;
}

.booking-show__notes,
.booking-show__guest {
  margin: 0 0 2rem;
  padding: 1.25rem 1.5rem;
  background: rgb(var(--rgb-white) / 0.45);
  border-radius: 4px;
}

.booking-show__notes h2 {
  font-family: var(--font-serif);
  font-size: 0.85rem;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.05em;
  color: var(--color-burgundy);
  margin: 0 0 0.6rem;
}

.booking-show__notes p {
  font-size: 0.95rem;
  line-height: 1.7;
  color: var(--color-text);
  margin: 0;
}

.booking-show__guest {
  font-size: 1rem;
  line-height: 1.7;
  color: var(--color-text);
}

.booking-show__guest strong {
  display: block;
  font-family: var(--font-serif);
  font-size: 0.78rem;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.05em;
  color: var(--color-burgundy);
  margin-bottom: 0.5rem;
}

.booking-show__cancel {
  display: inline-flex;
  align-items: center;
  padding: 0.85rem 2rem;
  min-height: 48px;
  font-family: var(--font-serif);
  font-size: 0.85rem;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.10em;
  background: var(--color-burgundy);
  color: var(--color-pink);
  border: none;
  border-radius: 4px;
  cursor: pointer;
  transition: background 0.2s ease;
}

.booking-show__cancel:hover { background: var(--color-burgundy-light); }

.booking-show__add-to-calendar {
  display: inline-flex;
  align-items: center;
  gap: 0.4rem;
  padding: 0.55rem 1rem;
  font-family: var(--font-serif);
  font-size: 0.8rem;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.06em;
  background: rgb(var(--rgb-white) / 0.5);
  color: var(--color-burgundy);
  border: 1px solid var(--color-border);
  border-radius: 999px;
  text-decoration: none;
  transition: background 0.2s ease, color 0.2s ease, border-color 0.2s ease;
}

.booking-show__add-to-calendar:hover {
  background: var(--color-burgundy);
  color: var(--color-pink);
  border-color: var(--color-burgundy);
}

.booking-show__add-to-calendar-icon {
  width: 1.05em;
  height: 1.05em;
  flex-shrink: 0;
}

@media (max-width: 600px) {
  .booking-show__add-to-calendar-label { display: none; }
  .booking-show__add-to-calendar { padding: 0.5rem 0.7rem; gap: 0; }
}

@media (max-width: 600px) {
  .booking-show__details {
    grid-template-columns: 1fr;
    gap: 0.2rem 0;
  }
  .booking-show__details dd {
    margin: 0 0 0.85rem;
  }
  .booking-show__details dd:last-of-type { margin-bottom: 0; }
}


/* === allergens === */
/* Standalone allergens page at /:locale/allergens. */
.allergens {
  position: relative;
  min-height: 100vh;
  padding-block: clamp(2rem, 6vw, 4rem);
  background: var(--color-bg);
  box-sizing: border-box;
}

.allergens .site-section {
  position: relative;
  z-index: 1;
  background: var(--color-surface);
  border-radius: 8px;
  padding: clamp(2rem, 6vw, 3.5rem) clamp(1.5rem, 5vw, 3rem);
  box-shadow: 0 12px 40px rgb(var(--rgb-black) / 0.05);
}

.allergens__intro {
  font-size: 1rem;
  line-height: 1.7;
  color: var(--color-text);
  margin: 0 0 1rem;
}

.allergens__key {
  font-size: 0.8rem;
  color: var(--color-text-muted);
  margin: 0 0 1.25rem;
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 0.4rem;
}

.allergens__key-icon {
  width: 0.9rem;
  height: 0.9rem;
  vertical-align: middle;
}

/* Scroll wrapper. Keeps the table inside the card; provides horizontal pan
   on narrow viewports. */
/* Scroll panel: cap the height so the wrapper itself is the scroll
   container for BOTH axes. This is what lets the sticky column headers
   (top:0) and category band rows (top:var(--thead-h)) actually pin —
   they stick to the top of this box instead of scrolling off the page
   with it. Height = viewport minus the fixed nav and a little breathing
   room. */
.allergens-table-wrapper {
  position: relative;
  overflow: auto;
  max-width: 100%;
  max-height: calc(100vh - var(--nav-height) - 2rem);
}

.allergens-table {
  --thead-h: 7rem;
  border-collapse: separate;
  border-spacing: 0;
  width: max-content;
  min-width: 100%;
  font-family: var(--font-serif);
  color: var(--color-text);
}

/* Column headers */
.allergens-table__corner,
.allergens-table__col-header {
  background: var(--color-surface);
  border-bottom: 2px solid var(--color-burgundy);
  font-weight: 700;
  padding: 0.4rem 0.25rem;
  vertical-align: bottom;
  text-align: center;
  position: sticky;
  top: 0;
  z-index: 2;
}

.allergens-table__col-header {
  height: var(--thead-h);
  min-width: 1.8rem;
  max-width: 2.2rem;
}

.allergens-table__col-num {
  display: block;
  font-size: 0.9rem;
  line-height: 1;
  color: var(--color-burgundy);
}

.allergens-table__col-label {
  display: inline-block;
  writing-mode: vertical-rl;
  transform: rotate(180deg);
  font-size: 0.75rem;
  font-weight: 600;
  letter-spacing: 0.02em;
  line-height: 1;
  text-transform: lowercase;
  color: var(--color-text-muted);
  margin-top: 0.4rem;
  white-space: nowrap;
}

/* Corner cell (top-left) — both top and left sticky. */
.allergens-table__corner {
  left: 0;
  z-index: 3;
}

/* Category band: full-width row, sticky just below the column-header row.
   The header cells are content-box, so their real rendered height is
   --thead-h PLUS their vertical padding (0.4rem top + 0.4rem bottom) and
   2px bottom border. Offsetting by exactly that lands the band on the
   header's bottom edge instead of ~0.9rem too high (which made it drift
   up under the header on scroll). Tracks both breakpoints since only
   --thead-h changes responsively; padding/border are constant. */
.allergens-table__band-row {
  position: sticky;
  top: calc(var(--thead-h) + 0.8rem + 2px);
  z-index: 2;
}

.allergens-table__band {
  background: var(--color-burgundy);
  color: rgb(var(--rgb-white));
  font-family: var(--font-serif);
  font-size: 0.85rem;
  font-weight: 700;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  text-align: left;
  padding: 0;
}

.allergens-table__band-label {
  position: sticky;
  left: 0;
  display: inline-block;
  padding: 0.5rem 0.9rem;
}

.allergens-table__band-menu {
  font-weight: 400;
  opacity: 0.7;
}

.allergens-table__band-sep {
  opacity: 0.7;
}

/* Ingredients sub-row: the cell spans the table, but its content is pinned
   to the left and constrained to the dish-name column width so it does not
   scroll horizontally with the allergen columns. */
.allergens-table__ingredients {
  padding: 0;
  border-bottom: 1px solid rgb(var(--rgb-black) / 0.08);
}

.allergens-table__ingredients-inner {
  position: sticky;
  left: 0;
  display: block;
  box-sizing: border-box;
  min-width: 14rem;
  max-width: 18rem;
  text-align: left;
  font-size: 0.8rem;
  line-height: 1.4;
  color: rgb(var(--rgb-black) / 0.6);
  white-space: normal;
  overflow-wrap: anywhere;
  padding: 0.15rem 0.9rem 0.6rem;
}

.allergens-table__ingredients-label {
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.04em;
  font-size: 0.7rem;
  margin-right: 0.35rem;
}

/* Dish rows */
.allergens-table__dish-row > th,
.allergens-table__dish-row > td {
  border-bottom: 1px solid rgb(var(--rgb-black) / 0.08);
  padding: 0.55rem 0.15rem;
}

.allergens-table__dish-row:hover > td,
.allergens-table__dish-row:hover > th {
  background: rgb(var(--rgb-burgundy) / 0.04);
}

.allergens-table__dish-name {
  position: sticky;
  left: 0;
  z-index: 1;
  background: var(--color-surface);
  text-align: left;
  font-weight: 700;
  font-size: 0.95rem;
  padding-right: 1rem;
  box-shadow: inset -1px 0 0 rgb(var(--rgb-black) / 0.08);
  overflow-wrap: anywhere;
  min-width: 14rem;
  max-width: 18rem;
}

/* Keep the sticky name column opaque on hover — layer the tint over the
   surface instead of replacing it, otherwise the 4%-alpha colour makes the
   column see-through and dots in columns scrolled underneath show through. */
.allergens-table__dish-row:hover > .allergens-table__dish-name {
  background:
    linear-gradient(rgb(var(--rgb-burgundy) / 0.04), rgb(var(--rgb-burgundy) / 0.04)),
    var(--color-surface);
}

.allergens-table__dish-name-text {
  display: inline;
}

.allergens-table__dish-serving {
  font-weight: 400;
  opacity: 0.7;
  margin-left: 0.15em;
}

.allergens-table__dish-name .dish-diet-icons {
  display: inline-flex;
  align-items: center;
  gap: 0.2rem;
  margin-left: 0.4rem;
  vertical-align: middle;
}

.allergens-table__dish-name .dish-diet-icons__icon {
  width: 0.9rem;
  height: 0.9rem;
  display: block;
}

/* Cells */
.allergens-table__cell {
  text-align: center;
  vertical-align: middle;
}

.allergens-table__dot {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 1.1rem;
  height: 1.1rem;
  font-size: 0.95rem;
  line-height: 1;
}

.allergens-table__dot--contains {
  color: var(--color-burgundy);
}

.allergens-table__dot--may {
  color: var(--color-burgundy);
  opacity: 0.65;
}

@media (max-width: 700px) {
  .allergens-table { --thead-h: 6rem; }
  .allergens-table__dish-name {
    min-width: 11rem;
    max-width: 13rem;
    font-size: 0.85rem;
  }
  .allergens-table__col-header { min-width: 1.5rem; max-width: 1.9rem; }
  .allergens-table__col-num    { font-size: 0.8rem; }
  .allergens-table__col-label  { font-size: 0.65rem; margin-top: 0.3rem; }
  .allergens-table__band       { font-size: 0.75rem; }
  .allergens-table__band-label { padding: 0.4rem 0.6rem; }
  .allergens-table__dish-row > th,
  .allergens-table__dish-row > td { padding: 0.45rem 0.1rem; }
  .allergens-table__ingredients-inner {
    min-width: 11rem;
    max-width: 13rem;
    font-size: 0.72rem;
    padding: 0.1rem 0.6rem 0.5rem;
  }
}


/* === privacy_policy === */
/* Standalone privacy policy page at /:locale/privacy_policy.
   Mirrors the allergens page card shell. */
.privacy-policy {
  position: relative;
  min-height: 100vh;
  padding-block: clamp(2rem, 6vw, 4rem);
  background: var(--color-bg);
  box-sizing: border-box;
}

.privacy-policy .site-section {
  position: relative;
  z-index: 1;
  max-width: 60rem;
  margin-inline: auto;
  background: var(--color-surface);
  border-radius: 8px;
  padding: clamp(2rem, 6vw, 3.5rem) clamp(1.5rem, 5vw, 3rem);
  box-shadow: 0 12px 40px rgb(var(--rgb-black) / 0.05);
}

.privacy-policy__paragraph {
  font-size: 1rem;
  line-height: 1.7;
  color: var(--color-text);
  margin: 0 0 1.1rem;
}

.privacy-policy__paragraph:last-child { margin-bottom: 0; }


/* === faq === */
#faq {
  position: relative;
  /* Full-viewport height + pin z-index are instance design (scroll_layout.css). */
  background: var(--color-bg);
  box-shadow: 0 -12px 32px var(--shadow-soft);
}

.faq__list {
  display: flex;
  flex-direction: column;
  gap: 0;
  border-top: 1px solid var(--color-border);
}

details.faq__item {
  border-bottom: 1px solid var(--color-border);
}

details.faq__item summary {
  list-style: none;
  padding: 1.1rem 0;
  font-family: var(--font-serif);
  font-size: 0.95rem;
  font-weight: 700;
  color: var(--color-text);
  cursor: pointer;
  display: flex;
  justify-content: space-between;
  align-items: center;
  gap: 1rem;
  user-select: none;
}

details.faq__item summary::-webkit-details-marker {
  display: none;
}

.faq__icon {
  position: relative;
  flex-shrink: 0;
  width: 1rem;
  height: 1rem;
  color: var(--color-burgundy);
  transition: transform 0.25s ease;
}

.faq__icon::before,
.faq__icon::after {
  content: "";
  position: absolute;
  top: 50%;
  left: 50%;
  background: currentColor;
  border-radius: 1px;
}

.faq__icon::before {
  width: 1rem;
  height: 1.6px;
  transform: translate(-50%, -50%);
}

.faq__icon::after {
  width: 1.6px;
  height: 1rem;
  transform: translate(-50%, -50%);
}

details.faq__item[open] .faq__icon {
  transform: rotate(45deg);
}

details.faq__item .faq__answer {
  overflow: hidden;
  transition: height 0.28s ease;
  padding: 0 0 1.25rem;
  font-size: 0.95rem;
  line-height: 1.7;
  color: var(--color-text-muted);
}

details.faq__item .faq__answer .faq__answer-link {
  color: var(--color-burgundy);
  font-weight: 700;
  letter-spacing: 0.03em;
  text-decoration: underline;
  text-underline-offset: 2px;
}

details.faq__item .faq__answer .faq__answer-link:hover {
  text-decoration: none;
}


/* === contact === */
#contact {
  z-index: 6;
  background: var(--color-burgundy);
  color: var(--color-pink);
  box-shadow: 0 -12px 32px rgb(var(--rgb-black) / 0.15);
}

#contact .section-heading {
  color: var(--color-pink);
}

#contact .section-heading::after {
  background: var(--color-pink);
}

.contact__grid {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 2rem 3rem;
}

@media (max-width: 600px) {
  .contact__grid {
    grid-template-columns: 1fr;
  }
}

.contact__group h3 {
  font-family: var(--font-serif);
  font-size: 0.8rem;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.10em;
  color: rgb(var(--rgb-pink) / 0.55);
  margin: 0 0 0.4rem;
}

.contact__group p,
.contact__group a {
  font-size: 1rem;
  line-height: 1.6;
  color: var(--color-pink);
  text-decoration: none;
  margin: 0;
  display: block;
}

.contact__group a:hover {
  text-decoration: underline;
}

.contact__hours-list {
  list-style: none;
  padding: 0;
  margin: 0;
  font-size: 0.9rem;
  line-height: 1.8;
  color: var(--color-pink);
}

.contact__hours-subheading {
  margin: 0.75rem 0 0;
  font-size: 0.9rem;
  color: var(--color-pink);
}


/* === footer === */
footer {
  position: relative;
  z-index: 10;
  background: var(--color-burgundy);
  border-top: 1px solid rgb(var(--rgb-pink) / 0.12);
  padding: 1.5rem clamp(1rem, 5vw, 3rem);
  text-align: center;
  font-family: var(--font-serif);
  font-size: 0.75rem;
  color: rgb(var(--rgb-pink) / 0.4);
  letter-spacing: 0.05em;
}

.footer__cookies {
  display: block;
  margin-top: 0.4rem;
}

.footer__cookies a {
  color: inherit;
  text-decoration: underline;
  text-underline-offset: 0.15em;
}


/* === popup === */
body.popup-open {
  overflow: hidden;
  touch-action: none;
}

.popup {
  position: fixed;
  inset: 0;
  z-index: 9995;
  display: flex;
  align-items: center;
  justify-content: center;
  padding: clamp(1rem, 4vw, 2rem);
  opacity: 1;
  transition: opacity 0.4s ease;
}

.popup--hidden {
  opacity: 0;
  pointer-events: none;
}

.popup__overlay {
  position: absolute;
  inset: 0;
  background: var(--color-popup-backdrop);
}

.popup__card {
  position: relative;
  z-index: 1;
  background: var(--color-bg);
  border: 1px solid var(--color-border);
  padding: clamp(2.25rem, 5vw, 3rem) clamp(1.75rem, 4vw, 2.75rem) clamp(2rem, 4vw, 2.5rem);
  max-width: 480px;
  width: 100%;
  box-shadow:
    0 1px 0 rgb(var(--rgb-burgundy) / 0.08),
    0 24px 60px -20px rgb(var(--rgb-text) / 0.35),
    0 8px 24px -12px rgb(var(--rgb-burgundy) / 0.18);
  overflow: hidden;
  transform: translateY(0) scale(1);
  transition: transform 0.55s cubic-bezier(0.22, 1, 0.36, 1),
              opacity 0.45s ease;
}

.popup--hidden .popup__card {
  transform: translateY(20px) scale(0.97);
  opacity: 0;
}

.popup__card::after {
  content: "";
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
  height: 3px;
  background: var(--color-burgundy);
  opacity: 0.9;
}

.popup__close {
  position: absolute;
  top: 0.85rem;
  right: 0.85rem;
  width: 2.25rem;
  height: 2.25rem;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  background: transparent;
  border: 1px solid var(--color-border);
  border-radius: 50%;
  cursor: pointer;
  color: var(--color-text-muted);
  padding: 0;
  z-index: 2;
  transition: color 0.2s ease, border-color 0.2s ease, background 0.2s ease, transform 0.25s ease;
}

.popup__close-icon {
  width: 0.9rem;
  height: 0.9rem;
  stroke: currentColor;
  stroke-width: 1.6;
  stroke-linecap: round;
  fill: none;
  display: block;
  overflow: visible;
}

.popup__close:hover {
  color: var(--color-bg);
  background: var(--color-burgundy);
  border-color: var(--color-burgundy);
  transform: rotate(90deg);
}

.popup__close:focus-visible {
  outline: 2px solid var(--color-burgundy);
  outline-offset: 2px;
}

.popup__title {
  position: relative;
  font-family: var(--font-serif);
  font-size: clamp(1.35rem, 3.2vw, 1.75rem);
  font-weight: 700;
  letter-spacing: 0.10em;
  text-transform: uppercase;
  color: var(--color-burgundy);
  margin: 0 0 1.25rem;
  padding-right: 2rem;
}

.popup__title::after { margin-top: 0.75rem; }

.popup__image {
  display: block;
  width: calc(100% + 2 * clamp(1.75rem, 4vw, 2.75rem));
  margin-left: calc(-1 * clamp(1.75rem, 4vw, 2.75rem));
  margin-right: calc(-1 * clamp(1.75rem, 4vw, 2.75rem));
  margin-bottom: 1.25rem;
  max-height: 300px;
  height: auto;
  object-fit: contain;
}

.popup__body {
  position: relative;
  font-family: var(--font-serif);
  font-weight: 400;
  font-size: clamp(0.95rem, 2vw, 1.05rem);
  line-height: 1.7;
  letter-spacing: 0.01em;
  color: var(--color-text-muted);
  margin: 0;
}

@media (prefers-reduced-motion: reduce) {
  .popup,
  .popup__card,
  .popup__close {
    transition: none;
    animation: none;
  }
}


/* === coming_soon === */
.coming-soon-page {
  position: relative;
  height: 100vh;
  height: 100svh;
  overflow: hidden;
  background-color: var(--color-bg);
}

.coming-soon {
  position: relative;
  z-index: 1;
  box-sizing: border-box;
  height: 100vh;
  height: 100svh;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  text-align: center;
  padding: clamp(2rem, 8vw, 5rem) clamp(1rem, 5vw, 3rem);
}

.coming-soon__ninja {
  width: 300px;
  height: 300px;
  margin-bottom: 2rem;
}

.coming-soon__heading {
  font-family: var(--font-serif);
  font-size: clamp(1.3rem, 3vw, 1.7rem);
  font-weight: 700;
  color: var(--color-burgundy);
  letter-spacing: 0.10em;
  text-transform: uppercase;
  margin: 0 0 1rem;
}

.coming-soon__heading::after { margin: 0.6rem auto 0; }

.coming-soon__body {
  font-family: var(--font-serif);
  font-size: clamp(0.9rem, 2vw, 1.1rem);
  line-height: 1.7;
  color: var(--color-text-muted);
  margin: 0;
  max-width: 480px;
}


/* === errors === */
/* Branded error page (404/500). Mirrors the hero's full-bleed pink layout,
   serif typography and burgundy accent rules so the page reads as part of
   the site even when it's the only thing the user ever sees. */

.errors {
  position: relative;
  /* Offset for the fixed minimal nav — the error pages render a bare <nav>
     without the full nav's flow spacer, so reserve its height here. */
  margin-top: var(--nav-height);
  min-height: calc(100vh - var(--nav-height));
  min-height: calc(100svh - var(--nav-height));
  background-color: var(--color-pink);
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  text-align: center;
  padding: calc(var(--section-padding) - 30px) clamp(1rem, 5vw, 3rem) calc(var(--section-padding) + 30px);
  overflow: hidden;
  z-index: 5;
}

/* Cat logo — same opacity/scale pattern as hero__brand-mark, but parked
   behind the numeral so the 404/500 reads as the focal point. */
.errors__brand-mark {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -55%);
  width: clamp(280px, 60vw, 520px);
  height: clamp(280px, 60vw, 520px);
  opacity: 0;
  pointer-events: none;
  z-index: 0;
  animation: errorsBrandFadeIn 1.1s 0.1s ease forwards;
}

@keyframes errorsBrandFadeIn {
  to { opacity: 0.12; }
}

.errors__brand-mark img {
  width: 100%;
  height: 100%;
  display: block;
}

.errors__inner {
  position: relative;
  z-index: 1;
  max-width: 36rem;
  display: flex;
  flex-direction: column;
  align-items: center;
}

/* The big 404/500 numeral — burgundy serif, sized like a poster. */
.errors__mark {
  display: block;
  font-family: var(--font-serif);
  font-size: clamp(6rem, 18vw, 12rem);
  font-weight: 700;
  line-height: 0.9;
  letter-spacing: -0.02em;
  color: var(--color-burgundy);
  margin: 0 0 0.75rem;
  animation: fadeUp 0.9s ease both;
}

/* Heading mirrors .section-heading styling (uppercase, letterspaced, burgundy
   underline) so the page sits inside the visual system. */
.errors__heading {
  font-family: var(--font-serif);
  font-size: clamp(1.1rem, 2.4vw, 1.5rem);
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.10em;
  color: var(--color-burgundy);
  margin: 0 0 1.75rem;
  animation: fadeUp 0.9s 0.15s ease both;
}

.errors__heading::after {
  content: "";
  display: block;
  width: 2.5rem;
  height: 3px;
  background: var(--color-burgundy);
  opacity: 0.45;
  margin: 0.6rem auto 0;
}

.errors__body {
  font-family: var(--font-serif);
  font-size: clamp(1rem, 2vw, 1.15rem);
  line-height: 1.6;
  color: var(--color-text-muted);
  margin: 0 0 2.25rem;
  max-width: 30rem;
  animation: fadeUp 0.9s 0.3s ease both;
}

.errors__cta {
  display: inline-block;
  padding: 0.85rem 1.75rem;
  border: 1px solid var(--color-burgundy);
  border-radius: 999px;
  font-family: var(--font-serif);
  font-size: 0.95rem;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.10em;
  text-decoration: none;
  color: var(--color-burgundy);
  background: transparent;
  transition: background-color 200ms ease, color 200ms ease, transform 200ms ease;
  animation: fadeUp 0.9s 0.45s ease both;
}

.errors__cta:hover,
.errors__cta:focus-visible {
  background: var(--color-burgundy);
  color: var(--color-bg);
  transform: translateY(-1px);
}

.errors__cta:focus-visible {
  outline: 2px solid var(--color-burgundy);
  outline-offset: 3px;
}

/* Tighter spacing for narrow mobile viewports. */
@media (max-width: 480px) {
  .errors {
    padding: var(--section-padding) 1rem;
  }

  .errors__mark {
    margin-bottom: 0.5rem;
  }
}


/* === vendor/locomotive-scroll === */
html.lenis,html.lenis body{height:auto}.lenis:not(.lenis-autoToggle).lenis-stopped{overflow:clip}.lenis [data-lenis-prevent-touch],.lenis [data-lenis-prevent-wheel],.lenis [data-lenis-prevent]{overscroll-behavior:contain}.lenis.lenis-smooth iframe{pointer-events:none}.lenis.lenis-autoToggle{transition-behavior:allow-discrete;transition-duration:1ms;transition-property:overflow}

/* === vendor/flatpickr === */
.flatpickr-calendar{background:transparent;opacity:0;display:none;text-align:center;visibility:hidden;padding:0;-webkit-animation:none;animation:none;direction:ltr;border:0;font-size:14px;line-height:24px;border-radius:5px;position:absolute;width:307.875px;-webkit-box-sizing:border-box;box-sizing:border-box;-ms-touch-action:manipulation;touch-action:manipulation;background:#fff;-webkit-box-shadow:1px 0 0 #e6e6e6,-1px 0 0 #e6e6e6,0 1px 0 #e6e6e6,0 -1px 0 #e6e6e6,0 3px 13px rgba(0,0,0,0.08);box-shadow:1px 0 0 #e6e6e6,-1px 0 0 #e6e6e6,0 1px 0 #e6e6e6,0 -1px 0 #e6e6e6,0 3px 13px rgba(0,0,0,0.08)}.flatpickr-calendar.open,.flatpickr-calendar.inline{opacity:1;max-height:640px;visibility:visible}.flatpickr-calendar.open{display:inline-block;z-index:99999}.flatpickr-calendar.animate.open{-webkit-animation:fpFadeInDown 300ms cubic-bezier(.23,1,.32,1);animation:fpFadeInDown 300ms cubic-bezier(.23,1,.32,1)}.flatpickr-calendar.inline{display:block;position:relative;top:2px}.flatpickr-calendar.static{position:absolute;top:calc(100% + 2px)}.flatpickr-calendar.static.open{z-index:999;display:block}.flatpickr-calendar.multiMonth .flatpickr-days .dayContainer:nth-child(n+1) .flatpickr-day.inRange:nth-child(7n+7){-webkit-box-shadow:none !important;box-shadow:none !important}.flatpickr-calendar.multiMonth .flatpickr-days .dayContainer:nth-child(n+2) .flatpickr-day.inRange:nth-child(7n+1){-webkit-box-shadow:-2px 0 0 #e6e6e6,5px 0 0 #e6e6e6;box-shadow:-2px 0 0 #e6e6e6,5px 0 0 #e6e6e6}.flatpickr-calendar .hasWeeks .dayContainer,.flatpickr-calendar .hasTime .dayContainer{border-bottom:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.flatpickr-calendar .hasWeeks .dayContainer{border-left:0}.flatpickr-calendar.hasTime .flatpickr-time{height:40px;border-top:1px solid #e6e6e6}.flatpickr-calendar.noCalendar.hasTime .flatpickr-time{height:auto}.flatpickr-calendar:before,.flatpickr-calendar:after{position:absolute;display:block;pointer-events:none;border:solid transparent;content:'';height:0;width:0;left:22px}.flatpickr-calendar.rightMost:before,.flatpickr-calendar.arrowRight:before,.flatpickr-calendar.rightMost:after,.flatpickr-calendar.arrowRight:after{left:auto;right:22px}.flatpickr-calendar.arrowCenter:before,.flatpickr-calendar.arrowCenter:after{left:50%;right:50%}.flatpickr-calendar:before{border-width:5px;margin:0 -5px}.flatpickr-calendar:after{border-width:4px;margin:0 -4px}.flatpickr-calendar.arrowTop:before,.flatpickr-calendar.arrowTop:after{bottom:100%}.flatpickr-calendar.arrowTop:before{border-bottom-color:#e6e6e6}.flatpickr-calendar.arrowTop:after{border-bottom-color:#fff}.flatpickr-calendar.arrowBottom:before,.flatpickr-calendar.arrowBottom:after{top:100%}.flatpickr-calendar.arrowBottom:before{border-top-color:#e6e6e6}.flatpickr-calendar.arrowBottom:after{border-top-color:#fff}.flatpickr-calendar:focus{outline:0}.flatpickr-wrapper{position:relative;display:inline-block}.flatpickr-months{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.flatpickr-months .flatpickr-month{background:transparent;color:rgba(0,0,0,0.9);fill:rgba(0,0,0,0.9);height:34px;line-height:1;text-align:center;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;overflow:hidden;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.flatpickr-months .flatpickr-prev-month,.flatpickr-months .flatpickr-next-month{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;text-decoration:none;cursor:pointer;position:absolute;top:0;height:34px;padding:10px;z-index:3;color:rgba(0,0,0,0.9);fill:rgba(0,0,0,0.9)}.flatpickr-months .flatpickr-prev-month.flatpickr-disabled,.flatpickr-months .flatpickr-next-month.flatpickr-disabled{display:none}.flatpickr-months .flatpickr-prev-month i,.flatpickr-months .flatpickr-next-month i{position:relative}.flatpickr-months .flatpickr-prev-month.flatpickr-prev-month,.flatpickr-months .flatpickr-next-month.flatpickr-prev-month{/*
      /*rtl:begin:ignore*/left:0/*
      /*rtl:end:ignore*/}/*
      /*rtl:begin:ignore*/
/*
      /*rtl:end:ignore*/
.flatpickr-months .flatpickr-prev-month.flatpickr-next-month,.flatpickr-months .flatpickr-next-month.flatpickr-next-month{/*
      /*rtl:begin:ignore*/right:0/*
      /*rtl:end:ignore*/}/*
      /*rtl:begin:ignore*/
/*
      /*rtl:end:ignore*/
.flatpickr-months .flatpickr-prev-month:hover,.flatpickr-months .flatpickr-next-month:hover{color:#959ea9}.flatpickr-months .flatpickr-prev-month:hover svg,.flatpickr-months .flatpickr-next-month:hover svg{fill:#f64747}.flatpickr-months .flatpickr-prev-month svg,.flatpickr-months .flatpickr-next-month svg{width:14px;height:14px}.flatpickr-months .flatpickr-prev-month svg path,.flatpickr-months .flatpickr-next-month svg path{-webkit-transition:fill .1s;transition:fill .1s;fill:inherit}.numInputWrapper{position:relative;height:auto}.numInputWrapper input,.numInputWrapper span{display:inline-block}.numInputWrapper input{width:100%}.numInputWrapper input::-ms-clear{display:none}.numInputWrapper input::-webkit-outer-spin-button,.numInputWrapper input::-webkit-inner-spin-button{margin:0;-webkit-appearance:none}.numInputWrapper span{position:absolute;right:0;width:14px;padding:0 4px 0 2px;height:50%;line-height:50%;opacity:0;cursor:pointer;border:1px solid rgba(57,57,57,0.15);-webkit-box-sizing:border-box;box-sizing:border-box}.numInputWrapper span:hover{background:rgba(0,0,0,0.1)}.numInputWrapper span:active{background:rgba(0,0,0,0.2)}.numInputWrapper span:after{display:block;content:"";position:absolute}.numInputWrapper span.arrowUp{top:0;border-bottom:0}.numInputWrapper span.arrowUp:after{border-left:4px solid transparent;border-right:4px solid transparent;border-bottom:4px solid rgba(57,57,57,0.6);top:26%}.numInputWrapper span.arrowDown{top:50%}.numInputWrapper span.arrowDown:after{border-left:4px solid transparent;border-right:4px solid transparent;border-top:4px solid rgba(57,57,57,0.6);top:40%}.numInputWrapper span svg{width:inherit;height:auto}.numInputWrapper span svg path{fill:rgba(0,0,0,0.5)}.numInputWrapper:hover{background:rgba(0,0,0,0.05)}.numInputWrapper:hover span{opacity:1}.flatpickr-current-month{font-size:135%;line-height:inherit;font-weight:300;color:inherit;position:absolute;width:75%;left:12.5%;padding:7.48px 0 0 0;line-height:1;height:34px;display:inline-block;text-align:center;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.flatpickr-current-month span.cur-month{font-family:inherit;font-weight:700;color:inherit;display:inline-block;margin-left:.5ch;padding:0}.flatpickr-current-month span.cur-month:hover{background:rgba(0,0,0,0.05)}.flatpickr-current-month .numInputWrapper{width:6ch;width:7ch\0;display:inline-block}.flatpickr-current-month .numInputWrapper span.arrowUp:after{border-bottom-color:rgba(0,0,0,0.9)}.flatpickr-current-month .numInputWrapper span.arrowDown:after{border-top-color:rgba(0,0,0,0.9)}.flatpickr-current-month input.cur-year{background:transparent;-webkit-box-sizing:border-box;box-sizing:border-box;color:inherit;cursor:text;padding:0 0 0 .5ch;margin:0;display:inline-block;font-size:inherit;font-family:inherit;font-weight:300;line-height:inherit;height:auto;border:0;border-radius:0;vertical-align:initial;-webkit-appearance:textfield;-moz-appearance:textfield;appearance:textfield}.flatpickr-current-month input.cur-year:focus{outline:0}.flatpickr-current-month input.cur-year[disabled],.flatpickr-current-month input.cur-year[disabled]:hover{font-size:100%;color:rgba(0,0,0,0.5);background:transparent;pointer-events:none}.flatpickr-current-month .flatpickr-monthDropdown-months{appearance:menulist;background:transparent;border:none;border-radius:0;box-sizing:border-box;color:inherit;cursor:pointer;font-size:inherit;font-family:inherit;font-weight:300;height:auto;line-height:inherit;margin:-1px 0 0 0;outline:none;padding:0 0 0 .5ch;position:relative;vertical-align:initial;-webkit-box-sizing:border-box;-webkit-appearance:menulist;-moz-appearance:menulist;width:auto}.flatpickr-current-month .flatpickr-monthDropdown-months:focus,.flatpickr-current-month .flatpickr-monthDropdown-months:active{outline:none}.flatpickr-current-month .flatpickr-monthDropdown-months:hover{background:rgba(0,0,0,0.05)}.flatpickr-current-month .flatpickr-monthDropdown-months .flatpickr-monthDropdown-month{background-color:transparent;outline:none;padding:0}.flatpickr-weekdays{background:transparent;text-align:center;overflow:hidden;width:100%;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;height:28px}.flatpickr-weekdays .flatpickr-weekdaycontainer{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}span.flatpickr-weekday{cursor:default;font-size:90%;background:transparent;color:rgba(0,0,0,0.54);line-height:1;margin:0;text-align:center;display:block;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;font-weight:bolder}.dayContainer,.flatpickr-weeks{padding:1px 0 0 0}.flatpickr-days{position:relative;overflow:hidden;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:start;-webkit-align-items:flex-start;-ms-flex-align:start;align-items:flex-start;width:307.875px}.flatpickr-days:focus{outline:0}.dayContainer{padding:0;outline:0;text-align:left;width:307.875px;min-width:307.875px;max-width:307.875px;-webkit-box-sizing:border-box;box-sizing:border-box;display:inline-block;display:-ms-flexbox;display:-webkit-box;display:-webkit-flex;display:flex;-webkit-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-wrap:wrap;-ms-flex-pack:justify;-webkit-justify-content:space-around;justify-content:space-around;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);opacity:1}.dayContainer + .dayContainer{-webkit-box-shadow:-1px 0 0 #e6e6e6;box-shadow:-1px 0 0 #e6e6e6}.flatpickr-day{background:none;border:1px solid transparent;border-radius:150px;-webkit-box-sizing:border-box;box-sizing:border-box;color:#393939;cursor:pointer;font-weight:400;width:14.2857143%;-webkit-flex-basis:14.2857143%;-ms-flex-preferred-size:14.2857143%;flex-basis:14.2857143%;max-width:39px;height:39px;line-height:39px;margin:0;display:inline-block;position:relative;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;text-align:center}.flatpickr-day.inRange,.flatpickr-day.prevMonthDay.inRange,.flatpickr-day.nextMonthDay.inRange,.flatpickr-day.today.inRange,.flatpickr-day.prevMonthDay.today.inRange,.flatpickr-day.nextMonthDay.today.inRange,.flatpickr-day:hover,.flatpickr-day.prevMonthDay:hover,.flatpickr-day.nextMonthDay:hover,.flatpickr-day:focus,.flatpickr-day.prevMonthDay:focus,.flatpickr-day.nextMonthDay:focus{cursor:pointer;outline:0;background:#e6e6e6;border-color:#e6e6e6}.flatpickr-day.today{border-color:#959ea9}.flatpickr-day.today:hover,.flatpickr-day.today:focus{border-color:#959ea9;background:#959ea9;color:#fff}.flatpickr-day.selected,.flatpickr-day.startRange,.flatpickr-day.endRange,.flatpickr-day.selected.inRange,.flatpickr-day.startRange.inRange,.flatpickr-day.endRange.inRange,.flatpickr-day.selected:focus,.flatpickr-day.startRange:focus,.flatpickr-day.endRange:focus,.flatpickr-day.selected:hover,.flatpickr-day.startRange:hover,.flatpickr-day.endRange:hover,.flatpickr-day.selected.prevMonthDay,.flatpickr-day.startRange.prevMonthDay,.flatpickr-day.endRange.prevMonthDay,.flatpickr-day.selected.nextMonthDay,.flatpickr-day.startRange.nextMonthDay,.flatpickr-day.endRange.nextMonthDay{background:#569ff7;-webkit-box-shadow:none;box-shadow:none;color:#fff;border-color:#569ff7}.flatpickr-day.selected.startRange,.flatpickr-day.startRange.startRange,.flatpickr-day.endRange.startRange{border-radius:50px 0 0 50px}.flatpickr-day.selected.endRange,.flatpickr-day.startRange.endRange,.flatpickr-day.endRange.endRange{border-radius:0 50px 50px 0}.flatpickr-day.selected.startRange + .endRange:not(:nth-child(7n+1)),.flatpickr-day.startRange.startRange + .endRange:not(:nth-child(7n+1)),.flatpickr-day.endRange.startRange + .endRange:not(:nth-child(7n+1)){-webkit-box-shadow:-10px 0 0 #569ff7;box-shadow:-10px 0 0 #569ff7}.flatpickr-day.selected.startRange.endRange,.flatpickr-day.startRange.startRange.endRange,.flatpickr-day.endRange.startRange.endRange{border-radius:50px}.flatpickr-day.inRange{border-radius:0;-webkit-box-shadow:-5px 0 0 #e6e6e6,5px 0 0 #e6e6e6;box-shadow:-5px 0 0 #e6e6e6,5px 0 0 #e6e6e6}.flatpickr-day.flatpickr-disabled,.flatpickr-day.flatpickr-disabled:hover,.flatpickr-day.prevMonthDay,.flatpickr-day.nextMonthDay,.flatpickr-day.notAllowed,.flatpickr-day.notAllowed.prevMonthDay,.flatpickr-day.notAllowed.nextMonthDay{color:rgba(57,57,57,0.3);background:transparent;border-color:transparent;cursor:default}.flatpickr-day.flatpickr-disabled,.flatpickr-day.flatpickr-disabled:hover{cursor:not-allowed;color:rgba(57,57,57,0.1)}.flatpickr-day.week.selected{border-radius:0;-webkit-box-shadow:-5px 0 0 #569ff7,5px 0 0 #569ff7;box-shadow:-5px 0 0 #569ff7,5px 0 0 #569ff7}.flatpickr-day.hidden{visibility:hidden}.rangeMode .flatpickr-day{margin-top:1px}.flatpickr-weekwrapper{float:left}.flatpickr-weekwrapper .flatpickr-weeks{padding:0 12px;-webkit-box-shadow:1px 0 0 #e6e6e6;box-shadow:1px 0 0 #e6e6e6}.flatpickr-weekwrapper .flatpickr-weekday{float:none;width:100%;line-height:28px}.flatpickr-weekwrapper span.flatpickr-day,.flatpickr-weekwrapper span.flatpickr-day:hover{display:block;width:100%;max-width:none;color:rgba(57,57,57,0.3);background:transparent;cursor:default;border:none}.flatpickr-innerContainer{display:block;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-sizing:border-box;box-sizing:border-box;overflow:hidden}.flatpickr-rContainer{display:inline-block;padding:0;-webkit-box-sizing:border-box;box-sizing:border-box}.flatpickr-time{text-align:center;outline:0;display:block;height:0;line-height:40px;max-height:40px;-webkit-box-sizing:border-box;box-sizing:border-box;overflow:hidden;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.flatpickr-time:after{content:"";display:table;clear:both}.flatpickr-time .numInputWrapper{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;width:40%;height:40px;float:left}.flatpickr-time .numInputWrapper span.arrowUp:after{border-bottom-color:#393939}.flatpickr-time .numInputWrapper span.arrowDown:after{border-top-color:#393939}.flatpickr-time.hasSeconds .numInputWrapper{width:26%}.flatpickr-time.time24hr .numInputWrapper{width:49%}.flatpickr-time input{background:transparent;-webkit-box-shadow:none;box-shadow:none;border:0;border-radius:0;text-align:center;margin:0;padding:0;height:inherit;line-height:inherit;color:#393939;font-size:14px;position:relative;-webkit-box-sizing:border-box;box-sizing:border-box;-webkit-appearance:textfield;-moz-appearance:textfield;appearance:textfield}.flatpickr-time input.flatpickr-hour{font-weight:bold}.flatpickr-time input.flatpickr-minute,.flatpickr-time input.flatpickr-second{font-weight:400}.flatpickr-time input:focus{outline:0;border:0}.flatpickr-time .flatpickr-time-separator,.flatpickr-time .flatpickr-am-pm{height:inherit;float:left;line-height:inherit;color:#393939;font-weight:bold;width:2%;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-align-self:center;-ms-flex-item-align:center;align-self:center}.flatpickr-time .flatpickr-am-pm{outline:0;width:18%;cursor:pointer;text-align:center;font-weight:400}.flatpickr-time input:hover,.flatpickr-time .flatpickr-am-pm:hover,.flatpickr-time input:focus,.flatpickr-time .flatpickr-am-pm:focus{background:#eee}.flatpickr-input[readonly]{cursor:pointer}@-webkit-keyframes fpFadeInDown{from{opacity:0;-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0)}to{opacity:1;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}@keyframes fpFadeInDown{from{opacity:0;-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0)}to{opacity:1;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}

/* === wallpaper_overlay === */
/* Six host elements (#site-nav, .nav__drawer, .booking-show, #faq,
   .coming-soon-page, .popup__card) all paint the same /wallpaper.svg
   pseudo-element. The host already has its own positioning context
   (fixed | relative); we only need the ::before to fill it. Variants
   cover the small differences in repeat / size / position / opacity. */
.wallpaper-overlay::before {
  content: "";
  position: absolute;
  inset: 0;
  background: url("/brand/wallpaper.svg") repeat;
  opacity: 0.075;
  pointer-events: none;
  z-index: 0;
}

.wallpaper-overlay--cover::before {
  background-repeat: no-repeat;
  background-position: center;
  background-size: cover;
}

.wallpaper-overlay--150::before { background-size: 150%; }

.wallpaper-overlay--fixed::before { position: fixed; }

.wallpaper-overlay--soft::before { opacity: 0.06; }


/* === scroll_reveal === */
/* Driven by Locomotive Scroll's `is-inview` class. */
[data-scroll] {
  opacity: 0;
  transform: translateY(28px);
  transition: opacity 0.65s ease, transform 0.65s ease;
}

[data-scroll].is-inview {
  opacity: 1;
  transform: translateY(0);
}

/* Hero elements use CSS keyframe animations, not scroll-reveal. */
#hero[data-scroll],
#hero [data-scroll] {
  opacity: unset;
  transform: unset;
  transition: none;
}


/* === scroll_layout === */
/* Pinned sticky-section stack + Locomotive `is-inview` reveals. Instance-only:
   with no instance (core), sections flow normally under native scroll and the
   heading underline shows at full width. These rules pin each section to the
   viewport so the next scrolls over it — the UKOI "stacked panels" feel. */

#hero {
  position: sticky;
  top: 0;
  z-index: 1;
  will-change: transform;
  min-height: calc(100vh - var(--nav-height));
  min-height: calc(100svh - var(--nav-height));
}

/* #menu is display:contents so the sticky static-menu child pins against <body>. */
#menu { display: contents; }

.menu-section--static {
  position: sticky;
  top: 0;
  height: 100vh;
  height: 100svh;
  overflow: hidden;
  z-index: 2;
  display: flex;
  align-items: center;
  justify-content: center;
}

#reservations {
  min-height: 100vh;
  min-height: 100svh;
  z-index: 3;
}

#faq {
  min-height: 100vh;
  min-height: 100svh;
  z-index: 5;
}

/* Section-heading underline animates in via Locomotive's .is-inview. Core keeps
   the full-width underline from section_shared.css (no reveal). */
.section-heading::after { width: 0; margin-top: 0.6rem; transition: width 0.6s 0.3s ease; }
.section-heading.is-inview::after { width: 2.5rem; }


/* === menu_canvas === */
/* WebGL canvas (scoped, not full-page). */
#glcanvas {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  z-index: 1;
  cursor: grab;
  display: block;
  touch-action: pan-y; /* overridden to none by JS when cloth is grabbed */
}

#glcanvas:active {
  cursor: grabbing;
}

/* menu-section contains the canvas */
.menu-section {
  position: sticky;
  top: 0;
  z-index: 2;
  will-change: transform;
  height: 100vh;
  height: 100svh;
  overflow: hidden;
  touch-action: pan-y;   /* allow vertical scroll; JS locks to none when cloth is grabbed */
  box-shadow: 0 -12px 32px var(--shadow-soft);
}

.menu-section__inner {
  position: relative;
  width: 100%;
  height: 100%;
}

#indicator {
  position: absolute;
  width: 32px;
  height: 32px;
  background: var(--shadow-soft);
  border: 2px solid rgb(var(--rgb-black) / 0.25);
  border-radius: 50%;
  transform: translate(-50%, -50%);
  pointer-events: none;
  display: none;
  z-index: 10;
}

/* Category arrows. */
.menu__arrow {
  position: absolute;
  /* Aligned with the category title's first row, painted near the top of the
     cloth texture. The title sits ~15-17% of viewport height depending on the
     panel's texture height (camera/FOV fixed); 16% is the tuned midpoint.
     texture.js reserves horizontal space on the first title row so the name
     wraps clear of these arrows instead of overlapping them. */
  top: 16%;
  transform: translateY(-50%);
  z-index: 3;
  width: 44px;
  height: 44px;
  display: flex;
  align-items: center;
  justify-content: center;
  background: rgb(var(--rgb-bg) / 0.75);
  border: 1px solid var(--color-border);
  border-radius: 50%;
  color: var(--color-burgundy);
  cursor: pointer;
  backdrop-filter: blur(4px);
  transition: opacity 0.2s, background 0.2s;
}

.menu__arrow svg {
  width: 20px;
  height: 20px;
}

.menu__arrow--prev {
  left: 16px;
}

.menu__arrow--next {
  right: 16px;
}

.menu__arrow:hover:not(:disabled) {
  background: rgb(var(--rgb-pink) / 0.95);
}

.menu__arrow:disabled {
  opacity: 0.25;
  cursor: default;
}


/* === media_routing === */
/* Both menu sections are always in the DOM. CSS pointer media queries
   decide which to show. pointer:coarse = touch screen (phones, tablets —
   including modern iPads that report a desktop UA). pointer:fine =
   mouse/trackpad. JS in menu_controller also guards WebGL init behind
   the same check. */
@media not (pointer: coarse) {
  .menu-section:not(.menu-section--static) { display: none; }
}
@media (pointer: coarse) {
  .menu-section--static { display: none; }
}

