/* Café Portico — "Portico". Generated by build/build_portico.py.
 *
 * Two fields, both the client's own: the journey runs on the near-black of
 * the logo, the menu runs on the sage panel of the printed card. Every colour
 * below is either measured from the client's artwork (data.PALETTE) or one
 * interpolated step of it, and every text pair clears 4.5:1.
 */
:root{
  --sage:#BDC5B8;
  --olive:#636C59;
  --ink:#0A0509;
  --paper:#F2F0EA;
  --sage-mid:#9BA694;
  --olive-ink:#3E4438;

  --fg:var(--paper);
  --fg-2:rgba(242,240,234,.80);
  --card:rgba(9,5,8,.80);
  --line:rgba(189,197,184,.22);

  --display:"Cormorant Garamond",Georgia,"Times New Roman",serif;
  --sans:"Inter Tight",ui-sans-serif,system-ui,-apple-system,"Segoe UI",sans-serif;
  --gut:clamp(1.1rem,4vw,3rem);
  --meas:33rem;
}
*,*::before,*::after{box-sizing:border-box}
html{-webkit-text-size-adjust:100%;scroll-behavior:smooth}
@media (prefers-reduced-motion:reduce){html{scroll-behavior:auto}}
body{margin:0;background:var(--ink);color:var(--fg);font-family:var(--sans);
  font-weight:300;font-size:clamp(1rem,.95rem + .2vw,1.08rem);line-height:1.62;
  overflow-x:hidden;-webkit-font-smoothing:antialiased}
img{max-width:100%;height:auto;display:block}
a{color:inherit}
h1,h2,h3,h4{font-family:var(--display);font-weight:400;margin:0;line-height:1.03}
p{margin:0 0 1em}
ul{margin:0;padding:0;list-style:none}
:focus-visible{outline:2.5px solid var(--sage);outline-offset:3px;border-radius:2px}
.vh{position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%);
  white-space:nowrap}
/* The header is fixed, so an anchor jump would otherwise land the heading
   underneath it. */
[id]{scroll-margin-top:clamp(5.5rem,12vh,7.5rem)}
.skip{position:absolute;left:-999px;top:0;z-index:40;background:var(--paper);
  color:var(--ink);padding:.7rem 1rem;font-size:.85rem}
.skip:focus{left:.5rem;top:.5rem}
.arch{width:1em;height:1.125em;display:block;overflow:visible}

/* --- the world --------------------------------------------------------- */
/* The canvas keeps its box at all times — an element with display:none has no
   size, and a renderer with no size never paints, never reports a frame and
   never earns the class that would have revealed it. It simply sits behind the
   chapter posters until a real frame has been drawn. */
#world{position:fixed;inset:0;width:100%;height:100%;display:block;z-index:0;
  background:var(--ink)}
.vig{position:fixed;inset:0;z-index:1;pointer-events:none;display:none;
  background:radial-gradient(122% 82% at 50% 42%,transparent 54%,rgba(4,2,4,.46) 100%)}
html.world-live .vig{display:block}

/* --- chrome ------------------------------------------------------------ */
.top{position:fixed;top:0;left:0;right:0;z-index:12;display:flex;
  align-items:center;justify-content:space-between;gap:1rem;
  padding:clamp(.7rem,2vw,1.2rem) var(--gut);pointer-events:none;
  background:linear-gradient(180deg,rgba(8,4,7,.9) 0%,rgba(8,4,7,.74) 58%,
    rgba(8,4,7,0) 100%)}
.top>*{pointer-events:auto}
.mark{display:flex;align-items:center;gap:.6rem;text-decoration:none;
  color:var(--paper)}
.mark .arch{font-size:1.35rem;color:var(--sage)}
.mark b{font-family:var(--display);font-weight:400;font-size:1.05rem;
  letter-spacing:.2em;text-transform:uppercase;line-height:1}
.mark span{display:block;font-size:.56rem;letter-spacing:.26em;
  text-transform:uppercase;color:var(--sage-mid);margin-top:.2rem}
.mark{text-shadow:0 1px 3px rgba(6,3,6,.9),0 0 12px rgba(6,3,6,.75)}
.rail{text-shadow:0 1px 3px rgba(6,3,6,.9),0 0 12px rgba(6,3,6,.75)}
.topnav{display:flex;gap:.4rem}
.topnav a{font-size:.68rem;letter-spacing:.16em;text-transform:uppercase;
  text-decoration:none;border:1px solid var(--line);padding:.55rem .8rem;
  background:var(--card);color:var(--paper);
  transition:border-color .25s,background-color .25s}
.topnav a:hover{border-color:var(--sage);background:rgba(9,5,8,.92)}
.topnav a.is-key{border-color:var(--sage-mid)}

.rail{position:fixed;left:var(--gut);bottom:clamp(.9rem,3vw,1.8rem);z-index:13;
  display:flex;align-items:center;gap:.7rem;color:var(--paper);
  font-variant-numeric:tabular-nums;background:rgba(8,4,7,.78);
  padding:.35rem .8rem;transition:opacity .3s;display:none}
html.world-live .rail{display:flex}
.rail__clock{font-family:var(--display);font-size:1.15rem;letter-spacing:.04em;
  min-width:4.6em}
.rail__track{position:relative;width:clamp(64px,12vw,132px);height:2px;
  background:rgba(242,240,234,.24)}
.rail__fill{position:absolute;inset:0;background:var(--sage);transform:scaleX(0);
  transform-origin:0 50%}
.rail__note{font-size:.6rem;letter-spacing:.2em;text-transform:uppercase;
  color:var(--sage-mid)}
@media (max-width:640px){.rail__track,.rail__note{display:none}}

.marks{position:fixed;right:var(--gut);top:50%;transform:translateY(-50%);
  z-index:12;display:none;flex-direction:column;gap:.15rem;align-items:flex-end;
  background:rgba(8,4,7,.78);padding:.5rem .8rem;transition:opacity .3s}
html.world-live .marks{display:flex}
.marks a{font-size:.64rem;letter-spacing:.18em;text-transform:uppercase;
  text-decoration:none;color:rgba(242,240,234,.72);padding:.3rem .1rem;
  text-shadow:0 1px 3px rgba(6,3,6,.9),0 0 12px rgba(6,3,6,.8);
  transition:color .25s}
.marks a:hover,.marks a.is-on{color:var(--paper)}
html.past .rail,html.past .marks{opacity:0;visibility:hidden}
.marks a.is-on::after{content:"";display:inline-block;width:1.4rem;height:1px;
  background:var(--sage);margin-left:.5rem;vertical-align:middle}
@media (max-width:900px){html.world-live .marks{display:none}}

/* --- journey ----------------------------------------------------------- */
main{position:relative;z-index:2}
.journey{position:relative}
/* Default: a finished document. Every chapter carries the sky it would have
   had, so a page with no JavaScript, no CDN, no WebGL or a reader who asked
   for less motion still walks through the day — it just does not move. */
.chapter{position:relative;display:flex;align-items:center;
  padding:clamp(4rem,11vw,7rem) var(--gut);
  background:linear-gradient(170deg,var(--sky-a) 0%,var(--sky-b) 118%)}
html.js .chapter{min-height:calc(var(--w) * 100vh);padding:7rem var(--gut) 8rem}
html.world-live .chapter{background:none}
.beat{position:relative;max-width:var(--meas);background:var(--card);
  border:1px solid var(--line);border-left:2px solid var(--sage);
  padding:clamp(1.4rem,3.4vw,2.3rem);
  -webkit-backdrop-filter:blur(16px) saturate(115%);
  backdrop-filter:blur(16px) saturate(115%)}
.chapter:nth-child(even) .beat{margin-left:auto}
@media (min-width:901px){.chapter:nth-child(even) .beat{margin-right:7.5rem}}
.eyebrow{font-size:.66rem;letter-spacing:.24em;text-transform:uppercase;
  color:var(--sage);margin:0 0 1rem}
.beat h1,.beat h2{font-size:clamp(2.1rem,1.3rem + 3.4vw,3.5rem);
  letter-spacing:-.012em}
.beat h1{letter-spacing:.03em;text-transform:uppercase;
  font-size:clamp(1.9rem,1.1rem + 3.2vw,3.2rem)}
.beat .lede{font-size:clamp(1.06rem,1rem + .5vw,1.32rem);color:var(--paper);
  margin:1rem 0 1.1rem;font-weight:300}
.beat p:not(.lede):not(.eyebrow){color:var(--fg-2)}
.beat p:last-child{margin-bottom:0}
.cue{font-size:.66rem;letter-spacing:.22em;text-transform:uppercase;
  color:var(--sage-mid);margin-top:1.6rem}
.btn{display:inline-block;margin-top:1.3rem;text-decoration:none;
  border:1px solid var(--sage);padding:.72rem 1.35rem;font-size:.72rem;
  letter-spacing:.2em;text-transform:uppercase;color:var(--paper);
  max-width:100%;overflow-wrap:anywhere;
  transition:background-color .25s,color .25s}
/* The email address is the only contact channel there is, so it is printed as
   an address rather than shouted as a label — and a 29-character word in
   uppercase with .2em tracking overflowed a 500px viewport. */
.btn--mail{letter-spacing:.04em;text-transform:none;font-size:.9rem}
.btn:hover{background:var(--sage);color:var(--ink)}
.btn+.btn{margin-left:.5rem}

/* Reveal is opt-in: without html.js nothing is hidden, so a dead CDN or a
   thrown error leaves the finished document rather than an empty page. */
html.js .beat{opacity:0;transform:translateY(14px);
  transition:opacity .7s ease,transform .7s ease}
html.js .beat.is-in{opacity:1;transform:none}
@media (prefers-reduced-motion:reduce){
  html.js .beat{opacity:1;transform:none;transition:none}
}

html.world-live .beat{background:var(--card)}
.beat{background:rgba(9,5,8,.88);-webkit-backdrop-filter:none;
  backdrop-filter:none}
html.world-live .beat{-webkit-backdrop-filter:blur(16px) saturate(115%);
  backdrop-filter:blur(16px) saturate(115%)}
.poster{position:absolute;right:var(--gut);bottom:2rem;
  width:clamp(70px,12vw,120px);color:rgba(242,240,234,.55)}
html.world-live .poster{display:none}
.poster .arch{width:100%;height:auto}

/* --- the document ------------------------------------------------------ */
.doc{position:relative;z-index:2;background:var(--sage);color:var(--ink);
  padding:clamp(3.5rem,9vw,7rem) 0}
.wrap{max-width:74rem;margin:0 auto;padding-inline:var(--gut)}
.doc__h{max-width:46rem;margin-bottom:clamp(2.4rem,6vw,4rem)}
.doc__h .eyebrow{color:var(--olive-ink)}
.doc__h h2{font-size:clamp(2.3rem,1.4rem + 4vw,4rem);letter-spacing:-.014em}
.doc__h p{color:var(--olive-ink);max-width:var(--meas);margin-top:1rem}
.rule{height:1px;background:rgba(10,5,9,.18);margin:clamp(2.2rem,5vw,3.4rem) 0}

.course{margin-bottom:clamp(2.6rem,6vw,4.4rem)}
.course__h{display:flex;flex-wrap:wrap;align-items:baseline;gap:.4rem 1rem;
  background:var(--olive);color:var(--paper);
  padding:.85rem clamp(.9rem,2.4vw,1.4rem);margin-bottom:clamp(1.6rem,4vw,2.4rem)}
.course__h h3{font-size:clamp(1.35rem,1.1rem + 1vw,1.9rem);letter-spacing:.14em;
  text-transform:uppercase}
.course__h p{margin:0;font-size:.72rem;letter-spacing:.2em;text-transform:uppercase;
  color:var(--paper)}
.sec__h{font-family:var(--display);font-style:italic;font-weight:400;
  font-size:clamp(1.2rem,1.05rem + .6vw,1.55rem);letter-spacing:.02em;
  color:var(--olive-ink);margin:0 0 .3rem}
.sec__note{font-size:.82rem;letter-spacing:.02em;color:var(--olive-ink);
  margin:0 0 1.2rem;max-width:var(--meas)}
.sec__sub,.sec__foot{font-size:.78rem;color:var(--olive-ink);margin:.9rem 0 0}
.course__sec{margin-bottom:clamp(2rem,4.5vw,3rem)}
.course__sec>.sec__h{border-top:1px solid rgba(10,5,9,.2);padding-top:1rem}

.dishes{display:grid;gap:clamp(1rem,2.4vw,1.6rem);
  grid-template-columns:repeat(auto-fill,minmax(21rem,1fr))}
.dish{display:flex;gap:clamp(.75rem,1.8vw,1.1rem);align-items:flex-start}
.dish__b{flex:1 1 auto;min-width:0}
.dish__h{display:flex;align-items:baseline;gap:.4rem;margin:0 0 .25rem;
  font-size:1.02rem}
.dish__n{font-weight:400;color:var(--ink)}
.dot{flex:1 1 auto;border-bottom:1px dotted rgba(10,5,9,.38);
  transform:translateY(-.24em);min-width:1rem}
.dish__p{font-variant-numeric:tabular-nums;font-weight:400;color:var(--ink);
  white-space:nowrap}
.dish__d{font-size:.86rem;line-height:1.55;color:var(--olive-ink);margin:0;
  max-width:30rem}
.diet{text-decoration:none;border:0;font-size:.78em;color:var(--olive-ink);
  font-style:italic}

/* The dish tiles are 1000x1000 with the dish name burned into a dark bar
   across the bottom 12%. The frame is 88% tall and the image overflows it, so
   the burned-in name is never shown and can never disagree with the HTML. */
.fig{margin:0;flex:0 0 auto;width:clamp(76px,15vw,104px);
  aspect-ratio:1 / 0.88;overflow:hidden;background:var(--sage-mid)}
.fig img{width:100%;height:auto;display:block}
.fig--wide{width:100%}

.adds{display:grid;gap:.15rem .9rem;margin-top:1rem;
  grid-template-columns:repeat(auto-fill,minmax(14rem,1fr))}
.adds li{display:flex;align-items:baseline;gap:.5rem;font-size:.86rem;
  color:var(--olive-ink);border-bottom:1px dotted rgba(10,5,9,.2);
  padding-block:.28rem}
.adds li b{margin-left:auto;font-weight:400;color:var(--ink);
  font-variant-numeric:tabular-nums}
.myo>.sec__h{margin-bottom:.6rem}

.specs{display:grid;gap:clamp(1rem,2.4vw,1.6rem);
  grid-template-columns:repeat(auto-fill,minmax(13rem,1fr))}
.spec__n{margin:.6rem 0 0;font-size:.95rem;color:var(--ink)}

.drinks{display:grid;gap:.1rem clamp(1rem,3vw,2.4rem);
  grid-template-columns:repeat(auto-fill,minmax(17rem,1fr))}
.dsec{margin-bottom:clamp(1.8rem,4vw,2.8rem)}
.dsec>.sec__h{border-top:1px solid rgba(10,5,9,.2);padding-top:1rem;
  margin-bottom:.8rem}
.drink__h{display:flex;align-items:baseline;gap:.4rem;margin:0;
  padding-block:.3rem;font-size:.98rem}
.drink__p{font-variant-numeric:tabular-nums;white-space:nowrap}
.drink__d{font-size:.82rem;color:var(--olive-ink);margin:0 0 .5rem}
.dsec--hero{background:var(--ink);color:var(--sage);padding:clamp(1.2rem,3vw,2rem);
  margin-block:clamp(1.8rem,4vw,2.8rem)}
.dsec--hero>.sec__h,.dsec--hero .sec__note{color:var(--sage);border-top-color:
  rgba(189,197,184,.3)}
.dsec--hero .drink__d{color:var(--sage-mid)}
.dsec--hero .dot{border-bottom-color:rgba(189,197,184,.4)}

.surch{margin-top:clamp(1.6rem,4vw,2.4rem);border:1px solid rgba(10,5,9,.22);
  padding:clamp(.9rem,2.4vw,1.3rem)}
.surch ul{display:flex;flex-wrap:wrap;gap:.35rem 1.4rem;font-size:.82rem;
  color:var(--olive-ink)}
.surch li::before{content:"— ";color:var(--olive-ink)}
.legend{display:flex;gap:1.2rem;flex-wrap:wrap;font-size:.8rem;
  color:var(--olive-ink);margin-bottom:1.4rem}
.legend b{font-weight:400;color:var(--ink)}

.boards{display:grid;gap:1.2rem;grid-template-columns:repeat(auto-fit,minmax(19rem,1fr));
  margin-top:clamp(2rem,5vw,3rem)}
.boards figure{margin:0}
.boards figcaption{font-size:.78rem;color:var(--olive-ink);margin-top:.55rem}

/* --- find us ----------------------------------------------------------- */
.find{background:var(--ink);color:var(--paper);position:relative;z-index:2;
  padding:clamp(3.5rem,9vw,7rem) 0}
.find .eyebrow{color:var(--sage)}
.find h2{font-size:clamp(2.1rem,1.3rem + 3.4vw,3.4rem)}
.find__grid{display:grid;gap:clamp(1.6rem,4vw,3rem);
  grid-template-columns:repeat(auto-fit,minmax(13.5rem,1fr));align-items:start}
.find__grid h3{font-size:.68rem;letter-spacing:.24em;text-transform:uppercase;
  font-family:var(--sans);color:var(--sage);margin:0 0 .8rem}
.find address{font-style:normal;color:var(--paper);line-height:1.7}
.find p,.find dd{color:var(--fg-2)}
.hours{border-collapse:collapse;width:100%;max-width:22rem}
.hours caption{position:absolute;width:1px;height:1px;overflow:hidden;
  clip-path:inset(50%);white-space:nowrap}
.hours th,.hours td{text-align:left;padding:.42rem 0;font-weight:400;
  border-bottom:1px solid var(--line);font-size:.94rem}
.hours th{padding-right:1.2rem;white-space:nowrap}
.hours td{text-align:right;font-variant-numeric:tabular-nums;color:var(--paper)}
.facts li{padding:.42rem 0;border-bottom:1px solid var(--line);font-size:.94rem;
  color:var(--paper)}
.kv{margin:0;display:grid;grid-template-columns:auto 1fr;gap:.35rem 1rem;
  font-size:.9rem}
.kv dt{color:var(--sage-mid)}
.kv dd{margin:0;text-align:right;font-variant-numeric:tabular-nums}
.room{margin:clamp(2rem,5vw,3.2rem) 0 0}
.room figcaption{font-size:.8rem;color:var(--sage-mid);margin-top:.6rem;
  max-width:38rem}
.soc{display:inline-block;margin-right:.6rem}
.soc img{width:32px;height:32px;filter:invert(1) opacity(.8)}
.soc:hover img{filter:invert(1) opacity(1)}
.foot{border-top:1px solid var(--line);margin-top:clamp(2.6rem,6vw,4rem);
  padding-top:1.6rem;display:flex;flex-wrap:wrap;gap:.6rem 1.6rem;
  font-size:.76rem;color:var(--sage-mid)}
.foot .logo{width:44px;height:44px}

@media (max-width:560px){
  .dishes,.drinks{grid-template-columns:1fr}
  .top{flex-direction:column;align-items:flex-start;gap:.6rem}
  .chapter{padding-top:8.5rem}
}

@media print{
  #world,.vig,.top,.rail,.marks,.journey,.skip{display:none !important}
  .chapter{background:none}
  body{background:#fff;color:#000}
  .doc,.find{background:#fff;color:#000;padding:0}
  .course__h{background:#000;color:#fff}
  .dsec--hero{background:#fff;color:#000;border:1px solid #000}
  .dsec--hero>.sec__h,.dsec--hero .drink__d,.dsec--hero .sec__note{color:#000}
}
