/* Scan & Pay — the shop's own objects: shelf-edge price labels, till paper,
   rubber stamps. Yellow means "a price" and nothing else. */
@font-face{font-family:"Sofia Sans";src:url(/static/vendor/sofia-sans.woff2) format("woff2");font-weight:100 1000;font-display:swap}
@font-face{font-family:"Sofia Sans XC";src:url(/static/vendor/sofia-sans-extra-condensed.woff2) format("woff2");font-weight:100 1000;font-display:swap}

:root{
  --ink:#14213a;--ink-2:#46536b;--line:#c9d1da;--floor:#e6eaee;--paper:#fff;
  --label:#ffd12e;--paid:#0b7a4f;--paid-bg:#e3f4ec;--hold:#c4291c;--hold-bg:#fde9e6;--wait:#8a5a00;--wait-bg:#fff3d1;
  --body:"Sofia Sans",system-ui,-apple-system,"Segoe UI",Roboto,sans-serif;
  --display:"Sofia Sans XC","Sofia Sans",system-ui,sans-serif;
  --r:12px;
}
*{box-sizing:border-box}
[hidden]{display:none!important}
html{-webkit-text-size-adjust:100%}
body{margin:0;font:400 1.0625rem/1.5 var(--body);font-variant-numeric:tabular-nums;color:var(--ink);background:var(--floor)}
main{max-width:34rem;margin:0 auto;padding:1rem 1rem 2rem}
main:has(table){max-width:68rem}
main:has(.home){max-width:62rem}
body:has(.home) .foot,body:has(table) .foot{max-width:62rem}
section{margin:1.25rem 0}
h1,h2,h3{font-family:var(--display);font-weight:800;line-height:1.02;margin:0 0 .5rem;letter-spacing:.005em}
h1{font-size:2.75rem}
h2{font-size:1.75rem;margin-top:.25rem}
h3{font-size:1.35rem}
p{margin:.5rem 0;max-width:62ch}
a{color:var(--ink);text-underline-offset:.18em;text-decoration-thickness:.08em}
a:hover{text-decoration-thickness:.14em}
strong{font-weight:700}
code{font-family:inherit;font-size:.92em;overflow-wrap:anywhere;background:#eef1f4;padding:.05em .3em;border-radius:4px}
del{color:var(--ink-2)}
.sr{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}
.skip{position:absolute;left:-999px}.skip:focus{left:.5rem;top:.5rem;background:var(--paper);padding:.6rem;z-index:20}
:focus-visible{outline:3px solid var(--ink);outline-offset:3px;box-shadow:0 0 0 3px var(--label)}

/* ---- chrome ---- */
.demo-banner{background:var(--ink);color:var(--label);font-weight:700;font-size:.85rem;text-align:center;padding:.3rem .75rem}
.demo-banner.test{color:#cfe0ff}
.top{display:flex;flex-wrap:wrap;gap:.25rem 1.25rem;align-items:center;padding:.5rem 1rem;background:var(--paper);border-bottom:1px solid var(--line)}
.brand{display:inline-flex;align-items:center;gap:.55rem;min-height:44px;font:800 1.6rem/1 var(--display);text-decoration:none;color:var(--ink)}
.bars{display:inline-block;width:1.55rem;height:1.35rem;background:repeating-linear-gradient(90deg,var(--ink) 0 3px,transparent 3px 5px,var(--ink) 5px 6px,transparent 6px 9px,var(--ink) 9px 13px,transparent 13px 15px)}
.bars.wide{width:5.5rem;height:1.1rem;margin-right:.5rem;vertical-align:middle}
.staffnav{display:flex;gap:1.1rem;align-items:center;overflow-x:auto;flex:1 1 100%;white-space:nowrap;scrollbar-width:thin}
.staffnav button.link{margin-left:auto}
.staffnav a{display:inline-flex;align-items:center;min-height:44px;font-weight:600;text-decoration:none;border-bottom:3px solid transparent}
.staffnav a:hover{border-bottom-color:var(--label)}
.foot{max-width:34rem;margin:0 auto;padding:0 1rem 6rem;color:var(--ink-2);font-size:.85rem}
#flash,#offline{max-width:34rem;margin:.75rem auto;position:sticky;top:.5rem;z-index:5}

/* ---- text helpers ---- */
.over{margin:0 0 .1rem;color:var(--ink-2);font-weight:600}
.lede{font-size:1.2rem;line-height:1.4;max-width:34ch}
.hint,.meta{color:var(--ink-2);font-size:.9rem}
.meta{margin:0}
.smallprint{color:var(--ink-2);font-size:.8rem;line-height:1.4;margin:.6rem 0 0}
.empty{color:var(--ink-2);padding:.5rem 0}
.center{text-align:center;margin-inline:auto}
.plain{padding-left:1.1rem;margin:.5rem 0}.plain li{margin:.35rem 0;max-width:60ch}
.quiet{color:var(--ink-2)}
.quiet h2{color:var(--ink)}

/* ---- controls ---- */
button,select,input{font:inherit;color:inherit}
button,summary,input[type=file]{min-height:44px;min-width:44px}
.btn{display:inline-flex;align-items:center;justify-content:center;min-height:48px;min-width:48px;padding:.6rem 1.15rem;border-radius:var(--r);border:2px solid var(--ink);background:var(--ink);color:#fff;font-weight:700;text-decoration:none;cursor:pointer;line-height:1.15;text-align:center}
.btn:hover{background:#0c1629}
.btn:active{transform:translateY(1px)}
.btn.secondary{background:var(--paper);color:var(--ink)}
.btn.secondary:hover{background:#f1f4f7}
.btn.big{min-height:60px;font-size:1.2rem;width:100%}
.btn.small{min-height:44px;padding:.3rem .7rem;font-size:.85rem}
.btn.grow{flex:1}
.btn[disabled],button[disabled]{opacity:.45;cursor:not-allowed;transform:none}
button.link{background:none;border:0;padding:.25rem .5rem;text-decoration:underline;text-underline-offset:.18em;cursor:pointer;font-weight:600}
form button:not(.btn):not(.link){padding:.5rem 1rem;border-radius:var(--r);border:2px solid var(--ink);background:var(--paper);font-weight:700;cursor:pointer}
label{display:block;font-weight:600;margin:.85rem 0 .25rem}
form>.btn,form>button{margin-top:.85rem}
label.inline{margin:0}
label.check{display:flex;gap:.7rem;align-items:flex-start;font-weight:500;min-height:44px;margin:.5rem 0}
label.check input{width:1.5rem;height:1.5rem;min-height:0;flex:none;margin:.1rem 0 0;accent-color:var(--ink)}
label.accept{background:var(--paper);border:2px solid var(--ink);border-radius:var(--r);padding:.85rem;font-weight:600;margin:1rem 0}
label.filebtn{margin:0}
input[type=text],input[type=email],input[type=password],input[type=date],input:not([type]),select{width:100%;min-height:48px;padding:.55rem .7rem;border:2px solid #8793a5;border-radius:10px;background:var(--paper)}
input:focus,select:focus{border-color:var(--ink)}
select{min-width:4.5rem}
input[readonly]{background:#eef1f4;border-style:dashed}
input[type=file]{width:100%;padding:.4rem 0;font-size:.95rem}
input[type=file]::file-selector-button{font:inherit;font-weight:700;min-height:44px;margin-right:.75rem;padding:.4rem 1rem;border-radius:var(--r);border:2px solid var(--ink);background:var(--paper);color:var(--ink);cursor:pointer}
fieldset{border:0;border-top:2px dashed var(--line);margin:1rem 0 0;padding:.75rem 0 0}
legend{font:800 1.25rem/1 var(--display);padding:0 .5rem 0 0}
.row{display:flex;flex-wrap:wrap;gap:.6rem;align-items:center;margin:.75rem 0}
.row>input,.row>select{flex:1;min-width:7rem;width:auto}
.row.join{flex-wrap:nowrap}
.stack{display:grid;gap:.6rem;justify-items:stretch;margin:1rem 0 0}
.pair{display:grid;grid-template-columns:1fr 1fr;gap:.75rem}
.grow{flex:1;min-width:0}
.picker{margin:0 0 1rem;max-width:30rem}
.busy{display:none;color:var(--ink-2)}
.htmx-request .busy,.htmx-request.busy{display:inline}
details.report{margin-top:.4rem}
details.report summary{display:flex;align-items:center;cursor:pointer;font-weight:600;text-decoration:underline;text-underline-offset:.18em}

/* ---- stepper: the shopping steps are a sequence ---- */
.steps{display:flex;gap:0;margin:.75rem 0 1.25rem;border-bottom:2px solid var(--line)}
.steps a{flex:1;display:flex;align-items:center;justify-content:center;gap:.45rem;min-height:48px;padding:.3rem .25rem;text-decoration:none;font-weight:600;color:var(--ink-2);border-bottom:4px solid transparent;margin-bottom:-2px;white-space:nowrap}
.steps .n{display:inline-grid;place-items:center;width:1.6rem;height:1.6rem;border-radius:50%;border:2px solid currentColor;font:800 1.05rem/1 var(--display)}
.steps a[aria-current]{color:var(--ink);border-bottom-color:var(--ink)}
.steps a[aria-current] .n{background:var(--ink);color:#fff;border-color:var(--ink)}

/* ---- surfaces ---- */
.card{background:var(--paper);border:1px solid var(--line);border-radius:16px;padding:1rem}
.card.narrow{max-width:24rem;margin-inline:auto}
.card.bad{background:var(--hold-bg);border:2px solid var(--hold)}
.card.result{border:2px solid var(--ink)}
.hero{padding:1rem 0 .5rem}
.hero h1{font-size:clamp(3rem,13vw,4.75rem);line-height:.92;max-width:11ch}

/* Till paper: square corners, dashed tear lines, torn bottom edge. */
.paper{position:relative;background:var(--paper);padding:1rem 1rem 1.4rem;margin:.75rem 0 1.4rem;
  --tooth:12px;
  mask:conic-gradient(from -45deg at bottom,#0000,#000 1deg 89deg,#0000 90deg) bottom/var(--tooth) 51% repeat-x,linear-gradient(#000 0 0) top/100% calc(100% - var(--tooth)/2 + 1px) no-repeat;
  -webkit-mask:conic-gradient(from -45deg at bottom,#0000,#000 1deg 89deg,#0000 90deg) bottom/var(--tooth) 51% repeat-x,linear-gradient(#000 0 0) top/100% calc(100% - var(--tooth)/2 + 1px) no-repeat}
.card .paper{padding-inline:0;margin-bottom:.5rem;mask:none;-webkit-mask:none}
.lines{list-style:none;margin:0;padding:0}
.line{display:flex;gap:.75rem;align-items:flex-start;padding:.75rem 0;border-bottom:2px dashed var(--line)}
.name{font-weight:700;overflow-wrap:anywhere;line-height:1.25}
.variant{font-weight:500;color:var(--ink-2)}
.amount{font-weight:700;text-align:right;white-space:nowrap}
.thumb{width:3.25rem;height:3.25rem;object-fit:cover;border-radius:8px;background:#eef1f4;flex:none}
.total{display:flex;justify-content:space-between;gap:1rem;align-items:baseline;padding:.85rem 0 0}
.total span{color:var(--ink-2);font-weight:600}
.total strong{font:800 2.5rem/1 var(--display);white-space:nowrap}
.qty{display:flex;gap:.5rem;align-items:center;margin-top:.5rem}
.qty button:not(.link){width:44px;height:44px;border:2px solid var(--ink);background:var(--paper);border-radius:50%;font-size:1.3rem;font-weight:800;line-height:1;cursor:pointer;padding:0}
.qty span{min-width:1.75rem;text-align:center;font:800 1.5rem/1 var(--display)}
.facts{display:grid;grid-template-columns:auto 1fr;gap:.2rem 1rem;margin:.5rem 0}
.facts dt{color:var(--ink-2)}.facts dd{margin:0;font-weight:700;overflow-wrap:anywhere}

/* ---- the shelf label: the one loud thing ---- */
.tag{display:inline-flex;align-items:flex-start;gap:0;background:var(--label);color:var(--ink);padding:.3rem .9rem .9rem .7rem;border-radius:5px;font:800 4.5rem/.9 var(--display);position:relative}
.tag::after{content:"";position:absolute;left:.7rem;right:.9rem;bottom:.3rem;height:.4rem;background:repeating-linear-gradient(90deg,var(--ink) 0 2px,transparent 2px 4px,var(--ink) 4px 5px,transparent 5px 8px,var(--ink) 8px 11px,transparent 11px 13px)}
.tag-cur{font-size:.3em;line-height:1.5;font-weight:800;margin-right:.15em}
.tag-frac{font-size:.5em;line-height:1.15;margin-left:.04em}
.price{margin:.9rem 0 .25rem}
.product .tag{animation:hang .32s cubic-bezier(.2,.9,.3,1.3)}
@keyframes hang{from{transform:translateY(-10px) rotate(-3deg);opacity:0}to{transform:none;opacity:1}}
.product-head{display:flex;gap:.9rem;align-items:flex-start}
.product-head h2{margin-top:.1rem}
.photo{display:block;width:5.5rem;height:5.5rem;object-fit:cover;border-radius:10px;background:#eef1f4;flex:none}
form .photo{width:9rem;height:9rem;margin:.25rem 0}
.shelf{margin:1.5rem 0 0}
.shelf-label{display:inline-grid;gap:.45rem;background:var(--paper);border-radius:6px;padding:.8rem .9rem .7rem;border-bottom:8px solid var(--ink)}
.shelf-name{font-weight:700;max-width:14rem;line-height:1.2}
.shelf-code{display:flex;align-items:center;color:var(--ink-2);font-size:.85rem}
.shelf figcaption{color:var(--ink-2);font-size:.9rem;margin-top:.6rem;max-width:30ch}
.doors{display:grid;gap:1rem;margin-top:1rem;grid-template-columns:repeat(auto-fit,minmax(min(100%,22rem),1fr))}
.door{display:flex;gap:1.25rem;align-items:center;background:var(--paper);border-radius:16px;padding:1.1rem;border:1px solid var(--line)}
.door .qr{width:8.5rem;flex:none;margin:0;border:0;padding:0}
.door-body{display:grid;gap:.85rem;justify-items:start;min-width:0}
.door h3{margin:0;font-size:1.6rem;overflow-wrap:anywhere}
.door .btn{white-space:nowrap}

/* ---- rubber stamps for status ---- */
.stamp{display:inline-block;margin:.4rem .5rem .4rem 0;padding:.25rem .65rem .2rem;border:3px solid currentColor;border-radius:5px;font:800 1.5rem/1.05 var(--display);letter-spacing:.03em;transform:rotate(-2deg);color:var(--ink)}
.stamp.ok{color:var(--paid);background:var(--paid-bg)}
.stamp.warn{color:var(--wait);background:var(--wait-bg)}
.stamp.bad{color:var(--hold);background:var(--hold-bg)}
.stamps{display:flex;flex-wrap:wrap;gap:.25rem;margin:.75rem 0 .25rem}
.receipt .stamps{justify-content:center;margin-top:1rem}
.receipt{text-align:left}
.receipt h1{font-size:2.4rem;text-align:center}
.demo-line{text-align:center;font-weight:700;border-bottom:2px dashed var(--line);padding-bottom:.6rem;margin-top:0;max-width:none}
.qr{display:block;width:min(100%,15rem);height:auto;margin:1rem auto .5rem;image-rendering:pixelated;background:#fff}

/* ---- messages ---- */
.notice{padding:.7rem .9rem;border-left:5px solid var(--ink);background:var(--paper);margin:.75rem 0;border-radius:0 8px 8px 0}
.notice p{margin:.2rem 0}
.notice.warn{border-left-color:var(--wait);background:var(--wait-bg)}
.notice.bad{border-left-color:var(--hold);background:var(--hold-bg)}
.notice.ok{border-left-color:var(--paid);background:var(--paid-bg)}
.notice.small{font-size:.88rem;padding:.4rem .6rem;margin:.4rem 0}
.notice table{margin-top:.4rem}
.operator{margin-top:1.25rem;padding:.85rem;border:2px dashed var(--wait);border-radius:var(--r);background:var(--wait-bg)}
.operator h2{font-size:1.35rem}

/* ---- camera ---- */
.camera{background:#000;border-radius:var(--r);overflow:hidden;margin:0 0 .75rem;position:relative}
.camera video{display:block;width:100%;max-height:46vh;object-fit:cover}
.camera::after{content:"";position:absolute;left:12%;right:12%;top:50%;height:2px;background:var(--label)}

/* ---- thumb bar ---- */
.actionbar{position:sticky;bottom:0;z-index:4;display:flex;gap:.6rem;margin:1rem -1rem 0;padding:.7rem 1rem calc(.7rem + env(safe-area-inset-bottom));background:var(--floor);border-top:2px solid var(--ink)}
.actionbar .btn{flex:1}
.actionbar .btn:last-child{flex:1.6}

/* ---- staff: tables and proposals ---- */
table{border-collapse:collapse;width:100%;font-size:.95rem}
th,td{text-align:left;padding:.6rem .7rem;border-bottom:1px solid var(--line);vertical-align:top}
th{font-weight:700;white-space:nowrap;border-bottom:2px solid var(--ink)}
.scroll{overflow-x:auto;margin:.5rem 0}
td form{display:flex;gap:.4rem;min-width:16rem}
.status{display:inline-block;font-weight:700;padding:.05rem .5rem;border-radius:99px;background:#eef1f4;white-space:nowrap}
.s-PAID,.s-APPROVED,.s-SUCCEEDED{background:var(--paid-bg);color:var(--paid)}
.s-PENDING,.s-REQUESTED,.s-AWAITING_PAYMENT,.s-REFUND_PENDING,.s-UNKNOWN{background:var(--wait-bg);color:var(--wait)}
.s-REJECTED,.s-STALE,.s-FAILED,.s-CANCELLED{background:var(--hold-bg);color:var(--hold)}
.flag{font-size:.85rem;color:var(--hold);font-weight:600;white-space:nowrap}
.proposal{border-top:2px dashed var(--line);padding:1rem 0}
.proposal:first-of-type{border-top:0}
.proposal header{display:flex;flex-wrap:wrap;gap:.3rem .75rem;align-items:baseline;margin-bottom:.4rem}
.byline{color:var(--ink-2);font-size:.9rem}
.preview{border-top:2px dashed var(--line);margin-top:1rem;padding-top:.75rem}
.cashier-row:first-child{border-top:0;padding-top:0;margin-top:0}

@media (min-width:44rem){
  main{padding:1.5rem 1.5rem 3rem}
  h1{font-size:3.25rem}
  .actionbar{position:static;margin-inline:0;padding-inline:0;background:none;border-top:0}
  .foot{padding-bottom:2rem}
}
/* numbered steps: only for a real sequence (how a shopping trip goes) */
.howto{list-style:none;counter-reset:step;margin:1rem 0 0;padding:0;display:grid;gap:.9rem;max-width:26rem}
.howto li{counter-increment:step;display:grid;grid-template-columns:2.4rem 1fr;gap:.2rem .75rem;align-items:start}
.howto li::before{content:counter(step);font:800 2.4rem/.9 var(--display);color:var(--ink)}
.howto b{font-weight:700}
/* entrance sign: a shelf-edge label grown to door size */
.sign{background:var(--paper);border-radius:8px;border-bottom:14px solid var(--ink);padding:1.5rem 1.25rem 1.25rem;margin:1rem 0;text-align:center}
.sign-brand{display:flex;gap:.5rem;align-items:center;justify-content:center;margin:0 0 1.25rem;font:800 1.5rem/1 var(--display)}
.sign-over{margin:0;color:var(--ink-2);font-weight:600}
.sign-name{font-size:clamp(2.75rem,12vw,4.5rem);line-height:.92;margin:.15rem 0 0;overflow-wrap:anywhere}
.sign .qr{width:min(100%,18rem);margin:1.25rem auto}
.sign .howto{text-align:left;margin:0 auto}
.sign-url{margin:1.25rem 0 0;color:var(--ink-2);font-size:.9rem;overflow-wrap:anywhere}
@media print{
  @page{margin:14mm}
  .no-print,.demo-banner,.top,.foot,.skip,.notice{display:none!important}
  body{background:#fff}
  main{max-width:none;padding:0}
  .sign{margin:0;border-radius:0;padding:0 0 10mm;break-inside:avoid}
  .sign-brand{font-size:22pt;margin-bottom:12mm}
  .sign-over{font-size:16pt}
  .sign-name{font-size:54pt}
  .sign .qr{width:95mm;margin:10mm auto}
  .sign .howto{font-size:15pt;max-width:130mm}
  .sign .howto li::before{font-size:30pt}
  .sign-url{font-size:10pt}
}
@media (min-width:56rem){
  .home .hero .howto{justify-self:end;font-size:1.15rem;margin:0}
  .home .hero{display:grid;grid-template-columns:minmax(0,1.25fr) minmax(0,1fr);gap:3rem;align-items:center;padding:2.5rem 0 1.5rem}
  .home .hero h1{font-size:6rem;max-width:13ch}
  .home .lede{font-size:1.35rem;max-width:32ch}
  .home .shelf{margin:0;justify-self:end}
  .home .shelf .tag{font-size:6.5rem}
  .home .shelf-name{font-size:1.2rem;max-width:20rem}
  .home .door{padding:1.5rem}
  .home .door .qr{width:11rem}
  .home .door h3{font-size:2rem}
}
@media (prefers-reduced-motion:reduce){*{animation:none!important;transition:none!important;scroll-behavior:auto}}
