{dateString} · {timeString}
Add items to see totals
Grand Total
₹{grandTotal.toFixed(2)}
{isNewCustomer ? "Please enter the customer's name." : 'Enter mobile number to retrieve loyalty profile.'}
{/* Was `type="tel"` with no filtering, so letters reached a field the Find button gates on `.length >= 10` — "abcdefghij" opened a lookup. Astryx has no tel type; digits-only in the handler is the stricter fix anyway. */}{pc.id}
{new Date(pc.time).toLocaleTimeString()} · {pc.cart.length} items · {pc.customer ? pc.customer.phone : 'Guest'}
Enter a manual discount or attach a coupon code.
{grandTotal < 0 ? 'Refund Due' : 'Amount Due'}
₹{Math.abs(grandTotal).toFixed(2)}
Payment Method
{/* SegmentedControl, not three buttons and not SelectableCard. This is a single-select, and as plain buttons the active method lived only in border colour. SelectableCard was tried first and rejected: verified in Chrome, it renders a focusable div carrying only `aria-label` — no role, no aria-checked — and it drops a `role`/`aria-checked` you pass it, so the choice stayed silent. SegmentedControl emits a real radiogroup with arrow-key navigation. */}Quick Select
Return Cash to Customer
₹{Math.abs(grandTotal).toFixed(2)}
Credit to: {customer.phone}
Attach a customer to issue Store Credit
Scan QR Code to Pay
Awaiting payment confirmation…
Tap, swipe or insert card
Waiting for terminal…
GSTIN: 29ABCDE1234F1Z5
{new Date().toLocaleString('en-IN')}
Transactions
{dailyReport.tx}
GST
₹{dailyReport.gst.toFixed(2)}
Avg. Bill
₹{dailyReport.tx > 0 ? (dailyReport.sales / dailyReport.tx).toFixed(0) : '0'}
Payment Split
{dailyReport.sales > 0 ? ( <>{p.label}
₹{p.val.toFixed(0)}
Top Products
{Object.keys(dailyReport.products || {}).length > 0 ? (