/* ===== Wideplate — shared site styles =====
   Loaded by every page. Holds the three things all four pages genuinely
   share: the palette/type base, the subpage header, and the footer.

   This file is the fix for the old hand-copy problem: the footer used to be
   the same inline-styled markup pasted into four files, so a change to one
   silently drifted from the other three. The MARKUP is still duplicated —
   fixing that needs includes or a build step, which this site deliberately
   does not have — but the styling now lives in one place.

   NOT here, on purpose: the preloader's critical CSS, which stays inline in
   each page's <head> so it paints before anything else can. */

/* ---- Base ---- */
/* ===== General Sans, self-hosted =====
   Was loaded from api.fontshare.com. That host resolves to two IPs and one of
   them is a blackhole: curl timed out 3/3 at 20s with the connection never
   completing, and Chrome (which races both) took 285ms / 1184ms / 300ms /
   339ms / 4235ms across five cold loads, against 40-105ms for Google Fonts on
   the same connection. Since General Sans is the body and UI face on every
   page, that is the whole site's text sitting in Arial for up to four seconds,
   and indefinitely on any client that does not retry the dead IP.

   Same origin now, so it cannot stall independently of the page itself, and it
   costs one fewer DNS + TLS handshake. Four weights, 90KB total, already Latin
   subsets from Fontshare's own webfont kit — no further subsetting needed.

   Licence: ITF Free Font License. Free for commercial use, self-hosting is an
   explicitly supported distribution route; reselling or redistributing the
   font files is not. We do neither.

   The .woff format is deliberately not carried: every browser that supports
   :focus-visible and 100lvh, which this site already requires, supports woff2. */
@font-face { font-family: 'General Sans'; src: url('../fonts/general-sans-400.woff2') format('woff2'); font-weight: 400; font-style: normal; font-display: swap; }
@font-face { font-family: 'General Sans'; src: url('../fonts/general-sans-500.woff2') format('woff2'); font-weight: 500; font-style: normal; font-display: swap; }
@font-face { font-family: 'General Sans'; src: url('../fonts/general-sans-600.woff2') format('woff2'); font-weight: 600; font-style: normal; font-display: swap; }
@font-face { font-family: 'General Sans'; src: url('../fonts/general-sans-700.woff2') format('woff2'); font-weight: 700; font-style: normal; font-display: swap; }

:root { --gold: #D9A441; --gutter: clamp(24px, 4vw, 96px); }
html { background: #081F17; }
body { margin: 0; background: #F4EEE1; color: #14241D; font-family: 'General Sans', 'Helvetica Neue', sans-serif; -webkit-font-smoothing: antialiased; }
a { color: #0F362C; }
/* Amber is the hover colour for a TEXT link. Pill buttons are <a> elements
   too, and they own their label colour: repainting a gold pill's label amber
   put amber on gold, which is roughly 1.6:1 and effectively unreadable. The
   :not() is what keeps a global text-link rule from reaching into buttons —
   without it, every filled button ever added has to remember to override this
   one declaration, and the first one that forgets ships an invisible label. */
/* --wl-link-hover, not a literal, because ONE amber cannot serve both
   backgrounds: measured, #C9862B is 5.69:1 on the dark green but only 2.62:1
   on the cream, and darkening it far enough to pass on cream (#8F5E1E, 4.80:1)
   drops it to 2.85:1 on the dark. So the cream value is the default and the
   dark sections re-declare the lighter one, exactly the way --wl-ring already
   works two rules down. Both are text-link hover colours only; the pills own
   their label colour. Re-measure before changing either. */
:root { --wl-link-hover: #8F5E1E; }
.wl-foot, .wl-pp-head, #top, .wl-visit, .wl-nav, .wl-mobpanel, #combos { --wl-link-hover: #C9862B; }
a:not([class*="wl-btn"]):not([class*="-dir"]):hover { color: var(--wl-link-hover); }
/* <button> does not inherit font-family and Chrome's UA default for it is
   Arial. Without this, any button with visible text silently falls off the
   type system. */
button { font-family: inherit; }

/* ---- Subpage header (gallery / faq / privacy-policy) ----
   index.html has its own richer fixed nav and does not use these. */
.wl-pp-head { background: #0B2A20; border-bottom: 1px solid rgba(244,238,225,0.14); padding: 18px var(--gutter); display: flex; align-items: center; gap: 24px; flex-wrap: wrap; }
/* Same lockup and the same true 0.35 ratio as the nav and the footer. */
.wl-pp-mark { text-decoration: none; color: #F4EEE1; display: flex; flex-direction: column; align-items: center; font-size: 21.5px; gap: 0.257em; }
.wl-pp-mark b { font-family: 'New Baskerville FS','New Baskerville','Libre Baskerville',Baskerville,Georgia,serif; font-weight: 700; font-size: 1em; letter-spacing: 0.13em; margin-right: -0.13em; line-height: 1; white-space: nowrap; }
.wl-pp-mark i { display: flex; align-items: center; gap: 0.141em; width: 100%; font-style: normal; }
.wl-pp-mark i span:first-child, .wl-pp-mark i span:last-child { flex: 1; height: 1px; background: rgba(244,238,225,0.6); }
.wl-pp-mark i em { font-family: 'New Baskerville FS','New Baskerville','Libre Baskerville',Baskerville,Georgia,serif; font-style: normal; font-size: 0.35em; font-weight: 400; letter-spacing: 0.785em; margin-right: -0.785em; line-height: 1; }
.wl-pp-back { margin-left: auto; color: rgba(244,238,225,0.8); text-decoration: none; font-size: 11.5px; font-weight: 600; letter-spacing: 0.18em; text-transform: uppercase; transition: color 0.2s ease; }
.wl-pp-back:hover { color: var(--gold); }

/* ---- Footer ---- */
.wl-foot { position: relative; background: #081F17; padding: clamp(56px, 8vw, 90px) var(--gutter) 40px; }
.wl-foot-inner { max-width: 1280px; margin: 0 auto; display: flex; flex-direction: column; gap: clamp(36px, 5vw, 56px); position: relative; z-index: 1; }
.wl-foot-top { display: flex; justify-content: center; border-bottom: 1px solid rgba(244,238,225,0.14); padding-bottom: clamp(28px, 4vw, 44px); }
/* One size knob for the whole footer lockup: the WIDEPLATE size lives here
   and RESTAURANT, the gaps and the rule spacing all derive from it in em, so
   the proportions measured off the official logo hold at every width.
   width: auto so the hairline rules end flush with the wordmark, as they do
   in the logo, instead of being capped at their own max-width. */
.wl-foot-brand { display: flex; flex-direction: column; align-items: center; font-size: clamp(32px, 6vw, 68px); gap: 0.257em; max-width: min(88vw, 640px); width: auto; }
.wl-foot-mark { margin: 0 -0.13em 0 0; font-family: 'New Baskerville FS','New Baskerville','Libre Baskerville',Baskerville,Georgia,serif; font-weight: 700; font-size: 1em; letter-spacing: 0.13em; line-height: 1; color: #F4EEE1; text-align: center; }
.wl-foot-sub { display: flex; align-items: center; gap: 0.141em; width: 100%; }
.wl-foot-rule { flex: 1; height: 1px; background: rgba(244,238,225,0.6); }
.wl-foot-tag { font-family: 'New Baskerville FS','New Baskerville','Libre Baskerville',Baskerville,Georgia,serif; font-size: 0.35em; font-weight: 400; letter-spacing: 0.785em; margin-right: -0.785em; line-height: 1; color: #F4EEE1; }
.wl-foot-tagline { margin: 0; font-family: 'New Baskerville FS','New Baskerville','Libre Baskerville',Baskerville,Georgia,serif; font-style: italic; font-size: clamp(14px, 1.8vw, 17px); color: #F4EEE1; text-align: center; }
.wl-foot-cols { display: grid; grid-template-columns: repeat(auto-fit, minmax(min(220px, 100%), 1fr)); gap: 36px; }
.wl-foot-col { display: flex; flex-direction: column; gap: 10px; }
/* 0.50, not 0.45: at 0.45 this measured 3.97:1 on #081F17 and 10.5px text
   needs 4.5:1. 0.50 is 4.59:1 and is the smallest step that clears it. */
.wl-foot-label { margin: 0; font-size: 10.5px; font-weight: 700; letter-spacing: 0.26em; text-transform: uppercase; color: rgba(244,238,225,0.5); }
.wl-foot-text { margin: 0; font-size: 14px; line-height: 1.7; color: rgba(244,238,225,0.8); }
.wl-foot-hours { margin: 0; font-size: 14px; font-weight: 600; color: rgba(244,238,225,0.8); }
.wl-foot-note { margin: 0; font-size: 13.5px; color: rgba(244,238,225,0.6); }
.wl-foot-link { font-size: 14px; color: rgba(244,238,225,0.8); text-decoration: none; }
.wl-foot-link.is-num { font-variant-numeric: tabular-nums; }
.wl-foot-fb { display: inline-flex; align-items: center; gap: 6px; font-size: 12px; font-weight: 700; letter-spacing: 0.14em; text-transform: uppercase; color: var(--gold); text-decoration: none; }
.wl-foot-fb svg { width: 0.85em; height: 0.85em; }
.wl-foot-bottom { display: flex; flex-wrap: wrap; align-items: center; gap: 10px 20px; padding-top: 22px; border-top: 1px solid rgba(244,238,225,0.12); }
/* 0.50, not 0.4: 3.42:1 -> 4.59:1 on #081F17, same reason as .wl-foot-label. */
.wl-foot-copy { margin: 0; font-size: 12px; letter-spacing: 0.06em; color: rgba(244,238,225,0.5); }
/* The hover used to need !important purely to beat an inline color on these
   links. With the colour in this file that fight is gone — do not put it back. */
.wl-navlink { color: rgba(244,238,225,0.6); text-decoration: none; font-size: 12px; letter-spacing: 0.06em; transition: color 0.2s ease; }
.wl-navlink:hover { color: var(--gold); }
.wl-foot-noise { position: absolute; inset: 0; pointer-events: none; opacity: 0.045; background-image: url("data:image/svg+xml,%3Csvg%20xmlns=%27http://www.w3.org/2000/svg%27%20width=%27160%27%20height=%27160%27%3E%3Cfilter%20id=%27n%27%3E%3CfeTurbulence%20type=%27fractalNoise%27%20baseFrequency=%270.85%27%20numOctaves=%272%27%20stitchTiles=%27stitch%27/%3E%3C/filter%3E%3Crect%20width=%27160%27%20height=%27160%27%20filter=%27url(%23n)%27/%3E%3C/svg%3E"); }

@media (max-width: 600px) {
  .wl-foot-cols { justify-items: center; }
  .wl-foot-col { align-items: center; text-align: center; }
}

/* ===== Interaction states =====
   Two things were genuinely missing sitewide: a visible focus ring on anything
   that is not the gallery lightbox, the FAQ accordion or the map facade, and
   any :active state at all. Nothing here sets outline:none — the UA ring was
   always drawing — but the UA ring is the browser's colour, not ours, and on
   #081F17 it is close to unreadable.

   --wl-ring is why this is one rule rather than a dozen. The ring sits OUTSIDE
   the element (outline-offset), so what it has to contrast against is the
   section behind it, not the control. Dark sections re-declare the variable and
   inheritance carries it to every focusable thing inside them.

   `translate`, not `transform`, for every press/lift below. The gold CTAs carry
   data-magnet, which writes an INLINE transform on mousemove; an inline
   declaration beats any rule in this file, so a transform here would silently
   do nothing on desktop. `translate` is its own property and composes with
   transform instead of losing to it. */
/* ===== Skip to content =====
   WCAG 2.4.1. Seven nav links, a phone number and a pill stand between the
   top of every page and its content, and a keyboard visitor walked all of
   them on every page. This is the bypass.

   No JS and no extra request: the rule ships in this sheet, which is already
   loaded, and the link is absolutely positioned so it is OUT OF FLOW at all
   times. It cannot shift the nav — which matters more here than usual,
   because the nav wordmark is this site's LCP element.

   translateY, not display:none or visibility:hidden: the link has to stay
   focusable to be reachable by Tab at all. Hiding it either of those ways
   removes it from the focus order and the feature quietly does nothing.

   index.html repeats the hidden state inline (see the note there) because it
   is the one page that loads this sheet non-blocking. */
.wl-skip { position: absolute; top: 12px; left: 12px; z-index: 200; transform: translateY(-250%); padding: 12px 20px; border-radius: 999px; background: var(--gold); color: #1B1305; font-size: 11.5px; font-weight: 700; letter-spacing: 0.14em; text-transform: uppercase; text-decoration: none; }
/* :focus, not :focus-visible — a skip link is reached ONLY by keyboard, and
   :focus-visible would be one more thing that has to agree for it to appear. */
.wl-skip:focus { transform: none; }
.wl-skip:hover { color: #1B1305; }
/* The skip link targets the page's H1, NOT the <main> wrapper, and this was
   a real bug first: <main> starts at document offset 0 on the home page (the
   nav is position:fixed and overlays the hero), so activating the link moved
   focus correctly and scrolled by exactly zero pixels. With no ring on the
   target either, the honest report was "nothing happened". The mechanism was
   working and nothing about it was perceivable.
   The H1 fixes both halves: it sits ~294px down on the home page, so the page
   visibly moves, and a ring around one headline is a real focus indicator
   where a ring around an 11,000px wrapper is not.
   :focus, not :focus-visible — a skip link gets clicked as well as tabbed to,
   and :focus-visible does not match a mouse-driven focus move, which is
   exactly the case that got reported. */
#wl-content { scroll-margin-top: calc(var(--nav-height, 0px) + 24px); }
#wl-content:focus { outline: 2px solid var(--wl-ring); outline-offset: 6px; }

:root { --wl-ring: #0F362C; }
/* #top is on the list because the hero is dark green and the default ring is
   #0F362C, i.e. the ring the skip link draws there would be invisible. */
.wl-foot, .wl-pp-head, #top { --wl-ring: var(--gold); }
:focus-visible { outline: 2px solid var(--wl-ring); outline-offset: 3px; }

.wl-foot-link:hover { color: var(--gold); }
/* .wl-foot-fb is gold already, so gold-on-gold hover would be a dead state.
   It steps to the lighter gold, matching .wl-mob-dir / .wl-mob-call in
   css/home.css and the gold pill's own hover. */
.wl-foot-fb:hover { color: #E3B45C; }
.wl-foot-link, .wl-foot-fb, .wl-navlink, .wl-pp-back { transition: color 0.18s ease, opacity 0.18s ease; }
.wl-foot-link:active, .wl-foot-fb:active, .wl-navlink:active, .wl-pp-back:active { opacity: 0.65; }

/* --wl-bottom-safe is the one number every bottom-anchored element offsets by:
   the home-indicator / browser-chrome inset. The cookie card (built in
   js/app.js), the back-to-top button and the hero's slide indicators all read
   it, so none of them land under the iOS home bar. It used to also carry a
   fixed action bar's height; the bar is gone, the variable stays because the
   inset still has to be respected in four places and one name beats four
   copies of env(). */
:root { --wl-bottom-safe: env(safe-area-inset-bottom, 0px); }
/* The footer, not body, carries the clearance: index.html's body background is
   cream, so padding there would put a cream band under the dark footer. */
.wl-foot { padding-bottom: calc(40px + var(--wl-bottom-safe)); }

/* ===== Back to top =====
   The wordmark already goes to #top, but nothing says so. Built in js/app.js
   (it is pure affordance — with JS off there is nothing for it to do), styled
   here so it is cacheable rather than a string in the bundle.

   visibility, not just opacity: an invisible-but-focusable button is a keyboard
   trap in the tab order, and letting it actually leave the DOM's focusable set
   is also what makes the click behave — focus falls back to <body>, so the next
   Tab resumes from the top of the document, which is where the visitor just
   asked to be. Same delayed-visibility pattern as the FAQ accordion. */
.wl-totop {
  /* z-index 55: above the page, deliberately BELOW the nav (60) so it does not
     float over the open mobile panel. */
  position: fixed; right: 16px; bottom: calc(16px + var(--wl-bottom-safe)); z-index: 55;
  width: 46px; height: 46px; display: flex; align-items: center; justify-content: center;
  padding: 0; border-radius: 999px; cursor: pointer;
  background: rgba(11,42,32,0.92); border: 1px solid rgba(244,238,225,0.28); color: #F4EEE1;
  -webkit-backdrop-filter: blur(10px); backdrop-filter: blur(10px);
  opacity: 0; visibility: hidden; translate: 0 12px;
  --wl-ring: var(--gold);
  transition: opacity 0.25s ease, translate 0.25s cubic-bezier(0.16,1,0.3,1),
              background 0.18s ease, color 0.18s ease, visibility 0s linear 0.25s;
}
.wl-totop.is-in { opacity: 1; visibility: visible; translate: 0 0; transition-delay: 0s; }
.wl-totop svg { width: 19px; height: 19px; }
.wl-totop:hover { background: var(--gold); color: #1B1305; border-color: var(--gold); }
.wl-totop:active { background: #C08F33; translate: 0 2px; }
/* The cookie card is bottom-anchored too and spans the full width on phones.
   Rather than measure a second offset, the button stands down while the card is
   up — it is a convenience, the card is a decision, and the card leaves for
   good the moment it is answered. */
html.wl-cookie-open .wl-totop { opacity: 0; visibility: hidden; translate: 0 12px; }

@media (prefers-reduced-motion: reduce) {
  * { transition-duration: 0.01ms !important; }
  /* Colour feedback stays, the movement goes. The hover shadows are static, not
     motion, so they are deliberately left alone. */
  .wl-totop, .wl-totop.is-in, .wl-totop:active { translate: none !important; }
}
