*{box-sizing:border-box;margin:0;padding:0}
:root{--bg:#0B0E1A;--card:#151A2E;--line:#262E4D;--txt:#F2F4FA;--mut:#9AA5C4;--acc:#38E1FF;--grn:#22C55E;--amb:#F59E0B;--red:#EF4444;--txt-card:#F2F4FA;--mut-card:#9AA5C4;--line-card:#262E4D;--input-bg:#0E1222;--link:#38E1FF;--link-card:#38E1FF;--btn-txt:#04222B;--btn-grn-txt:#06280F}
/* v1.14 auto-contrast: text inside a card uses card-derived colours, text on the page uses page-derived colours (see theme_style_tag in store.php) */
.card{color:var(--txt-card)}
.card .mut,.card label,.card .crow .clab{color:var(--mut-card)}
.card a{color:var(--link-card)}
.card .btn.ghost{color:var(--txt-card);border-color:var(--line-card)}
.ocard{color:var(--txt-card)}
.ocard .nm{color:var(--mut-card)}
.sheet-card{color:var(--txt-card)}
.install-hint{color:var(--mut-card)}
.install-hint .x{color:var(--mut-card)}
body{background:var(--bg);color:var(--txt);font-family:'Segoe UI',Tahoma,Arial,sans-serif;min-height:100vh;padding:20px 16px 40px}
.wrap{max-width:520px;margin:0 auto}
.wrap.wide{max-width:980px}
h1{font-size:26px;text-align:center;margin:10px 0 4px}
.sub{text-align:center;color:var(--mut);margin-bottom:22px;font-size:15px}
.card{background:var(--card);border:1px solid var(--line-card);border-radius:16px;padding:18px;margin-bottom:14px}
input,button,select{font-family:inherit;font-size:17px}
input[type=text],input[type=number],input[type=password],input[type=url]{width:100%;background:var(--input-bg);border:1px solid var(--line);border-radius:12px;color:var(--txt);padding:14px;text-align:center}
input[type=tel]{width:100%;background:var(--input-bg);border:1px solid var(--line);border-radius:12px;color:var(--txt);padding:14px}
input.small{text-align:start;padding:11px}
.btn{display:block;width:100%;border:none;border-radius:12px;padding:15px;background:var(--acc);color:var(--btn-txt);font-weight:700;cursor:pointer;text-align:center;text-decoration:none}
.btn.grn{background:var(--grn);color:var(--btn-grn-txt)}
.btn.ghost{background:transparent;border:1px solid var(--line);color:var(--txt)}
.btn.red{background:var(--red);color:#fff}
.btn:disabled{opacity:.5}
.big-num{font-size:84px;font-weight:800;text-align:center;line-height:1.05}
.status{text-align:center;font-size:21px;font-weight:700;margin:8px 0}
.mut{color:var(--mut);text-align:center;font-size:15px}
.flash{animation:fl 1s infinite}
@keyframes fl{0%,100%{background:var(--grn)}50%{background:#15803D}}
body.ready{padding:0}
body.ready .wrap{max-width:none}
.readybox{min-height:100vh;display:flex;flex-direction:column;justify-content:center;padding:24px}
.grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(215px,1fr));gap:12px}
.ocard{background:var(--card);border:1px solid var(--line);border-radius:14px;padding:14px}
.ocard .n{font-size:40px;font-weight:800}
.ocard .nm{color:var(--mut);min-height:20px}
.ocard .t{color:var(--amb);font-weight:700;margin:6px 0 10px}
.ocard.ready{border-color:var(--grn)}
/* v1.7 — ready cards pulse gently so the cashier's eye stays on uncollected orders */
@keyframes nidaa-flash{0%,100%{box-shadow:0 0 0 0 rgba(34,197,94,0)}50%{box-shadow:0 0 0 5px rgba(34,197,94,.45)}}
.ocard.ready{animation:nidaa-flash 1.8s ease-in-out infinite}
.row{display:flex;gap:8px}
.row .btn{padding:11px;font-size:15px}
label{display:block;color:var(--mut);font-size:14px;margin:10px 0 5px;text-align:start}
.topbar{display:flex;justify-content:space-between;align-items:center;margin-bottom:14px}
a{color:var(--link)}
.lang{position:fixed;top:12px;inset-inline-start:12px;background:var(--card);border:1px solid var(--line-card);color:var(--txt-card);border-radius:999px;padding:7px 14px;cursor:pointer;font-size:14px}
.err{background:#3B1220;border:1px solid var(--red);color:#FCA5A5;border-radius:12px;padding:12px;text-align:center;margin-bottom:12px}
.stars{font-size:34px;text-align:center;letter-spacing:4px}
.logo{display:block;margin:4px auto 12px;max-height:90px;max-width:82%;object-fit:contain}
.logo.poster{max-height:110px}
input[type=color]{width:58px;height:44px;border:1px solid var(--line);border-radius:10px;background:#0E1222;padding:4px;cursor:pointer}
.crow{display:flex;align-items:center;gap:10px;margin:8px 0}
.crow .clab{flex:0 0 168px;color:var(--mut);font-size:14px;text-align:start}
.crow input[type=text]{flex:1;text-align:left}
.logoprev{max-height:80px;max-width:70%;display:block;margin:6px 0}
.sel{width:100%;background:var(--input-bg);border:1px solid var(--line);border-radius:12px;color:var(--txt);padding:11px}
/* v1.3 — "Add a shortcut" bottom sheet on the tracking page */
.sheet{position:fixed;left:0;right:0;bottom:0;z-index:60;padding:26px 12px calc(14px + env(safe-area-inset-bottom));background:linear-gradient(transparent,rgba(0,0,0,.55) 35%)}
.sheet-card{background:var(--card);border:1px solid var(--line);border-radius:18px;padding:20px;max-width:520px;margin:0 auto;box-shadow:0 12px 40px rgba(0,0,0,.55)}
.sheet-title{font-size:20px;font-weight:800;margin-bottom:8px}
.shareic{display:inline-block;border:1.5px solid var(--acc);color:var(--acc);border-radius:7px;padding:0 7px;font-weight:800;line-height:1.5}
@media print{.noprint{display:none}}
/* v1.4 — big order-number field + on-page numeric keypad + install hint */
.num-big{font-size:44px;font-weight:800;padding:18px 14px;letter-spacing:2px}
.keypad{display:grid;grid-template-columns:repeat(3,1fr);gap:10px;margin:4px 0 14px}
.key{border:1px solid var(--line);background:#0E1222;color:#F2F4FA;border-radius:14px;padding:18px 0;font-size:30px;font-weight:800;cursor:pointer}
.key:active{background:var(--line)}
.key.fn{color:var(--acc);font-size:22px}
.install-hint{background:var(--card);border:1px solid var(--line);border-radius:14px;padding:12px 14px;margin-bottom:14px;font-size:14px;color:var(--mut);align-items:center;gap:10px}
.install-hint .ibtn{flex:0 0 auto;background:var(--acc);color:var(--btn-txt);border:none;border-radius:10px;padding:9px 14px;font-weight:700;cursor:pointer;font-size:14px}
.install-hint .x{margin-inline-start:auto;background:none;border:none;color:var(--mut);font-size:18px;cursor:pointer;padding:4px 8px}
/* v1.9 — customer progress ring: replaces the written minutes on track.php.
   SVG circle r=100, circumference 628.32; dashoffset is set by track.php each poll. */
.ring-wrap{position:relative;width:220px;height:220px;margin:14px auto 10px}
.ring-svg{width:100%;height:100%;transform:rotate(-90deg)}
.ring-track{fill:none;stroke:var(--line);stroke-width:12}
.ring-prog{fill:none;stroke:var(--acc);stroke-width:12;stroke-linecap:round}
.ring-center{position:absolute;inset:0;display:flex;align-items:center;justify-content:center}
.ring-num{font-size:64px;font-weight:800;line-height:1}
.ring-overdue .ring-prog{stroke:var(--amb);animation:ring-pulse 1.6s ease-in-out infinite}
.ring-indet .ring-prog{animation:ring-pulse 1.6s ease-in-out infinite}
@keyframes ring-pulse{0%,100%{opacity:1}50%{opacity:.55}}
/* v1.10 — cashier order-number field: full-width first row, large type.
   The add form is a wrapping flex row, so flex-basis 100% puts this field
   on its own line above name / minutes / Add, on any screen width. */
.cashier-num{flex:1 1 100%;font-size:36px;font-weight:800;padding:18px 14px;letter-spacing:1px}
/* v1.11 — ui-ux-pro-max: accessibility + touch targets (CSS only, no logic change).
   - focus-visible: a clear 3px accent ring on every interactive element.
   - reduced-motion: the three infinite alert animations stop (the alert
     itself — sound, colour, status text — still works, only motion stops).
   - touch targets: secondary controls that were under 44px are raised to
     44px min-height (language button, install-hint buttons, row buttons,
     selects). Primary buttons, inputs and keypad keys were already ≥44px. */
:root{--motion-fast:150ms;--motion-base:200ms;--motion-slow:300ms}
:focus-visible{outline:3px solid var(--acc);outline-offset:3px}
@media (prefers-reduced-motion:reduce){
  *,*::before,*::after{animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important}
}
.row .btn{min-height:44px;display:flex;align-items:center;justify-content:center}
.lang{min-height:44px;display:inline-flex;align-items:center}
.sel{min-height:44px}
.install-hint .ibtn{min-height:44px;display:inline-flex;align-items:center}
.install-hint .x{min-width:44px;min-height:44px;display:inline-flex;align-items:center;justify-content:center}

/* v1.16 — cashier order-card buttons: two rows, no overflow.
   Row 1: main action fills the row, Cancel stays a fixed 48px icon.
   Row 2: QR and Receipt share the row equally, text never wraps out.
   Ghost buttons inside an order card use card colours, not page colours,
   so QR/Receipt text stays readable on a coloured card. */
.ocard .row{flex-wrap:wrap}
.ocard .row .btn{width:auto;flex:1 1 auto;min-width:0;white-space:nowrap;padding:11px 8px;font-size:14px}
.ocard .row .btn.red{flex:0 0 48px}
.ocard .btn.ghost{color:var(--txt-card);border-color:var(--line-card)}
.ocard-main{margin-top:4px}
.ocard-sec{margin-top:8px}

/* v1.19 — app footer, on every page including receipts (print included). */
.app-footer{text-align:center;color:var(--mut);font-size:13px;margin-top:24px}
.app-footer a{color:var(--link)}
.poster .app-footer,.receipt .app-footer{color:#555}
@media print{.app-footer{color:#555}}
