:root{--bg:#f2f2f0;--card:#fff;--ink:#000;--mute:#6b6b6b;--line:#dcdcd8;--r:14px}
*{box-sizing:border-box}
html,body{margin:0}
html{-webkit-text-size-adjust:100%;text-size-adjust:100%}
body{font:16px/1.4 system-ui,-apple-system,"Segoe UI",Roboto,sans-serif;background:var(--bg);color:var(--ink);-webkit-tap-highlight-color:transparent}
.top{display:flex;justify-content:space-between;align-items:center;flex-wrap:wrap;gap:10px;padding:max(14px,env(safe-area-inset-top)) max(20px,env(safe-area-inset-right)) 14px max(20px,env(safe-area-inset-left));background:var(--ink);color:#fff}
.top h1{font-size:20px;margin:0;font-weight:700}
.top h1 span{font-weight:400;opacity:.65;margin-left:8px}
.top .btn.ghost{background:transparent;color:#fff;border-color:#555;min-height:44px;padding:0 16px}
.app{display:grid;grid-template-columns:minmax(340px,480px) 1fr;gap:20px;padding:20px;max-width:1100px;margin:0 auto}
.controls{display:flex;flex-direction:column;gap:14px}
.card{background:var(--card);border-radius:var(--r);padding:14px;display:flex;flex-direction:column;gap:10px;margin:0;border:1px solid var(--line)}
input,select,textarea{font:inherit;min-height:52px;padding:0 14px;border:2px solid var(--line);border-radius:12px;background:#fff;color:var(--ink);width:100%}
textarea{padding:12px 14px;resize:vertical}
input:focus,select:focus,textarea:focus,button:focus-visible{outline:3px solid var(--ink);outline-offset:1px}
.row{display:flex;gap:10px}
.row>input:first-child{flex:0 0 76px;text-align:center}
.row.gap>*{flex:1}
.btn{font:inherit;font-weight:700;min-height:52px;padding:0 22px;border-radius:12px;border:2px solid var(--ink);cursor:pointer;background:#fff;color:var(--ink)}
.btn.solid{background:var(--ink);color:#fff}
.btn.ghost{border-color:var(--line)}
.btn.big{flex:2;font-size:20px;min-height:60px}
.btn:active{transform:scale(.98)}
.items{list-style:none;padding:6px;min-height:70px;max-height:300px;overflow:auto;gap:0}
.items li{display:flex;align-items:center;gap:10px;padding:10px;border-radius:10px;cursor:pointer}
.items li.sel{background:#eee}
.items .nm{flex:1;min-width:0}
.items .nm b{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.items .nm small{color:var(--mute)}
.items .del{min-height:44px;min-width:44px;padding:0;font-size:20px;border-color:var(--line)}
.items .empty{color:var(--mute);justify-content:center;cursor:default}
.seg{display:flex;border:2px solid var(--ink);border-radius:12px;overflow:hidden}
.seg button{flex:1;font:inherit;font-weight:600;min-height:50px;border:0;background:#fff;cursor:pointer;color:var(--ink)}
.seg button+button{border-left:2px solid var(--ink)}
.seg button.on{background:var(--ink);color:#fff}
.totals{display:flex;justify-content:space-between;align-items:baseline;font-size:18px;padding-top:4px}
.totals strong{font-size:34px}
.actions{display:flex;gap:10px}
.actions .btn{flex:1}
.preview{display:flex;flex-direction:column;gap:14px;align-items:center}
.paper{width:min(100%,440px)}
.paper button{font-size:14px;padding:0 4px}
.stage{width:100%;display:flex;justify-content:center;padding:24px 8px;background:#d9d9d5;border-radius:var(--r);overflow:auto}

/* Receipt */
#receipt{background:#fff;color:#000;font-family:"Courier New",Courier,monospace;width:var(--w,80mm);padding:4mm 3mm 6mm;font-size:12px;line-height:1.35;box-shadow:0 2px 14px rgba(0,0,0,.25)}
#receipt.w58{--w:58mm;font-size:10.5px;padding:3mm 2mm 5mm}
#receipt.w80{--w:80mm}
#receipt .c{text-align:center}
#receipt .shop{font-size:1.5em;font-weight:700;letter-spacing:.5px;overflow-wrap:anywhere}
#receipt img{max-width:60%;max-height:22mm;display:block;margin:0 auto 4px;filter:grayscale(1) contrast(1.4)}
#receipt .hr{border-top:1px dashed #000;margin:5px 0}
#receipt .r{display:grid;grid-template-columns:1fr 3em auto;gap:4px}
#receipt .r .q{text-align:center}
#receipt .r .a{text-align:right}
#receipt .h{font-weight:700}
#receipt .kv{display:flex;justify-content:space-between;gap:6px}
#receipt .tot{font-size:1.45em;font-weight:700;margin:2px 0}
#receipt .faint{opacity:.55;text-align:center}

/* Image bill template */
*{-webkit-print-color-adjust:exact;print-color-adjust:exact}
#receipt.wform{--w:148mm;width:148mm;padding:0;position:relative;font-family:Arial,Helvetica,sans-serif;font-size:3.5mm;line-height:1}
#receipt.wform .bg{display:block;width:100%;max-width:100%;max-height:none;height:auto;margin:0;filter:none}
.wform .cover{position:absolute;background:#fff}
.wform .f{position:absolute;display:flex;align-items:center;white-space:nowrap;overflow:hidden;font-weight:600;color:#000}
.wform .f.c{justify-content:center}
.wform .f.r{justify-content:flex-end}
.wform .f.s{font-size:3.2mm}
.wform .f.b{font-size:4mm;font-weight:700}
@media (max-width:820px){
  .app{grid-template-columns:1fr;padding:12px}
  #receipt.wform{zoom:.6}
}

dialog{border:0;border-radius:18px;padding:0;width:min(440px,94vw);max-height:92vh}
dialog::backdrop{background:rgba(0,0,0,.55)}
dialog form{display:flex;flex-direction:column;gap:12px;padding:20px}
dialog h2{margin:0}
dialog label{display:flex;flex-direction:column;gap:5px;font-weight:600;font-size:14px;flex:1}
dialog input[type=file]{padding:10px 14px;font-weight:400}

#printArea{display:none}
.row.gap .btn{min-height:52px}
@media print{
  @page{margin:0}
  html,body{background:#fff!important;margin:0!important;padding:0!important}
  body.printing-form .app,body.printing-form .top{display:none!important}
  body.printing-form #printArea{display:block!important}
  #printArea img{display:block;width:148mm;max-width:100%;height:auto;margin:0 auto;break-inside:avoid}
  .top,.controls,.paper,dialog{display:none!important}
  .app,.preview,.stage{display:block!important;padding:0!important;margin:0!important;background:none!important;max-width:none!important;overflow:visible!important}
  #receipt.wform{zoom:1!important}
  #receipt{box-shadow:none!important;margin:0!important;break-inside:avoid}
}

/* Inventory + search suggestions */
.hbtns{display:flex;gap:8px}
.ac{position:relative}
.sugg{position:absolute;left:0;right:0;top:calc(100% + 4px);z-index:20;margin:0;padding:4px;list-style:none;background:#fff;border:2px solid var(--ink);border-radius:12px;box-shadow:0 8px 24px rgba(0,0,0,.2);max-height:280px;overflow:auto}
.sugg[hidden]{display:none}
.sugg li{display:flex;justify-content:space-between;gap:10px;padding:12px;min-height:48px;align-items:center;border-radius:8px;cursor:pointer}
.sugg li.on,.sugg li:hover{background:#eee}
.sugg li b{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.sugg li span{font-weight:700;white-space:nowrap}
.chk{display:flex;align-items:center;gap:10px;font-size:14px;color:var(--mute)}
.chk input{width:22px;min-height:22px;height:22px}
dialog .wrap{display:flex;flex-direction:column;gap:12px;padding:20px}
dialog .wrap small{font-weight:400;color:var(--mute);font-size:14px}
.invlist{list-style:none;margin:0;padding:0;max-height:38vh;overflow:auto;border:1px solid var(--line);border-radius:12px}
.invlist li{display:flex;align-items:center;gap:8px;padding:8px 10px;border-bottom:1px solid var(--line)}
.invlist li:last-child{border-bottom:0}
.invlist .nm{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-weight:600}
.invlist .pr{font-weight:700}
.invlist .btn{min-height:44px;min-width:44px;padding:0 10px;border-color:var(--line)}
.invlist .empty{color:var(--mute);justify-content:center}
@media print{.sugg{display:none!important}}

.scanmsg{min-height:0;font-size:14px;font-weight:600}
.scanmsg:empty{display:none}
.scanmsg.ok{color:#0a7a2f}
.scanmsg.err{color:#b00020}
.sugg li small{display:block;font-weight:400;color:var(--mute);font-size:12px}
.invlist .cd{font-size:12px;color:var(--mute);font-weight:400;display:block}

[hidden]{display:none!important}
.hbtns .btn.on{background:#fff;color:#000}
.scanrow{align-items:stretch}.scanrow>.btn{flex:0 0 auto;padding:0 14px}.scanrow>input{flex:1}
.invpage{max-width:900px;margin:0 auto;padding:20px;display:flex;flex-direction:column;gap:14px}
.sumrow{display:grid;grid-template-columns:repeat(3,1fr);gap:10px}
.sumrow .card{gap:2px}.sumrow small{color:var(--mute)}.sumrow b{font-size:22px}
.invtable{display:flex;flex-direction:column}
.ir{display:grid;grid-template-columns:minmax(0,1fr) 76px 56px 98px;gap:8px;align-items:center;padding:8px 4px;border-bottom:1px solid var(--line)}
.ir .nm b,.ir .nm small{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ir small{color:var(--mute)}
.ir .btn{min-height:44px;min-width:44px;padding:0;border-color:var(--line)}
.ir.h{font-weight:700;color:var(--mute);font-size:13px}
.stk{font-weight:700;text-align:center}.stk.low{color:#b26a00}.stk.out{color:#b00020}
.ir .empty{grid-column:1/-1;text-align:center;color:var(--mute)}
#scanVid{width:100%;max-height:50vh;background:#000;border-radius:12px;object-fit:cover}
.btn.photo{display:flex;align-items:center;justify-content:center}
@media print{#invPage,#invcPage,.editbar{display:none!important}}
body.printing-form main,body.printing-form .editbar{display:none!important}

/* Full invoice (A4) */
#receipt.winv{--w:210mm;width:210mm;min-height:297mm;padding:12mm;font-family:Arial,Helvetica,sans-serif;font-size:10pt;line-height:1.35;display:flex;flex-direction:column}
.winv .ihead{display:flex;justify-content:space-between;align-items:flex-start;gap:8mm}
#receipt.winv .ibrand img{max-height:20mm;max-width:45mm;display:block;margin:0 0 2mm;filter:none}
.winv .iname{font-family:Georgia,"Times New Roman",serif;font-size:26pt;font-weight:700;line-height:1.05}
.winv .iby{font-size:12pt;font-style:italic;margin-top:1mm}
.winv .iweb{font-size:10pt;margin-top:1mm}
.winv .imeta{text-align:right}
.winv .ititle{font-size:22pt;font-weight:700;letter-spacing:2px}
.winv .imeta table{margin-left:auto;margin-top:2mm;border-collapse:collapse}
.winv .imeta td{padding:.6mm 0 .6mm 4mm;text-align:right}
.winv .imeta td:first-child{color:#444}
.winv .imeta td:last-child{font-weight:700}
.winv .iaddr{background:#000;color:#fff;text-align:center;padding:2.2mm 3mm;margin:4mm 0;font-size:10pt}
.winv .ibill{border:.35mm solid #000;margin-bottom:4mm}
.winv .ibill h4{margin:0;padding:1.6mm;text-align:center;font-size:10pt;letter-spacing:.5px;border-bottom:.35mm solid #000}
.winv .ibill div{display:flex;gap:3mm;padding:1.8mm 3mm;border-bottom:.35mm solid #000;min-height:8mm}
.winv .ibill div:last-child{border-bottom:0}
.winv .ibill b{flex:0 0 22mm}
.winv .itbl{width:100%;border-collapse:collapse;table-layout:fixed}
.winv .itbl th,.winv .itbl td{border:.35mm solid #000;padding:1.6mm 2mm;vertical-align:top;overflow-wrap:anywhere}
.winv .itbl th{background:#eee;font-size:9.5pt}
.winv .itbl .c{text-align:center}
.winv .itbl .rt{text-align:right}
.winv .itbl tr.pad td{height:8.5mm}
.winv .itot{display:flex;justify-content:space-between;gap:6mm;margin-top:4mm}
.winv .iwords{flex:1;border:.35mm solid #000;padding:2mm 3mm;align-self:flex-start}
.winv .iwords small{display:block;color:#444}
.winv .isum{width:78mm;border:.35mm solid #000;border-collapse:collapse}
.winv .isum td{padding:1.6mm 3mm;border-bottom:.35mm solid #000}
.winv .isum td:last-child{text-align:right;font-weight:700}
.winv .isum tr:last-child td{border-bottom:0;background:#000;color:#fff;font-size:12pt}
.winv .ifoot{margin-top:auto;padding-top:8mm;display:flex;justify-content:space-between;align-items:flex-end;gap:10mm}
.winv .ifoot .tn{flex:1}
.winv .isig{width:60mm;text-align:center;border-top:.35mm solid #000;padding-top:1.5mm}
@media (max-width:820px){#receipt.winv{zoom:.42}}
@media print{
  #receipt.winv{width:auto!important;min-height:272mm!important;padding:0!important;zoom:1!important;break-inside:auto}
  .winv thead{display:table-header-group}
  .winv .itbl tr,.winv .itot,.winv .ifoot{break-inside:avoid}
}

/* Invoices page */
.editbar{display:flex;justify-content:space-between;align-items:center;flex-wrap:wrap;gap:10px;padding:10px 20px;background:#fff1b8;border-bottom:1px solid #e0cf7a}
.editbtns{display:flex;gap:8px}
.editbtns .btn{min-height:44px;padding:0 16px}
.bills{display:flex;flex-direction:column}
.bl{display:flex;flex-direction:column;gap:8px;padding:12px 4px;border-bottom:1px solid var(--line)}
.bl .bt{display:flex;justify-content:space-between;align-items:center;gap:10px}
.bl .bt strong{font-size:18px;white-space:nowrap}
.bl .nm{flex:1;min-width:0}
.bl .nm b{display:block}
.bl .nm small{display:block;color:var(--mute);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.bl .ba{display:flex;gap:6px}
.bl .ba .btn{flex:1;min-height:44px;padding:0 4px;font-size:14px;border-color:var(--line)}
.bl .ba .btn.go{background:var(--ink);color:#fff;border-color:var(--ink)}
.tag{display:inline-block;font-size:11px;font-weight:700;padding:2px 8px;border-radius:99px;margin-left:6px;vertical-align:middle;background:#eee;color:#555}
.tag.ed{background:#fff1b8;color:#7a5c00}
.bills .empty{text-align:center;color:var(--mute);padding:20px 0}
#viewDlg{width:min(640px,96vw)}
.vwscroll{overflow:auto;background:#d9d9d5;border-radius:12px;padding:12px;max-height:62vh}
.vbill{position:relative;width:148mm;margin:0 auto;background:#fff;font-family:Arial,Helvetica,sans-serif;font-size:3.5mm;line-height:1}
.vbill .bg{display:block;width:100%;height:auto}
@media (max-width:820px){.vbill{zoom:.52}}
@media (max-width:600px){.top .hbtns{flex:1 1 100%}.top .hbtns .btn{flex:1;padding:0 6px;font-size:15px}}

/* Barcodes */
.bcbox{display:flex;flex-direction:column;gap:10px;align-items:stretch}
.bcbox img{width:100%;border:2px solid var(--line);border-radius:12px;background:#fff;image-rendering:pixelated}
a.btn{display:flex;align-items:center;justify-content:center;text-decoration:none;text-align:center}
.ir>span:nth-child(3),.ir>span:nth-child(4){text-align:center}
.ir>span:nth-child(5){display:flex;gap:6px;justify-content:flex-end}
.toast{position:fixed;left:12px;right:12px;top:12px;z-index:9999;max-width:460px;margin:0 auto;background:#b00020;color:#fff;border-radius:14px;padding:14px 16px;font-weight:600;white-space:pre-line;box-shadow:0 8px 28px rgba(0,0,0,.35);cursor:pointer}
.toast[hidden]{display:none}
.hbtns .btn .bdg{display:inline-block;min-width:20px;padding:0 6px;margin-left:6px;border-radius:99px;background:#d32f2f;color:#fff;font-size:12px;line-height:20px}
.hbtns .btn{position:relative;white-space:nowrap}
.hbtns .btn .bdg{position:absolute;top:-7px;right:-5px;margin:0;min-width:20px;text-align:center}
.invpage .actions{flex-wrap:wrap}
.invpage .actions .btn{flex:1 1 40%}

/* Device fixes */
body{padding-bottom:env(safe-area-inset-bottom);min-width:320px}
.app,.invpage{padding-left:max(20px,env(safe-area-inset-left));padding-right:max(20px,env(safe-area-inset-right))}
.row.gap>input:first-child{flex:1 1 0;text-align:left}
.row>*{min-width:0}
.numrow{display:flex;gap:10px}
.numrow>*{flex:1;min-width:0}
.numrow>select{font-weight:700}
@media (max-width:600px){
  .top h1{font-size:18px}
  .top .hbtns{gap:6px}
  .top .hbtns .btn{flex:1 1 0;min-width:0;padding:0 4px;font-size:14px}
  .app,.invpage{padding-left:12px;padding-right:12px}
  .editbar{padding:10px 12px}
}
html.nodialog dialog:not([open]){display:none}
html.nodialog dialog[open]{position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);z-index:10000;background:#fff;box-shadow:0 0 0 100vmax rgba(0,0,0,.55);overflow:auto}
@media print{#toast{display:none!important}}
@media (max-width:820px){.app{grid-template-columns:minmax(0,1fr)}}
.controls,.preview,.card{min-width:0}
.actions .btn{min-width:0;padding-left:8px;padding-right:8px}
.paper{max-width:100%}
@media (max-width:360px){.top .hbtns .btn{font-size:12.5px;padding:0 2px}.top{padding-left:10px;padding-right:10px}}

/* Stock Update tab */
.stnote{color:var(--mute)}
.stmsg{padding:12px 14px;border-radius:12px;font-weight:600;background:#eee}
.stmsg.err{background:#fdeaea;color:#b3261e}.stmsg.warn{background:#fff3dc;color:#8a5200}.stmsg.ok{background:#e3f6e8;color:#1c7a36}
#aPrev{max-width:100%;max-height:280px;object-fit:contain;border-radius:12px;border:1px solid var(--line);align-self:center}
.sr{display:grid;grid-template-columns:minmax(0,1fr) 62px 56px 62px;gap:8px;align-items:center;padding:10px 4px;border-bottom:1px solid var(--line)}
.sr.h{font-weight:700;color:var(--mute);font-size:13px}
.sr>span:nth-child(n+2){text-align:center}
.sr .nm{overflow-wrap:anywhere}
.sr .tag{display:inline-block;margin-top:3px;padding:2px 10px;border-radius:99px;font-size:13px;font-weight:700}
.sr .tag.ok{background:#e3f6e8;color:#1c7a36}.sr .tag.no{background:#fdeaea;color:#b3261e}
.sr .aft{font-weight:700;color:#1c7a36}
.stsum{display:flex;gap:8px;flex-wrap:wrap;font-weight:700}
.stsum span{padding:8px 12px;border-radius:10px;background:#e3f6e8;color:#1c7a36}.stsum span.r{background:#fdeaea;color:#b3261e}
[hidden]{display:none!important}

/* Bulk select */
.ir .pk{display:none}
.selmode .ir{grid-template-columns:32px minmax(0,1fr) 76px 56px 98px}
.selmode .ir .pk{display:block}
.ir input.pk{width:22px;height:22px;min-height:22px;margin:0}
.ir.picked{background:#f1f1f1}
.selbar{display:flex;flex-direction:column;gap:10px;padding:10px 0;border-bottom:1px solid var(--line);position:sticky;top:0;background:#fff;z-index:5}
.selbtns{display:flex;gap:8px;flex-wrap:wrap}.selbtns .btn{flex:1;min-width:70px}
.btn.danger{background:#b00020;border-color:#b00020;color:#fff}
.selbtns .btn:disabled{opacity:.4}

/* GST */
.gbox{display:flex;flex-direction:column;gap:10px}
.gsum{display:flex;flex-direction:column;gap:2px;font-size:15px;color:var(--mute)}
.gsum .kv{display:flex;justify-content:space-between}

.sr .pickbox{margin-top:6px;width:100%;min-height:38px;font-size:14px}
.sr .tag.ok{white-space:normal}

/* ===== Quick Bill extras ===== */
.hb2{flex:1 1 100%;display:flex;gap:8px;justify-content:flex-end}
.hb2 .btn{flex:1;max-width:260px}
#insTabs button{font-size:13px;padding:0 2px}
@media (max-width:600px){.hb2{max-width:none}.hb2 .btn{max-width:none}}
.tag.q{background:#e6eefc;color:#1d4fa3}
.tag.due{background:#fdeaea;color:#b3261e}
.bl .ba{flex-wrap:wrap}.bl .ba .btn{flex:1 1 auto}
/* QR printed on bills */
.qrb{display:flex;flex-direction:column;align-items:center;gap:1mm;break-inside:avoid}
.qrb small{font:600 2.6mm/1.1 Arial,sans-serif;color:#000;text-align:center}
.qrb svg{display:block}
#receipt.w58 .qrb svg{width:30mm;height:30mm}#receipt.w80 .qrb svg{width:36mm;height:36mm}#receipt .qrb{margin-top:6px}
.winv .qrb.iqr svg{width:26mm;height:26mm}.winv .qrb.iqr{flex:0 0 auto}
.wform .qrf{position:absolute;background:#fff}.wform .qrf svg{display:block;width:100%;height:100%}
/* insights, dues, log */
.xl{display:flex;justify-content:space-between;align-items:center;gap:10px;padding:10px 2px;border-bottom:1px solid var(--line)}
.xl .nm{flex:1;min-width:0}.xl .nm b{display:block;overflow:hidden;text-overflow:ellipsis}.xl small{display:block;color:var(--mute);font-weight:400}
.xl strong,.xl>b{white-space:nowrap}
.xl .btn{min-height:40px;padding:0 14px;font-size:14px}
.xn{color:var(--mute);font-size:14px;margin:2px 0}.xn.err{color:#b3261e}
.xbody h4{margin:14px 0 4px}.xbody{max-height:60vh;overflow:auto}
.xf{display:flex;flex-direction:column;gap:5px;font-weight:600;font-size:14px}
.chart{width:100%;height:auto;display:block}
.abc{display:inline-block;min-width:30px;text-align:center;font-weight:700;border-radius:8px;padding:4px 8px;background:#eee}
.abc.A{background:#e3f6e8;color:#1c7a36}.abc.B{background:#fff1b8;color:#7a5c00}.abc.C{background:#eee;color:#555}
.duesbox{border:2px solid #f3c6c2;background:#fff7f6;border-radius:12px;padding:10px;display:flex;flex-direction:column;gap:8px}
.duesbox .dh{display:flex;justify-content:space-between;align-items:baseline;gap:8px;flex-wrap:wrap}.duesbox .dh small{color:var(--mute)}
.dr{display:flex;flex-wrap:wrap;align-items:center;gap:8px;padding:8px 0;border-top:1px solid #f0d9d6}
.dr .nm{flex:1;min-width:0}.dr .nm small{display:block;color:var(--mute)}
.dr .ba{flex:1 1 100%;display:flex;gap:6px}.dr .ba .btn{flex:1;min-height:42px;padding:0 8px;font-size:14px;border-color:var(--line)}
.dr .ba .btn.go{background:var(--ink);color:#fff;border-color:var(--ink)}
.warn{background:#fff1b8;color:#5c4500;border-radius:10px;padding:10px;font-size:14px}
.al{padding:8px 0;border-bottom:1px solid var(--line);font-size:14px}.al small{color:var(--mute)}
/* quick sale */
#qsDlg{width:min(520px,96vw)}
.qs .qsh{display:flex;justify-content:space-between;align-items:center;gap:10px}.qs .qsh .btn{min-height:44px}
.qslist{list-style:none;margin:0;padding:0;max-height:34vh;overflow:auto;border:2px solid var(--line);border-radius:12px}
.qslist li{display:flex;align-items:center;gap:8px;padding:8px 10px;border-bottom:1px solid var(--line)}
.qslist li.empty{color:var(--mute);justify-content:center;padding:18px}
.qslist .nm{flex:1;min-width:0;cursor:pointer}.qslist .nm b{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.qslist .nm small{color:var(--mute)}
.qslist .qq{display:flex;align-items:center;gap:6px}.qslist .qq .btn{min-height:40px;min-width:40px;padding:0;font-size:20px;border-color:var(--line)}.qslist .qq span{min-width:26px;text-align:center;font-weight:700}
.qslist .amt{min-width:64px;text-align:right}.qslist .del{min-height:40px;min-width:40px;padding:0;border-color:var(--line)}
.qssug{display:flex;flex-direction:column;gap:6px}.qssug .btn{text-align:left;min-height:46px;font-size:15px}
.qspay button{min-height:60px;font-size:18px}.qspay button:disabled{opacity:.4}
@media print{#insPage,#dataPage,#qsDlg,#xDlg,#duesBox{display:none!important}}

/* ---- Pay / UPI payment dialogs ---- */
#payBtn{width:100%}
.tag.paid{background:#e3f6e8;color:#1c7a36}
.pdamt{display:flex;flex-direction:column;align-items:center;gap:2px;padding:6px 0 2px;text-align:center}
.pdamt strong{font-size:34px;line-height:1.1}
.pdamt small:empty{display:none}
.pdmeth button{min-height:64px;font-size:18px}
#upiDlg{width:min(460px,96vw);max-height:96vh;overflow:auto}
.wrap.upi{align-items:stretch;text-align:center;gap:10px;padding:18px 18px calc(18px + env(safe-area-inset-bottom))}
.wrap.upi h2{font-size:15px;letter-spacing:.14em;color:var(--mute)}
.upamt{font-size:40px;font-weight:800;line-height:1.05}
.upbody{display:flex;flex-direction:column;align-items:center;gap:10px}
.upqr{background:#fff;border:2px solid var(--ink);border-radius:16px;padding:6px;line-height:0}
.upqr svg{display:block;width:min(78vw,340px);height:auto;aspect-ratio:1/1}
.uperr{background:#fdeaea;color:#b3261e;border-radius:12px;padding:14px;font-weight:600;font-size:15px;text-align:left;width:100%}
.upinfo{display:flex;flex-direction:column;gap:6px}
.upscan{font-size:20px;font-weight:800}
.upmeta{display:flex;justify-content:space-between;gap:12px;font-size:15px;border-top:1px solid var(--line);padding-top:6px;text-align:right}
.upmeta span{color:var(--mute);flex:0 0 auto}
.upmeta b{word-break:break-all}
.upwarn{background:#fff1b8;color:#7a5c00;border-radius:12px;padding:10px 12px;font-size:14px;font-weight:600;text-align:left}
.upmanual{font-size:13px;color:var(--mute);text-align:left;line-height:1.35}
.wrap.upi .actions .btn{min-height:56px}
.wrap.upi .actions .btn:disabled{opacity:.4}
@media (max-height:700px){.upqr svg{width:min(60vw,260px)}.upamt{font-size:32px}}
@media (min-width:700px) and (min-height:900px){.upqr svg{width:360px}}

/* ================= Odoo-style look & motion ================= */
:root{--brand:#1a6ae0;--brand2:#2f7df0;--ease:cubic-bezier(.2,.8,.2,1)}
.top{background:linear-gradient(135deg,var(--brand),#0f3d91)}
.top .btn.ghost{border-color:rgba(255,255,255,.28);transition:background .2s var(--ease),transform .15s}
.top .btn.ghost:hover{background:rgba(255,255,255,.12)}
.hbtns .btn.on{background:#fff;color:var(--brand)}
.btn{transition:transform .15s var(--ease),box-shadow .2s var(--ease),background .2s,border-color .2s;position:relative}
.btn.solid:not(.danger){background:var(--brand);border-color:var(--brand)}
.btn.solid:not(.danger):hover{background:var(--brand2);border-color:var(--brand2);box-shadow:0 6px 16px rgba(var(--primary-rgb),.35)}
.btn.ghost:hover,.btn:not(.solid):not(.ghost):hover{border-color:var(--brand)}
.seg{border-color:var(--brand)}.seg button+button{border-left-color:var(--brand)}
.seg button{transition:background .2s var(--ease),color .2s;position:relative}
.seg button.on{background:var(--brand);color:#fff}
.btn.go,.bl .ba .btn.go{background:var(--brand);border-color:var(--brand)}
input:focus,select:focus,textarea:focus,button:focus-visible{outline-color:var(--brand)}
input,select,textarea{transition:border-color .2s,box-shadow .2s}
input:focus,select:focus,textarea:focus{border-color:var(--brand);box-shadow:0 0 0 4px rgba(var(--primary-rgb),.15)}
.card{transition:box-shadow .25s var(--ease),transform .25s var(--ease)}
.card:hover{box-shadow:0 8px 24px rgba(0,0,0,.07)}
.totals strong{color:var(--brand);display:inline-block}
.tag.paid{background:#e3f6e8;color:#1c7a36}

/* ripple */
.ripc{overflow:hidden}
.rip{position:absolute;border-radius:50%;background:currentColor;opacity:.22;transform:scale(0);animation:rip .6s var(--ease) forwards;pointer-events:none}
@keyframes rip{to{transform:scale(1);opacity:0}}

/* page / tab change */
main:not([hidden]){animation:pgIn .32s var(--ease) both}
@keyframes pgIn{from{opacity:0;transform:translateY(10px)}to{opacity:1;transform:none}}

/* items slide in, total bumps */
.items li.pop{animation:rowIn .38s var(--ease) both}
@keyframes rowIn{0%{opacity:0;transform:translateX(-18px) scale(.97);background:var(--primary-light)}100%{opacity:1;transform:none}}
.items li{transition:background .2s}
.totals strong.bump{animation:bump .32s var(--ease)}
@keyframes bump{40%{transform:scale(1.12)}100%{transform:scale(1)}}
.bl{transition:background .2s}.bl:hover{background:var(--primary-light)}
.ir,.sr{transition:background .2s}.ir:hover{background:var(--primary-light)}

/* dialogs */
dialog[open]{animation:dlgIn .28s var(--ease) both}
dialog[open]::backdrop{animation:bdIn .28s ease both}
@keyframes dlgIn{from{opacity:0;transform:translateY(24px) scale(.96)}to{opacity:1;transform:none}}
@keyframes bdIn{from{opacity:0}to{opacity:1}}
.pdmeth button{transition:background .2s,color .2s,transform .15s}
.pdmeth button:hover{background:var(--primary-light)}.pdmeth button.on:hover{background:var(--brand2)}
.upqr{animation:qrIn .5s var(--ease) both;box-shadow:0 10px 30px rgba(var(--primary-rgb),.2);border-color:var(--brand)}
@keyframes qrIn{from{opacity:0;transform:scale(.85)}to{opacity:1;transform:none}}
.upamt{color:var(--brand);animation:bump .5s var(--ease)}
.upinfo,.upwarn,.uperr{animation:pgIn .4s .1s var(--ease) both}

/* toast */
.toast:not([hidden]){animation:toastIn .35s var(--ease) both}
@keyframes toastIn{from{opacity:0;transform:translateY(-24px)}to{opacity:1;transform:none}}

/* payment success */
#paidFx{position:fixed;inset:0;z-index:10001;display:flex;align-items:center;justify-content:center;background:rgba(255,255,255,.82);opacity:0;pointer-events:none;transition:opacity .25s}
#paidFx.on{opacity:1}
.pfx{display:flex;flex-direction:column;align-items:center;gap:12px;font-size:22px}
.pfx svg{width:110px;height:110px;fill:none;stroke:#1c9a4a;stroke-width:3;stroke-linecap:round;stroke-linejoin:round}
.pfx circle{stroke-dasharray:151;stroke-dashoffset:151;fill:rgba(28,154,74,.1)}
.pfx path{stroke-dasharray:40;stroke-dashoffset:40}
#paidFx.on .pfx{animation:pfxIn .4s var(--ease) both}
#paidFx.on circle{animation:draw .55s .05s ease forwards}
#paidFx.on path{animation:draw .35s .45s ease forwards}
@keyframes pfxIn{from{opacity:0;transform:scale(.7)}to{opacity:1;transform:none}}
@keyframes draw{to{stroke-dashoffset:0}}

@media (prefers-reduced-motion:reduce){*,*::before,*::after{animation-duration:.01ms!important;animation-delay:0s!important;transition-duration:.01ms!important}}
@media print{*{animation:none!important;transition:none!important}}

/* ================= Blue theme: Odoo-style payment motion ================= */
/* payment method tiles */
.pdmeth{border:0;gap:10px;overflow:visible;border-radius:0}
.pdmeth button,.pdmeth button+button{border:2px solid var(--line);border-left:2px solid var(--line);border-radius:16px;min-height:96px;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:4px;font-size:16px;background:#fff;color:var(--ink);animation:tileIn .45s var(--ease) both}
.pdmeth button:nth-child(2){animation-delay:.07s}.pdmeth button:nth-child(3){animation-delay:.14s}
.pdmeth button span{font-size:30px;line-height:1;transition:transform .25s var(--ease)}
.pdmeth button:hover{border-color:var(--brand);background:var(--primary-light);transform:translateY(-3px);box-shadow:0 8px 18px rgba(var(--primary-rgb),.18)}
.pdmeth button:hover span{transform:scale(1.18) rotate(-6deg)}
.pdmeth button.on{border-color:var(--brand);background:var(--primary-light);color:var(--brand)}
.pdmeth button:active{transform:scale(.95)}
@keyframes tileIn{from{opacity:0;transform:translateY(22px) scale(.9)}to{opacity:1;transform:none}}
.pdamt strong{color:var(--brand)}
#pdConfirm{display:flex;flex-direction:column;gap:12px;animation:pgIn .35s var(--ease) both}
#pdConfirm[hidden]{display:none}
.pdok{display:flex;flex-direction:column;align-items:center;gap:6px;padding:16px;border-radius:16px;background:var(--primary-light);text-align:center}
.pdok span{font-size:44px;animation:bump .6s var(--ease)}
.pdok b{font-size:18px}

/* bottom sheets on phones, like the Odoo POS */
@media (max-width:600px){
  #payDlg,#upiDlg{margin:auto 0 0;width:100vw;max-width:100vw;border-radius:24px 24px 0 0}
  #payDlg[open],#upiDlg[open]{animation:sheetIn .38s var(--ease) both}
}
@keyframes sheetIn{from{transform:translateY(100%)}to{transform:none}}

/* QR: assembles top-to-bottom, scan line sweeps, corner brackets pulse */
.upqr{position:relative;overflow:hidden;border-color:var(--brand);box-shadow:0 12px 34px rgba(var(--primary-rgb),.25)}
.upqr svg{animation:qrReveal .8s .1s var(--ease) both}
@keyframes qrReveal{from{clip-path:inset(0 0 100% 0);opacity:.2}to{clip-path:inset(0);opacity:1}}
.upqr::after{content:"";position:absolute;left:6px;right:6px;top:6px;height:3px;border-radius:3px;background:linear-gradient(90deg,transparent,var(--brand),transparent);box-shadow:0 0 16px 2px rgba(var(--primary-rgb),.7);animation:scanY 2.2s .9s ease-in-out infinite;opacity:0}
@keyframes scanY{0%{top:6px;opacity:0}10%{opacity:1}90%{opacity:1}100%{top:calc(100% - 9px);opacity:0}}
.upqr::before{content:"";position:absolute;inset:3px;pointer-events:none;z-index:2;border-radius:12px;
  background:
   linear-gradient(var(--brand),var(--brand)) top left/22px 4px,linear-gradient(var(--brand),var(--brand)) top left/4px 22px,
   linear-gradient(var(--brand),var(--brand)) top right/22px 4px,linear-gradient(var(--brand),var(--brand)) top right/4px 22px,
   linear-gradient(var(--brand),var(--brand)) bottom left/22px 4px,linear-gradient(var(--brand),var(--brand)) bottom left/4px 22px,
   linear-gradient(var(--brand),var(--brand)) bottom right/22px 4px,linear-gradient(var(--brand),var(--brand)) bottom right/4px 22px;
  background-repeat:no-repeat;animation:corners 1.6s 1s ease-in-out infinite}
@keyframes corners{50%{inset:8px;opacity:.55}}
.upwait{display:flex;align-items:center;justify-content:center;gap:6px;font-size:14px;font-weight:600;color:var(--brand);background:var(--primary-light);border-radius:99px;padding:8px 14px;align-self:center}
.upwait i{width:7px;height:7px;border-radius:50%;background:var(--brand);animation:dot 1.2s ease-in-out infinite}
.upwait i:nth-child(2){animation-delay:.18s}.upwait i:nth-child(3){animation-delay:.36s}
.upwait span{margin-left:4px}
@keyframes dot{0%,80%,100%{transform:scale(.5);opacity:.4}40%{transform:scale(1);opacity:1}}
.upmeta{animation:pgIn .4s var(--ease) both}.upmeta:nth-of-type(2){animation-delay:.15s}.upmeta:nth-of-type(3){animation-delay:.22s}
#upOk:not(:disabled){animation:pulseBtn 2.2s 1.5s ease-in-out infinite}
@keyframes pulseBtn{0%,100%{box-shadow:0 0 0 0 rgba(var(--primary-rgb),.45)}50%{box-shadow:0 0 0 10px rgba(var(--primary-rgb),0)}}
