/* =========================================================
   Pinch — Seafood Bistro & Bar in Lisbon
   ========================================================= */

@font-face {
  font-family: "Emilio";
  /* Inlined as base64 in this local preview copy only (not the real deploy
     source) — Chrome (and most browsers) block @font-face from loading over
     a plain file:// URL even when the .woff2 sits right next to the CSS,
     silently falling back to Georgia instead. A data: URI sidesteps that
     restriction entirely since there's no separate file fetch to block. */
  src: url("data:font/woff2;base64,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")
    format("woff2");
  font-weight: 300;
  font-style: normal;
  font-display: swap;
}

@font-face {
  font-family: "Emilio";
  src: url("data:font/woff2;base64,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")
    format("woff2");
  font-weight: 300;
  font-style: italic;
  font-display: swap;
}

:root {
  --color-cream: #f2ece3;
  --color-white: #ffffff;
  --color-blush: #fcdee1;
  --color-blush-panel: #fbdedf;
  --color-green: #2e482b;
  --color-accent: #f05b5b;
  --color-ink: #0b0f0b;
  --color-black: #000000;

  --font-display: "Emilio", Georgia, "Times New Roman", serif;
  --font-mono: "Roboto Mono", "SFMono-Regular", Menlo, Consolas, monospace;

  --page-max: 1440px;
  --gutter: 40px;

  /* ---- Spacing scale ----
     Canonical scale for new spacing decisions (margin/padding/gap). A
     4px-rooted progression through the values the site already uses most:
     tight component spacing at the low end, section rhythm at the high
     end. Existing rules keep their literal px values where a comment
     documents an exact, non-rhythm reason (shadow-clearance math, the
     vinyl disc's hover-peek safety margin, claw-button geometry, etc.) —
     those are deliberate measurements, not spacing-scale drift, and
     forcing them onto this scale would change tuned pixel math for no
     visual gain. Everything else (new sections, new components, and the
     already-consistent section-padding/heading-margin values below)
     should reference these tokens instead of a fresh literal number. */
  --space-1: 4px;
  --space-2: 8px;
  --space-3: 12px;
  --space-4: 16px;
  --space-5: 20px;
  --space-6: 24px;
  --space-7: 32px;
  --space-8: 40px;
  --space-9: 48px;
  --space-10: 64px;
  --space-11: 80px;
  --space-12: 100px;
  --space-13: 120px;
  --space-14: 140px;

  /* ---- Type scale ----
     Named after the role each size already plays consistently across the
     site (verified by grepping every font-size declaration), not a fresh
     redesign — Pinch's headings and body text keep their shipped sizes.
     --text-heading/--text-heading-mobile is the one scale already applied
     uniformly everywhere (Menu/Journal/Reviews/FAQ/Vinyl/Statement all
     share it desktop and mobile); the rest give the recurring UI-text and
     display sizes a name so future components reach for an existing step
     instead of picking a new one-off number. */
  --text-2xs: 12px;
  --text-xs: 14px;
  --text-sm: 16px;
  --text-base: 18px;
  --text-md: 20px;
  --text-lg: 28px;
  --text-xl: 36px;
  --text-heading-mobile: 44px;
  --text-2xl: 48px;
  --text-3xl: 56px;
  --text-heading: 60px;
  --text-4xl: 66px;
  --text-5xl: 84px;
  --text-6xl: 94px;

  /* ---- Line-height scale ----
     Same audit approach as the sizes above: named after the role each
     ratio already plays (tight display headings vs. body copy vs. the
     couple of deliberately looser multi-line contexts), not a redesign. */
  --leading-tight: 1;
  --leading-snug: 1.15;
  --leading-normal: 1.5;
  --leading-loose: 1.6;
  --leading-relaxed: 1.7;
}

* {
  box-sizing: border-box;
}

/* NOTE: `overflow-x: clip` (NOT `hidden`) on body. `hidden` would make
   Chrome compute overflow-y as `auto`, turning body into its own
   scrolling box and breaking position:sticky relative to the viewport
   (this broke the footer brand-pin crab/lobster converge before). `clip`
   is exempt from that axis-coupling — it establishes no scroll container
   and leaves overflow-y `visible`, so sticky keeps working — while still
   killing the stray horizontal scroll that off-canvas transformed pieces
   (events-fan deck cards parked to the right, etc.) kept introducing on
   mobile. The one element that scrolls sideways on purpose
   (.hero__gallery) has its own overscroll-behavior-x containment. */

html {
  /* Same clip on the root — Safari needs it on both to fully stop the
     rubber-band sideways pan. */
  overflow-x: clip;
}

body {
  margin: 0;
  overflow-x: clip;
  background: var(--color-cream);
  color: var(--color-ink);
  font-family: var(--font-mono);
  font-weight: 300;
  -webkit-font-smoothing: antialiased;
  /* Same idea as the heading rule above, for running body copy: reduces
     orphaned last-line words in paragraphs (article body, subtitles,
     tracklists) without changing layout in browsers that don't support
     it yet. */
  text-wrap: pretty;
}

/* Fine paper grain over the whole page — a nod to the kraft-paper
   texture called out in the brand identity. One fixed, non-interactive
   overlay; `soft-light` so it takes a faint tint from whatever section
   colour sits under it (warm over cream/blush, deep over green) instead
   of reading as flat grey noise. Static — no animation. */
body::after {
  content: "";
  position: fixed;
  inset: 0;
  z-index: 2147483000;
  pointer-events: none;
  opacity: 0.5;
  /* multiply: darken-only speckle — visible on the light blush
     blocks, ~invisible on the dark green ones. Finer + fainter. */
  mix-blend-mode: multiply;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='120' height='120'%3E%3Cfilter id='pg'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='1.1' numOctaves='2' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23pg)' opacity='0.09'/%3E%3C/svg%3E");
  background-size: 120px 120px;
}

/* Animated film-grain canvas (js/noise-overlay.js). When JS runs and
   motion is allowed it replaces the static SVG grain above with a
   re-drawn canvas; reduced-motion / no-JS keeps the static one. */
.noise-overlay {
  position: fixed;
  inset: 0;
  width: 100vw;
  height: 100vh;
  pointer-events: none;
  /* Above the header's own z-index:50 (.nav) so the grain covers the
     whole page — header and footer included, not just the sections in
     between. A NEGATIVE z-index (tried briefly) sat behind literally
     every section's own background, and a low positive one still sat
     under the header — cards that need to stay clean (.journal-entry,
     .event-card, .journal-poster) get their own z-index above this
     instead. */
  z-index: 55;
  image-rendering: pixelated;
  /* multiply: shows as fine speckle on the light blush blocks,
     falls away on the dark green ones (menu / About Us). */
  mix-blend-mode: multiply;
}

html.has-noise-canvas body::after {
  display: none;
}

.click-spark {
  position: fixed;
  inset: 0;
  width: 100vw;
  height: 100vh;
  pointer-events: none;
  z-index: 2147483002;
}

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

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

ul {
  list-style: none;
  margin: 0;
  padding: 0;
}

h1,
h2,
h3 {
  margin: 0;
  /* Lets the browser choose better break points on the last line of a
     heading instead of leaving a lone short word stranded (the "orphan"
     several headings already had hand-tuned comments/widths to avoid —
     e.g. .reviews__heading). Purely additive: unsupported
     browsers just wrap normally, and it has no effect on headings whose
     lines are already hard-split in markup for the reveal animation. */
  text-wrap: balance;
}

.eyebrow {
  font-family: var(--font-mono);
  font-weight: 300;
  font-size: var(--text-sm);
  letter-spacing: -1.6px;
  text-transform: uppercase;
  color: var(--color-green);
  margin: 0 0 20px;
}

.eyebrow--light {
  color: var(--color-cream);
}

/* ---------- Intro (plays once per session, see js/main.js) ---------- */

.intro {
  position: fixed;
  inset: 0;
  z-index: 400;
  overflow: hidden;
  background: var(--color-blush);
  transition: transform 0.8s cubic-bezier(0.16, 0.84, 0.44, 1);
}

/* Same grain texture as the rest of the site, scoped to the intro's own
   stacking context (z-index:400 locally) so it shows here too without
   having to raise the site-wide grain above the intro overlay itself.
   This is a static SVG texture, not the animated canvas js/noise-
   overlay.js draws for the rest of the page (that one sits at
   z-index:55, under the intro's own 400) — matched to roughly the same
   strength, but the intro is only ever on screen a second or two, so at
   the animated version's subtlety it read as not there at all. Bumped
   a bit stronger here so it actually registers in that short a window. */
.intro::after {
  content: "";
  position: absolute;
  inset: 0;
  z-index: 1;
  pointer-events: none;
  /* Bumped again — even at 0.68/0.14 it still wasn't reading as "there"
     in the second or two the intro is actually on screen. This is a
     static texture, not the animated canvas grain the rest of the site
     draws (js/noise-overlay.js): with no motion to catch the eye, it
     needs to be unmistakable at a glance rather than merely present. */
  opacity: 0.85;
  mix-blend-mode: multiply;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='120' height='120'%3E%3Cfilter id='pg'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='1.1' numOctaves='2' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23pg)' opacity='0.22'/%3E%3C/svg%3E");
  background-size: 120px 120px;
}

.intro.is-hidden {
  transform: translateY(-100%);
  pointer-events: none;
}

/* The wordmark now, not the tagline — swapped with the footer's own
   center piece (see .site-footer__brand-text) so each "moment" shows
   the other's original content: the intro reveals the logo where the
   tagline used to be, and the footer's converge closes the crab and
   lobster over the tagline where the logo used to sit. */
.intro__logo {
  position: absolute;
  top: 50%;
  left: 50%;
  z-index: 1;
  transform: translate(-50%, -50%);
  width: clamp(220px, 26vw, 440px);
  height: auto;
  /* Hidden until is-text-shown — reversed sequence: the crab/lobster are
     what's visible first now, the logo comes last, right before the
     site. */
  opacity: 0;
  transition: opacity 0.5s cubic-bezier(0.16, 0.84, 0.44, 1);
}

.intro.is-text-shown .intro__logo {
  opacity: 1;
}

/* Draw-on wordmark (js/intro-logo-draw.js swaps the <img> for this inline
   <svg> and adds --draw-len + the classes). The whole logo traces on as
   one continuous outline, then floods with green — synced to the fade-in
   above. Only present when JS has opted in; the plain image is the
   fallback. */
.intro__logo--draw path {
  fill: transparent;
  stroke: var(--color-green);
  stroke-width: 3;
  stroke-linejoin: round;
  stroke-linecap: round;
  stroke-dasharray: var(--draw-len);
  stroke-dashoffset: var(--draw-len);
}

.intro__logo--draw.is-drawing path {
  transition:
    /* slow enough to actually watch the line travel through the letters */
    stroke-dashoffset 2.1s cubic-bezier(0.4, 0, 0.2, 1),
    /* green floods in early, roughly alongside the draw, not after it */ fill
      0.5s ease 0.9s;
  stroke-dashoffset: 0;
  fill: var(--color-green);
}

@media (prefers-reduced-motion: reduce) {
  .intro__logo--draw path {
    fill: var(--color-green);
    stroke: none;
    stroke-dashoffset: 0;
  }
}

/* The hero sits right under the intro in the markup, so this only ever
   matches on the pages that actually render an intro — it starts nudged
   down and rises into place in sync with the intro sliding up off-screen,
   instead of just appearing static underneath a fade. */
.intro ~ .hero {
  transform: translateY(4%);
  transition: transform 0.8s cubic-bezier(0.16, 0.84, 0.44, 1);
}

.intro.is-hidden ~ .hero {
  transform: translateY(0);
}

/* Exact positions lifted from the Figma prototype (file EH2HnDKP56Mvowrmu1MG5Z):
   Desktop-5/Desktop-4 frames (1440x1024) for the wide layout, iPhone 13&14
   -2/-1 frames (390x844) for the mobile layout — together vs. apart crab/
   lobster child-frame x/y/width converted to percentages of the artboard.
   Reversed on request from the original sequence: crab and lobster are
   visible together from the very first frame (opacity:1, no fade-in —
   they're the first thing shown, not something arriving), then is-apart
   drives them to their separated positions, and only then does the
   logo appear (see .intro__logo above) before the site is revealed. */
.intro__crab,
.intro__lobster {
  position: absolute;
  opacity: 1;
  transition:
    top 1.2s cubic-bezier(0.16, 0.84, 0.44, 1),
    left 1.2s cubic-bezier(0.16, 0.84, 0.44, 1);
}

.intro__crab {
  width: 40.9vw;
  top: 30.2%;
  left: 5.6%;
}

.intro__lobster {
  width: 52vw;
  top: 29.6%;
  left: 44.4%;
}

.intro.is-apart .intro__crab {
  top: 64%;
  left: -20.4%;
}

.intro.is-apart .intro__lobster {
  top: -2.6%;
  left: 76.7%;
}

@media (max-width: 900px) {
  /* Together-state left values (5.6% / 44.4%) and the +20px vertical
     nudge below matched the (now-removed) statement-scroll.js section's
     own mobile convergence rule by design, since both features shared
     the same crab/lobster artwork. Threshold matches the site's own
     mobile/desktop split (900px). */
  .intro__crab {
    top: calc(36.7% + 20px);
    left: 5.6%;
  }

  .intro__lobster {
    top: calc(36.7% + 20px);
    left: 44.4%;
  }

  /* Pure horizontal parting on mobile — straight out left and right, no
     diagonal drift toward the corners. The desktop is-apart rules above
     also move `top` (64% / -2.6%); without re-pinning it here that
     vertical travel leaked through on mobile. Mirrors the footer's own
     mobile crab/lobster move (left-only, top fixed), just reversed —
     together -> apart instead of apart -> together. */
  .intro.is-apart .intro__crab {
    top: calc(36.7% + 20px);
    left: -40.9%;
  }

  .intro.is-apart .intro__lobster {
    top: calc(36.7% + 20px);
    left: 100%;
  }
}

@media (prefers-reduced-motion: reduce) {
  .intro,
  .intro__logo,
  .intro__crab,
  .intro__lobster,
  .intro ~ .hero {
    transition: none !important;
  }
}

/* ---------- Buttons ---------- */

.btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  height: 82px;
  padding: 0 34px;
  border-radius: 100px;
  font-family: var(--font-mono);
  font-weight: 300;
  font-size: var(--text-md);
  letter-spacing: -1.6px;
  text-transform: uppercase;
  border: 1px solid transparent;
  cursor: pointer;
  transition:
    background-color 0.35s cubic-bezier(0.16, 0.84, 0.44, 1),
    color 0.35s cubic-bezier(0.16, 0.84, 0.44, 1);
}

.btn--pink {
  background: var(--color-accent);
  border-color: var(--color-accent);
  color: var(--color-cream);
}

.btn--pink:hover {
  background: color-mix(in srgb, var(--color-accent) 85%, white);
  border-color: color-mix(in srgb, var(--color-accent) 85%, white);
}

.btn--green {
  /* Was var(--color-accent) — despite the name, this rendered coral,
     identical to .btn--pink, everywhere it was used (homepage "See the
     menu", the article "See the menu" back-link). Buttons meant to read
     as green (as opposed to .btn--pink's intentional coral) actually
     use the brand green now. */
  background: var(--color-green);
  border-color: var(--color-green);
  color: var(--color-cream);
}

.btn--green:hover {
  background: color-mix(in srgb, var(--color-green) 85%, white);
  border-color: color-mix(in srgb, var(--color-green) 85%, white);
}

.btn--outline-green {
  /* Same fix as .btn--green above — was var(--color-accent) (coral). */
  background: transparent;
  border-color: var(--color-green);
  color: var(--color-green);
}

.btn--outline-green:hover {
  background: var(--color-green);
  color: var(--color-cream);
}

.btn--accent {
  background: var(--color-accent);
  border-color: var(--color-accent);
  color: var(--color-cream);
}

.btn--accent:hover {
  background: color-mix(in srgb, var(--color-accent) 85%, white);
  border-color: color-mix(in srgb, var(--color-accent) 85%, white);
}

/* Hero CTA — dark green pill with a trailing arrow, per the Figma hero
   redesign (node 407:459/407:510-513). */
.btn--hero {
  background: var(--color-green);
  border-color: var(--color-green);
  color: var(--color-blush);
  height: 88px;
  /* Right padding clears space for the arrow, which is no longer an
     in-flow flex child (see .hero__cta-wrap .btn__arrow) — it's an
     absolutely-positioned sibling now, so this is just reserved room,
     not a gap partner. */
  padding: 0 72px 0 40px;
  font-size: 19px;
  letter-spacing: -0.95px;
}

.btn--hero:hover {
  background: color-mix(in srgb, var(--color-green) 94%, white);
  border-color: color-mix(in srgb, var(--color-green) 94%, white);
}

.btn__arrow {
  width: 22px;
  height: auto;
  flex-shrink: 0;
}

/* Claw-paired buttons only: the arrow lives as its own sibling in
   .hero__cta-wrap (not inside the <a>) so it can be positioned directly
   against the wrap's own right edge (which always equals the button's
   right edge, since the wrap is fit-content) — a fixed distance from
   there is robust in a way tuning gap/padding buffers never was. Sits
   BELOW the front claw layer (z-index 2 here vs. 3 on
   .hero__cta-claw--front below) — the claw grips over the button's
   right end and the arrow, appearing to emerge from behind/under it,
   not floating on top of the claw's own artwork. */
.hero__cta-wrap .btn__arrow {
  position: absolute;
  top: 50%;
  right: 26px;
  transform: translateY(-50%);
  z-index: 2;
  color: var(--color-blush);
  pointer-events: none;
}

/* =========================================================
   Hero
   ========================================================= */

.hero {
  position: relative;
  /* Minus --nav-h (measured in js/hero-gallery.js, since .nav sits in
     normal flow above the hero on desktop, not overlaid) so the hero
     — and the photo strip pinned to its bottom edge below — fits
     entirely within the first viewport instead of running --nav-h's
     worth past the fold. Falls back to plain 100vh before that JS has
     measured anything (first paint, or JS disabled). */
  min-height: calc(100vh - var(--nav-h, 0px));
  display: flex;
  flex-direction: column;
  overflow: hidden;
  background: var(--color-blush);
}

/* Was: sticky-pinned while .menu (below) scrolled up over it. Removed —
   after today's hero rework (split→centered layout, height:100vh, several
   overflow changes) this was producing a stale/ghost repaint of the hero
   near the bottom of the page in Safari (a known position:sticky
   compositing bug that resurfaces after this kind of live CSS churn).
   Plain flow scrolling has no equivalent failure mode. */
#top.hero {
  position: relative;
}

/* ---------- Hero photo background (article/menu-type pages) ---------- */

.hero__bg {
  position: absolute;
  inset: 0;
  z-index: 0;
}

.hero__bg::after {
  content: "";
  position: absolute;
  inset: 0;
  background: rgba(11, 15, 11, 0.35);
}

.hero__bg img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  transform: scale(1.18);
  will-change: transform;
}

/* ---------- Hero photo strip (drag-to-scroll, js/hero-gallery.js) ---------- */
/* Replaces the floating mouse-parallax photos and, before that, the
   horizontal marquee and the 3D orbit: a plain edge-to-edge photo strip
   pinned along the bottom of the hero, no frames/radius/gaps between
   photos. Absolutely positioned (not a normal flex child) specifically
   so it doesn't disturb #top.hero's own centering of .hero__content
   below — that centering box gets a bottom padding matching
   --hero-gallery-h instead, so the two never overlap. Only the first
   three photos sit in view at rest; the rest of the (much longer) track
   only reveals itself if the visitor actually drags — mouse (the JS) or
   touch (native overflow scroll) — never on its own. */
.hero {
  --hero-gallery-h: clamp(280px, 42vh, 500px);
}

.hero {
  --hero-gallery-gap: 20px;
}

.hero__gallery {
  position: absolute;
  left: 0;
  right: 0;
  /* Lifted off the hero's bottom edge so a band of the blush hero
     background sits between the photo strip and whatever section comes
     next (the green menu block), on every screen size. */
  bottom: clamp(40px, 6vh, 72px);
  z-index: 1;
  height: var(--hero-gallery-h);
  /* Auto-scrolling marquee (was a drag-to-scroll strip) — the track
     animates itself. Clipped on BOTH axes with paint containment: the
     old overflow-x:clip / overflow-y:visible split let Safari's
     compositor paint the promoted, continuously-animating track outside
     this box, so tilted polaroid tiles bled through onto sections much
     further down the page. The items carry ~56px of vertical slack
     (see .hero__gallery-item) so their tilt and drop shadow still have
     clearance inside the clip. */
  overflow: hidden;
  contain: paint;
}

.hero__gallery.is-dragging {
  user-select: none;
}

/* One continuous right-to-left marquee. The item list is duplicated
   once in the markup (11 -> 22), so translateX(-50%) lands exactly on
   the seam and the loop is invisible — same trick as
   .testimonials-track. */
.hero__gallery-track {
  display: flex;
  align-items: center;
  height: 100%;
  width: max-content;
  gap: var(--hero-gallery-gap);
  animation: hero-gallery-scroll 55s linear infinite;
}

@media (hover: hover) and (pointer: fine) {
  .hero__gallery:hover .hero__gallery-track {
    animation-play-state: paused;
  }
}

@keyframes hero-gallery-scroll {
  from {
    transform: translateX(0);
  }
  to {
    transform: translateX(-50%);
  }
}

@media (prefers-reduced-motion: reduce) {
  .hero__gallery-track {
    animation: none;
  }
}

/* Cream polaroid mat around each photo — a wide bottom lip, the rest
   thin, plus a soft drop shadow and a small alternating tilt so the row
   reads as scattered prints rather than a filmstrip (mirrors the
   deployed hero's scattered polaroids, just marching in one row).
   Portrait print proportions, sized off the strip's own height so the
   whole row stays inside --hero-gallery-h. */
.hero__gallery-item {
  flex: 0 0 auto;
  /* Shorter than the strip so the ~2deg tilt and the drop shadow have
     clearance top and bottom now that .hero__gallery clips both axes.
     Was 56px (28px/side) — the shadow's own reach (14px offset + 30px
     blur ≈ 44px) plus the tilt's extra corner reach both exceeded that,
     visibly cropping the shadow at the top/bottom of the strip. */
  height: calc(100% - 90px);
  aspect-ratio: 172 / 232;
  width: auto;
  background: var(--color-cream);
  padding: 10px 10px 30px;
  border-radius: 2px;
  box-shadow: 0 14px 30px rgba(11, 15, 11, 0.22);
}

.hero__gallery-item:nth-child(even) {
  transform: rotate(-2deg);
}

.hero__gallery-item:nth-child(odd) {
  transform: rotate(1.6deg);
}

.hero__gallery-item--wide {
  aspect-ratio: 232 / 172;
}

.hero__gallery-item img {
  display: block;
  width: 100%;
  height: 100%;
  object-fit: cover;
  pointer-events: none;
  border-radius: 1px;
}

@media (min-width: 901px) {
  .hero {
    /* vw-based, not vh-based: the strip's item widths are already a
       fraction of 100vw (see .hero__gallery-item above), so tying the
       shared height to width too is what keeps each photo close to the
       reference's near-square crop instead of the shallow, heavily-
       cropped letterbox a vh-based height produced. */
    --hero-gallery-h: clamp(320px, 40vw, 540px);
  }
}

@media (min-width: 901px) {
  /* Centered column, not the old left-text/right-photo split: title,
     subtitle and button all center as one block, with .hero__gallery
     (position:absolute, pinned to the bottom edge, see above) sitting
     behind it rather than taking its own row — so it needs no flex
     order/sizing of its own. */
  /* #top scopes this to the homepage hero specifically — .hero--menu and
     .hero--article (menu/journal pages) share the bare .hero class but
     use a totally different (absolute-background) internal layout, and
     switching THEM to a column would have quietly broken their centering. */
  #top.hero {
    flex-direction: column;
    align-items: center;
    /* Was flex-start (+ a manual padding-top nudge) to sit the block
       close under the nav — switched to true centering, both axes, on
       request. .hero__content--home's own bottom padding
       (--hero-gallery-h) is what actually keeps the centered text clear
       of the pinned photo strip below it. */
    justify-content: center;
    /* min-height, not a flat height: floors the hero at one screen
       (100vh minus --nav-h, since .nav sits in normal flow above it on
       desktop, not overlaid — a flat 100vh here used to run --nav-h's
       worth past the actual viewport bottom, cropping .hero__gallery,
       which is pinned to *this* box's own bottom edge, out of the first
       screen). Left as min-height (not a fixed height) so a taller
       --hero-gallery-h can still grow the box past one screen instead of
       overflowing/clipping against a hard ceiling — the centered content
       then has no leftover slack to split top/bottom and sits flush at
       the top, which is also what raises it closer to the nav. --nav-h
       is measured in js/hero-gallery.js. */
    min-height: calc(100vh - var(--nav-h, 0px));
    overflow: visible;
  }

  /* #top (an id) + the class combo outranks the shared .hero__content
     rule (padding: 60px var(--gutter) 90px, further down this file) —
     .hero__content--home alone is the same specificity as .hero__content
     and appears earlier in the file, so plain .hero__content's padding
     was winning regardless of the value written here; that leftover 60px
     top padding was the actual cause of the big gap under the nav that
     "raise everything up" was really asking to close. */
  #top .hero__content--home {
    order: 1;
    position: relative;
    z-index: 2;
    flex: none;
    width: 100%;
    max-width: 720px;
    justify-content: flex-start;
    align-items: center;
    text-align: center;
    /* Bottom padding matches --hero-gallery-h so the block, still
       centered as a whole by #top.hero's own justify-content: center,
       settles above the pinned photo strip instead of behind it. */
    padding: 0 var(--gutter)
      calc(var(--hero-gallery-h) + clamp(40px, 6vh, 72px));
  }

  .hero__content--home .hero__stack {
    align-items: center;
    width: auto;
  }

  .hero__title-wrap {
    width: auto;
  }

  .hero__title {
    text-align: center;
    /* Smaller than the old full-width size on purpose: even centered,
       84px still wrapped "Bistro & Bar" onto two lines at this width.
       Scales back up past 1300px once there's room for it again. */
    font-size: var(--text-4xl);
    letter-spacing: -2.4px;
  }
}

@media (min-width: 1300px) {
  /* .hero__title itself no longer grows past its own base rule (76px,
     see above) at wide viewports — this used to bump it back up to 84px
     here, silently undoing the recent shrink-it-down request every time
     the viewport crossed 1300px. .site-footer__brand-text still needs
     its own explicit size (ported from .intro__text's own matching
     override, deliberately kept in sync with the old hero size). */
  .site-footer__brand-text {
    font-size: 84px;
    letter-spacing: -3.76px;
  }
}

/* ---------- Nav ---------- */

.nav {
  /* Was 50 — lower than the cards' own z-index (56, and events cards go
     higher still via --z), so the sticky header was getting covered by
     card content scrolling underneath it. Above everything but the
     kinetic-menu overlay (100) and the load-in intro (400). */
  z-index: 90;
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 24px;
  width: 100%;
  background: var(--color-green);
  padding: 16px 20px;
}

.nav__logo {
  order: 2;
  /* Stays clickable above the open kinetic-menu overlay too — see the
     matching note on .nav-menu-btn. */
  position: relative;
  z-index: 101;
}

.nav__logo img {
  height: 29px;
  width: auto;
}

.lang-switch {
  background: none;
  border: none;
  font: inherit;
  color: inherit;
  letter-spacing: inherit;
  cursor: pointer;
  padding: 0;
}

/* Not sticky on the homepage (on request) — inner pages keep the pinned
   header (see the same selector in css/style-pages.css). */
.nav,
.nav--on-light {
  position: static;
}

/* =========================================================
   Kinetic menu (fullscreen)
   ========================================================= */

.nav-menu-btn {
  /* .nav__logo carries order:2 from the old 3-column nav layout (still
     used elsewhere) — order:3 keeps this button to its right regardless. */
  order: 3;
  /* .kinetic-menu sits at z-index:100 and, once open, fully covers the
     header underneath it — without this the toggle would be hidden
     behind the very panel it needs to close. */
  position: relative;
  z-index: 101;
  display: flex;
  align-items: center;
  gap: 10px;
  background: none;
  border: none;
  /* The visible icon is only 20x13px — well under the 44x44 minimum
     touch-target size (WCAG 2.5.8). Padding + matching negative margin
     grows the invisible hit area without moving the icon or affecting
     surrounding header layout. */
  padding: 16px 12px;
  margin: -16px -12px;
  cursor: pointer;
  color: var(--color-blush);
  font-family: var(--font-mono);
  font-weight: 300;
  font-size: var(--text-sm);
  letter-spacing: -0.8px;
  text-transform: uppercase;
  transition: opacity 0.3s ease;
}

/* .nav-menu-btn__icon is a deliberately small 20x13px visual, but the
   clickable area needs to meet the ~44px touch-target minimum — a
   pseudo-element hit zone grows the tap area without affecting layout
   or the icon's apparent size. */
.nav-menu-btn::before {
  content: "";
  position: absolute;
  top: 50%;
  left: 50%;
  width: 44px;
  height: 44px;
  transform: translate(-50%, -50%);
}

/* The homepage hero now sits on a light cream backdrop (marquee + plain
   background) instead of a dark photo, so blush no longer reads there —
   every other page still has a dark green/photo hero, where it does. */
.nav--on-light .nav-menu-btn,
.nav--on-light .nav-menu-btn__icon {
  color: var(--color-green);
}

.nav--on-light {
  z-index: 50;
  background: var(--color-blush);
  padding: 16px 20px;
}

/* .nav__links already exists in the markup on every page (menu.html,
   events.html, journal.html share it) but was never actually styled —
   it fell back to plain wrapped inline text. Styling it here is a
   straight improvement everywhere it appears, not a homepage-only
   change; only the 3-column centered-logo arrangement below is scoped
   to .nav--on-light specifically. Hidden under 901px on every page —
   the hamburger/kinetic-menu is the mobile nav everywhere already. */
.nav__links,
.nav__meta {
  display: none;
}

/* Mobile header layout, on request: logo centered, language switch on
   the left, hamburger on the right — a 3-column grid (not the flex row
   used elsewhere) so the logo lands at the true center regardless of
   how wide the lang-switch text or hamburger icon render, rather than
   the off-center result plain flex space-between would give with two
   unevenly-sized side items. */
@media (max-width: 900px) {
  .nav,
  .nav--on-light {
    display: grid;
    grid-template-columns: 1fr auto 1fr;
    align-items: center;
  }

    .nav__meta {
    display: flex;
    grid-column: 1;
    justify-self: start;
    font-family: var(--font-mono);
    font-weight: 300;
    font-size: var(--text-sm);
    letter-spacing: -0.4px;
  }

  /* Only the language switch shows in the mobile header bar — the phone
     number stays reachable from the kinetic menu instead. */
  .nav__meta a:not(.lang-switch) {
    display: none;
  }

  .nav__logo {
    grid-column: 2;
    justify-self: center;
  }

  .nav-menu-btn {
    grid-column: 3;
    justify-self: end;
  }
}

@media (min-width: 901px) {
  .nav-menu-btn {
    display: none;
  }

  .nav__links {
    display: flex;
    align-items: center;
    gap: 28px;
    font-family: var(--font-mono);
    font-weight: 300;
    font-size: var(--text-sm);
    letter-spacing: -0.4px;
    text-transform: uppercase;
  }

  .nav__links-link {
    color: inherit;
    text-decoration: none;
    transition: opacity 0.25s ease;
  }

  .nav__links-link:hover {
    opacity: 0.6;
  }

  .nav__meta {
    display: flex;
    align-items: center;
    gap: 24px;
    font-family: var(--font-mono);
    font-weight: 300;
    font-size: var(--text-sm);
    letter-spacing: -0.4px;
  }

  .nav__meta a {
    color: inherit;
    text-decoration: none;
    transition: opacity 0.25s ease;
  }

  .nav__meta a:hover {
    opacity: 0.6;
  }

  /* Homepage header only: links left, phone/language right, logo
     dead-center regardless of how wide those two columns end up — a
     plain flex justify-content:space-between only centers a middle
     child when both side columns happen to match in width, a 3-column
     grid centers it unconditionally. grid-column is set explicitly on
     all three (not left to DOM-order auto-placement) because .nav__logo
     already carries order:2 from the older flex nav layout above —
     order affects grid auto-placement too, so without an explicit
     column the logo was sorting itself into the last track instead of
     the middle one. */
  .nav--on-light {
    display: grid;
    /* max-content, not auto — auto was computing the logo's column to
       0 width (confirmed by testing: swapping in a fixed px width made
       it render correctly, swapping in max-content did too). The SVG
       logo has no explicit width/height of its own (only a viewBox),
       and combined with the sitewide img{max-width:100%} reset, Chrome's
       auto-track intrinsic-size pass was resolving that column's
       content contribution to 0 instead of the logo's real max-content
       size — max-content sidesteps whatever that auto-specific
       computation was doing wrong. */
    grid-template-columns: 1fr max-content 1fr;
    /* start, not center — the logo and the text items don't share a
       line-height/box-model, so centering each in the row gave them
       different top offsets from the screen edge; aligning all three
       to the row's own top edge instead means they all sit the same
       distance down, logo included. */
    align-items: start;
    /* Tighter than the shared 16px/20px base (mobile keeps that) — she
       asked to raise the logo higher in the header; a shorter bar is
       what actually does that, not repositioning the logo within it. */
    padding: 10px 20px;
  }

  .nav--on-light .nav__links {
    grid-column: 1;
    justify-self: start;
    color: var(--color-green);
  }

  .nav--on-light .nav__logo {
    grid-column: 2;
    /* order:0, resetting the old order:2 from the flex nav layout above
       — that's the actual reason align-items:start still put the logo
       ~45px lower than the links/meta text. Sparse (default) grid auto-
       placement processes items in `order` order, not DOM order; with
       links/meta at order 0 (columns 1 and 3) and the logo at order 2
       (column 2), the logo got processed last, and the sparse-packing
       cursor had already advanced past column 2 by the time it got to
       it — so instead of backfilling that skipped cell in row 1, it
       pushed the logo into a whole second implicit row. Nothing to do
       with align-items at all. */
    order: 0;
    justify-self: center;
  }

  .nav--on-light .nav__meta {
    grid-column: 3;
    justify-self: end;
    color: var(--color-green);
  }
}

.nav-menu-btn__icon {
  display: flex;
  flex-direction: column;
  justify-content: center;
  gap: 4px;
  width: 20px;
  height: 13px;
  color: var(--color-blush);
}

.nav-menu-btn__line {
  display: block;
  width: 100%;
  height: 1.5px;
  background: currentColor;
  border-radius: 2px;
  transition: transform 0.4s cubic-bezier(0.65, 0.05, 0, 1);
}

/* The open panel has its own always-visible close button (fixed, so it
   works regardless of scroll position); this one would otherwise double
   up with it as a second X in the same corner whenever the page hasn't
   scrolled, so it hides instead of morphing while the menu is open. */
.nav-menu-btn[aria-expanded="true"] {
  opacity: 0;
  pointer-events: none;
}

.kinetic-menu {
  position: fixed;
  inset: 0;
  z-index: 100;
  display: none;
}

.kinetic-menu__overlay {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  background: rgba(11, 15, 11, 0.4);
  border: none;
  padding: 0;
  cursor: pointer;
  opacity: 0;
}

.kinetic-menu__panel {
  position: absolute;
  top: 0;
  right: 0;
  bottom: 0;
  width: min(640px, 100%);
  overflow: hidden;
  /* Closed-state offset is set by GSAP (see js/main.js) instead of here —
     GSAP can't tell a percentage translate in a resolved matrix() apart
     from a plain pixel one, so if CSS sets it, GSAP's xPercent tweens
     silently no-op against a stale cached pixel value. */
}

/* Blush Pinch wordmark, top-left of the open menu (close button stays
   top-right, its own corner). Links back to the homepage. */
.kinetic-menu__logo {
  position: absolute;
  top: 24px;
  left: 24px;
  z-index: 2;
  display: block;
}

.kinetic-menu__logo img {
  display: block;
  width: 84px;
  height: auto;
}

.kinetic-menu__close {
  /* Lives inside .kinetic-menu__panel, which is position:fixed via its
     .kinetic-menu ancestor, so it stays visible regardless of page scroll
     position — unlike the header's own nav-menu-btn, which scrolls with
     the page and can end up off-screen behind the open overlay. */
  position: absolute;
  top: 24px;
  right: 24px;
  z-index: 2;
  display: flex;
  align-items: center;
  justify-content: center;
  width: 32px;
  height: 32px;
  background: none;
  border: none;
  padding: 0;
  cursor: pointer;
  color: var(--color-cream);
}

.kinetic-menu__close-line {
  position: absolute;
  width: 16px;
  height: 1.5px;
  background: currentColor;
  border-radius: 2px;
}

.kinetic-menu__close-line:nth-child(1) {
  transform: rotate(45deg);
}

.kinetic-menu__close-line:nth-child(2) {
  transform: rotate(-45deg);
}

.kinetic-menu__bg {
  position: absolute;
  inset: 0;
}

.kinetic-menu__backdrop {
  position: absolute;
  inset: 0;
}

.kinetic-menu__backdrop--accent {
  background: var(--color-accent);
}

.kinetic-menu__backdrop--blush {
  background: var(--color-blush);
}

.kinetic-menu__backdrop--main {
  background: var(--color-green);
}

.kinetic-menu__content {
  position: relative;
  z-index: 1;
  display: flex;
  flex-direction: column;
  height: 100%;
  padding: 140px 60px 60px;
}

.kinetic-menu__list {
  display: flex;
  flex-direction: column;
  /* Centers the list in whatever room is left above .kinetic-menu__meta
     (an auto margin on both sides splits the leftover space evenly),
     instead of sitting flush under the logo with all the free space
     dumped below it before the phone/lang row. */
  margin-top: auto;
  margin-bottom: auto;
}

.kinetic-menu__item {
  border-bottom: 1px dashed rgba(242, 236, 227, 0.25);
}

.kinetic-menu__item:first-child {
  border-top: 1px dashed rgba(242, 236, 227, 0.25);
}

.kinetic-menu__link {
  position: relative;
  display: block;
  padding: 20px 0;
  text-decoration: none;
}

.kinetic-menu__link-mask {
  display: block;
  overflow: hidden;
}

.kinetic-menu__link-text {
  display: block;
  font-family: var(--font-display);
  font-weight: 300;
  font-size: clamp(2.25rem, 5.5vw, 3.75rem);
  letter-spacing: -0.02em;
  line-height: var(--leading-tight);
  color: var(--color-cream);
  text-transform: uppercase;
  transition: color 0.35s ease;
}

.kinetic-menu__item:hover .kinetic-menu__link-text {
  color: var(--color-blush);
}

.kinetic-menu__meta {
  display: flex;
  align-items: center;
  /* Phone bottom-left, EN/PT pushed to the far bottom-right corner
     instead of sitting right next to it. */
  justify-content: space-between;
  width: 100%;
  gap: 24px;
  font-family: var(--font-mono);
  font-weight: 300;
  font-size: var(--text-sm);
  color: rgba(242, 236, 227, 0.7);
}

.kinetic-menu__meta a {
  color: inherit;
  text-decoration: none;
}

.kinetic-menu__meta a:hover {
  color: var(--color-cream);
}

@media (max-width: 600px) {
  .kinetic-menu__panel {
    width: 100%;
  }

  .kinetic-menu__content {
    padding: 110px 24px 40px;
  }
}

/* ---------- Hero content ---------- */

.hero__content {
  position: relative;
  z-index: 1;
  flex: 1;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  text-align: center;
  padding: 60px var(--gutter) 90px;
}

.hero__content--home {
  /* This box is flex:1 and stretches the full height of .hero, so on
     mobile it sits (invisibly, transparently) directly over the marquee
     below it — which sits at a lower z-index — and was swallowing every
     touch before it could reach the marquee's own scroll container.
     Turned back on just for the button so it stays clickable. */
  pointer-events: none;
}

@media (max-width: 900px) {
  /* Mobile hero: no forced full-screen height, and the photo strip
     flows in normal document order right under the content instead of
     being absolutely pinned to the hero's bottom edge — the absolute
     version needed the content box to "reserve" ~400px of bottom
     padding for it, which showed as a huge dead band whenever the strip
     didn't fill that reservation. Static flow + a small gap is
     self-correcting. */
  #top.hero,
  .hero--home {
    min-height: auto;
  }

  #top .hero__content--home {
    justify-content: flex-start;
    padding: 24px var(--gutter) 0;
  }

  #top .hero__gallery {
    position: static;
    flex-shrink: 0;
    width: 100%;
    height: var(--hero-gallery-h);
    margin-top: clamp(24px, 5vh, 44px);
  }
}

.hero__content--home a,
.hero__content--home button {
  pointer-events: auto;
}

.hero__stack {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 30px;
  width: fit-content;
}

/* Wraps the heading, subtitle, and CTA button as one full-width block so
   they can each center independently within it, without disturbing the
   heading's own line-reveal animation. */
.hero__title-wrap {
  position: relative;
  width: 100%;
}

@media (min-width: 901px) {
  /* More breathing room under the nav logo — was reading tight now that
     .nav sits in normal flow right above the hero (no longer sticky/
     overlaid) on the homepage. */
  .hero__content--home .hero__title-wrap {
    margin-top: 32px;
  }
}

/* Sized to the button itself (not the heading), so the claw flourish
   —positioned relative to this wrap below— always tracks the button
   exactly regardless of where the wrap ends up on the page. */
.hero__cta-wrap {
  position: relative;
  width: fit-content;
}

/* .hero__title-wrap isn't a flex container, so a plain fit-content block
   box (the button) defaults to its container's left edge — .hero__content
   --home's own align-items only centers .hero__stack itself, one level
   up, not stack's individual grandchildren. Scoped to the homepage hero
   specifically so other .hero__cta-wrap usages (the closing CTA, the
   statement section) — some of them inside real flex rows, where a bare
   margin:auto would consume space differently — are unaffected. */
.hero__content--home .hero__cta-wrap {
  margin: 0 auto;
}

@media (min-width: 901px) {
  /* Overrides the old split-layout's own .hero__cta-wrap{margin:104px 0 0}
     (elsewhere in this file, lower specificity) — that gap was tuned for
     a much taller two-column hero; the button now sits right under a
     single centered subtitle line, so it reads tight rather than
     deliberate at 104px. */
  .hero__content--home .hero__cta-wrap {
    /* 28px was too tight — the claw graphic's own artwork extends above
       the button's real top edge, so the button visually touched the
       subtitle text above it even with a positive gap here. */
    margin-top: 44px;
  }
}

.hero__cta-claw {
  display: block;
  position: absolute;
  /* Both layers (back and front — see the two SVG files this class is
     used on) come from one reference artwork where the button itself
     is also drawn in: canvas 269×228, with the button rect at
     x:0-186, y:75-145.

     Sized and positioned in PERCENT, not pixels, for width and right —
     percentages on an absolutely-positioned element's width/left/right
     resolve against its containing block's width, which here
     (.hero__cta-wrap is position:relative, width:fit-content around
     just the button) is exactly the button's own real rendered width.
     A fixed-px width tuned for one button width (e.g. English "Book
     Now") comes out wrong for any other width — Portuguese "Reservar
     Agora" is meaningfully wider, and even the same label reflows
     differently across weights/breakpoints — so the claw either
     swallowed half the label or gapped visibly short of the button's
     actual edge. Percent-of-container keeps both the overall size and
     the right-edge anchor proportional to whatever the button actually
     measures, in any language, with no per-language override needed:
       width: 269/186 × 100%       ≈ 144.62%
       right: -(83/186) × 100%     ≈ -44.62%  (83 = 269 − 186: how much
         wider the canvas is than the button, on the button's right) —
         then nudged a further ~3% right on request (≈6px on the
         English button), landing at -47.65%.
     top used to stay in a fixed px (the button's own height doesn't
     vary with label text the way width does) — but the CLAW's height
     does, since it's width:144.62% + height:auto: a wider button (e.g.
     Portuguese "Reservar Agora") makes the claw both wider AND taller,
     so a constant px top offset left it hanging further below the
     button on any label longer than the English one it was tuned for.
     margin-top instead of top sidesteps that: percentage margins
     (unlike percentage top/bottom) resolve against the CONTAINING
     BLOCK'S WIDTH per spec, the same basis width/right already use
     above — so this scales in step with the claw's own width-driven
     size instead of a fixed offset. -37.445% is -74px ÷ the English
     button's ~197.6px width, at the same nudged-down-~20px position
     the original px value described. */
  top: 0;
  margin-top: -37.445%;
  right: -47.65%;
  width: 144.62%;
  height: auto;
  max-width: none;
  pointer-events: none;
}

/* Portuguese labels ("Reservar Agora" etc.) run wider relative to the
   claw's own percent-of-button sizing than the English ones this was
   tuned against, so the claw sat far enough left to cover the label's
   last letters — nudged further right (more negative) here to clear
   it, on request. */
html[lang="pt"] .hero__cta-claw {
  right: -52%;
}

/* Above the arrow (z-index 2 there) — the front claw grips over the
   button's right end and the arrow should read as emerging from
   under/behind it, not floating on top of the claw's own artwork. */
.hero__cta-claw--front {
  z-index: 3;
}

/* THE LAYER STACK, made explicit so every claw button "holds" the way
   the hero one does — back claw tucked BEHIND the button, button above
   it, arrow + front claw gripping OVER the button's right end:
     back claw   z 0
     button      z 1
     arrow       z 2  (.hero__cta-wrap .btn__arrow)
     front claw  z 3
   Previously the button was position:static and painted beneath the
   absolutely-positioned back claw, so on every instance EXCEPT the hero
   (whose .reveal transform happened to lift it into the positioned
   layer) the claw just covered the label instead of holding it. */
.hero__cta-claw--back {
  z-index: 0;
}

.hero__cta-wrap .btn,
.hero__cta-wrap .btn--hero {
  position: relative;
  z-index: 1;
}

/* The whole button+claw graphic tilts as one rigid piece — left edge
   lifts up, pivoting around the claw side. 0.3s to match the Figma
   prototype's reaction transition. Hover drives it on desktop;
   `.is-tilted` (toggled by js/main.js on click/tap) drives the same
   motion on touch devices, where there's no real hover to trigger it. */
.hero__cta-wrap {
  transition: transform 0.3s ease;
}

@media (min-width: 901px) {
  .hero__cta-wrap {
    margin: 104px 0 0;
  }

  .hero__cta-wrap:hover,
  .hero__cta-wrap.is-tilted {
    transform: translate(10px, -28px) rotate(10deg);
  }

  /* Homepage hero button only, a touch smaller — scale (not a real
     padding/font-size shrink) so the claw+arrow geometry tuned against
     the button's own rendered size stays intact, same approach already
     used for this exact button at mobile width below. */
  .hero__content--home .hero__cta-wrap {
    transform: scale(0.9);
  }

  .hero__content--home .hero__cta-wrap:hover,
  .hero__content--home .hero__cta-wrap.is-tilted {
    transform: scale(0.9) translate(10px, -28px) rotate(10deg);
  }
}

@media (max-width: 900px) {
  /* Centers the button under the heading (it isn't flex-centered by its
     own parent — .hero__title-wrap is full-width, not a flex container —
     and gives it clearance from the heading above it). No tilt on tap
     here (removed on request) — .is-tilted (see js/main.js) simply has
     no matching rule below 901px now, so toggling the class on mobile
     is a no-op. */
  .hero__cta-wrap {
    margin: 40px auto 0;
    transform: scale(0.82);
  }
}

.hero__title {
  font-family: var(--font-display);
  font-weight: 300;
  color: var(--color-green);
  text-transform: uppercase;
  /* A touch smaller than --text-5xl (84px) — own value, not the shared
     token, since --text-5xl is also used by .menu-page__heading
     elsewhere. */
  font-size: 76px;
  line-height: var(--leading-tight);
  letter-spacing: -3px;
}

.hero__title .line {
  display: block;
  overflow: hidden;
}

.hero__title .line__inner {
  display: block;
  transform: translateY(110%);
  opacity: 0;
  transition:
    transform 0.9s cubic-bezier(0.16, 0.84, 0.44, 1),
    opacity 0.9s cubic-bezier(0.16, 0.84, 0.44, 1);
}

.hero__title-group .line:nth-child(1) .line__inner {
  transition-delay: 0.1s;
}
.hero__title-group .line:nth-child(2) .line__inner {
  transition-delay: 0.22s;
}
.hero__title-em .line__inner {
  transition-delay: 0.34s;
}

.hero__title--anim.is-ready .line__inner {
  transform: translateY(0);
  opacity: 1;
}

/* ---------- Generic scroll-triggered per-line text reveal ---------- */
.text-reveal .line {
  display: block;
  overflow: hidden;
  /* Headroom on all sides so tall/italic glyphs (serif overshoot, e.g. a
     swashed "R") don't get clipped by the mask; the negative margin
     cancels the added space so the line's own position/width doesn't
     shift. */
  padding: 0.15em 0.06em;
  margin: -0.15em -0.06em;
}

.text-reveal .line__inner {
  display: block;
  transform: translateY(110%);
  opacity: 0;
  transition:
    transform 0.9s cubic-bezier(0.16, 0.84, 0.44, 1),
    opacity 0.9s cubic-bezier(0.16, 0.84, 0.44, 1);
}

.text-reveal .line:nth-child(2) .line__inner {
  transition-delay: 0.12s;
}

.text-reveal.is-visible .line__inner {
  transform: translateY(0);
  opacity: 1;
}

@media (prefers-reduced-motion: reduce) {
  .text-reveal .line__inner {
    transition: none !important;
    transform: none !important;
    opacity: 1 !important;
  }
}

.reveal {
  opacity: 0;
  transform: translateY(28px);
  transition:
    opacity 0.8s cubic-bezier(0.16, 0.84, 0.44, 1),
    transform 0.8s cubic-bezier(0.16, 0.84, 0.44, 1);
  will-change: opacity, transform;
}

.reveal.is-visible {
  opacity: 1;
  transform: translateY(0);
}

/* Component-family variants on top of the shared .reveal scaffolding
   (main.js's IntersectionObserver still just watches for .reveal — these
   compound selectors are naturally more specific than the plain-class
   rules above and override them, no markup or JS changes needed).
   Previously every eyebrow, card and button on the site got the exact
   same rise-and-fade — one shared entrance for unrelated kinds of
   content is what made the site read as templated. Each family gets an
   entrance that fits what it actually is instead. */

/* Eyebrows: a quick settle in tracking instead of a vertical rise — labels
   don't have anywhere to "rise" from, they just come into focus. */
.eyebrow.reveal {
  transform: none;
  letter-spacing: 0.08em;
  transition:
    opacity 0.5s cubic-bezier(0.16, 1, 0.3, 1),
    letter-spacing 0.6s cubic-bezier(0.16, 1, 0.3, 1);
}

.eyebrow.reveal.is-visible {
  letter-spacing: -1.6px;
}

/* Cards (records, events, journal, testimonials): settle into place with
   a touch of scale, not just a straight-up rise — reads as an object
   arriving, not a paragraph fading in. */
.vinyl__item.reveal,
.event-card.reveal,
.testimonial-card.reveal {
  transform: translateY(28px) scale(0.97);
}

.vinyl__item.reveal.is-visible,
.event-card.reveal.is-visible,
.testimonial-card.reveal.is-visible {
  transform: translateY(0) scale(1);
}

/* Buttons: no scroll-reveal at all. A CTA is rarely the thing worth
   staging a reveal moment around, and hiding it briefly on scroll-in
   only delays the one thing a visitor might actually be looking for. */
.btn.reveal {
  opacity: 1;
  transform: none;
  transition: none;
}

/* FAQ questions: a staircase cascade, not a straight rise — each row
   slides in from the right while the rows below it are still held back,
   so the list reads top-to-bottom, right-to-left, one step at a time. */
.faq-item.reveal {
  opacity: 0;
  transform: translateX(56px);
  transition:
    opacity 0.6s cubic-bezier(0.16, 1, 0.3, 1),
    transform 0.6s cubic-bezier(0.16, 1, 0.3, 1);
}

.faq-item.reveal.is-visible {
  opacity: 1;
  transform: translateX(0);
}

/* The side-slide above is a desktop-only flourish (room for a horizontal
   cascade needs the wide two-column layout) — on a narrow single column
   it just reads as everything sliding in 56px too far right, throwing
   .faq-item off the same left line the Journal cards and footer line up
   on. Rise-and-fade instead, matching every other .reveal on the page. */
@media (max-width: 900px) {
  .faq-item.reveal {
    transform: translateY(28px);
  }

  .faq-item.reveal.is-visible {
    transform: translateY(0);
  }
}

.faq__list .faq-item:nth-child(1) {
  transition-delay: 0s;
}
.faq__list .faq-item:nth-child(2) {
  transition-delay: 0.07s;
}
.faq__list .faq-item:nth-child(3) {
  transition-delay: 0.14s;
}
.faq__list .faq-item:nth-child(4) {
  transition-delay: 0.21s;
}
.faq__list .faq-item:nth-child(5) {
  transition-delay: 0.28s;
}
.faq__list .faq-item:nth-child(6) {
  transition-delay: 0.35s;
}
.faq__list .faq-item:nth-child(7) {
  transition-delay: 0.42s;
}
.faq__list .faq-item:nth-child(8) {
  transition-delay: 0.49s;
}
.faq__list .faq-item:nth-child(9) {
  transition-delay: 0.56s;
}
.faq__list .faq-item:nth-child(10) {
  transition-delay: 0.63s;
}

@media (prefers-reduced-motion: reduce) {
  .hero__title .line__inner,
  .reveal {
    transition: none !important;
    transform: none !important;
    opacity: 1 !important;
  }
}

.hero__title em,
.hero__title-em em {
  font-style: italic;
  text-transform: uppercase;
}

.hero__subtitle {
  font-family: var(--font-mono);
  font-weight: 300;
  font-size: var(--text-sm);
  line-height: var(--leading-normal);
  letter-spacing: -0.3px;
  color: var(--color-green);
  opacity: 0.82;
  max-width: 380px;
  /* auto left/right, not 0 — .hero__title-wrap isn't a flex container,
     so a max-width block box here defaults to its container's left edge
     without this; text-align only centers the text inside the box, not
     the box itself. */
  margin: 16px auto 0;
  text-align: center;
}

/* Was hidden entirely (old copy just reflowed naturally, no forced
   break needed) — the current copy wants a specific break so "and"
   never ends up alone at the end of the first line; the one <br> in
   the markup, right before "and", now renders. */

@media (min-width: 901px) {
  /* text-align:left here is a leftover from the old left-text/right-
     photo split hero (see #top.hero above, now a centered column) —
     .hero__content--home sets text-align:center on desktop now, but
     this rule targets .hero__subtitle directly, so it was winning over
     the inherited value regardless of source order. */
  .hero__subtitle {
    max-width: 460px;
    margin: 24px auto 0;
    text-align: center;
    font-size: var(--text-base);
  }
}

@media (max-width: 900px) {
  /* Centred hero copy on mobile, on request (was left / right split). */
  .hero__title-group {
    text-align: center;
  }

  .hero__title-em {
    text-align: center;
    /* small breathing room so the italic flourish isn't clipped by the
       reveal mask's overflow:hidden */
    padding-right: 6px;
  }

  .hero__subtitle {
    text-align: center;
    max-width: 480px;
    margin-left: auto;
    margin-right: auto;
    /* Matches the mobile body-text size used elsewhere on the site
       (e.g. .journal-entry__excerpt), on request. */
    font-size: 14px;
  }
}

/* =========================================================
   Menu index (category list left, swap-on-hover photo right) — was a
   scroll-pinned spinning-plate carousel, then a click-driven version of
   the same, then a dark-green panel with a photo trailing the cursor;
   client feedback settled on this instead: a plain cream list beside one
   tall photo, that photo crossfading to the hovered category's own cover
   shot (js/menu-index.js, from the same JSON data the rows come from,
   never duplicated by hand). No hover on touch, so the photo panel is
   simply hidden on mobile and the list runs full width — see the media
   query at the bottom.
   ========================================================= */

/* Dark-green panel with blush text — the section's own colour moment,
   restored on request (it briefly matched the blush panel the rest of
   the light sections use). Coral stays the accent for the active row;
   the CTA switches to a blush outline so it reads on the green. */
.menu-index {
  position: relative;
  /* Plain solid green — the coral-pattern watermark was tried here and
     reverted on request. */
  background: var(--color-green);
  padding: var(--space-13) var(--gutter);
}

/* Mobile-only "View All Tracklists" link just above the Journal block —
   desktop doesn't get it. Used to be a second claw Book Now button here
   (redundant with the events teaser's own one above it). */
.pre-journal-cta {
  display: none;
}

@media (max-width: 900px) {
  .pre-journal-cta {
    display: flex;
    justify-content: center;
    background: var(--color-blush);
    padding: 28px var(--gutter) 34px;
  }
}

.menu-index .eyebrow {
  color: var(--color-blush);
}

.menu-index__inner {
  max-width: var(--page-max);
  margin: 0 auto;
}

.menu-index__header {
  text-align: center;
  margin-bottom: var(--space-9);
}

/* "MENU" styled the same as the category names in the list below it
   (.menu-index__row-name) + italic — was the plain small-caps .eyebrow
   treatment shared with every other section label on the site.
   Scoped to this one instance, not a change to .eyebrow itself. */
.menu-index__eyebrow {
  /* Color comes from the existing .menu-index .eyebrow rule (blush, for
     contrast on this section's green background) — that selector's
     higher specificity wins regardless, not overridden here. */
  font-family: var(--font-display);
  font-weight: 300;
  font-style: italic;
  font-size: clamp(32px, 4.2vw, 58px);
  line-height: 1;
  letter-spacing: -1.2px;
  text-transform: uppercase;
}

@media (max-width: 900px) {
  .menu-index__eyebrow {
    font-size: clamp(28px, 8.6vw, 40px);
  }
}

.menu-index__heading {
  margin: 0;
  font-family: var(--font-display);
  font-weight: 300;
  font-size: var(--text-heading);
  line-height: var(--leading-tight);
  letter-spacing: -2.4px;
  text-align: center;
  text-transform: uppercase;
  color: var(--color-blush);
}

.menu-index__heading em {
  font-style: italic;
  text-transform: uppercase;
}

/* List left, one tall photo right — align-items stretch (the default)
   is what makes the photo column match the list's own height without
   either needing a hardcoded number. */
.menu-index__panel {
  position: relative;
  display: grid;
  grid-template-columns: 1.15fr 1fr;
  gap: var(--gutter);
}

.menu-index__list {
  list-style: none;
  margin: 0;
  padding: 0;
}

.menu-index__row {
  border-top: 1px solid rgba(252, 222, 225, 0.35);
}

/* Scroll-in: the FAQ questions' staircase cascade, reused verbatim —
   each row slides in from the right (rise-and-fade on narrow screens
   where there's no room for the horizontal slide), held one step behind
   the row above via a per-row delay set from JS (--row-i). js/menu-index.js
   adds .reveal alongside this so main.js's shared observer flips
   .is-visible. */
.menu-index__row--reveal {
  opacity: 0;
  /* Shorter throw + the site's smoother expo-out curve (was 56px on a
     snappier 0.16/1/0.3 curve) — reads as a gentle settle-in rather
     than a slide. */
  transform: translateX(36px);
  transition:
    opacity 0.9s cubic-bezier(0.22, 1, 0.36, 1),
    transform 0.9s cubic-bezier(0.22, 1, 0.36, 1);
  transition-delay: calc(var(--row-i, 0) * 0.06s);
}
.menu-index__row--reveal.is-visible {
  opacity: 1;
  transform: translateX(0);
}
@media (max-width: 900px) {
  .menu-index__row--reveal {
    transform: translateY(28px);
  }
  .menu-index__row--reveal.is-visible {
    transform: translateY(0);
  }
}
@media (prefers-reduced-motion: reduce) {
  .menu-index__row--reveal {
    opacity: 1;
    transform: none;
    transition: none;
  }
}

.menu-index__row:last-child {
  border-bottom: 1px solid rgba(252, 222, 225, 0.35);
}

/* Dashed, not solid, between rows specifically — the list's own
   top/bottom edge (above) stays solid so the block still reads as one
   contained shape; only the seams between rows get the lighter, more
   casual dashed treatment. */
.menu-index__row:not(:first-child) {
  border-top-style: dashed;
  border-top-color: rgba(252, 222, 225, 0.3);
}

.menu-index__row-link {
  position: relative;
  display: flex;
  align-items: baseline;
  gap: 16px;
  padding: 20px var(--gutter) 20px 0;
  text-decoration: none;
  /* Every row reads at full blush until the visitor actually picks one
     — no auto-highlighted default. Only once a row has been chosen
     (js/menu-index.js flags the list .is-selecting) do the others drop
     back to a muted blush so the picked one stands out. */
  color: var(--color-blush);
  transition: color 0.45s cubic-bezier(0.22, 1, 0.36, 1);
}

.menu-index__list.is-selecting .menu-index__row-link {
  color: color-mix(in srgb, var(--color-blush) 48%, transparent);
}

.menu-index__list.is-selecting
  .menu-index__row.is-active
  .menu-index__row-link {
  color: var(--color-blush);
}

.menu-index__list.is-selecting
  .menu-index__row.is-active
  .menu-index__row-name {
  font-style: italic;
}

.menu-index__row-name {
  font-family: var(--font-display);
  font-weight: 300;
  font-size: clamp(32px, 4.2vw, 58px);
  line-height: 1;
  letter-spacing: -1.2px;
  text-transform: uppercase;
  white-space: nowrap;
}

.menu-index__row-name em {
  font-style: italic;
}

.menu-index__row-note {
  font-family: var(--font-mono);
  font-weight: 300;
  font-size: var(--text-xs);
  letter-spacing: 0.2px;
  color: color-mix(in srgb, var(--color-blush) 62%, transparent);
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}

.menu-index__list.is-selecting .menu-index__row-note {
  color: color-mix(in srgb, var(--color-blush) 34%, transparent);
}

.menu-index__list.is-selecting
  .menu-index__row.is-active
  .menu-index__row-note {
  color: color-mix(in srgb, var(--color-blush) 78%, transparent);
}

/* Two stacked layers crossfade (js/menu-index.js swaps whichever is
   hidden, then flips which one carries .is-active) instead of an abrupt
   src change. */
.menu-index__photo {
  position: relative;
  border-radius: 2px;
  /* Polaroid mat. overflow:hidden used to live on this same element —
     harmless in theory (it only clips content escaping the padding
     box, never the box's own background/padding), but moved to
     .menu-index__photo-inner below anyway so the mat is guaranteed
     unclipped by construction, not just by spec. Padding bumped up a
     lot (was 10/10/30 — barely a sliver at this photo's actual render
     size, reading as almost no frame at all) and a slight rotation
     added so it unmistakably reads as a print, not a color swatch
     behind the photo. */
  background: var(--color-cream);
  padding: 22px 22px 56px;
  box-shadow: 0 18px 40px rgba(11, 15, 11, 0.28);
  transform: rotate(-1.4deg);
}

.menu-index__photo-inner {
  position: relative;
  overflow: hidden;
  border-radius: 1px;
  width: 100%;
  height: 100%;
}

.menu-index__photo-img {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
  opacity: 0;
  transition: opacity 0.6s cubic-bezier(0.22, 1, 0.36, 1);
}

.menu-index__photo-img.is-active {
  opacity: 1;
}

/* Desktop: instead of a plain crossfade, the incoming photo wipes down
   over the outgoing one — a clip-path reveal from a collapsed sliver at
   the top edge to the full frame, on the same easing curve the rest of
   the site's motion uses. (Mobile keeps the opacity peek below — the
   clip-path rules are scoped to the hover breakpoint so the
   hold-to-peek print is untouched.) */
@media (min-width: 901px) {
  .menu-index__photo-img {
    opacity: 1;
    z-index: 0;
    clip-path: polygon(0 0, 100% 0, 100% 0, 0 0);
    transition: clip-path 0.8s cubic-bezier(0.33, 1, 0.68, 1);
  }

  .menu-index__photo-img.is-active {
    z-index: 1;
    clip-path: polygon(0 0, 100% 0, 100% 100%, 0 100%);
  }

  @media (prefers-reduced-motion: reduce) {
    .menu-index__photo-img {
      transition: opacity 0.3s ease;
      clip-path: none;
      opacity: 0;
    }
    .menu-index__photo-img.is-active {
      opacity: 1;
    }
  }
}

.menu-index__cta {
  display: flex;
  width: fit-content;
  margin: var(--space-9) auto 0;
}

/* Blush outline instead of the coral one — coral-on-green is muddy,
   and the section's text is all blush now anyway. */
.menu-index__cta.btn--outline-green {
  border-color: var(--color-blush);
  color: var(--color-blush);
}

.menu-index__cta.btn--outline-green:hover {
  background: var(--color-blush);
  color: var(--color-green);
}

@media (max-width: 900px) {
  .menu-index {
    padding: 56px var(--gutter);
  }

  .menu-index__panel {
    display: block;
  }

  /* Touch has no hover, so the photo comes back as a hold-to-peek card:
     press and hold a category row and js/menu-index.js adds .is-peeking,
     which fades in a cream polaroid-framed print centred on screen (not
     full-bleed) — release hides it again. */
  .menu-index__photo {
    display: block;
    position: fixed;
    /* left/top are set inline by js/menu-index.js every pointermove so
       the print rides under the finger; translate(-50%,-50%) centres it
       on that point. */
    left: 50%;
    top: 50%;
    z-index: 200;
    /* Small print, on request. */
    width: min(44vw, 168px);
    aspect-ratio: 3 / 4;
    /* Explicit warm cream (matches the polaroid mats elsewhere). */
    background: #fdf9f2;
    padding: 8px 8px 22px;
    border-radius: 2px;
    box-shadow: 0 18px 44px rgba(11, 15, 11, 0.34);
    opacity: 0;
    pointer-events: none;
    transform: translate(-50%, -50%) scale(0.9);
    transition:
      opacity 0.18s ease,
      transform 0.18s ease;
  }

  .menu-index.is-peeking .menu-index__photo {
    opacity: 1;
    transform: translate(-50%, -50%) scale(1);
  }

  /* Inset the image inside the cream mat so the polaroid frame shows. */
  .menu-index__photo .menu-index__photo-img {
    inset: 8px 8px 22px;
    width: calc(100% - 16px);
    height: calc(100% - 30px);
  }

  /* Scrim behind the peeked print so it reads against the list. */
  .menu-index__photo::before {
    content: "";
    position: fixed;
    inset: 0;
    z-index: -1;
    /* Light — the print is small and rides the finger, a heavy full
       dim would fight the interaction. */
    background: rgba(11, 15, 11, 0.22);
    opacity: 0;
    transition: opacity 0.18s ease;
  }

  .menu-index.is-peeking .menu-index__photo::before {
    opacity: 1;
  }

  .menu-index__photo-img {
    border-radius: 1px;
  }

  .menu-index__row-link {
    -webkit-touch-callout: none;
    -webkit-user-select: none;
    user-select: none;
    /* The whole gesture on a category row is the hold-to-peek print
       (js/menu-index.js) — take it off the browser so it can't hand the
       touch to the scroller mid-peek (which made the print blink out).
       A tap still navigates; scroll the page from anywhere else. */
    touch-action: none;
    flex-wrap: wrap;
    gap: 4px 12px;
    padding: 16px 0;
  }

  .menu-index__row-name {
    /* Bumped up (was 24-34px) — on request, wording stays the same,
       just bigger. */
    font-size: clamp(28px, 8.6vw, 40px);
    white-space: normal;
  }

  /* Always drop the note onto its own line under the category name.
     Without this, a short note ("From Portugal to Georgia" on Wine)
     stays beside the name while the longer ones wrap under it — so one
     row read differently from the rest. flex-basis:100% forces the
     wrap for every row. */
  .menu-index__row-note {
    white-space: normal;
    flex-basis: 100%;
  }
}

/* =========================================================
   Journal
   ========================================================= */

.journal {
  /* Homepage hero above is position:sticky, which paints in a layer above
     static siblings regardless of source order — without this its
     content could show through over this section (and the ones after
     it) as they scroll past. */
  position: relative;
  max-width: var(--page-max);
  margin: 0 auto;
  padding: var(--space-14) var(--gutter) var(--space-14);
}

/* The homepage teaser block (has id="journal") used to get a full-bleed
   dark-green panel with blush text throughout as its own distinct color
   moment — removed on request in favor of the same blush panel color
   the menu index and other sections use, with the site's normal
   green-on-light text (no more per-element color overrides needed, same
   as the standalone journal listing page). Still its own full-bleed
   width (not the centered page-max column .journal uses on its own), so
   centering stays on .journal__inner below. */
#journal {
  max-width: none;
  margin: 0;
  padding: var(--space-14) 0;
  background: var(--color-blush);
}

.journal__inner {
  max-width: var(--page-max);
  margin: 0 auto;
  padding: 0 var(--gutter);
}

.journal__header {
  text-align: center;
  margin-bottom: 56px;
}

.journal__heading {
  font-family: var(--font-display);
  font-weight: 300;
  font-size: var(--text-heading);
  line-height: var(--leading-tight);
  letter-spacing: -4.8px;
  text-transform: uppercase;
  text-align: center;
  color: var(--color-green);
}

.journal__heading em {
  font-style: italic;
  text-transform: uppercase;
}

/* Editorial list, not a card grid — the photo stays real estate (this is
   food/atmosphere imagery, it should carry weight), but the "identical
   card with a shadow" scaffold is gone. Rows alternate image side for
   rhythm, separated by a hairline rule instead of a box; captions read
   as an article list (title + dek + byline + a text link), not a tile
   label. Any number of articles just adds rows. */
.journal-list,
.events-list {
  display: flex;
  flex-direction: column;
}

/* Homepage teaser: the same vertical card used on the full /journal
   listing (see .journal-list in css/style-pages.css) — full-width
   photo, title+time row, excerpt, then a full-width "Read more" row —
   just capped at 3 cards in a row instead of the listing's wrapping
   grid. The teaser markup itself still nests image+excerpt inside one
   .journal-entry__media wrapper and time+more inside one
   .journal-entry__meta wrapper (built once, shared with the old row-
   list design); display:contents on both promotes their children to
   real grid items of .journal-entry itself, so each piece can be
   placed independently into the card's own image/head/excerpt/more
   rows below instead of the two-column row grid this used to be. */
.journal-list--teaser {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  /* Column gap tightened from var(--gutter) (40px) — read as too much
     air between the three cards. */
  gap: 56px 24px;
  /* Breaks out of .journal__inner's centered page-max column on both
     sides so the row spans 100vw minus one gutter each side — the exact
     same left line as the FAQ "GOOD TO KNOW" heading (.faq__header's
     bled-out left) and the same right line as the FAQ "+" toggles
     (.faq__list's bled-out right). The min()/max() guards flatten to 0
     below page-max, where .journal__inner isn't centered with extra
     margin to escape anyway. */
  margin-left: min(0px, calc(-1 * (100vw - var(--page-max)) / 2));
  margin-right: min(0px, calc(-1 * (100vw - var(--page-max)) / 2));
  width: calc(100% + 2 * max(0px, calc((100vw - var(--page-max)) / 2)));
}

.journal-list--teaser .journal-entry {
  display: grid;
  grid-template-columns: 1fr auto;
  grid-template-rows: auto auto auto auto;
  column-gap: 16px;
  row-gap: 18px;
  /* Cream polaroid card around the photo + text (the section keeps its
     own blush background — only each entry sits on the mat). Above the
     grain overlay's own z-index:55 so the card's own surface stays
     clean. */
  position: relative;
  z-index: 56;
  background: var(--color-cream);
  padding: 20px 20px 26px;
  border-radius: 2px;
  border-bottom: none;
  box-shadow: 0 14px 30px rgba(11, 15, 11, 0.14);
}

.journal-list--teaser .journal-entry:first-child {
  padding-top: 20px;
  border-top: none;
}

.journal-list--teaser .journal-entry__media,
.journal-list--teaser .journal-entry__meta {
  display: contents;
}

.journal-list--teaser .journal-entry__image {
  grid-column: 1 / -1;
  grid-row: 1;
  aspect-ratio: 4 / 3;
  margin-bottom: 10px;
}

.journal-list--teaser .journal-entry__title {
  grid-column: 1 / -1;
  grid-row: 2;
  align-self: baseline;
  /* A touch smaller than --text-lg, on request. */
  font-size: 24px;
  letter-spacing: -1.2px;
}

.journal-list--teaser .journal-entry__excerpt {
  grid-column: 1 / -1;
  grid-row: 3;
  max-width: none;
}

.journal-list--teaser .journal-entry__more {
  grid-column: 1;
  grid-row: 4;
  display: flex;
  align-items: center;
}

/* Reading time now shares the "Read more" row instead of sitting beside
   the title — bottom-right corner of the card, clock icon leading it. */
.journal-list--teaser .journal-entry__time {
  grid-column: 2;
  grid-row: 4;
  justify-self: end;
  align-self: center;
  display: inline-flex;
  align-items: center;
  gap: 6px;
  flex-shrink: 0;
  font-family: var(--font-mono);
  font-size: var(--text-xs);
  letter-spacing: 0.03em;
  color: color-mix(in srgb, var(--color-ink) 55%, transparent);
}

.journal-list--teaser .journal-entry__arrow {
  width: 16px;
  height: 16px;
}

/* Homepage teaser only — journal.html's own full list has no closing CTA
   of its own, this button lives beneath the .journal-list--teaser. */
.journal-stack__cta {
  display: flex;
  width: fit-content;
  margin: var(--space-8) auto 0;
}

.journal-entry {
  display: grid;
  grid-template-columns: minmax(0, 1.05fr) minmax(0, 1fr);
  align-items: center;
  gap: 56px;
  padding: 44px 0;
  border-bottom: 1px dashed rgba(46, 72, 43, 0.35);
}

.journal-entry:first-child {
  padding-top: 0;
}

.journal-entry__image,
.events-entry__image {
  aspect-ratio: 4 / 3;
  overflow: hidden;
  border-radius: 2px;
}

.journal-entry__image img,
.events-entry__image img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  transition: transform 0.7s cubic-bezier(0.16, 0.84, 0.44, 1);
}

.journal-entry:hover .journal-entry__image img,
.events-entry:hover .events-entry__image img {
  transform: scale(1.04);
}

.journal-entry__body {
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  gap: 14px;
}

.journal-entry__date {
  display: block;
  font-family: var(--font-mono);
  font-size: var(--text-xs);
  letter-spacing: 0.03em;
  color: color-mix(in srgb, var(--color-ink) 55%, transparent);
}

.journal-entry__title,
.events-entry__title {
  margin: 0;
  font-family: var(--font-display);
  font-weight: 300;
  font-size: var(--text-lg);
  line-height: var(--leading-tight);
  letter-spacing: -1.4px;
  color: var(--color-green);
}

.journal-entry__excerpt,
.events-entry__excerpt {
  margin: 0;
  max-width: 46ch;
  font-family: var(--font-mono);
  font-size: var(--text-sm);
  line-height: var(--leading-normal);
  color: color-mix(in srgb, var(--color-ink) 78%, transparent);
}

.journal-entry__more,
.events-entry__more {
  display: inline-flex;
  align-items: center;
  gap: 10px;
  font-family: var(--font-mono);
  font-size: var(--text-xs);
  letter-spacing: 0.02em;
  text-transform: uppercase;
  /* Green, matching the arrow icon beside it, not the pink accent. */
  color: var(--color-green);
  text-decoration: underline;
  text-underline-offset: 3px;
}

.journal-entry__arrow,
.events-entry__arrow {
  width: 18px;
  height: 16px;
  flex-shrink: 0;
  transition: transform 0.3s cubic-bezier(0.16, 0.84, 0.44, 1);
}

.journal-entry:hover .journal-entry__arrow,
.events-entry:hover .events-entry__arrow {
  transform: translateX(4px);
}

/* ---------- Journal poster stack (homepage only) ---------- */

/* Tall track the pinned stack scrolls through; drives the fan animation.
   Now that #journal itself is full-bleed, this is what centers the content
   and reproduces the section's old padding. Below the page-max breakpoint
   its box already spans the full viewport, so the clip edge below lands at
   the screen edge without needing an extra full-bleed margin trick. */
.journal-track,
.events-track {
  position: relative;
  max-width: var(--page-max);
  margin: 0 auto;
  padding: var(--space-14) var(--gutter) 72px;
  /* Was 260vh — on a normal-height desktop viewport that's nearly 3
     full screens of runway before the pinned "September Events"
     heading even settles into view, which read as a huge dead gap
     right after the map above it. Still enough scroll room for the
     sticky fan-through reveal to play out, just not this much of it. */
  min-height: 160vh;
  /* clip, not hidden: clip stops a peeling poster from creating sideways
     page scroll without making a scroll container, which would break the
     sticky pinning below. */
  overflow-x: clip;
}

.journal-stack,
.events-stack {
  position: sticky;
  top: 0;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: clamp(12px, 2.5vh, 24px);
  min-height: 100vh;
}

.journal-fan,
.events-fan {
  position: relative;
  margin: 0 auto;
  perspective: 1600px;
}

/* Inside the pinned stack the flex gap already provides the spacing.
   align-self: stretch so the heading spans the full width — .journal-stack
   centers flex children by default (shrink-to-fit), which left no room
   for the heading's own left/right per-line split to actually show. */
.journal-stack .journal__header {
  margin-bottom: 0;
  align-self: stretch;
}

/* The cream polaroid border + printed caption used to be baked directly
   into 4 hand-crafted image files — meaning a new Journal article could
   never look right here without a developer producing a matching image.
   Built as a real frame + caption instead so any article's plain cover
   photo gets the same look automatically. */
.journal-poster {
  position: absolute;
  top: 50%;
  left: 50%;
  aspect-ratio: 2 / 3;
  display: flex;
  flex-direction: column;
  background: var(--color-cream);
  /* Fixed px, not %: padding percentages resolve against the *containing
     block's* width (.journal-fan, up to 1140px), not the poster's own 31%
     — a percentage here looked fine in isolation but ballooned into a huge
     border on wide screens. A fixed value stays a thin, consistent mat
     regardless of viewport, matching the border weight used elsewhere on
     the site (menu, hero, etc). */
  padding: 14px 14px 0;
  overflow: hidden;
  border-radius: 2px;
  backface-visibility: hidden;
  transform-style: preserve-3d;
  /* translate(-50%,-50%) centres the poster; --tx/--ty are then percentages
     of the poster's own size, matching how the reference expresses its
     offsets as a ratio of poster width. */
  transform: translate(-50%, -50%) translateX(var(--tx, 0%))
    translateY(var(--ty, 0%)) rotate(var(--rotz, 0deg))
    rotateY(var(--roty, 0deg)) scale(var(--sc, 1));
  /* +60 keeps these reliably above the grain overlay's z-index:55 —
     --z alone only ranges 1-4 for the fan order. */
  z-index: calc(var(--z, 1) + 60);
  box-shadow: 0 14px 32px rgba(11, 15, 11, 0.28);
  pointer-events: var(--pe, auto);
}

.journal-poster__frame {
  flex: 1;
  min-height: 0;
  overflow: hidden;
}

.journal-poster img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
  pointer-events: none;
}

.journal-poster__caption {
  padding: 12px 0 18px;
  font-family: var(--font-display);
  font-weight: 300;
  font-size: var(--text-base);
  line-height: 1.15;
  letter-spacing: -0.4px;
  text-transform: uppercase;
  color: var(--color-green);
}

/* Same fan-transform mechanics as .journal-poster (see the comment there),
   applied to the existing .event-card instead of switching its content
   over to the poster/caption look — the card keeps its own photo+scrim+
   tag/title/desc, only its positioning becomes scroll-driven. */
.events-fan .event-card {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%) translateX(var(--tx, 0%))
    translateY(var(--ty, 0%)) rotate(var(--rotz, 0deg))
    rotateY(var(--roty, 0deg)) scale(var(--sc, 1));
  /* +60 keeps these reliably above the grain overlay's z-index:55 —
     --z alone only ranges 1-4 for the fan order. */
  z-index: calc(var(--z, 1) + 60);
  box-shadow: 0 14px 32px rgba(11, 15, 11, 0.28);
  pointer-events: var(--pe, auto);
  /* These 4 cards run the client's own September promo graphics (text
     already baked in), so the base .event-card's own tag/title/desc
     overlay stays off — a cream polaroid mat around the graphic, thin
     top/sides, a wider bottom lip, matching the hero strip's polaroid
     frames. (Tried showing tag/title/desc below the photo instead —
     reverted, that was only meant for the journal cards.) */
  background: var(--color-cream);
  padding: 12px 12px 34px;
  border-radius: 2px;
  /* The card sizes to its content now (mat + a 9:16 photo area), not the
     base .event-card's fixed 3:4 box — and its overflow opens up so the
     taller photo isn't clipped inside that old box. */
  aspect-ratio: auto;
  height: auto;
  overflow: visible;
}

.events-fan .event-card__image {
  position: relative;
  top: auto;
  right: auto;
  bottom: auto;
  left: auto;
  inset: auto;
  display: block;
  width: 100%;
  aspect-ratio: 9 / 16;
  height: auto;
  object-fit: cover;
  border-radius: 1px;
}

.events-fan .event-card__scrim,
.events-fan .event-card__content {
  display: none;
}

/* Desktop: posters fan out sideways as you scroll in. Threshold matches
   the sitewide 900/901px split (see the mobile block below) rather than
   an independent 900/899 pair — both partitions were individually
   non-overlapping, but disagreed with each other at exactly 900px. */
@media (min-width: 901px) {
  .journal-fan {
    /* Height bound keeps the fan plus heading and hint inside one screen on
       short desktop windows. */
    width: min(100%, 1140px, 118vh);
    aspect-ratio: 16 / 9;
  }

  .journal-poster {
    width: 31%;
    transition: z-index 0s;
  }

  /* A hovered poster reads on top regardless of its resting stack order,
     so a caption underneath a neighbour is never stuck unreachable. */
  .journal-poster:hover {
    z-index: 100;
  }

  .events-fan {
    width: min(100%, 1140px, 118vh);
    aspect-ratio: 16 / 9;
  }

  .events-fan .event-card {
    /* Was .journal-poster's own 31% — shrunk further once the cards
       switched to a real 9:16 aspect-ratio (see the base .events-fan
       .event-card rule): 9:16 at 31% width came out taller than 31%'s
       old 2:3-ish poster shape, tall enough that the fully-spread
       desktop fan climbed up into the "September Events" heading above
       it. 24% keeps the same fan tx/rot numbers, just smaller cards. */
    width: 24%;
    transition: z-index 0s;
  }

  .events-fan .event-card:hover {
    z-index: 100;
  }
}

/* Mobile: posters stay centred and stacked, splayed only by rotation, then
   flip away one at a time. Sized so a 15deg-rotated poster still clears a
   narrow viewport. */
@media (max-width: 900px) {
  .journal-track {
    padding: 60px var(--gutter);
  }

  .journal-stack {
    min-height: 100vh;
  }

  .journal-fan {
    /* Also bounded by viewport height so the 2:3 poster plus its heading
       and hint still fit on short screens. */
    width: min(86vw, 420px, 34vh);
    aspect-ratio: 2 / 3;
  }

  /* Narrower than the fan box so a rotated poster's corners stay inside it
     and never ride up over the heading. */
  .journal-poster {
    width: 88%;
  }

  /* Mobile no longer pins/scrolls through this section at all — cards
     advance on swipe instead (js/events-fan.js's initMobileSwipe), so
     the tall scroll-through runway .events-track/.events-stack use on
     desktop (and that .journal-track/.journal-stack still use here) is
     just dead space on a touch screen. A plain single-screen section. */
  .events-track {
    padding: 20px var(--gutter) 0;
    min-height: auto;
    /* The base rule's overflow-x:clip exists only to stop the desktop
       scroll-pinned poster fan-out from creating sideways page scroll —
       that effect is off on mobile (.events-stack below drops position:
       sticky), so nothing needs clipping here any more. Left on, it cut
       the deck's own prev/next arrows (js/card-stack.js) short at their
       outer tip whenever they sat close to the screen edge, since this
       element's own padding box — not the viewport — was the clip
       boundary. */
    overflow-x: visible;
  }

  .events-stack {
    position: relative;
    min-height: auto;
  }

  .events-fan {
    /* Narrower than before now that the cards are tall 9:16 polaroids —
       keeps the fan clear of the "September Events" heading above it.
       Explicit height (not a 3:4 aspect-ratio that no longer matches the
       card shape) gives the absolutely-positioned cards their room. */
    width: min(56vw, 240px);
    height: clamp(360px, 58vh, 460px);
    /* Own touch handling drives the swipe (preventDefault on a real
       swipe) — pan-y still lets an intentional vertical drag scroll the
       page instead of fighting the gesture. */
    touch-action: pan-y;
  }

  .events-fan .event-card {
    width: 100%;
    will-change: transform, opacity;
  }

  /* Prev / next arrows (js/events-fan.js buildArrows) — the swipe alone
     was unreliable, so give the deck explicit controls. Flank the
     centred card deck, near the screen edges. Mobile only. */
  .events-track {
    position: relative;
  }

  /* Plain arrow icons (same asset the Journal block uses), out near the
     screen edges so they never sit over a card. Hidden by default on
     request — swiping the cards directly is discoverable enough — but
     kept in the DOM and focusable (not display:none/visibility:hidden),
     revealing on keyboard focus so a keyboard/switch-access visitor who
     can't swipe still has a visible, operable way to move between
     cards. */
  .events-fan__arrow {
    position: absolute;
    top: 56%;
    transform: translateY(-50%);
    display: flex;
    align-items: center;
    justify-content: center;
    width: 34px;
    height: 48px;
    padding: 0;
    border: 0;
    background: none;
    color: var(--color-green);
    z-index: 30;
    cursor: pointer;
    opacity: 0;
    transition: opacity 0.2s ease;
  }

  .events-fan__arrow:focus-visible {
    opacity: 1;
  }

  .events-fan__arrow img {
    width: 26px;
    height: auto;
    opacity: 0.82;
  }

  .events-fan__arrow--prev {
    left: 4px;
  }

  .events-fan__arrow--next {
    right: 4px;
  }

  .events-fan__arrow:disabled {
    opacity: 0;
    pointer-events: none;
  }
}

@media (min-width: 901px) {
  .events-fan__arrows {
    display: none;
  }

  .events-fan .event-card__image {
    /* Cap the photo so card height stays within .events-fan's box. A
       touch bigger than before, on request. */
    aspect-ratio: auto;
    height: clamp(340px, 54vh, 430px);
  }
}

@media (min-width: 901px) {
  a.journal-stack__cta {
    height: 92px;
    padding: 0 38px;
    font-size: var(--text-md);
  }
}

/* =========================================================
   Reviews
   ========================================================= */

.reviews {
  position: relative;
  background: var(--color-blush);
  padding: var(--space-11) 0 var(--space-12);
  overflow: hidden;
}

.reviews__header {
  position: relative;
  z-index: 1;
  max-width: var(--page-max);
  margin: 0 auto;
  padding: 0 var(--gutter);
  /* Full-width, centred stack now — heading, the review-card marquee,
     the Book Now block and the "already visited?" prompt all centred on
     the page axis. The map used to sit here as a second column; it is
     now its own full-bleed band between the FAQ and the footer
     (.locale-map). */
  display: flex;
  flex-direction: column;
  align-items: center;
  text-align: center;
  color: var(--color-green);
}

.reviews__header .reviews__heading {
  text-align: center;
  text-wrap: balance;
  margin-bottom: 40px;
}

.reviews__header-left {
  width: 100%;
  min-width: 0;
}

/* Marquee runs the full viewport width, wider than the padded header. */
.reviews__marquee {
  width: 100vw;
  margin-left: calc(50% - 50vw);
  margin-right: calc(50% - 50vw);
}

.reviews__header .reviews__cta-block {
  align-items: center;
  margin-top: 8px;
}

@media (max-width: 900px) {
  .reviews__header .reviews__cta-text {
    margin-top: 24px;
  }
}

/* Full-bleed locality map — its own band between the FAQ and the footer. */
.locale-map {
  position: relative;
  width: 100vw;
  margin-left: calc(50% - 50vw);
  margin-right: calc(50% - 50vw);
  height: clamp(320px, 42vw, 540px);
  overflow: hidden;
}

.locale-map iframe {
  display: block;
  width: 100%;
  height: 100%;
  border: 0;
}

/* ---- Cookie consent banner --------------------------------------- */
.cookie-banner {
  position: fixed;
  left: 0;
  right: 0;
  bottom: 0;
  z-index: 200;
  display: flex;
  align-items: center;
  justify-content: center;
  flex-wrap: wrap;
  gap: 14px 28px;
  padding: 16px clamp(16px, 5vw, 40px);
  background: var(--color-green);
  color: var(--color-cream);
  border-top: 1px dashed rgba(242, 236, 227, 0.35);
  transform: translateY(100%);
  transition: transform 0.32s cubic-bezier(0.33, 1, 0.68, 1);
}

.cookie-banner.is-in {
  transform: translateY(0);
}

.cookie-banner.is-leaving {
  transform: translateY(100%);
}

.cookie-banner__text {
  margin: 0;
  max-width: 62ch;
  font-family: var(--font-mono);
  font-weight: 300;
  font-size: 13px;
  line-height: 1.5;
  letter-spacing: -0.3px;
}

.cookie-banner__link {
  color: inherit;
  text-decoration: underline;
  text-underline-offset: 2px;
  /* Keeps "Privacy Policy" from splitting across the line-wrap that the
     sentence before it takes on desktop. */
  white-space: nowrap;
}

.cookie-banner__actions {
  display: flex;
  gap: 10px;
  flex-shrink: 0;
}

.cookie-banner__btn {
  padding: 9px 20px;
  border-radius: 100px;
  font-family: var(--font-mono);
  font-weight: 400;
  font-size: 12px;
  letter-spacing: 0.3px;
  text-transform: uppercase;
  cursor: pointer;
  transition:
    background 0.18s ease,
    color 0.18s ease;
}

.cookie-banner__btn--decline {
  background: transparent;
  border: 1px solid rgba(242, 236, 227, 0.5);
  color: var(--color-cream);
}

.cookie-banner__btn--decline:hover {
  background: rgba(242, 236, 227, 0.12);
}

.cookie-banner__btn--accept {
  background: var(--color-cream);
  border: 1px solid var(--color-cream);
  color: var(--color-green);
}

.cookie-banner__btn--accept:hover {
  background: #fff;
  border-color: #fff;
}

@media (max-width: 600px) {
  .cookie-banner {
    justify-content: flex-start;
    gap: 12px;
  }
  .cookie-banner__actions {
    width: 100%;
  }
  .cookie-banner__btn {
    flex: 1;
  }
}

@media (prefers-reduced-motion: reduce) {
  .cookie-banner {
    transition: none;
  }
}

.rating-badge {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 8px;
  font-family: var(--font-mono);
  font-weight: 300;
  font-size: var(--text-sm);
  letter-spacing: -0.96px;
  margin-bottom: 20px;
}

.rating-badge img {
  width: 20px;
  height: 20px;
}

.reviews__heading {
  font-family: var(--font-display);
  font-weight: 300;
  font-size: var(--text-heading);
  line-height: var(--leading-tight);
  letter-spacing: -4.8px;
  text-transform: uppercase;
  text-align: center;
  margin-bottom: 48px;
}

.reviews__heading em {
  font-style: italic;
  text-transform: uppercase;
}

/* All reviews, not just a curated three, still drag/scroll as an
   infinite strip — same mechanic as the old marquee (js/main.js's
   makeDraggableMarquee hooks these exact class names), just with the
   new flat-bordered card design in place of the old printed/tilted
   ones. The list is duplicated once in the HTML (10 reviews -> 20 list
   items) so the loop is seamless. */
.reviews__marquee {
  position: relative;
  z-index: 1;
  overflow: hidden;
  margin-bottom: 32px;
}

/* Full-bleed only below the 901px split, where .reviews__header drops
   back to a single column and the marquee reverts to a plain block
   between it and the cta — see the desktop override, further up this
   file alongside .reviews__header's own grid, for the 901px+ version
   (confined to the header's right-hand column, flush to the viewport's
   own right edge same as the map above it). */
@media (max-width: 900px) {
  .reviews__marquee {
    width: 100vw;
    margin-left: calc(50% - 50vw);
    margin-right: calc(50% - 50vw);
  }
}

.testimonials-track {
  display: flex;
  align-items: stretch;
  gap: 20px;
  width: max-content;
  animation: testimonials-scroll 70s linear infinite;
  /* Let js/main.js own horizontal drags (it swaps this animation out for
     a manual transform mid-gesture); vertical page scroll still passes
     through untouched. */
  touch-action: pan-y;
  cursor: grab;
}

.testimonials-track.is-dragging {
  cursor: grabbing;
}

.reviews__marquee:hover .testimonials-track {
  animation-play-state: paused;
}

@keyframes testimonials-scroll {
  from {
    transform: translateX(0);
  }
  to {
    transform: translateX(-50%);
  }
}

@media (prefers-reduced-motion: reduce) {
  .testimonials-track {
    animation: none;
  }
}

/* Flat and bordered, not the printed/tilted card language used
   elsewhere (About Us, Journal) — a steadier card reads calmer next to
   the now fully-centered heading/CTA around it. Fixed width (not a grid
   1fr) since this is a horizontal flex strip again, not a static grid. */
.testimonial-card {
  position: relative;
  flex: 0 0 clamp(300px, 84vw, 480px);
  width: clamp(300px, 84vw, 480px);
  display: flex;
  flex-direction: column;
  background: var(--color-cream);
  padding: 30px 34px 34px;
  min-height: 320px;
}

/* A slight, varied tilt — the same scattered-print feel as the hero
   polaroids — so the strip doesn't read as a rigid ruler of identical
   rectangles. Cycled by position, one value every 4 cards.
   Was nth-child(2n)/(3n)/(4n) — those overlap instead of dividing the
   list into 4 clean groups (e.g. card 12 matches all three at once),
   so several cards in a row silently fell through to the same base
   tilt instead of alternating. 4n+1..4n+4 partitions every card into
   exactly one of the 4 groups, no overlap. */
.testimonial-card:nth-child(4n + 1) {
  --card-tilt: -3deg;
}
.testimonial-card:nth-child(4n + 2) {
  --card-tilt: 2.4deg;
}
.testimonial-card:nth-child(4n + 3) {
  --card-tilt: -1.4deg;
}
.testimonial-card:nth-child(4n + 4) {
  --card-tilt: 3.6deg;
}
/* Wins over the .reveal rules above (same specificity, later in file). */
.testimonial-card,
.testimonial-card.reveal.is-visible {
  transform: rotate(var(--card-tilt));
}
.testimonial-card.reveal {
  transform: translateY(26px) scale(0.97) rotate(var(--card-tilt));
}
/* Room for the lifted corners before .reviews__marquee's overflow clips. */
.testimonials-track {
  padding-block: 26px;
}

/* Mobile: noticeably smaller cards, all the SAME height (align-items
   stretch — the default — so every card matches the tallest), with a
   smaller, tighter review font so the tallest one doesn't run long. */
@media (max-width: 700px) {
  .testimonial-card {
    flex-basis: 74vw;
    width: 74vw;
    padding: 18px 20px 20px;
    min-height: 0;
  }

  .testimonial-card__head {
    padding-bottom: 10px;
    margin-bottom: 12px;
  }

  /* Two-class selector so this wins over the base .testimonial-card__text
     rule that sits later in the file. */
  .testimonial-card .testimonial-card__text {
    font-size: clamp(11px, 3.1vw, 12.5px);
    line-height: 1.5;
    letter-spacing: -0.3px;
  }

  .testimonial-card__link {
    margin-top: 14px;
    padding-top: 10px;
  }
}

.testimonial-card__head {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 12px;
  padding-bottom: 16px;
  margin-bottom: 20px;
  border-bottom: 1px solid var(--color-green);
}

.testimonial-card__stars {
  width: 90px;
  height: 15px;
  flex-shrink: 0;
}

.testimonial-card__author {
  font-family: var(--font-mono);
  font-weight: 300;
  font-size: var(--text-xs);
  letter-spacing: 0.4px;
  text-transform: uppercase;
  color: var(--color-green);
  text-align: right;
}

.testimonial-card__text {
  position: relative;
  z-index: 1;
  font-family: var(--font-mono);
  font-weight: 300;
  font-size: var(--text-sm);
  letter-spacing: -0.96px;
  line-height: var(--leading-normal);
  color: var(--color-ink);
  margin: 0;
  flex: 1;
  /* Explicitly left — never inherit the centring the section heading
     opts into. */
  text-align: left;
}

/* Just the "Google Map" label + arrow now, not a full-card click
   overlay — reads as one specific link rather than the whole card
   being a mystery button. */
.testimonial-card__link {
  position: relative;
  z-index: 1;
  display: flex;
  align-items: center;
  justify-content: space-between;
  margin-top: 24px;
  padding-top: 16px;
  font-family: var(--font-mono);
  font-weight: 300;
  font-size: var(--text-xs);
  letter-spacing: -0.4px;
  color: var(--color-green);
  text-decoration: none;
}

.testimonial-card__arrow {
  width: 18px;
  height: auto;
  flex-shrink: 0;
  color: var(--color-green);
  transition: transform 0.2s ease-out;
}

.testimonial-card__link:hover .testimonial-card__arrow {
  transform: translateX(4px);
}

/* Just the short "already visited?" prompt + underlined review link
   now — the Book Now claw button that used to stack above it moved to
   the September Events cards (.events-teaser__cta) so it isn't
   duplicated on the same page. */
.reviews__cta-block {
  position: relative;
  z-index: 1;
  display: flex;
  flex-direction: column;
  align-items: center;
  margin-top: 20px;
}

.reviews__cta-text {
  font-family: var(--font-mono);
  font-weight: 300;
  font-size: var(--text-sm);
  line-height: var(--leading-normal);
  color: var(--color-green);
  text-align: center;
  margin: 0;
}

.reviews__cta-link {
  color: var(--color-green);
  text-decoration: underline;
  text-underline-offset: 3px;
}

@media (max-width: 900px) {
  /* Tighter mobile spacing on this section — nothing here needs the
     big desktop --space-11/12 padding. */
  .reviews {
    padding: 56px 0;
  }

  /* "Have you already visited Pinch?" on one line (was wrapping), and
     a smaller gap down to the next section's heading. */
  .reviews__cta-text {
    white-space: nowrap;
    font-size: clamp(11px, 3.2vw, 13px);
  }

  .reviews__header .reviews__cta-text {
    margin-top: 10px;
  }

  .reviews__header .reviews__cta-block {
    margin-top: 0;
  }
}

/* =========================================================
   FAQ
   ========================================================= */

.faq {
  position: relative;
  background: var(--color-green);
}

/* Was a side-by-side 2-column grid (heading left, questions right),
   bled out to align with the footer's own nav/hours columns below it —
   now stacked instead: heading centered full-width on its own row,
   questions below, on request. */
.faq__inner {
  max-width: var(--page-max);
  margin: 0 auto;
  /* Bottom padding trimmed from the shared --space-14 (140px) — the
     footer directly below already carries its own row padding, so the
     full space-14 on top of that read as a big dead gap before the
     footer's first dashed divider. */
  padding: var(--space-12) var(--gutter) var(--space-8);
}

.faq__header {
  text-align: center;
  margin-bottom: 56px;
}

.faq__heading {
  font-family: var(--font-display);
  font-weight: 300;
  font-size: var(--text-heading);
  line-height: var(--leading-tight);
  letter-spacing: -4.8px;
  text-transform: uppercase;
  text-align: center;
  color: var(--color-blush);
}

.faq__heading em {
  font-style: italic;
  text-transform: uppercase;
}

/* Fills the empty space the two-column split leaves under the heading,
   the same red-fill/black-linework illustration style already used in
   the footer brand row. Left edge inherits .faq__header's own bled-out
   left offset, so it lines up with the heading and the footer nav. */
.faq__illustration {
  display: block;
  width: clamp(200px, 27vw, 420px);
  height: auto;
  margin-top: clamp(48px, 10vw, 180px);
}

.faq__list {
  display: flex;
  flex-direction: column;
  /* Capped and centered — full page-max width left the "+" icon (pushed
     to the far end via justify-content:space-between on each row) a
     long dashed-line's throw from short questions. */
  max-width: 800px;
  width: 100%;
  margin: 0 auto;
}

.faq-item {
  border-bottom: 1px dashed rgba(242, 236, 227, 0.35);
}

.faq-item:last-child {
  border-bottom: none;
}

/* Same treatment as .journal-entry__title — sentence case, not the small
   caps the toggle used to render in (the markup was always sentence case;
   text-transform was doing the capitalizing). */
.faq-item__toggle {
  width: 100%;
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 16px;
  background: none;
  border: none;
  cursor: pointer;
  padding: 24px 0;
  font-family: var(--font-display);
  font-weight: 300;
  /* Matches .journal-entry__title exactly (text-lg / -1.4px), per her
     "same as the article titles" request — not just the same case
     treatment, the same size too. */
  font-size: var(--text-lg);
  line-height: var(--leading-tight);
  letter-spacing: -1.4px;
  color: var(--color-blush);
  text-align: left;
}

.faq-item__icon {
  width: 20px;
  height: 20px;
  flex-shrink: 0;
  transform: rotate(-45deg);
  transition: transform 0.4s cubic-bezier(0.16, 0.84, 0.44, 1);
}

.faq-item.is-open .faq-item__icon {
  transform: rotate(0deg);
}

.faq-item__panel {
  display: grid;
  grid-template-rows: 0fr;
  transition: grid-template-rows 0.45s cubic-bezier(0.16, 0.84, 0.44, 1);
}

.faq-item.is-open .faq-item__panel {
  grid-template-rows: 1fr;
}

.faq-item__panel > p {
  overflow: hidden;
  margin: 0;
  padding: 0;
  max-width: 640px;
  font-family: var(--font-mono);
  font-weight: 300;
  font-size: var(--text-sm);
  letter-spacing: -0.96px;
  color: var(--color-blush);
  text-align: left;
}

.faq-item.is-open .faq-item__panel > p {
  padding-bottom: 24px;
}

/* ---------- Closing CTA (last content beat, right before the footer) ---
   Cream, not blush or green — FAQ (blush) resolves doubt, this converts
   on it, and the footer (green) closes the page; a neutral pause between
   the two keeps all three from blurring into one block. The map used to
   share this section (copy left, map right) — it's now its own
   full-bleed strip between FAQ and the footer (see .site-map below), so
   this is single-column again, just centered copy. */
.closing-cta {
  display: flex;
  align-items: center;
  justify-content: center;
  background: var(--color-blush-panel);
}

.closing-cta__content {
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  text-align: center;
  padding: var(--space-12) var(--gutter);
}

.closing-cta__heading {
  font-family: var(--font-display);
  font-weight: 300;
  font-size: var(--text-heading);
  line-height: var(--leading-tight);
  letter-spacing: -4.8px;
  text-transform: uppercase;
  color: var(--color-green);
  margin: 0 0 20px;
}

.closing-cta__subtitle {
  max-width: 36ch;
  font-family: var(--font-mono);
  font-weight: 300;
  font-size: var(--text-sm);
  line-height: var(--leading-normal);
  color: var(--color-green);
  opacity: 0.82;
  margin: 0 0 32px;
}

.closing-cta__actions {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 20px;
}

/* .hero__cta-wrap's own 104px top margin is tuned for the hero, where it
   clears a much taller heading block above it — here the heading is
   short, so that same margin reads as a big dead gap. Cut it down but
   not to zero: the claw artwork still needs ~74px of headroom above
   the button (see .hero__cta-claw's own top offset) to avoid clipping
   into the heading. */
@media (min-width: 901px) {
  .closing-cta__actions .hero__cta-wrap {
    margin-top: 30px;
  }
}

/* Was 30px here to level Book Now against a sibling "See All Events"
   pill that has since been removed (.events-teaser__cta is Book-Now-
   only now) — with nothing left to level against, that margin just
   pushed the button down for no reason. Zeroed out; .events-teaser__cta
   itself (below) controls how high the whole row sits. */
@media (min-width: 901px) {
  .events-teaser__cta .hero__cta-wrap {
    margin-top: 0;
  }
}

.events-teaser__cta {
  align-items: center;
}

/* Full-bleed strip between FAQ and the footer — same idea as
   .site-footer__map used to be before the footer redesign, just given
   its own section now that the footer's own space is spoken for by the
   crab/lobster converge stage. Fixed height (not aspect-ratio) so a
   very wide viewport doesn't turn it into an oversized banner. */
.site-map {
  width: 100%;
  height: 420px;
  overflow: hidden;
}

.site-map iframe {
  display: block;
  width: 100%;
  height: 100%;
  border: 0;
}

@media (max-width: 900px) {
  .site-map {
    height: 300px;
  }
}

/* =========================================================
   Vinyl (playlist teasers — hover a cover, the record slides out from
   behind it and spins; js/vinyl.js plays that card's own audio loop and
   stops any other that was playing)
   ========================================================= */

.vinyl {
  position: relative;
  /* Photo background reverted — back to plain blush, on request. */
  background: var(--color-blush);
  padding: var(--space-13) var(--gutter);
  /* Contains the record's own hover/tap slide-out locally — scoped here
     rather than on html/body: this section has no position:sticky
     descendants, so it can't trip the browser quirk where setting
     overflow-x without overflow-y implicitly turns overflow-y into
     "auto" on the element, which (when done on html/body) breaks any
     sticky element's pin behavior elsewhere on the page. */
  overflow-x: hidden;
}

.vinyl__inner {
  max-width: var(--page-max);
  margin: 0 auto;
}

.vinyl__header {
  text-align: center;
  margin-bottom: 64px;
}

.vinyl__heading {
  font-family: var(--font-display);
  font-weight: 300;
  font-size: var(--text-heading);
  line-height: var(--leading-tight);
  letter-spacing: -4.8px;
  text-transform: uppercase;
  text-align: center;
  color: var(--color-green);
}


.vinyl__heading em {
  font-style: italic;
  text-transform: uppercase;
}

/* ScrollFloat — js/vinyl-heading-float.js splits the heading into chars
   that rise from below the masked line as the block scrolls in. */
.vinyl-float .line {
  display: block;
  overflow: hidden;
  padding: 0.18em 0.06em;
  margin: -0.18em -0.06em;
}
.vinyl-float .line__inner {
  display: block;
  transform: none;
  opacity: 1;
}
.vinyl-float__char {
  display: inline-block;
  transform-origin: 50% 0%;
  opacity: 0;
  transform: translateY(125%) scale(0.6, 2.4);
  transition:
    opacity 0.55s cubic-bezier(0.22, 1, 0.36, 1),
    transform 0.85s cubic-bezier(0.22, 1, 0.36, 1);
  transition-delay: calc(var(--i, 0) * 0.055s);
  will-change: transform, opacity;
}
.vinyl-float.is-in .vinyl-float__char {
  opacity: 1;
  transform: translateY(0) scale(1, 1);
}
.vinyl-float__gap {
  display: inline-block;
  width: 0.3em;
}

/* Groups one word's .vinyl-float__char spans into one atomic unit —
   without this, nothing tells the browser a run of per-character
   inline-blocks belongs to the same word, so it was free to wrap the
   line between any two of them, including mid-word ("of" broke into
   "o"/"f" at some widths). white-space:nowrap here blocks that while
   still allowing a break between whole words (at the gap spans). */
.vinyl-float__word {
  display: inline-block;
  white-space: nowrap;
}

/* ============ Per-character heading entrances (js/heading-fx.js) ======
   Shared: .hfx-char is one glyph, .hfx-gap a fixed word space, --i is
   the running index for the stagger. Each block is masked/hinged per
   effect below. */
.hfx-gap {
  display: inline-block;
  width: 0.3em;
}

/* Wraps one word's .hfx-char run — each char is its own inline-block
   box, otherwise free for the browser to line-break between, which
   split words mid-letter right at the wrap width ("S" / "EPTEMBER
   EVENTS"). nowrap keeps a whole word on one line; the wrap itself can
   still only happen at .hfx-gap, between words. */
.hfx-charword {
  display: inline-block;
  white-space: nowrap;
}

/* SplitText — letters rise + fade (reviews "What Our Guests Say"). */
.hfx-split .line {
  display: block;
  overflow: hidden;
  padding: 0.18em 0.06em;
  margin: -0.18em -0.06em;
}
.hfx-split .line__inner {
  display: block;
  transform: none;
  opacity: 1;
}
.hfx-split .hfx-char {
  display: inline-block;
  opacity: 0;
  transform: translateY(0.9em);
  transition:
    opacity 0.5s cubic-bezier(0.22, 1, 0.36, 1),
    transform 0.6s cubic-bezier(0.22, 1, 0.36, 1);
  transition-delay: calc(var(--i, 0) * 0.04s);
  will-change: transform, opacity;
}
.hfx-split.is-in .hfx-char {
  opacity: 1;
  transform: translateY(0);
}

/* FoldText — letters unfold from a top hinge (events "September Events"). */
.hfx-fold {
  perspective: 720px;
}
.hfx-fold .line {
  display: block;
}
.hfx-fold .line__inner {
  display: block;
  transform: none;
  opacity: 1;
}
.hfx-fold .hfx-char {
  position: relative;
  display: inline-block;
  transform-origin: 50% 0%;
  transform-style: preserve-3d;
  opacity: 0;
  transform: rotateX(-92deg);
  transition:
    opacity 0.45s ease,
    transform 0.6s cubic-bezier(0.33, 1, 0.68, 1);
  transition-delay: calc(var(--i, 0) * 0.045s);
  will-change: transform, opacity;
}
.hfx-fold .hfx-char::after {
  content: "";
  position: absolute;
  inset: -0.06em -0.02em;
  background: linear-gradient(
    180deg,
    rgba(0, 0, 0, 0.5) 0%,
    rgba(0, 0, 0, 0.15) 45%,
    rgba(255, 255, 255, 0.2) 100%
  );
  mix-blend-mode: multiply;
  opacity: 0.55;
  transition: opacity 0.5s ease;
  transition-delay: calc(var(--i, 0) * 0.045s);
  pointer-events: none;
}
.hfx-fold.is-in .hfx-char {
  opacity: 1;
  transform: rotateX(0);
}
.hfx-fold.is-in .hfx-char::after {
  opacity: 0;
}

/* Word-level rise + fade — the About Us heading and its two paragraphs
   get the exact "What Our Guests Say" entrance, only staggered per word
   (a glyph-by-glyph stagger over sentences this long would run for
   10+ seconds). Each element runs its own observer, but heading → para 1
   → para 2 reveal in series (--base below), not together, or paragraph 2
   visibly finished before paragraph 1 got going.
   Durations + stagger step kept tight (was 0.5s/0.55s transitions, a
   22-word cap) — that read as "too slow" once each element had to wait
   for the previous one to fully settle first; the tighter numbers here
   let GROUP_GAP in js/heading-fx.js shrink to match without reopening
   the overlap bug. */
.hfx-words .hfx-word {
  display: inline-block;
  opacity: 0;
  transform: translateY(0.6em);
  /* Cut again (was 0.4s/0.55s -> 0.4s/0.45s -> now 0.28s/0.32s) — About
     Us still read as slow to appear even after the first pass. */
  transition:
    opacity 0.28s cubic-bezier(0.22, 1, 0.36, 1),
    transform 0.32s cubic-bezier(0.22, 1, 0.36, 1);
  /* --base sequences the heading → para 1 → para 2 (set per element in
     js/heading-fx.js); --i is the per-word stagger within one element,
     capped so a long paragraph's wave doesn't drag on. */
  transition-delay: calc(var(--base, 0s) + min(var(--i, 0), 6) * 0.026s);
  will-change: transform, opacity;
}
.hfx-words.is-in .hfx-word {
  opacity: 1;
  transform: translateY(0);
}

.vinyl__subtitle {
  font-family: var(--font-mono);
  font-weight: 300;
  font-size: var(--text-sm);
  line-height: var(--leading-normal);
  letter-spacing: -0.3px;
  color: var(--color-green);
  opacity: 0.82;
  max-width: 420px;
  margin: 16px auto 0;
}

.vinyl__grid {
  display: grid;
  /* Positioning context for .vinyl__crab, centered over the row. */
  position: relative;
  /* Was repeat(3, 1fr) — fine while there were always exactly 3 records,
     but that stretched to fill the whole bled-out row regardless of the
     real count, leaving 2 (or any other count) pinned to the left with
     empty column(s) after them instead of centered. auto-fit + a capped
     column width + justify-content:center sizes columns to the content
     and centers the whole row as a group, correct for any number of
     playlists the admin adds. Row still bleeds out of .vinyl__inner's
     centered page-max column so the records land one gutter from each
     viewport edge — the same left/right lines the Journal teaser cards
     use. .vinyl carries the gutter as its own padding (not
     .vinyl__inner), so the escape distance is
     (100vw − 2·gutter − page-max) / 2, not the Journal block's
     (100vw − page-max) / 2. Guards flatten to 0 below page-max. */
  grid-template-columns: repeat(auto-fit, minmax(320px, 420px));
  justify-content: center;
  gap: 14px;
  margin-left: min(
    0px,
    calc(-1 * (100vw - 2 * var(--gutter) - var(--page-max)) / 2)
  );
  margin-right: min(
    0px,
    calc(-1 * (100vw - 2 * var(--gutter) - var(--page-max)) / 2)
  );
  width: calc(
    100% + 2 * max(0px, calc((100vw - 2 * var(--gutter) - var(--page-max)) / 2))
  );
}

.vinyl__item {
  display: flex;
  flex-direction: column;
  align-items: center;
  width: 100%;
}

/* The square disc area is its own frame now, separate from .vinyl__item —
   .vinyl__item is a column (frame + the .vinyl__label caption below it),
   so it can no longer carry the fixed 1:1 itself. */
.vinyl__disc-frame {
  /* It's a <span> in the markup — position:absolute (on .vinyl__item
     originally) used to force block-level sizing for free; position:
     relative doesn't, so this needs it explicitly or width/aspect-ratio
     below don't apply. */
  display: block;
  position: relative;
  width: 100%;
  aspect-ratio: 1;
}

/* Floating notes while a record is hovered (preview) or actually
   playing (locked in) — js/vinyl.js toggles .is-playing, hover is
   plain CSS. Two note glyphs, pure CSS (no extra markup/JS): each
   rises, drifts and fades on a loop, staggered so they don't spawn
   in sync. */
.vinyl__disc-frame::before,
.vinyl__disc-frame::after {
  content: "♪";
  position: absolute;
  /* Outside the disc's own circle (inset:6% on .vinyl__disc), not on
     top of it — was centered at 45-60%, landing squarely on the label. */
  top: 2%;
  left: 88%;
  font-family: var(--font-display);
  font-size: clamp(20px, 3vw, 32px);
  color: var(--color-green);
  opacity: 0;
  pointer-events: none;
  z-index: 3;
}

.vinyl__disc-frame::after {
  content: "♫";
  top: 10%;
  left: 98%;
}

@keyframes vinyl-note-float {
  0% {
    opacity: 0;
    transform: translate(-50%, -50%) translate(0, 0) rotate(0deg);
  }
  15% {
    opacity: 1;
  }
  100% {
    opacity: 0;
    transform: translate(-50%, -50%) translate(18px, -130px) rotate(14deg);
  }
}

.vinyl__item:hover .vinyl__disc-frame::before,
.vinyl__item.is-playing .vinyl__disc-frame::before {
  animation: vinyl-note-float 1.9s ease-out infinite;
}

.vinyl__item:hover .vinyl__disc-frame::after,
.vinyl__item.is-playing .vinyl__disc-frame::after {
  animation: vinyl-note-float 1.9s ease-out 0.65s infinite;
}

@media (prefers-reduced-motion: reduce) {
  .vinyl__disc-frame::before,
  .vinyl__disc-frame::after {
    display: none;
  }
}

/* The record itself is now the card's only visual (no cover artwork sits
   on top of it any more) — centered and large within the square frame,
   spinning in place on hover/while playing rather than sliding out from
   behind anything. */
.vinyl__disc {
  position: absolute;
  inset: 6%;
  z-index: 0;
}

/* Playlist name, under the record — the admin's title per playlist (see
   js/playlists-sanity.js), same caption for however many records there
   are. Plain, not tracked-uppercase-eyebrow styling: this names a
   specific thing (like a caption), it isn't a section label. */
.vinyl__label {
  display: inline-block;
  margin-top: 18px;
  /* Back to the site's monospace body face (was the display face,
     italic + uppercase) — same treatment as .reviews__cta-text, on
     request. */
  font-family: var(--font-mono);
  font-weight: 300;
  font-size: var(--text-sm);
  letter-spacing: normal;
  color: var(--color-green);
  text-align: center;
  text-decoration: underline;
  text-underline-offset: 4px;
  transition: opacity 0.25s ease;
}

.vinyl__label:hover {
  opacity: 0.65;
}

/* Decorative crab-with-cocktails illustration, centered over the row
   between the two records — purely decorative (not admin-configurable,
   unlike the records themselves), so it's fixed markup re-added by
   js/playlists-sanity.js after it swaps the grid's real content in.
   Desktop only: the mobile grid is a horizontal swipe strip with the
   records close together, no real "between" space for this to sit in. */
/* Removed on request — was sitting between the two records. Element
   stays in the markup (harmless, hidden) rather than touching the HTML
   + js/playlists-sanity.js that both reference it. */
.vinyl__crab {
  display: none;
}

.vinyl__disc-spin {
  --spin-start: 0deg;
  display: block;
  width: 100%;
  height: 100%;
  border-radius: 50%;
  animation: vinyl-spin 2.8s linear infinite;
  animation-play-state: paused;
  box-shadow: 0 14px 32px rgba(11, 15, 11, 0.28);
  cursor: grab;
  touch-action: none;
}

.vinyl__item:hover .vinyl__disc-spin,
.vinyl__item.is-playing .vinyl__disc-spin {
  animation-play-state: running;
}

/* Grabbing and manually turning the record (js/vinyl.js) takes it out of
   the auto-spin animation entirely for the duration of the drag — see the
   comment above bindScratch() there for why. */
.vinyl__item.is-dragging .vinyl__disc-spin {
  cursor: grabbing;
}

.vinyl__disc-spin img {
  width: 100%;
  height: 100%;
  border-radius: 50%;
  display: block;
  pointer-events: none;
}

/* Keyframes read their starting angle from --spin-start (set in JS, see
   vinyl.js) rather than always beginning at 0deg, so handing the record
   back to the auto-spin after a manual drag continues smoothly from
   wherever it was left instead of snapping back to its pre-drag angle. */
@keyframes vinyl-spin {
  from {
    transform: rotate(var(--spin-start));
  }
  to {
    transform: rotate(calc(var(--spin-start) + 360deg));
  }
}

@media (max-width: 900px) {
  .vinyl {
    padding: 56px var(--gutter) 48px;
  }

  .vinyl__header {
    margin-bottom: 40px;
  }

  .vinyl__heading {
    font-size: clamp(24px, 7.4vw, 34px);
    letter-spacing: -1.6px;
  }

  /* Horizontal swipe slider on mobile (same treatment as the Journal
     teaser), not a tall single-column stack. Full-bleed scroll-snap
     strip; each record ~66vw so the next one peeks in. */
  .vinyl__grid {
    display: flex;
    flex-direction: row;
    flex-wrap: nowrap;
    /* Overrides the base (desktop grid) rule's justify-content:center —
       left in place, that inherited value fights the padding-based
       centering below on an overflowing flex row: some browsers anchor
       the initial (unscrolled) position to the middle of the whole
       centered/overflowing content instead of its start, which ate the
       left padding and left the first record flush against the edge
       instead of centered. */
    justify-content: flex-start;
    gap: 18px;
    max-width: none;
    width: 100vw;
    margin-left: calc(50% - 50vw);
    margin-right: calc(50% - 50vw);
    /* generous top/bottom so the disc drop-shadows are not sliced */
    padding: 28px calc((100vw - 66vw) / 2) 28px;
    overflow-x: auto;
    overflow-y: hidden;
    touch-action: pan-x;
    overscroll-behavior-x: contain;
    /* finite strip of the real records now (the infinite-clone version
       kept stranding it in empty space on iOS) — mandatory so a swipe
       always lands cleanly on a record. */
    scroll-snap-type: x mandatory;
    -webkit-overflow-scrolling: touch;
    scrollbar-width: none;
  }

  .vinyl__grid::-webkit-scrollbar {
    display: none;
  }

  .vinyl__item {
    flex: 0 0 66vw;
    scroll-snap-align: center;
  }

  /* Disc doesn't scratch-spin on mobile (js/vinyl.js bails) — a touch on
     it should scroll the slider, not grab the disc. */
  .vinyl__disc-spin {
    touch-action: pan-x;
    cursor: default;
  }

  /* Pagination dots (js/vinyl-slider-dots.js) — blush on the green
     section. */
  .vinyl-slider-dots {
    display: flex;
    justify-content: center;
    gap: 8px;
    margin-top: 12px;
  }

  .vinyl-slider-dots__dot {
    width: 7px;
    height: 7px;
    padding: 0;
    border: 0;
    border-radius: 50%;
    background: color-mix(in srgb, var(--color-blush) 35%, transparent);
    cursor: pointer;
    transition:
      background-color 0.25s ease,
      transform 0.25s ease;
  }

  .vinyl-slider-dots__dot.is-active {
    background: var(--color-blush);
    transform: scale(1.25);
  }
}

@media (min-width: 901px) {
  .vinyl-slider-dots {
    display: none;
  }
}

/* =========================================================
   Statement (About Us) — scroll-pinned crab/lobster converge over the
   text. Restored here (was moved out to the footer for a while — see
   .site-footer__brand's own history) using the same artwork and the
   same percentages as .intro's own apart/together stage;
   js/statement-scroll.js (never actually deleted, just unwired) owns
   the scroll-progress interpolation. Blush ground now, not green — see
   the eyebrow/heading/text colors below, flipped to green accordingly. */

.statement {
  position: relative;
  background: var(--color-blush);
}

/* .statement__track is the tall scroll runway (height set by
   js/statement-scroll.js's own math, ~250vh) that the visitor actually
   scrolls through; .statement__pin is the 100vh sticky stage that stays
   put while it does — same pin/track split as .site-footer__brand-pin/
   -sticky used for its own now-removed version of this effect. */
.statement__track {
  position: relative;
  height: 250vh;
}

.statement__pin {
  position: sticky;
  top: 0;
  height: 100vh;
  display: flex;
  align-items: center;
  justify-content: center;
}

/* About Us hover ImageTrail (js/about-image-trail.js) — desktop only.
   Clips the flung photos to the pinned stage itself, not the whole
   (250vh) track behind it. */
@media (hover: hover) and (pointer: fine) {
  .statement__pin {
    overflow: hidden;
  }
}

/* Same numbers as .intro__crab/.intro__lobster's apart state — these
   are just the resting/before-first-scroll-frame values; js/statement-
   scroll.js overwrites top/left/opacity as inline styles once it runs. */
.statement__crab,
.statement__lobster {
  position: absolute;
  /* Above .statement__inner's z-index:1, so they visually cover the text
     as they converge instead of sitting behind it — same relationship
     as .site-footer__brand-illustration (2) vs. -center (1). */
  z-index: 2;
  height: auto;
  max-width: none;
  pointer-events: none;
}

.statement__crab {
  width: 40.9vw;
  top: 64%;
  left: -20.4%;
}

.statement__lobster {
  width: 52vw;
  top: -2.6%;
  left: 76.7%;
}

@media (max-width: 900px) {
  /* Pure horizontal parting on mobile, top fixed — mirrors .intro's own
     mobile override (see its comment) since both share this artwork and
     this exact rule. */
  .statement__crab,
  .statement__lobster {
    top: calc(36.7% + 20px);
  }

  .statement__crab {
    left: -40.9%;
  }

  .statement__lobster {
    left: 100%;
  }
}

/* Typewriter cursor for the About Us body text (js/statement-typetext.js). */
.type-cursor {
  display: inline-block;
  margin-left: 0.05em;
  font-weight: 300;
  color: currentColor;
  animation: type-cursor-blink 0.9s steps(1, end) infinite;
}
@keyframes type-cursor-blink {
  0%,
  49% {
    opacity: 1;
  }
  50%,
  100% {
    opacity: 0;
  }
}
@media (prefers-reduced-motion: reduce) {
  .type-cursor {
    display: none;
  }
}

.about-trail {
  position: absolute;
  inset: 0;
  z-index: 1;
  pointer-events: none;
  overflow: hidden;
}

.about-trail__img {
  position: absolute;
  top: 0;
  left: 0;
  width: clamp(170px, 15vw, 240px);
  aspect-ratio: 4 / 3;
  /* Show the whole photo, not a cropped centre-crop of it. */
  object-fit: contain;
  background: var(--color-cream);
  border-radius: 2px;
  opacity: 0;
  will-change: transform, opacity;
  box-shadow: 0 22px 48px rgba(11, 15, 11, 0.34);
}

.statement__inner {
  position: relative;
  z-index: 1;
  max-width: 680px;
  width: 100%;
  /* Centered on desktop, left on mobile (see the max-width:900px
     override below) — every child (eyebrow, "Since...", heading, body
     text) inherits this rather than setting its own text-align. */
  text-align: center;
  padding: 0 var(--gutter);
}

@media (max-width: 900px) {
  .statement__inner {
    text-align: left;
  }
}

.statement .eyebrow {
  color: var(--color-green);
}

/* "Since November 2025" — same eyebrow styling as "ABOUT US" (reuses
   the .eyebrow class), stacked right under it in normal flow now (was
   pinned to the opposite corner). */
/* "ABOUT US" and "Since November 2025" read as one label wrapped onto
   two lines, not two separate blocks — a tight gap between them, the
   normal (bigger) .eyebrow bottom margin only after the second line. */
/* On one line with .statement__since, not stacked — inline-block so
   they sit side by side while keeping each its own .reveal animation
   and margin. */
.statement__eyebrow {
  display: inline-block;
  /* Small gap — was 8px, on request: reads as two disconnected chips
     rather than one flowing "About Us Since November 2025" line. */
  margin: 0 4px 20px 0;
}

.statement__since {
  display: inline-block;
  margin: 0 0 20px;
}

/* A full sentence, not a 2-3 word tagline — the old giant uppercase
   display treatment (--text-heading, -4.8px tracking) read as shouting
   once real sentence-length copy went in it. Sized as a lead-in instead:
   still the display face for character, but sentence case and a size
   that sits between the body copy below it and an actual section
   heading. */
.statement__heading {
  font-family: var(--font-display);
  font-weight: 300;
  /* Matches .vinyl__heading's own treatment, per explicit request. */
  font-size: var(--text-heading);
  /* Reverted back to all-caps on request — was briefly de-capped this
     session, decision reversed after review. Tight numbers restored to
     match all-caps glyphs (no ascenders/descenders). */
  line-height: 1.14;
  letter-spacing: -4.8px;
  text-transform: uppercase;
  color: var(--color-green);
  margin: 0 0 24px;
}

.statement__heading em {
  font-style: italic;
  text-transform: uppercase;
}

.statement__text {
  font-family: var(--font-mono);
  font-weight: 300;
  font-size: var(--text-sm);
  line-height: var(--leading-normal);
  letter-spacing: -0.5px;
  color: var(--color-green);
  margin: 0;
  opacity: 0.82;
}

.statement__text + .statement__text {
  margin-top: 16px;
}

/* Reuses the hero's own claw button — .statement__cta only overrides its
   margin (the hero variant auto-centers itself; here it sits flush left,
   under the left-aligned copy, at both breakpoints). Two-class selector
   outranks .hero__cta-wrap alone, so this wins regardless of source order
   against the hero's own responsive margin rules. */
.hero__cta-wrap.statement__cta {
  margin: 32px 0 0;
}

/* =========================================================
   Responsive
   ========================================================= */

@media (max-width: 900px) {
  :root {
    --gutter: 24px;
  }

  .hero {
    min-height: 100vh;
    min-height: 100svh;
  }

  .hero__title {
    font-size: 68px;
    letter-spacing: -2.6px;
    text-align: center;
  }

  .nav {
    flex-direction: row;
    justify-content: space-between;
    align-items: center;
    gap: 0;
    padding: 16px 20px;
  }

  .nav__logo {
    order: 1;
  }

  /* The desktop side-by-side split (heading | questions) collapses back
     to a single stacked column here — heading on top, full-width list
     below, both centered, same as the section always rendered at this
     breakpoint. */
  .faq__inner {
    display: block;
  }

  .faq__header {
    grid-column: unset;
    grid-row: unset;
    padding-right: 0;
    margin-left: 0;
    margin-top: 0;
    margin-bottom: 40px;
  }

  /* No leftover column to fill on the stacked mobile layout — the
     illustration would just add scroll length above the questions. */
  .faq__illustration {
    display: none;
  }

  .faq__list {
    width: 100%;
    margin-right: 0;
  }

  .faq__header,
  .faq__heading {
    text-align: center;
  }

  /* One mobile size for every big display heading — the same
     clamp(24px, 7.4vw, 34px) the menu-index category names use, on
     request. Was 44px (--text-heading-mobile), which made the longer
     ones (About Us especially) eat the whole screen. */
  .journal__heading,
  .reviews__heading,
  .faq__heading,
  .closing-cta__heading,
  .statement__heading,
  .events-teaser__heading,
  .vinyl__heading,
  .menu-page__heading {
    font-size: clamp(24px, 7.4vw, 34px);
    letter-spacing: -1.6px;
  }

  .faq__heading .line {
    white-space: nowrap;
  }

  .journal {
    padding-top: 40px;
  }

  .journal__header {
    margin-bottom: 12px;
  }

  /* homepage teaser (#journal) — its own id beats the .journal rule
     above, so cap its big --space-14 padding here too */
  #journal {
    padding: 36px 0;
  }

  #journal .journal__header {
    margin-bottom: 12px;
  }

  .pre-journal-cta {
    padding: 2px var(--gutter) 56px;
  }

  .journal-entry {
    grid-template-columns: 1fr;
    gap: 24px;
    padding: 32px 0;
  }

  .journal-entry__image,
  .events-entry__image {
    aspect-ratio: 946 / 709;
  }

  /* Mobile: a swipeable horizontal slider, not three cards stacked down
     the page. Full-bleed scroll-snap strip; each card is ~82vw so the
     next one peeks in from the right. */
  .journal-list--teaser {
    display: flex;
    /* .journal-list's base rule sets flex-direction:column — force row
       back or the "slider" just stacks vertically. */
    flex-direction: row;
    flex-wrap: nowrap;
    grid-template-columns: none;
    gap: 16px;
    width: 100vw;
    margin-left: calc(50% - 50vw);
    margin-right: calc(50% - 50vw);
    /* Matches .card-stack's own height exactly — js/card-stack.js
       converts this static row into that swipeable deck shortly after
       load, and a mismatch between this row's natural (content-based)
       height and the deck's fixed height was the site's single biggest
       CLS contributor (measured 0.634 — nearly the entire page's
       shift). Reserving the same space up front makes that swap
       invisible instead of shoving everything below it down the page. */
    min-height: clamp(420px, 64vh, 520px);
    /* Extra top/bottom (and side) padding so each card's drop shadow
       isn't sliced by this scroller's own overflow-x:auto clip — with
       overflow-x set, overflow-y can't stay visible, so the room has to
       come from padding instead. */
    /* side padding = half the leftover, so card 1 sits centred at
       scrollLeft 0 (and the last one can centre-snap) */
    /* generous top/bottom so the card drop-shadows are not sliced */
    padding: 30px calc((100vw - 82vw) / 2) 34px;
    overflow-x: auto;
    overflow-y: hidden;
    touch-action: pan-x;
    overscroll-behavior-x: contain;
    /* mandatory (not proximity) so a swipe always lands on a card — the
       proximity version left the strip parked between two. The one-card
       cap is enforced by js/journal-slider-dots.js. */
    scroll-snap-type: x mandatory;
    -webkit-overflow-scrolling: touch;
    scrollbar-width: none;
  }

  .journal-list--teaser::-webkit-scrollbar {
    display: none;
  }

  .journal-list--teaser .journal-entry {
    flex: 0 0 82vw;
    scroll-snap-align: center;
  }

  .journal-list--teaser .journal-entry__excerpt {
    font-size: 14px;
    line-height: 1.5;
  }

  /* Slider pagination dots (built by js/journal-slider-dots.js) — one
     per article, the centred card's dot filled in. */
  .journal-slider-dots {
    display: flex;
    justify-content: center;
    gap: 8px;
    margin-top: 18px;
  }

  .journal-slider-dots__dot {
    width: 7px;
    height: 7px;
    border-radius: 50%;
    background: color-mix(in srgb, var(--color-green) 30%, transparent);
    transition:
      background-color 0.25s ease,
      transform 0.25s ease;
  }

  .journal-slider-dots__dot.is-active {
    background: var(--color-green);
    transform: scale(1.25);
  }
}

/* Never show the dots on desktop (the grid layout has no slider). */
@media (min-width: 901px) {
  .journal-slider-dots {
    display: none;
  }
}

@media (max-width: 600px) {
  .hero__title {
    font-size: var(--text-2xl);
    letter-spacing: -1.8px;
  }

  .btn {
    height: 64px;
    padding: 0 30px;
    font-size: var(--text-sm);
    letter-spacing: -1.1px;
  }

  /* The hero CTA is a special-cased design element (claw flourish sized
     and positioned around it) — it shouldn't shrink along with generic
     buttons on small screens, or the claw math above stops lining up.
     Padding must stay identical to the base .btn--hero declaration
     (0 72px 0 40px) for exactly that reason — the arrow's absolute
     `right` offset and the claw's grip are both tuned against that
     right-padding value. An earlier version of this override also
     shrank the padding to "0 26px 0 28px", which narrowed the button
     enough that the arrow ended up sitting on top of the last letters
     of the label, and the claw's pincer gripped past the button's new
     (shorter) actual edge instead of at it. .hero__cta-wrap's own
     scale(0.82) below already handles the mobile size reduction for
     the whole button+claw+arrow group as one proportional unit — this
     block only needs to opt back out of the generic .btn shrink above,
     not introduce a different width relationship. */
  .btn--hero {
    height: 88px;
    padding: 0 72px 0 40px;
    font-size: 19px;
    letter-spacing: -0.95px;
  }

  .journal-entry__title,
  .faq-item__toggle {
    font-size: var(--text-md);
    letter-spacing: -0.8px;
  }
}

/* =========================================================
   Article pages
   ========================================================= */

.hero--article {
  min-height: 62vh;
}

.article-title {
  font-family: var(--font-display);
  font-weight: 300;
  color: var(--color-blush);
  font-size: var(--text-3xl);
  line-height: var(--leading-snug);
  letter-spacing: -2.2px;
  text-transform: uppercase;
  max-width: 820px;
  text-align: center;
}

.article {
  max-width: 720px;
  margin: 0 auto;
  padding: var(--space-12) var(--gutter) var(--space-14);
}

.article__back {
  display: inline-flex;
  align-items: center;
  gap: 10px;
  font-family: var(--font-mono);
  font-weight: 300;
  font-size: var(--text-xs);
  letter-spacing: -0.9px;
  color: var(--color-green);
  text-transform: uppercase;
  margin-bottom: 60px;
  transition: opacity 0.2s ease;
}

.article__back:hover {
  opacity: 0.6;
}

.article__back img {
  width: 16px;
  height: 14px;
  transform: rotate(180deg);
}

/* Byline — hidden via [hidden] until js/journal-article-sanity.js fills it
   in (and only then, since an article with no author set shouldn't show
   an empty "By —"). */
.article__meta {
  font-family: var(--font-mono);
  font-weight: 300;
  font-size: var(--text-xs);
  letter-spacing: -0.3px;
  color: var(--color-green);
  opacity: 0.62;
  margin: -32px 0 48px;
}

.article__body p {
  font-family: var(--font-mono);
  font-weight: 300;
  font-size: var(--text-base);
  line-height: var(--leading-relaxed);
  letter-spacing: -0.4px;
  color: var(--color-ink);
  margin: 0 0 28px;
}

.article__body p:last-child {
  margin-bottom: 0;
}

.article__body h2 {
  font-family: var(--font-display);
  font-weight: 300;
  font-size: var(--text-lg);
  letter-spacing: -1px;
  text-transform: uppercase;
  color: var(--color-green);
  margin: 48px 0 14px;
}

.article__body h2:first-child {
  margin-top: 0;
}

/* Topic tags — set per-article in the admin ("Keywords / topic tags"),
   shown as one quiet mono line rather than pill/chip buttons, matching
   the same restrained typographic voice as .site-footer__legal instead
   of introducing a new "card" treatment. [hidden] until
   js/journal-article-sanity.js fills it in, same reasoning as
   .article__meta above. */
.article__tags {
  font-family: var(--font-mono);
  font-weight: 300;
  font-size: var(--text-2xs);
  letter-spacing: 0.3px;
  text-transform: uppercase;
  color: var(--color-green);
  opacity: 0.55;
  margin-top: 48px;
  padding-top: 24px;
  border-top: 1px dashed rgba(11, 15, 11, 0.15);
}

.article__cta {
  margin-top: 64px;
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  gap: 16px;
}

@media (max-width: 900px) {
  .hero--article {
    min-height: 46vh;
  }

  .article-title {
    font-size: var(--text-xl);
    letter-spacing: -1.4px;
  }

  .article {
    padding: 70px var(--gutter) 100px;
  }

  .article__body p {
    font-size: var(--text-sm);
  }
}

/* =========================================================
   Full menu page (menu.html)
   ========================================================= */

.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;
}

.hero--menu {
  min-height: unset;
  background: var(--color-green);
}

.hero__content--menu {
  padding: 40px var(--gutter) 90px;
  align-items: flex-start;
  text-align: left;
}

.hero__content--menu .hero__stack {
  align-items: flex-start;
  width: 100%;
}

.menu-page__heading {
  font-family: var(--font-display);
  font-weight: 300;
  font-size: var(--text-5xl);
  letter-spacing: -3.36px;
  text-transform: uppercase;
  color: var(--color-blush);
  margin: 0;
}

.menu-page__search {
  position: relative;
  display: block;
  max-width: 420px;
  width: 100%;
}

.menu-page__search-icon {
  position: absolute;
  top: 50%;
  left: 24px;
  width: 17px;
  height: 17px;
  transform: translateY(-50%);
  color: rgba(252, 222, 225, 0.5);
  pointer-events: none;
}

.menu-page__search input {
  width: 100%;
  height: 60px;
  padding: 0 24px 0 52px;
  border: 1px solid rgba(252, 222, 225, 0.35);
  border-radius: 100px;
  background: transparent;
  font-family: var(--font-mono);
  font-weight: 300;
  font-size: var(--text-base);
  letter-spacing: -1.2px;
  color: var(--color-cream);
}

.menu-page__search input::placeholder {
  color: rgba(252, 222, 225, 0.5);
}

.menu-page__search input:focus {
  outline: none;
  border-color: var(--color-accent);
}

.menu-page__tabs {
  display: flex;
  gap: 24px;
  overflow-x: auto;
  width: 100%;
  padding-bottom: 4px;
  scrollbar-width: none;
}

.menu-page__tabs::-webkit-scrollbar {
  display: none;
}

.menu-page__tab {
  white-space: nowrap;
  background: none;
  border: none;
  padding: 0 0 6px;
  border-bottom: 1px solid transparent;
  font-family: var(--font-mono);
  font-weight: 300;
  font-size: var(--text-sm);
  letter-spacing: -1px;
  text-transform: uppercase;
  color: rgba(252, 222, 225, 0.6);
  cursor: pointer;
  transition:
    color 0.25s ease,
    border-color 0.25s ease;
}

.menu-page__tab:hover {
  color: var(--color-blush);
}

.menu-page__tab.is-active {
  color: var(--color-blush);
  border-bottom-color: var(--color-accent);
}

.menu-page__panel.is-hidden {
  display: none;
}

.menu-page__nav {
  display: flex;
  gap: 28px;
  overflow-x: auto;
  width: 100%;
  margin-bottom: 40px;
  padding-bottom: 8px;
  scrollbar-width: none;
}

.menu-page__nav::-webkit-scrollbar {
  display: none;
}

.menu-page__nav.is-hidden {
  display: none;
}

.menu-page__pill {
  white-space: nowrap;
  font-family: var(--font-mono);
  font-weight: 300;
  font-size: var(--text-sm);
  letter-spacing: -1px;
  text-transform: uppercase;
  color: rgba(11, 15, 11, 0.55);
  transition: color 0.25s ease;
}

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

.menu-page {
  position: relative;
  max-width: var(--page-max);
  margin: 0 auto;
  padding: 90px var(--gutter) 140px;
}

/* Coral-branch texture, almost subliminal — the sea, not a wallpaper.
   A pseudo-element rather than a background-image directly on
   .menu-page so opacity only touches the texture, never the dish text
   sitting on top of it. Fixed attachment would be nicer but disables on
   iOS Safari and costs a repaint on scroll for no visible gain at this
   opacity; a tall, non-repeating background sized to the page's own
   height reads the same without the cost. */
.menu-page::before {
  content: "";
  position: absolute;
  inset: 0;
  z-index: -1;
  background-image: url("../assets/images/coral-pattern.webp");
  background-size: 900px;
  background-repeat: repeat;
  background-position: top center;
  opacity: 0.05;
  pointer-events: none;
}

.menu-page__section {
  padding-top: 64px;
  margin-top: 64px;
  border-top: 1px dashed rgba(0, 0, 0, 0.35);
}

.menu-page__section:first-of-type {
  margin-top: 40px;
  padding-top: 0;
  border-top: none;
}

.menu-page__section.is-hidden {
  display: none;
}

.menu-page__section-head {
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  justify-content: space-between;
  gap: 16px;
  margin-bottom: 36px;
}

.menu-page__section-heading {
  font-family: var(--font-display);
  font-weight: 300;
  font-size: var(--text-2xl);
  letter-spacing: -2px;
  text-transform: uppercase;
  color: var(--color-green);
  margin: 0;
}

.menu-page__section-note {
  font-family: var(--font-mono);
  font-weight: 300;
  font-size: var(--text-sm);
  letter-spacing: -0.6px;
  opacity: 0.6;
  margin: 0;
}

.menu-page__grid {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: 36px 48px;
}

.menu-page__item {
  display: flex;
  gap: 20px;
}

.menu-page__item.is-hidden {
  display: none;
}

.menu-page__item-photo {
  flex: none;
  width: 96px;
  height: 96px;
  border-radius: 12px;
  overflow: hidden;
}

.menu-page__item-photo img {
  width: 100%;
  height: 100%;
  object-fit: cover;
}

.menu-page__item-body {
  flex: 1;
  min-width: 0;
}

.menu-page__item-top {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: 16px;
}

.menu-page__item-name {
  font-family: var(--font-mono);
  font-weight: 400;
  font-size: var(--text-base);
  letter-spacing: -0.6px;
  color: var(--color-ink);
  margin: 0;
}

.menu-page__item-price {
  font-family: var(--font-mono);
  font-weight: 300;
  font-size: var(--text-base);
  letter-spacing: -0.6px;
  color: var(--color-accent);
  white-space: nowrap;
}

.menu-page__item-desc {
  font-family: var(--font-mono);
  font-weight: 300;
  font-size: var(--text-xs);
  line-height: var(--leading-normal);
  letter-spacing: -0.3px;
  color: var(--color-ink);
  opacity: 0.7;
  margin: 6px 0 0;
}

.menu-page__item-allergens {
  font-family: var(--font-mono);
  font-weight: 300;
  font-size: var(--text-2xs);
  letter-spacing: 0;
  text-transform: uppercase;
  color: var(--color-accent);
  opacity: 0.85;
  margin: 6px 0 0;
}

.menu-page__item-diet {
  font-family: var(--font-mono);
  font-weight: 300;
  font-size: var(--text-2xs);
  letter-spacing: 0;
  text-transform: uppercase;
  color: #2e7d32;
  opacity: 0.85;
  margin: 6px 0 0;
}

.menu-page__empty {
  display: none;
  padding: 80px 0;
  text-align: center;
  font-family: var(--font-mono);
  font-weight: 300;
  font-size: var(--text-base);
  opacity: 0.6;
}

.menu-page__empty.is-visible {
  display: block;
}

/* ---------- Item detail card (photo items only) ---------- */

.menu-page__item--clickable {
  cursor: pointer;
  border-radius: 12px;
  outline: none;
  transition: color 0.25s ease;
}

.menu-page__item--clickable:hover .menu-page__item-name,
.menu-page__item--clickable:focus-visible .menu-page__item-name {
  color: var(--color-accent);
}

.menu-page__item--clickable .menu-page__item-photo {
  transition: transform 0.35s cubic-bezier(0.16, 0.84, 0.44, 1);
}

.menu-page__item--clickable:hover .menu-page__item-photo,
.menu-page__item--clickable:focus-visible .menu-page__item-photo {
  transform: scale(1.04);
}

.menu-page__card {
  width: calc(100% - 48px);
  max-width: 480px;
  padding: 0;
  border: none;
  border-radius: 20px;
  background: var(--color-cream);
  color: var(--color-ink);
  overflow: hidden;
  opacity: 0;
  transform: translateY(16px) scale(0.98);
  transition:
    opacity 0.3s cubic-bezier(0.16, 0.84, 0.44, 1),
    transform 0.3s cubic-bezier(0.16, 0.84, 0.44, 1);
}

.menu-page__card::backdrop {
  background: rgba(11, 15, 11, 0.55);
  opacity: 0;
  transition: opacity 0.3s ease;
}

.menu-page__card.is-open {
  opacity: 1;
  transform: translateY(0) scale(1);
}

.menu-page__card.is-open::backdrop {
  opacity: 1;
}

.menu-page__card-close {
  position: absolute;
  top: 16px;
  right: 16px;
  z-index: 1;
  width: 36px;
  height: 36px;
  display: flex;
  align-items: center;
  justify-content: center;
  border: none;
  border-radius: 100px;
  background: rgba(242, 236, 227, 0.9);
  color: var(--color-ink);
  font-size: var(--text-md);
  line-height: var(--leading-tight);
  cursor: pointer;
  transition: background-color 0.25s ease;
}

.menu-page__card-close:hover {
  background: var(--color-cream);
}

.menu-page__card-photo {
  width: 100%;
  aspect-ratio: 4 / 3;
}

.menu-page__card-photo img {
  width: 100%;
  height: 100%;
  object-fit: cover;
}

.menu-page__card-body {
  padding: 28px 28px 32px;
}

.menu-page__card-top {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: 16px;
}

.menu-page__card-name {
  font-family: var(--font-display);
  font-weight: 300;
  font-size: var(--text-lg);
  letter-spacing: -1.2px;
  text-transform: uppercase;
  color: var(--color-green);
  margin: 0;
}

.menu-page__card-price {
  font-family: var(--font-mono);
  font-weight: 300;
  font-size: var(--text-md);
  letter-spacing: -0.6px;
  color: var(--color-accent);
  white-space: nowrap;
}

.menu-page__card-desc {
  font-family: var(--font-mono);
  font-weight: 300;
  font-size: var(--text-sm);
  line-height: var(--leading-loose);
  letter-spacing: -0.3px;
  opacity: 0.75;
  margin: 14px 0 0;
}

.menu-page__card-desc:empty {
  display: none;
}

.menu-page__card-allergens {
  font-family: var(--font-mono);
  font-weight: 300;
  font-size: var(--text-2xs);
  letter-spacing: 0;
  text-transform: uppercase;
  opacity: 0.5;
  margin: 10px 0 0;
}

.menu-page__card-allergens:empty {
  display: none;
}

@media (prefers-reduced-motion: reduce) {
  .menu-page__card,
  .menu-page__card::backdrop {
    transition: none !important;
  }
}

@media (max-width: 900px) {
  .hero__content--menu {
    padding: 24px var(--gutter) 70px;
  }

  .menu-page {
    padding: 70px var(--gutter) 100px;
  }

  .menu-page__heading {
    font-size: var(--text-3xl);
    letter-spacing: -2.2px;
  }

  .menu-page__grid {
    grid-template-columns: 1fr;
  }

  .menu-page__section-heading {
    font-size: var(--text-xl);
    letter-spacing: -1.4px;
  }
}

@media (max-width: 600px) {
  .menu-page__item-photo {
    width: 72px;
    height: 72px;
  }

  .menu-page__heading {
    font-size: 42px;
    letter-spacing: -1.6px;
  }
}

/* =========================================================
   Site footer
   ========================================================= */

/* Redesigned per Figma (node 853:252 desktop / 854:398 mobile): blush
   background instead of the old dark-green panel, three dashed-rule
   bands (nav+hours+social / the illustrated wordmark / legal), coral
   center lockup flanked by the same two line-art characters used
   elsewhere on the site. Sizes between the two Figma breakpoints
   (tablet, foldables, etc.) are fluid/clamp()-based rather than a third
   fixed design, since only mobile and desktop frames were specified. */
.site-footer {
  position: relative;
  background: var(--color-blush-panel);
  color: var(--color-green);
  padding: 0 var(--gutter);
  /* Same fine dashed hairline as the FAQ list dividers (1px, 50%-alpha
     green) — was a bolder 2px solid-green-ish dash that read heavier
     than every other dashed rule on the site. */
  border-top: 1px dashed rgba(46, 72, 43, 0.5);
  font-family: var(--font-mono);
  font-weight: 300;
}

.site-footer__row {
  width: 100%;
  display: flex;
  align-items: flex-start;
  justify-content: space-between;
  gap: clamp(16px, 4vw, 80px);
  padding: 28px 0;
}

/* Full-bleed dashed rule, not one inset to .site-footer's own gutter
   padding — negative margin cancels that padding so the border itself
   reaches both true edges, then equal padding added back so the row's
   own content (nav/hours/social) still lines up at the usual gutter
   instead of sliding out to the edge with it. */
/* Grid, not the flex:1-on-the-middle-item trick .site-footer__row uses —
   that trick only lands hours in the row's true center when nav and
   social happen to be equal width (they aren't: nav is three short
   words, social carries icons and a phone number), so hours was
   centering in whatever space was left over instead, with more room on
   one side than the other. 1fr/auto/1fr keeps it at the actual midpoint
   regardless. Also carries its own explicit full-bleed width — the
   inherited width:100% from .site-footer__row is 100% of the *padded*
   parent content box, which the margin-left/-right below can shift but
   not widen, so the border landed short of the right edge; this adds
   back the two gutters the negative margins pulled in from. */
.site-footer__row--top {
  display: grid;
  grid-template-columns: 1fr auto 1fr;
  align-items: start;
  /* Same fine dashed hairline as the FAQ list dividers (1px, 50%-alpha
     green) — same full-bleed-under-padded-content trick as the
     width/margin/padding below. */
  border-bottom: 1px dashed rgba(46, 72, 43, 0.5);
  width: calc(100% + var(--gutter) * 2);
  margin-left: calc(-1 * var(--gutter));
  margin-right: calc(-1 * var(--gutter));
  padding-left: var(--gutter);
  padding-right: var(--gutter);
}

.site-footer__nav {
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  gap: 10px;
  justify-self: start;
}

.site-footer__nav a,
.site-footer__social-link {
  transition: opacity 0.25s ease;
}

.site-footer__nav a:hover,
.site-footer__social-link:hover {
  opacity: 0.65;
}

.site-footer__hours,
.site-footer__nav,
.site-footer__social {
  font-size: var(--text-sm);
  letter-spacing: -0.6px;
  text-transform: uppercase;
}

.site-footer__hours {
  margin: 0;
  justify-self: center;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 10px;
  text-align: center;
  line-height: var(--leading-loose);
  opacity: 0.9;
}

.site-footer__social {
  display: flex;
  flex-direction: column;
  align-items: flex-end;
  gap: 10px;
  justify-self: end;
  opacity: 0.9;
}

.site-footer__social-link {
  display: inline-flex;
  align-items: center;
  gap: 8px;
}

.site-footer__social-icon {
  width: 16px;
  height: 16px;
  flex-shrink: 0;
}

/* Used to be the pin/extra-scroll-room pair for a scroll-driven
   crab/lobster converge (js/footer-brand-scroll.js) — that motion moved
   to the About Us section instead (see .statement__track/-pin), so this
   footer stage is a plain static block now, frozen at what used to be
   its resting/apart frame. Kept as a wrapper (rather than flattened
   away) only so the nav/hours/social row and the brand stage below it
   don't need re-nesting. */
.site-footer__brand-pin {
  position: relative;
}

.site-footer__brand-sticky {
  display: flex;
  flex-direction: column;
  /* svh (not just vh) — same fix as .hero's own dual declaration: 100vh
     is measured against the browser's tallest possible viewport (toolbar
     collapsed), so on a shorter real viewport (toolbar showing) the box
     is taller than what's visibly filled, leaving a strip of the body's
     own cream background exposed past the footer's actual bottom edge. */
  height: 100vh;
  height: 100svh;
}

/* Deliberately mirrors .intro's own crab/lobster staging — same
   full-viewport stage (minus whatever height the nav/hours/social row
   above it takes up), same widths (40.9vw / 52vw), same apart-frame
   coordinates, just static now rather than scroll-interpolated: this
   was always the resting look before a visitor ever scrolled into the
   (now-removed) converge, so freezing it here changes nothing visually
   at rest. Reusing the exact assets/icons/intro-crab.svg +
   intro-lobster.svg files (not a separate footer-specific crop) keeps
   this visually identical to the About Us block's own version of the
   same motif. */
.site-footer__brand {
  position: relative;
  overflow: hidden;
  width: 100vw;
  flex: 1 1 auto;
  min-height: 0;
  margin-left: calc(-1 * var(--gutter));
  margin-right: calc(-1 * var(--gutter));
  background: var(--color-blush-panel);
}

/* The tagline now, not the wordmark — swapped with .intro's own center
   piece (see .intro__logo above) so each "moment" shows the other's
   original content. Same typographic treatment .intro__text used to
   carry (including its mobile/1300px overrides below), just relocated
   here — always visible (no opacity toggle the way .intro__logo has;
   the footer never needed one), covered by the converging illustrations
   via z-index as they close in instead of fading itself. */
/* Tagline + the Book Now button below it, centred on the pinned stage as
   one block (the button was added under the heading on request). */
.site-footer__brand-center {
  position: absolute;
  top: 44%;
  left: 50%;
  z-index: 1;
  transform: translate(-50%, -50%);
  display: flex;
  flex-direction: column;
  align-items: center;
  width: max-content;
  max-width: 92vw;
}

.site-footer__brand-text {
  margin: 0;
  padding: 0 16px;
  font-family: var(--font-display);
  font-weight: 300;
  -webkit-text-size-adjust: 100%;
  text-size-adjust: 100%;
  font-size: var(--text-4xl);
  line-height: var(--leading-tight);
  letter-spacing: -2.4px;
  text-align: center;
  text-transform: uppercase;
  color: var(--color-green);
}

.site-footer__brand-cta {
  margin-top: 44px;
}

.site-footer__brand-cta .hero__cta-wrap {
  margin: 0;
}

/* A grid, not the flex row every other .site-footer__row uses — the
   copyright and legal-links text are different lengths, and flex's
   flex:1-on-the-middle-item trick only lands the address in the true
   center of the row when its two neighbors happen to be equal width.
   1fr/auto/1fr keeps the address pinned to the row's actual midpoint
   regardless of how long the copyright or legal-links text is. */
.site-footer__row--bottom {
  display: grid;
  grid-template-columns: 1fr auto 1fr;
  align-items: center;
  /* Same size as .site-footer__nav (MENU/EVENTS/JOURNAL) above it, on
     request — just without that row's uppercase transform, so the
     copyright/address/legal-links text keeps its normal casing. */
  font-size: var(--text-sm);
  letter-spacing: -0.6px;
  opacity: 0.9;
}

/* Anchored to the bottom of the pinned .site-footer__brand stage (see
   the HTML comment where this row is nested, inside the brand row
   rather than after it) — visible the whole time the crab/lobster
   converge plays, both at rest and mid-converge, on desktop and
   mobile, instead of only appearing once the visitor scrolls past the
   pin. z-index above the illustrations (2) and logo/text (1) so it's
   never covered as they converge over the middle of the stage. Needs
   its own horizontal padding here since .site-footer__brand is a
   full-bleed box (width:100vw) that escapes .site-footer's own gutter
   padding — this row would otherwise sit flush against the true
   viewport edges instead of lining up with the row above it. */
.site-footer__brand .site-footer__row--bottom {
  position: absolute;
  left: 0;
  right: 0;
  /* 15px lower than it used to sit, on request — the extra 15px goes on
     padding-top (pushes the text down inside the row) and comes back off
     `bottom` (drops the row so its top edge, i.e. the dashed rule, stays
     put) so only the text moves. */
  bottom: calc(clamp(12px, 1.5vw, 24px) - 15px);
  z-index: 3;
  padding-left: var(--gutter);
  padding-right: var(--gutter);
  /* Fine dashed hairline (1px, 50%-alpha green — same as the FAQ list
     dividers) above the copyright/address/legal text only, none below
     it — full viewport width via this row's own left:0/right:0 inside
     .site-footer__brand's 100vw box, no extra bleed math needed. */
  padding-top: 27px;
  border-top: 1px dashed rgba(46, 72, 43, 0.5);
}

.site-footer__copyright {
  justify-self: start;
  white-space: nowrap;
}

.site-footer__address {
  margin: 0;
  justify-self: center;
  text-align: center;
}

.site-footer__legal-links {
  display: flex;
  flex-wrap: wrap;
  justify-content: flex-end;
  justify-self: end;
  gap: 6px 18px;
}

.site-footer__legal-links a {
  transition: opacity 0.25s ease;
}

.site-footer__legal-links a:hover {
  opacity: 0.6;
}

/* Its own full-bleed block below the footer now, not a box inside it —
   fixed height (not aspect-ratio) so a very wide viewport doesn't turn
   that ratio into an oversized banner. */
.site-footer__map {
  width: 100%;
  height: 450px;
  overflow: hidden;
}

.site-footer__map iframe {
  display: block;
  width: 100%;
  height: 100%;
  border: 0;
}

@media (max-width: 900px) {
  .site-footer {
    padding: 0 var(--gutter);
  }

  .site-footer__row {
    padding: 20px 0;
  }

  /* Shorter fixed-height stage on mobile — a full 100vh left big empty
     bands above and below the crab/lobster. bg matches the page so
     there's no faint colour seam below it. */
  .site-footer,
  .site-footer__brand,
  .site-footer__brand-panel,
  .site-footer__brand-pin,
  .site-footer__brand-sticky {
    background: var(--color-blush);
  }

  /* nothing should draw a hairline where the brand box's clip ends */
  .site-footer__brand {
    overflow: visible;
  }

  .site-footer__brand-pin {
    height: auto !important;
  }

  .site-footer__brand-sticky {
    position: static;
    height: auto;
    min-height: 0;
    max-height: none;
  }

  /* No nav column on mobile — Menu/Events/Journal are already reachable
     any time via the hamburger pinned to the top of the viewport (see
     .nav's position:sticky rule above), so repeating them here would
     just be a second, redundant way to reach the same three links. */
  .site-footer__nav {
    display: none;
  }

  /* Figma's mobile frame pairs each contact line with the hours line
     across from it (phone/Mon–Fri, pinch.lisbon/Sat–Sun,
     Facebook/Fri&Sat) as a 2-column, 3-row grid rather than two
     side-by-side stacks — display:contents lifts each line out of its
     wrapper so the six become direct grid items placed explicitly (DOM
     order is Facebook/Instagram/phone; the grid reorders that to the
     phone-first row order Figma shows). */
  .site-footer__row--top {
    display: grid;
    grid-template-columns: auto auto;
    justify-content: space-between;
    column-gap: 8px;
    row-gap: 12px;
    width: 100vw;
    margin-left: calc(50% - 50vw);
    margin-right: calc(50% - 50vw);
    padding-left: 14px;
    padding-right: 14px;
    letter-spacing: -0.5px;
  }

  /* display:contents removes the wrapper's box but its font-size still
     cascades to the promoted spans/links — so the small type has to be
     set HERE (the row's own font-size never reaches them). Scaled off vw
     with a low ceiling so every contact line and every hours line stays
     on ONE line at any phone width without running off the edge. */
  .site-footer__hours,
  .site-footer__social {
    display: contents;
    font-size: clamp(9px, 2.7vw, 11.5px);
  }

  /* Never wrap a contact line or an hours line. */
  .site-footer__row--top .site-footer__social-link,
  .site-footer__row--top .site-footer__hours span {
    white-space: nowrap;
  }

  .site-footer__hours span {
    /* Hours on the LEFT now (was right). */
    text-align: left;
    grid-column: 1;
  }

  .site-footer__hours span:nth-child(1) {
    grid-row: 1;
  }

  .site-footer__hours span:nth-child(2) {
    grid-row: 2;
  }

  .site-footer__hours span:nth-child(3) {
    grid-row: 3;
  }

  .site-footer__social-link {
    /* Phone / Instagram / Facebook on the RIGHT (icon stays left of its
       label via the link's own inline-flex order). */
    grid-column: 2;
    justify-self: end;
  }

  .site-footer__social-link:nth-child(1) {
    grid-row: 3;
  }

  .site-footer__social-link:nth-child(2) {
    grid-row: 2;
  }

  .site-footer__social-link:nth-child(3) {
    grid-row: 1;
  }

  .site-footer__brand {
    height: 600px;
    flex: none;
  }

  /* Ported from .intro__text's own mobile override — smaller and fixed
     rather than vw-based: at this font-size "can change" only stays on
     one line below a specific pixel width, and that threshold doesn't
     scale with viewport the way vw would. An explicit width (not just
     max-width) matters here because position:absolute with no "right"
     set shrink-wraps to content instead of filling up to max-width,
     which was rendering narrower than intended and re-wrapping "can"
     alone. */
  .site-footer__brand-center {
    top: 42%;
    width: 245px;
  }

  .site-footer__brand-text {
    font-size: 32px;
    letter-spacing: -1.7px;
    width: 245px;
    max-width: 245px;
    padding: 0;
  }

  .site-footer__brand-cta {
    margin-top: 26px;
  }

  /* .site-footer__row--bottom is a 1fr/auto/1fr grid on desktop (see the
     base rule) — flex-direction here was a leftover from before that
     rule became a grid and did nothing once it did, which is exactly
     what left copyright/address/legal-links jumbled together instead of
     stacked. A single grid column, with each child's justify-self reset
     to center (their desktop start/center/end values would otherwise
     just hug that one column's own edges), reproduces the same "stack
     and center everything" the old flex version intended. */
  .site-footer__row--bottom {
    grid-template-columns: 1fr;
    justify-items: center;
    text-align: center;
    gap: 8px;
    /* Same small size as the working-hours / contact lines above, still
       normal casing (not uppercase). */
    font-size: clamp(9px, 2.7vw, 11.5px);
    letter-spacing: -0.3px;
  }

  .site-footer__row--bottom .site-footer__legal-links {
    font-size: inherit;
  }

  .site-footer__copyright,
  .site-footer__address,
  .site-footer__legal-links {
    justify-self: center;
  }

  .site-footer__legal-links {
    justify-content: center;
  }

  .closing-cta__content {
    padding: 80px var(--gutter) 48px;
  }
}

/* =========================================================
   Events
   ========================================================= */

/* ---------- Event detail modal (from the September Events fan) ---------- */
.event-card[data-event-modal] {
  cursor: pointer;
}

/* js/event-modal.js makes the cards focusable (role/tabindex) and the
   native <dialog> focuses itself/the close button on open — no focus
   ring at all on any of these, on request. */
.event-card[data-event-modal]:focus,
.event-card[data-event-modal]:focus-visible,
.event-modal:focus,
.event-modal:focus-visible,
.event-modal__inner:focus,
.event-modal__close:focus,
.event-modal__close:focus-visible {
  outline: none;
}

.event-modal {
  width: min(92vw, 460px);
  max-height: 88vh;
  margin: auto;
  padding: 0;
  border: 0;
  border-radius: 3px;
  background: var(--color-cream);
  color: var(--color-green);
  opacity: 0;
  transform: translateY(12px) scale(0.97);
  transition:
    opacity 0.22s ease,
    transform 0.22s ease;
  overflow: visible;
}

.event-modal.is-open {
  opacity: 1;
  transform: translateY(0) scale(1);
}

/* The box itself already fades + scales in above; its contents used to
   just appear the instant it did. Give the eyebrow/date/heading/copy/
   button their own quick staggered lift so the text reads as settling
   in, not popping in all at once. */
.event-modal__eyebrow,
.event-modal__date,
.event-modal__name,
.event-modal__desc,
.event-modal__cta {
  opacity: 0;
  transform: translateY(10px);
  transition:
    opacity 0.4s cubic-bezier(0.22, 1, 0.36, 1),
    transform 0.4s cubic-bezier(0.22, 1, 0.36, 1);
}
.event-modal.is-open .event-modal__eyebrow {
  transition-delay: 0.06s;
}
.event-modal.is-open .event-modal__date {
  transition-delay: 0.11s;
}
.event-modal.is-open .event-modal__name {
  transition-delay: 0.16s;
}
.event-modal.is-open .event-modal__desc {
  transition-delay: 0.21s;
}
.event-modal.is-open .event-modal__cta {
  transition-delay: 0.27s;
}
.event-modal.is-open .event-modal__eyebrow,
.event-modal.is-open .event-modal__date,
.event-modal.is-open .event-modal__name,
.event-modal.is-open .event-modal__desc,
.event-modal.is-open .event-modal__cta {
  opacity: 1;
  transform: translateY(0);
}
@media (prefers-reduced-motion: reduce) {
  .event-modal__eyebrow,
  .event-modal__date,
  .event-modal__name,
  .event-modal__desc,
  .event-modal__cta {
    opacity: 1;
    transform: none;
    transition: none;
  }
}

.event-modal::backdrop {
  background: rgba(11, 15, 11, 0.55);
  opacity: 0;
  transition: opacity 0.22s ease;
}

.event-modal.is-open::backdrop {
  opacity: 1;
}

.event-modal__inner {
  position: relative;
  padding: clamp(28px, 6vw, 44px);
}

.event-modal__close {
  position: absolute;
  top: 14px;
  right: 14px;
  width: 34px;
  height: 34px;
  padding: 0;
  border: 0;
  background: transparent;
  cursor: pointer;
}

.event-modal__close span {
  position: absolute;
  left: 6px;
  right: 6px;
  top: 50%;
  height: 1.5px;
  background: var(--color-green);
}

.event-modal__close span:nth-child(1) {
  transform: rotate(45deg);
}

.event-modal__close span:nth-child(2) {
  transform: rotate(-45deg);
}

.event-modal__eyebrow {
  margin: 0 0 18px;
  font-family: var(--font-mono);
  font-weight: 300;
  font-size: var(--text-xs);
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: color-mix(in srgb, var(--color-green) 60%, transparent);
}

.event-modal__date {
  margin: 0 0 6px;
  font-family: var(--font-mono);
  font-weight: 300;
  font-size: var(--text-sm);
  letter-spacing: 0.04em;
  color: var(--color-accent);
}

.event-modal__name {
  margin: 0 0 16px;
  font-family: var(--font-display);
  font-weight: 300;
  font-size: clamp(26px, 6vw, 38px);
  line-height: var(--leading-tight);
  letter-spacing: -1.2px;
  text-transform: uppercase;
  color: var(--color-green);
}

.event-modal__desc {
  margin: 0;
  font-family: var(--font-mono);
  font-weight: 300;
  font-size: var(--text-sm);
  line-height: var(--leading-normal);
  color: color-mix(in srgb, var(--color-ink) 82%, transparent);
}

.event-modal__cta {
  display: flex;
  justify-content: flex-start;
  margin-top: 34px;
}

/* The button's box is flush with the modal's text column, but a 100px-
   radius pill reads as inset — its rounded shoulder sits ~16px in from
   where the flat left edge of the eyebrow / heading / body copy above
   it lands. Pull the whole claw group left by that much so the pill
   optically sits on the same line the copy sets. */
.event-modal__cta .hero__cta-wrap {
  margin: 0 0 0 -16px;
}

/* ---------- Homepage teaser (.events-teaser) ----------
   Same pinned scroll-fan mechanism as the Journal section above — see
   .journal-track/.journal-stack/.journal-fan and js/journal-fan.js — with
   its own events-fan.js driving the (3, not 4, card) numbers. The section
   itself only owns the background now; .events-track owns the centering
   and padding, same split as #journal vs .journal-track. */
.events-teaser {
  position: relative;
  background: var(--color-blush);
}

.events-teaser__inner {
  max-width: var(--page-max);
  margin: 0 auto;
}

.events-stack .events-teaser__header {
  position: relative;
  z-index: 2;
  margin-bottom: 0;
  align-self: stretch;
  /* .events-stack centers its content vertically via justify-content,
     but once the pinned fan+cta below it are tall enough to leave no
     slack, that centering alone can land the heading flush against the
     sticky box's own top:0 edge. A floor of its own keeps it clear of
     the viewport edge regardless. */
  padding-top: clamp(24px, 5vh, 56px);
}

.events-teaser__header {
  text-align: center;
  margin-bottom: 64px;
}

.events-teaser__heading {
  font-family: var(--font-display);
  font-weight: 300;
  font-size: var(--text-heading);
  line-height: var(--leading-tight);
  letter-spacing: -4.8px;
  text-transform: uppercase;
  text-align: center;
  color: var(--color-green);
}

.events-teaser__heading em {
  font-style: italic;
  text-transform: uppercase;
}

/* Now a two-button row (See All Events + Book Now) instead of one link
   — same centered flex-wrap pattern as .article__cta. position:relative
   + z-index lifts this whole row above .events-fan: the fan's cards are
   position:absolute with JS-set z-index inside .events-fan's own
   stacking context (it has `perspective`), and .events-fan — being a
   positioned sibling — otherwise paints over this static row, so a
   poster swinging low in the fan could cover the buttons. Same lift on
   the header above (see .events-stack .events-teaser__header). */
.events-teaser__cta {
  /* Restored — this row ("See All" + Book Now) was left as display:none
     from an earlier, unrelated request and never flipped back; Book Now
     was recently moved here (off the reviews section) specifically to
     live under these cards, so it needs to actually render. */
  display: flex;
  position: relative;
  z-index: 2;
  flex-wrap: wrap;
  justify-content: center;
  gap: 16px;
  width: fit-content;
  /* Was var(--space-8) (40px), then 16px, then 4px — pulled up further
     still, on request. Safe to go negative (overlapping slightly into
     the fan above): z-index:2 above already guards against a low-
     swinging poster covering the button. */
  margin: -12px auto 0;
}

.journal-teaser__cta {
  display: flex;
  justify-content: center;
  margin: var(--space-8) auto 0;
}

@media (max-width: 900px) {
  .events-teaser {
    padding: 40px var(--gutter) 88px;
  }

  .events-teaser__header {
    margin-bottom: 22px;
  }

  /* Sized with all the other mobile display headings — see the shared
     rule further up this file. Kept here only to override this block's
     own earlier value; the shared clamp wins. */
  .events-teaser__heading {
    font-size: clamp(24px, 7.4vw, 34px);
    letter-spacing: -1.6px;
  }
}

/* ---------- Full page (events.html) ---------- */

.events-page__subtitle {
  max-width: 480px;
  margin: var(--space-4) 0 0;
  font-family: var(--font-mono);
  font-weight: 300;
  font-size: var(--text-sm);
  line-height: var(--leading-normal);
  letter-spacing: -0.3px;
  color: var(--color-cream);
  opacity: 0.85;
}

.events-page {
  max-width: var(--page-max);
  margin: 0 auto;
  padding: var(--space-14) var(--gutter);
}

.events-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(340px, 1fr));
  gap: var(--space-6);
}

/* A polaroid-style cream mat around the photo, matching the menu index's
   own hover-reveal photos (css/style.css, .menu-index__floater-img) — same
   cream, same thicker bottom edge. The photo, its scrim and its text
   content all inset by that same border amount below, so the frame reads
   as a real border around the whole card rather than just a background
   color peeking out behind the image. */
.event-card {
  position: relative;
  aspect-ratio: 3 / 4;
  overflow: hidden;
  background: #fdf9f2;
  padding: 10px 10px 26px;
  display: block;
  box-shadow: 0 22px 50px rgba(11, 15, 11, 0.22);
}

.event-card__image {
  position: absolute;
  inset: 10px 10px 26px;
  width: calc(100% - 20px);
  height: calc(100% - 36px);
  object-fit: cover;
}

/* Ink at the bottom for text legibility, clear at the top so the photo
   still reads as the card's real subject, not just a tinted backdrop. */
.event-card__scrim {
  position: absolute;
  inset: 10px 10px 26px;
  background: linear-gradient(
    to top,
    rgba(11, 15, 11, 0.92) 0%,
    rgba(11, 15, 11, 0.55) 42%,
    rgba(11, 15, 11, 0) 75%
  );
  pointer-events: none;
}

.event-card__content {
  position: absolute;
  left: 10px;
  right: 10px;
  bottom: 26px;
  z-index: 1;
  padding: var(--space-6);
  display: flex;
  flex-direction: column;
  gap: var(--space-2);
}

.event-card__tag {
  margin: 0;
  font-family: var(--font-mono);
  font-weight: 300;
  font-size: var(--text-2xs);
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--color-accent);
}

.event-card__title {
  margin: 0;
  font-family: var(--font-display);
  font-weight: 300;
  font-size: var(--text-lg);
  line-height: 1.05;
  letter-spacing: -1.2px;
  text-transform: uppercase;
  color: var(--color-cream);
  text-wrap: balance;
}

.event-card__desc {
  margin: 0;
  font-family: var(--font-mono);
  font-weight: 300;
  font-size: var(--text-xs);
  line-height: var(--leading-normal);
  color: var(--color-cream);
  opacity: 0.8;
}

.event-card__cta {
  margin-top: var(--space-2);
  align-self: flex-start;
  display: inline-flex;
  align-items: center;
  height: 40px;
  padding: 0 var(--space-4);
  border: 1px solid rgba(242, 236, 227, 0.5);
  border-radius: 100px;
  font-family: var(--font-mono);
  font-weight: 300;
  font-size: var(--text-2xs);
  letter-spacing: 0.04em;
  text-transform: uppercase;
  color: var(--color-cream);
  transition:
    background-color 0.3s ease,
    border-color 0.3s ease,
    color 0.3s ease;
}

.event-card__cta:hover {
  background: var(--color-accent);
  border-color: var(--color-accent);
  color: var(--color-ink);
}

@media (prefers-reduced-motion: reduce) {
  .event-card__image {
    transition: none;
  }
}

@media (max-width: 900px) {
  .events-page {
    padding: var(--space-9) var(--gutter) var(--space-11);
  }

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

/* =========================================================
   Cursor glow (js/cursor-glow.js) — a soft coral trail following the
   mouse across the site, fixed above everything, fully click-through.
   ========================================================= */

.cursor-glow-canvas {
  position: fixed;
  inset: 0;
  z-index: 9999;
  pointer-events: none;
}

/* Reading-time clock icon (rendered by js/journal-list-sanity.js) —
   must be sized or the bare 24-viewBox SVG balloons. */
.journal-entry__timer-icon {
  width: 13px;
  height: 13px;
  flex-shrink: 0;
  vertical-align: -2px;
  opacity: 0.7;
}

/* =========================================================
   Swipe-card deck (js/card-stack.js) — mobile only
   Replaces the journal teaser's scroll-snap slider and the events
   fan's bespoke mobile swipe with one shared <SwipeCards>-style deck:
   a fanned stack, front card draggable, fling it and it drops to the
   back. Desktop layouts are untouched.
   ========================================================= */
@media (max-width: 900px) {
  .journal--teaser,
  .events-teaser {
    position: relative;
  }

  .card-stack {
    position: relative;
    display: block;
    width: min(74vw, 300px);
    height: clamp(420px, 64vh, 520px);
    /* Bottom margin so the cards' own drop shadow has room to render
       within this section's own background before the next section
       starts right under it — with none, the shadow just got cut off
       at the section boundary. */
    margin: 10px auto 30px;
    padding: 0;
    overflow: visible;
    perspective: 1400px;
    touch-action: pan-y;
    scroll-snap-type: none;
    overscroll-behavior: auto;
  }

  .card-stack > * {
    position: absolute;
    inset: 0;
    width: 100%;
    margin: 0;
    flex: none;
    transform-origin: 50% 88%;
    will-change: transform, opacity;
    -webkit-user-select: none;
    user-select: none;
    scroll-snap-align: none;
  }

  /* --- journal "Stories" cards inside the deck ---
     Keep the teaser's own cream-polaroid GRID (photo full-width on top,
     title+time sharing a row, excerpt, then "read more" — see
     .journal-list--teaser .journal-entry above) instead of replacing it
     with a flex column: that's what actually makes it read as a
     polaroid. Only widen the photo row from its fixed 4:3 into a
     flexible one so it fills this fixed-height stack card, and clip a
     long excerpt to 2 lines. */
  .card-stack.journal-list--teaser {
    height: clamp(430px, 66vh, 540px);
    /* Sits a bit lower under the heading than the generic .card-stack
       default, on request — the bottom margin stays the same as the
       shared rule so the card's own shadow still has room before the
       FAQ section starts. */
    margin-top: 26px;
  }
  .card-stack.journal-list--teaser > .journal-entry {
    /* .journal-list--teaser .journal-entry (added for the grain z-index
       fix) is two classes — specific enough to beat .card-stack > *'s
       own position:absolute, which silently dropped every card back
       into normal flow (stacked vertically, not swipeable, deck height
       collapsed) instead of the deck's actual stacking. Three classes
       here to win that fight back. */
    position: absolute;
    grid-template-rows: minmax(0, 1fr) auto auto auto;
    padding: 16px 16px 18px;
    box-shadow: 0 24px 46px rgba(11, 15, 11, 0.22);
    overflow: hidden;
  }
  .card-stack.journal-list--teaser > .journal-entry .journal-entry__image {
    aspect-ratio: auto;
    min-height: 0;
    height: 100%;
    margin-bottom: 0;
    border-radius: 1px;
    overflow: hidden;
  }
  .card-stack.journal-list--teaser > .journal-entry .journal-entry__image img {
    width: 100%;
    height: 100%;
    object-fit: cover;
  }
  .card-stack.journal-list--teaser > .journal-entry .journal-entry__excerpt {
    display: -webkit-box;
    -webkit-line-clamp: 2;
    -webkit-box-orient: vertical;
    overflow: hidden;
  }

  /* --- events cards inside the deck --- */
  .card-stack.events-fan {
    width: min(62vw, 250px);
    height: clamp(380px, 60vh, 470px);
  }
  .card-stack.events-fan > .event-card {
    top: 0;
    left: 0;
    /* card-stack.js owns the transform now — drop the --tx/--ty/--rotz
       fan vars the desktop scroll-fan drives */
    transform: none;
  }
  .card-stack.events-fan > .event-card .event-card__image {
    flex: 1 1 auto;
    min-height: 0;
  }

  /* --- deck arrows (built by card-stack.js, appended to the deck
     itself, .card-stack, not the section around it) --- */
  .card-stack__arrows {
    pointer-events: none;
  }
  .card-stack__arrow {
    position: absolute;
    /* Centred on the deck (its own direct parent now) — a percentage
       here used to land against the whole SECTION's height instead,
       which put it wherever the heading/CTA around the deck happened
       to leave it, nowhere near the actual cards. */
    top: 50%;
    z-index: 240;
    display: flex;
    align-items: center;
    justify-content: center;
    width: 38px;
    height: 52px;
    padding: 0;
    border: 0;
    background: none;
    color: var(--color-green);
    pointer-events: auto;
    cursor: pointer;
    /* Hidden by default on request — swiping the cards directly is
       discoverable enough — but kept focusable (not display:none), so
       it reveals on keyboard focus for a visitor who can't swipe. Same
       treatment as .events-fan__arrow. */
    opacity: 0;
    transition: opacity 0.2s ease;
  }
  .card-stack__arrow:focus-visible {
    opacity: 1;
  }
  .card-stack__arrow img {
    width: 26px;
    height: auto;
    opacity: 0.82;
  }
  .card-stack__arrow--prev {
    left: -46px;
    transform: translateY(-50%);
  }
  .card-stack__arrow--next {
    right: -46px;
    transform: translateY(-50%);
  }
  /* Pushed out closer to the actual screen edges (not just clear of the
     card) — each deck has its own width (see .card-stack.journal-
     list--teaser / .card-stack.events-fan above), so the generic -46px
     above lands at a different distance from the edge on each. These
     work out the deck's own side margin from 100vw and land the arrow a
     fixed 14px from the true edge on both, three classes beating the
     generic rule's one. */
  .card-stack.journal-list--teaser .card-stack__arrow--prev {
    left: calc((min(74vw, 300px) - 100vw) / 2 + 14px);
  }
  .card-stack.journal-list--teaser .card-stack__arrow--next {
    right: calc((min(74vw, 300px) - 100vw) / 2 + 14px);
  }
  .card-stack.events-fan .card-stack__arrow--prev {
    left: calc((min(62vw, 250px) - 100vw) / 2 + 14px);
  }
  .card-stack.events-fan .card-stack__arrow--next {
    right: calc((min(62vw, 250px) - 100vw) / 2 + 14px);
  }

  /* the journal slider's own pagination dots are meaningless now */
  .card-stack + .journal-slider-dots,
  .journal--teaser .journal-slider-dots {
    display: none;
  }
}

/* Slightly smaller vinyl records and journal teaser cards on desktop,
   on request — both grids still fill the same bled-out row, each item
   just doesn't fill its own column edge-to-edge any more. */
@media (min-width: 901px) {
  .vinyl__item {
    max-width: 84%;
    justify-self: center;
  }

  .journal-list--teaser .journal-entry {
    max-width: 88%;
    justify-self: center;
  }
}
