/* ============================================================================
   Buraq Flash · Hooria Service Board — the ONE stylesheet.
   Foundation pass 24 Sep 2026 (tokens, type roles, colour grammar) + quick wins
   Q13/Q12 (never-blank board, designed empties), Q5/Q6 (one-row header, LEFT-TO-PACK hero),
   Q3/Q9 (held-card clothing, SVG glyphs). service.html carries no inline <style>.

   1  tokens (one :root, one dark block, type roles + ONE kiosk multiplier)
   2  base + icons     7  cook            12 buttons          17 phone (<=720)
   3  header           8  drinks          13 sheet + forms    18 desktop grid (>=1200)
   4  pack bar         9  locations       14 credit board     19 reduced motion
   5  hero            10  chips           15 alerts (flash/toast)
   6  sections        11  banners         16 kiosk (fridge) — the HERO screen, incl. the PORTRAIT density block

   Colour law (Q4): filled gold = event chip only · gold OUTLINE = money (COLLECT) ·
   green = done only · red = stop only · info-blue = substitutions / notes / reconciled ·
   amber/gold solid = attention (stale pill) · lanes never touch the red/green/gold families.
   ============================================================================ */

/* ---------- 1. TOKENS ---------- */
:root{
  /* brand five */
  --maroon:#651B22; --maroon-deep:#3F1015; --gold:#C89A3B; --cream:#FBF4E9; --rose:#B76E79; /* rose = signature only, never a lane */
  --gold-light:#F3D695;
  /* surfaces + text */
  --bg:#FBF4E9; --card:#FFFCF6; --surface-2:#F1E8D8; --ink:#2B2420; --taupe:#67594C; --line:#DCCFBB;
  --heading:#651B22; --number:#651B22; --link:#24566A; --accent-text:#7A5A15;
  /* semantic triads: bg / fg / line (+ one solid fill) */
  --ok-bg:#E3EEE4; --ok-fg:#255A35; --ok-line:#8DBA97; --ok-solid:#2F7D4F;
  --att-bg:#F8EAC8; --att-fg:#6E4F0F; --att-line:#C89A3B; --att-solid:#C89A3B;
  --danger-bg:#FBE3DD; --danger-fg:#8A231C; --danger-line:#D9776D; --danger-solid:#B3261E;
  --info-bg:#DCECF2; --info-fg:#234B5A; --info-line:#7FB0C4; --info-solid:#2E5A6B;
  /* delivery lanes — outside the red/green/gold families, and not the header maroon */
  --lane-ilm:#4A2545; --lane-regus:#295566; --lane-bt:#4A5560; --lane-other:#675231;
  /* spacing scale */
  --s1:4px; --s2:8px; --s3:12px; --s4:16px; --s5:24px; --s6:32px;
  /* radius scale */
  --r-chip:6px; --r-ctl:10px; --r-card:14px; --r-pill:999px;
  /* elevation: hairline --line everywhere; shadow ONLY on the bottom sheet, the header popovers and the toast */
  --shadow-sheet:0 -10px 40px rgba(0,0,0,.2); --shadow-toast:0 16px 44px rgba(0,0,0,.28); --shadow-pop:0 14px 36px rgba(0,0,0,.35);
  /* type system: ONE kiosk multiplier (--k) and ONE serif optical factor (--serif-k) */
  --k:1; --serif-k:1;
  --font-body:Archivo,system-ui,sans-serif; --font-display:Cormorant,Georgia,serif;
  color-scheme:light;
}
:root[data-theme=dark]{
  --bg:#1B1917; --card:#27231F; --surface-2:#332C26; --ink:#FFF6E9; --taupe:#CDBBA5; --line:#3E352D;
  --heading:#FFF6E9; --number:#FFF6E9; --link:#A3D6E8; --accent-text:#F1CD87;
  --ok-bg:#243A2B; --ok-fg:#C3E9C8; --ok-line:#5E9A6C; --ok-solid:#3F9A63;
  --att-bg:#3A311F; --att-fg:#F1CD87; --att-line:#C89A3B; --att-solid:#C89A3B;
  --danger-bg:#4A1F1D; --danger-fg:#FFB4AB; --danger-line:#EF9F96; --danger-solid:#B3261E;
  --info-bg:#253D47; --info-fg:#C4E3F0; --info-line:#5E93A8; --info-solid:#2E5A6B;
  color-scheme:dark;
}
/* Type roles. Declared on body (not :root) so the kiosk multiplier set on body.kiosk
   is what the calc() sees — a custom property resolves var() on the element it is declared on.
   Q6 adds two: --fs-hero (the one dominant number) and --fs-stat (the demoted secondaries). */
body{
  --fs-meta:calc(12px*var(--k));   /* spec says 11; Q14 floors all text at 12 — the floor wins */
  --fs-small:calc(13px*var(--k));
  --fs-body:calc(15px*var(--k));
  --fs-lead:calc(18px*var(--k));
  --fs-title:calc(22px*var(--k));
  --fs-stat:calc(28px*var(--k));
  --fs-number:calc(42px*var(--k));
  --fs-hero:calc(72px*var(--k));
}

/* ---------- 2. BASE + ICONS ---------- */
*{box-sizing:border-box}
html,body{margin:0}
/* classic-scrollbar desktops: reserve the gutter from first paint so the header never jumps 15px when the board grows past the fold.
   Fridge fallback scroll (body.kiosk-scroll) hides the bar instead — wheel/touch scrolling still works. :has() is a progressive
   enhancement: a browser without it simply keeps the old behaviour. */
:root:not(:has(body.kiosk)){scrollbar-gutter:stable}
:root:has(body.kiosk-scroll){scrollbar-width:none}
body{background:var(--bg);color:var(--ink);font-family:var(--font-body);font-weight:500;font-size:var(--fs-body);line-height:1.45;font-variant-numeric:tabular-nums lining-nums;-webkit-text-size-adjust:100%;padding-bottom:32px}
h1,h2,h3{margin:0}
button,input,select{font-family:inherit;font-variant-numeric:inherit}
button,a,input,select{touch-action:manipulation}
button:focus-visible,a:focus-visible,input:focus-visible,select:focus-visible{outline:3px solid var(--accent-text);outline-offset:3px}
button:disabled{cursor:not-allowed}
[hidden]{display:none!important}
.sprite{display:none}
.visually-hidden{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0}
/* the glyphs: 1em square, sit on the text baseline, take the text colour */
.i{display:inline-block;width:1em;height:1em;vertical-align:-.15em;flex:none;overflow:visible}
.i-left{transform:rotate(180deg)}
.i-up{transform:rotate(-90deg)}
.wrap{max-width:1440px;margin:0 auto;padding:20px 24px}
.muted{color:var(--taupe)}
.empty{padding:var(--s4);color:var(--taupe);text-align:center}
.empty .i{color:var(--ok-fg)}
footer{margin:20px 0 0;color:var(--taupe);font-size:var(--fs-meta)}

/* ---------- 3. HEADER (brand maroon, gold hairline) — ONE row: wing · day chip · status pill · bell · clock · more ---------- */
.top{position:static;background:var(--maroon);color:var(--cream);border-bottom:2px solid var(--gold)}
.top-in{position:relative;max-width:1440px;margin:0 auto;padding:12px 24px;display:flex;align-items:center;gap:10px;flex-wrap:wrap}
.brand{display:flex;align-items:center;gap:12px;margin-right:6px;flex-shrink:0;line-height:1}
.brand-wing{display:block;width:44px;height:50px;object-fit:contain}
.brand-copy{display:grid;gap:4px}
.brand-copy b{font-weight:700;font-size:var(--fs-title);line-height:1;letter-spacing:.14em;color:var(--gold-light)}
.brand-copy small{font-weight:500;font-size:var(--fs-small);line-height:1.25;color:var(--cream);white-space:nowrap}
.daytoggle,.bell,.more{display:inline-flex;align-items:center;justify-content:center;min-height:44px;padding:10px 12px;border-radius:var(--r-ctl);font-weight:500;font-size:var(--fs-small);line-height:1.2;color:var(--cream);background:rgba(255,255,255,.05);border:1px solid rgba(255,255,255,.4);text-decoration:none;cursor:pointer}
.daytoggle:hover,.bell:hover,.more:hover{background:rgba(255,255,255,.14)}
.bell,.more{min-width:44px;font-size:var(--fs-lead);line-height:1;padding:8px}
.bell.off{border-style:dashed;background:transparent}
/* the day chip — Cormorant's first job; taps open the day navigation */
.daychip{display:inline-flex;align-items:baseline;gap:10px;min-height:44px;min-width:0;max-width:100%;margin:0;padding:6px 16px;border-radius:var(--r-pill);background:rgba(255,255,255,.08);border:1px solid rgba(255,255,255,.28);color:var(--cream);cursor:pointer;white-space:nowrap;text-align:left}
.daychip:hover{background:rgba(255,255,255,.14)}
.daychip[aria-expanded=true]{border-color:var(--gold-light);background:rgba(255,255,255,.14)}
.daychip-day{font-family:var(--font-display);font-weight:700;font-size:var(--fs-title);line-height:1}
.daychip-sub{font-weight:500;font-size:var(--fs-small);line-height:1.2;color:var(--cream)}
/* popovers hang off the header; they are the only other surfaces with a shadow */
.pop{display:none;position:absolute;top:calc(100% - 2px);z-index:30;background:var(--maroon-deep);color:var(--cream);border:1px solid rgba(255,255,255,.18);border-top:2px solid var(--gold);border-radius:0 0 var(--r-card) var(--r-card);padding:12px;box-shadow:var(--shadow-pop)}
.pop.open{display:flex}
.daynav{left:24px;align-items:center;gap:6px;flex-wrap:wrap;max-width:calc(100% - 48px)}
.daynav [aria-pressed=true]{background:rgba(255,255,255,.14);border-color:var(--gold-light)}
.daytoggle .i{color:var(--gold-light)}
.dayarrow{min-width:44px;font-size:var(--fs-title);font-weight:500}
.daypick{display:flex;min-width:0;min-height:44px;align-items:center}
.daypick input{min-height:44px;padding:8px 10px;border-radius:var(--r-ctl);border:1px solid rgba(255,255,255,.4);background:rgba(255,255,255,.05);color:var(--cream);font-size:16px;color-scheme:dark;cursor:pointer} /* 16px: stops iOS focus-zoom */
.menu{right:24px;flex-direction:column;gap:4px;min-width:240px}
.menu-item{display:flex;align-items:center;gap:10px;width:100%;min-height:44px;padding:10px 12px;border-radius:var(--r-ctl);color:var(--cream);background:transparent;border:1px solid transparent;font-weight:500;font-size:var(--fs-body);line-height:1.2;text-decoration:none;text-align:left;cursor:pointer;white-space:nowrap}
.menu-item:hover{background:rgba(255,255,255,.1)}
.menu-item .i{font-size:1.25em;color:var(--gold-light)}
.menu-item.plain{padding-left:calc(12px + 1.25em + 10px)}
#tokenbtn.off .i{opacity:.5}
/* status pill: Live · Loading… · Signed out · (amber) Last updated HH:MM · retrying. Tapping it forces a fetch. */
.status{display:inline-flex;align-items:center;gap:8px;min-height:44px;min-width:0;padding:8px 14px;border-radius:var(--r-pill);border:1px solid rgba(255,255,255,.28);background:rgba(255,255,255,.06);color:var(--cream);font-weight:500;font-size:var(--fs-small);line-height:1.2;cursor:pointer;white-space:nowrap}
.status:hover{background:rgba(255,255,255,.14)}
.status .dot{width:9px;height:9px;flex:none;border-radius:50%;background:var(--gold);box-shadow:0 0 0 0 rgba(200,154,59,.7);animation:pulse 2s infinite}
@keyframes pulse{0%{box-shadow:0 0 0 0 rgba(200,154,59,.6)}70%{box-shadow:0 0 0 8px rgba(200,154,59,0)}100%{box-shadow:0 0 0 0 rgba(200,154,59,0)}}
.status-detail{font-weight:700;font-size:var(--fs-body)}
.status-detail:not(:empty)::before{content:"·";margin-right:8px;font-weight:500;opacity:.7}
.status.stale{background:var(--att-solid);border-color:var(--att-solid);color:var(--maroon-deep);font-weight:700}
.status.stale .dot{background:var(--maroon-deep);animation:none;box-shadow:none}
.status.loading .dot{animation:pulse .9s infinite}
.status.off .dot{background:rgba(255,255,255,.45);animation:none;box-shadow:none}
.status.stale .status-detail,.status.loading .status-detail,.status.off .status-detail{display:none}
.spacer{flex:1}
.demo{border:1px solid var(--gold);color:var(--gold-light);font-weight:700;font-size:var(--fs-meta);letter-spacing:.08em;padding:var(--s1) var(--s2);border-radius:var(--r-chip);text-transform:uppercase}
/* "n new" = an event → the filled-gold chip */
.newcount{display:inline-flex;align-items:center;gap:6px;background:var(--gold);color:var(--maroon-deep);border:0;border-radius:var(--r-pill);padding:8px 12px;font-weight:700;font-size:var(--fs-body);line-height:1;cursor:pointer;animation:flashpulse 1s ease-out 3}
.clock{font-weight:700;font-size:var(--fs-lead);min-width:46px;color:var(--cream)}

/* ---------- 4. PACK BAR — the only thing that sticks ---------- */
.packbar{position:sticky;top:0;z-index:19;background:var(--card);border-bottom:1px solid var(--line)}
/* the bar's box is reserved from first paint (invisible, not removed) so the board does not shift 57px when orders arrive; kiosk still removes it */
.packbar[hidden]{display:block!important;visibility:hidden}
.pb-in{max-width:1440px;margin:0 auto;padding:12px 24px;display:flex;align-items:center;gap:14px}
.pb-txt{font-weight:700;font-size:var(--fs-body);color:var(--heading);white-space:nowrap}
.pb-prog{flex:1;height:10px;background:var(--surface-2);border:1px solid var(--line);border-radius:var(--r-pill);overflow:hidden}
.pb-bar{height:100%;width:0;background:var(--ok-solid);border-radius:var(--r-pill);transition:width .35s}
.pb-filter{display:inline-flex;align-items:center;gap:7px;min-height:32px;font-size:var(--fs-small);font-weight:500;color:var(--taupe);cursor:pointer;white-space:nowrap}
.pb-filter input{width:22px;height:22px;accent-color:var(--maroon)}

/* ---------- 5. HERO — LEFT TO PACK, the one dominant number; secondaries demoted, one weight, --ink ---------- */
.hero{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:var(--s4) var(--s6);align-items:end;background:var(--card);border:1px solid var(--line);border-radius:var(--r-card);padding:var(--s5);margin:4px 0 20px}
.hero-main{min-width:0}
.hero-l{font-size:var(--fs-meta);font-weight:700;letter-spacing:.13em;text-transform:uppercase;color:var(--taupe)}
.hero-n{font-family:var(--font-body);font-weight:700;font-size:var(--fs-hero);line-height:1;letter-spacing:-.03em;color:var(--number);margin:4px 0 6px}
.hero-sub{font-size:var(--fs-lead);font-weight:500;line-height:1.35;color:var(--ink);margin-bottom:var(--s3);overflow-wrap:anywhere}
#hero-cut:not(:empty)::before{content:" · "}
.hero-prog{height:16px;background:var(--surface-2);border:1px solid var(--line);border-radius:var(--r-pill);overflow:hidden}
.hero-bar{height:100%;width:0;background:var(--ok-solid);border-radius:var(--r-pill);transition:width .35s}
.hero-side{display:flex;flex-wrap:wrap;justify-content:flex-end;align-items:end;gap:var(--s3) var(--s5)}
.kv{display:grid;gap:2px;text-align:right}
.kv b{font-weight:700;font-size:var(--fs-stat);line-height:1.1;letter-spacing:-.02em;color:var(--ink)}
.kv span{font-size:var(--fs-meta);font-weight:700;letter-spacing:.08em;text-transform:uppercase;color:var(--taupe);white-space:nowrap}

/* ---------- 6. SECTIONS ---------- */
.sec{margin:var(--s5) 0}
.sec-h{display:flex;flex-wrap:wrap;align-items:center;gap:9px 14px;margin:0 2px 12px}
.sec-h h2{font-family:var(--font-display);font-weight:700;font-size:calc(var(--fs-title)*var(--serif-k));line-height:1.15;color:var(--heading)}
.sec-h .sub{font-size:var(--fs-small);color:var(--taupe)}

/* ---------- 7. COOK ---------- */
.cook{display:flex;flex-wrap:wrap;gap:var(--s3)}
.dish{background:var(--card);border:1px solid var(--line);border-left:4px solid var(--gold);border-radius:var(--r-card);padding:var(--s4) 18px;min-width:210px;flex:0 1 300px}
/* numbers: Archivo 700, never the serif */
.dish .q{font-family:var(--font-body);font-weight:700;font-size:var(--fs-number);line-height:1.12;letter-spacing:-.025em;color:var(--number)}
.dish .nm{font-size:var(--fs-body);font-weight:500;line-height:1.4;margin-top:6px}
.dish.defer{border-left-color:var(--att-line)}
.dish.defer .q{color:var(--att-fg)}
.dish .tag{display:inline-block;margin-top:6px;font-size:var(--fs-meta);font-weight:700;color:var(--att-fg);background:var(--att-bg);border:1px solid var(--att-line);border-radius:var(--r-chip);padding:var(--s1) var(--s2)}

/* ---------- 8. DRINKS ---------- */
.drinks{display:flex;flex-wrap:wrap;gap:9px}
.drink{display:inline-flex;align-items:center;gap:var(--s2);background:var(--card);border:1px solid var(--line);border-radius:var(--r-pill);padding:var(--s2) var(--s3);font-weight:500;font-size:var(--fs-body);color:var(--ink)}
.drink .c{background:var(--maroon);color:#fff;border-radius:var(--r-pill);min-width:calc(28px*var(--k));height:calc(28px*var(--k));display:inline-grid;place-items:center;font-size:var(--fs-small);font-weight:700}
.drink.ice .c{background:#295666}
.drink.water .c{background:#465965}

/* ---------- 9. LOCATIONS + ORDER CARDS ---------- */
.locs{display:grid;grid-template-columns:repeat(auto-fill,minmax(min(100%,340px),1fr));gap:var(--s4);align-items:start}
.loc{--lane:var(--lane-other);background:var(--card);border:1px solid var(--line);border-radius:var(--r-card);overflow:hidden;display:flex;flex-direction:column}
.loc.ILM,.loc-h.ILM{--lane:var(--lane-ilm)}
.loc.Regus,.loc-h.Regus{--lane:var(--lane-regus)}
.loc.BT,.loc-h.BT{--lane:var(--lane-bt)}
.loc.Other,.loc-h.Other{--lane:var(--lane-other)}
/* solid lane band, no gradient */
.loc-h{padding:var(--s3) var(--s4);background:var(--lane);color:#fff;display:flex;align-items:center;gap:10px;flex-wrap:wrap}
/* the location name — Cormorant's second job */
.loc-h h3{flex:1;font-family:var(--font-display);font-weight:700;font-size:calc(var(--fs-title)*var(--serif-k));line-height:1.1;color:#fff}
.loc-h .cnt{background:rgba(255,255,255,.14);border:1px solid rgba(255,255,255,.3);color:#fff;border-radius:var(--r-pill);padding:var(--s1) var(--s3);font-weight:700;font-size:var(--fs-small);white-space:nowrap}
.loc-h .cnt.done{background:var(--ok-solid);border-color:var(--ok-solid)}
.loc-h .cnt.held{background:var(--danger-solid);border-color:var(--danger-solid);color:var(--cream)}   /* red = stop */
.loc-body{padding:4px 6px 8px}
.loc-actions{padding:0 var(--s2) 10px}
.packall{width:100%;min-height:calc(44px*var(--k));border:1px solid var(--line);background:var(--surface-2);border-radius:var(--r-ctl);padding:9px;font-weight:700;font-size:var(--fs-small);cursor:pointer;color:var(--heading)}
.packall .i{color:var(--ok-fg)}
.loc-foot{border-top:1px dashed var(--line);padding:9px 14px;font-size:var(--fs-small);color:var(--taupe);display:flex;gap:10px;flex-wrap:wrap;line-height:1.6}
.loc-foot b{color:var(--ink)}
.extra-foot{width:100%;font-weight:700}
/* order card: 12×16, margin 8, 6px lane rule on the left */
.ord{position:relative;background:var(--card);border:1px solid var(--line);border-left:6px solid var(--lane);border-radius:var(--r-ctl);padding:var(--s3) var(--s4);margin:var(--s2)}
.ord.packed{background:var(--ok-bg);border-color:var(--ok-line);border-left-color:var(--lane)}
.ord.held{background:var(--danger-bg);border-color:var(--danger-line);border-left-color:var(--lane);color:var(--ink)}
.ord.taster{border-style:dashed;border-left-style:solid;background:var(--surface-2)}
.ord-top{display:flex;align-items:center;gap:6px;flex-wrap:wrap;margin-bottom:6px;padding-right:calc(44px*var(--k) + 2px)}
.pack-btn{position:absolute;top:10px;right:10px;width:calc(44px*var(--k));height:calc(44px*var(--k));border-radius:var(--r-ctl);border:2px solid var(--taupe);background:var(--surface-2);color:var(--ink);font-size:var(--fs-lead);font-weight:700;cursor:pointer;display:grid;place-items:center;line-height:1;padding:0}
.pack-btn .i{font-size:1.3em}
.ord.packed .pack-btn{background:var(--ok-solid);border-color:var(--ok-solid);color:#fff}
/* Q3: a held card wears NO pack control and NO paid chip — the top-right slot says NOT PAID under a red stop glyph */
.held-mark{position:absolute;top:8px;right:8px;display:grid;justify-items:center;gap:3px;color:var(--danger-fg);font-weight:700;font-size:var(--fs-meta);letter-spacing:.06em;line-height:1;text-align:center;white-space:nowrap}
.held-mark .i{font-size:calc(28px*var(--k));vertical-align:0}
.ord.held .ord-top{padding-right:calc(64px*var(--k) + 12px)}
.ord.held .customer-name{margin-right:calc(64px*var(--k) + 12px)}
.ord.held .line{opacity:.55}
.ord.held .line .qb{background:var(--surface-2);color:var(--taupe);text-decoration:line-through;text-decoration-thickness:3px;text-decoration-color:var(--danger-solid)}
.customer-name{margin:0 calc(44px*var(--k) + 12px) 6px 0;font-weight:700;font-size:var(--fs-body);line-height:1.4;overflow-wrap:anywhere;color:var(--ink)}
.customer-name span{display:block;font-weight:500;font-size:var(--fs-meta);line-height:1.3;letter-spacing:.04em;color:var(--taupe);margin-bottom:2px}
.diner-name{display:block;font-weight:500;font-size:var(--fs-meta);line-height:1.3;margin-top:3px}
.line{display:flex;flex-wrap:wrap;align-items:center;gap:6px 9px;padding:4px 0;font-size:var(--fs-body);line-height:1.45}
.line .qb{background:var(--maroon);color:#fff;border-radius:var(--r-chip);min-width:calc(28px*var(--k));height:calc(28px*var(--k));display:inline-grid;place-items:center;font-weight:700;font-size:var(--fs-body)}
.line .dn{font-weight:700;flex:1;min-width:100px}
.line .dk{font-size:var(--fs-small);color:var(--taupe);font-weight:500}
.tel-link{display:inline-flex;align-items:center;gap:6px;min-height:44px;margin-top:2px;font-size:var(--fs-small);font-weight:700;color:var(--link);text-decoration:underline;text-underline-offset:3px}
.packing-extra{padding:9px 10px;margin-top:5px;border-left:3px solid var(--gold);background:var(--surface-2);color:var(--ink);font-size:var(--fs-small);line-height:1.5}
.packing-extra b{display:block;font-size:var(--fs-meta);letter-spacing:.05em;color:var(--accent-text)}
.delivery-note{display:flex;align-items:center;gap:6px;font-size:var(--fs-small);font-weight:700;margin:8px 0;color:var(--ok-fg)}

/* ---------- 10. CHIPS (4×8, radius 6, bg/fg/line triads) ---------- */
.chip{display:inline-block;font-size:var(--fs-meta);font-weight:700;border:1px solid transparent;border-radius:var(--r-chip);padding:var(--s1) var(--s2);letter-spacing:.02em;line-height:1.4;max-width:100%;overflow-wrap:anywhere}
.chip.paid{background:var(--surface-2);color:var(--ink);border-color:var(--line)}           /* paid = a fact, not a green "done" — driven by o.paid */
.chip.cash{background:transparent;color:var(--att-fg);border-color:var(--att-line)}       /* money = gold outline, says COLLECT */
.chip.tast{background:var(--att-bg);color:var(--att-fg);border-color:var(--att-line)}      /* tasters / deferred = attention tint */
.chip.room{background:var(--info-bg);color:var(--info-fg);border-color:var(--info-line)}
.chip.warn{background:var(--info-bg);color:var(--info-fg);border-color:var(--info-line)}   /* substitutions, notes, reconciled = info */
.chip.ref{background:var(--surface-2);color:var(--ink);border-color:var(--line);font-weight:500}
.chip.new{background:var(--gold);color:var(--maroon-deep);border-color:var(--gold)}        /* the only filled-gold chip: NEW / CHANGED */
.chip.room[data-room]{display:inline-flex;align-items:center;justify-content:center;min-height:44px;min-width:44px;cursor:pointer;border:1px dashed var(--link);background:transparent;color:var(--link)}

/* ---------- 11. BANNERS ---------- */
.hold-banner{display:flex;align-items:center;gap:10px;margin:6px 0 2px;background:var(--danger-solid);color:var(--cream);border-radius:var(--r-ctl);padding:10px 12px;font-size:var(--fs-lead);font-weight:700;line-height:1.3}
.hold-banner .i{font-size:1.25em;color:var(--cream)}
.allergy-banner{display:flex;align-items:flex-start;gap:8px;margin:6px 0 2px;background:var(--danger-bg);color:var(--danger-fg);border:1px solid var(--danger-line);border-left-width:4px;border-radius:var(--r-ctl);padding:7px 10px;font-size:var(--fs-body);font-weight:700;line-height:1.5}
.allergy-banner .i{font-size:1.25em;margin-top:.1em}
.note-banner{display:flex;align-items:flex-start;gap:8px;margin:6px 0 2px;background:var(--info-bg);color:var(--info-fg);border:1px solid var(--info-line);border-left-width:4px;border-radius:var(--r-ctl);padding:7px 10px;font-size:var(--fs-small);font-weight:500;line-height:1.5}
.note-banner .i{font-size:1.2em;margin-top:.15em}
.cash-summary,.cash-notice{padding:7px 10px;background:var(--att-bg);color:var(--att-fg);border:1px solid var(--att-line);border-radius:var(--r-ctl);font-weight:500;font-size:var(--fs-small);line-height:1.5}
.cash-summary{padding:10px 14px}
.cash-notice{font-size:var(--fs-meta);margin-bottom:6px}

/* ---------- 12. BUTTONS ---------- */
.addbar{display:flex;gap:10px;flex-wrap:wrap;margin:10px 2px}
.btn{min-height:44px;border:1px solid transparent;border-radius:var(--r-ctl);padding:11px 16px;font-weight:700;font-size:var(--fs-body);cursor:pointer}
.btn.p{background:var(--maroon);color:#fff;border-color:var(--maroon)}
.btn.g{background:transparent;color:var(--att-fg);border-color:var(--att-line)}  /* money actions = gold outline */
.btn.o{background:var(--card);border-color:var(--line);color:var(--ink)}
.manual-edit{display:inline-flex;align-items:center;gap:6px;margin-top:10px;min-height:44px;padding:8px 14px}

/* ---------- 13. SHEET + FORMS ---------- */
.mask{position:fixed;inset:0;background:rgba(40,20,15,.45);display:none;align-items:flex-end;justify-content:center;z-index:50}
.mask.on{display:flex}
.sheet{background:var(--card);color:var(--ink);border:1px solid var(--line);border-radius:var(--r-card) var(--r-card) 0 0;width:100%;max-width:560px;padding:18px 18px 26px;box-shadow:var(--shadow-sheet);max-height:calc(100dvh - 24px);overflow-y:auto}
.sheet:focus{outline:none}
.sheet h3{font-weight:700;font-size:var(--fs-title);line-height:1.3;color:var(--heading);margin-bottom:12px}
.sheet input,.sheet select{min-height:44px}
.fld{display:flex;flex-direction:column;gap:5px;margin-bottom:12px}
.fld span{font-size:var(--fs-meta);color:var(--taupe);font-weight:500}
.fld input,.fld select{border:1px solid var(--line);border-radius:var(--r-ctl);padding:11px;font-size:16px;background:var(--bg);color:var(--ink);min-width:0} /* 16px: stops iOS focus-zoom */
.rowf{display:flex;gap:10px}.rowf>*{flex:1;min-width:0}
.regchips{display:flex;gap:7px;flex-wrap:wrap;margin-top:5px}
.regchips button{border:1px solid var(--line);background:var(--surface-2);color:var(--ink);border-radius:var(--r-pill);padding:6px 12px;min-height:44px;font-weight:700;font-size:var(--fs-small);cursor:pointer}
.manual-total{display:grid;align-content:center;gap:8px}
.manual-total>span{font-size:var(--fs-small)}
.manual-total output{font-weight:700;font-size:var(--fs-title);line-height:1.3}
.manual-error{padding:10px;background:var(--danger-bg);color:var(--danger-fg);border:1px solid var(--danger-line);border-radius:var(--r-chip)}
.manual-check{display:flex;align-items:center;gap:10px;margin:14px 0}
.manual-check input{width:22px;height:22px;min-height:22px;flex-shrink:0}
.manual-check span{font-size:var(--fs-body)}
#c-credit-fields[hidden]{display:none}

/* ---------- 14. CREDIT BOARD (money = gold outline) ---------- */
.credit-section{margin:var(--s4) 0;padding:var(--s4);border:1px solid var(--gold);border-radius:var(--r-card)}
.credit-section h2{font-weight:700;font-size:var(--fs-title);line-height:1.4;margin:0 0 8px;color:var(--heading)}
.credit-section h2 span{white-space:nowrap}
.credit-help{font-size:var(--fs-small);line-height:1.5}
.credit-row{display:flex;justify-content:space-between;gap:14px;padding:14px 0;border-top:1px solid rgba(200,154,59,.4)}
.credit-row p{font-size:var(--fs-small);line-height:1.5;margin:6px 0}
.credit-row small{font-size:var(--fs-meta)}
.credit-actions{display:flex;flex-direction:column;align-items:flex-end;justify-content:center;gap:8px;flex-shrink:0;text-align:right}
.credit-actions b{font-weight:700;font-size:var(--fs-title);line-height:1.3}
.credit-actions .btn{min-height:44px}

/* ---------- 15. ALERTS: new-order flash + toast (events = gold) ---------- */
#flash{position:fixed;inset:0;pointer-events:none;z-index:40;box-shadow:inset 0 0 0 6px var(--gold);opacity:0}
#flash.on{animation:flashpulse 1.1s ease-out 2}
@keyframes flashpulse{0%{opacity:0}15%{opacity:1}100%{opacity:0}}
.newtoast{position:fixed;left:50%;top:74px;transform:translateX(-50%) translateY(-24px);background:var(--gold);color:var(--maroon-deep);padding:14px 22px;border-radius:var(--r-card);font-weight:700;font-size:var(--fs-lead);box-shadow:var(--shadow-toast);opacity:0;z-index:60;pointer-events:none;max-width:90vw;text-align:center;transition:opacity .3s,transform .3s}
.newtoast.show{opacity:1;transform:translateX(-50%) translateY(0)}
.newtoast small{display:block;font-weight:500;font-size:var(--fs-small);margin-top:3px}
.new-order-ping{animation:flashpulse 1.1s ease-out 2}

/* ---------- 16. KIOSK — the fridge wall board (?kiosk=1, min(w,h) >= 600) ----------
   ONE multiplier scales every type role; --fs-meta is pinned to the 16px kiosk floor;
   --serif-k gives Cormorant its optical size on the display jobs; --fs-stat is held at the
   number role so the demoted secondaries never drop below the old stat tiles (52.5px).
   Header = wordmark · day label (~36) · clock (~36) · live dot. Day nav, theme, console,
   token, add-bar, refresh, revenue and the phone link on held cards are all hidden here. */
.ke-panel{display:none}   /* the panel; the STATE class .kiosk-empty lives on body — never style the bare state class */
body.kiosk{--k:1.25;--fs-meta:16px;--serif-k:1.3;--fs-stat:var(--fs-number);overflow:hidden;height:100vh;padding-bottom:0;-webkit-user-select:none;user-select:none;touch-action:pan-y}
body.kiosk .more,body.kiosk .menu,body.kiosk .bell,body.kiosk .daychip-sub,body.kiosk .addbar,body.kiosk footer,body.kiosk .pb-filter,body.kiosk .packbar,body.kiosk .status-detail,body.kiosk .hero-rev,body.kiosk .ord.held .tel-link{display:none!important}
body.kiosk:not(.kiosk-nav) .daynav{display:none}
body.kiosk .top{position:static}
body.kiosk .top-in{padding:10px 24px;gap:14px}
body.kiosk .daychip{pointer-events:none;background:transparent;border-color:transparent;padding:0 6px}
body.kiosk .daychip-day{font-size:calc(var(--fs-title)*var(--serif-k))}   /* 35.75px */
body.kiosk .clock{font-size:calc(29px*var(--k));min-width:0}              /* 36.25px */
body.kiosk .daytoggle{padding:8px 14px}
body.kiosk .newcount{padding:9px 16px}
body.kiosk .wrap{max-width:none;width:100%;padding:16px 24px 0;transform-origin:top center;will-change:transform}
body.kiosk .hero{margin:0 0 14px;padding:var(--s4) var(--s5);gap:var(--s3) var(--s5)}
body.kiosk .hero-prog{height:20px}
body.kiosk .sec{margin:0}
body.kiosk .rail .sec+.sec{margin-top:14px}
body.kiosk .rail{margin-bottom:14px}
body.kiosk .sec-h{margin:0 2px 8px}
body.kiosk .dish{padding:14px 20px;min-width:150px}
body.kiosk .drink{padding:10px 16px}
body.kiosk .locs{grid-template-columns:repeat(auto-fit,minmax(min(100%,250px),1fr));align-content:start}
body.kiosk .ord{margin:var(--s2);padding:var(--s2) var(--s3)}
body.kiosk .line{padding:3px 0}
body.kiosk .loc-body{padding:6px 6px 10px}
/* the kiosk EMPTY state — content-driven (zero orders for the service date while signed in): one calm panel */
body.kiosk.kiosk-empty .ke-panel{display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;gap:var(--s3);min-height:70vh;padding:var(--s6)}
body.kiosk.kiosk-empty .hero,body.kiosk.kiosk-empty .rail,body.kiosk.kiosk-empty #locations-section,body.kiosk.kiosk-empty #cash-summary,body.kiosk.kiosk-empty #credit-section{display:none}
.ke-wing{width:120px;height:136px;object-fit:contain;margin-bottom:var(--s3)}
.ke-day{font-family:var(--font-display);font-weight:700;font-size:calc(var(--fs-number)*var(--serif-k));line-height:1.1;color:var(--heading)}
.ke-msg{font-size:var(--fs-title);font-weight:500;color:var(--ink);margin:0}
.ke-next{font-size:var(--fs-lead);font-weight:500;color:var(--taupe);margin:0}
body.kiosk-scroll{overflow-y:auto;height:auto;min-height:100vh;padding-bottom:20px}
body.kiosk-scroll .wrap{will-change:auto}
/* PORTRAIT fridge (the hero screen): density without shrinking a single type size.
   - hero: the number and the three secondaries share one row; the subtitle + bar span the full width beneath (one line, not three)
   - rail: cook / drinks / extras are three one-row strips — title, then its tiles or pills flowing beside it
   - locations: ONE flow across two columns (three from 1300 wide). A location is unboxed here (display:contents) so its lane band,
     cards, pack-all and footer stream through the columns; cards never split, a band never ends a column, and pack-all + footer
     stay with the last card. The lane colour still reaches every card (custom properties inherit through display:contents).
   - cards: "Booked by" runs inline with the name, PACK EXTRA's label runs inline, the phone number is a plain line (nothing to tap on a fridge). */
@media(orientation:portrait){
  body.kiosk .hero{grid-template-columns:auto minmax(0,1fr);grid-template-areas:"l side" "n side" "sub sub" "prog prog";padding:var(--s3) var(--s4);gap:0 var(--s5)}
  body.kiosk .hero-main{display:contents}
  body.kiosk .hero-l{grid-area:l}
  body.kiosk .hero-n{grid-area:n}
  body.kiosk .hero-sub{grid-area:sub;margin:6px 0 10px}
  body.kiosk .hero-prog{grid-area:prog}
  body.kiosk .hero-side{grid-area:side;align-self:end;padding-bottom:8px}
  body.kiosk .rail .sec{display:flex;flex-wrap:wrap;align-items:center;gap:var(--s2) var(--s4)}
  body.kiosk .rail .sec+.sec{margin-top:12px}
  body.kiosk .rail .sec-h{margin:0;flex:0 0 auto}
  body.kiosk .rail .cook{flex:1 1 auto;max-width:100%}
  body.kiosk .rail .drinks{flex:1 1 0;min-width:min(100%,360px)}
  body.kiosk #drinks-section .sub{display:none}   /* "count out before you pack" — guidance copy, not data; the strip needs the row */
  body.kiosk .dish{display:flex;align-items:center;gap:var(--s3);flex:0 1 auto;min-width:0;max-width:100%;padding:10px 18px}
  body.kiosk .dish .nm{margin-top:0}
  body.kiosk .locs{display:block;columns:2;column-gap:var(--s4)}
  body.kiosk .locs>.empty{column-span:all}
  body.kiosk .loc{display:contents}
  body.kiosk .loc-h{border-radius:var(--r-card);margin:0 0 var(--s2);break-after:avoid;break-inside:avoid}
  body.kiosk .loc-body{padding:0}
  body.kiosk .loc-body .ord{margin:0 0 var(--s2)}
  body.kiosk .ord,body.kiosk .loc-body>.empty,body.kiosk .loc-actions,body.kiosk .loc-foot{break-inside:avoid}
  body.kiosk .loc-actions{padding:0;margin:0 0 var(--s2);break-before:avoid}
  body.kiosk .loc-foot{padding:var(--s2) var(--s1) 0;margin:0 0 var(--s5);break-before:avoid}
  body.kiosk .customer-name span{display:inline;margin:0 6px 0 0}
  body.kiosk .tel-link{min-height:0;margin-top:4px}
  body.kiosk .packing-extra b{display:inline;margin-right:8px}
}
@media(min-width:1300px) and (orientation:portrait){
  body.kiosk .locs{columns:3}
}
/* wide LANDSCAPE only: cook + drinks + extras in a left rail, locations fill the right */
@media(min-width:1000px) and (orientation:landscape){
  body.kiosk .wrap{display:grid;grid-template-columns:minmax(340px,28%) 1fr;grid-template-rows:auto auto auto 1fr;grid-template-areas:"hero hero" "cash cash" "credit credit" "rail locs";column-gap:24px;row-gap:16px;align-items:start}
  body.kiosk .wrap>.hero{grid-area:hero;margin:0}
  body.kiosk #cash-summary{grid-area:cash}
  body.kiosk #credit-section{grid-area:credit}
  body.kiosk .wrap>.rail{grid-area:rail;margin:0}
  body.kiosk .wrap>#locations-section{grid-area:locs}
  body.kiosk .ke-panel{grid-column:1/-1}
  body.kiosk .locs{grid-template-columns:repeat(auto-fit,minmax(320px,1fr))}
}

/* ---------- 17. PHONE (<= 720) ----------
   Every rule that changes a SIZE or the hero/rail/locations layout is scoped to body:not(.kiosk): a kiosk-eligible screen that is
   720 CSS px wide or less (min(w,h) >= 600 still opens kiosk — a 1080-px fridge panel at DPR 1.5 reports 720×1280) must keep every
   kiosk size and the kiosk layout. Header positioning lines (popovers, day nav, menu, pack bar) are harmless in kiosk and stay bare. */
@media(max-width:720px){
  body:not(.kiosk){--fs-number:34px;--fs-hero:calc(56px*var(--k));--fs-stat:var(--fs-body)}
  .wrap{padding:16px}
  .top-in{padding:10px 12px;gap:5px}
  body:not(.kiosk) .brand{margin-right:0;gap:0}
  body:not(.kiosk) .brand-wing{width:36px;height:42px}
  body:not(.kiosk) .brand-copy{display:none}
  .daychip{padding:6px 10px;gap:8px;flex:0 1 auto;overflow:hidden}
  .daychip-day{font-size:var(--fs-lead)}
  .daychip-sub{display:none}
  .status{padding:8px 10px}
  .status-detail{display:none}
  .bell,.more{min-width:38px;padding:6px}
  .clock{min-width:0;font-size:var(--fs-body)}
  .daynav{left:8px;right:8px;max-width:none}
  .daynav .daytoggle{padding:10px;min-width:44px}
  .daynav .daypick{flex:1;justify-content:center}
  .daypick input{width:100%}
  .menu{right:8px}
  .pb-in{padding:10px 16px;gap:10px;flex-wrap:wrap}
  .pb-prog{min-width:70px}
  /* hero: the number, then the secondaries as one footer line */
  body:not(.kiosk) .hero{grid-template-columns:1fr;padding:var(--s4);gap:var(--s3)}
  body:not(.kiosk) .hero-sub{font-size:var(--fs-body)}
  body:not(.kiosk) .hero-side{justify-content:flex-start;align-items:baseline;gap:4px 0;border-top:1px dashed var(--line);padding-top:var(--s3)}
  body:not(.kiosk) .kv{display:inline-flex;gap:5px;text-align:left;align-items:baseline}
  body:not(.kiosk) .kv b{font-size:var(--fs-body);letter-spacing:0;line-height:1.4}
  body:not(.kiosk) .kv span{font-size:var(--fs-body);font-weight:500;letter-spacing:0;text-transform:none;line-height:1.4}
  body:not(.kiosk) .kv+.kv::before{content:"·";margin:0 7px;color:var(--taupe)}
  body:not(.kiosk) .dish{flex:1 1 150px;min-width:0;padding:13px}
  body:not(.kiosk) .sec-h .sub{flex-basis:100%}
  body:not(.kiosk) .locs{grid-template-columns:1fr}
}
@media(max-width:480px){
  .credit-row{flex-wrap:wrap}
  .credit-actions{width:100%;flex-direction:row;justify-content:space-between}
}

/* ---------- 18. DESKTOP GRID (>= 1200, normal board only) ---------- */
@media(min-width:1200px){
  body:not(.kiosk)>.wrap{display:grid;grid-template-columns:260px minmax(0,1fr);grid-template-areas:"hero hero" "cash cash" "credit credit" "rail locations" "foot foot";grid-template-rows:auto auto auto 1fr auto;gap:20px 24px;align-items:start}
  body:not(.kiosk)>.wrap>.hero{grid-area:hero;margin:0}
  body:not(.kiosk) #cash-summary{grid-area:cash}
  body:not(.kiosk) #credit-section{grid-area:credit;margin:0}
  body:not(.kiosk)>.wrap>.rail{grid-area:rail}
  body:not(.kiosk) #locations-section{grid-area:locations}
  body:not(.kiosk)>.wrap .sec{margin:0}
  body:not(.kiosk) .rail .sec+.sec{margin-top:20px}
  body:not(.kiosk)>.wrap>footer{grid-area:foot;margin:4px 0;padding:0}
  body:not(.kiosk) .locs{grid-template-columns:repeat(auto-fit,minmax(min(100%,300px),1fr))}
  body:not(.kiosk) .dish{flex-basis:100%}
  body:not(.kiosk) #cook-section .sub,body:not(.kiosk) #drinks-section .sub{flex-basis:100%}
}

/* ---------- 19. REDUCED MOTION ---------- */
@media(prefers-reduced-motion:reduce){*,*::before,*::after{animation:none!important;transition:none!important;scroll-behavior:auto!important}#flash.on{opacity:0}}
