/* ============================================================
   CWC Delivery — customer app (v3)
   Warm editorial canvas · poster-style brand identities ·
   promos, badges & featured rows.
   ============================================================ */
* { margin: 0; padding: 0; box-sizing: border-box; }
:root {
  --bg: #f6f2ec;
  --card: #ffffff;
  --ink: #1e1712;
  --muted: #8b7d70;
  --line: #ebe3d9;
  --accent: #1e1712;
  --accent-ink: #fff8ef;
  --soft: #efe8df;
  --r-lg: 24px;
  --r-md: 18px;
  --shadow-sm: 0 1px 2px rgba(30, 23, 18, .05), 0 4px 14px rgba(30, 23, 18, .05);
  --shadow-md: 0 2px 6px rgba(30, 23, 18, .06), 0 12px 32px rgba(30, 23, 18, .10);
  --shadow-lg: 0 8px 20px rgba(30, 23, 18, .14), 0 24px 60px rgba(30, 23, 18, .18);
  --font-display: 'Fraunces', Georgia, serif;
  --font-body: 'Plus Jakarta Sans', system-ui, -apple-system, sans-serif;
  --lux: #b08b43; /* gold detail color */
}
body[data-brand="coldstone"] { --accent: #9e1b32; --soft: #f9ecef; --accent-ink: #fff; }
body[data-brand="waccao"]    { --accent: #6f4518; --soft: #fdf3d7; --accent-ink: #fff; }
body[data-brand="censa"]     { --accent: #cf1f1f; --soft: #fbeded; --accent-ink: #fff; }

html {
  -webkit-text-size-adjust: 100%;
  /* Clamp sideways drift on the document only. `clip` does NOT turn the element
     into a scroll container the way `hidden` does — that distinction is what keeps
     touch scrolling alive on iOS. `hidden` first as the fallback for old engines. */
  overflow-x: hidden;
  overflow-x: clip;
  overscroll-behavior-y: contain;     /* stop scroll chaining, keep the natural bounce */
}
body {
  font-family: var(--font-body);
  background: radial-gradient(1200px 500px at 50% -200px, #fdfaf5 0%, var(--bg) 60%);
  color: var(--ink);
  min-height: 100svh;
  line-height: 1.45;
  /* No overflow / overscroll rules here on purpose: setting overflow-x on <body>
     makes iOS Safari treat the body as its own scroll box, which kills momentum
     scrolling and makes the page feel stuck. The clamp above is enough. */
}
/* While a sheet or popup is open the page underneath stays put */
body.locked { position: fixed; left: 0; right: 0; width: 100%; overflow: hidden; }
button { font: inherit; cursor: pointer; border: none; background: none; color: inherit; }
input, textarea, select { font: inherit; color: inherit; }
img { display: block; }

.view { display: none; max-width: 560px; margin: 0 auto; padding: 18px 18px 34px; }
.view.pad-cart { padding-bottom: 130px; } /* space for the floating cart bar only when it's shown */
.view.active { display: block; animation: rise .35s cubic-bezier(.2,.7,.2,1); }
@keyframes rise { from { opacity: 0; transform: translateY(10px); } to { opacity: 1; transform: none; } }

/* ============ HOME ============ */
/* The bar stays put while you scroll, so points and notifications are always
   one thumb away. Negative margins + matching padding let the frosted panel run
   edge to edge while its contents stay on the page's own gutter. */
.home-top {
  position: sticky; top: 0; z-index: 40;
  display: flex; align-items: center; justify-content: space-between; gap: 10px;
  margin: -18px -18px 0; padding: calc(env(safe-area-inset-top, 0px) + 10px) 18px 10px;
  background: color-mix(in srgb, var(--bg) 82%, transparent);
  -webkit-backdrop-filter: saturate(160%) blur(14px);
  backdrop-filter: saturate(160%) blur(14px);
  border-bottom: 1px solid transparent;
  transition: border-color .2s ease, box-shadow .2s ease;
}
/* The hairline only appears once you've actually scrolled under it */
.home-top.stuck { border-bottom-color: var(--line); box-shadow: 0 6px 20px -16px rgba(45,30,15,.5); }
.home-top-right { min-width: 0; display: flex; align-items: center; gap: 8px; }
.wordmark { font-family: var(--font-display); font-weight: 700; font-size: 17px; display: flex; align-items: center; gap: 8px; flex-shrink: 0; white-space: nowrap; }
.wordmark .wm-dot { width: 30px; height: 30px; border-radius: 10px; background: var(--ink); color: #fff; display: grid; place-items: center; font-size: 15px; }

/* points + notifications, living in the header */
.pts-chip {
  display: inline-flex; align-items: center; gap: 6px; flex-shrink: 0;
  background: var(--ink); color: #f4e7cd; border-radius: 999px;
  padding: 5px 12px 5px 5px; font-weight: 800; font-size: 13px;
  box-shadow: 0 2px 10px -4px rgba(45,30,15,.6);
}
.pts-chip .pts-coin { width: 24px; height: 24px; flex: none; }
.pts-chip .pts-num { font-variant-numeric: tabular-nums; letter-spacing: .2px; }
.pts-chip.guest { background: #fff; color: var(--ink); border: 1px solid var(--line); }
.pts-chip:active { transform: scale(.96); }
.bell-btn {
  position: relative; flex-shrink: 0;
  width: 36px; height: 36px; border-radius: 12px; display: grid; place-items: center;
  background: #fff; border: 1px solid var(--line); color: var(--ink);
  box-shadow: var(--shadow-sm);
}
.bell-btn .ic { width: 17px; height: 17px; }
.bell-btn:active { transform: scale(.94); }
.bell-dot {
  position: absolute; top: 5px; right: 5px;
  min-width: 8px; height: 8px; border-radius: 999px;
  background: #e0483b; box-shadow: 0 0 0 2px var(--bg);
}
.bell-btn.has .ic { animation: bell-nudge 2.4s ease-in-out 1s 2; transform-origin: 50% 15%; }
@keyframes bell-nudge {
  0%, 88%, 100% { transform: rotate(0); }
  90% { transform: rotate(11deg); } 94% { transform: rotate(-9deg); } 97% { transform: rotate(4deg); }
}
@media (prefers-reduced-motion: reduce) { .bell-btn.has .ic { animation: none; } }

/* the design A/B switcher, shown only while comparing */
.design-switch {
  display: flex; align-items: center; gap: 6px; justify-content: center;
  margin: 22px auto 0; padding: 6px; width: fit-content;
  background: var(--ink); border-radius: 999px; box-shadow: var(--shadow-lg);
}
.design-switch .ds-label { color: #a28f74; font-size: 11px; font-weight: 700; text-transform: uppercase; letter-spacing: .8px; padding: 0 8px 0 10px; }
.design-switch button { color: #e8dcc6; font-size: 12.5px; font-weight: 700; padding: 7px 14px; border-radius: 999px; }
.design-switch button.on { background: #f6ead4; color: var(--ink); }
.hours-pill {
  display: inline-flex; align-items: center; gap: 7px; min-width: 0; flex-shrink: 1;
  background: #fff; border: 1px solid var(--line); border-radius: 999px;
  padding: 7px 13px; font-size: 12px; font-weight: 600; color: var(--muted);
  box-shadow: var(--shadow-sm);
}
.hours-pill > span:last-child { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.hours-pill .dot { width: 7px; height: 7px; border-radius: 50%; background: #1fa353; box-shadow: 0 0 0 3px rgba(31,163,83,.15); }
.hours-pill.closed .dot { background: #d92c2c; box-shadow: 0 0 0 3px rgba(217,44,44,.15); }

.home-hero { padding: 36px 2px 24px; position: relative; }
.home-hero::before {
  content: 'ICE CREAM · WAFFLES · COFFEE';
  display: block; font-size: 10.5px; font-weight: 800; letter-spacing: 3px;
  color: var(--lux); margin-bottom: 12px;
}
.home-hero h1 {
  font-family: var(--font-display); font-weight: 800; font-size: 41px;
  line-height: 1.04; letter-spacing: -0.8px;
}
.home-hero h1 em { font-style: italic; font-weight: 600; color: var(--lux); }
.home-hero p { color: var(--muted); font-size: 15px; margin-top: 12px; max-width: 42ch; }
.hero-meta { display: flex; gap: 8px; margin-top: 16px; flex-wrap: wrap; }
.meta-chip {
  font-size: 12.5px; font-weight: 700; color: #6e6156;
  background: #fff; border: 1px solid var(--line); border-radius: 999px; padding: 7px 13px;
  box-shadow: var(--shadow-sm);
}

/* --- promo banner (home + menu) --- */
.promo-banner {
  display: flex; align-items: center; gap: 12px; width: 100%; text-align: left;
  background: linear-gradient(100deg, #241c17, #4a2c17 130%);
  color: #ffe9c4; border-radius: var(--r-md); padding: 14px 16px; margin-bottom: 16px;
  box-shadow: var(--shadow-md); border: 1px solid #3a2a1c;
}
.promo-banner .pb-ico { font-size: 24px; }
.promo-banner .pb-title { font-weight: 800; font-size: 14px; }
.promo-banner .pb-msg { font-size: 12.5px; opacity: .85; margin-top: 1px; }
.promo-banner .pb-code {
  margin-left: auto; flex-shrink: 0; font-weight: 800; font-size: 12.5px; letter-spacing: 1px;
  border: 1.5px dashed #c89b57; color: #ffd98a; border-radius: 9px; padding: 6px 10px;
}

/* --- poster brand cards --- */
.brand-grid { display: grid; gap: 16px; }
.poster {
  position: relative; display: flex; flex-direction: column; gap: 18px; width: 100%; text-align: left;
  border-radius: 26px; padding: 21px; overflow: hidden; isolation: isolate;
  box-shadow: var(--shadow-md), inset 0 0 0 1px rgba(255, 255, 255, .14);
  transition: transform .16s ease, box-shadow .16s ease;
}
.poster::before {
  content: ''; position: absolute; inset: 7px; border-radius: 20px;
  border: 1px solid rgba(255, 255, 255, .18); pointer-events: none; z-index: 1;
}
.poster.waccao::before { border-color: rgba(74, 44, 16, .18); }
.poster:hover { transform: translateY(-3px); box-shadow: var(--shadow-lg); }
.poster:active { transform: scale(.985); }
.poster-mark {
  position: absolute; right: -18px; bottom: -26px; font-size: 130px; opacity: .16; z-index: 0;
  transform: rotate(-12deg); pointer-events: none;
}
.poster-head { display: flex; align-items: center; gap: 15px; z-index: 1; }
.poster h2 { font-family: var(--font-display); font-weight: 700; font-size: 21px; letter-spacing: -.2px; }
.poster-tag { font-size: 12.5px; opacity: .8; display: block; margin-top: 3px; font-weight: 600; }
.poster-foot { display: flex; align-items: flex-end; justify-content: space-between; gap: 10px; z-index: 1; }
.poster-chips { display: flex; gap: 6px; flex-wrap: wrap; }
.poster-chips span {
  font-size: 11px; font-weight: 700; padding: 5px 10px; border-radius: 999px;
  background: rgba(255,255,255,.16); backdrop-filter: blur(2px);
}
.poster-cta {
  flex-shrink: 0; font-weight: 800; font-size: 13.5px; padding: 10px 16px; border-radius: 999px;
  box-shadow: 0 3px 10px rgba(0,0,0,.18);
}
.brand-logo {
  width: 64px; height: 64px; border-radius: 17px; background: #fff;
  display: grid; place-items: center; overflow: hidden; flex-shrink: 0;
  box-shadow: 0 4px 14px rgba(0,0,0,.22);
}
.brand-logo img { width: 100%; height: 100%; object-fit: contain; padding: 5px; }

.poster.coldstone { background: linear-gradient(125deg, #6f1120 0%, #9e1b32 62%, #b8243e 100%); color: #fff5ee; }
.poster.coldstone .poster-cta { background: #ffd9a0; color: #6f1120; }
.poster.waccao { background: linear-gradient(125deg, #ffcf45 0%, #fdc12a 60%, #f0ad00 100%); color: #4a2c10; }
.poster.waccao .poster-chips span { background: rgba(255,255,255,.42); }
.poster.waccao .poster-cta { background: #4a2c10; color: #ffd977; }
.poster.waccao .brand-logo { background: #ffc72c; }
.poster.waccao .brand-logo img { padding: 0; object-fit: cover; }
.poster.censa { background: linear-gradient(125deg, #16100d 0%, #241a15 70%, #33221a 100%); color: #fdf6ee; border: 1px solid #33241b; }
.poster.censa .poster-cta { background: #e02020; color: #fff; }
.poster.censa .poster-mark { opacity: .22; }

.home-top-right { display: flex; align-items: center; gap: 8px; }
.lang-toggle {
  font-size: 12px; font-weight: 800; letter-spacing: .5px;
  background: var(--ink); color: #fff; border-radius: 999px; padding: 8px 13px;
  box-shadow: var(--shadow-sm);
}
.home-links { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; margin-top: 18px; }
.home-track {
  display: flex; align-items: center; justify-content: center; gap: 8px; width: 100%;
  padding: 15px 10px; border-radius: var(--r-md);
  border: 1.5px dashed #d8ccbd; color: #6e6156; font-weight: 700; font-size: 13.5px;
}
.home-foot { text-align: center; color: #b5a897; font-size: 12px; margin-top: 26px; }

/* ============ TOPBAR ============ */
.topbar {
  display: flex; align-items: center; gap: 12px; padding: 10px 0 14px;
  position: sticky; top: 0; z-index: 6;
  background: linear-gradient(to bottom, var(--bg) 82%, transparent);
}
.back {
  width: 40px; height: 40px; border-radius: 13px; background: #fff; border: 1px solid var(--line);
  box-shadow: var(--shadow-sm); font-size: 19px; display: grid; place-items: center; flex-shrink: 0;
}
.topbar h1 { font-family: var(--font-display); font-size: 20px; font-weight: 700; }
.topbar .sub { font-size: 12px; color: var(--muted); font-weight: 600; }

/* ============ MENU ============ */
.brand-band {
  position: relative; display: flex; align-items: center; gap: 16px; overflow: hidden; isolation: isolate;
  border-radius: 26px; padding: 20px; margin-bottom: 14px; box-shadow: var(--shadow-md);
}
.brand-band .poster-mark { font-size: 110px; right: -14px; bottom: -30px; }
.brand-band h2 { font-family: var(--font-display); font-size: 22px; font-weight: 700; }
.brand-band .bb-tag { font-size: 12.5px; opacity: .82; font-weight: 600; margin-top: 2px; }
.brand-band .bb-meta { display: flex; gap: 6px; margin-top: 9px; flex-wrap: wrap; }
/* the way back, on the banner instead of in a title bar that repeated the name */
.bb-back {
  position: absolute; z-index: 3; top: 12px; left: 12px;
  width: 34px; height: 34px; border-radius: 50%; display: grid; place-items: center;
  background: rgba(255,255,255,.9); color: #1a1710; font-size: 22px; line-height: 1; padding-bottom: 3px;
  box-shadow: 0 3px 10px -4px rgba(0,0,0,.45);
}

.brand-band .bb-meta span {
  font-size: 11.5px; font-weight: 700; padding: 5px 10px; border-radius: 999px;
  background: rgba(255,255,255,.18);
}
/* the branch chip: a solid, obviously-tappable bar inside the band, because
   which shop you order from changes the menu, the ETA and the phone number */
.bb-branch {
  position: relative; z-index: 2; display: flex; align-items: center; gap: 9px;
  margin-top: 12px; padding: 11px 12px 11px 13px; border-radius: 14px;
  background: rgba(255,255,255,.92); color: #1a1710; cursor: pointer;
  box-shadow: 0 4px 14px -8px rgba(0,0,0,.55);
}
.bb-branch .ic { width: 17px; height: 17px; flex: none; color: #8a857e; }
.bb-br-txt { flex: 1; min-width: 0; display: block; line-height: 1.25; }
.bb-br-txt small, .bb-branch.single small {
  display: block; font-size: 10px; font-weight: 800; letter-spacing: .07em;
  text-transform: uppercase; color: #8a857e;
}
.bb-br-txt b, .bb-branch.single b {
  display: block; font-size: 14.5px; font-weight: 800; overflow-wrap: anywhere;
}
.bb-br-go {
  flex: none; display: inline-flex; align-items: center; gap: 3px;
  font-size: 12px; font-weight: 800; color: #1a1710;
  background: #eceade; border-radius: 999px; padding: 6px 10px 6px 12px;
}
.bb-br-chev { font-size: 15px; line-height: 1; margin-top: -1px; }
/* the real control sits invisibly over the whole bar, so a tap opens the phone's own picker */
.bb-branch select {
  position: absolute; inset: 0; width: 100%; height: 100%;
  opacity: 0; appearance: none; border: 0; cursor: pointer;
}
.bb-branch.single { cursor: default; }
.bb-br-addr { flex: none; font-size: 11.5px; font-weight: 700; color: #8a857e; text-align: right; }
.bb-branch.single span { flex: 1; min-width: 0; }

.brand-band.coldstone { background: linear-gradient(125deg, #6f1120, #9e1b32 62%, #b8243e); color: #fff5ee; }
.brand-band.waccao { background: linear-gradient(125deg, #ffcf45, #fdc12a 60%, #f0ad00); color: #4a2c10; }
.brand-band.waccao .bb-meta span { background: rgba(255,255,255,.45); }
.brand-band.waccao .brand-logo { background: #ffc72c; }
.brand-band.waccao .brand-logo img { padding: 0; object-fit: cover; }
.brand-band.censa { background: linear-gradient(125deg, #16100d, #241a15 70%, #33221a); color: #fdf6ee; }

/* --- featured row --- */
.featured-label {
  font-family: var(--font-display); font-size: 16px; font-weight: 700; margin: 6px 2px 10px;
  display: flex; align-items: center; gap: 8px;
}
.featured-row { display: flex; gap: 10px; overflow-x: auto; padding-bottom: 14px; scrollbar-width: none; }
.featured-row::-webkit-scrollbar { display: none; }
.feat-card {
  flex: 0 0 156px; background: var(--card); border: 1px solid var(--line); border-radius: var(--r-md);
  padding: 13px; box-shadow: var(--shadow-sm); text-align: left; position: relative;
  transition: transform .15s ease, box-shadow .15s ease;
}
.feat-card .fc-emoji { font-size: 34px; height: 56px; display: grid; place-items: center; background: linear-gradient(140deg, #fff, var(--soft) 80%); border: 1px solid color-mix(in srgb, var(--accent) 8%, var(--line)); border-radius: 14px; margin-bottom: 9px; }
.feat-card .fc-name { font-size: 13px; font-weight: 700; line-height: 1.3; min-height: 34px; overflow-wrap: anywhere; }
.feat-card .fc-foot { display: flex; align-items: center; justify-content: space-between; margin-top: 6px; }
.feat-card .fc-price { font-family: var(--font-display); font-size: 13px; font-weight: 700; color: var(--accent); }
.feat-card .fc-add { width: 30px; height: 30px; border-radius: 50%; background: var(--accent); color: var(--accent-ink); font-size: 15px; font-weight: 700; display: grid; place-items: center; box-shadow: 0 3px 8px color-mix(in srgb, var(--accent) 30%, transparent); }
.feat-badge {
  position: absolute; top: 8px; left: 8px; right: auto; font-size: 9.5px; font-weight: 800;
  background: var(--ink); color: #ffd98a; border-radius: 999px; padding: 3px 8px; z-index: 1;
  letter-spacing: .3px;
}

.cat-tabs {
  display: flex; gap: 8px; overflow-x: auto; padding: 4px 0 16px; scrollbar-width: none;
  position: sticky; top: 62px; z-index: 5;
  background: linear-gradient(to bottom, var(--bg) 72%, transparent);
}
.cat-tabs::-webkit-scrollbar { display: none; }
.cat-tab {
  flex-shrink: 0; padding: 9px 16px; border-radius: 999px; font-size: 13px; font-weight: 700;
  background: #fff; border: 1px solid var(--line); color: var(--muted); box-shadow: var(--shadow-sm);
  transition: all .15s ease;
}
.cat-tab.active { background: var(--accent); color: var(--accent-ink); border-color: var(--accent); }

.cat-heading {
  font-family: var(--font-display); font-size: 17px; font-weight: 700; margin: 22px 2px 12px;
  display: flex; align-items: center; gap: 10px;
}
.cat-heading::after { content: ''; height: 1px; flex: 1; background: var(--line); }

.cat-group { display: grid; grid-template-columns: repeat(2, 1fr); gap: 14px; margin-bottom: 8px; }
.item-card {
  display: flex; flex-direction: column; background: var(--card);
  border: 1px solid var(--line); border-radius: 24px; overflow: hidden;
  box-shadow: var(--shadow-sm);
  transition: transform .15s ease, box-shadow .15s ease, border-color .15s ease;
}
.item-card.in-cart { border-color: color-mix(in srgb, var(--accent) 45%, var(--line)); box-shadow: 0 0 0 2px color-mix(in srgb, var(--accent) 16%, transparent), var(--shadow-sm); }
.item-visual {
  position: relative; height: 104px; display: grid; place-items: center;
  background:
    radial-gradient(120px 70px at 70% 20%, #ffffffcc 0%, transparent 60%),
    linear-gradient(150deg, #fff 0%, var(--soft) 90%);
  border-bottom: 1px solid var(--line);
}
.iv-emoji { font-size: 48px; filter: drop-shadow(0 6px 10px color-mix(in srgb, var(--accent) 22%, transparent)); }
.item-badge {
  position: absolute; top: 9px; left: 9px; font-size: 9.5px; font-weight: 800;
  background: var(--ink); color: #ffd98a; border-radius: 999px; padding: 4px 9px;
  letter-spacing: .3px; white-space: nowrap; z-index: 1;
}
.item-body { display: flex; flex-direction: column; flex: 1; padding: 13px 14px 14px; }
.item-body h3 {
  font-size: 15px; font-weight: 700; letter-spacing: -.1px; line-height: 1.3;
  display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden;
  /* long single words like "Germanchokolatekake" must not run past the card */
  overflow-wrap: anywhere;
}
.item-body p {
  font-size: 12px; color: var(--muted); margin-top: 4px; line-height: 1.45;
  display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden;
}
.item-foot { display: flex; align-items: center; justify-content: space-between; gap: 8px; margin-top: auto; padding-top: 11px; }
.item-foot .price { font-family: var(--font-display); font-size: 15.5px; font-weight: 700; color: var(--accent); white-space: nowrap; }
.add-btn {
  width: 40px; height: 40px; border-radius: 50%; background: var(--accent); color: var(--accent-ink);
  font-size: 20px; flex-shrink: 0; display: grid; place-items: center;
  box-shadow: 0 5px 14px color-mix(in srgb, var(--accent) 38%, transparent), inset 0 1px 0 rgba(255,255,255,.25);
  transition: transform .12s ease;
}
.add-btn:active { transform: scale(.9); }
.qty-stepper { display: flex; align-items: center; gap: 6px; flex-shrink: 0; background: var(--soft); border-radius: 999px; padding: 3px; }
.qty-stepper button { width: 30px; height: 30px; border-radius: 50%; background: #fff; box-shadow: var(--shadow-sm); font-size: 15px; font-weight: 800; color: var(--accent); }
.qty-stepper span { font-weight: 800; min-width: 15px; text-align: center; font-size: 13.5px; }

/* ============ CART BAR & SHEET ============ */
.cart-bar {
  position: fixed; left: 18px; right: 18px; bottom: 20px; max-width: 524px; margin: 0 auto;
  background: var(--accent); color: var(--accent-ink); border-radius: 999px; padding: 16px 22px;
  display: none; align-items: center; justify-content: space-between; font-weight: 800; font-size: 14.5px;
  box-shadow: var(--shadow-lg), inset 0 1px 0 rgba(255,255,255,.2); z-index: 20;
  animation: rise .3s cubic-bezier(.2,.7,.2,1);
}
.cart-bar.show { display: flex; }
.cart-bar .cb-count { background: rgba(255,255,255,.18); border-radius: 999px; padding: 4px 11px; font-size: 12.5px; }

.sheet-backdrop { position: fixed; inset: 0; background: rgba(24, 16, 10, .5); backdrop-filter: blur(2px); z-index: 30; display: none; }
.sheet-backdrop.show { display: block; animation: fadein .2s ease; }
@keyframes fadein { from { opacity: 0; } to { opacity: 1; } }
.sheet {
  position: fixed; left: 0; right: 0; bottom: 0; z-index: 31; background: var(--card);
  border-radius: 26px 26px 0 0; max-width: 560px; margin: 0 auto; padding: 12px 20px 28px;
  max-height: 84svh; overflow-y: auto; -webkit-overflow-scrolling: touch; overscroll-behavior: contain;
  transform: translateY(102%); transition: transform .3s cubic-bezier(.2,.7,.2,1);
}
.sheet.show { transform: none; }
.sheet-handle { width: 40px; height: 4px; border-radius: 99px; background: var(--line); margin: 4px auto 16px; }
.sheet h2 { font-family: var(--font-display); font-size: 20px; font-weight: 700; margin-bottom: 12px; }
.cart-row { display: flex; align-items: center; gap: 12px; padding: 11px 0; border-bottom: 1px solid var(--line); }
.cart-row .name { flex: 1; font-size: 14px; font-weight: 600; }
.cart-row .amt { font-weight: 800; font-size: 13.5px; white-space: nowrap; }

.totals { padding-top: 14px; font-size: 14px; }
.totals .row { display: flex; justify-content: space-between; padding: 4px 0; color: var(--muted); }
.totals .row.discount { color: #1a8a4a; font-weight: 700; }
.totals .row.grand {
  color: var(--ink); font-weight: 800; font-size: 16px; margin-top: 8px; padding-top: 12px;
  border-top: 1.5px dashed var(--line);
}
.totals .row.grand span:last-child { font-family: var(--font-display); font-size: 19px; }
.cart-row .amt, .cart-bar #cart-bar-total { font-variant-numeric: tabular-nums; }

.primary-btn {
  width: 100%; background: var(--accent); color: var(--accent-ink); border-radius: 999px;
  padding: 17px; font-size: 15px; font-weight: 800; letter-spacing: .3px; margin-top: 16px;
  box-shadow: 0 6px 18px color-mix(in srgb, var(--accent) 32%, transparent), inset 0 1px 0 rgba(255,255,255,.22);
  transition: transform .12s ease;
}
.primary-btn:active { transform: scale(.985); }
.primary-btn:disabled { opacity: .45; box-shadow: none; }

/* ============ CHECKOUT ============ */
.form-card {
  background: var(--card); border: 1px solid var(--line); border-radius: var(--r-lg);
  padding: 18px; margin-bottom: 14px; box-shadow: var(--shadow-sm);
}
.form-card > h2 {
  font-family: var(--font-display); font-size: 16px; font-weight: 700; margin-bottom: 14px;
  display: flex; align-items: center; gap: 8px;
}
.form-card > h2 .n {
  width: 24px; height: 24px; border-radius: 50%;
  background: linear-gradient(135deg, #eddbb2, #cfa964); color: #4a3413;
  font-family: var(--font-body); font-size: 12px; font-weight: 800; display: grid; place-items: center;
  box-shadow: 0 2px 6px rgba(176, 139, 67, .35);
}
.field { margin-bottom: 12px; }
.field:last-child { margin-bottom: 2px; }
.field label { display: block; font-size: 12px; font-weight: 700; margin-bottom: 6px; color: #6e6156; }
.field input, .field textarea {
  width: 100%; background: #fbf9f6; border: 1.5px solid var(--line); border-radius: 13px;
  padding: 13px 14px; font-size: 15px; outline: none; transition: border-color .15s, background .15s;
}
.field input:focus, .field textarea:focus { border-color: var(--accent); background: #fff; }

.pay-options { display: grid; gap: 9px; }
.pay-option {
  display: flex; align-items: center; gap: 13px; background: #fbf9f6;
  border: 1.5px solid var(--line); border-radius: 15px; padding: 13px 14px; text-align: left; width: 100%;
  transition: all .15s ease;
}
.pay-option.selected { border-color: var(--accent); background: var(--soft); box-shadow: 0 0 0 3px color-mix(in srgb, var(--accent) 12%, transparent); }
.pay-ico {
  width: 42px; height: 42px; border-radius: 12px; display: grid; place-items: center;
  font-size: 13px; font-weight: 800; flex-shrink: 0; background: #fff; border: 1px solid var(--line);
}
.pay-ico.cash { font-size: 19px; }
.pay-ico.momo { background: #ffcb05; color: #00427a; border-color: #eebc00; }
.pay-ico.om { background: #ff7900; color: #fff; border-color: #ef6f00; }
.pay-option .t { font-size: 14px; font-weight: 700; }
.pay-option .d { font-size: 12px; color: var(--muted); margin-top: 1px; }
.pay-option .radio {
  margin-left: auto; width: 20px; height: 20px; border-radius: 50%; border: 2px solid #d8ccbd; flex-shrink: 0;
  display: grid; place-items: center; transition: all .15s ease;
}
.pay-option.selected .radio { border-color: var(--accent); }
.pay-option.selected .radio::after { content: ''; width: 10px; height: 10px; border-radius: 50%; background: var(--accent); }

.promo-row { display: flex; gap: 9px; }
.promo-row input {
  flex: 1; background: #fbf9f6; border: 1.5px solid var(--line); border-radius: 13px;
  padding: 13px 14px; font-size: 14.5px; font-weight: 700; letter-spacing: 1px; text-transform: uppercase;
  outline: none; min-width: 0;
}
.promo-row input:focus { border-color: var(--accent); background: #fff; }
.promo-apply { background: var(--ink); color: #fff; border-radius: 13px; padding: 0 20px; font-weight: 800; font-size: 13.5px; }
.promo-status { font-size: 13px; font-weight: 700; margin-top: 10px; display: none; }
.promo-status.ok { display: block; color: #1a8a4a; }
.promo-status.bad { display: block; color: #b42323; }

.geo-btn {
  display: flex; align-items: center; justify-content: center; gap: 8px; width: 100%;
  padding: 13px; border-radius: 13px; font-weight: 800; font-size: 13.5px;
  background: #eef6ff; color: #175cd3; border: 1.5px dashed #a8cbf5;
  transition: all .15s ease;
}
.geo-btn.captured { background: #eefaf1; color: #186a37; border-color: #9ed9b1; border-style: solid; }
.geo-status { font-size: 12.5px; font-weight: 600; margin-top: 8px; color: var(--muted); display: none; }
.geo-status.show { display: block; }
.geo-status.err { color: #b45309; }

.eta-note {
  display: flex; align-items: center; gap: 10px; font-size: 13px; font-weight: 600; color: #6e6156;
  background: var(--soft); border-radius: 13px; padding: 12px 14px; margin-bottom: 14px;
}

.error-msg { background: #fdefef; color: #b42323; border: 1px solid #f5cfcf; border-radius: 13px; padding: 12px 14px; font-size: 13.5px; margin-top: 12px; display: none; font-weight: 600; }
.error-msg.show { display: block; }

/* ============ TRACKING ============ */
.confirm-hero { text-align: center; padding: 26px 10px 8px; }
.confirm-hero .big {
  width: 84px; height: 84px; margin: 0 auto; border-radius: 50%;
  background: var(--soft); display: grid; place-items: center; font-size: 40px;
  box-shadow: inset 0 0 0 8px #fff, var(--shadow-sm); border: 1px solid var(--line);
}
.confirm-hero h1 { font-family: var(--font-display); font-size: 26px; font-weight: 700; margin-top: 16px; }
.confirm-hero .code { font-size: 13.5px; color: var(--muted); margin-top: 8px; }
.code-chip {
  display: inline-block; background: var(--ink); color: #f0d9a8; font-weight: 800; letter-spacing: 2px;
  border-radius: 9px; padding: 4px 12px; font-size: 14px; margin-left: 4px;
  border: 1px solid #3a2c1c; box-shadow: 0 3px 10px rgba(30, 23, 18, .25);
}
.eta-banner {
  display: flex; align-items: center; gap: 14px; margin-top: 20px;
  background: var(--soft); border: 1px solid color-mix(in srgb, var(--accent) 18%, var(--line));
  border-radius: var(--r-md); padding: 16px;
}
.eta-banner .clock { font-size: 26px; }
.eta-banner .eta-label { font-size: 12px; font-weight: 700; color: #6e6156; text-transform: uppercase; letter-spacing: .5px; }
.eta-banner .eta-time { font-family: var(--font-display); font-size: 21px; font-weight: 700; font-style: italic; color: var(--accent); margin-top: 2px; }
.eta-banner .eta-sub { font-size: 12.5px; color: var(--muted); margin-top: 1px; }

.timeline {
  background: var(--card); border: 1px solid var(--line); border-radius: var(--r-lg);
  padding: 22px; margin-top: 14px; box-shadow: var(--shadow-sm);
}
.step { display: flex; gap: 15px; position: relative; padding-bottom: 26px; }
.step:last-child { padding-bottom: 0; }
.step::before { content: ''; position: absolute; left: 14px; top: 32px; bottom: 0; width: 2px; background: var(--line); border-radius: 2px; }
.step.done::before { background: var(--accent); }
.step:last-child::before { display: none; }
.step .dot-lg {
  width: 30px; height: 30px; border-radius: 50%; background: #fbf9f6; border: 2px solid var(--line);
  display: grid; place-items: center; font-size: 13px; flex-shrink: 0; z-index: 1; transition: all .3s ease;
}
.step.done .dot-lg { background: var(--accent); border-color: var(--accent); }
.step.current .dot-lg { box-shadow: 0 0 0 5px color-mix(in srgb, var(--accent) 15%, transparent); }
.step .t { font-size: 14.5px; font-weight: 700; padding-top: 5px; color: #c0b4a5; }
.step.done .t { color: var(--ink); }

.paybox { margin-top: 14px; background: #fff8e6; border: 1px solid #f3dfa4; color: #8a6116; border-radius: 13px; padding: 14px; font-size: 13.5px; font-weight: 600; }

.summary-card {
  background: var(--card); border: 1px solid var(--line); border-radius: var(--r-lg);
  padding: 18px; margin-top: 14px; box-shadow: var(--shadow-sm);
}
.summary-card h3 { font-family: var(--font-display); font-size: 15px; font-weight: 700; margin-bottom: 8px; }

.track-lookup-card {
  background: var(--card); border: 1px solid var(--line); border-radius: var(--r-lg);
  padding: 22px; box-shadow: var(--shadow-sm); text-align: center;
}
.track-lookup-card p { color: var(--muted); font-size: 14px; }
.track-input { display: flex; gap: 10px; margin-top: 14px; }
.track-input input {
  flex: 1; background: #fbf9f6; border: 1.5px solid var(--line); border-radius: 13px;
  padding: 13px 14px; font-size: 16px; font-weight: 700; letter-spacing: 2px; text-transform: uppercase;
  text-align: center; outline: none; min-width: 0;
}
.track-input input:focus { border-color: var(--ink); }
.ghost-btn { background: var(--ink); color: #fff; border-radius: 13px; padding: 12px 20px; font-weight: 800; font-size: 14px; }

/* ============ HELP CENTRE ============ */
.help-link {
  display: flex; align-items: center; justify-content: center; gap: 8px; width: 100%;
  margin-top: 12px; padding: 13px; border-radius: var(--r-md);
  background: #fff; border: 1px solid var(--line); box-shadow: var(--shadow-sm);
  color: #6e6156; font-weight: 700; font-size: 13.5px;
}
.help-contact { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; margin-bottom: 16px; }
.help-cta {
  display: flex; align-items: center; justify-content: center; gap: 9px;
  padding: 15px; border-radius: var(--r-md); font-weight: 800; font-size: 14px; text-decoration: none;
  box-shadow: var(--shadow-sm);
}
.help-cta.call { background: var(--ink); color: #fff; }
.help-cta.wa { background: #1fa855; color: #fff; }
.faq-item {
  background: var(--card); border: 1px solid var(--line); border-radius: var(--r-md);
  margin-bottom: 10px; box-shadow: var(--shadow-sm); overflow: hidden;
}
.faq-item summary {
  list-style: none; cursor: pointer; padding: 16px 18px;
  font-weight: 700; font-size: 14.5px; position: relative; padding-right: 42px;
}
.faq-item summary::-webkit-details-marker { display: none; }
.faq-item summary::after {
  content: '+'; position: absolute; right: 18px; top: 50%; transform: translateY(-50%);
  font-size: 20px; font-weight: 600; color: var(--muted); transition: transform .2s ease;
}
.faq-item[open] summary::after { transform: translateY(-50%) rotate(45deg); color: var(--accent); }
.faq-item p { padding: 0 18px 16px; font-size: 13.5px; color: var(--muted); line-height: 1.65; }

/* ============ REWARDS ============ */
.rew-card {
  background: linear-gradient(135deg, #241c17, #453022 130%);
  color: #fdf4e7; border-radius: var(--r-lg); padding: 22px; box-shadow: var(--shadow-md);
}
.rew-top { display: flex; justify-content: space-between; gap: 16px; margin-bottom: 16px; }
.rew-label { font-size: 11.5px; font-weight: 800; text-transform: uppercase; letter-spacing: .8px; opacity: .7; }
.rew-logo { display: block; width: 132px; height: auto; margin-bottom: 12px; }
.rew-points { font-family: var(--font-display); font-size: 44px; font-weight: 800; line-height: 1.05; margin-top: 4px; display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }
.rew-coin { width: 38px; height: 38px; flex: none; filter: drop-shadow(0 2px 6px rgba(0,0,0,.35)); }
.rew-points small { font-size: 16px; font-weight: 700; opacity: .7; }
.rew-phone { font-size: 13px; font-weight: 700; opacity: .75; margin-top: 6px; }
.rew-qr { background: #fff; border-radius: 14px; padding: 8px; align-self: flex-start; box-shadow: 0 4px 14px rgba(0,0,0,.3); }
.rew-qr img, .rew-qr canvas { display: block; }
.qr-fallback { color: #241c17; font-weight: 800; font-size: 15px; letter-spacing: 1px; padding: 30px 6px; }
.rew-card .loy-bar { height: 10px; background: rgba(255,255,255,.15); border-radius: 999px; overflow: hidden; }
.rew-card .loy-fill { height: 100%; background: linear-gradient(90deg, #ffd98a, #ff9d5c); border-radius: 999px; transition: width .5s ease; }
.rew-progress { font-size: 13.5px; font-weight: 800; margin-top: 10px; color: #ffd98a; }
.rew-progress.ready { color: #7ef0a2; }
.rew-reward { display: flex; gap: 10px; align-items: flex-start; font-size: 13.5px; font-weight: 600; margin-top: 14px; background: rgba(255,255,255,.08); border-radius: 12px; padding: 12px 14px; }
.rew-hint { font-size: 12px; opacity: .65; margin-top: 12px; line-height: 1.5; }
.rew-how { font-size: 13.5px; color: var(--muted); line-height: 1.6; }

/* ============ PROMO POPUP ============ */
.promo-pop-backdrop {
  position: fixed; inset: 0; background: rgba(20, 13, 8, .55); backdrop-filter: blur(3px);
  z-index: 60; display: none; place-items: center; padding: 24px;
}
.promo-pop-backdrop.show { display: grid; animation: fadein .25s ease; }
.promo-pop {
  position: relative; background: var(--card); border-radius: 28px; padding: 34px 26px 26px;
  width: 100%; max-width: 380px; text-align: center; box-shadow: var(--shadow-lg);
  animation: pop .35s cubic-bezier(.2,.9,.3,1.2);
  background:
    radial-gradient(400px 200px at 50% -80px, #fdf3d7 0%, var(--card) 55%);
}
@keyframes pop { from { opacity: 0; transform: scale(.85) translateY(16px); } to { opacity: 1; transform: none; } }
.pp-close {
  position: absolute; top: 14px; right: 14px; width: 34px; height: 34px; border-radius: 50%;
  background: var(--soft); color: var(--muted); font-size: 14px; font-weight: 700;
}
.pp-burst { font-size: 52px; }
.promo-pop h2 { font-family: var(--font-display); font-size: 24px; font-weight: 800; margin-top: 10px; letter-spacing: -.3px; }
.promo-pop p { color: var(--muted); font-size: 14px; margin-top: 8px; line-height: 1.55; }
.pp-code {
  display: inline-block; margin-top: 16px; border: 2px dashed #c89b57; color: #8a5a1e;
  background: #fdf6e5; font-weight: 800; font-size: 16px; letter-spacing: 2px;
  border-radius: 12px; padding: 10px 18px;
}

/* ============ ICONS ============ */
.ic { width: 16px; height: 16px; vertical-align: -3px; flex-shrink: 0; }
.wm-dot .ic { width: 15px; height: 15px; vertical-align: 0; }
.meta-chip .ic, .bb-meta .ic { width: 13px; height: 13px; vertical-align: -2px; }
.featured-label .ic { width: 15px; height: 15px; color: var(--lux); }
.home-track .ic, .help-link .ic { width: 17px; height: 17px; }
.help-cta .ic { width: 18px; height: 18px; }
.pay-ico .ic { width: 19px; height: 19px; }
.eta-note .ic { width: 17px; height: 17px; color: var(--accent); }
.eta-banner .clock .ic-xl, .eta-banner .clock .ic { width: 27px; height: 27px; color: var(--accent); }
.confirm-hero .big .ic { width: 38px; height: 38px; color: var(--accent); }
.step .dot-lg .ic { width: 13px; height: 13px; }
.step.done .dot-lg .ic { color: #fff; }
.paybox .ic { width: 15px; height: 15px; }
.pb-ico .ic { width: 22px; height: 22px; color: #ffd98a; }
.pp-burst .ic-burst { width: 46px; height: 46px; color: var(--lux); }
.rew-reward .ic { width: 17px; height: 17px; color: #ffd98a; }
.rew-phone .ic { width: 13px; height: 13px; }
.pm-svg { width: 138px; height: 138px; stroke-width: 1.4; }
.poster-mark { font-size: 0; }
.brand-band .pm-svg { width: 116px; height: 116px; }

/* ============ DESKTOP ============ */
@media (min-width: 900px) {
  .view { max-width: 1100px; padding: 26px 40px 70px; }
  #view-track, #view-rewards, #view-help { max-width: 700px; }

  /* home */
  .home-hero { padding: 48px 2px 32px; }
  .home-hero h1 { font-size: 58px; }
  .home-hero p { font-size: 16.5px; max-width: 48ch; }
  .brand-grid { grid-template-columns: repeat(3, 1fr); gap: 18px; }
  .poster { min-height: 330px; justify-content: space-between; padding: 24px; }
  .poster-head { flex-direction: column; align-items: flex-start; gap: 16px; }
  .poster h2 { font-size: 23px; }
  .brand-logo { width: 72px; height: 72px; border-radius: 19px; }
  .poster-mark { transform: rotate(-10deg); }
  .pm-svg { width: 170px; height: 170px; }
  .poster-foot { flex-direction: column; align-items: flex-start; gap: 14px; }
  .home-links, .help-link { max-width: 580px; margin-left: auto; margin-right: auto; }
  .home-links { margin-top: 26px; }

  /* menu */
  .brand-band { padding: 26px; }
  .brand-band h2 { font-size: 26px; }
  .cat-group { grid-template-columns: repeat(3, 1fr); gap: 16px; }
  .item-visual { height: 130px; }
  .iv-emoji { font-size: 56px; }
  .item-body h3 { font-size: 15.5px; }
  .item-body p { font-size: 12.5px; }
  .cat-tabs { top: 66px; }
  .feat-card { flex: 0 0 172px; }
  .cart-bar { max-width: 560px; }

  /* checkout: two columns */
  #view-checkout.active { display: grid; grid-template-columns: 1.05fr .95fr; gap: 0 24px; align-items: start; }
  #view-checkout .topbar, #view-checkout .eta-note { grid-column: 1 / -1; }
  #view-checkout .form-card { grid-column: 2; }
  #view-checkout .eta-note + .form-card { grid-column: 1; grid-row: span 4; }
  #view-checkout .error-msg, #view-checkout .primary-btn { grid-column: 2; }
}

/* hover states (pointer devices) */
@media (hover: hover) {
  .item-card:hover {
    transform: translateY(-2px); box-shadow: var(--shadow-md);
    border-color: color-mix(in srgb, var(--accent) 28%, var(--line));
  }
  .add-btn:hover { transform: scale(1.09); }
  .feat-card:hover { transform: translateY(-2px); box-shadow: var(--shadow-md); }
  .cat-tab:hover { border-color: var(--accent); color: var(--accent); }
  .cat-tab.active:hover { color: var(--accent-ink); }
  .home-track:hover, .help-link:hover { border-color: var(--lux); color: #8a6b1f; }
  .pay-option:hover { border-color: color-mix(in srgb, var(--accent) 40%, var(--line)); }
}

/* ============ LOYALTY 2.0 ============ */
.loy-hint { font-size: 12.5px; color: var(--muted); margin-bottom: 12px; }
.loy-check-btn {
  width: 100%; padding: 13px; border-radius: 13px; font-weight: 800; font-size: 13.5px;
  background: var(--soft); color: var(--accent); border: 1.5px dashed color-mix(in srgb, var(--accent) 35%, var(--line));
}
.loy-msg { font-size: 13px; font-weight: 700; margin-top: 12px; }
.loy-msg.ok { color: #1a8a4a; }
.loy-msg.err { color: #b42323; }
.loy-opts { display: grid; gap: 8px; margin-top: 10px; }
.loy-opt {
  display: flex; align-items: center; gap: 10px; text-align: left; width: 100%;
  background: #fbf9f6; border: 1.5px solid var(--line); border-radius: 13px; padding: 12px 14px;
  transition: all .14s ease;
}
.loy-opt:disabled { opacity: .45; }
.loy-opt.selected { border-color: var(--accent); background: var(--soft); box-shadow: 0 0 0 3px color-mix(in srgb, var(--accent) 12%, transparent); }
.loy-opt .lo-t { flex: 1; font-size: 13.5px; font-weight: 700; min-width: 0; }
.loy-opt .lo-d { font-size: 12px; font-weight: 800; color: var(--accent); white-space: nowrap; }
.loy-opt .radio { width: 18px; height: 18px; border-radius: 50%; border: 2px solid #d8ccbd; flex-shrink: 0; display: grid; place-items: center; }
.loy-opt.selected .radio { border-color: var(--accent); }
.loy-opt.selected .radio::after { content: ''; width: 9px; height: 9px; border-radius: 50%; background: var(--accent); }

.rew-tier-row { display: flex; align-items: center; gap: 10px; margin: 4px 0 12px; flex-wrap: wrap; }
.tier-chip {
  display: inline-flex; align-items: center; gap: 6px; font-size: 12.5px; font-weight: 800;
  border-radius: 999px; padding: 6px 14px; letter-spacing: .3px;
}
.tier-chip .ic { width: 13px; height: 13px; }
.tier-bronze { background: linear-gradient(120deg, #b0876211, #8a5a2e33); color: #d8a878; border: 1px solid #8a5a2e66; }
.tier-silver { background: linear-gradient(120deg, #cfd4dc22, #9aa3b044); color: #dfe5ee; border: 1px solid #9aa3b077; }
.tier-gold { background: linear-gradient(120deg, #e9c67e33, #c9a35a55); color: #ffd98a; border: 1px solid #c9a35a88; }
.tier-mult { font-size: 12px; font-weight: 700; opacity: .75; }

.rw-row {
  display: flex; align-items: center; gap: 12px; padding: 12px 0;
  border-bottom: 1px solid var(--line); opacity: .55;
}
.rw-row.afford { opacity: 1; }
.rw-row:last-of-type { border-bottom: none; }
.rw-ico { width: 38px; height: 38px; border-radius: 12px; background: var(--soft); display: grid; place-items: center; color: var(--accent); flex-shrink: 0; }
.rw-ico .ic { width: 17px; height: 17px; }
.rw-t { flex: 1; font-size: 13.5px; font-weight: 700; min-width: 0; }
.rw-t small { display: block; color: var(--muted); font-weight: 600; font-size: 12px; margin-top: 1px; }
.rw-cost { font-family: var(--font-display); font-size: 14px; font-weight: 800; color: var(--accent); white-space: nowrap; }
.rw-note { font-size: 12px; color: var(--muted); padding-top: 10px; }
.rw-ev { display: flex; justify-content: space-between; gap: 12px; font-size: 13px; color: var(--muted); padding: 6px 0; border-bottom: 1px dashed var(--line); }
.rw-ev:last-child { border-bottom: none; }
.rw-ev .pos { color: #1a8a4a; font-weight: 800; }
.rw-ev .neg { color: #b42323; font-weight: 800; }

/* install */
.install-btn {
  display: flex; align-items: center; justify-content: center; gap: 9px; width: 100%;
  margin: 12px auto 0; padding: 15px; border-radius: var(--r-md); max-width: 580px;
  background: var(--ink); color: #f0d9a8; font-weight: 800; font-size: 14px;
  box-shadow: var(--shadow-md);
}
.install-tip {
  max-width: 580px; margin: 10px auto 0; background: #fff8e6; border: 1px solid #f3dfa4;
  color: #8a6116; border-radius: 13px; padding: 12px 14px; font-size: 13px; font-weight: 600; text-align: center;
}

/* ============ ACCOUNT ============ */
.auth-tabs { display: grid; grid-template-columns: 1fr 1fr; gap: 8px; margin-bottom: 16px; }
.auth-tab {
  padding: 11px; border-radius: 12px; font-weight: 800; font-size: 13.5px;
  background: #fbf9f6; border: 1.5px solid var(--line); color: var(--muted);
}
.auth-tab.active { background: var(--ink); color: #f0d9a8; border-color: var(--ink); }
.acct-order {
  display: flex; align-items: center; gap: 10px; width: 100%; text-align: left;
  padding: 11px 0; border-bottom: 1px dashed var(--line);
}
.acct-order:last-of-type { border-bottom: none; }
.ao-code { font-family: var(--font-display); font-weight: 800; font-size: 13.5px; letter-spacing: .5px; }
.ao-meta { flex: 1; font-size: 12.5px; color: var(--muted); font-weight: 600; min-width: 0; }
.ao-status { font-size: 10.5px; font-weight: 800; padding: 4px 10px; border-radius: 999px; text-transform: uppercase; letter-spacing: .3px; white-space: nowrap; }
.ao-status.st-new { background: #fdf2e3; color: #a06514; }
.ao-status.st-confirmed { background: #eef4fd; color: #1d5cc2; }
.ao-status.st-preparing { background: #fefce8; color: #9c7511; }
.ao-status.st-out_for_delivery { background: #eefafd; color: #0d7a94; }
.ao-status.st-delivered { background: #effaf2; color: #1f7a45; }
.ao-status.st-cancelled { background: #fdf0f0; color: #b02a2a; }
.ghost-btn.signout { width: 100%; margin-top: 4px; background: transparent; color: var(--muted); border: 1.5px dashed #d8ccbd; }

/* ============ CELEBRATIONS ============ */
.confetti-layer { position: fixed; inset: 0; pointer-events: none; z-index: 90; overflow: hidden; }
.confetti-p {
  position: absolute; top: -14px; width: 9px; height: 14px;
  animation: confetti-fall linear forwards;
}
@keyframes confetti-fall {
  0% { transform: translateY(-10px) rotate(0deg); opacity: 1; }
  85% { opacity: 1; }
  100% { transform: translateY(105vh) rotate(680deg); opacity: 0; }
}
.confirm-hero .big.pop { animation: hero-pop .7s cubic-bezier(.2, 1.4, .4, 1); }
@keyframes hero-pop {
  0% { transform: scale(.3); }
  55% { transform: scale(1.15); }
  100% { transform: scale(1); }
}
.cart-bar.bump { animation: cart-bump .35s cubic-bezier(.3, 1.6, .5, 1); }
@keyframes cart-bump {
  0% { transform: scale(1); }
  40% { transform: scale(1.045); }
  100% { transform: scale(1); }
}
.step.current .dot-lg { animation: dot-glow 1.6s ease-in-out infinite; }
@keyframes dot-glow {
  0%, 100% { box-shadow: 0 0 0 4px color-mix(in srgb, var(--accent) 14%, transparent); }
  50% { box-shadow: 0 0 0 8px color-mix(in srgb, var(--accent) 7%, transparent); }
}

/* ============ PRECISE LOCATION ============ */
.loc-block {
  background: #fbf9f6; border: 1.5px solid var(--line); border-radius: 16px;
  padding: 13px; margin-top: 4px;
}
.loc-head { display: flex; align-items: center; justify-content: space-between; gap: 10px; margin-bottom: 10px; }
.loc-title { font-size: 13px; font-weight: 800; }
.loc-acc { font-size: 11.5px; font-weight: 700; color: var(--muted); }
.loc-acc.good { color: #1a8a4a; }
.loc-acc.rough { color: #b45309; }
.loc-map-wrap { position: relative; border-radius: 13px; overflow: hidden; border: 1px solid var(--line); }
#loc-map { height: 225px; width: 100%; background: #ece7df; }
.loc-empty {
  position: absolute; inset: 0; display: grid; place-items: center; text-align: center;
  background: linear-gradient(140deg, #f3ede4, #e7dfd3); color: var(--muted);
  font-size: 12.5px; font-weight: 600; padding: 16px; z-index: 400; pointer-events: none;
}
.loc-actions { display: flex; align-items: center; gap: 11px; margin-top: 11px; flex-wrap: wrap; }
.loc-btn {
  display: inline-flex; align-items: center; gap: 7px; padding: 11px 18px; border-radius: 999px;
  font-weight: 800; font-size: 13px; background: var(--accent); color: var(--accent-ink);
  box-shadow: 0 4px 12px color-mix(in srgb, var(--accent) 30%, transparent);
}
.loc-hint { font-size: 11.5px; color: var(--muted); font-weight: 600; flex: 1; min-width: 120px; }
.leaflet-container { font-family: var(--font-body); }
#loc-map img { max-width: none; } /* Google Maps tiles must not inherit our img rules */

/* address read back from the pin */
.addr-auto { display: none; font-size: 12px; font-weight: 650; color: var(--muted); margin-top: 9px; line-height: 1.4; }
.addr-auto.show { display: block; }
.addr-auto.ok { color: #1a8a4a; }
input.autofilled {
  animation: autofill-flash 1.2s ease;
}
@keyframes autofill-flash {
  0% { background: #fff6dd; border-color: var(--gold, #c9a35a); }
  100% { background: #fff; }
}

/* saved addresses */
.sa-label { font-size: 11.5px; font-weight: 800; color: var(--muted); text-transform: uppercase; letter-spacing: .5px; margin-bottom: 7px; }
.sa-row { display: flex; gap: 7px; flex-wrap: wrap; margin-bottom: 14px; }
.sa-chip {
  display: inline-flex; align-items: center; gap: 6px; font-size: 12.5px; font-weight: 700;
  background: #fff; border: 1.5px solid var(--line); border-radius: 999px; padding: 8px 14px;
  box-shadow: var(--shadow-sm);
}
.sa-chip .ic { width: 13px; height: 13px; }
.sa-chip.active { border-color: var(--accent); background: var(--soft); color: var(--accent); }
.sa-dot { width: 6px; height: 6px; border-radius: 50%; background: #1a8a4a; }

/* ============ AUTH ============ */
.auth-card {
  background: var(--card); border: 1px solid var(--line); border-radius: var(--r-lg);
  padding: 26px 22px 22px; box-shadow: var(--shadow-md);
}
.auth-hero { text-align: center; margin-bottom: 20px; }
.auth-badge {
  display: inline-block; font-size: 10px; font-weight: 800; letter-spacing: 3px;
  color: var(--lux); margin-bottom: 10px;
}
.auth-logo { display: block; width: 168px; max-width: 62%; height: auto; margin: 0 auto 14px; }
.auth-hero h2 { font-family: var(--font-display); font-size: 22px; font-weight: 800; line-height: 1.2; }
.auth-hero p { font-size: 13.5px; color: var(--muted); margin-top: 8px; }
.auth-back {
  font-size: 12.5px; font-weight: 700; color: var(--muted); margin-bottom: 12px;
  display: inline-flex; align-items: center; gap: 5px;
}
.pin-wrap { position: relative; }
.pin-wrap input { padding-right: 66px !important; letter-spacing: 4px; font-weight: 700; }
.pin-eye {
  position: absolute; right: 10px; top: 50%; transform: translateY(-50%);
  font-size: 11.5px; font-weight: 800; color: var(--accent); padding: 6px 8px; border-radius: 8px;
  background: var(--soft);
}
.auth-forgot { width: 100%; margin-top: 12px; font-size: 12.5px; font-weight: 700; color: var(--muted); text-decoration: underline; text-underline-offset: 3px; }
.error-msg.info { background: #f0f6ff; border-color: #c9dcf7; color: #1d5cc2; }

/* StarPass strip on home */
.starpass-strip {
  display: flex; align-items: center; gap: 12px; width: 100%; text-align: left;
  background: linear-gradient(100deg, #241c17, #43301c 130%); color: #f2e3c8;
  border: 1px solid #3a2a1c; border-radius: var(--r-md); padding: 14px 16px; margin-bottom: 14px;
  box-shadow: var(--shadow-md); font-weight: 700; font-size: 13.5px;
}
.starpass-strip .sp-ico { display: grid; place-items: center; width: 32px; height: 32px; border-radius: 10px; background: rgba(233,198,126,.15); color: #e9c67e; flex-shrink: 0; }
.starpass-strip .sp-coin { width: 32px; height: 32px; flex: none; filter: drop-shadow(0 2px 5px rgba(0,0,0,.4)); }
.starpass-strip .sp-txt { flex: 1; min-width: 0; }
.starpass-strip .sp-go { color: #a08a65; font-size: 20px; }
.starpass-strip.member .sp-ico { background: linear-gradient(135deg, #e9c67e, #c9a35a); color: #241a10; }

/* map + auth on desktop */
@media (min-width: 900px) {
  #loc-map { height: 300px; }
  .auth-card { max-width: 480px; margin: 0 auto; }
}

/* Starz Points coin, inline size */
.coin-xs { display: inline-block; width: 15px; height: 15px; vertical-align: -3px; margin-left: 1px; }

/* ============ mix-ins & add-ons ============ */
.add-btn.opt.has {
  background: var(--accent); color: var(--accent-ink);
  font-size: 15px; font-weight: 800;
}
.opt-sheet { max-height: 88svh; overflow-y: auto; }
.opt-head { display: flex; gap: 14px; align-items: flex-start; margin-bottom: 6px; }
.opt-emoji { font-size: 38px; line-height: 1; flex: none; }
.opt-head h2 { font-family: var(--font-display); font-size: 21px; font-weight: 800; }
.opt-desc { font-size: 13px; color: var(--muted); margin-top: 3px; }
.opt-group { margin-top: 20px; }
.og-head { display: flex; align-items: baseline; justify-content: space-between; gap: 10px; margin-bottom: 9px; }
.og-name { font-size: 14.5px; font-weight: 800; }
.og-rule {
  font-size: 10.5px; font-weight: 800; letter-spacing: .6px; text-transform: uppercase;
  color: var(--muted); background: var(--soft); border-radius: 999px; padding: 4px 9px;
}
.og-rule.req { color: #8a5a12; background: #fdf1dc; }
.og-choices { display: grid; gap: 7px; }
.oc {
  display: flex; align-items: center; gap: 11px; width: 100%; text-align: left;
  border: 1.5px solid var(--line); border-radius: 14px; padding: 12px 14px; background: #fff;
  font-size: 14px; font-weight: 650; transition: border-color .12s ease, background .12s ease;
}
.oc:hover { border-color: #d9cdbd; }
.oc.on { border-color: var(--accent); background: var(--soft); }
.oc.off { opacity: .42; }
.oc-box {
  width: 21px; height: 21px; flex: none; border-radius: 7px; border: 1.5px solid var(--line);
  display: grid; place-items: center; background: #fff; color: var(--accent-ink);
}
.oc-box.radio { border-radius: 50%; }
.oc.on .oc-box { background: var(--accent); border-color: var(--accent); }
.oc-box .ic { width: 13px; height: 13px; }
.oc-name { flex: 1; }
.oc-price { font-size: 13px; font-weight: 800; color: var(--lux); white-space: nowrap; }
.opt-note-field { margin-top: 20px; }
.opt-note-field label { display: block; font-size: 12.5px; font-weight: 700; color: var(--muted); margin-bottom: 7px; }
.opt-note-field input {
  width: 100%; border: 1.5px solid var(--line); border-radius: 13px; padding: 13px 14px;
  font-size: 14px; background: #fff; outline: none;
}
.opt-note-field input:focus { border-color: var(--accent); }
/* Left over from when the add button sat in the page flow. In the floating
   bar it just pushed the button 18px below the quantity stepper beside it. */
#btn-opt-add { margin-top: 0; }
#btn-opt-add:disabled { opacity: .45; }
.cart-row .name { display: flex; flex-direction: column; }
.cr-opts { font-size: 11.5px; font-weight: 600; color: var(--muted); line-height: 1.35; margin-top: 2px; }

/* cancellation message shown to the customer */
.cancel-note {
  background: #fdf0f0; border: 1px solid #f3d9d9; border-radius: var(--r-md);
  padding: 16px 18px; text-align: left;
}
.cn-head { display: flex; align-items: center; gap: 8px; font-weight: 800; font-size: 14.5px; color: #a02b2b; margin-bottom: 7px; }
.cn-head .ic { width: 16px; height: 16px; }
.cancel-note p { font-size: 13.5px; color: #7a3a3a; line-height: 1.5; }
.row-opts { display: block; font-size: 11.5px; font-weight: 600; color: var(--muted); margin-top: 2px; }

/* signed-in customers: their orders, no code needed */
.track-mine { margin-bottom: 16px; }
.tm-head {
  font-size: 11.5px; font-weight: 800; text-transform: uppercase; letter-spacing: .7px;
  color: var(--muted); margin-bottom: 9px; display: flex; align-items: baseline; gap: 9px; flex-wrap: wrap;
}
.tm-head small { text-transform: none; letter-spacing: 0; font-weight: 600; font-size: 11.5px; opacity: .8; }
.tm-row {
  display: flex; align-items: center; gap: 12px; width: 100%; text-align: left;
  background: #fff; border: 1.5px solid var(--line); border-radius: 16px;
  padding: 13px 15px; margin-bottom: 8px; box-shadow: var(--shadow-sm);
}
.tm-row:hover { border-color: #d9cdbd; transform: translateY(-1px); }
.tm-code { font-family: var(--font-display); font-weight: 800; font-size: 14px; flex: none; }
.tm-mid { flex: 1; display: flex; flex-direction: column; gap: 2px; min-width: 0; }
.tm-brand { font-size: 12.5px; font-weight: 700; color: var(--muted); }
.tm-status { font-size: 12px; font-weight: 800; color: var(--lux); }
.tm-status.st-delivered { color: #1a8a4a; }
.tm-status.st-cancelled { color: #b03030; }
.tm-total { font-weight: 800; font-size: 13.5px; white-space: nowrap; }
.promo-join {
  display: inline-block; margin-left: 6px; font-weight: 800; font-size: 12.5px;
  text-decoration: underline; text-underline-offset: 3px; color: var(--accent);
}

/* product photos.
   The shop's photography is square, so the frame is square too — the product
   sits dead centre and nothing important gets cropped away. */
.item-visual.has-photo { padding: 0; overflow: hidden; height: auto; aspect-ratio: 1 / 1; }
.iv-photo { width: 100%; height: 100%; object-fit: cover; object-position: center; display: block; }
.fc-photo { width: 100%; height: auto; aspect-ratio: 1 / 1; object-fit: cover; object-position: center; border-radius: 14px; display: block; margin-bottom: 9px; }
.opt-photo { width: 54px; height: 54px; border-radius: 14px; object-fit: cover; display: block; }
.opt-emoji:has(.opt-photo) { font-size: 0; }

/* prepaid coupons — coming soon */
.coupon-soon { background: linear-gradient(150deg, #241c17, #3a2a1a); border-color: #3a2a1c; color: #f3e7d2; }
.coupon-soon h3 { color: #f7ecd8; }
.coupon-soon p { font-size: 13px; color: #cbb595; line-height: 1.5; margin-top: 10px; }
.cs-top { display: flex; align-items: center; gap: 13px; }
.cs-coin { width: 40px; height: 40px; flex: none; filter: drop-shadow(0 3px 8px rgba(0,0,0,.45)); }
.cs-badge {
  display: inline-block; margin-top: 5px; font-size: 10px; font-weight: 800; letter-spacing: 1.4px;
  text-transform: uppercase; color: #241a10; background: linear-gradient(120deg, #e9c67e, #c9a35a);
  border-radius: 999px; padding: 4px 10px;
}

/* receipt + call actions on tracking */
.track-actions { display: flex; gap: 9px; margin-top: 16px; flex-wrap: wrap; }
.ta-btn {
  flex: 1; min-width: 150px; display: inline-flex; align-items: center; justify-content: center; gap: 8px;
  border: 1.5px solid var(--line); border-radius: 14px; padding: 13px 16px; background: #fff;
  font-size: 13.5px; font-weight: 800; color: var(--ink); box-shadow: var(--shadow-sm);
}
.ta-btn:hover { border-color: #d9cdbd; transform: translateY(-1px); }
.ta-btn .ic { width: 16px; height: 16px; }
.ta-btn.call { background: var(--accent); color: var(--accent-ink); border-color: var(--accent); }

/* branches in the Help Centre */
.help-branches { margin-bottom: 20px; }
.hb-label { font-size: 11.5px; font-weight: 800; text-transform: uppercase; letter-spacing: .7px; color: var(--muted); margin-bottom: 9px; }
.hb-row {
  display: flex; align-items: center; gap: 12px; background: #fff; border: 1.5px solid var(--line);
  border-radius: 16px; padding: 12px 14px; margin-bottom: 8px; box-shadow: var(--shadow-sm);
}
.hb-logo { width: 40px; height: 40px; border-radius: 12px; overflow: hidden; background: #fff; border: 1px solid var(--line); flex: none; }
.hb-logo img { width: 100%; height: 100%; object-fit: contain; padding: 3px; }
.hb-mid { flex: 1; display: flex; flex-direction: column; gap: 2px; min-width: 0; }
.hb-name { font-weight: 800; font-size: 14px; }
.hb-addr { font-size: 12px; color: var(--muted); font-weight: 600; }
.hb-call {
  width: 42px; height: 42px; flex: none; border-radius: 50%; display: grid; place-items: center;
  background: var(--accent); color: var(--accent-ink); box-shadow: 0 4px 12px rgba(0,0,0,.14);
}
.hb-call .ic { width: 18px; height: 18px; }


/* ============================================================
   BRAND WORLDS
   Each brand's pages are designed as its own little storefront:
   its own paper, masthead, patterns, section dividers, card
   shapes, buttons and cart bar. Nothing here is shared.
   ============================================================ */

/* the masthead gets room for artwork and a decorative bottom edge */
.brand-band { padding: 22px 20px 26px; }
.bb-art { position: absolute; inset: 0; z-index: 0; pointer-events: none; }
.bb-edge { position: absolute; left: 0; right: 0; bottom: 0; height: 14px; z-index: 2; pointer-events: none; }
.bb-eyebrow {
  display: block; font-size: 10px; font-weight: 800; letter-spacing: 2.6px;
  text-transform: uppercase; opacity: .72; margin-bottom: 5px;
}
.brand-band .brand-logo { z-index: 1; }

/* ------------------------------------------------------------
   COLD STONE CREAMERY — the parlour
   Burgundy & cream, waffle-cone lattice, scalloped scoop edges,
   italic serif headings with a cream awning stripe.
   ------------------------------------------------------------ */
.brand-band.coldstone { border-radius: 28px 28px 22px 22px; }
.brand-band.coldstone .bb-art {
  background:
    repeating-linear-gradient(45deg, rgba(255,240,225,.10) 0 2px, transparent 2px 16px),
    repeating-linear-gradient(-45deg, rgba(255,240,225,.10) 0 2px, transparent 2px 16px),
    radial-gradient(220px 160px at 84% 12%, rgba(255,214,180,.28), transparent 70%);
}
/* scalloped rim, like the top of a scoop */
.brand-band.coldstone .bb-edge {
  height: 13px;
  background: radial-gradient(circle at 9px -2px, #fcf5f3 9px, transparent 9.5px) repeat-x 0 0 / 18px 13px;
}
body[data-brand="coldstone"] .cat-heading {
  font-family: var(--font-display); font-style: italic; font-weight: 700;
  font-size: 19px; letter-spacing: -.2px; color: #6f1120;
  display: flex; align-items: center; gap: 11px;
}
body[data-brand="coldstone"] .cat-heading::after {
  content: ''; flex: 1; height: 5px; border-radius: 5px;
  background: repeating-linear-gradient(90deg, #9e1b32 0 9px, transparent 9px 17px);
  opacity: .35;
}
body[data-brand="coldstone"] .item-card {
  border-radius: 24px; border-color: #f0dcdd;
  box-shadow: 0 1px 2px rgba(111,17,32,.05), 0 10px 26px rgba(111,17,32,.07);
}
body[data-brand="coldstone"] .item-visual {
  border-radius: 20px 20px 4px 4px;
  background: linear-gradient(160deg, #fdf0f2, #f8e2e5);
  -webkit-mask: radial-gradient(circle at 10px 100%, transparent 9px, #000 9.5px) repeat-x 0 100% / 20px 12px, linear-gradient(#000 0 0) no-repeat 0 0 / 100% calc(100% - 11px);
  mask: radial-gradient(circle at 10px 100%, transparent 9px, #000 9.5px) repeat-x 0 100% / 20px 12px, linear-gradient(#000 0 0) no-repeat 0 0 / 100% calc(100% - 11px);
}
body[data-brand="coldstone"] .item-badge { background: #9e1b32; color: #fff3ef; border-radius: 999px; }
body[data-brand="coldstone"] .add-btn { border-radius: 50%; box-shadow: 0 0 0 3px #fdeaee; }
body[data-brand="coldstone"] .cat-tab { border-radius: 999px; }
body[data-brand="coldstone"] .cart-bar { border-radius: 999px; }

/* ------------------------------------------------------------
   WACCAO — the waffle house
   Golden batter, an embossed waffle grid, square-ish chunky
   cards and cocoa-brown ink.
   ------------------------------------------------------------ */
.brand-band.waccao { border-radius: 22px; }
/* deep, embossed waffle squares */
.brand-band.waccao .bb-art {
  background:
    linear-gradient(rgba(120,74,20,.20) 3px, transparent 3px) 0 0 / 42px 42px,
    linear-gradient(90deg, rgba(120,74,20,.20) 3px, transparent 3px) 0 0 / 42px 42px,
    radial-gradient(circle at 21px 21px, rgba(255,255,255,.35) 12px, transparent 13px) 0 0 / 42px 42px;
  box-shadow: inset 0 0 40px rgba(120,74,20,.20);
}
.brand-band.waccao .bb-edge {
  height: 10px;
  background: repeating-linear-gradient(90deg, #4a2c10 0 14px, transparent 14px 28px);
  opacity: .22;
}
body[data-brand="waccao"] .cat-heading {
  font-weight: 800; font-size: 17px; letter-spacing: -.3px; color: #5a3512;
  display: flex; align-items: center; gap: 10px;
}
body[data-brand="waccao"] .cat-heading::before {
  content: ''; width: 15px; height: 15px; flex: none; border-radius: 4px;
  background:
    linear-gradient(rgba(90,53,18,.55) 1.5px, transparent 1.5px) 0 0 / 7.5px 7.5px,
    linear-gradient(90deg, rgba(90,53,18,.55) 1.5px, transparent 1.5px) 0 0 / 7.5px 7.5px,
    #f0ad00;
}
body[data-brand="waccao"] .cat-heading::after {
  content: ''; flex: 1; height: 2px; background: rgba(90,53,18,.16); border-radius: 2px;
}
body[data-brand="waccao"] .item-card {
  border-radius: 18px; border: 2px solid #ecd9ab; background: #fffdf5;
  box-shadow: 0 2px 0 #ecd9ab, 0 10px 22px rgba(120,74,20,.08);
}
body[data-brand="waccao"] .item-visual {
  border-radius: 12px;
  background:
    linear-gradient(rgba(120,74,20,.10) 2px, transparent 2px) 0 0 / 26px 26px,
    linear-gradient(90deg, rgba(120,74,20,.10) 2px, transparent 2px) 0 0 / 26px 26px,
    linear-gradient(160deg, #fff4d4, #ffe9b0);
}
body[data-brand="waccao"] .item-badge { background: #4a2c10; color: #ffd977; border-radius: 8px; }
body[data-brand="waccao"] .add-btn { border-radius: 12px; }
body[data-brand="waccao"] .cat-tab { border-radius: 12px; }
body[data-brand="waccao"] .cat-tab.active { color: #ffd977; }
body[data-brand="waccao"] .cart-bar { border-radius: 16px; }

/* ------------------------------------------------------------
   CENSA COFFEE — the espresso bar
   Near-black roast, drifting steam, scattered beans, hairline
   rules and uppercase tracked type.
   ------------------------------------------------------------ */
.brand-band.censa { border-radius: 14px; }
.brand-band.censa .bb-art {
  background:
    /* coffee beans */
    url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='120' height='120'%3E%3Cg fill='none' stroke='%23e8d5c8' stroke-opacity='.16' stroke-width='1.6'%3E%3Cellipse cx='24' cy='30' rx='11' ry='7' transform='rotate(-28 24 30)'/%3E%3Cpath d='M15 32c4-4 12-5 18-3' /%3E%3Cellipse cx='86' cy='74' rx='11' ry='7' transform='rotate(18 86 74)'/%3E%3Cpath d='M77 73c4-4 12-4 18-2'/%3E%3Cellipse cx='58' cy='104' rx='10' ry='6.5' transform='rotate(-8 58 104)'/%3E%3C/g%3E%3C/svg%3E"),
    /* steam */
    url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='200' height='120'%3E%3Cg fill='none' stroke='%23ffffff' stroke-opacity='.07' stroke-width='2' stroke-linecap='round'%3E%3Cpath d='M150 100c-8-14 8-20 0-34s8-20 0-34'/%3E%3Cpath d='M170 104c-8-14 8-20 0-34s8-20 0-34'/%3E%3C/g%3E%3C/svg%3E") right -10px top -6px no-repeat,
    radial-gradient(200px 150px at 88% 8%, rgba(207,31,31,.20), transparent 70%);
}
.brand-band.censa .bb-edge { height: 3px; background: linear-gradient(90deg, #cf1f1f, rgba(207,31,31,0)); }
body[data-brand="censa"] .cat-heading {
  text-transform: uppercase; letter-spacing: 2.4px; font-size: 12px; font-weight: 800;
  font-family: var(--font-body); color: #3a2a22;
  display: flex; align-items: center; gap: 10px;
}
body[data-brand="censa"] .cat-heading::before {
  content: ''; width: 7px; height: 7px; flex: none; border-radius: 50%; background: #cf1f1f;
}
body[data-brand="censa"] .cat-heading::after {
  content: ''; flex: 1; height: 1px; background: rgba(58,42,34,.18);
}
body[data-brand="censa"] .item-card {
  border-radius: 12px; border-color: #e6dcd4; background: #fffdfb;
  box-shadow: 0 1px 2px rgba(30,20,16,.05), 0 8px 20px rgba(30,20,16,.06);
}
body[data-brand="censa"] .item-visual {
  border-radius: 8px;
  background: linear-gradient(160deg, #efe6df, #e6dad1);
}
body[data-brand="censa"] .item-body { position: relative; }
body[data-brand="censa"] .item-badge { background: #16100d; color: #ffd9d0; border-radius: 4px; letter-spacing: .6px; }
body[data-brand="censa"] .add-btn { border-radius: 9px; }
body[data-brand="censa"] .cat-tab { border-radius: 7px; }
body[data-brand="censa"] .cart-bar { border-radius: 10px; }

/* ============ personalised messages ============ */
.msg-backdrop {
  position: fixed; inset: 0; z-index: 60; display: none;
  background: rgba(24,16,10,.55); backdrop-filter: blur(3px);
  align-items: center; justify-content: center; padding: 22px;
}
.msg-backdrop.show { display: flex; animation: fadein .2s ease; }
.msg-card {
  position: relative; width: 100%; max-width: 380px; text-align: center;
  background: var(--card); border-radius: 26px; padding: 30px 24px 24px;
  box-shadow: var(--shadow-lg); animation: rise .3s cubic-bezier(.2,.7,.2,1);
}
.msg-card.kind-tier, .msg-card.kind-reward, .msg-card.kind-almost {
  background: linear-gradient(165deg, #241c17, #3a2a1a);
  color: #f6ead4; border: 1px solid #4a3722;
}
.msg-card.kind-tier p, .msg-card.kind-reward p, .msg-card.kind-almost p { color: #cdb794; }
.msg-close {
  position: absolute; top: 12px; right: 14px; width: 32px; height: 32px; border-radius: 50%;
  font-size: 15px; color: var(--muted); background: rgba(0,0,0,.06);
}
.msg-card.kind-tier .msg-close, .msg-card.kind-reward .msg-close, .msg-card.kind-almost .msg-close {
  color: #cdb794; background: rgba(255,255,255,.08);
}
.msg-art { display: grid; place-items: center; margin-bottom: 14px; }
.msg-art img { width: 66px; height: 66px; filter: drop-shadow(0 5px 14px rgba(0,0,0,.4)); }
.msg-art .ic { width: 40px; height: 40px; color: var(--lux); }
.msg-card h2 { font-family: var(--font-display); font-size: 23px; font-weight: 800; line-height: 1.2; }
.msg-card p { font-size: 14px; color: var(--muted); margin-top: 9px; line-height: 1.5; }
.msg-code {
  display: inline-block; margin-top: 14px; font-weight: 800; letter-spacing: 2px; font-size: 14px;
  border: 1.5px dashed var(--lux); color: var(--lux); border-radius: 11px; padding: 9px 16px;
}
.msg-card .primary-btn { margin-top: 20px; }
.msg-more {
  display: block; width: 100%; margin-top: 10px; font-size: 13px; font-weight: 700;
  color: var(--muted); text-decoration: underline; text-underline-offset: 3px; padding: 6px;
}
.msg-card.kind-tier .msg-more, .msg-card.kind-reward .msg-more, .msg-card.kind-almost .msg-more { color: #e0c894; }

/* inbox on the account screen */
.msg-inbox h3 { margin-bottom: 10px; }
.mi-row {
  display: flex; align-items: center; gap: 12px; width: 100%; text-align: left;
  padding: 11px 0; border-bottom: 1px solid var(--line);
}
.mi-row:last-child { border-bottom: none; }
.mi-ico { width: 34px; height: 34px; flex: none; display: grid; place-items: center; }
.mi-ico img { width: 32px; height: 32px; }
.mi-ico .ic { width: 19px; height: 19px; color: var(--lux); }
.mi-mid { flex: 1; display: flex; flex-direction: column; gap: 2px; min-width: 0; }
.mi-mid b { font-size: 13.5px; font-weight: 800; }
.mi-mid small {
  font-size: 12px; color: var(--muted); font-weight: 600; line-height: 1.35;
  display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden;
}
.mi-code { font-size: 11.5px; font-weight: 800; letter-spacing: 1px; color: var(--lux); border: 1.5px dashed var(--lux); border-radius: 8px; padding: 5px 8px; white-space: nowrap; }
.mi-go { color: var(--muted); font-size: 20px; }

/* ============================================================
   BRAND SCENERY
   A drawn backdrop for each brand: a big line illustration at
   the top of the page and a scattered motif behind everything.
   Both are plain background layers, so scrolling stays smooth.
   ============================================================ */
body[data-brand="coldstone"] {
  background:
    url("data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20width='420'%20height='520'%20fill='none'%20stroke='%239e1b32'%20stroke-opacity='.10'%20stroke-width='7'%20stroke-linecap='round'%20stroke-linejoin='round'%3E%20%3Cpath%20d='M150%20300l60%20170%2060-170'/%3E%20%3Cpath%20d='M150%20300h120'/%3E%20%3Cpath%20d='M168%20336l84%200M182%20372l56%200'/%3E%20%3Ccircle%20cx='210'%20cy='262'%20r='46'/%3E%3Ccircle%20cx='166'%20cy='232'%20r='40'/%3E%3Ccircle%20cx='254'%20cy='232'%20r='40'/%3E%20%3Ccircle%20cx='210'%20cy='196'%20r='42'/%3E%20%3Cpath%20d='M210%20154v-26M210%20128l-12%2012M210%20128l12%2012'/%3E%20%3C/svg%3E") no-repeat right -90px top 90px / 400px auto,
    url("data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20width='150'%20height='150'%3E%20%3Cg%20stroke='%239e1b32'%20stroke-opacity='.13'%20stroke-width='4'%20stroke-linecap='round'%3E%20%3Cpath%20d='M22%2026l10-6'/%3E%3Cpath%20d='M96%2052l9%207'/%3E%3Cpath%20d='M56%2096l-8%208'/%3E%3Cpath%20d='M124%20112l6-10'/%3E%20%3Cpath%20d='M38%20128l10%203'/%3E%3Cpath%20d='M110%2020l4%2011'/%3E%20%3C/g%3E%20%3Cg%20fill='none'%20stroke='%239e1b32'%20stroke-opacity='.09'%20stroke-width='2.6'%20stroke-linejoin='round'%3E%20%3Cpath%20d='M70%2044l7%2020%207-20z'/%3E%3Ccircle%20cx='77'%20cy='40'%20r='7'/%3E%20%3C/g%3E%20%3C/svg%3E") repeat 0 0 / 150px 150px,
    radial-gradient(1000px 460px at 50% -180px, #fdeef1 0%, transparent 72%) no-repeat,
    linear-gradient(180deg, #fcf5f3 0%, #f6ece9 100%) no-repeat;
}
body[data-brand="waccao"] {
  background:
    url("data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20width='440'%20height='520'%20fill='none'%20stroke='%236f4518'%20stroke-opacity='.10'%20stroke-width='7'%20stroke-linejoin='round'%3E%20%3Crect%20x='120'%20y='250'%20width='210'%20height='58'%20rx='16'/%3E%20%3Crect%20x='104'%20y='190'%20width='240'%20height='62'%20rx='18'/%3E%20%3Cpath%20d='M104%20220h240M164%20190v62M224%20190v62M284%20190v62'/%3E%20%3Cpath%20d='M120%20280h210M170%20250v58M230%20250v58M280%20250v58'/%3E%20%3Cpath%20d='M196%20172h56v-22h-56z'/%3E%20%3Cpath%20d='M150%20320c0%2022%2014%2026%2014%2044a14%2014%200%200%201-28%200c0-18%2014-22%2014-44z'/%3E%20%3C/svg%3E") no-repeat right -100px top 80px / 420px auto,
    url("data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20width='140'%20height='140'%3E%20%3Cg%20fill='none'%20stroke='%236f4518'%20stroke-opacity='.10'%20stroke-width='3'%3E%20%3Crect%20x='16'%20y='18'%20width='34'%20height='34'%20rx='7'/%3E%3Cpath%20d='M33%2018v34M16%2035h34'/%3E%20%3Crect%20x='88'%20y='84'%20width='30'%20height='30'%20rx='6'/%3E%3Cpath%20d='M103%2084v30M88%2099h30'/%3E%20%3C/g%3E%20%3Cg%20fill='none'%20stroke='%236f4518'%20stroke-opacity='.09'%20stroke-width='2.6'%3E%20%3Cpath%20d='M98%2026c0%209%206%2011%206%2019a6%206%200%200%201-12%200c0-8%206-10%206-19z'/%3E%20%3Cpath%20d='M34%20100c0%208%205%2010%205%2017a5%205%200%200%201-10%200c0-7%205-9%205-17z'/%3E%20%3C/g%3E%20%3C/svg%3E") repeat 0 0 / 140px 140px,
    radial-gradient(1000px 460px at 50% -180px, #fff3cf 0%, transparent 72%) no-repeat,
    linear-gradient(180deg, #fffbee 0%, #f7efd9 100%) no-repeat;
}
body[data-brand="censa"] {
  background:
    url("data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20width='420'%20height='520'%20fill='none'%20stroke='%23231814'%20stroke-opacity='.09'%20stroke-width='7'%20stroke-linecap='round'%20stroke-linejoin='round'%3E%20%3Cpath%20d='M148%20250h124l-16%20190a18%2018%200%200%201-18%2016h-56a18%2018%200%200%201-18-16z'/%3E%20%3Crect%20x='138'%20y='222'%20width='144'%20height='34'%20rx='10'/%3E%20%3Cpath%20d='M160%20306h100'/%3E%20%3Cpath%20d='M186%20190c-14-20%2012-28%200-48s12-28%200-48'/%3E%20%3Cpath%20d='M234%20190c-14-20%2012-28%200-48s12-28%200-48'/%3E%20%3C/svg%3E") no-repeat right -80px top 86px / 380px auto,
    url("data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20width='150'%20height='150'%3E%20%3Cg%20fill='none'%20stroke='%23231814'%20stroke-opacity='.10'%20stroke-width='2.8'%3E%20%3Cellipse%20cx='34'%20cy='40'%20rx='15'%20ry='9.5'%20transform='rotate(-28%2034%2040)'/%3E%20%3Cpath%20d='M22%2043c5-6%2016-7%2024-4'/%3E%20%3Cellipse%20cx='112'%20cy='96'%20rx='15'%20ry='9.5'%20transform='rotate(16%20112%2096)'/%3E%20%3Cpath%20d='M100%2095c5-6%2016-6%2024-3'/%3E%20%3Cellipse%20cx='70'%20cy='132'%20rx='13'%20ry='8'%20transform='rotate(-6%2070%20132)'/%3E%20%3Cpath%20d='M59%20132c5-5%2014-5%2021-2'/%3E%20%3C/g%3E%20%3C/svg%3E") repeat 0 0 / 150px 150px,
    radial-gradient(1000px 460px at 50% -180px, #f6e9e6 0%, transparent 72%) no-repeat,
    linear-gradient(180deg, #f8f3ef 0%, #efe8e2 100%) no-repeat;
}

/* jumping to a dish from the homepage rail — a brief ring so you see where you landed */
.item-card.flash { animation: card-flash 1.4s ease; }
@keyframes card-flash {
  0%, 100% { box-shadow: var(--shadow-sm); }
  25%, 65% { box-shadow: 0 0 0 3px var(--accent), var(--shadow-md); }
}
/* design A hides the number by default so B and the old layout stay clean */
.poster-no { display: none; }


/* ============================================================================
   APP HOME — product-forward, card-based, with a floating tab bar.
   Cool light-grey canvas, generous corner radii, one high-energy accent (lime)
   reserved for actions and prices. Brand colour lives on the brand cards only.
   Every art box is a photo slot: set .bc-photo / .pc-photo src and unhide it.
   ========================================================================== */
:root {
  --app-bg: #eef0ea;
  --app-card: #ffffff;
  --lime: #d6ef4a;
  --lime-ink: #1b2007;
  --r-card: 22px;
  --r-pill: 999px;
}
body { background: var(--app-bg); }
#view-home { padding-bottom: 116px; }   /* room for the floating tab bar */

/* ---- top row ---- */
.app-top {
  position: sticky; top: 0; z-index: 40;
  display: flex; align-items: center; justify-content: space-between; gap: 12px;
  margin: -18px -18px 0; padding: calc(env(safe-area-inset-top, 0px) + 12px) 18px 12px;
  background: color-mix(in srgb, var(--app-bg) 86%, transparent);
  -webkit-backdrop-filter: blur(14px); backdrop-filter: blur(14px);
  transition: box-shadow .25s ease;
}
.app-top.stuck { box-shadow: 0 10px 24px -20px rgba(20,24,10,.55); }
.at-user { display: flex; align-items: center; gap: 9px; min-width: 0; padding: 4px 8px 4px 4px; border-radius: var(--r-pill); }
/* the chevron is the only thing telling people the balance is a door */
.at-chev { width: 15px; height: 15px; flex: none; color: #9aa38c; margin-left: -2px; }
.at-user:active .at-chev { color: var(--ink); }
.at-user:active { background: rgba(20,24,10,.05); }
.at-coin { width: 38px; height: 38px; flex: none; }
.at-user-txt { display: flex; flex-direction: column; align-items: flex-start; line-height: 1.2; min-width: 0; }
.at-user-txt small { font-size: 11px; font-weight: 600; color: #7c8470; }
.at-user-txt b { font-size: 14.5px; font-weight: 800; color: var(--ink); white-space: nowrap; }
.at-actions { display: flex; align-items: center; gap: 8px; }
.at-btn {
  position: relative; width: 42px; height: 42px; border-radius: 15px;
  display: grid; place-items: center; background: var(--app-card); color: var(--ink);
  box-shadow: 0 1px 2px rgba(20,24,10,.05);
}
.at-btn svg { width: 19px; height: 19px; }
.at-lang { font-size: 12px; font-weight: 800; letter-spacing: .04em; }
.at-btn:active { transform: scale(.94); }
.at-dot {
  position: absolute; top: 9px; right: 9px; width: 8px; height: 8px; border-radius: 999px;
  background: #ff4d3d; box-shadow: 0 0 0 2.5px var(--app-card);
}

/* ---- headline + search ---- */
.app-h1 {
  font-family: var(--font-body); font-weight: 800;
  font-size: clamp(27px, 7.6vw, 34px); line-height: 1.12; letter-spacing: -.03em;
  margin: 22px 0 18px; color: var(--ink);
}
.searchbar {
  display: flex; align-items: center; gap: 11px;
  background: var(--app-card); border-radius: var(--r-pill); padding: 0 16px; height: 52px;
  box-shadow: 0 1px 2px rgba(20,24,10,.05);
}
.searchbar .sb-ico { width: 19px; height: 19px; color: #8d9585; flex: none; }
.searchbar input {
  flex: 1; min-width: 0; border: 0; background: none; outline: none;
  font-size: 14.5px; font-weight: 500; color: var(--ink);
}
.searchbar input::placeholder { color: #9aa292; font-weight: 500; }
.searchbar input::-webkit-search-cancel-button { display: none; }
.sb-clear { width: 26px; height: 26px; border-radius: 999px; background: #eef0ea; color: #6f7767; font-size: 17px; line-height: 1; flex: none; }

.q-results { margin-top: 12px; display: grid; gap: 8px; }
.q-empty { padding: 22px 4px; color: var(--muted); font-size: 13.5px; }

/* ---- section heads ---- */
.sec-head { display: flex; align-items: baseline; justify-content: space-between; gap: 12px; margin: 26px 0 13px; }
.sec-head h2 { font-size: 17px; font-weight: 800; letter-spacing: -.02em; color: var(--ink); }
.sec-head .sec-more { font-size: 12.5px; font-weight: 700; color: #7c8470; }

/* ---- StarzClub card ---- */
.pass-card {
  display: flex; align-items: center; gap: 13px; width: 100%; text-align: left;
  margin-top: 20px; padding: 15px 17px; border-radius: var(--r-card);
  background: linear-gradient(118deg, #1e2412 0%, #2c3418 58%, #3c4a1c 100%);
  color: #f2f6e2; box-shadow: 0 10px 24px -18px rgba(20,24,10,.9);
}
.pass-card .sp-coin { width: 40px; height: 40px; flex: none; }
.pass-card .sp-txt { flex: 1; min-width: 0; font-size: 13.5px; line-height: 1.35; }
.pass-card .sp-txt b { font-weight: 800; }
.pass-card .sp-go {
  width: 30px; height: 30px; border-radius: 999px; flex: none;
  display: grid; place-items: center; background: var(--lime); color: var(--lime-ink);
  font-size: 15px; font-weight: 800;
}
.pass-card:active { transform: scale(.99); }

/* ---- brand cards ----
   The card IS the logo — no caption, because every one of these marks already
   carries its own name. A product photo shrunk to 110px reads as brown mush;
   a logo is recognised instantly. The name lives on in `alt` for screen
   readers, which is the only place it was still doing work. */
.brand-rail { display: grid; grid-template-columns: repeat(3, 1fr); gap: 10px; }
.brand-card {
  position: relative; display: block; min-width: 0;
  aspect-ratio: 3 / 4; border-radius: 20px; overflow: hidden;
  background: var(--bc-tint, #f1f3ec);
  box-shadow: 0 6px 16px -10px rgba(20,24,10,.5);
}
.brand-card:active { transform: scale(.97); }
.bc-photo { display: block; width: 100%; height: 100%; object-fit: cover; }
/* each tint matches its tile, so the rounded corners never show a seam */
.brand-card.coldstone { --bc-tint: #fcebed; }
.brand-card.waccao    { --bc-tint: #fdc22a; }
.brand-card.censa     { --bc-tint: #f4ebe4; }

/* ---- product cards ----
   The photograph is the card: it fills the whole panel, a bottom scrim keeps
   the name and price legible over it, and the + sits in the bottom corner.
   Items with no photo fall back to a tinted panel with a big emoji.        */
.pc-rail {
  display: flex; gap: 13px; overflow-x: auto; scroll-snap-type: x mandatory;
  margin: 0 -18px; padding: 10px 18px 22px; scroll-padding-inline: 18px;
  scrollbar-width: none; overscroll-behavior-x: contain;
}
.pc-rail::-webkit-scrollbar { display: none; }
.pc {
  /* a <button> centres its own content, so the card must be an explicit column */
  display: flex; flex-direction: column; align-items: stretch; justify-content: flex-end;
  position: relative; flex: 0 0 218px; scroll-snap-align: start; text-align: left;
  height: 278px; padding: 16px 16px 15px;
  border-radius: 26px;
  background: var(--pc-tint); color: #15120e;
  overflow: hidden;
  transition: transform .18s ease;
}
.pc:active { transform: scale(.975); }

/* the photo fills the panel edge to edge, behind everything */
.pc-art {
  position: absolute; inset: 0; z-index: 0; display: grid; place-items: center;
  font-size: 96px; line-height: 1; pointer-events: none;
}
.pc-art img { width: 100%; height: 100%; object-fit: cover; object-position: center; display: block; }
/* with no photo the emoji sits above the text instead of behind it */
.pc:not(.has-photo) .pc-art { inset: 30px 0 96px 0; }

/* scrim: only on photo cards, so emoji cards keep their clean tint */
.pc.has-photo::after {
  content: ''; position: absolute; inset: 0; z-index: 1; pointer-events: none;
  background: linear-gradient(to top,
    rgba(10,7,4,.90) 0%, rgba(10,7,4,.68) 26%, rgba(10,7,4,.22) 55%, rgba(10,7,4,0) 82%);
}

.pc-txt { display: block; position: relative; z-index: 2; }
.pc-name {
  display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden;
  font-size: 19px; font-weight: 800; line-height: 1.12; letter-spacing: -.02em;
  overflow-wrap: anywhere; hyphens: none;
}
.pc-meta, .pc-price { display: block; line-height: 1.4; }
.pc-meta {
  display: -webkit-box; -webkit-line-clamp: 1; -webkit-box-orient: vertical; overflow: hidden;
  font-size: 11.5px; font-weight: 600; letter-spacing: .04em; text-transform: uppercase;
  color: rgba(21,18,14,.5); margin-bottom: 5px; order: -1;
}
.pc-price { font-size: 14.5px; font-weight: 700; margin-top: 4px; color: rgba(21,18,14,.66); }
/* meta sits above the name, so the text block is a column */
.pc-txt { display: flex; flex-direction: column; }

/* over a photograph the type turns white and picks up a soft shadow */
.pc.has-photo { color: #fff; }
.pc.has-photo .pc-name { text-shadow: 0 1px 14px rgba(0,0,0,.55); }
.pc.has-photo .pc-meta { color: rgba(255,255,255,.72); }
.pc.has-photo .pc-price { color: #fff; text-shadow: 0 1px 12px rgba(0,0,0,.5); }

/* the + lives in the top corner so the name below it gets the full width */
.pc-add {
  position: absolute; right: 12px; top: 12px; z-index: 3;
  width: 44px; height: 44px; border-radius: 50%; display: grid; place-items: center;
  background: var(--pc-pop); color: #fff;
  box-shadow: 0 8px 20px -8px rgba(10,7,4,.6);
}
.pc-add svg { width: 23px; height: 23px; }

/* warm, saturated grounds in the spirit of the reference, one per house */
.pc[data-brand="coldstone"] { --pc-tint: #f9d9d5; --pc-pop: #ec7159; }
.pc[data-brand="waccao"]    { --pc-tint: #fbe3c4; --pc-pop: #ef8a2c; }
.pc[data-brand="censa"]     { --pc-tint: #f6ded2; --pc-pop: #e2704a; }

/* ---- wide list rows (search results + today's picks) ---- */
.pl {
  display: flex; align-items: center; gap: 13px; width: 100%; text-align: left;
  background: var(--app-card); border-radius: 18px; padding: 9px 13px 9px 9px;
  box-shadow: 0 1px 2px rgba(20,24,10,.05);
}
.pl:active { transform: scale(.99); }
.pl-art {
  position: relative; width: 62px; height: 62px; flex: none; border-radius: 14px; overflow: hidden;
  background: var(--pc-tint, #f1f3ec); display: grid; place-items: center; font-size: 27px;
}
.pl-art img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; }
.pl-mid { flex: 1; min-width: 0; display: block; }
.pl-brand { display: block; font-size: 9.5px; font-weight: 800; letter-spacing: .09em; text-transform: uppercase; color: #97a08c; }
.pl-name { display: block; font-size: 14px; font-weight: 750; color: var(--ink); margin-top: 3px; line-height: 1.3; overflow-wrap: anywhere; }
.pl-price { display: block; font-size: 13px; font-weight: 800; color: var(--ink); margin-top: 4px; }
.pl-go {
  width: 32px; height: 32px; border-radius: 999px; flex: none; display: grid; place-items: center;
  background: var(--lime); color: var(--lime-ink); font-size: 18px; font-weight: 700; line-height: 1;
}

/* ---- sold out ----
   The item keeps its place on the shelf but stops asking to be tapped: the
   photo drains, the price stays (people still want to know), and one flat
   label does the talking. Nothing here should look like an error. */
.sold-out { opacity: .74; }
.sold-out .pc-art, .sold-out .pl-art, .sold-out .item-visual { filter: grayscale(.85); opacity: .72; }
.item-card.sold-out { cursor: default; }
.oos-flag {
  position: absolute; top: 10px; left: 10px; z-index: 3;
  padding: 4px 9px; border-radius: 999px; background: rgba(26,23,16,.82); color: #fff;
  font-size: 10px; font-weight: 800; letter-spacing: .02em; text-transform: uppercase;
}
.oos-tag {
  padding: 6px 10px; border-radius: 999px; background: #eceade; color: #6e6a5e;
  font-size: 10.5px; font-weight: 800; white-space: nowrap; flex: none;
}
/* on a narrow card the price and the label share the row rather than clipping */
.item-card.sold-out .item-foot { flex-wrap: wrap; row-gap: 6px; }
.item-card.sold-out .item-foot .price { font-size: 14px; }
/* a "Bestseller" ribbon on something you cannot buy just reads as a tease */
.item-card.sold-out .item-badge { display: none; }
.pl-oos { margin-left: 8px; font-size: 11px; font-weight: 800; color: #8a857e; }
.branch-warn {
  margin-top: 8px; padding: 10px 13px; border-radius: 12px;
  background: #fdf3e2; color: #8a5a12; font-size: 12.5px; font-weight: 700; line-height: 1.4;
}
#view-item.sold-out .ip-art, #view-item.sold-out #ip-art { filter: grayscale(.85); opacity: .75; }
#view-item.sold-out .ip-qty, #view-item.sold-out .ip-add-ico,
#view-item.sold-out .ip-note-field, #view-item.sold-out #opt-groups { display: none; }
#view-item.sold-out .ip-add { background: #e6e3d8; color: #6e6a5e; box-shadow: none; justify-content: center; }

/* ---- store line ---- */
.store-line {
  display: flex; align-items: center; gap: 10px; flex-wrap: wrap;
  margin-top: 30px; padding: 15px 17px; border-radius: 18px;
  background: var(--app-card); font-size: 12px; font-weight: 600; color: #7c8470;
  box-shadow: 0 1px 2px rgba(20,24,10,.05);
}
.store-line .hours-pill { background: none; border: 0; box-shadow: none; padding: 0; font-size: 12px; }

/* ---- floating tab bar ---- */
.tabbar {
  position: fixed; left: 14px; right: 14px; bottom: calc(env(safe-area-inset-bottom, 0px) + 12px);
  z-index: 45; display: none; align-items: stretch; gap: 4px;
  max-width: 532px; margin: 0 auto; padding: 7px;
  background: rgba(255,255,255,.86); border-radius: 24px;
  -webkit-backdrop-filter: saturate(180%) blur(18px); backdrop-filter: saturate(180%) blur(18px);
  box-shadow: 0 8px 30px -12px rgba(20,24,10,.35), inset 0 0 0 1px rgba(255,255,255,.7);
}
body.show-tabs .tabbar { display: flex; }
.tb {
  position: relative; flex: 1; min-width: 0;
  display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 4px;
  padding: 9px 4px; border-radius: 18px; color: #7e8674;
  font-size: 10px; font-weight: 700; letter-spacing: .01em;
  transition: background .18s ease, color .18s ease;
}
.tb svg { width: 20px; height: 20px; }
.tb.active { background: var(--ink); color: #fff; }
.tb:active { transform: scale(.96); }
.tb-dot {
  position: absolute; top: 7px; right: 50%; margin-right: -16px;
  width: 7px; height: 7px; border-radius: 999px; background: #ff4d3d;
}

/* the promo banner, restyled as an offer card */
#view-home #home-promo .promo-banner {
  border: 0; border-radius: var(--r-card); margin: 14px 0 0; padding: 15px 17px;
  background: linear-gradient(112deg, #1e2412, #38431c);
  color: #eef4dc; box-shadow: 0 10px 24px -18px rgba(20,24,10,.9);
}
#view-home #home-promo .pb-ico { color: var(--lime); }
#view-home #home-promo .pb-title { font-size: 13.5px; font-weight: 800; }
#view-home #home-promo .pb-msg { font-size: 12px; opacity: .82; }
#view-home #home-promo .pb-code {
  background: var(--lime); color: var(--lime-ink); border: 0; border-radius: var(--r-pill);
  padding: 7px 12px; font-size: 11px; font-weight: 800; letter-spacing: .06em; white-space: nowrap;
}

@media (min-width: 720px) {
  .brand-rail { gap: 14px; }
  .pc-rail { margin-inline: 0; padding-inline: 2px; }
  #view-home { padding-bottom: 130px; }
}

/* ============================================================================
   PRODUCT SCREEN
   Name and price share the top line, then an oversized piece of product art on
   a soft tinted ground with two floating pills. Options, a note, related items,
   and a lime add-to-bag bar pinned to the bottom.
   #ip-art is a photo slot — a cut-out PNG on transparent looks best here.
   ========================================================================== */
#view-item { padding-bottom: 132px; }
/* The product page keeps the brand's scenery. Stripping it back to the plain
   app canvas was what made walking from a burgundy menu into a grey-green
   product page feel like leaving the shop — the two screens are the same
   visit, so they get the same ground. Only ::before (the status-bar strip)
   is suppressed, because the photo header owns the top edge here. */

.ip-top { display: flex; align-items: center; justify-content: space-between; padding-top: 2px; }
.ip-icon {
  width: 42px; height: 42px; border-radius: 15px; display: grid; place-items: center;
  background: var(--app-card); color: var(--ink); box-shadow: 0 1px 2px rgba(20,24,10,.05);
}
.ip-icon svg { width: 19px; height: 19px; }
.ip-icon:active { transform: scale(.94); }
.ip-icon.on { background: var(--ink); color: #fff; }

.ip-head { display: flex; align-items: flex-start; justify-content: space-between; gap: 16px; margin-top: 22px; }
#ip-name {
  flex: 1; min-width: 0;
  font-size: clamp(27px, 7.4vw, 34px); font-weight: 800; line-height: 1.08;
  letter-spacing: -.035em; color: var(--ink);
}
.ip-price {
  flex: none; font-size: 19px; font-weight: 800; letter-spacing: -.02em; color: var(--ink);
  white-space: nowrap; padding-top: 4px;
}
.ip-cat {
  display: none;
  font-size: 10.5px; font-weight: 800; letter-spacing: .12em; text-transform: uppercase; color: #8b9382;
}

/* the hero: art much bigger than its box, so it reads as a cut-out */
.ip-hero {
  position: relative; margin-top: 18px; border-radius: 30px;
  aspect-ratio: 1 / .82; overflow: hidden;
  background: radial-gradient(120% 90% at 50% 18%, #fff 0%, var(--ip-tint, #f1f3ec) 72%);
  display: grid; place-items: center;
}
.ip-art { display: grid; place-items: center; width: 100%; height: 100%; font-size: clamp(120px, 40vw, 190px); line-height: 1; }
/* A photograph fills the whole hero; an emoji or cut-out floats in the middle. */
.ip-art img { width: 100%; height: 100%; object-fit: cover; border-radius: inherit; }
.ip-hero:has(img) { background: none; }
.ip-pill {
  position: absolute; z-index: 2; border-radius: var(--r-pill);
  padding: 8px 14px; font-size: 11px; font-weight: 800; letter-spacing: .02em;
  max-width: 60%; white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.ip-pill.dark { left: 16px; top: 16px; background: rgba(23,27,15,.9); color: #f2f6e2; -webkit-backdrop-filter: blur(6px); backdrop-filter: blur(6px); }
.ip-pill.lime { right: 16px; bottom: 16px; background: var(--lime); color: var(--lime-ink); }

.ip-desc { margin-top: 18px; font-size: 14px; line-height: 1.55; color: #6f7767; }

/* option groups, restyled as cards to match the rest */
#view-item .opt-group { margin-top: 24px; }
#view-item .og-head { display: flex; align-items: baseline; justify-content: space-between; gap: 10px; margin-bottom: 11px; }
#view-item .og-name { font-size: 16px; font-weight: 800; letter-spacing: -.02em; color: var(--ink); }
#view-item .og-rule {
  font-size: 10.5px; font-weight: 800; letter-spacing: .08em; text-transform: uppercase;
  color: #97a08c; background: none; border-radius: 0; padding: 0;
}
#view-item .og-rule.req { color: var(--lime-ink); background: var(--lime); border-radius: var(--r-pill); padding: 4px 10px; }
#view-item .og-choices { display: grid; gap: 8px; }
#view-item .oc {
  display: flex; align-items: center; gap: 12px; width: 100%; text-align: left;
  background: var(--app-card); border-radius: 16px; padding: 13px 15px;
  box-shadow: 0 1px 2px rgba(20,24,10,.05); border: 2px solid transparent;
}
#view-item .oc.on { border-color: var(--ink); }
#view-item .oc.off { opacity: .42; }
#view-item .oc-box {
  width: 22px; height: 22px; flex: none; border-radius: 7px; border: 2px solid #dbe0d3;
  display: grid; place-items: center; color: #fff;
}
#view-item .oc-box.radio { border-radius: 999px; }
#view-item .oc.on .oc-box { background: var(--ink); border-color: var(--ink); }
#view-item .oc-box svg { width: 12px; height: 12px; }
#view-item .oc-name { flex: 1; min-width: 0; font-size: 14px; font-weight: 650; color: var(--ink); }
#view-item .oc-price { font-size: 13px; font-weight: 800; color: #6f7767; }

.ip-note-field { margin-top: 26px; }
.ip-note-field label { display: block; font-size: 12.5px; font-weight: 700; color: #7c8470; margin-bottom: 8px; }
.ip-note-field input {
  width: 100%; height: 50px; border: 0; border-radius: 16px; padding: 0 16px;
  background: var(--app-card); font-size: 14px; color: var(--ink);
  box-shadow: 0 1px 2px rgba(20,24,10,.05);
}
.ip-note-field input:focus { outline: 2px solid var(--ink); outline-offset: -2px; }

#ip-more .pl { margin-bottom: 8px; }

/* pinned add-to-bag bar */
.ip-bar {
  position: fixed; left: 14px; right: 14px; bottom: calc(env(safe-area-inset-bottom, 0px) + 12px);
  z-index: 46; display: none; align-items: center; gap: 10px;
  max-width: 532px; margin: 0 auto;
}
body.show-item-bar .ip-bar { display: flex; }
.ip-qty {
  display: flex; align-items: center; gap: 2px; flex: none; height: 58px; padding: 0 6px;
  background: var(--app-card); border-radius: var(--r-pill);
  box-shadow: 0 8px 26px -14px rgba(20,24,10,.5);
}
.ip-qty button { width: 36px; height: 40px; font-size: 19px; font-weight: 700; color: var(--ink); }
.ip-qty button:active { opacity: .5; }
.ip-qty span { min-width: 22px; text-align: center; font-size: 15px; font-weight: 800; font-variant-numeric: tabular-nums; }
.ip-add {
  flex: 1; min-width: 0; height: 58px; display: flex; align-items: center; justify-content: space-between;
  gap: 10px; padding: 0 8px 0 18px; border-radius: var(--r-pill);
  background: var(--lime); color: var(--lime-ink);
  font-size: 14px; font-weight: 800; letter-spacing: -.015em; white-space: nowrap;
  box-shadow: 0 10px 26px -12px rgba(120,150,20,.75);
}
.ip-add:active { transform: scale(.985); }
.ip-add:disabled { background: #dfe3d8; color: #939c8b; box-shadow: none; }
.ip-add-ico {
  width: 42px; height: 42px; flex: none; border-radius: 999px; display: grid; place-items: center;
  background: var(--ink); color: var(--lime);
}
.ip-add-ico svg { width: 18px; height: 18px; }
.ip-add:disabled .ip-add-ico { background: #c3c9bb; color: #eef0ea; }

/* item tints per brand, so the hero ground matches the house */
#view-item[data-tint="coldstone"] { --ip-tint: #fbe8ec; }
#view-item[data-tint="waccao"]    { --ip-tint: #fdf3d6; }
#view-item[data-tint="censa"]     { --ip-tint: #f5eae7; }

/* ============ CUSTOMER REVIEWS ============ */
/* Stars are drawn as five glyphs clipped to a fraction, so a 4.4 reads as
   four and a bit rather than rounding itself up to five. */
.stars { display: inline-flex; gap: 1px; line-height: 1; vertical-align: middle; }
.stars .st { color: #d9ddd0; font-size: 13px; }
.stars .st.full { color: #f0a63c; }
.stars .st.half { background: linear-gradient(90deg, #f0a63c 50%, #d9ddd0 50%); -webkit-background-clip: text; background-clip: text; color: transparent; }
.stars.big .st { font-size: 19px; }

/* product page: rating under the title */
.ip-stars {
  display: flex; align-items: center; gap: 7px; margin: 6px 0 0; padding: 0;
  background: none; font-size: 13px; color: var(--muted);
}
.ip-stars b { font-size: 14px; font-weight: 800; color: var(--ink); }

/* product page: the review list */
.rv-summary { display: flex; align-items: center; gap: 9px; margin-bottom: 12px; }
.rv-summary b { font-size: 21px; font-weight: 800; letter-spacing: -.02em; }
.rv-summary small { color: var(--muted); font-size: 12.5px; }
.rv-item {
  background: var(--app-card); border-radius: 16px; padding: 12px 14px; margin-bottom: 9px;
  box-shadow: 0 1px 2px rgba(20,24,10,.05);
}
.rv-top { display: flex; align-items: center; justify-content: space-between; gap: 10px; }
.rv-who { font-size: 13px; font-weight: 800; }
.rv-text { font-size: 13.5px; line-height: 1.5; margin-top: 5px; color: #3f463a; }
.rv-reply {
  font-size: 12.5px; line-height: 1.5; margin-top: 8px; padding-left: 10px;
  border-left: 2px solid var(--lime); color: var(--muted);
}
.rv-reply b { color: var(--ink); font-weight: 800; }

/* card chips */
.pc-star { margin-left: 8px; font-weight: 700; }
.ic-stars { display: flex; align-items: center; gap: 5px; margin-top: 7px; }
.ic-stars small { font-size: 11px; color: var(--muted); font-weight: 600; }

/* "rate your order" call to action on the tracking screen */
.rate-cta {
  display: flex; align-items: center; gap: 11px; width: 100%; text-align: left;
  margin: 14px 0 0; padding: 13px 15px; border-radius: 18px;
  background: linear-gradient(118deg, #1e2412 0%, #2c3418 58%, #3c4a1c 100%);
  color: #f2f6e2; box-shadow: 0 10px 24px -18px rgba(20,24,10,.9);
}
.rate-cta .rc-txt { flex: 1; font-size: 13.5px; font-weight: 700; }
.rate-cta .rc-go { font-size: 19px; color: var(--lime); }
.rate-cta .stars .st { font-size: 15px; color: rgba(255,255,255,.28); }
.rate-cta .stars .st.full { color: var(--lime); }
.rate-cta:active { transform: scale(.99); }

/* the rating sheet */
.rv-backdrop {
  position: fixed; inset: 0; z-index: 90; display: none;
  align-items: flex-end; justify-content: center;
  background: rgba(16,20,10,.5); backdrop-filter: blur(2px);
}
.rv-backdrop.show { display: flex; }
.rv-sheet {
  width: 100%; max-width: 520px; max-height: 88vh; display: flex; flex-direction: column;
  background: var(--app-card); border-radius: 26px 26px 0 0; padding: 6px 18px 18px;
  animation: rv-up .26s cubic-bezier(.2,.8,.3,1);
}
@keyframes rv-up { from { transform: translateY(26px); opacity: 0; } }
.rv-head { display: flex; align-items: center; justify-content: space-between; padding: 12px 0 4px; }
.rv-head h2 { font-family: var(--font-display); font-size: 21px; font-weight: 800; letter-spacing: -.02em; }
.rv-close { font-size: 26px; line-height: 1; color: var(--muted); padding: 0 4px; background: none; }
.rv-body { overflow-y: auto; -webkit-overflow-scrolling: touch; padding-bottom: 4px; }
.rv-sub { font-size: 13px; color: var(--muted); margin-bottom: 12px; }
.rv-row {
  display: flex; align-items: center; justify-content: space-between; gap: 12px;
  padding: 11px 0; border-bottom: 1px solid var(--line);
}
.rv-label { font-size: 13.5px; font-weight: 700; min-width: 0; }
.rv-label small { display: block; font-size: 11.5px; font-weight: 600; color: var(--muted); margin-top: 2px; }
.rv-pick { display: flex; gap: 2px; flex-shrink: 0; }
/* big tap targets — this is the one thing people do one-handed on a phone */
.rv-star {
  width: 34px; height: 34px; font-size: 23px; line-height: 1; background: none;
  color: #d9ddd0; transition: transform .12s ease, color .12s ease;
}
.rv-star.on { color: #f0a63c; }
.rv-star:active { transform: scale(1.2); }
.rv-body textarea {
  width: 100%; margin-top: 13px; padding: 12px 13px; border-radius: 14px;
  border: 1px solid var(--line); background: #f4f6f0; font: inherit; font-size: 14px; resize: none;
}
.rv-foot { padding-top: 12px; }
.rv-send {
  width: 100%; padding: 15px; border-radius: 999px; font-size: 15px; font-weight: 800;
  background: var(--lime); color: var(--lime-ink);
}
.rv-send:disabled { opacity: .6; }

.rv-toast {
  position: fixed; left: 50%; bottom: 96px; z-index: 120; transform: translate(-50%, 12px);
  background: #1e2412; color: #f2f6e2; padding: 12px 18px; border-radius: 999px;
  font-size: 13.5px; font-weight: 700; opacity: 0; transition: opacity .3s ease, transform .3s ease;
  box-shadow: 0 12px 30px -14px rgba(0,0,0,.8); pointer-events: none; max-width: 88vw; text-align: center;
}
.rv-toast.show { opacity: 1; transform: translate(-50%, 0); }

/* boot failure fallback — see the guard script in index.html */
#boot-fail {
  position: fixed; inset: 0; z-index: 999; display: grid; place-items: center;
  padding: 24px; background: var(--app-bg, #eef0ea);
}
#boot-fail[hidden] { display: none; }
#boot-fail .bf-card {
  max-width: 380px; text-align: center; background: #fff; border-radius: 22px;
  padding: 26px 22px; box-shadow: 0 18px 40px -24px rgba(20,24,10,.6);
}
#boot-fail h2 { font-size: 20px; font-weight: 800; letter-spacing: -.02em; margin-bottom: 8px; }
#boot-fail p { font-size: 14px; line-height: 1.55; color: #5b6353; }
#boot-fail button {
  width: 100%; margin: 16px 0 12px; padding: 14px; border-radius: 999px;
  font-size: 15px; font-weight: 800; background: #d6ef4a; color: #1b2007;
}
#boot-fail .bf-small { font-size: 12.5px; color: #7c8470; }
#boot-fail .bf-err { margin-top: 10px; font-size: 11px; color: #9aa290; word-break: break-word; }

/* notification opt-in on the tracking screen */
.push-card {
  display: flex; align-items: center; gap: 12px; margin-top: 14px;
  background: var(--app-card); border-radius: 18px; padding: 14px 15px;
  box-shadow: 0 1px 2px rgba(20,24,10,.05);
}
.push-card .pk-ico { display: grid; place-items: center; width: 38px; height: 38px; flex: none; border-radius: 12px; background: #f2f6e2; color: #4a5a1d; }
.push-card .pk-ico svg { width: 20px; height: 20px; }
.push-card .pk-txt { flex: 1; min-width: 0; }
.push-card .pk-txt b { display: block; font-size: 13.5px; font-weight: 800; }
.push-card .pk-txt small { display: block; font-size: 12px; color: var(--muted); line-height: 1.45; margin-top: 2px; }
.push-card .pk-go {
  flex: none; padding: 10px 16px; border-radius: 999px; font-size: 13px; font-weight: 800;
  background: var(--lime); color: var(--lime-ink);
}
.push-card .pk-go:disabled { opacity: .6; }
.push-card.done { color: #2f6b3d; font-size: 13.5px; font-weight: 700; gap: 8px; }

/* branch picker */
.branch-row {
  display: flex; align-items: center; gap: 9px; margin: 12px 0 4px;
  background: var(--app-card); border-radius: 16px; padding: 11px 14px;
  font-size: 13.5px; box-shadow: 0 1px 2px rgba(20,24,10,.05);
}
.branch-row .ic { width: 17px; height: 17px; flex: none; color: var(--muted); }
.branch-row .br-lab { color: var(--muted); font-weight: 650; flex: none; }
.branch-row select {
  flex: 1; min-width: 0; border: 0; background: none; font: inherit; font-weight: 800;
  color: var(--ink); padding: 2px 0; appearance: none;
  background-image: linear-gradient(45deg, transparent 50%, currentColor 50%), linear-gradient(135deg, currentColor 50%, transparent 50%);
  background-position: right 6px center, right 1px center; background-size: 5px 5px, 5px 5px;
  background-repeat: no-repeat; padding-right: 18px;
}
.branch-row.single span { font-weight: 650; color: var(--muted); }
.branch-row.single b { color: var(--ink); font-weight: 800; }
.branch-row.checkout { margin: 0 0 14px; }
.branch-row.checkout span { flex: 1; min-width: 0; }
.branch-row .br-change {
  flex: none; font-size: 12.5px; font-weight: 800; color: var(--ink);
  background: #f1f3ec; border-radius: 999px; padding: 6px 13px;
}

/* notification toggle in the account screen */
.nt-row { display: flex; align-items: center; gap: 14px; }
.nt-txt { flex: 1; min-width: 0; }
.nt-txt b { display: block; font-size: 14px; font-weight: 800; }
.nt-txt small { display: block; font-size: 12.5px; color: var(--muted); line-height: 1.45; margin-top: 2px; }
.nt-note { font-size: 13px; color: var(--muted); line-height: 1.55; }
.nt-toggle {
  flex: none; width: 50px; height: 30px; border-radius: 999px; background: #d9ddd0;
  padding: 3px; transition: background .18s ease;
}
.nt-toggle span { display: block; width: 24px; height: 24px; border-radius: 50%; background: #fff; transition: transform .18s ease; box-shadow: 0 1px 3px rgba(0,0,0,.25); }
.nt-toggle.on { background: var(--lime); }
.nt-toggle.on span { transform: translateX(20px); }
.nt-toggle:disabled { opacity: .55; }


/* ============================================================
   BRAND PAGE — edge to edge
   The banner is the top of the screen, not a card floating below
   one. It runs the full width and up behind the status bar, so on
   an installed phone the colour meets the clock instead of leaving
   a white strip. `.view` pads 18px, so the banner cancels exactly
   that much and adds it back inside.
   ============================================================ */
#view-menu { padding-top: 0; }
#view-menu .brand-band {
  margin: 0 -18px 14px;
  border-radius: 0 0 26px 26px;
  padding: calc(env(safe-area-inset-top, 0px) + 22px) 20px 26px;
}
/* each brand rounds its own corners differently; on this page only the
   bottom two exist, so they are re-stated here to win on specificity */
#view-menu .brand-band.coldstone { border-radius: 0 0 22px 22px; }
#view-menu .brand-band.waccao { border-radius: 0 0 22px 22px; }
#view-menu .brand-band.censa { border-radius: 0 0 14px 14px; }

/* ---- sticky category tabs ----
   Frosted and full-bleed. The old version was a bare strip: cards slid
   through it at the edges and the row read as a rendering fault rather
   than a control. Blurring what passes underneath is what makes it look
   deliberate over a patterned background. */
.cat-tabs {
  position: sticky; top: 0; z-index: 30;
  margin: 0 -18px; padding: 11px 18px 10px;
  background: color-mix(in srgb, var(--soft, #f3f5ee) 78%, transparent);
  -webkit-backdrop-filter: saturate(150%) blur(16px);
  backdrop-filter: saturate(150%) blur(16px);
  box-shadow: 0 1px 0 rgba(20,24,10,.06);
}
/* the first category heading sits right under the sticky bar */
.cat-tabs + #menu-list .cat-heading:first-child { margin-top: 18px; }

/* ---- the strip behind the phone's own clock ----
   With a translucent status bar the page runs to the very top of the screen,
   which is what lets a brand header meet the clock. Every other screen paints
   that strip itself so the white system text always has something dark under
   it — a header that blends on one screen must not mean invisible text on
   the next. */
html { background: var(--sb, #1e1712); transition: background .25s ease; }
body::before {
  content: ''; position: fixed; top: 0; left: 0; right: 0; z-index: 200;
  height: env(safe-area-inset-top, 0px);
  background: var(--sb, #1e1712);
  pointer-events: none;
  transition: background .25s ease;
}
/* the brand banner and the delivery map are their own top edge */
body[data-view="menu"]::before, body[data-view="item"]::before, body[data-view="track"]::before { background: transparent; }

/* everything that isn't drawing its own top edge keeps clear of the clock */
.view { padding-top: calc(18px + env(safe-area-inset-top, 0px)); }
#view-menu, #view-item { padding-top: 0; }

/* ============================================================
   PRODUCT PAGE — the same house as the brand page
   It used to be a grey-green page with lime buttons sitting inside
   a burgundy parlour, because it painted itself from the global
   palette instead of the brand's. Everything below reads from
   --accent / --soft, so a Cold Stone item looks like Cold Stone and
   a Waccao item looks like Waccao, with no per-brand code.
   ============================================================ */
#view-item { background: transparent; }

/* the photo is the header */
#view-item .ip-hero {
  position: relative; margin: 0 -18px 0; border-radius: 0;
  aspect-ratio: 1 / .84; max-height: 46vh; overflow: hidden;
  background: radial-gradient(120% 90% at 50% 18%, #fff 0%, var(--ip-tint, #f1f3ec) 72%);
  display: grid; place-items: center;
}
#view-item .ip-art { border-radius: 0; }
#view-item .ip-art img { border-radius: 0; }
/* a scrim only at the very top, so the two round buttons stay readable over
   a pale photo without dimming the food itself */
.ip-hero-scrim {
  position: absolute; inset: 0 0 auto 0; height: 40%; z-index: 1;
  background: linear-gradient(180deg, rgba(20,16,12,.45), transparent);
  pointer-events: none;
}
#view-item .ip-icon {
  position: absolute; z-index: 3; top: calc(env(safe-area-inset-top, 0px) + 12px);
  width: 40px; height: 40px; border-radius: 50%; display: grid; place-items: center;
  background: rgba(255,255,255,.94); color: #1a1710;
  box-shadow: 0 4px 14px -6px rgba(0,0,0,.5);
}
#view-item #ip-back { left: 14px; }
#view-item #ip-fav { right: 14px; }
#view-item .ip-pill { z-index: 3; }
#view-item .ip-pill.dark { top: auto; bottom: 26px; left: 18px; background: rgba(20,16,12,.72); }
#view-item .ip-pill.lime { right: 18px; bottom: 26px; background: var(--accent); color: var(--accent-ink); }
/* the brand's own edge, reused: scallops for Cold Stone, and so on */
.ip-edge { position: absolute; left: 0; right: 0; bottom: 0; z-index: 2; }

/* name, price, category — the brand's display face, like the banner */
#view-item .ip-head { margin-top: 20px; align-items: flex-start; }
#view-item .ip-head h1 {
  font-family: var(--font-display); font-size: 25px; font-weight: 700;
  letter-spacing: -.02em; line-height: 1.12; color: var(--ink); overflow-wrap: anywhere;
}
#view-item .ip-price {
  font-family: var(--font-display); font-size: 21px; font-weight: 700;
  color: var(--accent); white-space: nowrap;
}
#view-item .ip-cat {
  margin-top: 7px; font-size: 10.5px; font-weight: 800; letter-spacing: .1em;
  text-transform: uppercase; color: color-mix(in srgb, var(--accent) 62%, #8a857e);
}
#view-item .ip-desc { margin-top: 12px; color: #6f6a62; }

/* controls take the house colour instead of lime */
#view-item .og-rule.req { background: var(--accent); color: var(--accent-ink); }
#view-item .oc.on { border-color: var(--accent); }
#view-item .ip-add {
  background: var(--accent); color: var(--accent-ink);
  box-shadow: 0 10px 26px -12px color-mix(in srgb, var(--accent) 70%, transparent);
}
#view-item .ip-add-ico { background: rgba(255,255,255,.22); color: var(--accent-ink); }
#view-item .ip-add:disabled { background: #dfdbd3; color: #918c84; box-shadow: none; }
#view-item .ip-add:disabled .ip-add-ico { background: #cbc6bd; color: #f4f2ee; }
#view-item .pl-go { background: var(--accent); color: var(--accent-ink); }

/* the note field and section headings, in the same voice as the menu */
#view-item .ip-note-field label { color: color-mix(in srgb, var(--accent) 55%, #7c7770); }
#view-item .ip-note-field input:focus { outline-color: var(--accent); }
#view-item .sec-head h2 {
  font-family: var(--font-display); font-size: 19px; font-weight: 700; letter-spacing: -.02em;
}

/* the same edge the banner uses, under the product photo, so the two headers
   are recognisably the same object in the same house */
body[data-brand="coldstone"] .ip-edge {
  height: 13px;
  background: radial-gradient(circle at 9px -2px, #fcf5f3 9px, transparent 9.5px) repeat-x 0 0 / 18px 13px;
}
body[data-brand="waccao"] .ip-edge {
  height: 10px;
  background: repeating-linear-gradient(90deg, #4a2c10 0 14px, transparent 14px 28px);
  opacity: .22;
}
body[data-brand="censa"] .ip-edge { height: 3px; background: linear-gradient(90deg, #cf1f1f, rgba(207,31,31,0)); }

/* ============================================================
   TRACKING — the same house as everything else
   Two states from one layout. Before the rider leaves there is
   nothing moving, so `.no-map` collapses the map away and the
   card simply sits at the top of the page. Once it is on the way
   the map appears behind the same card. The old version was a
   black sheet borrowed from another app; this one is the brand's
   own paper, colour and display face.
   ============================================================ */
.dm {
  position: relative; margin: 0 -18px 0;
  height: 58vh; min-height: 380px; max-height: 520px; overflow: hidden;
  background: var(--soft, #f1f3ec);
}
.dm-map, .dm-map-fallback { position: absolute; inset: 0; }
.dm-map-fallback { display: none; background: var(--soft, #f1f3ec); }
.dm-map .leaflet-tile-pane { filter: grayscale(.7) contrast(.9) brightness(1.07); }
.dm-map .leaflet-container { background: var(--soft, #f1f3ec); }

.dm-topbar {
  position: absolute; z-index: 620; left: 14px; right: 14px;
  top: calc(env(safe-area-inset-top, 0px) + 12px);
  display: flex; align-items: center; gap: 10px;
}
.dm-round {
  width: 40px; height: 40px; flex: none; border-radius: 50%; display: grid; place-items: center;
  background: rgba(255,255,255,.94); color: #1a1710; font-size: 23px; line-height: 1;
  box-shadow: 0 4px 14px -6px rgba(0,0,0,.4);
}
.dm-round svg { width: 17px; height: 17px; }
.dm-round.back { padding-bottom: 3px; }
/* the whole status, in one line, between the two buttons */
.dm-pill {
  flex: 1; min-width: 0; display: flex; align-items: baseline; justify-content: center; gap: 7px;
  height: 40px; padding: 0 14px; border-radius: 999px;
  background: rgba(255,255,255,.94); box-shadow: 0 4px 14px -6px rgba(0,0,0,.4);
  align-items: center; overflow: hidden;
}
.dm-pill b {
  font-family: var(--font-display); font-size: 14.5px; font-weight: 700; color: var(--ink);
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.dm-pill span {
  font-size: 12px; font-weight: 800; color: var(--accent-ink); white-space: nowrap; flex: none;
  background: var(--accent); border-radius: 999px; padding: 4px 9px;
}
.dm-pill b:empty + span, .dm-pill span:empty { display: none; }
/* the big card is the no-map presentation only */
.dm:not(.no-map) .dm-card { display: none; }
.dm.no-map .dm-topbar { display: none; }

.dm-card {
  position: absolute; z-index: 610; left: 14px; right: 14px;
  top: calc(env(safe-area-inset-top, 0px) + 64px);
  background: var(--app-card, #fff); border-radius: 24px;
  padding: 16px 18px 17px; text-align: center;
  box-shadow: 0 18px 44px -22px rgba(20,24,10,.5);
}
.dm-art { display: block; font-size: 30px; line-height: 1; margin-bottom: 6px; }
.dm-art svg { width: 30px; height: 30px; color: var(--accent, #1a1710); }
.dm-date {
  font-size: 10.5px; font-weight: 800; letter-spacing: .1em; text-transform: uppercase;
  color: color-mix(in srgb, var(--accent, #7c8470) 55%, #8a857e);
}
.dm-card h1 {
  font-family: var(--font-display); font-size: 21px; font-weight: 700;
  letter-spacing: -.02em; color: var(--ink); margin-top: 3px; line-height: 1.15;
}
.dm-eta {
  font-family: var(--font-display); font-size: 36px; font-weight: 700;
  letter-spacing: -.03em; line-height: 1.05; margin-top: 8px; color: var(--accent, #1a1710);
}
.dm-eta-lab {
  font-size: 10.5px; font-weight: 800; letter-spacing: .1em; text-transform: uppercase;
  color: #8a857e; margin-top: 2px;
}
.dm-sub { font-size: 12.5px; font-weight: 650; color: #6f6a62; margin-top: 6px; }

/* ---- no map yet: the same card, on the page ---- */
.dm.no-map {
  height: auto; min-height: 0; max-height: none; overflow: visible;
  background: none; margin-bottom: 14px;
}
.dm.no-map .dm-map, .dm.no-map .dm-map-fallback, .dm.no-map .dm-round { display: none; }
.dm.no-map .dm-card {
  position: static; margin: calc(env(safe-area-inset-top, 0px) + 16px) 4px 0;
  box-shadow: var(--shadow-sm, 0 1px 2px rgba(20,24,10,.05));
}

/* markers */
.dm-bike-wrap, .dm-dot-wrap { background: none; border: 0; }
.dm-bike {
  display: grid; place-items: center; width: 46px; height: 46px; border-radius: 50%;
  background: #fff; font-size: 23px; box-shadow: 0 6px 16px -6px rgba(0,0,0,.5);
}
.dm-dot { display: block; width: 15px; height: 15px; border-radius: 50%; box-shadow: 0 0 0 3px #fff; }
.dm-dot.dest { background: var(--accent, #1a1710); }
.dm-dot.shop { background: #1a1710; }

/* ---- the status card ---- */
.tk-card {
  background: var(--app-card, #fff); border-radius: 24px; padding: 18px 18px 16px;
  box-shadow: var(--shadow-sm, 0 1px 2px rgba(20,24,10,.05)); margin-top: 14px;
}
.tk-head { display: flex; align-items: baseline; justify-content: space-between; gap: 12px; margin-bottom: 14px; }
.tk-state { font-size: 14.5px; font-weight: 750; color: var(--ink); min-width: 0; }
.tk-code { font-size: 11px; font-weight: 700; color: #9a948b; white-space: nowrap; }
.tk-code b { font-weight: 800; color: var(--ink); letter-spacing: .05em; }

.dm-bar { display: grid; grid-auto-flow: column; grid-auto-columns: 1fr; gap: 4px; }
.dm-seg { height: 6px; border-radius: 999px; background: #e6e2da; transition: background .3s ease; }
.dm-seg.done { background: var(--accent, #1a1710); }
.dm-seg.now { background: linear-gradient(90deg, var(--accent, #1a1710) 55%, #e6e2da 55%); }

.dm-steps { display: grid; grid-auto-flow: column; grid-auto-columns: 1fr; gap: 4px; margin-top: 9px; }
.dm-step {
  font-size: 10.5px; font-weight: 700; color: #a29c93; line-height: 1.3;
  overflow-wrap: anywhere; text-align: center;
}
.dm-step.done { color: #6f6a62; }
.dm-step.now { color: var(--accent, #1a1710); font-weight: 800; }

.dm-help { margin-top: 14px; font-size: 12.5px; font-weight: 650; color: #8a857e; text-align: center; }
.dm-help a { color: var(--accent, #1a1710); font-weight: 800; text-decoration: none; }

/* cancelled turns the accent to a warning, without re-theming the page */
#view-order.is-cancelled { --accent: #b4442f; }

/* the map is the top of the screen, so it cancels the view's own top padding */
.dm:not(.no-map) { margin-top: calc((18px + env(safe-area-inset-top, 0px)) * -1); }
.dm.no-map .dm-card { margin-top: 4px; }

/* the tracking screen wears the order's brand, so its buttons do too */
#view-order .pk-go { background: var(--accent); color: var(--accent-ink); }
#view-order .pk-ico { background: color-mix(in srgb, var(--accent) 12%, transparent); color: var(--accent); }
#view-order .ta-btn.call { color: var(--accent); }
#view-order .summary-card h3, #view-order .rate-card h3 { font-family: var(--font-display); font-weight: 700; }

/* ---- screens push on and pop off ----
   A tab switch fades up in place; opening a product or an order slides in
   from the right and slides back out the same way. Native easing, short
   enough that it never feels like waiting. */
/* `backwards`, not `both`: a finished animation that still holds a transform
   leaves the element as a containing block, which quietly breaks any
   position:fixed child inside it — that is what stopped the pinned product
   header from pinning.

   The curve matters more than the distance. Sliding a long way and fading hard
   is what read as rough: the eye tracks two things changing at different rates
   over too short a time. A shorter travel on a decelerating curve, with the
   fade finishing early, reads as one movement. `translate3d` keeps it on the
   compositor so a long menu behind it does not judder. */
.view.is-push { animation: screen-in .34s cubic-bezier(.16,.84,.28,1) backwards; will-change: transform, opacity; }
.view.is-pop { animation: screen-out .24s cubic-bezier(.36,0,.66,-.05) forwards; will-change: transform, opacity; }
@keyframes screen-in {
  from { transform: translate3d(7%, 0, 0); opacity: 0; }
  40% { opacity: 1; }
  to { transform: translate3d(0, 0, 0); opacity: 1; }
}
@keyframes screen-out {
  from { transform: translate3d(0, 0, 0); opacity: 1; }
  60% { opacity: .5; }
  to { transform: translate3d(9%, 0, 0); opacity: 0; }
}
/* the fade-up on a plain tab switch, matched to the same easing */
.view.active { animation: rise .3s cubic-bezier(.16,.84,.28,1); }
@media (prefers-reduced-motion: reduce) {
  .view.is-push, .view.is-pop, .view.active { animation: none; }
}

/* the empty notifications screen */
.nt-empty {
  display: grid; place-items: center; gap: 8px; text-align: center;
  padding: 60px 24px; color: #8a857e;
}
.nt-empty svg { width: 30px; height: 30px; color: #b8b2a8; }
.nt-empty b { font-size: 16px; font-weight: 800; color: var(--ink); }
.nt-empty span { font-size: 13px; font-weight: 600; max-width: 240px; line-height: 1.5; }
#notif-list .msg-inbox { padding-top: 6px; }

/* ---- the product name, pinned ----
   Scroll past the photo on a long product and the screen stops telling you
   what it is about. This slides down at exactly the moment the real title
   leaves, carrying the name, the price and the way back. */
.ip-pinned {
  position: fixed; top: 0; left: 0; right: 0; z-index: 120;
  display: flex; align-items: center; gap: 12px;
  padding: calc(env(safe-area-inset-top, 0px) + 9px) 14px 11px;
  background: color-mix(in srgb, var(--soft, #f4f5ef) 86%, transparent);
  -webkit-backdrop-filter: saturate(160%) blur(18px);
  backdrop-filter: saturate(160%) blur(18px);
  box-shadow: 0 1px 0 rgba(20,24,10,.07);
  transform: translateY(-102%); opacity: 0;
  transition: transform .22s cubic-bezier(.22,.68,.24,1), opacity .18s ease;
}
.ip-pinned.show { transform: none; opacity: 1; }
.ip-pin-back {
  width: 34px; height: 34px; flex: none; border-radius: 50%; display: grid; place-items: center;
  background: var(--app-card, #fff); color: var(--ink); font-size: 21px; line-height: 1;
  padding-bottom: 3px; box-shadow: 0 1px 3px rgba(20,24,10,.12);
}
.ip-pin-name {
  flex: 1; min-width: 0; font-family: var(--font-display); font-size: 16px; font-weight: 700;
  letter-spacing: -.02em; color: var(--ink);
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.ip-pin-price {
  flex: none; font-family: var(--font-display); font-size: 16px; font-weight: 700; color: var(--accent);
}

/* ============================================================
   TRACKING — one screen, no scrolling
   "Where is my food" is a glance, not a document. The map (or the
   status card in its place) takes the space that is left, the
   status card is pinned under it, and everything that used to
   make this page long now lives behind Order details.
   ============================================================ */
#view-order.pinned {
  height: 100svh; padding-bottom: 0; overflow: hidden;
  display: flex; flex-direction: column;
}
#view-order.pinned #track-result { display: flex !important; flex-direction: column; flex: 1; min-height: 0; }
#view-order.pinned .dm { flex: 1; min-height: 0; height: auto; max-height: none; }
#view-order.pinned .dm.no-map { flex: 0 0 auto; }
#view-order.pinned .tk-card {
  flex: none; margin: 0 -18px; border-radius: 26px 26px 0 0;
  padding-bottom: calc(env(safe-area-inset-bottom, 0px) + 84px);
  box-shadow: 0 -10px 30px -18px rgba(20,24,10,.4);
}
/* when there is no map the card floats normally and the space above it is the page */
#view-order.pinned:has(.dm.no-map) { justify-content: flex-start; }
#view-order.pinned:has(.dm.no-map) #track-result { flex: 1; }
#view-order.pinned:has(.dm.no-map) .dm { flex: 0 0 auto; }
#view-order.pinned:has(.dm.no-map) .tk-card { margin-top: auto; }

.tk-acts { display: flex; gap: 8px; margin-top: 14px; }
.tk-act {
  flex: 1; min-width: 0; text-align: center; text-decoration: none;
  padding: 13px 12px; border-radius: 999px;
  background: var(--accent); color: var(--accent-ink);
  font-size: 13.5px; font-weight: 800;
}
.tk-act.call { background: color-mix(in srgb, var(--accent) 12%, transparent); color: var(--accent); }

/* the details sheet */
.tk-sheet-back {
  position: fixed; inset: 0; z-index: 300; background: rgba(20,16,12,.42);
  opacity: 0; transition: opacity .22s ease;
  display: flex; align-items: flex-end;
  -webkit-backdrop-filter: blur(2px); backdrop-filter: blur(2px);
}
/* display:flex above would otherwise beat the hidden attribute */
.tk-sheet-back[hidden] { display: none; }
.tk-sheet-back.show { opacity: 1; }
.tk-sheet {
  width: 100%; max-width: 560px; margin: 0 auto;
  max-height: 82svh; overflow-y: auto; -webkit-overflow-scrolling: touch;
  background: var(--app-bg, #eef0ea); border-radius: 26px 26px 0 0;
  padding: 10px 16px calc(env(safe-area-inset-bottom, 0px) + 22px);
  transform: translateY(100%); transition: transform .28s cubic-bezier(.22,.68,.24,1);
}
.tk-sheet-back.show .tk-sheet { transform: none; }
.tk-grab { display: block; width: 42px; height: 4px; border-radius: 999px; background: #d4cfc6; margin: 4px auto 12px; }
.tk-sheet .summary-card { margin-top: 0; }

/* the answerable bits, between the two cards; it scrolls on its own only if
   several of them land at once, so the screen itself never does */
/* capped, so a long prompt never squeezes the map down to nothing on a small
   phone — it scrolls inside itself instead */
.tk-mid { flex: 0 1 auto; min-height: 0; max-height: 32%; overflow-y: auto; -webkit-overflow-scrolling: touch; }
.tk-mid:empty, .tk-mid > *:empty { margin: 0; }
#view-order.pinned .tk-mid > * { margin-top: 12px; }

/* ---- app behaviour, not page behaviour ----
   No scrollbar track down the side of a phone screen, no double-tap zoom, no
   long-press callout on a photo, and no text selection dragging out of a card
   when you meant to scroll. Inputs keep their selection, obviously. */
* { -webkit-tap-highlight-color: transparent; }
html { scrollbar-width: none; -ms-overflow-style: none; }
html::-webkit-scrollbar, body::-webkit-scrollbar { width: 0; height: 0; display: none; }
.tk-sheet::-webkit-scrollbar, .tk-mid::-webkit-scrollbar,
.cat-tabs::-webkit-scrollbar, .pc-rail::-webkit-scrollbar,
.featured-row::-webkit-scrollbar, .og-items::-webkit-scrollbar { width: 0; height: 0; display: none; }
.tk-sheet, .tk-mid, .cat-tabs, .pc-rail, .featured-row, .og-items { scrollbar-width: none; }
body {
  -webkit-user-select: none; user-select: none;
  -webkit-touch-callout: none;
  touch-action: manipulation;          /* kills the 300ms double-tap-to-zoom */
}
input, textarea, [contenteditable] { -webkit-user-select: text; user-select: text; }
/* the map is the one place a pinch should still do something */
.dm-map, .leaflet-container { touch-action: auto; }

/* saved items */
.saved-list { display: grid; gap: 8px; }
.saved-list .pl { background: #f7f8f3; }
.saved-list .hint { margin: 0; }
.ip-icon.on { background: var(--accent); color: var(--accent-ink); }
.ip-icon.on svg { fill: currentColor; }

/* ---- the product bottom bar ----
   The stepper and the button were two different heights on their own baselines,
   so the count sat a few pixels below the thing it belonged to. One height,
   one row, stretched to match. */
.ip-bar { align-items: stretch; }
.ip-qty, .ip-add { height: 56px; margin-top: 0; }
