/*
 * Cafe — a coffee shop storefront: a dark rail of navigation on the left, and the
 * shop's day laid out on warm paper beside it.
 *
 * A theme ships its own CSS because site-runtime's Tailwind only ever scanned its
 * own source: a theme installed later is invisible to it. So this file is plain,
 * self-contained CSS, scoped under `.zcaf`, and it never styles a bare element
 * outside that scope.
 *
 * Dark mode is the platform's: the runtime sets `data-theme` on <html> before
 * first paint and the theme only declares the palette for each mode. Nothing here
 * branches on the mode in markup, which is what makes the switch flash-free — and
 * where a *different asset* is needed per mode (the footer wordmark), both are
 * rendered and CSS picks, rather than the server guessing.
 */

.zcaf {
  --zcaf-accent: #8a4b2a;
  --zcaf-gold: #d7a469;
  --zcaf-ink: #2b1d15;
  --zcaf-ink-soft: #5d4a3e;
  --zcaf-ink-faint: #8e7c70;
  --zcaf-paper: #faf6f0;
  --zcaf-surface: #ffffff;
  --zcaf-surface-warm: #f4ede3;
  --zcaf-line: #e9dfd2;
  /*
   * The rail, as its own pair rather than as `ink` on `paper`.
   *
   * In light mode "dark background, light text" IS ink on paper, which is why the
   * shorthand was tempting. In dark mode both of those tokens flip, so the rail
   * ended up near-black text on a near-black panel: legible in every screenshot
   * taken in light mode and invisible in the one that mattered. A surface that is
   * dark in BOTH modes needs a foreground that does not follow the theme's.
   */
  --zcaf-rail-top: #3d2618;
  --zcaf-rail-bottom: #2a180f;
  --zcaf-rail-fg: #f5e9dd;
  --zcaf-shadow: 0 18px 40px -28px rgba(58, 36, 22, 0.55);
  --zcaf-shadow-card: 0 10px 30px -22px rgba(58, 36, 22, 0.5);
  --zcaf-radius: 20px;
  --zcaf-radius-lg: 26px;
  --zcaf-radius-sm: 12px;
  --zcaf-rail: 248px;
  --zcaf-max: 1240px;

  background: var(--zcaf-paper);
  color: var(--zcaf-ink);
  font-family: ui-sans-serif, system-ui, "Segoe UI", "Noto Sans", Roboto, sans-serif;
  font-size: 16px;
  line-height: 1.6;
  -webkit-font-smoothing: antialiased;
}

:root[data-theme="dark"] .zcaf {
  --zcaf-ink: #f4ece3;
  --zcaf-ink-soft: #cbb9a9;
  --zcaf-ink-faint: #9c8a7c;
  --zcaf-paper: #17110d;
  --zcaf-surface: #211812;
  --zcaf-surface-warm: #2b1f17;
  --zcaf-line: #3a2b21;
  --zcaf-rail-top: #241610;
  --zcaf-rail-bottom: #150c07;
  --zcaf-shadow: 0 18px 40px -28px rgba(0, 0, 0, 0.85);
  --zcaf-shadow-card: 0 10px 30px -22px rgba(0, 0, 0, 0.8);
}

.zcaf *,
.zcaf *::before,
.zcaf *::after {
  box-sizing: border-box;
}

.zcaf h1,
.zcaf h2,
.zcaf h3 {
  font-family: ui-serif, Georgia, "Times New Roman", serif;
  font-weight: 600;
  line-height: 1.2;
  letter-spacing: -0.01em;
  margin: 0 0 0.5em;
}

.zcaf h1 {
  font-size: clamp(2rem, 1.3rem + 2.4vw, 3.1rem);
}
.zcaf h2 {
  font-size: clamp(1.45rem, 1.15rem + 1.2vw, 2rem);
}
.zcaf h3 {
  font-size: 1.05rem;
}
.zcaf p {
  margin: 0 0 1rem;
}

/*
 * The default for a link, held at the specificity of a class it can lose to.
 *
 * Written as `.zcaf a` this rule outranked every single-class rule below it —
 * `.zcaf__button`, `.zcaf__text-link`, `.zcaf__promo--feature` — because a type
 * selector beats nothing. So a button that was a <button> came out white on
 * roasted brown and the same button as an <a> came out ink on roasted brown:
 * the theme's own colours were being applied only to the half of the buttons
 * that were not links. `:where()` contributes no specificity, which is what
 * "this is the fallback" was meant to say in the first place.
 */
.zcaf :where(a) {
  color: inherit;
  text-decoration-color: color-mix(in srgb, var(--zcaf-accent) 45%, transparent);
  text-underline-offset: 3px;
}
.zcaf :where(a):hover {
  text-decoration-color: var(--zcaf-accent);
}

.zcaf svg {
  width: 100%;
  height: 100%;
  fill: none;
  stroke: currentColor;
  stroke-width: 1.6;
  stroke-linecap: round;
  stroke-linejoin: round;
}
/* Brand marks are drawn as solid shapes; an outlined logo reads as a sketch of one. */
.zcaf .zcaf__glyph--filled {
  fill: currentColor;
  stroke: none;
}

.zcaf :focus-visible {
  outline: 2px solid var(--zcaf-accent);
  outline-offset: 3px;
  border-radius: 4px;
}

/* Visible to a screen reader, to nobody else. */
.zcaf__sr {
  position: absolute;
  width: 1px;
  height: 1px;
  margin: -1px;
  padding: 0;
  overflow: hidden;
  clip-path: inset(50%);
  white-space: nowrap;
  border: 0;
}

.zcaf__pad {
  width: 100%;
  max-width: var(--zcaf-max);
  margin: 0 auto;
  padding: 0 clamp(16px, 2.4vw, 32px);
}

.zcaf__measure {
  max-width: 68ch;
}

.zcaf__skip {
  position: absolute;
  left: -9999px;
  top: 0;
  background: var(--zcaf-accent);
  color: #fff;
  padding: 10px 16px;
  z-index: 60;
}
.zcaf__skip:focus {
  left: 12px;
  top: 12px;
}

.zcaf__eyebrow {
  margin: 0 0 0.6rem;
  font-size: 0.75rem;
  font-weight: 700;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  color: var(--zcaf-accent);
}

.zcaf__empty {
  margin: 0;
  padding: 22px;
  border: 1px dashed var(--zcaf-line);
  border-radius: var(--zcaf-radius-sm);
  color: var(--zcaf-ink-faint);
  background: var(--zcaf-surface-warm);
}

.zcaf__note {
  color: var(--zcaf-ink-faint);
  font-size: 0.92rem;
}

/* ------------------------------------------------------------------ buttons */

.zcaf__button {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 8px;
  padding: 13px 24px;
  border: 1px solid transparent;
  border-radius: 999px;
  background: var(--zcaf-accent);
  color: #fff;
  font-weight: 600;
  font-size: 0.95rem;
  text-decoration: none;
  cursor: pointer;
  transition: transform 0.15s ease, filter 0.15s ease;
}
.zcaf__button:hover {
  filter: brightness(1.08);
  transform: translateY(-1px);
}
.zcaf__button--small {
  padding: 9px 18px;
  font-size: 0.88rem;
}
.zcaf__button--gold {
  background: var(--zcaf-gold);
  color: #2b1d15;
}
.zcaf__button--ghost {
  background: rgba(255, 255, 255, 0.08);
  border-color: rgba(255, 255, 255, 0.55);
  color: #fff;
}

/*
 * A row link or image whose source the query enhancer removed — an order with
 * nothing left to pay, a menu item with no photograph — is hidden rather than
 * offered as a dead button or a broken-image glyph.
 */
.zcaf a[data-zc-href]:not([href]),
.zcaf img[data-zc-src]:not([src]) {
  display: none;
}

.zcaf__text-link {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  font-weight: 600;
  font-size: 0.9rem;
  color: var(--zcaf-accent);
  text-decoration: none;
  white-space: nowrap;
}
.zcaf__text-link:hover {
  text-decoration: underline;
}

.zcaf__chip {
  display: inline-block;
  padding: 5px 12px;
  border-radius: 8px;
  background: var(--zcaf-gold);
  color: #2b1d15;
  font-size: 0.8rem;
  font-weight: 700;
  letter-spacing: 0.04em;
}

/* -------------------------------------------------------------------- shell */

.zcaf__shell {
  display: grid;
  grid-template-columns: var(--zcaf-rail) minmax(0, 1fr);
  align-items: start;
  /*
   * The rail's colour is painted on the SHELL as well as on the rail itself.
   *
   * The rail is one viewport tall and sticky, so it follows the reader down a long
   * page — but the grid track behind it is as tall as the page, and on a page
   * taller than the screen the part of that track the rail is not currently over
   * would otherwise show the paper through. Painting the column here means the
   * left edge is the right colour before the rail arrives at it.
   */
  background: linear-gradient(
    90deg,
    var(--zcaf-rail-bottom) 0 var(--zcaf-rail),
    transparent var(--zcaf-rail)
  );
}

.zcaf__main {
  min-width: 0;
}

/* --------------------------------------------------------------------- rail */

.zcaf__side {
  position: sticky;
  top: 0;
  align-self: start;
  height: 100vh;
  height: 100dvh;
  overflow-y: auto;
  background: linear-gradient(180deg, var(--zcaf-rail-top), var(--zcaf-rail-bottom));
  color: var(--zcaf-rail-fg);
  z-index: 30;
}
/*
 * The coffee-leaf wash behind the rail. Two soft ellipses and a hairline arc —
 * drawn in CSS rather than shipped as an image so it costs no request and tints
 * itself from the accent the owner chose.
 */
.zcaf__side::before {
  content: "";
  position: absolute;
  inset: 0;
  pointer-events: none;
  background:
    radial-gradient(
      420px 300px at -30% 38%,
      color-mix(in srgb, var(--zcaf-gold) 22%, transparent),
      transparent 70%
    ),
    radial-gradient(
      260px 220px at 120% 82%,
      color-mix(in srgb, var(--zcaf-accent) 40%, transparent),
      transparent 72%
    );
  opacity: 0.55;
}

.zcaf__side-inner {
  position: relative;
  display: flex;
  flex-direction: column;
  gap: 26px;
  min-height: 100%;
  padding: 26px 16px 22px;
}

.zcaf__side-brand {
  display: grid;
  justify-items: center;
  gap: 8px;
  padding: 6px 8px 2px;
  text-align: center;
  text-decoration: none;
  color: inherit;
}
.zcaf__side-brand img {
  width: auto;
  height: 62px;
  max-width: 100%;
  object-fit: contain;
}
.zcaf__side-brand strong {
  font-family: ui-serif, Georgia, serif;
  font-size: 1.02rem;
  font-weight: 600;
  letter-spacing: 0.16em;
  text-transform: uppercase;
}
.zcaf__side-brand small {
  font-size: 0.74rem;
  opacity: 0.66;
}

.zcaf__side-nav ul {
  margin: 0;
  padding: 0;
  list-style: none;
  display: grid;
  gap: 4px;
}
.zcaf__side-nav a {
  display: flex;
  align-items: center;
  gap: 12px;
  padding: 11px 12px;
  border-radius: 14px;
  font-size: 0.94rem;
  font-weight: 500;
  text-decoration: none;
  color: inherit;
}
.zcaf__side-nav a:hover {
  background: rgba(255, 255, 255, 0.08);
}
.zcaf__side-nav a[aria-current="page"] {
  background: rgba(255, 255, 255, 0.13);
  font-weight: 600;
}
.zcaf__side-ico {
  display: grid;
  place-items: center;
  flex: 0 0 auto;
  width: 32px;
  height: 32px;
  padding: 7px;
  border-radius: 50%;
  background: rgba(255, 255, 255, 0.09);
}
.zcaf__side-nav a[aria-current="page"] .zcaf__side-ico {
  background: var(--zcaf-gold);
  color: #2b1d15;
}

.zcaf__side-foot {
  display: grid;
  gap: 14px;
  margin-top: auto;
}

.zcaf__side-auth {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 9px;
  padding: 11px 14px;
  border: 1px solid rgba(255, 255, 255, 0.28);
  border-radius: 14px;
  font-size: 0.9rem;
  font-weight: 600;
  text-decoration: none;
  color: inherit;
}
.zcaf__side-auth:hover {
  background: rgba(255, 255, 255, 0.08);
}
.zcaf__side-auth span {
  width: 18px;
  height: 18px;
}

.zcaf__wifi {
  padding: 13px 14px;
  border-radius: 14px;
  background: rgba(255, 255, 255, 0.07);
  font-size: 0.8rem;
}
.zcaf__wifi-head {
  display: flex;
  align-items: center;
  gap: 8px;
  margin: 0 0 8px;
  font-weight: 600;
  letter-spacing: 0.04em;
}
.zcaf__wifi-head span {
  width: 17px;
  height: 17px;
}
.zcaf__wifi dl {
  margin: 0;
  display: grid;
  gap: 3px;
}
.zcaf__wifi dl > div {
  display: flex;
  gap: 8px;
}
.zcaf__wifi dt {
  flex: 0 0 auto;
  opacity: 0.62;
}
.zcaf__wifi dd {
  margin: 0;
  font-weight: 600;
  word-break: break-word;
}

.zcaf__social p {
  margin: 0 0 8px;
  font-size: 0.78rem;
  opacity: 0.66;
}
.zcaf__social ul {
  display: flex;
  gap: 8px;
  margin: 0;
  padding: 0;
  list-style: none;
}
.zcaf__social a {
  display: grid;
  place-items: center;
  width: 34px;
  height: 34px;
  padding: 8px;
  border-radius: 50%;
  background: rgba(255, 255, 255, 0.09);
  color: inherit;
}
.zcaf__social a:hover {
  background: var(--zcaf-gold);
  color: #2b1d15;
}

/* ------------------------------------------------------------------- topbar */

.zcaf__topbar {
  position: sticky;
  top: 0;
  z-index: 25;
  background: color-mix(in srgb, var(--zcaf-paper) 88%, transparent);
  -webkit-backdrop-filter: blur(10px);
  backdrop-filter: blur(10px);
  border-bottom: 1px solid var(--zcaf-line);
}
.zcaf__topbar-inner {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 16px;
  flex-wrap: wrap;
  min-height: 72px;
  width: 100%;
  max-width: var(--zcaf-max);
  margin: 0 auto;
  padding: 10px clamp(16px, 2.4vw, 32px);
}
.zcaf__topbar-actions {
  display: flex;
  align-items: center;
  gap: 10px;
}

.zcaf__place {
  display: flex;
  align-items: center;
  gap: 9px;
  margin: 0;
  min-width: 0;
  font-size: 0.92rem;
  font-weight: 500;
}
/* The pin is sized by CLASS, not by position: inside the branch form it is
   preceded by hidden inputs, and a `:first-child` rule silently stops matching
   there — which leaves an SVG that is `width: 100%` of an unsized box, i.e. the
   whole topbar. */
.zcaf__place-ico {
  flex: 0 0 auto;
  display: block;
  width: 19px;
  height: 19px;
  color: var(--zcaf-accent);
}
.zcaf__place--pick summary {
  display: flex;
  align-items: center;
  gap: 9px;
  cursor: pointer;
  list-style: none;
}

/* The branch picker: a real <select>, dressed as the chip it replaces. It keeps
   the browser's own dropdown — a native one opens where a thumb expects it, reads
   its options to a screen reader, and needs no script of this theme's. */
.zcaf__branch {
  gap: 8px;
}
/* Nothing to choose between — no branches entered, or the query has not answered
   yet. A dropdown holding one entry is a label pretending to be a control, so the
   picker appears only once a shop has arrived in it. */
.zcaf__branch:not(:has(option[data-zc-query-row])) {
  display: none;
}
.zcaf__branch select {
  max-width: min(46vw, 320px);
  padding: 6px 8px;
  border: 1px solid transparent;
  border-radius: 999px;
  background: transparent;
  color: inherit;
  font: inherit;
  font-size: 0.92rem;
  font-weight: 500;
  cursor: pointer;
  text-overflow: ellipsis;
}
.zcaf__branch select:hover {
  border-color: var(--zcaf-line);
  background: var(--zcaf-surface-warm);
}
.zcaf__branch select:focus-visible {
  outline: 2px solid var(--zcaf-accent);
  outline-offset: 2px;
}
/* The picker is live and the request is in flight: say so, without moving it. */
.zcaf__branch[aria-busy="true"] select {
  opacity: 0.6;
}

.zcaf__phone {
  display: inline-flex;
  align-items: center;
  gap: 7px;
  font-weight: 600;
  font-size: 0.9rem;
  text-decoration: none;
}

/* A disclosure that opens a small panel: the language list, the branches, search. */
.zcaf__pop {
  position: relative;
}
.zcaf__pop > summary {
  list-style: none;
  cursor: pointer;
}
.zcaf__pop > summary::-webkit-details-marker {
  display: none;
}
.zcaf__pop > summary i {
  display: block;
  width: 15px;
  height: 15px;
  opacity: 0.6;
}
.zcaf__pop[open] > summary i {
  transform: rotate(180deg);
}
.zcaf__pop ul,
.zcaf__pop form {
  position: absolute;
  right: 0;
  top: calc(100% + 8px);
  min-width: 190px;
  margin: 0;
  padding: 6px;
  list-style: none;
  background: var(--zcaf-surface);
  color: var(--zcaf-ink);
  border: 1px solid var(--zcaf-line);
  border-radius: var(--zcaf-radius-sm);
  box-shadow: var(--zcaf-shadow);
  z-index: 40;
}
.zcaf__pop li {
  padding: 7px 10px;
  border-radius: 7px;
  font-size: 0.9rem;
}
.zcaf__pop-head {
  font-size: 0.74rem;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  color: var(--zcaf-ink-faint);
}
.zcaf__pop a {
  display: block;
  text-decoration: none;
}
.zcaf__pop li:has(a):hover,
.zcaf__pop a[aria-current="page"] {
  background: var(--zcaf-surface-warm);
}

.zcaf__lang > summary {
  display: flex;
  align-items: center;
  gap: 5px;
  padding: 7px 11px;
  border: 1px solid var(--zcaf-line);
  border-radius: 999px;
  font-size: 0.82rem;
  font-weight: 600;
}
.zcaf__lang ul {
  min-width: 160px;
}

.zcaf__toggle {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  padding: 7px 11px;
  border: 1px solid var(--zcaf-line);
  border-radius: 999px;
  background: transparent;
  color: inherit;
  font: inherit;
  font-size: 0.82rem;
  cursor: pointer;
}

.zcaf__search > summary {
  display: grid;
  place-items: center;
  width: 42px;
  height: 42px;
  border: 1px solid var(--zcaf-line);
  border-radius: 50%;
  background: var(--zcaf-surface);
}
.zcaf__search > summary i {
  width: 19px;
  height: 19px;
  opacity: 1;
}
.zcaf__search[open] > summary i {
  transform: none;
}
.zcaf__search form {
  display: flex;
  gap: 6px;
  min-width: 280px;
  padding: 8px;
}
.zcaf__search input {
  flex: 1 1 auto;
  min-width: 0;
  padding: 9px 14px;
  border: 1px solid var(--zcaf-line);
  border-radius: 999px;
  background: var(--zcaf-paper);
  color: inherit;
  font: inherit;
  font-size: 0.9rem;
}
.zcaf__search button {
  display: grid;
  place-items: center;
  width: 38px;
  height: 38px;
  padding: 10px;
  border: 0;
  border-radius: 50%;
  background: var(--zcaf-accent);
  color: #fff;
  cursor: pointer;
}

.zcaf__cart {
  display: inline-flex;
  align-items: center;
  gap: 9px;
  padding: 11px 18px;
  border: 0;
  border-radius: 999px;
  background: var(--zcaf-accent);
  color: #fff;
  font: inherit;
  font-size: 0.9rem;
  font-weight: 600;
  text-decoration: none;
  cursor: pointer;
}
.zcaf__cart > span:first-child {
  width: 18px;
  height: 18px;
}
.zcaf__cart-count {
  display: grid;
  place-items: center;
  min-width: 22px;
  height: 22px;
  padding: 0 6px;
  border-radius: 999px;
  background: rgba(255, 255, 255, 0.22);
  font-size: 0.78rem;
}
/* An empty basket writes `hidden` here, and `display: grid` above would happily
   ignore it and leave a blank pill on the button. */
.zcaf__cart-count[hidden] {
  display: none;
}

/* ------------------------------------------------------- basket drawer
 *
 * Shut is the default, and it is a CSS default rather than a `hidden` attribute:
 * the runtime opens the drawer by adding `data-zc-open`, and a page with no
 * JavaScript therefore never opens it at all — the basket button stays the link
 * to the pre-order form it has always been.
 *
 * `visibility: hidden` and not `display: none`, because the panel has to slide,
 * and because visibility is what takes the buttons inside out of the tab order
 * while it is shut. Both are inherited back by the panel when it opens.
 */

.zcaf__drawer {
  position: fixed;
  inset: 0;
  /* Above the sticky top bar and the rail; it is a modal, and half a modal with
     the header still poking through is worse than no modal. */
  z-index: 70;
  display: flex;
  justify-content: flex-end;
  visibility: hidden;
}
.zcaf__drawer[data-zc-open] {
  visibility: visible;
}

.zcaf__drawer-scrim {
  position: absolute;
  inset: 0;
  border: 0;
  padding: 0;
  background: rgba(28, 17, 10, 0.5);
  -webkit-backdrop-filter: blur(2px);
  backdrop-filter: blur(2px);
  opacity: 0;
  cursor: pointer;
  transition: opacity 0.24s ease;
}
.zcaf__drawer[data-zc-open] .zcaf__drawer-scrim {
  opacity: 1;
}

.zcaf__drawer-panel {
  position: relative;
  display: flex;
  flex-direction: column;
  width: min(400px, 100vw);
  max-height: 100%;
  padding: 22px;
  gap: 16px;
  background: var(--zcaf-surface);
  color: var(--zcaf-ink);
  border-left: 1px solid var(--zcaf-line);
  box-shadow: var(--zcaf-shadow);
  transform: translateX(100%);
  transition: transform 0.26s ease;
}
.zcaf__drawer[data-zc-open] .zcaf__drawer-panel {
  transform: none;
}

.zcaf__drawer-head {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 12px;
}
.zcaf__drawer-head h2 {
  margin: 0;
  flex: 1 1 auto;
  font-size: 1.1rem;
}

/* ---- the two steps: the basket, and the boxes that turn it into an order ----

   The drawer carries `data-zc-step` from the runtime's pick script; everything
   below is which of the two halves that attribute is showing. Both are rendered
   on the server — nothing is built in the browser — so the step is a swap, not a
   load, and going back to the basket is instant and keeps what was typed. */
.zcaf__drawer-page {
  flex: 1 1 auto;
  /* Without this a flex child refuses to shrink below its content and the list
     stops scrolling — it pushes the footer off the bottom of the panel instead. */
  min-height: 0;
  display: flex;
  flex-direction: column;
  gap: 16px;
}
.zcaf__drawer-page--details {
  display: none;
  overflow-y: auto;
}
.zcaf__drawer[data-zc-step="details"] .zcaf__drawer-page--basket {
  display: none;
}
.zcaf__drawer[data-zc-step="details"] .zcaf__drawer-page--details {
  display: flex;
}

.zcaf__drawer-back {
  display: none;
  place-items: center;
  width: 34px;
  height: 34px;
  border: 1px solid var(--zcaf-line);
  border-radius: 50%;
  background: var(--zcaf-surface-warm);
  color: inherit;
  font-size: 1.3rem;
  line-height: 1;
  cursor: pointer;
}
.zcaf__drawer[data-zc-step="details"] .zcaf__drawer-back {
  display: grid;
}

.zcaf__drawer-title--details {
  display: none;
}
.zcaf__drawer[data-zc-step="details"] .zcaf__drawer-title--basket {
  display: none;
}
.zcaf__drawer[data-zc-step="details"] .zcaf__drawer-title--details {
  display: inline;
}

/* The form on the second step is the RUNTIME's, drawn with inline styles so it is
   usable on a theme that styles nothing. Inline styles outrank a stylesheet, so
   dressing it in this theme's colours is the one place `!important` is the honest
   tool rather than a shortcut — the alternative is a white form with a navy button
   sitting inside a coffee-brown drawer, in dark mode especially. */
.zcaf__drawer .zcms-form {
  max-width: none !important;
  gap: 12px !important;
}
.zcaf__drawer .zcms-form__title {
  /* The same serif the headings use — the drawer's own <h2> is in it. */
  font-family: ui-serif, Georgia, "Times New Roman", serif;
  font-size: 1rem !important;
}
.zcaf__drawer .zcms-form input,
.zcaf__drawer .zcms-form textarea,
.zcaf__drawer .zcms-form select {
  border-color: var(--zcaf-line) !important;
  border-radius: var(--zcaf-radius-sm) !important;
  background: var(--zcaf-surface-warm) !important;
  color: var(--zcaf-ink) !important;
}
.zcaf__drawer .zcms-form__basket,
.zcaf__drawer .zcms-form__group {
  border-color: var(--zcaf-line) !important;
  border-radius: var(--zcaf-radius-sm) !important;
  background: var(--zcaf-surface-warm) !important;
}
.zcaf__drawer .zcms-form__submit {
  justify-self: stretch !important;
  padding: 13px 18px !important;
  border-radius: 999px !important;
  background: var(--zcaf-accent) !important;
  color: #fff !important;
}
.zcaf__drawer .zcms-form__add {
  border-color: var(--zcaf-line) !important;
  color: var(--zcaf-ink-soft) !important;
}
.zcaf__drawer-x {
  display: grid;
  place-items: center;
  width: 34px;
  height: 34px;
  border: 1px solid var(--zcaf-line);
  border-radius: 50%;
  background: var(--zcaf-surface-warm);
  color: inherit;
  font-size: 1.2rem;
  line-height: 1;
  cursor: pointer;
}

.zcaf__drawer-empty {
  margin: 0;
  padding: 18px;
  border: 1px dashed var(--zcaf-line);
  border-radius: var(--zcaf-radius-sm);
  background: var(--zcaf-surface-warm);
  color: var(--zcaf-ink-faint);
  font-size: 0.88rem;
}

/* The list holds one line per drink the form takes and hides all but the chosen
   ones, so most of the time most of it is not there. */
.zcaf__drawer-list {
  flex: 1 1 auto;
  overflow-y: auto;
  display: grid;
  align-content: start;
  gap: 8px;
  margin: 0;
  padding: 0;
  list-style: none;
}
/* `display: flex` below would otherwise beat the `hidden` attribute the runtime
   uses to say "not in the basket". */
.zcaf__drawer-line[hidden] {
  display: none;
}

.zcaf__drawer-line {
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 10px 12px;
  border: 1px solid var(--zcaf-line);
  border-radius: var(--zcaf-radius-sm);
  background: var(--zcaf-surface-warm);
}
.zcaf__drawer-name {
  flex: 1 1 auto;
  min-width: 0;
  font-size: 0.92rem;
  font-weight: 600;
}

.zcaf__drawer-step {
  display: inline-flex;
  align-items: center;
  gap: 2px;
  padding: 2px;
  border: 1px solid var(--zcaf-line);
  border-radius: 999px;
  background: var(--zcaf-surface);
}
.zcaf__drawer-step button {
  display: grid;
  place-items: center;
  width: 26px;
  height: 26px;
  border: 0;
  border-radius: 50%;
  background: transparent;
  color: inherit;
  font: inherit;
  font-size: 1rem;
  line-height: 1;
  cursor: pointer;
}
.zcaf__drawer-step button:hover {
  background: color-mix(in srgb, var(--zcaf-accent) 14%, transparent);
}
.zcaf__drawer-step b {
  min-width: 20px;
  text-align: center;
  font-size: 0.9rem;
  font-variant-numeric: tabular-nums;
}

.zcaf__drawer-drop {
  display: grid;
  place-items: center;
  width: 26px;
  height: 26px;
  border: 0;
  border-radius: 50%;
  background: transparent;
  color: var(--zcaf-ink-faint);
  font-size: 1.05rem;
  line-height: 1;
  cursor: pointer;
}
.zcaf__drawer-drop:hover {
  background: color-mix(in srgb, var(--zcaf-accent) 14%, transparent);
  color: var(--zcaf-ink);
}

.zcaf__drawer-foot {
  display: grid;
  gap: 10px;
  padding-top: 14px;
  border-top: 1px solid var(--zcaf-line);
}
.zcaf__drawer-foot[hidden] {
  display: none;
}
.zcaf__drawer-total {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  margin: 0;
  color: var(--zcaf-ink-soft);
  font-size: 0.9rem;
}
.zcaf__drawer-total b {
  color: var(--zcaf-ink);
  font-variant-numeric: tabular-nums;
}
.zcaf__drawer-go {
  display: block;
  padding: 13px 18px;
  border-radius: 999px;
  background: var(--zcaf-accent);
  color: #fff;
  font-size: 0.95rem;
  font-weight: 600;
  text-align: center;
  text-decoration: none;
}
.zcaf__drawer-note {
  margin: 0;
  color: var(--zcaf-ink-faint);
  font-size: 0.78rem;
  text-align: center;
}

@media (max-width: 480px) {
  .zcaf__drawer-panel {
    width: 100vw;
    border-left: 0;
  }
}

/* ------------------------------------------------------------------- banner */

.zcaf__home {
  display: grid;
  gap: clamp(30px, 4vw, 52px);
  padding-top: clamp(20px, 2.4vw, 30px);
  padding-bottom: clamp(40px, 5vw, 72px);
}

.zcaf__banner {
  position: relative;
  display: flex;
  align-items: center;
  min-height: clamp(320px, 32vw, 420px);
  padding: clamp(28px, 4vw, 56px);
  border-radius: var(--zcaf-radius-lg);
  overflow: hidden;
  color: #fff;
  background:
    linear-gradient(120deg, #3d2618 10%, #7a4325 60%, #a4693c 100%);
  box-shadow: var(--zcaf-shadow);
}
/*
 * The scrim is not decoration. White type over somebody else's photograph is a
 * contrast bug waiting for the first owner who uploads a bright one, so the copy
 * side of the banner is always darkened regardless of what the picture is.
 */
.zcaf__banner--photo {
  background-image:
    linear-gradient(100deg, rgba(24, 13, 7, 0.88) 0%, rgba(24, 13, 7, 0.55) 44%, rgba(24, 13, 7, 0.12) 100%),
    var(--zcaf-banner);
  background-size: cover, cover;
  background-position: center, center;
}
.zcaf__banner-copy {
  position: relative;
  max-width: 34rem;
}
.zcaf__banner-kicker {
  margin: 0 0 4px;
  font-size: clamp(0.95rem, 0.85rem + 0.4vw, 1.2rem);
  font-weight: 500;
  letter-spacing: 0.02em;
  opacity: 0.92;
}
.zcaf__banner h1 {
  margin: 0 0 14px;
  font-family: ui-sans-serif, system-ui, sans-serif;
  font-weight: 800;
  letter-spacing: 0.01em;
  text-transform: uppercase;
}
.zcaf__banner-lead {
  max-width: 30rem;
  font-size: 1.02rem;
  opacity: 0.9;
}
.zcaf__banner-actions {
  display: flex;
  flex-wrap: wrap;
  gap: 12px;
  margin: 22px 0 18px;
}
.zcaf__banner-badge {
  display: inline-flex;
  align-items: center;
  gap: 9px;
  margin: 0;
  font-size: 0.88rem;
  opacity: 0.86;
}
.zcaf__status-dot {
  width: 9px;
  height: 9px;
  border-radius: 50%;
  background: #4fc47f;
  box-shadow: 0 0 0 4px rgba(79, 196, 127, 0.22);
}

/* -------------------------------------------------------------------- perks */

.zcaf__perks {
  display: grid;
  grid-template-columns: repeat(4, minmax(0, 1fr));
  gap: 8px;
  padding: 22px clamp(14px, 2vw, 26px);
  border: 1px solid var(--zcaf-line);
  border-radius: var(--zcaf-radius);
  background: var(--zcaf-surface);
  box-shadow: var(--zcaf-shadow-card);
}
.zcaf__perks article {
  display: flex;
  align-items: flex-start;
  gap: 13px;
  padding: 0 14px;
}
.zcaf__perks article + article {
  border-left: 1px solid var(--zcaf-line);
}
.zcaf__perk-ico {
  flex: 0 0 auto;
  display: grid;
  place-items: center;
  width: 40px;
  height: 40px;
  padding: 9px;
  border-radius: 50%;
  background: color-mix(in srgb, var(--zcaf-accent) 12%, transparent);
  color: var(--zcaf-accent);
}
.zcaf__perks strong {
  display: block;
  font-size: 0.94rem;
  margin-bottom: 2px;
}
.zcaf__perks span:not(.zcaf__perk-ico) {
  display: block;
  font-size: 0.84rem;
  line-height: 1.45;
  color: var(--zcaf-ink-soft);
}

/* ----------------------------------------------------------- section header */

.zcaf__head {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: 20px;
  flex-wrap: wrap;
  margin-bottom: 20px;
}
/* Never shrunk to a clipped "X…": when the pair no longer fits, the link wraps. */
.zcaf__head > .zcaf__text-link {
  flex: 0 0 auto;
}
.zcaf__head h2 {
  margin: 0;
  min-width: 0;
  font-family: ui-sans-serif, system-ui, sans-serif;
  font-size: clamp(1.05rem, 0.95rem + 0.4vw, 1.3rem);
  font-weight: 800;
  letter-spacing: 0.1em;
  text-transform: uppercase;
}

/* ------------------------------------------------------------------- promos */

.zcaf__promo-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
  gap: 18px;
}
.zcaf__promo {
  position: relative;
  display: flex;
  align-items: flex-end;
  min-height: 185px;
  padding: 22px;
  border-radius: var(--zcaf-radius);
  overflow: hidden;
  text-decoration: none;
  color: inherit;
}
.zcaf__promo img {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
}
.zcaf__promo-copy {
  position: relative;
  display: grid;
  justify-items: start;
  gap: 8px;
}
.zcaf__promo h3 {
  margin: 0;
  font-size: clamp(1.15rem, 1rem + 0.7vw, 1.6rem);
  line-height: 1.15;
}
.zcaf__promo p {
  margin: 0;
  font-size: 0.9rem;
  opacity: 0.88;
}
.zcaf__promo small {
  font-size: 0.76rem;
  opacity: 0.7;
}
.zcaf__promo--feature {
  align-items: flex-start;
  background: linear-gradient(150deg, #46291a, #2c180e);
  color: #f5e9dd;
}
.zcaf__promo--photo {
  align-items: flex-end;
  color: #fff;
}
.zcaf__promo--photo::after {
  content: "";
  position: absolute;
  inset: 0;
  background: linear-gradient(180deg, rgba(20, 11, 6, 0.05) 30%, rgba(20, 11, 6, 0.82) 100%);
}
.zcaf__promo--quiet {
  align-items: flex-start;
  background: var(--zcaf-surface-warm);
  border: 1px solid var(--zcaf-line);
}
a.zcaf__promo:hover {
  filter: brightness(1.04);
}

/* --------------------------------------------------------------- live menu */

.zcaf__block {
  margin: 0;
}
.zcaf__block + .zcaf__block {
  margin-top: 34px;
}
.zcaf__block-lead {
  color: var(--zcaf-ink-soft);
  max-width: 62ch;
}

.zcaf__filter {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 14px;
  flex-wrap: wrap;
  margin-bottom: 20px;
}
.zcaf__filter--hidden {
  display: none;
}
.zcaf__filter-side {
  display: flex;
  align-items: center;
  gap: 10px;
  flex-wrap: wrap;
}
.zcaf__field {
  display: grid;
  gap: 6px;
  font-size: 0.85rem;
  color: var(--zcaf-ink-soft);
}
.zcaf__field input,
.zcaf__field select {
  min-width: 180px;
  padding: 10px 16px;
  border: 1px solid var(--zcaf-line);
  border-radius: 999px;
  background: var(--zcaf-surface);
  color: var(--zcaf-ink);
  font: inherit;
  font-size: 0.9rem;
}
.zcaf__field--select select {
  min-width: 150px;
  cursor: pointer;
}

/*
 * The category tabs. A radio group, not a select: the design shows every choice at
 * once, and that IS what a radio group is. The input is taken out of the flow
 * rather than `display: none`, so it keeps its place in the tab order and the
 * label around it stays clickable.
 */
.zcaf__tabs {
  display: flex;
  flex-wrap: wrap;
  gap: 6px;
  margin: 0;
  padding: 0;
  border: 0;
}
.zcaf__tab {
  position: relative;
}
.zcaf__tab input {
  position: absolute;
  opacity: 0;
  width: 100%;
  height: 100%;
  margin: 0;
  cursor: pointer;
}
.zcaf__tab span {
  display: block;
  padding: 9px 18px;
  border-radius: 999px;
  font-size: 0.88rem;
  font-weight: 500;
  color: var(--zcaf-ink-soft);
  white-space: nowrap;
}
.zcaf__tab:hover span {
  background: var(--zcaf-surface-warm);
}
.zcaf__tab input:checked + span {
  background: var(--zcaf-accent);
  color: #fff;
  font-weight: 600;
}
.zcaf__tab input:focus-visible + span {
  outline: 2px solid var(--zcaf-accent);
  outline-offset: 2px;
}

.zcaf__menu-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(215px, 1fr));
  gap: 18px;
}
.zcaf__menu-card {
  display: flex;
  flex-direction: column;
  border: 1px solid var(--zcaf-line);
  border-radius: var(--zcaf-radius);
  background: var(--zcaf-surface);
  overflow: hidden;
  box-shadow: var(--zcaf-shadow-card);
}
.zcaf__menu-art {
  position: relative;
  aspect-ratio: 4 / 3;
  /* The fallback for an item with no photograph: warm paper, not a grey void. */
  background:
    radial-gradient(
      120% 90% at 30% 20%,
      color-mix(in srgb, var(--zcaf-gold) 35%, transparent),
      transparent 70%
    ),
    var(--zcaf-surface-warm);
}
.zcaf__menu-art img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
}
.zcaf__menu-badge {
  position: absolute;
  top: 10px;
  left: 10px;
  margin: 0;
  padding: 5px 11px;
  border-radius: 999px;
  background: var(--zcaf-accent);
  color: #fff;
  font-size: 0.74rem;
  font-weight: 700;
}
/* No badge on this row means the plugin sent nothing, so there is nothing to draw. */
.zcaf__menu-badge:empty {
  display: none;
}
.zcaf__menu-body {
  display: flex;
  flex-direction: column;
  gap: 4px;
  padding: 14px 16px 16px;
  flex: 1 1 auto;
}
.zcaf__menu-cat {
  margin: 0;
  font-size: 0.7rem;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  color: var(--zcaf-ink-faint);
}
.zcaf__menu-cat:empty {
  display: none;
}
.zcaf__menu-card h3 {
  margin: 0;
  font-family: ui-sans-serif, system-ui, sans-serif;
  font-size: 0.98rem;
  font-weight: 600;
}
.zcaf__menu-desc {
  margin: 0;
  color: var(--zcaf-ink-soft);
  font-size: 0.85rem;
  flex: 1 1 auto;
}
.zcaf__menu-desc:empty {
  display: none;
}
/*
 * Price on the left, Add on the right — until the button has more to say.
 *
 * The button carries four labels, not one: “Add”, “Added ✓”, “Basket full”,
 * “Not orderable online”. Written in a language where those are three or four
 * times the width of “Add” — Japanese, and English is not far behind — the pill
 * grew past the card, and the card clips (its photograph needs `overflow:
 * hidden`), so the message telling a customer why nothing happened was itself
 * cut in half. The row therefore wraps: a long label drops to its own line and
 * gets the card's full width instead of running off the edge.
 */
.zcaf__menu-foot {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: space-between;
  gap: 8px 10px;
  margin-top: 10px;
}
.zcaf__menu-price {
  margin: 0;
  font-size: 1.02rem;
  font-weight: 700;
  color: var(--zcaf-accent);
}
.zcaf__add {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 5px;
  padding: 7px 14px;
  border: 1px solid var(--zcaf-line);
  border-radius: 999px;
  font-size: 0.82rem;
  font-weight: 600;
  text-align: center;
  text-decoration: none;
  color: var(--zcaf-ink-soft);
  max-width: 100%;
}
/*
 * “+ Add” is short in every language: it never breaks after the plus, and being
 * unbreakable is also what keeps it on the price's line — the row wraps only if
 * the whole label genuinely does not fit.
 */
.zcaf__add-idle {
  white-space: nowrap;
}
/*
 * A state label DOES wrap, so on its own it would shrink to a column of single
 * characters beside the price rather than moving down. The floor makes the row
 * wrap first, and only while a state is showing, so the resting layout — price
 * left, “+ Add” right — is exactly what it was.
 */
.zcaf__add[data-zc-picked] {
  min-width: min(100%, 8.5em);
}
.zcaf__add:hover {
  border-color: var(--zcaf-accent);
  background: var(--zcaf-accent);
  color: #fff;
}

/*
  What the button says after it was pressed.

  The runtime's basket enhancer marks the control it acted on — `data-zc-picked`
  is "added", or "full" when the pre-order form has no line left — and clears the
  mark a moment later. All three labels are in the markup and CSS chooses between
  them, because the row is a <template> the runtime clones: there is no theme
  JavaScript to swap a word, and none is needed.
*/
.zcaf__add-done,
.zcaf__add-full,
.zcaf__add-missing {
  display: none;
  font-weight: 600;
}
.zcaf__add[data-zc-picked] .zcaf__add-idle {
  display: none;
}
.zcaf__add[data-zc-picked="added"] .zcaf__add-done {
  display: inline;
}
.zcaf__add[data-zc-picked="full"] .zcaf__add-full {
  display: inline;
}
.zcaf__add[data-zc-picked="missing"] .zcaf__add-missing {
  display: inline;
}
.zcaf__add[data-zc-picked="added"] {
  border-color: var(--zcaf-accent);
  background: var(--zcaf-accent);
  color: #fff;
}
.zcaf__add[data-zc-picked="full"],
.zcaf__add[data-zc-picked="missing"] {
  border-color: currentcolor;
  opacity: 0.7;
}

/* ------------------------------------------------------------------ loyalty */

.zcaf__loyalty {
  display: grid;
  grid-template-columns: minmax(0, 0.78fr) minmax(0, 2.2fr);
  gap: clamp(20px, 3vw, 40px);
  align-items: center;
  padding: clamp(22px, 3vw, 34px);
  border: 1px solid var(--zcaf-line);
  border-radius: var(--zcaf-radius);
  background: var(--zcaf-surface-warm);
}
.zcaf__loyalty-copy h2 {
  margin: 0 0 8px;
  font-family: ui-sans-serif, system-ui, sans-serif;
  font-size: clamp(1.02rem, 0.94rem + 0.35vw, 1.22rem);
  font-weight: 800;
  letter-spacing: 0.09em;
  text-transform: uppercase;
}
.zcaf__loyalty-copy p {
  font-size: 0.9rem;
  color: var(--zcaf-ink-soft);
  max-width: 40ch;
}
.zcaf__loyalty-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(170px, 1fr));
  gap: 16px 14px;
  margin: 0;
}
.zcaf__loyalty-grid > div {
  display: grid;
  grid-template-columns: 38px minmax(0, 1fr);
  grid-template-rows: auto auto;
  column-gap: 11px;
  align-content: center;
  align-items: start;
}
.zcaf__loyalty-ico {
  grid-row: span 2;
  align-self: center;
  display: grid;
  place-items: center;
  width: 38px;
  height: 38px;
  padding: 8px;
  border-radius: 50%;
  background: color-mix(in srgb, var(--zcaf-accent) 13%, transparent);
  color: var(--zcaf-accent);
}
.zcaf__loyalty-grid dt {
  font-weight: 700;
  font-size: 0.92rem;
  line-height: 1.3;
}
.zcaf__loyalty-grid dd {
  margin: 0;
  font-size: 0.82rem;
  line-height: 1.35;
  color: var(--zcaf-ink-soft);
}

/* ------------------------------------------------------- payment and orders */

.zcaf__pay-list,
.zcaf__order-list {
  display: grid;
  gap: 16px;
}
.zcaf__pay-card,
.zcaf__order-card {
  padding: 22px;
  border: 1px solid var(--zcaf-line);
  border-radius: var(--zcaf-radius);
  background: var(--zcaf-surface);
}
.zcaf__pay-lines,
.zcaf__order-lines,
.zcaf__hours-lines,
.zcaf__order-contact {
  display: grid;
  gap: 8px;
  margin: 0 0 16px;
}
.zcaf__pay-lines > div,
.zcaf__order-lines > div,
.zcaf__hours-lines > div,
.zcaf__order-contact > div {
  display: flex;
  justify-content: space-between;
  gap: 18px;
  padding-bottom: 8px;
  border-bottom: 1px dashed var(--zcaf-line);
}
.zcaf__pay-lines dt,
.zcaf__order-lines dt,
.zcaf__hours-lines dt,
.zcaf__order-contact dt {
  color: var(--zcaf-ink-faint);
  font-size: 0.88rem;
}
.zcaf__pay-lines dd,
.zcaf__order-lines dd,
.zcaf__hours-lines dd,
.zcaf__order-contact dd {
  margin: 0;
  font-weight: 600;
  text-align: right;
}

.zcaf__order-card header {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: 14px;
  margin-bottom: 8px;
}
.zcaf__order-card header h3 {
  margin: 0;
  font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
  font-size: 1.05rem;
  letter-spacing: 0.04em;
}
.zcaf__order-card header p {
  margin: 0;
  font-size: 0.85rem;
  color: var(--zcaf-ink-faint);
}
.zcaf__order-items {
  color: var(--zcaf-ink-soft);
}

.zcaf__hours {
  padding: 24px;
  border: 1px solid var(--zcaf-line);
  border-radius: var(--zcaf-radius);
  background: var(--zcaf-surface-warm);
}
.zcaf__hours h2 {
  font-size: 1.25rem;
}

.zcaf__notice {
  display: flex;
  gap: 16px;
  padding: 20px 22px;
  border-radius: var(--zcaf-radius);
  background: var(--zcaf-surface-warm);
  border-left: 4px solid var(--zcaf-accent);
  margin: 0 0 26px;
}
.zcaf__notice--important {
  border-left-color: #c0392b;
  background: color-mix(in srgb, #c0392b 8%, var(--zcaf-surface));
}
.zcaf__notice > span {
  font-size: 1.2rem;
  line-height: 1.3;
}
.zcaf__notice h3 {
  margin: 0 0 4px;
}
.zcaf__notice p {
  margin: 0;
  color: var(--zcaf-ink-soft);
}

/* -------------------------------------------------------------------- story */

.zcaf__story {
  display: grid;
  grid-template-columns: minmax(0, 0.85fr) minmax(0, 1.15fr);
  gap: clamp(24px, 4vw, 52px);
  align-items: center;
  padding: clamp(24px, 3.4vw, 42px);
  border-radius: var(--zcaf-radius-lg);
  background: var(--zcaf-surface-warm);
  border: 1px solid var(--zcaf-line);
}
.zcaf__story-art {
  position: relative;
  min-height: 260px;
  border-radius: var(--zcaf-radius);
  background: linear-gradient(
    150deg,
    color-mix(in srgb, var(--zcaf-accent) 85%, #000),
    color-mix(in srgb, var(--zcaf-accent) 45%, #d9b48a)
  );
  overflow: hidden;
  display: grid;
  place-items: center;
  color: #fff;
}
.zcaf__story-bean {
  width: 88px;
  height: 88px;
  opacity: 0.9;
}
.zcaf__story-art i,
.zcaf__story-art b {
  position: absolute;
  border-radius: 50%;
  border: 1px solid rgba(255, 255, 255, 0.28);
}
.zcaf__story-art i {
  width: 220px;
  height: 220px;
  top: -60px;
  right: -50px;
}
.zcaf__story-art b {
  width: 150px;
  height: 150px;
  bottom: -40px;
  left: -30px;
}
.zcaf__story-art small {
  position: absolute;
  bottom: 18px;
  left: 22px;
  font-family: ui-serif, Georgia, serif;
  font-size: 1.02rem;
  opacity: 0.9;
}
.zcaf__story-copy ul {
  margin: 16px 0 0;
  padding: 0;
  list-style: none;
  display: grid;
  gap: 10px;
}
.zcaf__story-copy li {
  padding-left: 26px;
  position: relative;
  color: var(--zcaf-ink-soft);
}
.zcaf__story-copy li::before {
  content: "";
  position: absolute;
  left: 0;
  top: 0.55em;
  width: 10px;
  height: 10px;
  border-radius: 50% 50% 45% 45%;
  background: var(--zcaf-accent);
  transform: rotate(-18deg);
}

/* ------------------------------------------------------------------ journal */

.zcaf__journal-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(268px, 1fr));
  gap: 20px;
}
.zcaf__journal-card {
  display: flex;
  flex-direction: column;
  border: 1px solid var(--zcaf-line);
  border-radius: var(--zcaf-radius);
  overflow: hidden;
  background: var(--zcaf-surface);
}
.zcaf__journal-card > div:last-child {
  padding: 18px;
}
.zcaf__journal-art {
  display: grid;
  place-items: center;
  height: 128px;
  font-size: 2rem;
  color: #fff;
}
.zcaf__journal-art--1 {
  background: linear-gradient(140deg, #6f3d22, #a9673c);
}
.zcaf__journal-art--2 {
  background: linear-gradient(140deg, #3f5340, #7d8f63);
}
.zcaf__journal-art--3 {
  background: linear-gradient(140deg, #8a4b2a, #c98f5f);
}
.zcaf__journal-date {
  margin: 0 0 6px;
  font-size: 0.8rem;
  color: var(--zcaf-ink-faint);
}
.zcaf__journal-card h3 {
  margin: 0 0 8px;
}
.zcaf__journal-card h3 a {
  text-decoration: none;
}
.zcaf__journal-card p {
  color: var(--zcaf-ink-soft);
  font-size: 0.92rem;
}
.zcaf__journal-link {
  font-weight: 600;
  font-size: 0.9rem;
  color: var(--zcaf-accent);
  text-decoration: none;
}

/* -------------------------------------------------------------------- order */

.zcaf__order {
  display: grid;
  grid-template-columns: minmax(0, 0.95fr) minmax(0, 1.05fr);
  gap: clamp(24px, 4vw, 48px);
  align-items: start;
  padding: clamp(24px, 3.4vw, 42px);
  border-radius: var(--zcaf-radius-lg);
  border: 1px solid var(--zcaf-line);
  background:
    radial-gradient(
      680px 300px at 8% 0%,
      color-mix(in srgb, var(--zcaf-accent) 12%, transparent),
      transparent 70%
    ),
    var(--zcaf-surface);
}
.zcaf__steps {
  margin: 18px 0;
  padding: 0;
  list-style: none;
  counter-reset: zcaf-step;
  display: grid;
  gap: 14px;
}
.zcaf__steps li {
  counter-increment: zcaf-step;
  display: grid;
  grid-template-columns: 30px minmax(0, 1fr);
  column-gap: 14px;
}
.zcaf__steps li::before {
  content: counter(zcaf-step);
  grid-row: span 2;
  display: grid;
  place-items: center;
  width: 30px;
  height: 30px;
  border-radius: 50%;
  background: var(--zcaf-accent);
  color: #fff;
  font-size: 0.85rem;
  font-weight: 700;
}
.zcaf__steps strong {
  align-self: center;
}
.zcaf__steps span {
  grid-column: 2;
  color: var(--zcaf-ink-soft);
  font-size: 0.92rem;
}
.zcaf__order-form {
  padding: 26px;
  border-radius: var(--zcaf-radius);
  background: var(--zcaf-surface);
  border: 1px solid var(--zcaf-line);
  box-shadow: var(--zcaf-shadow);
}

/*
 * The pre-order form itself is the runtime's `core/form` block, not this theme's
 * markup — so these rules reach into it by element rather than by class, and stay
 * inside `.zcaf__order-form` so they cannot leak onto anything else.
 */
.zcaf__order-form label {
  display: block;
  margin-bottom: 6px;
  font-size: 0.88rem;
  font-weight: 600;
}
.zcaf__order-form input,
.zcaf__order-form select,
.zcaf__order-form textarea {
  width: 100%;
  padding: 11px 14px;
  margin-bottom: 14px;
  border: 1px solid var(--zcaf-line);
  border-radius: var(--zcaf-radius-sm);
  background: var(--zcaf-paper);
  color: var(--zcaf-ink);
  font: inherit;
  font-size: 0.95rem;
}
.zcaf__order-form textarea {
  min-height: 110px;
  resize: vertical;
}
.zcaf__order-form button {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  padding: 13px 26px;
  border: 0;
  border-radius: 999px;
  background: var(--zcaf-accent);
  color: #fff;
  font: inherit;
  font-weight: 600;
  cursor: pointer;
}

/* -------------------------------------------------------------- page & post */

.zcaf__page {
  padding-top: clamp(24px, 3vw, 40px);
  padding-bottom: clamp(40px, 5vw, 72px);
}
.zcaf__page-head {
  margin-bottom: clamp(24px, 3vw, 40px);
  padding-bottom: 22px;
  border-bottom: 1px solid var(--zcaf-line);
}
.zcaf__page-head h1 {
  margin-bottom: 10px;
}
.zcaf__page-head > p:last-child,
.zcaf__post-lead {
  margin: 0;
  color: var(--zcaf-ink-soft);
  font-size: 1.03rem;
  max-width: 62ch;
}
.zcaf__post-meta {
  display: flex;
  gap: 16px;
  margin-top: 12px;
  font-size: 0.88rem;
  color: var(--zcaf-ink-faint);
}

/*
 * The rhythm between bands on an ordinary page.
 *
 * The front page lays its bands out on a grid and the grid's `gap` is what holds
 * them apart. An Offers page is the same bands — the promos, the points card, a
 * notice — stacked in the prose column instead, where there is no gap and each
 * band's own margin is zero: they came out welded into one long slab of cream
 * with the seams showing. So a band that lands in prose carries its own vertical
 * rhythm. Adjacent bands collapse to a single gap because this column is normal
 * flow, and the first and last are pinned to the page head and the page padding
 * rather than adding a second gap to either.
 */
.zcaf__prose > :is(
    .zcaf__block,
    .zcaf__block-cta,
    .zcaf__block-hero,
    .zcaf__perks,
    .zcaf__promos,
    .zcaf__loyalty,
    .zcaf__story,
    .zcaf__notice,
    .zcaf__section,
    .zcms-form
  ) {
  margin-block: clamp(30px, 3.6vw, 48px);
}
.zcaf__prose > :first-child {
  margin-top: 0;
}
.zcaf__prose > :last-child {
  margin-bottom: 0;
}

.zcaf__prose h2 {
  margin-top: 1.8em;
}
.zcaf__prose ul,
.zcaf__prose ol {
  padding-left: 1.3em;
  color: var(--zcaf-ink-soft);
}
.zcaf__prose blockquote {
  margin: 1.6em 0;
  padding: 4px 0 4px 20px;
  border-left: 3px solid var(--zcaf-accent);
  font-family: ui-serif, Georgia, serif;
  font-size: 1.1rem;
  color: var(--zcaf-ink-soft);
}

.zcaf__figure {
  margin: 1.8em 0;
}
.zcaf__figure img {
  width: 100%;
  height: auto;
  border-radius: var(--zcaf-radius);
}
.zcaf__figure figcaption {
  margin-top: 8px;
  font-size: 0.85rem;
  color: var(--zcaf-ink-faint);
}

.zcaf__block-hero {
  padding: 32px 0 8px;
}
.zcaf__block-cta {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 24px;
  flex-wrap: wrap;
  padding: 28px;
  margin: 30px 0;
  border-radius: var(--zcaf-radius);
  background: var(--zcaf-surface-warm);
  border: 1px solid var(--zcaf-line);
}
.zcaf__block-cta h2 {
  margin-bottom: 6px;
  font-size: 1.35rem;
}
.zcaf__block-cta p {
  margin: 0;
  color: var(--zcaf-ink-soft);
}

.zcaf__feature-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(230px, 1fr));
  gap: 18px;
}
.zcaf__feature-grid article {
  padding: 22px;
  border: 1px solid var(--zcaf-line);
  border-radius: var(--zcaf-radius);
  background: var(--zcaf-surface);
}
.zcaf__feature-grid span {
  font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
  font-size: 0.8rem;
  color: var(--zcaf-accent);
}
.zcaf__feature-grid h3 {
  margin: 8px 0 6px;
}
.zcaf__feature-grid p {
  margin: 0;
  color: var(--zcaf-ink-soft);
  font-size: 0.93rem;
}

.zcaf__content-list {
  display: grid;
  gap: 14px;
}
.zcaf__content-list article {
  padding-bottom: 14px;
  border-bottom: 1px solid var(--zcaf-line);
}
.zcaf__content-list h3 {
  margin: 0 0 4px;
}
.zcaf__content-list p {
  margin: 0;
  color: var(--zcaf-ink-soft);
}

.zcaf__pager {
  display: flex;
  gap: 8px;
  justify-content: center;
  margin-top: 34px;
}
.zcaf__pager a {
  display: grid;
  place-items: center;
  min-width: 40px;
  height: 40px;
  padding: 0 12px;
  border: 1px solid var(--zcaf-line);
  border-radius: 999px;
  text-decoration: none;
  font-size: 0.9rem;
}
.zcaf__pager a[aria-current="page"] {
  background: var(--zcaf-accent);
  border-color: var(--zcaf-accent);
  color: #fff;
}

/* ------------------------------------------------------------------- states */

.zcaf__state {
  padding: clamp(60px, 8vw, 120px) 0;
  text-align: center;
}
.zcaf__state .zcaf__measure {
  margin-inline: auto;
}
.zcaf__state-code {
  font-family: ui-serif, Georgia, serif;
  font-size: clamp(3rem, 8vw, 5rem);
  color: color-mix(in srgb, var(--zcaf-accent) 40%, transparent);
  margin: 0;
}

/* ------------------------------------------------------------------- footer */

.zcaf__footer {
  border-top: 1px solid var(--zcaf-line);
  background: var(--zcaf-surface-warm);
}
.zcaf__footer-inner {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 24px;
  flex-wrap: wrap;
  padding-top: 26px;
  padding-bottom: 26px;
}
.zcaf__footer-logo {
  height: 40px;
  width: auto;
}
.zcaf__footer-mid {
  flex: 1 1 320px;
  text-align: center;
}
.zcaf__footer-mid ul {
  display: flex;
  justify-content: center;
  flex-wrap: wrap;
  gap: 6px 20px;
  margin: 0 0 8px;
  padding: 0;
  list-style: none;
  font-size: 0.9rem;
}
.zcaf__footer-mid a {
  text-decoration: none;
}
.zcaf__footer-mid a:hover {
  text-decoration: underline;
}
.zcaf__footer-mid p {
  margin: 0;
  font-size: 0.86rem;
  color: var(--zcaf-ink-soft);
}
.zcaf__disclaimer {
  margin-top: 4px !important;
  font-size: 0.78rem !important;
  color: var(--zcaf-ink-faint) !important;
}
.zcaf__top {
  font-size: 0.86rem;
  font-weight: 600;
  text-decoration: none;
  color: var(--zcaf-ink-soft);
}

/*
 * The footer wordmark exists twice — the dark lockup and the white one — because
 * the right file depends on a mode the SERVER does not know. Rendering both and
 * letting CSS choose is what keeps the switch flash-free; picking one on the
 * server would mean a wrong logo until the first paint corrected it.
 */
.zcaf__footer-logo--dark {
  display: none;
}
:root[data-theme="dark"] .zcaf .zcaf__footer-logo--light {
  display: none;
}
:root[data-theme="dark"] .zcaf .zcaf__footer-logo--dark {
  display: block;
}

/* --------------------------------------------------------------- responsive */

@media (max-width: 1120px) {
  .zcaf {
    --zcaf-rail: 216px;
  }
  .zcaf__perks {
    grid-template-columns: repeat(2, minmax(0, 1fr));
    gap: 18px 8px;
  }
  .zcaf__perks article:nth-child(odd) {
    border-left: 0;
  }
}

@media (max-width: 960px) {
  .zcaf__loyalty,
  .zcaf__story,
  .zcaf__order {
    grid-template-columns: minmax(0, 1fr);
  }
}

/*
 * Below the rail's width the shell unstacks: the sidebar becomes a band across
 * the top and its navigation a strip that scrolls sideways. There is no drawer
 * because there is no JavaScript to open one — and a nav a thumb can swipe is a
 * better answer than a hamburger that needs a script to work at all.
 */
@media (max-width: 820px) {
  .zcaf__shell {
    grid-template-columns: minmax(0, 1fr);
    /* No rail column to stand in for, and left behind it would paint a dark
       stripe down the side of the content. */
    background: none;
  }
  .zcaf__side {
    position: static;
    height: auto;
    overflow: visible;
  }
  .zcaf__side-inner {
    display: grid;
    grid-template-columns: auto minmax(0, 1fr);
    gap: 12px 18px;
    min-height: 0;
    padding: 14px clamp(16px, 2.4vw, 32px);
    align-items: center;
  }
  .zcaf__side-brand {
    grid-template-columns: auto auto;
    justify-items: start;
    align-items: center;
    gap: 4px 10px;
    padding: 0;
    text-align: left;
  }
  .zcaf__side-brand img {
    height: 38px;
    grid-row: span 2;
  }
  .zcaf__side-brand small {
    display: none;
  }
  .zcaf__side-nav {
    grid-column: 1 / -1;
    overflow-x: auto;
    scrollbar-width: none;
  }
  .zcaf__side-nav::-webkit-scrollbar {
    display: none;
  }
  .zcaf__side-nav ul {
    grid-auto-flow: column;
    justify-content: start;
    gap: 6px;
  }
  .zcaf__side-nav a {
    padding: 8px 12px 8px 8px;
    white-space: nowrap;
  }
  .zcaf__side-ico {
    width: 28px;
    height: 28px;
    padding: 6px;
  }
  .zcaf__side-foot {
    grid-column: 1 / -1;
    grid-auto-flow: column;
    justify-content: start;
    align-items: center;
    gap: 12px;
    margin-top: 0;
  }
  .zcaf__wifi {
    display: none;
  }
  .zcaf__social p {
    display: none;
  }
  .zcaf__topbar {
    position: static;
  }
  .zcaf__phone span:last-child {
    display: none;
  }
}

@media (max-width: 620px) {
  .zcaf__perks {
    grid-template-columns: minmax(0, 1fr);
  }
  .zcaf__perks article {
    border-left: 0 !important;
    padding: 0;
  }
  .zcaf__filter {
    align-items: stretch;
  }
  .zcaf__filter-side {
    width: 100%;
  }
  .zcaf__field input,
  .zcaf__field select {
    min-width: 0;
    width: 100%;
  }
  .zcaf__menu-grid {
    grid-template-columns: repeat(auto-fill, minmax(155px, 1fr));
  }
  .zcaf__search form {
    min-width: min(76vw, 300px);
  }
  .zcaf__cart span:not([aria-hidden]) {
    display: none;
  }
}

@media (prefers-reduced-motion: reduce) {
  .zcaf * {
    transition: none !important;
    animation: none !important;
  }
}
