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

/* Page-level scroll behavior:
   - scroll-behavior: smooth → side-menu / category anchor links animate
     smoothly. NOTE: Chromium silently ignores programmatic
     scroll-behavior:'smooth' arguments (scrollIntoView, scrollTo) when
     scroll-behavior isn't set in CSS — so this line is load-bearing
     for the JS-driven category scrolling, don't remove.
   (scroll-snap was removed — it pulled the user back to #page3 when
    they tried to interact with the footer; smooth scroll alone is fine.) */
html {
    scroll-behavior: smooth;
    background: var(--color-bg);
}

:root {
    /* Brand palette pulled from Lola's reference assets:
       - WhatsApp aesthetic shot (dark backdrop, burgundy bamboo, cream leaves)
       - Wang Yuan logo (deep red 1984 badge, forest-green bamboo, panda)
       - Foo dog statues (bronze tones with red-mouth detail)             */
    --color-bg: #0F0A0A;        /* deep warm black — page background      */
    --color-text: #C9A876;      /* warm cream / parchment — body text      */
    --color-accent: #B82A2A;    /* signature deep red — buttons, highlights*/
    --color-bronze: #8B6F47;    /* bronze gold — secondary accents         */
    --color-bamboo: #2C5530;    /* logo bamboo green — occasional touch    */

    --font-body: system-ui, -apple-system, sans-serif;
    --font-heading: system-ui, -apple-system, sans-serif;

    --space-1: 0.5rem;
    --space-2: 1rem;
    --space-3: 2rem;
    --space-4: 4rem;
    --max-width: 1200px;

    /* Scroll-progress for the welcome / parchment reveal.
       Lives at :root so EVERY element can read it via inheritance —
       body::before (dim layer) and #page2's contents both consume it.
       main.js updates this inline on <html> at runtime; this declaration
       is the pre-JS fallback. Do NOT re-declare on #page2 — that would
       shadow the root value and freeze the welcome card at progress 0. */
    --welcome-progress: 0;
}

body {
    font-family: var(--font-body);
    color: var(--color-text);
    background: transparent;
    line-height: 1.5;
    -webkit-font-smoothing: antialiased;
    position: relative;

    /* Disable text selection site-wide so accidental drags on the hero,
       welcome plate, buttons and menu items don't flash the blue selection
       overlay. Re-enabled below on the footer (so the owner / guests can
       copy the address or phone numbers) and on form fields. */
    user-select: none;
    -webkit-user-select: none;
    -webkit-tap-highlight-color: transparent;
}

/* Bring text selection back where it actually makes sense. */
footer,
footer *,
input,
textarea,
[contenteditable] {
    user-select: text;
    -webkit-user-select: text;
}

.site-bg-video {
    position: fixed;
    inset: 0;
    width: 100%;
    height: 100%;
    object-fit: cover;
    z-index: 0;
    pointer-events: none;
    filter: brightness(0.72) saturate(1.08);
    opacity: 0;
    transition: opacity 180ms ease;
}

.site-bg-video.is-active {
    opacity: 1;
}

/* Site-wide dim layer sitting between the bg video and page content.
   Opacity ramps 0.42 → 0.92 as --welcome-progress (set on <html> by
   main.js) climbs 0 → 1 — i.e. dark steadily intensifies during the
   scroll from page 1 into page 2, holds at full strength through page 2
   and the signatures section, and symmetrically eases back when the
   user scrolls up to page 1. Tweak the base/scale below to retune. */
body::before {
    content: "";
    position: fixed;
    inset: 0;
    z-index: 1;
    pointer-events: none;
    background: rgba(0, 0, 0, calc(0.42 + 0.50 * var(--welcome-progress, 0)));
}

body > :not(.site-bg-video):not(.side-menu):not(.side-menu-backdrop):not(.r-modal) {
    position: relative;
    z-index: 2;
}

img {
    max-width: 100%;
    display: block;
}

a {
    color: inherit;
    text-decoration: none;
}

button {
    font: inherit;
    cursor: pointer;
    border: none;
    background: none;
}

/* ============================================
   Page wrapper
   Single-viewport "sheet" — wraps everything and constrains
   it to 100vh. Children are stacked vertically and share the
   available height via flex (see .hero / .reserve-section).
   ============================================ */
.page {
    min-height: 100vh;             /* fills viewport, can grow if content needs it */
    display: flex;
    flex-direction: column;

    /* These three lines turn .page into a positioning + stacking
       context for the absolutely-positioned background <video> inside.
       - position: relative  → child position:absolute is relative to THIS box
       - isolation: isolate  → keeps z-index: -1 children inside .page
                               instead of slipping behind the body
       - overflow: hidden    → clips any video bleed past the wrapper edges */
    position: relative;
    isolation: isolate;
    overflow: hidden;

    /* For STRICT one-screen-only behavior (no scroll), change
       min-height above to:  height: 100vh;
       Trade-off: content gets cut off on small screens. */
}

/* ============================================
   Navbar
   A flex row: logo pushed left, actions pushed right.
   ============================================ */
.navbar {
    position: relative;              /* anchor for absolutely-positioned children */
    display: flex;
    align-items: center;             /* vertically centers the logo */
    padding: var(--space-2) var(--space-3);  /* 1rem top/bottom, 2rem left/right */

    /* If you want it to stick to the top while scrolling, uncomment these:
       position: sticky;     (replaces position: relative above)
       top: 0;
       z-index: 100;
       background: var(--color-bg);
    */
}

/* Logo: control size with height; width: auto preserves aspect ratio */
.navbar-logo img {
    height: 200px;
    width: auto;
}

/* Right-side group — pulled OUT of the navbar's flex flow with
   position: absolute, so you can move it freely.

   HOW TO MOVE THE WHOLE GROUP (desktop):
     - right:  distance from right edge (bigger value = moves it LEFT)
     - top:    vertical position (smaller % = higher, bigger % = lower)
     - The transform: translateY(-50%) is what makes top: 50% mean
       "perfectly vertically centered." If you switch to a fixed value
       like top: 20px, REMOVE or change the transform line, otherwise
       the group will jump above the navbar by half its own height.

   You can also swap right→left, or top→bottom, to anchor from the
   opposite edge. Mobile rules will live in an @media query — later. */
.navbar-actions {
    position: absolute;
    top: 40%;
    right: var(--space-3);
    transform: translateY(-50%);

    display: flex;
    align-items: center;
    gap: var(--space-1);   /* 0.5rem between each button */
}

/* Circle language buttons.
   Equal width and height + border-radius: 50% = a circle. */
.lang-btn {
    width: 80px;
    height: 80px;
    border-radius: 50%;
    border: 2px solid var(--color-text);
    background: transparent;
    font-size: 1.5rem;
    font-weight: 600;
    color: white;
    /* inline-flex centers the label inside the circle */
    display: inline-flex;
    align-items: center;
    justify-content: center;

    transition: background 0.15s, color 0.15s;
}

.lang-btn:hover,
.lang-btn.is-active {
    background: var(--color-text);
    color: var(--color-bg);
}

/* Hamburger: a square containing three horizontal bars.
   The three <span>s are the bars, stacked with flex-direction: column. */
.menu-toggle {
    width: 80px;
    height: 80px;
    display: flex;
    flex-direction: column;
    justify-content: center;
    gap: 12px;        /* space between the bars */
    padding: 8px;    /* breathing room so bars don't touch the edges */
}

/* Each bar is a thin horizontal strip */
.menu-toggle span {
    display: block;
    width: 100%;
    height: 5px;
    background: var(--color-text);
    border-radius: 2px;
}

/* ============================================
   Hero
   Centered restaurant name + tagline, fills the
   viewport below the navbar.
   ============================================ */
.hero {
    /* flex: 1 — grow to fill available vertical space inside .page,
       sharing the leftover height with .reserve-section.
       Increase to flex: 2 (or 3) to make hero proportionally bigger. */
    flex: 1;

    /* Centering trick: make the hero a flex column,
       then push children to the cross- and main-axis centers. */
    display: flex;
    flex-direction: column;
    justify-content: center;   /* vertical centering   */
    align-items: center;       /* horizontal centering */

    text-align: center;
    padding: var(--space-3);
    transform: translateY(-3vh);
    position: relative;
    z-index: 0;
}

.hero::before {
    content: "";
    position: absolute;
    left: 50%;
    top: 50%;
    width: min(1200px, 120vw);
    height: 520px;
    transform: translate(-50%, -50%);
    z-index: -1;
    pointer-events: none;
    filter: blur(26px);
    background: radial-gradient(
        ellipse at center,
        rgba(15, 10, 10, 0.64) 0%,
        rgba(15, 10, 10, 0.40) 32%,
        rgba(15, 10, 10, 0.12) 58%,
        rgba(15, 10, 10, 0) 100%
    );
}

.hero-title {
    /* clamp(MIN, PREFERRED, MAX) — responsive font size.
       It picks the PREFERRED value (here 6vw = 6% of viewport width)
       but never goes below MIN or above MAX. So on small screens
       the heading shrinks to 2.5rem, on huge screens it caps at 5rem. */
    font-size: clamp(2.5rem, 6vw, 5rem);
    font-family: Georgia, 'Times New Roman', serif;
    font-weight: 900;
    letter-spacing: 0.045em;
    text-shadow:
        0 2px 0 rgba(139, 111, 71, 0.34),
        0 14px 34px rgba(15, 10, 10, 0.58);
    margin-bottom: var(--space-2);   /* breathing room above the tagline */
}

.hero-tagline {
    /* <small> is inline by default — switch to block so it sits
       on its own line beneath the h1, not next to it. */
    display: block;

    font-size: 0.9rem;
    letter-spacing: 0.25em;          /* wide spacing reads as elegant/formal */
    text-transform: uppercase;
    opacity: 0.75;                   /* dim slightly so it reads as "subtitle" */
}

/* ============================================
   Reserve section
   Full-width section below the hero with a single CTA button
   centered both horizontally and vertically.
   ============================================ */
.reserve-section {
    /* flex: 1 — share leftover space equally with the hero.
       Tweak this number to change relative size:
         flex: 1   → equal height to hero
         flex: 2   → twice the hero's height
         flex: 0   → only as tall as the button + padding
       Or replace with min-height: 30vh (etc.) for a fixed size. */
    flex: 1;

    /* Flex centers the button on both axes */
    display: flex;
    justify-content: center;
    align-items: center;

    padding: var(--space-3);
}

.reserve-btn {
    /* SIZE — tweak these freely: */
    padding: 16px 64px;        /* top/bottom 16px, left/right 64px */
    font-size: 28px;           /* text inside the button */
    letter-spacing: 4px;       /* space between letters */
    position: relative;
    isolation: isolate;
    

    /* Or, instead of letting padding decide the size, pin fixed dims:
         width: 250px;
         height: 60px;
       (and delete the padding line above) */

    /* Stained-glass surface: translucent, blurred, and reflective so the
       parallax image reads through the button instead of a flat fill. */
    background:
        linear-gradient(135deg,
            rgba(255, 244, 218, 0.30) 0%,
            rgba(201, 168, 118, 0.18) 32%,
            rgba(184, 42, 42, 0.16) 64%,
            rgba(255, 244, 218, 0.22) 100%);
    color: #fff4da;
    border: 1px solid rgba(255, 244, 218, 0.46);
    box-shadow:
        inset 0 1px 0 rgba(255, 255, 255, 0.34),
        inset 0 -28px 42px rgba(15, 10, 10, 0.22),
        0 16px 42px rgba(0, 0, 0, 0.30),
        0 0 34px rgba(201, 168, 118, 0.14);
    backdrop-filter: blur(18px) saturate(1.24);
    -webkit-backdrop-filter: blur(18px) saturate(1.24);
    text-shadow: 0 1px 18px rgba(15, 10, 10, 0.58);

    border-radius: 1px;        /* slight rounding for the stained-glass surface */
    font-weight: 600;

    transition: border-color 0.2s, box-shadow 0.2s, color 0.2s, transform 0.2s;
}

.reserve-btn::before {
    content: "";
    position: absolute;
    inset: 0;
    z-index: -1;
    pointer-events: none;
    background:
        radial-gradient(circle at 18% 12%, rgba(255, 255, 255, 0.48), transparent 24%),
        radial-gradient(circle at 82% 88%, rgba(184, 42, 42, 0.24), transparent 30%),
        linear-gradient(100deg, transparent 0%, rgba(255, 255, 255, 0.18) 42%, transparent 58%);
    opacity: 0.74;
}

.reserve-btn:hover {
    color: #fff8e8;
    border-color: rgba(255, 244, 218, 0.72);
    box-shadow:
        inset 0 1px 0 rgba(255, 255, 255, 0.46),
        inset 0 -28px 42px rgba(15, 10, 10, 0.18),
        0 18px 50px rgba(0, 0, 0, 0.34),
        0 0 42px rgba(201, 168, 118, 0.22);
}

#page1{

}

/* ============================================
   Footer page (#page4)
   Centered text block on a flex container.
   ============================================ */

/* HEIGHT       — change `min-height` to make footer taller/shorter
                  (30vh = 30% of viewport height; try 20vh / 40vh / 200px)
   PADDING      — change `padding` for inner space around the text
   ALIGN/JUSTIFY — center the text block both axes; safe to leave alone */
#page4 {
    min-height: 30vh;
    display: flex;
    align-items: center;
    justify-content: center;
    padding: var(--space-3);
    text-align: center;
    background: var(--color-bg);
}

/* WIDTH CAP — keeps text from stretching across huge screens.
   Increase 600px for a wider block, remove the line for full width. */
.footer-text {
    max-width: 600px;
}

/* "Kontakt:" label — font-size and letter-spacing are the main knobs */
.footer-label {
    margin-bottom: 0.4rem;
    font-size: 0.85rem;
    letter-spacing: 0.18em;
    text-transform: uppercase;
    opacity: 0.7;
}

/* Each contact line — `margin` controls gap between lines,
   `font-size` controls text size. */
.footer-line {
    margin: 0.3rem 0;
    font-size: 0.95rem;
    line-height: 1.5;
}

/* Phone numbers — bronze accent. tel: links are tap-to-call on mobile,
   browser-handled on desktop (we leave defaults alone). */
.footer-phone a {
    color: var(--color-bronze);
    text-decoration: none;
}

/* Small developer credit at the very bottom of the footer. Subtle so it
   doesn't compete with the restaurant contact info; underline-on-hover
   so it still reads as a link. */
.footer-credit {
    margin: 1.6rem 0 0;
    font-size: 0.7rem;
    letter-spacing: 0.06em;
    color: rgba(201, 168, 118, 0.45);
    line-height: 1.4;
}
.footer-credit a {
    color: inherit;
    text-decoration: none;
    border-bottom: 1px dotted rgba(201, 168, 118, 0.35);
    transition: color 180ms ease, border-color 180ms ease;
}
.footer-credit a:hover,
.footer-credit a:focus-visible {
    color: var(--color-text);
    border-bottom-color: var(--color-text);
}

/* Address line — the whole text + Google Maps pin is one link.
   It pulses slowly (a barely-perceptible scale breathing motion)
   with a soft golden shimmer behind it to draw the eye without
   feeling like an ad. Clicking opens the address in Google Maps. */
.footer-address {
    /* Block so the link can be its own inline-flex row with shimmer.
       (display:inline-flex on the <p> would clip the ::before glow.) */
    display: block;
    position: relative;
    overflow: visible;
}

.footer-address-link {
    display: inline-flex;
    align-items: center;
    gap: 0.5em;
    color: inherit;
    text-decoration: none;
    position: relative;
    transform-origin: 50% 50%;
    animation: footer-address-pulse 4.2s ease-in-out infinite;
    transition: filter 200ms ease;
    isolation: isolate;          /* keep ::before behind the text inside */
}

/* Barely-visible warm shimmer behind the text. Sits in z-index:-1 of
   the link's own stacking context (created by isolation:isolate). */
.footer-address-link::before {
    content: "";
    position: absolute;
    inset: -0.45em -0.9em;
    z-index: -1;
    border-radius: 999px;
    background: radial-gradient(ellipse at center,
                  rgba(197, 160, 68, 0.22),
                  rgba(197, 160, 68, 0.08) 55%,
                  transparent 75%);
    opacity: 0;
    filter: blur(3px);
    pointer-events: none;
    animation: footer-address-shimmer 4.2s ease-in-out infinite;
}

.footer-address-link:hover,
.footer-address-link:focus-visible {
    filter: brightness(1.15) drop-shadow(0 1px 4px rgba(234, 67, 53, 0.35));
}

.footer-address-pin {
    flex: 0 0 auto;
    line-height: 0;
}

/* Pulse: slow, gentle scale from 1.000 → 1.025 → 1.000.
   2.5% scale is just enough to read as "breathing", not as a glitch. */
@keyframes footer-address-pulse {
    0%, 100% { transform: scale(1); }
    50%      { transform: scale(1.025); }
}

/* Shimmer: faint golden glow that fades in/out in sync with the
   pulse. Max opacity 0.55 of a 0.22-alpha gradient = barely visible. */
@keyframes footer-address-shimmer {
    0%, 100% { opacity: 0; }
    50%      { opacity: 0.55; }
}

/* Respect reduced-motion users — drop the animations entirely. */
@media (prefers-reduced-motion: reduce) {
    .footer-address-link,
    .footer-address-link::before {
        animation: none;
    }
}

/* ============================================
   Side menu (hamburger panel)
   Slides in from the right when .menu-toggle is clicked.
   The "open" state is just the .is-open class on three elements:
     .menu-toggle      → bars animate into an X
     .side-menu        → panel slides into view
     .side-menu-backdrop → backdrop fades in
   See js/main.js for the toggle logic.
   ============================================ */

/* HAMBURGER ANIMATION — bars become an X when the toggle has .is-open.
   Numbers (11px translate) are HALF the gap+bar height of the toggle
   button, so the top and bottom bars meet in the center. */
.menu-toggle span {
    transition: transform 0.3s ease, opacity 0.3s ease;
}
.menu-toggle.is-open span:nth-child(1) {
    transform: translateY(11px) rotate(45deg);
}
.menu-toggle.is-open span:nth-child(2) {
    opacity: 0;
}
.menu-toggle.is-open span:nth-child(3) {
    transform: translateY(-11px) rotate(-45deg);
}

/* BACKDROP — dim layer behind the panel. Click anywhere on it to close.
   `pointer-events: none` while closed so it doesn't block clicks on the
   page underneath. */
.side-menu-backdrop {
    position: fixed;
    inset: 0;
    background:
        radial-gradient(ellipse at 72% 50%, rgba(91, 48, 25, 0.34), transparent 42%),
        rgba(0, 0, 0, 0.62);
    opacity: 0;
    pointer-events: none;
    transition: opacity 0.4s ease;
    z-index: 999;
}
.side-menu-backdrop.is-open {
    opacity: 1;
    pointer-events: auto;
}

/* PANEL — Variation B "Ink Rest" from the Claude Design handoff.
   Parchment ground, ink text, bronze hairlines, signature red active state.
   Slides in from the right via translateX. */
.side-menu {
    position: fixed;
    top: 0;
    right: 0;
    width: min(380px, 90vw);
    height: 100vh;
    height: 100dvh;
    background:
        linear-gradient(135deg,
            rgba(255, 244, 218, 0.16) 0%,
            rgba(91, 48, 25, 0.30) 34%,
            rgba(18, 10, 7, 0.82) 100%),
        rgba(22, 12, 9, 0.74);
    border-left: 1px solid rgba(255, 244, 218, 0.22);
    box-shadow:
        -24px 0 80px rgba(0, 0, 0, 0.42),
        inset 1px 0 0 rgba(255, 255, 255, 0.12);
    -webkit-backdrop-filter: blur(20px) saturate(1.16);
    backdrop-filter: blur(20px) saturate(1.16);

    transform: translateX(100%);
    transition: transform 320ms cubic-bezier(.16, 1, .3, 1);

    z-index: 1000;

    display: flex;
    flex-direction: column;
    padding: 40px 0;
}
.side-menu.is-open {
    transform: translateX(0);
}

/* HEADER — small "MENU" label on left, × close on right */
.side-menu-header {
    display: flex;
    justify-content: space-between;
    align-items: center;
    padding: 0 36px;
    margin-bottom: 64px;
}

.side-menu-label {
    font-size: 11px;
    letter-spacing: 0.32em;
    text-transform: uppercase;
    color: rgba(240, 224, 191, 0.72);
}

/* Close × — overrides the older absolute-positioned style */
.side-menu-close {
    position: static;
    width: 34px;
    height: 34px;
    display: grid;
    place-items: center;
    font-size: 22px;
    line-height: 1;
    color: var(--color-text);
    background: transparent;
    border: 1px solid rgba(201, 168, 118, 0.26);
    border-radius: 50%;
    cursor: pointer;
    transition: color 200ms ease, border-color 200ms ease, transform 200ms ease;
}
.side-menu-close:hover {
    color: #fff4da;
    border-color: rgba(255, 244, 218, 0.54);
    transform: rotate(90deg);
}

/* LINK LIST */
.side-menu-list {
    list-style: none;
    margin: 0;
    padding: 0;
    display: flex;
    flex-direction: column;
}

/* Each <li> stagger-fades in when the menu opens. The base state
   (closed) is invisible and shifted right; .is-open removes both. */
.side-menu-item {
    opacity: 0;
    transform: translateX(16px);
    transition: opacity 360ms ease, transform 360ms cubic-bezier(.16, 1, .3, 1);
}
.side-menu.is-open .side-menu-item {
    opacity: 1;
    transform: translateX(0);
}
/* Stagger — each link enters slightly later than the previous one */
.side-menu.is-open .side-menu-item:nth-child(1) { transition-delay: 100ms; }
.side-menu.is-open .side-menu-item:nth-child(2) { transition-delay: 150ms; }
.side-menu.is-open .side-menu-item:nth-child(3) { transition-delay: 200ms; }
.side-menu.is-open .side-menu-item:nth-child(4) { transition-delay: 250ms; }
.side-menu.is-open .side-menu-item:nth-child(5) { transition-delay: 300ms; }

/* The link itself — full-bleed row, dot + label + red line */
.side-menu-link {
    display: flex;
    align-items: center;
    gap: 18px;
    padding: 20px 36px;

    color: #f0e0bf;
    font-family: 'Cormorant Garamond', Georgia, serif;
    font-size: 22px;
    font-weight: 500;
    letter-spacing: 0.04em;
    text-transform: none;
    transition: color 160ms ease;
}

/* Dot bullet — empty circle by default, fills red when active */
.side-menu-dot {
    width: 8px;
    height: 8px;
    border-radius: 50%;
    background: transparent;
    border: 1px solid rgba(201, 168, 118, 0.36);
    flex-shrink: 0;
    transition: background 200ms ease, border-color 200ms ease;
}

.side-menu-text {
    flex: 1;
}

/* Hover line — draws in from 0 to 56px wide */
.side-menu-line {
    width: 0;
    height: 1px;
    background: var(--color-text);
    transition: width 280ms cubic-bezier(.16, 1, .3, 1);
}
.side-menu-link:hover .side-menu-line {
    width: 56px;
}

/* Active item — red text + filled red dot */
.side-menu-item.is-active .side-menu-link {
    color: #fff4da;
}
.side-menu-item.is-active .side-menu-dot {
    background: var(--color-text);
    border-color: var(--color-text);
}

/* FOOTER — Reservierung label + phone number + hours */
.side-menu-footer {
    margin-top: auto;
    padding: 24px 36px 0;
    border-top: 1px solid rgba(201, 168, 118, 0.24);
}

.side-menu-footer-label {
    font-size: 11px;
    letter-spacing: 0.18em;
    text-transform: uppercase;
    color: rgba(201, 168, 118, 0.84);
    margin-bottom: 8px;
}

.side-menu-footer-phone {
    display: block;
    font-size: 22px;
    font-weight: 600;
    letter-spacing: 0.02em;
    color: #f0e0bf;
    text-decoration: none;
}

.side-menu-footer-hours {
    margin-top: 6px;
    font-size: 12px;
    color: rgba(240, 224, 191, 0.64);
}

/* ============================================
   Reserve modal
   Native <dialog> element styled to match the site palette.
   The browser auto-centers the dialog and shows ::backdrop when
   opened via dialog.showModal() (see js/main.js).
   ============================================ */
.reserve-modal {
    /* Reset native dialog defaults that don't match the site */
    border: none;
    padding: var(--space-4) var(--space-3);

    background: var(--color-bg);
    color: var(--color-text);

    /* Sizing — capped at 500px wide, 90% on small screens */
    max-width: 500px;
    width: 90vw;

    border-radius: 8px;
    text-align: center;

    /* Subtle bronze frame to tie into the brand */
    box-shadow: 0 0 0 1px rgba(139, 111, 71, 0.4),
                0 30px 80px rgba(0, 0, 0, 0.6);
}

/* The dimmer behind the dialog. ::backdrop is a pseudo-element the
   browser provides automatically for native <dialog> shown via showModal().
   We just style it. backdrop-filter blurs the page contents through it. */
.reserve-modal::backdrop {
    background: rgba(0, 0, 0, 0.6);
    backdrop-filter: blur(4px);
}

/* × button at top-right corner */
.reserve-modal-close {
    position: absolute;
    top: var(--space-1);
    right: var(--space-2);
    width: 36px;
    height: 36px;
    font-size: 1.6rem;
    line-height: 1;
    color: var(--color-text);
    transition: color 0.2s;
}
.reserve-modal-close:hover {
    color: var(--color-accent);
}

.reserve-modal-title {
    font-size: 1.6rem;
    font-weight: 600;
    letter-spacing: 0.15em;
    text-transform: uppercase;
    margin-bottom: var(--space-2);
}

.reserve-modal-greeting {
    font-size: 1rem;
    line-height: 1.6;
    margin-bottom: var(--space-2);
    opacity: 0.9;
}

/* Phone — the centerpiece. Big, bold, accent-red so it draws the eye. */
.reserve-modal-phone {
    font-size: 2rem;
    font-weight: 700;
    letter-spacing: 0.05em;
    margin-bottom: var(--space-3);
}
.reserve-modal-phone a {
    color: var(--color-accent);
    text-decoration: none;
}

/* Hours + address — quieter info beneath the phone */
.reserve-modal-info {
    font-size: 0.9rem;
    line-height: 1.6;
    opacity: 0.7;
}
.reserve-modal-info p {
    margin: 0.25rem 0;
}

/* ============================================
   Page 3 — menu layout
   Left rail (1/7) + PDF menu (6/7), side by side.
   Override .page's `flex-direction: column` so children
   stack horizontally on this page only.
   ============================================ */
#page3 {
    flex-direction: row;   /* .page is column by default; switch to row here */
    height: 100vh;         /* fixed (not min-) so .menu-pdf can scroll inside */

    /* (Was: scroll-snap-align/stop to force a halt at the menu top —
       removed because it dragged the user back when they tried to
       interact with the footer. Free scrolling is fine on both
       desktop and mobile now.) */
}

/* ============================================
   Menu sections (page 3 right column)
   Each <section> is one category; inside it lives
   .menu-content-with-image (3-column photo grid)
   and later .menu-content-no-image (text-only list).
   ============================================ */

/* Per-category breathing room. Top padding gives the section
   anchor a comfortable jump-target offset; bottom separates it
   from the next category. */
.menu-section {
    padding: var(--space-3);
}

/* Category title — fancy serif heading with a thin gold rule beneath.
   Uses Cormorant Garamond (already loaded for the signatures slider, so
   no extra network cost). Italic + low weight reads as elegant/menu-like. */
.menu-section-title {
    font-family: 'Cormorant Garamond', Georgia, serif;
    font-style: italic;
    font-weight: 400;
    font-size: clamp(1.75rem, 3.2vw, 3rem);   /* responsive — scales with viewport */
    letter-spacing: 0.02em;
    color: var(--color-text);
    border-bottom: 1px solid var(--color-bronze);
    padding-bottom: 0.4rem;
    margin-bottom: 1.5rem;
}

/* The photo grid — 3 equal columns, NO gaps (cards clump tightly).
   Cards flow into rows automatically; with 6 cards you get 2 rows.
   Bring spacing back any time with `gap: var(--space-2);` etc. */
.menu-content-with-image {
    display: grid;
    grid-template-columns: repeat(3, 1fr);
    gap: 0;
}

/* Single dish card — placeholder frame for now.
   aspect-ratio keeps each card a consistent shape regardless of
   column width, so resizing the viewport scales them uniformly.
   5/6 = slightly taller than wide; try 1/1 for square or 4/5 for
   more portrait. */
.dish-card {
    aspect-ratio: 5 / 4;
    /* background and border removed — card is now fully transparent.
       To bring them back:
         background: rgba(139, 111, 71, 0.18);
         border: 1px solid rgba(139, 111, 71, 0.35); */

    /* Split into image area (top, 4 parts) + info area (bottom, 1 part).
       flex column does the vertical division; flex: 4 vs flex: 1 sets the ratio. */
    display: flex;
    flex-direction: column;
    border-radius: 4px;
}

/* Top of the card — image area, 4 of 5 vertical parts.
   Padding here gives the image breathing room from the card edges
   (top + sides only). Bottom is flush so the image meets .dish-info. */
.dish-image {
    flex: 4;
    padding: 0.5rem 0.5rem 0;
    overflow: hidden;
}

.dish-image img {
    width: 100%;
    height: 100%;
    object-fit: cover;          /* fill the box, crop if needed */
    display: block;
}

/* Bottom of the card — info row, 1 of 5 vertical parts.
   Three columns side-by-side: name (3fr), spice (2fr), price (1fr).
   3+2+1 = 6 parts, so each `fr` = 1/6 of the row width. */
.dish-info {
    flex: 1;
    display: grid;
    grid-template-columns: 3fr 2fr 1fr;
    align-items: center;
    padding: 0.4rem 0.6rem;
    gap: 0.4rem;
    font-size: 0.8rem;
    line-height: 1.2;
}

.dish-name {
    text-align: left;
}

.dish-spice {
    text-align: center;          /* peppers (or empty) — column reserves space either way */
}

.dish-price {
    text-align: right;
    font-weight: 600;
    color: var(--color-bronze);
}

/* ============================================
   Text-only entries (.menu-content-no-image)
   Sits below the photo grid in each category. Each .dish-row is a
   single line with 4 columns: name | spice | allergen | price.
   ============================================ */

/* Stack the rows vertically. No gap — flush like the photo cards above. */
.menu-content-no-image {
    display: flex;
    flex-direction: column;
}

/* One entry. 4-column grid:
     name      → 5fr (≈50% — biggest, holds full name)
     spice     → 1fr (≈10% — peppers, can be empty but reserves space)
     allergen  → 2fr (≈20% — Austrian-menu letters: A, F, O, E, N…)
     price     → 2fr (≈20% — bold, prominent)
   Total 10fr, so the math works out evenly. Tweak the ratios freely. */
.dish-row {
    display: grid;
    grid-template-columns: 5fr 1fr 2fr 2fr;
    align-items: center;
    gap: 1rem;
    padding: 0.9rem 1rem;
    border-top: 1px solid rgba(139, 111, 71, 0.2);
}

.dish-row:last-child {
    border-bottom: 1px solid rgba(139, 111, 71, 0.2);
}

.dish-row-name {
    font-size: 1.05rem;        /* "big lorem ipsum name text" */
    color: var(--color-text);
}

.dish-row-spice {
    text-align: center;
    font-size: 0.9rem;
}

.dish-row-allergen {
    text-align: center;
    font-size: 0.8rem;
    letter-spacing: 0.12em;     /* spaced caps look reads as "menu code" */
    color: var(--color-bronze);
    opacity: 0.8;
}

.dish-row-price {
    text-align: right;
    font-size: 1.25rem;          /* "big letters, good visibility" */
    font-weight: 700;
    color: var(--color-bronze);
}

.menu-nav {
    flex: 1;               /* takes 1 part of 7 (≈14% of width) */

    /* Stack links vertically and SPREAD them across the full rail height.
       justify-content: space-evenly gives equal space above the first
       link, between every pair, and below the last — auto-adjusts as
       the viewport height changes (responsive by design, no breakpoints
       needed). */
    display: flex;
    flex-direction: column;
    justify-content: space-evenly;
    padding: var(--space-2) var(--space-2);   /* breathing room from page edges */
    position: relative;
    overflow: hidden;
    background:
        linear-gradient(135deg,
            rgba(255, 244, 218, 0.14) 0%,
            rgba(139, 111, 71, 0.12) 32%,
            rgba(15, 10, 10, 0.34) 68%,
            rgba(255, 244, 218, 0.08) 100%);
    border-right: 1px solid rgba(255, 244, 218, 0.24);
    box-shadow:
        inset 1px 0 0 rgba(255, 255, 255, 0.16),
        inset -28px 0 48px rgba(15, 10, 10, 0.24),
        18px 0 46px rgba(0, 0, 0, 0.18);
    backdrop-filter: blur(18px) saturate(1.18);
    -webkit-backdrop-filter: blur(18px) saturate(1.18);
}

.menu-nav::before {
    content: "";
    position: absolute;
    inset: 0;
    pointer-events: none;
    background:
        radial-gradient(circle at 20% 12%, rgba(255, 255, 255, 0.28), transparent 20%),
        radial-gradient(circle at 78% 86%, rgba(184, 42, 42, 0.12), transparent 28%),
        linear-gradient(110deg, transparent 0%, rgba(255, 255, 255, 0.10) 44%, transparent 60%);
    opacity: 0.78;
}

/* Single category link — quiet by default, accent red on hover */
.menu-nav-link {
    position: relative;
    z-index: 1;
    padding: 0.5rem 0;
    color: var(--color-text);
    /* clamp(MIN, IDEAL, MAX) — responsive font size:
       - 1rem on narrow screens
       - 1.4vw scales with viewport width in between
       - 1.6rem cap so it doesn't get ridiculous on huge displays */
    font-size: clamp(1rem, 1.4vw, 1.6rem);
    letter-spacing: 0.08em;
    text-align: center;        /* horizontally center the label in its column */
    text-transform: uppercase;
    transition: color 0.2s;
}

.menu-nav-link:hover {
    color: var(--color-accent);
}

.menu-pdf {
    flex: 6;               /* takes 6 parts of 7 (≈86% of width) */
    overflow-y: auto;      /* in case future content is taller than 100vh */
    position: relative;
    isolation: isolate;
    background:
        radial-gradient(ellipse 80% 70% at 50% 8%, rgba(91, 48, 25, 0.40), transparent 62%),
        linear-gradient(180deg, #2a1710 0%, #1d100c 48%, #120b09 100%);
}

.menu-pdf::before {
    content: "";
    position: absolute;
    inset: 0;
    z-index: -1;
    pointer-events: none;
    background:
        linear-gradient(90deg, rgba(15, 10, 10, 0.18), transparent 12%),
        radial-gradient(ellipse 60% 80% at 100% 50%, rgba(201, 168, 118, 0.08), transparent 64%);
}

/* ============================================
   Page 2 — Apeel-inspired parchment reveal.
   The JS updates --welcome-progress from 0 → 1 as this page enters.
   ============================================ */
#page2 {
    background: transparent;
    /* NOTE: --welcome-progress is declared on :root and updated by
       main.js on <html>. Do NOT redeclare it here — that would create
       a local 0 that shadows the root value and freeze the reveal. */
    align-items: center;
    justify-content: center;
    perspective: 1200px;
    /* No horizontal padding — the porcelain plate is full-bleed and
       needs the entire viewport width (capped at 92vw) for its own
       sizing rule to take effect. */
    padding: 0;
}

#page2::before {
    content: "";
    position: absolute;
    inset: 0;
    z-index: -1;
    pointer-events: none;
    background:
        radial-gradient(
            ellipse at center,
            rgba(15, 10, 10, calc(0.22 + (var(--welcome-progress) * 0.38))) 0%,
            rgba(15, 10, 10, calc(0.08 + (var(--welcome-progress) * 0.24))) 42%,
            rgba(15, 10, 10, 0) 74%
        );
}

/* ============================================
   Welcome section (page 2) — porcelain plate roll-in.

   A circular blue-and-white porcelain plate rolls in from the right
   as --welcome-progress (set on <html> by main.js on scroll into
   #page2) climbs 0 → 1.

   Sub-progresses are inlined where consumed (not stored in custom
   properties) — Chromium doesn't always type-resolve clamp()-of-
   unitless-numbers through a var() indirection, so we compute the
   same sub-progress at the point of use:

     plate roll   : 0 → 1 over progress 0.00 .. 0.72
     well text    : 0 → 1 over progress 0.62 .. 1.00

   Total rotation is -720deg (two full counterclockwise turns — the
   correct sense for a wheel rolling leftward). -720deg ≡ 0deg
   visually, so painted rim motifs land at 12 / 6 o'clock and the
   text reads upright at rest.
   ============================================ */
.welcome {
    width: 100%;
    min-height: 100vh;

    display: flex;
    align-items: center;
    justify-content: center;
    position: relative;
    overflow: hidden;            /* clip the plate while it's off-screen right */
}

.plate {
    /* Diameter = 80vh, capped to 92vw on narrow viewports so the
       plate never overflows horizontally on tall phone-shaped screens. */
    width:  min(80vh, 92vw);
    height: min(80vh, 92vw);
    position: relative;
    border-radius: 50%;

    /* Roll-in: translateX 110vw → 0, rotate 0 → -720deg.
       Translate uses vw (not the plate's own width) so the slide
       distance reads the same at every plate size. */
    transform:
        translateX(calc(
            (1 - max(0, min(1, calc(var(--welcome-progress) / 0.72))))
            * 110vw))
        rotate(calc(
            max(0, min(1, calc(var(--welcome-progress) / 0.72)))
            * -720deg));
    transform-origin: 50% 50%;
    will-change: transform;

    /* Soft ground-contact + ambient shadow stacked via drop-shadow
       so the round silhouette of the PNG drives the shadow shape
       (cleaner than box-shadow on a square wrapper). */
    filter:
        drop-shadow(0 22px 28px rgba(0, 0, 0, 0.32))
        drop-shadow(0 50px 80px rgba(0, 0, 0, 0.28));
}

.plate__img {
    position: absolute;
    inset: 0;
    width: 100%;
    height: 100%;
    object-fit: contain;
    pointer-events: none;
    user-select: none;
    -webkit-user-drag: none;
}

/* ----- Text overlay in the plate's center well -----
   Fades + lifts in once the plate has mostly landed. */
.plate__text {
    position: absolute;
    inset: 0;
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    text-align: center;
    padding: 30% 28%;                 /* keep text inside the wreath's empty center */
    color: #142c60;                   /* matches the cobalt of the painted plate */

    opacity: max(0, min(1, calc((var(--welcome-progress) - 0.62) / 0.38)));
    transform: translateY(calc(
        (1 - max(0, min(1, calc((var(--welcome-progress) - 0.62) / 0.38))))
        * 14px));
}

.welcome-title {
    font-family: 'Cormorant Garamond', Georgia, serif;
    font-weight: 600;
    letter-spacing: 0.04em;
    line-height: 1.0;
    margin: 0;
    /* vmin so the title scales with the smaller axis, keeping
       proportion when the plate hits its 92vw cap. */
    font-size: clamp(1.7rem, 4.8vmin, 3.2rem);
    color: #142c60;
    display: block;
    padding-bottom: 0;
}

.welcome-title-line {
    display: inline-block;
}

/* Chinese title needs a serif Chinese face + slightly tighter sizing. */
:lang(zh) .welcome-title,
[lang="zh"] .welcome-title {
    font-family: 'Noto Serif SC', 'Songti SC', 'STSong', 'Cormorant Garamond', serif;
    font-weight: 500;
    letter-spacing: 0.14em;
    font-size: clamp(1.55rem, 4.4vmin, 2.9rem);
}

/* Thin blue rule with a small diamond — echoes the rim ornament. */
.plate__divider {
    display: flex;
    align-items: center;
    justify-content: center;
    gap: 0.6em;
    margin: clamp(10px, 1.6vmin, 22px) 0 clamp(10px, 1.6vmin, 22px);
    width: 60%;
    max-width: 320px;
    opacity: calc(
        max(0, min(1, calc((var(--welcome-progress) - 0.62) / 0.38)))
        * 0.85);
}
.plate__divider span {
    flex: 1;
    height: 1px;
    background: linear-gradient(90deg, transparent, rgba(29, 58, 108, 0.55), transparent);
}
.plate__divider i {
    width: 6px;
    height: 6px;
    background: #1d3a6c;
    transform: rotate(45deg);
    opacity: 0.8;
}

.welcome-text {
    font-family: 'Cormorant Garamond', Georgia, serif;
    font-style: italic;
    font-size: clamp(0.78rem, 1.45vmin, 1.1rem);
    line-height: 1.5;
    max-width: 26em;
    margin: 0;
    color: rgba(20, 44, 96, 0.86);
    text-wrap: pretty;
}

:lang(zh) .welcome-text,
[lang="zh"] .welcome-text {
    font-family: 'Noto Serif SC', 'Songti SC', 'STSong', serif;
    font-style: normal;
    letter-spacing: 0.1em;
    font-size: clamp(0.82rem, 1.55vmin, 1.1rem);
    line-height: 1.7;
}

/* Reduced-motion: skip the roll, just fade the plate in centered. */
@media (prefers-reduced-motion: reduce) {
    .plate {
        transform: none;
        opacity: var(--welcome-progress, 1);
    }
    .plate__text { transition: none; }
    .welcome-title-line { transform: none; }
}

/* ============================================
   MOBILE (≤768px) — preserves the desktop look and all parallaxes
   (rolling plate, dim overlay, signatures carousel, scroll-driven
   --welcome-progress) but reflows the menu page from a vertical
   sidebar into a sticky horizontal pill bar so phone users can swipe
   through categories with their thumb.
   ============================================ */
@media (max-width: 768px) {

    /* ---------- Page 3 (menu) — column instead of row ----------
       The desktop layout is 1/7 vertical rail + 6/7 PDF column.
       On mobile we stack: pill bar on top, then the PDF column.

       overflow MUST be visible here: the desktop `.page` rule sets
       `overflow: hidden`, which would make #page3 the sticky-bar's
       containing block. Since #page3 itself doesn't scroll, the
       sticky would never engage. Promoting overflow to visible lets
       the sticky bind to the body's scroll instead, so it pins at
       the viewport top throughout the whole menu section. */
    #page3 {
        flex-direction: column;
        height: auto;                 /* let it grow with content */
        min-height: 100vh;
        overflow: visible;
    }

    /* The category rail becomes a horizontal scrollable pill bar.
       Behavior wanted by the user:
         • hidden (above the viewport) while not in the menu
         • slides DOWN from the top once #page3's top edge reaches
           the phone screen top
         • stays pinned to top:0 until the user scrolls past #page3
         • slides UP back out when leaving the menu

       Implementation:
         position: fixed so the bar can live above the viewport;
         transform: translateY(-100%) is the hidden state;
         .is-visible flips it to translateY(0). main.js toggles the
         class based on #page3's rect on every scroll RAF.

       Stained-glass look: translucent gradient + backdrop-filter
       blur, same recipe as the desktop rail; the site background
       video shows through faintly behind the bar. */
    .menu-nav {
        position: fixed;
        top: 0;
        left: 0;
        right: 0;
        z-index: 30;
        flex: 0 0 auto;
        flex-direction: row;
        justify-content: flex-start;
        align-items: center;
        gap: 8px;
        overflow-x: auto;
        overflow-y: hidden;
        padding: 12px 16px;
        background:
            linear-gradient(135deg,
                rgba(255, 244, 218, 0.14) 0%,
                rgba(139, 111, 71, 0.12) 32%,
                rgba(15, 10, 10, 0.34) 68%,
                rgba(255, 244, 218, 0.08) 100%);
        border-right: none;
        border-bottom: 1px solid rgba(255, 244, 218, 0.24);
        box-shadow:
            inset 0 1px 0 rgba(255, 255, 255, 0.16),
            0 6px 22px rgba(0, 0, 0, 0.34);
        backdrop-filter: blur(18px) saturate(1.18);
        -webkit-backdrop-filter: blur(18px) saturate(1.18);
        scrollbar-width: none;        /* Firefox */
        scroll-snap-type: x proximity;

        /* Slide-in / slide-out */
        transform: translateY(-100%);
        transition: transform 320ms cubic-bezier(0.4, 0, 0.2, 1);
        will-change: transform;
    }
    .menu-nav.is-visible {
        transform: translateY(0);
    }
    .menu-nav::-webkit-scrollbar { display: none; }

    /* Keep the same sheen overlay the desktop has so the bar reads
       as a leaded-glass panel rather than a flat translucent slab. */
    .menu-nav::before {
        display: block;
        background:
            radial-gradient(circle at 22% 18%, rgba(255, 255, 255, 0.28), transparent 24%),
            radial-gradient(circle at 78% 86%, rgba(184, 42, 42, 0.10), transparent 28%),
            linear-gradient(110deg, transparent 0%, rgba(255, 255, 255, 0.08) 44%, transparent 60%);
        opacity: 0.6;
    }

    /* ---------- Let the background video show through page 3 ----------
       The desktop right-column has a heavy dark gradient that hides the
       site video. On mobile we drop it so the video is the actual
       backdrop and the sticky nav becomes the stained-glass panel
       sitting over it. */
    #page3 {
        background: transparent;
    }
    .menu-pdf {
        background: transparent;
    }
    .menu-pdf::before {
        display: none;
    }

    /* Kill the desktop sheen overlay on the rail — it relied on
       the rail being a vertical light sweep. */
    .menu-nav::before {
        display: none;
    }

    /* Links sit flush against each other, separated by a single
       hairline rule. The container provides the stained-glass panel;
       the buttons themselves are pure transparent text + a divider.
       Active link grows slightly + glows gold — the (centered)
       scroll into view from main.js does the "selected = center"
       indication. */
    .menu-nav-link {
        flex: 0 0 auto;
        padding: 4px 14px;
        font-size: 0.7rem;
        letter-spacing: 0.08em;
        border: none;
        border-right: 1px solid rgba(255, 244, 218, 0.20);
        background: transparent;
        color: rgba(244, 234, 210, 0.7);
        border-radius: 0;
        white-space: nowrap;
        scroll-snap-align: center;
        transition: color 200ms ease, font-size 200ms ease,
                    letter-spacing 200ms ease;
    }
    /* No trailing divider after the last category. */
    .menu-nav-link:last-child {
        border-right: none;
    }
    .menu-nav-link:hover {
        color: rgba(244, 234, 210, 1);
    }
    .menu-nav-link.is-active {
        color: rgba(244, 234, 210, 1);  /* cream/white — same as hover */
        font-size: 0.92rem;             /* only size changes when selected */
        letter-spacing: 0.1em;
    }

    /* Also drop the nav container's horizontal padding so the first
       and last categories sit flush against the screen edges, and
       remove the inter-link gap so the divider hairlines do the
       separating work (no double spacing). */
    .menu-nav {
        padding: 10px 0;
        gap: 0;
    }

    /* The PDF column fills the remaining width.
       padding-top reserves the space the (now position:fixed) nav
       occupies when visible — without it, the first category title
       (#mittagsmenu) would sit right under the nav and get covered. */
    .menu-pdf {
        flex: 1 1 auto;
        width: 100%;
        overflow-y: visible;          /* outer page scrolls now, not this */
        padding-top: 64px;
    }

    /* Tighten per-section padding for narrow viewports. */
    .menu-section {
        padding: 24px 16px 32px;
        scroll-margin-top: 80px;      /* clear the sticky pill bar on jump */
    }

    .menu-section-title {
        font-size: clamp(1.6rem, 6vw, 2.2rem);
        margin-bottom: 1rem;
    }

    /* Photo grid: 3 columns is too cramped — drop to 2 on mobile. */
    .menu-content-with-image {
        grid-template-columns: repeat(2, 1fr);
        gap: 4px;
    }

    .dish-info {
        font-size: 0.72rem;
        padding: 0.35rem 0.45rem;
        gap: 0.3rem;
    }

    /* Text rows: stack the small columns under the name on very
       narrow screens, but keep name+price on one row so the price
       still sits at the end like a menu. */
    .dish-row {
        grid-template-columns: 1fr auto auto;
        gap: 0.6rem;
        padding: 0.7rem 0.5rem;
    }
    .dish-row-allergen { display: none; }   /* free up horizontal space */
    .dish-row-name { font-size: 0.95rem; }
    .dish-row-price { font-size: 1.05rem; }

    /* Chili indicators stack VERTICALLY on phones — one emoji per
       row, reading top-to-bottom. Each chili is now its own
       <span class="chili"> in HTML (and signatures.js wraps the
       carousel ones too), so flex column does the layout. */
    .dish-spice,
    .dish-row-spice {
        display: inline-flex;
        flex-direction: column;
        align-items: center;
        justify-content: center;
        line-height: 1;
        gap: 1px;
    }
    .dish-spice .chili,
    .dish-row-spice .chili {
        display: block;
        font-size: 1em;
    }

    /* ---------- Signatures (carousel) on mobile ----------
       Desktop has min-height: 100vh on .sig which leaves a big empty
       band at the bottom on phones (content is much shorter than 100vh).
       Drop the min-height and tighten the padding so the carousel sits
       snug against the welcome page above and the menu below. */
    .sig {
        min-height: 0;
        padding: 32px 0 16px;
    }
    .sig-head {
        margin-bottom: 18px;
        padding: 0 20px;
    }
    .sig-info {
        margin-top: 14px;
        padding: 0 20px;
    }

    /* Menu sections — tighten the per-category padding so the first
       section sits close to the (fixed) navbar instead of leaving
       another empty band. .menu-pdf already reserves 64px at the top
       for the nav, so .menu-section's own top padding only needs to
       provide a small visual gap below the bar. */
    .menu-section {
        padding: 0;
    }

    .menu-section-title {
        padding: 16px 16px 8px;
        margin-bottom: 0;
    }

    /* ---------- Dish photo grid: edge-to-edge tile layout ----------
       Phone real-estate is tight, so ditch ALL outer spacings on the
       menu cards. The grid is a hard 2 × N: each cell is 50vw × 25vh
       with zero gap/margin/border-radius. Both image and the small
       caption strip scale fairly (image keeps flex:4, info keeps
       flex:1 → image ≈ 80% of card height, info ≈ 20%). */
    .menu-content-with-image {
        grid-template-columns: repeat(2, 50vw);
        gap: 0;
    }
    .dish-card {
        aspect-ratio: auto;             /* override desktop 5/4 ratio */
        height: 25vh;
        border-radius: 0;
        margin: 0;
    }
    .dish-image {
        flex: 4;
        padding: 0;                      /* no breathing room around the photo */
        margin: 0;
    }
    .dish-info {
        flex: 1;
        padding: 4px 6px;                /* just enough so text isn't kissing the edge */
        gap: 4px;
        font-size: 0.62rem;
        line-height: 1.1;
    }
    .dish-info .chili {
        font-size: 0.7em;
    }
    /* Small visual gutter between the two grid columns — only on
       odd-position cells (column 1) — so middle reads as separated
       without re-introducing a full grid gap. */
    .dish-card:nth-child(odd) {
        padding-right: 5px;
    }

    /* ---------- Reserve button on mobile ----------
       Desktop sizes it at padding 16/64 + font-size 28px — way too
       big on a 375px screen. Shrink padding, font, and letter-spacing
       for phone proportions, and lift the button up away from the
       very bottom of the hero via a bottom margin on the section. */
    .reserve-section {
        flex: 0 0 auto;
        padding: 16px 16px 24px;
        margin-bottom: 140px;
    }
    .reserve-btn {
        padding: 12px 36px;
        font-size: 16px;
        letter-spacing: 3px;
    }

    /* ---------- Top navbar on mobile ----------
       Desktop sizes the panda logo at 200px and uses absolutely
       positioned 80px circle buttons — neither fits on a 375px
       phone. Mobile redesign: a single flex row with a small logo
       on the left, three small lang circles in the middle, and a
       compact hamburger on the right, with even gaps. */
    .navbar {
        padding: 12px 16px;
        gap: 8px;
    }
    .navbar-logo img {
        height: 96px;             /* 2x of the previous 48px */
    }
    .navbar-actions {
        position: static;          /* opt out of the desktop absolute layout */
        top: auto;
        right: auto;
        transform: none;
        margin-left: auto;         /* push the group to the right edge */
        gap: 8px;
    }
    .lang-btn {
        width: 36px;
        height: 36px;
        font-size: 0.78rem;
        border-width: 1px;
    }
    .menu-toggle {
        width: 40px;
        height: 40px;
        gap: 6px;
        padding: 8px;
    }
    .menu-toggle span {
        height: 2.5px;
    }

    /* Side menu (hamburger drawer) is already small-screen friendly. */

    /* ---------- Welcome page — collapse extra vertical space ----------
       On phones the plate hits its 92vw width cap (~345px on a 375px
       screen) but the desktop's min-height: 100vh leaves 230+px of
       empty space above AND below. Drop min-height on .welcome AND
       on #page2 (the .page wrapper inherits min-height:100vh) so the
       welcome page sits at plate-height + a small breathing margin. */
    #page2 {
        min-height: 0;
    }
    .welcome {
        min-height: 0;
        padding: 24px 0;
    }
}


/* ============================================
   Chinese display typography — bold retro serif
   --------------------------------------------
   When the site is in Chinese (i18n.js sets <html lang="zh-CN">), swap
   display headings to Noto Serif SC Black (900). The thick-stroke
   serif reads as "retro Republic-era poster" — what the owner wants for
   the Chinese view. Body text stays at weight 400 (already set by the
   per-component rules earlier in this file); only DISPLAY text goes 900.
   ============================================ */
:lang(zh) .hero-title,
:lang(zh) .welcome-title,
:lang(zh) .sig-head .eyebrow,
:lang(zh) .sig-head h2,
:lang(zh) .sig-head h2 .sig-title-lead,
:lang(zh) .sig-head h2 .sig-title-gold em,
:lang(zh) .sig-head h2 .sig-title-tail,
:lang(zh) .sig-info-de em,
:lang(zh) .menu-section-title {
    font-family: 'Noto Serif SC', 'Songti SC', 'STSong', serif;
    font-weight: 900;
    font-style: normal;
}

