/* ===========================================================
   Orderzy Design System Preview. Shared styles for preview/*.html
   Standalone: no Bootstrap, no framework. Pure CSS + Google Fonts.
   This file is the de-facto draft of what `orderzy-modern.css` would
   look like after the Step 1 token migration from Section 10.
   =========================================================== */

/* ---------- Self-hosted fonts ----------
   Fix for Windows 7 desktops that shipped with a pre-KB-2729094 Segoe UI
   cut without the rupee glyph (U+20B9). base.html still loads the same
   families from Google Fonts (parallel path, CDN-cached for everyone else);
   these @font-face blocks give the browser a same-origin fallback that
   works offline, behind corporate DNS, and on legacy Win7 rigs. `local()`
   is listed first so if the OS already has Inter installed, that gets used
   (zero payload); otherwise the vendored TTF loads. `font-display: swap`
   ensures text renders in the system fallback while the file arrives, so
   there's no invisible-text flash. Files are the same TTFs reportlab uses
   for the PDF bill (see orders/fonts.py) - one source of truth per weight.
   ------------------------------ */
@font-face {
  font-family: 'Inter';
  font-weight: 400;
  font-style: normal;
  font-display: swap;
  src: local('Inter Regular'), local('Inter'),
       url("/static/fonts/Inter-Regular.4145168e5230.ttf") format('truetype');
}
@font-face {
  font-family: 'Inter';
  font-weight: 500;
  font-style: normal;
  font-display: swap;
  src: local('Inter Medium'),
       url("/static/fonts/Inter-Medium.a6f54808ec0a.ttf") format('truetype');
}
@font-face {
  font-family: 'Inter';
  font-weight: 700;
  font-style: normal;
  font-display: swap;
  src: local('Inter Bold'),
       url("/static/fonts/Inter-Bold.c7b5fabc34e7.ttf") format('truetype');
}
@font-face {
  font-family: 'Inter';
  font-weight: 400;
  font-style: italic;
  font-display: swap;
  src: local('Inter Italic'),
       url("/static/fonts/Inter-Italic.2247b87d078d.ttf") format('truetype');
}
@font-face {
  font-family: 'DM Serif Display';
  font-weight: 400;
  font-style: normal;
  font-display: swap;
  src: local('DM Serif Display'),
       url("/static/fonts/DM-Serif-Display-Regular.2312ec57b28b.ttf") format('truetype');
}
@font-face {
  font-family: 'DM Serif Display';
  font-weight: 400;
  font-style: italic;
  font-display: swap;
  src: local('DM Serif Display Italic'),
       url("/static/fonts/DM-Serif-Display-Italic.2cfd6017cc5c.ttf") format('truetype');
}

/* ---------- Tokens ----------
   Post-Luxe-unification (2026-08-14): the former Luxe token block (previously
   scoped to `body.theme-luxe`) merged into :root. Every surface now renders on
   the single unified token set. Historical values from both eras noted inline
   where they differed. Wordmark orange is preserved as the Orderzy brand anchor.
   ------------------------------ */
:root {
  /* Brand (Orderzy wordmark + brand anchor; never per-outlet-tinted) */
  --orderzy-brand:        #f28500;
  --orderzy-brand-deep:   #b86600;
  --orderzy-brand-hover:  #965200;
  --orderzy-brand-soft:   #fef1e0;
  --orderzy-brand-ink:    #7a4500;

  /* Surface */
  --orderzy-canvas:       #fdfbf7;   /* was #faf8f4 pre-unification */
  --orderzy-surface:      #ffffff;
  --orderzy-surface-alt:  #f6f0e6;   /* was #f3efe8 */
  /* L18: --orderzy-surface-sand aliases --orderzy-border. Existing consumers
     stay stable; future code should prefer --orderzy-border directly. */
  --orderzy-surface-sand: var(--orderzy-border);

  /* Text */
  --orderzy-ink:          #1a1815;   /* was #1f1d1a */
  --orderzy-ink-soft:     #6b6760;   /* was #5e5d59 */
  --orderzy-ink-muted:    #9a948b;   /* was #87867f */
  --orderzy-ink-invert:   #fdfbf7;   /* was #faf9f5 */

  /* Borders */
  --orderzy-border:        #ede5d7;  /* was #ebe5da */
  --orderzy-border-soft:   rgba(26,24,21,0.08);
  --orderzy-border-strong: #d4cdc0;

  /* Semantic */
  --orderzy-success:      #4a6b3a;   /* was #1f9d55, Luxe muted */
  --orderzy-success-soft: #e3f5ea;
  --orderzy-warning:      #a17a3a;   /* was #c9820a */
  --orderzy-warning-soft: #faf0dc;
  --orderzy-danger:       #8b3a3a;   /* was #b53333 */
  --orderzy-danger-soft:  #fae5e3;

  /* Per-brand accent (set by <style>:root { --accent: ... }</style> in base.html
     when brand.accent_hex is set; otherwise falls through to Orderzy orange so
     no-accent brands still feel like Orderzy restaurants). */
  --accent:          var(--orderzy-brand-deep);
  --accent-hover:    color-mix(in srgb, var(--accent) 88%, #000);
  --accent-contrast: #fdfbf7;
  --badge-veg:       #4a6b3a;
  --badge-nonveg:    #8b3a3a;

  /* Shadows (Luxe: barely-there) */
  --orderzy-shadow-card:    0 2px 8px rgba(0,0,0,0.04);
  --orderzy-shadow-lift:    0 8px 24px rgba(0,0,0,0.06);
  --orderzy-shadow-whisper: 0 16px 48px rgba(0,0,0,0.08);
  --shadow-soft:   0 2px 8px rgba(0,0,0,0.04);
  --shadow-medium: 0 8px 24px rgba(0,0,0,0.06);
  --shadow-strong: 0 16px 48px rgba(0,0,0,0.08);

  /* Radii: production aliases + STYLEGUIDE names */
  --r-xs: 4px;
  --r-sm: 4px;      /* was 8px */
  --r-md: 8px;      /* was 12px */
  --r-lg: 12px;     /* was 20px */
  --r-pill: 9999px;
  --radius-sm:   4px;
  --radius-md:   8px;
  --radius-lg:   12px;
  --radius-pill: 9999px;

  /* Borders (composite shorthands) */
  --border-thin:     1px solid var(--orderzy-border);
  --border-emphasis: 1px solid var(--accent);

  /* P4.C09 (2026-08-15): canonical breakpoint tokens.
     CSS custom properties CANNOT be used inside `@media (max-width: …)`
     conditions (the spec resolves `var()` only in a declaration context),
     so the tokens below function as documentation + consistency anchors
     for anyone editing the file. When adding a new media query, prefer
     the four canonical widths below unless the design genuinely needs a
     one-off breakpoint; if it does, add a comment explaining why. Current
     one-off widths that the site still ships with, and what they map to:

       360, 400, 420, 480, 540, 560         → mobile   (canonical 520)
       620, 640, 720                        → tablet   (canonical 768)
       767                                  → tablet-minus-one; treat as 768
       840, 880                             → desktop  (canonical 1024)

     Migrating each one-off to its canonical bucket is a follow-up: the
     regressions from re-flowing every layout are wider than a single-phase
     cleanup can safely land, so leave existing rules alone and start
     fresh rules on the canonical set.
  */
  --bp-mobile:  520px;
  --bp-tablet:  768px;
  --bp-desktop: 1024px;
  --bp-wide:    1440px;

  /* Type */
  --font-heading: "DM Serif Display", Georgia, serif;
  --font-body:    "Inter", system-ui, -apple-system, sans-serif;
  --font-display: "DM Serif Display", Georgia, serif;
  --font-mono:    "Inter", ui-monospace, monospace;

  /* Type scale: fluid clamp() on the 5 biggest tokens so type scales
     smoothly from phone (540px) → desktop (1200px) instead of jumping at
     the 768px breakpoint. */
  --text-display: clamp(56px, calc(56px + (100vw - 540px) * 24 / 660), 80px);
  --text-h1:      clamp(40px, calc(40px + (100vw - 540px) * 16 / 660), 56px);
  --text-h2:      clamp(32px, calc(32px + (100vw - 540px) * 8  / 660), 40px);
  --text-h3:      clamp(24px, calc(24px + (100vw - 540px) * 4  / 660), 28px);
  --text-h4:      clamp(20px, calc(20px + (100vw - 540px) * 2  / 660), 22px);
  --text-body:    17px;
  --text-small:   15px;
  --text-caption: 13px;
  --text-label:   13px;    /* ALL-CAPS, pair with --tracking-wide */
  --text-price:   22px;    /* tabular-nums */

  /* Line-height */
  --leading-tight:   1.15;
  --leading-snug:    1.3;
  --leading-normal:  1.5;
  --leading-relaxed: 1.7;
  --leading-loose:   1.85;

  /* Letter-spacing */
  --tracking-tight:  -0.02em;
  --tracking-normal: 0;
  --tracking-wide:   0.12em;
  --tracking-wider:  0.18em;

  /* Spacing */
  --space-1: 4px;
  --space-2: 8px;
  --space-3: 16px;
  --space-4: 24px;
  --space-5: 32px;
  --space-6: 48px;
  --space-7: 64px;
  --space-8: 96px;
  --space-9: 128px;
  --space-section: 128px;   /* between menu courses */
  --space-page-x:  64px;    /* desktop page margin; 24px mobile (see @media) */

  /* Motion */
  --ease:            cubic-bezier(0.4, 0, 0.2, 1);
  --ease-default:    cubic-bezier(0.4, 0, 0.2, 1);
  --ease-emphasized: cubic-bezier(0.16, 1, 0.3, 1);   /* signature */
  --ease-decelerate: cubic-bezier(0, 0, 0.2, 1);      /* entering view */
  --ease-accelerate: cubic-bezier(0.4, 0, 1, 1);      /* leaving view */
  --dur-fast:      180ms;   /* was 120ms */
  --dur-med:       320ms;   /* was 200ms */
  --duration-fast: 180ms;
  --duration-base: 320ms;
  --duration-slow: 600ms;

  /* Focus ring (WCAG 2.4.7): reads per-brand accent */
  --focus-ring: var(--accent);

  /* ---------- z-index scale (Phase C, 2026-08-29) ----------
     Single source of truth for cross-component stacking. Before this
     scale, orderzy.css had 35 raw z-index literals ranging from -1 to
     99999 !important, chosen ad hoc by different authors. Every author
     picked a number without seeing every other author's number, and
     the drawer-hidden-behind-chip-strip bug (audit Z-01 / 2026-08-29)
     was the direct consequence.

     Rules going forward:
     - New z-index values MUST use one of these tokens.
     - Component-internal micro-layering (z-index: -1 / 0 / 1 / 2 for a
       card's own overlay, a badge on a media block, etc.) MAY stay as
       raw numbers because they never collide with cross-component
       layers. Anything >= 30 or with !important MUST use a token.
     - The grep guard test in tests/regression/test_z_index_tokens.py
       enforces this rule.

     Bug fix stack order (top -> bottom, top wins):
       tooltip-escape (skip link, tooltip) > modal > modal-backdrop >
       toast > get-bill-sticky > fab > drawer > drawer-backdrop >
       nav-dropdown-inline (user menu, notif dropdown) > nav >
       sticky-strip (chip strip - BELOW nav so it does not hide the
       drawer) > sticky-course-open > sticky-course > sticky-cart-bar >
       sticky-hero > raised > base > below.
     -------------------------------------------------- */
  --z-below:                -1;
  --z-base:                 0;
  --z-raised:               2;
  --z-sticky-hero:          30;
  --z-sticky-cart-bar:      40;
  --z-sticky-course:        40;
  --z-sticky-strip:         45;
  --z-nav:                  50;
  --z-nav-dropdown-inline:  60;
  --z-sticky-course-open:   80;
  --z-drawer-backdrop:      1000;
  --z-drawer:               1010;
  --z-fab:                  1100;
  --z-getbill-sticky:       1120;
  --z-toast:                1200;
  --z-modal-backdrop:       1300;
  --z-modal:                1310;
  --z-tooltip-escape:       1400;
  /* 2026-08-31: fixed-position browser-level nudges. These sit above
     every in-app overlay because they instruct the operator to leave the
     app (grant notification perm, install PWA). Stack order (top wins):
     kitchen-banner > notif-nag > pwa-nudge > audio-nudge.
     audio-nudge is the first-load "tap to enable sound" pill from the
     ring-reliability autoplay fallback; it sits under the two blue action
     prompts so the more actionable nudges are always on top when they
     co-occur. */
  --z-audio-nudge:          1490;
  --z-pwa-nudge:            1500;
  --z-notif-nag:            1510;
  --z-kitchen-banner:       1520;

  /* Navbar height. Consumed by .oz-nav__drawer (fixed positioning below
     the nav after Phase C reparenting, 2026-08-29). Kept as a root token
     so the drawer can position itself without probing the DOM. Mobile
     value is 56px, set in the @media (max-width: 768px) block below. */
  --oz-nav-h: 72px;
}

/* Mobile type-scale + page-margin adjustments. The 5 biggest type tokens
   (--text-display, --text-h1..h4) use clamp() in :root above; this media
   query handles the remaining non-fluid sizes plus spacing tightens:
   128px between courses reads as too-much-air on a phone. */
@media (max-width: 768px) {
  :root {
    --text-body:    16px;
    --text-price:   20px;
    --space-page-x: 24px;
    --space-section: 64px;
    --space-5:      24px;
    --oz-nav-h:     56px;
  }
}

/* RA-0 M5: respect prefers-reduced-motion. Suppresses long animations and
   transitions for users who set OS-level reduced motion. The carousel
   autoplay is also gated separately in JS at restaurant__detail.html. */
@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after {
    animation-duration: 0.01ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: 0.01ms !important;
    scroll-behavior: auto !important;
  }
}

/* M22: skip-to-content link. Hidden until focused, then surfaces top-left. */
.skip-link {
  position: absolute;
  top: -100px;
  left: 8px;
  z-index: var(--z-tooltip-escape);
  padding: 10px 16px;
  background: var(--orderzy-ink);
  color: var(--orderzy-ink-invert);
  font-family: var(--font-body);
  font-weight: 600;
  border-radius: var(--r-sm);
  text-decoration: none;
  transition: top var(--dur-fast) var(--ease);
}
.skip-link:focus {
  top: 8px;
  outline: 2px solid var(--focus-ring);
  outline-offset: 2px;
}

/* ---------- Link reset for UI patterns ----------
   Browsers underline every <a> by default. That's the right behavior for
   inline body-prose links, but wrong for nav items, buttons, chips, cards,
   and other UI surfaces where the link is just the click target. We list
   every UI-link class here so per-class rules don't keep forgetting it.
   Body-prose links keep their underline via .mk-ar-prose / .mk-prose:hover
   rules further down. */
.btn,
.adm-btn,
.adm-chip,
.adm-table__row-link,
.auth-field__link,
.btn-cancel,
.cart-add-more,
.cart-bar__cta,
.contact-edit-link,
.cust-nav__item,
.filter-chip,
.mb-cat,
.mini-cart,
.mk-bl-card__media,
.mk-cl-nearby__chip,
.mo-btn-sm,
.mo-filter,
.oz-nav__cart,
.oz-nav__link,
.oz-nav__link--muted,
.oz-nav__link--restaurant,
.oz-nav__user,
.oz-wordmark,
.pos-back-btn,
.r-btn,
.rest-card {
  text-decoration: none;
}

/* Reset: Bootstrap handles box-sizing and base styles.
   We only enforce Orderzy-specific body defaults. */

/* 2026-08-26 viewport hardening: any <img> without an explicit inline
   width constraint must never overflow its container. `max-width:100%`
   caps the rendered width to the parent; `height:auto` preserves aspect
   ratio (safe with HTML `width`/`height` attrs because the browser uses
   the CSS `height:auto` alongside the intrinsic ratio implied by those
   attrs). Icon-sized images with explicit `width="64" height="64"`
   still render at 64x64 because max-width only clamps larger images,
   never enlarges below the intrinsic size. */
img { max-width: 100%; height: auto; }

/* 2026-09-01 layout fix: reserve the vertical scrollbar gutter on every
   page so a short view (e.g. clicking Non-veg on an outlet with 1 non-veg
   item) does not cause a ~15px horizontal jump when the scrollbar
   disappears. `scrollbar-gutter: stable` is supported on Chrome 94+ /
   Firefox 97+ / Safari 18.2+ (Feb 2025). On older browsers the property
   is silently ignored and the layout falls back to today's behaviour -
   no worse than pre-fix. */
html {
  scrollbar-gutter: stable;
}

body {
  font-family: var(--font-body);
  font-size: 16px;
  line-height: 1.55;
  color: var(--orderzy-ink);
  background: var(--orderzy-canvas);
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  display: flex;
  flex-direction: column;
  min-height: 100vh;
}
#main-content { flex: 1 0 auto; }
.oz-footer { flex-shrink: 0; }

h1, h2, h3, h4, h5 {
  font-family: var(--font-heading);
  color: var(--orderzy-ink);
  margin: 0;
  letter-spacing: -0.01em;
}
.num, .price, .total { font-feature-settings: "tnum"; font-variant-numeric: tabular-nums; }

/* ---------- Layout helpers ---------- */
.container { max-width: 1200px; margin: 0 auto; padding: 0 24px; }
.stack-lg > * + * { margin-top: 24px; }
.stack-md > * + * { margin-top: 16px; }
.stack-sm > * + * { margin-top: 8px; }

/* ---------- Navbar ---------- */
.oz-nav {
  position: sticky;
  top: 0;
  z-index: var(--z-nav);
  background: rgba(250,248,244,0.92);
  backdrop-filter: saturate(180%) blur(14px);
  -webkit-backdrop-filter: saturate(180%) blur(14px);
  border-bottom: 1px solid var(--orderzy-border-soft);
}
.oz-nav__inner {
  display: flex;
  align-items: center;
  justify-content: space-between;
  height: 72px;
  max-width: 1200px;
  margin: 0 auto;
  padding: 0 24px;
}
.oz-wordmark {
  font-family: "Playfair Display", "DM Serif Display", Georgia, serif;
  font-weight: 800;
  font-size: 26px;
  letter-spacing: 0;
  color: var(--orderzy-brand);
  line-height: 1;
}
.oz-nav__links {
  display: flex;
  align-items: center;
  gap: 28px;
}
.oz-nav__link {
  font-family: var(--font-body);
  font-weight: 600;
  font-size: 15px;
  color: var(--orderzy-ink);
  transition: color var(--dur-fast) var(--ease);
}
.oz-nav__link:hover { color: var(--orderzy-brand); }
.oz-nav__link--restaurant {
  color: var(--orderzy-ink);
  padding: 8px 14px;
  border-radius: var(--r-sm);
  border: 1px solid var(--orderzy-border-strong);
  transition: all var(--dur-fast) var(--ease);
}
.oz-nav__link--restaurant:hover {
  background: var(--orderzy-brand-soft);
  border-color: var(--orderzy-brand);
  color: var(--orderzy-brand-ink);
}
.oz-nav__cart {
  position: relative;
  display: grid;
  place-items: center;
  width: 40px;
  height: 40px;
  border-radius: var(--r-pill);
  background: var(--orderzy-surface);
  border: 1px solid var(--orderzy-border);
  color: var(--orderzy-ink);
  transition: all var(--dur-fast) var(--ease);
}
.oz-nav__cart:hover { border-color: var(--orderzy-ink); }
.oz-nav__cart-badge {
  position: absolute;
  top: -4px;
  right: -4px;
  min-width: 18px;
  height: 18px;
  /* Brighter orange (brand) for the cart badge so it reads clearly distinct
     from the bell's red danger badge - the two used to share a similar
     dark tone, creating an unintentional visual rhyme. */
  background: var(--orderzy-brand);
  color: #fff;
  border-radius: var(--r-pill);
  font-size: 11px;
  font-weight: 700;
  display: grid;
  place-items: center;
  padding: 0 5px;
  border: 2px solid var(--orderzy-canvas);
}
.oz-nav__cart-badge.hidden { display: none; }
.oz-nav__cart--empty { opacity: 0.5; }
.oz-nav__link--muted {
  font-size: 14px;
  font-weight: 600;
  color: var(--orderzy-ink-muted);
  transition: color var(--dur-fast) var(--ease);
}
.oz-nav__link--muted:hover { color: var(--orderzy-danger); }

/* ---------- Buttons ---------- */
.btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 8px;
  font-family: var(--font-body);
  font-weight: 600;
  font-size: 16px;
  padding: 12px 20px;
  border-radius: var(--r-sm);
  border: 1px solid transparent;
  transition: all var(--dur-fast) var(--ease);
  text-align: center;
  white-space: nowrap;
}
.btn:active { transform: scale(0.97); }

.btn--primary {
  background: var(--orderzy-brand-deep);
  color: #fff;
  box-shadow: 0 1px 2px rgba(31,29,26,0.1);
}
.btn--primary:hover {
  background: var(--orderzy-brand-hover);
  box-shadow: var(--orderzy-shadow-lift);
}

/* FE1-5: .btn--ink removed - unused in production templates. */

.btn--secondary {
  background: var(--orderzy-surface-sand);
  color: var(--orderzy-ink);
  border-color: var(--orderzy-border);
}
.btn--secondary:hover { background: var(--orderzy-border-strong); }

.btn--ghost {
  background: transparent;
  color: var(--orderzy-ink);
}
.btn--ghost:hover { color: var(--orderzy-brand); }

/* FE1-3: shared disabled states for buttons + inputs */
.btn:disabled,
.btn[aria-disabled="true"] {
  opacity: 0.5;
  cursor: not-allowed;
  box-shadow: none;
}
.btn:disabled:hover,
.btn[aria-disabled="true"]:hover {
  background: inherit;
  color: inherit;
  transform: none;
}
.input:disabled,
.input[aria-disabled="true"] {
  background: var(--orderzy-surface-alt);
  color: var(--orderzy-ink-muted);
  cursor: not-allowed;
  border-color: var(--orderzy-border);
}

.btn--large {
  font-size: 17px;
  padding: 14px 26px;
}
.btn--block { width: 100%; }

/* ---------- Status pill ---------- */
.pill {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  padding: 3px 10px;
  border-radius: var(--r-pill);
  font-family: var(--font-heading);
  font-size: 12px;
  font-weight: 700;
  letter-spacing: 0.03em;
  text-transform: uppercase;
}
.pill--success { background: var(--orderzy-success-soft); color: var(--orderzy-success); }
.pill--warn    { background: var(--orderzy-warning-soft); color: var(--orderzy-warning); }
.pill--brand   { background: var(--orderzy-brand-soft); color: var(--orderzy-brand-ink); }
.pill--closed  { background: var(--orderzy-surface-alt); color: var(--orderzy-ink-muted); }
/* Variant for status pills laid over hero photos. Solid semi-opaque white
   surface + strong shadow + frosted backdrop so the pill reads against ANY
   underlying photography (bright food, dark interiors, varied compositions).
   Text color is forced dark; the colored status dot via ::before stays
   theme-aware (success green / closed grey). FE0 follow-up 2026-06-02:
   strengthened from blur(2px) + soft shadow which faded on bright photos. */
.pill--on-photo {
  background: rgba(255,255,255,0.92) !important;
  color: var(--orderzy-ink) !important;
  box-shadow: 0 2px 8px rgba(0,0,0,0.25);
  backdrop-filter: blur(8px) saturate(1.2);
  -webkit-backdrop-filter: blur(8px) saturate(1.2);
  border: 1px solid rgba(255,255,255,0.6);
}
/* Status dot picks up the variant color even though text is dark. */
.pill--on-photo.pill--success::before { background: var(--orderzy-success); }
.pill--on-photo.pill--warn::before    { background: var(--orderzy-warning); }
.pill--on-photo.pill--brand::before   { background: var(--orderzy-brand-ink); }
.pill--on-photo.pill--closed::before  { background: var(--orderzy-ink-muted); }
.pill::before {
  content: "";
  width: 6px;
  height: 6px;
  border-radius: 50%;
  background: currentColor;
}

/* ---------- Trust badge ---------- */
.trust-badge {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  padding: 6px 12px;
  border-radius: var(--r-pill);
  background: var(--orderzy-surface);
  border: 1px solid var(--orderzy-border);
  color: var(--orderzy-ink-soft);
  font-size: 13px;
  font-weight: 600;
}
.trust-badge__icon {
  width: 14px;
  height: 14px;
  color: var(--orderzy-brand);
}

/* ---------- Inputs ---------- */
.input {
  width: 100%;
  background: var(--orderzy-surface);
  border: 1px solid var(--orderzy-border-strong);
  border-radius: var(--r-sm);
  padding: 12px 14px;
  font: inherit;
  color: var(--orderzy-ink);
  transition: all var(--dur-fast) var(--ease);
}
.input::placeholder { color: var(--orderzy-ink-muted); }
.input:focus {
  outline: none;
  border-color: var(--orderzy-brand);
  box-shadow: 0 0 0 3px var(--orderzy-brand-soft);
}
.input-label {
  display: block;
  font-size: 14px;
  font-weight: 600;
  color: var(--orderzy-ink);
  margin-bottom: 6px;
}

/* ---------- Search bar (hero) ---------- */
.search-bar {
  display: flex;
  align-items: center;
  gap: 8px;
  background: var(--orderzy-surface);
  border: 1px solid var(--orderzy-border);
  border-radius: var(--r-pill);
  padding: 6px 6px 6px 18px;
  box-shadow: var(--orderzy-shadow-card);
  max-width: 480px;
}
.search-bar__icon {
  width: 18px;
  height: 18px;
  color: var(--orderzy-ink-muted);
  flex-shrink: 0;
}
.search-bar__input {
  flex: 1;
  border: none;
  background: transparent;
  font: inherit;
  outline: none;
  color: var(--orderzy-ink);
  padding: 10px 0;
}
.search-bar__input::placeholder { color: var(--orderzy-ink-muted); }
.search-bar__btn {
  background: var(--orderzy-brand-deep);
  color: #fff;
  border: none;
  width: 42px;
  height: 42px;
  border-radius: var(--r-pill);
  display: grid;
  place-items: center;
  transition: background var(--dur-fast) var(--ease);
}
.search-bar__btn:hover { background: var(--orderzy-brand-hover); }

/* ---------- Quick-search chips below hero search bar ---------- */
/* P1.C05.hotfix (2026-08-16): dropped the max-width: 480px cap. It was sized
   for a phantom left column that disappeared when the phone mock retired,
   which forced any sixth (or wide-labelled) chip to wrap onto a second row
   on desktop. The row now uses whatever horizontal space the hero column
   offers; the hero__grid rules gate the actual width. */
.search-suggest {
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
  margin-top: 12px;
}
.search-suggest__chip {
  background: var(--orderzy-surface);
  border: 1px solid var(--orderzy-border);
  border-radius: var(--r-pill);
  padding: 6px 14px;
  font-size: 13px;
  font-weight: 600;
  color: var(--orderzy-ink);
  cursor: pointer;
  transition: background var(--dur-fast) var(--ease), border-color var(--dur-fast) var(--ease), color var(--dur-fast) var(--ease);
  font-family: inherit;
}
.search-suggest__chip:hover {
  background: var(--orderzy-brand-soft);
  border-color: var(--orderzy-brand);
  color: var(--orderzy-brand-ink);
}
.search-suggest__chip:focus-visible {
  outline: 2px solid var(--orderzy-brand);
  outline-offset: 2px;
}

/* ---------- Card (Airbnb-style restaurant listing) ---------- */
.rest-card {
  background: var(--orderzy-surface);
  border-radius: var(--r-lg);
  box-shadow: var(--orderzy-shadow-card);
  overflow: hidden;
  transition: box-shadow var(--dur-med) var(--ease);
  display: flex;
  flex-direction: column;
}
.rest-card:hover { box-shadow: var(--orderzy-shadow-lift); }
.rest-card--closed { opacity: 0.65; }
.rest-card--closed .rest-card__media img { filter: grayscale(40%); }

/* =========== Marketplace browse header =========== */
.browse-head {
  padding: 32px 0 8px;
  background: var(--orderzy-canvas);
  position: sticky;
  top: 72px;
  z-index: var(--z-sticky-hero);
  border-bottom: 1px solid var(--orderzy-border-soft);
}
.browse-head__search {
  display: flex;
  gap: 12px;
  align-items: center;
  flex-wrap: wrap;
  margin-bottom: 18px;
}
.browse-head__search .search-bar { flex: 1; min-width: 260px; margin: 0; }
.browse-head__location {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  background: var(--orderzy-surface);
  border: 1px solid var(--orderzy-border);
  border-radius: var(--r-sm);
  padding: 10px 14px;
  font-size: 14px;
  color: var(--orderzy-ink);
  font-weight: 600;
}
.browse-head__location svg { color: var(--orderzy-brand); width: 16px; height: 16px; }
.browse-head__location-change {
  color: var(--orderzy-brand-ink);
  font-size: 12px;
  font-weight: 700;
  margin-left: 4px;
  border-left: 1px solid var(--orderzy-border);
  padding-left: 10px;
  background: none;
  border-top: none;
  border-right: none;
  border-bottom: none;
  cursor: pointer;
}

.filter-row {
  display: flex;
  gap: 8px;
  overflow-x: auto;
  padding: 4px 0 16px;
  scrollbar-width: none;
}
.filter-row::-webkit-scrollbar { display: none; }
.filter-chip {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  padding: 8px 14px;
  border-radius: var(--r-pill);
  background: var(--orderzy-surface);
  border: 1px solid var(--orderzy-border);
  color: var(--orderzy-ink);
  font-size: 13px;
  font-weight: 600;
  white-space: nowrap;
  cursor: pointer;
  text-decoration: none;
  transition: all var(--dur-fast) var(--ease);
}
.filter-chip:hover { border-color: var(--orderzy-ink); }
.filter-chip.is-active {
  background: var(--orderzy-ink);
  color: var(--orderzy-ink-invert);
  border-color: var(--orderzy-ink);
}
.filter-chip:disabled {
  opacity: 0.55;
  cursor: not-allowed;
}
.filter-chip:disabled:hover { border-color: var(--orderzy-border); }
.filter-chip__dot { width: 8px; height: 8px; border-radius: 50%; }
.filter-chip__dot--veg { background: #1f9d55; }
.filter-chip__dot--nonveg { background: #b53333; }

.results-head {
  padding: 20px 0 12px;
  display: flex;
  justify-content: space-between;
  align-items: baseline;
  flex-wrap: wrap;
  gap: 8px;
}
.results-head__count { font-size: 15px; color: var(--orderzy-ink-soft); }
.results-head__count strong { color: var(--orderzy-ink); }
.results-head__sort { font-size: 14px; color: var(--orderzy-ink-soft); }
.results-head__sort strong { color: var(--orderzy-ink); font-weight: 700; }

@media (max-width: 520px) {
  .browse-head { top: 56px; padding: 16px 0 4px; }
  .browse-head__search { margin-bottom: 12px; }
  .results-head { padding: 14px 0 10px; }
}
.rest-card__media {
  aspect-ratio: 16 / 10;
  background: var(--orderzy-surface-alt);
  position: relative;
  overflow: hidden;
}
.rest-card__media img {
  width: 100%;
  height: 100%;
  object-fit: cover;
}
.rest-card__badge {
  position: absolute;
  top: 12px;
  left: 12px;
}
/* CTA row at the foot of the card. Both CTAs sit above the stretched-link
   overlay (z-index:2) so they receive their own clicks. View menu is primary
   (outlined, brand-ink), Book a table is secondary text-link. */
.rest-card__ctas {
  position: relative;
  z-index: 2;
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
  align-items: center;
  margin-top: 12px;
}
.rest-card__view-cta {
  display: inline-flex;
  align-items: center;
  padding: 8px 16px;
  border: 1px solid var(--orderzy-brand-ink);
  border-radius: 9999px;
  color: var(--orderzy-brand-ink);
  font-family: var(--font-heading);
  font-weight: 700;
  font-size: 13px;
  text-decoration: none;
  transition: background var(--dur-fast) var(--ease), color var(--dur-fast) var(--ease);
}
.rest-card__view-cta:hover {
  background: var(--orderzy-brand-ink);
  color: #fff;
}
.rest-card__book-cta {
  display: inline-flex;
  align-items: center;
  padding: 8px 12px;
  color: var(--orderzy-ink-muted);
  font-family: var(--font-heading);
  font-weight: 600;
  font-size: 13px;
  text-decoration: none;
  transition: color var(--dur-fast) var(--ease);
}
.rest-card__book-cta:hover {
  color: var(--orderzy-brand-ink);
  text-decoration: underline;
  text-underline-offset: 4px;
}
/* 2026-09-13 Get directions on the card. Soft-pill chip. Kept visually
   lighter than See menu (primary conversion) and Book a table (secondary
   conversion) because Directions is a leave-the-site utility action.
   Mirrors the detail-page `.oz-directions-link` treatment for recognition. */
.rest-card__directions-cta {
  display: inline-flex;
  align-items: center;
  gap: 4px;
  padding: 6px 12px;
  background: var(--orderzy-brand-soft);
  color: var(--orderzy-brand-ink);
  border-radius: 9999px;
  font-family: var(--font-heading);
  font-size: 12px;
  font-weight: 600;
  text-decoration: none;
  line-height: 1;
  white-space: nowrap;
}
.rest-card__directions-cta:hover {
  background: var(--orderzy-brand-ink);
  color: #fff;
}
.rest-card__body { padding: 14px 18px 18px; }
.rest-card__title {
  font-size: 18px;
  font-weight: 700;
  color: var(--orderzy-ink);
  margin: 0 0 4px;
}
.rest-card__meta {
  font-size: 14px;
  color: var(--orderzy-ink-soft);
  line-height: 1.4;
  /* 2026-08-28 audit F.19: allow the meta line to wrap to two lines before
     ellipsis so a real address like "142 MG Road, Chhatarpur, Madhya
     Pradesh" isn't cut at 30 chars while the card has room. The template
     still truncates the raw string at a safe upper bound so runaway
     content can't push the card taller than its neighbours. */
  display: -webkit-box;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
  overflow: hidden;
}
.rest-card__foot {
  display: flex;
  align-items: center;
  justify-content: space-between;
  margin-top: 10px;
  padding-top: 10px;
  border-top: 1px solid var(--orderzy-border);
}
.rest-card__price {
  font-size: 14px;
  color: var(--orderzy-ink-soft);
}
.rest-card__rating {
  display: inline-flex;
  align-items: center;
  gap: 4px;
  font-size: 14px;
  font-weight: 600;
  color: var(--orderzy-ink);
}

/* ---------- Hero ---------- */
.hero {
  padding: 48px 0 64px;
}
.hero__grid {
  display: grid;
  grid-template-columns: 1.1fr 1fr;
  gap: 48px;
  align-items: center;
}
.hero__eyebrow {
  display: inline-block;
  font-family: var(--font-heading);
  font-size: 12px;
  font-weight: 700;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--orderzy-brand-ink);
  background: var(--orderzy-brand-soft);
  padding: 5px 12px;
  border-radius: var(--r-pill);
  margin-bottom: 20px;
}
.hero__headline {
  font-family: var(--font-heading);
  font-size: 56px;
  font-weight: 700;
  line-height: 1.05;
  letter-spacing: -0.025em;
  color: var(--orderzy-ink);
  margin: 0 0 16px;
}
.hero__headline-accent { color: var(--orderzy-brand); }
.hero__subline {
  font-size: 18px;
  color: var(--orderzy-ink-soft);
  line-height: 1.55;
  max-width: 480px;
  margin: 0 0 28px;
}
.hero__trust {
  display: flex;
  flex-wrap: wrap;
  gap: 12px 18px;
  margin-top: 28px;
}

/* ---------- Hero location pill (three-state, no CLS) ---------- */
/* P1.C05.hotfix (2026-08-16). Before this pass the pill was styled inline on
   the element itself (a hostile pattern for CSP nonces) and always mounted
   the Change button, so the "Add your location" state read as the literal
   string "Add your location Change" - two labels smoothed together with no
   affordance. State-machine is now data-state-driven and Change only shows
   when there is a real location to change AWAY FROM. */
.search-bar__location {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  margin-top: 12px;
  background: var(--orderzy-surface);
  border: 1px solid var(--orderzy-border);
  border-radius: var(--r-pill);
  padding: 8px 14px;
  font-size: 13px;
  color: var(--orderzy-ink);
  font-weight: 600;
  min-height: 36px;
  transition: border-color var(--dur-fast) var(--ease), background var(--dur-fast) var(--ease);
}
.search-bar__location:hover { border-color: var(--orderzy-border-strong); }
.search-bar__location svg { color: var(--orderzy-brand); flex-shrink: 0; }
.search-bar__location .location-refresh {
  color: var(--orderzy-brand-ink);
  font-size: 12px;
  font-weight: 700;
  border: none;
  background: none;
  cursor: pointer;
  border-left: 1px solid var(--orderzy-border);
  padding: 2px 0 2px 10px;
  margin-left: 4px;
  font-family: inherit;
  transition: color var(--dur-fast) var(--ease);
}
.search-bar__location .location-refresh:hover { color: var(--orderzy-brand); }
.search-bar__location .location-refresh:focus-visible {
  outline: 2px solid var(--orderzy-brand);
  outline-offset: 2px;
  border-radius: 4px;
}
/* Detecting: no Change button (nothing to change from). */
.search-bar__location[data-state="detecting"] .location-refresh { display: none; }
.search-bar__location[data-state="detecting"] { color: var(--orderzy-ink-muted); }
/* Add: whole pill is the affordance; no trailing Change button. */
.search-bar__location[data-state="add"] .location-refresh { display: none; }
.search-bar__location[data-state="add"] {
  cursor: pointer;
  color: var(--orderzy-brand-ink);
  border-color: var(--orderzy-brand-soft);
  background: var(--orderzy-brand-soft);
}
.search-bar__location[data-state="add"]:hover {
  background: var(--orderzy-surface);
  border-color: var(--orderzy-brand);
}

/* ---------- Phone mockup ---------- */
.phone {
  position: relative;
  width: 300px;
  margin: 0 auto;
  aspect-ratio: 300 / 620;
  background: var(--orderzy-ink);
  border-radius: 44px;
  padding: 10px;
  box-shadow: var(--orderzy-shadow-whisper),
              0 40px 80px -20px rgba(31,29,26,0.25);
}
.phone__screen {
  width: 100%;
  height: 100%;
  background: var(--orderzy-canvas);
  border-radius: 34px;
  overflow: hidden;
  position: relative;
  display: flex;
  flex-direction: column;
}
.phone__notch {
  position: absolute;
  top: 8px;
  left: 50%;
  transform: translateX(-50%);
  width: 88px;
  height: 22px;
  background: var(--orderzy-ink);
  border-radius: 16px;
  z-index: 2;
}
.phone__status {
  padding: 16px 22px 6px;
  display: flex;
  justify-content: space-between;
  align-items: center;
  font-size: 11px;
  font-weight: 700;
  color: var(--orderzy-ink);
  z-index: 1;
}
.phone__body {
  flex: 1;
  padding: 6px 14px 14px;
  overflow: hidden;
}
.phone__rest-header {
  padding: 8px 6px 14px;
  border-bottom: 1px solid var(--orderzy-border);
  margin-bottom: 12px;
}
.phone__rest-name {
  font-family: var(--font-heading);
  font-weight: 700;
  font-size: 17px;
  color: var(--orderzy-ink);
  margin: 0;
}
.phone__rest-meta {
  font-size: 11px;
  color: var(--orderzy-ink-soft);
  margin-top: 2px;
}
.phone__item {
  display: flex;
  gap: 10px;
  padding: 10px 0;
  border-bottom: 1px solid var(--orderzy-border-soft);
}
.phone__item:last-child { border-bottom: 0; }
.phone__item-img {
  width: 58px;
  height: 58px;
  flex-shrink: 0;
  background: var(--orderzy-surface-alt);
  border-radius: var(--r-md);
  overflow: hidden;
}
.phone__item-img img { width: 100%; height: 100%; object-fit: cover; }
.phone__item-info {
  flex: 1;
  min-width: 0;
  display: flex;
  flex-direction: column;
  justify-content: space-between;
}
.phone__item-title {
  font-size: 12.5px;
  font-weight: 700;
  color: var(--orderzy-ink);
  line-height: 1.25;
  margin: 0;
}
.phone__item-desc {
  font-size: 10.5px;
  color: var(--orderzy-ink-muted);
  line-height: 1.3;
  margin: 2px 0 0;
}
.phone__item-foot {
  display: flex;
  justify-content: space-between;
  align-items: center;
  margin-top: 4px;
}
.phone__item-price {
  font-weight: 700;
  font-size: 12px;
  color: var(--orderzy-ink);
}
.phone__item-add {
  font-size: 10px;
  font-weight: 700;
  padding: 3px 10px;
  border-radius: var(--r-xs);
  background: var(--orderzy-brand-deep);
  color: #fff;
  border: none;
  text-transform: uppercase;
  letter-spacing: 0.04em;
}
/* P1.C05.hotfix.r4 (2026-08-16). The stepper used to render as one text run
   ("&minus;&nbsp;1&nbsp;+") which read as a cramped, ambiguous glyph string.
   Unpacked into three balanced sub-elements: .phone__item-qty-btn for - / +
   (bolder glyphs sized as buttons) and .phone__item-qty-num for the count
   (tabular numeral so it stays aligned as it grows past 9). Vertical hairline
   dividers between the three cells mirror the real product's .qty-stepper
   shape without pretending to be interactive. */
.phone__item-qty {
  display: inline-flex;
  align-items: stretch;
  font-weight: 700;
  border-radius: var(--r-xs);
  border: 1px solid var(--orderzy-brand);
  color: var(--orderzy-brand-ink);
  background: var(--orderzy-brand-soft);
  overflow: hidden;
  line-height: 1;
}
.phone__item-qty-btn,
.phone__item-qty-num {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  padding: 5px 0;
  min-width: 22px;
  font-family: var(--font-body);
  font-size: 13px;
  line-height: 1;
  color: var(--orderzy-brand-ink);
}
.phone__item-qty-btn { font-weight: 800; }
.phone__item-qty-num {
  font-weight: 700;
  font-variant-numeric: tabular-nums;
  border-left: 1px solid rgba(184, 102, 0, 0.22);
  border-right: 1px solid rgba(184, 102, 0, 0.22);
  padding-left: 4px;
  padding-right: 4px;
}

/* ---------- Phone status-bar (shared across every .phone mock) ---------- */
/* P1.C05.hotfix.r3 (2026-08-16). Clock + signal indicator live at the .phone
   scope, not the .phone--hero-mock scope, because both the home hero mock
   and the /dine-in-ordering-system/ hero mock (base .phone) use them. */
.phone__clock {
  font-family: var(--font-body);
  font-weight: 700;
  font-variant-numeric: tabular-nums;
  letter-spacing: 0.02em;
}
.phone__signal {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  font-weight: 700;
  font-size: 12px;
}
.phone__signal-dots {
  display: inline-flex;
  align-items: flex-end;
  gap: 2px;
  height: 10px;
}
.phone__signal-dot {
  width: 3px;
  background: var(--orderzy-ink);
  border-radius: 1px;
}
.phone__signal-dot:nth-child(1) { height: 4px; }
.phone__signal-dot:nth-child(2) { height: 6px; }
.phone__signal-dot:nth-child(3) { height: 8px; }
.phone__signal-dot:nth-child(4) { height: 10px; }
.phone__signal-label {
  font-family: var(--font-body);
  font-size: 12px;
  letter-spacing: 0.01em;
}

/* ---------- Hero phone mock (right column, ≥1024px only) ---------- */
/* Sits inside .hero__grid's right column on home. Wider than the base .phone
   (which is 300px) so the item rows breathe more, matching the mockup in
   Image #4. Hides at ≤1023px (tablet + mobile) so the hero collapses to a
   single centered column - matches the responsive rule set for the retired
   .hero__preview card. */
.phone--hero-mock {
  width: 320px;
  aspect-ratio: 320 / 640;
  justify-self: end;
  margin: 0;
}
.phone--hero-mock .phone__status {
  padding: 14px 22px 4px;
  font-size: 12px;
  color: var(--orderzy-ink);
}
.phone--hero-mock .phone__rest-name { font-size: 18px; letter-spacing: -0.005em; }
.phone--hero-mock .phone__rest-meta { font-size: 12px; margin-top: 4px; }
.phone--hero-mock .phone__item { padding: 12px 0; }
.phone--hero-mock .phone__item:first-of-type { padding-top: 4px; }
.phone--hero-mock .phone__item-img { width: 64px; height: 64px; }
.phone--hero-mock .phone__item-title { font-size: 13.5px; }
.phone--hero-mock .phone__item-desc { font-size: 11px; margin-top: 3px; }
.phone--hero-mock .phone__item-price { font-size: 13px; }
.phone--hero-mock .phone__item-add { font-size: 10.5px; padding: 4px 12px; }
/* Stepper sized down slightly for the hero mock; cells shrink together so
   the pill stays symmetric. */
.phone--hero-mock .phone__item-qty-btn,
.phone--hero-mock .phone__item-qty-num {
  font-size: 12px;
  min-width: 20px;
  padding-top: 4px;
  padding-bottom: 4px;
}
/* Hide the phone at tablet + mobile. The tablet/mobile hero collapses to a
   centered single-column via the existing @media rules on .hero__grid. */
@media (max-width: 1023px) {
  .phone--hero-mock { display: none; }
}

/* ---------- Section title ---------- */
.section {
  padding: 56px 0;
}
.section__head {
  margin-bottom: 28px;
}
.section__title {
  font-size: 32px;
  font-weight: 700;
  letter-spacing: -0.015em;
  color: var(--orderzy-ink);
  margin: 0;
}
.section__sub {
  font-size: 16px;
  color: var(--orderzy-ink-soft);
  margin-top: 6px;
}

.rest-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
  gap: 24px;
}

/* ---------- How it works ---------- */
.steps {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 24px;
}
.step {
  background: var(--orderzy-surface);
  border: 1px solid var(--orderzy-border);
  border-radius: var(--r-lg);
  padding: 28px 24px;
  text-align: left;
  position: relative;
}
.step__num {
  font-family: var(--font-heading);
  font-size: 13px;
  font-weight: 700;
  letter-spacing: 0.08em;
  color: var(--orderzy-brand);
  text-transform: uppercase;
  margin-bottom: 12px;
}
.step__title {
  font-size: 20px;
  font-weight: 700;
  margin: 0 0 8px;
}
.step__desc {
  font-size: 15px;
  color: var(--orderzy-ink-soft);
  line-height: 1.55;
  margin: 0;
}
.step__icon {
  width: 44px;
  height: 44px;
  border-radius: 12px;
  background: var(--orderzy-brand-soft);
  color: var(--orderzy-brand-ink);
  display: grid;
  place-items: center;
  margin-bottom: 16px;
}

/* ---------- Restaurant acquisition band ---------- */
.ra-band {
  background: var(--orderzy-brand-soft);
  padding: 72px 0;
  position: relative;
  overflow: hidden;
}
.ra-band::before {
  content: "";
  position: absolute;
  inset: 0;
  background: radial-gradient(circle at 85% 50%, rgba(242,133,0,0.08) 0%, transparent 55%);
  pointer-events: none;
}
.ra-band__grid {
  display: grid;
  grid-template-columns: 1.1fr 1fr;
  gap: 56px;
  align-items: center;
  position: relative;
}
.ra-band__title {
  font-size: 40px;
  font-weight: 700;
  letter-spacing: -0.02em;
  margin: 0 0 12px;
  line-height: 1.1;
}
.ra-band__sub {
  font-size: 17px;
  color: var(--orderzy-ink-soft);
  line-height: 1.55;
  margin: 0 0 20px;
  max-width: 480px;
}
.ra-band__benefits {
  list-style: none;
  padding: 0;
  margin: 0 0 28px;
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 10px 20px;
}
.ra-band__benefits li {
  font-size: 15px;
  display: flex;
  align-items: center;
  gap: 8px;
  color: var(--orderzy-ink);
  font-weight: 600;
}
.ra-band__benefits li::before {
  content: "";
  width: 8px;
  height: 8px;
  background: var(--orderzy-brand);
  border-radius: 50%;
  flex-shrink: 0;
}

/* Mini dashboard mockup */
.dash-mini {
  background: var(--orderzy-surface);
  border-radius: var(--r-lg);
  box-shadow: var(--orderzy-shadow-lift);
  padding: 20px;
  font-size: 12px;
}
.dash-mini__head {
  display: flex;
  justify-content: space-between;
  align-items: center;
  padding-bottom: 14px;
  border-bottom: 1px solid var(--orderzy-border);
  margin-bottom: 14px;
}
.dash-mini__brand {
  font-family: var(--font-heading);
  font-weight: 700;
  font-size: 14px;
  color: var(--orderzy-brand);
}
.dash-mini__metric {
  display: flex;
  gap: 14px;
  margin-bottom: 16px;
}
.dash-mini__metric-cell {
  flex: 1;
  background: var(--orderzy-surface-alt);
  border-radius: var(--r-md);
  padding: 10px 12px;
}
.dash-mini__metric-label {
  font-size: 10px;
  font-weight: 600;
  color: var(--orderzy-ink-muted);
  text-transform: uppercase;
  letter-spacing: 0.05em;
}
.dash-mini__metric-value {
  font-family: var(--font-heading);
  font-weight: 700;
  font-size: 22px;
  color: var(--orderzy-ink);
  margin-top: 2px;
}
.dash-mini__row {
  display: flex;
  justify-content: space-between;
  align-items: center;
  padding: 8px 0;
  border-bottom: 1px solid var(--orderzy-border-soft);
  font-size: 12px;
}
.dash-mini__row:last-child { border-bottom: none; }
.dash-mini__row-id { color: var(--orderzy-ink-muted); font-weight: 600; }
.dash-mini__row-amt { font-weight: 700; }

/* ---------- Footer ---------- */
/* P4.C08 (2026-08-15): the legacy (dark-ink) `.oz-footer` block plus its
   `.oz-footer__grid` and `.oz-footer__bottom` variants was deleted. Every
   production render uses `.oz-footer .oz-footer--compact` (see
   `templates/includes/footer.html`); the compact-specific rules further
   down still declare the shell (background/color come from the Luxe
   override at §3.6 of the components section). No template referenced
   `.oz-footer__grid` or `.oz-footer__bottom` after Wave 0. */

/* ---------- Compact footer (production default) ----------
   Two-column top (brand on left, 3-column link grid on right) +
   bottom strip with contact + copyright. */
.oz-footer--compact { padding: 48px 0 24px; margin-top: 0; }
.oz-footer__inner {
  max-width: 1200px;
  margin: 0 auto;
  padding: 0 24px;
}
.oz-footer__top {
  display: grid;
  grid-template-columns: 1.2fr 2fr;
  gap: 48px;
  margin-bottom: 36px;
}
.oz-footer__brand {
  display: flex;
  flex-direction: column;
  gap: 6px;
}
/* Brand title uses .oz-wordmark + .oz-footer__brand-title - inherits the
   Playfair Display Bold 800 from .oz-wordmark; size is footer-specific. */
.oz-footer__brand-title {
  font-size: 26px;
  text-decoration: none;
}
.oz-footer__tagline {
  font-family: var(--font-body);
  font-style: italic;
  font-size: 13px;
  color: rgba(250,249,245,0.6);
}
.oz-footer__brand-desc {
  color: rgba(250,249,245,0.5);
  font-size: 13px;
  line-height: 1.5;
  margin: 8px 0 0;
  max-width: 280px;
}
.oz-footer__cols {
  display: grid;
  grid-template-columns: 1fr 1fr 1fr;
  gap: 32px;
}
/* Selector renamed h4 → h3 on 2026-08-22 to fix H2→H4 heading-skip. */
/* Footer column titles kept their 12px uppercase caption look. */
.oz-footer__col h3 {
  font-family: var(--font-heading);
  font-size: 12px;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.08em;
  color: rgba(250,249,245,0.85);
  margin: 0 0 12px;
}
.oz-footer__col ul { list-style: none; padding: 0; margin: 0; }
.oz-footer__col li { margin-bottom: 8px; }
.oz-footer__col a {
  color: rgba(250,249,245,0.55);
  font-size: 13px;
  font-weight: 500;
  text-decoration: none;
  transition: color var(--dur-fast) var(--ease);
}
.oz-footer__col a:hover {
  color: var(--orderzy-brand);
  text-decoration: underline;
  text-underline-offset: 4px;
}
.oz-footer__bottom-strip {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 16px;
  padding-top: 20px;
  border-top: 1px solid rgba(250,249,245,0.08);
  flex-wrap: wrap;
}
.oz-footer__contact {
  display: flex;
  align-items: center;
  gap: 16px;
}
.oz-footer__contact a {
  color: rgba(250,249,245,0.55);
  font-size: 13px;
  font-weight: 500;
  text-decoration: none;
  display: inline-flex;
  align-items: center;
  gap: 6px;
  transition: color var(--dur-fast) var(--ease);
}
.oz-footer__contact a:hover { color: var(--orderzy-brand); }
.oz-footer__copy {
  color: rgba(250,249,245,0.4);
  font-size: 12px;
}
@media (max-width: 768px) {
  .oz-footer--compact { padding: 36px 0 20px; }
  .oz-footer__top {
    grid-template-columns: 1fr;
    gap: 28px;
  }
  .oz-footer__cols { grid-template-columns: 1fr 1fr 1fr; gap: 20px; }
  .oz-footer__brand-desc { max-width: none; }
}
@media (max-width: 480px) {
  .oz-footer__cols { grid-template-columns: 1fr 1fr; gap: 20px; }
  .oz-footer__bottom-strip {
    flex-direction: column;
    align-items: flex-start;
    gap: 10px;
  }
  .oz-footer__contact { flex-direction: column; align-items: flex-start; gap: 6px; }
}

/* =========== Restaurant detail page =========== */
.rest-hero {
  position: relative;
  width: 100%;
  height: 280px;
  overflow: hidden;
  background: var(--orderzy-ink);
}
@media (max-width: 880px) { .rest-hero { height: 220px; } }
@media (max-width: 520px) { .rest-hero { height: 180px; } }
/* Image Standards v1.2 Phase 1 (2026-08-29): the 0.85 opacity was stacking on
   top of the .rest-hero__overlay gradient below, producing a muddy render on
   every uploaded photo (~15% darker than the owner saw). The gradient alone
   is enough to keep the white overlay text readable. */
.rest-hero img { width: 100%; height: 100%; object-fit: cover; }
.rest-hero__overlay {
  position: absolute;
  inset: 0;
  background: linear-gradient(to top, rgba(31,29,26,0.8) 0%, rgba(31,29,26,0.2) 60%, transparent 100%);
}
.rest-hero__content {
  position: absolute;
  bottom: 0;
  left: 0;
  right: 0;
  padding: 32px 24px;
  color: var(--orderzy-ink-invert);
}
.rest-info { max-width: 1200px; margin: 0 auto; }
.rest-info__name {
  font-family: var(--font-heading);
  font-size: 36px;
  font-weight: 700;
  letter-spacing: -0.02em;
  margin: 0 0 6px;
  color: #fff;
}
.rest-info__meta {
  display: flex;
  flex-wrap: wrap;
  gap: 14px;
  font-size: 14px;
  color: rgba(255,255,255,0.9);
  align-items: center;
}
.rest-info__meta-sep { opacity: 0.5; }
.rest-info__outlet {
  font-size: 14px;
  font-weight: 600;
  color: rgba(255,255,255,0.92);
  margin: -2px 0 6px;
}
.cw-btn {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  height: 34px;
  padding: 0 14px;
  border-radius: 17px;
  font-family: var(--font-body);
  font-size: 13px;
  font-weight: 700;
  cursor: pointer;
  white-space: nowrap;
  background: var(--orderzy-brand);
  border: 1px solid var(--orderzy-brand);
  color: #fff;
  transition: background 150ms, color 150ms, border-color 150ms, transform 80ms;
}
.cw-btn:hover { background: var(--orderzy-brand-ink); border-color: var(--orderzy-brand-ink); }
.cw-btn:active { transform: scale(0.98); }
.cw-btn[disabled] { opacity: 0.6; cursor: not-allowed; }
.rest-banner {
  background: var(--orderzy-brand-soft);
  border-bottom: 1px solid var(--orderzy-border);
  padding: 14px 0;
}
.rest-banner__inner {
  display: flex;
  align-items: center;
  gap: 12px;
  font-size: 14px;
  color: var(--orderzy-brand-ink);
  font-weight: 600;
  max-width: 1200px;
  margin: 0 auto;
  padding: 0 24px;
}
.rest-layout {
  display: grid;
  grid-template-columns: 220px 1fr;
  gap: 40px;
  padding: 32px 0 120px;
  max-width: 1200px;
  margin: 0 auto;
  padding-left: 24px;
  padding-right: 24px;
}
.cat-nav {
  position: sticky;
  top: 96px;
  align-self: start;
  /* 2026-08-28: sidebar taller than viewport (e.g. Kulhadwala's 25 categories
     on a 730px viewport = 1068px sidebar) left the bottom half of the list
     unreachable because the sticky element clipped below the viewport bottom
     with no internal scroll. max-height caps the sidebar to the space below
     its sticky top offset; overflow-y:auto lets it scroll internally when
     content exceeds that. Short menus keep no scrollbar (invisible no-op).
     Hidden entirely at <=880px per the media block below, so mobile is
     unaffected by 100vh's iOS address-bar quirk. */
  max-height: calc(100vh - 96px);
  overflow-y: auto;
}
.cat-nav__title {
  font-family: var(--font-heading);
  font-size: 11px;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.08em;
  color: var(--orderzy-ink-muted);
  margin: 0 0 12px;
  padding: 0 12px;
}
.cat-nav__list { list-style: none; padding: 0; margin: 0; }
.cat-nav__item {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 8px;              /* 2026-09-05: prevents name + count from colliding when the name is long */
  padding: 10px 12px;
  border-radius: var(--r-sm);
  font-size: 14px;
  color: var(--orderzy-ink);
  font-weight: 600;
  border-left: 3px solid transparent;
  cursor: pointer;
  transition: all var(--dur-fast) var(--ease);
}
/* 2026-09-05: long category names ("Kulhadwala Special Thalis") get truncated
   with an ellipsis rather than growing to consume the count column. Ties into
   the flex-shrink: 0 on .cat-nav__count below. */
.cat-nav__item > span:first-child {
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  flex: 1 1 auto;
}
.cat-nav__item:hover { background: var(--orderzy-surface-alt); }
.cat-nav__item.is-active {
  background: var(--orderzy-brand-soft);
  border-left-color: var(--orderzy-brand);
  color: var(--orderzy-brand-ink);
}
.cat-nav__count {
  /* 2026-09-05: reserve enough width for 2-3 digit counts and stop flexbox
     from squeezing the count into a partial glyph. Fixes SYS-Q4 (audit
     verification 2026-09-04). */
  flex-shrink: 0;
  min-width: 32px;
  text-align: right;
  font-weight: 600;
  color: var(--orderzy-ink-muted);
  font-size: 13px;
}
.cat-nav__item.is-active .cat-nav__count { color: var(--orderzy-brand-ink); }

/* Mobile: sidebar hides completely; category navigation moves to the
   sticky pill strip (.cat-nav__mobile-strip below in this file). Prior
   to 2026-08-28 audit F.22 the sidebar was ALSO reflowed as a horizontal
   underlined-tab row here, so two category strips rendered side-by-side
   on <=880px (the pill row from the mobile primitive AND the reflowed
   sidebar). The two disagreed on which category was active; users saw
   both scrolling in different directions. The reflow rules are gone and
   the sidebar is display:none so only the pill strip renders.

   2026-08-28 audit F.22 (acceptance follow-up): the grid track `1fr` was
   silently expanding to ~384px on a 306-360px viewport, forcing the whole
   menu column wider than the phone and dumping a horizontal scrollbar on
   the page. Root cause: CSS grid items default `min-width: auto` (=
   min-content), so a horizontal-scroll carousel child (.menu-rail__track,
   .menu-item__variants, .oz-parcel-toggle) pushed the track past the
   viewport. Setting `min-width: 0` on the grid item + the nested overflow
   containers teaches the layout to actually shrink to fit. */
@media (max-width: 880px) {
  .rest-layout { grid-template-columns: minmax(0, 1fr); gap: 24px; padding: 16px; }
  /* !important beats the later .menu-page-content { max-width: 800px }
     rule at ~9317 outside any media query, and beats the base .menu-item
     { display: flex } row min-content. Grid items with intrinsic
     min-content > track were overflowing the 306-360px viewport and
     shipping a horizontal scrollbar on the whole page. min-width: 0 +
     max-width: 100% forces every grid + flex descendant of the layout
     to shrink to the actual viewport. */
  .rest-layout > * { min-width: 0 !important; max-width: 100% !important; }
  .cat-nav { display: none; }
  .rest-info__name { font-size: 24px; }
  .menu-page-content { min-width: 0 !important; max-width: 100% !important; overflow-x: clip; }
  .menu-rail { max-width: 100% !important; min-width: 0 !important; }
  .menu-rail__track { min-width: 0 !important; max-width: 100% !important; }
  .menu-cat { min-width: 0 !important; max-width: 100% !important; }
  .menu-item { min-width: 0 !important; max-width: 100% !important; }
  /* HTML <input> defaults to min-width: auto = intrinsic 20-char width
     (~200-220px). Inside a CSS grid with minmax(0, 1fr) that intrinsic
     width forces the grid track past the viewport. */
  .search-bar__input,
  .menu-search input,
  .menu-page-content input { min-width: 0 !important; }
}
@media (max-width: 520px) {
  .rest-info__meta { font-size: 12px; gap: 8px; }
}

/* --------------------------------------------------------------------
   .oz-bottom-stack - 2026-09-01 permanent stacking fix.

   Retires the F.27/F.28 architecture (3 independent `position: fixed`
   elements coordinated via 4 magic numbers spread across CSS + JS).
   The three bottom-anchored surfaces are now children of ONE flex-column
   container:

     Row 1: .oz-bottom-stack__fab-row  (holds .oz-fab-callwaiter)
     Row 2: .cart-bar                   (centered dark pill)
     Row 3: .oz-getbill-sticky          (full-width green tray)

   Why this fixes the class of overlap the old design kept producing:
   flex-column siblings cannot occupy the same vertical band, so the
   Call-staff-over-View-cart collision seen in the 2026-09-01 screenshot
   is architecturally impossible in this layout. All positioning is
   CSS-only; sticky-stack.js no longer computes any `bottom` value.

   pointer-events: none on the container so the menu scrolls behind the
   gaps; each visible surface (.cart-bar, .oz-getbill-sticky,
   .oz-fab-callwaiter) re-enables pointer events on itself.
   -------------------------------------------------------------------- */
.oz-bottom-stack {
  position: fixed;
  left: 0;
  right: 0;
  bottom: 0;
  display: flex;
  flex-direction: column;
  gap: 8px;
  padding-bottom: max(8px, env(safe-area-inset-bottom));
  pointer-events: none;
  z-index: var(--z-sticky-cart-bar);
}
.oz-bottom-stack .cart-bar,
.oz-bottom-stack .oz-getbill-sticky,
.oz-bottom-stack .oz-fab-callwaiter {
  pointer-events: auto;
}
/* When the Get Bill tray is on the page AND visible (mobile only), it sits
   flush against the viewport bottom - its own padding-bottom absorbs the
   safe-area, so we drop the container's padding-bottom to avoid doubling
   up. Media-guarded because the tray is display:none on >=768px; :has()
   alone would match a hidden-tray DOM node and wrongly drop the padding
   the FAB / cart-bar rely on there. */
@media (max-width: 767px) {
  .oz-bottom-stack:has(.oz-getbill-sticky) {
    padding-bottom: 0;
  }
}
/* FAB row: right-aligned pill. Empty area of the row must pass clicks
   through so the menu underneath stays scrollable in that band. */
.oz-bottom-stack__fab-row {
  display: flex;
  justify-content: flex-end;
  padding: 0 16px;
  pointer-events: none;
}
/* Q2 answer (2026-09-01): Call staff is a QR-scan-flow control; hide it
   on desktop (>=1025px) where the diner is not seated at the table.
   Tablet (768-1024) keeps it. Was previously shown on all breakpoints. */
@media (min-width: 1025px) {
  .oz-bottom-stack__fab-row { display: none; }
}

/* Cart bar (centered dark pill). No longer `position: fixed` - it's a
   flex-column child of .oz-bottom-stack and centers itself horizontally
   via align-self. Visual style is byte-for-byte identical to the pre-fix
   version; only positioning + z-index moved to the parent. */
.cart-bar {
  display: none;
  align-self: center;
  width: calc(100% - 48px);
  max-width: 560px;
  background: var(--orderzy-ink);
  color: var(--orderzy-ink-invert);
  border-radius: var(--r-md);
  padding: 14px 18px;
  align-items: center;
  justify-content: space-between;
  box-shadow: 0 20px 48px -12px rgba(31,29,26,0.3), var(--orderzy-shadow-lift);
}
.cart-bar--visible { display: flex; }
/* Prompt 2 · S2-24 (2026-09-13). When the sticky cart bar is showing,
   reserve room at the bottom of the menu list so the last item's Add
   button isn't tap-blocked by the bar. Uses `:has()` where supported
   (modern iOS Safari, Chrome, Firefox); the fallback path - every
   older browser - keeps today's shape (occasional overlap on the
   last item, not a regression). safe-area-inset keeps the reserve
   correct on notched iPhones. */
body:has(.cart-bar--visible) .menu-page-content {
  padding-bottom: calc(96px + env(safe-area-inset-bottom, 0px));
}
.cart-bar__count {
  display: inline-flex;
  align-items: center;
  gap: 10px;
}
.cart-bar__count-badge {
  background: var(--orderzy-brand);
  color: #fff;
  width: 28px;
  height: 28px;
  border-radius: 50%;
  display: inline-grid;
  place-items: center;
  font-weight: 700;
  font-size: 13px;
}
/* 2026-08-28 audit F.16: hide the count badge on desktop (>=768px) - the
   label "3 items in cart" already carries the number, so the leading pill
   duplicates it and reads as visual noise. Kept in DOM as screen-reader
   text so assistive tech still hears the count without a repeat visual. */
@media (min-width: 768px) {
  .cart-bar__count-badge {
    position: absolute;
    width: 1px;
    height: 1px;
    padding: 0;
    margin: -1px;
    overflow: hidden;
    clip: rect(0, 0, 0, 0);
    white-space: nowrap;
    border: 0;
  }
}
.cart-bar__label { font-weight: 700; font-size: 15px; }
.cart-bar__total { font-family: var(--font-heading); font-weight: 700; font-size: 14px; opacity: 0.75; margin-left: 6px; }
.cart-bar__cta {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  font-family: var(--font-heading);
  font-weight: 700;
  font-size: 14px;
  color: var(--orderzy-brand);
  text-decoration: none;
  white-space: nowrap;
}
/* 2026-08-28 audit F.27 (rationale updated 2026-09-01): keep the cart-bar
   single-line at 320-414px. Originally protected the FAB-stack math; that
   math is now retired but the single-line invariant still matters for the
   cart-bar's own readability - a wrapped "View cart" reads worse than a
   tighter one-liner even without any FAB context. Tightening label / CTA
   sizing keeps every element inline down to 320px. */
@media (max-width: 414px) {
  .cart-bar { padding: 11px 14px; width: calc(100% - 24px); gap: 8px; }
  .cart-bar__count { gap: 8px; min-width: 0; }
  .cart-bar__count-badge { width: 24px; height: 24px; font-size: 12px; }
  .cart-bar__label { font-size: 13.5px; }
  .cart-bar__total { font-size: 12.5px; margin-left: 4px; }
  .cart-bar__cta { font-size: 13px; }
  .cart-bar__cta svg { width: 12px; height: 12px; }
}

@media (max-width: 880px) {
  .rest-layout { grid-template-columns: 1fr; gap: 0; }
  .cat-sidebar {
    position: static;
    display: none;
  }
  .rest-info__name { font-size: 24px; }
  .rest-hero__content { padding: 20px 16px; }
  .rest-info__meta { font-size: 12px; gap: 8px; }
}

/* =========== Checkout page specific =========== */
.co-layout {
  display: grid;
  grid-template-columns: 1.2fr 1fr;
  gap: 40px;
  padding: 40px 0 80px;
}
.co-title {
  font-size: 32px;
  font-weight: 700;
  letter-spacing: -0.02em;
  margin: 0 0 6px;
}
.co-subtitle {
  color: var(--orderzy-ink-soft);
  font-size: 15px;
  margin: 0 0 28px;
}
.co-step-indicator {
  display: flex;
  gap: 6px;
  margin-bottom: 16px;
  font-size: 13px;
  color: var(--orderzy-ink-muted);
  font-weight: 600;
}
.co-step-indicator strong { color: var(--orderzy-ink); }
.card-box {
  background: var(--orderzy-surface);
  border: 1px solid var(--orderzy-border);
  border-radius: var(--r-md);
  padding: 24px;
}
.card-box + .card-box { margin-top: 16px; }
.card-box__title {
  font-size: 17px;
  font-weight: 700;
  margin: 0 0 16px;
}
.form-row {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 14px;
}
.form-row--single { grid-template-columns: 1fr; }

.pay-option {
  display: flex;
  align-items: center;
  gap: 14px;
  padding: 16px;
  border: 1px solid var(--orderzy-border-strong);
  border-radius: var(--r-sm);
  cursor: pointer;
  transition: all var(--dur-fast) var(--ease);
}
.pay-option + .pay-option { margin-top: 10px; }
.pay-option:hover { border-color: var(--orderzy-ink); }
.pay-option.selected {
  border-color: var(--orderzy-brand);
  background: var(--orderzy-brand-soft);
  box-shadow: 0 0 0 3px var(--orderzy-brand-soft);
}
.pay-option__radio {
  width: 20px;
  height: 20px;
  border-radius: 50%;
  border: 2px solid var(--orderzy-border-strong);
  flex-shrink: 0;
  position: relative;
}
.pay-option.selected .pay-option__radio { border-color: var(--orderzy-brand); }
.pay-option.selected .pay-option__radio::after {
  content: "";
  position: absolute;
  inset: 3px;
  background: var(--orderzy-brand);
  border-radius: 50%;
}
.pay-option__body { flex: 1; }
.pay-option__title { font-weight: 700; font-size: 15px; }
.pay-option__sub { font-size: 13px; color: var(--orderzy-ink-soft); }
.pay-option__logos {
  display: flex;
  gap: 6px;
  align-items: center;
  flex-shrink: 0;
}
.pay-logo {
  font-size: 10px;
  font-weight: 700;
  padding: 3px 8px;
  border-radius: 4px;
  background: var(--orderzy-surface-alt);
  color: var(--orderzy-ink-soft);
  letter-spacing: 0.04em;
}

/* Order summary */
.summary {
  position: sticky;
  top: 96px;
  background: var(--orderzy-surface);
  border-radius: var(--r-md);
  box-shadow: var(--orderzy-shadow-whisper);
  padding: 24px;
  border: 1px solid var(--orderzy-border);
}
.summary__title {
  font-size: 17px;
  font-weight: 700;
  margin: 0 0 4px;
}
.summary__rest {
  font-size: 13px;
  color: var(--orderzy-ink-soft);
  margin: 0 0 20px;
}
.summary__item {
  display: flex;
  justify-content: space-between;
  gap: 12px;
  padding: 10px 0;
  font-size: 14px;
}
.summary__item-name { flex: 1; }
.summary__item-qty { color: var(--orderzy-ink-muted); font-weight: 600; margin-right: 8px; }
.summary__item--rich { align-items: center; gap: 10px; }
.summary__item-thumb { width: 40px; height: 40px; border-radius: var(--r-xs, 6px); object-fit: cover; flex-shrink: 0; }
.summary__divider { border-top: 1px solid var(--orderzy-border); margin: 10px 0; }
.summary__line {
  display: flex;
  justify-content: space-between;
  font-size: 14px;
  color: var(--orderzy-ink-soft);
  padding: 4px 0;
}
.summary__line--total {
  font-size: 20px;
  font-weight: 700;
  color: var(--orderzy-ink);
  padding-top: 14px;
  margin-top: 6px;
  border-top: 1px solid var(--orderzy-border);
}
.summary__btn { margin-top: 20px; }
.summary__trust {
  display: flex;
  align-items: center;
  gap: 8px;
  justify-content: center;
  margin-top: 14px;
  font-size: 12px;
  color: var(--orderzy-ink-muted);
}

/* Compact navbar for checkout */
.oz-nav--minimal .oz-nav__links { gap: 18px; }

/* ---------- Mobile adjustments ---------- */
/* P1.C05.hotfix (2026-08-16). Tablet range (881-1023px) between the desktop
   two-column hero and the mobile stack. The preview card hides here so the
   hero doesn't feel cramped, and the copy column centres to a comfortable
   editorial width instead of clinging to the left edge of a 1000px viewport. */
@media (max-width: 1023px) {
  .hero__preview { display: none; }
}
@media (min-width: 881px) and (max-width: 1023px) {
  .hero__grid {
    grid-template-columns: 1fr;
    max-width: 720px;
    margin-left: auto;
    margin-right: auto;
  }
  .hero__headline { font-size: 48px; }
  .hero__trust { justify-content: flex-start; }
}
@media (max-width: 880px) {
  .hero { padding: 32px 0 40px; }
  /* 2026-08-28 audit F.22 (acceptance follow-up): `1fr` = `minmax(auto, 1fr)`
     lets grid items grow past the viewport when a child has intrinsic
     min-content > viewport width (e.g. a search <input> at ~220px inside
     a 306px viewport - the input's default `size` attribute forces min-
     content, and the grid track expands to accommodate). `minmax(0, 1fr)`
     forces the track to actually shrink with the viewport. See same fix
     on `.rest-layout` at ~1706. */
  .hero__grid { grid-template-columns: minmax(0, 1fr); gap: 40px; }
  .hero__grid > * { min-width: 0; max-width: 100%; }
  .hero__grid input { min-width: 0; }
  .hero__headline { font-size: 40px; }
  .ra-band__grid { grid-template-columns: minmax(0, 1fr); gap: 32px; }
  .ra-band__grid > * { min-width: 0; max-width: 100%; }
  .ra-band__title { font-size: 30px; }
  .ra-band__benefits { grid-template-columns: minmax(0, 1fr); }
  .ra-band__benefits > * { min-width: 0; max-width: 100%; }
  .steps { grid-template-columns: minmax(0, 1fr); }
  .steps > * { min-width: 0; max-width: 100%; }
  .co-layout { grid-template-columns: minmax(0, 1fr); gap: 24px; padding: 24px 0 48px; }
  .co-layout > * { min-width: 0; max-width: 100%; }
  .summary { position: static; }
  /* P4.C08 (2026-08-15): `.oz-footer__grid` mobile fallback deleted; the
     compact footer's `.oz-footer__cols` already collapses at ≤540px. */
  .oz-nav__links { gap: 14px; }
  .oz-nav__link--restaurant { padding: 6px 10px; font-size: 13px; }
}
@media (max-width: 520px) {
  .hero__headline { font-size: 32px; }
  .section__title { font-size: 24px; }
  /* P4.C08 (2026-08-15): `.oz-footer__grid` mobile fallback deleted alongside
     the legacy grid selector. Compact footer collapses at its own breakpoint. */
  .form-row { grid-template-columns: 1fr; }

  /* Navbar: plain text links collapse at mobile. Restaurant pill + cart/bell stay visible. */
  .oz-nav__inner { padding: 0 16px; height: 60px; }
  .oz-nav__links { gap: 8px; }
  .oz-nav__link { display: none; }
  .oz-nav__link--restaurant { padding: 5px 10px; font-size: 12px; }
  .oz-wordmark { font-size: 20px; }
  /* Minimal checkout navbar keeps its links visible (Back + Secure badge). */
  .oz-nav--minimal .oz-nav__link { display: inline-flex; font-size: 12.5px; }
  .oz-nav--minimal .oz-nav__links { gap: 10px; }
}
@media (max-width: 420px) {
  .oz-nav__inner { padding: 0 14px; height: 56px; }
  .oz-nav__links { gap: 6px; }
  .oz-nav__link--restaurant { padding: 4px 8px; font-size: 11.5px; }
  .oz-nav__cart, .oz-nav__bell { width: 36px; height: 36px; }
  .oz-wordmark { font-size: 19px; }
  .oz-nav--minimal .oz-nav__link { font-size: 11.5px; }
}

/* ===================================================================
   BATCH 1 ADDITIONS. Cross-cutting patterns
   (toasts, empty states, mobile nav, bell, error pages, gallery)
   =================================================================== */

/* ---------- Toasts ---------- */
.toast-stack {
  position: fixed;
  top: 24px;
  right: 24px;
  z-index: var(--z-toast);
  display: flex;
  flex-direction: column;
  gap: 10px;
  max-width: 420px;
  width: calc(100% - 48px);
}
.toast-stack--inline { position: static; width: 100%; max-width: 480px; }
/* Toast class prefixed `oz-toast` to sidestep Bootstrap 5.3's
   `.toast:not(.show) { display: none; }` collision (loaded globally from
   base.html). Prior fix used `.show` on the toast + a specificity override
   as a band-aid; the rename below eliminates the collision at the root so
   neither band-aid is needed any more. If a future refactor reintroduces
   the plain `.toast` class name, the regression test guarding this file
   will fail and remind whoever did it why the rename happened. */
.oz-toast {
  display: flex;
  gap: 12px;
  align-items: flex-start;
  padding: 14px 16px;
  border-radius: var(--r-md);
  background: var(--orderzy-surface);
  box-shadow: var(--orderzy-shadow-lift);
  border: 1px solid var(--orderzy-border);
}
.oz-toast__icon { flex-shrink: 0; width: 20px; height: 20px; margin-top: 2px; }
.oz-toast__body { flex: 1; min-width: 0; }
.oz-toast__title { font-size: 14px; font-weight: 700; color: var(--orderzy-ink); margin: 0; line-height: 1.4; }
.oz-toast__msg { font-size: 13px; color: var(--orderzy-ink-soft); line-height: 1.45; margin: 3px 0 0; }
.oz-toast__action { background: none; border: none; font-weight: 700; color: var(--orderzy-brand-ink); cursor: pointer; margin-top: 8px; font-size: 13px; padding: 0; }
.oz-toast__action:hover { text-decoration: underline; }
.oz-toast__close {
  background: transparent;
  border: none;
  color: var(--orderzy-ink-muted);
  cursor: pointer;
  padding: 2px;
  margin: -2px;
  border-radius: var(--r-xs);
  flex-shrink: 0;
}
.oz-toast__close:hover { color: var(--orderzy-ink); background: var(--orderzy-surface-alt); }
.oz-toast--success { border-left: 3px solid var(--orderzy-success); }
.oz-toast--success .oz-toast__icon { color: var(--orderzy-success); }
.oz-toast--error { border-left: 3px solid var(--orderzy-danger); }
.oz-toast--error .oz-toast__icon { color: var(--orderzy-danger); }
.oz-toast--warning { border-left: 3px solid var(--orderzy-warning); }
.oz-toast--warning .oz-toast__icon { color: var(--orderzy-warning); }
.oz-toast--info { border-left: 3px solid var(--orderzy-brand); }
.oz-toast--info .oz-toast__icon { color: var(--orderzy-brand); }

/* M12: native <dialog> confirm shim. Replaces sweetalert.swal() on
   destructive-action confirmations (cart switch, delete, etc.). */
.oz-confirm {
  border: none;
  padding: 0;
  border-radius: var(--r-lg);
  box-shadow: var(--orderzy-shadow-lift);
  max-width: 420px;
  width: calc(100% - 32px);
  background: var(--orderzy-surface);
  color: var(--orderzy-ink);
}
.oz-confirm::backdrop { background: rgba(0, 0, 0, 0.45); }
.oz-confirm__body { padding: 24px 24px 8px; }
.oz-confirm__title {
  /* Post-Luxe-unification (2026-08-14): --orderzy-font-heading was never
     defined; the retired Montserrat fallback made every confirm-dialog
     title render in system sans-serif. Now points at the canonical
     --font-heading token that :root defines. */
  font-family: var(--font-heading, 'DM Serif Display', Georgia, serif);
  font-size: 18px;
  font-weight: 700;
  margin: 0 0 8px;
  color: var(--orderzy-ink);
}
.oz-confirm__text {
  font-size: 14px;
  line-height: 1.5;
  color: var(--orderzy-ink-soft);
  margin: 0;
}
.oz-confirm__actions {
  display: flex;
  gap: 8px;
  justify-content: flex-end;
  padding: 16px 24px 20px;
  flex-wrap: wrap;
}
.oz-confirm__btn {
  font-family: inherit;
  font-size: 14px;
  font-weight: 600;
  padding: 10px 18px;
  border-radius: var(--r-md);
  border: 1px solid transparent;
  cursor: pointer;
  min-height: 40px;
}
.oz-confirm__btn--cancel {
  background: var(--orderzy-surface-alt);
  color: var(--orderzy-ink-soft);
  border-color: var(--orderzy-border);
}
.oz-confirm__btn--cancel:hover { background: var(--orderzy-border); }
.oz-confirm__btn--confirm {
  background: var(--orderzy-brand-deep);
  color: var(--orderzy-surface);
}
.oz-confirm__btn--confirm:hover { background: var(--orderzy-brand-hover); }
.oz-confirm__btn--danger {
  background: var(--orderzy-danger);
  color: var(--orderzy-surface);
}
.oz-confirm__btn--danger:hover { filter: brightness(0.92); }

/* ---------- Empty state ---------- */
.empty-state {
  text-align: center;
  padding: 48px 24px;
  max-width: 440px;
  margin: 0 auto;
}
.empty-state--card {
  background: var(--orderzy-surface);
  border-radius: var(--r-lg);
  border: 1px solid var(--orderzy-border);
  padding: 56px 32px;
  max-width: none;
}
.empty-state__icon {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 72px;
  height: 72px;
  border-radius: 50%;
  background: var(--orderzy-brand-soft);
  color: var(--orderzy-brand);
  margin: 0 auto 20px;
}
.empty-state__icon svg { width: 32px; height: 32px; }
.empty-state__title {
  font-family: var(--font-heading);
  font-size: 22px;
  font-weight: 700;
  color: var(--orderzy-ink);
  margin: 0 0 8px;
}
.empty-state__text {
  font-size: 15px;
  color: var(--orderzy-ink-soft);
  line-height: 1.55;
  margin: 0 0 24px;
}
.empty-state__actions {
  display: flex;
  gap: 10px;
  justify-content: center;
  flex-wrap: wrap;
}

/* ---------- Error page ---------- */
.error-page {
  min-height: 60vh;
  display: grid;
  place-items: center;
  padding: 60px 24px;
}
.error-page__inner { text-align: center; max-width: 520px; }
.error-page__code {
  font-family: var(--font-heading);
  font-size: 120px;
  font-weight: 700;
  line-height: 1;
  color: var(--orderzy-brand);
  letter-spacing: -0.04em;
  margin: 0 0 8px;
}
.error-page__title {
  font-family: var(--font-heading);
  font-size: 32px;
  font-weight: 700;
  color: var(--orderzy-ink);
  margin: 0 0 12px;
  letter-spacing: -0.02em;
}
.error-page__sub {
  font-size: 17px;
  color: var(--orderzy-ink-soft);
  line-height: 1.55;
  margin: 0 0 32px;
}
.error-page__actions {
  display: flex;
  gap: 12px;
  justify-content: center;
  flex-wrap: wrap;
}
.error-page__hint {
  margin-top: 40px;
  padding: 20px;
  border-radius: var(--r-md);
  background: var(--orderzy-surface-alt);
  font-size: 14px;
  color: var(--orderzy-ink-soft);
  text-align: left;
}
.error-page__hint strong { color: var(--orderzy-ink); }
.error-page__hint a { color: var(--orderzy-brand-ink); font-weight: 700; }

/* ---------- Mobile hamburger + drawer ----------
   Phase C rewrite (2026-08-29 / audit Z-01):

   The drawer used to be a normal-flow child of <header class="oz-nav">,
   which meant it lived inside .oz-nav's stacking context (z-index: 50).
   Any sibling of .oz-nav with a higher z-index would paint on top of
   the drawer, no matter what z-index the drawer itself claimed. That's
   how the sticky category chip strip (z-index: 90, before Phase C)
   ended up hiding the "For Restaurants" pill inside the drawer on
   phones. See docs/plans/diners-notifications-drawer-2026-08-29.md.

   Structural fix: navbar.html now renders the drawer AND a paired
   backdrop OUTSIDE the <header> element, as body-level siblings. Both
   position: fixed, both in the root stacking context, both z-indexed
   via the --z-drawer / --z-drawer-backdrop tokens defined on :root.
   The drawer positions itself below the nav via --oz-nav-h.

   Breakpoint change: hamburger + drawer + hide-desktop-links used to
   activate at <=720px. Now aligned with the chip strip at <=880px so
   the "not desktop" mental model is a single clean breakpoint. iPad
   portrait (768x1024) now gets the compact nav plus the chip strip
   category filter, matching how iPad-portrait diners actually browse.

   Accessibility: the drawer script in navbar.html adds a focus trap,
   ESC-to-close, and tap-outside-to-close via the backdrop.
   -------------------------------------- */
.oz-nav__burger {
  display: none;
  background: var(--orderzy-surface);
  border: 1px solid var(--orderzy-border);
  border-radius: var(--r-sm);
  width: 40px;
  height: 40px;
  align-items: center;
  justify-content: center;
  color: var(--orderzy-ink);
  cursor: pointer;
}
.oz-nav__drawer {
  position: fixed;
  top: var(--oz-nav-h, 56px);
  left: 0;
  right: 0;
  z-index: var(--z-drawer);
  background: var(--orderzy-canvas);
  border-top: 1px solid var(--orderzy-border);
  border-bottom: 1px solid var(--orderzy-border);
  padding: 16px 24px 24px;
  display: flex;
  flex-direction: column;
  gap: 4px;
  transform: translateY(-110%);
  transition: transform 220ms var(--ease-decelerate, cubic-bezier(0, 0, 0.2, 1));
  will-change: transform;
  pointer-events: none;
  visibility: hidden;
}
.oz-nav__drawer.open {
  transform: translateY(0);
  pointer-events: auto;
  visibility: visible;
}
.oz-nav__drawer-backdrop {
  position: fixed;
  inset: 0;
  z-index: var(--z-drawer-backdrop);
  background: rgba(26, 24, 21, 0.35);
  opacity: 0;
  pointer-events: none;
  transition: opacity 220ms var(--ease-decelerate, cubic-bezier(0, 0, 0.2, 1));
}
.oz-nav__drawer-backdrop.open {
  opacity: 1;
  pointer-events: auto;
}
@media (max-width: 880px) {
  .oz-nav__burger { display: inline-flex; }
  .oz-nav__desktop-only { display: none !important; }
  .oz-nav__links { gap: 10px; }
}
/* Above the compact breakpoint the drawer is unreachable via the UI
   (no burger) so keep it fully hidden even if a stale .open class is
   left in the DOM by a mid-resize interaction. */
@media (min-width: 881px) {
  .oz-nav__drawer,
  .oz-nav__drawer-backdrop { display: none; }
}
.oz-nav__drawer a {
  padding: 14px 12px;
  border-radius: var(--r-sm);
  font-weight: 600;
  font-size: 16px;
  color: var(--orderzy-ink);
  border: 1px solid transparent;
  text-decoration: none;
}
.oz-nav__drawer a:hover,
.oz-nav__drawer a:focus-visible {
  background: var(--orderzy-surface-alt);
  outline: none;
}
.oz-nav__drawer a:focus-visible {
  border-color: var(--orderzy-brand-ink);
}
.oz-nav__drawer .is-restaurant {
  border-color: var(--orderzy-border-strong);
  color: var(--orderzy-brand-ink);
  background: var(--orderzy-brand-soft);
}

/* ---------- Restaurant staff navbar (bell + user) ---------- */
.oz-nav__bell {
  position: relative;
  display: grid;
  place-items: center;
  width: 40px;
  height: 40px;
  border-radius: var(--r-pill);
  background: var(--orderzy-surface);
  border: 1px solid var(--orderzy-border);
  color: var(--orderzy-ink);
  transition: all var(--dur-fast) var(--ease);
  cursor: pointer;
}
.oz-nav__bell:hover { border-color: var(--orderzy-ink); }
.oz-nav__bell-badge {
  position: absolute;
  top: -4px;
  right: -4px;
  min-width: 18px;
  height: 18px;
  background: var(--orderzy-danger);
  color: #fff;
  border-radius: var(--r-pill);
  font-size: 11px;
  font-weight: 700;
  display: grid;
  place-items: center;
  padding: 0 5px;
  border: 2px solid var(--orderzy-canvas);
}
.oz-nav__user {
  display: grid;
  place-items: center;
  width: 40px;
  height: 40px;
  border-radius: 50%;
  background: var(--orderzy-brand-soft);
  color: var(--orderzy-brand-ink);
  font-family: var(--font-heading);
  font-weight: 700;
  font-size: 14px;
  border: 1px solid var(--orderzy-border);
  cursor: pointer;
  transition: border-color var(--dur-fast) var(--ease);
}
.oz-nav__user:hover { border-color: var(--orderzy-ink); }

/* ---------- User-menu dropdown ----------
   Anchored under the avatar. Opens via click on the avatar; closes on
   outside-click or Escape. Replaces the previous standalone Logout link
   so the navbar stays compact (cart + bell + avatar). */
.oz-user-wrap {
  position: relative;
  display: inline-block;
}
.oz-user-menu {
  display: none;
  position: absolute;
  top: 48px;
  right: 0;
  width: 240px;
  background: var(--orderzy-surface);
  border-radius: var(--r-md);
  box-shadow: var(--orderzy-shadow-lift);
  border: 1px solid var(--orderzy-border);
  overflow: hidden;
  z-index: var(--z-nav-dropdown-inline);
}
.oz-user-menu.open { display: block; }
.oz-user-menu__head {
  padding: 14px 18px 12px;
  border-bottom: 1px solid var(--orderzy-border-soft);
}
.oz-user-menu__name {
  font-family: var(--font-heading);
  font-weight: 700;
  font-size: 14px;
  color: var(--orderzy-ink);
}
.oz-user-menu__email {
  font-size: 12px;
  color: var(--orderzy-ink-muted);
  margin-top: 2px;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.oz-user-menu a {
  display: block;
  padding: 10px 18px;
  font-size: 14px;
  color: var(--orderzy-ink);
  text-decoration: none;
  border: none;
}
.oz-user-menu a:hover { background: var(--orderzy-surface-alt); color: var(--orderzy-brand-ink); }
.oz-user-menu__divider {
  height: 1px;
  background: var(--orderzy-border-soft);
  margin: 4px 0;
}
.oz-user-menu__logout { color: var(--orderzy-ink-muted) !important; }
.oz-user-menu__logout:hover { color: var(--orderzy-danger) !important; background: var(--orderzy-danger-soft, #fff1f0) !important; }

/* ---------- Notification dropdown (oz-notif__*) ---------- */
.oz-notif {
  display: none;
  position: absolute;
  top: 44px;
  right: 0;
  width: 340px;
  background: var(--orderzy-surface);
  border-radius: var(--r-md);
  box-shadow: var(--orderzy-shadow-lift);
  border: 1px solid var(--orderzy-border);
  overflow: hidden;
  z-index: var(--z-nav-dropdown-inline);
}
.oz-notif.open { display: block; }
.oz-notif__head {
  display: flex;
  justify-content: space-between;
  align-items: center;
  padding: 14px 18px;
  border-bottom: 1px solid var(--orderzy-border);
  font-family: var(--font-heading);
  font-weight: 700;
  font-size: 14px;
  color: var(--orderzy-ink);
}
.oz-notif__mark {
  font-size: 12px;
  color: var(--orderzy-brand-ink);
  background: none;
  border: none;
  cursor: pointer;
  font-weight: 700;
}
.oz-notif__list { max-height: 380px; overflow-y: auto; }
.oz-notif__item {
  padding: 12px 18px;
  border-bottom: 1px solid var(--orderzy-border-soft);
  font-size: 13px;
  line-height: 1.45;
  display: flex;
  gap: 10px;
}
.oz-notif__item:last-child { border-bottom: none; }
.oz-notif__item--unread { background: var(--orderzy-brand-soft); }
.oz-notif__dot {
  width: 8px;
  height: 8px;
  border-radius: 50%;
  background: var(--orderzy-brand);
  flex-shrink: 0;
  margin-top: 6px;
}
.oz-notif__item:not(.oz-notif__item--unread) .oz-notif__dot { background: transparent; }
.oz-notif__body { flex: 1; min-width: 0; }
.oz-notif__msg { color: var(--orderzy-ink); }
.oz-notif__time {
  font-size: 11px;
  color: var(--orderzy-ink-muted);
  margin-top: 3px;
  font-weight: 600;
}
.oz-notif__empty {
  padding: 24px 18px;
  text-align: center;
  color: var(--orderzy-ink-muted);
  font-size: 13px;
}
/* Mobile: switch the notification dropdown to a viewport-anchored top sheet
   (2026-09-09). The previous fixed-width absolute-positioned panel worked
   only when the bell was near the right edge of the header (admin shell v2
   pages); on any page where the bell sits mid-header (Fast Order's
   .header-right left-of-centre cluster, and any future POS-style surface),
   the panel's left edge fell OFF the viewport and clipped every notification.
   Fixed positioning with viewport insets removes the bell-position math
   entirely and works on every current and future admin page. The vertical
   `top` is set at open-time by admin-notif-script.html so it hugs the bell's
   own bottom on any header height (Fast Order's wrapped 2-row header, admin
   shell v2's single 56px topbar, future layouts).
   Breakpoint 768px matches Fast Order's own header-wrap query and covers
   landscape phones + iPad mini portrait (which also wrap the pos header). */
/* Breakpoint locked at 768px to match Fast Order's own header-wrap query
   (fast_order_entry.html @media max-width:768px). Any viewport where the
   header wraps to 2 rows puts the bell in a left-of-centre cluster, so
   the mobile sheet must cover the same range. Covers portrait phones,
   landscape phones (iPhone SE landscape 667, foldable open 720), and
   iPad mini portrait (744). Tablets 769px+ keep the desktop dropdown. */
@media (max-width: 768px) {
  .oz-notif {
    position: fixed;
    top: 60px;                    /* JS overrides on open with bell.bottom + 6 */
    left: 8px;
    right: 8px;
    width: auto;
    max-width: 420px;
    margin-inline: auto;
  }
  /* Small caret pointing up at the bell so the panel still reads as coming
     from the bell, not floating disconnected. Position of the tip is set at
     open-time by admin-notif-script.html via --oz-notif-caret-x. Default
     centre matches the caret hidden state when JS is unavailable. */
  .oz-notif::before {
    content: '';
    position: absolute;
    top: -6px;
    left: var(--oz-notif-caret-x, 50%);
    transform: translateX(-50%);
    width: 12px;
    height: 12px;
    background: var(--orderzy-surface);
    border-top: 1px solid var(--orderzy-border);
    border-left: 1px solid var(--orderzy-border);
    rotate: 45deg;
    border-top-left-radius: 2px;
  }
}


/* Mobile viewport frame for mockups */
.mobile-frame {
  max-width: 390px;
  margin: 0 auto;
  border: 1px solid var(--orderzy-border-strong);
  border-radius: 28px;
  overflow: hidden;
  background: var(--orderzy-canvas);
  box-shadow: var(--orderzy-shadow-whisper);
}
.mobile-frame .oz-nav { border-radius: 0; }
.mobile-frame__status {
  padding: 10px 20px 6px;
  display: flex;
  justify-content: space-between;
  font-size: 12px;
  font-weight: 700;
  color: var(--orderzy-ink);
  background: var(--orderzy-canvas);
}

/* Mockup page header band */
.mockup-hdr {
  background: var(--orderzy-ink);
  color: var(--orderzy-ink-invert);
  padding: 12px 24px;
  font-family: var(--font-heading);
  font-size: 12px;
  font-weight: 600;
  display: flex;
  gap: 16px;
  align-items: center;
  flex-wrap: wrap;
}
.mockup-hdr__badge {
  font-weight: 700;
  padding: 3px 9px;
  border-radius: var(--r-xs);
  font-size: 10px;
  letter-spacing: 0.08em;
  text-transform: uppercase;
}
.mockup-hdr__badge--cross   { background: var(--orderzy-brand); color: #fff; }
.mockup-hdr__badge--rebuild { background: var(--orderzy-danger); color: #fff; }
.mockup-hdr__badge--refine  { background: var(--orderzy-warning); color: #fff; }
.mockup-hdr__badge--repaint { background: var(--orderzy-success); color: #fff; }
.mockup-hdr__path { opacity: 0.7; font-family: ui-monospace, Menlo, monospace; }
.mockup-hdr__note { opacity: 0.85; margin-left: auto; font-weight: 400; }


/* ===================================================================
   BATCH 3 ADDITIONS. Shared marketing-page patterns
   (breadcrumbs, section shells, FAQ, CTA band).
   Prefix: mk-* (marketing).
   =================================================================== */

/* ---------- Breadcrumb ---------- */
.mk-crumbs {
  padding: 18px 0 4px;
  font-size: 13px;
  color: var(--orderzy-ink-muted);
}
.mk-crumbs a { color: var(--orderzy-brand-ink); font-weight: 600; }
.mk-crumbs a:hover { text-decoration: underline; }
.mk-crumbs__sep { opacity: 0.4; margin: 0 6px; }

/* ---------- Section shell ---------- */
.mk-sec { padding: 64px 0; }
.mk-sec--alt { background: var(--orderzy-surface-alt); }
.mk-sec--ink { background: var(--orderzy-ink); color: var(--orderzy-ink-invert); }
.mk-sec--ink .mk-sec__title,
.mk-sec--ink h2,
.mk-sec--ink h3 { color: #fff; }
.mk-sec--ink .mk-sec__sub,
.mk-sec--ink p { color: rgba(250,249,245,0.75); }

.mk-sec__eyebrow {
  display: inline-block;
  font-family: var(--font-heading);
  /* 2026-08-22: 11px → 12px to hit the caption/fine-print floor. */
  font-size: 12px;
  font-weight: 700;
  letter-spacing: 0.1em;
  text-transform: uppercase;
  color: var(--orderzy-brand-ink);
  background: var(--orderzy-brand-soft);
  padding: 4px 11px;
  border-radius: var(--r-pill);
  margin-bottom: 14px;
}
.mk-sec--ink .mk-sec__eyebrow {
  background: rgba(242,133,0,0.16);
  color: var(--orderzy-brand);
}
.mk-sec__title {
  font-family: var(--font-heading);
  font-size: 36px;
  font-weight: 700;
  line-height: 1.1;
  letter-spacing: -0.02em;
  margin: 0 0 12px;
  max-width: 780px;
}
.mk-sec__sub {
  font-size: 17px;
  color: var(--orderzy-ink-soft);
  line-height: 1.6;
  max-width: 680px;
  margin: 0 0 32px;
}

/* ---------- FAQ accordion ---------- */
.mk-faq { max-width: 820px; }
.mk-faq details {
  background: var(--orderzy-surface);
  border: 1px solid var(--orderzy-border);
  border-radius: var(--r-md);
  margin-bottom: 10px;
  overflow: hidden;
}
.mk-faq summary {
  padding: 18px 22px;
  font-family: var(--font-heading);
  font-weight: 700;
  font-size: 16px;
  color: var(--orderzy-ink);
  cursor: pointer;
  list-style: none;
  display: flex;
  justify-content: space-between;
  align-items: center;
  gap: 14px;
}
.mk-faq summary::-webkit-details-marker { display: none; }
.mk-faq summary::after {
  content: "+";
  font-family: var(--font-heading);
  font-size: 22px;
  color: var(--orderzy-brand);
  width: 28px;
  height: 28px;
  display: grid;
  place-items: center;
  border-radius: 50%;
  background: var(--orderzy-brand-soft);
  flex-shrink: 0;
  line-height: 1;
}
.mk-faq details[open] summary::after { content: "\2212"; }
.mk-faq details p {
  padding: 0 22px 18px;
  margin: 0;
  font-size: 15px;
  color: var(--orderzy-ink-soft);
  line-height: 1.7;
}

/* ---------- Final CTA band (dark) ---------- */
.mk-cta {
  background: var(--orderzy-ink);
  color: var(--orderzy-ink-invert);
  padding: 64px 0;
  text-align: center;
}
.mk-cta h2 {
  font-family: var(--font-heading);
  font-size: 32px;
  font-weight: 700;
  letter-spacing: -0.02em;
  color: #fff;
  margin: 0 0 12px;
}
.mk-cta p {
  font-size: 16px;
  color: rgba(250,249,245,0.75);
  max-width: 540px;
  margin: 0 auto 28px;
  line-height: 1.55;
}
.mk-cta__ctas {
  display: flex;
  gap: 12px;
  justify-content: center;
  flex-wrap: wrap;
}
.mk-cta .btn--ghost {
  color: #fff;
  border: 1px solid rgba(255,255,255,0.22);
}
.mk-cta .btn--ghost:hover {
  background: rgba(255,255,255,0.06);
  color: var(--orderzy-brand);
}

/* ---------- Marketing responsive ---------- */
@media (max-width: 880px) {
  .mk-sec { padding: 48px 0; }
  .mk-sec__title { font-size: 28px; }
  .mk-cta h2 { font-size: 26px; }
}
@media (max-width: 520px) {
  .mk-sec__title { font-size: 24px; }
}

/* ===================================================================
   Policy / prose pages (about, privacy, refunds, terms)
   Simple form pattern (contact) and shared long-form typography.
   =================================================================== */

.mk-prose {
  color: var(--orderzy-ink-soft);
  font-size: 16px;
  line-height: 1.75;
  max-width: 760px;
}
.mk-prose > :first-child { margin-top: 0; }
.mk-prose h2 {
  font-family: var(--font-heading);
  font-size: 22px;
  font-weight: 700;
  color: var(--orderzy-ink);
  margin: 32px 0 12px;
  letter-spacing: -0.01em;
}
.mk-prose h3 {
  font-family: var(--font-heading);
  font-size: 17px;
  font-weight: 700;
  color: var(--orderzy-ink);
  margin: 24px 0 10px;
}
.mk-prose h4 {
  font-family: var(--font-heading);
  font-size: 15px;
  font-weight: 600;
  color: var(--orderzy-ink);
  margin: 20px 0 8px;
}
.mk-prose p { margin: 0 0 14px; }
.mk-prose ul,
.mk-prose ol { padding-left: 22px; margin: 0 0 14px; }
.mk-prose li { margin-bottom: 6px; }
.mk-prose a {
  color: var(--orderzy-brand-ink);
  font-weight: 600;
  text-decoration: none;
}
.mk-prose a:hover { text-decoration: underline; }
.mk-prose strong { color: var(--orderzy-ink); font-weight: 700; }
.mk-prose hr {
  border: 0;
  border-top: 1px solid var(--orderzy-border);
  margin: 28px 0;
}
.mk-prose__meta {
  font-size: 13px;
  color: var(--orderzy-ink-muted);
  margin: 0 0 24px;
}
.mk-prose__lead {
  font-size: 17px;
  color: var(--orderzy-ink-soft);
  line-height: 1.65;
  margin: 0 0 20px;
  padding: 16px 20px;
  background: var(--orderzy-brand-soft);
  border-left: 3px solid var(--orderzy-brand);
  border-radius: var(--r-sm);
}

/* Document card (optional card-wrap around .mk-prose) */
.mk-doc-card {
  background: #fff;
  border: 1px solid var(--orderzy-border);
  border-radius: var(--r-md);
  padding: 40px;
  box-shadow: 0 1px 3px rgba(31,29,26,0.04);
}
@media (max-width: 560px) {
  .mk-doc-card { padding: 28px 20px; }
}

/* Simple form (contact, non-auth forms) */
.mk-form { max-width: 560px; }
.mk-form__field { margin-bottom: 18px; }
.mk-form__label {
  display: block;
  font-family: var(--font-heading);
  font-size: 13px;
  font-weight: 600;
  color: var(--orderzy-ink);
  margin-bottom: 6px;
}
.mk-form__input,
.mk-form__textarea {
  width: 100%;
  padding: 11px 14px;
  font-family: var(--font-body);
  font-size: 14px;
  color: var(--orderzy-ink);
  background: #fff;
  border: 1px solid var(--orderzy-border-strong);
  border-radius: var(--r-xs);
  transition: all var(--dur-fast) var(--ease);
}
.mk-form__textarea { min-height: 120px; resize: vertical; }
.mk-form__input:focus,
.mk-form__textarea:focus {
  outline: none;
  border-color: var(--orderzy-brand);
  box-shadow: 0 0 0 3px var(--orderzy-brand-soft);
}
.mk-form__input::placeholder,
.mk-form__textarea::placeholder { color: var(--orderzy-ink-muted); }
.mk-form__help { font-size: 12px; color: var(--orderzy-ink-muted); margin-top: 6px; }
.mk-form__error {
  background: #FEE2E2;
  color: #991B1B;
  padding: 12px 16px;
  border-radius: var(--r-sm);
  font-size: 13px;
  margin-top: 14px;
}
.mk-form__error p { margin: 0; }
.mk-form__success {
  background: #D1FAE5;
  color: #065F46;
  padding: 14px 18px;
  border-radius: var(--r-sm);
  font-size: 14px;
  text-align: center;
}

/* Direct-contact link row (contact page, below the form) */
.mk-contact-links {
  display: flex;
  gap: 20px;
  flex-wrap: wrap;
  margin-top: 8px;
}
.mk-contact-links a {
  color: var(--orderzy-brand-ink);
  text-decoration: none;
  font-weight: 600;
  font-size: 14px;
  display: inline-flex;
  align-items: center;
  gap: 8px;
  transition: color var(--dur-fast) var(--ease);
}
.mk-contact-links a:hover { color: var(--orderzy-brand); }

/* ============================================================================
   RESTAURANT DETAIL PAGE (merged from legacy menu-row.css on 2026-04-19)
   ============================================================================ */

/* Menu category (section) */
.menu-cat {
  margin-bottom: 48px;
  /* 2026-08-28 audit F.29: on mobile the site header + sticky pill strip
     + search bar + filter chips + order-type card together cover ~120px
     of the top viewport. scrollIntoView(block:'start') alone lands the
     section title UNDER that stack. `scroll-margin-top` teaches the
     scroll target to leave that room so the tap lands within a few
     pixels of the sticky-strip bottom. Desktop drops it to 40px because
     the sidebar is not sticky-blocking there. Modern browsers respect
     this natively with the scrollIntoView call in scrollToCategory(). */
  scroll-margin-top: 120px;
}
@media (min-width: 881px) {
  .menu-cat { scroll-margin-top: 40px; }
}
.menu-cat:last-child { margin-bottom: 0; }
.menu-cat__head {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  padding-bottom: 14px;
  border-bottom: 1px solid var(--orderzy-border);
  margin-bottom: 20px;
}
.menu-cat__title {
  font-family: var(--font-heading);
  font-size: 22px;
  font-weight: 700;
  color: var(--orderzy-ink);
  margin: 0;
  letter-spacing: -0.01em;
}
.menu-cat__count {
  font-size: 13px;
  color: var(--orderzy-ink-muted);
  font-weight: 600;
}

/* Menu item (row: info left, 140x140 image right, Add/qty below image) */
.menu-item {
  display: flex;
  gap: 20px;
  padding: 20px 0;
  border-bottom: 1px solid var(--orderzy-border-soft, #f0ebe4);
}
.menu-item:last-child { border-bottom: none; }
.menu-item__info {
  flex: 1;
  min-width: 0;
  display: flex;
  flex-direction: column;
  gap: 6px;
}
.menu-item__head { display: flex; align-items: center; gap: 8px; }

/* CSS-drawn veg / non-veg indicator */
.menu-item__veg {
  width: 14px;
  height: 14px;
  border: 2px solid;
  border-radius: 2px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  flex-shrink: 0;
}
.menu-item__veg--veg { border-color: #1f9d55; }
.menu-item__veg--veg::after {
  content: '';
  width: 6px;
  height: 6px;
  border-radius: 50%;
  background: #1f9d55;
}
.menu-item__veg--nonveg { border-color: #b53333; }
.menu-item__veg--nonveg::after {
  content: '';
  width: 0;
  height: 0;
  border-left: 4px solid transparent;
  border-right: 4px solid transparent;
  border-bottom: 7px solid #b53333;
}
/* Prompt-2 / Pattern 5 (2026-09-13). Egg square: ochre outline + ochre  */
/* filled diamond, visually distinct from veg (green circle) and nonveg  */
/* (red triangle). Fixes S1-4 by giving contains_egg items a marker of   */
/* their own. Colour matches FSSAI's newer eggetarian pictogram.         */
.menu-item__veg--egg { border-color: #c9861f; }
.menu-item__veg--egg::after {
  content: '';
  width: 6px;
  height: 6px;
  background: #c9861f;
  transform: rotate(45deg);
  border-radius: 1px;
}

.menu-item__title {
  font-family: var(--font-heading);
  font-size: 17px;
  font-weight: 700;
  color: var(--orderzy-ink);
  margin: 0;
}
.menu-item__price {
  font-size: 16px;
  font-weight: 700;
  color: var(--orderzy-ink);
  font-feature-settings: "tnum";
}
.menu-item__desc {
  font-size: 14px;
  color: var(--orderzy-ink-soft);
  line-height: 1.5;
  margin: 2px 0 0;
  /* Warmth: 2-line clamp with "more" reveal. Luxe override at :8564 keeps 3 lines.
     Owner-authored line breaks are preserved so paragraph-style descriptions read as intended. */
  white-space: pre-line;
  display: -webkit-box;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
  overflow: hidden;
}
.menu-item__desc.is-expanded {
  -webkit-line-clamp: unset;
  overflow: visible;
}
/* 2026-08-28 acceptance run: chef note + provenance use the same "more"
   expansion pattern as description. Chef note is 2-line clamped, so its
   expanded state unclamps line-clamp. Provenance is single-line ellipsis
   (white-space: nowrap + text-overflow: ellipsis), so its expanded state
   removes both. Also add the wrapper positioning for both selectors so
   the "more" button floats at the bottom-right the same way. */
.menu-item__chef-note.is-expanded {
  -webkit-line-clamp: unset;
  overflow: visible;
}
.menu-item__provenance.is-expanded {
  white-space: normal;
  overflow: visible;
  text-overflow: clip;
}
/* 2026-08-28 audit F.26: the "more" button used to sit as a sibling BELOW
   the description on its own line at the left margin, which read as an
   unrelated action rather than the continuation of the sentence. The
   wrap below (injected by menu-desc-toggle.js) makes the paragraph the
   positioning context and floats the button over the bottom-right of
   the clamped block with a fade-out mask so it reads as "... more". */
.oz-desc-wrap {
  position: relative;
  margin: 2px 0 0;
}
.oz-desc-wrap .menu-item__desc {
  margin: 0;
}
.oz-desc-more {
  background: none;
  border: none;
  padding: 4px 0 0;
  color: var(--orderzy-brand-ink);
  font-family: inherit;
  font-size: 12px;
  font-weight: 600;
  cursor: pointer;
  letter-spacing: 0.01em;
}
.oz-desc-wrap .oz-desc-more {
  position: absolute;
  right: 0;
  bottom: 0;
  padding: 0 0 0 24px;
  min-height: 22px;
  /* Fade the last few characters of the description into the surface
     colour so "... more" reads as the sentence continuing. The
     surface-alt is close to the menu row's own background on both
     Warmth themes and dark mode. */
  background: linear-gradient(
    to right,
    transparent 0,
    var(--orderzy-surface, #fff) 20px
  );
  /* Guarantees a 32px vertical tap target without pushing the button
     off the visible line. */
  line-height: 22px;
}
/* Expanded state: cancel the absolute positioning so the button sits
   below the fully-revealed content on its own line (the "less"
   affordance is fine there because the element is no longer clamped).
   2026-08-28 acceptance run: mirror the same for chef note + provenance. */
.oz-desc-wrap .menu-item__desc.is-expanded ~ .oz-desc-more,
.oz-desc-wrap .menu-item__chef-note.is-expanded ~ .oz-desc-more,
.oz-desc-wrap .menu-item__provenance.is-expanded ~ .oz-desc-more {
  position: static;
  padding: 4px 0 0;
  background: none;
  min-height: 0;
  line-height: inherit;
}
.oz-desc-more:hover, .oz-desc-more:focus {
  text-decoration: underline;
  outline: none;
}
.oz-desc-more:focus-visible {
  outline: 2px solid var(--orderzy-brand);
  outline-offset: 2px;
  border-radius: 2px;
}
@media print {
  .menu-item__desc { -webkit-line-clamp: unset; display: block; overflow: visible; }
  .oz-desc-more { display: none; }
}

/* Image block + floating Add button / qty stepper.
   Media is column-flex so variant rows (Full + Half) can stack BELOW the photo
   without overflowing into the next card. Photo dims fixed on the inner
   .menu-item__img / .menu-item__no-photo so the photo stays square. */
.menu-item__media {
  position: relative;
  width: 140px;
  flex-shrink: 0;
  display: flex;
  flex-direction: column;
  gap: 8px;
}
/* 2026-08-28 audit F.25: the `--noimg` width override that used to sit
   here collapsed the media column to `auto` when the row had no photo,
   so a menu with mixed photo/no-photo cards had inconsistent row shapes
   card by card. Deleted so the placeholder tile (.menu-item__no-photo)
   holds the same 140x140 footprint as .menu-item__img. Mobile breakpoint
   below scales BOTH together. */
.menu-item__img { width: 140px; height: 140px; object-fit: cover; border-radius: var(--r-md); }
/* Mobile: scale both photo and placeholder together per breakpoint so
   the row keeps a single shape at every width. Layer added 2026-08-28
   (audit F.25). Ratio and gap unchanged. */
@media (max-width: 480px) {
  .menu-item__media { width: 112px; }
  .menu-item__img,
  .menu-item__no-photo { width: 112px; height: 112px; }
}
@media (max-width: 380px) {
  .menu-item__media { width: 96px; }
  .menu-item__img,
  .menu-item__no-photo { width: 96px; height: 96px; }
}
/* 2026-08-31 customer menu surface cleanup - Commit C: placeholder retint.
   Old design: cream-tinted box + dashed border + muted broken-image icon +
   "Photo coming soon" text. Read as "restaurant hasn't finished setup".
   New design: soft-amber tint (matches session-identity + brand tokens),
   solid border, brand-ink dish-outline icon at higher opacity, no text.
   Reads as intentional editorial. Text-related properties left in place
   (font, letter-spacing) as dead-but-harmless CSS since a future re-add
   of a text label would inherit them; row shape / dimensions per test
   F.25 stay untouched. */
.menu-item__no-photo {
  width: 140px;
  height: 140px;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: 6px;
  color: var(--orderzy-brand-ink);
  /* Prompt 2 · S2-4 (2026-09-13). Soft brand gradient instead of a flat
     tint so the placeholder reads as intentional editorial rather than
     the "same icon 25 times down the page" the audit flagged. */
  background: linear-gradient(135deg, var(--orderzy-brand-soft) 0%, var(--orderzy-warning-soft) 100%);
  border: 1px solid var(--orderzy-brand-soft);
  border-radius: var(--r-md);
  font-family: var(--font-body, 'Inter', sans-serif);
  font-size: 10px;
  font-weight: 500;
  line-height: 1.2;
  letter-spacing: 0.12em;
  text-align: center;
  padding: 6px;
}
.menu-item__no-photo svg { opacity: 0.55; }
/* Legacy second-rule stub, kept as a no-op so any historical cascade that
   depended on its presence stays consistent (2026-08-22 comment preserved). */
.menu-item__no-photo {
  border-style: solid;
  border-color: var(--orderzy-brand-soft);
  font-family: var(--font-body, 'Inter', sans-serif);
  /* 2026-08-22: text-transform: uppercase removed (see comment on the block above). */
  letter-spacing: 0.12em;
  font-size: 10px;
  font-weight: 500;
}

.menu-item__add {
  position: absolute;
  bottom: -14px;
  left: 50%;
  transform: translateX(-50%);
  background: #ffffff;
  color: var(--orderzy-brand-deep);
  /* 2px brand-deep border + lift shadow + 2px white outline keeps the button
     readable when it sits half-overlapping a food photo, whether the photo is
     bright (white plate) or dark (charred meat / black plate). Single 1px border
     + whisper shadow disappeared on dark photos (image-2 report 2026-06-14). */
  border: 2px solid var(--orderzy-brand-deep);
  border-radius: var(--r-sm);
  font-family: var(--font-heading);
  font-weight: 700;
  font-size: 13px;
  padding: 8px 20px;
  letter-spacing: 0.04em;
  text-transform: uppercase;
  box-shadow:
    0 0 0 2px rgba(255, 255, 255, 0.85),
    var(--orderzy-shadow-lift);
  cursor: pointer;
  transition: all var(--dur-fast) var(--ease);
  white-space: nowrap;
}
.menu-item__add:hover {
  background: var(--orderzy-brand-deep);
  color: #fff;
  box-shadow:
    0 0 0 2px rgba(255, 255, 255, 0.85),
    var(--orderzy-shadow-lift);
}
.menu-item__add:disabled {
  opacity: 0.5;
  cursor: not-allowed;
  border-color: var(--orderzy-border);
  color: var(--orderzy-ink-muted);
  background: var(--orderzy-surface-alt);
}
.menu-item__add:disabled:hover { background: var(--orderzy-surface-alt); color: var(--orderzy-ink-muted); }
.menu-item__media--noimg .menu-item__add,
.menu-item__media--noimg .qty-stepper {
  position: static;
  transform: none;
}
/* Two-variant (Full + Half) rows: take buttons OUT of absolute layout so
   they sit inline with their "FULL"/"HALF" labels instead of stacking on
   top of each other at bottom:-14px;left:50%.
   IMPORTANT: selector includes .menu-item__media to beat the base rule at
   `.menu-item__media .qty-stepper { position:absolute }` below - both had
   specificity (0,2,0) before and the LATER rule was winning on tie, which
   sent every variant stepper back to absolute layout and overlapped the
   FULL/HALF labels (image-8/image-9 bug report 2026-05-31). The compound
   `.menu-item__media .menu-item__variants .qty-stepper` is (0,3,0) and
   wins cleanly. */
.menu-item__media .menu-item__variants .menu-item__add,
.menu-item__media .menu-item__variants .qty-stepper,
/* 2026-09-06 permanent fix: `.oz-variant-add` (multi-variant pill toggle
   shipped 2026-09-04) missed this reset. The base `.menu-item__add` rule
   above sets `position: absolute; bottom:-14px; left:50%; translateX(-50%)`
   so it floats at the bottom-center of `.menu-item__media`. Inside
   `.oz-variant-add` that broke both surfaces:
     - Desktop: the price + Add flex row shrank to just the price (Add was
       yanked out of flow), and the absolute Add landed on the same visual
       row as the price, showing the price BEHIND the button outline.
     - Mobile <=380 (column-reverse): the price sat alone at the top of the
       stack, and Add floated at bottom center - visually detached from
       both the pills and the image.
   Adding `.oz-variant-add` here puts the button back in flow so price +
   Add read as one right-aligned row on every breakpoint. */
.menu-item__media .oz-variant-add .menu-item__add,
.menu-item__media .oz-variant-add .qty-stepper {
  position: static;
  bottom: auto;
  left: auto;
  transform: none;
  box-shadow: none;
}
/* 2026-08-22: variant Add + stepper size overrides retired. They shrank the
   variant tap target below the standard path (12px font, 28x28 buttons vs
   13px font, 36x36 buttons) because the earlier horizontal .oz-variant-row
   layout (label + control on one line) had to fit inside the 140px
   .menu-item__media column. .oz-variant-row was flipped to a stacked column
   layout below so the standard control size fits verbatim - diners now get
   the same tap area on Half/Full items as on single-variant items. */

.menu-item__closed {
  display: inline-flex;
  align-items: center;
  padding: 8px 16px;
  background: var(--orderzy-surface-alt);
  border-radius: var(--r-sm);
  font-size: 12px;
  font-weight: 600;
  color: var(--orderzy-ink-muted);
}
.menu-item__media .menu-item__closed {
  position: absolute;
  bottom: -14px;
  left: 50%;
  transform: translateX(-50%);
}

/* Qty stepper for menu items. Scoped to .menu-item__media so it doesn't collide
   with the cart page's .stepper + .qty-stepper multi-class on cart rows. */
.menu-item__media .qty-stepper {
  position: absolute;
  bottom: -14px;
  left: 50%;
  transform: translateX(-50%);
  display: inline-flex;
  align-items: center;
  background: var(--orderzy-brand-deep);
  color: #fff;
  border-radius: var(--r-sm);
  /* 2px white outline + lift shadow keeps the stepper legible when it overlaps
     a dark food photo (sibling of .menu-item__add - same overlap geometry). */
  box-shadow:
    0 0 0 2px rgba(255, 255, 255, 0.85),
    var(--orderzy-shadow-lift);
  overflow: hidden;
}
.menu-item__media .qty-stepper__btn {
  background: transparent;
  border: none;
  color: #fff;
  width: 36px;
  height: 36px;
  font-size: 18px;
  font-weight: 700;
  cursor: pointer;
  display: inline-flex;
  align-items: center;
  justify-content: center;
}
.menu-item__media .qty-stepper__btn:hover { background: rgba(0,0,0,0.15); }
.menu-item__media .qty-stepper__btn svg { display: block; width: 14px; height: 14px; }
.menu-item__media .qty-stepper__count {
  font-family: var(--font-heading);
  font-weight: 700;
  font-size: 14px;
  padding: 0 8px;
  min-width: 24px;
  text-align: center;
}

/* Pure-veg / active-session strip on restaurant detail */
.veg-toggle {
  display: flex;
  gap: 10px;
  align-items: center;
  margin-bottom: 24px;
  padding: 12px 16px;
  background: var(--orderzy-surface);
  border: 1px solid var(--orderzy-border);
  border-radius: var(--r-sm);
  font-size: 14px;
}
.veg-toggle__dot {
  width: 12px;
  height: 12px;
  border-radius: 2px;
  border: 2px solid;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  flex-shrink: 0;
}
.veg-toggle__dot--veg { border-color: #1f9d55; }
.veg-toggle__dot--veg::after {
  content: '';
  width: 6px;
  height: 6px;
  border-radius: 50%;
  background: #1f9d55;
}

/* In-menu search (simple bar, no sticky header) */
.menu-search { margin-bottom: 24px; }
.menu-search .search-bar { max-width: none; box-shadow: none; }
.menu-search__clear {
  flex-shrink: 0;
  width: 28px;
  height: 28px;
  display: none;
  align-items: center;
  justify-content: center;
  background: var(--orderzy-border);
  border: none;
  border-radius: 50%;
  cursor: pointer;
  color: var(--orderzy-ink-soft);
  margin-right: 8px;
}
.menu-search__clear:hover { background: var(--orderzy-border-strong); }
.menu-search__clear.visible { display: inline-flex; }

.menu-page-content { padding-bottom: 100px; }
.menu-no-results {
  padding: 48px 16px;
  text-align: center;
  color: var(--orderzy-ink-muted);
  font-size: 14px;
  display: none;
}
.menu-no-results.visible { display: block; }
.menu-cat.search-hidden { display: none; }

@media (max-width: 880px) {
  .menu-item__media { width: 100px; height: 100px; }
  /* Image must follow the column width or it overflows and the absolute-
     positioned Add button centers on the (narrow) column instead of the
     (wider) image - landing the button on the image's left edge instead
     of its bottom center (image-8 report). */
  .menu-item__media .menu-item__img,
  .menu-item__media .menu-item__no-photo { width: 100px; height: 100px; }
  .menu-item__title { font-size: 15px; }
  .menu-item__desc { font-size: 13px; }
  /* With variants present, the 100px-wide column can't hold a "Full ₹280" label
     + Add/stepper (~150-170px). Widen the column so the variant rows sit cleanly
     under the image instead of overflowing into the next card (image-7 report). */
  .menu-item__media--has-variants { width: 160px; height: auto; }
  .menu-item__media--has-variants .menu-item__img,
  .menu-item__media--has-variants .menu-item__no-photo { width: 100px; height: 100px; align-self: flex-end; }
}
@media (max-width: 520px) {
  .menu-item { gap: 12px; }
  .menu-item__media { width: 80px; height: 80px; }
  .menu-item__media .menu-item__img,
  .menu-item__media .menu-item__no-photo { width: 80px; height: 80px; }
  .menu-item__add { padding: 6px 16px; font-size: 12px; }
  .menu-item__media .qty-stepper__btn { width: 30px; height: 30px; font-size: 16px; }
  /* 2026-09-05: stepper right-anchors to media on phone so the "+" button
     never extends past the card's right edge. Pre-fix used
     `left:50%; transform:translateX(-50%)` - stepper (~96px wide) centered
     on an 80px media meant 8px of overhang each side, and the right-side
     overhang clipped against the card's right boundary on narrow devices.
     Verified 2026-09-05 against the marketplace detail page mobile screenshot. */
  .menu-item__media .qty-stepper {
    left: auto;
    right: 0;
    transform: none;
  }
  .menu-cat__title { font-size: 18px; }
  .menu-item__media--has-variants { width: 150px; height: auto; }
  .menu-item__media--has-variants .menu-item__img,
  .menu-item__media--has-variants .menu-item__no-photo { width: 90px; height: 90px; }
}
@media (max-width: 360px) {
  .menu-item { padding: 14px 0; gap: 10px; }
  .menu-item__media { width: 70px; height: 70px; }
  .menu-item__media .menu-item__img,
  .menu-item__media .menu-item__no-photo { width: 70px; height: 70px; }
  .menu-item__title { font-size: 14px; }
  .menu-item__media--has-variants { width: 140px; height: auto; }
  .menu-item__media--has-variants .menu-item__img,
  .menu-item__media--has-variants .menu-item__no-photo { width: 80px; height: 80px; }
}
/* 2026-08-28 acceptance (deep pass): on <=380 with a Full/Half variant
   row on the item, the has-variants column stays 140px while the whole
   row is only 211px on a 306-360 viewport. That leaves 61px for info -
   the title, tags, chef note all squeeze to one character wide. Fix:
   flip the item to a column layout on hairline viewports so the info
   block reads at full width and the variant rows sit below at full
   width too. Photo shrinks + moves alongside the title. */
@media (max-width: 380px) {
  .menu-item {
    flex-direction: row;
    flex-wrap: wrap;
    align-items: flex-start;
  }
  .menu-item__info { min-width: 0; flex: 1 1 60%; }
  .menu-item__media--has-variants {
    /* Variant rows span the full item width, sitting under the title
       block. Photo lives inside them, sized down further. */
    flex: 1 1 100%;
    width: 100% !important;
    max-width: 100% !important;
    flex-direction: column-reverse;
    gap: 8px;
  }
  .menu-item__media--has-variants .menu-item__img,
  .menu-item__media--has-variants .menu-item__no-photo {
    width: 96px !important;
    height: 96px !important;
    align-self: flex-start !important;
  }
  .menu-item__media--has-variants .menu-item__variants {
    width: 100%;
  }
  .menu-item__media--has-variants .oz-variant-row {
    /* Full-width row: label on the LEFT, Add/qty control on the RIGHT.
       Overrides the base column-flex layout designed for the narrow
       right-side variant column, which right-aligned everything and left
       ~160px of empty space on the left when hoisted to full width. */
    width: 100%;
    flex-direction: row;
    align-items: center;
    justify-content: space-between;
    padding: 6px 0;
    border-top: 1px solid var(--orderzy-border-soft);
  }
  .menu-item__media--has-variants .oz-variant-row:first-child {
    border-top: none;
  }
  .menu-item__media--has-variants .oz-variant-row__label {
    text-align: left;
  }
}
@media (hover: none) and (pointer: coarse) {
  .menu-item__add,
  .menu-item__media .qty-stepper__btn { min-height: 44px; }
}

/* ============================================================================
   CART PAGE (merged from legacy cart.css on 2026-04-19)
   ============================================================================ */

/* Layout container (legacy, overridden below when inside .cart-page) */
.cart-container {
  max-width: 600px;
  margin: 0 auto;
  padding: 0 16px;
  padding-bottom: 100px;
}
@media (min-width: 768px) { .cart-container { padding-bottom: 24px; } }
@media (max-width: 360px) { .cart-container { padding: 0 12px; padding-bottom: 100px; } }

/* Legacy cart item (kept for back-compat; overridden by .cart-row styles later) */
.cart-item {
  display: flex;
  align-items: center;
  gap: 12px;
  padding: 12px 0;
  border-bottom: 1px solid #F0F0F0;
  position: relative;
  background: #fff;
  transition: transform 0.2s ease;
}
.cart-item.swiping { transition: none; }
.cart-item.removing { transform: translateX(-100%); opacity: 0; transition: transform 0.2s ease, opacity 0.2s ease; }
/* Per-element fade on disabled (closed-outlet) rows lives in .cart-row.disabled below.
   The old blanket .cart-item.disabled { opacity: 0.5 } also faded the Remove button +
   Closed badge, hurting affordance. Children are now targeted individually. */
.cart-item-image { width: 64px; height: 64px; border-radius: 8px; object-fit: cover; flex-shrink: 0; }
.cart-item-details { flex: 1; min-width: 0; }
.cart-item-name { font-size: 16px; font-weight: 500; color: #1A1A1A; margin: 0 0 8px 0; word-break: break-word; }
.cart-item-price { font-size: 16px; font-weight: 600; color: #1A1A1A; }

/* Legacy qty stepper on cart (retained for markup that still uses these classes) */
.cart-item .qty-stepper { display: flex; align-items: center; gap: 0; }
.qty-btn {
  width: 36px;
  height: 36px;
  border: 1.5px solid #E5E5E5;
  background: #fff;
  border-radius: 8px;
  display: flex;
  align-items: center;
  justify-content: center;
  cursor: pointer;
  transition: all 0.1s ease;
  font-size: 18px;
  color: #1A1A1A;
  -webkit-tap-highlight-color: transparent;
}
.qty-btn:active { background: #F28500; border-color: #F28500; color: #fff; }
.qty-btn:disabled { opacity: 0.4; cursor: not-allowed; }
.qty-display { width: 36px; text-align: center; font-size: 16px; font-weight: 600; color: #1A1A1A; }
@media (min-width: 768px) { .qty-btn { width: 44px; height: 44px; } .qty-display { width: 44px; } }
@media (max-width: 480px) { .qty-btn { width: 44px; height: 44px; min-width: 44px; min-height: 44px; } .qty-display { width: 32px; font-size: 15px; } }

/* Delete button (legacy trash icon, kept in case any template still uses it) */
.cart-item-delete {
  width: 44px;
  height: 44px;
  min-width: 44px;
  min-height: 44px;
  display: flex;
  align-items: center;
  justify-content: center;
  color: #999;
  cursor: pointer;
  border: none;
  background: transparent;
  border-radius: 8px;
  transition: color 0.15s ease, background 0.15s ease;
  -webkit-tap-highlight-color: transparent;
  flex-shrink: 0;
  margin-left: 8px;
}
.cart-item-delete:hover,
.cart-item-delete:active { color: #FF4444; background: #FFF0F0; }
@media (max-width: 480px) { .cart-item-delete { color: #CC0000; background: #FFF5F5; } }

.swipe-delete-bg {
  position: absolute;
  right: 0;
  top: 0;
  bottom: 0;
  width: 80px;
  background: #FF4444;
  display: flex;
  align-items: center;
  justify-content: center;
  color: #fff;
  font-size: 14px;
  font-weight: 500;
  opacity: 0;
  pointer-events: none;
  z-index: -1;
}

/* Remove confirmation dialog (inline, preserved from legacy cart UX) */
.remove-confirm {
  display: none;
  position: absolute;
  left: 0;
  right: 0;
  top: 0;
  bottom: 0;
  background: #FFF5F5;
  border: 1px solid #FFD0D0;
  border-radius: 8px;
  align-items: center;
  justify-content: center;
  gap: 12px;
  z-index: 10;
}
.remove-confirm.show { display: flex; }
.remove-confirm span { font-size: 14px; color: #666; }
.remove-confirm-btn { padding: 8px 16px; border-radius: 6px; font-size: 14px; font-weight: 500; cursor: pointer; border: none; }
.remove-confirm-btn.cancel { background: #E5E5E5; color: #333; }
.remove-confirm-btn.confirm { background: #FF4444; color: #fff; }

/* Cart item status badges */
.cart-item-badge { font-size: 12px; font-weight: 500; padding: 4px 8px; border-radius: 4px; }
.cart-item-badge.closed { background: #FFE5E5; color: #CC0000; }
.cart-item-badge.unavailable { background: #F5F5F5; color: #666; }

/* Desktop CTA (inline) */
.cart-cta-inline { display: none; margin-top: 20px; padding-bottom: 24px; }
@media (min-width: 768px) { .cart-cta-inline { display: block !important; visibility: visible !important; } }

/* FE1-2: layered overrides on top of .btn.btn--primary.btn--block.
   Background/color/hover come from .btn--primary (uses --orderzy-brand-deep for AA contrast).
   Display/visibility/opacity !important kept defensively against legacy hide-fights. */
.cart-cta-btn {
  display: flex !important;
  visibility: visible !important;
  opacity: 1 !important;
  align-items: center;
  justify-content: center;
  width: 100%;
  height: 52px;
  min-height: 52px;
  padding: 16px;
  border-radius: var(--r-sm);
  cursor: pointer;
}
.cart-cta-btn:disabled,
.cart-cta-btn.disabled { opacity: 0.5; cursor: not-allowed; }

/* Mobile sticky CTA */
.cart-sticky-cta {
  display: block !important;
  visibility: visible !important;
  opacity: 1 !important;
  position: fixed !important;
  bottom: 0 !important;
  left: 0 !important;
  right: 0 !important;
  background: #fff !important;
  padding: 12px 16px !important;
  padding-bottom: max(12px, env(safe-area-inset-bottom)) !important;
  box-shadow: 0 -4px 20px rgba(0, 0, 0, 0.15) !important;
  z-index: var(--z-fab) !important;
  transform: none !important;
}
@media (min-width: 768px) { .cart-sticky-cta { display: none !important; } }
@media (max-height: 500px) and (orientation: landscape) {
  .cart-sticky-cta { padding: 8px 16px !important; }
  .cart-sticky-cta .cart-cta-btn { height: 44px !important; }
}
.cart-sticky-cta .cart-cta-btn {
  height: 52px;
  display: flex !important;
  align-items: center;
  justify-content: center;
  visibility: visible !important;
  opacity: 1 !important;
}

/* Empty cart state */
.cart-empty {
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  padding: 48px 20px;
  text-align: center;
  min-height: 50vh;
}
@media (max-width: 480px) { .cart-empty { padding: 32px 16px; min-height: 40vh; } }
.cart-has-items .cart-empty { display: none; }
.cart-is-empty .cart-items-list,
.cart-is-empty .cart-cta-inline,
.cart-is-empty .cart-restaurant-header { display: none; }
.cart-is-empty .cart-sticky-cta { display: none; }

/* Guest info banner */
.guest-info-banner {
  display: flex;
  align-items: center;
  gap: 8px;
  padding: 10px 14px;
  background: #F0FDF4;
  border: 1px solid #BBF7D0;
  border-radius: 8px;
  margin-bottom: 16px;
  font-size: 14px;
  font-weight: 500;
  color: #166534;
}
.guest-info-banner svg { flex-shrink: 0; color: #22C55E; }

/* Legacy cart summary (kept for markup using .cart-summary) */
.cart-summary { margin-top: 16px; padding: 12px 0; border-top: 1px solid #E5E5E5; }
.cart-summary-row { display: flex; justify-content: space-between; align-items: center; padding: 6px 0; font-size: 14px; color: #4B5563; }
.cart-summary-row.discount { color: #16A34A; }
.cart-summary-row.total { font-size: 16px; font-weight: 600; color: #1A1A1A; padding-top: 10px; margin-top: 6px; border-top: 1px solid #E5E5E5; }

/* --- Cart page (mockup 13-cart.html migration). Override legacy where needed. --- */
.cart-page { padding: 32px 0 80px; }
.cart-page .cart-container { max-width: none; padding: 0; }

.cart-layout {
  display: grid;
  grid-template-columns: 1.3fr 1fr;
  gap: 32px;
  align-items: start;
}

.cart-head { margin-bottom: 24px; }
.cart-head__title {
  font-family: var(--font-heading);
  font-size: 32px;
  font-weight: 700;
  letter-spacing: -0.02em;
  margin: 0 0 4px;
}
.cart-head__rest { font-size: 15px; color: var(--orderzy-ink-soft); margin: 0; }
.cart-head__rest strong { color: var(--orderzy-ink); font-weight: 700; }
.cart-head__rest strong a { color: inherit; text-decoration: none; }
.cart-head__rest strong a:hover { color: var(--orderzy-brand-ink); }

/* Dine-in / Parcel two-button toggle. Shared class used on both the
   customer menu page (restaurant__detail.html) and the cart page. Class
   was previously cart-parcel-* and lived only on cart; renamed to oz-
   parcel-* in the 2026-08-23 parcel flow overhaul so restaurant__detail
   can render the same two-button UI instead of a single invisible pill.
   Legacy .cart-parcel-* aliases removed - both surfaces now consume this
   single class. */
.oz-parcel-toggle {
  display: flex;
  align-items: center;
  gap: 12px;
  padding: 14px 16px;
  background: var(--orderzy-surface);
  border: 1px solid var(--orderzy-border);
  border-radius: var(--r-sm);
  margin-bottom: 20px;
  /* 2026-08-26 Phase 3.D (audit K-13): on Angaraa's menu at 1440x900 the
     Parcel button sat under the right edge of the menu card and got clipped
     by the sticky cart bar. Constrain to the parent width and let the row
     wrap when the buttons cannot fit alongside the label - `flex-wrap:
     wrap` is kept as a safety net so overflow can never clip the button.
     2026-08-28 audit F.24: F.24 was the wrap KICKING IN at 360-390px so
     the label jumped above the buttons. The reconciliation is not to
     remove wrap (that reintroduces the K-13 clip risk) but to shrink the
     content at narrow widths so wrap does not need to fire until 320px
     (see the media queries below). Both invariants coexist. */
  max-width: 100%;
  flex-wrap: wrap;
  min-width: 0;
}
.oz-parcel-toggle__label { font-size: 14px; color: var(--orderzy-ink); font-weight: 600; }
.oz-parcel-toggle__buttons {
  display: flex;
  gap: 8px;
  margin-left: auto;
  /* 2026-08-26 Phase 3.D: mirror the parent wrap so a narrow container
     wraps the two buttons under each other rather than overflowing. */
  flex-wrap: wrap;
  min-width: 0;
}
/* 2026-08-28 audit F.24: at hairline widths (<=320px) both the label and
   the two buttons cannot share one line without truncating; stack the
   whole card. Between 321-420px trim the buttons so the row stays inline. */
@media (max-width: 420px) {
  .oz-parcel-toggle { gap: 8px; padding: 10px 12px; }
  .oz-parcel-toggle__label { font-size: 13px; }
  .oz-parcel-btn { padding: 0 12px; font-size: 12.5px; }
}
@media (max-width: 320px) {
  .oz-parcel-toggle { flex-direction: column; align-items: stretch; }
  .oz-parcel-toggle__buttons { margin-left: 0; justify-content: space-between; }
}
.oz-parcel-btn {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  height: 32px;
  padding: 0 14px;
  border-radius: 16px;
  font-family: var(--font-body);
  font-size: 13px;
  font-weight: 700;
  cursor: pointer;
  background: var(--orderzy-surface);
  border: 1px solid var(--orderzy-border-strong);
  color: var(--orderzy-ink);
  transition: all var(--dur-fast) var(--ease);
}
.oz-parcel-btn:focus-visible {
  outline: 2px solid var(--orderzy-brand);
  outline-offset: 2px;
}
.oz-parcel-btn--active {
  background: var(--orderzy-ink);
  border-color: var(--orderzy-ink);
  color: #fff;
}

/* Parcel unavailable banner. Rendered when a customer arrives via
   ?mode=parcel on an outlet that cannot accept parcel orders right now
   (owner opt-out OR online payments off). Two-line copy that keeps them
   on the menu. Uses the brand-soft callout aesthetic - not an error
   colour because this is an availability state, not a customer mistake. */
.oz-parcel-unavailable {
  display: flex;
  align-items: flex-start;
  gap: 10px;
  background: var(--orderzy-brand-soft);
  border: 1px solid var(--orderzy-border);
  border-radius: var(--r-sm);
  padding: 12px 16px;
  margin: 0 16px 12px 16px;
  color: var(--orderzy-brand-ink);
}
.oz-parcel-unavailable__icon { flex-shrink: 0; margin-top: 2px; }
.oz-parcel-unavailable__body { font-size: 14px; line-height: 1.4; }
.oz-parcel-unavailable__body strong { font-weight: 700; }
.oz-parcel-unavailable__body small {
  display: block;
  margin-top: 2px;
  font-size: 14px;
  color: var(--orderzy-brand-ink);
}

.cart-card {
  background: var(--orderzy-surface);
  border: 1px solid var(--orderzy-border);
  border-radius: var(--r-md);
  padding: 0;
  overflow: hidden;
  margin-bottom: 0;
}
.cart-card + .cart-card { margin-top: 16px; }
.cart-card__head {
  padding: 16px 24px;
  border-bottom: 1px solid var(--orderzy-border);
  font-family: var(--font-heading);
  font-size: 15px;
  font-weight: 700;
  color: var(--orderzy-ink);
}

.cart-row {
  display: grid;
  grid-template-columns: 56px 1fr auto auto;
  gap: 16px;
  align-items: center;
  padding: 16px 24px;
  border-bottom: 1px solid var(--orderzy-border-soft);
  position: relative;
  background: var(--orderzy-surface);
}
.cart-row:last-child { border-bottom: none; }
.cart-row.disabled .cart-row__img,
.cart-row.disabled .cart-row__title,
.cart-row.disabled .cart-row__meta .num,
.cart-row.disabled .chef-note-trunc,
.cart-row.disabled .cart-row__line { opacity: 0.5; }
.cart-row.disabled .cart-row__remove { opacity: 1; }
.cart-row.removing { opacity: 0; transition: opacity 200ms; }
.cart-row.swiping { transition: transform 100ms; }

.cart-row__img { width: 56px; height: 56px; border-radius: var(--r-sm); object-fit: cover; }
/* 2026-08-28 audit F.20: shared dish-outline placeholder for cart and
   checkout item rows. Same visual language as .menu-item__no-photo on the
   menu, scaled to the row-image footprint. Retires the extra-images/bg3.png
   watermark tile from every customer surface.
   2026-08-31 customer menu surface cleanup - Commit C: retinted with the
   same soft-amber palette as the menu placeholder. Dashed border replaced
   with a solid border matching the tint - reads intentional, not "empty
   slot". Class names preserved (F.20 test asserts both classes share one
   rule; that invariant is unchanged). */
.cart-row__no-photo,
.summary__item-thumb--no-photo {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  background: var(--orderzy-brand-soft);
  border: 1px solid var(--orderzy-brand-soft);
  color: var(--orderzy-brand-ink);
  border-radius: var(--r-sm);
  flex-shrink: 0;
}
.cart-row__info { min-width: 0; }
.cart-row__title {
  font-family: var(--font-body);
  font-weight: 700;
  font-size: 15px;
  color: var(--orderzy-ink);
  margin: 0 0 2px;
  display: flex;
  align-items: center;
  gap: 8px;
}
.cart-row__veg {
  width: 12px;
  height: 12px;
  border: 2px solid;
  border-radius: 2px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  flex-shrink: 0;
}
.cart-row__veg--veg { border-color: #1f9d55; }
.cart-row__veg--veg::after { content: ''; width: 4px; height: 4px; border-radius: 50%; background: #1f9d55; }
.cart-row__veg--nonveg { border-color: #b53333; }
.cart-row__veg--nonveg::after { content: ''; width: 0; height: 0; border-left: 3px solid transparent; border-right: 3px solid transparent; border-bottom: 5px solid #b53333; }
.cart-row__meta { font-size: 13px; color: var(--orderzy-ink-muted); }
/* 2026-08-22: give the unit-price span a stable inline-block so the middle-dot */
/* and the Remove button line up on a consistent x across rows regardless of */
/* price digit count (₹80 vs ₹220 vs ₹1200). Uses `ch` because .num already */
/* has font-feature-settings: "tnum" applied by the global .num rule, so digits */
/* have equal width. min-width (not width) means a 5-digit price still fits */
/* without truncation - that row's Remove would drift slightly, matching today's */
/* worst case rather than making it worse. Item title (.cart-row__title) is */
/* untouched; this rule is scoped to the meta line only. */
.cart-row__meta .num { display: inline-block; min-width: 4ch; }
.cart-row__remove {
  color: var(--orderzy-ink-soft);
  font-weight: 600;
  font-size: 13px;
  background: none;
  border: none;
  padding: 0;
  cursor: pointer;
  text-decoration: underline;
  text-underline-offset: 2px;
}
.cart-row__remove:hover { color: var(--orderzy-danger); }
.cart-row__line {
  font-family: var(--font-heading);
  font-weight: 700;
  font-size: 15px;
  color: var(--orderzy-ink);
  font-feature-settings: "tnum";
  min-width: 64px;
  text-align: right;
}

/* Cart stepper (different visual from menu-item stepper) */
.cart-row .stepper {
  display: inline-flex;
  align-items: center;
  border: 1px solid var(--orderzy-border-strong);
  border-radius: var(--r-sm);
  overflow: hidden;
  background: var(--orderzy-surface);
}
.cart-row .stepper__btn {
  background: var(--orderzy-surface);
  border: none;
  width: 32px;
  height: 32px;
  font-size: 16px;
  font-weight: 700;
  color: var(--orderzy-ink);
  cursor: pointer;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  border-radius: 0;
}
.cart-row .stepper__btn:hover { background: var(--orderzy-surface-alt); }
.cart-row .stepper__count {
  font-family: var(--font-heading);
  font-weight: 700;
  padding: 0 10px;
  min-width: 28px;
  text-align: center;
  font-size: 14px;
  color: var(--orderzy-ink);
}

.cart-add-more {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 8px;
  padding: 14px 24px;
  color: var(--orderzy-brand-ink);
  background: var(--orderzy-brand-soft);
  font-weight: 700;
  font-size: 14px;
  text-decoration: none;
  border: none;
  border-top: 1px solid var(--orderzy-border);
}
.cart-add-more:hover { background: #fde5c8; color: var(--orderzy-brand-ink); }

/* Bill summary */
.bill {
  position: sticky;
  top: 96px;
  background: var(--orderzy-surface);
  border: 1px solid var(--orderzy-border);
  border-radius: var(--r-md);
  padding: 24px;
}
.bill__title {
  font-family: var(--font-heading);
  font-size: 17px;
  font-weight: 700;
  margin: 0 0 16px;
  padding-bottom: 12px;
  border-bottom: 1px solid var(--orderzy-border);
}
.bill__line {
  display: flex;
  justify-content: space-between;
  padding: 6px 0;
  font-size: 14px;
  color: var(--orderzy-ink-soft);
}
.bill__line--total {
  font-family: var(--font-heading);
  font-size: 20px;
  font-weight: 700;
  color: var(--orderzy-ink);
  border-top: 1px solid var(--orderzy-border);
  padding-top: 14px;
  margin-top: 10px;
}
.bill__line--total .total { color: var(--orderzy-ink); }
.bill__hint {
  margin-top: 12px;
  text-align: center;
  font-size: 12px;
  color: var(--orderzy-ink-muted);
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 6px;
}

@media (max-width: 880px) {
  .cart-layout { grid-template-columns: minmax(0, 1fr); gap: 20px; }
  .cart-layout > * { min-width: 0; max-width: 100%; }
  .bill { position: static; }
  .cart-page { padding: 20px 0 120px; }
  .cart-head__title { font-size: 24px; }
  /* 2026-08-28 acceptance run: on <=479 the stepper's max-content (~122px)
     was consuming the 1fr auto track and squeezing the info column to 16px,
     stacking the dish title character-by-character ("V/e/g/C/h/e/e/s/e").
     Fix: at hairline widths drop to a 2-column grid (image + info), and
     place the stepper on row 2 aligned to the right, alongside the
     line-total. Restores a readable title on 320-479px viewports. */
  .cart-row {
    grid-template-columns: 48px minmax(0, 1fr) auto;
    padding: 14px 16px;
    gap: 12px;
  }
  .cart-row__info { min-width: 0; }
  .cart-row__title { min-width: 0; overflow-wrap: anywhere; }
  .cart-row__line { grid-column: 2 / -1; text-align: right; min-width: 0; }
  .cart-row__img { width: 48px; height: 48px; }
  .cart-card__head { padding: 12px 16px; }
  .cart-add-more { padding: 12px 16px; }
  .bill { padding: 20px 16px; }
}
@media (max-width: 479px) {
  /* Below 480: move the stepper off the header row so the title has full
     info-column width. Row 1: img + info; row 2: stepper (left) + line
     total (right). Prevents the 121.6px stepper from eating the info track. */
  .cart-row {
    grid-template-columns: 48px minmax(0, 1fr);
    grid-template-areas:
      "img info"
      ".   stepper";
  }
  .cart-row__img { grid-area: img; }
  .cart-row__info { grid-area: info; }
  .cart-row .stepper,
  .cart-row .qty-stepper { grid-area: stepper; justify-self: end; }
  .cart-row__line { grid-column: 2 / -1; text-align: right; }
}

/* ============================================================================
   OFFER BANNER / CAROUSEL (merged from legacy offer-banner.css on 2026-04-19)
   ============================================================================ */

.offer-banner-section { padding: 12px 16px; background: #FAFAFA; }

.offer-banner {
  position: relative;
  display: flex;
  align-items: stretch;
  background: linear-gradient(135deg, #1A472A 0%, #2D5A3D 100%);
  border-radius: 12px;
  overflow: hidden;
  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);
}
.offer-banner__accent {
  width: 6px;
  background: linear-gradient(180deg, #4ADE80 0%, #22C55E 100%);
  flex-shrink: 0;
}
.offer-banner__content {
  flex: 1;
  display: flex;
  align-items: center;
  padding: 14px 16px;
  gap: 14px;
}
.offer-banner__icon {
  flex-shrink: 0;
  width: 36px;
  height: 36px;
  background: rgba(255, 255, 255, 0.15);
  border-radius: 8px;
  display: flex;
  align-items: center;
  justify-content: center;
}
.offer-banner__icon svg { width: 20px; height: 20px; color: #4ADE80; }
.offer-banner__value {
  flex-shrink: 0;
  display: flex;
  flex-direction: column;
  align-items: center;
  padding: 0 12px;
  border-right: 1px solid rgba(255, 255, 255, 0.15);
}
.offer-banner__discount {
  font-size: 28px;
  font-weight: 800;
  color: #4ADE80;
  line-height: 1;
  letter-spacing: -0.5px;
}
.offer-banner__discount-label {
  font-size: 11px;
  font-weight: 600;
  color: rgba(255, 255, 255, 0.8);
  text-transform: uppercase;
  letter-spacing: 0.5px;
  margin-top: 2px;
}
.offer-banner__details { flex: 1; min-width: 0; }
.offer-banner__title {
  font-size: 14px;
  font-weight: 600;
  color: #fff;
  margin-bottom: 3px;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
.offer-banner__condition {
  font-size: 12px;
  color: rgba(255, 255, 255, 0.7);
  display: flex;
  align-items: center;
  gap: 6px;
}
.offer-banner__validity {
  display: flex;
  align-items: center;
  gap: 4px;
  font-size: 11px;
  color: #4ADE80;
  margin-top: 4px;
}
.offer-banner__validity svg { width: 12px; height: 12px; }
.offer-banner__code {
  flex-shrink: 0;
  padding: 6px 10px;
  background: rgba(255, 255, 255, 0.1);
  border: 1px dashed rgba(255, 255, 255, 0.4);
  border-radius: 6px;
  font-size: 11px;
  font-weight: 700;
  color: #fff;
  letter-spacing: 0.8px;
  text-transform: uppercase;
}
.offer-banner__theme {
  position: absolute;
  top: 8px;
  right: 8px;
  font-size: 10px;
  font-weight: 600;
  color: #FFD700;
  background: rgba(0, 0, 0, 0.3);
  padding: 3px 8px;
  border-radius: 4px;
  text-transform: uppercase;
  letter-spacing: 0.5px;
}

/* Offer slider */
.offer-slider { position: relative; }
.offer-slider__viewport { overflow: hidden; position: relative; }
.offer-slider__track {
  display: flex;
  transition: transform 0.35s cubic-bezier(0.25, 0.46, 0.45, 0.94);
  will-change: transform;
}
.offer-slider__slide { flex: 0 0 100%; width: 100%; }

.offer-carousel__arrow {
  position: absolute;
  top: 50%;
  transform: translateY(-50%);
  width: 32px;
  height: 32px;
  background: rgba(255, 255, 255, 0.95);
  border: none;
  border-radius: 50%;
  display: flex;
  align-items: center;
  justify-content: center;
  cursor: pointer;
  z-index: 2;
  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.25);
  transition: background 0.15s, box-shadow 0.15s, transform 0.15s;
  padding: 0;
}
.offer-carousel__arrow:hover {
  background: #fff;
  box-shadow: 0 3px 10px rgba(0, 0, 0, 0.3);
  transform: translateY(-50%) scale(1.08);
}
.offer-carousel__arrow--prev { left: 10px; }
.offer-carousel__arrow--next { right: 10px; }
.offer-carousel__arrow svg { width: 18px; height: 18px; color: #1F2937; display: block; }
@media (hover: none) and (pointer: coarse) { .offer-carousel__arrow { display: none; } }
@media (hover: hover) and (pointer: fine) {
  .offer-slider .offer-banner__content { padding-left: 44px; padding-right: 44px; }
}

.offer-slider__dots {
  display: flex;
  justify-content: center;
  gap: 6px;
  margin-top: 10px;
}
.offer-slider__dot {
  width: 6px;
  height: 6px;
  border-radius: 50%;
  background: #D1D5DB;
  border: none;
  padding: 0;
  cursor: pointer;
  transition: background 0.2s ease, transform 0.2s ease;
}
.offer-slider__dot--active { background: #2D5A3D; transform: scale(1.2); }
.offer-slider__dot:hover { background: #9CA3AF; }
.offer-slider__dot--active:hover { background: #2D5A3D; }

.offer-banner--platform { background: linear-gradient(135deg, #0F766E 0%, #14B8A6 100%); }
.offer-banner--platform .offer-banner__accent { background: linear-gradient(180deg, #5EEAD4 0%, #2DD4BF 100%); }
.offer-banner--platform .offer-banner__discount { color: #5EEAD4; }
.offer-banner--platform .offer-banner__validity { color: #5EEAD4; }
.offer-banner--platform .offer-banner__icon svg { color: #5EEAD4; }
.offer-banner--platform .offer-banner__theme { color: #5EEAD4; background: rgba(0, 0, 0, 0.25); }

.offer-banner--restaurant { background: linear-gradient(135deg, #7C2D12 0%, #9A3412 100%); }
.offer-banner--restaurant .offer-banner__accent { background: linear-gradient(180deg, #FB923C 0%, #F97316 100%); }
.offer-banner--restaurant .offer-banner__discount { color: #FDBA74; }
.offer-banner--restaurant .offer-banner__validity { color: #FDBA74; }
.offer-banner--restaurant .offer-banner__icon svg { color: #FDBA74; }

.no-offers { display: none; }

@media (max-width: 768px) {
  .offer-banner-section { padding: 10px 12px; }
  .offer-banner__content { padding: 12px 14px; gap: 12px; }
  .offer-banner__discount { font-size: 24px; }
  .offer-banner__value { padding: 0 10px; }
  .offer-banner__title { font-size: 13px; }
  .offer-banner__condition { font-size: 11px; }
}
@media (max-width: 480px) {
  .offer-banner-section { padding: 8px 10px; }
  .offer-banner__content { padding: 10px 12px; gap: 10px; flex-wrap: wrap; }
  .offer-banner__icon { display: none; }
  .offer-banner__value { padding: 0 8px; border-right: none; }
  .offer-banner__discount { font-size: 22px; }
  .offer-banner__discount-label { font-size: 10px; }
  .offer-banner__details { flex: 1 1 auto; min-width: 100px; }
  .offer-banner__title { font-size: 12px; white-space: normal; line-height: 1.3; }
  .offer-banner__condition { font-size: 10px; flex-wrap: wrap; }
  .offer-banner__code { font-size: 9px; padding: 4px 6px; letter-spacing: 0.5px; }
  .offer-banner__theme { font-size: 9px; padding: 2px 6px; top: 6px; right: 6px; }
  .offer-slider__dots { margin-top: 8px; }
  .offer-slider__dot { width: 5px; height: 5px; }
}
@media (max-width: 360px) {
  .offer-banner__content { padding: 8px 10px; gap: 8px; }
  .offer-banner__discount { font-size: 20px; }
  .offer-banner__value { padding: 0 6px; }
  .offer-banner__details { min-width: 80px; }
  .offer-banner__title { font-size: 11px; }
  .offer-banner__code { font-size: 8px; padding: 3px 5px; }
}

/* Guest toast (from offer-banner.css; overrides menu-row's version) */
.guest-toast {
  position: fixed;
  bottom: 84px;
  left: 50%;
  transform: translateX(-50%) translateY(20px);
  background: #1A1A1A;
  color: #fff;
  padding: 12px 20px;
  border-radius: 8px;
  font-size: 14px;
  font-weight: 500;
  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
  z-index: var(--z-toast);
  opacity: 0;
  visibility: hidden;
  transition: opacity 0.3s ease, visibility 0.3s ease, transform 0.3s ease;
  max-width: calc(100% - 32px);
  text-align: center;
}
.guest-toast.visible {
  opacity: 1;
  visibility: visible;
  transform: translateX(-50%) translateY(0);
}
.guest-toast svg {
  display: inline-block;
  vertical-align: middle;
  margin-right: 8px;
  color: #4ADE80;
}
@media (max-height: 500px) and (orientation: landscape) {
  .guest-toast { bottom: 72px; padding: 10px 16px; font-size: 13px; }
}
/* ============================================================================
   CHECKOUT PAGE (merged from legacy checkout.css on 2026-04-19)
   ============================================================================ */
/* ============================================
   CHECKOUT PAGE - LOCKED DESIGN SPECIFICATION
   Mobile-first, single column, confidence-focused
   ============================================ */

/* Layout Container */
.checkout-container {
    max-width: 600px;
    margin: 0 auto;
    padding: 0 16px 100px 16px;
}

/* Tablet and desktop: no sticky CTA, reduce padding */
@media (min-width: 768px) {
    .checkout-container {
        padding-bottom: 24px;
    }
}

/* Small phones */
@media (max-width: 360px) {
    .checkout-container {
        padding: 0 12px 100px 12px;
    }
}

/* Landscape phones: more bottom padding */
@media (max-height: 500px) and (orientation: landscape) {
    .checkout-container {
        padding-bottom: 80px;
    }
}

/* Section Styling */
.checkout-section {
    background: #fff;
    border-radius: 8px;
    margin-bottom: 16px;
}

.checkout-section-content {
    padding: 16px;
}

/* ============================================
   ORDER SUMMARY (Collapsed)
   ============================================ */
.order-summary-header {
    display: flex;
    justify-content: space-between;
    align-items: center;
    padding: 16px;
    cursor: pointer;
    border: 1px solid #E5E5E5;
    border-radius: 8px;
    background: #F9F9F9;
    -webkit-tap-highlight-color: transparent;
}

.order-summary-header:hover {
    background: #F5F5F5;
}

.order-summary-title {
    font-size: 16px;
    font-weight: 500;
    color: #1A1A1A;
}

.order-summary-toggle {
    font-size: 14px;
    color: #F28500;
    display: flex;
    align-items: center;
    gap: 4px;
}

.order-summary-toggle svg {
    transition: transform 0.2s ease;
}

.order-summary-header.expanded .order-summary-toggle svg {
    transform: rotate(180deg);
}

.order-summary-items {
    display: none;
    padding: 12px 16px;
    border: 1px solid #E5E5E5;
    border-top: none;
    border-radius: 0 0 8px 8px;
    background: #fff;
}

.order-summary-items.show {
    display: block;
}

.order-summary-item {
    display: flex;
    justify-content: space-between;
    padding: 8px 0;
    font-size: 14px;
    color: #333;
}

.order-summary-item:not(:last-child) {
    border-bottom: 1px solid #F0F0F0;
}

/* ============================================
   CONTACT DETAILS
   ============================================ */
.contact-section {
    border: 1px solid #E5E5E5;
    border-radius: 8px;
}

.contact-readonly {
    display: flex;
    justify-content: space-between;
    align-items: center;
    padding: 16px;
    background: #F9F9F9;
    border-radius: 8px;
}

.contact-readonly-info {
    display: flex;
    flex-direction: column;
    gap: 4px;
}

.contact-readonly-name {
    font-size: 16px;
    font-weight: 500;
    color: #1A1A1A;
}

.contact-readonly-phone {
    font-size: 14px;
    color: #666;
}

.contact-edit-link {
    font-size: 14px;
    color: #F28500;
    text-decoration: none;
    padding: 8px;
    margin: -8px;
}

.contact-fields {
    padding: 16px;
}

.form-field {
    margin-bottom: 12px;
}

.form-field:last-child {
    margin-bottom: 0;
}

.form-label {
    display: block;
    font-size: 14px;
    font-weight: 500;
    color: #333;
    margin-bottom: 6px;
}

.form-label .required {
    color: #E53935;
}

.form-input {
    width: 100%;
    height: 48px;
    min-height: 44px;
    padding: 0 12px;
    border: 1px solid #E5E5E5;
    border-radius: 8px;
    font-size: 16px;
    color: #1A1A1A;
    background: #fff;
    transition: border-color 0.15s ease;
    -webkit-appearance: none;
    appearance: none;
}

.form-input:focus {
    outline: none;
    border-color: #F28500;
    box-shadow: 0 0 0 3px rgba(242, 133, 0, 0.1);
}

.form-input.error {
    border-color: #E53935;
}

/* Mobile: ensure 16px font to prevent zoom on iOS */
@media (max-width: 768px) {
    .form-input {
        font-size: 16px;
    }
}

.form-error {
    font-size: 12px;
    color: #E53935;
    margin-top: 4px;
    display: none;
}

.form-input.error+.form-hint+.form-error,
.form-input.error+.form-error {
    display: block;
}

.form-hint {
    font-size: 12px;
    color: #6B7280;
    margin-top: 4px;
}

.optional-field-toggle {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    font-size: 14px;
    color: #666;
    padding: 8px 0;
    cursor: pointer;
    -webkit-tap-highlight-color: transparent;
}

.optional-field-toggle:hover {
    color: #F28500;
}

.optional-field {
    display: none;
    margin-top: 8px;
}

.optional-field.show {
    display: block;
}

/* ============================================
   TABLE NUMBER BADGE
   ============================================ */
.table-badge {
    display: flex;
    align-items: center;
    gap: 8px;
    padding: 12px 16px;
    background: #E8F5E9;
    border: 1px solid #A5D6A7;
    border-radius: 8px;
    margin-bottom: 16px;
}

.table-badge-icon {
    width: 20px;
    height: 20px;
    color: #4CAF50;
}

.table-badge-text {
    font-size: 14px;
    font-weight: 500;
    color: #2E7D32;
}

/* ============================================
   COLLAPSIBLE SECTIONS
   ============================================ */
.collapsible-trigger {
    display: flex;
    align-items: center;
    gap: 8px;
    padding: 12px 0;
    font-size: 14px;
    color: #666;
    cursor: pointer;
    -webkit-tap-highlight-color: transparent;
    border: none;
    background: none;
    width: 100%;
    text-align: left;
}

.collapsible-trigger:hover {
    color: #F28500;
}

.collapsible-trigger svg {
    width: 16px;
    height: 16px;
    transition: transform 0.2s ease;
}

.collapsible-trigger.expanded svg {
    transform: rotate(45deg);
}

.collapsible-content {
    display: none;
    padding-bottom: 12px;
    overflow: hidden;
}

.collapsible-content.show {
    display: block;
}

/* Override global transition rules for checkout collapsibles */
.collapsible-content,
.order-summary-items,
.coupon-input-container,
.optional-field {
    transition: none !important;
}

/* Pre-order timing */
.timing-options {
    display: flex;
    gap: 8px;
    flex-wrap: nowrap;
}

.timing-option {
    flex: 1;
    min-width: 0;
    height: 48px;
    min-height: 44px;
    border: 1px solid #E5E5E5;
    border-radius: 8px;
    background: #fff;
    font-size: 14px;
    font-weight: 500;
    color: #333;
    cursor: pointer;
    transition: background 0.15s ease, border-color 0.15s ease, color 0.15s ease;
    -webkit-tap-highlight-color: transparent;
    padding: 0 8px;
    white-space: nowrap;
}

.timing-option:hover {
    border-color: #F28500;
}

.timing-option.selected {
    background: #F28500;
    border-color: #F28500;
    color: #fff;
}

/* Small screens: stack if needed */
@media (max-width: 320px) {
    .timing-options {
        gap: 6px;
    }

    .timing-option {
        font-size: 13px;
        padding: 0 6px;
    }
}

.timing-display {
    display: flex;
    align-items: center;
    gap: 8px;
    font-size: 14px;
    color: #666;
}

.timing-display-value {
    font-weight: 500;
    color: #1A1A1A;
}

/* Seating section */
.seating-fields {
    display: flex;
    gap: 12px;
}

.seating-fields .form-field {
    flex: 1;
}

/* ============================================
   PRICE BREAKDOWN
   ============================================ */
.price-breakdown {
    border: 1px solid #E5E5E5;
    border-radius: 8px;
    padding: 16px;
}

.price-line {
    display: flex;
    justify-content: space-between;
    padding: 8px 0;
    font-size: 14px;
    color: #666;
}

.price-line:not(:last-child) {
    border-bottom: 1px solid #F0F0F0;
}

.price-line.total {
    font-size: 16px;
    font-weight: 600;
    color: #1A1A1A;
    border-bottom: none;
    padding-top: 12px;
    margin-top: 4px;
    border-top: 1px solid #E5E5E5;
}

.price-line.discount {
    color: #16A34A;
}

.price-line.discount .discount-amount {
    font-weight: 600;
}

.savings-banner {
    margin-top: 12px;
    padding: 10px 12px;
    background: #F0FDF4;
    border: 1px solid #BBF7D0;
    border-radius: 6px;
    font-size: 13px;
    font-weight: 600;
    color: #166534;
    text-align: center;
}

/* ============================================
   COUPON SECTION
   ============================================ */
.coupon-section {
    border: 1px solid #E5E5E5;
    border-radius: 8px;
}

.coupon-header {
    display: flex;
    align-items: center;
    justify-content: space-between;
    cursor: pointer;
    -webkit-tap-highlight-color: transparent;
}

.coupon-label {
    display: flex;
    align-items: center;
    gap: 8px;
    font-size: 14px;
    color: #374151;
}

.coupon-label svg {
    color: #F28500;
}

.coupon-toggle {
    font-size: 14px;
    font-weight: 600;
    color: #F28500;
}

.coupon-input-container {
    display: none;
    margin-top: 12px;
}

.coupon-input-container.show {
    display: block;
}

.coupon-input-row {
    display: flex;
    gap: 8px;
    flex-wrap: nowrap;
}

.coupon-input {
    flex: 1;
    min-width: 0;
    height: 44px;
    min-height: 44px;
    padding: 0 12px;
    border: 1px solid #E5E5E5;
    border-radius: 6px;
    font-size: 16px;
    text-transform: uppercase;
    letter-spacing: 0.5px;
    -webkit-appearance: none;
    appearance: none;
}

.coupon-input:focus {
    outline: none;
    border-color: #F28500;
}

.coupon-apply-btn {
    flex-shrink: 0;
    min-width: 72px;
    height: 44px;
    min-height: 44px;
    padding: 0 16px;
    background: #F28500;
    color: #fff;
    border: none;
    border-radius: 6px;
    font-size: 14px;
    font-weight: 600;
    cursor: pointer;
    transition: background 0.15s ease;
}

.coupon-apply-btn:hover {
    background: #E07800;
}

.coupon-apply-btn:disabled {
    opacity: 0.6;
    cursor: not-allowed;
}

/* Small screens: stack coupon row if needed */
@media (max-width: 320px) {
    .coupon-input-row {
        flex-wrap: wrap;
    }

    .coupon-input {
        width: 100%;
    }

    .coupon-apply-btn {
        width: 100%;
        margin-top: 8px;
    }
}

.coupon-message {
    margin-top: 8px;
    font-size: 13px;
    display: none;
}

.coupon-message.show {
    display: block;
}

.coupon-message.success {
    color: #16A34A;
}

.coupon-message.error {
    color: #DC2626;
}

.coupon-applied {
    display: none;
    align-items: center;
    justify-content: space-between;
    margin-top: 12px;
    padding: 10px 12px;
    background: #F0FDF4;
    border: 1px solid #BBF7D0;
    border-radius: 6px;
}

.coupon-applied.show {
    display: flex;
}

.coupon-applied-text {
    display: flex;
    align-items: center;
    gap: 6px;
    font-size: 14px;
    font-weight: 600;
    color: #166534;
}

.coupon-applied-text svg {
    color: #22C55E;
}

.coupon-remove-btn {
    padding: 4px 12px;
    background: transparent;
    border: 1px solid #DC2626;
    border-radius: 4px;
    font-size: 12px;
    font-weight: 600;
    color: #DC2626;
    cursor: pointer;
    transition: all 0.15s ease;
}

.coupon-remove-btn:hover {
    background: #DC2626;
    color: #fff;
}

/* ============================================
   PAYMENT METHOD
   ============================================ */
.payment-section {
    margin-top: 16px;
}

.payment-card {
    display: flex;
    align-items: center;
    gap: 12px;
    padding: 16px;
    border: 1px solid #E5E5E5;
    border-radius: 8px;
    background: #fff;
    cursor: pointer;
    transition: background 0.15s ease, border-color 0.15s ease;
    margin-bottom: 8px;
    min-height: 56px;
    -webkit-tap-highlight-color: transparent;
}

.payment-card:last-child {
    margin-bottom: 0;
}

.payment-card:hover {
    border-color: #F28500;
}

.payment-card.selected {
    background: #FFF5F0;
    /* 2026-08-22: 2px → 1px. Selected border was heavier than the Pay button */
    /* under it, inverting the hierarchy. Colour + fill + radio dot still carry */
    /* the selected state (the later .pay-option.selected block overrides */
    /* border-color to --accent). */
    border: 1px solid #F28500;
}

/* Mobile: active state for touch feedback */
@media (max-width: 768px) {
    .payment-card:active {
        background: #FFF5F0;
    }

    .payment-card.selected {
        box-shadow: 0 0 0 1px #F28500 inset;
    }
}

.payment-card input[type="radio"] {
    display: none;
}

.payment-radio {
    width: 20px;
    height: 20px;
    border: 2px solid #CCC;
    border-radius: 50%;
    display: flex;
    align-items: center;
    justify-content: center;
    flex-shrink: 0;
}

.payment-card.selected .payment-radio {
    border-color: #F28500;
}

.payment-radio-inner {
    width: 10px;
    height: 10px;
    background: #F28500;
    border-radius: 50%;
    opacity: 0;
    transition: opacity 0.15s ease;
}

.payment-card.selected .payment-radio-inner {
    opacity: 1;
}

.payment-info {
    flex: 1;
}

.payment-label {
    font-size: 16px;
    font-weight: 500;
    color: #1A1A1A;
}

.payment-sublabel {
    font-size: 13px;
    color: #666;
    margin-top: 2px;
}

/* Pay at End info */
.pay-at-end-info {
    display: flex;
    align-items: center;
    gap: 8px;
    padding: 12px 16px;
    background: #F5F5F5;
    border-radius: 8px;
    margin-top: 16px;
}

.pay-at-end-info svg {
    width: 18px;
    height: 18px;
    color: #666;
    flex-shrink: 0;
}

.pay-at-end-info span {
    font-size: 14px;
    color: #666;
}

/* ============================================
   CTA BUTTON
   ============================================ */
/* Desktop CTA (inline) - Hidden on mobile, visible on tablet/desktop */
.checkout-cta-inline {
    display: none;
    margin-top: 20px;
    padding-bottom: 24px;
}

@media (min-width: 768px) {
    .checkout-cta-inline {
        display: block !important;
        visibility: visible !important;
    }
}

/* FE1-2: layered overrides on top of .btn.btn--primary.btn--block.
   Background/color/hover come from .btn--primary; display/visibility kept defensive. */
.checkout-cta-btn {
    display: flex !important;
    visibility: visible !important;
    opacity: 1 !important;
    align-items: center;
    justify-content: center;
    width: 100%;
    height: 52px;
    min-height: 52px;
    padding: 0 24px;
    border-radius: var(--r-sm);
    cursor: pointer;
}

.checkout-cta-btn:disabled {
    opacity: 0.5;
    cursor: not-allowed;
}

.checkout-cta-btn .spinner {
    display: none;
    width: 20px;
    height: 20px;
    border: 2px solid rgba(255, 255, 255, 0.3);
    border-top-color: #fff;
    border-radius: 50%;
    margin-right: 8px;
    animation: spin 0.8s linear infinite;
}

.checkout-cta-btn.loading .spinner {
    display: block;
}

.checkout-cta-btn.loading .btn-text {
    display: none;
}

.checkout-cta-btn .loading-text {
    display: none;
}

.checkout-cta-btn.loading .loading-text {
    display: inline;
}

@keyframes spin {
    to {
        transform: rotate(360deg);
    }
}

/* M7: utility class for inline spinner SVGs (replaces .fa-spinner.fa-spin). */
.oz-spin { animation: spin 0.8s linear infinite; }

/* M9: sortable table header buttons (replaces DataTables sort indicators). */
.oz-th-sort {
  background: none;
  border: none;
  padding: 0;
  font: inherit;
  color: inherit;
  cursor: pointer;
  text-align: inherit;
  width: 100%;
  display: inline-flex;
  align-items: center;
  gap: 6px;
}
.oz-th-sort:hover { color: var(--orderzy-brand-ink); }
.oz-th-sort__ind { font-size: 10px; opacity: 0.7; }

/* Sticky CTA Bar (Mobile) - ALWAYS VISIBLE ON MOBILE */
.checkout-sticky-cta {
    display: block !important;
    visibility: visible !important;
    opacity: 1 !important;
    position: fixed !important;
    bottom: 0 !important;
    left: 0 !important;
    right: 0 !important;
    background: #fff !important;
    padding: 12px 16px !important;
    padding-bottom: max(12px, env(safe-area-inset-bottom)) !important;
    box-shadow: 0 -4px 20px rgba(0, 0, 0, 0.15) !important;
    z-index: var(--z-fab) !important;
    transform: none !important;
}

/* Tablet and desktop: hide sticky, use inline CTA */
@media (min-width: 768px) {
    .checkout-sticky-cta {
        display: none !important;
    }
}

/* Landscape phones: reduce height */
@media (max-height: 500px) and (orientation: landscape) {
    .checkout-sticky-cta {
        padding: 8px 16px !important;
    }

    .checkout-sticky-cta .checkout-cta-btn {
        height: 44px !important;
    }
}

/* ============================================
   FORM VALIDATION
   ============================================ */
.form-input:invalid:not(:placeholder-shown) {
    border-color: #E53935;
}

/* Hide number input spinners */
input[type="number"]::-webkit-inner-spin-button,
input[type="number"]::-webkit-outer-spin-button {
    -webkit-appearance: none;
    margin: 0;
}

input[type="number"] {
    -moz-appearance: textfield;
}

/* ============================================================================
   ORDER COMPLETE PAGE (mockup 15-order-complete.html migration)
   ============================================================================ */

.oc-page { padding: 56px 0 80px; }

.oc-grid {
  display: grid;
  grid-template-columns: 1.1fr 1fr;
  gap: 40px;
  align-items: start;
  max-width: 1200px;
  margin: 0 auto;
  padding: 0 24px;
}

.oc-hero {
  background: var(--orderzy-surface);
  border: 1px solid var(--orderzy-border);
  border-radius: var(--r-lg);
  padding: 40px 36px;
  position: relative;
  overflow: hidden;
}
.oc-hero::before {
  content: "";
  position: absolute;
  top: -80px;
  right: -80px;
  width: 220px;
  height: 220px;
  border-radius: 50%;
  background: radial-gradient(circle, rgba(31,157,85,0.12), transparent 70%);
  pointer-events: none;
}

.oc-tick {
  width: 72px;
  height: 72px;
  border-radius: 50%;
  display: grid;
  place-items: center;
  margin-bottom: 20px;
}
.oc-tick--success { background: var(--orderzy-success-soft); color: var(--orderzy-success); }
.oc-tick--fail { background: var(--orderzy-danger-soft); color: var(--orderzy-danger); }
.oc-tick--processing { background: var(--orderzy-brand-soft); color: var(--orderzy-brand); }
.oc-tick--cancelled { background: var(--orderzy-surface-sand); color: var(--orderzy-ink-soft); }
.oc-tick svg { width: 34px; height: 34px; }

.oc-title {
  font-family: var(--font-heading);
  font-size: 34px;
  font-weight: 700;
  letter-spacing: -0.02em;
  margin: 0 0 6px;
}
.oc-sub {
  font-size: 16px;
  color: var(--orderzy-ink-soft);
  line-height: 1.55;
  margin: 0 0 28px;
}

.oc-number {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  padding: 10px 16px;
  background: var(--orderzy-surface-alt);
  border-radius: var(--r-sm);
  font-family: var(--font-heading);
  font-weight: 700;
  font-size: 14px;
  color: var(--orderzy-ink);
  letter-spacing: 0.02em;
  font-feature-settings: "tnum";
}

.oc-status {
  margin-top: 28px;
  padding: 20px 0 0;
  border-top: 1px solid var(--orderzy-border);
}
.oc-status__label {
  font-family: var(--font-heading);
  font-size: 11px;
  font-weight: 700;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--orderzy-ink-muted);
  margin: 0 0 14px;
}

.oc-actions {
  margin-top: 24px;
  display: flex;
  gap: 12px;
  flex-wrap: wrap;
}

.oc-side {
  display: flex;
  flex-direction: column;
  gap: 16px;
}
.oc-card {
  background: var(--orderzy-surface);
  border: 1px solid var(--orderzy-border);
  border-radius: var(--r-md);
  padding: 20px 22px;
}
.oc-card__title {
  font-family: var(--font-heading);
  font-size: 15px;
  font-weight: 700;
  margin: 0 0 14px;
  display: flex;
  justify-content: space-between;
  align-items: center;
}
.oc-card__title span {
  font-size: 13px;
  color: var(--orderzy-ink-muted);
  font-weight: 600;
}

.oc-items { display: flex; flex-direction: column; gap: 10px; }
.oc-item {
  display: flex;
  justify-content: space-between;
  font-size: 14px;
}
.oc-item__name { color: var(--orderzy-ink); }
.oc-item__qty { color: var(--orderzy-ink-muted); font-weight: 600; margin-right: 6px; }
.oc-item__price { color: var(--orderzy-ink); font-weight: 600; font-feature-settings: "tnum"; }

.oc-totals {
  border-top: 1px solid var(--orderzy-border);
  margin-top: 14px;
  padding-top: 14px;
  display: flex;
  flex-direction: column;
  gap: 6px;
}
.oc-totals__line {
  display: flex;
  justify-content: space-between;
  font-size: 13px;
  color: var(--orderzy-ink-soft);
}
.oc-totals__line--discount { color: var(--orderzy-success); font-weight: 600; }
.oc-totals__line--grand {
  font-family: var(--font-heading);
  font-weight: 700;
  font-size: 16px;
  color: var(--orderzy-ink);
  margin-top: 6px;
  padding-top: 10px;
  border-top: 1px solid var(--orderzy-border-soft);
}

.oc-paid {
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 10px 14px;
  background: var(--orderzy-success-soft);
  border-radius: var(--r-sm);
  font-size: 13px;
  color: #117a42;
  font-weight: 600;
  margin-top: 14px;
}

.oc-referral {
  background: linear-gradient(135deg, var(--orderzy-brand-soft), #fde5c8);
  border: 1px solid var(--orderzy-brand);
  padding: 18px 20px;
}
.oc-referral__head {
  font-family: var(--font-heading);
  font-size: 16px;
  font-weight: 700;
  color: var(--orderzy-brand-ink);
  margin-bottom: 4px;
}
.oc-referral__body {
  font-size: 13px;
  color: var(--orderzy-ink);
  line-height: 1.5;
  margin-bottom: 12px;
}

@media (max-width: 880px) {
  .oc-grid { grid-template-columns: 1fr; gap: 20px; }
  .oc-title { font-size: 26px; }
  .oc-hero { padding: 28px 20px; }
  .oc-page { padding: 24px 0 80px; }
}

/* ============================================================================
   MY ORDERS PAGE (mockup 16-my-orders.html migration)
   ============================================================================ */

.mo-page { padding: 40px 0 80px; }

.mo-head {
  margin-bottom: 24px;
  display: flex;
  justify-content: space-between;
  align-items: baseline;
  flex-wrap: wrap;
  gap: 12px;
}
.mo-title {
  font-family: var(--font-heading);
  font-size: 32px;
  font-weight: 700;
  letter-spacing: -0.02em;
  margin: 0 0 4px;
}
.mo-count { font-size: 14px; color: var(--orderzy-ink-soft); }

.mo-filters {
  display: flex;
  gap: 8px;
  overflow-x: auto;
  padding: 4px 0 16px;
  scrollbar-width: none;
  margin-bottom: 8px;
}
.mo-filters::-webkit-scrollbar { display: none; }
.mo-filter {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  padding: 8px 14px;
  border-radius: var(--r-pill);
  background: var(--orderzy-surface);
  border: 1px solid var(--orderzy-border);
  color: var(--orderzy-ink);
  font-size: 13px;
  font-weight: 600;
  white-space: nowrap;
  cursor: pointer;
  transition: all var(--dur-fast) var(--ease);
}
.mo-filter:hover:not(:disabled) { border-color: var(--orderzy-ink); }
.mo-filter.is-active {
  background: var(--orderzy-ink);
  color: var(--orderzy-ink-invert);
  border-color: var(--orderzy-ink);
}
.mo-filter:disabled { opacity: 0.65; cursor: not-allowed; }
.mo-filter__count {
  background: rgba(31,29,26,0.08);
  padding: 1px 6px;
  border-radius: var(--r-pill);
  font-size: 11px;
  font-family: var(--font-heading);
  font-feature-settings: "tnum";
}
.mo-filter.is-active .mo-filter__count { background: rgba(255,255,255,0.2); }

.mo-list { display: flex; flex-direction: column; gap: 16px; }

.mo-card {
  background: var(--orderzy-surface);
  border: 1px solid var(--orderzy-border);
  border-radius: var(--r-md);
  padding: 22px 24px;
  transition: box-shadow var(--dur-med) var(--ease);
}
.mo-card:hover { box-shadow: var(--orderzy-shadow-whisper); }
.mo-card--cancelled { border-style: dashed; opacity: 0.8; }

.mo-card__head {
  display: flex;
  justify-content: space-between;
  align-items: flex-start;
  gap: 12px;
  margin-bottom: 12px;
  flex-wrap: wrap;
}
.mo-card__rest { display: flex; align-items: center; gap: 12px; }
.mo-card__rest-img {
  width: 44px;
  height: 44px;
  border-radius: var(--r-sm);
  object-fit: cover;
  flex-shrink: 0;
}
.mo-card__rest-info { display: flex; flex-direction: column; gap: 2px; }
.mo-card__rest-name {
  font-family: var(--font-heading);
  font-size: 16px;
  font-weight: 700;
  color: var(--orderzy-ink);
  margin: 0;
}
.mo-card__meta {
  font-size: 12px;
  color: var(--orderzy-ink-muted);
  font-weight: 600;
  font-feature-settings: "tnum";
  display: flex;
  gap: 10px;
  align-items: center;
  flex-wrap: wrap;
}
.mo-card__meta-sep { opacity: 0.4; }

.mo-card__body {
  display: flex;
  justify-content: space-between;
  gap: 20px;
  padding: 12px 0;
  border-top: 1px solid var(--orderzy-border-soft);
  border-bottom: 1px solid var(--orderzy-border-soft);
  margin-bottom: 14px;
}
.mo-card__items {
  flex: 1;
  min-width: 0;
  font-size: 14px;
  color: var(--orderzy-ink);
  line-height: 1.55;
}
.mo-card__item-name { color: var(--orderzy-ink); }
.mo-card__item-qty { color: var(--orderzy-ink-muted); font-weight: 600; margin-right: 4px; }
.mo-card__total { text-align: right; flex-shrink: 0; }
.mo-card__total-label {
  font-size: 11px;
  font-weight: 600;
  color: var(--orderzy-ink-muted);
  letter-spacing: 0.04em;
  text-transform: uppercase;
}
.mo-card__total-val {
  font-family: var(--font-heading);
  font-size: 20px;
  font-weight: 700;
  color: var(--orderzy-ink);
  font-feature-settings: "tnum";
  margin-top: 2px;
}
.mo-card__total-val--strike { text-decoration: line-through; color: var(--orderzy-ink-muted); }

.mo-card__actions {
  display: flex;
  gap: 8px;
  align-items: center;
  justify-content: space-between;
  flex-wrap: wrap;
}
.mo-card__actions-left { display: flex; gap: 8px; flex-wrap: wrap; }

.mo-btn-sm {
  padding: 8px 14px;
  font-size: 13px;
  border-radius: var(--r-sm);
  font-weight: 700;
  border: 1px solid transparent;
  background: transparent;
  color: var(--orderzy-ink);
  cursor: pointer;
  display: inline-flex;
  align-items: center;
  gap: 6px;
  text-decoration: none;
  transition: all var(--dur-fast) var(--ease);
}
.mo-btn-sm--outline { border-color: var(--orderzy-border-strong); }
.mo-btn-sm--outline:hover { border-color: var(--orderzy-ink); }
.mo-btn-sm--danger { color: var(--orderzy-danger); }
.mo-btn-sm--reorder {
  background: var(--orderzy-brand-soft);
  color: var(--orderzy-brand-ink);
  border-color: var(--orderzy-brand);
}
.mo-btn-sm--reorder:hover { background: var(--orderzy-brand); color: #fff; }

.mo-load-more { margin-top: 32px; text-align: center; }

@media (max-width: 640px) {
  .mo-card { padding: 16px 18px; }
  .mo-card__body { flex-direction: column; gap: 10px; }
  .mo-card__total {
    text-align: left;
    display: flex;
    justify-content: space-between;
    align-items: center;
  }
  .mo-title { font-size: 24px; }
}


/* ===================================================================
   BATCH 3 ADDITIONS. Marketing page 30 (for-restaurants)
   Extends the shared mk-sec / mk-faq / mk-cta shells.
   Adds: hero, kitchen-queue preview, problem grid, 4-step rail,
   feature deep-dive cards + inline visuals, try-customer band,
   pricing card, Kulhadwala case study.
   =================================================================== */

/* ---------- Hero ---------- */
.mk-hero {
  padding: 72px 0 56px;
  position: relative;
  overflow: hidden;
}
.mk-hero::before {
  content: "";
  position: absolute;
  inset: 0;
  background:
    radial-gradient(circle at 80% 20%, rgba(242,133,0,0.10) 0%, transparent 55%),
    radial-gradient(circle at 10% 90%, rgba(242,133,0,0.05) 0%, transparent 50%);
  pointer-events: none;
}
.mk-hero__grid {
  display: grid;
  grid-template-columns: 1.05fr 1fr;
  gap: 56px;
  align-items: center;
  position: relative;
}
.mk-hero__headline {
  font-family: var(--font-heading);
  font-size: 52px;
  font-weight: 700;
  line-height: 1.05;
  letter-spacing: -0.025em;
  margin: 0 0 18px;
}
.mk-hero__headline-accent { color: var(--orderzy-brand); }
.mk-hero__sub {
  font-size: 18px;
  color: var(--orderzy-ink-soft);
  line-height: 1.6;
  max-width: 520px;
  margin: 0 0 28px;
}
.mk-hero__founder {
  font-size: 13.5px;
  color: var(--orderzy-ink-muted);
  font-style: italic;
  margin: -10px 0 22px;
  max-width: 520px;
  line-height: 1.5;
}
.mk-hero__ctas {
  display: flex;
  gap: 12px;
  flex-wrap: wrap;
  margin-bottom: 22px;
}
.mk-hero__trust {
  display: flex;
  flex-wrap: wrap;
  gap: 8px 22px;
  font-size: 13.5px;
  color: var(--orderzy-ink-soft);
  font-weight: 600;
}
.mk-hero__trust-item {
  display: inline-flex;
  align-items: center;
  gap: 6px;
}
.mk-hero__trust-item svg {
  color: var(--orderzy-success);
  flex-shrink: 0;
}

/* ---------- Kitchen dashboard preview (hero right) ---------- */
.mk-kqueue {
  background: var(--orderzy-surface);
  border-radius: var(--r-lg);
  box-shadow: var(--orderzy-shadow-lift);
  padding: 0;
  overflow: hidden;
  border: 1px solid var(--orderzy-border);
  position: relative;
}
.mk-kqueue__chrome {
  display: flex;
  align-items: center;
  gap: 8px;
  padding: 10px 14px;
  background: var(--orderzy-surface-alt);
  border-bottom: 1px solid var(--orderzy-border);
}
.mk-kqueue__dot {
  width: 10px;
  height: 10px;
  border-radius: 50%;
  background: var(--orderzy-border-strong);
}
.mk-kqueue__dot:first-child { background: #e06d6d; }
.mk-kqueue__dot:nth-child(2) { background: #e0b56d; }
.mk-kqueue__dot:nth-child(3) { background: #7ec58a; }
.mk-kqueue__url {
  flex: 1;
  text-align: center;
  font-family: ui-monospace, Menlo, monospace;
  /* 2026-08-22: 11px → 12px (caption floor). */
  font-size: 12px;
  color: var(--orderzy-ink-muted);
}
.mk-kqueue__body { padding: 18px 18px 14px; }
.mk-kqueue__head {
  display: flex;
  justify-content: space-between;
  align-items: baseline;
  margin-bottom: 14px;
}
.mk-kqueue__title {
  font-family: var(--font-heading);
  font-weight: 700;
  font-size: 15px;
}
.mk-kqueue__meta {
  font-size: 12px;
  color: var(--orderzy-ink-muted);
  font-weight: 600;
}
.mk-kqueue__cols {
  display: grid;
  grid-template-columns: 1fr 1fr 1fr;
  gap: 8px;
}
.mk-kqueue__col {
  background: var(--orderzy-surface-alt);
  border-radius: var(--r-sm);
  padding: 10px 10px 12px;
}
.mk-kqueue__col-head {
  font-family: var(--font-heading);
  /* 2026-08-22: 10px → 12px (caption floor). */
  font-size: 12px;
  font-weight: 700;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  color: var(--orderzy-ink-muted);
  margin-bottom: 8px;
  display: flex;
  justify-content: space-between;
}
.mk-kqueue__col-count {
  color: var(--orderzy-ink);
  background: var(--orderzy-surface);
  border-radius: var(--r-xs);
  padding: 1px 6px;
  /* 2026-08-22: 10px → 12px (caption floor). */
  font-size: 12px;
}
.mk-kq-ticket {
  background: var(--orderzy-surface);
  border-radius: var(--r-xs);
  padding: 8px 9px;
  margin-bottom: 6px;
  border-left: 2px solid var(--orderzy-brand);
  box-shadow: var(--orderzy-shadow-whisper);
}
.mk-kq-ticket:last-child { margin-bottom: 0; }
.mk-kq-ticket--ready { border-left-color: var(--orderzy-success); }
.mk-kq-ticket--done { border-left-color: var(--orderzy-ink-muted); opacity: 0.7; }
.mk-kq-ticket__head {
  display: flex;
  justify-content: space-between;
  font-family: var(--font-heading);
  font-weight: 700;
  /* 2026-08-22: 11px → 12px (caption floor). */
  font-size: 12px;
  color: var(--orderzy-ink);
}
.mk-kq-ticket__id { color: var(--orderzy-brand-ink); }
/* 2026-08-22: 10px → 12px (caption floor). */
.mk-kq-ticket__time { color: var(--orderzy-ink-muted); font-size: 12px; }
.mk-kq-ticket__body {
  /* 2026-08-22: 10.5px → 12px (caption floor). */
  font-size: 12px;
  color: var(--orderzy-ink-soft);
  margin-top: 3px;
  line-height: 1.35;
}
.mk-kqueue__foot {
  display: flex;
  justify-content: space-between;
  /* 2026-08-22: 11px → 12px (caption floor). */
  font-size: 12px;
  color: var(--orderzy-ink-muted);
  padding: 10px 18px 14px;
  border-top: 1px solid var(--orderzy-border);
  margin-top: 12px;
}
.mk-kqueue__foot strong { color: var(--orderzy-ink); font-family: var(--font-heading); }

/* ---------- Problem grid ---------- */
.mk-prob {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 20px;
}
.mk-prob__card {
  background: var(--orderzy-surface);
  border: 1px solid var(--orderzy-border);
  border-radius: var(--r-md);
  padding: 24px 22px;
}
.mk-prob__icon {
  width: 40px;
  height: 40px;
  border-radius: var(--r-sm);
  background: var(--orderzy-brand-soft);
  color: var(--orderzy-brand-ink);
  display: grid;
  place-items: center;
  margin-bottom: 14px;
}
.mk-prob__card h3 {
  font-family: var(--font-heading);
  font-size: 17px;
  font-weight: 700;
  margin: 0 0 6px;
}
.mk-prob__card p {
  font-size: 14.5px;
  color: var(--orderzy-ink-soft);
  line-height: 1.55;
  margin: 0;
}

/* ---------- Steps (4-step rail) ---------- */
.mk-steps {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: 18px;
  position: relative;
}
.mk-steps::before {
  content: "";
  position: absolute;
  top: 36px;
  left: 12.5%;
  right: 12.5%;
  height: 2px;
  background: linear-gradient(90deg, var(--orderzy-brand), rgba(242,133,0,0.2));
  z-index: 0;
}
.mk-step {
  background: var(--orderzy-surface);
  border: 1px solid var(--orderzy-border);
  border-radius: var(--r-md);
  padding: 20px 18px;
  position: relative;
  z-index: 1;
}
.mk-step__num {
  width: 34px;
  height: 34px;
  border-radius: 50%;
  background: var(--orderzy-brand-deep);
  color: #fff;
  display: grid;
  place-items: center;
  font-family: var(--font-heading);
  font-weight: 700;
  font-size: 14px;
  margin-bottom: 14px;
  box-shadow: 0 2px 8px rgba(31,29,26,0.15);
}
.mk-step h3 {
  font-family: var(--font-heading);
  font-size: 15px;
  font-weight: 700;
  margin: 0 0 4px;
}
.mk-step p {
  font-size: 13.5px;
  color: var(--orderzy-ink-soft);
  line-height: 1.5;
  margin: 0;
}

/* ---------- Feature deep-dive cards ---------- */
.mk-feat {
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  gap: 32px;
  margin-top: 8px;
}
.mk-feat__card {
  background: var(--orderzy-surface);
  border: 1px solid var(--orderzy-border);
  border-radius: var(--r-lg);
  padding: 28px;
  display: grid;
  grid-template-columns: 1fr;
  gap: 16px;
}
.mk-feat__label {
  font-family: var(--font-heading);
  /* 2026-08-22: 11px → 12px (caption floor). */
  font-size: 12px;
  font-weight: 700;
  letter-spacing: 0.1em;
  text-transform: uppercase;
  color: var(--orderzy-brand-ink);
}
.mk-feat__card h3 {
  font-family: var(--font-heading);
  font-size: 22px;
  font-weight: 700;
  margin: 0 0 8px;
  letter-spacing: -0.01em;
}
.mk-feat__card p {
  font-size: 15px;
  color: var(--orderzy-ink-soft);
  line-height: 1.6;
  margin: 0 0 14px;
}
.mk-feat__bullets {
  list-style: none;
  padding: 0;
  margin: 0;
  display: grid;
  gap: 8px;
}
.mk-feat__bullets li {
  display: flex;
  align-items: flex-start;
  gap: 10px;
  font-size: 14px;
  color: var(--orderzy-ink);
}
.mk-feat__bullets li svg {
  flex-shrink: 0;
  color: var(--orderzy-success);
  margin-top: 2px;
}
.mk-feat__visual {
  background: var(--orderzy-surface-alt);
  border: 1px solid var(--orderzy-border);
  border-radius: var(--r-md);
  padding: 16px;
  font-size: 12.5px;
}
.mk-feat__visual-row {
  display: flex;
  justify-content: space-between;
  padding: 8px 10px;
  background: var(--orderzy-surface);
  border-radius: var(--r-xs);
  margin-bottom: 6px;
  font-family: var(--font-heading);
  font-weight: 600;
}
.mk-feat__visual-row:last-child { margin-bottom: 0; }
.mk-feat__visual-row .num,
.mk-feat__visual-row .price { color: var(--orderzy-ink); }
.mk-feat__visual-row .dim { color: var(--orderzy-ink-muted); font-weight: 500; }

/* QR grid visual */
.mk-qr-grid {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: 8px;
}
.mk-qr-grid__cell {
  aspect-ratio: 1 / 1;
  background: var(--orderzy-surface);
  border: 1px solid var(--orderzy-border);
  border-radius: var(--r-xs);
  display: grid;
  place-items: center;
  position: relative;
  overflow: hidden;
}
.mk-qr-grid__cell::before {
  content: "";
  position: absolute;
  inset: 14%;
  background:
    linear-gradient(45deg, var(--orderzy-ink) 25%, transparent 25%) 0 0 / 6px 6px,
    linear-gradient(-45deg, var(--orderzy-ink) 25%, transparent 25%) 0 0 / 6px 6px;
  opacity: 0.75;
  border-radius: 2px;
}
.mk-qr-grid__cell span {
  position: relative;
  z-index: 2;
  background: var(--orderzy-surface);
  padding: 2px 5px;
  border-radius: 2px;
  font-family: var(--font-heading);
  font-weight: 700;
  font-size: 10px;
  color: var(--orderzy-ink);
}

/* Waitlist visual */
.mk-wl-row {
  display: grid;
  grid-template-columns: 26px 1fr auto;
  align-items: center;
  gap: 10px;
  padding: 8px 10px;
  background: var(--orderzy-surface);
  border-radius: var(--r-xs);
  margin-bottom: 6px;
}
.mk-wl-row:last-child { margin-bottom: 0; }
.mk-wl-row__pos {
  font-family: var(--font-heading);
  font-weight: 700;
  font-size: 12px;
  color: var(--orderzy-ink-muted);
  text-align: center;
}
.mk-wl-row__name { font-weight: 700; font-size: 13px; }
/* 2026-08-22: 11px → 12px (caption floor). */
.mk-wl-row__party { font-size: 12px; color: var(--orderzy-ink-muted); }

/* Bill visual */
.mk-bill-row {
  display: flex;
  justify-content: space-between;
  font-size: 13px;
  padding: 5px 0;
  color: var(--orderzy-ink-soft);
}
.mk-bill-row--total {
  border-top: 1px solid var(--orderzy-border);
  margin-top: 6px;
  padding-top: 10px;
  font-family: var(--font-heading);
  font-weight: 700;
  font-size: 16px;
  color: var(--orderzy-ink);
}

/* ---------- Try customer view band ---------- */
.mk-try {
  padding: 28px 0 8px;
}
.mk-try__band {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 14px 20px;
  flex-wrap: wrap;
  padding: 18px 24px;
  background: var(--orderzy-surface);
  border: 1px solid var(--orderzy-border);
  border-radius: var(--r-md);
  text-align: center;
}
.mk-try__text {
  font-family: var(--font-heading);
  font-size: 15px;
  font-weight: 600;
  color: var(--orderzy-ink);
  margin: 0;
}
.mk-try__text small {
  display: block;
  font-family: var(--font-body);
  font-size: 13px;
  font-weight: 400;
  color: var(--orderzy-ink-soft);
  margin-top: 2px;
}

/* ---------- Pricing card ---------- */
.mk-price {
  max-width: 680px;
  margin: 0 auto;
  background: var(--orderzy-surface);
  border: 2px solid var(--orderzy-brand);
  border-radius: var(--r-lg);
  padding: 36px 36px 32px;
  position: relative;
}
.mk-price__tag {
  position: absolute;
  top: -14px;
  left: 36px;
  background: var(--orderzy-brand-deep);
  color: #fff;
  padding: 5px 12px;
  border-radius: var(--r-pill);
  font-family: var(--font-heading);
  /* 2026-08-22: 11px → 12px (caption floor). */
  font-size: 12px;
  font-weight: 700;
  letter-spacing: 0.08em;
  text-transform: uppercase;
}
.mk-price__head {
  display: flex;
  justify-content: space-between;
  align-items: baseline;
  flex-wrap: wrap;
  gap: 10px;
  margin-bottom: 6px;
}
.mk-price__name {
  font-family: var(--font-heading);
  font-size: 24px;
  font-weight: 700;
  margin: 0;
}
.mk-price__amount {
  font-family: var(--font-heading);
  font-size: 40px;
  font-weight: 700;
  color: var(--orderzy-ink);
  letter-spacing: -0.02em;
}
.mk-price__amount small {
  font-size: 15px;
  color: var(--orderzy-ink-muted);
  font-weight: 600;
  margin-left: 4px;
}
.mk-price__tagline {
  font-size: 15px;
  color: var(--orderzy-ink-soft);
  line-height: 1.55;
  margin: 0 0 20px;
}
.mk-price__list {
  list-style: none;
  padding: 0;
  margin: 0 0 24px;
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 10px 18px;
}
.mk-price__list li {
  display: flex;
  align-items: flex-start;
  gap: 8px;
  font-size: 14px;
  color: var(--orderzy-ink);
}
.mk-price__list li svg {
  color: var(--orderzy-success);
  flex-shrink: 0;
  margin-top: 2px;
}
.mk-price__note {
  padding: 14px 16px;
  background: var(--orderzy-surface-alt);
  border-radius: var(--r-sm);
  font-size: 13px;
  color: var(--orderzy-ink-soft);
  line-height: 1.55;
  margin-bottom: 22px;
}
.mk-price__note strong { color: var(--orderzy-ink); }
.mk-price__ctas {
  display: flex;
  gap: 12px;
  flex-wrap: wrap;
}
.mk-price__ctas .btn { flex: 1 1 220px; }

/* ---------- Kulhadwala case study (warm anchor) ---------- */
.mk-case {
  background: linear-gradient(135deg, var(--orderzy-brand-soft) 0%, #fde5c8 100%);
  padding: 72px 0;
  position: relative;
  overflow: hidden;
}
.mk-case::before {
  content: "";
  position: absolute;
  inset: 0;
  background: radial-gradient(circle at 90% 40%, rgba(242,133,0,0.14), transparent 55%);
  pointer-events: none;
}
.mk-case__grid {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 48px;
  align-items: center;
  position: relative;
}
.mk-case__tag {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  font-family: var(--font-heading);
  /* 2026-08-22: 11px → 12px (caption floor). */
  font-size: 12px;
  font-weight: 700;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--orderzy-brand-ink);
  background: rgba(255,255,255,0.75);
  padding: 5px 12px;
  border-radius: var(--r-pill);
  margin-bottom: 18px;
}
.mk-case__title {
  font-family: var(--font-heading);
  font-size: 32px;
  font-weight: 700;
  line-height: 1.15;
  letter-spacing: -0.02em;
  margin: 0 0 14px;
}
.mk-case__quote {
  font-family: var(--font-heading);
  font-size: 20px;
  line-height: 1.5;
  font-weight: 600;
  color: var(--orderzy-ink);
  margin: 0 0 18px;
  padding-left: 18px;
  border-left: 3px solid var(--orderzy-brand);
}
.mk-case__body {
  font-size: 16px;
  color: var(--orderzy-ink-soft);
  line-height: 1.65;
  margin: 0 0 16px;
}
.mk-case__facts {
  display: flex;
  flex-wrap: wrap;
  gap: 8px 10px;
  margin: 18px 0 0;
}
.mk-case__fact {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  padding: 5px 11px;
  background: rgba(255,255,255,0.8);
  border-radius: var(--r-pill);
  font-size: 12px;
  font-weight: 600;
  color: var(--orderzy-ink);
}
.mk-case__fact svg { color: var(--orderzy-brand-ink); flex-shrink: 0; }
.mk-case__media {
  position: relative;
  border-radius: var(--r-lg);
  overflow: hidden;
  aspect-ratio: 4 / 5;
  box-shadow: var(--orderzy-shadow-lift),
              0 24px 60px -20px rgba(31,29,26,0.25);
}
.mk-case__media img { width: 100%; height: 100%; object-fit: cover; display: block; }
.mk-case__media-meta {
  position: absolute;
  bottom: 0;
  left: 0;
  right: 0;
  padding: 18px 20px;
  background: linear-gradient(to top, rgba(31,29,26,0.85), transparent);
  color: #fff;
}
/* Selector renamed h4 → h3 on 2026-08-22 to fix H2→H4 heading-skip while */
/* preserving the visual 17px caption size in the case-study media strip. */
.mk-case__media-meta h3 {
  font-family: var(--font-heading);
  font-weight: 700;
  font-size: 17px;
  margin: 0;
  color: #fff;
}
.mk-case__media-meta div {
  font-size: 13px;
  opacity: 0.85;
  margin-top: 3px;
}

/* ---------- Marketing-30 responsive ---------- */
@media (max-width: 1024px) {
  .mk-hero__grid { gap: 40px; }
  .mk-hero__headline { font-size: 44px; }
  .mk-feat { gap: 20px; }
}
@media (max-width: 880px) {
  .mk-hero { padding: 48px 0 40px; }
  .mk-hero__grid { grid-template-columns: 1fr; gap: 40px; }
  .mk-hero__headline { font-size: 36px; }
  .mk-prob { grid-template-columns: 1fr; }
  .mk-steps { grid-template-columns: repeat(2, 1fr); }
  .mk-steps::before { display: none; }
  .mk-feat { grid-template-columns: 1fr; }
  .mk-price__list { grid-template-columns: 1fr; }
  .mk-case__grid { grid-template-columns: 1fr; gap: 32px; }
  .mk-case__media { aspect-ratio: 3 / 2; max-width: 520px; }
}
@media (max-width: 520px) {
  .mk-hero__headline { font-size: 30px; }
  .mk-steps { grid-template-columns: 1fr; }
  .mk-price { padding: 32px 22px 24px; }
  .mk-price__amount { font-size: 32px; }
  .mk-case__title { font-size: 24px; }
  .mk-case__quote { font-size: 17px; }
}


/* ===================================================================
   BATCH 3 ADDITIONS. Marketing page 31 (restaurant-management-software)
   Extends mk-crumbs / mk-sec / mk-faq / mk-cta shells.
   Adds: feat-hero (smaller than page 30), dashboard preview,
   lead block, 8-feature 4-col grid, day-in-the-life rail + blocks,
   comparison table.
   =================================================================== */

/* ---------- Smaller hero for feature pages (has breadcrumb above) ---------- */
.mk-feat-hero {
  padding: 24px 0 48px;
  position: relative;
  overflow: hidden;
}
.mk-feat-hero::before {
  content: "";
  position: absolute;
  inset: 0;
  background: radial-gradient(circle at 85% 15%, rgba(242,133,0,0.08) 0%, transparent 55%);
  pointer-events: none;
}
.mk-feat-hero__grid {
  display: grid;
  grid-template-columns: 1.1fr 1fr;
  gap: 48px;
  align-items: center;
  position: relative;
}
.mk-feat-hero__headline {
  font-family: var(--font-heading);
  font-size: 44px;
  font-weight: 700;
  line-height: 1.1;
  letter-spacing: -0.02em;
  margin: 0 0 16px;
}
.mk-feat-hero__lede {
  font-size: 17px;
  color: var(--orderzy-ink-soft);
  line-height: 1.65;
  border-left: 3px solid var(--orderzy-brand);
  padding: 4px 0 4px 18px;
  margin: 0 0 24px;
  max-width: 620px;
}
.mk-feat-hero__ctas {
  display: flex;
  gap: 12px;
  flex-wrap: wrap;
}

/* ---------- Dashboard mock (hero right) ---------- */
.mk-dashmock {
  background: var(--orderzy-surface);
  border-radius: var(--r-lg);
  box-shadow: var(--orderzy-shadow-lift);
  border: 1px solid var(--orderzy-border);
  overflow: hidden;
}
.mk-dashmock__chrome {
  display: flex;
  align-items: center;
  gap: 8px;
  padding: 10px 14px;
  background: var(--orderzy-surface-alt);
  border-bottom: 1px solid var(--orderzy-border);
}
.mk-dashmock__chrome-dot {
  width: 10px;
  height: 10px;
  border-radius: 50%;
  background: var(--orderzy-border-strong);
}
.mk-dashmock__chrome-dot:first-child { background: #e06d6d; }
.mk-dashmock__chrome-dot:nth-child(2) { background: #e0b56d; }
.mk-dashmock__chrome-dot:nth-child(3) { background: #7ec58a; }
.mk-dashmock__chrome-url {
  flex: 1;
  text-align: center;
  font-family: ui-monospace, Menlo, monospace;
  font-size: 11px;
  color: var(--orderzy-ink-muted);
}
.mk-dashmock__layout {
  display: grid;
  grid-template-columns: 140px 1fr;
  min-height: 380px;
}
.mk-dashmock__side {
  background: var(--orderzy-ink);
  color: rgba(250,249,245,0.7);
  padding: 16px 12px;
  font-size: 11.5px;
}
.mk-dashmock__side-brand {
  font-family: var(--font-heading);
  font-weight: 700;
  color: var(--orderzy-brand);
  font-size: 14px;
  margin-bottom: 14px;
  padding: 0 4px;
}
.mk-dashmock__side-item {
  display: flex;
  align-items: center;
  gap: 8px;
  padding: 7px 8px;
  border-radius: var(--r-xs);
  font-weight: 600;
}
.mk-dashmock__side-item svg { flex-shrink: 0; color: currentColor; opacity: 0.8; }
.mk-dashmock__side-item--active {
  background: rgba(242,133,0,0.14);
  color: var(--orderzy-brand);
}
.mk-dashmock__side-label {
  font-family: var(--font-heading);
  font-size: 9.5px;
  font-weight: 700;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: rgba(250,249,245,0.4);
  padding: 12px 8px 6px;
}
.mk-dashmock__main {
  padding: 16px;
  background: var(--orderzy-canvas, var(--orderzy-surface-alt));
}
.mk-dashmock__title {
  font-family: var(--font-heading);
  font-weight: 700;
  font-size: 14px;
  margin-bottom: 12px;
  display: flex;
  justify-content: space-between;
  align-items: center;
}
.mk-dashmock__title .pill { font-size: 10px; }
.mk-dashmock__metrics {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 8px;
  margin-bottom: 12px;
}
.mk-dashmock__metric {
  background: var(--orderzy-surface);
  border: 1px solid var(--orderzy-border);
  border-radius: var(--r-sm);
  padding: 10px 12px;
}
.mk-dashmock__metric-label {
  font-family: var(--font-heading);
  font-size: 9px;
  font-weight: 700;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  color: var(--orderzy-ink-muted);
}
.mk-dashmock__metric-value {
  font-family: var(--font-heading);
  font-weight: 700;
  font-size: 18px;
  color: var(--orderzy-ink);
  margin-top: 2px;
}
.mk-dashmock__metric-value small {
  font-size: 11px;
  color: var(--orderzy-success);
  font-weight: 700;
  margin-left: 4px;
}
.mk-dashmock__rows {
  background: var(--orderzy-surface);
  border: 1px solid var(--orderzy-border);
  border-radius: var(--r-sm);
  overflow: hidden;
}
.mk-dashmock__row {
  display: flex;
  justify-content: space-between;
  padding: 8px 12px;
  font-size: 11.5px;
  align-items: center;
  border-bottom: 1px solid var(--orderzy-border);
}
.mk-dashmock__row:last-child { border-bottom: 0; }
.mk-dashmock__row .pill { font-size: 10px; }
.mk-dashmock__row-left { display: flex; gap: 10px; align-items: center; }
.mk-dashmock__row-id { font-weight: 700; color: var(--orderzy-brand-ink); }
.mk-dashmock__row-meta { color: var(--orderzy-ink-muted); }

/* ---------- Lead paragraph block ---------- */
.mk-lead {
  padding: 12px 0 48px;
}
.mk-lead__block {
  background: var(--orderzy-surface);
  border: 1px solid var(--orderzy-border);
  border-radius: var(--r-md);
  padding: 28px 32px;
  max-width: 860px;
  font-size: 16px;
  line-height: 1.7;
  color: var(--orderzy-ink-soft);
}
.mk-lead__block strong { color: var(--orderzy-ink); }

/* ---------- 8-feature grid (4-col shallow cards) ---------- */
.mk-feat8 {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: 18px;
}
.mk-feat8__card {
  background: var(--orderzy-surface);
  border: 1px solid var(--orderzy-border);
  border-radius: var(--r-md);
  padding: 22px 22px 24px;
  display: flex;
  flex-direction: column;
}
.mk-feat8__icon {
  width: 40px;
  height: 40px;
  border-radius: var(--r-sm);
  background: var(--orderzy-brand-soft);
  color: var(--orderzy-brand-ink);
  display: grid;
  place-items: center;
  margin-bottom: 14px;
}
.mk-feat8__card h3 {
  font-family: var(--font-heading);
  font-size: 15px;
  font-weight: 700;
  margin: 0 0 6px;
}
.mk-feat8__card p {
  font-size: 13.5px;
  color: var(--orderzy-ink-soft);
  line-height: 1.55;
  margin: 0;
}

/* ---------- A day running Orderzy (sticky time-rail) ---------- */
.mk-day {
  display: grid;
  grid-template-columns: 200px 1fr;
  gap: 32px;
}
.mk-day__rail {
  position: sticky;
  top: 96px;
  align-self: start;
  padding-right: 20px;
  border-right: 1px solid var(--orderzy-border);
}
.mk-day__rail-title {
  font-family: var(--font-heading);
  font-size: 11px;
  font-weight: 700;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--orderzy-ink-muted);
  margin: 0 0 12px;
}
.mk-day__rail-item {
  padding: 10px 4px;
  font-family: var(--font-heading);
  font-weight: 600;
  font-size: 13px;
  color: var(--orderzy-ink-soft);
  display: flex;
  justify-content: space-between;
  align-items: center;
  border-bottom: 1px solid var(--orderzy-border);
}
.mk-day__rail-item:last-child { border-bottom: none; }
.mk-day__rail-item--active { color: var(--orderzy-brand-ink); }
.mk-day__rail-time {
  font-family: var(--font-heading);
  font-size: 11px;
  font-weight: 700;
  color: var(--orderzy-ink-muted);
}
.mk-day__rail-item--active .mk-day__rail-time { color: var(--orderzy-brand); }

.mk-day__block {
  padding-bottom: 40px;
  margin-bottom: 40px;
  border-bottom: 1px solid var(--orderzy-border);
}
.mk-day__block:last-child { border-bottom: none; margin-bottom: 0; }
.mk-day__time {
  font-family: var(--font-heading);
  font-size: 12px;
  font-weight: 700;
  color: var(--orderzy-brand);
  letter-spacing: 0.08em;
  text-transform: uppercase;
  margin-bottom: 8px;
}
.mk-day__title {
  font-family: var(--font-heading);
  font-size: 22px;
  font-weight: 700;
  margin: 0 0 8px;
  letter-spacing: -0.01em;
}
.mk-day__body {
  font-size: 15.5px;
  line-height: 1.65;
  color: var(--orderzy-ink-soft);
  margin: 0 0 16px;
  max-width: 600px;
}
.mk-day__body strong { color: var(--orderzy-ink); }
.mk-day__visual {
  background: var(--orderzy-surface);
  border: 1px solid var(--orderzy-border);
  border-radius: var(--r-md);
  padding: 16px 18px;
  font-size: 13px;
  max-width: 520px;
}
.mk-day__visual-row {
  display: flex;
  justify-content: space-between;
  padding: 6px 0;
  border-bottom: 1px solid var(--orderzy-border);
  font-family: var(--font-heading);
  font-weight: 600;
}
.mk-day__visual-row:last-child { border-bottom: none; }
.mk-day__visual-row .dim { color: var(--orderzy-ink-muted); font-weight: 500; }

/* ---------- Comparison table ---------- */
.mk-compare {
  background: var(--orderzy-surface);
  border: 1px solid var(--orderzy-border);
  border-radius: var(--r-md);
  overflow: hidden;
  box-shadow: var(--orderzy-shadow-whisper);
}
.mk-compare table {
  width: 100%;
  border-collapse: collapse;
  font-size: 14.5px;
}
.mk-compare thead {
  background: var(--orderzy-ink);
  color: var(--orderzy-ink-invert);
}
.mk-compare th {
  padding: 14px 18px;
  text-align: left;
  font-family: var(--font-heading);
  font-weight: 700;
  font-size: 13px;
  letter-spacing: 0.02em;
  color: #fff;
}
.mk-compare th:nth-child(2),
.mk-compare th:nth-child(3) { text-align: center; }
.mk-compare th:nth-child(2) { color: var(--orderzy-brand); }
.mk-compare td {
  padding: 14px 18px;
  border-top: 1px solid var(--orderzy-border);
  color: var(--orderzy-ink-soft);
}
.mk-compare td:first-child {
  color: var(--orderzy-ink);
  font-weight: 600;
}
.mk-compare td:nth-child(2),
.mk-compare td:nth-child(3) { text-align: center; }
.mk-compare tbody tr:nth-child(even) { background: var(--orderzy-surface-alt); }
.mk-compare__check { color: var(--orderzy-success); font-weight: 700; }
.mk-compare__x { color: var(--orderzy-ink-muted); }
.mk-compare__pill {
  display: inline-block;
  padding: 2px 9px;
  border-radius: var(--r-pill);
  font-family: var(--font-heading);
  font-size: 11px;
  font-weight: 700;
}
.mk-compare__pill--good {
  background: var(--orderzy-success-soft);
  color: var(--orderzy-success);
}

/* ---------- Marketing-31 responsive ---------- */
@media (max-width: 1024px) {
  .mk-feat8 { grid-template-columns: repeat(2, 1fr); }
  .mk-feat-hero__headline { font-size: 36px; }
}
@media (max-width: 880px) {
  .mk-feat-hero__grid { grid-template-columns: 1fr; gap: 32px; }
  .mk-day { grid-template-columns: 1fr; gap: 20px; }
  .mk-day__rail {
    position: static;
    padding-right: 0;
    border-right: none;
    border-bottom: 1px solid var(--orderzy-border);
    padding-bottom: 12px;
  }
  .mk-lead__block { padding: 22px 24px; font-size: 15px; }
  .mk-compare { overflow-x: auto; }
  .mk-compare table { min-width: 560px; }
}
@media (max-width: 520px) {
  .mk-feat-hero__headline { font-size: 28px; }
  .mk-feat8 { grid-template-columns: 1fr; }
  .mk-day__title { font-size: 19px; }
  .mk-dashmock__layout { grid-template-columns: 1fr; }
  .mk-dashmock__side { display: none; }
}


/* ===================================================================
   BATCH 3 ADDITIONS. Marketing page 32 (dine-in-ordering-system)
   Customer-facing lens. Extends mk-crumbs / mk-sec / mk-faq / mk-cta.
   Reuses the existing .phone* classes from the home page migration.
   Adds: di-hero (hero with phone stage), 3-step explainer,
   split blocks with bill + waitlist visuals, "not an app" trust grid.
   =================================================================== */

/* ---------- Hero ---------- */
.mk-di-hero {
  padding: 24px 0 56px;
  position: relative;
  overflow: hidden;
}
.mk-di-hero::before {
  content: "";
  position: absolute;
  inset: 0;
  background: radial-gradient(circle at 80% 20%, rgba(242,133,0,0.10) 0%, transparent 55%);
  pointer-events: none;
}
.mk-di-hero__grid {
  display: grid;
  grid-template-columns: 1.1fr 1fr;
  gap: 48px;
  align-items: center;
  position: relative;
}
.mk-di-hero__headline {
  font-family: var(--font-heading);
  font-size: 46px;
  font-weight: 700;
  line-height: 1.1;
  letter-spacing: -0.025em;
  margin: 0 0 16px;
}
.mk-di-hero__headline em {
  font-style: normal;
  color: var(--orderzy-brand);
}
.mk-di-hero__sub {
  font-size: 17px;
  color: var(--orderzy-ink-soft);
  line-height: 1.65;
  max-width: 560px;
  margin: 0 0 24px;
}
.mk-di-hero__ctas {
  display: flex;
  gap: 12px;
  flex-wrap: wrap;
}
.mk-di-phone-stage {
  display: flex;
  justify-content: center;
  align-items: center;
  position: relative;
}
.mk-di-phone-stage::before {
  content: "";
  position: absolute;
  inset: 20% 10%;
  background: radial-gradient(circle, rgba(242,133,0,0.18), transparent 70%);
  filter: blur(40px);
  z-index: 0;
}
.mk-di-phone-stage .phone { position: relative; z-index: 1; }

/* ---------- 3-step explainer ---------- */
.mk-di-steps {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 24px;
}
.mk-di-step {
  background: var(--orderzy-surface);
  border: 1px solid var(--orderzy-border);
  border-radius: var(--r-lg);
  padding: 28px 26px;
  position: relative;
}
.mk-di-step__num {
  font-family: var(--font-heading);
  font-size: 12px;
  font-weight: 700;
  color: var(--orderzy-brand);
  letter-spacing: 0.08em;
  text-transform: uppercase;
  margin-bottom: 12px;
}
.mk-di-step__icon {
  width: 44px;
  height: 44px;
  border-radius: var(--r-sm);
  background: var(--orderzy-brand-soft);
  color: var(--orderzy-brand-ink);
  display: grid;
  place-items: center;
  margin-bottom: 16px;
}
.mk-di-step h3 {
  font-family: var(--font-heading);
  font-size: 19px;
  font-weight: 700;
  margin: 0 0 8px;
}
.mk-di-step p {
  font-size: 15px;
  color: var(--orderzy-ink-soft);
  line-height: 1.6;
  margin: 0;
}

/* ---------- Split feature blocks ---------- */
.mk-di-split {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 48px;
  align-items: center;
  margin-bottom: 72px;
}
.mk-di-split:last-child { margin-bottom: 0; }
.mk-di-split--reverse > :first-child { order: 2; }
.mk-di-split__visual {
  background: var(--orderzy-surface);
  border: 1px solid var(--orderzy-border);
  border-radius: var(--r-lg);
  padding: 28px;
  box-shadow: var(--orderzy-shadow-whisper);
}
.mk-di-split__label {
  font-family: var(--font-heading);
  font-size: 11px;
  font-weight: 700;
  letter-spacing: 0.1em;
  text-transform: uppercase;
  color: var(--orderzy-brand-ink);
  margin-bottom: 10px;
}
.mk-di-split h3 {
  font-family: var(--font-heading);
  font-size: 28px;
  font-weight: 700;
  line-height: 1.15;
  letter-spacing: -0.015em;
  margin: 0 0 14px;
}
.mk-di-split p {
  font-size: 16px;
  color: var(--orderzy-ink-soft);
  line-height: 1.65;
  margin: 0 0 16px;
}
.mk-di-split__bullets {
  list-style: none;
  padding: 0;
  margin: 0;
  display: grid;
  gap: 10px;
}
.mk-di-split__bullets li {
  display: flex;
  align-items: flex-start;
  gap: 10px;
  font-size: 15px;
  color: var(--orderzy-ink);
}
.mk-di-split__bullets li svg {
  color: var(--orderzy-success);
  flex-shrink: 0;
  margin-top: 3px;
}

/* ---------- Bill visual (inside split) ---------- */
.mk-di-bill-head {
  display: flex;
  justify-content: space-between;
  align-items: baseline;
  padding-bottom: 10px;
  border-bottom: 1px solid var(--orderzy-border);
  margin-bottom: 10px;
}
.mk-di-bill-head h4 {
  font-family: var(--font-heading);
  font-size: 15px;
  font-weight: 700;
  margin: 0;
}
.mk-di-bill-head span {
  font-size: 12px;
  color: var(--orderzy-ink-muted);
  font-weight: 600;
}
.mk-di-bill-row {
  display: flex;
  justify-content: space-between;
  font-size: 13.5px;
  padding: 5px 0;
  color: var(--orderzy-ink-soft);
}
.mk-di-bill-row--discount { color: var(--orderzy-success); }
.mk-di-bill-row--total {
  border-top: 1px solid var(--orderzy-border);
  margin-top: 6px;
  padding-top: 10px;
  font-family: var(--font-heading);
  font-weight: 700;
  font-size: 17px;
  color: var(--orderzy-ink);
}

/* ---------- Waitlist visual (inside split) ---------- */
.mk-di-wl-head {
  font-family: var(--font-heading);
  font-weight: 700;
  font-size: 14px;
  margin-bottom: 14px;
  display: flex;
  justify-content: space-between;
  align-items: center;
}
.mk-di-wl-head span { font-size: 12px; color: var(--orderzy-ink-muted); font-weight: 600; }
.mk-di-wl-you {
  background: linear-gradient(135deg, var(--orderzy-brand-soft), #fde5c8);
  border: 1px solid var(--orderzy-brand);
  border-radius: var(--r-md);
  padding: 14px;
  margin-bottom: 14px;
  display: flex;
  justify-content: space-between;
  align-items: center;
}
.mk-di-wl-you__num {
  font-family: var(--font-heading);
  font-weight: 700;
  font-size: 32px;
  color: var(--orderzy-brand-ink);
  line-height: 1;
}
.mk-di-wl-you__label {
  font-size: 11px;
  font-weight: 700;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--orderzy-brand-ink);
  margin-bottom: 2px;
}
.mk-di-wl-you__name {
  font-family: var(--font-heading);
  font-weight: 700;
  font-size: 15px;
}
.mk-di-wl-you__pos { text-align: right; }
.mk-di-wl-you__pos-label {
  font-size: 10.5px;
  color: var(--orderzy-brand-ink);
  font-weight: 700;
}
.mk-di-wl-row {
  display: flex;
  justify-content: space-between;
  padding: 8px 10px;
  font-size: 13px;
  background: var(--orderzy-surface-alt);
  border-radius: var(--r-xs);
  margin-bottom: 4px;
}
.mk-di-wl-row__status {
  color: var(--orderzy-brand-ink);
  font-weight: 700;
}

/* ---------- "Not an app" trust grid ---------- */
.mk-di-not-app {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 16px;
}
.mk-di-not-app__card {
  background: var(--orderzy-surface);
  border: 1px solid var(--orderzy-border);
  border-radius: var(--r-md);
  padding: 22px;
}
.mk-di-not-app__card svg {
  color: var(--orderzy-brand);
  margin-bottom: 10px;
}
.mk-di-not-app__card h3 {
  font-family: var(--font-heading);
  font-size: 15px;
  font-weight: 700;
  margin: 0 0 4px;
}
.mk-di-not-app__card p {
  font-size: 13.5px;
  color: var(--orderzy-ink-soft);
  line-height: 1.55;
  margin: 0;
}

/* ---------- Marketing-32 responsive ---------- */
@media (max-width: 1024px) {
  .mk-di-hero__headline { font-size: 36px; }
}
@media (max-width: 880px) {
  .mk-di-hero__grid { grid-template-columns: 1fr; gap: 32px; }
  .mk-di-hero__headline { font-size: 30px; }
  .mk-di-steps { grid-template-columns: 1fr; }
  .mk-di-split { grid-template-columns: 1fr; gap: 24px; margin-bottom: 40px; }
  .mk-di-split--reverse > :first-child { order: 0; }
  .mk-di-not-app { grid-template-columns: 1fr; }
}
@media (max-width: 520px) {
  .mk-di-hero__headline { font-size: 26px; }
}


/* ===================================================================
   BATCH 3 ADDITIONS. Marketing page 33 (city-landing)
   Per-city SEO template rendering CITY_DATA. Extends mk-* shells.
   =================================================================== */

.mk-cl-hero {
  padding: 16px 0 56px;
  position: relative;
  overflow: hidden;
}
.mk-cl-hero::before {
  content: "";
  position: absolute;
  inset: 0;
  background:
    radial-gradient(circle at 85% 10%, rgba(242,133,0,0.10) 0%, transparent 50%),
    radial-gradient(circle at 5% 80%, rgba(242,133,0,0.06) 0%, transparent 50%);
  pointer-events: none;
}
.mk-cl-hero__grid {
  display: grid;
  grid-template-columns: 1.2fr 1fr;
  gap: 48px;
  align-items: center;
  position: relative;
}
.mk-cl-hero__city-tag {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  font-family: var(--font-heading);
  font-size: 11px;
  font-weight: 700;
  letter-spacing: 0.1em;
  text-transform: uppercase;
  color: var(--orderzy-brand-ink);
  background: var(--orderzy-brand-soft);
  padding: 5px 12px;
  border-radius: var(--r-pill);
  margin-bottom: 14px;
}
.mk-cl-hero__city-tag svg { color: var(--orderzy-brand); }
.mk-cl-hero__headline {
  font-family: var(--font-heading);
  font-size: 44px;
  font-weight: 700;
  line-height: 1.1;
  letter-spacing: -0.025em;
  margin: 0 0 16px;
}
.mk-cl-hero__headline em {
  font-style: normal;
  color: var(--orderzy-brand);
}
.mk-cl-hero__sub {
  font-size: 17px;
  color: var(--orderzy-ink-soft);
  line-height: 1.65;
  max-width: 560px;
  margin: 0 0 24px;
}
.mk-cl-hero__ctas {
  display: flex;
  gap: 12px;
  flex-wrap: wrap;
  margin-bottom: 20px;
}
.mk-cl-hero__trust {
  display: flex;
  flex-wrap: wrap;
  gap: 6px 20px;
  font-size: 13px;
  color: var(--orderzy-ink-soft);
  font-weight: 600;
}
.mk-cl-hero__trust-item {
  display: inline-flex;
  align-items: center;
  gap: 6px;
}
.mk-cl-hero__trust-item svg { color: var(--orderzy-success); }

/* Local (city) card */
.mk-cl-local {
  background: var(--orderzy-surface);
  border: 1px solid var(--orderzy-border);
  border-radius: var(--r-lg);
  box-shadow: var(--orderzy-shadow-lift);
  overflow: hidden;
}
.mk-cl-local__banner {
  aspect-ratio: 4 / 3;
  background: var(--orderzy-surface-alt);
  position: relative;
  overflow: hidden;
}
.mk-cl-local__banner img {
  width: 100%;
  height: 100%;
  object-fit: cover;
}
.mk-cl-local__banner-gradient {
  position: absolute;
  inset: 0;
  background: linear-gradient(to bottom, transparent 50%, rgba(31,29,26,0.75) 100%);
}
.mk-cl-local__banner-meta {
  position: absolute;
  bottom: 16px;
  left: 18px;
  right: 18px;
  color: #fff;
}
.mk-cl-local__banner-city {
  font-family: var(--font-heading);
  font-weight: 700;
  font-size: 20px;
  color: #fff;
}
.mk-cl-local__banner-state {
  font-size: 13px;
  opacity: 0.85;
  margin-top: 3px;
}

/* Partner strip */
.mk-cl-partner {
  background: linear-gradient(135deg, var(--orderzy-brand-soft) 0%, #fde5c8 100%);
  border-radius: var(--r-lg);
  padding: 28px;
  display: grid;
  grid-template-columns: 120px 1fr;
  gap: 24px;
  align-items: center;
  position: relative;
  overflow: hidden;
}
.mk-cl-partner__pic {
  aspect-ratio: 1 / 1;
  border-radius: var(--r-md);
  overflow: hidden;
  box-shadow: var(--orderzy-shadow-whisper);
}
.mk-cl-partner__pic img { width: 100%; height: 100%; object-fit: cover; }
.mk-cl-partner__badge {
  display: inline-block;
  font-family: var(--font-heading);
  font-size: 10.5px;
  font-weight: 700;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--orderzy-brand-ink);
  background: rgba(255,255,255,0.8);
  padding: 4px 10px;
  border-radius: var(--r-pill);
  margin-bottom: 10px;
}
.mk-cl-partner h3 {
  font-family: var(--font-heading);
  font-size: 20px;
  font-weight: 700;
  margin: 0 0 6px;
}
.mk-cl-partner p {
  font-size: 14px;
  color: var(--orderzy-ink-soft);
  margin: 0;
  line-height: 1.55;
}

/* Capabilities grid */
.mk-cl-cap {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: 16px;
}
.mk-cl-cap__card {
  background: var(--orderzy-surface);
  border: 1px solid var(--orderzy-border);
  border-radius: var(--r-md);
  padding: 20px;
}
.mk-cl-cap__icon {
  width: 36px;
  height: 36px;
  border-radius: var(--r-sm);
  background: var(--orderzy-brand-soft);
  color: var(--orderzy-brand-ink);
  display: grid;
  place-items: center;
  margin-bottom: 12px;
}
.mk-cl-cap__card h3 {
  font-family: var(--font-heading);
  font-size: 14px;
  font-weight: 700;
  margin: 0 0 4px;
}
.mk-cl-cap__card p {
  font-size: 13px;
  color: var(--orderzy-ink-soft);
  line-height: 1.5;
  margin: 0;
}

/* Nearby cities */
.mk-cl-nearby {
  display: flex;
  flex-wrap: wrap;
  gap: 10px;
  margin-top: 8px;
}
.mk-cl-nearby__chip {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  padding: 10px 16px;
  border-radius: var(--r-pill);
  background: var(--orderzy-surface);
  border: 1px solid var(--orderzy-border);
  font-family: var(--font-heading);
  font-size: 13px;
  font-weight: 600;
  color: var(--orderzy-ink);
}
.mk-cl-nearby__chip svg { color: var(--orderzy-brand); }
.mk-cl-nearby__note {
  font-size: 13px;
  color: var(--orderzy-ink-muted);
  margin-top: 12px;
}

/* Page 33 responsive */
@media (max-width: 1024px) { .mk-cl-cap { grid-template-columns: repeat(2, 1fr); } }
@media (max-width: 880px) {
  .mk-cl-hero__grid { grid-template-columns: 1fr; gap: 32px; }
  .mk-cl-hero__headline { font-size: 30px; }
  .mk-cl-partner { grid-template-columns: 1fr; gap: 16px; }
  .mk-cl-partner__pic { max-width: 160px; }
}
@media (max-width: 520px) {
  .mk-cl-cap { grid-template-columns: 1fr; }
  .mk-cl-hero__headline { font-size: 26px; }
}


/* ===================================================================
   BATCH 3 ADDITIONS. Marketing page 34 (blog index)
   Text-first article grid matching BLOG_ARTICLES data contract
   (slug/title/excerpt/date/read_time). No images, no categories.
   =================================================================== */

.mk-bl-masthead {
  padding: 56px 0 44px;
  border-bottom: 1px solid var(--orderzy-border);
  background: linear-gradient(180deg, var(--orderzy-brand-soft) 0%, transparent 100%);
}
.mk-bl-masthead__eyebrow {
  display: inline-block;
  font-family: var(--font-heading);
  font-size: 11px;
  font-weight: 700;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  color: var(--orderzy-brand-ink);
  background: rgba(255,255,255,0.8);
  padding: 5px 12px;
  border-radius: var(--r-pill);
  margin-bottom: 14px;
}
.mk-bl-masthead__title {
  font-family: var(--font-heading);
  font-size: 44px;
  font-weight: 700;
  letter-spacing: -0.025em;
  line-height: 1.1;
  margin: 0 0 12px;
  max-width: 760px;
}
.mk-bl-masthead__sub {
  font-size: 17px;
  color: var(--orderzy-ink-soft);
  max-width: 620px;
  line-height: 1.6;
  margin: 0;
}

.mk-bl-grid {
  padding: 56px 0 48px;
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  gap: 24px;
}
.mk-bl-card {
  background: var(--orderzy-surface);
  border: 1px solid var(--orderzy-border);
  border-radius: var(--r-lg);
  padding: 28px 28px 24px;
  transition: box-shadow 180ms ease, transform 180ms ease, border-color 180ms ease;
  display: flex;
  flex-direction: column;
  gap: 12px;
}
.mk-bl-card:hover {
  box-shadow: var(--orderzy-shadow-lift);
  border-color: var(--orderzy-brand-soft);
  transform: translateY(-2px);
}
.mk-bl-card__media {
  display: block;
  width: 100%;
  aspect-ratio: 16 / 9;
  overflow: hidden;
  border-radius: var(--r-md);
  background: var(--orderzy-surface-alt);
  margin-bottom: 4px;
}
.mk-bl-card__media img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
}
.mk-bl-card__date {
  font-family: var(--font-heading);
  font-size: 11px;
  font-weight: 700;
  letter-spacing: 0.1em;
  text-transform: uppercase;
  color: var(--orderzy-brand-ink);
}
.mk-bl-card__title {
  font-family: var(--font-heading);
  font-size: 22px;
  font-weight: 700;
  line-height: 1.25;
  letter-spacing: -0.01em;
  margin: 0;
  color: var(--orderzy-ink);
}
.mk-bl-card__title a { color: inherit; text-decoration: none; }
.mk-bl-card__title a:hover { color: var(--orderzy-brand-ink); }
.mk-bl-card__excerpt {
  font-size: 15px;
  color: var(--orderzy-ink-soft);
  line-height: 1.6;
  margin: 0;
  display: -webkit-box;
  -webkit-line-clamp: 3;
  -webkit-box-orient: vertical;
  overflow: hidden;
}
.mk-bl-card__foot {
  display: flex;
  justify-content: space-between;
  align-items: center;
  font-size: 13px;
  color: var(--orderzy-ink-muted);
  margin-top: auto;
  padding-top: 14px;
  border-top: 1px solid var(--orderzy-border);
}
.mk-bl-card__foot-link {
  font-family: var(--font-heading);
  font-weight: 700;
  color: var(--orderzy-brand-ink);
  display: inline-flex;
  align-items: center;
  gap: 5px;
  text-decoration: none;
}
.mk-bl-empty {
  grid-column: 1 / -1;
  color: var(--orderzy-ink-muted);
  font-size: 15px;
}

@media (max-width: 880px) {
  .mk-bl-masthead__title { font-size: 30px; }
  .mk-bl-grid { grid-template-columns: 1fr; gap: 20px; padding: 40px 0 36px; }
  .mk-bl-card { padding: 24px 22px 22px; }
  .mk-bl-card__title { font-size: 20px; }
}
@media (max-width: 520px) {
  .mk-bl-masthead__title { font-size: 26px; }
}


/* ===================================================================
   BATCH 3 ADDITIONS. Marketing page 35 (blog article)
   Shared shell for all 4 blog article templates.
   Typography-first prose, sticky TOC, share rail, inline CTA,
   highlight callout, comparison table, author bio, related cards.
   =================================================================== */

/* Article header */
.mk-ar-head {
  padding: 24px 0 40px;
  max-width: 760px;
  margin: 0 auto;
}
.mk-ar-head__tag {
  display: inline-block;
  font-family: var(--font-heading);
  font-size: 11px;
  font-weight: 700;
  letter-spacing: 0.1em;
  text-transform: uppercase;
  color: var(--orderzy-brand-ink);
  background: var(--orderzy-brand-soft);
  padding: 4px 11px;
  border-radius: var(--r-pill);
  margin-bottom: 16px;
}
.mk-ar-head__title {
  font-family: var(--font-heading);
  font-size: 44px;
  font-weight: 700;
  line-height: 1.1;
  letter-spacing: -0.025em;
  margin: 0 0 14px;
  color: var(--orderzy-ink);
}
.mk-ar-head__dek {
  font-size: 19px;
  color: var(--orderzy-ink-soft);
  line-height: 1.55;
  margin: 0 0 24px;
}
.mk-ar-head__meta {
  display: flex;
  flex-wrap: wrap;
  gap: 16px;
  align-items: center;
  padding-bottom: 16px;
  border-bottom: 1px solid var(--orderzy-border);
  font-size: 13.5px;
  color: var(--orderzy-ink-muted);
}
.mk-ar-head__author {
  display: flex;
  align-items: center;
  gap: 10px;
}
.mk-ar-head__avatar {
  width: 38px;
  height: 38px;
  border-radius: 50%;
  background: var(--orderzy-brand-soft);
  color: var(--orderzy-brand-ink);
  display: grid;
  place-items: center;
  font-family: var(--font-heading);
  font-weight: 700;
  font-size: 14px;
}
.mk-ar-head__name { color: var(--orderzy-ink); font-weight: 700; font-size: 14px; }
.mk-ar-head__role { font-size: 12px; color: var(--orderzy-ink-muted); }
.mk-ar-head__meta-sep { opacity: 0.5; }

/* Hero image */
.mk-ar-hero {
  max-width: 1100px;
  margin: 0 auto 40px;
  aspect-ratio: 16 / 8;
  border-radius: var(--r-lg);
  overflow: hidden;
  background: var(--orderzy-surface-alt);
}
.mk-ar-hero img { width: 100%; height: 100%; object-fit: cover; display: block; }

/* Layout */
.mk-ar-layout {
  display: grid;
  grid-template-columns: 220px 1fr 200px;
  gap: 56px;
  max-width: 1200px;
  margin: 0 auto;
  padding: 0 24px 64px;
}

/* TOC */
.mk-ar-toc {
  position: sticky;
  top: 96px;
  align-self: start;
  font-size: 13.5px;
}
.mk-ar-toc__title {
  font-family: var(--font-heading);
  font-size: 11px;
  font-weight: 700;
  letter-spacing: 0.1em;
  text-transform: uppercase;
  color: var(--orderzy-ink-muted);
  margin: 0 0 14px;
  padding-left: 12px;
}
.mk-ar-toc ol {
  list-style: none;
  padding: 0;
  margin: 0;
}
.mk-ar-toc li {
  padding: 8px 0 8px 12px;
  border-left: 2px solid var(--orderzy-border);
}
.mk-ar-toc li.is-active {
  border-left-color: var(--orderzy-brand);
  color: var(--orderzy-brand-ink);
  font-weight: 700;
}
.mk-ar-toc a {
  color: var(--orderzy-ink-soft);
  text-decoration: none;
}
.mk-ar-toc a:hover { color: var(--orderzy-brand); }
.mk-ar-toc li.is-active a { color: var(--orderzy-brand-ink); }

/* Prose column */
.mk-ar-prose {
  max-width: 680px;
}
.mk-ar-prose p {
  font-size: 17px;
  line-height: 1.75;
  color: var(--orderzy-ink);
  margin: 0 0 22px;
}
.mk-ar-prose h2 {
  font-family: var(--font-heading);
  font-size: 28px;
  font-weight: 700;
  letter-spacing: -0.015em;
  margin: 48px 0 16px;
  line-height: 1.2;
  color: var(--orderzy-ink);
  scroll-margin-top: 100px;
}
.mk-ar-prose h3 {
  font-family: var(--font-heading);
  font-size: 20px;
  font-weight: 700;
  margin: 36px 0 12px;
  line-height: 1.3;
  color: var(--orderzy-ink);
}
.mk-ar-prose ul, .mk-ar-prose ol {
  font-size: 17px;
  line-height: 1.75;
  color: var(--orderzy-ink);
  padding-left: 22px;
  margin: 0 0 22px;
}
.mk-ar-prose li { margin-bottom: 8px; }
.mk-ar-prose strong { color: var(--orderzy-ink); font-weight: 700; }
.mk-ar-prose a {
  color: var(--orderzy-brand-ink);
  text-decoration: underline;
  text-decoration-color: rgba(184,102,0,0.35);
  text-underline-offset: 3px;
}
.mk-ar-prose a:hover { text-decoration-color: var(--orderzy-brand-ink); }

.mk-ar-prose blockquote {
  margin: 32px 0;
  padding: 8px 0 8px 24px;
  border-left: 4px solid var(--orderzy-brand);
  font-family: var(--font-heading);
  font-size: 22px;
  font-weight: 600;
  color: var(--orderzy-ink);
  line-height: 1.5;
}
.mk-ar-prose blockquote footer {
  font-size: 13px;
  font-weight: 600;
  color: var(--orderzy-ink-muted);
  margin-top: 10px;
  font-family: var(--font-body);
}

/* Highlight callout */
.mk-ar-highlight {
  background: var(--orderzy-brand-soft);
  border-left: 4px solid var(--orderzy-brand);
  border-radius: var(--r-sm);
  padding: 18px 22px;
  margin: 28px 0;
}
.mk-ar-highlight h4 {
  font-family: var(--font-heading);
  font-size: 13px;
  font-weight: 700;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  margin: 0 0 6px;
  color: var(--orderzy-brand-ink);
}
.mk-ar-highlight p {
  margin: 0;
  font-size: 15.5px;
  line-height: 1.65;
  color: var(--orderzy-ink);
}

/* Comparison table */
.mk-ar-table {
  margin: 28px 0;
  border: 1px solid var(--orderzy-border);
  border-radius: var(--r-md);
  overflow: hidden;
  font-size: 14.5px;
}
.mk-ar-table__title {
  font-family: var(--font-heading);
  font-size: 11px;
  font-weight: 700;
  letter-spacing: 0.1em;
  text-transform: uppercase;
  color: var(--orderzy-ink-muted);
  padding: 12px 18px;
  background: var(--orderzy-surface-alt);
  border-bottom: 1px solid var(--orderzy-border);
}
.mk-ar-table table {
  width: 100%;
  border-collapse: collapse;
}
.mk-ar-table th, .mk-ar-table td {
  padding: 12px 18px;
  text-align: left;
  line-height: 1.55;
  /* 2026-08-26 viewport hardening: `.mk-ar-table` wrapper keeps
     `overflow:hidden` for border-radius corner clipping, which means
     any unbreakable token (URL, long ID, brand name without spaces)
     would be CLIPPED not scrolled. Break-word + overflow-wrap:anywhere
     make future long tokens wrap gracefully instead. Zero visual
     change for the short-word content current blog tables carry. */
  word-break: break-word;
  overflow-wrap: anywhere;
}
.mk-ar-table thead th {
  font-family: var(--font-heading);
  font-size: 12.5px;
  font-weight: 700;
  letter-spacing: 0.04em;
  text-transform: uppercase;
  color: var(--orderzy-ink-muted);
  background: var(--orderzy-surface-alt);
  border-bottom: 1px solid var(--orderzy-border);
}
.mk-ar-table tbody tr + tr td { border-top: 1px solid var(--orderzy-border); }
.mk-ar-table tbody td:first-child {
  font-family: var(--font-heading);
  font-weight: 700;
  color: var(--orderzy-ink);
}
.mk-ar-table tbody td.mk-ar-table__good { color: var(--orderzy-success); font-weight: 700; }
.mk-ar-table tbody td.mk-ar-table__bad { color: var(--orderzy-danger); font-weight: 700; }

/* In-article CTA. P3.C01: swap dark gradient for warm canvas with accent
   border-left. Matches About-page editorial register. */
.mk-ar-inline-cta {
  background: var(--orderzy-surface);
  color: var(--orderzy-ink);
  border: 1px solid var(--orderzy-border);
  border-left: 4px solid var(--accent, var(--orderzy-brand-deep));
  border-radius: var(--r-lg);
  padding: 26px 28px;
  margin: 36px 0;
  display: grid;
  grid-template-columns: 1fr auto;
  gap: 20px;
  align-items: center;
}
.mk-ar-inline-cta h4 {
  font-family: var(--font-heading);
  font-size: 20px;
  font-weight: 700;
  color: var(--orderzy-ink);
  margin: 0 0 6px;
  line-height: 1.25;
}
.mk-ar-inline-cta p {
  font-size: 14.5px;
  color: var(--orderzy-ink-soft);
  margin: 0;
  line-height: 1.55;
}

/* Social share rail */
.mk-ar-rail {
  position: sticky;
  top: 96px;
  align-self: start;
}
.mk-ar-rail__title {
  font-family: var(--font-heading);
  font-size: 11px;
  font-weight: 700;
  letter-spacing: 0.1em;
  text-transform: uppercase;
  color: var(--orderzy-ink-muted);
  margin: 0 0 12px;
}
.mk-ar-rail__list {
  display: flex;
  flex-direction: column;
  gap: 8px;
}
.mk-ar-rail__list a {
  width: 40px;
  height: 40px;
  border-radius: 50%;
  border: 1px solid var(--orderzy-border);
  display: grid;
  place-items: center;
  color: var(--orderzy-ink-muted);
  background: var(--orderzy-surface);
  text-decoration: none;
}
.mk-ar-rail__list a:hover { color: var(--orderzy-brand); border-color: var(--orderzy-brand); }

/* Author bio */
.mk-ar-author {
  max-width: 820px;
  margin: 32px auto 0;
  background: var(--orderzy-surface);
  border: 1px solid var(--orderzy-border);
  border-radius: var(--r-lg);
  padding: 28px;
  display: grid;
  grid-template-columns: 64px 1fr;
  gap: 20px;
  align-items: center;
}
.mk-ar-author__avatar {
  width: 64px;
  height: 64px;
  border-radius: 50%;
  background: var(--orderzy-brand-soft);
  color: var(--orderzy-brand-ink);
  display: grid;
  place-items: center;
  font-family: var(--font-heading);
  font-weight: 700;
  font-size: 22px;
}
.mk-ar-author__label {
  font-family: var(--font-heading);
  font-size: 11px;
  font-weight: 700;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--orderzy-ink-muted);
}
.mk-ar-author h4 {
  font-family: var(--font-heading);
  font-size: 18px;
  font-weight: 700;
  margin: 2px 0 6px;
}
.mk-ar-author p {
  font-size: 14.5px;
  color: var(--orderzy-ink-soft);
  line-height: 1.55;
  margin: 0;
}

/* Related */
.mk-ar-related {
  padding: 0 24px 64px;
  max-width: 1200px;
  margin: 0 auto;
}
.mk-ar-related h3 {
  font-family: var(--font-heading);
  font-size: 22px;
  font-weight: 700;
  margin: 0 0 20px;
}
.mk-ar-related__grid {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 24px;
}
.mk-ar-related__card {
  background: var(--orderzy-surface);
  border: 1px solid var(--orderzy-border);
  border-radius: var(--r-lg);
  overflow: hidden;
  transition: box-shadow 200ms ease, transform 200ms ease;
}
.mk-ar-related__card:hover {
  box-shadow: var(--orderzy-shadow-lift);
  transform: translateY(-2px);
}
.mk-ar-related__body { padding: 20px 22px 22px; }
.mk-ar-related__tag {
  font-family: var(--font-heading);
  font-size: 10.5px;
  font-weight: 700;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--orderzy-brand-ink);
  margin-bottom: 8px;
  display: inline-block;
}
.mk-ar-related__title {
  font-family: var(--font-heading);
  font-size: 16px;
  font-weight: 700;
  line-height: 1.35;
  margin: 0;
}
.mk-ar-related__title a {
  color: var(--orderzy-ink);
  text-decoration: none;
}
.mk-ar-related__title a:hover { color: var(--orderzy-brand-ink); }

/* P3.C01: TOC disclosure. Wraps the "In this article" list in a <details>
   so mobile visitors get a tap-to-open dropdown instead of a wall of anchors
   above the prose. Desktop keeps the list expanded (details[open]) and hides
   the chevron so the sidebar reads as a plain block. */
.mk-ar-toc__disclosure { }
.mk-ar-toc__disclosure > summary {
  list-style: none;
  cursor: pointer;
  display: flex;
  align-items: center;
  gap: 8px;
  padding: 0 0 0 12px;
  margin: 0 0 14px;
  font-family: var(--font-heading);
  font-size: 11px;
  font-weight: 700;
  letter-spacing: 0.1em;
  text-transform: uppercase;
  color: var(--orderzy-ink-muted);
  outline: none;
}
.mk-ar-toc__disclosure > summary::-webkit-details-marker { display: none; }
.mk-ar-toc__disclosure > summary:focus-visible {
  outline: 2px solid var(--orderzy-brand);
  outline-offset: 3px;
  border-radius: var(--r-sm);
}
.mk-ar-toc__chevron {
  width: 12px;
  height: 12px;
  display: none;
  transition: transform 180ms var(--ease, ease);
}
.mk-ar-toc__disclosure[open] .mk-ar-toc__chevron { transform: rotate(180deg); }

/* Article author bio: warmer, editorial. Matches About page register. */
.mk-ar-author {
  border-left: 4px solid var(--accent, var(--orderzy-brand-deep));
  padding-left: 24px;
  border-radius: 0;
  border-top: none;
  border-right: none;
  border-bottom: none;
  background: transparent;
}

/* Related-card polish: tighten spacing, add subtle underline hover. */
.mk-ar-related__title a {
  transition: color 150ms var(--ease, ease);
}

/* Page 35 responsive */
@media (max-width: 1024px) {
  .mk-ar-layout { grid-template-columns: 1fr; gap: 32px; padding-top: 24px; }
  .mk-ar-toc { position: static; order: -1; }
  .mk-ar-toc li { padding: 6px 0 6px 12px; }
  .mk-ar-rail { display: none; }
  .mk-ar-head__title { font-size: 34px; }
  .mk-ar-related__grid { grid-template-columns: repeat(2, 1fr); }
}
/* P3.C01: mobile TOC collapses; the <details> chevron becomes visible so the
   tap-affordance is legible. Desktop keeps the toc expanded by force via the
   `open` attribute on the <details>. */
@media (max-width: 767px) {
  .mk-ar-toc__disclosure > summary { padding: 10px 12px; background: var(--orderzy-surface); border: 1px solid var(--orderzy-border); border-radius: var(--r-md); margin: 0; justify-content: space-between; }
  .mk-ar-toc__disclosure > summary .mk-ar-toc__title-text { flex: 1; }
  .mk-ar-toc__chevron { display: inline-block; color: var(--orderzy-ink-muted); }
  .mk-ar-toc__disclosure[open] > summary { margin-bottom: 8px; border-bottom-left-radius: 0; border-bottom-right-radius: 0; }
  .mk-ar-toc ol { border: 1px solid var(--orderzy-border); border-top: none; border-radius: 0 0 var(--r-md) var(--r-md); background: var(--orderzy-surface); padding: 6px 8px; }
  .mk-ar-toc li { padding: 8px 8px 8px 16px; }
}
@media (max-width: 520px) {
  .mk-ar-head__title { font-size: 26px; }
  .mk-ar-head__dek { font-size: 16px; }
  .mk-ar-prose p, .mk-ar-prose ul, .mk-ar-prose ol { font-size: 16px; }
  .mk-ar-prose h2 { font-size: 24px; }
  .mk-ar-inline-cta { grid-template-columns: 1fr; }
  .mk-ar-author { grid-template-columns: 1fr; text-align: left; padding-left: 20px; }
  .mk-ar-author__avatar { margin: 0; }
  .mk-ar-related__grid { grid-template-columns: 1fr; }
  .mk-ar-table { font-size: 13.5px; }
  .mk-ar-table th, .mk-ar-table td { padding: 10px 12px; }
}

/* ===================================================================
   Customer account pages. Shared nav + layout for custDashboard,
   cprofile. my_orders uses its own mo-* layout.
   =================================================================== */

.cust-nav {
  display: flex;
  gap: 4px;
  padding: 4px;
  background: var(--orderzy-surface-alt);
  border: 1px solid var(--orderzy-border);
  border-radius: var(--r-sm);
  margin-bottom: 20px;
  overflow-x: auto;
}
.cust-nav__item {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  padding: 9px 14px;
  border-radius: var(--r-xs);
  font-weight: 600;
  font-size: 13.5px;
  color: var(--orderzy-ink-soft);
  text-decoration: none;
  white-space: nowrap;
  transition: all var(--dur-fast) var(--ease);
}
.cust-nav__item:hover {
  color: var(--orderzy-ink);
  background: rgba(0,0,0,0.03);
}
.cust-nav__item.is-active {
  background: #fff;
  color: var(--orderzy-brand-ink);
  box-shadow: 0 1px 2px rgba(31,29,26,0.06);
}

.cd-stats {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
  gap: 14px;
  margin-bottom: 24px;
}
.cd-stat {
  background: #fff;
  border: 1px solid var(--orderzy-border);
  border-radius: var(--r-sm);
  padding: 18px 20px;
  display: flex;
  align-items: center;
  gap: 14px;
}
.cd-stat__icon {
  width: 44px; height: 44px;
  border-radius: 12px;
  background: var(--orderzy-brand-soft);
  color: var(--orderzy-brand-ink);
  display: flex;
  align-items: center;
  justify-content: center;
  flex-shrink: 0;
}
.cd-stat__label {
  font-size: 12px;
  color: var(--orderzy-ink-muted);
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: 0.04em;
  margin: 0 0 4px;
}
.cd-stat__value {
  font-family: var(--font-heading);
  font-size: 22px;
  font-weight: 700;
  color: var(--orderzy-ink);
  margin: 0;
  line-height: 1.2;
}
.cd-stat__sub {
  font-size: 12.5px;
  color: var(--orderzy-ink-muted);
  margin: 2px 0 0;
}
.cd-stat__sub a { color: var(--orderzy-brand-ink); font-weight: 600; text-decoration: none; }
.cd-stat__sub a:hover { text-decoration: underline; }

.cd-panel {
  background: #fff;
  border: 1px solid var(--orderzy-border);
  border-radius: var(--r-sm);
  overflow: hidden;
}
.cd-panel__head {
  display: flex;
  justify-content: space-between;
  align-items: center;
  padding: 16px 20px;
  border-bottom: 1px solid var(--orderzy-border);
  gap: 10px;
  flex-wrap: wrap;
}
.cd-panel__title {
  font-family: var(--font-heading);
  font-size: 16px;
  font-weight: 700;
  color: var(--orderzy-ink);
  margin: 0;
}
.cd-panel__body { padding: 20px; }
.cd-table {
  width: 100%;
  border-collapse: collapse;
  font-size: 13.5px;
}
.cd-table th {
  text-align: left;
  padding: 12px 20px;
  font-size: 11.5px;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.05em;
  color: var(--orderzy-ink-muted);
  background: var(--orderzy-surface-alt);
  border-bottom: 1px solid var(--orderzy-border);
}
.cd-table td {
  padding: 14px 20px;
  border-bottom: 1px solid var(--orderzy-border);
  color: var(--orderzy-ink-soft);
  vertical-align: middle;
}
.cd-table tr:last-child td { border-bottom: 0; }
.cd-table tr:hover td { background: var(--orderzy-surface-alt); }
.cd-empty {
  text-align: center;
  padding: 48px 24px;
  color: var(--orderzy-ink-muted);
}
.cd-empty__icon {
  width: 52px; height: 52px;
  margin: 0 auto 12px;
  color: var(--orderzy-border-strong);
}

/* ===================================================================
   Referrals (refer / track / thanks / paused). Shared form + table.
   =================================================================== */

.rf-wrap { max-width: 820px; margin: 32px auto 60px; padding: 0 16px; }
.rf-wrap--narrow { max-width: 560px; }

.rf-head { text-align: center; margin-bottom: 24px; }
.rf-head h1 {
  font-family: var(--font-heading);
  font-size: 30px;
  font-weight: 700;
  color: var(--orderzy-ink);
  margin: 0 0 10px;
  letter-spacing: -0.02em;
}
.rf-head p { color: var(--orderzy-ink-soft); font-size: 16px; line-height: 1.6; margin: 0 0 8px; max-width: 620px; margin-left: auto; margin-right: auto; }
.rf-head a { color: var(--orderzy-brand-ink); text-decoration: none; font-weight: 600; }

.rf-card {
  background: #fff;
  border: 1px solid var(--orderzy-border);
  border-radius: var(--r-md);
  padding: 24px;
  margin-bottom: 18px;
}

.rf-section-title {
  font-family: var(--font-heading);
  font-size: 15px;
  font-weight: 700;
  color: var(--orderzy-ink);
  margin: 0 0 4px;
}
.rf-section-sub { font-size: 13px; color: var(--orderzy-ink-muted); margin: 0 0 14px; }
.rf-divider { height: 1px; background: var(--orderzy-border); margin: 20px 0; border: 0; }

.rf-field { margin-bottom: 14px; }
.rf-field__label {
  display: block;
  font-size: 13px;
  font-weight: 600;
  color: var(--orderzy-ink);
  margin-bottom: 6px;
}
.rf-field input[type="text"],
.rf-field input[type="email"],
.rf-field input[type="tel"],
.rf-field textarea,
.rf-field select {
  width: 100%;
  padding: 10px 12px;
  font-size: 14px;
  color: var(--orderzy-ink);
  background: #fff;
  border: 1px solid var(--orderzy-border-strong);
  border-radius: var(--r-xs);
  transition: all var(--dur-fast) var(--ease);
}
.rf-field textarea { min-height: 80px; resize: vertical; }
.rf-field input:focus, .rf-field textarea:focus, .rf-field select:focus {
  outline: none;
  border-color: var(--orderzy-brand);
  box-shadow: 0 0 0 3px var(--orderzy-brand-soft);
}
.rf-field__help { font-size: 12px; color: var(--orderzy-ink-muted); margin-top: 4px; }
.rf-field__error { font-size: 12px; color: var(--orderzy-danger); margin-top: 4px; }
.rf-field-row { display: grid; grid-template-columns: 1fr 1fr; gap: 14px; }
@media (max-width: 560px) { .rf-field-row { grid-template-columns: 1fr; } }

.rf-alert {
  padding: 12px 16px;
  border-radius: var(--r-sm);
  margin-bottom: 14px;
  font-size: 13.5px;
}
.rf-alert--info    { background: #DBEAFE; color: #1E40AF; }
.rf-alert--error   { background: #FEE2E2; color: #991B1B; }
.rf-alert--success { background: #D1FAE5; color: #065F46; }

.rf-howitworks {
  font-size: 13.5px;
  color: var(--orderzy-ink-muted);
  margin-top: 24px;
  line-height: 1.7;
}
.rf-howitworks strong { color: var(--orderzy-ink); }
.rf-howitworks ol { padding-left: 22px; margin: 8px 0; }
.rf-howitworks ol li { margin-bottom: 4px; }

.rf-stats {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 14px;
  margin-bottom: 28px;
}
@media (max-width: 620px) { .rf-stats { grid-template-columns: 1fr; } }
.rf-stat {
  background: #fff;
  border: 1px solid var(--orderzy-border);
  border-radius: var(--r-md);
  padding: 18px 20px;
  text-align: center;
}
.rf-stat__label {
  font-size: 12px;
  color: var(--orderzy-ink-muted);
  text-transform: uppercase;
  letter-spacing: 0.05em;
  margin: 0 0 6px;
}
.rf-stat__value {
  font-family: var(--font-heading);
  font-size: 28px;
  font-weight: 700;
  color: var(--orderzy-ink);
  margin: 0;
}
.rf-stat__value--pending { color: #B45309; }
.rf-stat__value--paid    { color: #047857; }

.rf-table {
  width: 100%;
  border-collapse: collapse;
  background: #fff;
  border: 1px solid var(--orderzy-border);
  border-radius: var(--r-md);
  overflow: hidden;
  font-size: 13.5px;
}
.rf-table th {
  text-align: left;
  padding: 12px 14px;
  font-size: 11.5px;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.05em;
  color: var(--orderzy-ink-muted);
  background: var(--orderzy-surface-alt);
  border-bottom: 1px solid var(--orderzy-border);
}
.rf-table td {
  padding: 12px 14px;
  border-bottom: 1px solid var(--orderzy-border);
  color: var(--orderzy-ink-soft);
}
.rf-table tr:last-child td { border-bottom: 0; }


/* ============================================================================
   PAGE-SCOPED STYLES (folded in 2026-04-20 from inline <style> blocks)
   Each prefix namespace is scoped to a single customer-facing page:
     cp-*   → customers/cprofile.html
     cod-*  → customers/bill_detail.html (renamed in bill-numbering PR 4; classes preserved for style continuity)
     gb-*   → marketplace/get_bill.html
     wl-*   → marketplace/waitlist_join.html
     ws-*   → marketplace/waitlist_status.html
     po-*   → orders/place_order.html
     bpc-*  → orders/bill_payment_complete.html
     fb-*   → orders/find_bill.html
   Rationale: consolidating these blocks here avoids per-request CSS churn,
   lets the browser cache the rules alongside the rest of orderzy.css,
   and keeps templates free of long inline <style> blocks.
   No visual change vs. the prior inline versions.
   ============================================================================ */

/* ---------- cp-*  customers/cprofile.html ---------- */
.cp-field input[type="text"],
.cp-field input[type="email"],
.cp-field input[type="number"],
.cp-field input[type="tel"],
.cp-field select,
.cp-field textarea {
  display: block;
  width: 100%;
  padding: 10px 12px;
  font-size: 14px;
  color: var(--orderzy-ink);
  background: #fff;
  border: 1px solid var(--orderzy-border-strong);
  border-radius: var(--r-xs);
  transition: all var(--dur-fast) var(--ease);
}
.cp-field input:focus,
.cp-field select:focus,
.cp-field textarea:focus {
  outline: none;
  border-color: var(--orderzy-brand);
  box-shadow: 0 0 0 3px var(--orderzy-brand-soft);
}
.cp-grid {
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  gap: 16px;
}
.cp-grid .cp-field--full { grid-column: 1 / -1; }
.cp-field__label {
  display: block;
  font-size: 11.5px;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.05em;
  color: var(--orderzy-ink-muted);
  margin-bottom: 6px;
}
.cp-field__hint {
  font-size: 12px;
  color: var(--orderzy-ink-muted);
  margin-top: 4px;
}
.cp-section-title {
  grid-column: 1 / -1;
  font-family: var(--font-heading);
  font-size: 13px;
  font-weight: 700;
  letter-spacing: 0.05em;
  text-transform: uppercase;
  color: var(--orderzy-ink-soft);
  margin: 12px 0 0;
  padding-bottom: 8px;
  border-bottom: 1px solid var(--orderzy-border);
}
@media (max-width: 640px) {
  .cp-grid { grid-template-columns: 1fr; }
}

/* ---------- cod-*  customers/bill_detail.html ---------- */
.cod-wrap { max-width: 820px; margin: 32px auto 60px; padding: 0 16px; }
.cod-card {
  background: #fff;
  border: 1px solid var(--orderzy-border);
  border-radius: var(--r-md);
  padding: 28px;
}
.cod-brand { text-align: center; margin-bottom: 22px; }
.cod-brand a {
  font-family: var(--font-heading);
  font-size: 22px;
  font-weight: 700;
  color: var(--orderzy-brand-ink);
  text-decoration: none;
  letter-spacing: 0.5px;
}
.cod-head { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 10px; }
.cod-head__left { flex: 1; min-width: 220px; }
.cod-order-num {
  display: inline-block;
  padding: 6px 14px;
  background: var(--orderzy-brand-soft);
  color: var(--orderzy-brand-ink);
  border-radius: 9999px;
  font-size: 13.5px;
  font-weight: 600;
  margin-bottom: 10px;
}
.cod-greet { font-family: var(--font-heading); font-size: 17px; font-weight: 700; color: var(--orderzy-ink); margin: 6px 0 0; }
.cod-sub { color: var(--orderzy-ink-muted); font-size: 13.5px; margin: 6px 0 0; }
.cod-meta {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 14px;
  margin: 18px 0;
  padding: 14px 0;
  border-top: 1px solid var(--orderzy-border);
  border-bottom: 1px solid var(--orderzy-border);
}
.cod-meta__cell span:first-child {
  display: block;
  color: var(--orderzy-ink-muted);
  font-size: 12px;
  text-transform: uppercase;
  letter-spacing: 0.05em;
  margin-bottom: 2px;
}
.cod-meta__cell span:last-child {
  font-weight: 600;
  color: var(--orderzy-ink);
  word-break: break-all;
}
@media (max-width: 620px) {
  .cod-meta { grid-template-columns: 1fr; gap: 10px; }
  .cod-meta__cell { border-bottom: 1px dashed var(--orderzy-border); padding-bottom: 8px; }
  .cod-meta__cell:last-child { border-bottom: 0; }
}
.cod-items { width: 100%; border-collapse: collapse; font-size: 13.5px; margin: 10px 0; }
.cod-items td { padding: 12px 6px; border-bottom: 1px solid var(--orderzy-border); vertical-align: middle; }
.cod-items tr:last-child td { border-bottom: 0; }
.cod-items img { border-radius: var(--r-xs); display: block; object-fit: cover; }
.cod-totals { padding: 18px 22px; background: var(--orderzy-surface-alt); border-radius: var(--r-sm); }
.cod-totals ul { list-style: none; padding: 0; margin: 0; }
.cod-totals li { display: flex; justify-content: space-between; padding: 5px 0; font-size: 14px; color: var(--orderzy-ink-soft); }
.cod-totals li.is-grand {
  margin-top: 8px; padding-top: 10px;
  border-top: 1px solid var(--orderzy-border);
  font-size: 17px; font-weight: 700;
  color: var(--orderzy-ink);
}
.cod-summary-row {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 20px;
  align-items: center;
  margin-top: 24px;
}
@media (max-width: 620px) { .cod-summary-row { grid-template-columns: 1fr; } }
.cod-denied {
  padding: 14px 18px;
  background: #FEE2E2;
  color: #991B1B;
  border-radius: var(--r-sm);
  margin-top: 14px;
  font-size: 13.5px;
  line-height: 1.5;
}
.cod-foot {
  display: flex; justify-content: space-between;
  flex-wrap: wrap; gap: 10px;
  margin-top: 28px; padding-top: 18px;
  border-top: 1px solid var(--orderzy-border);
  font-size: 13.5px;
  color: var(--orderzy-ink-soft);
}
.cod-foot b { color: var(--orderzy-ink); display: block; margin-bottom: 2px; }

/* ---------- gb-*  marketplace/get_bill.html ---------- */
.gb-wrap { max-width: 720px; margin: 24px auto 60px; padding: 0 16px; }
.gb-header {
  background: #fff;
  border: 1px solid var(--orderzy-border);
  border-radius: var(--r-md);
  padding: 20px 22px;
  text-align: center;
  margin-bottom: 14px;
}
.gb-header h1 {
  font-family: var(--font-heading);
  font-size: 22px;
  font-weight: 700;
  color: var(--orderzy-ink);
  margin: 0 0 4px;
  word-break: break-word;
}
.gb-header p { color: var(--orderzy-ink-muted); font-size: 13.5px; margin: 0; }
.gb-table-pill {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  margin-top: 12px;
  padding: 8px 16px;
  background: var(--orderzy-success-soft, #ECFDF5);
  color: var(--orderzy-success, #065F46);
  border-radius: 9999px;
  font-weight: 600;
  font-size: 13.5px;
}
.gb-card {
  background: #fff;
  border: 1px solid var(--orderzy-border);
  border-radius: var(--r-md);
  margin-bottom: 14px;
  overflow: hidden;
}
.gb-card__head {
  padding: 14px 20px;
  border-bottom: 1px solid var(--orderzy-border);
  background: var(--orderzy-surface-alt);
}
.gb-card__title {
  font-family: var(--font-heading);
  font-size: 15px;
  font-weight: 700;
  color: var(--orderzy-ink);
  margin: 0;
}
.gb-card__body { padding: 16px 20px; }
.gb-meta { display: flex; justify-content: space-between; gap: 12px; padding: 12px 20px; }
.gb-meta__label { color: var(--orderzy-ink-muted); font-size: 12px; display: block; margin-bottom: 2px; }
.gb-meta__val   { color: var(--orderzy-ink); font-weight: 700; font-size: 14px; }
.gb-order-strip {
  display: flex; justify-content: space-between; align-items: center;
  padding: 8px 20px;
  background: var(--orderzy-surface-alt);
  border-top: 1px solid var(--orderzy-border);
  font-size: 12.5px;
  color: var(--orderzy-ink-muted);
}
.gb-item-row {
  display: flex; justify-content: space-between; align-items: start;
  padding: 12px 20px;
  border-top: 1px solid var(--orderzy-border);
  gap: 12px;
}
.gb-item-row:first-of-type { border-top: 0; }
.gb-item-row__name { font-weight: 600; color: var(--orderzy-ink); flex: 1; min-width: 0; }
.gb-item-row__qty  { font-size: 12.5px; color: var(--orderzy-ink-muted); margin-top: 2px; }
.gb-item-row__amt  { font-weight: 600; color: var(--orderzy-ink); white-space: nowrap; }
.gb-total-row { display: flex; justify-content: space-between; padding: 6px 0; font-size: 14px; color: var(--orderzy-ink-soft); }
.gb-total-row.is-grand {
  margin-top: 8px; padding-top: 12px;
  border-top: 1px solid var(--orderzy-border);
  font-size: 17px; font-weight: 700; color: var(--orderzy-ink);
}
.gb-banner {
  background: #FFFBEB;
  border: 1px solid #F59E0B;
  border-radius: var(--r-sm);
  padding: 14px 18px;
  margin-bottom: 14px;
  display: flex; gap: 12px; align-items: start;
  flex-wrap: wrap; justify-content: space-between;
}
.gb-banner__text { flex: 1; min-width: 200px; color: #92400E; }
.gb-banner__text strong { display: block; color: #78350F; margin-bottom: 2px; }
.gb-paymethod {
  display: flex; align-items: center; gap: 14px;
  padding: 14px 16px;
  border: 2px solid var(--orderzy-brand);
  background: var(--orderzy-brand-soft);
  border-radius: var(--r-sm);
  cursor: pointer;
  margin-bottom: 14px;
}
.gb-paymethod input[type="radio"] { margin: 0; accent-color: var(--orderzy-brand-ink); }
.gb-spinner {
  display: inline-block;
  width: 18px; height: 18px;
  border: 2px solid rgba(0,0,0,0.15);
  border-top-color: var(--orderzy-brand-ink);
  border-radius: 50%;
  animation: gb-spin 0.6s linear infinite;
  vertical-align: middle;
}
@keyframes gb-spin { to { transform: rotate(360deg); } }
.gb-counter-note {
  text-align: center;
  padding: 28px 20px;
  background: #fff;
  border: 1px solid var(--orderzy-border);
  border-radius: var(--r-md);
  margin-bottom: 14px;
}
.gb-counter-note__icon { width: 56px; height: 56px; margin: 0 auto 14px; color: var(--orderzy-brand-ink); }
.gb-help {
  padding: 12px 18px;
  background: var(--orderzy-surface-alt);
  border-radius: var(--r-sm);
  text-align: center;
  font-size: 13px;
  color: var(--orderzy-ink-muted);
}

/* ---------- wl-*  marketplace/waitlist_join.html ---------- */
.wl-wrap { max-width: 520px; margin: 32px auto 60px; padding: 0 16px; }
.wl-card {
  background: #fff;
  border: 1px solid var(--orderzy-border);
  border-radius: var(--r-md);
  margin-bottom: 16px;
  overflow: hidden;
}
.wl-header {
  padding: 22px 24px;
  text-align: center;
  border-bottom: 1px solid var(--orderzy-border);
}
.wl-header h1 { font-family: var(--font-heading); font-size: 20px; font-weight: 700; color: var(--orderzy-ink); margin: 0 0 4px; }
.wl-header p { color: var(--orderzy-ink-muted); font-size: 13.5px; margin: 0; }
.wl-body { padding: 22px 24px; }
.wl-body__title {
  font-family: var(--font-heading);
  font-size: 18px;
  font-weight: 700;
  color: var(--orderzy-ink);
  text-align: center;
  margin: 0 0 8px;
}
.wl-body__sub { color: var(--orderzy-ink-muted); text-align: center; font-size: 13.5px; line-height: 1.5; margin: 0 0 22px; }
.wl-field { margin-bottom: 16px; }
.wl-field__label { display: block; font-size: 13px; font-weight: 600; color: var(--orderzy-ink); margin-bottom: 6px; }
.wl-field input[type="text"],
.wl-field input[type="tel"],
.wl-field select {
  width: 100%;
  padding: 12px 14px;
  font-size: 16px;
  color: var(--orderzy-ink);
  background: #fff;
  border: 1px solid var(--orderzy-border-strong);
  border-radius: var(--r-sm);
  transition: all var(--dur-fast) var(--ease);
}
.wl-field input:focus, .wl-field select:focus {
  outline: none;
  border-color: var(--orderzy-brand);
  box-shadow: 0 0 0 3px var(--orderzy-brand-soft);
}
.wl-field__hint { font-size: 12px; color: var(--orderzy-ink-muted); margin-top: 4px; }
.wl-alert {
  padding: 12px 16px;
  border-radius: var(--r-sm);
  margin-bottom: 14px;
  font-size: 13.5px;
}
.wl-alert--error   { background: #FEE2E2; color: #991B1B; }
.wl-alert--success { background: #D1FAE5; color: #065F46; }
.wl-alert--info    { background: #DBEAFE; color: #1E40AF; }
.wl-alert--warn    { background: #FEF3C7; color: #92400E; }

/* ---------- ws-*  marketplace/waitlist_status.html ---------- */
.ws-wrap { max-width: 520px; margin: 32px auto 60px; padding: 0 16px; }
.ws-card {
  background: #fff;
  border: 1px solid var(--orderzy-border);
  border-radius: var(--r-md);
  margin-bottom: 16px;
  overflow: hidden;
}
.ws-header {
  padding: 22px 24px;
  text-align: center;
  border-bottom: 1px solid var(--orderzy-border);
}
.ws-header h1 { font-family: var(--font-heading); font-size: 20px; font-weight: 700; color: var(--orderzy-ink); margin: 0 0 4px; }
.ws-header p { color: var(--orderzy-ink-muted); font-size: 13.5px; margin: 0; }
.ws-state { padding: 32px 24px; text-align: center; }
.ws-state__icon {
  width: 64px; height: 64px;
  margin: 0 auto 14px;
  display: flex; align-items: center; justify-content: center;
  border-radius: 50%;
}
.ws-state__icon--wait    { background: #FEF3C7; color: #B45309; }
.ws-state__icon--called  { background: #D1FAE5; color: #047857; }
.ws-state__icon--seated  { background: #D1FAE5; color: #047857; }
.ws-state__icon--skipped { background: #FEE2E2; color: #B91C1C; }
.ws-state__icon--gone    { background: var(--orderzy-surface-alt); color: var(--orderzy-ink-muted); }
.ws-state__title { font-family: var(--font-heading); font-size: 19px; font-weight: 700; color: var(--orderzy-ink); margin: 0 0 8px; }
.ws-state__title--ok { color: #047857; }
.ws-state__position {
  font-family: var(--font-heading);
  font-size: 68px;
  font-weight: 800;
  color: var(--orderzy-ink);
  line-height: 1;
  margin: 0;
  letter-spacing: -0.03em;
}
.ws-state__sub { color: var(--orderzy-ink-muted); font-size: 14px; margin: 8px 0 16px; }
.ws-state__table-num {
  font-family: var(--font-heading);
  font-size: 26px;
  font-weight: 700;
  color: var(--orderzy-ink);
  margin: 6px 0 8px;
}
.ws-meta {
  padding: 10px 16px;
  background: var(--orderzy-surface-alt);
  border: 1px solid var(--orderzy-border);
  border-radius: var(--r-sm);
  font-size: 13.5px;
  color: var(--orderzy-ink-soft);
  margin-bottom: 12px;
  display: inline-block;
}
.ws-banner {
  padding: 10px 16px;
  background: #D1FAE5;
  color: #065F46;
  border-radius: var(--r-sm);
  font-size: 13.5px;
  margin-top: 10px;
}
.ws-spin {
  display: inline-block;
  width: 12px; height: 12px;
  border: 2px solid rgba(0,0,0,0.15);
  border-top-color: var(--orderzy-brand-ink);
  border-radius: 50%;
  animation: wsSpin 1s linear infinite;
  vertical-align: middle;
  margin-right: 5px;
}
@keyframes wsSpin { to { transform: rotate(360deg); } }

/* ---------- po-*  orders/place_order.html ---------- */
.po-wrap {
  max-width: 980px;
  margin: 24px auto 48px;
  padding: 0 16px;
  display: grid;
  grid-template-columns: 1fr 360px;
  gap: 20px;
  align-items: start;
}
@media (max-width: 840px) { .po-wrap { grid-template-columns: 1fr; } }
.po-card {
  background: #fff;
  border: 1px solid var(--orderzy-border);
  border-radius: var(--r-md);
  overflow: hidden;
}
.po-card__head {
  padding: 14px 20px;
  background: var(--orderzy-surface-alt);
  border-bottom: 1px solid var(--orderzy-border);
  font-family: var(--font-heading);
  font-size: 13px;
  font-weight: 700;
  color: var(--orderzy-ink);
  text-transform: uppercase;
  letter-spacing: 0.05em;
  display: flex;
  align-items: center;
  gap: 8px;
}
.po-card__body { padding: 20px; }
.po-queue-note {
  padding: 10px 14px;
  background: var(--orderzy-brand-soft);
  color: var(--orderzy-brand-ink);
  border-radius: var(--r-sm);
  font-size: 13.5px;
  font-style: italic;
  margin-bottom: 14px;
}
.po-addr { line-height: 1.7; font-size: 14px; color: var(--orderzy-ink-soft); }
.po-addr > div { padding: 2px 0; }
.po-addr b { color: var(--orderzy-ink); margin-right: 4px; }
.po-items { width: 100%; border-collapse: collapse; font-size: 13.5px; }
.po-items td { padding: 10px 6px; border-bottom: 1px solid var(--orderzy-border); vertical-align: middle; }
.po-items tr:last-child td { border-bottom: 0; }
.po-items img { border-radius: var(--r-xs); display: block; }
.po-totals { list-style: none; padding: 0; margin: 16px 0 0; }
.po-totals li { display: flex; justify-content: space-between; padding: 5px 0; font-size: 14px; color: var(--orderzy-ink-soft); }
.po-totals li.is-grand {
  margin-top: 8px; padding-top: 10px;
  border-top: 1px solid var(--orderzy-border);
  font-size: 17px; font-weight: 700;
  color: var(--orderzy-ink);
}
.po-actions { margin-top: 16px; }

/* ---------- bpc-*  orders/bill_payment_complete.html ---------- */
.bpc-wrap { max-width: 620px; margin: 28px auto 60px; padding: 0 16px; }
.bpc-status {
  background: #fff;
  border: 1px solid var(--orderzy-border);
  border-radius: var(--r-md);
  padding: 40px 24px;
  text-align: center;
  margin-bottom: 16px;
}
.bpc-status__icon {
  width: 72px; height: 72px;
  margin: 0 auto 16px;
  display: flex;
  align-items: center;
  justify-content: center;
  border-radius: 50%;
}
.bpc-status__icon--success { background: #D1FAE5; color: #047857; }
.bpc-status__icon--fail    { background: #FEE2E2; color: #B91C1C; }
.bpc-status__icon--pending { background: #FEF3C7; color: #B45309; }
.bpc-status h1 { font-family: var(--font-heading); font-size: 22px; font-weight: 700; margin: 0 0 8px; }
.bpc-status h1.is-success { color: #047857; }
.bpc-status h1.is-fail    { color: #B91C1C; }
.bpc-status h1.is-pending { color: #B45309; }
.bpc-status p { color: var(--orderzy-ink-muted); margin: 0; font-size: 14px; }
.bpc-card {
  background: #fff;
  border: 1px solid var(--orderzy-border);
  border-radius: var(--r-md);
  margin-bottom: 16px;
  overflow: hidden;
}
.bpc-card__head {
  padding: 14px 20px;
  background: var(--orderzy-surface-alt);
  border-bottom: 1px solid var(--orderzy-border);
  font-family: var(--font-heading);
  font-size: 14px;
  font-weight: 700;
  color: var(--orderzy-ink);
  text-transform: uppercase;
  letter-spacing: 0.05em;
}
.bpc-card__body { padding: 18px 20px; }
.bpc-row {
  display: flex; justify-content: space-between;
  padding: 5px 0; gap: 10px;
  font-size: 14px;
}
.bpc-row > span:first-child { color: var(--orderzy-ink-muted); }
.bpc-row > span:last-child { color: var(--orderzy-ink); font-weight: 600; text-align: right; }
.bpc-divider { height: 1px; background: var(--orderzy-border); margin: 12px 0; }
.bpc-total {
  display: flex; justify-content: space-between; align-items: center;
  font-size: 17px; font-weight: 700;
  color: var(--orderzy-ink);
}
.bpc-total .is-amount { color: var(--orderzy-success, #047857); }
.bpc-total .is-due    { color: var(--orderzy-danger, #DC2626); }
.bpc-thanks {
  background: linear-gradient(135deg, var(--orderzy-brand) 0%, var(--orderzy-brand-ink) 100%);
  color: #fff;
  border-radius: var(--r-md);
  padding: 28px 24px;
  text-align: center;
  margin-bottom: 16px;
}
.bpc-thanks svg { margin-bottom: 10px; }
.bpc-thanks h2 { font-family: var(--font-heading); font-size: 20px; font-weight: 700; margin: 0 0 6px; }
.bpc-thanks p { margin: 0; font-size: 14px; opacity: 0.92; }
.bpc-spin {
  display: inline-block;
  width: 28px; height: 28px;
  border: 3px solid rgba(0,0,0,0.15);
  border-top-color: var(--orderzy-brand-ink);
  border-radius: 50%;
  animation: bpcSpin 0.8s linear infinite;
}
@keyframes bpcSpin { to { transform: rotate(360deg); } }
.bpc-alert-info {
  background: #DBEAFE;
  color: #1E40AF;
  padding: 14px 18px;
  border-radius: var(--r-sm);
  font-size: 13.5px;
}

/* ---------- fb-*  orders/find_bill.html ---------- */
.fb-wrap { max-width: 480px; margin: 32px auto 60px; padding: 0 16px; }
.fb-head { text-align: center; margin-bottom: 22px; }
.fb-head__icon {
  width: 56px; height: 56px;
  background: var(--orderzy-brand-soft);
  border-radius: 50%;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  margin-bottom: 12px;
  color: var(--orderzy-brand-ink);
}
.fb-head h1 { font-family: var(--font-heading); font-size: 22px; font-weight: 700; color: var(--orderzy-ink); margin: 0 0 4px; }
.fb-head p { color: var(--orderzy-ink-muted); font-size: 14px; margin: 0; }
.fb-phone { position: relative; margin-bottom: 12px; }
.fb-phone__prefix {
  position: absolute;
  left: 16px; top: 50%;
  transform: translateY(-50%);
  color: var(--orderzy-ink-muted);
  font-size: 15px;
  font-weight: 500;
  pointer-events: none;
}
.fb-phone input {
  width: 100%;
  padding: 14px 14px 14px 52px;
  font-size: 16px;
  border: 2px solid var(--orderzy-border);
  border-radius: 12px;
  background: #fff;
  color: var(--orderzy-ink);
  outline: none;
  transition: border-color 150ms;
}
.fb-phone input:focus { border-color: var(--orderzy-brand); }
.fb-results-head { font-size: 13px; color: var(--orderzy-ink-muted); margin: 24px 0 12px; }
.fb-order {
  display: block;
  text-decoration: none;
  color: inherit;
  background: #fff;
  border: 1px solid var(--orderzy-border);
  border-radius: 12px;
  padding: 16px;
  margin-bottom: 10px;
  transition: all 150ms;
}
.fb-order:hover { border-color: var(--orderzy-brand); box-shadow: 0 2px 8px rgba(242, 133, 0, 0.1); }
.fb-order__top { display: flex; justify-content: space-between; align-items: flex-start; gap: 10px; }
.fb-order__name { font-weight: 600; font-size: 15px; color: var(--orderzy-ink); margin-bottom: 4px; }
.fb-order__time { font-size: 13px; color: var(--orderzy-ink-muted); }
.fb-order__price {
  font-family: var(--font-heading);
  font-weight: 700;
  font-size: 16px;
  color: var(--orderzy-ink);
  white-space: nowrap;
}
.fb-order__method { font-size: 12px; margin-top: 2px; }
.fb-order__method--pae    { color: #3B82F6; }
.fb-order__method--cash   { color: var(--orderzy-ink-muted); }
.fb-order__method--online { color: #10B981; }
.fb-order__foot {
  display: flex;
  justify-content: space-between;
  align-items: center;
  margin-top: 10px;
  padding-top: 10px;
  border-top: 1px solid var(--orderzy-border);
  gap: 6px;
  flex-wrap: wrap;
}
.fb-order__num {
  font-size: 12px;
  color: var(--orderzy-ink-muted);
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
}
.fb-order__cta { font-size: 13px; color: var(--orderzy-brand-ink); font-weight: 600; white-space: nowrap; }
.fb-pill { font-size: 10px; padding: 2px 8px; border-radius: 20px; font-weight: 600; white-space: nowrap; }
.fb-pill--placed    { color: #F59E0B; background: #FFFBEB; }
.fb-pill--preparing { color: #F28500; background: #FFF7ED; }
.fb-pill--ready     { color: #10B981; background: #ECFDF5; }
.fb-empty { text-align: center; padding: 32px 16px; }
.fb-empty__icon { font-size: 40px; margin-bottom: 8px; }
.fb-empty__title { font-weight: 600; color: var(--orderzy-ink); margin-bottom: 4px; }
.fb-empty__sub {
  font-size: 13px;
  color: var(--orderzy-ink-muted);
  max-width: 320px;
  margin: 0 auto;
  line-height: 1.5;
}

/* ===========================================================
   Focus indication (Phase 0 / H12) - must sit at end of file
   so it wins source-order against page-specific :focus rules
   that pair `outline: none` with a `box-shadow` ring. Those
   rules keep working on mouse/touch focus; this layer ensures
   keyboard focus always shows a clear ring.
   =========================================================== */
.btn:focus-visible,
.adm-btn:focus-visible,
.input:focus-visible,
.auth-input:focus-visible,
.adm-field__input:focus-visible,
button:focus-visible,
a:focus-visible,
input:focus-visible,
select:focus-visible,
textarea:focus-visible,
[tabindex]:focus-visible,
[role="button"]:focus-visible {
  outline: 2px solid var(--focus-ring);
  outline-offset: 2px;
}


/* ===========================================================
   LUXE CARD-SCOPED TOKENS  (STYLEGUIDE_LUXE.md §1.8, §2.7, §3.2)
   For Luxe outlet cards rendered on multi-brand Warmth pages (homepage,
   marketplace listing, find-a-table). The page chrome stays Warmth; each card
   flips to its brand theme via data-theme="luxe". Per-card accent is injected
   inline as --card-brand-accent; falls back to Charcoal.
   =========================================================== */
.outlet-card {
  --card-canvas:       #fdfbf7;
  --card-surface:      #ffffff;
  --card-surface-alt:  #f6f0e6;
  --card-divider:      #ede5d7;
  --card-ink:          #1a1815;
  --card-ink-muted:    #6b6760;
  --card-accent:       var(--card-brand-accent, #1a1815);
  --card-font-display: "DM Serif Display", Georgia, serif;
  --card-font-body:    "Inter", system-ui, sans-serif;
  --card-radius:       8px;
  --card-shadow:       0 2px 8px rgba(0,0,0,0.04);
}

/* ===========================================================
   COMPONENTS  (formerly LUXE COMPONENTS: STYLEGUIDE_LUXE.md section 3 + PLAN_PREMIUM_TIER.md section 2.4)

   Post-Luxe-unification (2026-08-14): the `body.theme-luxe` wrapper was
   retired. Rules below apply site-wide as the default surface. Two kinds
   of rules coexist here:
   1. Component styling for production classes (.btn, .menu-item, .oz-nav,
      .oz-footer, .pill, .input, .bill ...) which are now the site-wide
      treatment. Earlier declarations of the same classes elsewhere in this
      file may still exist as pre-unification base rules; source-order + the
      cascade resolves the effective render.
   2. NET-NEW components (.course-header, .lazy-image, .skeleton). The
      previously orphaned `.luxe-*` design-system stubs (modal, toast, step,
      slot, empty, field, dish__*, nav__outlet) were deleted in P4.C01
      because no template or JS ever consumed them; when a future rebuild
      needs a modal / toast / step primitive, add fresh classes under the
      `.oz-*` namespace rather than reviving the `.luxe-*` prefix.

   Motion: transitions run on --duration-*/--ease-* tokens; card hover scale
   capped at 1.03 (§5.1 rule 2). The global prefers-reduced-motion block
   zeroes all of it.
   =========================================================== */

/* Focus ring follows the brand accent (STYLEGUIDE §7.2).
   Post-Luxe-unification (2026-08-14): the --focus-ring token now lives in
   :root above and reads var(--accent) directly. This standalone override
   was retired alongside the wrapper. */

/* ---------- §3.1 Buttons - OUTLINED, never filled (LOCKED) ---------- */
.btn {
  font-family: var(--font-body);
  font-weight: 500;
  font-size: 15px;
  letter-spacing: 0.04em;
  padding: 16px 32px;
  min-height: 48px;
  border-radius: var(--radius-md);
  border: 1px solid transparent;
  transition: color var(--duration-base) var(--ease-default),
              border-color var(--duration-base) var(--ease-default),
              box-shadow var(--duration-base) var(--ease-default),
              transform 80ms var(--ease-accelerate);
}
.btn:active { transform: scale(0.98); }

/* Primary: outlined accent, transparent fill. */
.btn--primary {
  background: transparent;
  color: var(--accent);
  border-color: var(--accent);
  box-shadow: none;
}
.btn--primary:hover {
  background: transparent;
  color: var(--accent-hover);
  border-color: var(--accent-hover);
  box-shadow: var(--shadow-soft);
}
.btn--primary:disabled,
.btn--primary[aria-disabled="true"] {
  background: transparent;
  color: var(--orderzy-ink-muted);
  border-color: var(--orderzy-border);
  box-shadow: none;
}

/* Secondary: text link, no border, no fill. */
.btn--secondary {
  background: transparent;
  color: var(--accent);
  border-color: transparent;
  padding: 8px 4px;
  min-height: 0;
  text-decoration: none;
}
.btn--secondary:hover {
  background: transparent;
  text-decoration: underline;
  text-decoration-color: var(--accent);
  text-underline-offset: 4px;
}

/* Danger: text link in muted semantic red (cancel / destructive). */
.btn--danger,
.btn-cancel {
  background: transparent;
  color: var(--orderzy-danger);
  border-color: transparent;
}
.btn--danger:hover,
.btn-cancel:hover {
  background: transparent;
  text-decoration: underline;
  text-decoration-color: var(--orderzy-danger);
  text-underline-offset: 4px;
}

/* Ghost: icon-only square, quiet hover. */
.btn--ghost {
  background: transparent;
  color: var(--orderzy-ink-soft);
  border-color: transparent;
}
.btn--ghost:hover {
  background: var(--orderzy-surface-alt);
  color: var(--orderzy-ink);
  border-radius: var(--radius-sm);
}

.btn--large { font-size: 15px; padding: 20px 40px; min-height: 52px; }
.btn--block { width: 100%; }

/* ===========================================================
   P1.C04 - Design System Wave 1 (2026-08-15)
   -----------------------------------------------------------
   Runs AFTER the Luxe cascade block above so its filled-primary
   override wins the specificity race. Three intents:

   1. Reintroduce filled primary buttons. The pixel-truth pass
      on 2026-08-15 evening (master audit §0.5.3, §0.5.8) found
      that primary CTAs on /for-restaurants/, /find-table/, and
      the home hero were rendering as outlined-only. Filled
      primaries were retired inside the Luxe cascade (see
      .btn--primary at :~8302); reintroduced here as the
      canonical Wave 1 look. Outlined stays available as
      .btn.btn--ghost / .btn.btn--secondary.

   2. Add .oz-sec--hero / --standard / --wide / --quiet section
      variants per master audit §1.3. New pages compose with
      these; .section (home) and .mk-sec (marketing) stay
      untouched with their existing padding, deletion deferred
      to Phase 2's cross-page sweep. Docs the four-variant
      vocabulary at the token layer so any surface can adopt.

   3. Restore .cat-nav sidebar on desktop. The .rest-layout
      grid was collapsed to display:block AND the sidebar hidden
      with display:none inside the Luxe cascade, wasting the
      confidence a sync-navigation sidebar brings to a long
      menu. Undoing both restores the base 220px + 1fr grid at
      >=880px and lets the existing @media (max-width: 880px)
      rule handle mobile as a horizontal pill strip. The new
      Level 2 sticky-top chip strip pattern ships in Phase 2.
   =========================================================== */

/* 1. Filled primary CTA. */
.btn.btn--primary {
  background: var(--accent);
  color: var(--accent-contrast);
  border-color: var(--accent);
}
.btn.btn--primary:hover {
  background: var(--accent-hover);
  color: var(--accent-contrast);
  border-color: var(--accent-hover);
}
.btn.btn--primary:disabled,
.btn.btn--primary[aria-disabled="true"] {
  background: var(--orderzy-border);
  color: var(--orderzy-ink-muted);
  border-color: var(--orderzy-border);
  cursor: not-allowed;
}

/* 2. Section variants. Padding + background per master audit §1.3.
      D also constrains width to keep editorial paragraphs readable. */
.oz-sec { padding: 64px 0; }
.oz-sec--hero { padding: 72px 0 48px; background: var(--orderzy-canvas); }
.oz-sec--standard { padding: 64px 0; }
.oz-sec--wide { padding: 96px 0; }
.oz-sec--quiet {
  padding: 48px 0;
  background: var(--orderzy-canvas);
}
.oz-sec--quiet > .container,
.oz-sec--quiet > .oz-container {
  max-width: 720px;
  margin: 0 auto;
}
.oz-sec--alt { background: var(--orderzy-surface-alt); }
.oz-sec--ink {
  background: var(--orderzy-ink);
  color: var(--orderzy-ink-invert);
}
.oz-sec--ink h2,
.oz-sec--ink h3 { color: var(--orderzy-ink-invert); }
.oz-sec__eyebrow {
  display: inline-block;
  font-family: var(--font-body);
  font-weight: 600;
  font-size: 13px;
  letter-spacing: var(--tracking-wide, 0.12em);
  text-transform: uppercase;
  color: var(--accent);
  margin-bottom: 12px;
}
.oz-sec__title {
  font-family: var(--font-display, "DM Serif Display", Georgia, serif);
  font-weight: 400;
  font-size: var(--text-h2, clamp(32px, 4vw, 40px));
  line-height: var(--leading-snug, 1.3);
  color: var(--orderzy-ink);
  margin: 0 0 12px;
}
.oz-sec__sub {
  font-family: var(--font-body);
  font-size: 17px;
  line-height: var(--leading-relaxed, 1.7);
  color: var(--orderzy-ink-soft);
  margin: 0;
  max-width: 720px;
}
@media (max-width: 767px) {
  .oz-sec { padding: 48px 0; }
  .oz-sec--hero { padding: 56px 0 32px; }
  .oz-sec--standard { padding: 48px 0; }
  .oz-sec--wide { padding: 64px 0; }
  .oz-sec--quiet { padding: 32px 0; }
}

/* 3. Restore .cat-nav sidebar on desktop.
      The Luxe cascade block at ~8674-8675 declared:
          .rest-layout { display: block; padding-top: 0; }
          .cat-nav    { display: none; }
      Wave 1 removes both by resetting them to the base grid + visible
      sidebar on desktop.
      2026-08-28 audit F.22: the mobile branch used to re-show `.cat-nav`
      as `display: flex` for the "sidebar-becomes-horizontal-pill-strip"
      reflow. The audit removed that reflow (see the `@media (max-width:
      880px) { .cat-nav { display: none; } }` block above at ~1707), so
      this cascade must NOT reintroduce the sidebar on mobile - the pill
      strip in .cat-nav__mobile-strip is the only category strip on
      small screens now. Mobile line here is display:none to match. */
.rest-layout { display: grid; padding-top: 32px; }
.cat-nav { display: block; }
@media (max-width: 880px) {
  /* 2026-08-28 audit F.22 (acceptance follow-up): minmax(0, 1fr) so the
     grid track shrinks with the viewport instead of expanding to the
     widest horizontal-scroll child. See the twin block near line 1706. */
  .rest-layout { display: grid; grid-template-columns: minmax(0, 1fr); padding-top: 16px; }
  .cat-nav { display: none; }
}

/* §3.3 dish "Add to order" + qty stepper inherit the outlined treatment.
   Solid surface bg + 2px white outline so the button stays readable when it
   overlaps any food photo (bright or dark). Without this the transparent
   variant disappeared against dark plates (image-5 report 2026-06-15). */
.menu-item__add {
  background: var(--orderzy-surface, #fdfbf7);
  color: var(--accent);
  border: 2px solid var(--accent);
  border-radius: var(--radius-md);
  font-family: var(--font-body);
  font-weight: 600;
  letter-spacing: 0.04em;
  text-transform: none;
  box-shadow:
    0 0 0 2px rgba(255, 255, 255, 0.85),
    var(--shadow-medium);
  transition: color var(--duration-base) var(--ease-default),
              border-color var(--duration-base) var(--ease-default),
              background var(--duration-base) var(--ease-default),
              box-shadow var(--duration-base) var(--ease-default);
}
.menu-item__add:hover {
  background: var(--accent);
  color: #fff;
  border-color: var(--accent);
  box-shadow:
    0 0 0 2px rgba(255, 255, 255, 0.85),
    var(--shadow-medium);
}
.menu-item__add:disabled,
.menu-item__add:disabled:hover {
  background: var(--orderzy-surface, #fdfbf7);
  color: var(--orderzy-ink-muted);
  border-color: var(--orderzy-border);
  box-shadow: var(--shadow-soft);
}
.menu-item__media .qty-stepper {
  background: var(--orderzy-surface);
  color: var(--accent);
  border: 2px solid var(--accent);
  box-shadow:
    0 0 0 2px rgba(255, 255, 255, 0.85),
    var(--shadow-medium);
}
.menu-item__media .qty-stepper__btn { color: var(--accent); }
.menu-item__media .qty-stepper__btn:hover {
  background: color-mix(in srgb, var(--accent) 8%, transparent);
}

/* ---------- §3.2a Rest-card Luxe overrides (current rest-card.html structure) ---------- */
/* Minimal card-scoped Luxe treatment: cream canvas + serif title.                        */
/* Per-card accent is already injected inline as --card-brand-accent.                     */
.rest-card {
  --card-font-display: "DM Serif Display", Georgia, serif;
  background: #fdfbf7;
  border-color: #ede5d7;
}
.rest-card .rest-card__title {
  font-family: var(--card-font-display);
  font-weight: 400;
  letter-spacing: -0.01em;
}
/* Luxe brand-card CTAs - per styleguide §2.7. The relationship is reversed:
   on a Luxe brand (typically reservation-led fine dining), "Book a table"
   is primary outlined-accent, "View menu" is secondary text link.
   2026-09-02 Tier 1.3: `.rest-card .rest-card__view-cta` override RETIRED.
   Post luxe-unification, every card is Luxe, so this override was
   silently turning EVERY card's See-menu CTA into a text link. Discovery
   page polish spec re-instates the button. Base `.rest-card__view-cta`
   rule further up now wins uncontested (single-class specificity). If a
   real Luxe-only override becomes necessary again, gate it on a modifier
   class like .rest-card--luxe rather than the bare .rest-card wrapper.
   Only .rest-card__book-cta keeps its Luxe treatment. */
/* .rest-card .rest-card__view-cta { ... } RETIRED 2026-09-02.
   The Luxe unification made this override apply to every card, silently
   flattening the See-menu CTA into a text link. Base rule above (single-
   class) now paints the button. */
.rest-card .rest-card__book-cta {
  border: 1px solid var(--card-brand-accent, #1a1815);
  border-radius: 8px;
  padding: 8px 16px;
  color: var(--card-brand-accent, #1a1815);
  font-family: "Inter", system-ui, sans-serif;
  font-weight: 500;
  font-size: 13px;
  letter-spacing: 0.04em;
  transition: background 320ms cubic-bezier(0.16, 1, 0.3, 1),
              color 320ms cubic-bezier(0.16, 1, 0.3, 1);
}
.rest-card .rest-card__book-cta:hover {
  background: var(--card-brand-accent, #1a1815);
  color: #fdfbf7;
  text-decoration: none;
}

/* ---------- §3.2 Outlet card (multi-brand pages, card-scoped theme) ---------- */
.outlet-card {
  background: var(--card-surface);
  border: 1px solid var(--card-divider);
  border-radius: var(--card-radius);
  box-shadow: var(--card-shadow);
  padding: 32px;
  min-height: 380px;
  color: var(--card-ink);
  transition: box-shadow 600ms var(--ease-emphasized, ease);
}
.outlet-card .outlet-card__hero {
  aspect-ratio: 16 / 10;
  overflow: hidden;
  border-radius: var(--card-radius);
}
.outlet-card .outlet-card__hero img {
  width: 100%; height: 100%; object-fit: cover;
  transition: transform 600ms var(--ease-emphasized, ease);
}
.outlet-card .outlet-card__cuisine {
  font-family: var(--card-font-body);
  font-size: 13px; font-weight: 500;
  text-transform: uppercase; letter-spacing: 0.12em;
  color: var(--card-ink-muted);
}
.outlet-card .outlet-card__name {
  font-family: var(--card-font-display);
  font-size: 22px; margin: 6px 0;
}
.outlet-card .outlet-card__cta {
  display: inline-block;
  border: 1px solid var(--card-accent);
  color: var(--card-accent);
  border-radius: var(--card-radius);
  padding: 12px 24px;
  font-family: var(--card-font-body);
  font-weight: 500; font-size: 14px; letter-spacing: 0.04em;
}
@media (hover: hover) {
  .outlet-card:hover { box-shadow: var(--shadow-medium); }
  .outlet-card:hover .outlet-card__hero img { transform: scale(1.03); }
}
.outlet-card.is-closed .outlet-card__hero img { filter: grayscale(0.4); opacity: 0.8; }
@media (max-width: 768px) { .outlet-card { min-height: 320px; padding: 24px; } }

/* ---------- §3.3 Dish card - flat on canvas, divider ABOVE, no shadow ---------- */
/* Luxe section spacing: 40px instead of 96px. The sticky .course-header
   pill already gives the category its own visual break; 96px on top of a
   sticky header reads as a dead empty band (image-11 feedback 2026-06-11). */
.menu-cat { margin-bottom: 40px; }
/* In Luxe, the .course-header pill IS the visible section header.
   Hide the h2/count visually but keep them in the accessibility tree so
   screen readers still announce the category boundary. */
.menu-cat__head {
  position: absolute;
  width: 1px;
  height: 1px;
  padding: 0;
  margin: -1px;
  overflow: hidden;
  clip: rect(0, 0, 0, 0);
  white-space: nowrap;
  border: 0;
}
.menu-cat__title {
  font-family: var(--font-display);
  font-size: var(--text-h3);
  font-weight: 400;
  letter-spacing: var(--tracking-tight);
}
.menu-item {
  padding: var(--space-5) 0;
  border-top: 1px solid var(--orderzy-border);
  border-bottom: none;
  transition: border-top-color var(--duration-base) var(--ease-default);
}
.menu-item:first-child { border-top: none; }
.menu-item__title {
  font-family: var(--font-display);
  font-size: var(--text-h3);
  font-weight: 400;
  letter-spacing: var(--tracking-tight);
}
.menu-item__desc {
  font-family: var(--font-body);
  font-size: var(--text-body);
  color: var(--orderzy-ink-soft);
  line-height: var(--leading-relaxed);
  display: -webkit-box;
  -webkit-line-clamp: 3;
  -webkit-box-orient: vertical;
  overflow: hidden;
}
/* Luxe needs its own is-expanded rule to beat the specificity of the
   `.menu-item__desc` selector above. Without this, tapping
   "more" on a Luxe menu would leave the clamp at 3 lines. */
.menu-item__desc.is-expanded {
  -webkit-line-clamp: unset;
  overflow: visible;
}
.menu-item__price {
  font-family: var(--font-body);
  font-size: var(--text-price);
  font-weight: 500;
  font-feature-settings: "tnum";
  transition: color var(--duration-base) var(--ease-default);
}
/* P4.C01 (2026-08-15) - `.luxe-dish__note`, `.luxe-dish__provenance`,
   `.luxe-dish__bestseller` deleted. Zero template/JS consumers. The live chef
   note markup uses `.menu-item__chef-note` further down this file. */
/* Hover (desktop only) - divider + price shift to accent, no bg change (§5.4). */
@media (hover: hover) {
  .menu-item:hover { border-top-color: color-mix(in srgb, var(--accent) 30%, transparent); }
  .menu-item:hover .menu-item__price { color: var(--accent); }
}
/* The `.menu-item--hero` inline render path was retired on 2026-06-19 when the
   House Favourites rail above the search bar replaced it. .menu-rail__* rules
   live at the bottom of this file. */

/* §8.6 No-photo fallback - INTENTIONALLY NOT a sand placeholder card.
   Styleguide v1 specified a placeholder with the dish title centered,
   but in practice (2026-05-31 user feedback on image #11) the placeholder
   ate horizontal space on mobile and showed redundant text (dish title
   already in info column). Decision: let .menu-item__media--noimg collapse
   to auto-size like Warmth does; cart controls stay inline via the
   existing `.menu-item__media--noimg .menu-item__add { position: static }`
   rule. Styleguide §8.6 should be updated to match this behavior. */

/* ---------- §3.4 Navbar - quiet, brand-name primary, no notif bell ---------- */
.oz-nav {
  background: var(--orderzy-canvas);
  backdrop-filter: none;
  -webkit-backdrop-filter: none;
  border-bottom: 1px solid var(--orderzy-border);
  transition: background var(--duration-base) var(--ease-emphasized, ease),
              box-shadow var(--duration-base) var(--ease-emphasized, ease);
}
.oz-nav.is-stuck { box-shadow: var(--shadow-soft); }
.oz-nav__inner { height: 60px; }
/* The "Orderzy" wordmark stays in Playfair Display Bold 800 in BOTH themes -
   it's the platform mark, not theme typography. Color stays brand-orange
   (locked truth: --orderzy-wordmark always #f28500 per styleguide §0). */
.oz-wordmark {
  font-family: "Playfair Display", "DM Serif Display", Georgia, serif;
  font-weight: 800;
  font-size: 22px;
  letter-spacing: 0;
  color: var(--orderzy-brand);
  line-height: 1;
}
/* P4.C01 (2026-08-15) - `.oz-wordmark--brand` variant deleted. Zero template
   consumers post-Wave-0; the navbar renders the platform wordmark (Playfair
   Display + `--orderzy-brand`) on every surface per
   feedback_navbar_orderzy_wordmark_locked. */
/* P4.C01 (2026-08-15) - `.luxe-nav__outlet` deleted. Zero template consumers;
   the outlet name renders through `.oz-nav__outlet` in `includes/navbar.html`. */
/* No notification bell on the customer-facing Luxe surface.
   Scoped to .oz-nav so the admin-shell bell (rendered inside .adm-top__actions
   on Luxe brand admin pages) isn't accidentally hidden. */
.oz-nav .oz-nav__bell { display: none; }
/* Cart: quiet icon, small adjacent count, no bright badge. */
.oz-nav__cart {
  background: transparent;
  border-color: transparent;
  color: var(--orderzy-ink);
}
.oz-nav__cart:hover { border-color: var(--orderzy-border); }
.oz-nav__cart-badge {
  background: transparent;
  color: var(--accent);
  border: none;
  font-family: var(--font-body);
  font-size: 11px;
  font-weight: 600;
}
@media (max-width: 768px) { .oz-nav__inner { height: 56px; } }

/* ---------- §3.3a Menu layout - P1.C04 (2026-08-15) restores desktop sidebar.
   The pre-Wave-1 Luxe cascade collapsed .rest-layout to display:block and hid
   .cat-nav entirely, which read as a 220px wasted column on desktop (master
   audit §0.5.4) and dropped a genuine desktop navigation win. The two rules
   below now come from the P1.C04 block at ~8367 in this file; the .rest-layout
   / .cat-nav overrides that used to live here are deleted. .menu-page-content
   still constrains the menu column width when there's no sidebar. */
/* 2026-09-01 layout fix (Bug A): explicit `width: 100%` so the grid
   child ALWAYS fills its column, then max-width caps at 800px. Without
   the explicit width, CSS Grid resolves the block child's width from
   its content's max intrinsic size when justify-self is auto - so a
   filter-chip click that shrinks the item cards (e.g. Non-veg with one
   short-name item) SHRUNK this column and shifted the search bar +
   chips 60-100px left. Aditya's incognito repro on kulhadwala-
   restaurant-2 with Non-veg vs Other. `width: 100%` + `max-width: 800px`
   is the canonical "fill container, cap at 800" pattern; browsers apply
   max-width AFTER width, so the effective width stays 800 on wide
   viewports and shrinks with the parent on narrow ones. */
.menu-page-content { width: 100%; max-width: 800px; margin: 0 auto; }

/* Restaurant hero outlet sub-name (was inline in restaurant__detail.html). */
.rest-info__outlet {
  font-family: var(--font-display, "DM Serif Display", Georgia, serif);
  font-weight: 400;
  letter-spacing: 0;
}

/* Call-waiter button - Luxe variant per §3.1 (outlined, accent-color).
   .rest-banner stays --orderzy-brand-soft in Luxe (warm cream), so we
   need accent-on-cream not white-on-dark. */
.cw-btn {
  background: transparent;
  border-color: var(--accent);
  color: var(--accent);
  font-family: var(--font-body, "Inter", system-ui, sans-serif);
  font-weight: 500;
  letter-spacing: 0.04em;
}
.cw-btn:hover {
  background: var(--accent);
  border-color: var(--accent);
  color: var(--accent-contrast, #fdfbf7);
}

/* ---------- §3.5 Sticky course header (CSS only; JS in Session 22) ----------
   Only ONE pill ever renders - the active section's. Non-active pills are
   removed from the document entirely (display:none) so they cannot stack at
   the top, cannot create competing stacking contexts, and cannot poke through
   an open dropdown. Trade-off: inline section dividers are gone; the sticky
   active pill IS the visible section header (image-13/14/15 feedback
   2026-06-11). The IntersectionObserver in course-progression.js
   toggles .is-active per scroll position. The .menu-cat__head h2 remains
   sr-only above for screen-reader section announcement. */
.course-header {
  display: none;
}
.course-header.is-active {
  display: flex;
  position: sticky;
  top: 60px;
  z-index: var(--z-sticky-course);
  height: 36px;
  align-items: center;
  justify-content: center;
  background: var(--orderzy-canvas);
  border-bottom: 1px solid var(--orderzy-border);
}
/* When the dropdown is open, lift the header above other sticky course
   headers so the open list isn't covered by the next category scrolling
   into view. Sibling sticky headers share z-index:40, so a tie goes to
   the later DOM order without this boost. */
.course-header.is-dropdown-open {
  z-index: var(--z-sticky-course-open);
}
/* Black, solid text on every pill - readable on cream canvas. */
.course-header__name {
  font-family: var(--font-body);
  font-weight: 600;
  font-size: 13px;
  text-transform: uppercase;
  letter-spacing: 0.18em;
  color: var(--orderzy-ink);
  opacity: 1;
  transition: opacity 250ms var(--ease-default);
}
.course-header__chevron {
  width: 20px; height: 20px; margin-left: 8px; color: var(--orderzy-ink);
  background: transparent; border: none; padding: 0; cursor: pointer;
}
.course-dropdown {
  position: absolute;
  top: 100%;
  left: 50%;
  transform: translateX(-50%);
  z-index: var(--z-nav-dropdown-inline);
  min-width: 220px;
  max-height: 60vh;
  overflow-y: auto;
  background: var(--orderzy-surface);
  border: 1px solid var(--orderzy-border);
  border-radius: var(--radius-md);
  box-shadow: var(--shadow-medium);
  padding: var(--space-3) 0;
  display: none;
}
.course-dropdown.is-open { display: block; }
.course-dropdown__item {
  display: block;
  width: 100%;
  text-align: left;
  background: transparent;
  border: none;
  cursor: pointer;
}
.course-dropdown__item {
  font-family: var(--font-display);
  font-size: 17px;
  padding: var(--space-2) var(--space-4);
  color: var(--orderzy-ink);
}
.course-dropdown__item--current { border: 1px solid var(--accent); border-radius: var(--radius-sm); }
@media (max-width: 768px) { .course-header { top: 56px; } }

/* ---------- §3.6 Footer - warm cream surface, Orderzy wordmark always present ----------
   Luxe footer keeps the new two-column-top structure; only colors flip
   from dark-ink to cream-friendly muted-ink. */
.oz-footer {
  background: var(--orderzy-surface-alt);
  color: var(--orderzy-ink-soft);
  border-top: 1px solid var(--orderzy-border);
}
.oz-footer__col h3 {
  color: var(--orderzy-ink);
  letter-spacing: 0.12em;
}
.oz-footer__col a,
.oz-footer__contact a {
  color: var(--orderzy-ink-soft);
}
.oz-footer__col a:hover,
.oz-footer__contact a:hover {
  color: var(--accent);
}
.oz-footer__tagline {
  color: var(--orderzy-ink-muted);
}
.oz-footer__brand-desc {
  color: var(--orderzy-ink-muted);
}
.oz-footer__bottom-strip {
  border-top-color: var(--orderzy-border);
}
.oz-footer__copy { color: var(--orderzy-ink-muted); }
/* Orderzy wordmark stays brand orange #f28500 in both themes (LOCKED §1.1).
   .oz-wordmark already gets Playfair Display Bold 800 from the base rule;
   in Luxe the brand-title size is footer-tuned. */
.oz-footer__brand-title { color: var(--orderzy-brand); }

/* Re-skin the existing sticky bill card so the cart page reads Luxe today. */
.bill { border-color: var(--orderzy-border); border-radius: var(--radius-md); }
.bill__title { font-family: var(--font-display); font-weight: 400; border-bottom-color: var(--orderzy-border); }
.bill__line { font-family: var(--font-body); font-feature-settings: "tnum"; }
.bill__line--total { font-family: var(--font-body); font-weight: 700; font-size: 28px; border-top-color: var(--orderzy-border); }

/* ---------- §3.3b Veg-toggle / Parcel strip - quiet horizontal rule, not a card ---------- */
/* Warmth uses a bordered card. Luxe's editorial restraint wants this row to
   feel like a serif italic note tucked under the search bar, with the
   "Parcel" toggle reading as a minimal pill. */
.veg-toggle {
  background: transparent;
  border: none;
  border-top: 1px solid var(--orderzy-border);
  border-bottom: 1px solid var(--orderzy-border);
  border-radius: 0;
  padding: 14px 0;
  margin-bottom: 24px;
  font-family: var(--font-body);
  font-size: 13px;
  letter-spacing: 0.04em;
}
.veg-toggle label,
.veg-toggle label > span:not(.veg-toggle__dot) {
  font-family: var(--font-body);
  font-weight: 500;
  color: var(--orderzy-ink-soft);
  text-transform: uppercase;
  letter-spacing: 0.18em;
  font-size: 11px;
}
.veg-toggle__dot--veg { border-color: var(--accent); }
.veg-toggle__dot--veg::after { background: var(--accent); }
/* 2026-08-23 parcel flow overhaul: #takeaway-pill (single-pill toggle on
   restaurant__detail) is retired in favour of the shared .oz-parcel-toggle
   two-button strip. Selector kept out of the stylesheet so a stray legacy
   id does not conflict. */

/* ---------- §3.8 Status pills + badges - outlined only, muted semantic ---------- */
.pill {
  background: transparent;
  border: 1px solid currentColor;
  border-radius: var(--radius-pill);
  padding: var(--space-1) var(--space-3);
  min-height: 24px;
  font-family: var(--font-body);
  font-size: 12px;
  font-weight: 500;
  letter-spacing: 0.18em;
  text-transform: uppercase;
}
.pill::before { display: none; }
.pill--success { color: var(--orderzy-success); }
.pill--warn { color: var(--orderzy-warning); }
.pill--brand { color: var(--accent); }

/* ---------- §3.9 Forms - underline-only inputs, floating labels ---------- */
.input {
  background: transparent;
  border: none;
  border-bottom: 1px solid var(--orderzy-border);
  border-radius: 0;
  padding: var(--space-3) var(--space-1);
  min-height: 48px;
  font-family: var(--font-body);
  font-size: var(--text-body);
  color: var(--orderzy-ink);
  transition: border-color var(--duration-fast) var(--ease-default);
}
.input::placeholder { color: var(--orderzy-ink-muted); }
.input:focus {
  outline: none;
  border-bottom-width: 2px;
  border-bottom-color: var(--accent);
  box-shadow: none;
}
.input.is-error,
.input[aria-invalid="true"] { border-bottom-color: var(--orderzy-danger); }
textarea.input { border: 1px solid var(--orderzy-border); border-radius: var(--radius-sm); min-height: 120px; resize: vertical; }
select.input { appearance: none; -webkit-appearance: none; background-image: none; }
/* P4.C01 (2026-08-15) - `.luxe-field`, `.luxe-field__label` floating-label
   wrapper deleted. Zero template consumers. Every form on the customer
   surface uses the flat `.input` treatment above. */
/* Checkbox / radio. */
input[type="checkbox"],
input[type="radio"] {
  appearance: none; -webkit-appearance: none;
  width: 20px; height: 20px;
  border: 1px solid var(--orderzy-border);
  border-radius: var(--radius-sm);
}
input[type="radio"] { border-radius: var(--radius-pill); }
input[type="checkbox"]:checked,
input[type="radio"]:checked {
  background: var(--accent);
  border-color: var(--accent);
}

/* FE0 follow-up (2026-06-02): tick mark for Luxe checked state.
   appearance:none above strips the native checkmark; without an explicit
   tick, the checked state reads as just a solid accent square (confusing
   on dense forms like brand profile + offers list). */
input[type="checkbox"] { position: relative; }
input[type="checkbox"]:checked::after {
  content: "";
  position: absolute;
  left: 6px;
  top: 2px;
  width: 5px;
  height: 10px;
  border: solid var(--accent-contrast, #fff);
  border-width: 0 2px 2px 0;
  transform: rotate(45deg);
}
input[type="radio"]:checked::after {
  content: "";
  position: absolute;
  left: 50%;
  top: 50%;
  width: 8px;
  height: 8px;
  background: var(--accent-contrast, #fff);
  border-radius: 50%;
  transform: translate(-50%, -50%);
}

/* ---------- §3.10 Modals ---------- */
/* P4.C01 (2026-08-15) - `.luxe-modal-backdrop`, `.luxe-modal`,
   `.luxe-modal__title`, `.luxe-modal__body` deleted. Zero template consumers.
   Live modal path is `.oz-confirm*` further down this file. */

/* ---------- §3.11 Toasts - white surface + semantic icon, no full-colour bg ---------- */
/* P4.C01 (2026-08-15) - `.luxe-toast`, `.luxe-toast__icon`,
   `.luxe-toast--success/error` deleted. Zero template consumers. Live toast
   path is `.oz-toast*` in the app JS (`showOrderzyToast`). */

/* ---------- §3.12 Loading skeletons - shimmer, no spinners (LOCKED) ---------- */
.skeleton {
  background: var(--orderzy-surface-alt);
  border-radius: var(--radius-sm);
}
.skeleton-shimmer {
  background: linear-gradient(90deg,
    var(--orderzy-surface-alt) 0%,
    color-mix(in srgb, var(--orderzy-surface-alt) 60%, #fff) 50%,
    var(--orderzy-surface-alt) 100%);
  background-size: 200% 100%;
  animation: oz-shimmer 1500ms linear infinite;
}
/* Lazy-load image fade-in (§5.3); .is-loaded added by JS next session. */
.lazy-image { opacity: 0; transition: opacity 400ms var(--ease-decelerate); }
.lazy-image.is-loaded { opacity: 1; }

/* ---------- §3.13 Step indicator (3-step booking) ---------- */
/* P4.C01 (2026-08-15) - `.luxe-step-indicator`, `.luxe-step`, `.luxe-step__dot`,
   `.luxe-step__label`, `.luxe-step__connector` deleted. Zero template
   consumers. Booking step markers render through `.rsv-step*` further down. */

/* ---------- §3.15 Slot chip (booking flow) ---------- */
/* P4.C01 (2026-08-15) - `.luxe-slot`, `.luxe-slot.is-selected`,
   `.luxe-slot.is-soldout` deleted. Zero template consumers. Live slot chips
   render via `.rsv-slot`, `.mod-slot`, `.find-card__slot`. */

/* ---------- §3.16 Empty states - no illustrations ---------- */
/* P4.C01 (2026-08-15) - `.luxe-empty`, `.luxe-empty__title`,
   `.luxe-empty__copy` deleted. Zero template consumers. Live empty-state
   markup uses page-scoped classes (`.cart-empty`, `.mk-empty`, etc.). */

/* Keyframes (top-level; consumed only by the rules above). */
@keyframes oz-shimmer { from { background-position: 200% 0; } to { background-position: -200% 0; } }
@keyframes oz-modal-in { from { opacity: 0; transform: scale(0.96); } to { opacity: 1; transform: scale(1); } }
@keyframes oz-toast-in { from { opacity: 0; transform: translateY(16px); } to { opacity: 1; transform: translateY(0); } }

/* ===========================================================
   LUXE REDUCED MOTION  (STYLEGUIDE_LUXE.md §7.4 - LOCKED, non-negotiable)
   The global prefers-reduced-motion block near the top of this file already
   zeroes every *->transition/animation duration to ~0 and disables smooth
   scroll. These rules add the Luxe-specific stops: the lazy-load image fade
   resolves to fully-visible, and skeletons stop shimmering.
   =========================================================== */
@media (prefers-reduced-motion: reduce) {
  .lazy-image { opacity: 1; }
  .skeleton-shimmer {
    background: var(--orderzy-surface-alt);
    animation: none;
  }
}

/* ===========================================================
   FEATURE 3 - Premium menu rendering
   PLAN_PREMIUM_TIER.md §3.4 + STYLEGUIDE_LUXE.md §3.3
   =========================================================== */

/* ---------- Dietary chips (Warmth base) ---------- */
.di-chip {
  display: inline-flex;
  align-items: center;
  gap: 3px;
  padding: 2px 8px;
  border-radius: 9999px;
  font-family: var(--font-heading);
  font-size: 11px;
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: 0.04em;
  line-height: 1.6;
}
.di-chip__icon { width: 12px; height: 12px; flex-shrink: 0; }
.di-chip--vegan   { background: #d1fae5; color: #065f46; }
.di-chip--gf      { background: #fef3c7; color: #92400e; }
.di-chip--df      { background: #ede9fe; color: #5b21b6; }
.di-chip--nuts    { background: #fef9c3; color: #713f12; }

/* ---------- Chef note (Warmth) ---------- */
.menu-item__chef-note {
  font-family: var(--font-body);
  font-size: 13px;
  font-style: italic;
  color: var(--orderzy-ink-muted);
  line-height: 1.5;
  margin: 4px 0 0;
  display: -webkit-box;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
  overflow: hidden;
}
.menu-item__chef-note::before { content: '\00B7\00A0'; }

/* ---------- Provenance (Warmth) ---------- */
.menu-item__provenance {
  font-family: var(--font-body);
  font-size: 11px;
  font-weight: 600;
  color: var(--orderzy-ink-muted);
  text-transform: uppercase;
  letter-spacing: 0.08em;
  margin: 3px 0 0;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}

/* ---------- Category intro copy (Warmth) ---------- */
.menu-cat__intro {
  font-family: var(--font-body);
  font-size: 14px;
  color: var(--orderzy-ink-muted);
  line-height: 1.5;
  margin: 4px 0 10px;
  display: -webkit-box;
  -webkit-line-clamp: 3;
  -webkit-box-orient: vertical;
  overflow: hidden;
}

/* ---------- Category hero image ---------- */
.cat-hero {
  width: 100%;
  margin: 0 0 16px;
  border-radius: var(--r-sm);
  overflow: hidden;
  aspect-ratio: 16/9;
  max-height: 240px;
}
.cat-hero__img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
}

/* ---------- Luxe: dietary chips - outlined ---------- */
.di-chip {
  background: transparent;
  font-family: var(--font-body);
  font-size: 12px;
  letter-spacing: 0.12em;
  border: 1px solid;
  border-radius: var(--radius-pill);
  padding: 3px 10px;
}
.di-chip--vegan   { border-color: #065f46; color: #065f46; }
.di-chip--gf      { border-color: #92400e; color: #92400e; }
.di-chip--df      { border-color: #5b21b6; color: #5b21b6; }
.di-chip--nuts    { border-color: #713f12; color: #713f12; }
.di-chip__icon    { display: none; }

/* ---------- Luxe: chef note ---------- */
.menu-item__chef-note {
  font-family: var(--font-body);
  font-size: 15px;
  color: var(--orderzy-ink-muted);
  line-height: 1.6;
  margin: 6px 0 0;
  -webkit-line-clamp: unset;
  display: block;
  overflow: visible;
}
.menu-item__chef-note::before { content: none; }

/* ---------- Luxe: provenance ---------- */
.menu-item__provenance {
  font-size: 13px;
  letter-spacing: 0.18em;
}

/* ---------- Luxe: category intro copy ---------- */
.menu-cat__intro {
  font-family: var(--font-display);
  font-size: clamp(18px, 1.5vw + 14px, 22px);
  font-style: italic;
  font-weight: 400;
  color: var(--orderzy-ink-muted);
  line-height: 1.5;
  max-width: 640px;
  margin: 8px auto 16px;
  text-align: center;
  display: block;
  -webkit-line-clamp: unset;
  overflow: visible;
}

/* ---------- Luxe: category hero, round medallion. ----------
   Reworked 2026-08-20. Was a full-bleed 400px billboard that dominated
   the menu and fought the food-item photos below. Premium menu design
   (Michelin sites, hotel menus, Noma-style) never uses rectangular
   category banners; the category is a typographic moment (serif name
   + italic intro copy) and food photos are the primary visual anchor.
   So .cat-hero becomes a small circular medallion, a decorative seal
   sitting centered above the category title. Composition reads as:
   medallion → serif title → italic intro → food items, each guiding
   the eye down. object-fit:cover on the img means a mistakenly-uploaded
   portrait dish photo crops to a harmless thumbnail rather than a
   viewport-eating banner. Fails gracefully.
   Safe: no existing restaurant renders .cat-hero (Kulhadwala + Angaraa
   have no hero_image on any Category); only newly onboarded Luxe
   categories that upload one will pick up this style. */
.cat-hero {
  width: 96px;
  height: 96px;
  margin: 4px auto 12px;
  border-radius: 50%;
  border: 1px solid var(--orderzy-border);
  box-shadow: 0 2px 8px rgba(20, 12, 4, 0.06);
  aspect-ratio: auto;
}
@media (min-width: 768px) {
  .cat-hero { width: 120px; height: 120px; margin-bottom: 16px; }
}

/* ============================================================
   House Favourites rail (Luxe only, 2026-06-19).
   Editorial discovery strip - image + name only. Each card is a
   <button> that smooth-scrolls to the matching menu-list row and
   pulses it briefly. No price, no Add, no cart state in the rail;
   the menu list below remains the single source of truth for
   ordering. Hidden entirely when no House Favourites configured.
   ============================================================ */
.menu-rail {
  margin: 16px 0 24px;
}
.menu-rail__head {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  margin: 0 0 12px;
}
.menu-rail__eyebrow {
  font-family: var(--font-display);
  font-style: italic;
  font-weight: 400;
  font-size: 15px;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--orderzy-ink-muted);
}
.menu-rail__track {
  display: flex;
  gap: 16px;
  overflow-x: auto;
  scroll-snap-type: x mandatory;
  -webkit-overflow-scrolling: touch;
  padding: 4px 4px 12px;
  scrollbar-width: thin;
  scrollbar-color: var(--orderzy-border) transparent;
}
.menu-rail__track::-webkit-scrollbar { height: 6px; }
.menu-rail__track::-webkit-scrollbar-thumb {
  background: var(--orderzy-border);
  border-radius: 3px;
}
/* Card is a native <button> so keyboard + screen-reader users get the same
   "tap to jump to dish" affordance. Reset button chrome explicitly. */
.menu-rail__card {
  flex: 0 0 240px;
  scroll-snap-align: start;
  display: flex;
  flex-direction: column;
  align-items: stretch;
  text-align: left;
  background: var(--orderzy-surface);
  border: 1px solid var(--orderzy-border);
  border-radius: var(--r-sm);
  overflow: hidden;
  padding: 0;
  margin: 0;
  font: inherit;
  color: inherit;
  cursor: pointer;
  transition: transform var(--dur-fast) var(--ease), box-shadow var(--dur-fast) var(--ease), border-color var(--dur-fast) var(--ease);
}
@media (hover: hover) {
  .menu-rail__card:hover {
    transform: translateY(-2px);
    box-shadow: 0 6px 18px rgba(0,0,0,0.08);
    border-color: color-mix(in srgb, var(--accent) 25%, var(--orderzy-border));
  }
}
.menu-rail__card:focus-visible {
  outline: 2px solid var(--accent, var(--orderzy-brand-deep));
  outline-offset: 2px;
}
.menu-rail__photo {
  position: relative;
  width: 100%;
  aspect-ratio: 16/9;
  background: var(--orderzy-surface-alt);
  overflow: hidden;
}
.menu-rail__img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
}
.menu-rail__veg {
  position: absolute;
  top: 8px;
  left: 8px;
  background: var(--orderzy-surface);
  padding: 2px;
  border-radius: 2px;
}
.menu-rail__title {
  font-family: var(--font-display);
  font-size: 19px;
  font-weight: 400;
  line-height: 1.25;
  margin: 0;
  padding: 12px 14px 14px;
  color: var(--orderzy-ink);
  /* 2-line clamp so cards stay aligned regardless of dish-name length. */
  display: -webkit-box;
  -webkit-box-orient: vertical;
  -webkit-line-clamp: 2;
  overflow: hidden;
}
@media (max-width: 520px) {
  .menu-rail__card { flex-basis: 200px; }
  .menu-rail__title { font-size: 17px; }
}
@media (max-width: 360px) {
  .menu-rail__card { flex-basis: 180px; }
  .menu-rail__title { font-size: 16px; }
}

/* Highlight pulse on the menu-list row when a rail card jumps to it.
   Soft brand-soft background that fades in fast, holds, then fades out.
   The class is added by the inline rail click handler and removed after
   1.2s. Honors prefers-reduced-motion (animation disabled, single colour
   flash so users still see the destination). */
.menu-item--highlight {
  animation: menu-item-highlight 1.2s ease-out;
  /* 2026-08-28 acceptance run: added a brand-tinted outline in addition to
     the soft background flash. The background-only pulse read too subtle
     on Warmth (brand-soft is close to the canvas colour), so a diner who
     tapped a house-favourites card wasn't sure whether the tap registered.
     The 2px outline gives a clear frame that fades in and out with the
     background. */
  outline: 2px solid transparent;
  outline-offset: -2px;
  border-radius: var(--r-md, 10px);
}
@keyframes menu-item-highlight {
  0%   { background-color: transparent; outline-color: transparent; }
  10%  { background-color: var(--orderzy-brand-soft); outline-color: var(--orderzy-brand); }
  70%  { background-color: var(--orderzy-brand-soft); outline-color: var(--orderzy-brand); }
  100% { background-color: transparent; outline-color: transparent; }
}
@media (prefers-reduced-motion: reduce) {
  .menu-item--highlight {
    animation: none;
    background-color: var(--orderzy-brand-soft);
  }
}

/* ---------- Cart + order_complete Luxe truncated chef note ---------- */
.chef-note-trunc { display: none; }
.chef-note-trunc {
  display: block;
  font-family: var(--font-body);
  font-size: 13px;
  font-style: italic;
  color: var(--orderzy-ink-muted);
  line-height: 1.4;
  margin: 2px 0 0;
}
.oc-item { align-items: flex-start; }

/* ==========================================================================
   THERMAL PRINT - Feature 5 §5.3.3
   @media print block for 80mm and 58mm thermal printers.
   Post-Luxe-unification (2026-08-14): the two-theme conditional was retired;
   these rules apply on every printed receipt. The outlet's bill_paper_size
   drives @page size (injected inline in template).
   ========================================================================== */

/* ---- Shared print resets ---- */
@media print {
  /* Hide browser chrome, nav, interactive elements */
  .oz-nav, .oz-footer, .oz-nav__drawer,
  .no-print, button, .btn,
  #toast-stack { display: none !important; }

  body { margin: 0; padding: 0; background: #fff !important; }

  /* Thermal bill container.
     Post-Luxe-unification (2026-08-14): fonts switched from Montserrat/Open Sans
     (retired) to Inter/DM Serif Display, matching the site-wide surface. */
  .thermal-bill {
    font-family: 'Inter', Arial, sans-serif;
    font-size: 11px;
    color: #1a1815;
    margin: 0;
    padding: 4mm;
    width: 100%;
  }

  .thermal-bill__brand {
    font-family: 'DM Serif Display', Georgia, serif;
    font-size: 15px;
    font-weight: 400;
    margin: 0 0 2px;
    text-align: center;
  }

  .thermal-bill__outlet {
    font-size: 11px;
    text-align: center;
    color: #6a6861;
    margin: 0 0 6px;
  }

  .thermal-bill__meta { font-size: 10px; color: #6a6861; margin-bottom: 8px; }

  .thermal-bill__items { width: 100%; border-collapse: collapse; margin-bottom: 8px; }
  .thermal-bill__items th,
  .thermal-bill__items td { font-size: 11px; padding: 2px 0; vertical-align: top; }
  .thermal-bill__items th { border-bottom: 1px dashed #999; font-weight: 700; }
  .thermal-bill__items td:last-child { text-align: right; }

  .thermal-bill__total { font-size: 13px; font-weight: 700; border-top: 1px solid #1f1d1a; padding-top: 4px; margin-top: 4px; }
  .thermal-bill__footer { font-size: 9px; color: #87867f; text-align: center; margin-top: 10px; }
  .thermal-bill__orderzy { font-size: 9px; color: #f28500; text-align: center; }
}

/* ---- Luxe 80mm: DM Serif Display brand name ---- */
@media print {
  .thermal-bill .thermal-bill__brand {
    font-family: 'DM Serif Display', Georgia, serif;
    font-weight: 400;
    font-size: 18pt;
    letter-spacing: -0.01em;
  }

  .thermal-bill .thermal-bill__outlet {
    font-family: 'DM Serif Display', Georgia, serif;
    font-weight: 400;
    font-size: 12pt;
  }

  .thermal-bill .thermal-bill__items th,
  .thermal-bill .thermal-bill__items td {
    font-family: 'Inter', -apple-system, Arial, sans-serif;
    font-variant-numeric: tabular-nums;
  }

  .thermal-bill .thermal-bill__total {
    font-family: 'Inter', -apple-system, Arial, sans-serif;
    font-weight: 700;
    font-size: 13pt;
    font-variant-numeric: tabular-nums;
    border-top: 1px solid #1a1815;
  }

  .thermal-bill .thermal-bill__footer {
    font-family: 'Inter', -apple-system, Arial, sans-serif;
    font-size: 8pt;
    color: #9a948b;
  }
}

/* ---- Luxe 58mm: Inter Bold brand name (DM Serif too thin at narrow strip) ---- */
@media print and (max-width: 58mm) {
  .thermal-bill .thermal-bill__brand {
    font-family: 'Inter', -apple-system, Arial, sans-serif;
    font-weight: 700;
    font-size: 12pt;
  }

  .thermal-bill .thermal-bill__outlet {
    font-family: 'Inter', -apple-system, Arial, sans-serif;
    font-size: 10pt;
  }
}

/* ---- Bill view page (in-app /orders/<no>/bill/) ---- */
.bv-page { padding: 32px 0 64px; }
.bv-wrap { max-width: 600px; margin: 0 auto; padding: 0 16px; }

.bv-head { margin-bottom: 24px; padding-bottom: 20px; border-bottom: 1px solid var(--orderzy-border); }
.bv-head__brand { margin-bottom: 8px; }
.bv-head__brand-name {
  display: block;
  /* Post-Luxe-unification (2026-08-14): Montserrat fallback swapped to Georgia. */
  font-family: var(--font-heading, 'DM Serif Display', Georgia, serif);
  font-size: 22px;
  font-weight: 700;
  color: var(--orderzy-ink);
}
.bv-head__outlet-name {
  display: block;
  font-size: 14px;
  color: var(--orderzy-ink-muted);
  margin-top: 2px;
}
.bv-head__address { font-size: 12px; color: var(--orderzy-ink-muted); margin: 4px 0 0; }
.bv-head__wordmark { display: flex; align-items: center; gap: 8px; margin-top: 12px; }
.bv-head__powered { font-size: 11px; color: var(--orderzy-ink-muted); }

.bv-meta { margin-bottom: 20px; }
.bv-meta__row { display: flex; justify-content: space-between; align-items: baseline; padding: 5px 0; border-bottom: 1px solid var(--orderzy-border); }
.bv-meta__label { font-size: 12px; color: var(--orderzy-ink-muted); font-weight: 500; text-transform: uppercase; letter-spacing: 0.08em; }
.bv-meta__val { font-size: 13px; color: var(--orderzy-ink); }

.bv-items__head { display: flex; gap: 8px; padding: 6px 0; border-bottom: 1px solid var(--orderzy-border); }
.bv-items__col-name { flex: 1; font-size: 12px; font-weight: 600; color: var(--orderzy-ink-muted); text-transform: uppercase; letter-spacing: 0.08em; }
.bv-items__col-qty { width: 40px; text-align: center; font-size: 12px; font-weight: 600; color: var(--orderzy-ink-muted); text-transform: uppercase; letter-spacing: 0.08em; }
.bv-items__col-price { width: 80px; text-align: right; font-size: 12px; font-weight: 600; color: var(--orderzy-ink-muted); text-transform: uppercase; letter-spacing: 0.08em; }

.bv-item { display: flex; gap: 8px; padding: 10px 0; border-bottom: 1px solid var(--orderzy-border); align-items: baseline; }
.bv-item__name { flex: 1; font-size: 14px; color: var(--orderzy-ink); }
.bv-item__chef-note { display: block; font-size: 12px; color: var(--orderzy-ink-muted); font-style: italic; margin-top: 2px; }
.bv-item__qty { width: 40px; text-align: center; font-size: 13px; color: var(--orderzy-ink-muted); font-variant-numeric: tabular-nums; }
.bv-item__price { width: 80px; text-align: right; font-size: 14px; color: var(--orderzy-ink); font-variant-numeric: tabular-nums; }

.bv-totals { margin: 16px 0 24px; }
.bv-totals__line { display: flex; justify-content: space-between; padding: 5px 0; }
.bv-totals__label { font-size: 11px; font-weight: 500; text-transform: uppercase; letter-spacing: 0.12em; color: var(--orderzy-ink-muted); }
.bv-totals__val { font-size: 13px; color: var(--orderzy-ink); font-variant-numeric: tabular-nums; }
.bv-totals__line--grand .bv-totals__label { font-size: 13px; font-weight: 700; color: var(--orderzy-ink); text-transform: none; letter-spacing: 0; }
.bv-totals__line--grand .bv-totals__val { font-size: 17px; font-weight: 700; }
.bv-totals__line--discount .bv-totals__val { color: var(--orderzy-success); }

.bv-footer { border-top: 1px solid var(--orderzy-border); padding-top: 16px; text-align: center; }
.bv-footer__text { font-size: 14px; color: var(--orderzy-ink-soft); margin: 0 0 4px; }
.bv-footer__orderzy { font-size: 11px; color: var(--orderzy-ink-muted); margin: 0; }

/* ---------- Luxe overrides for bill view (STYLEGUIDE_LUXE.md §2.9) ----------
   Spec: DM Serif Display headlines, Inter body with tabular-nums on every
   monetary column, ALL-CAPS 0.12em on labels, Inter italic for chef notes.
   Type sizes ~85% of Warmth to read as "considered" not "billboard". */
.bv-head__brand-name {
  font-family: var(--font-display, 'DM Serif Display', Georgia, serif);
  font-weight: 400;
  font-size: 32px;
  letter-spacing: -0.01em;
}
.bv-head__outlet-name {
  font-family: var(--font-display, 'DM Serif Display', Georgia, serif);
  font-weight: 400;
  font-size: 20px;
  letter-spacing: 0;
}
.bv-head__address {
  font-family: var(--font-body, 'Inter', sans-serif);
  font-size: 11px;
  color: var(--orderzy-ink-muted);
}
.bv-head__powered {
  font-family: var(--font-body, 'Inter', sans-serif);
  font-size: 9px;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--orderzy-ink-muted);
}

.bv-meta__row {
  border-bottom-color: var(--orderzy-border);
}
.bv-meta__label {
  font-family: var(--font-body, 'Inter', sans-serif);
  font-size: 11px;
  font-weight: 500;
  letter-spacing: 0.12em;
}
.bv-meta__val {
  font-family: var(--font-body, 'Inter', sans-serif);
  font-size: 11px;
  font-weight: 500;
  font-variant-numeric: tabular-nums;
}

.bv-items__head,
.bv-items__col-name,
.bv-items__col-qty,
.bv-items__col-price {
  font-family: var(--font-body, 'Inter', sans-serif);
  font-size: 11px;
  font-weight: 500;
  letter-spacing: 0.12em;
}

.bv-item {
  font-family: var(--font-body, 'Inter', sans-serif);
  border-bottom-color: var(--orderzy-border);
}
.bv-item__name { font-size: 13px; }
.bv-item__qty,
.bv-item__price {
  font-size: 13px;
  font-weight: 500;
  font-variant-numeric: tabular-nums;
}
.bv-item__chef-note {
  font-family: var(--font-body, 'Inter', sans-serif);
  font-style: italic;
  font-size: 13px;
  color: var(--orderzy-ink-muted);
}

.bv-totals__label {
  font-family: var(--font-body, 'Inter', sans-serif);
  font-size: 11px;
  font-weight: 500;
  letter-spacing: 0.12em;
  text-transform: uppercase;
}
.bv-totals__val {
  font-family: var(--font-body, 'Inter', sans-serif);
  font-size: 13px;
  font-variant-numeric: tabular-nums;
}
.bv-totals__line--grand .bv-totals__label {
  font-family: var(--font-body, 'Inter', sans-serif);
  font-size: 17px;
  font-weight: 700;
  letter-spacing: 0;
  text-transform: none;
}
.bv-totals__line--grand .bv-totals__val {
  font-family: var(--font-body, 'Inter', sans-serif);
  font-size: 17px;
  font-weight: 700;
  font-variant-numeric: tabular-nums;
}
.bv-totals__line--discount .bv-totals__val {
  color: var(--accent);
}

.bv-footer__text {
  font-family: var(--font-body, 'Inter', sans-serif);
  font-size: 13px;
  color: var(--orderzy-ink-muted);
}
.bv-footer__orderzy {
  font-family: var(--font-body, 'Inter', sans-serif);
  font-size: 9px;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--orderzy-ink-muted);
}

/* ===========================================================
   FEATURE 1 - Reservations: Luxe overrides for customer-facing
   surfaces (book, confirmation, manage, find_table).
   Layered onto the existing .rsv-* / .conf-* / .mng-* / .find-*
   classes so JS that creates buttons dynamically (book.html
   slot picker line 177 sets className 'rsv-slot'+...) keeps
   working unmodified.
   Spec: STYLEGUIDE_LUXE.md §2.4, §2.5, §3.1, §3.8, §3.9, §3.13, §3.15
   =========================================================== */

/* --- Booking flow (templates/reservations/book.html) --- */
.rsv-head__eyebrow {
  font-family: var(--font-body, 'Inter', sans-serif);
  font-size: 13px;
  letter-spacing: 0.18em;
  font-weight: 500;
  color: var(--orderzy-ink-muted);
}
.rsv-head__title {
  font-family: var(--font-display, 'DM Serif Display', Georgia, serif);
  font-weight: 400;
  font-size: 56px;
  letter-spacing: -0.02em;
  line-height: 1.15;
  color: var(--orderzy-ink);
}
.rsv-head__sub {
  font-family: var(--font-body, 'Inter', sans-serif);
  font-size: 17px;
  color: var(--orderzy-ink-muted);
  line-height: 1.5;
}
.rsv-card {
  border-color: var(--orderzy-border);
  border-radius: 8px;
  box-shadow: 0 2px 8px rgba(0,0,0,0.04);
}
.rsv-step__num {
  background: transparent;
  border: 1px solid var(--accent);
  color: var(--accent);
  font-family: var(--font-body, 'Inter', sans-serif);
  font-weight: 500;
  font-size: 13px;
  width: 24px;
  height: 24px;
}
.rsv-step__label {
  font-family: var(--font-display, 'DM Serif Display', Georgia, serif);
  font-weight: 400;
  font-size: 22px;
  letter-spacing: 0;
}
.rsv-step__hint {
  font-family: var(--font-body, 'Inter', sans-serif);
  font-size: 15px;
  color: var(--orderzy-ink-muted);
  line-height: 1.7;
}
.rsv-input,
.rsv-select {
  background: transparent;
  border: none;
  border-bottom: 1px solid var(--orderzy-border);
  border-radius: 0;
  padding: 12px 4px;
  font-family: var(--font-body, 'Inter', sans-serif);
  font-size: 17px;
  color: var(--orderzy-ink);
  transition: border-color 180ms cubic-bezier(0.4, 0, 0.2, 1);
  min-height: 48px;
}
.rsv-textarea {
  background: transparent;
  border: 1px solid var(--orderzy-border);
  border-radius: 4px;
  padding: 12px 14px;
  font-family: var(--font-body, 'Inter', sans-serif);
  font-size: 17px;
  color: var(--orderzy-ink);
}
.rsv-input:focus,
.rsv-select:focus {
  outline: none;
  border-bottom-width: 2px;
  border-bottom-color: var(--accent);
}
.rsv-textarea:focus {
  outline: 2px solid var(--accent);
  outline-offset: 2px;
  border-color: var(--accent);
}
.rsv-summary__label {
  font-family: var(--font-body, 'Inter', sans-serif);
  font-size: 13px;
  font-weight: 500;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  color: var(--orderzy-ink-muted);
}
.rsv-summary__value {
  font-family: var(--font-body, 'Inter', sans-serif);
  font-size: 17px;
  font-weight: 500;
  color: var(--orderzy-ink);
}
.rsv-summary {
  background: var(--orderzy-surface-alt);
  border-radius: 4px;
}
/* Slot chip per §3.15 - outlined square, no translate on hover */
.rsv-slot {
  background: transparent;
  border: 1px solid var(--orderzy-border);
  border-radius: 8px;
  color: var(--orderzy-ink);
  font-family: var(--font-body, 'Inter', sans-serif);
  font-weight: 500;
  font-size: 15px;
  padding: 12px 16px;
  letter-spacing: 0.04em;
  transition: border-color 200ms cubic-bezier(0.4, 0, 0.2, 1),
              background 200ms cubic-bezier(0.4, 0, 0.2, 1),
              transform 80ms;
}
.rsv-slot:hover {
  border-color: color-mix(in srgb, var(--accent) 60%, transparent);
  transform: none;
}
.rsv-slot:active { transform: scale(0.95); }
.rsv-slot[aria-pressed="true"] {
  background: color-mix(in srgb, var(--accent) 8%, transparent);
  border-color: var(--accent);
  color: var(--accent);
}
.rsv-slot__deposit {
  font-family: var(--font-body, 'Inter', sans-serif);
  font-size: 11px;
  letter-spacing: 0.12em;
  font-weight: 500;
  color: var(--orderzy-ink-muted);
  text-transform: uppercase;
}
.rsv-slot[aria-pressed="true"] .rsv-slot__deposit {
  color: var(--accent);
}
.rsv-slot--full {
  background: transparent;
  border-color: var(--orderzy-border);
  color: var(--orderzy-ink-muted);
  text-decoration: line-through;
}
.rsv-slot--full .rsv-slot__deposit {
  text-decoration: none;
  color: var(--accent);
}
/* P1.C04 (2026-08-15): .rsv-cta retired. book.html now uses
   .btn.btn--primary.btn--block for the "Confirm reservation" button. */
.rsv-msg {
  font-family: var(--font-body, 'Inter', sans-serif);
  font-size: 13px;
  color: var(--orderzy-ink-muted);
}
.rsv-msg--err { color: var(--orderzy-danger); }

/* Mobile size adjustments for booking flow */
@media (max-width: 540px) {
  .rsv-head__title { font-size: 40px; }
  .rsv-step__label { font-size: 20px; }
}

/* --- Confirmation + Manage (confirmation.html, manage.html) --- */
.conf-head__title,
.mng-head__title {
  font-family: var(--font-display, 'DM Serif Display', Georgia, serif);
  font-weight: 400;
  font-size: 56px;
  letter-spacing: -0.02em;
  line-height: 1.15;
  color: var(--orderzy-ink);
}
.conf-head__sub,
.mng-head__sub {
  font-family: var(--font-body, 'Inter', sans-serif);
  font-size: 17px;
  color: var(--orderzy-ink-muted);
  line-height: 1.5;
}
/* Outlined status badges per §3.8 - .{prefix}-badge--{state}
   specificity (0,1,1) beats the inline-style-block .conf-badge--ok (0,1,0). */
.conf-badge,
.mng-badge {
  background: transparent;
  border: 1px solid currentColor;
  font-family: var(--font-body, 'Inter', sans-serif);
  font-size: 12px;
  font-weight: 500;
  letter-spacing: 0.18em;
  padding: 4px 14px;
  text-transform: uppercase;
}
.conf-badge--ok,
.mng-badge--ok { color: var(--orderzy-success); background: transparent; }
.conf-badge--pending,
.mng-badge--pending { color: var(--orderzy-warning); background: transparent; }
.conf-badge--cancel { color: var(--orderzy-danger); background: transparent; }
.conf-card,
.mng-card {
  border-color: var(--orderzy-border);
  border-radius: 8px;
  box-shadow: 0 2px 8px rgba(0,0,0,0.04);
}
.conf-grid__cell label,
.mng-grid label {
  font-family: var(--font-body, 'Inter', sans-serif);
  font-size: 13px;
  font-weight: 500;
  letter-spacing: 0.12em;
  color: var(--orderzy-ink-muted);
}
.conf-grid__cell .conf-grid__value,
.mng-grid .mng-grid__value {
  font-family: var(--font-body, 'Inter', sans-serif);
  font-size: 22px;
  font-weight: 500;
  color: var(--orderzy-ink);
}
/* P1.C04 (2026-08-15): .mng-btn family retired. manage.html now uses
   .btn.btn--primary / .btn.btn--ghost / .btn.btn--danger from the
   canonical Wave 1 button family. .conf-btn stays defined below because
   confirmation.html still consumes it - the wider consolidation of
   .conf-* onto .btn.btn--* is a Phase 2 refactor. */
.conf-btn {
  background: transparent;
  border: 1px solid var(--orderzy-border);
  border-radius: 8px;
  color: var(--orderzy-ink);
  font-family: var(--font-body, 'Inter', sans-serif);
  font-weight: 500;
  font-size: 15px;
  letter-spacing: 0.04em;
  padding: 14px 24px;
  min-height: 48px;
  transition: border-color 320ms cubic-bezier(0.16, 1, 0.3, 1),
              color 320ms cubic-bezier(0.16, 1, 0.3, 1);
}
.conf-btn:hover {
  border-color: var(--accent);
  color: var(--accent);
}
.conf-btn--primary {
  background: transparent;
  border-color: var(--accent);
  color: var(--accent);
}
.conf-btn--primary:hover {
  background: var(--accent);
  color: var(--accent-contrast, #fdfbf7);
  opacity: 1;
}
.conf-deposit,
.mng-deposit {
  background: var(--orderzy-surface-alt);
  border-radius: 4px;
  font-family: var(--font-body, 'Inter', sans-serif);
  font-size: 15px;
}
.conf-deposit__val,
.mng-deposit__val {
  font-family: var(--font-body, 'Inter', sans-serif);
  font-weight: 500;
  font-variant-numeric: tabular-nums;
}
.conf-help,
.mng-help {
  font-family: var(--font-body, 'Inter', sans-serif);
  font-size: 15px;
  line-height: 1.7;
  color: var(--orderzy-ink-muted);
}
.conf-help a,
.mng-help a {
  color: var(--accent);
  text-underline-offset: 4px;
}
@media (max-width: 540px) {
  .conf-head__title,
  .mng-head__title { font-size: 40px; }
}

/* --- Find-a-table (find_table.html) ---
   Post-Luxe-unification (2026-08-14): every find-card renders on the single
   unified surface. The `data-theme` attribute on `.find-card` (and its scoping
   selectors) were retired alongside the two-theme system. Per-brand accent
   comes from the inline --card-brand-accent CSS variable. */
.find-head__eyebrow {
  font-family: var(--font-body, 'Inter', sans-serif);
  font-size: 13px;
  letter-spacing: 0.18em;
  font-weight: 500;
}
.find-head__title {
  font-family: var(--font-display, 'DM Serif Display', Georgia, serif);
  font-weight: 400;
  font-size: 56px;
  letter-spacing: -0.02em;
  line-height: 1.15;
}
.find-head__sub {
  font-family: var(--font-body, 'Inter', sans-serif);
  font-size: 17px;
  line-height: 1.5;
}
.find-form {
  border-color: var(--orderzy-border);
  border-radius: 8px;
  box-shadow: 0 2px 8px rgba(0,0,0,0.04);
}
.find-field label {
  font-family: var(--font-body, 'Inter', sans-serif);
  font-size: 13px;
  letter-spacing: 0.12em;
  font-weight: 500;
}
.find-input,
.find-select {
  background: transparent;
  border: none;
  border-bottom: 1px solid var(--orderzy-border);
  border-radius: 0;
  padding: 12px 4px;
  font-family: var(--font-body, 'Inter', sans-serif);
  font-size: 17px;
  transition: border-color 180ms cubic-bezier(0.4, 0, 0.2, 1);
}
.find-input:focus,
.find-select:focus {
  outline: none;
  border-bottom-width: 2px;
  border-bottom-color: var(--accent);
}
/* P1.C04 (2026-08-15): .find-btn retired. find_table.html now uses
   .btn.btn--primary for the "Find a table" submit. */
.find-empty {
  background: var(--orderzy-surface-alt);
  border-radius: 4px;
  font-family: var(--font-body, 'Inter', sans-serif);
  font-size: 15px;
  line-height: 1.7;
}
/* Card-scoped Luxe treatment for find-card on the Warmth find-table
   page. Uses --card-brand-accent which find_table.html injects per
   card from r.brand.accent_hex (line 68 of the template). */
.find-card {
  border-color: #ede5d7;
  border-radius: 8px;
  background: #fdfbf7;
  box-shadow: 0 2px 8px rgba(0,0,0,0.04);
  transition: box-shadow 600ms cubic-bezier(0.16, 1, 0.3, 1);
}
.find-card:hover {
  box-shadow: 0 8px 24px rgba(0,0,0,0.06);
}
.find-card .find-card__brand {
  font-family: 'DM Serif Display', Georgia, serif;
  font-weight: 400;
  font-size: 22px;
  letter-spacing: 0;
  color: #1a1815;
}
.find-card .find-card__meta {
  font-family: 'Inter', system-ui, sans-serif;
  font-size: 13px;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  color: #6b6760;
}
.find-card .find-card__slot {
  background: transparent;
  border: 1px solid #ede5d7;
  border-radius: 8px;
  color: #1a1815;
  font-family: 'Inter', system-ui, sans-serif;
  font-weight: 500;
  font-size: 13px;
  padding: 8px 14px;
  letter-spacing: 0.04em;
  transition: border-color 200ms, color 200ms, background 200ms;
}
.find-card .find-card__slot:hover {
  border-color: var(--card-brand-accent, #1a1815);
  color: var(--card-brand-accent, #1a1815);
  background: color-mix(in srgb, var(--card-brand-accent, #1a1815) 8%, transparent);
}

/* ===========================================================
   Order complete page Luxe overrides (templates/orders/order_complete.html)
   Layered onto existing .oc-* classes; payment JS / GA4 / hidden
   fields / payment_status reads UNCHANGED.
   Spec: STYLEGUIDE_LUXE.md §2.5 (similar to reservation confirmation
   typography) + §3.x components.
   =========================================================== */

.oc-hero {
  background: var(--orderzy-surface);
  border-color: var(--orderzy-border);
  border-radius: 8px;
  box-shadow: 0 2px 8px rgba(0,0,0,0.04);
  padding: 48px 40px;
}
/* Suppress the decorative green radial gradient - anti-pattern per
   STYLEGUIDE_LUXE.md §5.13 (no glow effects). */
.oc-hero::before { display: none; }

/* Outlined tick variants per §3.8 (status pills locked outlined). */
.oc-tick {
  background: transparent;
  border: 1px solid currentColor;
}
.oc-tick--success { color: var(--orderzy-success); }
.oc-tick--fail { color: var(--orderzy-danger); }
.oc-tick--processing { color: var(--accent); }
.oc-tick--cancelled { color: var(--orderzy-ink-muted); }

.oc-title {
  font-family: var(--font-display, 'DM Serif Display', Georgia, serif);
  font-weight: 400;
  font-size: 56px;
  letter-spacing: -0.02em;
  line-height: 1.15;
  color: var(--orderzy-ink);
}
.oc-sub {
  font-family: var(--font-body, 'Inter', sans-serif);
  font-size: 17px;
  color: var(--orderzy-ink-muted);
  line-height: 1.7;
}
.oc-number {
  background: var(--orderzy-surface-alt);
  border-radius: 4px;
  font-family: var(--font-body, 'Inter', sans-serif);
  font-weight: 500;
  font-size: 13px;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  font-variant-numeric: tabular-nums;
  color: var(--orderzy-ink);
}

.oc-status {
  border-top-color: var(--orderzy-border);
}
.oc-status__label {
  font-family: var(--font-body, 'Inter', sans-serif);
  font-size: 13px;
  font-weight: 500;
  letter-spacing: 0.18em;
}

.oc-card {
  background: var(--orderzy-surface);
  border-color: var(--orderzy-border);
  border-radius: 8px;
  box-shadow: 0 2px 8px rgba(0,0,0,0.04);
}
.oc-card__title {
  font-family: var(--font-display, 'DM Serif Display', Georgia, serif);
  font-weight: 400;
  font-size: 28px;
  letter-spacing: 0;
  color: var(--orderzy-ink);
}
.oc-card__title span {
  font-family: var(--font-body, 'Inter', sans-serif);
  font-size: 13px;
  font-weight: 500;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  color: var(--orderzy-ink-muted);
}

.oc-item {
  font-family: var(--font-body, 'Inter', sans-serif);
  font-size: 15px;
}
.oc-item__qty {
  font-family: var(--font-body, 'Inter', sans-serif);
  font-weight: 500;
  font-variant-numeric: tabular-nums;
}
.oc-item__price {
  font-family: var(--font-body, 'Inter', sans-serif);
  font-weight: 500;
  font-variant-numeric: tabular-nums;
  color: var(--orderzy-ink);
}

.oc-totals { border-top-color: var(--orderzy-border); }
.oc-totals__line {
  font-family: var(--font-body, 'Inter', sans-serif);
  font-size: 13px;
  color: var(--orderzy-ink-muted);
}
.oc-totals__line .num { font-variant-numeric: tabular-nums; }
.oc-totals__line--discount {
  color: var(--accent);
  font-weight: 500;
}
.oc-totals__line--grand {
  font-family: var(--font-body, 'Inter', sans-serif);
  font-weight: 700;
  font-size: 17px;
  color: var(--orderzy-ink);
  border-top-color: var(--orderzy-border);
}

/* Payment-confirmed pill - outlined accent instead of filled green. */
.oc-paid {
  background: transparent;
  border: 1px solid var(--orderzy-success);
  color: var(--orderzy-success);
  border-radius: 4px;
  font-family: var(--font-body, 'Inter', sans-serif);
  font-size: 13px;
  font-weight: 500;
  font-variant-numeric: tabular-nums;
}

/* Referral nudge card - lift the Warmth orange treatment in Luxe. */
.oc-referral { background: var(--orderzy-surface-alt); }
.oc-referral__head {
  font-family: var(--font-display, 'DM Serif Display', Georgia, serif);
  font-weight: 400;
  font-size: 22px;
  color: var(--orderzy-ink);
  letter-spacing: 0;
}
.oc-referral__body {
  font-family: var(--font-body, 'Inter', sans-serif);
  font-size: 15px;
  line-height: 1.7;
  color: var(--orderzy-ink-muted);
}

@media (max-width: 540px) {
  .oc-title { font-size: 40px; }
  .oc-hero { padding: 32px 24px; }
  .oc-card__title { font-size: 24px; }
}

/* ===========================================================
   Checkout flow Luxe overrides (templates/marketplace/checkout.html)
   PAYMENT-ADJACENT - CSS-ONLY. Form structure / hidden fields /
   JS / Cashfree SDK init / submission logic / GA4 begin_checkout
   are UNCHANGED. The template has 55 inline style= attributes; we
   layer Luxe classes onto the surrounding wrappers so JS hooks
   (id=checkout-form, name=payment_method, name=guest_*, etc.)
   keep functioning.
   Spec: STYLEGUIDE_LUXE.md §2.3 cart/checkout typography,
   §2.8 customer info forms, §3.1 outlined buttons, §3.9 inputs.
   =========================================================== */

.co-title {
  font-family: var(--font-display, 'DM Serif Display', Georgia, serif);
  font-weight: 400;
  font-size: 56px;
  letter-spacing: -0.02em;
  line-height: 1.15;
  color: var(--orderzy-ink);
}
.co-subtitle {
  font-family: var(--font-body, 'Inter', sans-serif);
  font-size: 17px;
  color: var(--orderzy-ink-muted);
}

/* Card-box: flatter, sharper corners */
.card-box {
  background: var(--orderzy-surface);
  border-color: var(--orderzy-border);
  border-radius: 8px;
  box-shadow: 0 2px 8px rgba(0,0,0,0.04);
  padding: 24px 28px;
}
.card-box__title {
  font-family: var(--font-display, 'DM Serif Display', Georgia, serif);
  font-weight: 400;
  font-size: 28px;
  letter-spacing: 0;
  color: var(--orderzy-ink);
}

/* Form fields per §3.9 - underline-only, large hit target.
   Inline width/padding from form-input itself stays; we add font + border. */
.form-input,
.input {
  background: transparent;
  border: none;
  border-bottom: 1px solid var(--orderzy-border);
  border-radius: 0;
  padding: 12px 4px;
  font-family: var(--font-body, 'Inter', sans-serif);
  font-size: 17px;
  color: var(--orderzy-ink);
  min-height: 48px;
  transition: border-color 180ms cubic-bezier(0.4, 0, 0.2, 1);
}
.form-input:focus,
.input:focus {
  outline: none;
  border-bottom-width: 2px;
  border-bottom-color: var(--accent);
  box-shadow: none;
}
.form-input.error,
.input.error,
.form-input[aria-invalid="true"],
.input[aria-invalid="true"] {
  border-bottom-color: var(--orderzy-danger);
}

/* Form labels per §2.8 - Inter 13 ALL-CAPS 0.12em */
.form-label,
.input-label {
  font-family: var(--font-body, 'Inter', sans-serif);
  font-size: 13px;
  font-weight: 500;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  color: var(--orderzy-ink-muted);
}

/* Contact readonly + helper line */
.contact-readonly-name {
  font-family: var(--font-display, 'DM Serif Display', Georgia, serif);
  font-weight: 400;
  font-size: 22px;
  letter-spacing: 0;
}
.contact-readonly-phone {
  font-family: var(--font-body, 'Inter', sans-serif);
  font-size: 13px;
  color: var(--orderzy-ink-muted);
}
.form-hint {
  font-family: var(--font-body, 'Inter', sans-serif);
  font-style: italic;
  font-size: 13px;
}
.form-error {
  font-family: var(--font-body, 'Inter', sans-serif);
  font-size: 13px;
  font-weight: 500;
  color: var(--orderzy-danger);
}

/* Table / Parcel badges: neutralize the hardcoded purple + orange
   from the inline styles. !important needed because inline style
   beats class without it. */
.table-badge {
  background: var(--orderzy-surface-alt) !important;
  border: 1px solid var(--orderzy-border) !important;
  color: var(--orderzy-ink) !important;
  font-family: var(--font-body, 'Inter', sans-serif) !important;
  font-weight: 500 !important;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  border-radius: 4px !important;
}

/* Order summary collapsible header */
.order-summary-header {
  font-family: var(--font-body, 'Inter', sans-serif);
}
.order-summary-title {
  font-family: var(--font-body, 'Inter', sans-serif);
  font-weight: 500;
  font-variant-numeric: tabular-nums;
}
.order-summary-toggle {
  color: var(--accent) !important;
  font-family: var(--font-body, 'Inter', sans-serif);
  font-weight: 500 !important;
  letter-spacing: 0.04em;
}
.order-summary-item {
  font-family: var(--font-body, 'Inter', sans-serif);
}
.order-summary-item .num {
  font-variant-numeric: tabular-nums;
}

/* Coupon section per §3.x */
.coupon-section { /* inherits .card-box */ }
.coupon-label,
.coupon-toggle {
  font-family: var(--font-body, 'Inter', sans-serif);
  font-weight: 500;
}
.coupon-toggle {
  color: var(--accent) !important;
  letter-spacing: 0.04em;
}
.coupon-input {
  border: 1px solid var(--orderzy-border) !important;
  background: var(--orderzy-surface-alt) !important;
  color: var(--orderzy-ink) !important;
  border-radius: 4px !important;
  font-family: var(--font-body, 'Inter', sans-serif) !important;
  letter-spacing: 0.12em !important;
}
.coupon-apply-btn {
  background: transparent !important;
  border: 1px solid var(--accent) !important;
  color: var(--accent) !important;
  border-radius: 4px !important;
  font-family: var(--font-body, 'Inter', sans-serif) !important;
  font-weight: 500 !important;
}
.coupon-apply-btn:hover {
  background: var(--accent) !important;
  color: var(--accent-contrast, #fdfbf7) !important;
}

/* Timing change "Now / +15 / +30 / +1hr" buttons - already get .btn
   variants via JS, but the inline classes use .timing-option. Layer
   Luxe styling. */
.timing-option {
  background: transparent;
  border: 1px solid var(--orderzy-border);
  color: var(--orderzy-ink);
  font-family: var(--font-body, 'Inter', sans-serif);
  font-weight: 500;
  border-radius: 4px;
  padding: 8px 16px;
  letter-spacing: 0.04em;
}
.timing-option.selected {
  background: color-mix(in srgb, var(--accent) 8%, transparent);
  border-color: var(--accent);
  color: var(--accent);
}

/* Price breakdown */
.price-line {
  font-family: var(--font-body, 'Inter', sans-serif);
  font-size: 13px;
  color: var(--orderzy-ink-muted);
}
.price-line .num {
  font-variant-numeric: tabular-nums;
}
.price-line.total {
  font-family: var(--font-body, 'Inter', sans-serif) !important;
  font-weight: 700;
  font-size: 28px !important;
  color: var(--orderzy-ink) !important;
  border-top-color: var(--orderzy-border);
}
.price-line.discount {
  color: var(--accent) !important;
}

.savings-banner {
  background: transparent !important;
  border: 1px solid var(--orderzy-success) !important;
  color: var(--orderzy-success) !important;
  border-radius: 4px !important;
  font-family: var(--font-body, 'Inter', sans-serif) !important;
  font-size: 13px !important;
  letter-spacing: 0.12em;
  text-transform: uppercase;
}

/* Payment option card per §3.x */
.pay-option {
  background: transparent;
  border: 1px solid var(--orderzy-border);
  border-radius: 8px;
  padding: 16px 20px;
  transition: border-color 320ms cubic-bezier(0.16, 1, 0.3, 1);
}
.pay-option:hover { border-color: var(--accent); }
.pay-option.selected {
  background: color-mix(in srgb, var(--accent) 6%, transparent);
  border-color: var(--accent);
  box-shadow: none;
}
.pay-option__radio {
  border-color: var(--orderzy-border);
}
.pay-option.selected .pay-option__radio {
  border-color: var(--accent);
}
.pay-option.selected .pay-option__radio::after {
  background: var(--accent);
}
.pay-option__title {
  font-family: var(--font-display, 'DM Serif Display', Georgia, serif);
  font-weight: 400;
  font-size: 22px;
  letter-spacing: 0;
}
.pay-option__sub {
  font-family: var(--font-body, 'Inter', sans-serif);
  font-size: 13px;
  color: var(--orderzy-ink-muted);
}

/* Pay-at-end info card */
.pay-at-end-info {
  font-family: var(--font-body, 'Inter', sans-serif);
  font-size: 15px;
  color: var(--orderzy-ink-muted);
}

/* Sticky right-side order summary */
.summary {
  background: var(--orderzy-surface);
  border-color: var(--orderzy-border);
  border-radius: 8px;
  box-shadow: 0 2px 8px rgba(0,0,0,0.04);
  padding: 32px;
}
.summary__title {
  font-family: var(--font-display, 'DM Serif Display', Georgia, serif);
  font-weight: 400;
  font-size: 32px;
  letter-spacing: 0;
  margin-bottom: 4px;
}
.summary__rest {
  font-family: var(--font-body, 'Inter', sans-serif);
  font-size: 13px;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  color: var(--orderzy-ink-muted);
  margin-bottom: 24px;
}
.summary__item {
  font-family: var(--font-body, 'Inter', sans-serif);
  font-size: 15px;
  align-items: center;
}
.summary__item-name { font-family: var(--font-display, 'DM Serif Display', Georgia, serif); font-weight: 400; font-size: 17px; line-height: 1.3; }
.summary__item-qty {
  font-family: var(--font-body, 'Inter', sans-serif);
  font-weight: 500;
  font-variant-numeric: tabular-nums;
  color: var(--orderzy-ink-muted);
}
.summary__item .price,
.summary__line .price,
.summary__line .total {
  font-family: var(--font-body, 'Inter', sans-serif);
  font-variant-numeric: tabular-nums;
}
.summary__divider { border-top-color: var(--orderzy-border); }
.summary__line {
  font-family: var(--font-body, 'Inter', sans-serif);
  font-size: 15px;
  color: var(--orderzy-ink-muted);
}
.summary__line--total {
  font-family: var(--font-body, 'Inter', sans-serif);
  font-weight: 700;
  font-size: 28px;
  color: var(--orderzy-ink);
  border-top-color: var(--orderzy-border);
}
.summary__trust {
  font-family: var(--font-body, 'Inter', sans-serif);
  font-size: 11px;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: var(--orderzy-ink-muted);
}

/* 2026-08-22: Luxe-era outlined-accent override deleted. Was making the checkout
   Pay button render as a transparent ghost while the cart Proceed-to-Checkout
   stayed solid-filled, so the checkout CTA read weaker than the payment selector
   under it. With this block gone, both buttons inherit .btn.btn--primary (solid
   accent fill, .num keeps tabular-nums via the site-wide .num rule). */

/* "Edit" / "View" / "Change" / "Login" mini-links - shift orange to accent.
   These have inline color via var(--orderzy-brand-ink), so we use !important. */
.contact-edit-link,
.contact-fields a {
  color: var(--accent) !important;
  font-family: var(--font-body, 'Inter', sans-serif);
  font-weight: 500 !important;
  letter-spacing: 0.04em;
  text-decoration: none;
}
.contact-edit-link:hover,
.contact-fields a:hover {
  text-decoration: underline;
  text-underline-offset: 4px;
}

@media (max-width: 540px) {
  .co-title { font-size: 40px; }
  .card-box { padding: 20px 22px; }
  .card-box__title { font-size: 24px; }
  .summary { padding: 24px; }
  .summary__title { font-size: 28px; }
  .summary__line--total,
  .price-line.total { font-size: 24px !important; }
}

/* ===========================================================
   HALF / FULL portion UX - Session C
   Customer-facing pill + Luxe variant toggle. The kitchen
   ticket badge lives in pending__orders.html (admin-only).
   =========================================================== */

/* ---------- [HALF] pill (cart row + bill view) ----------
   Same outlined treatment as the staff POS + kitchen ticket badge,
   so customer + staff see one visual language for "half portion". */
.oz-half-pill {
  display: inline-block;
  margin-left: 6px;
  padding: 1px 6px;
  border: 1px solid var(--orderzy-line, #d8d2c3);
  border-radius: 9999px;
  font-family: var(--font-heading);
  font-size: 9px;
  font-weight: 700;
  letter-spacing: 0.08em;
  color: var(--orderzy-ink-soft, #6b6760);
  background: var(--orderzy-surface-alt, #faf8f4);
  vertical-align: 1px;
  text-transform: uppercase;
  line-height: 1.4;
  text-decoration: none;
}

/* Luxe overrides: serif typography is fine for short ALL-CAPS labels.
   Slightly larger + tighter tracking matches the brand chips on Luxe menus. */
.oz-half-pill {
  font-size: 10px;
  letter-spacing: 0.12em;
  border-color: rgba(26, 24, 21, 0.18);
  color: #1a1815;
  background: transparent;
}

/* .oz-variant-pill is the generalisation of .oz-half-pill for multi-variant
   pricing (2026-09-04). Same visual language, dynamic label. Kept as an
   alias so any surface that still hardcodes .oz-half-pill keeps rendering. */
.oz-variant-pill {
  display: inline-block;
  margin-left: 6px;
  padding: 1px 6px;
  border: 1px solid var(--orderzy-line, #d8d2c3);
  border-radius: 9999px;
  font-family: var(--font-heading);
  font-size: 10px;
  font-weight: 700;
  letter-spacing: 0.10em;
  color: var(--orderzy-ink-soft, #6b6760);
  background: var(--orderzy-surface-alt, #faf8f4);
  vertical-align: 1px;
  text-transform: uppercase;
  line-height: 1.4;
  text-decoration: none;
}

/* Customer menu tile pill toggle (multi-variant pricing 2026-09-04).
   Row of size buttons above a single Add stepper. Tapping a pill rewrites
   the stepper's data-url + qty display via oz-variant-toggle.js. */
.oz-variant-toggle {
  display: flex;
  flex-wrap: wrap;
  gap: 6px;
  margin-bottom: 8px;
  justify-content: flex-end;
}
.oz-variant-toggle .oz-variant-pill {
  cursor: pointer;
  border: 1px solid var(--orderzy-line, #d8d2c3);
  background: var(--orderzy-surface-alt, #faf8f4);
  color: var(--orderzy-ink-soft, #6b6760);
  padding: 4px 10px;
  min-height: 28px;
  font-size: 11px;
  font-weight: 700;
  border-radius: 9999px;
  transition: background 120ms ease, color 120ms ease, border-color 120ms ease;
}
.oz-variant-toggle .oz-variant-pill.is-active {
  background: var(--orderzy-accent-solid, #b06a2a);
  color: #fff;
  border-color: var(--orderzy-accent-solid, #b06a2a);
}
/* 2026-09-06 permanent fix (latent bug #6): glanceable cart state on
   inactive pills. When a diner has, say, MINI=2 in cart and switches
   to the FULL pill to browse, they used to have no signal that MINI
   was still in cart -- easy to forget and duplicate an order.
   Now every inactive pill with qty>0 shows a small "· N" suffix
   (rendered via CSS `attr(data-qty)`) so the whole variant row reads
   the cart state at a glance. Active pill hides it -- the stepper
   below already shows the qty for the selected variant.
   The data-qty attribute is kept fresh by menu-row.js dispatching
   `orderzy:variant-qty-changed` on every mutation; oz-variant-toggle.js
   listens and updates the matching pill's data-qty, and this rule
   re-renders automatically because CSS attribute selectors are live. */
.oz-variant-toggle .oz-variant-pill:not(.is-active):not([data-qty="0"]):not([data-qty=""])::after {
  content: " · " attr(data-qty);
  font-weight: 700;
  color: var(--orderzy-accent-solid, #b06a2a);
  margin-left: 2px;
}
.oz-variant-add {
  display: flex;
  align-items: center;
  gap: 8px;
  justify-content: flex-end;
}
.oz-variant-add__price {
  font-weight: 700;
  color: var(--orderzy-ink, #1a1815);
  font-size: 15px;
  font-variant-numeric: tabular-nums;
}

/* ---------- Variant row layout (Full + Half side-by-side controls) ----------
   Replaces the earlier active-variant pill toggle (Session C, scrapped 2026-06-15).
   Each variant gets its own row with label + price + Add/stepper. Customer can
   add 1 Full and 1 Half independently without "switching" the active variant -
   answers the "how do I order 1F + 1H?" question by making both options always
   visible. Warmth uses muted-text labels; Luxe overrides to serif + outlined. */
.menu-item__variants {
  display: flex;
  flex-direction: column;
  align-items: stretch;
  gap: 6px;
  width: 100%;
}

/* 2026-08-22: was flex-direction:row (implicit) with justify-content:flex-end;
   label + control sat on one line inside the 140px .menu-item__media column,
   which forced the variant qty-stepper__btn down to 28x28 to fit. Stacked
   column layout lets the standard-size .menu-item__add / .qty-stepper reuse
   verbatim; the label sits above the control, both right-aligned so the
   control still lines up under the food photo. */
.oz-variant-row {
  display: flex;
  flex-direction: column;
  align-items: flex-end;
  gap: 6px;
}

.oz-variant-row__label {
  font-family: var(--font-heading);
  font-size: 11px;
  font-weight: 600;
  letter-spacing: 0.04em;
  text-transform: uppercase;
  color: var(--orderzy-ink-muted);
  white-space: nowrap;
  display: inline-flex;
  align-items: baseline;
  gap: 6px;
}

.oz-variant-row__price {
  font-family: var(--font-body);
  font-size: 12px;
  font-weight: 700;
  letter-spacing: 0;
  text-transform: none;
  color: var(--orderzy-ink);
}

/* Luxe override: serif label, tighter tracking, accent-colored price. */
.oz-variant-row__label {
  font-family: var(--font-display, "DM Serif Display", Georgia, serif);
  font-size: 13px;
  font-weight: 400;
  letter-spacing: 0.04em;
  text-transform: none;
  color: var(--orderzy-ink, #1a1815);
}

.oz-variant-row__price {
  font-family: var(--font-body, "Inter", sans-serif);
  font-size: 12px;
  font-weight: 600;
  color: var(--accent, var(--orderzy-brand-deep));
}

@media (max-width: 540px) {
  .oz-variant-row { gap: 6px; }
  .oz-variant-row__label { font-size: 10px; }
  .oz-variant-row__price { font-size: 11px; }
}

/* ============================================================
   Homepage: 'Why Orderzy' editorial pull quote (2026-06-19).
   Replaces the plain centered paragraph that read as an orphan
   between the restaurants grid and How-It-Works steps. Treated
   as a founder/brand statement: warm brand-soft card, eyebrow
   label, large brand-orange open-quote glyph behind italic
   serif body. Matches the literate voice of the copy itself.
   ============================================================ */
.why-orderzy {
  padding: 64px 0 48px;
  background: var(--orderzy-canvas);
}
.why-orderzy__container {
  display: flex;
  justify-content: center;
}
.why-orderzy__card {
  position: relative;
  max-width: 620px;
  width: 100%;
  padding: 48px 48px 44px;
  background: var(--orderzy-brand-soft);
  border-radius: var(--r-md);
  /* Whisper shadow so the card lifts off the cream canvas without floating. */
  box-shadow: 0 1px 0 0 rgba(184, 102, 0, 0.04),
              0 2px 12px rgba(184, 102, 0, 0.04);
  text-align: center;
  overflow: hidden;
}
.why-orderzy__eyebrow {
  display: inline-block;
  font-family: var(--font-heading);
  font-size: 11px;
  font-weight: 700;
  letter-spacing: 0.22em;
  text-transform: uppercase;
  color: var(--orderzy-brand-ink);
  margin: 0 0 28px;
}
/* Large open-quote glyph anchors the top-left of the card. Behind the body
   text (z-index), low opacity so it reads as decorative texture, not loud. */
.why-orderzy__quote-mark {
  position: absolute;
  top: 4px;
  left: 24px;
  font-family: "DM Serif Display", Georgia, serif;
  font-size: 160px;
  line-height: 1;
  color: var(--orderzy-brand);
  opacity: 0.14;
  pointer-events: none;
  user-select: none;
  z-index: 0;
}
.why-orderzy__body {
  font-family: "DM Serif Display", Georgia, serif;
  font-style: italic;
  font-size: 22px;
  font-weight: 400;
  line-height: 1.55;
  color: var(--orderzy-ink);
  margin: 0;
  position: relative;
  z-index: 1;
}
@media (max-width: 640px) {
  .why-orderzy { padding: 48px 0 32px; }
  .why-orderzy__card { padding: 36px 28px 32px; }
  .why-orderzy__quote-mark { font-size: 110px; top: 0; left: 12px; }
  .why-orderzy__body { font-size: 19px; line-height: 1.5; }
  .why-orderzy__eyebrow { margin-bottom: 22px; font-size: 10.5px; }
}

/* ===========================================================
   Phase 2 P2.C02: Design System Wave 2 mobile primitives
   -----------------------------------------------------------
   Three reusable components subsequent Phase 2 commits consume:
     .oz-sheet--bottom  : bottom sheet (checkout expand, variant popover, cart)
     .oz-farebar        : sticky-bottom expanding total bar (Uber pattern)
     .oz-cardstack      : horizontal scroll-snap card stack (comparison, reviews)
   Companion JS: orderzy/static/js/oz-mobile-primitives.js.
   Each primitive: 100dvh-safe, respects env(safe-area-inset-*), honors
   prefers-reduced-motion. Desktop keeps the class-target rendering styles
   inert unless the JS explicitly opens/expands.
   =========================================================== */

/* -------- .oz-sheet--bottom -------- */
.oz-sheet--bottom {
  position: fixed;
  left: 0;
  right: 0;
  bottom: 0;
  z-index: var(--z-modal);
  transform: translateY(100%);
  transition: transform 240ms ease-out;
  background: var(--orderzy-surface, #ffffff);
  color: var(--orderzy-ink, #1a1815);
  border-top-left-radius: 16px;
  border-top-right-radius: 16px;
  box-shadow: 0 -12px 40px rgba(26, 24, 21, 0.18);
  max-height: min(88dvh, 720px);
  overflow-y: auto;
  padding: 8px 20px calc(20px + env(safe-area-inset-bottom));
  will-change: transform;
}
.oz-sheet--bottom[aria-hidden="false"] { transform: translateY(0); }
.oz-sheet__handle {
  display: block;
  width: 44px;
  height: 4px;
  margin: 6px auto 12px;
  border-radius: 3px;
  background: var(--orderzy-border-strong, #d4cdc0);
}
.oz-sheet__title {
  font-family: var(--font-heading, Georgia, serif);
  font-size: 22px;
  line-height: 1.2;
  margin: 0 0 12px;
  color: var(--orderzy-ink, #1a1815);
}
.oz-sheet__close {
  position: absolute;
  top: 12px;
  right: 12px;
  width: 44px;
  height: 44px;
  border: 0;
  background: transparent;
  color: var(--orderzy-ink-soft, #6b6760);
  font-size: 22px;
  line-height: 1;
  cursor: pointer;
  border-radius: 50%;
}
.oz-sheet__close:focus-visible {
  outline: 2px solid var(--orderzy-brand, #f28500);
  outline-offset: 2px;
}
.oz-sheet__backdrop {
  position: fixed;
  inset: 0;
  z-index: var(--z-modal-backdrop);
  background: rgba(26, 24, 21, 0.4);
  opacity: 0;
  pointer-events: none;
  transition: opacity 240ms ease-out;
}
.oz-sheet__backdrop[aria-hidden="false"] {
  opacity: 1;
  pointer-events: auto;
}

/* -------- .oz-farebar (sticky bottom expanding fare bar) -------- */
.oz-farebar {
  position: fixed;
  left: 0;
  right: 0;
  bottom: 0;
  z-index: var(--z-fab);
  background: var(--orderzy-surface, #ffffff);
  border-top: 1px solid var(--orderzy-border, #ede5d7);
  box-shadow: 0 -6px 24px rgba(26, 24, 21, 0.10);
  padding: 12px 16px calc(12px + env(safe-area-inset-bottom));
  display: none;
}
.oz-farebar[aria-hidden="false"] { display: block; }
.oz-farebar__row {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 12px;
  min-height: 44px;
}
.oz-farebar__label {
  flex: 1 1 auto;
  min-width: 0;
  display: flex;
  align-items: center;
  gap: 8px;
  background: transparent;
  border: 0;
  padding: 0;
  font-family: var(--font-body, Inter, system-ui);
  font-size: 15px;
  color: var(--orderzy-ink, #1a1815);
  cursor: pointer;
  text-align: left;
}
.oz-farebar__label:focus-visible {
  outline: 2px solid var(--orderzy-brand, #f28500);
  outline-offset: 4px;
  border-radius: 6px;
}
.oz-farebar__caret {
  display: inline-block;
  width: 12px;
  height: 12px;
  transition: transform 200ms ease-out;
}
.oz-farebar[aria-expanded="true"] .oz-farebar__caret {
  transform: rotate(180deg);
}
.oz-farebar__cta {
  flex: 0 0 auto;
  min-width: 128px;
  height: 44px;
  padding: 0 18px;
  font-family: var(--font-body, Inter, system-ui);
  font-weight: 700;
  font-size: 15px;
  border-radius: 8px;
  border: 1px solid var(--accent, #b86600);
  background: var(--accent, #b86600);
  color: var(--accent-contrast, #fdfbf7);
  cursor: pointer;
}
.oz-farebar__cta:focus-visible {
  outline: 2px solid var(--orderzy-brand, #f28500);
  outline-offset: 3px;
}
.oz-farebar__expand {
  max-height: 0;
  overflow: hidden;
  transition: max-height 240ms ease-out;
  border-top: 1px solid transparent;
}
.oz-farebar[aria-expanded="true"] .oz-farebar__expand {
  max-height: 320px;
  border-top-color: var(--orderzy-border-soft, rgba(26, 24, 21, 0.08));
  padding-top: 12px;
  margin-top: 8px;
}
.oz-farebar__line {
  display: flex;
  justify-content: space-between;
  font-size: 14px;
  color: var(--orderzy-ink-soft, #6b6760);
  padding: 4px 0;
}
.oz-farebar__line--total {
  font-weight: 700;
  color: var(--orderzy-ink, #1a1815);
  border-top: 1px solid var(--orderzy-border-soft, rgba(26, 24, 21, 0.08));
  padding-top: 8px;
  margin-top: 4px;
}
.oz-farebar__trust {
  font-size: 12px;
  color: var(--orderzy-ink-muted, #9a948b);
  padding-top: 8px;
  text-align: center;
}

/* -------- .oz-cardstack (horizontal scroll-snap) -------- */
.oz-cardstack {
  display: flex;
  gap: 12px;
  overflow-x: auto;
  scroll-snap-type: x mandatory;
  scroll-padding: 16px;
  padding: 8px 16px 20px;
  -webkit-overflow-scrolling: touch;
  scrollbar-width: none;
}
.oz-cardstack::-webkit-scrollbar { display: none; }
.oz-cardstack__card {
  flex: 0 0 88%;
  scroll-snap-align: start;
  background: var(--orderzy-surface, #ffffff);
  border: 1px solid var(--orderzy-border, #ede5d7);
  border-radius: 12px;
  padding: 20px;
  min-height: 200px;
  box-shadow: 0 2px 8px rgba(26, 24, 21, 0.04);
}
.oz-cardstack__card:last-child { margin-right: 0; }
.oz-cardstack__dots {
  display: flex;
  gap: 6px;
  justify-content: center;
  padding: 8px 0 0;
}
.oz-cardstack__dot {
  width: 8px;
  height: 8px;
  border-radius: 50%;
  background: var(--orderzy-border-strong, #d4cdc0);
  transition: background 160ms ease-out;
  border: 0;
  padding: 0;
}
.oz-cardstack__dot[aria-current="true"] {
  background: var(--accent, #b86600);
}

/* -------- Reduced motion: collapse transitions -------- */
@media (prefers-reduced-motion: reduce) {
  .oz-sheet--bottom,
  .oz-sheet__backdrop,
  .oz-farebar__caret,
  .oz-farebar__expand,
  .oz-cardstack__dot {
    transition: none;
  }
}

/* ===========================================================
   Phase 2 P2.C05: Restaurant detail chip compression,
   mobile chip strip, Call Waiter FAB, sticky Get Bill.
   =========================================================== */

/* Menu-item tag chip compression: only the first 2 visible chips render
   inline; the rest hide behind a "+ N more" summary. JS in the detail
   template unhides them when the details is opened. Fallback (no-JS): the
   details stays closed so the extra chips don't render. */
.menu-item__tags[data-oz-compressed="true"] > *:nth-child(n+3):not(.menu-item__tags-more) {
  display: none;
}
.menu-item__tags[data-oz-compressed="true"][data-oz-expanded="true"] > * {
  display: inline-flex;
}
.menu-item__tags-more {
  cursor: pointer;
  padding: 2px 8px;
  border-radius: 9999px;
  background: var(--orderzy-surface-alt, #f6f0e6);
  color: var(--orderzy-ink-soft, #6b6760);
  border: 0;
  font-family: inherit;
  font-size: inherit;
  font-weight: inherit;
}
.menu-item__tags-more:focus-visible {
  outline: 2px solid var(--orderzy-brand, #f28500);
  outline-offset: 2px;
}

/* Mobile Level 2: replaces the desktop sidebar with a sticky top category
   chip strip at <=880px. .cat-nav__mobile-strip is a horizontal scroll
   container that renders BELOW the rest-hero and floats on scroll.
   Breakpoint widened from 767 to 880 on 2026-08-28 (audit F.22) so the
   pill strip lines up with the sidebar-hide breakpoint above. Prior to
   the audit fix, the sidebar re-flowed as a horizontal underlined-tab
   row at <=880 and the pill strip rendered at <=767, so two strips
   showed on <=767 (F.22 duplicate) and no strip showed on 768-880
   (bare menu with no category navigation). Single strip everywhere now. */
.cat-nav__mobile-strip { display: none; }
@media (max-width: 880px) {
  .cat-nav__mobile-strip {
    display: flex;
    gap: 8px;
    overflow-x: auto;
    padding: 8px 16px;
    position: sticky;
    top: 60px;
    z-index: var(--z-sticky-strip);
    background: var(--orderzy-canvas, #fdfbf7);
    border-bottom: 1px solid var(--orderzy-border-soft, rgba(26,24,21,0.08));
    scrollbar-width: none;
  }
  .cat-nav__mobile-strip::-webkit-scrollbar { display: none; }
  .cat-nav__mobile-strip-chip {
    flex: 0 0 auto;
    padding: 8px 14px;
    border-radius: 999px;
    background: var(--orderzy-surface, #ffffff);
    border: 1px solid var(--orderzy-border, #ede5d7);
    color: var(--orderzy-ink, #1a1815);
    font-family: var(--font-body, Inter, system-ui);
    font-size: 13px;
    font-weight: 600;
    white-space: nowrap;
    cursor: pointer;
  }
  .cat-nav__mobile-strip-chip.is-active {
    background: var(--accent, #b86600);
    color: var(--accent-contrast, #fdfbf7);
    border-color: var(--accent, #b86600);
  }
}

/* Call Staff FAB (Commit B, 2026-08-31 customer menu surface cleanup;
   layout ownership moved 2026-09-01).
   Renders bottom-right whenever the diner is in an active QR session at
   an outlet that enables the affordance. Visible mobile + tablet; hidden
   on desktop (>=1025px) via .oz-bottom-stack__fab-row @media rule -
   see Q2 rationale near the .oz-bottom-stack block. Shape is a rounded-
   rect (icon + label stacked); always-on label makes the button self-
   explanatory and kills the AI-chatbot misread the speech-bubble icon
   caused. Positioning is 100% owned by .oz-bottom-stack; this rule
   handles only visual styling. */
.oz-fab-callwaiter {
  /* 2026-09-01 permanent stacking fix: the pill no longer positions
     itself; it lives inside .oz-bottom-stack__fab-row which right-aligns
     it via flex. `position`, `bottom`, `right`, and `z-index` moved to
     the parent container. All 4 magic numbers (72 / 180 / 40 / 8) that
     used to coordinate FAB / cart-bar / get-bill positions are gone. */
  display: inline-flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: 3px;
  min-width: 56px;
  padding: 8px 10px 6px;
  border-radius: 14px;
  background: var(--orderzy-surface, #ffffff);
  color: var(--orderzy-ink, #1a1815);
  border: 1px solid var(--orderzy-border, #ede5d7);
  box-shadow: 0 8px 24px rgba(26, 24, 21, 0.16);
  cursor: pointer;
  font-family: inherit;
  line-height: 1;
}
.oz-fab-callwaiter__icon {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 26px;
  height: 26px;
  color: var(--orderzy-brand-ink, #7a4500);
}
.oz-fab-callwaiter__label {
  font-size: 10.5px;
  font-weight: 700;
  letter-spacing: 0.02em;
  color: var(--orderzy-ink, #1a1815);
  white-space: nowrap;
}
.oz-fab-callwaiter:hover {
  background: var(--orderzy-surface-alt, #faf6ed);
}
.oz-fab-callwaiter:focus-visible {
  outline: 2px solid var(--orderzy-brand, #f28500);
  outline-offset: 3px;
}
.oz-fab-callwaiter:disabled {
  cursor: not-allowed;
}

/* Mobile sticky Get Bill button. Rendered by the template when the diner
   has an active AT_END session with at-least-one-placed-order. Lives as
   the last flex-column child of .oz-bottom-stack, edge-to-edge, with its
   own padding-bottom absorbing the safe-area (the container yields its
   own padding-bottom to us via :has() so we don't double up). Below the
   767px cutoff only; on tablet+ the top-of-menu .oz-active-session-card
   is the surface instead (design invariant: one Get-Bill surface per
   breakpoint). 2026-09-01: position/left/right/bottom/z-index removed
   as part of the permanent flex-column stacking fix. */
.oz-getbill-sticky {
  display: none;
  padding: 12px 16px calc(12px + env(safe-area-inset-bottom));
  background: var(--orderzy-surface, #ffffff);
  border-top: 1px solid var(--orderzy-border, #ede5d7);
  box-shadow: 0 -6px 24px rgba(26, 24, 21, 0.08);
}
.oz-getbill-sticky__btn {
  display: block;
  width: 100%;
  height: 48px;
  background: var(--orderzy-success, #4a6b3a);
  color: #ffffff;
  border: 0;
  border-radius: 8px;
  font-family: var(--font-body, Inter, system-ui);
  font-weight: 700;
  font-size: 15px;
  text-align: center;
  text-decoration: none;
  line-height: 48px;
}
.oz-getbill-sticky__btn:focus-visible {
  outline: 2px solid var(--orderzy-brand, #f28500);
  outline-offset: 3px;
}
@media (max-width: 767px) {
  .oz-getbill-sticky { display: block; }
  /* 2026-09-01 permanent stacking fix: the F.28 `body.has-getbill .cart-bar`
     lift is gone. The cart-bar and Get-Bill tray are now flex-column
     siblings inside .oz-bottom-stack, so a `gap: 8px` on the container
     is the only thing that separates them - no magic numbers, no body
     class flip. See .oz-bottom-stack rule near the .cart-bar block. */
}

/* ---------- Rupee glyph (₹, U+20B9) fallback stack ----------
   2026-08-25. Reported on a Windows 7 machine: the "Avg ticket (today)"
   stat card on the restaurant dashboard rendered the rupee glyph as a
   tofu box (missing-glyph outline). Root cause: `.adm-stat__value` uses
   `var(--font-heading)` = DM Serif Display, whose subset drops U+20B9.
   On modern OSes Georgia carries ₹ so the browser fallback saves it;
   on Windows 7 every serif fallback also drops it, so we hit the tofu.

   Permanent fix: whenever a template outputs a rupee glyph on any surface
   that inherits a display / heading font (or any font without guaranteed
   currency coverage), wrap it in `<span class="oz-inr">`. That wrapper
   locks the glyph to Inter -> Noto Sans -> system-ui, all of which cover
   ₹ on every OS Orderzy targets.

   Two-child structure keeps the CSS trivial:

       <span class="oz-inr" aria-label="INR">
         <span class="oz-inr__g">&#8377;</span>
         <span class="oz-inr__f">Rs.</span>
       </span>

   The .oz-inr__f branch is hidden by default. base.html runs a canvas
   glyph probe that measures U+20B9 against the OS's tofu width; if the
   currently-active font stack has no ₹ at all (e.g. neither Inter nor
   Noto Sans is installed AND our webfont failed to load), the probe
   adds `html.no-inr`, which swaps display so `Rs.` renders instead.

   Everything is preserving-parent-font-size (no font-size:0 tricks),
   so wrapping ₹ inside a 26px stat number keeps the "Rs." branch also
   at 26px on machines that fall back to it.  */
.oz-inr {
  font-family: 'Inter', 'Noto Sans', 'Segoe UI', system-ui, -apple-system, sans-serif;
  /* Prevent a stylistic-set / small-caps parent from swallowing the currency
     sign (Inter's tabular numerals set is fine; leaving this explicit as
     defense against future descendant rules on display-font parents). */
  font-feature-settings: normal;
  font-variant: normal;
}
.oz-inr__g { display: inline; }
.oz-inr__f { display: none; }
:root.no-inr .oz-inr__g { display: none; }
:root.no-inr .oz-inr__f {
  display: inline;
  /* Small trailing gap so "Rs.100" reads as "Rs. 100" without touching the
     amount span. Kept inside the fallback so the default `<span>₹</span>
     <amount>` path stays untouched. */
  margin-right: 0.15em;
}

/* ============================================================
   Search-active hero collapse (2026-08-25)
   ============================================================
   Two sibling rules ship together:

   (1) `.hero--search-active` is the modifier applied to <section class="hero">
       when the diner has submitted a query (?q=...). The full hero chrome
       (eyebrow / headline / subline / suggest chips / trust chips / phone
       mock) is already stripped out of the DOM by home.html template gates;
       what remains here is (a) collapsing the section padding so the search
       bar hugs the top and (b) forcing the two-column .hero__grid down to a
       single column since the right-column phone mock is gone. Result: the
       results grid sits inside the first viewport on every breakpoint
       (320 / 768 / 1024+), which is the whole point of the fix.

   (2) `.search-bar__clear` is the "x" link that renders inside the search
       bar in search-active mode and routes back to `/`. Plain <a>, 36x36
       tap-target aim, focus ring inherits from the site tokens.

   NOTE: a `.live-at` strip block sat between these two rules briefly on
   2026-08-25 and was rolled back the same day (see the equivalent comment
   in templates/home.html). Do not re-introduce a partners strip here
   without matching template + view + tests. */

.hero--search-active {
  /* Reclaim the vertical space the full hero used to consume. 20px top /
     16px bottom is enough breathing room to visually separate from the
     navbar without pushing the results below the fold on a 640px viewport. */
  padding: 20px 0 16px;
}
.hero--search-active .hero__grid {
  /* Single column: the right-column phone-mock aside is not in the DOM in
     search-active mode, so the 1.1fr 1fr grid would leave a dead right
     column on desktop. Collapsing to 1fr also makes the search bar and
     location pill stack cleanly without the 48px gap the two-column layout
     applies. */
  grid-template-columns: 1fr;
  gap: 0;
  align-items: stretch;
}
.hero--search-active .search-bar {
  /* Search bar owns more width in search-active mode because the copy
     column beside it is gone. Cap at 560px so the input doesn't stretch
     past readable width on wide desktops. Uncapped on mobile via the
     100% max-width native to the flex parent. */
  max-width: 560px;
}
.hero--search-active .search-bar__location {
  /* Slightly tighter vertical rhythm so the location pill sits directly
     under the (now-solo) search bar. */
  margin-top: 10px;
}

/* Clear-x link inside the search bar. Sits between the input and the
   submit chevron. 44x44 hit area (the touch-target minimum) with a
   32x32 visual glyph so it doesn't dominate the pill. Focus ring uses
   the same shape as .search-bar__btn:hover so keyboard nav is legible. */
.search-bar__clear {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 36px;
  height: 36px;
  min-width: 36px;
  border-radius: var(--r-pill);
  color: var(--orderzy-ink-muted);
  background: transparent;
  border: none;
  cursor: pointer;
  text-decoration: none;
  transition: background var(--dur-fast) var(--ease), color var(--dur-fast) var(--ease);
  flex-shrink: 0;
}
.search-bar__clear:hover,
.search-bar__clear:focus-visible {
  background: var(--orderzy-brand-soft);
  color: var(--orderzy-brand-ink);
  outline: none;
}
.search-bar__clear:focus-visible {
  box-shadow: 0 0 0 3px var(--orderzy-brand-soft);
}

/* ============================================================
   Cross-link net: .mk-related  (2026-08-25)
   ============================================================
   Slim "You might also want" band added to the bottom of every marketing
   page + every blog post via templates/includes/_related_marketing.html
   and _blog_author_bio.html. See the docstring in _related_marketing.html
   for the SEO/GEO/AEO rationale. Design intent: quiet, discoverable, does
   not compete with primary CTAs. All tokens, zero hex, works in every
   theme state. Responsive stack: 3 across on desktop, 2 on tablet, 1 on
   mobile. */
.mk-related {
  padding: 48px 0 56px;
  border-top: 1px solid var(--orderzy-border-soft);
  background: var(--orderzy-surface-alt);
}
.mk-related__heading {
  font-family: var(--font-heading);
  font-size: 20px;
  font-weight: 700;
  color: var(--orderzy-ink);
  margin: 0 0 20px;
  letter-spacing: -0.01em;
}
.mk-related__list {
  list-style: none;
  margin: 0;
  padding: 0;
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 14px;
}
.mk-related__item { margin: 0; padding: 0; }
.mk-related__link {
  display: flex;
  flex-direction: column;
  gap: 4px;
  padding: 16px 18px;
  border-radius: 10px;
  background: var(--orderzy-canvas);
  border: 1px solid var(--orderzy-border);
  color: var(--orderzy-ink);
  text-decoration: none;
  transition:
    background var(--dur-fast) var(--ease),
    border-color var(--dur-fast) var(--ease),
    transform var(--dur-fast) var(--ease);
  min-height: 84px;
  /* 2026-08-26 visual polish: stretch cards to equal height regardless
     of description length. Without this, the middle card with a longer
     span reads visibly taller than the other two. `height: 100%` on the
     grid-item child fills the row's stretched cell. */
  height: 100%;
  box-sizing: border-box;
}
.mk-related__link strong {
  font-size: 15px;
  font-weight: 700;
  color: var(--orderzy-brand-ink);
}
.mk-related__link span {
  font-size: 13.5px;
  color: var(--orderzy-ink-soft);
  line-height: 1.5;
}
.mk-related__link:hover,
.mk-related__link:focus-visible {
  background: var(--orderzy-brand-soft);
  border-color: var(--orderzy-brand);
  transform: translateY(-1px);
  outline: none;
}
.mk-related__link:focus-visible {
  box-shadow: 0 0 0 3px var(--orderzy-brand-soft);
}

@media (max-width: 880px) {
  .mk-related__list { grid-template-columns: repeat(2, 1fr); }
}
@media (max-width: 520px) {
  .mk-related__list { grid-template-columns: 1fr; }
  .mk-related { padding: 36px 0 40px; }
}

/* ============================================================
   Blog author bio: .mk-author-bio  (2026-08-25)
   ============================================================
   Rendered inside every blog post above the standard registration CTA
   via templates/includes/_blog_author_bio.html. Ships Person (author)
   schema outside itself; this rule only styles the visible card. */
.mk-author-bio {
  padding: 40px 0;
  border-top: 1px solid var(--orderzy-border-soft);
}
.mk-author-bio__card {
  max-width: 720px;
  margin: 0 auto;
  display: flex;
  gap: 20px;
  align-items: flex-start;
  padding: 24px;
  background: var(--orderzy-canvas);
  border: 1px solid var(--orderzy-border);
  border-radius: 12px;
}
.mk-author-bio__avatar {
  width: 64px;
  height: 64px;
  border-radius: 50%;
  background: var(--orderzy-brand-soft);
  color: var(--orderzy-brand-ink);
  display: grid;
  place-items: center;
  font-family: var(--font-heading);
  font-size: 26px;
  font-weight: 700;
  flex-shrink: 0;
}
.mk-author-bio__body { flex: 1; min-width: 0; }
.mk-author-bio__eyebrow {
  font-family: var(--font-heading);
  font-size: 11px;
  font-weight: 700;
  letter-spacing: 0.10em;
  text-transform: uppercase;
  color: var(--orderzy-ink-muted);
  margin: 0 0 4px;
}
.mk-author-bio__name {
  font-size: 16px;
  font-weight: 700;
  color: var(--orderzy-ink);
  margin: 0 0 6px;
}
.mk-author-bio__text {
  font-size: 14.5px;
  color: var(--orderzy-ink-soft);
  line-height: 1.65;
  margin: 0 0 10px;
}
.mk-author-bio__links {
  display: flex;
  flex-wrap: wrap;
  gap: 14px;
}
.mk-author-bio__links a {
  font-size: 13.5px;
  font-weight: 600;
  color: var(--orderzy-brand-ink);
  text-decoration: none;
}
.mk-author-bio__links a:hover,
.mk-author-bio__links a:focus-visible { text-decoration: underline; }
@media (max-width: 520px) {
  .mk-author-bio__card { flex-direction: column; }
}


/* ---------- Ring reliability PR 2026-08-30, Phase 1.4 ----------
   First-load audio nudge pill. Fixed-position card so it renders on EVERY
   staff page including surfaces that blank the navbar (Fast Order, some
   POS variants). Positioned top-left of the viewport (16px inset). The
   other three nudges (permission nag, PWA install, kitchen banner) claim
   top-right, so we put this on the left to avoid stacking.

   Amber styling so staff read it as a call to action, not another
   indicator. Uses --z-audio-nudge (1490) so it sits just under
   --z-pwa-nudge (1500) and --z-notif-nag (1510); on the rare page
   where all three fire together, the two blue action prompts stack
   on top. See :root token block above for the full nudge scale.

   Shown by orderzy-ring-leader.js when the browser's autoplay policy has
   blocked us and staff haven't gestured yet (Phase 1.4), and again any
   time a .play() catches a fresh reject mid-shift (Phase 1.2 autoplay
   re-verification).
   ------------------------------------------------------------- */
/* 2026-09-12 (menu-features-audit H-04 v2 · Aditya UX review): full
   visual redesign. Old pill was a shouty yellow Bootstrap-alert shape at
   top-left / top-right that collided with sidebar + Menu heading and
   punched the eye. New shape is an ambient toast card anchored to the
   bottom-right (both mobile and desktop) - out of every collision zone,
   never on top of navigation. Softer surface (surface tint + subtle
   brand-hairline border), smaller footprint (32 px), gentler shadow.
   Enter animation: fade + slide up 8 px so it feels like it "arrives"
   rather than pops in. Reduced-motion users get the fade without the
   slide. Dismiss × sits inside with lower visual weight. */
.oz-audio-nudge {
  position: fixed;
  /* 2026-09-13 (Aditya UX review, H-04 followup). Was bottom-right; that
     collided with page-specific bottom widgets (Fast Order Send CTA, POS
     FABs). Top-right sits BELOW the topbar chrome (~72 px + a small gap)
     and above every page's content area on every admin surface. Fast
     Order + Reservations dock content in this band too and opt out via
     <html data-oz-suppress-audio-nudge="true"> (see _showAudioNudge in
     orderzy-ring-leader.js and the two template scripts). Mobile keeps
     bottom-right because the shell-v2 raise (orderzy-admin.css:2572)
     already lifts it above the bottom-nav. */
  top: 88px;
  right: 16px;
  bottom: auto;
  left: auto;
  display: inline-flex;
  align-items: stretch;
  gap: 0;
  height: 32px;
  border: 1px solid rgba(242, 133, 0, 0.35);
  border-radius: 8px;
  background: var(--orderzy-surface, #fff);
  color: var(--orderzy-ink, #1a1815);
  font-family: var(--font-body, system-ui, sans-serif);
  font-size: 12.5px;
  font-weight: 500;
  line-height: 1;
  white-space: nowrap;
  overflow: hidden;
  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08), 0 8px 24px rgba(0, 0, 0, 0.04);
  z-index: var(--z-audio-nudge);
  animation: oz-audio-nudge-in 220ms cubic-bezier(0.16, 1, 0.3, 1);
  transition: box-shadow 120ms ease;
}
@keyframes oz-audio-nudge-in {
  from { opacity: 0; transform: translateY(8px); }
  to   { opacity: 1; transform: translateY(0); }
}
@media (prefers-reduced-motion: reduce) {
  .oz-audio-nudge { animation: none; }
}
.oz-audio-nudge:hover { box-shadow: 0 4px 12px rgba(0, 0, 0, 0.10), 0 12px 28px rgba(0, 0, 0, 0.05); }
.oz-audio-nudge__enable,
.oz-audio-nudge__dismiss {
  appearance: none;
  border: 0;
  background: transparent;
  color: inherit;
  font: inherit;
  cursor: pointer;
  display: inline-flex;
  align-items: center;
  height: 100%;
}
.oz-audio-nudge__enable {
  padding: 0 10px 0 12px;
  gap: 6px;
  color: var(--orderzy-brand-ink, #7a4500);
}
.oz-audio-nudge__enable i {
  color: var(--orderzy-brand, #f28500);
  font-size: 12px;
}
.oz-audio-nudge__dismiss {
  padding: 0 8px 0 6px;
  color: var(--orderzy-ink-muted, #9a948b);
  opacity: 0.7;
  font-size: 13px;
}
.oz-audio-nudge__enable:hover,
.oz-audio-nudge__enable:focus-visible {
  background: var(--orderzy-brand-soft, #fef1e0);
  outline: none;
}
.oz-audio-nudge__dismiss:hover,
.oz-audio-nudge__dismiss:focus-visible {
  background: rgba(154, 148, 139, 0.12);
  color: var(--orderzy-ink, #1a1815);
  opacity: 1;
  outline: none;
}
.oz-audio-nudge[hidden] { display: none !important; }
/* Phone: keep bottom-right on <=520px because the [data-shell-v2] override
   in orderzy-admin.css:2572 already raises the pill above the mobile
   bottom-nav. Top-right would collide with the sticky mobile filter row
   at top:48px on Dashboard etc., which the shell-v2 chrome does NOT
   automatically clear. Clear the desktop `top` anchor so the mobile
   rule wins cleanly. */
@media (max-width: 520px) {
  .oz-audio-nudge {
    top: auto;
    right: 12px;
    bottom: 12px;
    max-width: calc(100vw - 24px);
    font-size: 12px;
  }
}

/* ---------- Ring reliability PR 2026-08-30, Phase 2 ----------
   Three containers driven by orderzy-ring-leader.js:
     .oz-offline-banner        - poll-fail streak >= 3, top-page red banner
     .oz-notif-blocked-banner  - Notification permission = denied, or
                                  dismissed 3x, permanent red banner
     .oz-notif-nag             - first-visit dismissible card asking for
                                  browser notification permission
   All hidden by default; JS toggles [hidden].
   ------------------------------------------------------------- */

.oz-offline-banner,
.oz-notif-blocked-banner {
  display: flex;
  align-items: center;
  gap: 8px;
  padding: 10px 16px;
  background: #fee2e2;
  color: #991b1b;
  border-bottom: 1px solid #fca5a5;
  font-family: var(--font-body, system-ui, sans-serif);
  font-size: 14px;
  font-weight: 500;
  line-height: 1.4;
}
.oz-offline-banner i,
.oz-notif-blocked-banner i {
  color: #dc2626;
  font-size: 16px;
  flex-shrink: 0;
}
.oz-offline-banner[hidden],
.oz-notif-blocked-banner[hidden] {
  display: none !important;
}

.oz-notif-nag {
  position: fixed;
  top: 16px;
  right: 16px;
  max-width: 380px;
  padding: 14px 16px;
  background: #fffbeb;
  border: 1px solid #f59e0b;
  border-radius: 8px;
  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.12);
  z-index: var(--z-notif-nag);
  font-family: var(--font-body, system-ui, sans-serif);
  font-size: 13px;
  color: #78350f;
}
.oz-notif-nag[hidden] { display: none !important; }
.oz-notif-nag__body strong {
  display: block;
  font-size: 14px;
  margin-bottom: 4px;
  color: #92400e;
}
.oz-notif-nag__actions {
  display: flex;
  gap: 8px;
  margin-top: 12px;
  justify-content: flex-end;
}
.oz-notif-nag__btn {
  padding: 6px 14px;
  border-radius: 4px;
  border: 1px solid #d1d5db;
  background: #ffffff;
  color: #374151;
  font-size: 13px;
  font-weight: 600;
  cursor: pointer;
  transition: background 120ms ease;
}
.oz-notif-nag__btn:hover,
.oz-notif-nag__btn:focus-visible {
  background: #f3f4f6;
  outline: none;
}
.oz-notif-nag__btn--primary {
  background: #f59e0b;
  border-color: #f59e0b;
  color: #ffffff;
}
.oz-notif-nag__btn--primary:hover,
.oz-notif-nag__btn--primary:focus-visible {
  background: #d97706;
  border-color: #d97706;
}
@media (max-width: 520px) {
  .oz-notif-nag {
    top: auto;
    bottom: 16px;
    left: 16px;
    right: 16px;
    max-width: none;
  }
}

/* ---------- Ring reliability PR 2026-08-30, Phase 3.5.1 ----------
   PWA upgrade nudge. Two forms:
     - Card (default): fixed top-right, 380px wide, dismissible.
     - Kitchen banner (.oz-pwa-nudge--kitchen): full-width persistent
       yellow banner at page top, no dismiss button.
   Shared account use (>=2 distinct users on the device in 24h) trips the
   kitchen form. iOS branch swaps the Install button for a 3-step guide.
   ------------------------------------------------------------- */
.oz-pwa-nudge {
  position: fixed;
  top: 16px;
  right: 16px;
  max-width: 380px;
  padding: 14px 16px;
  background: #eff6ff;
  border: 1px solid #3b82f6;
  border-radius: 8px;
  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.12);
  z-index: var(--z-pwa-nudge);
  font-family: var(--font-body, system-ui, sans-serif);
  font-size: 13px;
  color: #1e3a8a;
}
.oz-pwa-nudge[hidden] { display: none !important; }
.oz-pwa-nudge__body strong {
  display: block;
  font-size: 14px;
  margin-bottom: 4px;
  color: #1e40af;
}
.oz-pwa-nudge__copy { line-height: 1.4; }
.oz-pwa-nudge__ios {
  margin: 10px 0 0 0;
  padding-left: 20px;
  line-height: 1.5;
}
.oz-pwa-nudge__ios[hidden] { display: none !important; }
.oz-pwa-nudge__actions {
  display: flex;
  gap: 8px;
  margin-top: 12px;
  justify-content: flex-end;
}
.oz-pwa-nudge__btn {
  padding: 6px 14px;
  border-radius: 4px;
  border: 1px solid #d1d5db;
  background: #ffffff;
  color: #374151;
  font-size: 13px;
  font-weight: 600;
  cursor: pointer;
  transition: background 120ms ease;
}
.oz-pwa-nudge__btn:hover,
.oz-pwa-nudge__btn:focus-visible {
  background: #f3f4f6;
  outline: none;
}
.oz-pwa-nudge__btn[hidden] { display: none !important; }
.oz-pwa-nudge__btn--primary {
  background: #3b82f6;
  border-color: #3b82f6;
  color: #ffffff;
}
.oz-pwa-nudge__btn--primary:hover,
.oz-pwa-nudge__btn--primary:focus-visible {
  background: #2563eb;
  border-color: #2563eb;
}

/* Kitchen persistent banner variant. Overrides the fixed positioning to
   span the full page width at the top so it doubles as an unmissable
   "install me" line staff cannot swipe away. */
.oz-pwa-nudge.oz-pwa-nudge--kitchen {
  position: sticky;
  top: 0;
  right: auto;
  left: 0;
  width: 100%;
  max-width: none;
  border-radius: 0;
  border: none;
  border-bottom: 2px solid #d97706;
  background: #fef3c7;
  color: #78350f;
  box-shadow: none;
  z-index: var(--z-kitchen-banner);
}
.oz-pwa-nudge.oz-pwa-nudge--kitchen .oz-pwa-nudge__body strong {
  color: #92400e;
}

@media (max-width: 520px) {
  .oz-pwa-nudge {
    top: auto;
    bottom: 16px;
    left: 16px;
    right: 16px;
    max-width: none;
  }
}


/* ==========================================================================
   2026-08-31 customer menu surface cleanup - PR 1 Commit A + PR 2 Commit F
   docs/plans/customer-menu-surface-cleanup-2026-08-31.md
   ========================================================================== */

/* Session-identity chip in the navbar top-right. Persistent while the diner
   has an active QR-scan session at a table (see includes/navbar.html for the
   template render). Amber matches the session-identity color decision (Part 1
   locked: amber = "you and this table"; green = actions). Reuses the same
   token pair as .pill--brand so any future brand-tint update propagates. */
.oz-nav__table-chip {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  padding: 4px 10px;
  background: var(--orderzy-brand-soft);
  color: var(--orderzy-brand-ink);
  border-radius: 999px;
  font-size: 12px;
  font-weight: 700;
  line-height: 1;
  white-space: nowrap;
}
.oz-nav__table-chip-dot {
  width: 6px;
  height: 6px;
  border-radius: 50%;
  background: var(--orderzy-brand);
  flex-shrink: 0;
  display: inline-block;
}
/* Very narrow phones (<=360px, iPhone SE and older Androids): shrink the
   chip so wordmark + chip + cart + burger all fit without wrapping. */
@media (max-width: 360px) {
  .oz-nav__table-chip {
    padding: 3px 8px;
    font-size: 11px;
  }
}

/* Hide the top-of-menu "Active session at Table N [Get Bill]" card on mobile.
   Its bottom-anchored sticky twin (.oz-getbill-sticky) is the mobile Get-Bill
   surface. On desktop the sticky is display:none (see .oz-getbill-sticky
   media query further up) so this top card remains the ONE surface there.
   Design invariant: one Get-Bill surface per breakpoint. */
@media (max-width: 767px) {
  .oz-active-session-card { display: none !important; }
}

/* Commit F (Part 2 §2J): item-name font clamp on desktop only. The Luxe
   cascade earlier in this file sets `.menu-item__title { font-size: var(--text-h3) }`
   which resolves to `clamp(24px, ..., 28px)` - authentic for a section
   heading but oversized on a stacked list of dish names where the reader
   is scanning. Clamp down on desktop (>=768px); mobile untouched (owner
   scoped the ask to desktop only). This rule sits AFTER the Luxe cascade
   in file order and has equal specificity (single class), so the later
   declaration wins inside its @media band. At <768px this rule does not
   apply and the Luxe 24-28px clamp wins as before. */
@media (min-width: 768px) {
  .menu-item__title { font-size: clamp(18px, 2vw, 24px); }
}


/* ==========================================================================
   2026-09-01 discovery page polish - PR 3 Commit H
   docs/plans/discovery-page-polish-and-owner-onboarding-gate-2026-09-01.md
   ========================================================================== */

/* Cuisine chip on the discovery card. Sits between the title and the address
   line so every card renders a consistent number of visible rows. Falls back
   to "Restaurant" when the owner has not picked a cuisine (see
   Outlet.cuisine_display), so the chip slot is never empty. Amber matches the
   session-identity + brand-soft palette used elsewhere. */
.rest-card__cuisine {
  display: inline-block;
  margin: 4px 0 8px;
  padding: 2px 10px;
  background: var(--orderzy-brand-soft);
  color: var(--orderzy-brand-ink);
  border-radius: 999px;
  font-size: 11px;
  font-weight: 700;
  letter-spacing: 0.02em;
  line-height: 1.5;
  max-width: 100%;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}


/* ==========================================================================
   2026-09-02 Tier 1 discovery polish - card fallback tile + See-menu CTA arrow
   docs/plans/discovery-page-polish-and-owner-onboarding-gate-2026-09-01.md
   (Fix 3 items deferred out of PR 3, shipped here.)
   ========================================================================== */

/* Amber wordmark tile behind cards that have no card_photo / cover_photo /
   profile_picture. Sits inside .rest-card__media which enforces the 16:10
   aspect-ratio box, so this tile inherits the same shape as a real photo.
   The brand name renders in the display type at 60% opacity over the
   brand-soft ground so the card reads as intentional (not "broken
   default-profile.png"). Uses container-scoped clamp so the wordmark
   scales gracefully from a very long brand name ("The Corner Bistro Cafe") to a
   very short one ("KFC"). */
.rest-card__fallback-tile {
  position: absolute;
  inset: 0;
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 12px 20px;
  background:
    radial-gradient(circle at 30% 20%, rgba(255,255,255,0.55), transparent 60%),
    var(--orderzy-brand-soft);
  text-align: center;
}
.rest-card__fallback-mark {
  font-family: var(--font-heading, "Playfair Display", Georgia, serif);
  font-weight: 700;
  font-size: clamp(20px, 5vw, 30px);
  line-height: 1.1;
  color: var(--orderzy-brand-ink);
  opacity: 0.6;
  letter-spacing: 0.01em;
  word-break: break-word;
  /* Line clamp keeps a very long brand name from pushing past the tile. */
  display: -webkit-box;
  -webkit-line-clamp: 3;
  -webkit-box-orient: vertical;
  overflow: hidden;
}

/* See-menu arrow. Small gap between text and glyph, slides right on hover
   for a subtle affordance. Wrapped in a span so we can transform it
   without moving the text baseline. */
.rest-card__view-cta__arrow {
  display: inline-block;
  margin-left: 6px;
  transition: transform var(--dur-fast, 160ms) var(--ease, ease);
}
.rest-card__view-cta:hover .rest-card__view-cta__arrow {
  transform: translateX(3px);
}


/* ==========================================================================
   2026-09-02 Tier 2.6 popular dishes strip on the public restaurant detail
   page. Renders three photographed dishes above the menu so a first-time
   visitor sees actual food before scrolling. Layout is a 3-column grid on
   desktop, single-column stacked on phone. Each tile clicks through to the
   dish's anchor inside the menu list further down.
   docs/plans/followups-after-pr1-pr3-2026-09-01.md (Tier 2 batch)
   ========================================================================== */

.oz-popular-strip__grid {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: 12px;
}
@media (max-width: 640px) {
  .oz-popular-strip__grid {
    /* Horizontal scroll on phones so 3 tiles fit without shrinking to
       unusable thumbnails. Each tile takes 60vw min so 1.5 tiles are
       visible per viewport - the peek reads as "swipe for more". */
    display: flex;
    overflow-x: auto;
    gap: 12px;
    scroll-snap-type: x mandatory;
    -webkit-overflow-scrolling: touch;
    margin: 0 -16px;
    padding: 0 16px;
    scrollbar-width: none;
  }
  .oz-popular-strip__grid::-webkit-scrollbar { display: none; }
  .oz-popular-strip__tile {
    flex: 0 0 62%;
    scroll-snap-align: start;
  }
}
.oz-popular-strip__tile {
  display: flex;
  flex-direction: column;
  background: var(--orderzy-surface, #fff);
  border: 1px solid var(--orderzy-border-soft);
  border-radius: 12px;
  overflow: hidden;
  text-decoration: none;
  color: inherit;
  transition: transform var(--dur-fast, 160ms) var(--ease, ease),
              box-shadow var(--dur-fast, 160ms) var(--ease, ease);
}
.oz-popular-strip__tile:hover,
.oz-popular-strip__tile:focus-visible {
  transform: translateY(-2px);
  box-shadow: 0 6px 18px rgba(0,0,0,0.08);
  border-color: var(--orderzy-brand-ink);
}
.oz-popular-strip__photo {
  position: relative;
  aspect-ratio: 4 / 3;
  background: var(--orderzy-brand-soft);
  overflow: hidden;
}
.oz-popular-strip__photo img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
}
.oz-popular-strip__veg {
  position: absolute;
  top: 8px;
  left: 8px;
  background: rgba(255,255,255,0.94);
  border-radius: 2px;
  padding: 2px;
}
.oz-popular-strip__body {
  padding: 10px 12px 12px;
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: 8px;
}
.oz-popular-strip__title {
  font-size: 14px;
  font-weight: 600;
  color: var(--orderzy-ink);
  line-height: 1.3;
  display: -webkit-box;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
  overflow: hidden;
}
.oz-popular-strip__price {
  font-size: 13px;
  font-weight: 700;
  color: var(--orderzy-ink);
  white-space: nowrap;
  flex-shrink: 0;
}

/* =========================================================================
   Phase 3 · Multi-outlet identity chips (2026-09-04)
   -----------------------------------------------------------------------
   Docs/plans/multi-outlet-onboarding-hardening-2026-09-03.md §G20/§G10/§G8.
   Shared between:
     .fo-outlet-chip  - Fast Order header (G20) + sidebar/topbar (G10)
     .ml-pill         - menu-list per-outlet availability strip (G8)
     .fo-nudge-strip  - 60s soft-nudge above Fast Order menu after switch
     .bd-header__*    - staff bill_detail body identity block (G21)
   Every consumer sets --outlet-hue via {{ outlet.pk|outlet_hue }}, one
   deterministic hue per outlet, no colour picker needed on edit_outlet.
   Do NOT duplicate the hue rules per surface.
   ======================================================================= */
.fo-outlet-chip {
  --outlet-hue: 0;
  display: inline-block;
  padding: 3px 10px;
  border-radius: 100px;
  font-size: 13px;
  font-weight: 600;
  background: hsl(var(--outlet-hue), 70%, 92%);
  color: hsl(var(--outlet-hue), 55%, 25%);
  border: 1px solid hsl(var(--outlet-hue), 60%, 60%);
  margin-left: 8px;
  vertical-align: middle;
  white-space: nowrap;
  line-height: 1.2;
}
.fo-brand {
  font-weight: 700;
  vertical-align: middle;
}
/* Mobile: header wraps to two lines and the chip drops below the brand
   name so it stays readable on a narrow phone. Fast Order + admin shell
   both use this pattern - one rule, two consumers. */
@media (max-width: 640px) {
  .fo-outlet-chip {
    display: inline-block;
    margin-left: 0;
    margin-top: 4px;
  }
  .fo-brand-line { display: flex; flex-wrap: wrap; align-items: baseline; gap: 6px; }
}

/* Soft-nudge strip that renders above the Fast Order menu grid for 60s
   after a switch_outlet or start_impersonation. Colour derives from the
   same --outlet-hue so the visual identity stays consistent with the
   header chip. Dismissible via the .fo-nudge-strip__close X button. */
.fo-nudge-strip {
  --outlet-hue: 0;
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 12px;
  padding: 8px 14px;
  margin: 8px 12px 0;
  border-radius: 8px;
  font-size: 13px;
  font-weight: 500;
  background: hsl(var(--outlet-hue), 80%, 94%);
  color: hsl(var(--outlet-hue), 50%, 20%);
  border-left: 3px solid hsl(var(--outlet-hue), 65%, 50%);
}
.fo-nudge-strip__msg { flex: 1; min-width: 0; }
.fo-nudge-strip__close {
  background: transparent;
  border: 0;
  cursor: pointer;
  color: inherit;
  font-size: 18px;
  line-height: 1;
  padding: 2px 6px;
  border-radius: 4px;
  opacity: 0.65;
}
.fo-nudge-strip__close:hover { opacity: 1; }
.fo-nudge-strip[hidden] { display: none; }

/* Menu-list per-outlet visibility pills (G8). Same hue system as the
   header chip, but rendered as small compact indicators inside a row. */
.ml-visibility {
  display: flex;
  flex-wrap: wrap;
  gap: 4px;
  align-items: center;
  padding: 0 8px;
  min-width: 120px;
}
.ml-pill {
  --outlet-hue: 0;
  display: inline-flex;
  align-items: center;
  gap: 3px;
  padding: 2px 8px;
  border-radius: 100px;
  font-size: 11px;
  font-weight: 600;
  text-decoration: none;
  border: 1px solid hsl(var(--outlet-hue), 60%, 60%);
  line-height: 1.4;
}
.ml-pill--on {
  background: hsl(var(--outlet-hue), 70%, 92%);
  color: hsl(var(--outlet-hue), 55%, 25%);
}
.ml-pill--off {
  background: transparent;
  color: hsl(var(--outlet-hue), 20%, 45%);
  border-style: dashed;
  opacity: 0.75;
  text-decoration: line-through;
  text-decoration-color: currentColor;
}
.ml-pill:hover { filter: brightness(0.96); }

/* Merged Dashboard Visibility card (G19). Replaces the two independent
   cards (Google indexation vs Orderzy discovery) with a single 2-column
   table + unified failing-signals checklist below. */
.dash-visibility {
  margin-top: 12px;
  padding: 16px 18px;
  background: var(--orderzy-surface, #fff);
  border: 1px solid var(--orderzy-border, #ebe5da);
  border-radius: var(--r-sm, 8px);
}
.dash-visibility > h3 {
  margin: 0 0 8px;
  font-size: 15px;
  font-weight: 700;
  color: var(--orderzy-ink);
}
.dash-visibility__gates {
  width: 100%;
  border-collapse: collapse;
  margin-bottom: 12px;
  font-size: 13px;
}
.dash-visibility__gates th,
.dash-visibility__gates td {
  padding: 6px 10px;
  text-align: left;
  border-bottom: 1px solid var(--orderzy-border, #ebe5da);
}
.dash-visibility__gates thead th {
  font-weight: 700;
  color: var(--orderzy-ink);
  font-size: 12px;
  text-transform: uppercase;
  letter-spacing: 0.04em;
}
.dash-visibility__gates tbody th {
  font-weight: 600;
  color: var(--orderzy-ink-muted, #6b6760);
  width: 90px;
}
.dash-visibility__gates td { color: var(--orderzy-ink); }
.dash-visibility__gates td.is-pass { color: var(--orderzy-success, #1f9d55); font-weight: 700; }
.dash-visibility__gates td.is-fail { color: var(--orderzy-warning, #c07020); font-weight: 700; }
.dash-visibility__checklist h4 {
  font-size: 12px;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.04em;
  color: var(--orderzy-ink-muted);
  margin: 4px 0 8px;
}
.dash-visibility .chip {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 8px;
  padding: 8px 12px;
  border-radius: 6px;
  font-size: 13px;
  border: 1px solid var(--orderzy-border, #ebe5da);
  margin-bottom: 6px;
}
.dash-visibility .chip--fix {
  background: #fff9ec;
  border-left: 3px solid var(--orderzy-warning, #c07020);
}
.dash-visibility .chip--ready {
  background: var(--orderzy-success-soft, #e6f4ea);
  border-left: 3px solid var(--orderzy-success, #1f9d55);
  color: var(--orderzy-success, #1f9d55);
  font-weight: 600;
}
.dash-visibility .chip__unlocks {
  font-size: 11px;
  color: var(--orderzy-ink-muted, #6b6760);
  background: rgba(0, 0, 0, 0.04);
  padding: 2px 8px;
  border-radius: 100px;
}
.dash-visibility .chip a { color: var(--orderzy-brand-ink); font-weight: 600; text-decoration: none; }
.dash-visibility .chip a:hover { text-decoration: underline; }

/* Staff bill_detail body identity block (G21). Mirrors the customer-facing
   bill_view / customers/bill_detail pattern - brand name is primary, outlet
   name suppressed when Outlet.suppress_outlet_qualifier is True, then
   address in muted ink. See restaurant/models.py:1185 for the suppression
   rule (case-insensitive match against 'main', 'default', 'primary', ...). */
.bd-header__brand {
  font-size: 20px;
  font-weight: 800;
  color: var(--orderzy-ink);
  letter-spacing: 0.02em;
  margin-bottom: 2px;
}
.bd-header__outlet {
  font-size: 14px;
  font-weight: 600;
  color: var(--orderzy-brand-ink, #b86600);
  margin-bottom: 2px;
}
.bd-header__addr {
  font-size: 12.5px;
  color: var(--orderzy-ink-muted, #6b6760);
  line-height: 1.35;
  margin-bottom: 12px;
}
.bd-header__id-block {
  border-top: 1px solid var(--orderzy-border, #ebe5da);
  padding-top: 12px;
  margin-top: 4px;
}

