/* =============================================================================
   MASTER: food-amici-static — concept preview by PXLNorth
   Parameterized from the operator-approved amicirestaurant.ca recreation of the
   sundayinbrooklyn blueprint (templates/blueprints/food/sundayinbrooklyn).
   Structure and density come from the blueprint; every colour and font below is
   a slot the tailor pass fills per prospect.

   TYPE — a pairing chosen per prospect, never a house pairing.
   -------------------------------------------------------------------------
   --sans / --serif and the Google Fonts href are content-driven (content.json
   `fonts`, defaulted in template.json). The shipped default is the source
   build's pairing: BODONI MODA for display, because Bodoni cut his types in
   Parma, in the Emilia-Romagna the source restaurant's own About page names as
   the origin of its cooking — a face picked from a FACT about the business, and
   the standard this master's tailors are held to. It is used only on white or
   paper grounds: a Didone's hairlines dissolve on a dark ground, and no
   automated check can see that. Text is ARCHIVO, a grotesque with a tall
   x-height, which is what the small letterspaced caps (address, hours, nav,
   eyebrows) need to stay readable at 11-13px.
   Whatever a tailor picks, every weight this file uses must be REQUESTED in
   fonts.googleHref, or blueprint-gate's faux-bold check fails. Never Fraunces.

   COLOUR SLOTS — one accent, from the prospect's own site scheme.
   -------------------------------------------------------------------------
   Every slot below reads the fill-static palette (paletteMode `pro`);
   theme.json SHOULD pin the full scale via its `pro` object (see template.json).
   The source build's mapping is the pattern to copy:
     accent slot  : ONE hot colour, sampled from the prospect's real site scheme
                    (theme.json.siteScheme top band), warmed until it clears the
                    contrast floors. It carries the rules, the CTAs and the one
                    accented word in the wordmark. Never a second accent.
     paper slots  : the prospect's warm neutral as a SURFACE, never as a second
                    accent, and never a logo colour used as a canvas.
     ink slots    : the near-black text scale.
     --white      : the page canvas the blueprint sets its type on.
   Master-specific slot names fall back to derived standard keys when unpinned,
   so an unpinned theme still renders a coherent page rather than an empty var.
   ========================================================================= */

:root {
  --ink: #241d19;
  --ink-2: #4b403a;
  --ink-3: #70665f;
  --accent: #5d493c;
  --accent-deep: #3e3128;
  --paper: #fbfbfb;
  --paper-2: #EDEAE6;
  --line: #e4e1df;
  --line-soft: #f7f4f2;
  --white: #ffffff;

  --wrap: 1180px;
  --sans: "Archivo", "Segoe UI", system-ui, -apple-system, sans-serif;
  --serif: "Bodoni Moda", "Times New Roman", Georgia, serif;

  /* Non-sticky masthead (this blueprint's header does not travel), so anchors
     need only breathing room, not nav clearance. Measured: no fixed chrome. */
  --anchor-gap: 28px;

  /* SUB-NICHE PRESENTATION MATRIX (TASTE_LEDGER #69, docs/PRESENTATION_MATRIX.md),
     ported 2026-09-10. Three axes reach this stylesheet: displayRegister, density and
     sectionEmphasis. EVERY DEFAULT BELOW IS THE VALUE THIS MASTER ALREADY PAINTED, so a
     fill that resolves no row (the oracle refill does exactly that) computes the approved
     page to the pixel; the axes vary AROUND the approved design, they do not replace it. */
  --display-scale: 1;
  --display-weight: 600;
  /* Tracking is applied as a DELTA against the resolver's `normal` (-0.005em), so each
     display rule keeps its own hand-set letter-spacing and the axis moves it, rather than
     one token flattening four different rules onto the same value. */
  --display-track: 0.005em;
  --display-track-delta: calc(var(--display-track) + 0.005em);
  --eyebrow-case: none;

  /* density.rhythm — one multiplier over the two band-padding clamps the blueprint uses.
     1.00 IS the approved rhythm; tight 0.85 and airy 1.18 move around it. */
  --rhythm-scale: 1.18;
  --rhythm: calc(clamp(3.2rem, 6vw, 5.2rem) * var(--rhythm-scale));
  --rhythm-reserve: calc(clamp(3rem, 6vw, 5rem) * var(--rhythm-scale));
  /* density.measure — a CEILING on the copy measures, never a floor. This blueprint is
     already narrower than the fleet standard (46ch / 52ch), so no value in the vocabulary
     clips it today; the token is wired and reported rather than pretended about, and
     .menu-note's 68ch is deliberately NOT bound (see template.json $expressedHow). */
  --measure: 52ch;
}

/* sectionEmphasis lead / shrink (docs/PRESENTATION_MATRIX.md §2.4). The attributes are set
   per band in index.html from presentation.emph / presentation.compact (the MATRIX-resolved
   flags, not the legacy variantEmphasis merge - see template.json $expressedHow) through
   template.json $presentation.sectionMap. Both multipliers are RELATIVE to whatever
   --rhythm the density axis already set, so the two axes compose instead of fighting. */
[data-emph] { --emph-pad: 1.22; --emph-scale: 1.06; }
[data-compact] { --emph-pad: .72; --emph-scale: .88; }

*, *::before, *::after { box-sizing: border-box; }
[hidden] { display: none !important; }

html { -webkit-text-size-adjust: 100%; }

body {
  margin: 0;
  background: var(--white);
  color: var(--ink-2);
  font-family: var(--sans);
  font-size: 16px;
  line-height: 1.62;
  overflow-x: hidden;
}

/* `height: auto` is NOT decoration. The HTML width/height attributes map to CSS
   presentational hints, so an <img height="1200"> keeps a literal 1200px height
   the moment CSS sets only its width, and `aspect-ratio` cannot override a
   height that is already specified. The first render of this page stretched
   every dish tile to 1200px tall for exactly that reason. */
img { max-width: 100%; height: auto; }
picture { display: block; }

a { color: var(--accent); }
a:focus-visible, button:focus-visible, input:focus-visible,
select:focus-visible, textarea:focus-visible {
  outline: 2px solid var(--accent);
  outline-offset: 3px;
}

.wrap { width: min(100% - 2.5rem, var(--wrap)); margin-inline: auto; }

.skip {
  position: absolute; left: -9999px; top: 0;
  background: var(--ink); color: #fff; padding: .7rem 1rem; z-index: 50;
}
.skip:focus { left: 0; }

section[id], [id="top"] { scroll-margin-top: var(--anchor-gap); }

/* ---------- icons: ONE symbol per meaning, referenced with <use> ---------- */
.icon-sprite { position: absolute; width: 0; height: 0; overflow: hidden; }
.ico {
  flex: 0 0 auto;
  fill: none; stroke: currentColor; stroke-width: 2;
  stroke-linecap: round; stroke-linejoin: round;
}

/* ---------- headings ---------- */
h1, h2, h3 { font-family: var(--serif); color: var(--ink); margin: 0; }
h2 {
  /* displayRegister (weight / track / scale) and sectionEmphasis (--emph-scale) meet here.
     Defaults reproduce the approved page exactly: weight 600, delta 0em, both scales 1. */
  font-weight: var(--display-weight, 600);
  font-size: calc(clamp(1.95rem, 1.3rem + 2.6vw, 3.1rem) * var(--display-scale, 1) * var(--emph-scale, 1));
  line-height: 1.08;
  letter-spacing: calc(.005em + var(--display-track-delta, 0em));
}
h3 { font-weight: 600; }

.eyebrow {
  margin: 0 0 .85rem;
  font-family: var(--sans);
  font-size: .6875rem;
  font-weight: 600;
  letter-spacing: .22em;
  text-transform: var(--eyebrow-case, uppercase);
  color: var(--accent);
}
.rule {
  display: block;
  width: 72px; height: 2px;
  background: var(--accent);
  margin: 1.15rem 0 1.6rem;
}
.rule--centre { margin-inline: auto; }

.lede {
  font-size: clamp(1.02rem, .97rem + .28vw, 1.15rem);
  color: var(--ink-2);
  max-width: min(46ch, var(--measure, 60ch));
}

/* ---------- buttons ---------- */
.btn {
  display: inline-flex; align-items: center; gap: .55rem;
  padding: .78rem 1.25rem;
  font-family: var(--sans);
  font-size: .8125rem;
  font-weight: 600;
  letter-spacing: .1em;
  text-transform: uppercase;
  text-decoration: none;
  white-space: nowrap;
  border: 1px solid transparent;
  border-radius: 2px;
  cursor: pointer;
  transition: background-color .18s ease, color .18s ease, border-color .18s ease;
}
.btn span { white-space: nowrap; }
.btn-primary { background: var(--accent); color: #fff; }
.btn-primary:hover { background: var(--accent-deep); }
.btn-ghost {
  background: transparent;
  color: var(--accent);
  border-color: var(--accent);
}
.btn-ghost .ico { stroke: var(--accent); }
.btn-ghost:hover { background: var(--accent); color: #fff; }
.btn-ghost:hover .ico { stroke: #fff; }

/* =========================================================================
   MASTHEAD — centred stacked wordmark over one thin uppercase nav row,
   the blueprint's header, plus the booking + call controls the blueprint's
   own "booking is buried" defect note tells us to promote.
   ========================================================================= */
.masthead {
  background: var(--white);
  border-bottom: 1px solid var(--line-soft);
  padding: 1.5rem 0 1.1rem;
  text-align: center;
}
.wordmark {
  font-family: var(--serif);
  font-weight: 700;
  line-height: .96;
  letter-spacing: .02em;
  text-transform: uppercase;
  font-size: clamp(2.1rem, 1.35rem + 3vw, 3.15rem);
  margin: 0;
}
.wordmark .h1-accent { color: var(--accent); display: block; }
.wordmark-sub {
  display: block;
  font-family: var(--sans);
  font-weight: 600;
  font-size: clamp(.6875rem, .62rem + .3vw, .8125rem);
  letter-spacing: .42em;
  color: var(--ink);
  margin-top: .55rem;
  padding-left: .42em; /* optical: absorbs the trailing letterspace */
}
.tagline {
  margin: .85rem 0 0;
  font-family: var(--serif);
  font-style: italic;
  font-size: clamp(.95rem, .9rem + .25vw, 1.08rem);
  color: var(--ink-3);
}

.nav { margin-top: 1.3rem; }
.nav-links {
  list-style: none;
  display: flex; flex-wrap: wrap; justify-content: center;
  gap: .5rem 1.65rem;
  margin: 0 0 1.05rem; padding: 0;
}
.nav-links a {
  font-size: .6875rem;
  font-weight: 600;
  letter-spacing: .2em;
  text-transform: uppercase;
  text-decoration: none;
  color: var(--ink);
  white-space: nowrap;
  padding-bottom: 2px;
  border-bottom: 1px solid transparent;
}
.nav-links a:hover { border-bottom-color: var(--accent); color: var(--accent); }

.nav-actions {
  display: flex; flex-wrap: wrap; justify-content: center; gap: .6rem;
}
.nav-actions .btn { padding: .68rem 1.05rem; font-size: .75rem; letter-spacing: .09em; }

@media (min-width: 900px) {
  .masthead { padding: 2.1rem 0 1.4rem; }
  .nav-actions .btn { padding: .72rem 1.15rem; }
}

/* =========================================================================
   HERO — one full-bleed real photograph, edge to edge, no text on it.
   The dish is the whole argument (blueprint principle 1). The band is the
   photo and nothing else, so nothing empty can open under it.
   ========================================================================= */
.hero { display: block; background: var(--ink); }
.hero picture, .hero img { display: block; width: 100%; }
.hero img {
  height: clamp(300px, 50vh, 540px);
  object-fit: cover;
  object-position: center 46%;
}
@media (min-width: 900px) {
  .hero img { height: clamp(460px, 68vh, 700px); object-position: center 48%; }
}
/* NO HERO-WORTHY FRAME (FOOD round 2 fix 7): when the triage passed no frame as able to lead the
   page at full width, the best usable frame is shown INSET - inside the page margins at a modest
   height - rather than blown up full-bleed. The build record says so (hero.inset, set by the
   author validator's hero rule). The band stays flush to its photo. */
.hero.hero--inset { background: transparent; max-width: var(--wrap); margin: clamp(1rem, 3vw, 2rem) auto 0; padding: 0 clamp(1rem, 4vw, 2rem); }
.hero.hero--inset img { height: clamp(220px, 38vh, 360px); }
@media (min-width: 900px) {
  .hero.hero--inset img { height: clamp(320px, 46vh, 460px); }
}

/* =========================================================================
   RESERVE — the conversion the business actually runs on. Amici publishes one
   booking channel, a phone line ("For Reservations: 519-624-8984"), so the form
   collects what a host needs and the call control sits beside it. No second
   step is invented: a table booking has no wizard in it.
   ========================================================================= */
.reserve { background: var(--paper); padding: calc(var(--rhythm-reserve) * var(--emph-pad, 1)) 0; }
.reserve-grid { display: grid; gap: clamp(2rem, 4vw, 3.25rem); align-items: stretch; }
@media (min-width: 980px) {
  .reserve-grid { grid-template-columns: minmax(0, 1.06fr) minmax(0, .94fr); }
}
.reserve-copy { min-width: 0; }
.reserve-photo { margin: 0; min-width: 0; display: flex; flex-direction: column; }
.reserve-photo picture { flex: 1 1 auto; }
.reserve-photo img {
  display: block; width: 100%; height: 100%;
  min-height: 280px;
  object-fit: cover; object-position: center 46%;
}
.photo-cap {
  margin: .7rem 0 0;
  font-size: .75rem;
  letter-spacing: .04em;
  color: var(--ink-3);
}

.form { margin-top: 1.9rem; }
.field { margin-bottom: 1rem; min-width: 0; }
.field-row { display: grid; gap: 1rem; }
@media (min-width: 620px) { .field-row { grid-template-columns: 1fr 1fr; } }
.field label {
  display: block;
  font-size: .6875rem; font-weight: 600;
  letter-spacing: .16em; text-transform: uppercase;
  color: var(--ink); margin-bottom: .4rem;
}
.field input, .field select, .field textarea {
  width: 100%;
  font-family: var(--sans); font-size: .97rem;
  color: var(--ink);
  background: var(--white);
  border: 1px solid var(--line);
  border-radius: 2px;
  padding: .72rem .8rem;
}
/* Light ground here, but the options are pinned to the page's own surfaces so a
   browser popup can never render the page's ink on its own default. */
.field select option { background: var(--white); color: var(--ink); }
.field textarea { min-height: 104px; resize: vertical; }
.field input::placeholder, .field textarea::placeholder { color: #9a8c84; }
.err {
  display: block; margin-top: .35rem;
  font-size: .78rem; color: var(--accent-deep); font-weight: 600;
}
.form-note { margin: .1rem 0 1.15rem; font-size: .82rem; color: var(--ink-3); }

.form-actions { display: flex; flex-wrap: wrap; gap: .7rem; align-items: center; }

.done {
  border: 1px solid var(--accent);
  border-left-width: 4px;
  background: var(--white);
  padding: clamp(1.15rem, 2.4vw, 1.6rem);
  margin-top: 1.9rem;
}
.done h3 { font-size: 1.4rem; margin-bottom: .6rem; }
.done p { margin: 0 0 .7rem; }
.done p:last-child { margin-bottom: 0; }

.aside-actions {
  display: flex; flex-wrap: wrap; gap: .7rem;
  margin-top: 1.5rem; padding-top: 1.35rem;
  border-top: 1px solid var(--line);
}

/* =========================================================================
   MENU — the blueprint's one permitted addition: a compact taste of the
   kitchen. Photographs first, then a short excerpt of the real card.
   ========================================================================= */
.menu { padding: calc(var(--rhythm) * var(--emph-pad, 1)) 0; }
/* THE STRIP FITS ITS COUNT (FOOD round 2 fix 1: urwarestaurant.com's one dish photo sat in a
   four-column strip beside three empty tracks; stjohnsbakery.com's three left a hole at 1440 and
   an orphan at 390). Tiles are centred flex items, never empty grid tracks: two across on a
   phone (an odd last tile spans the row in a landscape crop), four across on a wide screen, and
   three across when the count is three or six; one or two tiles sit centred at a third each. */
.dish-strip {
  --dish-gap: clamp(.75rem, 1.6vw, 1.15rem);
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  gap: var(--dish-gap);
  margin: 2rem 0 clamp(2.4rem, 4vw, 3.4rem);
}
.dish { margin: 0; min-width: 0; flex: 0 1 calc((100% - var(--dish-gap)) / 2); }
.dish:last-child:nth-child(odd) { flex-basis: 100%; }
.dish:last-child:nth-child(odd) img { aspect-ratio: 16 / 10; }
@media (min-width: 900px) {
  .dish, .dish:last-child:nth-child(odd) { flex-basis: calc((100% - 3 * var(--dish-gap)) / 4); }
  .dish:last-child:nth-child(odd) img { aspect-ratio: 4 / 5; }
  .dish-strip:has(> .dish:nth-child(3):last-child) > .dish,
  .dish-strip:has(> .dish:nth-child(6):last-child) > .dish,
  .dish-strip:has(> .dish:nth-child(2):last-child) > .dish,
  .dish-strip:has(> .dish:nth-child(1):last-child) > .dish { flex-basis: calc((100% - 2 * var(--dish-gap)) / 3); }
}
.dish img {
  display: block; width: 100%; height: auto;
  aspect-ratio: 4 / 5;
  object-fit: cover;
}
.dish figcaption {
  /* Reserved height so every caption starts at the same y whatever its length. */
  min-height: 3.1em;
  margin-top: .7rem;
  font-size: .8125rem;
  line-height: 1.5;
  color: var(--ink-3);
  letter-spacing: .02em;
}

.card-cols { display: grid; gap: clamp(1.8rem, 3.4vw, 2.8rem); }
@media (min-width: 860px) { .card-cols { grid-template-columns: 1fr 1fr; } }
.card-col { min-width: 0; }
.card-col h3 {
  font-size: .8125rem;
  font-family: var(--sans);
  font-weight: 600;
  letter-spacing: .2em;
  text-transform: uppercase;
  color: var(--accent);
  margin-bottom: 1.05rem;
  padding-bottom: .55rem;
  border-bottom: 1px solid var(--line);
}
.item { margin-bottom: 1.35rem; }
.item-head {
  display: flex; align-items: baseline; justify-content: space-between; gap: 1rem;
}
.item-name {
  font-family: var(--serif); font-weight: 600;
  font-size: 1.075rem; color: var(--ink); min-width: 0;
}
.item-price {
  font-size: .8125rem; font-weight: 600; letter-spacing: .06em;
  color: var(--ink); white-space: nowrap;
}
.item-desc { margin: .3rem 0 0; font-size: .9rem; color: var(--ink-3); }
.menu-note {
  margin: clamp(2rem, 3.4vw, 2.8rem) 0 0;
  padding-top: 1.4rem;
  border-top: 1px solid var(--line);
  font-size: .95rem;
  color: var(--ink-2);
  max-width: 68ch;
}
.menu-actions { display: flex; flex-wrap: wrap; gap: .7rem; margin-top: 1.6rem; }

/* =========================================================================
   STORY — their own room, their own words.
   ========================================================================= */
.story { background: var(--paper); padding: calc(var(--rhythm) * var(--emph-pad, 1)) 0; }
.story-grid { display: grid; gap: clamp(2rem, 4vw, 3.25rem); align-items: stretch; }
@media (min-width: 980px) {
  .story-grid { grid-template-columns: minmax(0, 1.02fr) minmax(0, .98fr); }
}
.story-photo { margin: 0; min-width: 0; display: flex; flex-direction: column; }
.story-photo picture { flex: 1 1 auto; }
.story-photo img {
  display: block; width: 100%; height: 100%;
  min-height: 260px;
  object-fit: cover; object-position: center 58%;
}
.story-copy { min-width: 0; }
/* An itemless menu's one line, merged here by fill-static (FOOD round 2 fix 6). */
.story-menu-line {
  margin-top: 1.4rem; padding-top: 1.1rem;
  border-top: 1px solid var(--line);
  color: var(--ink-2); font-size: .95rem;
}
.story-copy p { max-width: min(52ch, var(--measure, 60ch)); }
.facts { list-style: none; margin: 1.6rem 0 1.8rem; padding: 0; }
.facts li {
  position: relative;
  padding-left: 1.5rem;
  margin-bottom: .65rem;
  font-size: .95rem;
  color: var(--ink-2);
}
.facts li::before {
  content: "";
  position: absolute; left: 0; top: .62em;
  box-sizing: content-box;
  width: 0; height: 0;
  border-top: 4px solid transparent;
  border-bottom: 4px solid transparent;
  border-left: 6.5px solid var(--accent);
}

/* =========================================================================
   GUESTS — stars inside the card, the review's own rating, its own date.
   ========================================================================= */
.guests { padding: calc(var(--rhythm) * var(--emph-pad, 1)) 0; }
.guests-head { text-align: center; margin-bottom: clamp(2rem, 3.6vw, 2.9rem); }
.stars { display: inline-flex; gap: .18rem; }
.stars svg { width: 17px; height: 17px; fill: var(--accent); }
.guests-head .stars svg { width: 21px; height: 21px; }
/* THE AGGREGATE DRAWS THE REAL RATING (FOOD round 2 fix 5: alleycatcafe.ca's 4.4 showed five
   filled stars). Five outline-coloured stars, and over them the filled row cut to the rating,
   rounded DOWN to the quarter star so the row never claims more than the number beside it.
   fill-static sets the two classes (reviews.starFill.cls): sf-N full stars, sq-Q quarters. */
.stars-agg { position: relative; display: inline-flex; --star: 21px; --star-gap: .18rem; }
.stars-agg .stars-row { display: inline-flex; gap: var(--star-gap); }
.stars-agg .stars-base svg { fill: var(--line); }
.stars-agg .stars-fill {
  position: absolute; top: 0; left: 0; bottom: 0;
  overflow: hidden; white-space: nowrap;
  width: calc(var(--sf, 5) * (var(--star) + var(--star-gap)) + var(--sq, 0) * var(--star) / 4);
}
.stars-agg .stars-fill svg { flex: 0 0 var(--star); }
.sf-0 { --sf: 0; } .sf-1 { --sf: 1; } .sf-2 { --sf: 2; } .sf-3 { --sf: 3; } .sf-4 { --sf: 4; } .sf-5 { --sf: 5; }
.sq-0 { --sq: 0; } .sq-1 { --sq: 1; } .sq-2 { --sq: 2; } .sq-3 { --sq: 3; }
.rating-line {
  margin: .6rem 0 .1rem;
  font-size: .75rem; font-weight: 600;
  letter-spacing: .18em; text-transform: uppercase;
  color: var(--ink-3);
}
.guests-head h2 { margin-top: .5rem; }

/* THE ROW FITS ITS COUNT (FOOD round 2 fix 1: alleycatcafe.ca's three reviews sat in a
   four-column row, urwarestaurant.com's two left half the grid empty). Centred flex cards: one
   per row on a phone, two from 720px, four from 1120px, three when there are three or six, and
   one or two cards sit centred at a readable width instead of stretching or leaving a hole. */
.review-cards {
  --review-gap: clamp(1rem, 2vw, 1.5rem);
  list-style: none; margin: 0; padding: 0;
  display: flex; flex-wrap: wrap; justify-content: center;
  gap: var(--review-gap);
}
.review-cards > .review { flex: 0 1 100%; }
@media (min-width: 720px) {
  .review-cards > .review { flex-basis: calc((100% - var(--review-gap)) / 2); }
  .review-cards:has(> .review:nth-child(1):last-child) > .review { flex-basis: min(100%, 38rem); }
}
@media (min-width: 1120px) {
  .review-cards > .review { flex-basis: calc((100% - 3 * var(--review-gap)) / 4); }
  .review-cards:has(> .review:nth-child(3):last-child) > .review,
  .review-cards:has(> .review:nth-child(6):last-child) > .review,
  .review-cards:has(> .review:nth-child(2):last-child) > .review { flex-basis: calc((100% - 2 * var(--review-gap)) / 3); }
}
.review {
  min-width: 0;
  background: var(--paper);
  border-top: 3px solid var(--accent);
  padding: clamp(1.2rem, 2.2vw, 1.55rem);
  display: flex; flex-direction: column;
}
.review-quote {
  margin: 0 0 1.15rem;
  font-size: .95rem;
  line-height: 1.65;
  color: var(--ink-2);
  flex: 1 1 auto;
}
.review .stars { margin-bottom: .6rem; }
.review-name {
  font-family: var(--serif); font-weight: 600;
  font-size: 1.02rem; color: var(--ink);
}
.review-date {
  margin: .2rem 0 0;
  font-size: .55rem;
  letter-spacing: .1em;
  color: var(--ink-3);
}

/* =========================================================================
   VISIT — the blueprint's own signature block: place name over an accent
   rule, address and phone in letterspaced caps, then the day-part as display
   typography rather than a footer table. Amici runs ONE service, so there is
   one day-part here, not four. Nothing invented.
   ========================================================================= */
.visit { background: var(--paper); padding: calc(var(--rhythm) * var(--emph-pad, 1)) 0; }
.visit-grid { display: grid; gap: clamp(2rem, 4vw, 3.4rem); align-items: stretch; }
@media (min-width: 980px) {
  .visit-grid { grid-template-columns: minmax(0, 1.05fr) minmax(0, .95fr); }
}
.visit-main { min-width: 0; }
.place {
  /* The city as display type: the same displayRegister tokens as h2, keeping its own
     hand-set tracking and taking the axis as a delta on top of it. */
  font-weight: var(--display-weight, 600);
  font-size: calc(clamp(2.3rem, 1.4rem + 3.6vw, 3.6rem) * var(--display-scale, 1) * var(--emph-scale, 1));
  letter-spacing: calc(.09em + var(--display-track-delta, 0em));
  text-transform: uppercase;
  line-height: 1;
}
.caps-line {
  margin: 0 0 .5rem;
  font-size: .78rem;
  font-weight: 500;
  letter-spacing: .16em;
  text-transform: uppercase;
  color: var(--ink-2);
  display: flex; align-items: flex-start; gap: .6rem;
}
.caps-line .line-ico { display: inline-flex; align-items: center; height: 1.5em; color: var(--accent); }
.caps-line .ico { width: 15px; height: 15px; }
.caps-line a { color: var(--ink); text-decoration: none; border-bottom: 1px solid var(--accent); }
.caps-line a:hover { color: var(--accent); }

.daypart {
  margin: clamp(1.9rem, 3.2vw, 2.6rem) 0 1.1rem;
  font-size: clamp(1.35rem, 1.1rem + 1.1vw, 1.7rem);
  font-weight: 600;
  letter-spacing: .16em;
  text-transform: uppercase;
}
.daypart-rule { display: block; width: 46px; height: 2px; background: var(--accent); margin: .75rem 0 1.4rem; }

.hours-grid {
  display: grid;
  grid-template-columns: max-content max-content;
  column-gap: clamp(1.1rem, 3vw, 2.6rem);
  row-gap: .58rem;
}
.hours-row { display: contents; }
.hours-day {
  position: relative;
  padding-left: 1.05rem;
  font-family: var(--serif);
  font-size: 1.02rem;
  color: var(--ink);
  letter-spacing: .05em;
}
.hours-time {
  text-align: left;
  white-space: nowrap;
  font-size: .84rem;
  letter-spacing: .1em;
  text-transform: uppercase;
  color: var(--ink-2);
  align-self: center;
}
.hours-day::before {
  content: ""; position: absolute; left: 0; top: calc(0.5em + 2px);
  box-sizing: content-box;
  width: 0; height: 0;
  border-top: 4.5px solid transparent;
  border-bottom: 4.5px solid transparent;
  border-left: 7.5px solid transparent;
}
/* Two tones far apart in HUE as well as value, on a LIGHT band, so they are
   saturated mid-tones rather than tints. Both measured against --paper:
   #1f6b33 on #faf4e9 = 5.5:1, #7a1113 on #faf4e9 = 9.8:1, floor 3:1. */
.hours-row[data-today="true"] .hours-day,
.hours-row[data-today="true"] .hours-time { font-weight: 700; color: var(--ink); }
.hours-row[data-today="true"][data-state="open"] .hours-day::before { border-left-color: #1f6b33; }
.hours-row[data-today="true"][data-state="closed"] .hours-day::before { border-left-color: var(--accent); }
.hours-state {
  margin: 1.15rem 0 0;
  font-size: .72rem; font-weight: 700;
  letter-spacing: .18em; text-transform: uppercase;
}
.hours-state[data-state="open"] { color: #1a5c2c; }
.hours-state[data-state="closed"] { color: var(--accent-deep); }

.visit-actions { display: flex; flex-wrap: wrap; gap: .7rem; margin-top: 1.9rem; }
.visit-photo { margin: 0; min-width: 0; display: flex; flex-direction: column; }
.visit-photo picture { flex: 1 1 auto; }
.visit-photo img {
  display: block; width: 100%; height: 100%;
  min-height: 300px;
  object-fit: cover; object-position: center 48%;
}

/* =========================================================================
   FOOTER — utility only. The nav and the reserve band own the booking CTA,
   so it is not repeated here.
   ========================================================================= */
.site-footer {
  background: var(--paper-2);
  border-top: 3px solid var(--accent);
  padding: clamp(2.6rem, 4.5vw, 3.6rem) 0 2.2rem;
  text-align: center;
}
/* The client's own mark, on a plate above the wordmark (D1, 2026-09-10).
   The page paper is cream and the commonest harvested restaurant mark is a
   WHITE KNOCKOUT crest, which would disappear on it, so the mark is given its
   own deep-accent plate rather than the paper: a knockout reads white on brown,
   and a dark or full-colour mark still reads against the same brown. The plate
   is an inline span so the <img> keeps its own box and its natural aspect
   (width auto against a fixed optical height, contain for the wide-lockup
   clamp) — the masthead keeps the wordmark lockup either way, so nothing about
   the existing header changes. No logo, no plate: both gates close and the
   footer renders exactly what it rendered before this existed. */
.foot-logo { margin: 0 0 1.15rem; }
.foot-logo-plate {
  display: inline-flex; align-items: center; justify-content: center;
  background: var(--accent-deep);
  border-radius: 14px;
  padding: .75rem 1rem;
}
.foot-logo-plate img {
  display: block;
  width: auto; height: 56px;
  max-width: min(220px, 62vw);
  object-fit: contain;
}
.foot-mark {
  font-family: var(--serif); font-weight: 700;
  font-size: 1.35rem; letter-spacing: .16em; text-transform: uppercase;
  color: var(--ink); margin: 0 0 .9rem;
}
.foot-addr {
  margin: 0 0 1.4rem;
  font-size: .78rem; letter-spacing: .13em; text-transform: uppercase;
  color: var(--ink-2);
}
.foot-links {
  list-style: none; margin: 0 0 1.7rem; padding: 0;
  display: flex; flex-wrap: wrap; justify-content: center; gap: .6rem 1.4rem;
}
.foot-links a {
  display: inline-flex; align-items: center; gap: .45rem;
  font-size: .72rem; font-weight: 600;
  letter-spacing: .14em; text-transform: uppercase;
  text-decoration: none; color: var(--ink);
}
.foot-links a:hover { color: var(--accent); }
.foot-links .ico { width: 14px; height: 14px; stroke: var(--accent); }
.colophon, .footer-disclosure {
  margin: 0 auto .55rem;
  max-width: 62ch;
  font-size: .72rem;
  line-height: 1.65;
  color: var(--ink-3);
}
.colophon a { color: var(--ink-3); }
.footer-disclosure { margin-bottom: 0; }
/* The photo-credit line is the LAST line of the footer (operator 2026-09-24: one small line,
   "Photos: <names> via Google Maps", legal-print size), so it sits under the disclosure. */
.footer-disclosure + .colophon { margin: .4rem auto 0; font-size: .68rem; }

/* ---------- the PXLNorth preview badge ---------- */
.preview-badge {
  position: fixed; left: 12px; bottom: 12px; z-index: 60;
  display: flex; align-items: center; gap: .55rem;
  background: rgba(25, 19, 16, .93);
  border-radius: 3px;
  padding: .42rem .55rem .42rem .7rem;
  font-size: .68rem;
  box-shadow: 0 6px 20px rgba(0, 0, 0, .22);
}
.preview-badge a { text-decoration: none; }
.preview-badge-info { color: rgba(255, 255, 255, .9); }
.preview-badge-cta {
  background: var(--accent); color: #fff;
  padding: .3rem .55rem; border-radius: 2px; font-weight: 600;
}
.preview-badge--inflow { box-shadow: none; }

@media (prefers-reduced-motion: reduce) {
  * { animation-duration: .001ms !important; transition-duration: .001ms !important; }
}
