@fayz-ai/pos 0.20.0 → 0.20.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/app/config.d.ts +10 -0
- package/dist/app/config.d.ts.map +1 -1
- package/dist/index.js +593 -307
- package/dist/index.js.map +1 -1
- package/dist/screen/OpenTableSheet.d.ts +18 -1
- package/dist/screen/OpenTableSheet.d.ts.map +1 -1
- package/dist/screen/PosScreen.d.ts +44 -1
- package/dist/screen/PosScreen.d.ts.map +1 -1
- package/dist/screen/TicketRail.d.ts +9 -1
- package/dist/screen/TicketRail.d.ts.map +1 -1
- package/dist/screen/views.d.ts +26 -1
- package/dist/screen/views.d.ts.map +1 -1
- package/dist/styles.css +501 -34
- package/package.json +2 -2
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/screen/money.ts","../src/screen/session.ts","../src/lib/useSwipeAway.ts","../src/screen/views.tsx","../src/screen/TicketRail.tsx","../src/screen/DeliveryBoard.tsx","../src/screen/DispatchRail.tsx","../src/screen/ShortcutsOverlay.tsx","../src/screen/ReservationsView.tsx","../src/screen/ModifierSheet.tsx","../src/screen/OpenTableSheet.tsx","../src/screen/IdentitySheet.tsx","../src/screen/PinSheet.tsx","../src/screen/SplitSheet.tsx","../src/screen/Notice.tsx","../src/screen/PosScreen.tsx"],"names":["useState","jsxs","jsx","Receipt","Fragment","AlertTriangle","Minus","Plus","ChefHat","useRef","Clock","Bike","clock","useEffect","STATUS","Users","Phone","X","Check","ShieldCheck","useMemo","parts","UtensilsCrossed","Banknote","CalendarClock","seatedAt","useCallback","Search","Keyboard"],"mappings":"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","file":"index.js","sourcesContent":["// ---------------------------------------------------------------------------\n// Money. Cents only — the POS never holds a float for money, because a\n// restaurant that is off by a centavo at closing does not trust the system\n// again.\n// ---------------------------------------------------------------------------\n\nexport function formatCents(cents: number, currency = 'BRL', locale = 'pt-BR'): string {\n return new Intl.NumberFormat(locale, { style: 'currency', currency }).format(cents / 100)\n}\n\n/**\n * Split a total N ways without losing or inventing a centavo.\n *\n * 100,00 / 3 is 33,33 three times and one centavo left over. That centavo has\n * to land somewhere and be seen to land somewhere: the remainder goes to the\n * first shares, one each, so the parts always sum back to the whole.\n */\nexport function splitEvenly(totalCents: number, ways: number): number[] {\n if (ways <= 0) throw new Error('splitEvenly: ways must be positive')\n const base = Math.floor(totalCents / ways)\n const remainder = totalCents - base * ways\n return Array.from({ length: ways }, (_, i) => base + (i < remainder ? 1 : 0))\n}\n\nexport function serviceChargeCents(subtotalCents: number, percent: number): number {\n return Math.round((subtotalCents * percent) / 100)\n}\n","// ---------------------------------------------------------------------------\n// The live ticket: what the operator is building right now.\n//\n// Adding an item is an APPEND, never a read-modify-write of a quantity. Two\n// waiters ringing the same table at the same second must sum, not overwrite\n// each other — that rule is cheap here and expensive to retrofit, so it lives\n// in the reducer from the first commit.\n// ---------------------------------------------------------------------------\n\nimport type { PickedModifier, PosItem } from '../app/config'\nimport { serviceChargeCents } from './money'\n\n/**\n * Where a line is in its life.\n *\n * `pending` is still on the operator's screen and can be changed freely.\n * `fired` has been sent to the kitchen — changing it now means someone walks\n * back there, which is why cancelling a fired line is a manager's PIN and not\n * a minus button. `delivered` is on the table.\n */\nexport type LineState = 'pending' | 'fired' | 'delivered'\n\nexport interface TicketLine {\n /** Client-generated so the line exists before any server round-trip. */\n id: string\n itemId: string\n name: string\n /** What one of this line costs WITH its modifiers — frozen at add time. */\n unitPriceCents: number\n /** The menu price before modifiers, kept so the bill can show the breakdown. */\n basePriceCents?: number\n quantity: number\n note?: string\n modifiers?: PickedModifier[]\n /** Defaults to 'pending' — a line nobody fired yet. */\n state?: LineState\n /** When the kitchen got it. Drives the elapsed clock the expeditor reads. */\n firedAt?: string\n}\n\nexport interface Ticket {\n id: string\n /** When the guests sat. Different from the first item, and both matter: a\n * table seated 40 minutes ago with nothing fired is a table being ignored. */\n seatedAt?: string\n positionId?: string\n positionLabel?: string\n attendantName?: string\n guests?: number\n lines: TicketLine[]\n openedAt: string\n}\n\nexport interface TicketTotals {\n subtotalCents: number\n serviceCents: number\n discountCents: number\n totalCents: number\n}\n\nexport type TicketAction =\n | {\n type: 'add_item'\n item: PosItem\n lineId: string\n quantity?: number\n modifiers?: PickedModifier[]\n note?: string\n }\n | { type: 'change_quantity'; lineId: string; delta: number }\n | { type: 'remove_line'; lineId: string }\n | { type: 'set_note'; lineId: string; note: string }\n | {\n type: 'edit_line'\n lineId: string\n modifiers: PickedModifier[]\n note?: string\n /** Base price, so the unit price can be recomputed from scratch. */\n basePriceCents: number\n }\n | { type: 'remove_one_of'; itemId: string }\n | { type: 'fire'; at: string }\n | { type: 'set_line_state'; lineId: string; state: LineState }\n | { type: 'clear' }\n\nexport function ticketReducer(ticket: Ticket, action: TicketAction): Ticket {\n switch (action.type) {\n case 'add_item': {\n const modifiers = action.modifiers ?? []\n const unitPriceCents =\n action.item.priceCents + modifiers.reduce((sum, m) => sum + m.priceDeltaCents, 0)\n // Same item rung twice collapses into one line — but only when neither\n // carries a note or a modifier, because \"sem cebola\" is a different thing\n // from the plain one and must stay its own line to reach the kitchen.\n const plain = !action.note && modifiers.length === 0\n const last = plain\n ? ticket.lines.find(\n (l) =>\n l.itemId === action.item.id &&\n !l.note &&\n !l.modifiers?.length &&\n // A fired line is already in the kitchen's hands; adding to it\n // would raise a quantity nobody downstream heard about.\n (l.state ?? 'pending') === 'pending',\n )\n : undefined\n const quantity = action.quantity ?? 1\n if (last) {\n return {\n ...ticket,\n lines: ticket.lines.map((l) =>\n l.id === last.id ? { ...l, quantity: l.quantity + quantity } : l,\n ),\n }\n }\n return {\n ...ticket,\n lines: [\n ...ticket.lines,\n {\n id: action.lineId,\n itemId: action.item.id,\n name: action.item.name,\n unitPriceCents,\n basePriceCents: action.item.priceCents,\n quantity,\n ...(action.note ? { note: action.note } : {}),\n ...(modifiers.length ? { modifiers } : {}),\n },\n ],\n }\n }\n case 'change_quantity': {\n const lines = ticket.lines\n .map((l) => (l.id === action.lineId ? { ...l, quantity: l.quantity + action.delta } : l))\n .filter((l) => l.quantity > 0)\n return { ...ticket, lines }\n }\n case 'remove_one_of': {\n // The catalogue card's minus knows an item, not a line. Take from the\n // last line of that item so removing undoes the most recent add.\n const target = [...ticket.lines].reverse().find((l) => l.itemId === action.itemId)\n if (!target) return ticket\n return ticketReducer(ticket, { type: 'change_quantity', lineId: target.id, delta: -1 })\n }\n case 'remove_line':\n return { ...ticket, lines: ticket.lines.filter((l) => l.id !== action.lineId) }\n case 'edit_line': {\n // Recomputed from the base, never adjusted from the old total: adding\n // then removing bacon has to land back on the original price exactly.\n const unitPriceCents =\n action.basePriceCents + action.modifiers.reduce((sum, m) => sum + m.priceDeltaCents, 0)\n return {\n ...ticket,\n lines: ticket.lines.map((l) =>\n l.id === action.lineId\n ? {\n ...l,\n unitPriceCents,\n basePriceCents: action.basePriceCents,\n modifiers: action.modifiers.length ? action.modifiers : undefined,\n note: action.note || undefined,\n }\n : l,\n ),\n }\n }\n case 'set_note':\n return {\n ...ticket,\n lines: ticket.lines.map((l) => (l.id === action.lineId ? { ...l, note: action.note } : l)),\n }\n case 'fire': {\n // Only pending lines move. Re-firing an already-fired line would print a\n // second copy in the kitchen, and a duplicated dish is a real cost.\n if (!ticket.lines.some((l) => (l.state ?? 'pending') === 'pending')) return ticket\n return {\n ...ticket,\n lines: ticket.lines.map((l) =>\n (l.state ?? 'pending') === 'pending'\n ? { ...l, state: 'fired' as const, firedAt: action.at }\n : l,\n ),\n }\n }\n case 'set_line_state':\n return {\n ...ticket,\n lines: ticket.lines.map((l) => (l.id === action.lineId ? { ...l, state: action.state } : l)),\n }\n case 'clear':\n return { ...ticket, lines: [] }\n }\n}\n\nexport function totalsOf(\n ticket: Ticket,\n options: { serviceChargePercent?: number; discountCents?: number } = {},\n): TicketTotals {\n const subtotalCents = ticket.lines.reduce((sum, l) => sum + l.unitPriceCents * l.quantity, 0)\n const serviceCents = options.serviceChargePercent\n ? serviceChargeCents(subtotalCents, options.serviceChargePercent)\n : 0\n const discountCents = options.discountCents ?? 0\n return {\n subtotalCents,\n serviceCents,\n discountCents,\n totalCents: subtotalCents + serviceCents - discountCents,\n }\n}\n\nexport function emptyTicket(id: string, openedAt: string): Ticket {\n return { id, lines: [], openedAt }\n}\n\n// ---------------------------------------------------------------------------\n// The book: one ticket per position, plus the counter.\n//\n// A restaurant holds several orders open at once, so a single ticket is a lie\n// the screen tells until the operator switches tables and watches their work\n// vanish. The book keys tickets by position; the counter (no position chosen)\n// gets its own slot so a walk-up sale never lands on someone's table.\n// ---------------------------------------------------------------------------\n\n/** Slot for a sale with no position — counter service, walk-up, takeaway. */\nexport const COUNTER_KEY = '__counter'\n\nexport type TicketBook = Record<string, Ticket>\n\nexport type BookAction =\n | { type: 'at'; positionId: string; action: TicketAction }\n | { type: 'drop'; positionId: string }\n\nexport function bookReducer(book: TicketBook, action: BookAction): TicketBook {\n switch (action.type) {\n case 'at': {\n const current = book[action.positionId] ?? emptyTicket(`t-${action.positionId}`, '')\n const next = ticketReducer(current, action.action)\n if (next === current) return book\n return { ...book, [action.positionId]: next }\n }\n case 'drop': {\n if (!(action.positionId in book)) return book\n const { [action.positionId]: _dropped, ...rest } = book\n return rest\n }\n }\n}\n\nexport function ticketAt(book: TicketBook, positionId: string | undefined): Ticket {\n const key = positionId ?? COUNTER_KEY\n return book[key] ?? emptyTicket(`t-${key}`, '')\n}\n\n/** Item counts per position — what the floor and the dock read at a glance. */\nexport function countsOf(book: TicketBook): Record<string, number> {\n const out: Record<string, number> = {}\n for (const [key, ticket] of Object.entries(book)) {\n out[key] = ticket.lines.reduce((n, l) => n + l.quantity, 0)\n }\n return out\n}\n","// ---------------------------------------------------------------------------\n// Swipe-to-remove, in two stages — the iOS contract.\n//\n// Stage one: the row slides and STOPS at the revealed trash, and stays there.\n// Releasing here does not delete; it parks. The operator can read what is about\n// to happen, tap the trash, or push the row back.\n//\n// Stage two: keep pushing past the reveal and releasing commits.\n//\n// The stop is the whole point. A single-threshold swipe deletes from a flick\n// nobody meant, and \"the table lost an item and nobody knows why\" is not a bug\n// anyone can debug after the fact.\n// ---------------------------------------------------------------------------\n\nimport { useCallback, useRef, useState } from 'react'\nimport { haptic } from './haptics'\n\n/** Where the row rests once the trash is revealed. */\nexport const REVEAL_PX = 88\n/** Past this on release, the row is gone. */\nconst COMMIT_PX = 188\n\nexport function useSwipeAway(onRemove: () => void) {\n const [offset, setOffset] = useState(0)\n const [open, setOpen] = useState(false)\n const [removing, setRemoving] = useState(false)\n const start = useRef<number>()\n const base = useRef(0)\n const passed = useRef({ reveal: false, commit: false })\n\n const commit = useCallback(() => {\n setRemoving(true)\n haptic('commit')\n // Let the collapse play before the row leaves the list.\n window.setTimeout(onRemove, 180)\n }, [onRemove])\n\n const onPointerDown = useCallback((event: React.PointerEvent) => {\n // Mouse users get the buttons; dragging rows with a mouse is nobody's idiom.\n if (event.pointerType === 'mouse') return\n start.current = event.clientX\n base.current = offset\n passed.current = { reveal: false, commit: false }\n }, [offset])\n\n const onPointerMove = useCallback((event: React.PointerEvent) => {\n if (start.current == null) return\n const dx = Math.min(0, base.current + (event.clientX - start.current))\n setOffset(dx)\n\n // One pulse at each edge, so the finger learns where they are without\n // having to look down.\n const travelled = -dx\n if (travelled >= REVEAL_PX && !passed.current.reveal) {\n passed.current.reveal = true\n haptic('tap')\n }\n if (travelled >= COMMIT_PX && !passed.current.commit) {\n passed.current.commit = true\n haptic('warn')\n }\n }, [])\n\n const onPointerUp = useCallback(() => {\n if (start.current == null) return\n const travelled = -offset\n start.current = undefined\n\n if (travelled >= COMMIT_PX) { commit(); return }\n // Parked, not deleted. Half a swipe means \"show me the option\".\n if (travelled >= REVEAL_PX / 2) { setOffset(-REVEAL_PX); setOpen(true); return }\n setOffset(0)\n setOpen(false)\n }, [offset, commit])\n\n const close = useCallback(() => { setOffset(0); setOpen(false) }, [])\n\n return {\n offset,\n /** The row is parked showing its trash. */\n open,\n removing,\n close,\n /** Tapping the revealed trash is the deliberate path to the same place. */\n remove: commit,\n handlers: { onPointerDown, onPointerMove, onPointerUp, onPointerCancel: onPointerUp },\n }\n}\n","// ---------------------------------------------------------------------------\n// The content column: one view per rail destination.\n//\n// Presentational only. State lives in PosScreen, so changing menus never loses\n// the order being built — the ticket on the right is the job, and it stays.\n// ---------------------------------------------------------------------------\n\nimport {\n AlertTriangle, CheckCircle2, Clock, Minus, Plus, Receipt, Search, Users, Utensils,\n} from 'lucide-react'\nimport type {\n PosCategory, PosItem, PosPosition, PosPositionConfig, PosPositionStatus, PosStaff, PosTone,\n} from '../app/config'\nimport { formatCents } from './money'\nimport { haptic } from '../lib/haptics'\n\nconst STATUS: Record<PosPositionStatus, { label: string; Icon: typeof Clock }> = {\n free: { label: 'Livre', Icon: CheckCircle2 },\n occupied: { label: 'Ocupada', Icon: Utensils },\n bill_requested: { label: 'Conta pedida', Icon: Receipt },\n attention: { label: 'Atenção', Icon: AlertTriangle },\n}\n\n/** Colour never carries the meaning alone: icon and word ride along. */\nexport function StatusBadge({ status }: { status: PosPositionStatus }) {\n const { label, Icon } = STATUS[status]\n return (\n <span className=\"pos-badge\" data-status={status}>\n <Icon size={12} strokeWidth={2.4} aria-hidden />\n {label}\n </span>\n )\n}\n\nexport function elapsed(openedAt?: string, now = Date.now()): string | undefined {\n if (!openedAt) return undefined\n const minutes = Math.floor((now - new Date(openedAt).getTime()) / 60000)\n if (minutes < 0 || !Number.isFinite(minutes)) return undefined\n return minutes < 60 ? `${minutes}min` : `${Math.floor(minutes / 60)}h${String(minutes % 60).padStart(2, '0')}`\n}\n\nexport function EmptyState({ title, hint, Icon = Search, action }: {\n title: string\n hint?: string\n Icon?: typeof Search\n /** An empty state that only apologises wastes the space it takes. */\n action?: { label: string; onClick: () => void }\n}) {\n return (\n <div className=\"pos-empty\">\n <span className=\"pos-empty__icon\"><Icon size={20} strokeWidth={2} aria-hidden /></span>\n <span className=\"pos-empty__t\">{title}</span>\n {hint && <span className=\"pos-empty__s\">{hint}</span>}\n {action && (\n <button className=\"pos-empty__b\" onClick={() => { haptic('tap'); action.onClick() }}>\n {action.label}\n </button>\n )}\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Floor — two layouts, because two kinds of room exist.\n// ---------------------------------------------------------------------------\n\nexport function FloorView({ positions, config, activeId, onSelect, now, picking }: {\n positions: PosPosition[]\n config: PosPositionConfig\n activeId?: string\n onSelect: (p: PosPosition) => void\n now: number\n /** A party is waiting: only the free tables are answers to the question. */\n picking?: boolean\n}) {\n if (positions.length === 0) {\n return <EmptyState title=\"Nenhuma mesa nesta área\" hint=\"Escolha outra área acima.\" Icon={Utensils} />\n }\n return config.layout === 'plan'\n ? <PlanFloor positions={positions} config={config} activeId={activeId} onSelect={onSelect} picking={picking} />\n : <GridFloor positions={positions} activeId={activeId} onSelect={onSelect} now={now} picking={picking} />\n}\n\nfunction GridFloor({ positions, activeId, onSelect, now, picking }: {\n positions: PosPosition[]; activeId?: string; onSelect: (p: PosPosition) => void\n now: number; picking?: boolean\n}) {\n return (\n <div className=\"pos-floor pos-scroll\" data-picking={picking}>\n {positions.map((p, index) => {\n const since = elapsed(p.openedAt, now)\n return (\n <button\n key={p.id}\n className=\"pos-tbl\"\n data-status={p.status}\n data-target={picking ? p.status === 'free' : undefined}\n aria-current={p.id === activeId}\n aria-disabled={picking && p.status !== 'free'}\n style={{ ['--pos-stagger' as string]: `${Math.min(index, 11) * 20}ms` }}\n onClick={() => { haptic('tap'); onSelect(p) }}\n >\n <span className=\"pos-tbl__top\">\n <span className=\"pos-tbl__no\">{p.label}</span>\n {p.seats != null && (\n <span className=\"pos-tbl__seats\">\n <Users size={12} strokeWidth={2.2} aria-hidden />\n {p.seats}\n </span>\n )}\n </span>\n <StatusBadge status={p.status} />\n {p.attendantName && <span className=\"pos-tbl__who\">{p.attendantName}</span>}\n <span className=\"pos-tbl__foot\">\n <span className=\"pos-tbl__time pos-num\">\n {since ? <><Clock size={12} strokeWidth={2.2} aria-hidden />{since}</> : '—'}\n </span>\n {p.totalCents != null && (\n <span className=\"pos-tbl__total pos-num\">{formatCents(p.totalCents)}</span>\n )}\n </span>\n </button>\n )\n })}\n </div>\n )\n}\n\nconst CELL = 44\n\nfunction PlanFloor({ positions, config, activeId, onSelect, picking }: {\n positions: PosPosition[]; config: PosPositionConfig; activeId?: string\n onSelect: (p: PosPosition) => void; picking?: boolean\n}) {\n // Size to the room that exists. A declared grid leaves a field of empty\n // cells below the last table, which reads as \"the plan is unfinished\".\n const cols = Math.max(...positions.map((p) => (p.x ?? 1) + (p.w ?? 2) - 1), 4) + 1\n const rows = Math.max(...positions.map((p) => (p.y ?? 1) + (p.h ?? 2) - 1), 4) + 1\n return (\n <div\n className=\"pos-plan pos-scroll\"\n data-picking={picking}\n style={{ ['--pos-plan-cell' as string]: `${CELL}px` }}\n >\n <div className=\"pos-plan__canvas\" style={{ width: cols * CELL, height: rows * CELL }}>\n {positions.map((p) => {\n const w = p.w ?? 2\n const h = p.h ?? 2\n const left = ((p.x ?? 1) - 1) * CELL\n const top = ((p.y ?? 1) - 1) * CELL\n return (\n <PlanTable\n key={p.id}\n position={p}\n left={left} top={top}\n width={w * CELL - 8} height={h * CELL - 8}\n active={p.id === activeId}\n onSelect={onSelect}\n picking={picking}\n />\n )\n })}\n </div>\n <div className=\"pos-plan__legend\">\n {(Object.keys(STATUS) as PosPositionStatus[]).map((s) => (\n <span key={s} className=\"pos-legend__k\">\n <span className=\"pos-legend__sw\" style={{ background: `var(--pos-${\n { free: 'line-strong', occupied: 'warn', bill_requested: 'info', attention: 'danger' }[s]\n })` }} />\n {STATUS[s].label}\n </span>\n ))}\n </div>\n </div>\n )\n}\n\nfunction PlanTable({ position, left, top, width, height, active, onSelect, picking }: {\n position: PosPosition\n left: number; top: number; width: number; height: number\n active: boolean\n onSelect: (p: PosPosition) => void\n picking?: boolean\n}) {\n const seats = position.seats ?? 0\n return (\n <>\n {seatOffsets(seats, width, height).map((s, i) => (\n <span\n key={i}\n className=\"pos-seat\"\n style={{ left: left + 4 + s.x, top: top + 4 + s.y }}\n aria-hidden\n />\n ))}\n <button\n className=\"pos-pt\"\n data-status={position.status}\n data-shape={position.shape ?? 'square'}\n data-target={picking ? position.status === 'free' : undefined}\n aria-disabled={picking && position.status !== 'free'}\n aria-current={active}\n onClick={() => onSelect(position)}\n style={{ left: left + 4, top: top + 4, width, height }}\n title={`${position.label} · ${STATUS[position.status].label}`}\n >\n {position.itemCount != null && position.itemCount > 0 && (\n <span className=\"pos-pt__badge pos-num\">+{position.itemCount}</span>\n )}\n <span className=\"pos-pt__no\">{position.label.replace(/^Mesa\\s*/i, '')}</span>\n {position.attendantName && (\n <span\n className=\"pos-pt__chip\"\n style={{ background: `var(--pos-tone-${position.attendantTone ?? 'mint'})` }}\n >\n {initialsOf(position.attendantName)}\n </span>\n )}\n </button>\n </>\n )\n}\n\n/** Two letters is what fits on a table at plan scale, and it is what a floor\n * manager already reads on a printed roster. */\nexport function initialsOf(name: string): string {\n const parts = name.trim().split(/\\s+/)\n if (parts.length === 1) return parts[0]!.slice(0, 2).toUpperCase()\n return (parts[0]![0]! + parts[parts.length - 1]![0]!).toUpperCase()\n}\n\n/** Seats spread around the table's perimeter: top and bottom first, then sides. */\nfunction seatOffsets(seats: number, w: number, h: number): { x: number; y: number }[] {\n if (seats <= 0) return []\n const out: { x: number; y: number }[] = []\n const perSide = Math.ceil(seats / 4)\n const place = (n: number, fn: (i: number) => { x: number; y: number }) => {\n for (let i = 0; i < n && out.length < seats; i++) out.push(fn(i))\n }\n const step = (count: number, span: number, i: number) => ((i + 1) * span) / (count + 1) - 6\n place(perSide, (i) => ({ x: step(perSide, w, i), y: -17 }))\n place(perSide, (i) => ({ x: step(perSide, w, i), y: h + 4 }))\n place(perSide, (i) => ({ x: -17, y: step(perSide, h, i) }))\n place(perSide, (i) => ({ x: w + 4, y: step(perSide, h, i) }))\n return out\n}\n\n// ---------------------------------------------------------------------------\n// Catalogue — the stepper lives on the card, so adding to the open table never\n// requires leaving the grid.\n// ---------------------------------------------------------------------------\n\nexport function CatalogView({\n categories, items, activeCategoryId, onCategoryChange, quantities, onAdd, onRemove, query,\n}: {\n categories: PosCategory[]\n items: PosItem[]\n activeCategoryId?: string\n onCategoryChange: (id: string) => void\n quantities: Record<string, number>\n onAdd: (item: PosItem) => void\n onRemove: (item: PosItem) => void\n query: string\n}) {\n const normalised = query.trim().toLowerCase()\n const searching = normalised.length > 0\n const shown = items.filter((i) =>\n searching\n ? i.name.toLowerCase().includes(normalised) || i.code?.toLowerCase() === normalised\n : !activeCategoryId || i.categoryId === activeCategoryId,\n )\n\n return (\n <div className=\"pos-scroll\" style={{ flex: 1, minHeight: 0, display: 'flex', flexDirection: 'column' }}>\n {!searching && (\n <div className=\"pos-cats\">\n {categories.map((c, index) => (\n <button\n key={c.id}\n className=\"pos-cat\"\n style={{\n background: `var(--pos-tone-${c.tone})`,\n ['--pos-stagger' as string]: `${Math.min(index, 11) * 20}ms`,\n }}\n aria-pressed={c.id === activeCategoryId}\n onClick={() => { haptic('tap'); onCategoryChange(c.id) }}\n >\n <span>\n <span className=\"pos-cat__name\">{c.label}</span>\n {c.itemCount != null && (\n <span className=\"pos-cat__n pos-num\" style={{ display: 'block' }}>{c.itemCount} itens</span>\n )}\n </span>\n {c.icon && <span className=\"pos-cat__icon\">{c.icon}</span>}\n </button>\n ))}\n </div>\n )}\n\n {!searching && <hr className=\"pos-cats-rule\" />}\n\n {shown.length === 0 ? (\n <EmptyState title={`Nada encontrado para “${query}”`} hint=\"Tente o código do item ou parte do nome.\" />\n ) : (\n <div className=\"pos-items\">\n {shown.map((item, index) => {\n const quantity = quantities[item.id] ?? 0\n const category = categories.find((c) => c.id === item.categoryId)\n const filled = quantity > 0 && category != null\n return (\n <ItemCard\n key={item.id}\n quantity={quantity}\n filled={filled}\n onQuickAdd={() => { haptic('tap'); onAdd(item) }}\n label={item.name}\n // Capped so a 200-item category does not deal cards for four\n // seconds; past the twelfth the stagger has made its point.\n delayMs={Math.min(index, 11) * 24}\n tone={category?.tone}\n >\n {item.route && <span className=\"pos-item__route\">{item.route}</span>}\n <span className=\"pos-item__name\">{item.name}</span>\n <span className=\"pos-item__price pos-num\">\n {formatCents(item.priceCents)}\n {item.code && ` · ${item.code}`}\n </span>\n <span className=\"pos-item__foot\" onClick={(e) => e.stopPropagation()}>\n <span className=\"pos-step\">\n <button\n className=\"pos-step__b\"\n onClick={() => { haptic('tap'); onRemove(item) }}\n disabled={quantity === 0}\n aria-label={`Tirar um ${item.name}`}\n >\n <Minus size={16} strokeWidth={2.6} aria-hidden />\n </button>\n <span className=\"pos-step__n\">{quantity}</span>\n <button\n className=\"pos-step__b\"\n onClick={() => { haptic('tap'); onAdd(item) }}\n aria-label={`Mais um ${item.name}`}\n >\n <Plus size={16} strokeWidth={2.6} aria-hidden />\n </button>\n </span>\n </span>\n </ItemCard>\n )\n })}\n </div>\n )}\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n\nexport function ListView({ positions, activeId, onSelect, now, emptyLabel }: {\n positions: PosPosition[]\n activeId?: string\n onSelect: (p: PosPosition) => void\n now: number\n emptyLabel: string\n}) {\n if (positions.length === 0) return <EmptyState title={emptyLabel} Icon={Receipt} />\n return (\n <div className=\"pos-list pos-scroll\">\n {positions.map((p) => (\n <button\n key={p.id}\n className=\"pos-lrow\"\n aria-current={p.id === activeId}\n onClick={() => onSelect(p)}\n >\n <span className=\"pos-lrow__av pos-num\">\n {p.label.replace(/\\D/g, '').slice(-3) || p.label.slice(0, 2)}\n </span>\n <span>\n <span className=\"pos-lrow__t\">{p.label}</span>\n <span className=\"pos-lrow__s\">\n {p.attendantName ?? '—'}\n {elapsed(p.openedAt, now) && ` · ${elapsed(p.openedAt, now)}`}\n {p.itemCount != null && ` · ${p.itemCount} itens`}\n </span>\n </span>\n <span className=\"pos-lrow__e\">\n <StatusBadge status={p.status} />\n {p.totalCents != null && (\n <span className=\"pos-num\" style={{ fontWeight: 650 }}>{formatCents(p.totalCents)}</span>\n )}\n </span>\n </button>\n ))}\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n\nexport function ShiftView({ positions, staff }: { positions: PosPosition[]; staff: PosStaff[] }) {\n const open = positions.filter((p) => p.status !== 'free')\n const onFloor = open.reduce((sum, p) => sum + (p.totalCents ?? 0), 0)\n return (\n <div className=\"pos-scroll\" style={{ flex: 1, padding: 'var(--pos-4x)', display: 'grid', gap: 'var(--pos-3x)', alignContent: 'start' }}>\n <div style={{ display: 'grid', gridTemplateColumns: 'repeat(auto-fit, minmax(200px, 1fr))', gap: 'var(--pos-3x)' }}>\n <Stat label=\"Em aberto no salão\" value={formatCents(onFloor)} />\n <Stat label=\"Comandas abertas\" value={String(open.length)} />\n <Stat label=\"Pessoas no turno\" value={String(staff.length)} />\n </div>\n <p className=\"pos-t-sm\" style={{ margin: 0 }}>\n Abertura de caixa, sangria e fechamento chegam no M5 — este painel é o lugar deles.\n </p>\n </div>\n )\n}\n\nfunction Stat({ label, value }: { label: string; value: string }) {\n return (\n <div style={{\n border: '1px solid var(--pos-line)', borderRadius: 'var(--pos-r)',\n background: 'var(--pos-2)', padding: 'var(--pos-4x)',\n }}>\n <div className=\"pos-t-xs\" style={{ marginBottom: 4 }}>{label}</div>\n <div className=\"pos-t-display pos-num\">{value}</div>\n </div>\n )\n}\n\n/**\n * A catalogue card. It owns its own \"something changed\" pop, because the alt\n * — animating from the parent — would replay on every card whenever any one\n * of them changed.\n */\nfunction ItemCard({ quantity, filled, delayMs, tone, onQuickAdd, label, children }: {\n quantity: number\n filled: boolean\n delayMs: number\n tone?: PosTone\n /** Tapping the card rings one. The stepper stays for taking one back and for\n * anyone who wants the explicit control. */\n onQuickAdd: () => void\n label: string\n children: React.ReactNode\n}) {\n return (\n <div\n className=\"pos-item\"\n role=\"button\"\n tabIndex={0}\n // The card and its plus button had the same accessible name, so a screen\n // reader announced two identical controls with no way to tell them apart.\n aria-label={`${label}, adicionar à comanda`}\n data-filled={filled}\n onClick={onQuickAdd}\n onKeyDown={(e) => { if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); onQuickAdd() } }}\n style={{\n ['--pos-stagger' as string]: `${delayMs}ms`,\n ...(tone ? { ['--pos-item-tone' as string]: `var(--pos-tone-${tone})` } : {}),\n ...(filled && tone ? { background: `var(--pos-tone-${tone})` } : {}),\n }}\n >\n {children}\n </div>\n )\n}\n","// ---------------------------------------------------------------------------\n// The right rail: the order and the table it belongs to.\n//\n// Permanent, and tabbed. Everything the panel could show does not fit above a\n// closing total on a 13\" till — and what got squeezed was the item list, which\n// is the one thing the operator is actually reading. So the list owns the\n// height, and the clock, the table meta and the standing request move behind\n// \"Atividade\", one tap away and out of the way.\n// ---------------------------------------------------------------------------\n\nimport {\n Banknote, CircleDashed, Clock, CookingPot, CreditCard,\n AlertTriangle, ChefHat, ChevronLeft, Minus, Pencil, Phone, Plus, QrCode, Receipt,\n Trash2, UtensilsCrossed,\n} from 'lucide-react'\nimport { useState } from 'react'\nimport { haptic } from '../lib/haptics'\nimport { useSwipeAway } from '../lib/useSwipeAway'\nimport type { PosPaymentMethod, PosPositionStatus, PosVocabulary } from '../app/config'\nimport { formatCents, splitEvenly } from './money'\nimport type { LineState, Ticket, TicketLine, TicketTotals } from './session'\nimport { EmptyState, StatusBadge } from './views'\n\n/** How much room the details column is taking. It is never fully dismissed. */\n\nconst PAY_ICON: Record<string, typeof Banknote> = {\n cash: Banknote, dinheiro: Banknote,\n card: CreditCard, cartao: CreditCard, 'cartão': CreditCard,\n pix: QrCode,\n}\n\nexport function TicketRail({\n ticket, totals, vocabulary, paymentMethods, selectedPaymentId, onSelectPayment,\n onChangeQuantity, selectedLineId, onSelectLine, onClose, closeShortcut,\n guests, status, open, zoneLabel, request, now = Date.now(),\n containerRef, onBrowseCatalog, onEditLine, onEditIdentity, alias, customerPhone,\n onFire, fireShortcut,\n}: {\n ticket: Ticket\n totals: TicketTotals\n vocabulary: PosVocabulary\n paymentMethods: PosPaymentMethod[]\n selectedPaymentId?: string\n onSelectPayment: (id: string) => void\n onChangeQuantity: (lineId: string, delta: number) => void\n selectedLineId?: string\n onSelectLine: (lineId: string) => void\n onClose: () => void\n closeShortcut?: string\n guests?: number\n status?: PosPositionStatus\n zoneLabel?: string\n request?: string\n now?: number\n /** Small screens slide this rail in; wide ones ignore it. */\n open?: boolean\n /** Lets the screen scope arrow navigation to this column. */\n containerRef?: React.Ref<HTMLDivElement>\n /** An empty ticket's only useful action is going where the items are. */\n onBrowseCatalog?: () => void\n /** Reopens a line for its options and note. */\n onEditLine?: (lineId: string) => void\n /** Names the ticket and takes the customer's phone. */\n onEditIdentity?: () => void\n alias?: string\n customerPhone?: string\n /** Sends the pending lines to the kitchen. */\n onFire?: () => void\n fireShortcut?: string\n}) {\n const [tab, setTab] = useState<'order' | 'activity'>('order')\n const [paid, setPaid] = useState(false)\n /**\n * Payment is a STEP, not furniture. Three payment tiles sitting under every\n * order the whole shift are three controls the operator has to ignore\n * hundreds of times a night, and they push the item list up while doing it.\n */\n const [stage, setStage] = useState<'order' | 'checkout'>('order')\n const empty = ticket.lines.length === 0\n const count = ticket.lines.reduce((n, l) => n + l.quantity, 0)\n const pendingCount = ticket.lines\n .filter((l) => (l.state ?? 'pending') === 'pending')\n .reduce((n, l) => n + l.quantity, 0)\n // Leaving the table drops any half-finished checkout: coming back to a\n // different table with the previous one's payment armed is how the wrong\n // bill gets closed.\n const ticketId = ticket.id\n if (stage === 'checkout' && empty) setStage('order')\n\n const firedAt = ticket.lines\n .map((l) => l.firedAt)\n .filter((v): v is string => Boolean(v))\n .sort()[0]\n\n return (\n <aside\n className=\"pos-aside\"\n ref={containerRef as React.Ref<HTMLElement>}\n data-open={open ?? true}\n aria-label={vocabulary.ticket}\n >\n <header className=\"pos-tkt\">\n <div className=\"pos-tkt__row\">\n {/* The position stays the headline: at the pass people call the\n table, and a name replacing it makes the ticket unfindable on the\n floor. The name goes underneath, where it identifies without\n displacing. */}\n <span className=\"pos-t-xl\">{ticket.positionLabel ?? 'Balcão'}</span>\n {status && <StatusBadge status={status} />}\n {onEditIdentity && (\n <button\n className=\"pos-tkt__edit\"\n onClick={onEditIdentity}\n aria-label=\"Nomear a comanda ou anotar o celular\"\n title=\"Nomear a comanda ou anotar o celular\"\n >\n <Pencil size={14} strokeWidth={2.2} />\n </button>\n )}\n </div>\n {/* One line instead of a three-column grid: the same facts, a third of\n the height, and the item list gets what it saves. */}\n {/* One line, whatever it holds. A third line for the alias overflowed\n the header band and pushed the tabs into it; the name keeps its\n weight here without keeping its own row. */}\n <div className=\"pos-tkt__sub\">\n {alias && <strong className=\"pos-tkt__alias\">{alias}</strong>}\n <span className=\"pos-tkt__meta\">\n {[\n ticket.attendantName,\n guests != null && `${guests} pessoas`,\n sinceLabel(ticket.seatedAt, now),\n customerPhone,\n ].filter(Boolean).join(' · ') || `Sem ${vocabulary.position} selecionada`}\n </span>\n </div>\n </header>\n\n <div className=\"pos-tabs\" role=\"tablist\">\n <button\n className=\"pos-tab\" role=\"tab\" aria-selected={tab === 'order'}\n onClick={() => setTab('order')}\n >\n Pedido{count > 0 && <span className=\"pos-tab__n pos-num\">{count}</span>}\n </button>\n <button\n className=\"pos-tab\" role=\"tab\" aria-selected={tab === 'activity'}\n onClick={() => setTab('activity')}\n >\n Atividade\n {pendingCount > 0 && <span className=\"pos-tab__dot\" aria-label={`${pendingCount} não lançados`} />}\n </button>\n </div>\n\n <div className=\"pos-scroll\" style={{ flex: 1, minHeight: 0 }} role=\"tabpanel\">\n {tab === 'order' ? (\n empty ? (\n <EmptyState\n title={`${vocabulary.ticket} vazia`}\n hint=\"Digite o código do item e Enter, ou escolha no cardápio.\"\n Icon={Receipt}\n action={onBrowseCatalog && { label: 'Ver cardápio', onClick: onBrowseCatalog }}\n />\n ) : (\n ticket.lines.map((line) => (\n <TicketLineRow\n key={line.id}\n line={line}\n selected={line.id === selectedLineId}\n onSelect={() => { onSelectLine(line.id); onEditLine?.(line.id) }}\n onChangeQuantity={(delta) => onChangeQuantity(line.id, delta)}\n onRemove={() => onChangeQuantity(line.id, -line.quantity)}\n />\n ))\n )\n ) : (\n <ActivityPanel\n ticket={ticket}\n firedAt={firedAt}\n pendingCount={pendingCount}\n guests={guests}\n zoneLabel={zoneLabel}\n request={request}\n totals={totals}\n count={count}\n now={now}\n />\n )}\n </div>\n\n <div className=\"pos-tot\">\n <div className=\"pos-tot__r\">\n <span>Subtotal</span><span className=\"pos-num\">{formatCents(totals.subtotalCents)}</span>\n </div>\n {totals.serviceCents > 0 && (\n <div className=\"pos-tot__r\">\n <span>Serviço 10%</span><span className=\"pos-num\">{formatCents(totals.serviceCents)}</span>\n </div>\n )}\n {totals.discountCents > 0 && (\n <div className=\"pos-tot__r\">\n <span>Desconto</span><span className=\"pos-num\">− {formatCents(totals.discountCents)}</span>\n </div>\n )}\n <div className=\"pos-tot__g\">\n <span className=\"pos-t-md\">Total</span>\n <strong className=\"pos-t-display pos-num\">{formatCents(totals.totalCents)}</strong>\n </div>\n </div>\n\n {stage === 'order' ? (\n /* The primary action is whatever comes NEXT, not always the last step.\n With items still on the counter, \"fechar conta\" is the wrong verb —\n and offering it as the big button is how a bill gets paid for food\n the kitchen never heard about. */\n <div className=\"pos-cta pos-cta--stack\">\n {pendingCount > 0 ? (\n <>\n <p className=\"pos-hint\">\n <AlertTriangle size={14} strokeWidth={2.4} aria-hidden />\n {pendingCount === 1\n ? '1 item marcado ainda não foi para a cozinha'\n : `${pendingCount} itens marcados ainda não foram para a cozinha`}\n </p>\n <button\n className=\"pos-btn\"\n onClick={() => { haptic('commit'); onFire?.() }}\n >\n <ChefHat size={19} strokeWidth={2.2} aria-hidden />\n Enviar à cozinha\n <span className=\"pos-num\">{pendingCount}</span>\n {fireShortcut && <kbd className=\"pos-kbd\">{fireShortcut}</kbd>}\n </button>\n <button\n className=\"pos-btn pos-btn--ghost pos-btn--wide\"\n onClick={() => setStage('checkout')}\n >\n Fechar mesmo assim · {formatCents(totals.totalCents)}\n </button>\n </>\n ) : (\n <button\n className=\"pos-btn\"\n disabled={empty}\n onClick={() => { haptic('commit'); setStage('checkout') }}\n >\n Fechar conta\n {!empty && <span className=\"pos-num\">{formatCents(totals.totalCents)}</span>}\n {closeShortcut && <kbd className=\"pos-kbd\">{closeShortcut}</kbd>}\n </button>\n )}\n </div>\n ) : (\n <div className=\"pos-checkout\">\n {/* The whole row is the target. A 34px icon square is under the touch\n floor and asks a thumb to aim; on a tablet the back control is the\n one thing an operator reaches for in a hurry. */}\n <button\n className=\"pos-back\"\n onClick={() => { haptic('tap'); setStage('order') }}\n >\n <ChevronLeft size={20} strokeWidth={2.4} aria-hidden />\n Voltar à comanda\n </button>\n <div className=\"pos-checkout__head\">\n <span className=\"pos-t-xs\">Como vai pagar</span>\n </div>\n\n <div className=\"pos-pay\" role=\"radiogroup\" aria-label=\"Forma de pagamento\">\n {paymentMethods.map((m) => {\n const Icon = PAY_ICON[m.id.toLowerCase()] ?? Banknote\n return (\n <button\n key={m.id}\n className=\"pos-pay__b\"\n role=\"radio\"\n aria-checked={m.id === selectedPaymentId}\n onClick={() => { haptic('tap'); onSelectPayment(m.id) }}\n >\n <span><Icon size={18} strokeWidth={2} aria-hidden /></span>\n {m.label}\n </button>\n )\n })}\n </div>\n\n <div className=\"pos-cta\">\n <button\n className=\"pos-btn\"\n data-paid={paid}\n // Nothing is preselected, so this stays shut until the operator\n // says how the table paid. Guessing \"dinheiro\" is how a card sale\n // gets recorded as cash and the drawer stops matching.\n disabled={!selectedPaymentId}\n onClick={() => {\n haptic('commit')\n setPaid(true)\n window.setTimeout(() => { setPaid(false); setStage('order') }, 900)\n onClose()\n }}\n >\n {selectedPaymentId\n ? <>Confirmar <span className=\"pos-num\">{formatCents(totals.totalCents)}</span></>\n : 'Escolha a forma de pagamento'}\n </button>\n </div>\n </div>\n )}\n\n </aside>\n )\n}\n\n/**\n * The table's history, as a history.\n *\n * The previous version stacked two saturated slabs and a six-cell grid that\n * repeated the header three times over — pessoas, tempo and item count were\n * already on screen twice before this panel drew them again. What survives is\n * what the header does NOT say: when things happened, in order, and the one\n * number a split actually needs.\n */\nfunction ActivityPanel({\n ticket, firedAt, pendingCount, guests, zoneLabel, request, totals, count, now,\n}: {\n ticket: Ticket\n firedAt?: string\n pendingCount: number\n guests?: number\n zoneLabel?: string\n request?: string\n totals: TicketTotals\n count: number\n now: number\n}) {\n // One event per thing that happened, oldest first — including each fire, so\n // \"the starters went at 14:22 and the mains at 14:51\" is readable instead of\n // inferred.\n const fires = new Map<string, string[]>()\n for (const line of ticket.lines) {\n if (!line.firedAt) continue\n fires.set(line.firedAt, [...(fires.get(line.firedAt) ?? []), line.name])\n }\n\n const events: { at?: string; title: string; detail?: string; done: boolean }[] = []\n if (ticket.seatedAt) {\n events.push({\n at: ticket.seatedAt,\n title: 'Sentou',\n detail: guests ? `${guests} pessoas` : undefined,\n done: true,\n })\n }\n for (const [at, names] of [...fires.entries()].sort()) {\n events.push({\n at,\n title: 'Enviado à cozinha',\n detail: names.join(', '),\n done: true,\n })\n }\n if (pendingCount > 0) {\n events.push({\n title: 'Aguardando envio',\n detail: `${pendingCount} ${pendingCount === 1 ? 'item' : 'itens'} ainda no balcão`,\n done: false,\n })\n }\n\n return (\n <div className=\"pos-activity\">\n <ol className=\"pos-tl\">\n {events.map((e, i) => (\n <li key={i} className=\"pos-ev\" data-done={e.done}>\n <span className=\"pos-ev__mark\" aria-hidden />\n <span className=\"pos-ev__body\">\n <span className=\"pos-ev__row\">\n <span className=\"pos-ev__t\">{e.title}</span>\n {e.at && <span className=\"pos-ev__at pos-num\">{clock(e.at)}</span>}\n </span>\n {e.detail && <span className=\"pos-ev__d\">{e.detail}</span>}\n </span>\n </li>\n ))}\n {events.length === 0 && <li className=\"pos-ev__none\">Nada aconteceu ainda.</li>}\n </ol>\n\n {request && (\n <div className=\"pos-note-block\">\n <div className=\"pos-t-xs\">Observação da mesa</div>\n <p className=\"pos-note-block__t\">“{request}”</p>\n </div>\n )}\n\n {/* Only the numbers the header does not already carry. \"Média por item\"\n was here and nobody at a counter has ever needed it. */}\n <dl className=\"pos-dl\">\n <div>\n <dt className=\"pos-t-xs\">Área</dt>\n <dd>{zoneLabel ?? '—'}</dd>\n </div>\n <div>\n <dt className=\"pos-t-xs\">Por pessoa</dt>\n <dd className=\"pos-num\">\n {guests && guests > 0 ? formatCents(splitEvenly(totals.totalCents, guests)[0] ?? 0) : '—'}\n </dd>\n </div>\n </dl>\n </div>\n )\n}\n\nconst STATE_LABEL: Record<LineState, string> = {\n pending: 'Ainda não lançado',\n fired: 'Na cozinha',\n delivered: 'Entregue',\n}\n\nfunction StateIcon({ state }: { state: LineState }) {\n if (state === 'fired') return <CookingPot size={15} strokeWidth={2.2} aria-hidden />\n if (state === 'delivered') return <UtensilsCrossed size={15} strokeWidth={2.2} aria-hidden />\n return <CircleDashed size={15} strokeWidth={2.2} aria-hidden />\n}\n\nfunction clock(iso: string): string {\n return new Date(iso).toLocaleTimeString('pt-BR', { hour: '2-digit', minute: '2-digit' })\n}\n\nfunction sinceLabel(iso: string | undefined, now: number): string {\n if (!iso) return '—'\n const minutes = Math.floor((now - new Date(iso).getTime()) / 60000)\n if (!Number.isFinite(minutes) || minutes < 0) return '—'\n return minutes < 60 ? `${minutes}min` : `${Math.floor(minutes / 60)}h${String(minutes % 60).padStart(2, '0')}`\n}\n\n/** One row, with its own gesture. Lifting this out is what lets each line hold\n * swipe state without the whole rail re-rendering on every pointer move. */\nfunction TicketLineRow({ line, selected, onSelect, onChangeQuantity, onRemove }: {\n line: TicketLine\n selected: boolean\n onSelect: () => void\n onChangeQuantity: (delta: number) => void\n onRemove: () => void\n}) {\n const swipe = useSwipeAway(onRemove)\n const state = line.state ?? 'pending'\n\n return (\n <div className=\"pos-ln-wrap\" data-open={swipe.open} data-swiping={swipe.offset !== 0}>\n {/* Revealed, then tappable. The gesture parks here; only pushing further\n (or pressing this) actually removes. */}\n <button\n className=\"pos-swipe-bg\"\n tabIndex={swipe.open ? 0 : -1}\n aria-hidden={!swipe.open}\n onClick={swipe.remove}\n >\n <Trash2 size={18} strokeWidth={2.3} aria-hidden />\n Remover\n </button>\n <div\n className=\"pos-ln\"\n data-state={state}\n data-removing={swipe.removing}\n data-swiping={swipe.offset !== 0}\n style={{ transform: swipe.offset ? `translateX(${swipe.offset}px)` : undefined }}\n role=\"button\"\n tabIndex={0}\n aria-current={selected}\n onClick={() => (swipe.open ? swipe.close() : onSelect())}\n onKeyDown={(e) => { if (e.key === 'Enter' || e.key === ' ') onSelect() }}\n {...swipe.handlers}\n >\n <span className=\"pos-ln__state\" title={STATE_LABEL[state]}>\n <StateIcon state={state} />\n </span>\n <span>\n <span className=\"pos-ln__n\">{line.name}</span>\n {line.modifiers && line.modifiers.length > 0 && (\n <span className=\"pos-ln__mods\">\n {line.modifiers.map((m) => (\n <span key={`${m.groupId}:${m.optionId}`} className=\"pos-ln__mod\">\n {m.label}\n {m.priceDeltaCents !== 0 && (\n <span className=\"pos-num\">\n {' '}{m.priceDeltaCents > 0 ? '+' : '−'}{formatCents(Math.abs(m.priceDeltaCents))}\n </span>\n )}\n </span>\n ))}\n </span>\n )}\n {line.note && <span className=\"pos-ln__note\">“{line.note}”</span>}\n </span>\n <span className=\"pos-step\" onClick={(e) => e.stopPropagation()}>\n <button\n className=\"pos-step__b\"\n onClick={() => { haptic('tap'); onChangeQuantity(-1) }}\n aria-label={`Tirar um ${line.name}`}\n >\n <Minus size={14} strokeWidth={2.6} aria-hidden />\n </button>\n <span className=\"pos-step__n\">{line.quantity}</span>\n <button\n className=\"pos-step__b\"\n onClick={() => { haptic('tap'); onChangeQuantity(1) }}\n aria-label={`Adicionar ${line.name}`}\n >\n <Plus size={14} strokeWidth={2.6} aria-hidden />\n </button>\n </span>\n <span className=\"pos-ln__p pos-num\">\n {formatCents(line.unitPriceCents * line.quantity)}\n </span>\n </div>\n </div>\n )\n}\n","// ---------------------------------------------------------------------------\n// Delivery is dispatch, not a bill.\n//\n// The order arrives paid by the marketplace and already itemised. Nothing here\n// asks the operator to charge anyone; what it asks is the only question that\n// matters at the door: where is this order, and is it late.\n//\n// Columns instead of a list because the job is moving cards rightwards, and a\n// board makes \"four orders stuck in produção\" visible from across the counter\n// in a way a sorted list never does.\n// ---------------------------------------------------------------------------\n\nimport { useEffect, useRef, useState } from 'react'\nimport { AlertTriangle, Bike, ChefHat, CheckCheck, Clock, Package } from 'lucide-react'\nimport { haptic } from '../lib/haptics'\nimport type { DispatchStatus, PosPosition } from '../app/config'\nimport { formatCents } from './money'\nimport { EmptyState } from './views'\n\nconst COLUMNS: { id: DispatchStatus; label: string; Icon: typeof Clock }[] = [\n { id: 'received', label: 'Recebido', Icon: Package },\n { id: 'preparing', label: 'Em produção', Icon: ChefHat },\n { id: 'ready', label: 'Pronto', Icon: CheckCheck },\n { id: 'out', label: 'Saiu', Icon: Bike },\n]\n\n/** Late is measured against the promise, not against age: a 40-minute order\n * with an hour's promise is fine, and a 12-minute one promised in 10 is not. */\nfunction lateness(p: PosPosition, now: number): number | undefined {\n if (!p.dueAt) return undefined\n return Math.floor((now - new Date(p.dueAt).getTime()) / 60000)\n}\n\n/** How long a card lingers, fading, in the column it just left. */\nconst GHOST_MS = 300\n\nexport function DeliveryBoard({ orders, activeId, onSelect, now }: {\n orders: PosPosition[]\n activeId?: string\n onSelect: (p: PosPosition) => void\n now: number\n}) {\n // A card that changes column would otherwise blink out of one and into the\n // other, and the operator who tapped it never sees which one it left. The\n // ghost is that receipt: it fades where the card was while the real card\n // lands in the next column.\n const seen = useRef<Record<string, DispatchStatus>>({})\n const [ghosts, setGhosts] = useState<{ id: string; from: DispatchStatus; label: string }[]>([])\n\n useEffect(() => {\n const moved: { id: string; from: DispatchStatus; label: string }[] = []\n for (const o of orders) {\n const at = o.dispatch ?? 'received'\n const was = seen.current[o.id]\n if (was && was !== at) moved.push({ id: o.id, from: was, label: o.label })\n seen.current[o.id] = at\n }\n if (moved.length === 0) return\n setGhosts((g) => [...g, ...moved])\n const t = window.setTimeout(\n () => setGhosts((g) => g.filter((x) => !moved.some((m) => m.id === x.id))),\n GHOST_MS,\n )\n return () => window.clearTimeout(t)\n }, [orders])\n\n if (orders.length === 0) {\n return <EmptyState title=\"Nenhum pedido de delivery agora\" hint=\"Pedidos dos aplicativos aparecem aqui assim que entram.\" Icon={Bike} />\n }\n\n return (\n <div className=\"pos-board\">\n {COLUMNS.map(({ id, label, Icon }) => {\n const column = orders.filter((o) => (o.dispatch ?? 'received') === id)\n return (\n <section key={id} className=\"pos-col\" aria-label={label}>\n <header className=\"pos-col__head\">\n <Icon size={15} strokeWidth={2.2} aria-hidden />\n <span className=\"pos-col__t\">{label}</span>\n <span className=\"pos-col__n pos-num\">{column.length}</span>\n </header>\n <div className=\"pos-col__body\">\n {column.map((o) => {\n const late = lateness(o, now)\n const isLate = late != null && late > 0\n const awaiting = id === 'received' && !isLate\n return (\n <button\n key={o.id}\n className=\"pos-card\"\n data-late={isLate}\n // An order sitting in the first column has NOT been accepted\n // yet — the marketplace is counting, the kitchen is not. It\n // pulses until someone moves it, because a card that only\n // sits there looks exactly like one that is being cooked.\n data-await={awaiting}\n aria-current={o.id === activeId}\n // The column already says where the order is, so the edge\n // carries what position cannot: which channel it came from.\n // Late wins over channel — it is the only thing on this\n // board that needs to be seen before anything else.\n // Late beats waiting beats channel: the edge only ever\n // carries the most urgent of the three.\n style={o.channelTone && !isLate && !awaiting\n ? { ['--pos-edge' as string]: `var(--pos-tone-${o.channelTone})` }\n : undefined}\n onClick={() => { haptic('tap'); onSelect(o) }}\n >\n <span className=\"pos-card__top\">\n <span className=\"pos-card__id pos-num\">#{o.label.replace(/\\D/g, '') || o.label}</span>\n {o.channel && <span className=\"pos-card__ch\">{o.channel}</span>}\n </span>\n <span className=\"pos-card__who\">{o.customerName ?? '—'}</span>\n {o.address && <span className=\"pos-card__addr\">{o.address}</span>}\n <span className=\"pos-card__foot\">\n <span className={isLate ? 'pos-card__late' : 'pos-card__due'}>\n {isLate\n ? <><AlertTriangle size={12} strokeWidth={2.4} aria-hidden />{late}min atrasado</>\n : <><Clock size={12} strokeWidth={2.2} aria-hidden />{dueLabel(o, now)}</>}\n </span>\n {o.totalCents != null && (\n <span className=\"pos-card__v pos-num\">{formatCents(o.totalCents)}</span>\n )}\n </span>\n {o.courierName && (\n <span className=\"pos-card__courier\">\n <Bike size={12} strokeWidth={2.2} aria-hidden />{o.courierName}\n </span>\n )}\n </button>\n )\n })}\n {ghosts.filter((g) => g.from === id).map((g) => (\n <span key={`ghost-${g.id}`} className=\"pos-card pos-card--ghost\" aria-hidden />\n ))}\n {column.length === 0 && ghosts.every((g) => g.from !== id) && (\n <p className=\"pos-col__empty\">Nenhum</p>\n )}\n </div>\n </section>\n )\n })}\n </div>\n )\n}\n\nfunction dueLabel(p: PosPosition, now: number): string {\n if (!p.dueAt) return '—'\n const minutes = Math.ceil((new Date(p.dueAt).getTime() - now) / 60000)\n return minutes <= 0 ? 'agora' : `em ${minutes}min`\n}\n\nexport const DISPATCH_LABEL: Record<DispatchStatus, string> = {\n received: 'Recebido',\n preparing: 'Em produção',\n ready: 'Pronto',\n out: 'Saiu para entrega',\n delivered: 'Entregue',\n cancelled: 'Cancelado',\n}\n\n/** The next step, and only the next one: a board where every card offers every\n * status is a board where the operator picks the wrong one. */\nexport function nextDispatch(current: DispatchStatus): DispatchStatus | undefined {\n const order: DispatchStatus[] = ['received', 'preparing', 'ready', 'out', 'delivered']\n const i = order.indexOf(current)\n return i >= 0 && i < order.length - 1 ? order[i + 1] : undefined\n}\n","// ---------------------------------------------------------------------------\n// The rail for a delivery order.\n//\n// Same column, different job. The bill rail asks \"how do they pay\"; this one\n// asks \"where is it\". The order is read-only: it was itemised and settled by\n// the marketplace, and a stepper here would let a cashier edit something the\n// customer already paid for.\n// ---------------------------------------------------------------------------\n\nimport { AlertTriangle, Bike, Clock, MapPin, Phone, ShieldCheck } from 'lucide-react'\nimport type { PosPosition } from '../app/config'\nimport { DISPATCH_LABEL, nextDispatch } from './DeliveryBoard'\nimport { formatCents } from './money'\nimport type { Ticket, TicketTotals } from './session'\n\nexport function DispatchRail({\n order, ticket, totals, onAdvance, onCancel, now, open, containerRef,\n}: {\n order: PosPosition\n ticket: Ticket\n totals: TicketTotals\n onAdvance: (to: NonNullable<PosPosition['dispatch']>) => void\n onCancel: () => void\n now: number\n open?: boolean\n containerRef?: React.Ref<HTMLElement>\n}) {\n const status = order.dispatch ?? 'received'\n const next = nextDispatch(status)\n const late = order.dueAt\n ? Math.floor((now - new Date(order.dueAt).getTime()) / 60000)\n : undefined\n\n return (\n <aside\n className=\"pos-aside\"\n ref={containerRef}\n data-open={open ?? true}\n aria-label={`Pedido ${order.label}`}\n >\n <header className=\"pos-tkt\">\n <div className=\"pos-tkt__row\">\n <span className=\"pos-t-xl\">{order.label}</span>\n <span className=\"pos-badge\" data-status={status === 'out' ? 'bill_requested' : 'occupied'}>\n {DISPATCH_LABEL[status]}\n </span>\n </div>\n <div className=\"pos-tkt__sub\">\n {[order.channel, order.customerName].filter(Boolean).join(' · ')}\n </div>\n </header>\n\n <div className=\"pos-scroll\" style={{ flex: 1, minHeight: 0 }}>\n <div className=\"pos-dispatch\">\n {late != null && late > 0 && (\n <div className=\"pos-alert\">\n <AlertTriangle size={16} strokeWidth={2.3} aria-hidden />\n {late}min além do prometido\n </div>\n )}\n\n {order.address && (\n <div className=\"pos-fact\">\n <MapPin size={15} strokeWidth={2.2} aria-hidden />\n <span>{order.address}</span>\n </div>\n )}\n {order.courierName && (\n <div className=\"pos-fact\">\n <Bike size={15} strokeWidth={2.2} aria-hidden />\n <span>{order.courierName}</span>\n </div>\n )}\n {order.dueAt && (\n <div className=\"pos-fact\">\n <Clock size={15} strokeWidth={2.2} aria-hidden />\n <span>Prometido para {clock(order.dueAt)}</span>\n </div>\n )}\n </div>\n\n <div className=\"pos-t-xs\" style={{ padding: '0 var(--pos-4x) var(--pos-2x)' }}>Itens</div>\n {ticket.lines.map((line) => (\n <div key={line.id} className=\"pos-ln\" data-state={line.state ?? 'pending'} data-readonly=\"true\">\n <span className=\"pos-ln__qty pos-num\">{line.quantity}×</span>\n <span>\n <span className=\"pos-ln__n\">{line.name}</span>\n {line.note && <span className=\"pos-ln__note\">“{line.note}”</span>}\n </span>\n <span className=\"pos-ln__p pos-num\">\n {formatCents(line.unitPriceCents * line.quantity)}\n </span>\n </div>\n ))}\n </div>\n\n <div className=\"pos-tot\">\n <div className=\"pos-tot__g\">\n <span className=\"pos-t-md\">Total</span>\n <strong className=\"pos-t-display pos-num\">{formatCents(totals.totalCents)}</strong>\n </div>\n {/* Said plainly, because the operator's instinct is to collect. */}\n {order.prepaid !== false && (\n <p className=\"pos-paid\">\n <ShieldCheck size={14} strokeWidth={2.3} aria-hidden />\n Já pago no {order.channel ?? 'aplicativo'} — não cobrar\n </p>\n )}\n </div>\n\n <div className=\"pos-cta\" style={{ display: 'grid', gap: 'var(--pos-2x)' }}>\n {next ? (\n <button className=\"pos-btn\" onClick={() => onAdvance(next)}>\n {ADVANCE_LABEL[next]}\n </button>\n ) : (\n <button className=\"pos-btn\" disabled>Entregue</button>\n )}\n <button className=\"pos-btn pos-btn--ghost\" style={{ width: '100%' }} onClick={onCancel}>\n Cancelar pedido\n </button>\n </div>\n </aside>\n )\n}\n\nconst ADVANCE_LABEL: Record<string, string> = {\n preparing: 'Aceitar e produzir',\n ready: 'Marcar pronto',\n out: 'Despachar',\n delivered: 'Confirmar entrega',\n}\n\nfunction clock(iso: string): string {\n return new Date(iso).toLocaleTimeString('pt-BR', { hour: '2-digit', minute: '2-digit' })\n}\n","// ---------------------------------------------------------------------------\n// The shortcut sheet.\n//\n// Printing every binding across the bottom of the screen forever costs ~86px\n// of permanent chrome to teach something an operator learns in a week. It\n// lives here instead: one key away, complete, and gone the moment it is read.\n// ---------------------------------------------------------------------------\n\nimport { useEffect } from 'react'\nimport { Keyboard, X } from 'lucide-react'\nimport type { PosAction } from '../app/config'\n\n/** Bindings the screen owns, as opposed to the ones an app declares. */\nconst BUILT_IN: { combo: string; label: string }[] = [\n { combo: 'código + Enter', label: 'Lançar item pelo código' },\n { combo: '↑ ↓ ← →', label: 'Andar pela tela' },\n { combo: 'Enter', label: 'Acionar o que está em foco' },\n { combo: 'Esc', label: 'Voltar o cursor ao campo de comando' },\n { combo: 'F1', label: 'Esta lista' },\n]\n\nexport function ShortcutsOverlay({ actions, onClose }: {\n actions: PosAction[]\n onClose: () => void\n}) {\n useEffect(() => {\n function onKey(event: KeyboardEvent) {\n if (event.key === 'Escape' || event.key === 'F1') { event.preventDefault(); onClose() }\n }\n window.addEventListener('keydown', onKey, true)\n return () => window.removeEventListener('keydown', onKey, true)\n }, [onClose])\n\n const bound = actions.filter((a) => a.shortcut)\n\n return (\n <div className=\"pos-sheet\" role=\"dialog\" aria-modal=\"true\" aria-label=\"Atalhos\">\n <div className=\"pos-sheet__scrim\" onClick={onClose} />\n <div className=\"pos-sheet__panel\" style={{ width: 'min(620px, 94vw)' }}>\n <header className=\"pos-sheet__head\">\n <span style={{ display: 'flex', alignItems: 'center', gap: 10 }}>\n <Keyboard size={20} strokeWidth={2.1} aria-hidden />\n <span className=\"pos-t-xl\">Atalhos</span>\n </span>\n <button className=\"pos-icon-btn\" onClick={onClose} aria-label=\"Fechar\">\n <X size={18} strokeWidth={2.2} />\n </button>\n </header>\n\n <div className=\"pos-sheet__body pos-scroll\">\n <section>\n <div className=\"pos-t-xs\" style={{ marginBottom: 8 }}>Operação</div>\n <div className=\"pos-keys\">\n {bound.map((a) => (\n <div key={a.id} className=\"pos-key\">\n <kbd className=\"pos-kbd\">{a.shortcut}</kbd>\n <span>{a.label}</span>\n {a.requiresPin && <span className=\"pos-key__pin\">PIN</span>}\n </div>\n ))}\n </div>\n </section>\n\n <section>\n <div className=\"pos-t-xs\" style={{ marginBottom: 8 }}>Sempre</div>\n <div className=\"pos-keys\">\n {BUILT_IN.map((k) => (\n <div key={k.combo} className=\"pos-key\">\n <kbd className=\"pos-kbd\">{k.combo}</kbd>\n <span>{k.label}</span>\n </div>\n ))}\n </div>\n </section>\n </div>\n </div>\n </div>\n )\n}\n","// ---------------------------------------------------------------------------\n// Reservations.\n//\n// The POS does not take the booking — the site or the phone does. What it owns\n// is the moment the promise is kept: who is coming, at what time, and seating\n// them without anyone retyping a name or a party size that is already written\n// down. Retyping is where the party of six becomes a party of four.\n//\n// Grouped by time and not by status, because the host reads this list the way\n// the evening happens: what is next.\n// ---------------------------------------------------------------------------\n\nimport { CalendarClock, Check, Phone, UserRound, Users } from 'lucide-react'\nimport type { PosPosition, PosReservation, ReservationStatus } from '../app/config'\nimport { haptic } from '../lib/haptics'\nimport { EmptyState } from './views'\n\nconst STATUS: Record<ReservationStatus, { label: string; tone: string }> = {\n booked: { label: 'Reservado', tone: 'occupied' },\n confirmed: { label: 'Confirmado', tone: 'bill_requested' },\n arrived: { label: 'Chegou', tone: 'free' },\n seated: { label: 'Sentado', tone: 'free' },\n no_show: { label: 'Não veio', tone: 'attention' },\n}\n\nexport function ReservationsView({\n reservations, positions, now, onSeat, onMarkArrived, onOpenPosition,\n}: {\n reservations: PosReservation[]\n /** Used only to name the table a booking ended up at. */\n positions: PosPosition[]\n now: number\n onSeat: (reservation: PosReservation) => void\n onMarkArrived: (id: string) => void\n onOpenPosition: (positionId: string) => void\n}) {\n if (reservations.length === 0) {\n return <EmptyState title=\"Nenhuma reserva hoje\" hint=\"Reservas feitas no site ou por telefone aparecem aqui.\" Icon={CalendarClock} />\n }\n\n // Sorted by time, then split at \"now\" so the host sees what is next without\n // scanning past what already happened.\n const sorted = [...reservations].sort((a, b) => a.at.localeCompare(b.at))\n const upcoming = sorted.filter((r) => new Date(r.at).getTime() >= now - 15 * 60_000)\n const past = sorted.filter((r) => !upcoming.includes(r))\n\n return (\n <div className=\"pos-res pos-scroll\">\n {upcoming.length > 0 && (\n <Group title=\"A seguir\" rows={upcoming} positions={positions} now={now}\n onSeat={onSeat} onMarkArrived={onMarkArrived} onOpenPosition={onOpenPosition} />\n )}\n {past.length > 0 && (\n <Group title=\"Já passou\" rows={past} positions={positions} now={now}\n onSeat={onSeat} onMarkArrived={onMarkArrived} onOpenPosition={onOpenPosition} muted />\n )}\n </div>\n )\n}\n\nfunction Group({ title, rows, positions, now, onSeat, onMarkArrived, onOpenPosition, muted }: {\n title: string\n rows: PosReservation[]\n positions: PosPosition[]\n now: number\n onSeat: (r: PosReservation) => void\n onMarkArrived: (id: string) => void\n onOpenPosition: (positionId: string) => void\n muted?: boolean\n}) {\n return (\n <section className=\"pos-res__group\" data-muted={muted}>\n <h3 className=\"pos-t-xs\">{title}</h3>\n {rows.map((r) => {\n const late = Math.floor((now - new Date(r.at).getTime()) / 60_000)\n const isLate = late > 10 && (r.status === 'booked' || r.status === 'confirmed')\n return (\n <article key={r.id} className=\"pos-res__row\" data-late={isLate}>\n <span className=\"pos-res__time pos-num\">{clock(r.at)}</span>\n\n <span className=\"pos-res__who\">\n <span className=\"pos-res__name\">{r.name}</span>\n <span className=\"pos-res__meta\">\n <span className=\"pos-res__chip\"><Users size={12} strokeWidth={2.2} aria-hidden />{r.party}</span>\n {r.phone && <span className=\"pos-res__chip\"><Phone size={12} strokeWidth={2.2} aria-hidden />{r.phone}</span>}\n {r.channel && <span className=\"pos-res__chip\">{r.channel}</span>}\n </span>\n {r.note && <span className=\"pos-res__note\">“{r.note}”</span>}\n </span>\n\n <span className=\"pos-res__end\">\n <span className=\"pos-badge\" data-status={STATUS[r.status].tone}>\n {STATUS[r.status].label}\n </span>\n {isLate && <span className=\"pos-res__late pos-num\">{late}min de atraso</span>}\n </span>\n\n <span className=\"pos-res__do\">\n {r.status === 'seated' ? (\n /* Naming the table, and going there. \"Na mesa\" without saying\n which one makes the host walk the floor asking. */\n <button\n className=\"pos-res__b pos-res__at\"\n onClick={() => r.positionId && onOpenPosition(r.positionId)}\n disabled={!r.positionId}\n >\n <Check size={15} strokeWidth={2.6} aria-hidden />\n {positions.find((p) => p.id === r.positionId)?.label ?? 'Na mesa'}\n </button>\n ) : (\n <>\n {r.status !== 'arrived' && (\n <button\n className=\"pos-res__b\"\n onClick={() => { haptic('tap'); onMarkArrived(r.id) }}\n >\n <UserRound size={14} strokeWidth={2.2} aria-hidden />\n Chegou\n </button>\n )}\n <button\n className=\"pos-res__b pos-res__b--primary\"\n onClick={() => { haptic('tap'); onSeat(r) }}\n >\n Sentar\n </button>\n </>\n )}\n </span>\n </article>\n )\n })}\n </section>\n )\n}\n\nfunction clock(iso: string): string {\n return new Date(iso).toLocaleTimeString('pt-BR', { hour: '2-digit', minute: '2-digit' })\n}\n","// ---------------------------------------------------------------------------\n// The modifier sheet.\n//\n// Opens only for items that actually ask a question, because a sheet in front\n// of a beer is a tax on every round. Fully keyboard-operable: number keys pick\n// options, Enter confirms, Esc cancels — the waiter's hand never has to leave\n// the keyboard for a medium-rare.\n// ---------------------------------------------------------------------------\n\nimport { useEffect, useMemo, useRef, useState } from 'react'\nimport { Check, X } from 'lucide-react'\nimport type { PickedModifier, PosItem } from '../app/config'\nimport { formatCents } from './money'\n\nexport function ModifierSheet({ item, onCancel, onConfirm, initial, mode = 'add' }: {\n item: PosItem\n onCancel: () => void\n onConfirm: (picked: PickedModifier[], note: string) => void\n /** Prefills the sheet when reopening a line that is already on the ticket. */\n initial?: { modifiers?: PickedModifier[]; note?: string }\n mode?: 'add' | 'edit'\n}) {\n const groups = item.modifiers ?? []\n const [picked, setPicked] = useState<Record<string, string[]>>(() => {\n const seed: Record<string, string[]> = {}\n for (const g of groups) seed[g.id] = []\n for (const m of initial?.modifiers ?? []) {\n seed[m.groupId] = [...(seed[m.groupId] ?? []), m.optionId]\n }\n return seed\n })\n const [note, setNote] = useState(initial?.note ?? '')\n const noteRef = useRef<HTMLInputElement>(null)\n\n const chosen: PickedModifier[] = useMemo(\n () => groups.flatMap((g) =>\n (picked[g.id] ?? []).flatMap((optionId) => {\n const option = g.options.find((o) => o.id === optionId)\n return option\n ? [{ groupId: g.id, optionId, label: option.label, priceDeltaCents: option.priceDeltaCents ?? 0 }]\n : []\n }),\n ),\n [groups, picked],\n )\n\n // A group with min > 0 is a question the kitchen cannot cook without.\n const missing = groups.filter((g) => (g.min ?? 0) > (picked[g.id]?.length ?? 0))\n const total = item.priceCents + chosen.reduce((s, m) => s + m.priceDeltaCents, 0)\n\n function toggle(groupId: string, optionId: string, max: number) {\n setPicked((prev) => {\n const current = prev[groupId] ?? []\n if (current.includes(optionId)) return { ...prev, [groupId]: current.filter((id) => id !== optionId) }\n // At max, the newest choice pushes out the oldest instead of refusing —\n // silently ignoring a tap reads as a broken screen.\n const next = max === 1 ? [optionId] : [...current, optionId].slice(-max)\n return { ...prev, [groupId]: next }\n })\n }\n\n useEffect(() => {\n function onKey(event: KeyboardEvent) {\n if (event.key === 'Escape') { event.preventDefault(); onCancel(); return }\n if (event.key === 'Enter' && document.activeElement !== noteRef.current) {\n if (missing.length === 0) { event.preventDefault(); onConfirm(chosen, note.trim()) }\n }\n }\n window.addEventListener('keydown', onKey, true)\n return () => window.removeEventListener('keydown', onKey, true)\n }, [chosen, note, missing.length, onCancel, onConfirm])\n\n return (\n <div className=\"pos-sheet\" role=\"dialog\" aria-modal=\"true\" aria-label={`Opções de ${item.name}`}>\n <div className=\"pos-sheet__scrim\" onClick={onCancel} />\n <div className=\"pos-sheet__panel\">\n <header className=\"pos-sheet__head\">\n <span>\n <span className=\"pos-t-xl\">{item.name}</span>\n <span className=\"pos-t-sm pos-num\" style={{ display: 'block' }}>\n {mode === 'edit' ? 'Editando o item na comanda' : formatCents(item.priceCents)}\n </span>\n </span>\n <button className=\"pos-icon-btn\" onClick={onCancel} aria-label=\"Cancelar\">\n <X size={18} strokeWidth={2.2} />\n </button>\n </header>\n\n <div className=\"pos-sheet__body pos-scroll\">\n {groups.length === 0 && mode === 'edit' && (\n <p className=\"pos-t-sm\" style={{ margin: 0 }}>\n Este item não tem opções — só observação.\n </p>\n )}\n {groups.map((g) => {\n const max = g.max ?? 1\n const need = (g.min ?? 0) > (picked[g.id]?.length ?? 0)\n return (\n <section key={g.id} className=\"pos-mgroup\">\n <div className=\"pos-mgroup__head\">\n <span className=\"pos-t-xs\">{g.label}</span>\n {need && <span className=\"pos-mgroup__req\">obrigatório</span>}\n </div>\n <div className=\"pos-mgroup__opts\">\n {g.options.map((o) => {\n const on = (picked[g.id] ?? []).includes(o.id)\n return (\n <button\n key={o.id}\n className=\"pos-mopt\"\n aria-pressed={on}\n onClick={() => toggle(g.id, o.id, max)}\n >\n <span className=\"pos-mopt__check\">{on && <Check size={14} strokeWidth={3} />}</span>\n <span className=\"pos-mopt__label\">{o.label}</span>\n {o.priceDeltaCents ? (\n <span className=\"pos-mopt__delta pos-num\">\n {o.priceDeltaCents > 0 ? '+' : '−'} {formatCents(Math.abs(o.priceDeltaCents))}\n </span>\n ) : null}\n </button>\n )\n })}\n </div>\n </section>\n )\n })}\n\n <section className=\"pos-mgroup\">\n <div className=\"pos-mgroup__head\"><span className=\"pos-t-xs\">Observação</span></div>\n <input\n ref={noteRef}\n className=\"pos-note\"\n value={note}\n onChange={(e) => setNote(e.target.value)}\n placeholder=\"Ex.: sem cebola, ponto para a mesa toda\"\n aria-label=\"Observação para a cozinha\"\n />\n </section>\n </div>\n\n <footer className=\"pos-sheet__foot\">\n <button className=\"pos-btn pos-btn--ghost\" onClick={onCancel}>Cancelar</button>\n <button\n className=\"pos-btn\"\n disabled={missing.length > 0}\n onClick={() => onConfirm(chosen, note.trim())}\n >\n {missing.length > 0\n ? `Falta: ${missing[0]!.label}`\n : mode === 'edit'\n ? <>Salvar <span className=\"pos-num\">{formatCents(total)}</span></>\n : <>Adicionar <span className=\"pos-num\">{formatCents(total)}</span></>}\n </button>\n </footer>\n </div>\n </div>\n )\n}\n","// ---------------------------------------------------------------------------\n// Opening a table.\n//\n// One question, answered with a thumb: how many people. Everything else about\n// the table the room already knows. Number keys work too, because at the\n// counter the hand is on the keyboard and 4-Enter should be the whole gesture.\n// ---------------------------------------------------------------------------\n\nimport { useEffect, useState } from 'react'\nimport { Minus, Plus, Users, X } from 'lucide-react'\nimport type { PosPosition, PosStaff, PosVocabulary } from '../app/config'\n\nexport function OpenTableSheet({\n position, vocabulary, staff, defaultSeats, seatingName, onCancel, onConfirm,\n}: {\n position: PosPosition\n vocabulary: PosVocabulary\n staff: PosStaff[]\n defaultSeats?: number\n /** Set when a reservation is being seated — this sheet is then the CONFIRM\n * step of that flow, and has to say whose party it is about to seat. */\n seatingName?: string\n onCancel: () => void\n onConfirm: (guests: number, attendantId?: string) => void\n}) {\n const [guests, setGuests] = useState(defaultSeats ?? position.seats ?? 2)\n const [attendantId, setAttendantId] = useState(staff[0]?.id)\n\n useEffect(() => {\n function onKey(event: KeyboardEvent) {\n if (event.key === 'Escape') { event.preventDefault(); onCancel(); return }\n if (event.key === 'Enter') { event.preventDefault(); onConfirm(guests, attendantId); return }\n // A digit sets the count outright — the common case is 2, 4 or 6 and\n // nobody should tap a plus button four times to say six.\n if (/^[1-9]$/.test(event.key)) { event.preventDefault(); setGuests(Number(event.key)) }\n }\n window.addEventListener('keydown', onKey, true)\n return () => window.removeEventListener('keydown', onKey, true)\n }, [guests, attendantId, onCancel, onConfirm])\n\n return (\n <div className=\"pos-sheet\" role=\"dialog\" aria-modal=\"true\" aria-label={`Abrir ${position.label}`}>\n <div className=\"pos-sheet__scrim\" onClick={onCancel} />\n <div className=\"pos-sheet__panel\" style={{ width: 'min(460px, 92vw)' }}>\n <header className=\"pos-sheet__head\">\n <span>\n <span className=\"pos-t-xl\">\n {seatingName ? `Sentar na ${position.label}` : `Abrir ${position.label}`}\n </span>\n <span className=\"pos-t-sm\" style={{ display: 'block' }}>\n {seatingName\n ? `${seatingName} · ${position.seats ?? '—'} lugares`\n : position.seats ? `${position.seats} lugares` : vocabulary.position}\n </span>\n </span>\n <button className=\"pos-icon-btn\" onClick={onCancel} aria-label=\"Cancelar\">\n <X size={18} strokeWidth={2.2} />\n </button>\n </header>\n\n <div className=\"pos-sheet__body pos-scroll\">\n <section className=\"pos-mgroup\">\n <div className=\"pos-mgroup__head\"><span className=\"pos-t-xs\">Pessoas</span></div>\n <div className=\"pos-guests\">\n <button\n className=\"pos-step__b pos-guests__pm\"\n onClick={() => setGuests((g) => Math.max(1, g - 1))}\n disabled={guests <= 1}\n aria-label=\"Menos uma pessoa\"\n >\n <Minus size={18} strokeWidth={2.6} />\n </button>\n <span className=\"pos-guests__n pos-num\" aria-live=\"polite\">{guests}</span>\n <button\n className=\"pos-step__b pos-guests__pm\"\n onClick={() => setGuests((g) => g + 1)}\n aria-label=\"Mais uma pessoa\"\n >\n <Plus size={18} strokeWidth={2.6} />\n </button>\n </div>\n <div className=\"pos-quick\">\n {[1, 2, 3, 4, 5, 6, 8, 10].map((n) => (\n <button\n key={n}\n className=\"pos-quick__b pos-num\"\n aria-pressed={guests === n}\n onClick={() => setGuests(n)}\n >\n {n}\n </button>\n ))}\n </div>\n </section>\n\n {seatingName && position.seats != null && guests > position.seats && (\n /* Said, not blocked: pushing two tables together is a normal thing\n a host does, and a POS that refuses it is a POS they work around. */\n <p className=\"pos-warnline\">\n {position.label} tem {position.seats} lugares para {guests} pessoas.\n </p>\n )}\n\n {staff.length > 0 && (\n <section className=\"pos-mgroup\">\n <div className=\"pos-mgroup__head\"><span className=\"pos-t-xs\">Atendente</span></div>\n <div className=\"pos-mgroup__opts\">\n {staff.map((s) => (\n <button\n key={s.id}\n className=\"pos-mopt\"\n aria-pressed={s.id === attendantId}\n onClick={() => setAttendantId(s.id)}\n >\n <span className=\"pos-person__av\" style={{ background: `var(--pos-tone-${s.tone})` }}>\n {s.name.slice(0, 1)}\n </span>\n <span className=\"pos-mopt__label\">{s.name}</span>\n </button>\n ))}\n </div>\n </section>\n )}\n </div>\n\n <footer className=\"pos-sheet__foot\">\n <button className=\"pos-btn pos-btn--ghost\" onClick={onCancel}>Cancelar</button>\n <button className=\"pos-btn\" onClick={() => onConfirm(guests, attendantId)}>\n <Users size={18} strokeWidth={2.2} aria-hidden />\n {seatingName ? `Sentar ${guests}` : `Abrir com ${guests}`}\n </button>\n </footer>\n </div>\n </div>\n )\n}\n","// ---------------------------------------------------------------------------\n// Naming a ticket.\n//\n// \"Mesa 4\" is enough while the guests are sitting at it. A counter order is\n// not: at the pass, \"quem é o 4?\" has no answer, and the operator ends up\n// shouting a number into a room. A name and a phone give the ticket something\n// a person answers to — and give the cashier a way to FIND it when the customer\n// comes back an hour later with only their number to offer.\n// ---------------------------------------------------------------------------\n\nimport { useEffect, useRef, useState } from 'react'\nimport { Phone, User, X } from 'lucide-react'\nimport type { PosPosition } from '../app/config'\n\nexport function IdentitySheet({ position, onCancel, onSave }: {\n position: PosPosition\n onCancel: () => void\n onSave: (alias: string, phone: string) => void\n}) {\n const [alias, setAlias] = useState(position.alias ?? '')\n const [phone, setPhone] = useState(position.customerPhone ?? '')\n const first = useRef<HTMLInputElement>(null)\n\n useEffect(() => { first.current?.focus() }, [])\n\n useEffect(() => {\n function onKey(event: KeyboardEvent) {\n if (event.key === 'Escape') { event.preventDefault(); onCancel() }\n if (event.key === 'Enter') { event.preventDefault(); onSave(alias.trim(), phone.trim()) }\n }\n window.addEventListener('keydown', onKey, true)\n return () => window.removeEventListener('keydown', onKey, true)\n }, [alias, phone, onCancel, onSave])\n\n return (\n <div className=\"pos-sheet\" role=\"dialog\" aria-modal=\"true\" aria-label={`Identificar ${position.label}`}>\n <div className=\"pos-sheet__scrim\" onClick={onCancel} />\n <div className=\"pos-sheet__panel\" style={{ width: 'min(440px, 92vw)' }}>\n <header className=\"pos-sheet__head\">\n <span>\n <span className=\"pos-t-xl\">Identificar</span>\n <span className=\"pos-t-sm\" style={{ display: 'block' }}>{position.label}</span>\n </span>\n <button className=\"pos-icon-btn\" onClick={onCancel} aria-label=\"Cancelar\">\n <X size={18} strokeWidth={2.2} />\n </button>\n </header>\n\n <div className=\"pos-sheet__body\">\n <label className=\"pos-labelled\">\n <span className=\"pos-t-xs\">Nome na comanda</span>\n <span className=\"pos-input\">\n <User size={16} strokeWidth={2.1} aria-hidden />\n <input\n ref={first}\n value={alias}\n onChange={(e) => setAlias(e.target.value)}\n placeholder={`Ex.: João do balcão`}\n autoComplete=\"off\"\n />\n </span>\n </label>\n\n <label className=\"pos-labelled\">\n <span className=\"pos-t-xs\">Celular do cliente</span>\n <span className=\"pos-input\">\n <Phone size={16} strokeWidth={2.1} aria-hidden />\n <input\n value={phone}\n onChange={(e) => setPhone(e.target.value)}\n placeholder=\"(11) 9 9999-9999\"\n // The right keyboard on a tablet, and the right autofill.\n type=\"tel\"\n inputMode=\"tel\"\n autoComplete=\"tel\"\n />\n </span>\n </label>\n <p className=\"pos-t-sm\" style={{ margin: 0 }}>\n Serve para achar a conta depois — o cliente costuma lembrar do número, não do número da mesa.\n </p>\n </div>\n\n <footer className=\"pos-sheet__foot\">\n <button className=\"pos-btn pos-btn--ghost\" onClick={onCancel}>Cancelar</button>\n <button className=\"pos-btn\" onClick={() => onSave(alias.trim(), phone.trim())}>Salvar</button>\n </footer>\n </div>\n </div>\n )\n}\n","// ---------------------------------------------------------------------------\n// The PIN gate.\n//\n// This package does NOT hash the PIN. Shipping a hand-rolled digest here would\n// look like security and be theatre; the app owns `verifyPin` and can back it\n// with the real thing. What lives here is the part that has to be local and\n// instant: a manager releasing a discount in front of a customer does not wait\n// for a round-trip.\n// ---------------------------------------------------------------------------\n\nimport { useEffect, useState } from 'react'\nimport { Delete, ShieldCheck, X } from 'lucide-react'\nimport type { PosStaff } from '../app/config'\n\nconst PIN_LENGTH = 4\n\nexport function PinSheet({ actionLabel, onCancel, onVerify, onGranted }: {\n actionLabel: string\n onCancel: () => void\n /** Returns the person who authorised, or null when the PIN is wrong. */\n onVerify: (pin: string) => PosStaff | null | Promise<PosStaff | null>\n onGranted: (by: PosStaff) => void\n}) {\n const [pin, setPin] = useState('')\n const [error, setError] = useState<string>()\n const [checking, setChecking] = useState(false)\n\n async function submit(value: string) {\n setChecking(true)\n try {\n const person = await onVerify(value)\n if (person) { onGranted(person); return }\n // Clearing the field is the whole recovery path: retyping four digits is\n // faster than reading an explanation.\n setError('PIN não confere')\n setPin('')\n } finally {\n setChecking(false)\n }\n }\n\n function push(digit: string) {\n setError(undefined)\n const next = (pin + digit).slice(0, PIN_LENGTH)\n setPin(next)\n if (next.length === PIN_LENGTH) void submit(next)\n }\n\n useEffect(() => {\n function onKey(event: KeyboardEvent) {\n if (event.key === 'Escape') { event.preventDefault(); onCancel(); return }\n if (event.key === 'Backspace') { event.preventDefault(); setPin((p) => p.slice(0, -1)); return }\n if (/^[0-9]$/.test(event.key)) { event.preventDefault(); push(event.key) }\n }\n window.addEventListener('keydown', onKey, true)\n return () => window.removeEventListener('keydown', onKey, true)\n })\n\n return (\n <div className=\"pos-sheet\" role=\"dialog\" aria-modal=\"true\" aria-label={`PIN para ${actionLabel}`}>\n <div className=\"pos-sheet__scrim\" onClick={onCancel} />\n <div className=\"pos-sheet__panel\" style={{ width: 'min(400px, 92vw)' }}>\n <header className=\"pos-sheet__head\">\n <span>\n <span className=\"pos-t-xl\">{actionLabel}</span>\n <span className=\"pos-t-sm\" style={{ display: 'block' }}>Precisa de autorização</span>\n </span>\n <button className=\"pos-icon-btn\" onClick={onCancel} aria-label=\"Cancelar\">\n <X size={18} strokeWidth={2.2} />\n </button>\n </header>\n\n <div className=\"pos-sheet__body\">\n <div className=\"pos-pin__dots\" aria-live=\"polite\" aria-label={`${pin.length} de ${PIN_LENGTH} dígitos`}>\n {Array.from({ length: PIN_LENGTH }, (_, i) => (\n <span key={i} className=\"pos-pin__dot\" data-on={i < pin.length} />\n ))}\n </div>\n {/* role=alert so a screen reader announces the refusal without the\n operator having to go looking for it. */}\n <p className=\"pos-pin__err\" role=\"alert\">{error ?? ' '}</p>\n\n <div className=\"pos-pad\">\n {['1', '2', '3', '4', '5', '6', '7', '8', '9'].map((d) => (\n <button key={d} className=\"pos-pad__b pos-num\" onClick={() => push(d)} disabled={checking}>\n {d}\n </button>\n ))}\n <button className=\"pos-pad__b\" onClick={onCancel} aria-label=\"Cancelar\">\n <X size={20} strokeWidth={2.4} />\n </button>\n <button className=\"pos-pad__b pos-num\" onClick={() => push('0')} disabled={checking}>0</button>\n <button\n className=\"pos-pad__b\"\n onClick={() => setPin((p) => p.slice(0, -1))}\n aria-label=\"Apagar último dígito\"\n >\n <Delete size={20} strokeWidth={2.2} />\n </button>\n </div>\n </div>\n\n <footer className=\"pos-sheet__foot\" style={{ gridTemplateColumns: '1fr' }}>\n <span className=\"pos-pin__hint\">\n <ShieldCheck size={15} strokeWidth={2.2} aria-hidden />\n Fica registrado quem autorizou\n </span>\n </footer>\n </div>\n </div>\n )\n}\n","// ---------------------------------------------------------------------------\n// Splitting the bill.\n//\n// Two ways a table actually splits: evenly by head count, or by who ate what.\n// Both land on the same guarantee — the parts sum back to the whole, and the\n// rounding remainder has a visible owner. A centavo that quietly disappears is\n// how a cashier stops trusting the drawer.\n// ---------------------------------------------------------------------------\n\nimport { useMemo, useState } from 'react'\nimport { Minus, Plus, Users, UtensilsCrossed, X } from 'lucide-react'\nimport { formatCents, splitEvenly } from './money'\nimport type { Ticket, TicketTotals } from './session'\n\ntype Mode = 'even' | 'by_item'\n\nexport function SplitSheet({ ticket, totals, guests, onCancel, onConfirm }: {\n ticket: Ticket\n totals: TicketTotals\n guests?: number\n onCancel: () => void\n onConfirm: (parts: number[]) => void\n}) {\n const [mode, setMode] = useState<Mode>('even')\n const [ways, setWays] = useState(Math.max(2, guests ?? 2))\n /** lineId → which share it belongs to, in by-item mode. */\n const [assigned, setAssigned] = useState<Record<string, number>>({})\n\n const evenParts = useMemo(() => splitEvenly(totals.totalCents, ways), [totals.totalCents, ways])\n\n const itemParts = useMemo(() => {\n const parts = Array.from({ length: ways }, () => 0)\n let unassigned = 0\n for (const line of ticket.lines) {\n const value = line.unitPriceCents * line.quantity\n const share = assigned[line.id]\n if (share == null) { unassigned += value; continue }\n parts[share] = (parts[share] ?? 0) + value\n }\n // Service and anything nobody claimed spread evenly — leaving them out\n // would make the parts miss the total, which is the one thing that must\n // never happen.\n const shared = totals.totalCents - totals.subtotalCents + unassigned\n const spread = splitEvenly(Math.max(0, shared), ways)\n return parts.map((p, i) => p + (spread[i] ?? 0))\n }, [ticket.lines, assigned, ways, totals])\n\n const parts = mode === 'even' ? evenParts : itemParts\n const sum = parts.reduce((a, b) => a + b, 0)\n const unassignedCount = ticket.lines.filter((l) => assigned[l.id] == null).length\n\n return (\n <div className=\"pos-sheet\" role=\"dialog\" aria-modal=\"true\" aria-label=\"Dividir conta\">\n <div className=\"pos-sheet__scrim\" onClick={onCancel} />\n <div className=\"pos-sheet__panel\" style={{ width: 'min(680px, 94vw)' }}>\n <header className=\"pos-sheet__head\">\n <span>\n <span className=\"pos-t-xl\">Dividir conta</span>\n <span className=\"pos-t-sm pos-num\" style={{ display: 'block' }}>\n {formatCents(totals.totalCents)} no total\n </span>\n </span>\n <button className=\"pos-icon-btn\" onClick={onCancel} aria-label=\"Cancelar\">\n <X size={18} strokeWidth={2.2} />\n </button>\n </header>\n\n <div className=\"pos-sheet__body pos-scroll\">\n <div className=\"pos-seg\" style={{ alignSelf: 'start' }}>\n <button className=\"pos-seg__btn\" aria-pressed={mode === 'even'} onClick={() => setMode('even')}>\n <Users size={15} strokeWidth={2.2} aria-hidden /> Igual\n </button>\n <button className=\"pos-seg__btn\" aria-pressed={mode === 'by_item'} onClick={() => setMode('by_item')}>\n <UtensilsCrossed size={15} strokeWidth={2.2} aria-hidden /> Por item\n </button>\n </div>\n\n <section className=\"pos-mgroup\">\n <div className=\"pos-mgroup__head\"><span className=\"pos-t-xs\">Em quantas partes</span></div>\n <div className=\"pos-guests\">\n <button\n className=\"pos-step__b pos-guests__pm\"\n onClick={() => setWays((w) => Math.max(2, w - 1))}\n disabled={ways <= 2}\n aria-label=\"Menos uma parte\"\n >\n <Minus size={18} strokeWidth={2.6} />\n </button>\n <span className=\"pos-guests__n pos-num\">{ways}</span>\n <button\n className=\"pos-step__b pos-guests__pm\"\n onClick={() => setWays((w) => w + 1)}\n aria-label=\"Mais uma parte\"\n >\n <Plus size={18} strokeWidth={2.6} />\n </button>\n </div>\n </section>\n\n {mode === 'by_item' && (\n <section className=\"pos-mgroup\">\n <div className=\"pos-mgroup__head\">\n <span className=\"pos-t-xs\">Quem pediu o quê</span>\n {unassignedCount > 0 && (\n <span className=\"pos-mgroup__req\">{unassignedCount} sem dono — rateado</span>\n )}\n </div>\n {ticket.lines.map((line) => (\n <div key={line.id} className=\"pos-split__line\">\n <span className=\"pos-split__name\">\n {line.quantity}× {line.name}\n </span>\n <span className=\"pos-split__pick\">\n {Array.from({ length: ways }, (_, i) => (\n <button\n key={i}\n className=\"pos-split__b pos-num\"\n aria-pressed={assigned[line.id] === i}\n onClick={() => setAssigned((prev) =>\n prev[line.id] === i\n ? Object.fromEntries(Object.entries(prev).filter(([k]) => k !== line.id))\n : { ...prev, [line.id]: i },\n )}\n >\n {i + 1}\n </button>\n ))}\n </span>\n <span className=\"pos-split__v pos-num\">\n {formatCents(line.unitPriceCents * line.quantity)}\n </span>\n </div>\n ))}\n </section>\n )}\n\n <section className=\"pos-mgroup\">\n <div className=\"pos-mgroup__head\"><span className=\"pos-t-xs\">Cada parte paga</span></div>\n <div className=\"pos-parts\">\n {parts.map((value, i) => (\n <div key={i} className=\"pos-part\">\n <span className=\"pos-part__k pos-num\">Parte {i + 1}</span>\n <span className=\"pos-part__v pos-num\">{formatCents(value)}</span>\n </div>\n ))}\n </div>\n {/* Stated, not assumed: the operator can see the parts add up. */}\n <p className=\"pos-split__sum pos-num\">\n Soma das partes: {formatCents(sum)}\n {sum === totals.totalCents ? ' — confere' : ' — NÃO confere'}\n </p>\n </section>\n </div>\n\n <footer className=\"pos-sheet__foot\">\n <button className=\"pos-btn pos-btn--ghost\" onClick={onCancel}>Cancelar</button>\n <button className=\"pos-btn\" onClick={() => onConfirm(parts)}>\n Dividir em {ways}\n </button>\n </footer>\n </div>\n </div>\n )\n}\n","import { useEffect, useState } from 'react'\nimport { AlertTriangle, Check, Info } from 'lucide-react'\n\nexport type NoticeTone = 'info' | 'ok' | 'warn'\n\n/** One confirmation, shown once. A new object shows again even with the same\n * text — repeating an action has to repeat the confirmation. */\nexport interface PosNotice {\n text: string\n tone?: NoticeTone\n}\n\nconst ICON = { info: Info, ok: Check, warn: AlertTriangle }\n\n/**\n * Confirmations land over the strip of open tables, not in a corner.\n *\n * The strip is the one band the operator is not reading while ringing, so\n * covering it costs nothing — and it is a band, not a floating card, so the\n * message arrives in the place the eye already returns to between taps.\n * Blurring rather than hiding keeps the chips legible as shape, which is what\n * says \"this is passing\" without any dismiss affordance to hunt for.\n */\nexport function Notice({ notice, onDone }: { notice?: PosNotice; onDone: () => void }) {\n const [leaving, setLeaving] = useState(false)\n\n useEffect(() => {\n if (!notice) return\n setLeaving(false)\n const out = window.setTimeout(() => setLeaving(true), 1900)\n const gone = window.setTimeout(onDone, 2200)\n return () => { window.clearTimeout(out); window.clearTimeout(gone) }\n }, [notice, onDone])\n\n if (!notice) return null\n const tone = notice.tone ?? 'info'\n const Icon = ICON[tone]\n\n return (\n <div className=\"pos-notice\" data-tone={tone} data-leaving={leaving} role=\"status\" aria-live=\"polite\">\n <span className=\"pos-notice__i\" aria-hidden><Icon size={17} strokeWidth={2.6} /></span>\n {notice.text}\n </div>\n )\n}\n","// ---------------------------------------------------------------------------\n// The operator screen.\n//\n// Left rail navigates. Content changes with it. The right rail holds the order\n// and the table, always, and only ever changes width.\n//\n// Selecting a table does NOT navigate. Choosing where to look and choosing\n// what you are ringing are two different decisions, and a terminal that\n// conflates them moves the screen out from under the operator's hand.\n// ---------------------------------------------------------------------------\n\nimport { useCallback, useEffect, useMemo, useReducer, useRef, useState, type ReactNode } from 'react'\nimport {\n AlertTriangle, Banknote, Bike, CalendarClock, ClipboardList, Keyboard, LayoutGrid,\n type LucideIcon, Receipt, Search, UtensilsCrossed, X,\n} from 'lucide-react'\nimport type {\n DispatchStatus, PickedModifier, PosAction, PosAppConfig, PosCategory, PosItem,\n PosPosition, PosReservation, PosStaff, PosTone, ReservationStatus,\n} from '../app/config'\nimport { createKeymap } from '../keyboard'\nimport { directionOf, moveFocus } from '../keyboard'\nimport { haptic } from '../lib/haptics'\nimport { formatCents } from './money'\nimport {\n COUNTER_KEY, bookReducer, countsOf, ticketAt, totalsOf,\n type Ticket, type TicketAction, type TicketBook, type TicketLine, type TicketTotals,\n} from './session'\nimport { TicketRail } from './TicketRail'\nimport { CatalogView, FloorView, ShiftView, elapsed } from './views'\nimport { DeliveryBoard } from './DeliveryBoard'\nimport { DispatchRail } from './DispatchRail'\nimport { ShortcutsOverlay } from './ShortcutsOverlay'\nimport { ReservationsView } from './ReservationsView'\nimport { ModifierSheet } from './ModifierSheet'\nimport { OpenTableSheet } from './OpenTableSheet'\nimport { IdentitySheet } from './IdentitySheet'\nimport { PinSheet } from './PinSheet'\nimport { SplitSheet } from './SplitSheet'\nimport { Notice, type PosNotice } from './Notice'\n\n/**\n * A bill at the moment the operator confirms it. Everything the app needs to\n * settle it is here, so the handler never has to reach back into the screen.\n */\nexport interface PosBill {\n ticket: Ticket\n totals: TicketTotals\n /** Which of `config.paymentMethods` was chosen. Never guessed. */\n paymentMethodId: string\n}\n\nexport interface PosScreenProps {\n config: PosAppConfig\n categories: PosCategory[]\n items: PosItem[]\n positions: PosPosition[]\n staff?: PosStaff[]\n reservations?: PosReservation[]\n terminalName?: string\n operatorName?: string\n connection?: 'online' | 'reconnecting' | 'offline'\n onAction?: (actionId: string) => void\n /** Fired when the operator opens a position, so the app can persist it. */\n onOpenPosition?: (positionId: string, guests: number, attendantId?: string) => void\n /**\n * The lines that just left the operator's hands for the kitchen. `sent` is\n * only what moved on this press — a second fire must not print the first\n * round again — while `ticket` is the whole comanda after it, which is what\n * a header total has to be computed from.\n */\n onFire?: (positionId: string, sent: TicketLine[], ticket: Ticket) => void | Promise<void>\n /**\n * The bill is being settled. Return `false` (or throw) and the ticket stays\n * exactly where it is: a write that never reached the pool must not clear a\n * table, because the next thing that happens is the guests walking out.\n */\n onCloseBill?: (positionId: string, bill: PosBill) => boolean | void | Promise<boolean | void>\n /** A delivery order moved down the board. */\n onDispatch?: (positionId: string, to: DispatchStatus) => void | Promise<void>\n /**\n * Checks a PIN for an action that demands one. This package deliberately does\n * NOT hash: a hand-rolled digest here would look like security and be\n * theatre. Return the person who authorised, or null.\n */\n verifyPin?: (pin: string, actionId: string) => PosStaff | null | Promise<PosStaff | null>\n /** Called after a gated action is authorised, with who released it. */\n onAuthorised?: (actionId: string, by: PosStaff) => void\n /** Orders already open when the screen mounts, keyed by position id. */\n initialTickets?: Record<string, TicketLine[]>\n /**\n * A confirmation to show over the strip of open tables. Pass a NEW object to\n * show it — the screen raises its own for what it does itself, and this is\n * for what only the app knows (a write that reached the pool, or, for now,\n * one that did not).\n */\n notice?: PosNotice\n /**\n * The product's own mark, in the operator plate.\n *\n * Without it the plate shows the first letter of `config.name` — right for a\n * terminal that belongs to nobody's brand, wrong the moment the POS is opened\n * from inside a product the operator was just looking at. `className` below\n * is the other half: the host repaints the surface, this names it.\n */\n brandMark?: ReactNode\n /**\n * Host chrome at the head of the POS's own rail, under the operator plate.\n *\n * For the control that says where this screen SITS — the counter opened from\n * a back office puts its Balcão ⇄ Retaguarda switch here, in the column the\n * host's menu occupied a second ago. A dedicated terminal passes nothing and\n * the rail starts at \"Operação\", as before. Hidden on a narrow rail, where\n * the labels would be crushed: there the way out is the host's own corner.\n */\n railTop?: ReactNode\n /**\n * The wordmark beside the mark. Plain `config.name` unless the host has a\n * lockup of its own — a product whose name carries two weights (\"**Chef**\n * Control\") loses the distinction if the rail restates it in one.\n */\n brandName?: ReactNode\n /**\n * Added to the `.pos` root, so a host can restate the palette in its own\n * colours by redeclaring the `--pos-*` variables under its class. It is the\n * only theming seam: the POS keeps ONE design system and lets it be recoloured\n * — it never accepts a second one.\n */\n className?: string\n /** Injected in tests so elapsed times are not wall-clock dependent. */\n now?: number\n}\n\nconst MENU_ICON: Record<string, LucideIcon> = {\n // `list` é o quadro de despacho — a moto, a mesma que o back office usa para\n // Delivery. Um caminhão fala de carga, e o que sai daqui vai numa garupa.\n floor: LayoutGrid, catalog: UtensilsCrossed, list: Bike, shift: Banknote,\n reservations: CalendarClock,\n}\n\nlet lineSeq = 0\nconst nextLineId = () => `line-${++lineSeq}`\n\nexport function PosScreen({\n config, categories, items, positions, staff = [], reservations = [], terminalName, operatorName,\n connection = 'online', onAction, onOpenPosition, onFire, onCloseBill, onDispatch,\n verifyPin, onAuthorised, initialTickets, notice: appNotice, brandMark, brandName, className, railTop,\n now = Date.now(),\n}: PosScreenProps) {\n const [book, dispatchBook] = useReducer(bookReducer, undefined, (): TicketBook => {\n const seeded: TicketBook = {}\n const openedAt = new Date(now).toISOString()\n for (const [positionId, lines] of Object.entries(initialTickets ?? {})) {\n const seatedAt = positions.find((p) => p.id === positionId)?.openedAt ?? openedAt\n seeded[positionId] = { id: `t-${positionId}`, lines, openedAt, seatedAt }\n }\n return seeded\n })\n const [menuId, setMenuId] = useState(config.menus[0]?.id)\n const [activePositionId, setActivePositionId] = useState<string>()\n const [activeZoneId, setActiveZoneId] = useState(config.positions.zones?.[0]?.id)\n const [activeCategoryId, setActiveCategoryId] = useState(categories[0]?.id)\n const [selectedLineId, setSelectedLineId] = useState<string>()\n // Deliberately empty. Guessing \"dinheiro\" is how a card sale gets recorded\n // as cash and the drawer stops matching at the end of the shift.\n const [paymentId, setPaymentId] = useState<string>()\n const [query, setQuery] = useState('')\n const [railOpen, setRailOpen] = useState(false)\n const [pendingItem, setPendingItem] = useState<PosItem>()\n const [openingPosition, setOpeningPosition] = useState<PosPosition>()\n const [editing, setEditing] = useState<{ item: PosItem; line: TicketLine }>()\n const [naming, setNaming] = useState<PosPosition>()\n /** Names this terminal gave to tickets during the shift. */\n const [named, setNamed] = useState<Record<string, { alias: string; phone: string }>>({})\n /** Reservation moves this terminal made during the shift. */\n const [bookings, setBookings] = useState<Record<string, ReservationStatus>>({})\n /** Which position each booking ended up at — \"na mesa\" without saying which\n * one leaves the host asking the party where they sat. */\n const [seatedAt, setSeatedAt] = useState<Record<string, string>>({})\n /** The booking being seated, so its party and name carry into the table. */\n const [seating, setSeating] = useState<PosReservation>()\n const [pinFor, setPinFor] = useState<PosAction>()\n const [splitting, setSplitting] = useState(false)\n const [showKeys, setShowKeys] = useState(false)\n /** The confirmation currently over the dock, whoever raised it. */\n const [notice, setNotice] = useState<PosNotice>()\n /** Dispatch moves this terminal made, layered over what came in. */\n const [dispatched, setDispatched] = useState<Record<string, DispatchStatus>>({})\n /** Tables this terminal opened during the shift, on top of what came in. */\n const [opened, setOpened] = useState<Record<string, {\n seats: number; attendantName?: string; attendantTone?: PosTone; openedAt: string\n }>>({})\n /** Bills settled on this terminal during the shift: the table is free again. */\n const [settled, setSettled] = useState<Record<string, true>>({})\n /** One close at a time — a double tap must not take the money twice. */\n const [settling, setSettling] = useState(false)\n const commandRef = useRef<HTMLInputElement>(null)\n useEffect(() => { if (appNotice) setNotice(appNotice) }, [appNotice])\n\n const menu = config.menus.find((m) => m.id === menuId) ?? config.menus[0]\n const ticketKey = activePositionId ?? COUNTER_KEY\n const ticket = ticketAt(book, ticketKey)\n\n /** Every write goes to the position currently in hand — never a global one. */\n const dispatch = useCallback(\n (action: TicketAction) => dispatchBook({ type: 'at', positionId: ticketKey, action }),\n [ticketKey],\n )\n\n // What the floor and the dock read: live counts, not a static seed.\n const counts = useMemo(() => countsOf(book), [book])\n\n const totals = useMemo(\n () => totalsOf(ticket, { serviceChargePercent: config.serviceChargePercent }),\n [ticket, config.serviceChargePercent],\n )\n\n const quantities = useMemo(() => {\n const map: Record<string, number> = {}\n for (const line of ticket.lines) map[line.itemId] = (map[line.itemId] ?? 0) + line.quantity\n return map\n }, [ticket.lines])\n\n const ring = useCallback((item: PosItem, modifiers?: PickedModifier[], note?: string) => {\n dispatch({ type: 'add_item', item, lineId: nextLineId(), modifiers, note })\n }, [dispatch])\n\n /** Items that ask a question get the sheet; the rest ring on one tap. */\n const addItem = useCallback((item: PosItem) => {\n if (item.modifiers && item.modifiers.length > 0) { setPendingItem(item); return }\n ring(item)\n }, [ring])\n\n const removeItem = useCallback((item: PosItem) => {\n dispatch({ type: 'remove_one_of', itemId: item.id })\n }, [dispatch])\n\n // Code + Enter: the command field is the caret's home, so a cashier who never\n // touches the screen can still ring an order.\n const submitCode = useCallback(() => {\n const code = query.trim().toLowerCase()\n if (!code) return\n const hit = items.find((i) => i.code?.toLowerCase() === code)\n if (hit) { addItem(hit); setQuery('') }\n }, [query, items, addItem])\n\n const keymap = useMemo(() => createKeymap(), [])\n\n // The keymap registers once per action list; keeping the handler behind a ref\n // stops every ticket change from tearing down and rebuilding every binding.\n const handleActionRef = useRef((_id: string) => {})\n /** Behind a ref for the same reason as the action handler: F10 must not\n * re-register every binding each time a line changes. */\n const settleBillRef = useRef<() => Promise<void>>(async () => {})\n const mainRef = useRef<HTMLElement>(null)\n const asideRef = useRef<HTMLDivElement>(null)\n /** Read by the 'abrir mesa' action, which runs before the memo below. */\n const zonePositionsRef = useRef<PosPosition[]>([])\n const ticketRef = useRef(ticket)\n /** Read inside selectPosition, which is memoised without the seating state. */\n const seatingRef = useRef<PosReservation | undefined>(undefined)\n\n useEffect(() => {\n const disposers = config.actions\n .filter((a) => a.shortcut)\n .map((a) => keymap.register({ id: a.id, combo: a.shortcut!, handler: () => handleActionRef.current(a.id) }))\n return () => disposers.forEach((d) => d())\n }, [config.actions, keymap])\n\n useEffect(() => {\n function onKeyDown(event: KeyboardEvent) {\n // A sheet owns the keyboard while it is open; F-keys firing behind a\n // modal is how an operator cancels a table they cannot even see.\n if (document.querySelector('.pos-sheet')) return\n if (event.key === 'Enter' && document.activeElement === commandRef.current) {\n submitCode()\n return\n }\n // Esc always returns the caret to the command field. Losing focus mid-rush\n // is the difference between usable and unusable.\n if (event.key === 'F1') { event.preventDefault(); setShowKeys(true); return }\n if (event.key === 'Escape') { commandRef.current?.focus(); return }\n\n // Arrows walk whichever region the operator is already in. Typing in the\n // command field must keep its own caret movement, so the field opts out.\n const direction = directionOf(event.key)\n if (direction && document.activeElement !== commandRef.current) {\n const active = document.activeElement\n const region = asideRef.current?.contains(active as Node)\n ? asideRef.current\n : mainRef.current\n if (region && moveFocus(region, direction)) event.preventDefault()\n return\n }\n\n if (keymap.dispatch(event)) event.preventDefault()\n }\n window.addEventListener('keydown', onKeyDown)\n return () => window.removeEventListener('keydown', onKeyDown)\n }, [keymap, submitCode])\n\n // The floor shows what the book actually holds, so a table the operator just\n // rang stops disagreeing with the card that represents it.\n const livePositions = useMemo(() => positions.map((raw) => {\n // A bill settled on this terminal wins over whatever the load said: the\n // table is free, has no ticket and owes nothing, until someone opens it.\n if (settled[raw.id]) {\n const { ticketId: _t, openedAt: _o, attendantName: _a, attendantTone: _n,\n totalCents: _c, itemCount: _i, request: _r, ...rest } = raw\n return { ...rest, status: 'free' as const }\n }\n const just = opened[raw.id]\n let p: PosPosition = just\n ? {\n ...raw,\n status: 'occupied',\n seats: just.seats,\n attendantName: just.attendantName ?? raw.attendantName,\n attendantTone: just.attendantTone ?? raw.attendantTone,\n openedAt: just.openedAt,\n }\n : raw\n const moved = dispatched[raw.id]\n if (moved) p = { ...p, dispatch: moved }\n const t = book[p.id]\n if (!t) return p\n const totalCents = totalsOf(t, { serviceChargePercent: config.serviceChargePercent }).totalCents\n return { ...p, itemCount: counts[p.id] ?? p.itemCount, totalCents: totalCents || p.totalCents }\n }), [positions, opened, dispatched, settled, book, counts, config.serviceChargePercent])\n\n const activePosition = livePositions.find((p) => p.id === activePositionId)\n\n const zonePositions = activeZoneId\n ? livePositions.filter((p) => p.zoneId === activeZoneId)\n : livePositions\n\n /** Selecting a position changes what the order is FOR. It does not navigate.\n * A free one has nothing to show yet, so it asks to be opened instead. */\n const selectPosition = useCallback((p: PosPosition) => {\n if (p.status === 'free') { setOpeningPosition(p); return }\n // A party being seated can only land on a free table. Tapping an occupied\n // one during seating is a misfire, not a request to switch tables.\n if (seatingRef.current) return\n setActivePositionId(p.id)\n setRailOpen(true)\n }, [])\n\n const confirmOpen = useCallback((guests: number, attendantId?: string) => {\n const p = openingPosition\n if (!p) return\n const person = staff.find((s) => s.id === attendantId)\n setOpened((prev) => ({\n ...prev,\n [p.id]: {\n seats: guests,\n attendantName: person?.name,\n attendantTone: person?.tone,\n openedAt: new Date(now).toISOString(),\n },\n }))\n setActivePositionId(p.id)\n setRailOpen(true)\n setOpeningPosition(undefined)\n if (seating) {\n setNamed((prev) => ({ ...prev, [p.id]: { alias: seating.name, phone: seating.phone ?? '' } }))\n setBookings((prev) => ({ ...prev, [seating.id]: 'seated' }))\n setSeatedAt((prev) => ({ ...prev, [seating.id]: p.id }))\n setSeating(undefined)\n }\n setNotice({\n text: seating\n ? `${seating.name} na ${config.vocabulary.position} ${p.label}`\n : `${config.vocabulary.position} ${p.label} aberta`,\n tone: 'ok',\n })\n onOpenPosition?.(p.id, guests, attendantId)\n }, [openingPosition, staff, now, seating, onOpenPosition, config.vocabulary.position])\n\n // Firing is the verb between \"rung\" and \"cooked\". Wiring it here means the\n // app's action bar declares it like any other action and the screen owns\n // what it does to the ticket.\n /** What an action DOES, once it is allowed to happen. */\n const runAction = useCallback((actionId: string) => {\n if (actionId === 'fire') {\n // Counted before the dispatch, because after it there are no pending\n // lines left to count — and a confirmation for nothing is a lie.\n const at = new Date(now).toISOString()\n const sent = ticketRef.current.lines.filter((l) => (l.state ?? 'pending') === 'pending')\n dispatch({ type: 'fire', at })\n setNotice(sent.length > 0\n ? { text: sent.length === 1 ? '1 item enviado à cozinha' : `${sent.length} itens enviados à cozinha`, tone: 'ok' }\n : { text: 'Nada novo para enviar', tone: 'warn' })\n // The lines as the kitchen got them, already stamped: the app persists\n // what was sent, not what the rail happens to show a second later.\n if (sent.length > 0) {\n const stamp = (l: TicketLine) => ({ ...l, state: 'fired' as const, firedAt: at })\n const whole = ticketRef.current\n void onFire?.(ticketKey, sent.map(stamp), {\n ...whole,\n lines: whole.lines.map((l) => ((l.state ?? 'pending') === 'pending' ? stamp(l) : l)),\n })\n }\n }\n if (actionId === 'close_bill') { void settleBillRef.current() }\n if (actionId === 'split') setSplitting(true)\n if (actionId === 'open_table') {\n const free = zonePositionsRef.current.find((p) => p.status === 'free')\n if (free) setOpeningPosition(free)\n }\n onAction?.(actionId)\n }, [dispatch, now, onAction, onFire, ticketKey])\n\n /**\n * Settling the bill. The screen clears the table only after the app says the\n * money landed: on a refusal the ticket stays exactly as it was, because the\n * alternative is a cleared table and guests already on the pavement.\n */\n const settleBill = useCallback(async () => {\n if (settling) return\n const positionId = ticketKey\n const current = ticketRef.current\n if (current.lines.length === 0) {\n setNotice({ text: `${config.vocabulary.ticket} vazia`, tone: 'warn' })\n return\n }\n // The rail's own button is already shut without one; this is the F10 path,\n // which would otherwise walk straight past the question.\n if (!paymentId) {\n setNotice({ text: 'Escolha a forma de pagamento', tone: 'warn' })\n return\n }\n const bill: PosBill = { ticket: current, totals, paymentMethodId: paymentId }\n setSettling(true)\n try {\n const outcome = await onCloseBill?.(positionId, bill)\n if (outcome === false) {\n setNotice({ text: 'A conta não foi fechada', tone: 'warn' })\n return\n }\n dispatchBook({ type: 'drop', positionId })\n setSettled((prev) => ({ ...prev, [positionId]: true }))\n setOpened((prev) => {\n const { [positionId]: _closed, ...rest } = prev\n return rest\n })\n setPaymentId(undefined)\n setSelectedLineId(undefined)\n setActivePositionId(undefined)\n setRailOpen(false)\n setNotice({\n text: `${activePosition?.label ?? config.vocabulary.ticket} fechada · ${formatCents(bill.totals.totalCents)}`,\n tone: 'ok',\n })\n } catch (error) {\n setNotice({\n text: error instanceof Error ? error.message : 'A conta não foi fechada',\n tone: 'warn',\n })\n } finally {\n setSettling(false)\n }\n }, [settling, ticketKey, paymentId, totals, onCloseBill, config.vocabulary.ticket, activePosition?.label])\n\n /** The gate. An action that demands a PIN never runs before one is given —\n * including from its keyboard shortcut, which is the path that would\n * otherwise skip the whole thing. */\n const handleAction = useCallback((actionId: string) => {\n const action = config.actions.find((a) => a.id === actionId)\n if (action?.requiresPin && verifyPin) { haptic('warn'); setPinFor(action); return }\n haptic('tap')\n runAction(actionId)\n }, [config.actions, verifyPin, runAction])\n\n const shownActions = config.actions.filter(\n (a) => !a.cycles || a.cycles.includes(config.saleCycle),\n )\n\n useEffect(() => { handleActionRef.current = handleAction }, [handleAction])\n useEffect(() => { settleBillRef.current = settleBill }, [settleBill])\n useEffect(() => { zonePositionsRef.current = zonePositions }, [zonePositions])\n useEffect(() => { ticketRef.current = ticket }, [ticket])\n useEffect(() => { seatingRef.current = seating }, [seating])\n\n const openCount = livePositions.filter((p) => p.status !== 'free').length\n\n return (\n <div className={className ? `pos ${className}` : 'pos'}>\n <div className=\"pos-body\">\n <nav className=\"pos-rail\" aria-label=\"Navegação principal\">\n {/* Marca no topo, pessoa no pé — a ordem de qualquer trilha de\n produto, e a mesma do back office de onde este PDV é aberto. Uma\n placa única no alto misturava as duas coisas e ainda escondia os\n atalhos atrás dela. */}\n <div className=\"pos-brand\">\n <span className=\"pos-brand__mark\">{brandMark ?? config.name.slice(0, 1)}</span>\n <span className=\"pos-brand__name\">{brandName ?? config.name}</span>\n </div>\n\n {/* A busca mora na TRILHA, do mesmo jeito que no back office de onde\n este PDV é aberto: quem alterna entre as duas telas encontra o\n campo no mesmo lugar. Ela continua sendo a casa do cursor — código\n + Enter lança de qualquer view, e Esc devolve o foco para cá. */}\n <label className=\"pos-field\">\n <span className=\"pos-field__icon\"><Search size={17} strokeWidth={2.2} aria-hidden /></span>\n <input\n ref={commandRef}\n value={query}\n onChange={(e) => {\n setQuery(e.target.value)\n // Searching is a catalogue act, so results need the catalogue\n // on screen. Merely focusing the field is not — the caret\n // lives here, and focus alone must never move the view.\n const cat = config.menus.find((m) => m.view === 'catalog')\n if (e.target.value && cat && menu?.view !== 'catalog') setMenuId(cat.id)\n }}\n // \"Buscar\", como no back office — o campo mudou de lugar (é\n // linha da trilha agora) e a instrução longa que ensinava\n // código + Enter não cabe mais nem pertence a um rótulo. O\n // atalho continua dito pelo chip Esc ao lado e pelo F1.\n placeholder=\"Buscar\"\n aria-label=\"Buscar item por código ou nome\"\n />\n {query ? (\n <button\n type=\"button\"\n className=\"pos-field__clear\"\n onClick={() => { setQuery(''); commandRef.current?.focus() }}\n aria-label=\"Limpar busca\"\n >\n <X size={14} strokeWidth={2.6} />\n </button>\n ) : (\n // Esc is the way back to this field from anywhere; saying so\n // costs one chip and saves the operator from hunting for it.\n <kbd className=\"pos-field__hint\" aria-hidden>Esc</kbd>\n )}\n </label>\n\n {railTop && <div className=\"pos-rail__top\">{railTop}</div>}\n\n\n <div className=\"pos-rail__label pos-t-xs\">Operação</div>\n <div className=\"pos-nav\">\n {config.menus.map((m) => {\n const Icon = MENU_ICON[m.view] ?? ClipboardList\n return (\n <button\n key={m.id}\n className=\"pos-nav__item\"\n aria-current={m.id === menu?.id ? 'page' : undefined}\n onClick={() => setMenuId(m.id)}\n title={m.label}\n >\n <span className=\"pos-nav__icon\"><Icon size={19} strokeWidth={2.1} aria-hidden /></span>\n <span className=\"pos-nav__text\">{m.label}</span>\n {m.badge != null && m.badge > 0 && (\n <span className=\"pos-nav__count pos-num\">{m.badge}</span>\n )}\n </button>\n )\n })}\n </div>\n\n\n {/* O operador, no pé. Só o que ele NÃO sabe fica aqui: em que máquina\n está e se a rede caiu — quem está no teclado ele já sabe, mas o\n nome ancora a linha e é o que a torna a mesma linha do back\n office. Os atalhos viram o ícone ao lado, no lugar de uma placa. */}\n <div className=\"pos-user\" data-state={connection}>\n <span className=\"pos-user__av\">{(operatorName ?? config.name).slice(0, 1)}</span>\n {/* Duas linhas só quando a segunda diz alguma coisa: um terminal\n dedicado se chama \"Caixa 1\" e isso importa; um Balcão aberto de\n dentro do back office não é máquina nenhuma, e a linha viraria um\n ponto solto sob o nome. Sem ela, o ponto acompanha o nome. */}\n <span className=\"pos-user__txt\">\n <span className={terminalName ? 'pos-user__name' : 'pos-user__name pos-user__name--dotted'}>\n {!terminalName && <span className=\"pos-user__dot\" aria-hidden />}\n {operatorName ?? config.name}\n </span>\n {terminalName && (\n <span className=\"pos-user__meta\">\n <span className=\"pos-user__dot\" aria-hidden />\n {terminalName}\n </span>\n )}\n </span>\n <button\n className=\"pos-user__act\"\n onClick={() => setShowKeys(true)}\n aria-label=\"Atalhos\"\n title=\"Atalhos (F1)\"\n >\n <Keyboard size={15} strokeWidth={2.2} aria-hidden />\n </button>\n </div>\n </nav>\n\n <main className=\"pos-main\" ref={mainRef}>\n <div className=\"pos-head\">\n {/* Um título fixo onde a busca estava. Sem ele a faixa esvazia nas\n views sem áreas e a tela inteira sobe 72px ao trocar de menu. */}\n <span className=\"pos-head__title\">{menu?.label}</span>\n {menu?.view === 'floor' && (config.positions.zones ?? []).length > 0 && (\n <span className=\"pos-seg\" role=\"group\" aria-label=\"Áreas\">\n {config.positions.zones!.map((z) => (\n <button\n key={z.id}\n className=\"pos-seg__btn\"\n aria-pressed={z.id === activeZoneId}\n onClick={() => setActiveZoneId(z.id)}\n >\n {z.label}\n </button>\n ))}\n </span>\n )}\n\n </div>\n\n {menu?.view === 'floor' && (\n <FloorView\n positions={zonePositions}\n config={config.positions}\n activeId={activePositionId}\n onSelect={selectPosition}\n now={now}\n picking={seating != null}\n />\n )}\n {menu?.view === 'catalog' && (\n <CatalogView\n categories={categories}\n items={items}\n activeCategoryId={activeCategoryId}\n onCategoryChange={(id) => { setActiveCategoryId(id); setQuery('') }}\n quantities={quantities}\n onAdd={addItem}\n onRemove={removeItem}\n query={query}\n />\n )}\n {menu?.view === 'list' && (\n <DeliveryBoard\n orders={livePositions.filter((p) => p.kind === 'delivery')}\n activeId={activePositionId}\n onSelect={selectPosition}\n now={now}\n />\n )}\n {menu?.view === 'reservations' && (\n <ReservationsView\n reservations={reservations.map((r) => ({\n ...r,\n ...(bookings[r.id] ? { status: bookings[r.id]! } : {}),\n ...(seatedAt[r.id] ? { positionId: seatedAt[r.id] } : {}),\n }))}\n positions={livePositions}\n now={now}\n onOpenPosition={(id) => {\n const p = livePositions.find((x) => x.id === id)\n if (p) selectPosition(p)\n }}\n onMarkArrived={(id) => setBookings((prev) => ({ ...prev, [id]: 'arrived' }))}\n onSeat={(reservation) => {\n // Arming, not opening. Which table a party gets is a decision\n // made looking at the room — picking one for the host and\n // showing a modal takes that decision away from the person who\n // can see where the window is and who is about to leave.\n setSeating(reservation)\n const floor = config.menus.find((m) => m.view === 'floor')\n if (floor) setMenuId(floor.id)\n }}\n />\n )}\n {menu?.view === 'shift' && <ShiftView positions={livePositions} staff={staff} />}\n\n <Dock\n positions={livePositions.filter((p) => p.status !== 'free' && p.kind !== 'delivery')}\n activeId={activePositionId}\n onSelect={selectPosition}\n now={now}\n openCount={openCount}\n seating={seating}\n onCancelSeating={() => setSeating(undefined)}\n />\n\n <Notice notice={notice} onDone={() => setNotice(undefined)} />\n </main>\n\n {activePosition?.kind === 'delivery' ? (\n <DispatchRail\n containerRef={asideRef}\n order={activePosition}\n ticket={ticket}\n totals={totals}\n now={now}\n open={railOpen}\n onAdvance={(to) => {\n setDispatched((prev) => ({ ...prev, [activePosition.id]: to }))\n void onDispatch?.(activePosition.id, to)\n }}\n onCancel={() => handleAction('cancel_order')}\n />\n ) : (\n <TicketRail\n containerRef={asideRef}\n ticket={{\n ...ticket,\n positionLabel: activePosition?.label,\n attendantName: activePosition?.attendantName,\n seatedAt: ticket.seatedAt ?? activePosition?.openedAt,\n }}\n totals={totals}\n vocabulary={config.vocabulary}\n paymentMethods={config.paymentMethods}\n selectedPaymentId={paymentId}\n onSelectPayment={setPaymentId}\n onChangeQuantity={(lineId, delta) => dispatch({ type: 'change_quantity', lineId, delta })}\n selectedLineId={selectedLineId}\n onSelectLine={setSelectedLineId}\n // The method is cleared by the settle, not here: a close that the pool\n // refused must keep the answer the operator already gave.\n onClose={() => handleAction('close_bill')}\n onFire={() => handleAction('fire')}\n fireShortcut={config.actions.find((a) => a.id === 'fire')?.shortcut}\n closeShortcut={config.actions.find((a) => a.id === 'close_bill')?.shortcut}\n onBrowseCatalog={() => {\n const cat = config.menus.find((m) => m.view === 'catalog')\n if (cat) setMenuId(cat.id)\n commandRef.current?.focus()\n }}\n alias={activePositionId ? named[activePositionId]?.alias : undefined}\n customerPhone={activePositionId ? named[activePositionId]?.phone : undefined}\n onEditIdentity={activePosition ? () => setNaming(activePosition) : undefined}\n onEditLine={(lineId) => {\n const line = ticket.lines.find((l) => l.id === lineId)\n const item = line && items.find((i) => i.id === line.itemId)\n if (line && item) setEditing({ item, line })\n }}\n guests={activePosition?.seats}\n status={activePosition?.status}\n zoneLabel={config.positions.zones?.find((z) => z.id === activePosition?.zoneId)?.label}\n request={activePosition?.request}\n now={now}\n open={railOpen}\n />\n )}\n </div>\n\n {showKeys && (\n <ShortcutsOverlay actions={config.actions} onClose={() => setShowKeys(false)} />\n )}\n\n {pinFor && (\n <PinSheet\n actionLabel={pinFor.label}\n onCancel={() => setPinFor(undefined)}\n onVerify={(pin) => verifyPin!(pin, pinFor.id)}\n onGranted={(by) => {\n const id = pinFor.id\n setPinFor(undefined)\n onAuthorised?.(id, by)\n runAction(id)\n }}\n />\n )}\n\n {splitting && (\n <SplitSheet\n ticket={ticket}\n totals={totals}\n guests={activePosition?.seats}\n onCancel={() => setSplitting(false)}\n onConfirm={() => setSplitting(false)}\n />\n )}\n\n {openingPosition && (\n <OpenTableSheet\n position={openingPosition}\n vocabulary={config.vocabulary}\n staff={staff}\n defaultSeats={seating?.party}\n seatingName={seating?.name}\n onCancel={() => { setOpeningPosition(undefined); setSeating(undefined) }}\n onConfirm={confirmOpen}\n />\n )}\n\n {naming && (\n <IdentitySheet\n position={{\n ...naming,\n alias: named[naming.id]?.alias ?? naming.alias,\n customerPhone: named[naming.id]?.phone ?? naming.customerPhone,\n }}\n onCancel={() => setNaming(undefined)}\n onSave={(alias, phone) => {\n setNamed((prev) => ({ ...prev, [naming.id]: { alias, phone } }))\n setNaming(undefined)\n }}\n />\n )}\n\n {editing && (\n <ModifierSheet\n item={editing.item}\n mode=\"edit\"\n initial={{ modifiers: editing.line.modifiers, note: editing.line.note }}\n onCancel={() => setEditing(undefined)}\n onConfirm={(modifiers, note) => {\n dispatch({\n type: 'edit_line',\n lineId: editing.line.id,\n modifiers,\n note,\n basePriceCents: editing.line.basePriceCents ?? editing.item.priceCents,\n })\n setEditing(undefined)\n }}\n />\n )}\n\n {pendingItem && (\n <ModifierSheet\n item={pendingItem}\n onCancel={() => setPendingItem(undefined)}\n onConfirm={(modifiers, note) => {\n ring(pendingItem, modifiers, note || undefined)\n setPendingItem(undefined)\n }}\n />\n )}\n\n </div>\n )\n}\n\n/** SVG, not an emoji — an emoji is font-dependent and cannot take currentColor. */\nfunction LockGlyph() {\n return (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\n strokeWidth=\"2.4\" strokeLinecap=\"round\" aria-hidden focusable=\"false\">\n <rect x=\"4\" y=\"11\" width=\"16\" height=\"10\" rx=\"2\" />\n <path d=\"M8 11V7a4 4 0 0 1 8 0v4\" />\n </svg>\n )\n}\n\nfunction Dock({ positions, activeId, onSelect, now, openCount, seating, onCancelSeating }: {\n positions: PosPosition[]\n activeId?: string\n onSelect: (p: PosPosition) => void\n now: number\n openCount: number\n /** A party waiting for a table, held here until one is picked. */\n seating?: PosReservation\n onCancelSeating?: () => void\n}) {\n // With eight tables open the active chip can be off the end of the strip, and\n // the operator has no reason to suspect the row scrolls at all. Bringing it\n // into view is how \"which table am I on\" stays answerable.\n const activeRef = useRef<HTMLButtonElement>(null)\n useEffect(() => {\n const el = activeRef.current\n if (!el) return\n const still = window.matchMedia('(prefers-reduced-motion: reduce)').matches\n el.scrollIntoView?.({\n behavior: still ? 'auto' : 'smooth',\n block: 'nearest',\n inline: 'nearest',\n })\n }, [activeId])\n\n if (positions.length === 0 && !seating) return null\n return (\n <footer className=\"pos-dock pos-scroll-x\" aria-label={`${openCount} comandas abertas`}>\n {seating && (\n <div className=\"pos-seating\" role=\"status\">\n <span className=\"pos-seating__pulse\" aria-hidden />\n <span>\n <span className=\"pos-seating__t\">{seating.name}</span>\n <span className=\"pos-seating__s pos-num\">\n {seating.party} pessoas · escolha a mesa\n </span>\n </span>\n <button\n className=\"pos-seating__x\"\n onClick={onCancelSeating}\n aria-label=\"Cancelar a acomodação\"\n >\n <X size={15} strokeWidth={2.4} />\n </button>\n </div>\n )}\n {positions.map((p) => (\n <button\n key={p.id}\n ref={p.id === activeId ? activeRef : undefined}\n className=\"pos-dchip\"\n data-status={p.status}\n aria-current={p.id === activeId}\n onClick={() => onSelect(p)}\n >\n <span className=\"pos-dchip__tag pos-num\">\n {p.label.replace(/\\D/g, '').slice(-3) || p.label.slice(0, 2)}\n </span>\n <span>\n <span className=\"pos-dchip__t\">{p.attendantName ?? p.label}</span>\n <span className=\"pos-dchip__s pos-num\">\n {p.totalCents != null && formatCents(p.totalCents)}\n {elapsed(p.openedAt, now) && ` · ${elapsed(p.openedAt, now)}`}\n </span>\n </span>\n {p.status !== 'occupied' && (\n /* A glyph, not a word: on a strip of five the word is the widest\n thing in the row and it repeats what the colour already said.\n `title` keeps it readable for anyone who needs the word. */\n <span\n className=\"pos-dchip__st\"\n data-status={p.status}\n title={p.status === 'bill_requested' ? 'Conta pedida' : 'Atenção'}\n aria-label={p.status === 'bill_requested' ? 'Conta pedida' : 'Atenção'}\n >\n {p.status === 'bill_requested'\n ? <Receipt size={14} strokeWidth={2.3} aria-hidden />\n : <AlertTriangle size={14} strokeWidth={2.3} aria-hidden />}\n </span>\n )}\n </button>\n ))}\n </footer>\n )\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/screen/money.ts","../src/screen/session.ts","../src/lib/useSwipeAway.ts","../src/screen/views.tsx","../src/screen/TicketRail.tsx","../src/screen/DeliveryBoard.tsx","../src/screen/DispatchRail.tsx","../src/screen/ShortcutsOverlay.tsx","../src/screen/ReservationsView.tsx","../src/screen/ModifierSheet.tsx","../src/screen/OpenTableSheet.tsx","../src/screen/IdentitySheet.tsx","../src/screen/PinSheet.tsx","../src/screen/SplitSheet.tsx","../src/screen/Notice.tsx","../src/screen/PosScreen.tsx"],"names":["useState","useRef","jsxs","jsx","Receipt","Fragment","AlertTriangle","Minus","Plus","ChefHat","Clock","Bike","clock","useEffect","STATUS","Users","Phone","X","Check","ShieldCheck","useMemo","parts","UtensilsCrossed","Banknote","CalendarClock","seatedAt","useCallback","Search","Keyboard"],"mappings":"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","file":"index.js","sourcesContent":["// ---------------------------------------------------------------------------\n// Money. Cents only — the POS never holds a float for money, because a\n// restaurant that is off by a centavo at closing does not trust the system\n// again.\n// ---------------------------------------------------------------------------\n\nexport function formatCents(cents: number, currency = 'BRL', locale = 'pt-BR'): string {\n return new Intl.NumberFormat(locale, { style: 'currency', currency }).format(cents / 100)\n}\n\n/**\n * Split a total N ways without losing or inventing a centavo.\n *\n * 100,00 / 3 is 33,33 three times and one centavo left over. That centavo has\n * to land somewhere and be seen to land somewhere: the remainder goes to the\n * first shares, one each, so the parts always sum back to the whole.\n */\nexport function splitEvenly(totalCents: number, ways: number): number[] {\n if (ways <= 0) throw new Error('splitEvenly: ways must be positive')\n const base = Math.floor(totalCents / ways)\n const remainder = totalCents - base * ways\n return Array.from({ length: ways }, (_, i) => base + (i < remainder ? 1 : 0))\n}\n\nexport function serviceChargeCents(subtotalCents: number, percent: number): number {\n return Math.round((subtotalCents * percent) / 100)\n}\n","// ---------------------------------------------------------------------------\n// The live ticket: what the operator is building right now.\n//\n// Adding an item is an APPEND, never a read-modify-write of a quantity. Two\n// waiters ringing the same table at the same second must sum, not overwrite\n// each other — that rule is cheap here and expensive to retrofit, so it lives\n// in the reducer from the first commit.\n// ---------------------------------------------------------------------------\n\nimport type { PickedModifier, PosItem } from '../app/config'\nimport { serviceChargeCents } from './money'\n\n/**\n * Where a line is in its life.\n *\n * `pending` is still on the operator's screen and can be changed freely.\n * `fired` has been sent to the kitchen — changing it now means someone walks\n * back there, which is why cancelling a fired line is a manager's PIN and not\n * a minus button. `delivered` is on the table.\n */\nexport type LineState = 'pending' | 'fired' | 'delivered'\n\nexport interface TicketLine {\n /** Client-generated so the line exists before any server round-trip. */\n id: string\n itemId: string\n name: string\n /** What one of this line costs WITH its modifiers — frozen at add time. */\n unitPriceCents: number\n /** The menu price before modifiers, kept so the bill can show the breakdown. */\n basePriceCents?: number\n quantity: number\n note?: string\n modifiers?: PickedModifier[]\n /** Defaults to 'pending' — a line nobody fired yet. */\n state?: LineState\n /** When the kitchen got it. Drives the elapsed clock the expeditor reads. */\n firedAt?: string\n}\n\nexport interface Ticket {\n id: string\n /** When the guests sat. Different from the first item, and both matter: a\n * table seated 40 minutes ago with nothing fired is a table being ignored. */\n seatedAt?: string\n positionId?: string\n positionLabel?: string\n attendantName?: string\n guests?: number\n lines: TicketLine[]\n openedAt: string\n}\n\nexport interface TicketTotals {\n subtotalCents: number\n serviceCents: number\n discountCents: number\n totalCents: number\n}\n\nexport type TicketAction =\n | {\n type: 'add_item'\n item: PosItem\n lineId: string\n quantity?: number\n modifiers?: PickedModifier[]\n note?: string\n }\n | { type: 'change_quantity'; lineId: string; delta: number }\n | { type: 'remove_line'; lineId: string }\n | { type: 'set_note'; lineId: string; note: string }\n | {\n type: 'edit_line'\n lineId: string\n modifiers: PickedModifier[]\n note?: string\n /** Base price, so the unit price can be recomputed from scratch. */\n basePriceCents: number\n }\n | { type: 'remove_one_of'; itemId: string }\n | { type: 'fire'; at: string }\n | { type: 'set_line_state'; lineId: string; state: LineState }\n | { type: 'clear' }\n\nexport function ticketReducer(ticket: Ticket, action: TicketAction): Ticket {\n switch (action.type) {\n case 'add_item': {\n const modifiers = action.modifiers ?? []\n const unitPriceCents =\n action.item.priceCents + modifiers.reduce((sum, m) => sum + m.priceDeltaCents, 0)\n // Same item rung twice collapses into one line — but only when neither\n // carries a note or a modifier, because \"sem cebola\" is a different thing\n // from the plain one and must stay its own line to reach the kitchen.\n const plain = !action.note && modifiers.length === 0\n const last = plain\n ? ticket.lines.find(\n (l) =>\n l.itemId === action.item.id &&\n !l.note &&\n !l.modifiers?.length &&\n // A fired line is already in the kitchen's hands; adding to it\n // would raise a quantity nobody downstream heard about.\n (l.state ?? 'pending') === 'pending',\n )\n : undefined\n const quantity = action.quantity ?? 1\n if (last) {\n return {\n ...ticket,\n lines: ticket.lines.map((l) =>\n l.id === last.id ? { ...l, quantity: l.quantity + quantity } : l,\n ),\n }\n }\n return {\n ...ticket,\n lines: [\n ...ticket.lines,\n {\n id: action.lineId,\n itemId: action.item.id,\n name: action.item.name,\n unitPriceCents,\n basePriceCents: action.item.priceCents,\n quantity,\n ...(action.note ? { note: action.note } : {}),\n ...(modifiers.length ? { modifiers } : {}),\n },\n ],\n }\n }\n case 'change_quantity': {\n const lines = ticket.lines\n .map((l) => (l.id === action.lineId ? { ...l, quantity: l.quantity + action.delta } : l))\n .filter((l) => l.quantity > 0)\n return { ...ticket, lines }\n }\n case 'remove_one_of': {\n // The catalogue card's minus knows an item, not a line. Take from the\n // last line of that item so removing undoes the most recent add.\n const target = [...ticket.lines].reverse().find((l) => l.itemId === action.itemId)\n if (!target) return ticket\n return ticketReducer(ticket, { type: 'change_quantity', lineId: target.id, delta: -1 })\n }\n case 'remove_line':\n return { ...ticket, lines: ticket.lines.filter((l) => l.id !== action.lineId) }\n case 'edit_line': {\n // Recomputed from the base, never adjusted from the old total: adding\n // then removing bacon has to land back on the original price exactly.\n const unitPriceCents =\n action.basePriceCents + action.modifiers.reduce((sum, m) => sum + m.priceDeltaCents, 0)\n return {\n ...ticket,\n lines: ticket.lines.map((l) =>\n l.id === action.lineId\n ? {\n ...l,\n unitPriceCents,\n basePriceCents: action.basePriceCents,\n modifiers: action.modifiers.length ? action.modifiers : undefined,\n note: action.note || undefined,\n }\n : l,\n ),\n }\n }\n case 'set_note':\n return {\n ...ticket,\n lines: ticket.lines.map((l) => (l.id === action.lineId ? { ...l, note: action.note } : l)),\n }\n case 'fire': {\n // Only pending lines move. Re-firing an already-fired line would print a\n // second copy in the kitchen, and a duplicated dish is a real cost.\n if (!ticket.lines.some((l) => (l.state ?? 'pending') === 'pending')) return ticket\n return {\n ...ticket,\n lines: ticket.lines.map((l) =>\n (l.state ?? 'pending') === 'pending'\n ? { ...l, state: 'fired' as const, firedAt: action.at }\n : l,\n ),\n }\n }\n case 'set_line_state':\n return {\n ...ticket,\n lines: ticket.lines.map((l) => (l.id === action.lineId ? { ...l, state: action.state } : l)),\n }\n case 'clear':\n return { ...ticket, lines: [] }\n }\n}\n\nexport function totalsOf(\n ticket: Ticket,\n options: { serviceChargePercent?: number; discountCents?: number } = {},\n): TicketTotals {\n const subtotalCents = ticket.lines.reduce((sum, l) => sum + l.unitPriceCents * l.quantity, 0)\n const serviceCents = options.serviceChargePercent\n ? serviceChargeCents(subtotalCents, options.serviceChargePercent)\n : 0\n const discountCents = options.discountCents ?? 0\n return {\n subtotalCents,\n serviceCents,\n discountCents,\n totalCents: subtotalCents + serviceCents - discountCents,\n }\n}\n\nexport function emptyTicket(id: string, openedAt: string): Ticket {\n return { id, lines: [], openedAt }\n}\n\n// ---------------------------------------------------------------------------\n// The book: one ticket per position, plus the counter.\n//\n// A restaurant holds several orders open at once, so a single ticket is a lie\n// the screen tells until the operator switches tables and watches their work\n// vanish. The book keys tickets by position; the counter (no position chosen)\n// gets its own slot so a walk-up sale never lands on someone's table.\n// ---------------------------------------------------------------------------\n\n/** Slot for a sale with no position — counter service, walk-up, takeaway. */\nexport const COUNTER_KEY = '__counter'\n\nexport type TicketBook = Record<string, Ticket>\n\nexport type BookAction =\n | { type: 'at'; positionId: string; action: TicketAction }\n | { type: 'drop'; positionId: string }\n\nexport function bookReducer(book: TicketBook, action: BookAction): TicketBook {\n switch (action.type) {\n case 'at': {\n const current = book[action.positionId] ?? emptyTicket(`t-${action.positionId}`, '')\n const next = ticketReducer(current, action.action)\n if (next === current) return book\n return { ...book, [action.positionId]: next }\n }\n case 'drop': {\n if (!(action.positionId in book)) return book\n const { [action.positionId]: _dropped, ...rest } = book\n return rest\n }\n }\n}\n\nexport function ticketAt(book: TicketBook, positionId: string | undefined): Ticket {\n const key = positionId ?? COUNTER_KEY\n return book[key] ?? emptyTicket(`t-${key}`, '')\n}\n\n/** Item counts per position — what the floor and the dock read at a glance. */\nexport function countsOf(book: TicketBook): Record<string, number> {\n const out: Record<string, number> = {}\n for (const [key, ticket] of Object.entries(book)) {\n out[key] = ticket.lines.reduce((n, l) => n + l.quantity, 0)\n }\n return out\n}\n","// ---------------------------------------------------------------------------\n// Swipe-to-remove, in two stages — the iOS contract.\n//\n// Stage one: the row slides and STOPS at the revealed trash, and stays there.\n// Releasing here does not delete; it parks. The operator can read what is about\n// to happen, tap the trash, or push the row back.\n//\n// Stage two: keep pushing past the reveal and releasing commits.\n//\n// The stop is the whole point. A single-threshold swipe deletes from a flick\n// nobody meant, and \"the table lost an item and nobody knows why\" is not a bug\n// anyone can debug after the fact.\n// ---------------------------------------------------------------------------\n\nimport { useCallback, useRef, useState } from 'react'\nimport { haptic } from './haptics'\n\n/** Where the row rests once the trash is revealed. */\nexport const REVEAL_PX = 88\n/** Past this on release, the row is gone. */\nconst COMMIT_PX = 188\n\nexport function useSwipeAway(onRemove: () => void) {\n const [offset, setOffset] = useState(0)\n const [open, setOpen] = useState(false)\n const [removing, setRemoving] = useState(false)\n const start = useRef<number>()\n const base = useRef(0)\n const passed = useRef({ reveal: false, commit: false })\n\n const commit = useCallback(() => {\n setRemoving(true)\n haptic('commit')\n // Let the collapse play before the row leaves the list.\n window.setTimeout(onRemove, 180)\n }, [onRemove])\n\n const onPointerDown = useCallback((event: React.PointerEvent) => {\n // Mouse users get the buttons; dragging rows with a mouse is nobody's idiom.\n if (event.pointerType === 'mouse') return\n start.current = event.clientX\n base.current = offset\n passed.current = { reveal: false, commit: false }\n }, [offset])\n\n const onPointerMove = useCallback((event: React.PointerEvent) => {\n if (start.current == null) return\n const dx = Math.min(0, base.current + (event.clientX - start.current))\n setOffset(dx)\n\n // One pulse at each edge, so the finger learns where they are without\n // having to look down.\n const travelled = -dx\n if (travelled >= REVEAL_PX && !passed.current.reveal) {\n passed.current.reveal = true\n haptic('tap')\n }\n if (travelled >= COMMIT_PX && !passed.current.commit) {\n passed.current.commit = true\n haptic('warn')\n }\n }, [])\n\n const onPointerUp = useCallback(() => {\n if (start.current == null) return\n const travelled = -offset\n start.current = undefined\n\n if (travelled >= COMMIT_PX) { commit(); return }\n // Parked, not deleted. Half a swipe means \"show me the option\".\n if (travelled >= REVEAL_PX / 2) { setOffset(-REVEAL_PX); setOpen(true); return }\n setOffset(0)\n setOpen(false)\n }, [offset, commit])\n\n const close = useCallback(() => { setOffset(0); setOpen(false) }, [])\n\n return {\n offset,\n /** The row is parked showing its trash. */\n open,\n removing,\n close,\n /** Tapping the revealed trash is the deliberate path to the same place. */\n remove: commit,\n handlers: { onPointerDown, onPointerMove, onPointerUp, onPointerCancel: onPointerUp },\n }\n}\n","// ---------------------------------------------------------------------------\n// The content column: one view per rail destination.\n//\n// Presentational only. State lives in PosScreen, so changing menus never loses\n// the order being built — the ticket on the right is the job, and it stays.\n// ---------------------------------------------------------------------------\n\nimport {\n AlertTriangle, CheckCircle2, Clock, Minus, Plus, Receipt, Search, Users, Utensils,\n} from 'lucide-react'\nimport type {\n PosCategory, PosItem, PosPosition, PosPositionConfig, PosPositionStatus, PosStaff, PosTone,\n} from '../app/config'\nimport { formatCents } from './money'\nimport { haptic } from '../lib/haptics'\n\nconst STATUS: Record<PosPositionStatus, { label: string; Icon: typeof Clock }> = {\n free: { label: 'Livre', Icon: CheckCircle2 },\n occupied: { label: 'Ocupada', Icon: Utensils },\n bill_requested: { label: 'Conta pedida', Icon: Receipt },\n attention: { label: 'Atenção', Icon: AlertTriangle },\n}\n\n/** Colour never carries the meaning alone: icon and word ride along. */\nexport function StatusBadge({ status }: { status: PosPositionStatus }) {\n const { label, Icon } = STATUS[status]\n return (\n <span className=\"pos-badge\" data-status={status}>\n <Icon size={12} strokeWidth={2.4} aria-hidden />\n {label}\n </span>\n )\n}\n\nexport function elapsed(openedAt?: string, now = Date.now()): string | undefined {\n if (!openedAt) return undefined\n const minutes = Math.floor((now - new Date(openedAt).getTime()) / 60000)\n if (minutes < 0 || !Number.isFinite(minutes)) return undefined\n return minutes < 60 ? `${minutes}min` : `${Math.floor(minutes / 60)}h${String(minutes % 60).padStart(2, '0')}`\n}\n\n/**\n * O esqueleto do que está vindo, não um spinner.\n *\n * Um spinner diz \"espere\" e não diz o quê; o esqueleto já desenha a grade que\n * vai aparecer, então a tela não SALTA quando o dado chega — e num PDV que\n * abre com a mão indo para a primeira mesa, o salto é o que faz errar o alvo.\n * `aria-busy` no contêiner conta a mesma coisa para quem não vê o desenho.\n */\nexport function FloorSkeleton({ count = 8 }: { count?: number }) {\n return (\n <div className=\"pos-floor pos-scroll\" aria-busy=\"true\" aria-label=\"Carregando as mesas\">\n {Array.from({ length: count }, (_, i) => (\n <div key={i} className=\"pos-tbl pos-skel\" aria-hidden>\n <span className=\"pos-skel__b\" style={{ width: '46%', height: 21 }} />\n <span className=\"pos-skel__b\" style={{ width: '58%', height: 22 }} />\n <span className=\"pos-skel__b\" style={{ width: '34%', height: 12, marginTop: 'auto' }} />\n </div>\n ))}\n </div>\n )\n}\n\nexport function CatalogSkeleton({ categories = 6, items = 6 }: { categories?: number; items?: number }) {\n return (\n <div className=\"pos-scroll\" style={{ flex: 1, minHeight: 0 }} aria-busy=\"true\" aria-label=\"Carregando o cardápio\">\n <div className=\"pos-cats\">\n {Array.from({ length: categories }, (_, i) => (\n <div key={i} className=\"pos-cat pos-skel\" aria-hidden>\n <span className=\"pos-skel__b\" style={{ width: '70%', height: 13 }} />\n </div>\n ))}\n </div>\n <div className=\"pos-items\">\n {Array.from({ length: items }, (_, i) => (\n <div key={i} className=\"pos-item pos-skel\" aria-hidden>\n <span className=\"pos-item__top\">\n <span className=\"pos-skel__b\" style={{ width: 52, height: 52, flex: 'none' }} />\n <span className=\"pos-item__id\">\n <span className=\"pos-skel__b\" style={{ width: '80%', height: 14 }} />\n <span className=\"pos-skel__b\" style={{ width: '45%', height: 12 }} />\n </span>\n </span>\n <span className=\"pos-skel__b\" style={{ width: '100%', height: 34, marginTop: 'auto' }} />\n </div>\n ))}\n </div>\n </div>\n )\n}\n\nexport function EmptyState({ title, hint, Icon = Search, action }: {\n title: string\n hint?: string\n Icon?: typeof Search\n /** An empty state that only apologises wastes the space it takes. */\n action?: { label: string; onClick: () => void }\n}) {\n return (\n <div className=\"pos-empty\">\n <span className=\"pos-empty__icon\"><Icon size={20} strokeWidth={2} aria-hidden /></span>\n <span className=\"pos-empty__t\">{title}</span>\n {hint && <span className=\"pos-empty__s\">{hint}</span>}\n {action && (\n <button className=\"pos-empty__b\" onClick={() => { haptic('tap'); action.onClick() }}>\n {action.label}\n </button>\n )}\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Floor — two layouts, because two kinds of room exist.\n// ---------------------------------------------------------------------------\n\nexport function FloorView({ positions, config, activeId, onSelect, now, picking, layout }: {\n positions: PosPosition[]\n config: PosPositionConfig\n activeId?: string\n onSelect: (p: PosPosition) => void\n now: number\n /** A party is waiting: only the free tables are answers to the question. */\n picking?: boolean\n /**\n * Qual das duas formas de ver o salão. Escolha de QUEM OLHA, não do cadastro.\n *\n * A planta responde \"onde fica a mesa 6\" e a grade responde \"o que está\n * acontecendo nas minhas mesas\" — a segunda é a pergunta do turno, e a que\n * cabe num telefone: cartão com número, status, quem atende, há quanto tempo\n * e quanto já consumiu, tudo legível sem beliscar para dar zoom. Por isso a\n * grade é o padrão, e a planta é para quando a dúvida é geográfica.\n */\n layout?: 'grid' | 'plan'\n}) {\n if (positions.length === 0) {\n return <EmptyState title=\"Nenhuma mesa nesta área\" hint=\"Escolha outra área acima.\" Icon={Utensils} />\n }\n return layout === 'plan'\n ? <PlanFloor positions={positions} config={config} activeId={activeId} onSelect={onSelect} picking={picking} />\n : <GridFloor positions={positions} activeId={activeId} onSelect={onSelect} now={now} picking={picking} />\n}\n\nfunction GridFloor({ positions, activeId, onSelect, now, picking }: {\n positions: PosPosition[]; activeId?: string; onSelect: (p: PosPosition) => void\n now: number; picking?: boolean\n}) {\n return (\n <div className=\"pos-floor pos-scroll\" data-picking={picking}>\n {positions.map((p, index) => {\n const since = elapsed(p.openedAt, now)\n return (\n <button\n key={p.id}\n className=\"pos-tbl\"\n data-status={p.status}\n data-target={picking ? p.status === 'free' : undefined}\n aria-current={p.id === activeId}\n aria-disabled={picking && p.status !== 'free'}\n style={{ ['--pos-stagger' as string]: `${Math.min(index, 11) * 20}ms` }}\n onClick={() => { haptic('tap'); onSelect(p) }}\n >\n <span className=\"pos-tbl__top\">\n <span className=\"pos-tbl__no\">{p.label}</span>\n {p.seats != null && (\n <span className=\"pos-tbl__seats\">\n <Users size={12} strokeWidth={2.2} aria-hidden />\n {p.seats}\n </span>\n )}\n </span>\n <StatusBadge status={p.status} />\n {p.attendantName && <span className=\"pos-tbl__who\">{p.attendantName}</span>}\n <span className=\"pos-tbl__foot\">\n <span className=\"pos-tbl__time pos-num\">\n {since ? <><Clock size={12} strokeWidth={2.2} aria-hidden />{since}</> : '—'}\n </span>\n {p.totalCents != null && (\n <span className=\"pos-tbl__total pos-num\">{formatCents(p.totalCents)}</span>\n )}\n </span>\n </button>\n )\n })}\n </div>\n )\n}\n\nconst CELL = 44\n\nfunction PlanFloor({ positions, config, activeId, onSelect, picking }: {\n positions: PosPosition[]; config: PosPositionConfig; activeId?: string\n onSelect: (p: PosPosition) => void; picking?: boolean\n}) {\n // Size to the room that exists. A declared grid leaves a field of empty\n // cells below the last table, which reads as \"the plan is unfinished\".\n const cols = Math.max(...positions.map((p) => (p.x ?? 1) + (p.w ?? 2) - 1), 4) + 1\n const rows = Math.max(...positions.map((p) => (p.y ?? 1) + (p.h ?? 2) - 1), 4) + 1\n return (\n <div\n className=\"pos-plan pos-scroll\"\n data-picking={picking}\n style={{ ['--pos-plan-cell' as string]: `${CELL}px` }}\n >\n <div className=\"pos-plan__canvas\" style={{ width: cols * CELL, height: rows * CELL }}>\n {positions.map((p) => {\n const w = p.w ?? 2\n const h = p.h ?? 2\n const left = ((p.x ?? 1) - 1) * CELL\n const top = ((p.y ?? 1) - 1) * CELL\n return (\n <PlanTable\n key={p.id}\n position={p}\n left={left} top={top}\n width={w * CELL - 8} height={h * CELL - 8}\n active={p.id === activeId}\n onSelect={onSelect}\n picking={picking}\n />\n )\n })}\n </div>\n <div className=\"pos-plan__legend\">\n {(Object.keys(STATUS) as PosPositionStatus[]).map((s) => (\n <span key={s} className=\"pos-legend__k\">\n <span className=\"pos-legend__sw\" style={{ background: `var(--pos-${\n { free: 'line-strong', occupied: 'warn', bill_requested: 'info', attention: 'danger' }[s]\n })` }} />\n {STATUS[s].label}\n </span>\n ))}\n </div>\n </div>\n )\n}\n\nfunction PlanTable({ position, left, top, width, height, active, onSelect, picking }: {\n position: PosPosition\n left: number; top: number; width: number; height: number\n active: boolean\n onSelect: (p: PosPosition) => void\n picking?: boolean\n}) {\n const seats = position.seats ?? 0\n return (\n <>\n {seatOffsets(seats, width, height).map((s, i) => (\n <span\n key={i}\n className=\"pos-seat\"\n style={{ left: left + 4 + s.x, top: top + 4 + s.y }}\n aria-hidden\n />\n ))}\n <button\n className=\"pos-pt\"\n data-status={position.status}\n data-shape={position.shape ?? 'square'}\n data-target={picking ? position.status === 'free' : undefined}\n aria-disabled={picking && position.status !== 'free'}\n aria-current={active}\n onClick={() => onSelect(position)}\n style={{ left: left + 4, top: top + 4, width, height }}\n title={`${position.label} · ${STATUS[position.status].label}`}\n >\n {position.itemCount != null && position.itemCount > 0 && (\n <span className=\"pos-pt__badge pos-num\">+{position.itemCount}</span>\n )}\n <span className=\"pos-pt__no\">{position.label.replace(/^Mesa\\s*/i, '')}</span>\n {position.attendantName && (\n <span\n className=\"pos-pt__chip\"\n style={{ background: `var(--pos-tone-${position.attendantTone ?? 'mint'})` }}\n >\n {initialsOf(position.attendantName)}\n </span>\n )}\n </button>\n </>\n )\n}\n\n/** Two letters is what fits on a table at plan scale, and it is what a floor\n * manager already reads on a printed roster. */\nexport function initialsOf(name: string): string {\n const parts = name.trim().split(/\\s+/)\n if (parts.length === 1) return parts[0]!.slice(0, 2).toUpperCase()\n return (parts[0]![0]! + parts[parts.length - 1]![0]!).toUpperCase()\n}\n\n/** Seats spread around the table's perimeter: top and bottom first, then sides. */\nfunction seatOffsets(seats: number, w: number, h: number): { x: number; y: number }[] {\n if (seats <= 0) return []\n const out: { x: number; y: number }[] = []\n const perSide = Math.ceil(seats / 4)\n const place = (n: number, fn: (i: number) => { x: number; y: number }) => {\n for (let i = 0; i < n && out.length < seats; i++) out.push(fn(i))\n }\n const step = (count: number, span: number, i: number) => ((i + 1) * span) / (count + 1) - 6\n place(perSide, (i) => ({ x: step(perSide, w, i), y: -17 }))\n place(perSide, (i) => ({ x: step(perSide, w, i), y: h + 4 }))\n place(perSide, (i) => ({ x: -17, y: step(perSide, h, i) }))\n place(perSide, (i) => ({ x: w + 4, y: step(perSide, h, i) }))\n return out\n}\n\n// ---------------------------------------------------------------------------\n// Catalogue — the stepper lives on the card, so adding to the open table never\n// requires leaving the grid.\n// ---------------------------------------------------------------------------\n\nexport function CatalogView({\n categories, items, activeCategoryId, onCategoryChange, quantities, onAdd, onRemove, query,\n}: {\n categories: PosCategory[]\n items: PosItem[]\n activeCategoryId?: string\n onCategoryChange: (id: string) => void\n quantities: Record<string, number>\n onAdd: (item: PosItem) => void\n onRemove: (item: PosItem) => void\n query: string\n}) {\n const normalised = query.trim().toLowerCase()\n const searching = normalised.length > 0\n const shown = items.filter((i) =>\n searching\n ? i.name.toLowerCase().includes(normalised) || i.code?.toLowerCase() === normalised\n : !activeCategoryId || i.categoryId === activeCategoryId,\n )\n\n return (\n <div className=\"pos-scroll\" style={{ flex: 1, minHeight: 0, display: 'flex', flexDirection: 'column' }}>\n {!searching && (\n <div className=\"pos-cats\">\n {categories.map((c, index) => (\n <button\n key={c.id}\n className=\"pos-cat\"\n style={{\n background: `var(--pos-tone-${c.tone})`,\n ['--pos-stagger' as string]: `${Math.min(index, 11) * 20}ms`,\n }}\n aria-pressed={c.id === activeCategoryId}\n onClick={() => { haptic('tap'); onCategoryChange(c.id) }}\n >\n <span>\n <span className=\"pos-cat__name\">{c.label}</span>\n {c.itemCount != null && (\n <span className=\"pos-cat__n pos-num\" style={{ display: 'block' }}>{c.itemCount} itens</span>\n )}\n </span>\n {c.icon && <span className=\"pos-cat__icon\">{c.icon}</span>}\n </button>\n ))}\n </div>\n )}\n\n {!searching && <hr className=\"pos-cats-rule\" />}\n\n {shown.length === 0 ? (\n <EmptyState title={`Nada encontrado para “${query}”`} hint=\"Tente o código do item ou parte do nome.\" />\n ) : (\n <div className=\"pos-items\">\n {shown.map((item, index) => {\n const quantity = quantities[item.id] ?? 0\n const category = categories.find((c) => c.id === item.categoryId)\n const filled = quantity > 0 && category != null\n return (\n <ItemCard\n key={item.id}\n quantity={quantity}\n filled={filled}\n onQuickAdd={() => { haptic('tap'); onAdd(item) }}\n label={item.name}\n // Capped so a 200-item category does not deal cards for four\n // seconds; past the twelfth the stagger has made its point.\n delayMs={Math.min(index, 11) * 24}\n tone={category?.tone}\n >\n {/* Miniatura à ESQUERDA do nome, como no V1 — e não uma faixa\n no topo do cartão. Numa grade de duas colunas a faixa comia\n metade da altura de cada cartão e empurrava o passo-a-passo\n para fora da dobra; ao lado do nome ela é reconhecimento\n barato e o cartão segue com a altura de uma linha de menu.\n `alt` vazio de propósito: o nome vem logo ao lado, e um\n leitor de tela que o diga duas vezes transforma uma grade de\n 40 itens em 80 anúncios. */}\n <span className=\"pos-item__top\">\n {item.imageUrl ? (\n <span className=\"pos-item__img\">\n <img src={item.imageUrl} alt=\"\" loading=\"lazy\" decoding=\"async\" />\n </span>\n ) : null}\n <span className=\"pos-item__id\">\n {item.route && <span className=\"pos-item__route\">{item.route}</span>}\n <span className=\"pos-item__name\">{item.name}</span>\n <span className=\"pos-item__price pos-num\">\n {formatCents(item.priceCents)}\n {item.code && ` · ${item.code}`}\n </span>\n </span>\n </span>\n <span className=\"pos-item__foot\" onClick={(e) => e.stopPropagation()}>\n <span className=\"pos-step\">\n <button\n className=\"pos-step__b\"\n onClick={() => { haptic('tap'); onRemove(item) }}\n disabled={quantity === 0}\n aria-label={`Tirar um ${item.name}`}\n >\n <Minus size={16} strokeWidth={2.6} aria-hidden />\n </button>\n <span className=\"pos-step__n\">{quantity}</span>\n <button\n className=\"pos-step__b\"\n onClick={() => { haptic('tap'); onAdd(item) }}\n aria-label={`Mais um ${item.name}`}\n >\n <Plus size={16} strokeWidth={2.6} aria-hidden />\n </button>\n </span>\n </span>\n </ItemCard>\n )\n })}\n </div>\n )}\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n\nexport function ListView({ positions, activeId, onSelect, now, emptyLabel }: {\n positions: PosPosition[]\n activeId?: string\n onSelect: (p: PosPosition) => void\n now: number\n emptyLabel: string\n}) {\n if (positions.length === 0) return <EmptyState title={emptyLabel} Icon={Receipt} />\n return (\n <div className=\"pos-list pos-scroll\">\n {positions.map((p) => (\n <button\n key={p.id}\n className=\"pos-lrow\"\n aria-current={p.id === activeId}\n onClick={() => onSelect(p)}\n >\n <span className=\"pos-lrow__av pos-num\">\n {p.label.replace(/\\D/g, '').slice(-3) || p.label.slice(0, 2)}\n </span>\n <span>\n <span className=\"pos-lrow__t\">{p.label}</span>\n <span className=\"pos-lrow__s\">\n {p.attendantName ?? '—'}\n {elapsed(p.openedAt, now) && ` · ${elapsed(p.openedAt, now)}`}\n {p.itemCount != null && ` · ${p.itemCount} itens`}\n </span>\n </span>\n <span className=\"pos-lrow__e\">\n <StatusBadge status={p.status} />\n {p.totalCents != null && (\n <span className=\"pos-num\" style={{ fontWeight: 650 }}>{formatCents(p.totalCents)}</span>\n )}\n </span>\n </button>\n ))}\n </div>\n )\n}\n\n// ---------------------------------------------------------------------------\n\nexport function ShiftView({ positions, staff }: { positions: PosPosition[]; staff: PosStaff[] }) {\n const open = positions.filter((p) => p.status !== 'free')\n const onFloor = open.reduce((sum, p) => sum + (p.totalCents ?? 0), 0)\n return (\n <div className=\"pos-scroll\" style={{ flex: 1, padding: 'var(--pos-4x)', display: 'grid', gap: 'var(--pos-3x)', alignContent: 'start' }}>\n <div style={{ display: 'grid', gridTemplateColumns: 'repeat(auto-fit, minmax(200px, 1fr))', gap: 'var(--pos-3x)' }}>\n <Stat label=\"Em aberto no salão\" value={formatCents(onFloor)} />\n <Stat label=\"Comandas abertas\" value={String(open.length)} />\n <Stat label=\"Pessoas no turno\" value={String(staff.length)} />\n </div>\n <p className=\"pos-t-sm\" style={{ margin: 0 }}>\n Abertura de caixa, sangria e fechamento chegam no M5 — este painel é o lugar deles.\n </p>\n </div>\n )\n}\n\nfunction Stat({ label, value }: { label: string; value: string }) {\n return (\n <div style={{\n border: '1px solid var(--pos-line)', borderRadius: 'var(--pos-r)',\n background: 'var(--pos-2)', padding: 'var(--pos-4x)',\n }}>\n <div className=\"pos-t-xs\" style={{ marginBottom: 4 }}>{label}</div>\n <div className=\"pos-t-display pos-num\">{value}</div>\n </div>\n )\n}\n\n/**\n * A catalogue card. It owns its own \"something changed\" pop, because the alt\n * — animating from the parent — would replay on every card whenever any one\n * of them changed.\n */\nfunction ItemCard({ quantity, filled, delayMs, tone, onQuickAdd, label, children }: {\n quantity: number\n filled: boolean\n delayMs: number\n tone?: PosTone\n /** Tapping the card rings one. The stepper stays for taking one back and for\n * anyone who wants the explicit control. */\n onQuickAdd: () => void\n label: string\n children: React.ReactNode\n}) {\n return (\n <div\n className=\"pos-item\"\n role=\"button\"\n tabIndex={0}\n // The card and its plus button had the same accessible name, so a screen\n // reader announced two identical controls with no way to tell them apart.\n aria-label={`${label}, adicionar à comanda`}\n data-filled={filled}\n onClick={onQuickAdd}\n onKeyDown={(e) => { if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); onQuickAdd() } }}\n style={{\n ['--pos-stagger' as string]: `${delayMs}ms`,\n ...(tone ? { ['--pos-item-tone' as string]: `var(--pos-tone-${tone})` } : {}),\n ...(filled && tone ? { background: `var(--pos-tone-${tone})` } : {}),\n }}\n >\n {children}\n </div>\n )\n}\n","// ---------------------------------------------------------------------------\n// The right rail: the order and the table it belongs to.\n//\n// Permanent, and tabbed. Everything the panel could show does not fit above a\n// closing total on a 13\" till — and what got squeezed was the item list, which\n// is the one thing the operator is actually reading. So the list owns the\n// height, and the clock, the table meta and the standing request move behind\n// \"Atividade\", one tap away and out of the way.\n// ---------------------------------------------------------------------------\n\nimport {\n Banknote, Clock, CookingPot, CreditCard,\n AlertTriangle, ChefHat, ChevronDown, ChevronLeft, Minus, Pencil, Phone, Plus, QrCode, Receipt,\n Trash2, UtensilsCrossed,\n} from 'lucide-react'\nimport { useRef, useState } from 'react'\nimport { haptic } from '../lib/haptics'\nimport { useSwipeAway } from '../lib/useSwipeAway'\nimport type { PosPaymentMethod, PosPositionStatus, PosVocabulary } from '../app/config'\nimport { formatCents, splitEvenly } from './money'\nimport type { LineState, Ticket, TicketLine, TicketTotals } from './session'\nimport { EmptyState, StatusBadge } from './views'\n\n/** How much room the details column is taking. It is never fully dismissed. */\n\nconst PAY_ICON: Record<string, typeof Banknote> = {\n cash: Banknote, dinheiro: Banknote,\n card: CreditCard, cartao: CreditCard, 'cartão': CreditCard,\n pix: QrCode,\n}\n\n/**\n * Arrastar a folha para baixo para minimizá-la.\n *\n * Solta acima de um terço da altura, ela volta; abaixo, fecha. O limiar é\n * distância e não velocidade porque um caixa arrasta devagar, com o polegar\n * apoiado — um \"flick\" medido por velocidade quase nunca dispara nessa mão.\n * Só para baixo: puxar para cima não tem para onde ir e a folha elástica lendo\n * como travada é pior que não responder.\n */\nfunction useSheetDrag(onDismiss?: () => void) {\n const [offset, setOffset] = useState(0)\n const [dragging, setDragging] = useState(false)\n const startRef = useRef(0)\n\n if (!onDismiss) return { offset: 0, dragging: false, handlers: {} }\n\n return {\n offset,\n dragging,\n handlers: {\n onPointerDown: (e: React.PointerEvent) => {\n startRef.current = e.clientY\n setDragging(true)\n ;(e.currentTarget as HTMLElement).setPointerCapture(e.pointerId)\n },\n onPointerMove: (e: React.PointerEvent) => {\n if (!dragging) return\n setOffset(Math.max(0, e.clientY - startRef.current))\n },\n onPointerUp: (e: React.PointerEvent) => {\n setDragging(false)\n const el = (e.currentTarget as HTMLElement).closest('.pos-aside')\n const height = el?.getBoundingClientRect().height ?? window.innerHeight\n if (offset > height / 3) onDismiss()\n setOffset(0)\n },\n },\n }\n}\n\nexport function TicketRail({\n onCollapse,\n ticket, totals, vocabulary, paymentMethods, selectedPaymentId, onSelectPayment,\n onChangeQuantity, selectedLineId, onSelectLine, onClose, closeShortcut,\n guests, status, open, zoneLabel, request, now = Date.now(),\n containerRef, onBrowseCatalog, onEditLine, onEditIdentity, alias, customerPhone,\n onFire, fireShortcut,\n}: {\n ticket: Ticket\n totals: TicketTotals\n vocabulary: PosVocabulary\n paymentMethods: PosPaymentMethod[]\n selectedPaymentId?: string\n onSelectPayment: (id: string) => void\n onChangeQuantity: (lineId: string, delta: number) => void\n selectedLineId?: string\n onSelectLine: (lineId: string) => void\n onClose: () => void\n closeShortcut?: string\n guests?: number\n status?: PosPositionStatus\n zoneLabel?: string\n request?: string\n now?: number\n /** Small screens slide this rail in; wide ones ignore it. */\n open?: boolean\n /**\n * Fecha a comanda no celular, onde ela ocupa a tela INTEIRA.\n *\n * Numa coluna ao lado do catálogo não há o que fechar — a comanda está\n * sempre à vista. Em tela cheia ela cobre o cardápio, e sem esta seta o\n * único caminho de volta seria o botão do sistema, que sai do app.\n */\n onCollapse?: () => void\n /** Lets the screen scope arrow navigation to this column. */\n containerRef?: React.Ref<HTMLDivElement>\n /** An empty ticket's only useful action is going where the items are. */\n onBrowseCatalog?: () => void\n /** Reopens a line for its options and note. */\n onEditLine?: (lineId: string) => void\n /** Names the ticket and takes the customer's phone. */\n onEditIdentity?: () => void\n alias?: string\n customerPhone?: string\n /** Sends the pending lines to the kitchen. */\n onFire?: () => void\n fireShortcut?: string\n}) {\n const drag = useSheetDrag(onCollapse)\n const [tab, setTab] = useState<'order' | 'activity'>('order')\n const [paid, setPaid] = useState(false)\n /**\n * Payment is a STEP, not furniture. Three payment tiles sitting under every\n * order the whole shift are three controls the operator has to ignore\n * hundreds of times a night, and they push the item list up while doing it.\n */\n const [stage, setStage] = useState<'order' | 'checkout'>('order')\n const empty = ticket.lines.length === 0\n const count = ticket.lines.reduce((n, l) => n + l.quantity, 0)\n const pendingCount = ticket.lines\n .filter((l) => (l.state ?? 'pending') === 'pending')\n .reduce((n, l) => n + l.quantity, 0)\n // Leaving the table drops any half-finished checkout: coming back to a\n // different table with the previous one's payment armed is how the wrong\n // bill gets closed.\n const ticketId = ticket.id\n if (stage === 'checkout' && empty) setStage('order')\n\n const firedAt = ticket.lines\n .map((l) => l.firedAt)\n .filter((v): v is string => Boolean(v))\n .sort()[0]\n\n return (\n <aside\n className=\"pos-aside\"\n ref={containerRef as React.Ref<HTMLElement>}\n data-open={open ?? true}\n data-dragging={drag.dragging || undefined}\n style={drag.offset ? { transform: `translateY(${drag.offset}px)` } : undefined}\n aria-label={vocabulary.ticket}\n >\n {/* A alça só existe onde a comanda é uma folha (celular). Numa coluna\n fixa não há o que arrastar, e a CSS a esconde por lá. */}\n {onCollapse && (\n <div\n className=\"pos-aside__grab\"\n role=\"button\"\n tabIndex={0}\n aria-label=\"Arraste para baixo para minimizar a comanda\"\n onKeyDown={(e) => { if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); onCollapse() } }}\n {...drag.handlers}\n />\n )}\n <header className=\"pos-tkt\">\n <div className=\"pos-tkt__row\">\n {/* The position stays the headline: at the pass people call the\n table, and a name replacing it makes the ticket unfindable on the\n floor. The name goes underneath, where it identifies without\n displacing. */}\n <span className=\"pos-t-xl\">{ticket.positionLabel ?? 'Balcão'}</span>\n {status && <StatusBadge status={status} />}\n {onCollapse && (\n <button\n className=\"pos-tkt__collapse\"\n onClick={onCollapse}\n aria-label=\"Fechar a comanda\"\n title=\"Fechar a comanda\"\n >\n <ChevronDown size={18} strokeWidth={2.4} />\n </button>\n )}\n {onEditIdentity && (\n <button\n className=\"pos-tkt__edit\"\n onClick={onEditIdentity}\n aria-label=\"Nomear a comanda ou anotar o celular\"\n title=\"Nomear a comanda ou anotar o celular\"\n >\n <Pencil size={14} strokeWidth={2.2} />\n </button>\n )}\n </div>\n {/* One line instead of a three-column grid: the same facts, a third of\n the height, and the item list gets what it saves. */}\n {/* One line, whatever it holds. A third line for the alias overflowed\n the header band and pushed the tabs into it; the name keeps its\n weight here without keeping its own row. */}\n <div className=\"pos-tkt__sub\">\n {alias && <strong className=\"pos-tkt__alias\">{alias}</strong>}\n <span className=\"pos-tkt__meta\">\n {[\n ticket.attendantName,\n guests != null && `${guests} pessoas`,\n sinceLabel(ticket.seatedAt, now),\n customerPhone,\n ].filter(Boolean).join(' · ') || `Sem ${vocabulary.position} selecionada`}\n </span>\n </div>\n </header>\n\n <div className=\"pos-tabs\" role=\"tablist\">\n <button\n className=\"pos-tab\" role=\"tab\" aria-selected={tab === 'order'}\n onClick={() => setTab('order')}\n >\n Pedido{count > 0 && <span className=\"pos-tab__n pos-num\">{count}</span>}\n </button>\n <button\n className=\"pos-tab\" role=\"tab\" aria-selected={tab === 'activity'}\n onClick={() => setTab('activity')}\n >\n Atividade\n {pendingCount > 0 && <span className=\"pos-tab__dot\" aria-label={`${pendingCount} não lançados`} />}\n </button>\n </div>\n\n <div className=\"pos-scroll\" style={{ flex: 1, minHeight: 0 }} role=\"tabpanel\">\n {tab === 'order' ? (\n empty ? (\n <EmptyState\n title={`${vocabulary.ticket} vazia`}\n hint=\"Digite o código do item e Enter, ou escolha no cardápio.\"\n Icon={Receipt}\n action={onBrowseCatalog && { label: 'Ver cardápio', onClick: onBrowseCatalog }}\n />\n ) : (\n ticket.lines.map((line) => (\n <TicketLineRow\n key={line.id}\n line={line}\n selected={line.id === selectedLineId}\n onSelect={() => { onSelectLine(line.id); onEditLine?.(line.id) }}\n onChangeQuantity={(delta) => onChangeQuantity(line.id, delta)}\n onRemove={() => onChangeQuantity(line.id, -line.quantity)}\n />\n ))\n )\n ) : (\n <ActivityPanel\n ticket={ticket}\n firedAt={firedAt}\n pendingCount={pendingCount}\n guests={guests}\n zoneLabel={zoneLabel}\n request={request}\n totals={totals}\n count={count}\n now={now}\n />\n )}\n </div>\n\n <div className=\"pos-tot\">\n <div className=\"pos-tot__r\">\n <span>Subtotal</span><span className=\"pos-num\">{formatCents(totals.subtotalCents)}</span>\n </div>\n {totals.serviceCents > 0 && (\n <div className=\"pos-tot__r\">\n <span>Serviço 10%</span><span className=\"pos-num\">{formatCents(totals.serviceCents)}</span>\n </div>\n )}\n {totals.discountCents > 0 && (\n <div className=\"pos-tot__r\">\n <span>Desconto</span><span className=\"pos-num\">− {formatCents(totals.discountCents)}</span>\n </div>\n )}\n <div className=\"pos-tot__g\">\n <span className=\"pos-t-md\">Total</span>\n <strong className=\"pos-t-display pos-num\">{formatCents(totals.totalCents)}</strong>\n </div>\n </div>\n\n {stage === 'order' ? (\n /* The primary action is whatever comes NEXT, not always the last step.\n With items still on the counter, \"fechar conta\" is the wrong verb —\n and offering it as the big button is how a bill gets paid for food\n the kitchen never heard about. */\n <div className=\"pos-cta pos-cta--stack\">\n {pendingCount > 0 ? (\n <>\n {/* O aviso saiu da própria faixa. Ele dizia, numa linha inteira,\n o mesmo número que o botão logo abaixo já carrega — e ocupava\n o espaço bem onde a comanda tem menos: acima do rodapé.\n\n Onde ele REALMENTE importa é no caminho que ele previne:\n fechar a conta com item que a cozinha não viu. Então virou a\n segunda linha desse botão, que é o único lugar em que a\n informação muda uma decisão. */}\n <button\n className=\"pos-btn\"\n onClick={() => { haptic('commit'); onFire?.() }}\n >\n <ChefHat size={19} strokeWidth={2.2} aria-hidden />\n Enviar à cozinha\n <span className=\"pos-num\">{pendingCount}</span>\n {fireShortcut && <kbd className=\"pos-kbd\">{fireShortcut}</kbd>}\n </button>\n <button\n className=\"pos-btn pos-btn--ghost pos-btn--wide pos-btn--warn\"\n onClick={() => setStage('checkout')}\n >\n <span className=\"pos-btn__l1\">Fechar mesmo assim · {formatCents(totals.totalCents)}</span>\n <span className=\"pos-btn__l2\">\n <AlertTriangle size={12} strokeWidth={2.4} aria-hidden />\n {pendingCount === 1\n ? '1 item não foi para a cozinha'\n : `${pendingCount} itens não foram para a cozinha`}\n </span>\n </button>\n </>\n ) : (\n <button\n className=\"pos-btn\"\n disabled={empty}\n onClick={() => { haptic('commit'); setStage('checkout') }}\n >\n Fechar conta\n {!empty && <span className=\"pos-num\">{formatCents(totals.totalCents)}</span>}\n {closeShortcut && <kbd className=\"pos-kbd\">{closeShortcut}</kbd>}\n </button>\n )}\n </div>\n ) : (\n <div className=\"pos-checkout\">\n {/* The whole row is the target. A 34px icon square is under the touch\n floor and asks a thumb to aim; on a tablet the back control is the\n one thing an operator reaches for in a hurry. */}\n <button\n className=\"pos-back\"\n onClick={() => { haptic('tap'); setStage('order') }}\n >\n <ChevronLeft size={20} strokeWidth={2.4} aria-hidden />\n Voltar à comanda\n </button>\n <div className=\"pos-checkout__head\">\n <span className=\"pos-t-xs\">Como vai pagar</span>\n </div>\n\n <div className=\"pos-pay\" role=\"radiogroup\" aria-label=\"Forma de pagamento\">\n {paymentMethods.map((m) => {\n const Icon = PAY_ICON[m.id.toLowerCase()] ?? Banknote\n return (\n <button\n key={m.id}\n className=\"pos-pay__b\"\n role=\"radio\"\n aria-checked={m.id === selectedPaymentId}\n onClick={() => { haptic('tap'); onSelectPayment(m.id) }}\n >\n <span><Icon size={18} strokeWidth={2} aria-hidden /></span>\n {m.label}\n </button>\n )\n })}\n </div>\n\n <div className=\"pos-cta\">\n <button\n className=\"pos-btn\"\n data-paid={paid}\n // Nothing is preselected, so this stays shut until the operator\n // says how the table paid. Guessing \"dinheiro\" is how a card sale\n // gets recorded as cash and the drawer stops matching.\n disabled={!selectedPaymentId}\n onClick={() => {\n haptic('commit')\n setPaid(true)\n window.setTimeout(() => { setPaid(false); setStage('order') }, 900)\n onClose()\n }}\n >\n {selectedPaymentId\n ? <>Confirmar <span className=\"pos-num\">{formatCents(totals.totalCents)}</span></>\n : 'Escolha a forma de pagamento'}\n </button>\n </div>\n </div>\n )}\n\n </aside>\n )\n}\n\n/**\n * The table's history, as a history.\n *\n * The previous version stacked two saturated slabs and a six-cell grid that\n * repeated the header three times over — pessoas, tempo and item count were\n * already on screen twice before this panel drew them again. What survives is\n * what the header does NOT say: when things happened, in order, and the one\n * number a split actually needs.\n */\nfunction ActivityPanel({\n ticket, firedAt, pendingCount, guests, zoneLabel, request, totals, count, now,\n}: {\n ticket: Ticket\n firedAt?: string\n pendingCount: number\n guests?: number\n zoneLabel?: string\n request?: string\n totals: TicketTotals\n count: number\n now: number\n}) {\n // One event per thing that happened, oldest first — including each fire, so\n // \"the starters went at 14:22 and the mains at 14:51\" is readable instead of\n // inferred.\n const fires = new Map<string, string[]>()\n for (const line of ticket.lines) {\n if (!line.firedAt) continue\n fires.set(line.firedAt, [...(fires.get(line.firedAt) ?? []), line.name])\n }\n\n const events: { at?: string; title: string; detail?: string; done: boolean }[] = []\n if (ticket.seatedAt) {\n events.push({\n at: ticket.seatedAt,\n title: 'Sentou',\n detail: guests ? `${guests} pessoas` : undefined,\n done: true,\n })\n }\n for (const [at, names] of [...fires.entries()].sort()) {\n events.push({\n at,\n title: 'Enviado à cozinha',\n detail: names.join(', '),\n done: true,\n })\n }\n if (pendingCount > 0) {\n events.push({\n title: 'Aguardando envio',\n detail: `${pendingCount} ${pendingCount === 1 ? 'item' : 'itens'} ainda no balcão`,\n done: false,\n })\n }\n\n return (\n <div className=\"pos-activity\">\n <ol className=\"pos-tl\">\n {events.map((e, i) => (\n <li key={i} className=\"pos-ev\" data-done={e.done}>\n <span className=\"pos-ev__mark\" aria-hidden />\n <span className=\"pos-ev__body\">\n <span className=\"pos-ev__row\">\n <span className=\"pos-ev__t\">{e.title}</span>\n {e.at && <span className=\"pos-ev__at pos-num\">{clock(e.at)}</span>}\n </span>\n {e.detail && <span className=\"pos-ev__d\">{e.detail}</span>}\n </span>\n </li>\n ))}\n {events.length === 0 && <li className=\"pos-ev__none\">Nada aconteceu ainda.</li>}\n </ol>\n\n {request && (\n <div className=\"pos-note-block\">\n <div className=\"pos-t-xs\">Observação da mesa</div>\n <p className=\"pos-note-block__t\">“{request}”</p>\n </div>\n )}\n\n {/* Only the numbers the header does not already carry. \"Média por item\"\n was here and nobody at a counter has ever needed it. */}\n <dl className=\"pos-dl\">\n <div>\n <dt className=\"pos-t-xs\">Área</dt>\n <dd>{zoneLabel ?? '—'}</dd>\n </div>\n <div>\n <dt className=\"pos-t-xs\">Por pessoa</dt>\n <dd className=\"pos-num\">\n {guests && guests > 0 ? formatCents(splitEvenly(totals.totalCents, guests)[0] ?? 0) : '—'}\n </dd>\n </div>\n </dl>\n </div>\n )\n}\n\nconst STATE_LABEL: Record<LineState, string> = {\n pending: 'Ainda não lançado',\n fired: 'Na cozinha',\n delivered: 'Entregue',\n}\n\nfunction StateIcon({ state }: { state: LineState }) {\n if (state === 'fired') return <CookingPot size={15} strokeWidth={2.2} aria-hidden />\n if (state === 'delivered') return <UtensilsCrossed size={15} strokeWidth={2.2} aria-hidden />\n // Pendente não ganha desenho: era um anel PONTILHADO dentro de uma bolha\n // âmbar preenchida — duas bordas concêntricas a 3px uma da outra, que de\n // perto lê como ruído e de longe como um borrão. A marca aqui não precisa\n // dizer o que a linha É (a cozinha ainda não viu), só que ela está de pé:\n // um ponto sólido basta, e o `::before` do CSS o desenha.\n return null\n}\n\nfunction clock(iso: string): string {\n return new Date(iso).toLocaleTimeString('pt-BR', { hour: '2-digit', minute: '2-digit' })\n}\n\nfunction sinceLabel(iso: string | undefined, now: number): string {\n if (!iso) return '—'\n const minutes = Math.floor((now - new Date(iso).getTime()) / 60000)\n if (!Number.isFinite(minutes) || minutes < 0) return '—'\n return minutes < 60 ? `${minutes}min` : `${Math.floor(minutes / 60)}h${String(minutes % 60).padStart(2, '0')}`\n}\n\n/** One row, with its own gesture. Lifting this out is what lets each line hold\n * swipe state without the whole rail re-rendering on every pointer move. */\nfunction TicketLineRow({ line, selected, onSelect, onChangeQuantity, onRemove }: {\n line: TicketLine\n selected: boolean\n onSelect: () => void\n onChangeQuantity: (delta: number) => void\n onRemove: () => void\n}) {\n const swipe = useSwipeAway(onRemove)\n const state = line.state ?? 'pending'\n\n return (\n <div className=\"pos-ln-wrap\" data-open={swipe.open} data-swiping={swipe.offset !== 0}>\n {/* Revealed, then tappable. The gesture parks here; only pushing further\n (or pressing this) actually removes. */}\n <button\n className=\"pos-swipe-bg\"\n tabIndex={swipe.open ? 0 : -1}\n aria-hidden={!swipe.open}\n onClick={swipe.remove}\n >\n <Trash2 size={18} strokeWidth={2.3} aria-hidden />\n Remover\n </button>\n <div\n className=\"pos-ln\"\n data-state={state}\n data-removing={swipe.removing}\n data-swiping={swipe.offset !== 0}\n style={{ transform: swipe.offset ? `translateX(${swipe.offset}px)` : undefined }}\n role=\"button\"\n tabIndex={0}\n aria-current={selected}\n onClick={() => (swipe.open ? swipe.close() : onSelect())}\n onKeyDown={(e) => { if (e.key === 'Enter' || e.key === ' ') onSelect() }}\n {...swipe.handlers}\n >\n <span className=\"pos-ln__state\" title={STATE_LABEL[state]}>\n <StateIcon state={state} />\n </span>\n <span>\n <span className=\"pos-ln__n\">{line.name}</span>\n {line.modifiers && line.modifiers.length > 0 && (\n <span className=\"pos-ln__mods\">\n {line.modifiers.map((m) => (\n <span key={`${m.groupId}:${m.optionId}`} className=\"pos-ln__mod\">\n {m.label}\n {m.priceDeltaCents !== 0 && (\n <span className=\"pos-num\">\n {' '}{m.priceDeltaCents > 0 ? '+' : '−'}{formatCents(Math.abs(m.priceDeltaCents))}\n </span>\n )}\n </span>\n ))}\n </span>\n )}\n {line.note && <span className=\"pos-ln__note\">“{line.note}”</span>}\n </span>\n <span className=\"pos-step\" onClick={(e) => e.stopPropagation()}>\n <button\n className=\"pos-step__b\"\n onClick={() => { haptic('tap'); onChangeQuantity(-1) }}\n aria-label={`Tirar um ${line.name}`}\n >\n <Minus size={14} strokeWidth={2.6} aria-hidden />\n </button>\n <span className=\"pos-step__n\">{line.quantity}</span>\n <button\n className=\"pos-step__b\"\n onClick={() => { haptic('tap'); onChangeQuantity(1) }}\n aria-label={`Adicionar ${line.name}`}\n >\n <Plus size={14} strokeWidth={2.6} aria-hidden />\n </button>\n </span>\n <span className=\"pos-ln__p pos-num\">\n {formatCents(line.unitPriceCents * line.quantity)}\n </span>\n </div>\n </div>\n )\n}\n","// ---------------------------------------------------------------------------\n// Delivery is dispatch, not a bill.\n//\n// The order arrives paid by the marketplace and already itemised. Nothing here\n// asks the operator to charge anyone; what it asks is the only question that\n// matters at the door: where is this order, and is it late.\n//\n// Columns instead of a list because the job is moving cards rightwards, and a\n// board makes \"four orders stuck in produção\" visible from across the counter\n// in a way a sorted list never does.\n// ---------------------------------------------------------------------------\n\nimport { useEffect, useRef, useState } from 'react'\nimport { AlertTriangle, Bike, ChefHat, CheckCheck, Clock, Package } from 'lucide-react'\nimport { haptic } from '../lib/haptics'\nimport type { DispatchStatus, PosPosition } from '../app/config'\nimport { formatCents } from './money'\nimport { EmptyState } from './views'\n\nconst COLUMNS: { id: DispatchStatus; label: string; Icon: typeof Clock }[] = [\n { id: 'received', label: 'Recebido', Icon: Package },\n { id: 'preparing', label: 'Em produção', Icon: ChefHat },\n { id: 'ready', label: 'Pronto', Icon: CheckCheck },\n { id: 'out', label: 'Saiu', Icon: Bike },\n]\n\n/** Late is measured against the promise, not against age: a 40-minute order\n * with an hour's promise is fine, and a 12-minute one promised in 10 is not. */\nfunction lateness(p: PosPosition, now: number): number | undefined {\n if (!p.dueAt) return undefined\n return Math.floor((now - new Date(p.dueAt).getTime()) / 60000)\n}\n\n/** How long a card lingers, fading, in the column it just left. */\nconst GHOST_MS = 300\n\nexport function DeliveryBoard({ orders, activeId, onSelect, now }: {\n orders: PosPosition[]\n activeId?: string\n onSelect: (p: PosPosition) => void\n now: number\n}) {\n // A card that changes column would otherwise blink out of one and into the\n // other, and the operator who tapped it never sees which one it left. The\n // ghost is that receipt: it fades where the card was while the real card\n // lands in the next column.\n const seen = useRef<Record<string, DispatchStatus>>({})\n const [ghosts, setGhosts] = useState<{ id: string; from: DispatchStatus; label: string }[]>([])\n\n useEffect(() => {\n const moved: { id: string; from: DispatchStatus; label: string }[] = []\n for (const o of orders) {\n const at = o.dispatch ?? 'received'\n const was = seen.current[o.id]\n if (was && was !== at) moved.push({ id: o.id, from: was, label: o.label })\n seen.current[o.id] = at\n }\n if (moved.length === 0) return\n setGhosts((g) => [...g, ...moved])\n const t = window.setTimeout(\n () => setGhosts((g) => g.filter((x) => !moved.some((m) => m.id === x.id))),\n GHOST_MS,\n )\n return () => window.clearTimeout(t)\n }, [orders])\n\n if (orders.length === 0) {\n return <EmptyState title=\"Nenhum pedido de delivery agora\" hint=\"Pedidos dos aplicativos aparecem aqui assim que entram.\" Icon={Bike} />\n }\n\n return (\n <div className=\"pos-board\">\n {COLUMNS.map(({ id, label, Icon }) => {\n const column = orders.filter((o) => (o.dispatch ?? 'received') === id)\n return (\n <section key={id} className=\"pos-col\" aria-label={label}>\n <header className=\"pos-col__head\">\n <Icon size={15} strokeWidth={2.2} aria-hidden />\n <span className=\"pos-col__t\">{label}</span>\n <span className=\"pos-col__n pos-num\">{column.length}</span>\n </header>\n <div className=\"pos-col__body\">\n {column.map((o) => {\n const late = lateness(o, now)\n const isLate = late != null && late > 0\n const awaiting = id === 'received' && !isLate\n return (\n <button\n key={o.id}\n className=\"pos-card\"\n data-late={isLate}\n // An order sitting in the first column has NOT been accepted\n // yet — the marketplace is counting, the kitchen is not. It\n // pulses until someone moves it, because a card that only\n // sits there looks exactly like one that is being cooked.\n data-await={awaiting}\n aria-current={o.id === activeId}\n // The column already says where the order is, so the edge\n // carries what position cannot: which channel it came from.\n // Late wins over channel — it is the only thing on this\n // board that needs to be seen before anything else.\n // Late beats waiting beats channel: the edge only ever\n // carries the most urgent of the three.\n style={o.channelTone && !isLate && !awaiting\n ? { ['--pos-edge' as string]: `var(--pos-tone-${o.channelTone})` }\n : undefined}\n onClick={() => { haptic('tap'); onSelect(o) }}\n >\n <span className=\"pos-card__top\">\n <span className=\"pos-card__id pos-num\">#{o.label.replace(/\\D/g, '') || o.label}</span>\n {o.channel && <span className=\"pos-card__ch\">{o.channel}</span>}\n </span>\n <span className=\"pos-card__who\">{o.customerName ?? '—'}</span>\n {o.address && <span className=\"pos-card__addr\">{o.address}</span>}\n <span className=\"pos-card__foot\">\n <span className={isLate ? 'pos-card__late' : 'pos-card__due'}>\n {isLate\n ? <><AlertTriangle size={12} strokeWidth={2.4} aria-hidden />{late}min atrasado</>\n : <><Clock size={12} strokeWidth={2.2} aria-hidden />{dueLabel(o, now)}</>}\n </span>\n {o.totalCents != null && (\n <span className=\"pos-card__v pos-num\">{formatCents(o.totalCents)}</span>\n )}\n </span>\n {o.courierName && (\n <span className=\"pos-card__courier\">\n <Bike size={12} strokeWidth={2.2} aria-hidden />{o.courierName}\n </span>\n )}\n </button>\n )\n })}\n {ghosts.filter((g) => g.from === id).map((g) => (\n <span key={`ghost-${g.id}`} className=\"pos-card pos-card--ghost\" aria-hidden />\n ))}\n {column.length === 0 && ghosts.every((g) => g.from !== id) && (\n <p className=\"pos-col__empty\">Nenhum</p>\n )}\n </div>\n </section>\n )\n })}\n </div>\n )\n}\n\nfunction dueLabel(p: PosPosition, now: number): string {\n if (!p.dueAt) return '—'\n const minutes = Math.ceil((new Date(p.dueAt).getTime() - now) / 60000)\n return minutes <= 0 ? 'agora' : `em ${minutes}min`\n}\n\nexport const DISPATCH_LABEL: Record<DispatchStatus, string> = {\n received: 'Recebido',\n preparing: 'Em produção',\n ready: 'Pronto',\n out: 'Saiu para entrega',\n delivered: 'Entregue',\n cancelled: 'Cancelado',\n}\n\n/** The next step, and only the next one: a board where every card offers every\n * status is a board where the operator picks the wrong one. */\nexport function nextDispatch(current: DispatchStatus): DispatchStatus | undefined {\n const order: DispatchStatus[] = ['received', 'preparing', 'ready', 'out', 'delivered']\n const i = order.indexOf(current)\n return i >= 0 && i < order.length - 1 ? order[i + 1] : undefined\n}\n","// ---------------------------------------------------------------------------\n// The rail for a delivery order.\n//\n// Same column, different job. The bill rail asks \"how do they pay\"; this one\n// asks \"where is it\". The order is read-only: it was itemised and settled by\n// the marketplace, and a stepper here would let a cashier edit something the\n// customer already paid for.\n// ---------------------------------------------------------------------------\n\nimport { AlertTriangle, Bike, Clock, MapPin, Phone, ShieldCheck } from 'lucide-react'\nimport type { PosPosition } from '../app/config'\nimport { DISPATCH_LABEL, nextDispatch } from './DeliveryBoard'\nimport { formatCents } from './money'\nimport type { Ticket, TicketTotals } from './session'\n\nexport function DispatchRail({\n order, ticket, totals, onAdvance, onCancel, now, open, containerRef,\n}: {\n order: PosPosition\n ticket: Ticket\n totals: TicketTotals\n onAdvance: (to: NonNullable<PosPosition['dispatch']>) => void\n onCancel: () => void\n now: number\n open?: boolean\n containerRef?: React.Ref<HTMLElement>\n}) {\n const status = order.dispatch ?? 'received'\n const next = nextDispatch(status)\n const late = order.dueAt\n ? Math.floor((now - new Date(order.dueAt).getTime()) / 60000)\n : undefined\n\n return (\n <aside\n className=\"pos-aside\"\n ref={containerRef}\n data-open={open ?? true}\n aria-label={`Pedido ${order.label}`}\n >\n <header className=\"pos-tkt\">\n <div className=\"pos-tkt__row\">\n <span className=\"pos-t-xl\">{order.label}</span>\n <span className=\"pos-badge\" data-status={status === 'out' ? 'bill_requested' : 'occupied'}>\n {DISPATCH_LABEL[status]}\n </span>\n </div>\n <div className=\"pos-tkt__sub\">\n {[order.channel, order.customerName].filter(Boolean).join(' · ')}\n </div>\n </header>\n\n <div className=\"pos-scroll\" style={{ flex: 1, minHeight: 0 }}>\n <div className=\"pos-dispatch\">\n {late != null && late > 0 && (\n <div className=\"pos-alert\">\n <AlertTriangle size={16} strokeWidth={2.3} aria-hidden />\n {late}min além do prometido\n </div>\n )}\n\n {order.address && (\n <div className=\"pos-fact\">\n <MapPin size={15} strokeWidth={2.2} aria-hidden />\n <span>{order.address}</span>\n </div>\n )}\n {order.courierName && (\n <div className=\"pos-fact\">\n <Bike size={15} strokeWidth={2.2} aria-hidden />\n <span>{order.courierName}</span>\n </div>\n )}\n {order.dueAt && (\n <div className=\"pos-fact\">\n <Clock size={15} strokeWidth={2.2} aria-hidden />\n <span>Prometido para {clock(order.dueAt)}</span>\n </div>\n )}\n </div>\n\n <div className=\"pos-t-xs\" style={{ padding: '0 var(--pos-4x) var(--pos-2x)' }}>Itens</div>\n {ticket.lines.map((line) => (\n <div key={line.id} className=\"pos-ln\" data-state={line.state ?? 'pending'} data-readonly=\"true\">\n <span className=\"pos-ln__qty pos-num\">{line.quantity}×</span>\n <span>\n <span className=\"pos-ln__n\">{line.name}</span>\n {line.note && <span className=\"pos-ln__note\">“{line.note}”</span>}\n </span>\n <span className=\"pos-ln__p pos-num\">\n {formatCents(line.unitPriceCents * line.quantity)}\n </span>\n </div>\n ))}\n </div>\n\n <div className=\"pos-tot\">\n <div className=\"pos-tot__g\">\n <span className=\"pos-t-md\">Total</span>\n <strong className=\"pos-t-display pos-num\">{formatCents(totals.totalCents)}</strong>\n </div>\n {/* Said plainly, because the operator's instinct is to collect. */}\n {order.prepaid !== false && (\n <p className=\"pos-paid\">\n <ShieldCheck size={14} strokeWidth={2.3} aria-hidden />\n Já pago no {order.channel ?? 'aplicativo'} — não cobrar\n </p>\n )}\n </div>\n\n <div className=\"pos-cta\" style={{ display: 'grid', gap: 'var(--pos-2x)' }}>\n {next ? (\n <button className=\"pos-btn\" onClick={() => onAdvance(next)}>\n {ADVANCE_LABEL[next]}\n </button>\n ) : (\n <button className=\"pos-btn\" disabled>Entregue</button>\n )}\n <button className=\"pos-btn pos-btn--ghost\" style={{ width: '100%' }} onClick={onCancel}>\n Cancelar pedido\n </button>\n </div>\n </aside>\n )\n}\n\nconst ADVANCE_LABEL: Record<string, string> = {\n preparing: 'Aceitar e produzir',\n ready: 'Marcar pronto',\n out: 'Despachar',\n delivered: 'Confirmar entrega',\n}\n\nfunction clock(iso: string): string {\n return new Date(iso).toLocaleTimeString('pt-BR', { hour: '2-digit', minute: '2-digit' })\n}\n","// ---------------------------------------------------------------------------\n// The shortcut sheet.\n//\n// Printing every binding across the bottom of the screen forever costs ~86px\n// of permanent chrome to teach something an operator learns in a week. It\n// lives here instead: one key away, complete, and gone the moment it is read.\n// ---------------------------------------------------------------------------\n\nimport { useEffect } from 'react'\nimport { Keyboard, X } from 'lucide-react'\nimport type { PosAction } from '../app/config'\n\n/** Bindings the screen owns, as opposed to the ones an app declares. */\nconst BUILT_IN: { combo: string; label: string }[] = [\n { combo: 'código + Enter', label: 'Lançar item pelo código' },\n { combo: '↑ ↓ ← →', label: 'Andar pela tela' },\n { combo: 'Enter', label: 'Acionar o que está em foco' },\n { combo: 'Esc', label: 'Voltar o cursor ao campo de comando' },\n { combo: 'F1', label: 'Esta lista' },\n]\n\nexport function ShortcutsOverlay({ actions, onClose }: {\n actions: PosAction[]\n onClose: () => void\n}) {\n useEffect(() => {\n function onKey(event: KeyboardEvent) {\n if (event.key === 'Escape' || event.key === 'F1') { event.preventDefault(); onClose() }\n }\n window.addEventListener('keydown', onKey, true)\n return () => window.removeEventListener('keydown', onKey, true)\n }, [onClose])\n\n const bound = actions.filter((a) => a.shortcut)\n\n return (\n <div className=\"pos-sheet\" role=\"dialog\" aria-modal=\"true\" aria-label=\"Atalhos\">\n <div className=\"pos-sheet__scrim\" onClick={onClose} />\n <div className=\"pos-sheet__panel\" style={{ width: 'min(620px, 94vw)' }}>\n <header className=\"pos-sheet__head\">\n <span style={{ display: 'flex', alignItems: 'center', gap: 10 }}>\n <Keyboard size={20} strokeWidth={2.1} aria-hidden />\n <span className=\"pos-t-xl\">Atalhos</span>\n </span>\n <button className=\"pos-icon-btn\" onClick={onClose} aria-label=\"Fechar\">\n <X size={18} strokeWidth={2.2} />\n </button>\n </header>\n\n <div className=\"pos-sheet__body pos-scroll\">\n <section>\n <div className=\"pos-t-xs\" style={{ marginBottom: 8 }}>Operação</div>\n <div className=\"pos-keys\">\n {bound.map((a) => (\n <div key={a.id} className=\"pos-key\">\n <kbd className=\"pos-kbd\">{a.shortcut}</kbd>\n <span>{a.label}</span>\n {a.requiresPin && <span className=\"pos-key__pin\">PIN</span>}\n </div>\n ))}\n </div>\n </section>\n\n <section>\n <div className=\"pos-t-xs\" style={{ marginBottom: 8 }}>Sempre</div>\n <div className=\"pos-keys\">\n {BUILT_IN.map((k) => (\n <div key={k.combo} className=\"pos-key\">\n <kbd className=\"pos-kbd\">{k.combo}</kbd>\n <span>{k.label}</span>\n </div>\n ))}\n </div>\n </section>\n </div>\n </div>\n </div>\n )\n}\n","// ---------------------------------------------------------------------------\n// Reservations.\n//\n// The POS does not take the booking — the site or the phone does. What it owns\n// is the moment the promise is kept: who is coming, at what time, and seating\n// them without anyone retyping a name or a party size that is already written\n// down. Retyping is where the party of six becomes a party of four.\n//\n// Grouped by time and not by status, because the host reads this list the way\n// the evening happens: what is next.\n// ---------------------------------------------------------------------------\n\nimport { CalendarClock, Check, Phone, UserRound, Users } from 'lucide-react'\nimport type { PosPosition, PosReservation, ReservationStatus } from '../app/config'\nimport { haptic } from '../lib/haptics'\nimport { EmptyState } from './views'\n\nconst STATUS: Record<ReservationStatus, { label: string; tone: string }> = {\n booked: { label: 'Reservado', tone: 'occupied' },\n confirmed: { label: 'Confirmado', tone: 'bill_requested' },\n arrived: { label: 'Chegou', tone: 'free' },\n seated: { label: 'Sentado', tone: 'free' },\n no_show: { label: 'Não veio', tone: 'attention' },\n}\n\nexport function ReservationsView({\n reservations, positions, now, onSeat, onMarkArrived, onOpenPosition,\n}: {\n reservations: PosReservation[]\n /** Used only to name the table a booking ended up at. */\n positions: PosPosition[]\n now: number\n onSeat: (reservation: PosReservation) => void\n onMarkArrived: (id: string) => void\n onOpenPosition: (positionId: string) => void\n}) {\n if (reservations.length === 0) {\n return <EmptyState title=\"Nenhuma reserva hoje\" hint=\"Reservas feitas no site ou por telefone aparecem aqui.\" Icon={CalendarClock} />\n }\n\n // Sorted by time, then split at \"now\" so the host sees what is next without\n // scanning past what already happened.\n const sorted = [...reservations].sort((a, b) => a.at.localeCompare(b.at))\n const upcoming = sorted.filter((r) => new Date(r.at).getTime() >= now - 15 * 60_000)\n const past = sorted.filter((r) => !upcoming.includes(r))\n\n return (\n <div className=\"pos-res pos-scroll\">\n {upcoming.length > 0 && (\n <Group title=\"A seguir\" rows={upcoming} positions={positions} now={now}\n onSeat={onSeat} onMarkArrived={onMarkArrived} onOpenPosition={onOpenPosition} />\n )}\n {past.length > 0 && (\n <Group title=\"Já passou\" rows={past} positions={positions} now={now}\n onSeat={onSeat} onMarkArrived={onMarkArrived} onOpenPosition={onOpenPosition} muted />\n )}\n </div>\n )\n}\n\nfunction Group({ title, rows, positions, now, onSeat, onMarkArrived, onOpenPosition, muted }: {\n title: string\n rows: PosReservation[]\n positions: PosPosition[]\n now: number\n onSeat: (r: PosReservation) => void\n onMarkArrived: (id: string) => void\n onOpenPosition: (positionId: string) => void\n muted?: boolean\n}) {\n return (\n <section className=\"pos-res__group\" data-muted={muted}>\n <h3 className=\"pos-t-xs\">{title}</h3>\n {rows.map((r) => {\n const late = Math.floor((now - new Date(r.at).getTime()) / 60_000)\n const isLate = late > 10 && (r.status === 'booked' || r.status === 'confirmed')\n return (\n <article key={r.id} className=\"pos-res__row\" data-late={isLate}>\n <span className=\"pos-res__time pos-num\">{clock(r.at)}</span>\n\n <span className=\"pos-res__who\">\n <span className=\"pos-res__name\">{r.name}</span>\n <span className=\"pos-res__meta\">\n <span className=\"pos-res__chip\"><Users size={12} strokeWidth={2.2} aria-hidden />{r.party}</span>\n {r.phone && <span className=\"pos-res__chip\"><Phone size={12} strokeWidth={2.2} aria-hidden />{r.phone}</span>}\n {r.channel && <span className=\"pos-res__chip\">{r.channel}</span>}\n </span>\n {r.note && <span className=\"pos-res__note\">“{r.note}”</span>}\n </span>\n\n <span className=\"pos-res__end\">\n <span className=\"pos-badge\" data-status={STATUS[r.status].tone}>\n {STATUS[r.status].label}\n </span>\n {isLate && <span className=\"pos-res__late pos-num\">{late}min de atraso</span>}\n </span>\n\n <span className=\"pos-res__do\">\n {r.status === 'seated' ? (\n /* Naming the table, and going there. \"Na mesa\" without saying\n which one makes the host walk the floor asking. */\n <button\n className=\"pos-res__b pos-res__at\"\n onClick={() => r.positionId && onOpenPosition(r.positionId)}\n disabled={!r.positionId}\n >\n <Check size={15} strokeWidth={2.6} aria-hidden />\n {positions.find((p) => p.id === r.positionId)?.label ?? 'Na mesa'}\n </button>\n ) : (\n <>\n {r.status !== 'arrived' && (\n <button\n className=\"pos-res__b\"\n onClick={() => { haptic('tap'); onMarkArrived(r.id) }}\n >\n <UserRound size={14} strokeWidth={2.2} aria-hidden />\n Chegou\n </button>\n )}\n <button\n className=\"pos-res__b pos-res__b--primary\"\n onClick={() => { haptic('tap'); onSeat(r) }}\n >\n Sentar\n </button>\n </>\n )}\n </span>\n </article>\n )\n })}\n </section>\n )\n}\n\nfunction clock(iso: string): string {\n return new Date(iso).toLocaleTimeString('pt-BR', { hour: '2-digit', minute: '2-digit' })\n}\n","// ---------------------------------------------------------------------------\n// The modifier sheet.\n//\n// Opens only for items that actually ask a question, because a sheet in front\n// of a beer is a tax on every round. Fully keyboard-operable: number keys pick\n// options, Enter confirms, Esc cancels — the waiter's hand never has to leave\n// the keyboard for a medium-rare.\n// ---------------------------------------------------------------------------\n\nimport { useEffect, useMemo, useRef, useState } from 'react'\nimport { Check, X } from 'lucide-react'\nimport type { PickedModifier, PosItem } from '../app/config'\nimport { formatCents } from './money'\n\nexport function ModifierSheet({ item, onCancel, onConfirm, initial, mode = 'add' }: {\n item: PosItem\n onCancel: () => void\n onConfirm: (picked: PickedModifier[], note: string) => void\n /** Prefills the sheet when reopening a line that is already on the ticket. */\n initial?: { modifiers?: PickedModifier[]; note?: string }\n mode?: 'add' | 'edit'\n}) {\n const groups = item.modifiers ?? []\n const [picked, setPicked] = useState<Record<string, string[]>>(() => {\n const seed: Record<string, string[]> = {}\n for (const g of groups) seed[g.id] = []\n for (const m of initial?.modifiers ?? []) {\n seed[m.groupId] = [...(seed[m.groupId] ?? []), m.optionId]\n }\n return seed\n })\n const [note, setNote] = useState(initial?.note ?? '')\n const noteRef = useRef<HTMLInputElement>(null)\n\n const chosen: PickedModifier[] = useMemo(\n () => groups.flatMap((g) =>\n (picked[g.id] ?? []).flatMap((optionId) => {\n const option = g.options.find((o) => o.id === optionId)\n return option\n ? [{ groupId: g.id, optionId, label: option.label, priceDeltaCents: option.priceDeltaCents ?? 0 }]\n : []\n }),\n ),\n [groups, picked],\n )\n\n // A group with min > 0 is a question the kitchen cannot cook without.\n const missing = groups.filter((g) => (g.min ?? 0) > (picked[g.id]?.length ?? 0))\n const total = item.priceCents + chosen.reduce((s, m) => s + m.priceDeltaCents, 0)\n\n function toggle(groupId: string, optionId: string, max: number) {\n setPicked((prev) => {\n const current = prev[groupId] ?? []\n if (current.includes(optionId)) return { ...prev, [groupId]: current.filter((id) => id !== optionId) }\n // At max, the newest choice pushes out the oldest instead of refusing —\n // silently ignoring a tap reads as a broken screen.\n const next = max === 1 ? [optionId] : [...current, optionId].slice(-max)\n return { ...prev, [groupId]: next }\n })\n }\n\n useEffect(() => {\n function onKey(event: KeyboardEvent) {\n if (event.key === 'Escape') { event.preventDefault(); onCancel(); return }\n if (event.key === 'Enter' && document.activeElement !== noteRef.current) {\n if (missing.length === 0) { event.preventDefault(); onConfirm(chosen, note.trim()) }\n }\n }\n window.addEventListener('keydown', onKey, true)\n return () => window.removeEventListener('keydown', onKey, true)\n }, [chosen, note, missing.length, onCancel, onConfirm])\n\n return (\n <div className=\"pos-sheet\" role=\"dialog\" aria-modal=\"true\" aria-label={`Opções de ${item.name}`}>\n <div className=\"pos-sheet__scrim\" onClick={onCancel} />\n <div className=\"pos-sheet__panel\">\n <header className=\"pos-sheet__head\">\n <span>\n <span className=\"pos-t-xl\">{item.name}</span>\n <span className=\"pos-t-sm pos-num\" style={{ display: 'block' }}>\n {mode === 'edit' ? 'Editando o item na comanda' : formatCents(item.priceCents)}\n </span>\n </span>\n <button className=\"pos-icon-btn\" onClick={onCancel} aria-label=\"Cancelar\">\n <X size={18} strokeWidth={2.2} />\n </button>\n </header>\n\n <div className=\"pos-sheet__body pos-scroll\">\n {groups.length === 0 && mode === 'edit' && (\n <p className=\"pos-t-sm\" style={{ margin: 0 }}>\n Este item não tem opções — só observação.\n </p>\n )}\n {groups.map((g) => {\n const max = g.max ?? 1\n const need = (g.min ?? 0) > (picked[g.id]?.length ?? 0)\n return (\n <section key={g.id} className=\"pos-mgroup\">\n <div className=\"pos-mgroup__head\">\n <span className=\"pos-t-xs\">{g.label}</span>\n {need && <span className=\"pos-mgroup__req\">obrigatório</span>}\n </div>\n <div className=\"pos-mgroup__opts\">\n {g.options.map((o) => {\n const on = (picked[g.id] ?? []).includes(o.id)\n return (\n <button\n key={o.id}\n className=\"pos-mopt\"\n aria-pressed={on}\n onClick={() => toggle(g.id, o.id, max)}\n >\n <span className=\"pos-mopt__check\">{on && <Check size={14} strokeWidth={3} />}</span>\n <span className=\"pos-mopt__label\">{o.label}</span>\n {o.priceDeltaCents ? (\n <span className=\"pos-mopt__delta pos-num\">\n {o.priceDeltaCents > 0 ? '+' : '−'} {formatCents(Math.abs(o.priceDeltaCents))}\n </span>\n ) : null}\n </button>\n )\n })}\n </div>\n </section>\n )\n })}\n\n <section className=\"pos-mgroup\">\n <div className=\"pos-mgroup__head\"><span className=\"pos-t-xs\">Observação</span></div>\n <input\n ref={noteRef}\n className=\"pos-note\"\n value={note}\n onChange={(e) => setNote(e.target.value)}\n placeholder=\"Ex.: sem cebola, ponto para a mesa toda\"\n aria-label=\"Observação para a cozinha\"\n />\n </section>\n </div>\n\n <footer className=\"pos-sheet__foot\">\n <button className=\"pos-btn pos-btn--ghost\" onClick={onCancel}>Cancelar</button>\n <button\n className=\"pos-btn\"\n disabled={missing.length > 0}\n onClick={() => onConfirm(chosen, note.trim())}\n >\n {missing.length > 0\n ? `Falta: ${missing[0]!.label}`\n : mode === 'edit'\n ? <>Salvar <span className=\"pos-num\">{formatCents(total)}</span></>\n : <>Adicionar <span className=\"pos-num\">{formatCents(total)}</span></>}\n </button>\n </footer>\n </div>\n </div>\n )\n}\n","// ---------------------------------------------------------------------------\n// Opening a table.\n//\n// One question, answered with a thumb: how many people. Everything else about\n// the table the room already knows. Number keys work too, because at the\n// counter the hand is on the keyboard and 4-Enter should be the whole gesture.\n// ---------------------------------------------------------------------------\n\nimport { useEffect, useState } from 'react'\nimport { Minus, Plus, Users, X } from 'lucide-react'\nimport type { PosPosition, PosStaff, PosVocabulary } from '../app/config'\n\nexport function OpenTableSheet({\n position, vocabulary, staff, operator, defaultSeats, seatingName, onCancel, onConfirm,\n}: {\n position: PosPosition\n vocabulary: PosVocabulary\n staff: PosStaff[]\n /**\n * Quem está no teclado. Quando o PDV sabe, a mesa abre NO NOME DELE e a\n * lista de atendentes some.\n *\n * Escolher o atendente era uma pergunta cuja resposta o sistema já tem: quem\n * abre a mesa é quem está logado no caixa. A lista transformava isso em um\n * toque a mais no gesto mais repetido do turno — e, pior, num toque ERRÁVEL:\n * o primeiro da lista vinha pré-selecionado, então esquecer de trocar\n * carimbava a comanda no nome de outra pessoa e a gorjeta ia junto.\n *\n * A lista continua existindo para o caso em que o sistema NÃO sabe (um\n * terminal compartilhado, sem login individual).\n */\n operator?: { id: string; name: string }\n defaultSeats?: number\n /** Set when a reservation is being seated — this sheet is then the CONFIRM\n * step of that flow, and has to say whose party it is about to seat. */\n seatingName?: string\n onCancel: () => void\n onConfirm: (guests: number, attendantId?: string) => void\n}) {\n const [guests, setGuests] = useState(defaultSeats ?? position.seats ?? 2)\n const [attendantId, setAttendantId] = useState(operator?.id ?? staff[0]?.id)\n\n useEffect(() => {\n function onKey(event: KeyboardEvent) {\n if (event.key === 'Escape') { event.preventDefault(); onCancel(); return }\n if (event.key === 'Enter') { event.preventDefault(); onConfirm(guests, attendantId); return }\n // A digit sets the count outright — the common case is 2, 4 or 6 and\n // nobody should tap a plus button four times to say six.\n if (/^[1-9]$/.test(event.key)) { event.preventDefault(); setGuests(Number(event.key)) }\n }\n window.addEventListener('keydown', onKey, true)\n return () => window.removeEventListener('keydown', onKey, true)\n }, [guests, attendantId, onCancel, onConfirm])\n\n return (\n <div className=\"pos-sheet\" role=\"dialog\" aria-modal=\"true\" aria-label={`Abrir ${position.label}`}>\n <div className=\"pos-sheet__scrim\" onClick={onCancel} />\n <div className=\"pos-sheet__panel\" style={{ width: 'min(460px, 92vw)' }}>\n <header className=\"pos-sheet__head\">\n <span>\n <span className=\"pos-t-xl\">\n {seatingName ? `Sentar na ${position.label}` : `Abrir ${position.label}`}\n </span>\n <span className=\"pos-t-sm\" style={{ display: 'block' }}>\n {seatingName\n ? `${seatingName} · ${position.seats ?? '—'} lugares`\n : position.seats ? `${position.seats} lugares` : vocabulary.position}\n </span>\n </span>\n <button className=\"pos-icon-btn\" onClick={onCancel} aria-label=\"Cancelar\">\n <X size={18} strokeWidth={2.2} />\n </button>\n </header>\n\n <div className=\"pos-sheet__body pos-scroll\">\n <section className=\"pos-mgroup\">\n <div className=\"pos-mgroup__head\"><span className=\"pos-t-xs\">Pessoas</span></div>\n <div className=\"pos-guests\">\n <button\n className=\"pos-step__b pos-guests__pm\"\n onClick={() => setGuests((g) => Math.max(1, g - 1))}\n disabled={guests <= 1}\n aria-label=\"Menos uma pessoa\"\n >\n <Minus size={18} strokeWidth={2.6} />\n </button>\n <span className=\"pos-guests__n pos-num\" aria-live=\"polite\">{guests}</span>\n <button\n className=\"pos-step__b pos-guests__pm\"\n onClick={() => setGuests((g) => g + 1)}\n aria-label=\"Mais uma pessoa\"\n >\n <Plus size={18} strokeWidth={2.6} />\n </button>\n </div>\n <div className=\"pos-quick\">\n {[1, 2, 3, 4, 5, 6, 8, 10].map((n) => (\n <button\n key={n}\n className=\"pos-quick__b pos-num\"\n aria-pressed={guests === n}\n onClick={() => setGuests(n)}\n >\n {n}\n </button>\n ))}\n </div>\n </section>\n\n {seatingName && position.seats != null && guests > position.seats && (\n /* Said, not blocked: pushing two tables together is a normal thing\n a host does, and a POS that refuses it is a POS they work around. */\n <p className=\"pos-warnline\">\n {position.label} tem {position.seats} lugares para {guests} pessoas.\n </p>\n )}\n\n {/* Sabendo quem está logado, a tela INFORMA em vez de perguntar. */}\n {operator && (\n <p className=\"pos-sheet__who\">\n Abrindo no nome de <strong>{operator.name}</strong>\n </p>\n )}\n\n {!operator && staff.length > 0 && (\n <section className=\"pos-mgroup\">\n <div className=\"pos-mgroup__head\"><span className=\"pos-t-xs\">Atendente</span></div>\n <div className=\"pos-mgroup__opts\">\n {staff.map((s) => (\n <button\n key={s.id}\n className=\"pos-mopt\"\n aria-pressed={s.id === attendantId}\n onClick={() => setAttendantId(s.id)}\n >\n <span className=\"pos-person__av\" style={{ background: `var(--pos-tone-${s.tone})` }}>\n {s.name.slice(0, 1)}\n </span>\n <span className=\"pos-mopt__label\">{s.name}</span>\n </button>\n ))}\n </div>\n </section>\n )}\n </div>\n\n <footer className=\"pos-sheet__foot\">\n <button className=\"pos-btn pos-btn--ghost\" onClick={onCancel}>Cancelar</button>\n <button className=\"pos-btn\" onClick={() => onConfirm(guests, attendantId)}>\n <Users size={18} strokeWidth={2.2} aria-hidden />\n {seatingName ? `Sentar ${guests}` : `Abrir com ${guests}`}\n </button>\n </footer>\n </div>\n </div>\n )\n}\n","// ---------------------------------------------------------------------------\n// Naming a ticket.\n//\n// \"Mesa 4\" is enough while the guests are sitting at it. A counter order is\n// not: at the pass, \"quem é o 4?\" has no answer, and the operator ends up\n// shouting a number into a room. A name and a phone give the ticket something\n// a person answers to — and give the cashier a way to FIND it when the customer\n// comes back an hour later with only their number to offer.\n// ---------------------------------------------------------------------------\n\nimport { useEffect, useRef, useState } from 'react'\nimport { Phone, User, X } from 'lucide-react'\nimport type { PosPosition } from '../app/config'\n\nexport function IdentitySheet({ position, onCancel, onSave }: {\n position: PosPosition\n onCancel: () => void\n onSave: (alias: string, phone: string) => void\n}) {\n const [alias, setAlias] = useState(position.alias ?? '')\n const [phone, setPhone] = useState(position.customerPhone ?? '')\n const first = useRef<HTMLInputElement>(null)\n\n useEffect(() => { first.current?.focus() }, [])\n\n useEffect(() => {\n function onKey(event: KeyboardEvent) {\n if (event.key === 'Escape') { event.preventDefault(); onCancel() }\n if (event.key === 'Enter') { event.preventDefault(); onSave(alias.trim(), phone.trim()) }\n }\n window.addEventListener('keydown', onKey, true)\n return () => window.removeEventListener('keydown', onKey, true)\n }, [alias, phone, onCancel, onSave])\n\n return (\n <div className=\"pos-sheet\" role=\"dialog\" aria-modal=\"true\" aria-label={`Identificar ${position.label}`}>\n <div className=\"pos-sheet__scrim\" onClick={onCancel} />\n <div className=\"pos-sheet__panel\" style={{ width: 'min(440px, 92vw)' }}>\n <header className=\"pos-sheet__head\">\n <span>\n <span className=\"pos-t-xl\">Identificar</span>\n <span className=\"pos-t-sm\" style={{ display: 'block' }}>{position.label}</span>\n </span>\n <button className=\"pos-icon-btn\" onClick={onCancel} aria-label=\"Cancelar\">\n <X size={18} strokeWidth={2.2} />\n </button>\n </header>\n\n <div className=\"pos-sheet__body\">\n <label className=\"pos-labelled\">\n <span className=\"pos-t-xs\">Nome na comanda</span>\n <span className=\"pos-input\">\n <User size={16} strokeWidth={2.1} aria-hidden />\n <input\n ref={first}\n value={alias}\n onChange={(e) => setAlias(e.target.value)}\n placeholder={`Ex.: João do balcão`}\n autoComplete=\"off\"\n />\n </span>\n </label>\n\n <label className=\"pos-labelled\">\n <span className=\"pos-t-xs\">Celular do cliente</span>\n <span className=\"pos-input\">\n <Phone size={16} strokeWidth={2.1} aria-hidden />\n <input\n value={phone}\n onChange={(e) => setPhone(e.target.value)}\n placeholder=\"(11) 9 9999-9999\"\n // The right keyboard on a tablet, and the right autofill.\n type=\"tel\"\n inputMode=\"tel\"\n autoComplete=\"tel\"\n />\n </span>\n </label>\n <p className=\"pos-t-sm\" style={{ margin: 0 }}>\n Serve para achar a conta depois — o cliente costuma lembrar do número, não do número da mesa.\n </p>\n </div>\n\n <footer className=\"pos-sheet__foot\">\n <button className=\"pos-btn pos-btn--ghost\" onClick={onCancel}>Cancelar</button>\n <button className=\"pos-btn\" onClick={() => onSave(alias.trim(), phone.trim())}>Salvar</button>\n </footer>\n </div>\n </div>\n )\n}\n","// ---------------------------------------------------------------------------\n// The PIN gate.\n//\n// This package does NOT hash the PIN. Shipping a hand-rolled digest here would\n// look like security and be theatre; the app owns `verifyPin` and can back it\n// with the real thing. What lives here is the part that has to be local and\n// instant: a manager releasing a discount in front of a customer does not wait\n// for a round-trip.\n// ---------------------------------------------------------------------------\n\nimport { useEffect, useState } from 'react'\nimport { Delete, ShieldCheck, X } from 'lucide-react'\nimport type { PosStaff } from '../app/config'\n\nconst PIN_LENGTH = 4\n\nexport function PinSheet({ actionLabel, onCancel, onVerify, onGranted }: {\n actionLabel: string\n onCancel: () => void\n /** Returns the person who authorised, or null when the PIN is wrong. */\n onVerify: (pin: string) => PosStaff | null | Promise<PosStaff | null>\n onGranted: (by: PosStaff) => void\n}) {\n const [pin, setPin] = useState('')\n const [error, setError] = useState<string>()\n const [checking, setChecking] = useState(false)\n\n async function submit(value: string) {\n setChecking(true)\n try {\n const person = await onVerify(value)\n if (person) { onGranted(person); return }\n // Clearing the field is the whole recovery path: retyping four digits is\n // faster than reading an explanation.\n setError('PIN não confere')\n setPin('')\n } finally {\n setChecking(false)\n }\n }\n\n function push(digit: string) {\n setError(undefined)\n const next = (pin + digit).slice(0, PIN_LENGTH)\n setPin(next)\n if (next.length === PIN_LENGTH) void submit(next)\n }\n\n useEffect(() => {\n function onKey(event: KeyboardEvent) {\n if (event.key === 'Escape') { event.preventDefault(); onCancel(); return }\n if (event.key === 'Backspace') { event.preventDefault(); setPin((p) => p.slice(0, -1)); return }\n if (/^[0-9]$/.test(event.key)) { event.preventDefault(); push(event.key) }\n }\n window.addEventListener('keydown', onKey, true)\n return () => window.removeEventListener('keydown', onKey, true)\n })\n\n return (\n <div className=\"pos-sheet\" role=\"dialog\" aria-modal=\"true\" aria-label={`PIN para ${actionLabel}`}>\n <div className=\"pos-sheet__scrim\" onClick={onCancel} />\n <div className=\"pos-sheet__panel\" style={{ width: 'min(400px, 92vw)' }}>\n <header className=\"pos-sheet__head\">\n <span>\n <span className=\"pos-t-xl\">{actionLabel}</span>\n <span className=\"pos-t-sm\" style={{ display: 'block' }}>Precisa de autorização</span>\n </span>\n <button className=\"pos-icon-btn\" onClick={onCancel} aria-label=\"Cancelar\">\n <X size={18} strokeWidth={2.2} />\n </button>\n </header>\n\n <div className=\"pos-sheet__body\">\n <div className=\"pos-pin__dots\" aria-live=\"polite\" aria-label={`${pin.length} de ${PIN_LENGTH} dígitos`}>\n {Array.from({ length: PIN_LENGTH }, (_, i) => (\n <span key={i} className=\"pos-pin__dot\" data-on={i < pin.length} />\n ))}\n </div>\n {/* role=alert so a screen reader announces the refusal without the\n operator having to go looking for it. */}\n <p className=\"pos-pin__err\" role=\"alert\">{error ?? ' '}</p>\n\n <div className=\"pos-pad\">\n {['1', '2', '3', '4', '5', '6', '7', '8', '9'].map((d) => (\n <button key={d} className=\"pos-pad__b pos-num\" onClick={() => push(d)} disabled={checking}>\n {d}\n </button>\n ))}\n <button className=\"pos-pad__b\" onClick={onCancel} aria-label=\"Cancelar\">\n <X size={20} strokeWidth={2.4} />\n </button>\n <button className=\"pos-pad__b pos-num\" onClick={() => push('0')} disabled={checking}>0</button>\n <button\n className=\"pos-pad__b\"\n onClick={() => setPin((p) => p.slice(0, -1))}\n aria-label=\"Apagar último dígito\"\n >\n <Delete size={20} strokeWidth={2.2} />\n </button>\n </div>\n </div>\n\n <footer className=\"pos-sheet__foot\" style={{ gridTemplateColumns: '1fr' }}>\n <span className=\"pos-pin__hint\">\n <ShieldCheck size={15} strokeWidth={2.2} aria-hidden />\n Fica registrado quem autorizou\n </span>\n </footer>\n </div>\n </div>\n )\n}\n","// ---------------------------------------------------------------------------\n// Splitting the bill.\n//\n// Two ways a table actually splits: evenly by head count, or by who ate what.\n// Both land on the same guarantee — the parts sum back to the whole, and the\n// rounding remainder has a visible owner. A centavo that quietly disappears is\n// how a cashier stops trusting the drawer.\n// ---------------------------------------------------------------------------\n\nimport { useMemo, useState } from 'react'\nimport { Minus, Plus, Users, UtensilsCrossed, X } from 'lucide-react'\nimport { formatCents, splitEvenly } from './money'\nimport type { Ticket, TicketTotals } from './session'\n\ntype Mode = 'even' | 'by_item'\n\nexport function SplitSheet({ ticket, totals, guests, onCancel, onConfirm }: {\n ticket: Ticket\n totals: TicketTotals\n guests?: number\n onCancel: () => void\n onConfirm: (parts: number[]) => void\n}) {\n const [mode, setMode] = useState<Mode>('even')\n const [ways, setWays] = useState(Math.max(2, guests ?? 2))\n /** lineId → which share it belongs to, in by-item mode. */\n const [assigned, setAssigned] = useState<Record<string, number>>({})\n\n const evenParts = useMemo(() => splitEvenly(totals.totalCents, ways), [totals.totalCents, ways])\n\n const itemParts = useMemo(() => {\n const parts = Array.from({ length: ways }, () => 0)\n let unassigned = 0\n for (const line of ticket.lines) {\n const value = line.unitPriceCents * line.quantity\n const share = assigned[line.id]\n if (share == null) { unassigned += value; continue }\n parts[share] = (parts[share] ?? 0) + value\n }\n // Service and anything nobody claimed spread evenly — leaving them out\n // would make the parts miss the total, which is the one thing that must\n // never happen.\n const shared = totals.totalCents - totals.subtotalCents + unassigned\n const spread = splitEvenly(Math.max(0, shared), ways)\n return parts.map((p, i) => p + (spread[i] ?? 0))\n }, [ticket.lines, assigned, ways, totals])\n\n const parts = mode === 'even' ? evenParts : itemParts\n const sum = parts.reduce((a, b) => a + b, 0)\n const unassignedCount = ticket.lines.filter((l) => assigned[l.id] == null).length\n\n return (\n <div className=\"pos-sheet\" role=\"dialog\" aria-modal=\"true\" aria-label=\"Dividir conta\">\n <div className=\"pos-sheet__scrim\" onClick={onCancel} />\n <div className=\"pos-sheet__panel\" style={{ width: 'min(680px, 94vw)' }}>\n <header className=\"pos-sheet__head\">\n <span>\n <span className=\"pos-t-xl\">Dividir conta</span>\n <span className=\"pos-t-sm pos-num\" style={{ display: 'block' }}>\n {formatCents(totals.totalCents)} no total\n </span>\n </span>\n <button className=\"pos-icon-btn\" onClick={onCancel} aria-label=\"Cancelar\">\n <X size={18} strokeWidth={2.2} />\n </button>\n </header>\n\n <div className=\"pos-sheet__body pos-scroll\">\n <div className=\"pos-seg\" style={{ alignSelf: 'start' }}>\n <button className=\"pos-seg__btn\" aria-pressed={mode === 'even'} onClick={() => setMode('even')}>\n <Users size={15} strokeWidth={2.2} aria-hidden /> Igual\n </button>\n <button className=\"pos-seg__btn\" aria-pressed={mode === 'by_item'} onClick={() => setMode('by_item')}>\n <UtensilsCrossed size={15} strokeWidth={2.2} aria-hidden /> Por item\n </button>\n </div>\n\n <section className=\"pos-mgroup\">\n <div className=\"pos-mgroup__head\"><span className=\"pos-t-xs\">Em quantas partes</span></div>\n <div className=\"pos-guests\">\n <button\n className=\"pos-step__b pos-guests__pm\"\n onClick={() => setWays((w) => Math.max(2, w - 1))}\n disabled={ways <= 2}\n aria-label=\"Menos uma parte\"\n >\n <Minus size={18} strokeWidth={2.6} />\n </button>\n <span className=\"pos-guests__n pos-num\">{ways}</span>\n <button\n className=\"pos-step__b pos-guests__pm\"\n onClick={() => setWays((w) => w + 1)}\n aria-label=\"Mais uma parte\"\n >\n <Plus size={18} strokeWidth={2.6} />\n </button>\n </div>\n </section>\n\n {mode === 'by_item' && (\n <section className=\"pos-mgroup\">\n <div className=\"pos-mgroup__head\">\n <span className=\"pos-t-xs\">Quem pediu o quê</span>\n {unassignedCount > 0 && (\n <span className=\"pos-mgroup__req\">{unassignedCount} sem dono — rateado</span>\n )}\n </div>\n {ticket.lines.map((line) => (\n <div key={line.id} className=\"pos-split__line\">\n <span className=\"pos-split__name\">\n {line.quantity}× {line.name}\n </span>\n <span className=\"pos-split__pick\">\n {Array.from({ length: ways }, (_, i) => (\n <button\n key={i}\n className=\"pos-split__b pos-num\"\n aria-pressed={assigned[line.id] === i}\n onClick={() => setAssigned((prev) =>\n prev[line.id] === i\n ? Object.fromEntries(Object.entries(prev).filter(([k]) => k !== line.id))\n : { ...prev, [line.id]: i },\n )}\n >\n {i + 1}\n </button>\n ))}\n </span>\n <span className=\"pos-split__v pos-num\">\n {formatCents(line.unitPriceCents * line.quantity)}\n </span>\n </div>\n ))}\n </section>\n )}\n\n <section className=\"pos-mgroup\">\n <div className=\"pos-mgroup__head\"><span className=\"pos-t-xs\">Cada parte paga</span></div>\n <div className=\"pos-parts\">\n {parts.map((value, i) => (\n <div key={i} className=\"pos-part\">\n <span className=\"pos-part__k pos-num\">Parte {i + 1}</span>\n <span className=\"pos-part__v pos-num\">{formatCents(value)}</span>\n </div>\n ))}\n </div>\n {/* Stated, not assumed: the operator can see the parts add up. */}\n <p className=\"pos-split__sum pos-num\">\n Soma das partes: {formatCents(sum)}\n {sum === totals.totalCents ? ' — confere' : ' — NÃO confere'}\n </p>\n </section>\n </div>\n\n <footer className=\"pos-sheet__foot\">\n <button className=\"pos-btn pos-btn--ghost\" onClick={onCancel}>Cancelar</button>\n <button className=\"pos-btn\" onClick={() => onConfirm(parts)}>\n Dividir em {ways}\n </button>\n </footer>\n </div>\n </div>\n )\n}\n","import { useEffect, useState } from 'react'\nimport { AlertTriangle, Check, Info } from 'lucide-react'\n\nexport type NoticeTone = 'info' | 'ok' | 'warn'\n\n/** One confirmation, shown once. A new object shows again even with the same\n * text — repeating an action has to repeat the confirmation. */\nexport interface PosNotice {\n text: string\n tone?: NoticeTone\n}\n\nconst ICON = { info: Info, ok: Check, warn: AlertTriangle }\n\n/**\n * Confirmations land over the strip of open tables, not in a corner.\n *\n * The strip is the one band the operator is not reading while ringing, so\n * covering it costs nothing — and it is a band, not a floating card, so the\n * message arrives in the place the eye already returns to between taps.\n * Blurring rather than hiding keeps the chips legible as shape, which is what\n * says \"this is passing\" without any dismiss affordance to hunt for.\n */\nexport function Notice({ notice, onDone }: { notice?: PosNotice; onDone: () => void }) {\n const [leaving, setLeaving] = useState(false)\n\n useEffect(() => {\n if (!notice) return\n setLeaving(false)\n const out = window.setTimeout(() => setLeaving(true), 1900)\n const gone = window.setTimeout(onDone, 2200)\n return () => { window.clearTimeout(out); window.clearTimeout(gone) }\n }, [notice, onDone])\n\n if (!notice) return null\n const tone = notice.tone ?? 'info'\n const Icon = ICON[tone]\n\n return (\n <div className=\"pos-notice\" data-tone={tone} data-leaving={leaving} role=\"status\" aria-live=\"polite\">\n <span className=\"pos-notice__i\" aria-hidden><Icon size={17} strokeWidth={2.6} /></span>\n {notice.text}\n </div>\n )\n}\n","// ---------------------------------------------------------------------------\n// The operator screen.\n//\n// Left rail navigates. Content changes with it. The right rail holds the order\n// and the table, always, and only ever changes width.\n//\n// Selecting a table does NOT navigate. Choosing where to look and choosing\n// what you are ringing are two different decisions, and a terminal that\n// conflates them moves the screen out from under the operator's hand.\n// ---------------------------------------------------------------------------\n\nimport { useCallback, useEffect, useMemo, useReducer, useRef, useState, type ReactNode } from 'react'\nimport {\n AlertTriangle, Banknote, Bike, CalendarClock, ClipboardList, Keyboard, LayoutGrid,\n ChevronUp, type LucideIcon, MoreHorizontal, Receipt, Search, UtensilsCrossed, X,\n} from 'lucide-react'\nimport type {\n DispatchStatus, PickedModifier, PosAction, PosAppConfig, PosCategory, PosItem,\n PosPosition, PosReservation, PosStaff, PosTone, ReservationStatus,\n} from '../app/config'\nimport { createKeymap } from '../keyboard'\nimport { directionOf, moveFocus } from '../keyboard'\nimport { haptic } from '../lib/haptics'\nimport { formatCents } from './money'\nimport {\n COUNTER_KEY, bookReducer, countsOf, ticketAt, totalsOf,\n type Ticket, type TicketAction, type TicketBook, type TicketLine, type TicketTotals,\n} from './session'\nimport { TicketRail } from './TicketRail'\nimport { CatalogSkeleton, CatalogView, FloorSkeleton, FloorView, ShiftView, elapsed } from './views'\nimport { DeliveryBoard } from './DeliveryBoard'\nimport { DispatchRail } from './DispatchRail'\nimport { ShortcutsOverlay } from './ShortcutsOverlay'\nimport { ReservationsView } from './ReservationsView'\nimport { ModifierSheet } from './ModifierSheet'\nimport { OpenTableSheet } from './OpenTableSheet'\nimport { IdentitySheet } from './IdentitySheet'\nimport { PinSheet } from './PinSheet'\nimport { SplitSheet } from './SplitSheet'\nimport { Notice, type PosNotice } from './Notice'\n\n/**\n * A bill at the moment the operator confirms it. Everything the app needs to\n * settle it is here, so the handler never has to reach back into the screen.\n */\nexport interface PosBill {\n ticket: Ticket\n totals: TicketTotals\n /** Which of `config.paymentMethods` was chosen. Never guessed. */\n paymentMethodId: string\n}\n\nexport interface PosScreenProps {\n config: PosAppConfig\n categories: PosCategory[]\n items: PosItem[]\n positions: PosPosition[]\n staff?: PosStaff[]\n reservations?: PosReservation[]\n terminalName?: string\n operatorName?: string\n /**\n * O id de quem está logado no caixa.\n *\n * Com ele a mesa abre no nome do operador e o seletor de atendente some —\n * ver `operator` em OpenTableSheet. Sem ele (terminal compartilhado, sem\n * login individual) a lista continua sendo a única forma de saber de quem é\n * a comanda.\n */\n operatorId?: string\n connection?: 'online' | 'reconnecting' | 'offline'\n onAction?: (actionId: string) => void\n /** Fired when the operator opens a position, so the app can persist it. */\n onOpenPosition?: (positionId: string, guests: number, attendantId?: string) => void\n /**\n * The lines that just left the operator's hands for the kitchen. `sent` is\n * only what moved on this press — a second fire must not print the first\n * round again — while `ticket` is the whole comanda after it, which is what\n * a header total has to be computed from.\n */\n onFire?: (positionId: string, sent: TicketLine[], ticket: Ticket) => void | Promise<void>\n /**\n * The bill is being settled. Return `false` (or throw) and the ticket stays\n * exactly where it is: a write that never reached the pool must not clear a\n * table, because the next thing that happens is the guests walking out.\n */\n onCloseBill?: (positionId: string, bill: PosBill) => boolean | void | Promise<boolean | void>\n /** A delivery order moved down the board. */\n onDispatch?: (positionId: string, to: DispatchStatus) => void | Promise<void>\n /**\n * Checks a PIN for an action that demands one. This package deliberately does\n * NOT hash: a hand-rolled digest here would look like security and be\n * theatre. Return the person who authorised, or null.\n */\n verifyPin?: (pin: string, actionId: string) => PosStaff | null | Promise<PosStaff | null>\n /** Called after a gated action is authorised, with who released it. */\n onAuthorised?: (actionId: string, by: PosStaff) => void\n /** Orders already open when the screen mounts, keyed by position id. */\n initialTickets?: Record<string, TicketLine[]>\n /**\n * A confirmation to show over the strip of open tables. Pass a NEW object to\n * show it — the screen raises its own for what it does itself, and this is\n * for what only the app knows (a write that reached the pool, or, for now,\n * one that did not).\n */\n notice?: PosNotice\n /**\n * The product's own mark, in the operator plate.\n *\n * Without it the plate shows the first letter of `config.name` — right for a\n * terminal that belongs to nobody's brand, wrong the moment the POS is opened\n * from inside a product the operator was just looking at. `className` below\n * is the other half: the host repaints the surface, this names it.\n */\n brandMark?: ReactNode\n /**\n * Host chrome at the head of the POS's own rail, under the operator plate.\n *\n * For the control that says where this screen SITS — the counter opened from\n * a back office puts its Balcão ⇄ Retaguarda switch here, in the column the\n * host's menu occupied a second ago. A dedicated terminal passes nothing and\n * the rail starts at \"Operação\", as before. Hidden on a narrow rail, where\n * the labels would be crushed: there the way out is the host's own corner.\n */\n railTop?: ReactNode\n /**\n * Which unit this till is standing in, beside the view's title.\n *\n * A slot and not a component: knowing about units is the back office's job,\n * and `@fayz-ai/pos` depends on `core` alone — a till that never had units\n * should not ship the tree that models them. The host passes its own control\n * (in the SDK that is `UnitMenuSection` from `@fayz-ai/admin`), and a\n * single-unit shop passes nothing and loses no pixels.\n *\n * In the head band rather than the rail because it answers \"where am I\n * standing\", which is the same question the view title answers — and in a\n * franchise, reading the wrong unit's till is the most expensive mistake the\n * screen offers. It must be legible without opening anything.\n */\n unitSwitcher?: ReactNode\n /**\n * The wordmark beside the mark. Plain `config.name` unless the host has a\n * lockup of its own — a product whose name carries two weights (\"**Chef**\n * Control\") loses the distinction if the rail restates it in one.\n */\n brandName?: ReactNode\n /**\n * Added to the `.pos` root, so a host can restate the palette in its own\n * colours by redeclaring the `--pos-*` variables under its class. It is the\n * only theming seam: the POS keeps ONE design system and lets it be recoloured\n * — it never accepts a second one.\n */\n className?: string\n /**\n * A MESMA costura do `className`, para o valor que não cabe numa classe.\n *\n * A regra acima — só `--pos-*`, nunca um segundo design system — continua de\n * pé; o que muda é de onde a variável vem. Uma classe serve enquanto a\n * paleta do hospedeiro é conhecida no build; a cor de um INQUILINO não é:\n * ela sai do documento de marca dele em tempo de execução, e não há folha de\n * estilo onde escrevê-la. Sem isto o caixa de um salão azul-marinho abria\n * dourado, porque o dourado é a cor do ChefControl e não a da casa.\n */\n style?: React.CSSProperties\n /**\n * O app ainda está buscando mesas e cardápio.\n *\n * Sem isto o PDV abria dizendo \"nenhuma mesa nesta área\" enquanto a consulta\n * corria — e \"vazio\" e \"carregando\" são respostas diferentes: a primeira faz\n * o operador ir cadastrar mesa que já existe.\n */\n loading?: boolean\n /** Injected in tests so elapsed times are not wall-clock dependent. */\n now?: number\n}\n\nconst MENU_ICON: Record<string, LucideIcon> = {\n // `list` é o quadro de despacho — a moto, a mesma que o back office usa para\n // Delivery. Um caminhão fala de carga, e o que sai daqui vai numa garupa.\n floor: LayoutGrid, catalog: UtensilsCrossed, list: Bike, shift: Banknote,\n reservations: CalendarClock,\n}\n\n/**\n * A planta não existe no celular.\n *\n * Ela responde \"onde fica a mesa 6\" desenhando a SALA em escala — e uma sala\n * em 390px vira um mapa que só se lê com pinça e arrasto, dois gestos que\n * ninguém faz de pé segurando a comanda. A grade responde a pergunta do turno\n * com a tela inteira. Sem a planta, o alternador também não tem o que alternar.\n */\nfunction useMedia(query: string): boolean {\n const [matches, setMatches] = useState(\n () => typeof window !== 'undefined' && window.matchMedia(query).matches,\n )\n useEffect(() => {\n if (typeof window === 'undefined') return\n const mq = window.matchMedia(query)\n const on = () => setMatches(mq.matches)\n setMatches(mq.matches)\n mq.addEventListener('change', on)\n return () => mq.removeEventListener('change', on)\n }, [query])\n return matches\n}\n\nfunction usePhone(): boolean {\n return useMedia('(max-width: 640px)')\n}\n\n/** A trilha com PALAVRAS — acima de 1180px. Abaixo disso ela colapsa em 68px\n * de ícones (e some de vez no telefone), largura em que um campo de busca não\n * cabe: é o que decide se a busca mora na trilha ou volta para a faixa. */\nfunction useWideRail(): boolean {\n return useMedia('(min-width: 1181px)')\n}\n\nlet lineSeq = 0\nconst nextLineId = () => `line-${++lineSeq}`\n\nexport function PosScreen({\n config, categories, items, positions, staff = [], reservations = [], terminalName, operatorName,\n connection = 'online', operatorId, onAction, onOpenPosition, onFire, onCloseBill, onDispatch,\n verifyPin, onAuthorised, initialTickets, notice: appNotice, brandMark, brandName, className, style, railTop,\n unitSwitcher,\n loading = false,\n now = Date.now(),\n}: PosScreenProps) {\n const [book, dispatchBook] = useReducer(bookReducer, undefined, (): TicketBook => {\n const seeded: TicketBook = {}\n const openedAt = new Date(now).toISOString()\n for (const [positionId, lines] of Object.entries(initialTickets ?? {})) {\n const seatedAt = positions.find((p) => p.id === positionId)?.openedAt ?? openedAt\n seeded[positionId] = { id: `t-${positionId}`, lines, openedAt, seatedAt }\n }\n return seeded\n })\n const [menuId, setMenuId] = useState(config.menus[0]?.id)\n const [activePositionId, setActivePositionId] = useState<string>()\n const [activeZoneId, setActiveZoneId] = useState(config.positions.zones?.[0]?.id)\n const [activeCategoryId, setActiveCategoryId] = useState(categories[0]?.id)\n const [selectedLineId, setSelectedLineId] = useState<string>()\n // Deliberately empty. Guessing \"dinheiro\" is how a card sale gets recorded\n // as cash and the drawer stops matching at the end of the shift.\n const [paymentId, setPaymentId] = useState<string>()\n const [query, setQuery] = useState('')\n const [railOpen, setRailOpen] = useState(false)\n const [pendingItem, setPendingItem] = useState<PosItem>()\n const [openingPosition, setOpeningPosition] = useState<PosPosition>()\n const [editing, setEditing] = useState<{ item: PosItem; line: TicketLine }>()\n const [naming, setNaming] = useState<PosPosition>()\n /** Names this terminal gave to tickets during the shift. */\n const [named, setNamed] = useState<Record<string, { alias: string; phone: string }>>({})\n /** Reservation moves this terminal made during the shift. */\n const [bookings, setBookings] = useState<Record<string, ReservationStatus>>({})\n /** Which position each booking ended up at — \"na mesa\" without saying which\n * one leaves the host asking the party where they sat. */\n const [seatedAt, setSeatedAt] = useState<Record<string, string>>({})\n /** The booking being seated, so its party and name carry into the table. */\n const [seating, setSeating] = useState<PosReservation>()\n const [pinFor, setPinFor] = useState<PosAction>()\n const [splitting, setSplitting] = useState(false)\n const [showKeys, setShowKeys] = useState(false)\n /** The confirmation currently over the dock, whoever raised it. */\n const [notice, setNotice] = useState<PosNotice>()\n /** Dispatch moves this terminal made, layered over what came in. */\n const [dispatched, setDispatched] = useState<Record<string, DispatchStatus>>({})\n /** Tables this terminal opened during the shift, on top of what came in. */\n const [opened, setOpened] = useState<Record<string, {\n seats: number; attendantName?: string; attendantTone?: PosTone; openedAt: string\n }>>({})\n /** Bills settled on this terminal during the shift: the table is free again. */\n const [settled, setSettled] = useState<Record<string, true>>({})\n /** One close at a time — a double tap must not take the money twice. */\n const [settling, setSettling] = useState(false)\n const commandRef = useRef<HTMLInputElement>(null)\n useEffect(() => { if (appNotice) setNotice(appNotice) }, [appNotice])\n\n const menu = config.menus.find((m) => m.id === menuId) ?? config.menus[0]\n const ticketKey = activePositionId ?? COUNTER_KEY\n const ticket = ticketAt(book, ticketKey)\n\n /** Every write goes to the position currently in hand — never a global one. */\n const dispatch = useCallback(\n (action: TicketAction) => dispatchBook({ type: 'at', positionId: ticketKey, action }),\n [ticketKey],\n )\n\n // What the floor and the dock read: live counts, not a static seed.\n const counts = useMemo(() => countsOf(book), [book])\n\n const totals = useMemo(\n () => totalsOf(ticket, { serviceChargePercent: config.serviceChargePercent }),\n [ticket, config.serviceChargePercent],\n )\n\n const quantities = useMemo(() => {\n const map: Record<string, number> = {}\n for (const line of ticket.lines) map[line.itemId] = (map[line.itemId] ?? 0) + line.quantity\n return map\n }, [ticket.lines])\n\n const ring = useCallback((item: PosItem, modifiers?: PickedModifier[], note?: string) => {\n dispatch({ type: 'add_item', item, lineId: nextLineId(), modifiers, note })\n }, [dispatch])\n\n /** Items that ask a question get the sheet; the rest ring on one tap. */\n const addItem = useCallback((item: PosItem) => {\n if (item.modifiers && item.modifiers.length > 0) { setPendingItem(item); return }\n ring(item)\n }, [ring])\n\n const removeItem = useCallback((item: PosItem) => {\n dispatch({ type: 'remove_one_of', itemId: item.id })\n }, [dispatch])\n\n // Code + Enter: the command field is the caret's home, so a cashier who never\n // touches the screen can still ring an order.\n const submitCode = useCallback(() => {\n const code = query.trim().toLowerCase()\n if (!code) return\n const hit = items.find((i) => i.code?.toLowerCase() === code)\n if (hit) { addItem(hit); setQuery('') }\n }, [query, items, addItem])\n\n const keymap = useMemo(() => createKeymap(), [])\n\n // The keymap registers once per action list; keeping the handler behind a ref\n // stops every ticket change from tearing down and rebuilding every binding.\n const handleActionRef = useRef((_id: string) => {})\n /** Behind a ref for the same reason as the action handler: F10 must not\n * re-register every binding each time a line changes. */\n const settleBillRef = useRef<() => Promise<void>>(async () => {})\n const mainRef = useRef<HTMLElement>(null)\n const asideRef = useRef<HTMLDivElement>(null)\n /** Read by the 'abrir mesa' action, which runs before the memo below. */\n const zonePositionsRef = useRef<PosPosition[]>([])\n const ticketRef = useRef(ticket)\n /** Read inside selectPosition, which is memoised without the seating state. */\n const seatingRef = useRef<PosReservation | undefined>(undefined)\n\n useEffect(() => {\n const disposers = config.actions\n .filter((a) => a.shortcut)\n .map((a) => keymap.register({ id: a.id, combo: a.shortcut!, handler: () => handleActionRef.current(a.id) }))\n return () => disposers.forEach((d) => d())\n }, [config.actions, keymap])\n\n useEffect(() => {\n function onKeyDown(event: KeyboardEvent) {\n // A sheet owns the keyboard while it is open; F-keys firing behind a\n // modal is how an operator cancels a table they cannot even see.\n if (document.querySelector('.pos-sheet')) return\n if (event.key === 'Enter' && document.activeElement === commandRef.current) {\n submitCode()\n return\n }\n // Esc always returns the caret to the command field. Losing focus mid-rush\n // is the difference between usable and unusable.\n if (event.key === 'F1') { event.preventDefault(); setShowKeys(true); return }\n if (event.key === 'Escape') { commandRef.current?.focus(); return }\n\n // Arrows walk whichever region the operator is already in. Typing in the\n // command field must keep its own caret movement, so the field opts out.\n const direction = directionOf(event.key)\n if (direction && document.activeElement !== commandRef.current) {\n const active = document.activeElement\n const region = asideRef.current?.contains(active as Node)\n ? asideRef.current\n : mainRef.current\n if (region && moveFocus(region, direction)) event.preventDefault()\n return\n }\n\n if (keymap.dispatch(event)) event.preventDefault()\n }\n window.addEventListener('keydown', onKeyDown)\n return () => window.removeEventListener('keydown', onKeyDown)\n }, [keymap, submitCode])\n\n // The floor shows what the book actually holds, so a table the operator just\n // rang stops disagreeing with the card that represents it.\n const livePositions = useMemo(() => positions.map((raw) => {\n // A bill settled on this terminal wins over whatever the load said: the\n // table is free, has no ticket and owes nothing, until someone opens it.\n if (settled[raw.id]) {\n const { ticketId: _t, openedAt: _o, attendantName: _a, attendantTone: _n,\n totalCents: _c, itemCount: _i, request: _r, ...rest } = raw\n return { ...rest, status: 'free' as const }\n }\n const just = opened[raw.id]\n let p: PosPosition = just\n ? {\n ...raw,\n status: 'occupied',\n seats: just.seats,\n attendantName: just.attendantName ?? raw.attendantName,\n attendantTone: just.attendantTone ?? raw.attendantTone,\n openedAt: just.openedAt,\n }\n : raw\n const moved = dispatched[raw.id]\n if (moved) p = { ...p, dispatch: moved }\n const t = book[p.id]\n if (!t) return p\n const totalCents = totalsOf(t, { serviceChargePercent: config.serviceChargePercent }).totalCents\n return { ...p, itemCount: counts[p.id] ?? p.itemCount, totalCents: totalCents || p.totalCents }\n }), [positions, opened, dispatched, settled, book, counts, config.serviceChargePercent])\n\n const activePosition = livePositions.find((p) => p.id === activePositionId)\n\n const zonePositions = activeZoneId\n ? livePositions.filter((p) => p.zoneId === activeZoneId)\n : livePositions\n\n /** Selecting a position changes what the order is FOR. It does not navigate.\n * A free one has nothing to show yet, so it asks to be opened instead. */\n const selectPosition = useCallback((p: PosPosition) => {\n if (p.status === 'free') { setOpeningPosition(p); return }\n // A party being seated can only land on a free table. Tapping an occupied\n // one during seating is a misfire, not a request to switch tables.\n if (seatingRef.current) return\n setActivePositionId(p.id)\n setRailOpen(true)\n }, [])\n\n const confirmOpen = useCallback((guests: number, attendantId?: string) => {\n const p = openingPosition\n if (!p) return\n const person = staff.find((s) => s.id === attendantId)\n setOpened((prev) => ({\n ...prev,\n [p.id]: {\n seats: guests,\n attendantName: person?.name,\n attendantTone: person?.tone,\n openedAt: new Date(now).toISOString(),\n },\n }))\n setActivePositionId(p.id)\n setRailOpen(true)\n setOpeningPosition(undefined)\n if (seating) {\n setNamed((prev) => ({ ...prev, [p.id]: { alias: seating.name, phone: seating.phone ?? '' } }))\n setBookings((prev) => ({ ...prev, [seating.id]: 'seated' }))\n setSeatedAt((prev) => ({ ...prev, [seating.id]: p.id }))\n setSeating(undefined)\n }\n setNotice({\n text: seating\n ? `${seating.name} na ${config.vocabulary.position} ${p.label}`\n : `${config.vocabulary.position} ${p.label} aberta`,\n tone: 'ok',\n })\n // Abrir a mesa e lançar o primeiro item são UM gesto na vida real: ninguém\n // senta a mesa para olhá-la. Ficar no mapa obrigava a mesma mão a achar a\n // aba do cardápio antes de escrever qualquer coisa — um toque cuja única\n // função era desfazer o que a tela acabou de fazer. O cursor vai junto,\n // porque código + Enter é o caminho mais rápido do produto e a comanda\n // recém-aberta é exatamente quando ele importa.\n const catalog = config.menus.find((m) => m.view === 'catalog')\n if (catalog) {\n setMenuId(catalog.id)\n // Depois da pintura: o campo só existe na faixa depois que a view troca.\n requestAnimationFrame(() => commandRef.current?.focus())\n }\n onOpenPosition?.(p.id, guests, attendantId)\n }, [openingPosition, staff, now, seating, onOpenPosition, config.vocabulary.position, config.menus])\n\n // Firing is the verb between \"rung\" and \"cooked\". Wiring it here means the\n // app's action bar declares it like any other action and the screen owns\n // what it does to the ticket.\n /** What an action DOES, once it is allowed to happen. */\n const runAction = useCallback((actionId: string) => {\n if (actionId === 'fire') {\n // Counted before the dispatch, because after it there are no pending\n // lines left to count — and a confirmation for nothing is a lie.\n const at = new Date(now).toISOString()\n const sent = ticketRef.current.lines.filter((l) => (l.state ?? 'pending') === 'pending')\n dispatch({ type: 'fire', at })\n setNotice(sent.length > 0\n ? { text: sent.length === 1 ? '1 item enviado à cozinha' : `${sent.length} itens enviados à cozinha`, tone: 'ok' }\n : { text: 'Nada novo para enviar', tone: 'warn' })\n // The lines as the kitchen got them, already stamped: the app persists\n // what was sent, not what the rail happens to show a second later.\n if (sent.length > 0) {\n const stamp = (l: TicketLine) => ({ ...l, state: 'fired' as const, firedAt: at })\n const whole = ticketRef.current\n void onFire?.(ticketKey, sent.map(stamp), {\n ...whole,\n lines: whole.lines.map((l) => ((l.state ?? 'pending') === 'pending' ? stamp(l) : l)),\n })\n }\n }\n if (actionId === 'close_bill') { void settleBillRef.current() }\n if (actionId === 'split') setSplitting(true)\n if (actionId === 'open_table') {\n const free = zonePositionsRef.current.find((p) => p.status === 'free')\n if (free) setOpeningPosition(free)\n }\n onAction?.(actionId)\n }, [dispatch, now, onAction, onFire, ticketKey])\n\n /**\n * Settling the bill. The screen clears the table only after the app says the\n * money landed: on a refusal the ticket stays exactly as it was, because the\n * alternative is a cleared table and guests already on the pavement.\n */\n const settleBill = useCallback(async () => {\n if (settling) return\n const positionId = ticketKey\n const current = ticketRef.current\n if (current.lines.length === 0) {\n setNotice({ text: `${config.vocabulary.ticket} vazia`, tone: 'warn' })\n return\n }\n // The rail's own button is already shut without one; this is the F10 path,\n // which would otherwise walk straight past the question.\n if (!paymentId) {\n setNotice({ text: 'Escolha a forma de pagamento', tone: 'warn' })\n return\n }\n const bill: PosBill = { ticket: current, totals, paymentMethodId: paymentId }\n setSettling(true)\n try {\n const outcome = await onCloseBill?.(positionId, bill)\n if (outcome === false) {\n setNotice({ text: 'A conta não foi fechada', tone: 'warn' })\n return\n }\n dispatchBook({ type: 'drop', positionId })\n setSettled((prev) => ({ ...prev, [positionId]: true }))\n setOpened((prev) => {\n const { [positionId]: _closed, ...rest } = prev\n return rest\n })\n setPaymentId(undefined)\n setSelectedLineId(undefined)\n setActivePositionId(undefined)\n setRailOpen(false)\n setNotice({\n text: `${activePosition?.label ?? config.vocabulary.ticket} fechada · ${formatCents(bill.totals.totalCents)}`,\n tone: 'ok',\n })\n } catch (error) {\n setNotice({\n text: error instanceof Error ? error.message : 'A conta não foi fechada',\n tone: 'warn',\n })\n } finally {\n setSettling(false)\n }\n }, [settling, ticketKey, paymentId, totals, onCloseBill, config.vocabulary.ticket, activePosition?.label])\n\n /** The gate. An action that demands a PIN never runs before one is given —\n * including from its keyboard shortcut, which is the path that would\n * otherwise skip the whole thing. */\n const handleAction = useCallback((actionId: string) => {\n const action = config.actions.find((a) => a.id === actionId)\n if (action?.requiresPin && verifyPin) { haptic('warn'); setPinFor(action); return }\n haptic('tap')\n runAction(actionId)\n }, [config.actions, verifyPin, runAction])\n\n const shownActions = config.actions.filter(\n (a) => !a.cycles || a.cycles.includes(config.saleCycle),\n )\n\n useEffect(() => { handleActionRef.current = handleAction }, [handleAction])\n useEffect(() => { settleBillRef.current = settleBill }, [settleBill])\n useEffect(() => { zonePositionsRef.current = zonePositions }, [zonePositions])\n useEffect(() => { ticketRef.current = ticket }, [ticket])\n useEffect(() => { seatingRef.current = seating }, [seating])\n\n const openCount = livePositions.filter((p) => p.status !== 'free').length\n\n // No CELULAR a trilha deixa de ser trilha: vira barra de abas no rodapé, e o\n // que não cabe nela vai para uma gaveta \"Mais\". É a forma que o V1 usa no\n // balcão (ver docs/v1-guide/restaurante/pdv-balcao) e a razão é o polegar —\n // de pé atrás do caixa, o canto inferior é o que a mão alcança, e uma coluna\n // de 60px de ícones sem rótulo à esquerda é o canto que ela não alcança.\n //\n // Três visões no rodapé e o resto na gaveta: com quatro alvos a barra ainda\n // tem largura para o rótulo, que é o que separa um ícone de um destino.\n const TABS_ON_PHONE = 3\n const [moreOpen, setMoreOpen] = useState(false)\n // Quantas linhas ainda não foram para a cozinha — o número que decide se a\n // barra resumida cobra uma ação ou só informa.\n const pendingCount = ticket.lines.filter((l) => (l.state ?? 'pending') === 'pending').length\n // GRADE por padrão, sempre — não o que o cadastro diz. `config.positions.\n // layout` descreve a SALA (a planta existe, com as coordenadas das mesas);\n // não descreve a pergunta de quem abre o PDV, que é \"o que está acontecendo\n // nas minhas mesas\" e não \"onde fica a mesa 6\". A planta continua a um\n // toque, e a escolha vale pelo turno.\n const [floorLayout, setFloorLayout] = useState<'grid' | 'plan'>('grid')\n const isPhone = usePhone()\n const wideRail = useWideRail()\n const phoneTabs = config.menus.slice(0, TABS_ON_PHONE)\n const overflowTabs = config.menus.slice(TABS_ON_PHONE)\n\n /* A busca, montada UMA vez e pendurada onde a largura permite: na trilha\n quando ela tem palavras (>1180px), e na faixa da view quando a trilha\n colapsa em ícones ou some no telefone. Uma instância só — o `commandRef`\n é a casa do cursor, e dois inputs com o mesmo ref fariam o Esc devolver o\n foco para o campo errado. */\n const searchField = (\n <label className=\"pos-field\">\n <span className=\"pos-field__icon\"><Search size={17} strokeWidth={2.2} aria-hidden /></span>\n <input\n ref={commandRef}\n value={query}\n onChange={(e) => {\n setQuery(e.target.value)\n // Searching is a catalogue act, so results need the catalogue\n // on screen. Merely focusing the field is not — the caret\n // lives here, and focus alone must never move the view.\n const cat = config.menus.find((m) => m.view === 'catalog')\n if (e.target.value && cat && menu?.view !== 'catalog') setMenuId(cat.id)\n }}\n // \"Buscar\", como no back office. O atalho continua dito pelo\n // chip Esc ao lado e pelo F1.\n placeholder=\"Buscar\"\n aria-label=\"Buscar item por código ou nome\"\n />\n {query ? (\n <button\n type=\"button\"\n className=\"pos-field__clear\"\n onClick={() => { setQuery(''); commandRef.current?.focus() }}\n aria-label=\"Limpar busca\"\n >\n <X size={14} strokeWidth={2.6} />\n </button>\n ) : (\n // Esc is the way back to this field from anywhere; saying so\n // costs one chip and saves the operator from hunting for it.\n <kbd className=\"pos-field__hint\" aria-hidden>Esc</kbd>\n )}\n </label>\n )\n\n return (\n <div\n className={className ? `pos ${className}` : 'pos'}\n // Depois da classe, de propósito: o inquilino é quem tem a última\n // palavra sobre a própria cor.\n style={style}\n // Lido pela folha de estilo para (a) apagar as abas Pedido/Atividade e\n // (b) ceder o canto superior direito ao ✕ do hospedeiro — ver a regra\n // `[data-cart-open]` em styles.css.\n data-cart-open={railOpen || undefined}\n >\n <div className=\"pos-body\">\n <nav className=\"pos-rail\" aria-label=\"Navegação principal\">\n {/* Marca no topo, pessoa no pé — a ordem de qualquer trilha de\n produto, e a mesma do back office de onde este PDV é aberto. Uma\n placa única no alto misturava as duas coisas e ainda escondia os\n atalhos atrás dela. */}\n <div className=\"pos-brand\">\n <span className=\"pos-brand__mark\">{brandMark ?? config.name.slice(0, 1)}</span>\n <span className=\"pos-brand__name\">{brandName ?? config.name}</span>\n </div>\n\n {railTop && <div className=\"pos-rail__top\">{railTop}</div>}\n\n {/* Sob a chave Balcão ⇄ Retaguarda, como no back office: primeiro se\n diz em que lado da casa se está, depois se procura dentro disso.\n Na trilha e não na faixa porque a faixa pertence à VIEW — ali a\n busca do cardápio inteiro era lida como filtro do que está\n aberto. */}\n {wideRail && <div className=\"pos-rail__search\">{searchField}</div>}\n\n\n <div className=\"pos-rail__label pos-t-xs\">Operação</div>\n <div className=\"pos-nav\">\n {config.menus.map((m) => {\n const Icon = MENU_ICON[m.view] ?? ClipboardList\n return (\n <button\n key={m.id}\n className=\"pos-nav__item\"\n aria-current={m.id === menu?.id ? 'page' : undefined}\n onClick={() => setMenuId(m.id)}\n title={m.label}\n >\n <span className=\"pos-nav__icon\"><Icon size={19} strokeWidth={2.1} aria-hidden /></span>\n <span className=\"pos-nav__text\">{m.label}</span>\n {m.badge != null && m.badge > 0 && (\n <span className=\"pos-nav__count pos-num\">{m.badge}</span>\n )}\n </button>\n )\n })}\n </div>\n\n\n {/* O operador, no pé. Só o que ele NÃO sabe fica aqui: em que máquina\n está e se a rede caiu — quem está no teclado ele já sabe, mas o\n nome ancora a linha e é o que a torna a mesma linha do back\n office. Os atalhos viram o ícone ao lado, no lugar de uma placa. */}\n <div className=\"pos-user\" data-state={connection}>\n <span className=\"pos-user__av\">{(operatorName ?? config.name).slice(0, 1)}</span>\n {/* Duas linhas só quando a segunda diz alguma coisa: um terminal\n dedicado se chama \"Caixa 1\" e isso importa; um Balcão aberto de\n dentro do back office não é máquina nenhuma, e a linha viraria um\n ponto solto sob o nome. Sem ela, o ponto acompanha o nome. */}\n <span className=\"pos-user__txt\">\n <span className={terminalName ? 'pos-user__name' : 'pos-user__name pos-user__name--dotted'}>\n {!terminalName && <span className=\"pos-user__dot\" aria-hidden />}\n {operatorName ?? config.name}\n </span>\n {terminalName && (\n <span className=\"pos-user__meta\">\n <span className=\"pos-user__dot\" aria-hidden />\n {terminalName}\n </span>\n )}\n </span>\n <button\n className=\"pos-user__act\"\n onClick={() => setShowKeys(true)}\n aria-label=\"Atalhos\"\n title=\"Atalhos (F1)\"\n >\n <Keyboard size={15} strokeWidth={2.2} aria-hidden />\n </button>\n </div>\n </nav>\n\n <main className=\"pos-main\" ref={mainRef}>\n <div className=\"pos-head\">\n {/* Um título fixo onde a busca estava. Sem ele a faixa esvazia nas\n views sem áreas e a tela inteira sobe 72px ao trocar de menu. */}\n {/* Onde estou: a view, e em qual unidade. Os dois na mesma coluna\n porque são a mesma pergunta — separá-los faria o operador ler\n \"Mesas\" num canto e \"Copacabana\" no outro para montar uma frase\n só. Sem unidades, o título fica sozinho como antes. */}\n <div className=\"pos-head__where\">\n <span className=\"pos-head__title\">{menu?.label}</span>\n {unitSwitcher}\n </div>\n\n {!wideRail && searchField}\n\n {/* Os dois segmentados dividem a MESMA coluna da direita. Soltos,\n cada um pedia `grid-column: 3` e o segundo caía numa linha nova,\n flutuando meio fora da faixa. */}\n <span className=\"pos-head__views\">\n {menu?.view === 'floor' && !isPhone && (\n <span className=\"pos-seg\" role=\"group\" aria-label=\"Como ver as mesas\">\n {([['grid', 'Grade'], ['plan', 'Planta']] as const).map(([value, label]) => (\n <button\n key={value}\n className=\"pos-seg__btn\"\n aria-pressed={floorLayout === value}\n onClick={() => { haptic('tap'); setFloorLayout(value) }}\n >\n {label}\n </button>\n ))}\n </span>\n )}\n\n {menu?.view === 'floor' && (config.positions.zones ?? []).length > 0 && (\n <span className=\"pos-seg\" role=\"group\" aria-label=\"Áreas\">\n {config.positions.zones!.map((z) => (\n <button\n key={z.id}\n className=\"pos-seg__btn\"\n aria-pressed={z.id === activeZoneId}\n onClick={() => setActiveZoneId(z.id)}\n >\n {z.label}\n </button>\n ))}\n </span>\n )}\n </span>\n\n </div>\n\n {menu?.view === 'floor' && loading && <FloorSkeleton />}\n {menu?.view === 'floor' && !loading && (\n <FloorView\n layout={isPhone ? 'grid' : floorLayout}\n positions={zonePositions}\n config={config.positions}\n activeId={activePositionId}\n onSelect={selectPosition}\n now={now}\n picking={seating != null}\n />\n )}\n {menu?.view === 'catalog' && loading && <CatalogSkeleton />}\n {menu?.view === 'catalog' && !loading && (\n <CatalogView\n categories={categories}\n items={items}\n activeCategoryId={activeCategoryId}\n onCategoryChange={(id) => { setActiveCategoryId(id); setQuery('') }}\n quantities={quantities}\n onAdd={addItem}\n onRemove={removeItem}\n query={query}\n />\n )}\n {menu?.view === 'list' && (\n <DeliveryBoard\n orders={livePositions.filter((p) => p.kind === 'delivery')}\n activeId={activePositionId}\n onSelect={selectPosition}\n now={now}\n />\n )}\n {menu?.view === 'reservations' && (\n <ReservationsView\n reservations={reservations.map((r) => ({\n ...r,\n ...(bookings[r.id] ? { status: bookings[r.id]! } : {}),\n ...(seatedAt[r.id] ? { positionId: seatedAt[r.id] } : {}),\n }))}\n positions={livePositions}\n now={now}\n onOpenPosition={(id) => {\n const p = livePositions.find((x) => x.id === id)\n if (p) selectPosition(p)\n }}\n onMarkArrived={(id) => setBookings((prev) => ({ ...prev, [id]: 'arrived' }))}\n onSeat={(reservation) => {\n // Arming, not opening. Which table a party gets is a decision\n // made looking at the room — picking one for the host and\n // showing a modal takes that decision away from the person who\n // can see where the window is and who is about to leave.\n setSeating(reservation)\n const floor = config.menus.find((m) => m.view === 'floor')\n if (floor) setMenuId(floor.id)\n }}\n />\n )}\n {menu?.view === 'shift' && <ShiftView positions={livePositions} staff={staff} />}\n\n <Dock\n positions={livePositions.filter((p) => p.status !== 'free' && p.kind !== 'delivery')}\n activeId={activePositionId}\n onSelect={selectPosition}\n now={now}\n openCount={openCount}\n seating={seating}\n onCancelSeating={() => setSeating(undefined)}\n />\n\n <Notice notice={notice} onDone={() => setNotice(undefined)} />\n </main>\n\n {/* --- casca de CELULAR: abas no rodapé + gaveta \"Mais\" ---------------\n Espelha o PDV do V1 (docs/v1-guide/restaurante/pdv-balcao). Some\n acima de 640px, onde a trilha da esquerda volta a ser a navegação.\n ------------------------------------------------------------------- */}\n {/* A comanda RESUMIDA, acima das abas. No celular a comanda não cabe\n ao lado do catálogo — e escondê-la por completo tirava da vista a\n única coisa que o operador precisa saber enquanto lança: quanto já\n deu e quanto falta mandar. A barra mostra os dois e abre a comanda\n inteira num toque, como no V1. */}\n {ticket.lines.length > 0 && !railOpen && (\n <button\n type=\"button\"\n className=\"pos-cartbar\"\n onClick={() => { haptic('tap'); setRailOpen(true) }}\n aria-expanded={false}\n >\n <span className=\"pos-cartbar__id\">\n <span className=\"pos-cartbar__where\">{activePosition?.label ?? config.vocabulary.ticket}</span>\n <span className=\"pos-cartbar__meta\">\n {ticket.lines.length} {ticket.lines.length === 1 ? 'item' : 'itens'}\n {pendingCount > 0 && ` · ${pendingCount} a enviar`}\n </span>\n </span>\n <span className=\"pos-cartbar__total pos-num\">{formatCents(totals.totalCents)}</span>\n <ChevronUp size={18} strokeWidth={2.4} aria-hidden />\n </button>\n )}\n\n <nav className=\"pos-navbar\" aria-label=\"Visões do PDV\">\n {phoneTabs.map((m) => {\n const Icon = MENU_ICON[m.view] ?? ClipboardList\n return (\n <button\n key={m.id}\n type=\"button\"\n className=\"pos-navbar__item\"\n aria-current={m.id === menu?.id ? 'page' : undefined}\n onClick={() => { haptic('tap'); setMenuId(m.id) }}\n >\n <span className=\"pos-navbar__icon\">\n <Icon size={20} strokeWidth={2.1} aria-hidden />\n {m.badge != null && m.badge > 0 && (\n <span className=\"pos-navbar__count pos-num\">{m.badge}</span>\n )}\n </span>\n <span className=\"pos-navbar__text\">{m.label}</span>\n </button>\n )\n })}\n <button\n type=\"button\"\n className=\"pos-navbar__item\"\n aria-expanded={moreOpen}\n onClick={() => { haptic('tap'); setMoreOpen(true) }}\n >\n <span className=\"pos-navbar__icon\"><MoreHorizontal size={20} strokeWidth={2.1} aria-hidden /></span>\n <span className=\"pos-navbar__text\">Mais</span>\n </button>\n </nav>\n\n {moreOpen && (\n <div className=\"pos-more\" role=\"dialog\" aria-label=\"Mais opções\">\n {/* O escurecido fecha: num telefone a mão já está na tela, e fazer\n voltar só pelo × é um alvo a mais para uma saída óbvia. */}\n <button className=\"pos-more__scrim\" aria-label=\"Fechar menu\" onClick={() => setMoreOpen(false)} />\n <div className=\"pos-more__panel\">\n <div className=\"pos-more__head\">\n <span className=\"pos-brand__mark\">{brandMark ?? config.name.slice(0, 1)}</span>\n <span className=\"pos-brand__name\">{brandName ?? config.name}</span>\n <button\n type=\"button\"\n className=\"pos-more__close\"\n aria-label=\"Fechar menu\"\n onClick={() => setMoreOpen(false)}\n >\n <X size={18} strokeWidth={2.4} />\n </button>\n </div>\n\n {/* A saída para a retaguarda, que na trilha larga mora no topo. */}\n {railTop && <div className=\"pos-more__top\">{railTop}</div>}\n\n {overflowTabs.length > 0 && (\n <div className=\"pos-more__nav\">\n {overflowTabs.map((m) => {\n const Icon = MENU_ICON[m.view] ?? ClipboardList\n return (\n <button\n key={m.id}\n type=\"button\"\n className=\"pos-nav__item\"\n aria-current={m.id === menu?.id ? 'page' : undefined}\n onClick={() => { haptic('tap'); setMenuId(m.id); setMoreOpen(false) }}\n >\n <span className=\"pos-nav__icon\"><Icon size={19} strokeWidth={2.1} aria-hidden /></span>\n <span className=\"pos-nav__text\">{m.label}</span>\n {m.badge != null && m.badge > 0 && (\n <span className=\"pos-nav__count pos-num\">{m.badge}</span>\n )}\n </button>\n )\n })}\n </div>\n )}\n\n {unitSwitcher && <div className=\"pos-more__unit\">{unitSwitcher}</div>}\n\n <div className=\"pos-more__foot\">\n <span className=\"pos-user__av\">{(operatorName ?? config.name).slice(0, 1)}</span>\n <span className=\"pos-user__txt\">{operatorName ?? config.name}</span>\n </div>\n </div>\n </div>\n )}\n\n {activePosition?.kind === 'delivery' ? (\n <DispatchRail\n containerRef={asideRef}\n order={activePosition}\n ticket={ticket}\n totals={totals}\n now={now}\n open={railOpen}\n onAdvance={(to) => {\n setDispatched((prev) => ({ ...prev, [activePosition.id]: to }))\n void onDispatch?.(activePosition.id, to)\n }}\n onCancel={() => handleAction('cancel_order')}\n />\n ) : (\n <>\n {/* O escurecido com desfoque atrás da folha. Só no celular, onde a\n comanda é folha; a CSS o apaga no resto. Fecha ao toque, que é o\n outro gesto que a mão já espera de uma folha. */}\n {railOpen && (\n <button\n className=\"pos-sheet-scrim\"\n aria-label=\"Minimizar a comanda\"\n onClick={() => setRailOpen(false)}\n />\n )}\n <TicketRail\n containerRef={asideRef}\n // Só faz sentido onde a comanda cobre a tela; a CSS esconde a seta\n // acima de 640px, onde ela é uma coluna que nunca sai da frente.\n onCollapse={() => setRailOpen(false)}\n ticket={{\n ...ticket,\n positionLabel: activePosition?.label,\n attendantName: activePosition?.attendantName,\n seatedAt: ticket.seatedAt ?? activePosition?.openedAt,\n }}\n totals={totals}\n vocabulary={config.vocabulary}\n paymentMethods={config.paymentMethods}\n selectedPaymentId={paymentId}\n onSelectPayment={setPaymentId}\n onChangeQuantity={(lineId, delta) => dispatch({ type: 'change_quantity', lineId, delta })}\n selectedLineId={selectedLineId}\n onSelectLine={setSelectedLineId}\n // The method is cleared by the settle, not here: a close that the pool\n // refused must keep the answer the operator already gave.\n onClose={() => handleAction('close_bill')}\n onFire={() => handleAction('fire')}\n fireShortcut={config.actions.find((a) => a.id === 'fire')?.shortcut}\n closeShortcut={config.actions.find((a) => a.id === 'close_bill')?.shortcut}\n onBrowseCatalog={() => {\n const cat = config.menus.find((m) => m.view === 'catalog')\n if (cat) setMenuId(cat.id)\n // A folha DESCE: \"ver cardápio\" é um pedido para olhar o catálogo,\n // e no celular a comanda estava por cima dele. Mandar a pessoa\n // para uma tela e deixá-la coberta é não ter ido a lugar nenhum.\n // Na coluna larga isto é inócuo — lá a comanda nunca tapou nada.\n setRailOpen(false)\n commandRef.current?.focus()\n }}\n alias={activePositionId ? named[activePositionId]?.alias : undefined}\n customerPhone={activePositionId ? named[activePositionId]?.phone : undefined}\n onEditIdentity={activePosition ? () => setNaming(activePosition) : undefined}\n onEditLine={(lineId) => {\n const line = ticket.lines.find((l) => l.id === lineId)\n const item = line && items.find((i) => i.id === line.itemId)\n if (line && item) setEditing({ item, line })\n }}\n guests={activePosition?.seats}\n status={activePosition?.status}\n zoneLabel={config.positions.zones?.find((z) => z.id === activePosition?.zoneId)?.label}\n request={activePosition?.request}\n now={now}\n open={railOpen}\n />\n </>\n )}\n </div>\n\n {showKeys && (\n <ShortcutsOverlay actions={config.actions} onClose={() => setShowKeys(false)} />\n )}\n\n {pinFor && (\n <PinSheet\n actionLabel={pinFor.label}\n onCancel={() => setPinFor(undefined)}\n onVerify={(pin) => verifyPin!(pin, pinFor.id)}\n onGranted={(by) => {\n const id = pinFor.id\n setPinFor(undefined)\n onAuthorised?.(id, by)\n runAction(id)\n }}\n />\n )}\n\n {splitting && (\n <SplitSheet\n ticket={ticket}\n totals={totals}\n guests={activePosition?.seats}\n onCancel={() => setSplitting(false)}\n onConfirm={() => setSplitting(false)}\n />\n )}\n\n {openingPosition && (\n <OpenTableSheet\n position={openingPosition}\n vocabulary={config.vocabulary}\n staff={staff}\n operator={operatorId ? { id: operatorId, name: operatorName ?? operatorId } : undefined}\n defaultSeats={seating?.party}\n seatingName={seating?.name}\n onCancel={() => { setOpeningPosition(undefined); setSeating(undefined) }}\n onConfirm={confirmOpen}\n />\n )}\n\n {naming && (\n <IdentitySheet\n position={{\n ...naming,\n alias: named[naming.id]?.alias ?? naming.alias,\n customerPhone: named[naming.id]?.phone ?? naming.customerPhone,\n }}\n onCancel={() => setNaming(undefined)}\n onSave={(alias, phone) => {\n setNamed((prev) => ({ ...prev, [naming.id]: { alias, phone } }))\n setNaming(undefined)\n }}\n />\n )}\n\n {editing && (\n <ModifierSheet\n item={editing.item}\n mode=\"edit\"\n initial={{ modifiers: editing.line.modifiers, note: editing.line.note }}\n onCancel={() => setEditing(undefined)}\n onConfirm={(modifiers, note) => {\n dispatch({\n type: 'edit_line',\n lineId: editing.line.id,\n modifiers,\n note,\n basePriceCents: editing.line.basePriceCents ?? editing.item.priceCents,\n })\n setEditing(undefined)\n }}\n />\n )}\n\n {pendingItem && (\n <ModifierSheet\n item={pendingItem}\n onCancel={() => setPendingItem(undefined)}\n onConfirm={(modifiers, note) => {\n ring(pendingItem, modifiers, note || undefined)\n setPendingItem(undefined)\n }}\n />\n )}\n\n </div>\n )\n}\n\n/** SVG, not an emoji — an emoji is font-dependent and cannot take currentColor. */\nfunction LockGlyph() {\n return (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\n strokeWidth=\"2.4\" strokeLinecap=\"round\" aria-hidden focusable=\"false\">\n <rect x=\"4\" y=\"11\" width=\"16\" height=\"10\" rx=\"2\" />\n <path d=\"M8 11V7a4 4 0 0 1 8 0v4\" />\n </svg>\n )\n}\n\nfunction Dock({ positions, activeId, onSelect, now, openCount, seating, onCancelSeating }: {\n positions: PosPosition[]\n activeId?: string\n onSelect: (p: PosPosition) => void\n now: number\n openCount: number\n /** A party waiting for a table, held here until one is picked. */\n seating?: PosReservation\n onCancelSeating?: () => void\n}) {\n // With eight tables open the active chip can be off the end of the strip, and\n // the operator has no reason to suspect the row scrolls at all. Bringing it\n // into view is how \"which table am I on\" stays answerable.\n const activeRef = useRef<HTMLButtonElement>(null)\n useEffect(() => {\n const el = activeRef.current\n if (!el) return\n const still = window.matchMedia('(prefers-reduced-motion: reduce)').matches\n el.scrollIntoView?.({\n behavior: still ? 'auto' : 'smooth',\n block: 'nearest',\n inline: 'nearest',\n })\n }, [activeId])\n\n if (positions.length === 0 && !seating) return null\n return (\n <footer className=\"pos-dock pos-scroll-x\" aria-label={`${openCount} comandas abertas`}>\n {seating && (\n <div className=\"pos-seating\" role=\"status\">\n <span className=\"pos-seating__pulse\" aria-hidden />\n <span>\n <span className=\"pos-seating__t\">{seating.name}</span>\n <span className=\"pos-seating__s pos-num\">\n {seating.party} pessoas · escolha a mesa\n </span>\n </span>\n <button\n className=\"pos-seating__x\"\n onClick={onCancelSeating}\n aria-label=\"Cancelar a acomodação\"\n >\n <X size={15} strokeWidth={2.4} />\n </button>\n </div>\n )}\n {positions.map((p) => (\n <button\n key={p.id}\n ref={p.id === activeId ? activeRef : undefined}\n className=\"pos-dchip\"\n data-status={p.status}\n aria-current={p.id === activeId}\n onClick={() => onSelect(p)}\n >\n <span className=\"pos-dchip__tag pos-num\">\n {p.label.replace(/\\D/g, '').slice(-3) || p.label.slice(0, 2)}\n </span>\n <span>\n <span className=\"pos-dchip__t\">{p.attendantName ?? p.label}</span>\n <span className=\"pos-dchip__s pos-num\">\n {p.totalCents != null && formatCents(p.totalCents)}\n {elapsed(p.openedAt, now) && ` · ${elapsed(p.openedAt, now)}`}\n </span>\n </span>\n {p.status !== 'occupied' && (\n /* A glyph, not a word: on a strip of five the word is the widest\n thing in the row and it repeats what the colour already said.\n `title` keeps it readable for anyone who needs the word. */\n <span\n className=\"pos-dchip__st\"\n data-status={p.status}\n title={p.status === 'bill_requested' ? 'Conta pedida' : 'Atenção'}\n aria-label={p.status === 'bill_requested' ? 'Conta pedida' : 'Atenção'}\n >\n {p.status === 'bill_requested'\n ? <Receipt size={14} strokeWidth={2.3} aria-hidden />\n : <AlertTriangle size={14} strokeWidth={2.3} aria-hidden />}\n </span>\n )}\n </button>\n ))}\n </footer>\n )\n}\n"]}
|