/* =============================================================================
   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: #242319;
  --ink-2: #4b4a3a;
  --ink-3: #6a695a;
  --accent: #a55d1d;
  --accent-deep: #7a4515;
  --paper: #f4f3e8;
  --paper-2: #EEEAE6;
  --line: #e6e6dd;
  --line-soft: #f9f5f0;
  --white: #ffffff;
  /* The ground of an INVERSE band (FOOD round 4, band rhythm): the page's own ink, painted. */
  --inverse: #242319;

  --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: uppercase;

  /* 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;
  --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: 60ch;
}

/* 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 — FOOD round 4: ONE row. The name small at the left (the hero
   below carries it large), the thin uppercase nav, the one action at the
   right. Round 3's stacked centred lockup (name, tagline, nav, two buttons)
   spent ~230px before the first photograph; gate masthead-compact holds it
   under 112px at 1440 and 132px at 390.
   ========================================================================= */
.masthead {
  background: var(--white);
  border-bottom: 1px solid var(--line-soft);
  padding: .8rem 0 .7rem;
}
.masthead-row {
  display: grid;
  grid-template-columns: minmax(0, 1fr);
  justify-items: center;
  row-gap: .55rem;
}
.wordmark {
  display: inline-flex; flex-direction: column; align-items: center;
  font-family: var(--serif);
  text-decoration: none;
  color: var(--ink);
  line-height: 1;
}
.wordmark-lead {
  font-weight: 700;
  letter-spacing: .03em;
  text-transform: uppercase;
  font-size: 1.28rem;
  color: var(--accent);
}
.wordmark-sub {
  display: block;
  font-family: var(--sans);
  font-weight: 600;
  font-size: .5625rem;
  letter-spacing: .34em;
  color: var(--ink);
  margin-top: .3rem;
  padding-left: .34em; /* optical: absorbs the trailing letterspace */
}

.nav-links {
  list-style: none;
  display: flex; flex-wrap: wrap; justify-content: center;
  gap: .35rem 1.15rem;
  margin: 0; padding: 0;
}
.nav-links a {
  font-size: .625rem;
  font-weight: 600;
  letter-spacing: .18em;
  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); }

/* On a phone the hero's own call button sits right under the masthead, so the masthead keeps
   only the name and the nav. */
.nav-actions { display: none; }
.nav-actions .btn { padding: .6rem 1rem; font-size: .72rem; letter-spacing: .09em; }

@media (min-width: 900px) {
  .masthead { padding: .95rem 0; }
  .masthead-row {
    grid-template-columns: auto minmax(0, 1fr) auto;
    justify-items: stretch;
    align-items: center;
    column-gap: 2rem;
  }
  .wordmark { align-items: flex-start; }
  .wordmark-lead { font-size: 1.45rem; }
  .nav-links { gap: .5rem 1.75rem; }
  .nav-links a { font-size: .6875rem; letter-spacing: .2em; }
  .nav-actions { display: flex; gap: .6rem; }
}

/* =========================================================================
   HERO — FOOD round 4: the name, their own one-line promise and the primary
   action BESIDE their best frame. Round 3's hero was the photograph alone
   (the blueprint's shape), and four of five fresh strict readers named it:
   nothing said whose page it was or what to do. The frame still runs to the
   viewport edge; the copy panel sits on paper at its side (1440) or under it
   (390). Named .hero-grid so gate sunk-hero measures the two columns.
   ========================================================================= */
.hero { display: block; background: var(--paper); }
.hero-grid { display: grid; grid-template-columns: minmax(0, 1fr); }
.hero-frame { order: -1; min-width: 0; }
.hero-frame picture, .hero-frame img { display: block; width: 100%; }
.hero-frame img {
  height: auto; min-height: 220px; max-height: min(62vh, 440px);
  object-fit: cover;
  object-position: center 48%;
}
.hero-copy {
  min-width: 0;
  padding: clamp(1.35rem, 5vw, 2rem) 1.25rem clamp(1.6rem, 6vw, 2.2rem);
}
.hero-name {
  font-family: var(--serif);
  font-weight: 700;
  line-height: 1.02;
  letter-spacing: .005em;
  font-size: calc(clamp(2.45rem, 1.4rem + 4.2vw, 4.9rem) * var(--display-scale, 1));
  color: var(--ink);
  overflow-wrap: anywhere;
}
.hero-name .h1-accent { color: var(--accent); }
.hero-name-tail {
  display: block;
  margin-top: .45rem;
  font-size: .42em;
  font-weight: 600;
  letter-spacing: .02em;
  color: var(--ink);
}
.hero-promise {
  margin: 1rem 0 0;
  max-width: 30ch;
  font-family: var(--serif);
  font-style: italic;
  font-size: clamp(1.12rem, 1rem + .5vw, 1.38rem);
  line-height: 1.4;
  color: var(--ink-2);
}
.hero-state {
  margin: 1.05rem 0 0;
  font-size: .7rem; font-weight: 700;
  letter-spacing: .18em; text-transform: uppercase;
}
.hero-state[data-state="open"] { color: #1a5c2c; }
.hero-state[data-state="closed"] { color: var(--accent-deep); }
.hero-actions { display: flex; flex-wrap: wrap; gap: .65rem; margin-top: 1.5rem; }

@media (min-width: 900px) {
  .hero-grid {
    grid-template-columns: minmax(0, 5fr) minmax(0, 7fr);
    min-height: clamp(460px, 68vh, 640px);
  }
  .hero-frame { order: 0; position: relative; }
  .hero-frame picture { position: absolute; inset: 0; }
  .hero-frame img { height: 100%; max-height: none; min-height: 0; }
  .hero-copy {
    display: flex; flex-direction: column; justify-content: center;
    padding: clamp(2.5rem, 5vw, 4.5rem) clamp(2rem, 4.5vw, 4.5rem) clamp(2.5rem, 5vw, 4.5rem) max(1.25rem, calc((100vw - var(--wrap)) / 2));
  }
}
/* NO HERO-WORTHY FRAME (FOOD round 2 fix 7): the best usable frame is shown INSET, inside a margin
   of paper, never blown up edge to edge (hero.inset, set by the author validator's hero rule). */
.hero--inset .hero-frame { padding: 1.25rem 1.25rem 0; }
@media (min-width: 900px) {
  .hero--inset .hero-frame { padding: 2rem 2rem 2rem 0; }
  .hero--inset .hero-frame picture { inset: 2rem 2rem 2rem 0; width: auto; }
}
/* No hero photograph: the copy is the hero, centred on paper. */
.hero--type .hero-grid { grid-template-columns: minmax(0, 1fr); min-height: 0; }
.hero--type .hero-copy { text-align: center; align-items: center; padding-block: clamp(3rem, 8vw, 5.5rem); }
.hero--type .hero-promise { margin-inline: auto; }
.hero--type .hero-actions { justify-content: center; }

/* =========================================================================
   BAND RHYTHM — FOOD round 4. Each band declares the constructions it can
   take (data-band); fill-static writes the one it took (data-band-as) and a
   tone that alternates down the page (data-tone), so no two adjacent bands
   are built alike or share a ground (gate band-rhythm measures it).
     bleed      a photograph runs to the viewport edge
     contained  photographs inside the page margins
     type       no photograph; the typography carries the band
   ========================================================================= */
[data-band][data-tone="a"]:not(.hero) { background: var(--paper); }
[data-band][data-tone="b"]:not(.hero) { background: var(--white); }

.band-head { margin-bottom: clamp(1.6rem, 3vw, 2.4rem); }
.band-head--inline { display: flex; flex-wrap: wrap; align-items: baseline; justify-content: space-between; column-gap: 2rem; }
.band-head--inline .eyebrow { order: 2; margin: 0; }

/* THE STRIP: the photo hierarchy's lead is the first tile, set large; the rest support it smaller
   (FOOD round 4, gate photo-lead). A phone shows the lead full width and the supports in pairs; a
   wide screen a six-track grid where the lead takes four tracks and two rows. Every count fits:
   a lone support spans its row, never a hole. */
.strip {
  --strip-gap: clamp(.5rem, 1.1vw, .85rem);
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: var(--strip-gap);
  width: min(100% - 2.5rem, var(--wrap));
  margin-inline: auto;
}
.strip > .tile { margin: 0; min-width: 0; }
.strip > .tile picture, .strip > .tile img { display: block; width: 100%; height: 100%; }
.strip > .tile img { aspect-ratio: 1 / 1; object-fit: cover; }
.strip > .tile:first-child { grid-column: 1 / -1; }
.strip > .tile:first-child img { aspect-ratio: 4 / 3; }
.strip > .tile:nth-child(even):last-child { grid-column: 1 / -1; }
.strip > .tile:nth-child(even):last-child img { aspect-ratio: 16 / 9; }
.strip > .tile:only-child img { aspect-ratio: 16 / 10; }
@media (min-width: 900px) {
  .strip {
    grid-template-columns: repeat(6, minmax(0, 1fr));
    grid-auto-rows: clamp(150px, 14vw, 230px);
  }
  .strip > .tile, .strip > .tile:nth-child(even):last-child { grid-column: span 2; }
  .strip > .tile img, .strip > .tile:first-child img,
  .strip > .tile:nth-child(even):last-child img { aspect-ratio: auto; }
  .strip > .tile:first-child { grid-column: span 4; grid-row: span 2; }
  .strip > .tile:nth-child(2):last-child { grid-row: span 2; }
  /* four: the lead three rows tall, the three supports stacked beside it, never a one-row strip
     that cuts a photograph at the eyes */
  .strip:has(> .tile:nth-child(4):last-child) > .tile:first-child { grid-row: span 3; }
  .strip > .tile:nth-child(4):nth-last-child(2), .strip > .tile:nth-child(5):last-child { grid-column: span 3; }
  .strip > .tile:only-child { grid-column: 1 / -1; grid-row: span 2; }
}
/* bleed: the strip runs edge to edge with hairline gaps, no page margin. */
[data-band-as="bleed"] > .strip { width: 100%; --strip-gap: 4px; }
.strip > .tile figcaption {
  margin-top: .55rem;
  font-size: .8125rem; line-height: 1.5; letter-spacing: .02em;
  color: var(--ink-3);
}

/* =========================================================================
   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 dish photographs are a STRIP (see BAND RHYTHM above): the lead dish large, the rest smaller,
   inside the margins (contained) or edge to edge (bleed), whichever differs from the band above. */
.menu > .dish-strip { margin-bottom: clamp(2.2rem, 4vw, 3.2rem); }

.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); }
/* THE NOTE BELONGS TO THE WHOLE CARD (FOOD round 3 fix 3). It used to be a 68ch paragraph after
   the two columns, so at 1440 it sat under the LEFT column alone and read as that column's
   footnote, stranded when the right column ran shorter (stjohnsbakery.com, mariastortasjalisco.com).
   The note and the full-menu link now share one foot that spans the card: the rule runs the full
   width under both columns and the text is centred on the card's axis, at every width. */
.menu-foot {
  margin: clamp(2rem, 3.4vw, 2.8rem) 0 0;
  padding-top: 1.4rem;
  border-top: 1px solid var(--line);
  text-align: center;
}
.menu-foot:not(:has(.menu-note)):not(:has(.menu-actions > *)) { display: none; }
.menu-note {
  margin: 0 auto;
  font-size: .95rem;
  color: var(--ink-2);
  max-width: 68ch;
}
.menu-actions { display: flex; flex-wrap: wrap; justify-content: center; gap: .7rem; margin-top: 1.3rem; }
.menu-actions:empty, .menu-actions:not(:has(> *)) { display: none; }

/* =========================================================================
   GALLERY (FOOD round 3 fix 5) — the home for THEIR OWN photographs that no
   other band has a frame for. Filled by the imagery engine from their own
   pool only (template.json declares the slot realOnly: no stock, ever), and
   dropped when that pool is spent. It reuses the strip that fits its count.
   ========================================================================= */
.gallery { padding: calc(var(--rhythm) * var(--emph-pad, 1)) 0; }
/* bleed: the mosaic runs edge to edge and to the band's foot, the heading a single line above it. */
.gallery[data-band-as="bleed"] { padding-bottom: 0; }
.gallery .band-head h2 { font-size: calc(clamp(1.6rem, 1.2rem + 1.6vw, 2.3rem) * var(--display-scale, 1)); }

/* =========================================================================
   STORY — their own room, their own words.
   ========================================================================= */
.story { padding: calc(var(--rhythm) * var(--emph-pad, 1)) 0; }
/* bleed (FOOD round 4): their photograph fills the band's left half to the viewport edge and the
   band's full height; the words sit in the right half, aligned to the page margin. */
.story[data-band-as="bleed"] { padding-top: 0; }
.story[data-band-as="bleed"] > .story-grid { width: 100%; }
.story[data-band-as="bleed"] .story-copy { padding-inline: 1.25rem; }
.story[data-band-as="bleed"] .story-photo img { max-height: 440px; }
@media (min-width: 980px) {
  .story[data-band-as="bleed"] { padding-block: 0; }
  .story[data-band-as="bleed"] > .story-grid { gap: 0; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); }
  .story[data-band-as="bleed"] .story-photo img { max-height: none; min-height: 520px; }
  .story[data-band-as="bleed"] .story-copy {
    align-self: center;
    padding: calc(var(--rhythm) * var(--emph-pad, 1)) max(1.25rem, calc((100vw - var(--wrap)) / 2)) calc(var(--rhythm) * var(--emph-pad, 1)) clamp(2.2rem, 5vw, 5rem);
  }
}
.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; }
/* A BAND WITH NO PHOTOGRAPH OF THEIRS COMPOSES AS TYPE (FOOD round 3 fix 5, $density.underFloor):
   never a two-column grid with an empty column. The story becomes a centred text column. */
@media (min-width: 980px) {
  .story-grid:not(:has(> .story-photo)) { grid-template-columns: minmax(0, 46rem); justify-content: center; }
}
.story-grid:not(:has(> .story-photo)) .story-copy { text-align: center; }
.story-grid:not(:has(> .story-photo)) .story-copy p { margin-inline: auto; }
.story-grid:not(:has(> .story-photo)) .rule { margin-inline: auto; }
.story-grid:not(:has(> .story-photo)) .facts { display: inline-block; text-align: left; }
/* 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); }
  .review-cards:has(> .review:nth-child(2):last-child) > .review:last-child { flex-basis: min(100%, 38rem); }
}
@media (min-width: 1120px) {
  .review-cards > .review { flex-basis: calc((100% - 2 * var(--review-gap)) / 3); }
  .review-cards:has(> .review:nth-child(3):last-child) > .review,
  .review-cards:has(> .review:nth-child(5):last-child) > .review { flex-basis: calc((100% - var(--review-gap)) / 2); }
}
/* A TYPE BAND LEADS WITH ONE VOICE (FOOD round 4, band rhythm): the first guest's words are set as
   a display quotation across the band, no card, and the others follow as cards. A single review is
   the lead alone. The quote is theirs verbatim; only its size changes. */
.guests .review-cards:has(> .review) > .review:first-child { flex-basis: 100%; }
.review-cards > .review:first-child {
  background: transparent; border-top: 0;
  align-items: center; text-align: center;
  padding: 0 0 clamp(1.6rem, 3vw, 2.4rem);
}
.review-cards > .review:first-child .review-quote {
  font-family: var(--serif);
  font-size: clamp(1.18rem, 1rem + .85vw, 1.6rem);
  line-height: 1.45;
  color: var(--ink);
  max-width: 44ch;
  margin-inline: auto;
}
.review-cards > .review:first-child .review-quote::before { content: "\201C"; }
.review-cards > .review:first-child .review-quote::after { content: "\201D"; }
[data-tone="a"] .review:not(:first-child) { background: var(--white); }
.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 { padding: calc(var(--rhythm) * var(--emph-pad, 1)) 0; }
/* bleed (FOOD round 4): their photograph fills the band's right half to the viewport edge. */
.visit[data-band-as="bleed"] { padding-bottom: 0; }
.visit[data-band-as="bleed"] > .visit-grid { width: 100%; }
.visit[data-band-as="bleed"] .visit-main { padding-inline: 1.25rem; }
.visit[data-band-as="bleed"] .visit-photo img { max-height: 440px; }
@media (min-width: 980px) {
  .visit[data-band-as="bleed"] { padding-block: 0; }
  .visit[data-band-as="bleed"] > .visit-grid { gap: 0; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); }
  .visit[data-band-as="bleed"] .visit-photo img { max-height: none; min-height: 520px; }
  .visit[data-band-as="bleed"] .visit-main {
    padding: calc(var(--rhythm) * var(--emph-pad, 1)) clamp(2.2rem, 5vw, 5rem) calc(var(--rhythm) * var(--emph-pad, 1)) max(1.25rem, calc((100vw - var(--wrap)) / 2));
  }
}
.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; }
/* No visit photograph: the place and its hours become the two columns (FOOD round 3 fix 5).
   The city, address and actions on the left; the day-part and week list on the right. The
   week list's height goes to the row under the actions, so they sit right under the address. */
@media (min-width: 980px) {
  .visit-grid:not(:has(> .visit-photo)) { grid-template-columns: minmax(0, 1fr); }
  .visit-grid:not(:has(> .visit-photo)) .visit-main {
    display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
    grid-template-areas: "id hours" "actions hours"; grid-template-rows: auto 1fr;
    column-gap: clamp(2rem, 5vw, 4.5rem);
  }
  .visit-grid:not(:has(> .visit-photo)) .visit-id { grid-area: id; }
  .visit-grid:not(:has(> .visit-photo)) .visit-hours { grid-area: hours; }
  .visit-grid:not(:has(> .visit-photo)) .visit-actions { grid-area: actions; align-self: start; }
  .visit-grid:not(:has(> .visit-photo)) .visit-hours > .daypart { margin-top: .35rem; }
}
.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; }
/* Directly under the hero, the hero's call and directions buttons are a screen away at most:
   the visit band does not repeat them (FOOD round 4). */
.hero + .visit .visit-actions { display: none; }

/* INVERSE (FOOD round 4, band rhythm): a visit band with no photograph that follows another band
   of type is set light on the page's own ink, so two photo-less bands in a row are never alike.
   Every light-ground colour the band uses is re-pointed locally; the accent keeps only its
   non-text jobs (rules, icons, the primary button's fill). */
[data-band][data-band-as="inverse"]:not(.hero) {
  background: var(--inverse);
  --ink: #fbf8f2;
  --ink-2: rgba(251, 248, 242, .86);
  --ink-3: rgba(251, 248, 242, .72);
  --line: rgba(251, 248, 242, .22);
  --line-soft: rgba(251, 248, 242, .14);
}
[data-band-as="inverse"] .caps-line a { color: var(--ink); }
[data-band-as="inverse"] .btn-ghost { color: var(--ink); border-color: var(--ink-2); }
[data-band-as="inverse"] .btn-ghost .ico { stroke: var(--ink); }
[data-band-as="inverse"] .btn-ghost:hover { background: var(--ink); color: var(--inverse); }
[data-band-as="inverse"] .hours-state[data-state="open"] { color: #9fdcac; }
[data-band-as="inverse"] .hours-state[data-state="closed"] { color: #f1c4b3; }
[data-band-as="inverse"] .hours-row[data-today="true"][data-state="open"] .hours-day::before { border-left-color: #9fdcac; }
[data-band-as="inverse"] .hours-row[data-today="true"][data-state="closed"] .hours-day::before { border-left-color: #f1c4b3; }
.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;
}
/* WHICH PLATE THE MARK GETS IS MEASURED, NOT ASSUMED (FOOD round 3 fix 1, fillStatic footMark).
   dark  : a knockout that stays legible as a silhouette, white on the deep plate above.
   light : a mark drawn by colour (lettering on a banner, a name on a map) keeps its colours on a
           light plate; its knockout was a blob (urwarestaurant.com, mariastortasjalisco.com).
   self  : a mark on its own opaque ground is its own plate, shown whole and a size up so its
           lettering reads (alleycatcafe.ca's white cat on black was a tiny square on a plate). */
.foot-logo-plate--light { background: #fbf9f4; box-shadow: 0 0 0 1px var(--line); }
.foot-logo-plate--self { background: transparent; padding: 0; border-radius: 0; }
.foot-logo-plate--self img { height: 128px; max-width: min(280px, 70vw); border-radius: 12px; }
.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; }
}
