@fayz-ai/pos 0.20.5 → 0.21.0

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.
Files changed (185) hide show
  1. package/dist/app/config.d.ts +216 -4
  2. package/dist/app/config.d.ts.map +1 -1
  3. package/dist/index.d.ts +101 -0
  4. package/dist/index.d.ts.map +1 -1
  5. package/dist/index.js +10849 -2517
  6. package/dist/index.js.map +1 -1
  7. package/dist/lib/useFloorBell.d.ts +21 -0
  8. package/dist/lib/useFloorBell.d.ts.map +1 -0
  9. package/dist/screen/AreaInspector.d.ts +19 -0
  10. package/dist/screen/AreaInspector.d.ts.map +1 -0
  11. package/dist/screen/AreaOutlineSheet.d.ts +15 -0
  12. package/dist/screen/AreaOutlineSheet.d.ts.map +1 -0
  13. package/dist/screen/ArrangeSheet.d.ts +8 -0
  14. package/dist/screen/ArrangeSheet.d.ts.map +1 -0
  15. package/dist/screen/AuthorizeSheet.d.ts +73 -0
  16. package/dist/screen/AuthorizeSheet.d.ts.map +1 -0
  17. package/dist/screen/CancelSheet.d.ts +35 -0
  18. package/dist/screen/CancelSheet.d.ts.map +1 -0
  19. package/dist/screen/ClosedPanel.d.ts +55 -0
  20. package/dist/screen/ClosedPanel.d.ts.map +1 -0
  21. package/dist/screen/ConfirmSheet.d.ts +12 -0
  22. package/dist/screen/ConfirmSheet.d.ts.map +1 -0
  23. package/dist/screen/CourtesySheet.d.ts +23 -0
  24. package/dist/screen/CourtesySheet.d.ts.map +1 -0
  25. package/dist/screen/CoverChargeSheet.d.ts +16 -0
  26. package/dist/screen/CoverChargeSheet.d.ts.map +1 -0
  27. package/dist/screen/DeliveryBoard.d.ts +13 -0
  28. package/dist/screen/DeliveryBoard.d.ts.map +1 -1
  29. package/dist/screen/DiscountSheet.d.ts +85 -0
  30. package/dist/screen/DiscountSheet.d.ts.map +1 -0
  31. package/dist/screen/DispatchRail.d.ts.map +1 -1
  32. package/dist/screen/FloorScopeBanner.d.ts +11 -0
  33. package/dist/screen/FloorScopeBanner.d.ts.map +1 -0
  34. package/dist/screen/GuestBar.d.ts +51 -0
  35. package/dist/screen/GuestBar.d.ts.map +1 -0
  36. package/dist/screen/GuestCountSheet.d.ts +16 -0
  37. package/dist/screen/GuestCountSheet.d.ts.map +1 -0
  38. package/dist/screen/IdentitySheet.d.ts.map +1 -1
  39. package/dist/screen/ModifierSheet.d.ts.map +1 -1
  40. package/dist/screen/OpenTableSheet.d.ts.map +1 -1
  41. package/dist/screen/PinSheet.d.ts.map +1 -1
  42. package/dist/screen/PlanStage.d.ts +130 -0
  43. package/dist/screen/PlanStage.d.ts.map +1 -0
  44. package/dist/screen/PosScreen.d.ts +350 -3
  45. package/dist/screen/PosScreen.d.ts.map +1 -1
  46. package/dist/screen/ServiceChargeSheet.d.ts +98 -0
  47. package/dist/screen/ServiceChargeSheet.d.ts.map +1 -0
  48. package/dist/screen/SheetLayer.d.ts +8 -0
  49. package/dist/screen/SheetLayer.d.ts.map +1 -0
  50. package/dist/screen/ShiftPanel.d.ts +45 -0
  51. package/dist/screen/ShiftPanel.d.ts.map +1 -0
  52. package/dist/screen/ShortcutsOverlay.d.ts.map +1 -1
  53. package/dist/screen/SplitSheet.d.ts.map +1 -1
  54. package/dist/screen/TableInspector.d.ts +22 -0
  55. package/dist/screen/TableInspector.d.ts.map +1 -0
  56. package/dist/screen/TicketRail.d.ts +175 -2
  57. package/dist/screen/TicketRail.d.ts.map +1 -1
  58. package/dist/screen/TransferHistorySheet.d.ts +17 -0
  59. package/dist/screen/TransferHistorySheet.d.ts.map +1 -0
  60. package/dist/screen/TransferSheet.d.ts +65 -0
  61. package/dist/screen/TransferSheet.d.ts.map +1 -0
  62. package/dist/screen/UnassignedTables.d.ts +14 -0
  63. package/dist/screen/UnassignedTables.d.ts.map +1 -0
  64. package/dist/screen/WaitlistEntrySheet.d.ts +23 -0
  65. package/dist/screen/WaitlistEntrySheet.d.ts.map +1 -0
  66. package/dist/screen/WaitlistView.d.ts +41 -0
  67. package/dist/screen/WaitlistView.d.ts.map +1 -0
  68. package/dist/screen/ZoneDrawLayer.d.ts +11 -0
  69. package/dist/screen/ZoneDrawLayer.d.ts.map +1 -0
  70. package/dist/screen/ZoneHandles.d.ts +18 -0
  71. package/dist/screen/ZoneHandles.d.ts.map +1 -0
  72. package/dist/screen/ZoneInspector.d.ts +27 -0
  73. package/dist/screen/ZoneInspector.d.ts.map +1 -0
  74. package/dist/screen/accountFit.d.ts +17 -0
  75. package/dist/screen/accountFit.d.ts.map +1 -0
  76. package/dist/screen/accountPick.d.ts +16 -0
  77. package/dist/screen/accountPick.d.ts.map +1 -0
  78. package/dist/screen/areaOutline.d.ts +59 -0
  79. package/dist/screen/areaOutline.d.ts.map +1 -0
  80. package/dist/screen/arrangePlan.d.ts +109 -0
  81. package/dist/screen/arrangePlan.d.ts.map +1 -0
  82. package/dist/screen/arrangeTables.d.ts +69 -0
  83. package/dist/screen/arrangeTables.d.ts.map +1 -0
  84. package/dist/screen/billPrint.d.ts +66 -0
  85. package/dist/screen/billPrint.d.ts.map +1 -0
  86. package/dist/screen/cancelCheck.d.ts +31 -0
  87. package/dist/screen/cancelCheck.d.ts.map +1 -0
  88. package/dist/screen/cardBrand.d.ts +44 -0
  89. package/dist/screen/cardBrand.d.ts.map +1 -0
  90. package/dist/screen/cashGate.d.ts +31 -0
  91. package/dist/screen/cashGate.d.ts.map +1 -0
  92. package/dist/screen/catalogEmpty.d.ts +13 -0
  93. package/dist/screen/catalogEmpty.d.ts.map +1 -0
  94. package/dist/screen/categoryIcon.d.ts +4 -0
  95. package/dist/screen/categoryIcon.d.ts.map +1 -0
  96. package/dist/screen/channelSlot.d.ts +93 -0
  97. package/dist/screen/channelSlot.d.ts.map +1 -0
  98. package/dist/screen/comandaChannel.d.ts +25 -0
  99. package/dist/screen/comandaChannel.d.ts.map +1 -0
  100. package/dist/screen/courtesyGate.d.ts +31 -0
  101. package/dist/screen/courtesyGate.d.ts.map +1 -0
  102. package/dist/screen/coverQuantities.d.ts +46 -0
  103. package/dist/screen/coverQuantities.d.ts.map +1 -0
  104. package/dist/screen/deliveryColumns.d.ts +54 -0
  105. package/dist/screen/deliveryColumns.d.ts.map +1 -0
  106. package/dist/screen/discardCheck.d.ts +8 -0
  107. package/dist/screen/discardCheck.d.ts.map +1 -0
  108. package/dist/screen/discountBook.d.ts +40 -0
  109. package/dist/screen/discountBook.d.ts.map +1 -0
  110. package/dist/screen/discountCap.d.ts +9 -0
  111. package/dist/screen/discountCap.d.ts.map +1 -0
  112. package/dist/screen/discountSelectable.d.ts +20 -0
  113. package/dist/screen/discountSelectable.d.ts.map +1 -0
  114. package/dist/screen/dockScope.d.ts +9 -0
  115. package/dist/screen/dockScope.d.ts.map +1 -0
  116. package/dist/screen/fiscalSeal.d.ts +40 -0
  117. package/dist/screen/fiscalSeal.d.ts.map +1 -0
  118. package/dist/screen/floorEmpty.d.ts +20 -0
  119. package/dist/screen/floorEmpty.d.ts.map +1 -0
  120. package/dist/screen/floorGeometry.d.ts +295 -0
  121. package/dist/screen/floorGeometry.d.ts.map +1 -0
  122. package/dist/screen/floorScope.d.ts +49 -0
  123. package/dist/screen/floorScope.d.ts.map +1 -0
  124. package/dist/screen/floorStale.d.ts +5 -0
  125. package/dist/screen/floorStale.d.ts.map +1 -0
  126. package/dist/screen/guestCount.d.ts +28 -0
  127. package/dist/screen/guestCount.d.ts.map +1 -0
  128. package/dist/screen/guestCountOnClose.d.ts +11 -0
  129. package/dist/screen/guestCountOnClose.d.ts.map +1 -0
  130. package/dist/screen/ledgerMethod.d.ts +11 -0
  131. package/dist/screen/ledgerMethod.d.ts.map +1 -0
  132. package/dist/screen/menuFreshness.d.ts +18 -0
  133. package/dist/screen/menuFreshness.d.ts.map +1 -0
  134. package/dist/screen/menuSearch.d.ts +55 -0
  135. package/dist/screen/menuSearch.d.ts.map +1 -0
  136. package/dist/screen/modifierCheck.d.ts +23 -0
  137. package/dist/screen/modifierCheck.d.ts.map +1 -0
  138. package/dist/screen/openChannelCounts.d.ts +26 -0
  139. package/dist/screen/openChannelCounts.d.ts.map +1 -0
  140. package/dist/screen/orderRef.d.ts +17 -0
  141. package/dist/screen/orderRef.d.ts.map +1 -0
  142. package/dist/screen/paymentList.d.ts +26 -0
  143. package/dist/screen/paymentList.d.ts.map +1 -0
  144. package/dist/screen/pinGate.d.ts +28 -0
  145. package/dist/screen/pinGate.d.ts.map +1 -0
  146. package/dist/screen/reopen.d.ts +36 -0
  147. package/dist/screen/reopen.d.ts.map +1 -0
  148. package/dist/screen/searchSubject.d.ts +22 -0
  149. package/dist/screen/searchSubject.d.ts.map +1 -0
  150. package/dist/screen/serviceChargeCheck.d.ts +29 -0
  151. package/dist/screen/serviceChargeCheck.d.ts.map +1 -0
  152. package/dist/screen/serviceChargeGuard.d.ts +145 -0
  153. package/dist/screen/serviceChargeGuard.d.ts.map +1 -0
  154. package/dist/screen/servicePreview.d.ts +35 -0
  155. package/dist/screen/servicePreview.d.ts.map +1 -0
  156. package/dist/screen/session.d.ts +207 -0
  157. package/dist/screen/session.d.ts.map +1 -1
  158. package/dist/screen/sheetSubtitle.d.ts +8 -0
  159. package/dist/screen/sheetSubtitle.d.ts.map +1 -0
  160. package/dist/screen/shift.d.ts +97 -0
  161. package/dist/screen/shift.d.ts.map +1 -0
  162. package/dist/screen/specialReuse.d.ts +45 -0
  163. package/dist/screen/specialReuse.d.ts.map +1 -0
  164. package/dist/screen/svgDrag.d.ts +24 -0
  165. package/dist/screen/svgDrag.d.ts.map +1 -0
  166. package/dist/screen/tableTone.d.ts +64 -0
  167. package/dist/screen/tableTone.d.ts.map +1 -0
  168. package/dist/screen/transferDone.d.ts +12 -0
  169. package/dist/screen/transferDone.d.ts.map +1 -0
  170. package/dist/screen/transferGuestBlock.d.ts +30 -0
  171. package/dist/screen/transferGuestBlock.d.ts.map +1 -0
  172. package/dist/screen/transferPick.d.ts +51 -0
  173. package/dist/screen/transferPick.d.ts.map +1 -0
  174. package/dist/screen/views.d.ts +139 -4
  175. package/dist/screen/views.d.ts.map +1 -1
  176. package/dist/screen/waitlist.d.ts +211 -0
  177. package/dist/screen/waitlist.d.ts.map +1 -0
  178. package/dist/screen/writeFailure.d.ts +22 -0
  179. package/dist/screen/writeFailure.d.ts.map +1 -0
  180. package/dist/screen/zoneDraft.d.ts +75 -0
  181. package/dist/screen/zoneDraft.d.ts.map +1 -0
  182. package/dist/screen/zoneEditing.d.ts +56 -0
  183. package/dist/screen/zoneEditing.d.ts.map +1 -0
  184. package/dist/styles.css +2697 -200
  185. 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","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"]}
1
+ {"version":3,"sources":["../src/screen/floorGeometry.ts","../src/screen/cancelCheck.ts","../src/screen/dockScope.ts","../src/screen/courtesyGate.ts","../src/screen/searchSubject.ts","../src/screen/discardCheck.ts","../src/screen/TableInspector.tsx","../src/screen/shift.ts","../src/screen/UnassignedTables.tsx","../src/screen/tableTone.ts","../src/screen/accountFit.ts","../src/screen/cardBrand.ts","../src/screen/money.ts","../src/screen/session.ts","../src/screen/channelSlot.ts","../src/screen/comandaChannel.ts","../src/screen/serviceChargeGuard.ts","../src/lib/useSwipeAway.ts","../src/screen/paymentList.ts","../src/screen/SheetLayer.tsx","../src/screen/GuestBar.tsx","../src/screen/svgDrag.ts","../src/screen/ZoneDrawLayer.tsx","../src/screen/zoneDraft.ts","../src/screen/zoneEditing.ts","../src/screen/ZoneHandles.tsx","../src/screen/PlanStage.tsx","../src/screen/menuSearch.ts","../src/screen/catalogEmpty.ts","../src/screen/floorEmpty.ts","../src/screen/categoryIcon.ts","../src/screen/views.tsx","../src/screen/reopen.ts","../src/screen/fiscalSeal.ts","../src/screen/ClosedPanel.tsx","../src/screen/TicketRail.tsx","../src/screen/menuFreshness.ts","../src/screen/deliveryColumns.ts","../src/screen/DeliveryBoard.tsx","../src/screen/DispatchRail.tsx","../src/screen/ShortcutsOverlay.tsx","../src/screen/ReservationsView.tsx","../src/screen/waitlist.ts","../src/screen/WaitlistView.tsx","../src/screen/WaitlistEntrySheet.tsx","../src/screen/modifierCheck.ts","../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/pinGate.ts","../src/screen/floorStale.ts","../src/screen/ZoneInspector.tsx","../src/screen/arrangeTables.ts","../src/screen/arrangePlan.ts","../src/screen/ArrangeSheet.tsx","../src/screen/AreaInspector.tsx","../src/screen/floorScope.ts","../src/screen/FloorScopeBanner.tsx","../src/screen/areaOutline.ts","../src/screen/AreaOutlineSheet.tsx","../src/screen/writeFailure.ts","../src/screen/PosScreen.tsx","../src/screen/discountSelectable.ts","../src/screen/discountBook.ts","../src/screen/discountCap.ts","../src/screen/sheetSubtitle.ts","../src/screen/DiscountSheet.tsx","../src/screen/servicePreview.ts","../src/screen/ServiceChargeSheet.tsx","../src/screen/guestCount.ts","../src/screen/GuestCountSheet.tsx","../src/screen/coverQuantities.ts","../src/screen/CoverChargeSheet.tsx","../src/screen/guestCountOnClose.ts","../src/screen/specialReuse.ts","../src/screen/CancelSheet.tsx","../src/screen/transferPick.ts","../src/screen/transferGuestBlock.ts","../src/screen/TransferSheet.tsx","../src/screen/CourtesySheet.tsx","../src/lib/useFloorBell.ts","../src/screen/billPrint.ts","../src/screen/serviceChargeCheck.ts","../src/screen/ShiftPanel.tsx","../src/screen/AuthorizeSheet.tsx","../src/screen/TransferHistorySheet.tsx","../src/screen/ConfirmSheet.tsx","../src/screen/orderRef.ts","../src/screen/openChannelCounts.ts","../src/screen/transferDone.ts","../src/screen/ledgerMethod.ts","../src/screen/accountPick.ts","../src/screen/cashGate.ts"],"names":["hora","jsxs","jsx","plain","useState","useRef","useEffect","round2","useCallback","Fragment","TableGlyph","semAcento","Utensils","Map","Receipt","ChevronRight","User","Check","Plus","AlertTriangle","Clock","Minus","ChefHat","MapPin","Bike","clock","X","STATUS","Users","Phone","Search","UserRound","UserPlus","useMemo","ShieldCheck","parts","spread","Crosshair","Trash2","cols","rows","MapPinOff","r2","FORMATOS","PencilRuler","LayoutGrid","UtensilsCrossed","Banknote","CalendarClock","seatedAt","items","Keyboard","MapIcon","Pencil","ChevronUp","MoreHorizontal","ChevronDown","memo","Percent","next","quando","Delete","Package","ArrowLeftRight"],"mappings":"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","file":"index.js","sourcesContent":["// ---------------------------------------------------------------------------\n// A planta baixa em METROS.\n//\n// Portado de `beautyplace/src/lib/salao/floorGeometry.ts`. Geometria pura —\n// sem React, sem banco. O V2 desenhava o salão como uma GRADE de células, e\n// uma grade não responde as perguntas que o gerente faz da planta: \"esta mesa\n// está na varanda?\", \"cabe mais uma de quatro aqui?\", \"de quem é aquele\n// canto?\". Um salão real tem metros, e a praça tem forma.\n//\n// A razão de este arquivo ser puro e testado está escrita no V1:\n//\n// **O banco replica estas mesmas contas em SQL** — o gatilho que decide de\n// que praça é cada mesa faz retângulo por bbox, elipse inscrita e polígono\n// por ray casting, exatamente como aqui. O teste de cada função é o contrato\n// entre os dois: se divergirem, a tela mostra a mesa numa praça e a escala\n// manda o garçom para outra.\n//\n// Por isso `pointInArea` é PREVIEW, nunca decisão gravada: quem decide é o\n// banco. O cliente só antecipa o que ele vai dizer.\n// ---------------------------------------------------------------------------\n\nexport interface Point { x: number; y: number }\nexport interface Box { x: number; y: number; w: number; h: number }\n\nexport type AreaShape = 'rect' | 'ellipse' | 'polygon'\nexport type TableShape = 'round' | 'rectangle' | 'square'\n\n/** Uma praça: o pedaço do salão que um garçom atende. */\nexport interface FloorArea {\n id: string\n name: string\n color?: string | null\n shape?: AreaShape | null\n posX?: number | null\n posY?: number | null\n widthM?: number | null\n heightM?: number | null\n polygon?: Point[] | null\n}\n\nexport interface FloorTable {\n id: string\n label: string\n areaId?: string | null\n shape?: TableShape | null\n posX?: number | null\n posY?: number | null\n widthM?: number | null\n heightM?: number | null\n diameterM?: number | null\n seats?: number | null\n rotation?: number | null\n}\n\n/** Bbox LOCAL da praça: no polígono, o mínimo e o tamanho dos pontos. */\nexport function areaBounds(a: Pick<FloorArea, 'shape' | 'widthM' | 'heightM' | 'polygon'>) {\n if (a.shape === 'polygon' && a.polygon && a.polygon.length >= 3) {\n let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity\n for (const p of a.polygon) {\n if (p.x < minX) minX = p.x\n if (p.y < minY) minY = p.y\n if (p.x > maxX) maxX = p.x\n if (p.y > maxY) maxY = p.y\n }\n return { width: maxX - minX, height: maxY - minY, minX, minY }\n }\n return { width: Number(a.widthM) || 0, height: Number(a.heightM) || 0, minX: 0, minY: 0 }\n}\n\n/**\n * Enfileira as praças num tabuleiro virtual, quebrando linha a cada `maxRowW`\n * metros. É o arranjo que vale enquanto ninguém arrastou nada.\n */\nexport function layoutAreas<T extends Pick<FloorArea, 'shape' | 'widthM' | 'heightM' | 'polygon'>>(\n areas: T[], gap = 1, maxRowW = 22,\n): Array<{ area: T; offsetX: number; offsetY: number; w: number; h: number }> {\n const out: Array<{ area: T; offsetX: number; offsetY: number; w: number; h: number }> = []\n let x = 0, y = 0, rowH = 0\n for (const a of areas) {\n const b = areaBounds(a)\n if (x + b.width > maxRowW && x > 0) { y += rowH + gap; x = 0; rowH = 0 }\n out.push({ area: a, offsetX: x, offsetY: y, w: b.width, h: b.height })\n x += b.width + gap\n if (b.height > rowH) rowH = b.height\n }\n return out\n}\n\n/**\n * Uma praça em (0,0) está CERTA; várias, todas em (0,0), não.\n *\n * Enquanto ninguém arrastou, o banco tem tudo na origem. Com uma só, essa\n * posição é a verdade. Com mais de uma, todas empilhadas no mesmo canto, a\n * posição gravada não vale nada e o arranjo automático entra no lugar —\n * senão o salão inteiro desenha por cima de si mesmo.\n */\nexport function needsAutoLayout(areas: Array<Pick<FloorArea, 'posX' | 'posY'>>): boolean {\n return areas.length > 1 && areas.every((a) => Number(a.posX) === 0 && Number(a.posY) === 0)\n}\n\nexport interface PlacedArea { area: FloorArea; origin: Point; box: Box }\n\n/** Resolve a origem e o bbox global de cada praça. */\nexport function placeAreas(areas: FloorArea[]): PlacedArea[] {\n if (needsAutoLayout(areas)) {\n return layoutAreas(areas).map((l) => ({\n area: l.area,\n origin: { x: l.offsetX, y: l.offsetY },\n box: { x: l.offsetX, y: l.offsetY, w: l.w, h: l.h },\n }))\n }\n return areas.map((a) => {\n const b = areaBounds(a)\n const origin = { x: Number(a.posX) || 0, y: Number(a.posY) || 0 }\n return { area: a, origin, box: { x: origin.x, y: origin.y, w: b.width, h: b.height } }\n })\n}\n\n/** O polígono da praça em coordenadas locais (origem no canto do bbox). */\nexport function localPolygon(a: Pick<FloorArea, 'shape' | 'widthM' | 'heightM' | 'polygon'>): Point[] {\n if (a.shape !== 'polygon' || !a.polygon || a.polygon.length < 3) return []\n const b = areaBounds(a)\n return a.polygon.map((p) => ({ x: p.x - b.minX, y: p.y - b.minY }))\n}\n\n/** Centro da mesa no mundo: origem da praça + a posição local dela. */\nexport function tableCenter(t: Pick<FloorTable, 'posX' | 'posY'>, origin: Point): Point {\n return { x: origin.x + (Number(t.posX) || 0), y: origin.y + (Number(t.posY) || 0) }\n}\n\n/** Tamanho do TAMPO, sem as cadeiras. A redonda usa o diâmetro nos dois eixos. */\nexport function tableSize(\n t: Pick<FloorTable, 'shape' | 'widthM' | 'heightM' | 'diameterM'>,\n): { w: number; h: number } {\n const MIN = 0.4\n if (t.shape === 'round') {\n const d = Math.max(MIN, Number(t.diameterM) || 0)\n return { w: d, h: d }\n }\n return { w: Math.max(MIN, Number(t.widthM) || 0), h: Math.max(MIN, Number(t.heightM) || 0) }\n}\n\n/**\n * Onde sentam as cadeiras, em metros, relativas ao CANTO superior esquerdo do\n * tampo. A redonda espalha em círculo; a retangular distribui pelo perímetro,\n * proporcional a cada lado — é o que faz uma mesa de 1,40 × 0,80 pôr duas\n * cadeiras de cada lado comprido e uma em cada ponta, como na vida.\n */\nexport function chairPositions(\n shape: TableShape, seats: number, w: number, h: number,\n): Array<{ x: number; y: number; rot: number }> {\n const s = Math.max(0, Math.floor(seats))\n const chairs: Array<{ x: number; y: number; rot: number }> = []\n if (s === 0) return chairs\n const offset = 0.28\n\n if (shape === 'round') {\n const r = w / 2 + offset\n for (let i = 0; i < s; i += 1) {\n const a = (i / s) * Math.PI * 2 - Math.PI / 2\n chairs.push({\n x: Math.cos(a) * r + w / 2,\n y: Math.sin(a) * r + h / 2,\n rot: (a * 180) / Math.PI + 90,\n })\n }\n return chairs\n }\n\n const perim = 2 * (w + h)\n const wRatio = w / perim\n const hRatio = h / perim\n const top = Math.round(s * wRatio)\n const bottom = Math.round(s * wRatio)\n const left = Math.round(s * hRatio)\n let right = s - top - bottom - left\n let topFix = top\n if (right < 0) { topFix += right; right = 0 }\n\n const place = (count: number, side: 'top' | 'right' | 'bottom' | 'left') => {\n for (let i = 0; i < count; i += 1) {\n const t = (i + 1) / (count + 1)\n if (side === 'top') chairs.push({ x: w * t, y: -offset, rot: 0 })\n if (side === 'bottom') chairs.push({ x: w * t, y: h + offset, rot: 180 })\n if (side === 'left') chairs.push({ x: -offset, y: h * t, rot: 270 })\n if (side === 'right') chairs.push({ x: w + offset, y: h * t, rot: 90 })\n }\n }\n place(topFix, 'top')\n place(bottom, 'bottom')\n place(left, 'left')\n place(right, 'right')\n return chairs\n}\n\n/** Menor retângulo que contém todos. `null` sem entrada. */\nexport function unionBox(boxes: Box[]): Box | null {\n if (boxes.length === 0) return null\n let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity\n for (const b of boxes) {\n if (b.x < minX) minX = b.x\n if (b.y < minY) minY = b.y\n if (b.x + b.w > maxX) maxX = b.x + b.w\n if (b.y + b.h > maxY) maxY = b.y + b.h\n }\n return { x: minX, y: minY, w: maxX - minX, h: maxY - minY }\n}\n\n/** O mundo inteiro da unidade; sem praça nenhuma, um pátio de 10 × 10 m. */\nexport function floorBox(placed: PlacedArea[]): Box {\n return unionBox(placed.map((p) => p.box)) ?? { x: 0, y: 0, w: 10, h: 10 }\n}\n\n/**\n * O viewBox que ENQUADRA `target` num palco de proporção `aspect`.\n *\n * Alarga ou alteia o alvo, centrado, até bater com a proporção do palco. É o\n * que impede a mesa redonda de virar elipse quando o tablet gira.\n */\nexport function fitViewBox(target: Box, aspect: number, marginFrac = 0.08, marginMin = 0.5): Box {\n const ratio = aspect > 0 && Number.isFinite(aspect) ? aspect : 1\n const mx = Math.max(marginMin, target.w * marginFrac)\n const my = Math.max(marginMin, target.h * marginFrac)\n let w = Math.max(target.w + mx * 2, 0.001)\n let h = Math.max(target.h + my * 2, 0.001)\n if (w / h < ratio) w = h * ratio\n else h = w / ratio\n const cx = target.x + target.w / 2\n const cy = target.y + target.h / 2\n return { x: cx - w / 2, y: cy - h / 2, w, h }\n}\n\nexport function pointInRect(p: Point, box: Box): boolean {\n return p.x >= box.x && p.x <= box.x + box.w && p.y >= box.y && p.y <= box.y + box.h\n}\n\n/** Elipse inscrita no bbox. A fronteira conta como dentro. */\nexport function pointInEllipse(p: Point, box: Box): boolean {\n const rx = box.w / 2\n const ry = box.h / 2\n if (rx <= 0 || ry <= 0) return false\n const dx = (p.x - (box.x + rx)) / rx\n const dy = (p.y - (box.y + ry)) / ry\n return dx * dx + dy * dy <= 1 + 1e-9\n}\n\n/** Ray casting (par/ímpar), em coordenadas do mundo. */\nexport function pointInPolygon(p: Point, poly: Point[]): boolean {\n if (poly.length < 3) return false\n let dentro = false\n for (let i = 0, j = poly.length - 1; i < poly.length; j = i++) {\n const xi = poly[i].x, yi = poly[i].y, xj = poly[j].x, yj = poly[j].y\n const cruza = (yi > p.y) !== (yj > p.y) && p.x < ((xj - xi) * (p.y - yi)) / (yj - yi) + xi\n if (cruza) dentro = !dentro\n }\n return dentro\n}\n\nexport function areaBox(a: Pick<FloorArea, 'posX' | 'posY' | 'widthM' | 'heightM'>): Box {\n return {\n x: Number(a.posX) || 0, y: Number(a.posY) || 0,\n w: Number(a.widthM) || 0, h: Number(a.heightM) || 0,\n }\n}\n\n/**\n * O ponto está dentro da praça?\n *\n * **PREVIEW no cliente** — a verdade é o gatilho do banco, que faz exatamente\n * esta conta. O cliente só antecipa o que ele vai dizer; divergir daqui faria\n * a tela mostrar a mesa numa praça e a escala mandar o garçom para outra.\n */\nexport function pointInArea(pt: Point, a: FloorArea): boolean {\n const box = areaBox(a)\n if (a.shape === 'ellipse') return pointInEllipse(pt, box)\n if (a.shape === 'polygon' && a.polygon && a.polygon.length >= 3) {\n return pointInRect(pt, box) && pointInPolygon(pt, a.polygon)\n }\n return pointInRect(pt, box)\n}\n\n/**\n * Qual praça contém o ponto. Com sobreposição vale a ÚLTIMA da ordem dada —\n * é a que o SVG pinta por cima, e é nela que o olho vê a mesa.\n */\nexport function areaAtPoint(p: Point, areas: FloorArea[]): FloorArea | null {\n for (let i = areas.length - 1; i >= 0; i -= 1) if (pointInArea(p, areas[i])) return areas[i]\n return null\n}\n\n/** Tamanho padrão do tampo por formato — o mesmo do cadastro de mesas. */\nexport const TABLE_SHAPE_DIMS: Record<TableShape, { widthM: number; heightM: number; diameterM: number }> = {\n round: { diameterM: 0.9, widthM: 0.9, heightM: 0.9 },\n rectangle: { widthM: 1.4, heightM: 0.8, diameterM: 0.9 },\n square: { widthM: 0.9, heightM: 0.9, diameterM: 0.9 },\n}\n\n/**\n * As medidas de um formato — para QUALQUER texto que o banco guarde.\n *\n * O cadastro não fala só os três formatos do desenho: o Pertinho tem um\n * `bar` entre 208 mesas, e `TABLE_SHAPE_DIMS['bar']` é `undefined`. Ler\n * `.widthM` dali derrubou a tela inteira por causa de UMA mesa — e a pilha\n * apontava para o `.map`, não para o cadastro.\n *\n * O balcão cai em retangular, que é a forma que ele tem no chão.\n */\nexport function tableDims(shape?: string | null) {\n return TABLE_SHAPE_DIMS[(shape ?? 'rectangle') as TableShape] ?? TABLE_SHAPE_DIMS.rectangle\n}\n\n// ═══════════════════════════════════════════════════════════════════════════\n// EDITAR a planta\n// ═══════════════════════════════════════════════════════════════════════════\n//\n// Portado de `beautyplace/src/lib/salao/floorGeometry.ts`. A metade de cima\n// deste arquivo — ler a planta — já existia; isto é o que faltava para\n// DESENHAR, e é onde moram as regras que nenhuma tela ensina.\n\n/** Tolerância da simplificação do traço de mão livre, em metros. */\nexport const STROKE_EPSILON_M = 0.15\n/** Perto disto do primeiro ponto, o traço se fecha sozinho. */\nexport const STROKE_CLOSE_M = 0.3\n/** Abaixo disto o desenho é um tremor, não uma praça. */\nexport const AREA_MIN_M2 = 0.5\n/** Teto de pontos do polígono — o banco recusa acima disto. */\nexport const AREA_MAX_POINTS = 400\n/** Lado mínimo de uma praça, em metros. */\nexport const AREA_MIN_SIDE_M = 0.5\n\n/** Retângulo a partir de dois cantos quaisquer (arrasto diagonal). */\nexport function boxFromPoints(a: Point, b: Point): Box {\n return {\n x: Math.min(a.x, b.x),\n y: Math.min(a.y, b.y),\n w: Math.abs(b.x - a.x),\n h: Math.abs(b.y - a.y),\n }\n}\n\n/** Área do polígono (fórmula do cadarço), sempre positiva. */\nexport function polygonArea(points: Point[]): number {\n if (points.length < 3) return 0\n let soma = 0\n for (let i = 0, j = points.length - 1; i < points.length; j = i++) {\n soma += points[j].x * points[i].y - points[i].x * points[j].y\n }\n return Math.abs(soma) / 2\n}\n\nfunction distanceToSegment(p: Point, a: Point, b: Point): number {\n const dx = b.x - a.x\n const dy = b.y - a.y\n const den = dx * dx + dy * dy\n if (den === 0) return Math.hypot(p.x - a.x, p.y - a.y)\n let t = ((p.x - a.x) * dx + (p.y - a.y) * dy) / den\n t = Math.max(0, Math.min(1, t))\n return Math.hypot(p.x - (a.x + t * dx), p.y - (a.y + t * dy))\n}\n\n/**\n * Ramer-Douglas-Peucker: joga fora os pontos que ficam a menos de `epsilon`\n * da reta entre os vizinhos que sobram. O dedo produz centenas de pontos por\n * segundo; o banco guarda o contorno, não o tremor da mão.\n *\n * Com PILHA, não recursão — e o V1 diz por quê: um traço comprido tem\n * profundidade da ordem do número de pontos, e a recursão estourava a pilha\n * do JS num contorno demorado. O desenho sumia sem dizer por quê.\n */\nexport function simplifyStroke(points: Point[], epsilon = STROKE_EPSILON_M): Point[] {\n const n = points.length\n if (n <= 2) return points.slice()\n const manter = new Uint8Array(n)\n manter[0] = 1\n manter[n - 1] = 1\n const pilha: Array<[number, number]> = [[0, n - 1]]\n while (pilha.length) {\n const [ini, fim] = pilha.pop()!\n let pior = 0\n let idx = -1\n for (let i = ini + 1; i < fim; i++) {\n const d = distanceToSegment(points[i], points[ini], points[fim])\n if (d > pior) { pior = d; idx = i }\n }\n if (idx >= 0 && pior > epsilon) {\n manter[idx] = 1\n pilha.push([ini, idx], [idx, fim])\n }\n }\n const out: Point[] = []\n for (let i = 0; i < n; i++) if (manter[i]) out.push(points[i])\n return out\n}\n\n/** Arredonda para centímetro — a precisão que o banco guarda. */\nexport function roundPoints(points: Point[]): Point[] {\n return points.map((p) => ({ x: Math.round(p.x * 100) / 100, y: Math.round(p.y * 100) / 100 }))\n}\n\n/**\n * O TETO do traço cru, antes de simplificar.\n *\n * Douglas-Peucker é quadrático no pior caso — o zigue-zague, em que todo ponto\n * é canto e nada pode ser removido — e `strokeToPolygon` roda uma passada por\n * afrouxamento da tolerância, sempre sobre o traço CRU (a regra 1 abaixo:\n * re-simplificar o simplificado desfaria o fechamento). Medido nesta máquina,\n * em zigue-zague:\n *\n * 500 pts → 38ms 4.000 pts → 1.959ms\n * 1.000 pts → 157ms 10.000 pts → 16.648ms\n * 2.000 pts → 436ms\n *\n * Dezesseis segundos de tela travada no instante em que a pessoa levanta o\n * dedo para fechar a praça. E 2.000 pontos não são exóticos: um dedo numa tela\n * de 120 Hz os produz em vinte segundos de traço.\n *\n * O teto é 3× o máximo de VÉRTICES que a saída aceita (`AREA_MAX_POINTS`), e\n * por isso não pode mudar a forma de traço nenhum: o polígono final tem no\n * máximo 400 pontos, e 1.200 amostras uniformes guardam resolução de sobra\n * para escolher os mesmos cantos. Abaixo do teto NADA muda — mesma entrada,\n * mesma saída, mesmos testes.\n */\nconst CRU_MAX_POINTS = AREA_MAX_POINTS * 3\n\n/**\n * Reduz o traço a no máximo `CRU_MAX_POINTS` amostras uniformes, guardando\n * SEMPRE o primeiro e o último ponto — é a distância entre eles que decide se\n * o contorno fecha.\n */\nexport function thinStroke(stroke: Point[], max = CRU_MAX_POINTS): Point[] {\n if (stroke.length <= max) return stroke\n const passo = (stroke.length - 1) / (max - 1)\n const out: Point[] = []\n for (let i = 0; i < max - 1; i++) out.push(stroke[Math.round(i * passo)])\n out.push(stroke[stroke.length - 1])\n return out\n}\n\n/**\n * O traço cru do dedo vira o polígono que o banco aceita. `null` = não é\n * praça (tremor, linha, toque solto).\n *\n * A ORDEM das etapas é a regra, e as duas inversões estão comentadas no V1:\n *\n * 1. **Afrouxar a tolerância até caber no teto vem ANTES de fechar** — cada\n * passada re-simplifica o traço CRU, e desfaria o fechamento.\n * 2. **Arredondar vem ANTES de medir a área** — quem vai para o banco é o\n * arredondado, e é a área DELE que precisa existir; o trigger recusa\n * polígono sem área.\n */\nexport function strokeToPolygon(stroke: Point[], epsilon = STROKE_EPSILON_M): Point[] | null {\n if (stroke.length < 3) return null\n const cru = thinStroke(stroke)\n let eps = epsilon\n let pontos = simplifyStroke(cru, eps)\n while (pontos.length > AREA_MAX_POINTS && eps < 100) {\n eps *= 2\n pontos = simplifyStroke(cru, eps)\n }\n // O fim colado no início é o mesmo vértice: o polígono fecha sozinho.\n if (pontos.length > 3) {\n const a = pontos[0]\n const z = pontos[pontos.length - 1]\n if (Math.hypot(z.x - a.x, z.y - a.y) <= STROKE_CLOSE_M) pontos = pontos.slice(0, -1)\n }\n if (pontos.length < 3 || pontos.length > AREA_MAX_POINTS) return null\n const arredondado = roundPoints(pontos)\n const bbox = unionBox(arredondado.map((p) => ({ x: p.x, y: p.y, w: 0, h: 0 })))\n if (!bbox || bbox.w <= 0 || bbox.h <= 0) return null\n if (polygonArea(arredondado) < AREA_MIN_M2) return null\n return arredondado\n}\n\n/** As oito alças de um bbox, pelos pontos cardeais. */\nexport type AreaHandle = 'nw' | 'n' | 'ne' | 'e' | 'se' | 's' | 'sw' | 'w'\nexport const AREA_HANDLES: AreaHandle[] = ['nw', 'n', 'ne', 'e', 'se', 's', 'sw', 'w']\n\n/** Onde cada alça fica, em coordenadas do mundo. */\nexport function handlePoint(box: Box, handle: AreaHandle): Point {\n const x = handle.includes('w') ? box.x : handle.includes('e') ? box.x + box.w : box.x + box.w / 2\n const y = handle.includes('n') ? box.y : handle.includes('s') ? box.y + box.h : box.y + box.h / 2\n return { x, y }\n}\n\n/**\n * Arrastar uma alça: a borda OPOSTA fica parada, e o lado nunca encolhe além\n * do mínimo — passar da borda oposta gruda no mínimo em vez de virar a praça\n * do avesso, que é o que confunde quem está desenhando.\n */\nexport function resizeBox(box: Box, handle: AreaHandle, delta: Point, min = AREA_MIN_SIDE_M): Box {\n let { x, y, w, h } = box\n const direita = box.x + box.w\n const baixo = box.y + box.h\n if (handle.includes('w')) { const nx = Math.min(x + delta.x, direita - min); x = nx; w = direita - nx }\n else if (handle.includes('e')) { w = Math.max(min, box.w + delta.x) }\n if (handle.includes('n')) { const ny = Math.min(y + delta.y, baixo - min); y = ny; h = baixo - ny }\n else if (handle.includes('s')) { h = Math.max(min, box.h + delta.y) }\n return { x, y, w, h }\n}\n\n/** Move todos os pontos de um polígono. */\nexport function translatePolygon(points: Point[], delta: Point): Point[] {\n return points.map((p) => ({ x: p.x + delta.x, y: p.y + delta.y }))\n}\n\n/** Move um vértice. Fora do índice, devolve os pontos como estavam. */\nexport function moveVertex(points: Point[], index: number, to: Point): Point[] {\n if (index < 0 || index >= points.length) return points\n return points.map((p, i) => (i === index ? to : p))\n}\n\n/** Tira um vértice; abaixo de 3 pontos não é polígono, então recusa. */\nexport function removeVertex(points: Point[], index: number): Point[] | null {\n if (points.length <= 3 || index < 0 || index >= points.length) return null\n return points.filter((_, i) => i !== index)\n}\n\n/** O ponto médio de cada lado — é onde nasce um vértice novo. */\nexport function edgeMidpoints(points: Point[]): Array<{ index: number; point: Point }> {\n return points.map((p, i) => {\n const prox = points[(i + 1) % points.length]\n return { index: i + 1, point: { x: (p.x + prox.x) / 2, y: (p.y + prox.y) / 2 } }\n })\n}\n\n/** Insere um vértice na posição dada (o índice vem de `edgeMidpoints`). */\nexport function insertVertex(points: Point[], index: number, point: Point): Point[] {\n const out = points.slice()\n out.splice(Math.max(0, Math.min(index, points.length)), 0, point)\n return out\n}\n\n/**\n * O vazio da planta, quando a unidade não tem NENHUM ambiente desenhado.\n *\n * O V2 não tinha ramo para isso: com zero ambientes a planta desenhava o pátio\n * padrão de 10 × 10 m — uma caixa cinza vazia, sem uma palavra. Quem abre\n * «Planta baixa» numa casa que nunca desenhou a planta via um retângulo e\n * nenhuma pista de que fazer.\n *\n * O V1 tem DUAS frases, e a diferença é quem está olhando:\n *\n * - no EDITOR (`FloorPlanEditor`), ele diz o próximo passo nas palavras do\n * próprio editor — quem está ali pode agir agora;\n * - na LEITURA (`FloorPlanView`), ele aponta para onde se configura — quem está\n * ali não pode desenhar nada.\n *\n * **As dicas foram adaptadas, e de propósito.** O V1 manda para a «aba\n * Ambientes» e para «Configurações → Salão», e nenhum dos dois existe no V2: aqui\n * o ambiente nasce da ferramenta de desenho do próprio editor, alcançada por\n * «Editar planta». Repetir a frase do V1 ao pé da letra mandaria o operador a um\n * lugar que não existe — e uma mensagem fiel que mente é pior que uma adaptada\n * que acerta. O TÍTULO é o do V1, palavra por palavra.\n */\nexport function emptyFloorMessage(editing: boolean): { title: string; hint: string } {\n return editing\n ? {\n title: 'Nenhum ambiente desenhado nesta unidade.',\n hint: 'Desenhe o primeiro com a ferramenta acima; depois é arrastar as mesas para dentro.',\n }\n : {\n title: 'Nenhum ambiente desenhado nesta unidade.',\n hint: 'Toque em «Editar planta» para desenhar o primeiro.',\n }\n}\n\n// ---------------------------------------------------------------------------\n// Quais mesas caem DENTRO de uma praça.\n//\n// A praça é um recorte do MUNDO; a mesa guarda a posição relativa ao AMBIENTE\n// dela. Somar a origem do ambiente é o que põe as duas no mesmo sistema — e\n// esquecer essa soma é exatamente o erro que o cadeado do desenho existe para\n// impedir (desenhar praça com os ambientes empilhados pega mesas que não são\n// as que estão na tela).\n//\n// A regra foi conferida contra o dado real antes de existir: no Pertinho, as\n// cinco praças têm cem vínculos materializados pela migração, e a geometria\n// reproduz os cem — zero a mais, zero a menos.\n// ---------------------------------------------------------------------------\n\n/** A posição da mesa NO MUNDO, ou `null` quando não dá para saber. */\nexport function tableWorldPoint(\n table: { posXM?: number | null; posYM?: number | null; zoneId?: string | null },\n originOf: (zoneId: string) => Point | null | undefined,\n): Point | null {\n if (table.posXM == null || table.posYM == null) return null\n // Sem ambiente, a posição JÁ é do mundo: não há origem a somar.\n const origem = table.zoneId ? originOf(table.zoneId) : { x: 0, y: 0 }\n if (!origem) return null\n return { x: origem.x + table.posXM, y: origem.y + table.posYM }\n}\n\n/** As mesas que a geometria da praça pega. */\nexport function tablesInServiceArea(\n area: FloorArea,\n tables: Array<{ id: string; posXM?: number | null; posYM?: number | null; zoneId?: string | null }>,\n originOf: (zoneId: string) => Point | null | undefined,\n): string[] {\n const dentro: string[] = []\n for (const t of tables) {\n const p = tableWorldPoint(t, originOf)\n if (p && pointInArea(p, area)) dentro.push(t.id)\n }\n return dentro\n}\n\n/**\n * A pertinência FINAL: a geometria, mais o que foi incluído à mão, menos o que\n * foi excluído.\n *\n * É o modelo do V1, e é o que dá sentido ao «voltar ao automático»: tirar o\n * vínculo manual devolve a mesa à decisão do desenho, em vez de deixá-la sem\n * praça nenhuma.\n */\nexport function serviceAreaTables(\n automatic: string[],\n manual: { included?: string[]; excluded?: string[] } = {},\n): string[] {\n const fora = new Set(manual.excluded ?? [])\n const dentro = new Set(automatic.filter((id) => !fora.has(id)))\n for (const id of manual.included ?? []) if (!fora.has(id)) dentro.add(id)\n return [...dentro]\n}\n\n/**\n * Quais praças precisam ser REESCRITAS depois de a mesa mudar de lugar.\n *\n * A conta é a mesma de sempre; o que esta função guarda é a decisão de NÃO\n * escrever. Arrastar uma mesa num salão de cinco praças não pode virar cinco\n * gravações: só muda a praça que a mesa deixou e a que ela passou a ocupar, e\n * reescrever as outras três seria três chamadas para dizer o que já estava\n * dito — com a chance de sobrescrever, no caminho, uma decisão manual que\n * alguém tomou entre a leitura e a escrita.\n */\nexport function serviceAreasToRewrite(\n areas: Array<FloorArea & { tableIds?: string[] }>,\n movedTableId: string,\n tables: Array<{ id: string; posXM?: number | null; posYM?: number | null; zoneId?: string | null }>,\n originOf: (zoneId: string) => Point | null | undefined,\n): Array<{ id: string; tableIds: string[] }> {\n const saida: Array<{ id: string; tableIds: string[] }> = []\n for (const a of areas) {\n const antes = (a.tableIds ?? []).includes(movedTableId)\n const agora = tablesInServiceArea(a, tables, originOf)\n if (antes === agora.includes(movedTableId)) continue\n saida.push({ id: a.id, tableIds: agora })\n }\n return saida\n}\n\n// ---------------------------------------------------------------------------\n// AS MESAS SEM PRAÇA precisam de um lugar.\n//\n// `tableCenter` soma a posição da mesa à origem da praça dela. A mesa que não\n// tem praça cai em `{ x: 0, y: 0 }` — e as que também não têm coordenada\n// própria caem TODAS no mesmo ponto, uma por cima da outra, no canto da\n// planta. Foi o que o founder viu: *«as mesas sem praça ficaram todas\n// amontoadas, impossível de entender»*.\n//\n// Empilhar não é só feio: a mesa de baixo não recebe clique, então ela some do\n// salão para quem usa a planta — e continua ocupada no banco.\n//\n// Aqui elas ganham uma GRADE própria, fora do desenho das praças, com folga\n// suficiente para o número caber entre uma e outra. Não é um lugar «real» —\n// nenhuma delas tem lugar real ainda —, é um lugar ONDE SE PODE PEGÁ-LAS para\n// arrastar até a praça a que pertencem, que é o gesto que a planta existe para\n// permitir.\n// ---------------------------------------------------------------------------\n\n/** Espaço entre os centros, em metros. Cabe a mesa maior e o número dela. */\nconst PASSO_M = 1.6\n\n/**\n * Onde desenhar as mesas que não estão em praça nenhuma.\n *\n * Devolve o centro de cada uma, em metros, numa grade à ESQUERDA do mundo\n * desenhado — longe das praças, para que o amontoado não se confunda com um\n * ambiente de verdade.\n *\n * A mesa que JÁ TEM coordenada própria é respeitada: alguém a posicionou, e\n * mover o que foi posicionado à mão é desfazer trabalho.\n */\nexport function layoutUnzonedTables(\n tables: Array<Pick<FloorTable, 'id' | 'posX' | 'posY'>>,\n world: Box,\n perColumn = 6,\n): Map<string, Point> {\n const onde = new Map<string, Point>()\n // Uma coluna de folga entre o amontoado e a primeira praça: encostadas, as\n // duas coisas leem como um ambiente só.\n const baseX = world.x - PASSO_M * 2\n let i = 0\n for (const t of tables) {\n if (Number(t.posX) || Number(t.posY)) continue\n const coluna = Math.floor(i / perColumn)\n const linha = i % perColumn\n onde.set(t.id, {\n x: baseX - coluna * PASSO_M,\n y: world.y + linha * PASSO_M,\n })\n i += 1\n }\n return onde\n}\n","// ---------------------------------------------------------------------------\n// Conferir o que o servidor DIZ que cancelou.\n//\n// Portado de `assertCancellationResult` em\n// `beautyplace/src/components/orders/OrderCancellationModal.tsx`. O V1 não\n// confia na resposta: ele confere, item a item, que a quantidade cancelada é\n// exatamente a que foi pedida — e recusa com uma frase diferente para cada\n// jeito de a resposta estar errada.\n//\n// Não é desconfiança gratuita. Cancelar 1 de 3 chopes e o servidor cancelar 3\n// é dinheiro saindo da conta sem ninguém ver, e quem descobre é o cliente na\n// hora de pagar. A tela que mostra \"1 cancelado\" enquanto o banco tirou 3 é\n// pior do que uma tela que falha: ela mente com confiança.\n//\n// As cinco frases são as do V1, palavra por palavra — elas aparecem no toast e\n// são o que a casa vai ler para o suporte.\n// ---------------------------------------------------------------------------\n\nexport interface CancelAsked {\n lineId: string\n quantity: number\n}\n\nexport interface CancelConfirmed {\n lineId: string\n cancelledQuantity: number\n fullyCancelled: boolean\n}\n\n/**\n * Lança quando a resposta não corresponde ao pedido. Devolve o confirmado\n * quando tudo bate.\n */\n/**\n * A frase do V1 para «alguém mexeu na comanda enquanto você cancelava».\n *\n * O V1 recebe `order_conflict` do servidor e diz isto. O V2 não espera um\n * código: ele CONFERE a resposta item a item, o que pega mais casos — mas as\n * mensagens estavam escritas do ponto de vista do servidor («o servidor não\n * confirmou…»), e isso não diz ao garçom o que fazer.\n *\n * Quando o que veio diverge do que foi pedido, a causa real, na operação, é\n * quase sempre esta: outro aparelho mexeu na comanda no meio do gesto. Então a\n * frase é a do V1 — causa e AÇÃO —, e as duas mensagens técnicas ficam só para\n * resposta malformada, que é problema de protocolo, não de operação.\n */\nexport const COMANDA_MUDOU =\n 'O pedido mudou enquanto você cancelava. Atualize a comanda e tente novamente.'\n\nexport function assertCancellation(\n asked: CancelAsked[],\n answer: unknown,\n): CancelConfirmed[] {\n if (!Array.isArray(answer)) {\n throw new Error('O servidor retornou uma resposta de cancelamento inválida.')\n }\n if (answer.length !== asked.length) {\n throw new Error(COMANDA_MUDOU)\n }\n\n const porLinha = new Map<string, CancelConfirmed>()\n for (const cru of answer) {\n if (!cru || typeof cru !== 'object') {\n throw new Error('O servidor retornou um item de cancelamento inválido.')\n }\n const item = cru as Partial<CancelConfirmed>\n if (\n typeof item.lineId !== 'string'\n || !Number.isFinite(item.cancelledQuantity)\n || Number(item.cancelledQuantity) <= 0\n || typeof item.fullyCancelled !== 'boolean'\n // Duas linhas com o mesmo id não somam: uma delas está errada, e não dá\n // para saber qual.\n || porLinha.has(item.lineId)\n ) {\n throw new Error('O servidor retornou dados inconsistentes para o cancelamento.')\n }\n porLinha.set(item.lineId, {\n lineId: item.lineId,\n cancelledQuantity: Number(item.cancelledQuantity),\n fullyCancelled: item.fullyCancelled,\n })\n }\n\n for (const pedido of asked) {\n const veio = porLinha.get(pedido.lineId)\n if (!veio || veio.cancelledQuantity !== pedido.quantity) {\n throw new Error(COMANDA_MUDOU)\n }\n }\n\n return [...porLinha.values()]\n}\n\n// ---------------------------------------------------------------------------\n// QUAIS linhas ainda dá para cancelar.\n//\n// Portado do `OrderCart` do V1, onde a lista se chama `cancellableItems`:\n//\n// ```ts\n// const cancellableItems = sentItems.filter(\n// i => i.status !== 'cancelled' && i.status !== 'delivered')\n// ```\n//\n// Duas exclusões, e a segunda é a que importa: **o que foi ENTREGUE não se\n// cancela**. O prato está na mesa, o chope foi bebido — o caminho para isso é\n// cortesia ou desconto, que deixam rastro de quem decidiu e por quê. Cancelar\n// apaga a linha e some com o custo, e some junto o registro de que a comanda\n// consumiu aquilo.\n//\n// O V1 usa esta mesma lista para DUAS portas — Cancelamento e Transferência —\n// e é por isso que ela é um predicado e não um filtro solto: uma cópia das\n// duas condições em cada chamada vira duas regras que divergem na primeira\n// alteração.\n//\n// No V2 o estado `cancelled` não existe: a linha cancelada SAI da comanda, e\n// por isso só a entrega aparece aqui. E hoje isto é uma guarda para um estado\n// que o PDV ainda não lê — cada linha que vem do banco chega `fired`, fixo. A\n// guarda vem ANTES do KDS de propósito: no dia em que a cozinha passar a\n// marcar «entregue», a porta já está no lugar. O caminho inverso — soltar a\n// tela primeiro e lembrar da regra depois — é o que oferece ao operador o\n// cancelamento de um prato que o cliente já comeu.\n// ---------------------------------------------------------------------------\n\n/** A linha ainda pode ser cancelada? */\nexport function isCancelable(state: string | null | undefined): boolean {\n const s = state ?? 'pending'\n return s !== 'pending' && s !== 'delivered' && s !== 'cancelled'\n}\n","// ---------------------------------------------------------------------------\n// ONDE a bandeja de comandas abertas aparece.\n//\n// A regra é do V1, e o teste dele — `reguaNaGradeDoSalao.test.ts` — guarda as\n// três metades:\n//\n// *\"A régua existe para trocar de comanda SEM a grade na frente: no\n// cardápio, no balcão, no delivery. Onde a grade está aberta, ela JÁ É o\n// seletor de mesas, e foi para isso que foi desenhada.\"*\n//\n// *\"O corte é pela ABA, não pelo canal: com uma comanda do salão aberta o\n// operador está no CARDÁPIO, e ali a régua volta a ser o caminho mais curto\n// para a próxima mesa.\"*\n//\n// *\"Suprimir no salão não pode desfazer o filtro: quem está no delivery não\n// quer varrer vinte mesas para achar dois pedidos.\"*\n//\n// O V2 tem DOIS quadros onde o V1 tem um. A planta lista as mesas ocupadas; o\n// quadro do delivery lista os pedidos em rota. Nos dois a bandeja repetiria,\n// embaixo e menor, a lista que está aberta em cima.\n//\n// Isto existe como função porque a versão anterior escrevia a regra pelo lado\n// errado — descartava toda ficha de `kind: 'delivery'`, em qualquer tela. O\n// efeito: abrir um pedido de delivery leva ao cardápio (é lá que se lançam os\n// itens), a trilha acende «Delivery» e a bandeja vem VAZIA. É o mesmo defeito\n// que o comentário vizinho diz ter corrigido para as mesas — a mesa foi\n// consertada pela view, o delivery ficou consertado pelo kind, e só um dos\n// dois conserta.\n// ---------------------------------------------------------------------------\n\n/**\n * Esta tela JÁ é a lista das comandas abertas?\n *\n * Quando é, a bandeja se cala: ela seria a segunda cópia, menor e com menos\n * informação, da mesma coisa — e ainda cobraria uma faixa da altura de quem\n * está escolhendo onde tocar.\n */\nexport function viewListsOpenOrders(view: string | undefined): boolean {\n return view === 'floor' || view === 'list'\n}\n","// ---------------------------------------------------------------------------\n// QUANDO a cortesia pode ser usada — e o que dizer quando não pode.\n//\n// Portado de `courtesyUnavailableReason` no `OrderCart` do V1 e de\n// `allowsCourtesyForChannel`. O V2 bloqueava com uma frase só, «A comanda está\n// vazia», para seis situações diferentes: comanda não aberta, já encerrada,\n// com item ainda no carrinho, já paga, sem nada a perdoar, e caixa fechado.\n//\n// A diferença não é de texto, é de AÇÃO. «A comanda está vazia» manda o\n// operador lançar item; «A comanda já possui pagamento» manda procurar o\n// estorno; «Abra seu caixa» manda abrir o caixa. Uma frase genérica para seis\n// becos faz o operador tentar o caminho errado cinco vezes.\n//\n// Encerrar uma comanda como cortesia é dar a conta de graça — é a ação que\n// mais precisa dizer por que não pode.\n// ---------------------------------------------------------------------------\n\n/** Os canais em que a cortesia existe. Delivery e retirada não têm. */\nexport type CourtesyChannel = 'salao' | 'balcao' | 'retirada' | 'delivery'\n\n/**\n * A cortesia existe neste canal?\n *\n * *\"salão ou balcão\"*, literal do V1. A entrega já saiu da casa quando a\n * pergunta se coloca, e perdoar a conta dela é assunto do canal, não do PDV.\n */\nexport function allowsCourtesyForChannel(channel: CourtesyChannel): boolean {\n return channel === 'salao' || channel === 'balcao'\n}\n\nexport interface CourtesyState {\n /** A comanda existe no banco? */\n hasOrder: boolean\n status?: string | null\n /** Itens ainda NO CARRINHO, não enviados. */\n pendingCount: number\n /** Quanto já foi pago, em centavos. */\n paidCents: number\n /** O que a comanda ainda deve, em centavos. */\n balanceCents: number\n /** Há caixa aberto? */\n cashOpen: boolean\n}\n\n/**\n * O motivo de a cortesia estar bloqueada, ou `null` quando ela pode.\n *\n * A ORDEM é a do V1, e ela importa: a pergunta mais barata vem primeiro, e\n * cada resposta é acionável sozinha. Trocar a ordem faria o operador ver\n * «abra seu caixa» numa comanda que nem foi aberta.\n */\nexport function courtesyBlockReason(s: CourtesyState): string | null {\n if (!s.hasOrder) return 'Comanda ainda não aberta'\n if (s.status === 'closed' || s.status === 'completed') return 'Comanda já encerrada'\n if (s.pendingCount > 0) return 'Envie os itens antes da cortesia'\n // Meio centavo de tolerância, como no V1: a comparação é com dinheiro, e\n // `0.005` é o que separa «pagou» de ruído de arredondamento.\n if (s.paidCents > 0) return 'A comanda já possui pagamento'\n if (s.balanceCents <= 0) return 'Disponível após enviar itens'\n if (!s.cashOpen) return 'Abra seu caixa para usar a cortesia'\n return null\n}\n","// ---------------------------------------------------------------------------\n// A BUSCA troca de assunto com o canal.\n//\n// Portado de `PosSearchContext` + `POS_BUSCA_PLACEHOLDER` do V1.\n//\n// A regra que organiza tudo está escrita lá: *\"Praticamente toda aba do Balcão\n// tinha um campo de busca próprio — mesa, produto, pedido, cliente — cada um\n// num canto. No PDV o campo é um só, no trilho, e cada página CONSOME o termo\n// daqui.\"*\n//\n// O V2 já tinha o campo único. O que faltava era o resto da regra:\n//\n// 1. **O rótulo diz o assunto.** \"Buscar\" não diz se vai achar a mesa 12 ou\n// o item 12, e o operador descobre digitando.\n// 2. **Quem responde é a página ATIVA.** O V2 pulava para o cardápio ao\n// primeiro caractere — o contrário do V1, que filtra onde você está. No\n// salão, buscar \"12\" tem de acender a mesa 12, não abrir o cardápio.\n// 3. **Canal sem nada a buscar não mostra o campo.** Um campo que não filtra\n// nada ensina a ignorar o campo.\n// ---------------------------------------------------------------------------\n\n/** As visões do PDV, como o `PosMenu` as nomeia. */\nexport type PosView = 'floor' | 'catalog' | 'list' | 'shift' | 'reservations' | 'waitlist'\n\n/**\n * O rótulo por visão — `null` onde não há o que buscar.\n *\n * `shift` é o caixa: ele mostra o turno, não uma lista. O V1 faz o mesmo com\n * a Fila, e a faixa passa a dizer ONDE você está no lugar do campo.\n */\nconst ROTULO: Record<PosView, string | null> = {\n floor: 'Buscar mesa…',\n catalog: 'Buscar produto…',\n list: 'Buscar pedido…',\n reservations: 'Buscar reserva…',\n shift: null,\n // A fila TEM busca, e o rótulo fala de GRUPO — não de mesa.\n //\n // A primeira volta deste porte a deixou sem busca, pelo argumento de que a\n // fila é curta. Ela deixou de ser: com as reservas do dia dentro da mesma\n // lista, uma sexta à noite tem trinta linhas, e a pergunta da recepção é\n // sempre por uma pessoa — \"o Vinícius já chegou?\". Ver `entryMatches`.\n waitlist: 'Buscar grupo…',\n}\n\nexport function searchPlaceholder(view?: PosView | null): string | null {\n if (!view) return 'Buscar'\n // `??` não serve aqui: ele confunde \"visão conhecida que NÃO tem o que\n // buscar\" (o caixa, `null` de propósito) com \"visão que eu não conheço\"\n // (genérico). São respostas opostas — uma some com o campo, a outra o\n // mantém.\n return view in ROTULO ? ROTULO[view] : 'Buscar'\n}\n\n/** A visão tem o que buscar? */\nexport function viewIsSearchable(view?: PosView | null): boolean {\n return searchPlaceholder(view) != null\n}\n\n/**\n * A mesa casa com o termo — pela regra do V1, que é mais crua do que parece.\n *\n * O NÚMERO casa por `includes` sobre o texto dele: buscar `1` acende a 1, a\n * 10, a 21 e a 100. Isso não é descuido — num salão de duzentas mesas o\n * garçom digita o começo do número e varre o resto com o olho, e uma busca\n * que só aceitasse o número exato o obrigaria a digitar os três dígitos.\n *\n * O NOME casa sem caixa. O V1 compara o número SEM baixar a caixa (dígito não\n * tem caixa) e o nome COM — e repetir isso aqui mantém as duas telas\n * concordando sobre o que \"Varanda\" acha.\n */\nexport function tableMatches(\n table: { label?: string | null; name?: string | null }, term: string,\n): boolean {\n const q = term.trim()\n if (!q) return true\n const numero = (table.label ?? '').replace(/\\D/g, '')\n if (numero && numero.includes(q.replace(/\\D/g, '')) && /\\d/.test(q)) return true\n const alvo = `${table.label ?? ''} ${table.name ?? ''}`.toLowerCase()\n return alvo.includes(q.toLowerCase())\n}\n","// ---------------------------------------------------------------------------\n// Quem pode ser descartada.\n//\n// Regra puxada de `beautyplace/src/components/orders/PosOpenTicketsDock.tsx`:\n//\n// const descartavel = !!onDiscard && o.total === 0 && o.table_id == null;\n//\n// Duas condições, e a segunda é a que não se adivinha.\n//\n// **Total zero** porque descartar é sumir com a comanda, não cancelá-la: o que\n// tem valor sai pelo cancelamento, que pede motivo e deixa rastro.\n//\n// **Sem mesa** porque em mesa \"vazia\" tem outro significado. Abrir um canal sem\n// mesa (Balcão, Retirada) cria a comanda na hora, antes de existir pedido, e a\n// que ninguém usou fica na régua para sempre — no Pertinho eram sete das doze\n// abertas, algumas com 92 horas. Numa MESA, zero quer dizer \"ocupada, ainda\n// sem pedido\": soltá-la por engano devolve a mesa ao salão com gente sentada.\n//\n// Vive aqui, e não numa linha de JSX, porque é a diferença entre limpar lixo e\n// perder uma mesa ocupada — e porque o caso que importa (o balcão vazio) não\n// existe na tela sem alguém abrir um, o que é gravar para testar.\n// ---------------------------------------------------------------------------\n\nexport interface DiscardCandidate {\n /** O que a comanda soma. Zero é a única porta. */\n totalCents?: number\n /** `'table'` é o que fica de fora. */\n kind?: string\n}\n\nexport function isDiscardable(p: DiscardCandidate): boolean {\n return (p.totalCents ?? 0) === 0 && p.kind !== 'table'\n}\n","// ---------------------------------------------------------------------------\n// A ficha da mesa selecionada na planta.\n//\n// Portada de `beautyplace/src/components/salao/floor/TableInspector.tsx`.\n//\n// **Não há «Salvar».** Cada campo grava sozinho — ao SAIR (texto) ou ao MUDAR\n// (formato, rotação) —, e o V1 diz por quê: *\"o gerente ajusta olhando a\n// planta e vê o resultado na hora.\"* Um botão de salvar quebraria esse laço:\n// mexer, olhar, corrigir vira mexer, salvar, olhar, mexer de novo.\n// ---------------------------------------------------------------------------\n\nimport { useEffect, useState } from 'react'\nimport { Crosshair, Unlink } from 'lucide-react'\nimport { TABLE_SHAPE_DIMS, type TableShape } from './floorGeometry'\nimport { haptic } from '../lib/haptics'\n\n/** Nenhuma medida abaixo disto: menos que 40 cm não é mesa. */\nconst MIN_M = 0.4\n\nexport interface InspectorTable {\n id: string\n number: number\n name?: string | null\n seats: number\n shape: TableShape\n widthM: number\n heightM: number\n diameterM: number\n rotation: number\n}\n\nexport type TablePatch = Partial<Omit<InspectorTable, 'id'>>\n\nconst FORMATOS: Array<{ id: TableShape; label: string }> = [\n { id: 'round', label: 'Redonda' },\n { id: 'square', label: 'Quadrada' },\n { id: 'rectangle', label: 'Retangular' },\n]\n\nexport function TableInspector({ table, areaName, onSave, onZoom, onDetach }: {\n table: InspectorTable\n /** `null` = a mesa não está na planta. */\n areaName?: string | null\n onSave: (patch: TablePatch) => void\n onZoom?: () => void\n onDetach?: () => void\n}) {\n const [nome, setNome] = useState(table.name ?? '')\n const [numero, setNumero] = useState(String(table.number))\n const [cadeiras, setCadeiras] = useState(String(table.seats))\n const [largura, setLargura] = useState(String(table.widthM))\n const [altura, setAltura] = useState(String(table.heightM))\n const [diametro, setDiametro] = useState(String(table.diameterM))\n const [rotacao, setRotacao] = useState(table.rotation || 0)\n\n useEffect(() => {\n setNome(table.name ?? ''); setNumero(String(table.number)); setCadeiras(String(table.seats))\n setLargura(String(table.widthM)); setAltura(String(table.heightM))\n setDiametro(String(table.diameterM)); setRotacao(table.rotation || 0)\n }, [table.id, table.name, table.number, table.seats, table.widthM, table.heightM, table.diameterM, table.rotation])\n\n /**\n * As medidas gravam ao SAIR do campo, nunca por tecla.\n *\n * O V1 conta o que acontecia: *\"por tecla, «0.5» a partir de «0.9» era\n * impossível (o «0» já voltava) e cada dígito virava um UPDATE.\"*\n *\n * E o valor inválido VOLTA ao que estava — não fica em vermelho esperando\n * conserto. A planta atrás precisa continuar batendo com a ficha.\n */\n const medida = (\n texto: string, atual: number,\n campo: 'widthM' | 'heightM' | 'diameterM',\n reset: (v: string) => void,\n ) => {\n const v = Number(String(texto).replace(',', '.'))\n if (Number.isFinite(v) && v >= MIN_M && v !== atual) onSave({ [campo]: v } as TablePatch)\n else reset(String(atual))\n }\n\n const redonda = table.shape === 'round'\n\n return (\n <div className=\"pos-insp\">\n <div className=\"pos-insp__head\">\n <span>\n <span className=\"pos-t-xs\">Mesa</span>\n <strong className=\"pos-insp__t\">\n {table.number}{table.name ? ` · ${table.name}` : ''}\n </strong>\n <span className=\"pos-insp__where\">\n {areaName ? `Ambiente: ${areaName}` : 'Fora da planta'}\n </span>\n </span>\n {onZoom && (\n <button className=\"pos-insp__zoom\" onClick={() => { haptic('tap'); onZoom() }} disabled={!areaName}>\n <Crosshair size={13} strokeWidth={2.3} aria-hidden /> Aproximar\n </button>\n )}\n </div>\n\n <div className=\"pos-insp__row\">\n <label className=\"pos-insp__f\">\n <span className=\"pos-insp__l\">Número</span>\n <input\n type=\"number\" min={1} inputMode=\"numeric\" value={numero}\n onChange={(e) => setNumero(e.target.value)}\n onBlur={() => {\n const n = parseInt(numero, 10)\n if (n > 0 && n !== table.number) onSave({ number: n })\n else setNumero(String(table.number))\n }}\n />\n </label>\n <label className=\"pos-insp__f\">\n <span className=\"pos-insp__l\">Cadeiras</span>\n <input\n type=\"number\" min={0} max={40} inputMode=\"numeric\" value={cadeiras}\n onChange={(e) => setCadeiras(e.target.value)}\n onBlur={() => {\n const n = parseInt(cadeiras, 10)\n if (n >= 0 && n <= 40 && n !== table.seats) onSave({ seats: n })\n else setCadeiras(String(table.seats))\n }}\n />\n </label>\n </div>\n\n <label className=\"pos-insp__f\">\n <span className=\"pos-insp__l\">Nome (opcional)</span>\n <input\n value={nome} placeholder=\"Ex.: Janela, VIP 2\"\n onChange={(e) => setNome(e.target.value)}\n onBlur={() => {\n const v = nome.trim() || null\n if (v !== (table.name ?? null)) onSave({ name: v })\n }}\n />\n </label>\n\n <div className=\"pos-insp__f\">\n <span className=\"pos-insp__l\">Formato</span>\n {/* Trocar o formato TROCA AS MEDIDAS junto. Sem isso, uma redonda de\n 2,4 m de diâmetro virava uma quadrada de 2,4 m de lado — quatro\n vezes a área, e a planta inteira saía do lugar. */}\n <span className=\"pos-seg\" role=\"group\" aria-label=\"Formato da mesa\">\n {FORMATOS.map((f) => (\n <button\n key={f.id}\n className=\"pos-seg__btn\"\n aria-pressed={table.shape === f.id}\n onClick={() => {\n if (table.shape === f.id) return\n haptic('tap')\n const d = TABLE_SHAPE_DIMS[f.id]\n onSave({ shape: f.id, widthM: d.widthM, heightM: d.heightM, diameterM: d.diameterM })\n }}\n >\n {f.label}\n </button>\n ))}\n </span>\n </div>\n\n {redonda ? (\n <label className=\"pos-insp__f\">\n <span className=\"pos-insp__l\">Diâmetro (m)</span>\n <input\n type=\"number\" step=\"0.1\" min={MIN_M} inputMode=\"decimal\" value={diametro}\n onChange={(e) => setDiametro(e.target.value)}\n onBlur={() => medida(diametro, table.diameterM, 'diameterM', setDiametro)}\n />\n </label>\n ) : (\n <div className=\"pos-insp__row\">\n <label className=\"pos-insp__f\">\n <span className=\"pos-insp__l\">Largura (m)</span>\n <input\n type=\"number\" step=\"0.1\" min={MIN_M} inputMode=\"decimal\" value={largura}\n onChange={(e) => setLargura(e.target.value)}\n onBlur={() => medida(largura, table.widthM, 'widthM', setLargura)}\n />\n </label>\n <label className=\"pos-insp__f\">\n <span className=\"pos-insp__l\">Comprimento (m)</span>\n <input\n type=\"number\" step=\"0.1\" min={MIN_M} inputMode=\"decimal\" value={altura}\n onChange={(e) => setAltura(e.target.value)}\n onBlur={() => medida(altura, table.heightM, 'heightM', setAltura)}\n />\n </label>\n </div>\n )}\n\n <div className=\"pos-insp__f\">\n <span className=\"pos-insp__l\">\n Rotação <span className=\"pos-num pos-insp__deg\">{rotacao}°</span>\n </span>\n {/* Grava ao SOLTAR, não a cada passo: eram até 24 UPDATEs por arrasto.\n O `onChange` só move o desenho; o `onPointerUp`/`onKeyUp` grava. */}\n <input\n type=\"range\" min={0} max={345} step={15} value={rotacao}\n aria-label=\"Rotação da mesa\"\n onChange={(e) => setRotacao(Number(e.target.value))}\n onPointerUp={() => { if (rotacao !== (table.rotation || 0)) onSave({ rotation: rotacao }) }}\n onKeyUp={() => { if (rotacao !== (table.rotation || 0)) onSave({ rotation: rotacao }) }}\n />\n </div>\n\n {areaName && onDetach && (\n <button className=\"pos-insp__detach\" onClick={() => { haptic('warn'); onDetach() }}>\n <Unlink size={13} strokeWidth={2.3} aria-hidden /> Tirar da planta (fica sem ambiente)\n </button>\n )}\n </div>\n )\n}\n","// ---------------------------------------------------------------------------\n// A escala do salão: quem atende o quê AGORA.\n//\n// Portado de `beautyplace/src/lib/salao/staffAssignments.ts`. Responde a\n// pergunta que o gerente faz dez vezes por serviço — \"de quem é aquela mesa?\"\n// — e que hoje se responde gritando pelo salão.\n//\n// A regra que este arquivo existe para não deixar cair:\n//\n// **NADA DE DATA SE CALCULA AQUI.** Quando a escala vale \"até o fim do dia\",\n// quem decide que horas isso é foi o banco, no fuso da unidade e no corte que\n// ela configurou — um restaurante \"vira o dia\" às 05:00, não à meia-noite.\n// O cliente só sabe LER o que veio. Recalcular aqui daria outro horário em\n// qualquer máquina com fuso diferente, e a escala do turno da madrugada\n// terminaria cedo demais.\n// ---------------------------------------------------------------------------\n\nexport type ShiftRole = 'waiter' | 'busser'\n\n/** Uma linha da escala vigente. */\nexport interface ShiftAssignment {\n id: string\n areaId?: string | null\n areaName?: string | null\n areaColor?: string | null\n tableId?: string | null\n tableNumber?: string | number | null\n tableName?: string | null\n personId: string\n personName?: string | null\n role?: string | null\n /** `null` em `endsAt` quer dizer PERMANENTE — não \"sem informação\". */\n startsAt: string\n endsAt: string | null\n}\n\nexport const ROLE_LABEL: Record<ShiftRole, string> = {\n waiter: 'Garçom',\n busser: 'Cumim',\n}\n\n/** Papel que a casa inventou não vira texto cru na tela: vira \"Equipe\". */\nexport function roleLabel(role: string | null | undefined): string {\n return ROLE_LABEL[(role ?? '') as ShiftRole] ?? 'Equipe'\n}\n\n/** Vigente AGORA: já começou e ainda não terminou. */\nexport function isCurrent(\n e: { startsAt: string; endsAt: string | null },\n now: Date | number = Date.now(),\n): boolean {\n const agora = typeof now === 'number' ? now : now.getTime()\n if (new Date(e.startsAt).getTime() > agora) return false\n return e.endsAt == null || new Date(e.endsAt).getTime() > agora\n}\n\n/** \"permanente\" / \"até as 05:00\" — nas palavras de quem opera. */\nexport function describeValidity(e: { endsAt: string | null }): string {\n if (e.endsAt == null) return 'permanente'\n const hora = new Date(e.endsAt).toLocaleTimeString('pt-BR', { hour: '2-digit', minute: '2-digit' })\n return `até as ${hora}`\n}\n\nexport interface ShiftTarget {\n key: string\n label: string\n kind: 'area' | 'table'\n color?: string | null\n}\n\n/** De que praça (ou mesa) é esta linha. */\nexport function targetOf(e: ShiftAssignment): ShiftTarget {\n if (e.areaId != null) {\n return {\n key: `area-${e.areaId}`,\n label: e.areaName ?? 'Praça',\n kind: 'area',\n color: e.areaColor ?? null,\n }\n }\n const nome = e.tableName\n ? `Mesa ${e.tableNumber} · ${e.tableName}`\n : `Mesa ${e.tableNumber ?? e.tableId}`\n return { key: `table-${e.tableId}`, label: nome, kind: 'table' }\n}\n\n/**\n * Agrupa por alvo: praças primeiro, mesas depois, cada grupo por nome.\n *\n * A chave é o ID, NUNCA o nome. Duas praças podem se chamar \"Salão\" — o banco\n * permite — e agrupar por nome juntaria as duas numa só: a escala de uma\n * apareceria como se fosse da outra, e o garçom iria para o lugar errado.\n */\nexport function groupByTarget(\n assignments: ShiftAssignment[],\n): Array<ShiftTarget & { rows: ShiftAssignment[] }> {\n const grupos = new Map<string, ShiftTarget & { rows: ShiftAssignment[] }>()\n for (const e of assignments) {\n const alvo = targetOf(e)\n const g = grupos.get(alvo.key) ?? { ...alvo, rows: [] }\n g.rows.push(e)\n grupos.set(alvo.key, g)\n }\n return [...grupos.values()]\n .map((g) => ({\n ...g,\n rows: [...g.rows].sort((a, b) => (a.personName ?? '').localeCompare(b.personName ?? '')),\n }))\n .sort((a, b) => (a.kind === b.kind\n ? a.label.localeCompare(b.label)\n : a.kind === 'area' ? -1 : 1))\n}\n\n/** \"05:00:00\" do banco vira \"05:00\" na tela. */\nexport function shortTime(cutoff: string | null | undefined): string {\n if (!cutoff) return '05:00'\n return cutoff.slice(0, 5)\n}\n\n/**\n * Quem atende ESTA mesa, agora.\n *\n * A mesa ganha da praça: escalar alguém para uma mesa específica é a exceção\n * que o gerente faz de propósito — a mesa do aniversário, a mesa do cliente\n * difícil — e uma exceção que perde para a regra geral não é exceção.\n */\nexport function staffForTable(\n assignments: ShiftAssignment[],\n tableId: string,\n areaId: string | null | undefined,\n now: Date | number = Date.now(),\n): ShiftAssignment[] {\n const vigentes = assignments.filter((e) => isCurrent(e, now))\n const daMesa = vigentes.filter((e) => e.tableId === tableId)\n if (daMesa.length > 0) return daMesa\n return areaId ? vigentes.filter((e) => e.areaId === areaId) : []\n}\n\n/**\n * O corte do dia pode ser SALVO?\n *\n * O V1 exige `HH:MM` completo (`/^\\d{2}:\\d{2}$/`) e mantém o botão apagado até\n * lá — um corte meio digitado gravaria um horário que ninguém quis.\n */\nexport function canSaveDayCut(valor: string): boolean {\n return /^\\d{2}:\\d{2}$/.test(valor.trim())\n}\n\n/**\n * O aviso DEPOIS de salvar o corte, e só quando há gente escalada terminando hoje.\n *\n * A regra que ele comunica é a que mais surpreende: **mudar o corte não é\n * retroativo.** O fim de quem já está escalado foi congelado na hora em que se\n * escalou, então o corte novo vale para as PRÓXIMAS. Sem esta frase, o gerente\n * muda o corte para consertar a escala de hoje, ela não muda, e ele conclui que\n * o sistema não salvou.\n */\nexport function dayCutSavedNotice(temFimHoje: boolean):\n { title: string; description: string } | undefined {\n if (!temFimHoje) return undefined\n return {\n title: 'Corte do dia salvo',\n description: 'Vale para as próximas escalas. Quem já está escalado mantém o fim de hoje.',\n }\n}\n\n/**\n * Como uma mesa se identifica na bandeja «Mesas sem ambiente».\n *\n * O V1 escreve `#{number} · {name}` porque tem a COLUNA `number`. O V2 não a\n * carrega no `PosPosition` e o número saía de `Number(label.replace(/\\D/g,''))`\n * — que dá **0** para toda mesa cujo nome não tem dígito.\n *\n * No Pertinho isso apareceu como três linhas `#0 · 1 lug.` indistinguíveis: são\n * «Balcão», «Delivery» e «Cardápio», pseudo-mesas que o V1 usava para guardar\n * comanda de canal. Três linhas com o mesmo nome, e o operador tinha de escolher\n * uma delas para colocar no salão.\n *\n * Sem número, o NOME identifica. `#0` não identifica nada e afirma um número que\n * a mesa não tem.\n */\nexport function unassignedLabel(t: { number?: number | null; name?: string | null }): string {\n const temNumero = typeof t.number === 'number' && Number.isFinite(t.number) && t.number > 0\n const nome = t.name?.trim()\n if (temNumero) return nome ? `#${t.number} · ${nome}` : `#${t.number}`\n return nome || 'Mesa sem número'\n}\n","// ---------------------------------------------------------------------------\n// As mesas que ainda não têm lugar no salão.\n//\n// Portada de `beautyplace/src/components/salao/floor/UnassignedTablesTray.tsx`.\n// A operação não as desenha — uma mesa sem ambiente não tem onde ser posta —,\n// e sem esta lista elas simplesmente não existem para quem edita: estão no\n// cadastro, contam na conta da casa, e some nenhuma tela as mostra.\n//\n// «Colocar» põe a mesa no CENTRO do ambiente de destino; daí é arrastar até o\n// lugar certo. O V1 escolhe o centro de propósito: é o único ponto que existe\n// em qualquer ambiente, de qualquer forma e tamanho, e é onde o olho procura\n// pela mesa que acabou de aparecer.\n// ---------------------------------------------------------------------------\n\nimport { MapPin } from 'lucide-react'\nimport { haptic } from '../lib/haptics'\nimport { unassignedLabel } from './shift'\n\nexport interface UnassignedTable {\n id: string\n /** Ausente ou 0 = a mesa não tem número, e o NOME identifica. */\n number?: number | null\n name?: string | null\n seats?: number | null\n}\n\nexport function UnassignedTables({ tables, targetName, onPlace }: {\n tables: UnassignedTable[]\n /** O ambiente que vai receber a mesa. `null` desabilita o botão. */\n targetName?: string | null\n onPlace: (table: UnassignedTable) => void\n}) {\n // Some quando não há nenhuma: uma lista vazia intitulada \"Mesas sem\n // ambiente (0)\" é uma pergunta já respondida ocupando a coluna.\n if (tables.length === 0) return null\n\n return (\n <div className=\"pos-unass\">\n <div>\n <p className=\"pos-unass__t\">Mesas sem ambiente ({tables.length})</p>\n <p className=\"pos-unass__h\">\n {targetName\n ? `«Colocar» leva a mesa para ${targetName}.`\n : 'Selecione um ambiente para receber as mesas.'}\n </p>\n </div>\n <ul className=\"pos-unass__list\">\n {tables.map((m) => (\n <li key={m.id} className=\"pos-unass__row\">\n <span className=\"pos-unass__n\">\n {/* `#0` não identifica nada — ver `unassignedLabel`. */}\n <strong>{unassignedLabel(m)}</strong>\n <span className=\"pos-unass__sub\"> · {m.seats ?? 0} lug.</span>\n </span>\n {/* Desabilitado COM motivo: a dica acima diz o que falta. Um botão\n morto sem explicação é a régua do porte quebrada. */}\n <button\n className=\"pos-unass__b\"\n disabled={!targetName}\n onClick={() => { haptic('tap'); onPlace(m) }}\n >\n <MapPin size={12} strokeWidth={2.4} aria-hidden /> Colocar\n </button>\n </li>\n ))}\n </ul>\n </div>\n )\n}\n","// ---------------------------------------------------------------------------\n// A linguagem de cor da mesa — UMA para o salão inteiro.\n//\n// Portado de `beautyplace/src/lib/salao/tableTone.ts`, regra por regra. O V2\n// tinha QUATRO estados (livre, ocupada, conta pedida, atenção) onde o V1 tem\n// SEIS, e nenhuma regra que os derivasse: o `status` vinha do banco e a tela\n// só o repetia.\n//\n// O que o V1 sabe e isto traz junto:\n//\n// 1. **A COMANDA MANDA.** Com comanda aberta a mesa está ocupada, seja qual\n// for o `status` gravado. O contrário também vale: `status = 'occupied'`\n// sem comanda é resto de sincronização e conta como LIVRE. É por isso que\n// o V1 não tem as \"13 mesas ocupadas sem ninguém sentado\" que o próprio\n// painel dele mostra noutro lugar.\n//\n// 2. **Atrasada ≠ parada.** Decisão do dono em 27/09/2026: o vermelho valia\n// para toda mesa aberta há mais de uma hora e se confundia com \"Fechar\n// conta\". O que merece o vermelho é o cliente que **não pede nada há uma\n// hora** — hora de oferecer algo ou a conta. Aberta há muito tempo mas\n// pedindo continua laranja.\n//\n// 3. **\"Fechar conta\" NÃO é um tom.** É um pedido do cliente esperando\n// resposta, e mora POR CIMA do tom da mesa (que segue ocupada, atrasada ou\n// parada). Ganha o anel, e é o único sinal que ganha — para continuar\n// visível quando o salão inteiro estiver colorido.\n//\n// 4. **Reservada e manutenção são CINZA de propósito.** Não são urgência, e\n// cor demais esconde a mesa atrasada.\n// ---------------------------------------------------------------------------\n\nexport type TableTone =\n | 'livre'\n | 'ocupada'\n | 'atrasada'\n | 'parada'\n | 'reservada'\n | 'manutencao'\n\n/** A partir de quantos minutos de comanda aberta a mesa passa a «atrasada». */\nexport const ATRASO_MINUTOS = 60\n\n/** A partir de quantos minutos SEM PEDIDO NOVO a mesa passa a «parada». */\nexport const SEM_PEDIDO_MINUTOS = 60\n\nexport interface TableToneInput {\n /** O `status` do cadastro: available | occupied | reserved | maintenance. */\n status?: string | null\n /** Há comanda aberta nesta mesa. */\n hasActiveOrder: boolean\n /** Abertura da comanda — é o que decide «atrasada». */\n openedAt?: string | null\n /**\n * Último item lançado — é o que decide «parada».\n *\n * `undefined` = a tela NÃO SABE (não carregou itens), e aí a mesa nunca vira\n * «parada» por falta de dado. `null` = sabe que não há item nenhum, e aí\n * conta desde a abertura: mesa aberta há uma hora sem pedir nada também é\n * parada. A diferença entre os dois é a diferença entre ignorância e fato.\n */\n lastOrderAt?: string | null\n /** «Agora», injetado, para a mesa virar atrasada sem depender de outro\n * evento provocar um re-render. */\n now?: number\n}\n\nexport function deriveTableTone(input: TableToneInput): TableTone {\n if (input.hasActiveOrder) {\n const agora = input.now ?? Date.now()\n const min = (iso: string) => Math.floor((agora - new Date(iso).getTime()) / 60_000)\n if (input.lastOrderAt !== undefined) {\n const desde = input.lastOrderAt ?? input.openedAt\n if (desde && min(desde) >= SEM_PEDIDO_MINUTOS) return 'parada'\n }\n return input.openedAt && min(input.openedAt) >= ATRASO_MINUTOS ? 'atrasada' : 'ocupada'\n }\n if (input.status === 'reserved') return 'reservada'\n if (input.status === 'maintenance') return 'manutencao'\n return 'livre'\n}\n\n/** «Tem gente sentada»: os três tons de comanda aberta. */\nexport function isTomOcupado(tone: TableTone): boolean {\n return tone === 'ocupada' || tone === 'atrasada' || tone === 'parada'\n}\n\n/** O rótulo que a pastilha do cartão mostra, na língua da casa. */\nexport const TONE_LABEL: Record<TableTone, string> = {\n livre: 'Livre',\n ocupada: 'Em andamento',\n atrasada: 'Atrasada',\n parada: 'Sem pedido há 1 h',\n reservada: 'Reservada',\n manutencao: 'Manutenção',\n}\n\n/** «Fechar conta» mora por cima do tom, não no lugar dele. */\nexport const CONTA_PEDIDA_LABEL = 'Fechar conta'\n\n/**\n * A mesma linguagem de cor, para o SVG da planta.\n *\n * Portado de `TONE_SVG` no `tableTone.ts` do V1. A grade pinta com classes; a\n * planta desenha num `<svg>`, onde `fill` e `stroke` precisam de um valor. São\n * os MESMOS tons — o operador que aprendeu a cor na grade não reaprende na\n * planta —, escritos nos tokens do PDV.\n */\nexport interface ToneSvg {\n fill: string\n stroke: string\n label: string\n /** As cadeiras em volta do tampo, sempre mais apagadas que ele. */\n chair: string\n}\n\nexport const TONE_SVG: Record<TableTone, ToneSvg> = {\n livre: {\n fill: 'var(--pos-2)',\n stroke: 'var(--pos-line-strong)',\n label: 'var(--pos-fg)',\n chair: 'var(--pos-fg-3)',\n },\n ocupada: {\n fill: 'var(--pos-warn)',\n stroke: 'transparent',\n label: 'var(--pos-fg)',\n chair: 'color-mix(in srgb, var(--pos-fg) 60%, transparent)',\n },\n atrasada: {\n fill: 'var(--pos-late)',\n stroke: 'transparent',\n label: '#FFFFFF',\n chair: 'rgba(255, 255, 255, 0.7)',\n },\n parada: {\n fill: 'var(--pos-danger)',\n stroke: 'transparent',\n label: '#FFFFFF',\n chair: 'rgba(255, 255, 255, 0.7)',\n },\n reservada: {\n fill: 'color-mix(in srgb, var(--pos-primary) 20%, transparent)',\n stroke: 'var(--pos-primary)',\n label: 'var(--pos-fg)',\n chair: 'var(--pos-fg-3)',\n },\n manutencao: {\n fill: 'var(--pos-2)',\n stroke: 'var(--pos-line-strong)',\n label: 'var(--pos-fg-3)',\n chair: 'color-mix(in srgb, var(--pos-fg-3) 50%, transparent)',\n },\n}\n\n/**\n * O anel de «Fechar conta» na planta — sólido, contra o tracejado da seleção.\n *\n * **Vermelho**, e é o mesmo vermelho da grade. Estava azul (`--pos-info`), e com\n * isso a MESMA mesa ganhava anel vermelho na grade e azul na planta: quem\n * aprendeu a cor de um lado tinha de reaprender do outro, que é exatamente o que\n * a nota do `TONE_SVG` acima diz não pode acontecer.\n *\n * O V1 usa `hsl(var(--destructive))`, e o `--destructive` dele também pinta o tom\n * `parada`. A colisão é deliberada: o que distingue o pedido de conta não é o\n * matiz, é a GEOMETRIA — 2px de anel com 1px de folga, por cima de qualquer tom.\n * Dar-lhe um matiz próprio inventaria uma quinta cor no salão para dizer o que o\n * anel já diz.\n */\nexport const CONTA_PEDIDA_SVG = 'var(--pos-danger)'\n","// ---------------------------------------------------------------------------\n// A conta CABE nesta forma de pagamento?\n//\n// `financial_receive_payment` tem regras próprias, e elas não são negociáveis\n// — lidas do corpo dela no cluster:\n//\n// credit_card → a conta TEM de ser `card_receivable_credit`\n// debit_card → a conta TEM de ser `card_receivable_debit`\n// qualquer outro método → a conta NÃO pode ser de recebível de cartão\n// cash → a conta é ignorada; liquida no caixa aberto\n//\n// O PDV já filtra as contas pelo `allowed_account_types` do TIPO, que é o\n// cadastro da casa. Isto é a rede embaixo: o cadastro é editável, e um\n// `allowed_account_types` frouxo ofereceria ao operador uma conta que a RPC\n// recusa — com a mesa já fechada e o cliente de pé. A regra da RPC não muda\n// com o cadastro, então ela pode morar aqui.\n// ---------------------------------------------------------------------------\n\n/** Os `kind` de conta que só recebem cartão. */\nconst RECEBIVEL_DE_CARTAO = new Set(['card_receivable_credit', 'card_receivable_debit'])\n\n/**\n * Esta forma PERGUNTA a conta?\n *\n * Dinheiro não. `financial_receive_payment` ignora `p_account_id` quando o\n * método é `cash` e liquida na sessão de caixa ABERTA do operador — a conta\n * escolhida não vai a lugar nenhum.\n *\n * E perguntar mesmo assim não era só inútil: o `allowed_account_types` do\n * `cash` inclui `cash_session`, e o cluster do Pertinho tem 118 delas. O\n * seletor listava **26 sessões de outros dias e de outras pessoas** —\n * «Caixa 04/05/2026 - SILVIO MAIA GMAIL» entre elas. Escolher uma afirmava ao\n * operador que o dinheiro ia para o caixa de outra pessoa, num dia que já\n * fechou. Um campo que mente é pior que um campo ausente.\n */\nexport function methodAsksAccount(transactionType: string | null | undefined): boolean {\n return transactionType !== 'cash'\n}\n\nexport function accountFitsMethod(\n transactionType: string | null | undefined,\n accountKind: string | null | undefined,\n): boolean {\n if (!accountKind) return false\n // Dinheiro não usa conta: liquida na sessão de caixa. Qualquer uma «cabe»\n // porque nenhuma será usada — e `methodAsksAccount` acima faz o campo sumir.\n if (transactionType === 'cash') return true\n if (transactionType === 'credit_card') return accountKind === 'card_receivable_credit'\n if (transactionType === 'debit_card') return accountKind === 'card_receivable_debit'\n return !RECEBIVEL_DE_CARTAO.has(accountKind)\n}\n","// ---------------------------------------------------------------------------\n// A BANDEIRA do cartão, no fechamento.\n//\n// Portado do `CheckoutPaymentMethodPicker` do V1 e do `lib/paymentMethodTypes`\n// dele. Duas listas fixas, e a escolha entre elas não é cosmética: a\n// conciliação do mês separa Visa de Alelo, e uma bandeira errada no\n// lançamento vira uma linha que não bate com o extrato da adquirente.\n// ---------------------------------------------------------------------------\n\n/** As seis do V1, nesta ordem. */\nexport const BANDEIRAS_CARTAO = ['Visa', 'Mastercard', 'Elo', 'Amex', 'Hipercard', 'Outra'] as const\n\n/** E as cinco do vale-refeição. */\nexport const BANDEIRAS_VALE = ['Pluxee', 'Alelo', 'VR', 'Ticket', 'Outra'] as const\n\nconst semAcento = (s: string) => s.normalize('NFD').replace(/[̀-ͯ]/g, '').toLowerCase()\n\n/**\n * É vale-refeição ou vale-alimentação? A regex do V1, palavra por palavra.\n *\n * Ela olha o NOME e não o `transaction_type`, e isso é de propósito. O\n * catálogo do Pertinho tem um único tipo `voucher`, e ele se chama **«Gift\n * Card»** — oferecer «Pluxee · Alelo · VR · Ticket» para um vale-presente\n * seria pior que não perguntar nada. O V1 classifica esse caso como\n * nem-cartão-nem-vale, e portanto sem bandeira; aqui também.\n */\nexport function isMealVoucherName(name: string | null | undefined): boolean {\n return /vale[\\s-]*(refeicao|alimentacao)/.test(semAcento(name || ''))\n}\n\n/**\n * Que bandeiras oferecer — ou `null` quando a pergunta não se faz.\n *\n * O V1 mostra o campo quando `isCard || isVoucher`. Cartão aqui vem do\n * `transaction_type`, que no V2 é confiável (`credit_card` / `debit_card`); o\n * vale continua vindo do nome, pela razão acima. Dinheiro, Pix, transferência\n * e cheque não têm bandeira, e um seletor vazio ao lado deles é um campo que\n * o operador tenta preencher e não consegue.\n */\nexport function brandList(\n transactionType: string | null | undefined,\n typeName?: string | null,\n): readonly string[] | null {\n if (isMealVoucherName(typeName)) return BANDEIRAS_VALE\n if (transactionType === 'credit_card' || transactionType === 'debit_card') return BANDEIRAS_CARTAO\n return null\n}\n\n/**\n * A bandeira escolhida ainda vale para esta lista?\n *\n * Trocar de cartão para vale não pode levar a bandeira antiga junto: o V1 faz\n * essa limpeza num efeito, com o comentário «\"Visa\" num vale-refeição». Aqui\n * é função pura, chamada no mesmo lugar em que a lista muda.\n */\nexport function keepBrand(brand: string, list: readonly string[] | null): string {\n if (!list) return ''\n return list.includes(brand) ? brand : ''\n}\n\n/**\n * Parcela?\n *\n * Só o CRÉDITO. E a regra segue o tipo da CONTA escolhida, não o nome da\n * forma — é o que o V1 escreve em dois lugares: *«Credit-card behavior must\n * follow the selected account's account_type»*, porque o nome do método é\n * livre e mente («Cielo - Link de Pagamento A vista» é conta de débito).\n *\n * `card_receivable_debit` é o `cartao_debito_recebimento` do V1 neste cluster.\n */\nexport function asksInstallments(\n transactionType: string | null | undefined,\n accountKind?: string | null,\n typeName?: string | null,\n): boolean {\n if (isMealVoucherName(typeName)) return false\n if (accountKind === 'card_receivable_debit') return false\n return transactionType === 'credit_card'\n}\n","// ---------------------------------------------------------------------------\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 * Esta linha NÃO entra na base da taxa de serviço.\n *\n * A casa isenta por produto ou por categoria (couvert, brinde, item de\n * revenda), e a taxa incide sobre o que sobra — não sobre o subtotal. Somar\n * o subtotal inteiro cobra taxa sobre o que a casa disse que não cobra, e o\n * erro só aparece na conta do cliente.\n *\n * Quem marca é o app, que conhece a lista de isenções do inquilino; o\n * pacote só sabe respeitar a marca.\n */\n exemptFromService?: boolean\n /**\n * O desconto JÁ APLICADO nesta linha, em centavos.\n *\n * Mora na linha e não no rodapé porque é assim que ele foi concedido: o V1\n * desconta item a item, com motivo e autorizador, e o espelho da conta\n * imprime \"Desconto: -R$ 5,00\" embaixo do item que o recebeu. Um desconto\n * só no total não responde \"em quê?\", que é a primeira pergunta da mesa.\n */\n discountCents?: number\n /**\n * De QUEM é esta linha.\n *\n * `undefined`/`null` quer dizer \"da mesa\" — o que o grupo dividiu, e que no\n * V1 mora na pastilha \"Mesa\". Não é o mesmo que \"ainda não sei de quem é\":\n * é uma resposta, e é a resposta mais comum da noite.\n */\n guestId?: string | null\n}\n\n/**\n * Uma pessoa sentada nesta comanda.\n *\n * Portado de `beautyplace/src/components/orders/GuestBar.tsx`. O V1 guarda\n * gente de verdade na comanda — nome, telefone e o vínculo com a ficha do\n * cliente — e não um contador. É o que permite dividir a conta por pessoa,\n * dar taxa diferente a um participante e reconhecer quem já esteve na casa.\n */\nexport interface TicketGuest {\n id: string\n name: string\n /**\n * O ASSENTO — e é ele que a pastilha mostra, não a inicial do nome.\n *\n * O garçom fala com a mesa pelo número (\"o da 3\"), e é assim que ele acha a\n * pessoa quando volta com o prato. A inicial só ajuda quem já sabe o nome —\n * e quem já sabe o nome lê o nome, que está escrito ao lado.\n */\n seatNo?: number\n phone?: string | null\n /** Ficha do cliente, quando o telefone encontrou alguém no cadastro. */\n clientId?: string | null\n /** `null` = usa a taxa da mesa. Vazio NÃO é zero. */\n serviceChargePercent?: number | null\n /** Quem já quitou a parte dele: congelado, não se recalcula nem se move. */\n settled?: boolean\n /**\n * A CONTA CONGELADA de quem quitou.\n *\n * A mesa continua andando depois que alguém paga: entra item, muda a taxa,\n * some um cancelamento. Recalcular a conta de quem já quitou faria o valor\n * na tela divergir do valor no caixa — e é esse valor que o cliente levou no\n * comprovante. Por isso quem quitou carrega os números que o banco gravou na\n * hora do pagamento, e não os que a tela somaria agora.\n *\n * Ausente quer dizer \"nunca foi fechada\", que é diferente de zero: zero é\n * uma cortesia integral, e as duas leem a mesma tela.\n */\n /**\n * Quanto ESTE participante já pôs, em centavos — some quitado ou não.\n *\n * Diferente do `settledBill.paidCents`, que só existe para quem fechou a\n * conta. A transferência bloqueia por QUALQUER pagamento, que é a regra do\n * V1 — ver `guestTransferBlocked`.\n */\n paidCents?: number\n settledBill?: {\n itemsCents: number\n sharedCents: number\n coverCents: number\n serviceCents: number\n discountCents: number\n totalCents: number\n paidCents: number\n at?: string\n }\n}\n\n/**\n * Este participante é só uma CADEIRA, ainda sem nome.\n *\n * Regra literal do V1 (`lib/syncGuestsToCount.ts`): sem telefone, sem ficha, e\n * com o nome no formato \"Pessoa N\". Abrir a mesa para 4 cria quatro cadeiras\n * assim, e a diferença importa na tela: a cadeira anônima ABRE A IDENTIFICAÇÃO\n * ao ser tocada, enquanto a pessoa com nome apenas se seleciona.\n *\n * É a razão de o operador conseguir dizer \"a Ana pediu esse\" sem cadastrar\n * ninguém antes: o nome entra quando aparece, não na abertura.\n */\nexport function isAnonymousGuest(g: Pick<TicketGuest, 'name' | 'phone' | 'clientId'>): boolean {\n if (g.phone || g.clientId) return false\n // `\\s*` e não `\\s+`, porque é o que o BANCO usa.\n //\n // `comanda_apply_cover_charges` decide identificado/não-identificado com\n // `label !~* '^Pessoa\\s*[0-9]+$'` (conferido na função aplicada), e o V1 usa\n // a mesma forma. Com `\\s+`, «Pessoa1» sem espaço contava como IDENTIFICADO\n // na tela e como anônimo no banco — e essa diferença decide a quantidade de\n // couvert que a pessoa paga.\n //\n // Hoje é latente: medido no Pertinho, 0 de 1.314 participantes têm rótulo sem\n // espaço. Alinhar custa um caractere, e a alternativa é esperar que alguém\n // digite «Pessoa1» para descobrir que as duas metades discordam.\n return /^Pessoa\\s*\\d+$/i.test(g.name.trim())\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 /** As pessoas da comanda, quando a casa as identifica uma a uma. */\n party?: TicketGuest[]\n lines: TicketLine[]\n openedAt: string\n}\n\nexport interface TicketTotals {\n subtotalCents: number\n serviceCents: number\n discountCents: number\n /** O couvert: entra no total, fora da base da taxa. */\n coverCents: number\n totalCents: number\n}\n\nexport type TicketAction =\n | {\n type: 'add_item'\n item: PosItem\n lineId: string\n /** De quem é. Ausente = da mesa — o compartilhado, e o caso comum. */\n guestId?: string | null\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 // ...E do MESMO dono. O V1 deduplica por `product_id + guest_id`,\n // e é isso que impede o chope da Ana de engordar a linha do\n // Breno: juntar os dois devolve uma conta que não se reparte.\n (l.guestId ?? null) === (action.guestId ?? null) &&\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 // A isenção viaja do item para a linha: a política da casa é sobre\n // o PRODUTO, e a conta se faz sobre a linha.\n ...(action.item.exemptFromService ? { exemptFromService: true } : {}),\n ...(action.guestId ? { guestId: action.guestId } : {}),\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: {\n serviceChargePercent?: number\n discountCents?: number\n coverCents?: number\n /**\n * Os participantes, com a taxa própria de cada um.\n *\n * Sem eles a TELA cobra um percentual só, e passa a discordar do PAPEL —\n * que sempre soube dividir por participante (`calculateBillTotals`). Ver\n * a nota da taxa abaixo.\n */\n party?: readonly { id: string; serviceChargePercent?: number | null }[]\n } = {},\n): TicketTotals {\n const subtotalCents = ticket.lines.reduce((sum, l) => sum + l.unitPriceCents * l.quantity, 0)\n // ── A TAXA DE SERVIÇO, pela regra do V1 ────────────────────────────────\n //\n // O V1 calcula a taxa IGUAL na tela (`orderDisplayTotals.ts`) e no papel\n // (`tableBillPrint.ts`), e as duas fazem três coisas que a versão anterior\n // desta função não fazia:\n //\n // 1. **A base desconta.** `Math.max(0, total_price - discount_amount)`. Um\n // desconto de linha inflava a taxa: R$ 100 com R$ 30 de desconto cobrava\n // 13% sobre 100.\n // 2. **Cada participante usa a taxa DELE.** `guestOverride != null ?\n // guestOverride : padrão` — e `null` não é zero: vazio quer dizer\n // \"usa a da mesa\". Sem isto, o participante com 0% acordado pagava os\n // 13% na tela e não pagava no papel.\n // 3. **A linha SEM participante** usa sempre a taxa da mesa: no V1 o\n // `guestId == null` nem consulta o mapa de override.\n //\n // O papel do V2 já era assim. A tela não era — e das duas quem o cliente lê\n // primeiro é a tela, enquanto o papel é o que ele leva para conferir.\n const percentDe = new Map((options.party ?? []).map((g) => [g.id, g.serviceChargePercent]))\n const elegivelPor = new Map<string | null, number>()\n for (const l of ticket.lines) {\n if (l.exemptFromService) continue\n const liquido = Math.max(0, l.unitPriceCents * l.quantity - Math.max(0, l.discountCents ?? 0))\n const dono = l.guestId ?? null\n elegivelPor.set(dono, (elegivelPor.get(dono) ?? 0) + liquido)\n }\n let serviceCents = 0\n for (const [dono, elegivel] of elegivelPor) {\n const proprio = dono == null ? null : percentDe.get(dono)\n const percent = proprio != null ? proprio : (options.serviceChargePercent ?? 0)\n if (percent) serviceCents += serviceChargeCents(elegivel, percent)\n }\n // O DESCONTO DA LINHA entra no total, não só na base da taxa.\n //\n // `subtotalCents` fica BRUTO de propósito: é assim que o papel apresenta —\n // «Subtotal» e «Desconto» em linhas separadas, como no V1. O que não podia\n // continuar é o total ignorar o abatimento: ele somava o bruto e subtraía\n // apenas um desconto de COMANDA, então os R$ 194,55 concedidos linha a linha\n // na Mesa 100 do Pertinho eram cobrados de volta no rodapé.\n //\n // O V1 faz IGUAL, e a nota antiga aqui dizia o contrário: lá o\n // `itemsSubtotal` também soma `total_price` BRUTO, com `itemDiscount` numa\n // segunda passada — o `max(0, total_price - discount_amount)` do V1 é a base\n // da TAXA, não o subtotal. Conferido em `lib/tableBillPrint.ts:94`.\n //\n // O número final é o mesmo de qualquer forma; a correção é do que se afirma\n // sobre o contrato, porque é essa frase que o próximo porte vai copiar.\n const lineDiscountCents = ticket.lines.reduce(\n (sum, l) => sum + Math.max(0, l.discountCents ?? 0),\n 0,\n )\n const discountCents = (options.discountCents ?? 0) + lineDiscountCents\n // O COUVERT entra no total e NÃO na base da taxa.\n //\n // Ele não é item de cardápio — ninguém pede couvert — e cobrar taxa de\n // serviço sobre ele seria cobrar serviço de uma cobrança. Ficar fora do\n // total, porém, é pior: a tela mostrava a linha do couvert e somava sem\n // ela, e o cliente pagava R$ 24,00 a mais do que o papel dizia.\n const coverCents = options.coverCents ?? 0\n return {\n subtotalCents,\n serviceCents,\n discountCents,\n coverCents,\n totalCents: subtotalCents + serviceCents + coverCents - 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 /**\n * As comandas que o POOL conhece, chegando depois da montagem.\n *\n * O livro nasce de um inicializador de `useReducer`, que roda UMA vez — e\n * as comandas abertas levam uma ida ao banco para chegar. Sem esta ação, o\n * livro fica com o que existia no primeiro render (nada) e a mesa aberta\n * abre vazia: o operador lança três itens, envia para a cozinha, volta à\n * mesa e não vê nada. Foi exatamente o que aconteceu.\n *\n * A regra da fusão: o servidor preenche o que o livro NÃO TEM, e nunca\n * substitui uma comanda com linha pendente. Uma linha que o operador acabou\n * de tocar e ainda não enviou só existe aqui; sobrescrevê-la com a versão do\n * banco apagaria o trabalho dele no meio do pedido.\n */\n | { type: 'hydrate'; tickets: Record<string, TicketLine[]>; at: 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 'hydrate': {\n let changed = false\n const next = { ...book }\n for (const [positionId, lines] of Object.entries(action.tickets)) {\n const current = book[positionId]\n const temPendente = current?.lines.some((l) => (l.state ?? 'pending') === 'pending')\n // Nada a fazer se o operador está com a mão na comanda, ou se o que\n // veio do banco é igual ao que já está na tela.\n if (temPendente) continue\n // O QUE CONTA COMO «IGUAL» decide se a tela recarrega.\n //\n // Eram id e quantidade, só. O DESCONTO não mexe em nenhum dos dois: ele\n // muda `discountCents` da linha. Então aplicar 10% num item gravava\n // certo no banco (`items.discount = 1,00`, `orders.total = 19,00`) e a\n // comparação aqui dizia «igual», o livro não era atualizado, e o botão\n // continuava oferecendo **Fechar conta R$ 20,00** — um real a mais do\n // que o cliente deve, no botão que cobra.\n //\n // O `state` entra pela mesma razão: uma linha que a cozinha marcou como\n // entregue não muda de id nem de quantidade, e a tela ficaria dizendo\n // «Enviado» para sempre.\n const igual = current\n && current.lines.length === lines.length\n && current.lines.every((l, i) => {\n const nova = lines[i]\n return l.id === nova?.id\n && l.quantity === nova?.quantity\n && (l.discountCents ?? 0) === (nova?.discountCents ?? 0)\n && (l.state ?? 'pending') === (nova?.state ?? 'pending')\n })\n if (igual) continue\n next[positionId] = {\n id: current?.id ?? `t-${positionId}`,\n openedAt: current?.openedAt ?? action.at,\n seatedAt: current?.seatedAt,\n positionId,\n lines,\n }\n changed = true\n }\n return changed ? next : book\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/**\n * As linhas da comanda, repartidas por quem vai pagar.\n *\n * Portado de `groupedSentItems()` em `beautyplace/src/components/orders/OrderCart.tsx`.\n * Três regras, e as três são do V1:\n *\n * 1. **Sem participante, sem grupo.** Uma comanda que ninguém identificou é\n * uma lista, não um conjunto de contas — e desenhar um cartão \"Mesa\" em\n * volta dela só gasta borda.\n * 2. **A \"Mesa\" vem primeiro**, e só se tiver o que mostrar. É o que o grupo\n * dividiu: a couvert, a travessa, a garrafa.\n * 3. **Participante sem item não aparece.** O lugar dele é a pastilha lá em\n * cima; um cartão vazio no meio da conta sugere que falta alguma coisa.\n */\nexport function groupLinesByGuest(\n lines: TicketLine[],\n party: TicketGuest[],\n sharedLabel = 'Mesa',\n): Array<{ guestId: string | null; guestName: string | null; lines: TicketLine[] }> {\n if (party.length === 0) return [{ guestId: null, guestName: null, lines }]\n const grupos: Array<{ guestId: string | null; guestName: string | null; lines: TicketLine[] }> = []\n const daMesa = lines.filter((l) => !l.guestId)\n if (daMesa.length > 0) grupos.push({ guestId: null, guestName: sharedLabel, lines: daMesa })\n for (const g of party) {\n const minhas = lines.filter((l) => l.guestId === g.id)\n if (minhas.length > 0) grupos.push({ guestId: g.id, guestName: g.name, lines: minhas })\n }\n return grupos\n}\n\n/**\n * O que ESTE participante deve: itens, mais a taxa sobre a parte elegível.\n *\n * O percentual efetivo é o override dele quando existe, e o da mesa quando\n * não — `null` no participante quer dizer \"usa o da mesa\", nunca zero. Errar\n * isso cobra 0% de quem nunca pediu isenção.\n */\nexport function guestSubtotal(\n lines: TicketLine[],\n tablePercent: number,\n guestPercent?: number | null,\n): { itemsCents: number; discountCents: number; eligibleCents: number; serviceCents: number; totalCents: number } {\n const percent = guestPercent != null ? guestPercent : tablePercent\n let itemsCents = 0\n let discountCents = 0\n let eligibleCents = 0\n for (const l of lines) {\n const bruto = l.unitPriceCents * l.quantity\n const desconto = Math.max(0, l.discountCents ?? 0)\n itemsCents += bruto\n discountCents += desconto\n // A base da taxa DESCONTA, como no total da comanda e como no V1\n // (`max(0, total_price - discount_amount)`). Sem isto a pessoa que ganhou\n // R$ 30 de abatimento paga gorjeta sobre os R$ 30 — e o papel, que já\n // descontava, discordaria da conta dela.\n if (!l.exemptFromService) eligibleCents += Math.max(0, bruto - desconto)\n }\n const serviceCents = Math.round((eligibleCents * percent) / 100)\n return {\n itemsCents,\n discountCents,\n eligibleCents,\n serviceCents,\n // O abatimento sai do total da pessoa, não só da base da taxa.\n totalCents: itemsCents - discountCents + serviceCents,\n }\n}\n\n/** O estado de quitação de um participante no fechamento. */\nexport type SettlementStatus = 'open' | 'partial' | 'settled'\n\nexport interface SettlementItem {\n id: string\n name: string\n /** Fracionária quando o item é DA MESA e está rateado. */\n quantity: number\n totalCents: number\n shared: boolean\n}\n\nexport interface Settlement {\n guestId: string | null\n guestName: string\n items: SettlementItem[]\n subtotalCents: number\n serviceCents: number\n coverCents: number\n totalCents: number\n paidCents: number\n balanceCents: number\n status: SettlementStatus\n}\n\n/**\n * A conta de cada participante no fechamento — o «Resumo da Conta» do V1.\n *\n * A parte difícil é o RATEIO: o que a mesa dividiu (a travessa, a garrafa) não\n * é de ninguém, e some da conta se cada um só vir o que pediu. O V1 divide\n * pelo número de pessoas e mostra a quantidade FRACIONÁRIA — `0,50× Garrafa de\n * vinho` — porque é isso que faz a divisão se explicar sozinha na mesa. Um\n * valor rateado sem a fração vira \"por que estou pagando por isso?\".\n *\n * A taxa sai da base elegível de cada um, com o percentual dele quando tem.\n */\nexport function settlementsOf(\n ticket: Ticket,\n party: TicketGuest[],\n options: {\n serviceChargePercent?: number\n paidCents?: Record<string, number>\n coverCents?: Record<string, number>\n sharedLabel?: string\n } = {},\n): Settlement[] {\n const tablePercent = options.serviceChargePercent ?? 0\n const pagos = options.paidCents ?? {}\n\n // O que ninguém reivindicou é DA MESA, e a mesa é uma conta como as outras.\n //\n // A primeira versão RATEAVA: cada item sem dono virava uma fração na conta de\n // todo mundo. É defensável na aritmética e indefensável na tela — numa mesa\n // de vinte e duas pessoas com vinte e três itens sem dono, a comanda virava\n // uma parede de \"0,08× Coca Cola Normal\" e ninguém achava o próprio pedido.\n // E não é o que o V1 faz: lá o grupo `Mesa` guarda o compartilhado inteiro,\n // cada participante mostra só o dele, e quem paga a mesa paga aquele grupo.\n // Voltar ao contrato do V1 é também voltar ao que se lê.\n const daMesa = ticket.lines.filter((l) => !l.guestId)\n const alvos: Array<{ id: string | null; name: string; percent?: number | null }> = [\n ...(daMesa.length > 0 || party.length === 0\n ? [{ id: null, name: options.sharedLabel ?? 'Mesa' }]\n : []),\n ...party.map((g) => ({ id: g.id, name: g.name, percent: g.serviceChargePercent })),\n ]\n\n return alvos.map((alvo) => {\n const proprios: SettlementItem[] = ticket.lines\n // `?? null` porque a linha da mesa vem com `guestId` AUSENTE, não nulo —\n // e `undefined === null` é falso. Sem isso, a conta sem participantes\n // fechava em zero com os itens todos na tela.\n .filter((l) => (l.guestId ?? null) === alvo.id)\n .map((l) => ({\n id: l.id,\n name: l.name,\n quantity: l.quantity,\n totalCents: l.unitPriceCents * l.quantity - (l.discountCents ?? 0),\n shared: false,\n }))\n\n const items = proprios\n const subtotalCents = items.reduce((s, i) => s + i.totalCents, 0)\n // A base da taxa não inclui o que a casa isentou.\n const isentos = new Set(ticket.lines.filter((l) => l.exemptFromService).map((l) => l.id))\n const elegivel = items.reduce((s, i) => (\n isentos.has(i.id) ? s : s + i.totalCents\n ), 0)\n const percent = alvo.percent != null ? alvo.percent : tablePercent\n const serviceCents = Math.round((elegivel * percent) / 100)\n const coverCents = options.coverCents?.[alvo.id ?? 'mesa'] ?? 0\n const totalCents = subtotalCents + serviceCents + coverCents\n const paidCents = pagos[alvo.id ?? 'mesa'] ?? 0\n const balanceCents = Math.max(0, totalCents - paidCents)\n const status: SettlementStatus =\n paidCents <= 0 ? 'open' : balanceCents <= 0 ? 'settled' : 'partial'\n\n return {\n guestId: alvo.id, guestName: alvo.name, items,\n subtotalCents, serviceCents, coverCents, totalCents, paidCents, balanceCents, status,\n }\n })\n}\n","// ---------------------------------------------------------------------------\n// Em qual comanda o item cai — e por que UM slot para tudo sem mesa não serve.\n//\n// A tela guarda as comandas num livro com chave por posição, e a venda sem\n// posição ganhava um slot único, `__counter`. Isso fazia duas coisas erradas ao\n// mesmo tempo:\n//\n// 1. **Trocar de canal não largava a mesa.** O toque em «Balcão» só trocava a\n// view; `activePositionId` continuava sendo `m11`. Então o item lançado no\n// balcão caía na comanda da MESA 11 — uma mesa com gente sentada, que vai\n// receber a conta com o refrigerante de um desconhecido. A bandeja já tinha\n// sido consertada para não exibir a Mesa 11 nesse canal, o que tirou da\n// tela o único sinal de que ela ainda estava escolhida.\n//\n// 2. **Balcão e Retirada dividiam o slot.** Com um `__counter` só, a sacola da\n// retirada entrava na venda do balcão. No V1 são contas diferentes por\n// regra: o balcão reaproveita a do dia, a retirada só a vazia (ver\n// `specialReuse.ts`).\n//\n// A regra do V1 é a da trilha: **tocar num canal escolhe AQUELE canal**, e a\n// conta anterior fica aberta onde está — na bandeja, com a idade dela, porque\n// conta aberta é dinheiro que não entrou. Ela só deixa de ser a que recebe o\n// próximo item.\n// ---------------------------------------------------------------------------\n\n/** Slot da venda sem posição, por CANAL. */\nexport const COUNTER_PREFIX = '__counter'\n\n/** O slot de um canal sem mesa — `__counter:balcao`, `__counter:retirada`. */\nexport function counterSlot(menuId: string | undefined): string {\n return menuId ? `${COUNTER_PREFIX}:${menuId}` : COUNTER_PREFIX\n}\n\n/** Este slot é de canal (e não uma posição de verdade)? */\nexport function isCounterSlot(key: string | undefined): boolean {\n return !!key && (key === COUNTER_PREFIX || key.startsWith(`${COUNTER_PREFIX}:`))\n}\n\n/**\n * A chave do livro para o estado atual.\n *\n * Posição escolhida ganha: uma comanda de balcão tocada na bandeja tem id de\n * verdade, e é nela que o item deve cair. Sem posição, o slot é o do canal.\n */\nexport function ticketSlot(activePositionId: string | undefined, menuId: string | undefined): string {\n return activePositionId ?? counterSlot(menuId)\n}\n\n/**\n * Trocar de canal larga a posição escolhida?\n *\n * A régua não é \"mudou o id do menu\": é **a conta ativa pertence a este\n * canal?**. Medido na tela do Pertinho: tocar numa mesa ocupada muda a view\n * para o cardápio, e o cardápio que existe é o do BALCÃO — então a trilha\n * passava a marcar «Balcão» com a comanda da Mesa 3 ativa. Nesse estado, o\n * toque em «Balcão» (o canal que a trilha já dizia ser o corrente) não trocava\n * de id nenhum, e a venda de balcão caía na conta da mesa com gente sentada.\n *\n * Ficar no mesmo canal COM uma conta daquele canal não larga nada: é o operador\n * tocando onde já está, e perder a comanda aberta aí seria castigo por um toque\n * repetido.\n */\nexport function channelSwitchDropsPosition(\n from: { menuId?: string; activeKind?: string },\n to: { menuId: string; kind?: string },\n): boolean {\n if (from.menuId !== to.menuId) return true\n // Mesmo menu, conta de outro canal: é o caso da mesa que jogou a trilha para\n // o cardápio do balcão. O toque no canal é um pedido de ir para ELE.\n if (from.activeKind && to.kind && from.activeKind !== to.kind) return true\n return false\n}\n\n/**\n * Qual canal a trilha deve marcar como corrente.\n *\n * Não é sempre o menu visível. Quando há uma conta ativa, ela manda: a Mesa 3\n * aberta com o cardápio do balcão na tela é uma conta de SALÃO, e marcar\n * «Balcão» ali diz ao operador que ele está num canal em que não está. A trilha\n * é o que ele lê para saber onde o próximo item cai; ela não pode mentir sobre\n * isso.\n */\nexport function currentChannelId(\n menuId: string | undefined,\n activeKind: string | undefined,\n menus: Array<{ id: string; kind?: string }>,\n): string | undefined {\n if (!activeKind) return menuId\n const doMenu = menus.find((m) => m.id === menuId)\n if (doMenu?.kind === activeKind) return menuId\n return menus.find((m) => m.kind === activeKind)?.id ?? menuId\n}\n\n/** De `__counter:balcao` para `balcao`. Posição de verdade devolve undefined. */\nexport function channelOfSlot(key: string | undefined): string | undefined {\n if (!key || !key.startsWith(`${COUNTER_PREFIX}:`)) return undefined\n return key.slice(COUNTER_PREFIX.length + 1) || undefined\n}\n\n/**\n * A recusa do V1 quando não há unidade escolhida.\n *\n * Literal, e uma por canal — o V1 escreveu as três à mão em vez de montar a\n * frase, e o motivo é o mesmo em todas: *\"A comanda precisa da unidade para\n * chegar à cozinha.\"* Sem unidade o pedido nasce sem casa e não chega a tela\n * nenhuma da produção.\n *\n * Numa conta de uma casa só isto nunca dispara; é a conta com várias unidades e\n * «Todas as unidades» no topo que cai aqui.\n */\nexport function channelUnitRefusal(\n channel: string,\n unitId: string | null | undefined,\n /**\n * A casa trabalha com unidades? (`tenants.unit_scoping_enabled`)\n *\n * O V1 não tem este eixo: lá a unidade é obrigatória e `currentUnit.id`\n * existe sempre. No V2 ela é OPCIONAL, e `getActiveUnitId()` devolve\n * `undefined` tanto para «Todas as unidades» quanto para uma casa que não usa\n * unidades — dois estados muito diferentes com o mesmo valor.\n *\n * Portar a recusa ao pé da letra travaria o balcão PARA SEMPRE em toda casa\n * de uma unidade só: não há unidade a escolher, então não há como sair da\n * recusa. Sem unidades não há unidade a exigir, e a comanda abre com\n * `unit_id` nulo.\n */\n unitMode = true,\n): { text: string; detail: string } | undefined {\n if (unitId || !unitMode) return undefined\n const text = channel === 'delivery'\n ? 'Selecione uma unidade antes de iniciar o Delivery.'\n : channel === 'retirada'\n ? 'Selecione uma unidade antes de abrir uma Retirada.'\n : 'Selecione uma unidade antes de abrir o Balcão.'\n return { text, detail: 'A comanda precisa da unidade para chegar à cozinha.' }\n}\n\n// ---------------------------------------------------------------------------\n// A comanda de canal que NÃO é a gaveta.\n//\n// A gaveta (`__counter:balcao`) é uma só: é onde a próxima venda aterrissa. As\n// outras comandas abertas do canal — as que a regra de reaproveitamento deixa\n// de fora — continuam existindo, e o V1 é explícito sobre onde elas moram:\n// *«it stays in the dock with its age badge, because an open bill is money\n// that has not come in»*.\n//\n// Elas precisam de id próprio: `__counter:balcao:<uuid>` faria `channelOfSlot`\n// devolver «balcao:<uuid>», e a comparação de canal passaria a mentir.\n// ---------------------------------------------------------------------------\n\n/** O prefixo das comandas abertas que não são a gaveta do canal. */\nexport const OPEN_BILL_PREFIX = '__open'\n\n/** O id de posição de uma comanda aberta avulsa. */\nexport function openBillSlot(orderId: string): string {\n return `${OPEN_BILL_PREFIX}:${orderId}`\n}\n\n/** O id da comanda, quando a posição é uma dessas. `undefined` se não for. */\nexport function orderOfOpenBill(key: string | undefined): string | undefined {\n if (!key || !key.startsWith(`${OPEN_BILL_PREFIX}:`)) return undefined\n return key.slice(OPEN_BILL_PREFIX.length + 1) || undefined\n}\n\n/**\n * A posição é SINTÉTICA — não é mesa?\n *\n * As duas famílias que o PDV inventa: a gaveta do canal e a comanda avulsa.\n * Nenhuma tem linha em `plg_tables_tables`, e mandar qualquer uma delas para\n * uma coluna `uuid` derruba a consulta inteira.\n */\nexport function isSyntheticPosition(key: string | undefined): boolean {\n return !!key && (key.startsWith(`${COUNTER_PREFIX}`) || key.startsWith(`${OPEN_BILL_PREFIX}:`))\n}\n","// ---------------------------------------------------------------------------\n// A qual canal uma comanda pertence — a mesma regra do trilho, aplicada a uma\n// LINHA em vez de à tela.\n//\n// Porte de `canalDaComanda` do `OrdersDashboard` do V1. A ordem importa e não é\n// arbitrária: **a mesa ganha primeiro**. Uma conta com mesa é do salão, não\n// importa o que a coluna de canal diga — e o balcão é o PADRÃO, o que sobra\n// quando não há mesa e o canal não se identifica.\n//\n// Por que derivar em vez de ler a coluna: no Pertinho, 3.766 contas históricas\n// do V1 foram importadas com `channel` NULO e mesa preenchida. Filtrando pela\n// coluna, o painel «Histórico do balcão» listava sessenta contas de MESA\n// («Mesa 1 · R$ 201,03») num canal que não tinha uma única linha — e o V1 já\n// tinha corrigido o espelho disto, com o motivo escrito no fonte: *\"uma venda\n// de balcão fechada não é «mesa fechada», e misturar as duas devolveria ao\n// garçom uma lista que não é a dele.\"*\n// ---------------------------------------------------------------------------\n\n/** O vocabulário de `orders.channel` no V2. */\nimport { channelOfOrder } from '@fayz-ai/core'\n\nexport type ComandaChannel = 'dine_in' | 'balcao' | 'retirada' | 'delivery'\n\nexport function comandaChannel(o: {\n tableId?: string | null\n channel?: string | null\n /** A ESPÉCIE do V1 — `counter`, `takeout`, `delivery`, `sale`… */\n kind?: string | null\n}): ComandaChannel | null {\n // A mesa decide, e decide primeiro.\n if (o.tableId) return 'dine_in'\n\n // Depois o CANAL, e quando ele falta, a espécie.\n //\n // A queda era «tudo o que não é mesa é balcão», e ela mentia sobre o que a\n // migração trouxe: `channel` nulo com `kind` preenchido. No Pertinho, o\n // «Histórico do balcão» somava 24 vendas de DELIVERY (R$ 648,00) e dez de\n // ESTOQUE (`kind: 'sale'`, R$ 217,95) num balcão que vendeu R$ 367,00 — e a\n // lista do delivery ficava vazia.\n //\n // `channelOfOrder` é a mesma tradução que o carregador de canal usa, e ela\n // recusa o que não é canal: uma venda de estoque devolve `null` e some da\n // lista, em vez de engordar a do balcão.\n const canal = channelOfOrder({ channel: o.channel, kind: o.kind })\n if (canal === 'retirada') return 'retirada'\n if (canal === 'delivery') return 'delivery'\n if (canal === 'balcao') return 'balcao'\n\n // Sem canal e sem espécie conhecida: só é balcão quando NADA se sabe. Uma\n // espécie que existe e não é canal (`sale`, `purchase`) não é do PDV.\n return o.kind ? null : 'balcao'\n}\n\n/**\n * Esta comanda fechada entra na lista deste canal?\n *\n * Duas condições, as duas do V1:\n *\n * 1. **o canal bate** — derivado, nunca lido da coluna;\n * 2. **valeu mais que zero.** *\"Mesa de R$ 0,00 é mesa aberta por engano e\n * fechada em seguida — num dia real elas são um terço da lista. Não houve\n * venda, não há nota a emitir e não há pagamento a conferir: na lista elas só\n * empurram para baixo as mesas que importam.\"*\n */\nexport function closedBelongsToChannel(\n // `kind` VEM JUNTO. Ele não estava aqui, e esta função repassa o objeto\n // inteiro para `comandaChannel`, que o LÊ — a espécie do V1 é o que separa\n // uma venda de estoque de uma comanda de balcão. O tipo era mais estreito que\n // o comportamento, e o TypeScript recusou um teste legítimo: «a venda de\n // estoque não entra em lista nenhuma» passava `kind: 'sale'` e era barrado por\n // propriedade excedente.\n o: { tableId?: string | null; channel?: string | null; totalCents?: number; kind?: string | null },\n channel: ComandaChannel,\n): boolean {\n if ((o.totalCents ?? 0) <= 0) return false\n return comandaChannel(o) === channel\n}\n","// ---------------------------------------------------------------------------\n// QUANDO a taxa de serviço pode mudar.\n//\n// Portado de `ServiceChargeSelector` do V1 — a metade que não é formulário.\n//\n// No V1 quem recusa é o servidor (`web-save-service-charge`), com três códigos\n// e três frases. O V2 escreve a taxa DIRETO, sem guarda nenhuma: baixar a taxa\n// de uma comanda que já recebeu pagamento mexe num total que alguém já\n// quitou, e ninguém fica sabendo.\n//\n// A regra é sobre dinheiro já recebido, e por isso mora aqui, testada:\n//\n// - **Pagamento sem quitação individual** é o caso perigoso. A comanda\n// recebeu dinheiro que não está preso a nenhum participante; mudar a taxa\n// redistribui um total que já foi pago em parte, e não há como dizer quem\n// pagou o quê.\n//\n// - **Só a REDUÇÃO abre a saída de emergência.** Subir a taxa depois de um\n// pagamento parcial é cobrar mais de quem ainda não pagou — chato, mas\n// consistente. Baixar é devolver dinheiro que já entrou, e é aí que o V1\n// oferece «retirar somente a taxa pendente».\n// ---------------------------------------------------------------------------\n\n/** Os motivos pelos quais a taxa não pode mudar agora. */\nexport type ServiceChargeBlock =\n | 'unscoped-payment'\n | 'unresolved-pos'\n | 'busy'\n\nconst FRASE: Record<ServiceChargeBlock, string> = {\n 'unscoped-payment':\n 'Existe um pagamento sem quitação individual comprovada. Confira a conciliação antes de mudar a taxa.',\n 'unresolved-pos':\n 'Existe um pagamento POS pendente de conciliação. Resolva esse pagamento antes de mudar a taxa.',\n busy: 'A comanda está sendo atualizada. Aguarde e tente novamente.',\n}\n\n/** O título é sempre o mesmo; o que muda é a explicação. */\nexport const SERVICE_CHARGE_BLOCK_TITLE = 'Não foi possível alterar a taxa de serviço'\n\nexport function serviceChargeBlockMessage(block: ServiceChargeBlock): string {\n return FRASE[block]\n}\n\nexport interface ServiceChargeState {\n /** Quanto a comanda já recebeu, no total. */\n paidCents: number\n /** Quanto desse pagamento está preso a um participante específico. */\n scopedPaidCents: number\n /** Um pagamento de POS ainda em conciliação. */\n hasUnresolvedPosPayment?: boolean\n}\n\n/**\n * Pode mudar a taxa? `null` quando sim.\n *\n * A ordem das perguntas é a do V1: o POS em conciliação vem antes, porque é\n * transitório — daqui a um minuto resolve sozinho, e mandar «confira a\n * conciliação» num caso que ia se resolver gasta o tempo de alguém.\n */\nexport function serviceChargeBlock(state: ServiceChargeState): ServiceChargeBlock | null {\n if (state.hasUnresolvedPosPayment) return 'unresolved-pos'\n // Pagamento SEM dono: o que entrou menos o que está preso a alguém.\n if (state.paidCents - state.scopedPaidCents > 0) return 'unscoped-payment'\n return null\n}\n\n/**\n * A saída de emergência — «Retirar somente a taxa pendente» — se oferece?\n *\n * Só depois de a mudança ter sido RECUSADA por pagamento sem dono, e só\n * quando a intenção era BAIXAR a taxa. Não é item de menu: é o que resta\n * quando o caminho normal fechou, e oferecê-la antes convidaria a usá-la como\n * atalho para não cobrar.\n */\nexport function offersWaive(\n block: ServiceChargeBlock | null,\n { current, next }: { current: number; next: number },\n): boolean {\n return block === 'unscoped-payment' && next < current\n}\n\n/** O motivo do «retirar» é FIXO — o sistema sabe por que está retirando. */\nexport const WAIVE_REASON = 'Taxa de serviço não recebida após pagamento parcial'\n\n/**\n * Esta linha está ISENTA da taxa de serviço?\n *\n * A casa isenta por PRODUTO ou por CATEGORIA — couvert, brinde, item de revenda\n * — e o V1 aplica as duas (`exemptProductIds` no produto, e a isenção de\n * categoria resolvida pelo cardápio).\n *\n * Existe aqui porque a linha que vem do BANCO não carrega categoria:\n * `categoryId` vive no item do menu. Só o cardápio marcava a isenção, então o\n * couvert ficava isento enquanto a página vivia e voltava TRIBUTÁVEL depois de um\n * reload — a taxa passava a incidir sobre o que a casa disse que não cobra, e\n * ninguém vê isso acontecer.\n */\nexport function isExemptFromService(\n productId: string | undefined | null,\n rule?: {\n productIds: Set<string>\n categoryIds: Set<string>\n /** `productId` → `categoryId`, montado do cardápio. */\n categoryOf: Map<string, string>\n },\n): boolean {\n if (!productId || !rule) return false\n if (rule.productIds.has(productId)) return true\n const categoria = rule.categoryOf.get(productId)\n return !!categoria && rule.categoryIds.has(categoria)\n}\n\n/**\n * A taxa que VALE para esta comanda.\n *\n * Duas fontes, e a ordem importa:\n *\n * 1. **O percentual da própria comanda**, quando existe — inclusive ZERO. Alguém\n * escolheu, e escolha manual não se sobrescreve.\n * 2. **A política da casa**, e só para comanda de MESA.\n *\n * A segunda linha é a regra do V1, escrita no `taxaServico.ts` dele:\n *\n * ```ts\n * const taxaPrevista = c.tipo === 'dine_in' ? arred(c.itensSubtotal * percentual / 100) : 0\n * ```\n *\n * Fora do salão a taxa prevista é ZERO. É a mesma regra que o\n * `OrdersDashboard` aplica ao abrir a comanda de canal — *\"Pedidos sem mesa\n * (balcão, delivery e retirada) não começam com taxa\"* — e as duas precisam\n * concordar, senão a tela pede uma gorjeta que o banco não registrou.\n *\n * No Pertinho isso estava CERTO POR ACIDENTE: não existe linha em\n * `plg_tables_settings`, então a política da casa lê 0 e o balcão não cobrava\n * nada. No dia em que alguém salvasse 13% ali, o balcão passaria a mostrar 13%\n * com o banco gravando 0 — e quem está no caixa seria cobrado de uma taxa que a\n * casa diz não cobrar naquele canal.\n */\nexport function effectiveServicePercent(\n storedPercent: number | null | undefined,\n housePercent: number | null | undefined,\n kind: string | null | undefined,\n): number {\n if (storedPercent != null) return storedPercent\n return kind === 'table' ? (housePercent ?? 0) : 0\n}\n\n// ---------------------------------------------------------------------------\n// A SAÍDA DE EMERGÊNCIA, por extenso.\n//\n// `offersWaive` acima decide QUANDO ela aparece. O que segue é o que a tela\n// diz e o que ela exige de volta do servidor — tudo literal do\n// `ServiceChargeSelector` do V1.\n// ---------------------------------------------------------------------------\n\n/** O aviso âmbar que precede o botão. Explica por que este caminho existe. */\nexport const WAIVE_BANNER =\n 'Esta comanda já recebeu um pagamento parcial sem vínculo individual. '\n + 'Para preservar o que foi pago, retire somente a parte da taxa que ainda está no saldo.'\n\n/** O rótulo do botão — «somente» é a palavra que o distingue de cancelar a taxa. */\nexport const WAIVE_LABEL = 'Retirar somente a taxa pendente'\n\nexport const WAIVE_BAD_ANSWER = 'Resposta inválida ao retirar a taxa pendente.'\n\n/** O que o servidor precisa devolver — os quatro números, e nenhum opcional. */\nexport interface WaiveAnswer {\n /** Quanto de taxa saiu do saldo. */\n waivedAmount: number\n /** O que sobra na comanda depois disso. */\n remainingAfter: number\n /** O percentual com que a comanda ficou. */\n serviceChargePercent: number\n /** E o valor de taxa que restou. */\n serviceChargeAmount: number\n /**\n * Isto é a REPETIÇÃO de um gesto que já aconteceu.\n *\n * A RPC devolve `idempotent: true` quando a chave de operação já foi usada:\n * ela responde o que aconteceu ANTES e não retira de novo (migration 027,\n * *«sem isto o toque duplo tira a taxa duas vezes»*). O campo existia desde\n * lá e ninguém o lia, então a tela anunciava «Taxa pendente retirada:\n * R$ 12,00» — com o valor original, no presente, como se tivesse acabado de\n * acontecer.\n *\n * Opcional porque um servidor antigo pode não mandá-lo, e ausente quer dizer\n * «foi agora», que é o caso comum.\n */\n idempotent?: boolean\n}\n\n/**\n * A resposta do servidor é conferida ANTES de a tela mudar.\n *\n * O V1 exige os quatro campos como número — `typeof !== 'number'` derruba a\n * operação inteira. A razão é a mesma do `assertServiceCharge`: aqui a tela\n * está prestes a afirmar ao operador que R$ X saíram da conta, e afirmar isso\n * a partir de um campo ausente é inventar o número na frente de quem paga.\n */\nexport function assertWaive(answer: unknown): WaiveAnswer {\n const a = answer as Partial<WaiveAnswer> | null\n if (!a\n || typeof a.waivedAmount !== 'number'\n || typeof a.remainingAfter !== 'number'\n || typeof a.serviceChargePercent !== 'number'\n || typeof a.serviceChargeAmount !== 'number') {\n throw new Error(WAIVE_BAD_ANSWER)\n }\n return a as WaiveAnswer\n}\n\n/**\n * O que a tela diz depois de retirar — título e explicação, como no V1.\n *\n * A segunda linha muda conforme sobra ou não saldo, e essa é a informação que\n * decide o próximo gesto do operador: se ainda resta, ele continua cobrando;\n * se zerou, a comanda pode fechar. O V1 usa a mesma folga de meio centavo que\n * usa no resto do arquivo.\n */\n/** A frase do V1 para a repetição, sem ponto final, como lá. */\nexport const WAIVE_ALREADY = 'A taxa pendente já estava retirada'\n\nexport function waiveNotice(\n waived: number,\n remainingAfter: number,\n /** `true` = a RPC respondeu uma retirada que já havia acontecido. */\n already?: boolean,\n): {\n title: string\n description: string\n} {\n return {\n // O V1 troca o TÍTULO na repetição e mantém a explicação — o saldo que\n // sobra é o mesmo fato nos dois casos, e é ele que decide o próximo gesto.\n title: already\n ? WAIVE_ALREADY\n : `Taxa pendente retirada: R$ ${waived.toFixed(2)}`,\n description: remainingAfter > 0.005\n ? `Ainda restam R$ ${remainingAfter.toFixed(2)} de itens ou outros valores na comanda.`\n : 'A comanda não possui mais saldo pendente.',\n }\n}\n\n\n/**\n * A lista de participantes quitados não pôde ser lida — a frase do V1,\n * palavra por palavra.\n *\n * Ele a mostra num toast E trava o salvar (`loadFailed`). Aqui ela é o\n * impedimento da folha, que é onde o V2 diz por que um botão está desligado.\n */\nexport const GUESTS_UNAVAILABLE =\n 'Não foi possível conferir os participantes quitados. Reabra a taxa para tentar novamente.'\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// O QUE JÁ FOI PAGO nesta comanda.\n//\n// Portado do bloco de pagamentos do `OrderCart` do V1 — a metade que não é\n// JSX. O rail do V1 não é só \"o que vou cobrar\": é também \"o que já entrou, de\n// quem e por qual forma\". Sem esta lista, fechar uma conta em duas formas de\n// pagamento é um ato de fé — a tela mostra um total menor e não diz por quê.\n//\n// A lista nasce RECOLHIDA, e a razão está escrita no V1: *\"Mesa grande chega a\n// 14 pagamentos, e a lista aberta empurrava a LISTA DE ITENS — a única coisa\n// que o operador lê o tempo todo.\"*\n// ---------------------------------------------------------------------------\n\nexport interface PaymentRow {\n id: string\n amountCents: number\n /** O participante que pagou. Ausente = pagou a mesa. */\n guestName?: string | null\n /** A forma de pagamento, quando o V2 sabe o nome dela. */\n methodName?: string | null\n /** Quem entregou o dinheiro, quando não há forma cadastrada. */\n paidByName?: string | null\n}\n\nexport interface PaymentEntry {\n id: string\n amountCents: number\n /** «Fulano · Cartão» — o que a linha mostra à esquerda. */\n label: string\n}\n\nexport interface PaymentSummary {\n entries: PaymentEntry[]\n totalCents: number\n /** «3 pagamentos» — plural do V1, singular incluído. */\n countLabel: string\n}\n\n/**\n * Quem pagou.\n *\n * O V1 cai para `Participante ${id}` quando não acha o nome. No V2 esse id é um\n * UUID, e imprimir um UUID ao lado de um valor é pior que não dizer nada — a\n * queda passa a ser o rótulo da conta compartilhada, que é o que aquele\n * pagamento de fato quita.\n */\nfunction quemPagou(row: PaymentRow, sharedLabel: string): string {\n const nome = row.guestName?.trim()\n return nome ? nome : sharedLabel\n}\n\n/**\n * Por qual forma.\n *\n * As duas quedas são do V1, literais: `Outro` quando a forma existe e o nome\n * não resolveu, `N/A` quando não há forma nenhuma e ninguém assinou o\n * pagamento.\n */\nfunction porQualForma(row: PaymentRow): string {\n const metodo = row.methodName?.trim()\n if (metodo) return metodo\n const assinou = row.paidByName?.trim()\n if (assinou) return assinou\n // A distinção do V1: forma DECLARADA e não resolvida é «Outro»; forma\n // ausente é «N/A». `methodName === null` significa \"não veio nome\"; a\n // ausência da chave significa \"não há forma\".\n return row.methodName === null ? 'Outro' : 'N/A'\n}\n\nexport function paymentSummary(\n rows: PaymentRow[],\n { sharedLabel = 'Mesa' }: { sharedLabel?: string } = {},\n): PaymentSummary {\n const entries = rows.map((r) => ({\n id: r.id,\n amountCents: r.amountCents,\n label: `${quemPagou(r, sharedLabel)} · ${porQualForma(r)}`,\n }))\n const totalCents = rows.reduce((s, r) => s + r.amountCents, 0)\n return {\n entries,\n totalCents,\n countLabel: `${rows.length} ${rows.length === 1 ? 'pagamento' : 'pagamentos'}`,\n }\n}\n","// ---------------------------------------------------------------------------\n// A camada onde toda folha do PDV mora.\n//\n// Uma folha é `position: fixed` e se achava, por isso, presa ao viewport. Não\n// está: no celular a comanda vira `.pos-aside { position: fixed; inset: 0;\n// display: flex }`, e uma folha declarada DENTRO dela — a de adicionar pessoa\n// à mesa, por exemplo — deixa de cobrir a tela e passa a ser mais um item de\n// flex do drawer, empilhada abaixo das pastilhas de participante. Foi o que o\n// founder viu: \"os modais estão carregando dentro do bottom drawer\".\n//\n// O `createPortal` tira a folha da árvore do DOM sem tirá-la da árvore do\n// React: os eventos, o contexto e o estado continuam vindo de quem a declarou,\n// e só a caixa muda de lugar. É a única forma de uma peça declarada onde ela\n// FAZ SENTIDO aparecer onde ela PRECISA.\n// ---------------------------------------------------------------------------\n\nimport { createPortal } from 'react-dom'\nimport type { ReactNode } from 'react'\n\nexport function SheetLayer({ children, ...rest }: {\n children: ReactNode\n role?: string\n 'aria-modal'?: boolean | 'true' | 'false'\n 'aria-label'?: string\n}) {\n const folha = <div className=\"pos-sheet\" {...rest}>{children}</div>\n if (typeof document === 'undefined') {\n // Sem `document` (render no servidor, teste sem DOM) a folha fica onde\n // está: melhor no lugar errado do que ausente.\n return folha\n }\n // O destino é a RAIZ DO PDV, não o `body`.\n //\n // O `body` resolveria o clipe do drawer e criaria dois problemas piores. O\n // primeiro: as cores do PDV são variáveis declaradas em `.pos`, e fora dela\n // `background: var(--pos-1)` não resolve para nada — a folha abria sem fundo,\n // com o salão inteiro lendo-se através dela. O segundo: irmã do takeover da\n // casca, que é `z-[120]`, ela ficava ATRÁS dele — o clique em \"Desconto\"\n // montava a folha e a tela não mudava.\n //\n // `.pos` fica acima do `.pos-aside` e dentro do tema: escapa do drawer, herda\n // as cores, e empilha onde sempre empilhou.\n return createPortal(folha, document.querySelector('.pos') ?? document.body)\n}\n","// ---------------------------------------------------------------------------\n// As pessoas da comanda.\n//\n// Portado de `beautyplace/src/components/orders/GuestBar.tsx`. É a peça que\n// transforma \"mesa de 4\" em quatro contas que se fecham separado — e a que o\n// V2 não tinha em forma nenhuma: o `Ticket` guardava `guests: number`, um\n// contador, e com um contador não se divide conta.\n//\n// Quatro regras que o V1 enuncia e que uma lista de nomes não teria:\n//\n// 1. **A pastilha \"Mesa\" vem primeiro e não se apaga.** É o que o grupo\n// dividiu — a couvert, a travessa, a garrafa. No balcão ela se chama\n// \"Balcão\", porque chamá-la de \"Mesa\" contradiz o selo \"Sem mesa\" logo\n// acima. O rótulo é do canal, não do componente.\n//\n// 2. **Cadeira anônima ABRE A IDENTIFICAÇÃO; pessoa com nome se seleciona.**\n// Abrir a mesa para 4 cria \"Pessoa 1..4\", e o toque nelas pergunta quem é.\n// É o que deixa o nome entrar QUANDO APARECE, sem cadastrar ninguém antes\n// — e é por isso que a cadeira anônima é tracejada: ela está pedindo algo.\n// (Duplo clique seleciona sem identificar, para quem já sabe o que quer.)\n//\n// 3. **O telefone vem ANTES do nome, e procura.** Digitou, achou a ficha,\n// o nome se preenche sozinho e a pastilha vira cliente conhecido. Pedir o\n// nome primeiro joga fora a única chave que liga a mesa ao cadastro.\n//\n// 4. **Excluir participante pergunta.** \"Esta ação não pode ser desfeita\" —\n// e não pode mesmo: as linhas dele perdem o dono no meio do serviço.\n// ---------------------------------------------------------------------------\n\nimport { useEffect, useRef, useState } from 'react'\nimport { Check, Phone, User, UserPlus, X } from 'lucide-react'\nimport { isAnonymousGuest, type TicketGuest } from './session'\nimport { SheetLayer } from './SheetLayer'\n\nexport interface GuestDraft {\n name: string\n phone?: string\n clientId?: string | null\n /**\n * `seat` = ocupa uma cadeira que a mesa já declarou.\n * `extra` = PUXA MAIS UMA, e o número de pessoas da mesa sobe.\n *\n * São duas coisas diferentes no salão: a mesa de quatro com três nomes tem\n * uma cadeira à espera, e dar nome a ela não muda o couvert nem a divisão da\n * conta. Chegar mais um muda. O padrão é a vaga, porque é o caso comum.\n */\n kind?: 'seat' | 'extra'\n /** O número do assento, quando a pessoa ocupa uma vaga que já existe. */\n seatNo?: number\n /** A taxa DESTA pessoa. `null` = usa a da mesa; vazio não é zero. */\n serviceChargePercent?: number | null\n}\n\n/** (00) 00000-0000 — a máscara do V1, dígito a dígito. */\nexport function formatPhone(raw: string): string {\n const d = raw.replace(/\\D/g, '').slice(0, 11)\n if (d.length <= 2) return d\n if (d.length <= 6) return `(${d.slice(0, 2)}) ${d.slice(2)}`\n if (d.length <= 10) return `(${d.slice(0, 2)}) ${d.slice(2, 6)}-${d.slice(6)}`\n return `(${d.slice(0, 2)}) ${d.slice(2, 7)}-${d.slice(7)}`\n}\n\n/** O V1 só procura ficha com telefone plausível — 10 ou 11 dígitos. */\nexport function hasValidPhone(raw: string): boolean {\n const d = raw.replace(/\\D/g, '')\n return d.length === 10 || d.length === 11\n}\n\nexport function GuestBar({\n guests, seats = 0, tableServicePercent, selectedGuestId, sharedLabel = 'Mesa',\n onSelectGuest, onAddGuest, onIdentifyGuest, onRemoveGuest, onLookupPhone,\n}: {\n guests: TicketGuest[]\n /**\n * Quantas pessoas a mesa tem, pelo que foi dito ao abrir.\n *\n * A diferença entre isso e os participantes JÁ criados vira cadeira vazia,\n * tracejada, ao lado das outras. Uma mesa de quatro com um nome preenchido\n * não diz ao garçom que faltam três — e ele só descobre na hora de dividir a\n * conta, quando já não dá para perguntar de quem era cada prato.\n */\n seats?: number\n /** A taxa da MESA — vira o placeholder do campo da pessoa. */\n tableServicePercent?: number\n /** `null` = a pastilha compartilhada. */\n selectedGuestId: string | null\n /** \"Mesa\" no salão, \"Balcão\" no balcão, \"Pedido\" no delivery. */\n sharedLabel?: string\n onSelectGuest: (id: string | null) => void\n onAddGuest?: (draft: GuestDraft) => void | Promise<void>\n onIdentifyGuest?: (id: string, draft: GuestDraft) => void | Promise<void>\n onRemoveGuest?: (id: string) => void | Promise<void>\n /** Procura a ficha pelo telefone — o app sabe onde o cadastro mora. */\n onLookupPhone?: (phone: string) => Promise<{ id: string; name: string } | null>\n}) {\n const [editing, setEditing] = useState<TicketGuest | null | undefined>(undefined)\n const [name, setName] = useState('')\n const [phone, setPhone] = useState('')\n /** O assento escolhido; `null` = puxar mais uma cadeira. */\n const [seatNo, setSeatNo] = useState<number | null>(null)\n const [percent, setPercent] = useState('')\n const [match, setMatch] = useState<{ id: string; name: string } | null>(null)\n const [removing, setRemoving] = useState<TicketGuest | null>(null)\n const timer = useRef<ReturnType<typeof setTimeout> | null>(null)\n\n // A busca por telefone, com a mesma espera do V1: 400ms depois da última\n // tecla. Buscar a cada dígito faz dez consultas para achar uma pessoa.\n useEffect(() => {\n if (timer.current) clearTimeout(timer.current)\n setMatch(null)\n if (!onLookupPhone || !hasValidPhone(phone)) return\n timer.current = setTimeout(() => {\n void onLookupPhone(phone).then((found) => {\n if (!found) return\n setMatch(found)\n setName((atual) => atual || found.name)\n })\n }, 400)\n return () => { if (timer.current) clearTimeout(timer.current) }\n }, [phone, onLookupPhone])\n\n const vagas = Math.max(0, seats - guests.length)\n const proximaVaga = guests.length + 1\n\n const abrir = (g: TicketGuest | null) => {\n setEditing(g); setName(''); setPhone(''); setMatch(null)\n // Sem vaga, só resta puxar cadeira — e oferecer \"assento\" ali seria\n // oferecer um lugar que não existe.\n // O padrão é a PRÓXIMA vaga — é o caso comum. Sem vaga, só resta puxar.\n setSeatNo(vagas > 0 ? proximaVaga : null)\n setPercent(g?.serviceChargePercent != null ? String(g.serviceChargePercent) : '')\n }\n\n const aoTocar = (g: TicketGuest) => {\n // A cadeira sem nome pergunta quem é; quem tem nome apenas se seleciona.\n if (isAnonymousGuest(g) && onIdentifyGuest) abrir(g)\n else onSelectGuest(g.id)\n }\n\n const salvar = () => {\n const draft: GuestDraft = {\n name: name.trim(),\n phone: phone.trim() || undefined,\n clientId: match?.id ?? null,\n kind: seatNo == null ? 'extra' : 'seat',\n seatNo: seatNo ?? undefined,\n serviceChargePercent: percent.trim() === ''\n ? null\n : Number(percent.replace(',', '.')) || 0,\n }\n if (editing) void onIdentifyGuest?.(editing.id, draft)\n else void onAddGuest?.(draft)\n setEditing(undefined)\n }\n\n const titulo = editing\n ? `Identificar ${editing.name}`\n : sharedLabel === 'Mesa' ? 'Adicionar Pessoa à Mesa' : 'Identificar cliente'\n\n return (\n <>\n <div className=\"pos-guests\">\n {onAddGuest && (\n <button\n className=\"pos-guests__add\"\n onClick={() => abrir(null)}\n aria-label={sharedLabel === 'Mesa' ? 'Adicionar pessoa' : 'Identificar cliente'}\n >\n <UserPlus size={16} strokeWidth={2.2} aria-hidden />\n </button>\n )}\n\n <div className=\"pos-guests__scroll\">\n {/* A pastilha compartilhada. Primeira, sempre, e sem ✕. */}\n <button\n className=\"pos-gchip\"\n aria-pressed={selectedGuestId === null}\n onClick={() => onSelectGuest(null)}\n >\n {sharedLabel}\n </button>\n\n {guests.map((g) => {\n const anon = isAnonymousGuest(g)\n return (\n <span className=\"pos-gchip__wrap\" key={g.id}>\n <button\n className=\"pos-gchip\"\n data-anon={anon || undefined}\n data-settled={g.settled || undefined}\n aria-pressed={selectedGuestId === g.id}\n onClick={() => aoTocar(g)}\n onDoubleClick={() => onSelectGuest(g.id)}\n title={anon ? 'Clique para identificar' : g.name}\n >\n {/* O NÚMERO do assento, não a inicial: é por ele que o\n garçom acha a pessoa ao voltar com o prato. Sem assento\n conhecido, a inicial serve de queda. */}\n <span className=\"pos-gchip__i pos-num\" aria-hidden>\n {g.seatNo != null ? String(g.seatNo).padStart(2, '0') : g.name.charAt(0).toUpperCase()}\n </span>\n {g.name.split(' ')[0]}\n {g.settled && <span className=\"pos-gchip__ok\">Já pagou</span>}\n </button>\n {onRemoveGuest && !g.settled && (\n <button\n className=\"pos-gchip__x\"\n onClick={() => setRemoving(g)}\n aria-label={`Excluir ${g.name}`}\n >\n <X size={10} strokeWidth={3} aria-hidden />\n </button>\n )}\n </span>\n )\n })}\n {/* As cadeiras que faltam: a mesa disse quatro, três ainda não têm\n nome. Tracejadas porque estão pedindo alguma coisa — o mesmo\n desenho da cadeira anônima, pelo mesmo motivo. */}\n {onAddGuest && Array.from(\n { length: Math.max(0, seats - guests.length) },\n (_, i) => (\n <button\n className=\"pos-gchip pos-gchip--empty\"\n key={`vaga-${i}`}\n onClick={() => abrir(null)}\n title=\"Clique para identificar\"\n >\n {/* +1, não +2: com uma pessoa já sentada numa mesa de quatro,\n as vagas são a 2, a 3 e a 4 — e o assento nunca passa do\n que a mesa declarou. */}\n Pessoa {guests.length + i + 1}\n </button>\n ),\n )}\n </div>\n </div>\n\n {editing !== undefined && (\n <SheetLayer>\n <div className=\"pos-sheet__scrim\" onClick={() => setEditing(undefined)} aria-hidden />\n <div className=\"pos-sheet__panel\" role=\"dialog\" aria-label={titulo} aria-modal>\n <div className=\"pos-sheet__head\">\n <h2 className=\"pos-sheet__title\">{titulo}</h2>\n <button className=\"pos-sheet__x\" onClick={() => setEditing(undefined)} aria-label=\"Fechar\">\n <X size={20} />\n </button>\n </div>\n\n <div className=\"pos-sheet__body\">\n {/* Telefone primeiro — é ele que acha a ficha. */}\n {!editing && (\n <div className=\"pos-dsc__sec\">\n <span className=\"pos-dsc__lbl\">Quem</span>\n {/* A mesa de quatro com uma cadeira ocupada tem três vagas\n COM NÚMERO — e o número importa: é por ele que o garçom\n fala com a mesa (\"o da Pessoa 3\"). O padrão é a próxima\n vaga; a última opção puxa mais uma cadeira, e aí o\n tamanho da mesa sobe — o que muda o couvert e a divisão\n da conta. */}\n {/* O MESMO componente das pastilhas lá de fora: a pessoa\n se escolhe tocando nela, não abrindo uma lista. Um\n `select` aqui seria um terceiro jeito de dizer a mesma\n coisa na mesma tela — e o operador já aprendeu este. */}\n <div className=\"pos-guests__scroll\" role=\"radiogroup\" aria-label=\"Qual pessoa\">\n {Array.from({ length: vagas }, (_, i) => {\n const n = guests.length + i + 1\n return (\n <button\n className=\"pos-gchip\"\n key={n}\n role=\"radio\"\n aria-checked={seatNo === n}\n aria-pressed={seatNo === n}\n onClick={() => setSeatNo(n)}\n >\n {seatNo === n && <Check size={12} strokeWidth={3} aria-hidden />}\n Pessoa {n}\n </button>\n )\n })}\n <button\n className=\"pos-gchip\"\n role=\"radio\"\n aria-checked={seatNo == null}\n aria-pressed={seatNo == null}\n data-anon\n onClick={() => setSeatNo(null)}\n >\n {seatNo == null && <Check size={12} strokeWidth={3} aria-hidden />}\n Pessoa {seats + 1}\n </button>\n </div>\n <span className=\"pos-gnote\">\n {seatNo == null\n ? `A mesa passa a ter ${seats + 1} ${seats + 1 === 1 ? 'pessoa' : 'pessoas'}.`\n : `A mesa continua com ${seats} ${seats === 1 ? 'pessoa' : 'pessoas'}.`}\n </span>\n </div>\n )}\n\n <div className=\"pos-dsc__sec\">\n <span className=\"pos-dsc__lbl\">Telefone</span>\n <span className=\"pos-gfield\">\n <Phone size={14} aria-hidden />\n <input\n className=\"pos-dsc__val\"\n inputMode=\"tel\"\n value={phone}\n onChange={(e) => setPhone(formatPhone(e.target.value))}\n placeholder=\"(00) 00000-0000\"\n aria-label=\"Telefone\"\n />\n </span>\n {match && (\n <span className=\"pos-gmatch\">\n <Check size={12} strokeWidth={3} aria-hidden /> Cliente encontrado: {match.name}\n </span>\n )}\n </div>\n\n <div className=\"pos-dsc__sec\">\n <span className=\"pos-dsc__lbl\">Nome</span>\n <span className=\"pos-gfield\">\n <User size={14} aria-hidden />\n <input\n className=\"pos-dsc__val\"\n value={name}\n onChange={(e) => setName(e.target.value)}\n placeholder=\"Nome da pessoa\"\n aria-label=\"Nome\"\n />\n </span>\n </div>\n\n {/* A TAXA desta pessoa mora aqui, junto do nome dela.\n Numa folha própria, mudar a taxa de um participante exigia\n fechar este diálogo, abrir outro e procurá-lo numa lista —\n três gestos para um número que pertence à mesma pessoa que se\n acabou de nomear. Em branco quer dizer \"usa a da mesa\", e em\n branco NÃO é zero. */}\n <div className=\"pos-dsc__sec\">\n <span className=\"pos-dsc__lbl\">Taxa de serviço</span>\n <span className=\"pos-gfield\">\n <input\n className=\"pos-dsc__val\"\n inputMode=\"decimal\"\n value={percent}\n onChange={(e) => setPercent(e.target.value)}\n placeholder={tableServicePercent != null ? String(tableServicePercent) : 'Taxa da mesa'}\n aria-label=\"Taxa de serviço desta pessoa\"\n />\n <span className=\"pos-dsc__eq\">%</span>\n </span>\n <span className=\"pos-gnote\">Em branco usa a taxa da mesa.</span>\n </div>\n </div>\n\n <div className=\"pos-sheet__foot\">\n <button className=\"pos-btn pos-btn--ghost\" onClick={() => setEditing(undefined)}>Cancelar</button>\n <button className=\"pos-btn\" disabled={!name.trim()} onClick={salvar}>\n {editing ? 'Identificar' : 'Adicionar'}\n </button>\n </div>\n </div>\n </SheetLayer>\n )}\n\n {removing && (\n <SheetLayer>\n <div className=\"pos-sheet__scrim\" onClick={() => setRemoving(null)} aria-hidden />\n <div className=\"pos-sheet__panel\" role=\"alertdialog\" aria-label=\"Excluir participante?\" aria-modal>\n <div className=\"pos-sheet__head\">\n <h2 className=\"pos-sheet__title\">Excluir participante?</h2>\n </div>\n <div className=\"pos-sheet__body\">\n <p className=\"pos-empty__h\">\n Tem certeza que deseja excluir <strong>{removing.name}</strong> desta mesa?\n Esta ação não pode ser desfeita.\n </p>\n </div>\n <div className=\"pos-sheet__foot\">\n <button className=\"pos-btn pos-btn--ghost\" onClick={() => setRemoving(null)}>Cancelar</button>\n <button\n className=\"pos-btn pos-btn--danger\"\n onClick={() => { void onRemoveGuest?.(removing.id); setRemoving(null) }}\n >\n Excluir\n </button>\n </div>\n </div>\n </SheetLayer>\n )}\n </>\n )\n}\n","// ---------------------------------------------------------------------------\n// Arrastar no palco, em metros.\n//\n// Portado de `beautyplace/src/components/salao/floor/svgDrag.ts`. São sessenta\n// linhas, e quatro delas são regras que só aparecem num tablet, no meio do\n// serviço — nenhuma se descobre olhando a tela funcionar no mouse.\n// ---------------------------------------------------------------------------\n\nimport type { PointerEvent as ReactPointerEvent } from 'react'\nimport type { Point } from './floorGeometry'\n\nexport interface DragHandlers {\n /** A cada movimento: o ponto atual e o deslocamento desde o início. */\n onMove?: (point: Point, delta: Point) => void\n /** Ao soltar. `moved = false` é um CLIQUE (seleção), não um arrasto. */\n onEnd: (point: Point, delta: Point, moved: boolean) => void\n /** O navegador tomou o gesto (virou rolagem): nada se grava. */\n onCancel?: () => void\n}\n\n/** Abaixo disto, em metros, o gesto é clique e não arrasto. */\nexport const DRAG_THRESHOLD_M = 0.05\n\n/** O gesto andou o bastante para ser um arrasto? */\nexport function isDrag(delta: Point, threshold = DRAG_THRESHOLD_M): boolean {\n return Math.hypot(delta.x, delta.y) > threshold\n}\n\n/**\n * Arrasto em coordenadas de MUNDO. Recebe o conversor do palco e devolve o\n * iniciador para o `onPointerDown` do glifo.\n *\n * Os ouvintes de movimento e soltura ficam na WINDOW, não no elemento: sem\n * isso o arrasto morre assim que o ponteiro sai do glifo — ou do SVG —, e a\n * mesa para no meio do caminho.\n */\nexport function createSvgDrag(toWorld: (clientX: number, clientY: number) => Point) {\n /** `false` quando o gesto não é um arrasto (botão direito, segundo dedo). */\n return function start(e: ReactPointerEvent, handlers: DragHandlers): boolean {\n if (e.button !== 0 && e.pointerType === 'mouse') return false\n // UM gesto, UM dedo. Sem isto, o segundo dedo no tablet abria um segundo\n // arrasto e o primeiro «soltar» disparava os dois.\n if (!e.isPrimary) return false\n e.preventDefault()\n e.stopPropagation()\n\n const pointerId = e.pointerId\n const inicio = toWorld(e.clientX, e.clientY)\n let moved = false\n let ultimo: Point = inicio\n\n const move = (ev: PointerEvent) => {\n if (ev.pointerId !== pointerId) return\n ultimo = toWorld(ev.clientX, ev.clientY)\n const delta = { x: ultimo.x - inicio.x, y: ultimo.y - inicio.y }\n if (!moved && isDrag(delta)) moved = true\n if (moved) handlers.onMove?.(ultimo, delta)\n }\n const limpar = () => {\n window.removeEventListener('pointermove', move)\n window.removeEventListener('pointerup', fim)\n window.removeEventListener('pointercancel', cancelar)\n }\n const fim = (ev: PointerEvent) => {\n if (ev.pointerId !== pointerId) return\n limpar()\n handlers.onEnd(ultimo, { x: ultimo.x - inicio.x, y: ultimo.y - inicio.y }, moved)\n }\n // `pointercancel` NÃO é soltura: o dedo virou rolagem no meio do gesto, e\n // gravar a posição parcial deixava a mesa onde o navegador interrompeu.\n const cancelar = (ev: PointerEvent) => {\n if (ev.pointerId !== pointerId) return\n limpar()\n handlers.onCancel?.()\n }\n\n window.addEventListener('pointermove', move)\n window.addEventListener('pointerup', fim)\n window.addEventListener('pointercancel', cancelar)\n return true\n }\n}\n","// ---------------------------------------------------------------------------\n// O que está sendo desenhado AGORA.\n//\n// Portado de `PracaDrawLayer` do V1. Nada aqui escuta o ponteiro — quem\n// escuta é a folha de captura do palco; isto só mostra o contorno tracejado\n// que segue o dedo, na cor com que a praça vai nascer.\n//\n// Duas coisas vieram junto e não são decoração:\n//\n// - **O ponto de partida fica marcado** na mão livre. É nele que o traço\n// fecha, e sem a bolinha o operador não sabe para onde voltar.\n// - **A medida aparece durante o gesto**, acima do contorno. Desenhar praça é\n// desenhar em metros, e o número é a única coisa que diz se a região tem o\n// tamanho da praça de verdade.\n// ---------------------------------------------------------------------------\n\nimport type { Box, Point } from './floorGeometry'\nimport type { ZoneTool } from './zoneDraft'\n\nexport function ZoneDrawLayer({ tool, color, box, stroke }: {\n tool: ZoneTool\n color: string\n /** Retângulo/elipse: a caixa do arrasto. */\n box: Box | null\n /** Mão livre: o traço cru, em metros. */\n stroke: Point[]\n}) {\n const comum = {\n fill: color,\n fillOpacity: 0.18,\n stroke: color,\n strokeWidth: 0.08,\n strokeDasharray: '0.3 0.18',\n strokeLinejoin: 'round' as const,\n strokeLinecap: 'round' as const,\n }\n\n if (tool === 'polygon') {\n if (stroke.length < 2) return null\n const d = stroke.map((p, i) => `${i === 0 ? 'M' : 'L'} ${p.x} ${p.y}`).join(' ')\n return (\n <g pointerEvents=\"none\">\n <path d={d} {...comum} fill=\"none\" fillOpacity={undefined} />\n <circle cx={stroke[0].x} cy={stroke[0].y} r={0.15} fill={color} />\n </g>\n )\n }\n\n if (!box || box.w <= 0 || box.h <= 0) return null\n return (\n <g pointerEvents=\"none\">\n {tool === 'ellipse' ? (\n <ellipse cx={box.x + box.w / 2} cy={box.y + box.h / 2} rx={box.w / 2} ry={box.h / 2} {...comum} />\n ) : (\n <rect x={box.x} y={box.y} width={box.w} height={box.h} rx={0.2} {...comum} />\n )}\n <text\n x={box.x + box.w / 2} y={box.y - 0.2}\n textAnchor=\"middle\"\n fontSize={Math.max(0.25, Math.min(0.5, box.w * 0.08))}\n fontWeight={600} fill={color}\n style={{ fontFamily: 'inherit' }}\n >\n {box.w.toFixed(1)} × {box.h.toFixed(1)} m\n </text>\n </g>\n )\n}\n","// ---------------------------------------------------------------------------\n// A PRAÇA que nasce de um gesto.\n//\n// Portado de `FloorPlanEditor.criarDoDesenho` + `PracaDrawLayer` do V1. É a\n// parte do desenho que NÃO é pixel: como o traço vira geometria, o que se\n// recusa, com que nome e com que cor a praça nasce.\n//\n// Três coisas que o V1 sabe e uma caixa de \"desenhe aqui\" não:\n//\n// 1. **Arredonda ANTES de medir.** O valor arredondado é o que vai para o\n// banco, e uma faixa fininha virava altura zero lá — que a constraint\n// recusa depois, longe do gesto que a causou.\n//\n// 2. **O nome esbarra no do AMBIENTE, não só no de outra praça.** Muita casa\n// batizou os ambientes de «Praça 1», «Praça 2» (a tela antiga chamava\n// ambiente de praça), e a praça nova nascia homônima do ambiente —\n// indistinguíveis na lista.\n//\n// 3. **A recusa tem dois textos**, um por gesto: contornar e arrastar na\n// diagonal são coisas diferentes, e dizer \"desenhe maior\" não ensina\n// nenhuma das duas.\n// ---------------------------------------------------------------------------\n\nimport {\n AREA_MIN_M2, pointInEllipse, pointInPolygon, pointInRect, polygonArea, strokeToPolygon,\n type Box, type Point,\n} from './floorGeometry'\n\n/** As três ferramentas do V1, com o nome que cada uma grava em `shape`. */\nexport type ZoneTool = 'rectangle' | 'ellipse' | 'polygon'\n\n/** A paleta do V1 (`SectionEditor.DEFAULT_COLORS`), na ordem. */\nexport const ZONE_COLORS = [\n '#3b82f6', '#10b981', '#f59e0b', '#ef4444', '#8b5cf6', '#ec4899', '#14b8a6', '#6366f1',\n]\n\nexport interface ZoneFields {\n name: string\n color: string\n shape: ZoneTool\n sortOrder: number\n posX?: number\n posY?: number\n widthM?: number\n heightM?: number\n polygon?: Point[]\n /** As mesas que caíram dentro do desenho — o palco preenche. */\n tableIds?: string[]\n}\n\nexport type ZoneDraft =\n | { ok: true; fields: ZoneFields }\n /** A recusa, com as palavras do V1 — título e explicação do gesto. */\n | { ok: false; title: string; detail: string }\n\nconst round2 = (v: number) => Math.round(v * 100) / 100\n\n/**\n * O próximo nome livre.\n *\n * Começa em `praças + 1` e anda enquanto o nome estiver tomado — por uma praça\n * OU por um ambiente.\n */\nexport function nextZoneName(\n zones: Array<{ name: string }>,\n areas: Array<{ name: string }> = [],\n): string {\n const usados = new Set([...zones, ...areas].map((z) => z.name.trim().toLowerCase()))\n let n = zones.length + 1\n while (usados.has(`praça ${n}`)) n++\n return `Praça ${n}`\n}\n\n/** A cor roda pela paleta na ordem em que as praças foram criadas. */\nexport function nextZoneColor(zones: unknown[]): string {\n return ZONE_COLORS[zones.length % ZONE_COLORS.length]\n}\n\n/**\n * O gesto vira praça — ou vira recusa.\n *\n * `box` é o bbox do arrasto (retângulo e elipse); `stroke` é o traço cru da\n * mão livre. Só um dos dois importa, conforme a ferramenta.\n */\nexport function zoneFromDrawing(\n tool: ZoneTool,\n { box, stroke, zones, areas }: {\n box: Box | null\n stroke: Point[]\n zones: Array<{ name: string }>\n areas?: Array<{ name: string }>\n },\n): ZoneDraft {\n const base = {\n name: nextZoneName(zones, areas),\n color: nextZoneColor(zones),\n shape: tool,\n sortOrder: zones.length,\n }\n\n if (tool === 'polygon') {\n const poly = strokeToPolygon(stroke)\n if (!poly) {\n return {\n ok: false,\n title: 'Desenho pequeno demais',\n detail: 'Contorne a área das mesas sem soltar, e feche perto de onde começou.',\n }\n }\n return { ok: true, fields: { ...base, polygon: poly } }\n }\n\n // Arredonda ANTES de medir — ver o cabeçalho.\n const w = box ? round2(box.w) : 0\n const h = box ? round2(box.h) : 0\n if (!box || w <= 0 || h <= 0 || w * h < AREA_MIN_M2) {\n return {\n ok: false,\n title: 'Desenho pequeno demais',\n detail: 'Arraste na diagonal para cobrir a área das mesas.',\n }\n }\n return {\n ok: true,\n fields: { ...base, posX: round2(box.x), posY: round2(box.y), widthM: w, heightM: h },\n }\n}\n\n/** A área que a praça ocupa, para a ficha dizer o tamanho do desenho. */\nexport function zoneArea(f: Pick<ZoneFields, 'shape' | 'widthM' | 'heightM' | 'polygon'>): number {\n if (f.shape === 'polygon') return f.polygon ? polygonArea(f.polygon) : 0\n if (f.shape === 'ellipse') return Math.PI * ((f.widthM ?? 0) / 2) * ((f.heightM ?? 0) / 2)\n return (f.widthM ?? 0) * (f.heightM ?? 0)\n}\n\n/**\n * Que mesas a praça PEGOU.\n *\n * No V1 quem responde isto é um gatilho no banco; aqui responde a geometria,\n * que já está toda em metros no palco. A conta é a mesma — o centro da mesa\n * dentro do desenho — e fica num lugar só, ao lado do desenho que a originou,\n * em vez de virar um segundo dialeto de geometria dentro do SQL.\n *\n * `centers` são os centros em metros ABSOLUTOS: a praça cruza ambientes, e\n * uma coordenada local ao ambiente responderia à pergunta errada.\n */\nexport function tablesInZone(\n f: Pick<ZoneFields, 'shape' | 'posX' | 'posY' | 'widthM' | 'heightM' | 'polygon'>,\n centers: Array<{ id: string; center: Point }>,\n): string[] {\n if (f.shape === 'polygon') {\n const poly = f.polygon\n if (!poly || poly.length < 3) return []\n return centers.filter((t) => pointInPolygon(t.center, poly)).map((t) => t.id)\n }\n if (f.posX == null || f.posY == null || !f.widthM || !f.heightM) return []\n const box: Box = { x: f.posX, y: f.posY, w: f.widthM, h: f.heightM }\n const dentro = f.shape === 'ellipse' ? pointInEllipse : pointInRect\n return centers.filter((t) => dentro(t.center, box)).map((t) => t.id)\n}\n","// ---------------------------------------------------------------------------\n// MEXER numa praça já desenhada.\n//\n// Portado de `PracaEditOverlay` + os ajudantes de `floorGeometry` do V1. Aqui\n// mora só o que NÃO é pixel: como a praça se move, como ela estica, e o que o\n// banco recusaria — que é melhor recusar antes, com uma frase, do que depois,\n// com um erro de constraint.\n//\n// Duas regras que o V1 aprendeu apanhando:\n//\n// 1. **Mover é DELTA sobre a praça do banco, não a posição do cursor.** Pegar\n// um vértice fora do centro da alça não pode teletransportá-lo para o dedo.\n//\n// 2. **O patch leva só o que mudou.** Uma praça de mão livre não tem x/y/\n// largura/altura; mandar esses campos nulos num movimento de polígono\n// apagaria a geometria que o desenho acabou de criar.\n// ---------------------------------------------------------------------------\n\nimport {\n AREA_MAX_POINTS, AREA_MIN_M2, polygonArea, roundPoints, translatePolygon,\n type Box, type Point,\n} from './floorGeometry'\n\n/** A praça, do ponto de vista da geometria. */\nexport interface ZoneGeometry {\n /** Quais mesas a praça pegou, recalculado quando a geometria muda. */\n tableIds?: string[]\n shape?: 'rect' | 'rectangle' | 'ellipse' | 'polygon' | null\n posX?: number | null\n posY?: number | null\n widthM?: number | null\n heightM?: number | null\n polygon?: Point[] | null\n}\n\nconst round2 = (v: number) => Math.round(v * 100) / 100\n\n/**\n * A caixa da praça.\n *\n * `null` quando não há geometria nenhuma: uma praça pode existir só para\n * filtrar a lista de mesas, sem nunca ter sido desenhada — e aí não se\n * desenha, em vez de virar um retângulo de zero por zero no canto do salão.\n */\nexport function zoneBounds(z: ZoneGeometry): Box | null {\n if (z.polygon?.length) {\n const xs = z.polygon.map((p) => p.x)\n const ys = z.polygon.map((p) => p.y)\n const x = Math.min(...xs); const y = Math.min(...ys)\n return { x, y, w: Math.max(...xs) - x, h: Math.max(...ys) - y }\n }\n if (z.posX == null || z.posY == null || !z.widthM || !z.heightM) return null\n return { x: z.posX, y: z.posY, w: z.widthM, h: z.heightM }\n}\n\n/** A praça deslocada — polígono anda ponto a ponto, caixa anda pela origem. */\nexport function moveZone<T extends ZoneGeometry>(z: T, delta: Point): T {\n if (z.polygon?.length) return { ...z, polygon: translatePolygon(z.polygon, delta) }\n if (z.posX == null || z.posY == null) return z\n return { ...z, posX: z.posX + delta.x, posY: z.posY + delta.y }\n}\n\n/**\n * O patch de um movimento — só os campos daquela forma.\n *\n * O polígono manda vértices; a caixa manda origem. Misturar os dois apagaria\n * a geometria da outra forma.\n */\nexport function movePatch(z: ZoneGeometry): Partial<ZoneGeometry> {\n if (z.polygon?.length) return { polygon: roundPoints(z.polygon) }\n if (z.posX == null || z.posY == null) return {}\n return { posX: round2(z.posX), posY: round2(z.posY) }\n}\n\n/** O patch de um esticão: a caixa inteira, arredondada ao centímetro. */\nexport function resizePatch(box: Box): Partial<ZoneGeometry> {\n return { posX: round2(box.x), posY: round2(box.y), widthM: round2(box.w), heightM: round2(box.h) }\n}\n\n/**\n * O contorno que o banco aceitaria — e, quando não, POR QUE não.\n *\n * Devolver a frase junto é o ponto: «inválido» manda o operador adivinhar qual\n * das três regras ele encostou.\n */\nexport function polygonRefusal(points: Point[], { removing = false } = {}): string | null {\n if (points.length < 3) return 'Um contorno precisa de pelo menos três pontos.'\n if (points.length > AREA_MAX_POINTS) return `O contorno já tem ${AREA_MAX_POINTS} pontos, o máximo.`\n const xs = points.map((p) => p.x)\n const ys = points.map((p) => p.y)\n if (Math.max(...xs) - Math.min(...xs) <= 0 || Math.max(...ys) - Math.min(...ys) <= 0) {\n return removing ? 'Sem este ponto o contorno ficaria sem área.' : 'O contorno ficaria sem área.'\n }\n if (polygonArea(points) < AREA_MIN_M2) {\n return removing ? 'Sem este ponto o contorno ficaria sem área.' : 'O contorno ficaria sem área.'\n }\n return null\n}\n\n/** O que o toque na mesa faz, no modo «escolher na planta». */\nexport type ZoneMembershipAction = 'include' | 'exclude' | 'reset'\n\n/**\n * Três saídas, não duas — e a do meio é a que o V1 teve de explicar.\n *\n * Repor uma mesa que ESTÁ dentro do desenho é **desfazer a exclusão**, e não\n * fixá-la à mão: ela volta a seguir a geometria. Marcá-la como manual pregaria\n * a mesa na praça para sempre, e quem só quis desfazer um clique errado\n * descobriria isso meses depois, ao mover a praça e ver a mesa ficar para trás.\n *\n * `include` é o caso genuinamente manual: a mesa está FORA do desenho e mesmo\n * assim é desta praça — a mesa encostada na borda, o canto que o contorno não\n * pegou. Aí sim a decisão é de gente, e o recálculo não pode desfazê-la.\n */\nexport function zoneToggleAction(isMember: boolean, insideGeometry: boolean): ZoneMembershipAction {\n if (isMember) return 'exclude'\n return insideGeometry ? 'reset' : 'include'\n}\n","// ---------------------------------------------------------------------------\n// AS ALÇAS da praça selecionada.\n//\n// Portado de `PracaEditOverlay` do V1: mover pelo punho do centro, esticar\n// pelas oito alças do contorno (retângulo e elipse), puxar cada vértice e\n// acrescentar ou tirar pontos (mão livre).\n//\n// Três coisas vieram do V1 e nenhuma é detalhe:\n//\n// 1. **A alça tem tamanho de TELA, não de mundo.** Ela é desenhada em pixels\n// divididos pelo `ppm` — senão some no zoom de fora e cobre a praça no\n// zoom de perto. O alvo de toque é quase o dobro do desenho, porque o dedo\n// não é o cursor.\n//\n// 2. **O punho de mover é PEQUENO.** A praça inteira não pode virar área de\n// arrasto: ela engoliria a mesa que está por baixo, que é justamente o que\n// o gerente quer alcançar.\n//\n// 3. **Todo gesto é DELTA sobre a praça do banco.** Pegar um vértice fora do\n// centro da alça não pode teletransportá-lo para o dedo.\n// ---------------------------------------------------------------------------\n\nimport { useCallback, useMemo, useRef, useState, type PointerEvent as ReactPointerEvent } from 'react'\nimport {\n AREA_HANDLES, AREA_MIN_SIDE_M, edgeMidpoints, handlePoint, insertVertex, moveVertex,\n removeVertex, resizeBox, roundPoints, type AreaHandle, type Point,\n} from './floorGeometry'\nimport { createSvgDrag } from './svgDrag'\nimport { moveZone, movePatch, polygonRefusal, resizePatch, zoneBounds, type ZoneGeometry } from './zoneEditing'\n\nconst CURSOR: Record<AreaHandle, string> = {\n nw: 'nwse-resize', se: 'nwse-resize',\n ne: 'nesw-resize', sw: 'nesw-resize',\n n: 'ns-resize', s: 'ns-resize',\n e: 'ew-resize', w: 'ew-resize',\n}\n\nexport function ZoneHandles<T extends ZoneGeometry & { name: string }>({\n zone, ppm, toWorld, onPreview, onCommit, onRefuse,\n}: {\n /** A praça COMO ESTÁ NO BANCO — a base de todo delta do gesto. */\n zone: T\n /** Pixels por metro do enquadramento: as alças têm tamanho de tela. */\n ppm: number\n toWorld: (clientX: number, clientY: number) => Point\n /** Durante o gesto: a praça como ela FICARÁ, para o desenho acompanhar. */\n onPreview: (z: T | null) => void\n /** Ao soltar: só os campos que mudaram. */\n onCommit: (patch: Partial<ZoneGeometry>) => void\n /** A recusa, com a frase que explica qual regra foi encostada. */\n onRefuse: (reason: string) => void\n}) {\n const [previa, setPrevia] = useState<T | null>(null)\n const gestoRef = useRef(0)\n const atual = previa ?? zone\n const box = zoneBounds(atual)\n const poligono = atual.polygon && atual.polygon.length >= 3 ? atual.polygon : null\n\n const r = 5 / ppm // o raio do desenho\n const hit = 11 / ppm // o alvo de toque, maior que o desenho\n const traco = 1.5 / ppm\n\n const aplicar = useCallback((z: T | null) => { setPrevia(z); onPreview(z) }, [onPreview])\n const arrastar = useMemo(() => createSvgDrag(toWorld), [toWorld])\n\n const iniciarGesto = useCallback((\n e: ReactPointerEvent,\n aoMover: (delta: Point) => T,\n aoSoltar: (z: T) => Partial<ZoneGeometry>,\n ) => {\n // A geração só vale quando o arrasto REALMENTE começou: botão direito ou\n // segundo dedo devolvem `false`, e invalidar a geração antes disso mataria\n // um gesto em curso sem que ninguém tivesse pedido.\n const meu = gestoRef.current + 1\n const comecou = arrastar(e, {\n onMove: (_p, delta) => { if (meu === gestoRef.current) aplicar(aoMover(delta)) },\n onEnd: (_p, delta, moveu) => {\n if (meu !== gestoRef.current) return\n aplicar(null)\n if (!moveu) return\n const patch = aoSoltar(aoMover(delta))\n if (Object.keys(patch).length > 0) onCommit(patch)\n },\n onCancel: () => { if (meu === gestoRef.current) aplicar(null) },\n })\n if (comecou) gestoRef.current = meu\n }, [arrastar, aplicar, onCommit])\n\n if (!box) return null\n const centro = { x: box.x + box.w / 2, y: box.y + box.h / 2 }\n\n return (\n <g>\n {/* O contorno de seleção, folgado, para não se confundir com o desenho\n da própria praça — que continua lá embaixo, na cor dela. */}\n {poligono ? (\n <polygon\n points={poligono.map((p) => `${p.x},${p.y}`).join(' ')}\n fill=\"none\" stroke=\"var(--pos-primary)\" strokeWidth={traco} strokeDasharray={`${r} ${r}`}\n pointerEvents=\"none\"\n />\n ) : (\n <rect\n x={box.x} y={box.y} width={box.w} height={box.h}\n fill=\"none\" stroke=\"var(--pos-primary)\" strokeWidth={traco} strokeDasharray={`${r} ${r}`}\n pointerEvents=\"none\"\n />\n )}\n\n {/* O PUNHO DE MOVER, no centro e pequeno — ver o cabeçalho. */}\n <g\n style={{ cursor: 'move', touchAction: 'none' }}\n role=\"button\"\n aria-label={`Mover a praça ${zone.name}`}\n onPointerDown={(e) => iniciarGesto(e, (delta) => moveZone(zone, delta), movePatch)}\n >\n <circle cx={centro.x} cy={centro.y} r={hit} fill=\"transparent\" />\n <circle\n cx={centro.x} cy={centro.y} r={r * 1.6}\n fill=\"var(--pos-primary)\" stroke=\"var(--pos-1)\" strokeWidth={traco}\n />\n <path\n d={`M ${centro.x - r} ${centro.y} H ${centro.x + r} M ${centro.x} ${centro.y - r} V ${centro.y + r}`}\n stroke=\"var(--pos-primary-fg)\" strokeWidth={traco} strokeLinecap=\"round\" pointerEvents=\"none\"\n />\n </g>\n\n {/* Retângulo e elipse: as OITO alças do contorno. */}\n {!poligono && AREA_HANDLES.map((alca) => {\n const p = handlePoint(box, alca)\n return (\n <g\n key={alca}\n style={{ cursor: CURSOR[alca], touchAction: 'none' }}\n role=\"button\"\n aria-label={`Esticar a praça ${zone.name}`}\n onPointerDown={(e) => iniciarGesto(\n e,\n (delta) => {\n const base = zoneBounds(zone)!\n const novo = resizeBox(base, alca, delta, AREA_MIN_SIDE_M)\n return { ...zone, posX: novo.x, posY: novo.y, widthM: novo.w, heightM: novo.h }\n },\n (z) => resizePatch(zoneBounds(z)!),\n )}\n >\n <rect x={p.x - hit} y={p.y - hit} width={hit * 2} height={hit * 2} fill=\"transparent\" />\n <rect\n x={p.x - r} y={p.y - r} width={r * 2} height={r * 2} rx={r * 0.3}\n fill=\"var(--pos-1)\" stroke=\"var(--pos-primary)\" strokeWidth={traco}\n />\n </g>\n )\n })}\n\n {/* MÃO LIVRE: um «+» no meio de cada lado, para acrescentar ponto. */}\n {poligono && edgeMidpoints(poligono).map(({ index, point }) => (\n <g\n key={`meio-${index}`}\n style={{ cursor: 'copy' }}\n role=\"button\"\n aria-label=\"Acrescentar um ponto ao contorno\"\n onPointerDown={(e) => e.stopPropagation()}\n onClick={(e) => {\n e.stopPropagation()\n const base = zone.polygon ?? []\n const novo = roundPoints(insertVertex(base, index, point))\n const recusa = polygonRefusal(novo)\n if (recusa) { onRefuse(recusa); return }\n onCommit({ polygon: novo })\n }}\n >\n <circle cx={point.x} cy={point.y} r={hit * 0.8} fill=\"transparent\" />\n <circle\n cx={point.x} cy={point.y} r={r * 0.7}\n fill=\"var(--pos-1)\" stroke=\"var(--pos-primary)\" strokeWidth={traco} opacity={0.75}\n />\n </g>\n ))}\n\n {/* MÃO LIVRE: um punho por vértice. Arrastar move; dois toques tiram. */}\n {poligono && poligono.map((pAtual, i) => {\n const base = (zone.polygon ?? poligono)[i] ?? pAtual\n return (\n <g\n key={`v-${i}`}\n style={{ cursor: 'grab', touchAction: 'none' }}\n role=\"button\"\n aria-label={`Ponto ${i + 1} do contorno. Arraste para mover, toque duas vezes para tirar.`}\n onPointerDown={(e) => iniciarGesto(\n e,\n // Pelo DESLOCAMENTO, não pela posição do cursor.\n (delta) => ({\n ...zone,\n polygon: moveVertex(zone.polygon ?? [], i, { x: base.x + delta.x, y: base.y + delta.y }),\n }),\n (z) => {\n const pontos = roundPoints(z.polygon ?? [])\n const recusa = polygonRefusal(pontos)\n if (recusa) { onRefuse(recusa); return {} }\n return { polygon: pontos }\n },\n )}\n onDoubleClick={(e) => {\n e.stopPropagation()\n const menos = removeVertex(zone.polygon ?? [], i)\n if (!menos) { onRefuse('Um contorno precisa de pelo menos três pontos.'); return }\n const pontos = roundPoints(menos)\n const recusa = polygonRefusal(pontos, { removing: true })\n if (recusa) { onRefuse(recusa); return }\n onCommit({ polygon: pontos })\n }}\n >\n <circle cx={pAtual.x} cy={pAtual.y} r={hit} fill=\"transparent\" />\n <circle\n cx={pAtual.x} cy={pAtual.y} r={r}\n fill=\"var(--pos-1)\" stroke=\"var(--pos-primary)\" strokeWidth={traco}\n />\n </g>\n )\n })}\n </g>\n )\n}\n","// ---------------------------------------------------------------------------\n// A PLANTA, em metros.\n//\n// Portado de `FloorPlanView` + `TableGlyph` do V1. A planta do V2 desenhava em\n// CÉLULAS de grade (44px cada), que é uma maquete: as mesas ficam onde o\n// cadastro mandou, não onde elas estão. Aqui o palco é um `<svg>` cujo\n// `viewBox` está em METROS, e a mesa de 1,20 m ocupa 1,20 m.\n//\n// Três camadas, de baixo para cima: ambientes, praças (translúcidas, que\n// CRUZAM ambientes) e mesas. A praça é um nível de foco IRMÃO do ambiente, não\n// filho — ela pode pegar mesas de dois ambientes.\n// ---------------------------------------------------------------------------\n\nimport { memo, useCallback, useEffect, useRef, useState } from 'react'\nimport { ChevronRight, MapPinOff } from 'lucide-react'\nimport { boxFromPoints, chairPositions, fitViewBox, floorBox, layoutUnzonedTables, placeAreas, tableCenter, tableSize, type Box, type FloorArea, type FloorTable, type Point } from './floorGeometry'\nimport { createSvgDrag } from './svgDrag'\nimport { ZoneDrawLayer } from './ZoneDrawLayer'\nimport { tablesInZone, zoneFromDrawing, type ZoneDraft, type ZoneTool } from './zoneDraft'\nimport { ZoneHandles } from './ZoneHandles'\nimport { zoneBounds, zoneToggleAction, type ZoneGeometry, type ZoneMembershipAction } from './zoneEditing'\nimport { CONTA_PEDIDA_SVG, TONE_LABEL, TONE_SVG, isTomOcupado, type TableTone } from './tableTone'\nimport { emptyFloorMessage } from './floorGeometry'\n\nexport interface PlanTableView extends FloorTable {\n label: string\n name?: string | null\n tone: TableTone\n seats?: number | null\n /** O cliente pediu a conta — ganha o anel sólido, por cima do tom. */\n billRequested?: boolean\n /**\n * Escalada DIRETAMENTE para quem está logado.\n *\n * O V1 desenha uma bolinha no canto e acrescenta «, escalada para você» ao\n * rótulo. A razão está no comentário dele: *«a mesa aparece para os dois,\n * esta é \"a sua\"»* — dentro da praça que o garçom atende, esta foi dada a\n * ele por nome. Sem o ponto, as duas coisas se parecem.\n */\n assignedToMe?: boolean\n /** Quantas pessoas sentaram, no chip de cima. */\n guests?: number | null\n /** O que o chip de baixo diz — o total, o tempo. */\n info?: string | null\n}\n\n/** O tampo gira; o texto não. */\nconst RING_PAD = 0.14\n\n/** Uma PRAÇA desenhada — a região de um garçom. */\nexport interface PlanZone {\n id: string\n name: string\n color?: string | null\n /** Retângulo, elipse ou mão livre — o desenho que a criou. */\n shape?: 'rect' | 'rectangle' | 'ellipse' | 'polygon' | null\n posX?: number | null\n posY?: number | null\n widthM?: number | null\n heightM?: number | null\n polygon?: Array<{ x: number; y: number }> | null\n /** As mesas que caem nela. */\n tableIds?: string[]\n}\n\n/** A caixa da praça vive em `zoneEditing` — uma só, usada aqui e nas alças. */\nconst zoneBox = zoneBounds\n\n/** Onde o foco fica guardado entre visitas. */\nconst FOCUS_KEY = 'pos:floor-focus'\n\nexport type PlanFocus = { level: 'macro' } | { level: 'area'; id: string }\nconst MACRO: PlanFocus = { level: 'macro' }\n\nfunction readFocus(): PlanFocus {\n try {\n const raw = window.localStorage.getItem(FOCUS_KEY)\n if (!raw) return MACRO\n const j = JSON.parse(raw)\n return j?.level === 'area' && typeof j.id === 'string' ? { level: 'area', id: j.id } : MACRO\n } catch { return MACRO }\n}\n\nfunction writeFocus(f: PlanFocus) {\n try { window.localStorage.setItem(FOCUS_KEY, JSON.stringify(f)) } catch { /* sem storage */ }\n}\n\nexport function PlanStage({ areas, zones, tables, activeId, onSelect, dimmedIds, focusAreaId, editing, onMoveTable, tool, onDrawZone, draftColor, selectedZoneId, onSelectZone, onUpdateZone, onRefuseZone, pickingZone, onToggleTableInZone, selectedAreaId, onSelectArea, aspect = 1.6 }: {\n /** Os AMBIENTES — o chão. */\n areas: FloorArea[]\n /**\n * As PRAÇAS — a região que cada garçom atende, por cima do chão.\n *\n * Irmãs do ambiente, não filhas: uma praça CRUZA ambientes, e por isso a\n * geometria dela é absoluta. Translúcidas, para as mesas continuarem\n * legíveis por baixo — a praça diz DE QUEM é a mesa, não o que ela é.\n */\n zones?: PlanZone[]\n tables: PlanTableView[]\n activeId?: string\n onSelect?: (t: PlanTableView) => void\n /** Fora do ambiente em foco: translúcidas, mas ainda clicáveis. */\n dimmedIds?: ReadonlySet<string>\n /**\n * O foco vem DE FORA — do filtro que já mora no rodapé do salão.\n *\n * Ele tinha trilha própria aqui em cima, e eram dois controles para a mesma\n * pergunta: \"que parte do salão eu estou vendo?\". Quem manda é o de baixo,\n * onde o polegar já está.\n */\n focusAreaId?: string\n /**\n * MODO EDIÇÃO: a mesa passa a se arrastar em vez de abrir a comanda.\n *\n * O mesmo glifo, o mesmo palco e o mesmo toque — o que muda é o que o gesto\n * significa. Duas telas separadas para ver e para mover fariam o operador\n * conferir numa e corrigir na outra, comparando de memória.\n */\n editing?: boolean\n /** Ao soltar a mesa: o novo centro, em metros, já arredondado ao cm. */\n onMoveTable?: (id: string, to: Point) => void\n /**\n * A ferramenta de praça ARMADA, vinda da barra.\n *\n * Com ela ligada o palco muda de assunto: as mesas e os ambientes param de\n * ouvir o ponteiro e uma folha transparente por cima captura o gesto. É o\n * mesmo palco — o que muda é o que o dedo significa.\n */\n tool?: ZoneTool | null\n /** O resultado do gesto: a praça montada, ou a recusa com as palavras dela. */\n onDrawZone?: (draft: ZoneDraft) => void\n /** Nome e cor com que a praça VAI nascer — o contorno já sai na cor certa. */\n draftColor?: string\n /**\n * A praça ESCOLHIDA para mexer — a que ganha as alças.\n *\n * Separada do foco do rodapé de propósito: aquele responde \"que parte do\n * salão eu estou vendo\", este responde \"em qual eu estou mexendo\". Foram a\n * mesma coisa por um momento, e aproximar numa praça punha alças nela sem\n * ninguém ter pedido.\n */\n selectedZoneId?: string | null\n onSelectZone?: (id: string | null) => void\n /** Grava a geometria da praça ao fim do gesto. */\n onUpdateZone?: (id: string, patch: Partial<ZoneGeometry>) => void\n /** A recusa do contorno, com a frase que explica a regra. */\n onRefuseZone?: (reason: string) => void\n /**\n * MODO «escolher mesas na planta».\n *\n * O palco apaga tudo menos a praça e o toque na mesa deixa de arrastar:\n * ele inclui ou exclui. É o mesmo glifo com um terceiro significado, e o\n * que decide é o modo — nunca o gesto.\n */\n pickingZone?: boolean\n onToggleTableInZone?: (tableId: string, how: ZoneMembershipAction) => void\n /**\n * O AMBIENTE escolhido para mexer.\n *\n * Em edição o clique no chão deixa de aproximar e passa a SELECIONAR: o\n * mesmo gesto, e o modo decide — como na mesa e na praça. Fora da edição\n * ele continua aproximando, que é o que o garçom quer.\n */\n selectedAreaId?: string | null\n onSelectArea?: (id: string | null) => void\n aspect?: number\n}) {\n const [focus, setFocus] = useState<PlanFocus>(readFocus)\n const placed = placeAreas(areas)\n /** Onde desenhar quem não está em praça nenhuma — ver `layoutUnzonedTables`. */\n const semPraca = layoutUnzonedTables(\n tables.filter((t) => !t.areaId),\n floorBox(placed),\n )\n const origemDe = new Map(placed.map((p) => [p.area.id, p.origin]))\n const porId = new Map(placed.map((p) => [p.area.id, p]))\n\n /**\n * Foco num alvo que já não existe volta à macro — mas SÓ na tela.\n *\n * A regra de ouro está no V1: *\"o que se grava é o GESTO, nunca o estado\n * derivado — senão a primeira renderização vazia apagava a escolha.\"*\n * Enquanto os ambientes não chegaram, `porId` está vazio e todo foco parece\n * inválido; gravar essa conclusão jogaria fora a escolha de quem só estava\n * esperando a lista carregar.\n */\n /**\n * O foco pode ser um AMBIENTE ou uma PRAÇA — irmãos, não pai e filho.\n *\n * A praça cruza ambientes: aproximar nela enquadra a caixa DELA, e não a do\n * ambiente que por acaso a contém. É o que o V1 faz, e é o que permite ao\n * garçom ver \"as minhas mesas\" mesmo quando elas estão espalhadas.\n */\n const pracaPorId = new Map((zones ?? []).map((z) => [z.id, z]))\n const externo: PlanFocus | null = focusAreaId ? { level: 'area', id: focusAreaId } : null\n const efetivo = externo ?? focus\n const ehPraca = efetivo.level === 'area' && pracaPorId.has(efetivo.id)\n const focoValido: PlanFocus =\n efetivo.level === 'area' && !porId.has(efetivo.id) && !ehPraca ? MACRO : efetivo\n const emFoco = focoValido.level === 'area' ? porId.get(focoValido.id) ?? null : null\n const pracaEmFoco = focoValido.level === 'area' ? pracaPorId.get(focoValido.id) ?? null : null\n const caixaDaPraca = pracaEmFoco ? zoneBox(pracaEmFoco) : null\n\n const irPara = useCallback((f: PlanFocus) => { setFocus(f); writeFocus(f) }, [])\n\n\n /**\n * O palco converte pixel em METRO.\n *\n * `getScreenCTM().inverse()` é o que o SVG oferece e é exato: ele já leva em\n * conta o `viewBox`, o `preserveAspectRatio` e qualquer zoom da página.\n * Calcular a escala à mão erra assim que a janela muda de proporção.\n */\n const svgRef = useRef<SVGSVGElement>(null)\n const toWorld = useCallback((clientX: number, clientY: number): Point => {\n const el = svgRef.current\n if (!el) return { x: 0, y: 0 }\n const pt = el.createSVGPoint()\n pt.x = clientX; pt.y = clientY\n const m = el.getScreenCTM()\n if (!m) return { x: 0, y: 0 }\n const w = pt.matrixTransform(m.inverse())\n return { x: w.x, y: w.y }\n }, [])\n const iniciarArrasto = createSvgDrag(toWorld)\n /** Onde a mesa está ENQUANTO o dedo anda. O banco só vê o fim do gesto. */\n const [arrastando, setArrastando] = useState<{ id: string; to: Point } | null>(null)\n\n /**\n * O DESENHO em curso, e a geração dele.\n *\n * O contador existe porque `Esc` (ou trocar de ferramenta) precisa invalidar\n * um gesto JÁ EM CURSO: sem ele os ouvintes na janela sobreviviam ao\n * cancelamento e o «soltar» criava a praça de que o operador desistiu. É a\n * armadilha que o V1 documenta com todas as letras.\n */\n const [desenho, setDesenho] = useState<{ box: Box | null; stroke: Point[] }>({ box: null, stroke: [] })\n /**\n * A praça como ela FICARÁ enquanto a alça está sendo arrastada.\n *\n * O desenho acompanha o gesto e o banco só ouve quando o dedo solta — senão\n * cada pixel de arrasto viraria uma gravação, e a praça andaria a solavancos\n * atrás das respostas do servidor.\n */\n const [previaPraca, setPreviaPraca] = useState<PlanZone | null>(null)\n /** O modo de escolha só existe com praça escolhida e com quem o atenda. */\n /** A praça com as alças — e, durante o gesto, a versão que segue o dedo. */\n const pracaEscolhida = selectedZoneId ? pracaPorId.get(selectedZoneId) ?? null : null\n const pracaComAlcas = previaPraca?.id === selectedZoneId ? previaPraca : pracaEscolhida\n const escolhendo = !!(pickingZone && pracaEscolhida && onToggleTableInZone)\n const mesasDaPraca = new Set(pracaEscolhida?.tableIds ?? [])\n const tracoRef = useRef<Point[]>([])\n const gestoRef = useRef(0)\n const corDoDesenho = draftColor ?? 'var(--pos-primary)'\n\n // Trocar de ferramenta — ou desarmar — mata o gesto e limpa o rascunho.\n useEffect(() => {\n gestoRef.current += 1\n tracoRef.current = []\n setDesenho({ box: null, stroke: [] })\n }, [tool])\n\n // `Esc` cancela o desenho. Dentro de um campo o `Esc` é do campo.\n useEffect(() => {\n if (!tool) return\n const onKey = (e: KeyboardEvent) => {\n if (e.key !== 'Escape') return\n const alvo = e.target as HTMLElement | null\n if (alvo?.closest('input, textarea, select, [role=\"dialog\"]')) return\n gestoRef.current += 1\n tracoRef.current = []\n setDesenho({ box: null, stroke: [] })\n }\n window.addEventListener('keydown', onKey)\n return () => window.removeEventListener('keydown', onKey)\n }, [tool])\n\n // O alvo do viewBox: o ambiente em foco, ou o salão inteiro.\n const box = fitViewBox(caixaDaPraca ?? (emFoco ? emFoco.box : floorBox(placed)), aspect)\n /**\n * Pixels por metro do enquadramento — as alças têm tamanho de TELA.\n *\n * Medido do elemento, com queda para a conta do `aspect`: no primeiro\n * quadro o `<svg>` ainda não tem largura, e uma alça de tamanho infinito\n * cobriria o salão inteiro por um instante.\n */\n const larguraPx = svgRef.current?.clientWidth || 0\n const ppm = larguraPx > 0 ? larguraPx / box.w : 40\n\n /** A mesa pertence ao que está em foco? Na macro, todas. */\n const noFoco = (t: PlanTableView) => {\n if (pracaEmFoco) return (pracaEmFoco.tableIds ?? []).includes(t.id)\n return !emFoco || t.areaId === emFoco.area.id\n }\n const doFoco = tables.filter(noFoco)\n const ocupadas = doFoco.filter((t) => isTomOcupado(t.tone)).length\n\n // A unidade sem NENHUM ambiente desenhado: a mensagem entra no lugar do\n // desenho, e não sobre ele.\n //\n // Antes a planta desenhava o pátio padrão de 10 × 10 m — uma caixa cinza vazia,\n // sem uma palavra. Quem abre «Planta baixa» numa casa que nunca desenhou a\n // planta via um retângulo e nenhuma pista do que fazer. O V1 substitui o\n // editor inteiro pela mensagem, e é isso que acontece aqui.\n if (areas.length === 0) {\n const vazio = emptyFloorMessage(!!editing)\n return (\n <div className=\"pos-plan__wrap\">\n <div className=\"pos-plan__empty\" role=\"status\">\n <MapPinOff size={34} strokeWidth={1.8} aria-hidden />\n <p className=\"pos-plan__empty-t\">{vazio.title}</p>\n <p className=\"pos-plan__empty-h\">{vazio.hint}</p>\n </div>\n </div>\n )\n }\n\n return (\n <div className=\"pos-plan__wrap\">\n\n <svg\n ref={svgRef}\n data-editing={editing || undefined}\n className=\"pos-plan2\"\n viewBox={`${box.x} ${box.y} ${box.w} ${box.h}`}\n role=\"group\"\n aria-label=\"Planta do salão\"\n preserveAspectRatio=\"xMidYMid meet\"\n >\n {/* O AMBIENTE é o alvo do zoom — clicar nele entra, clicar de novo sai.\n É o gesto do V1, e evita uma segunda fileira de botões dizendo o que\n o desenho já diz. O filtro de praças do rodapé é outra coisa: ele\n REMOVE mesas da vista; isto aproxima. */}\n {/* ESCOLHENDO, o salão inteiro recua e só a praça fica acesa: o\n gerente está respondendo uma pergunta sobre UMA praça, e o resto do\n chão só disputa a atenção dele. */}\n <g pointerEvents={tool || escolhendo ? 'none' : undefined} opacity={escolhendo ? 0.3 : 1}>\n {placed.map(({ area, box: b }) => (\n <g key={area.id}>\n <rect\n x={b.x} y={b.y} width={b.w} height={b.h} rx={0.3}\n fill=\"var(--pos-2)\"\n stroke={selectedAreaId === area.id || emFoco?.area.id === area.id ? 'var(--pos-primary)' : 'var(--pos-line)'}\n strokeWidth={selectedAreaId === area.id ? 0.12 : emFoco?.area.id === area.id ? 0.09 : 0.05}\n strokeDasharray={selectedAreaId === area.id ? '0.5 0.3' : undefined}\n style={{ cursor: editing && onSelectArea ? 'pointer' : 'zoom-in' }}\n onClick={() => {\n if (editing && onSelectArea) {\n onSelectArea(selectedAreaId === area.id ? null : area.id)\n return\n }\n irPara(focoValido.level === 'area' && focoValido.id === area.id ? MACRO : { level: 'area', id: area.id })\n }}\n >\n <title>\n {editing && onSelectArea\n ? `Ficha de ${area.name}`\n : emFoco?.area.id === area.id ? `Sair de ${area.name}` : `Aproximar ${area.name}`}\n </title>\n </rect>\n {/* O nome no canto de cima — é por ele que `MARGIN_TOP_M` é maior\n que as outras margens em `arrangeTables`. */}\n <text\n x={b.x + 0.4} y={b.y + 0.75}\n fontSize={0.5} fontWeight={700} fill=\"var(--pos-fg-3)\"\n style={{ fontFamily: 'inherit' }}\n >\n {area.name}\n </text>\n </g>\n ))}\n </g>\n\n {/* AS PRAÇAS, por cima do chão e por baixo das mesas. Translúcidas de\n propósito: elas dizem de quem é a região, e uma mancha sólida\n apagaria o estado da mesa, que é o que se lê primeiro. */}\n {(zones ?? []).map((zBanco) => {\n // Durante o gesto quem vale é a prévia: o desenho acompanha o dedo.\n const z = previaPraca?.id === zBanco.id ? previaPraca : zBanco\n const b = zoneBox(z)\n if (!b) return null\n const cor = z.color ?? 'var(--pos-primary)'\n const aceso = focoValido.level === 'area' && focoValido.id === z.id\n // A praça se desenha COM A FORMA que a criou. Desenhar a elipse e o\n // contorno à mão livre como a caixa que os contém pintaria de cor da\n // praça mesas que ela não pegou — e a lista de mesas ao lado diria\n // outra coisa, sem nada na tela explicando a diferença.\n const tinta = {\n fill: cor, fillOpacity: aceso ? 0.16 : 0.08,\n stroke: cor, strokeOpacity: aceso ? 0.9 : 0.45,\n strokeWidth: aceso ? 0.09 : 0.05,\n strokeDasharray: aceso ? undefined : '0.4 0.25',\n strokeLinejoin: 'round' as const,\n }\n // Fora da edição a praça é DECORAÇÃO: ela diz de quem é a mesa, e o\n // toque pertence à mesa por baixo. Em edição ela vira alvo — é assim\n // que se escolhe qual praça ganha as alças.\n const escolhivel = editing && !tool && !escolhendo && onSelectZone\n const recuada = escolhendo && zBanco.id !== selectedZoneId\n return (\n <g\n key={zBanco.id}\n opacity={recuada ? 0.15 : 1}\n pointerEvents={escolhivel ? undefined : 'none'}\n style={escolhivel ? { cursor: 'pointer' } : undefined}\n onClick={escolhivel\n ? (e) => { e.stopPropagation(); onSelectZone(selectedZoneId === zBanco.id ? null : zBanco.id) }\n : undefined}\n >\n {z.polygon?.length ? (\n <polygon points={z.polygon.map((p) => `${p.x},${p.y}`).join(' ')} {...tinta} />\n ) : z.shape === 'ellipse' ? (\n <ellipse cx={b.x + b.w / 2} cy={b.y + b.h / 2} rx={b.w / 2} ry={b.h / 2} {...tinta} />\n ) : (\n <rect x={b.x} y={b.y} width={b.w} height={b.h} rx={0.25} {...tinta} />\n )}\n {/* O nome no pé, para não brigar com o do ambiente, que mora no\n alto do mesmo retângulo. */}\n <text\n x={b.x + 0.25} y={b.y + b.h - 0.25}\n fontSize={0.38} fontWeight={700} fill={cor}\n style={{ fontFamily: 'inherit' }}\n >\n {z.name}\n </text>\n </g>\n )\n })}\n\n {/* Desenhando, a mesa deixa o ponteiro passar: o gesto é da praça. */}\n <g pointerEvents={tool ? 'none' : undefined}>\n {tables.map((t) => {\n const origem = origemDe.get(t.areaId ?? '') ?? { x: 0, y: 0 }\n // Sem praça E sem coordenada, a mesa caía em {0,0} — todas no mesmo\n // ponto, uma por cima da outra. A de baixo nem clique recebia: sumia\n // do salão para quem usa a planta, e seguia ocupada no banco.\n const solta = semPraca.get(t.id)\n const centro = arrastando?.id === t.id\n ? arrastando.to\n : (solta ?? tableCenter(t, origem))\n // ESCOLHENDO: a mesa não se arrasta. O clique põe ou tira da praça, e\n // o anel de seleção diz quem está dentro. Deixá-la arrastável aqui\n // faria o gerente mover uma mesa querendo incluí-la.\n if (escolhendo) {\n const dentro = mesasDaPraca.has(t.id)\n return (\n <g\n key={t.id}\n style={{ cursor: 'pointer' }}\n onClick={(e) => {\n e.stopPropagation()\n // Quem decide o QUE o toque faz é a geometria, e ela está\n // aqui: dentro do desenho, fora dele, e se a mesa já é da\n // praça. Ver `zoneToggleAction`.\n const naGeometria = tablesInZone(\n {\n shape: (pracaEscolhida!.shape ?? 'rectangle') as 'rectangle' | 'ellipse' | 'polygon',\n posX: pracaEscolhida!.posX ?? undefined, posY: pracaEscolhida!.posY ?? undefined,\n widthM: pracaEscolhida!.widthM ?? undefined, heightM: pracaEscolhida!.heightM ?? undefined,\n polygon: pracaEscolhida!.polygon ?? undefined,\n },\n [{ id: t.id, center: centro }],\n ).length > 0\n onToggleTableInZone!(t.id, zoneToggleAction(dentro, naGeometria))\n }}\n >\n <TableGlyph table={t} center={centro} selected={dentro} dimmed={!dentro} />\n </g>\n )\n }\n return (\n <TableGlyph\n key={t.id}\n table={t}\n center={centro}\n dragging={arrastando?.id === t.id}\n onDragStart={editing && onMoveTable ? (e) => iniciarArrasto(e, {\n onMove: (_p, d) => setArrastando({\n id: t.id,\n to: { x: tableCenter(t, origem).x + d.x, y: tableCenter(t, origem).y + d.y },\n }),\n // `moved = false` é um CLIQUE: a mesa que se toca para conferir\n // não pode sair do lugar pelo tremor do dedo.\n onEnd: (_p, d, moved) => {\n setArrastando(null)\n if (!moved) return\n const base = tableCenter(t, origem)\n onMoveTable(t.id, {\n x: Math.round((base.x + d.x - origem.x) * 100) / 100,\n y: Math.round((base.y + d.y - origem.y) * 100) / 100,\n })\n },\n // Rolagem no meio do gesto: a mesa VOLTA. Gravar a posição\n // parcial a deixaria onde o navegador interrompeu.\n onCancel: () => setArrastando(null),\n }) : undefined}\n selected={t.id === activeId}\n // Fora do foco fica TRANSLÚCIDA, não sumida: a grade remove o que\n // está fora do escopo; a planta mantém o contexto espacial, senão\n // o ambiente em foco flutua sem vizinhança.\n dimmed={dimmedIds?.has(t.id) || !noFoco(t)}\n onSelect={onSelect}\n />\n )\n })}\n </g>\n\n {/* AS ALÇAS da praça escolhida, por cima das mesas: é o gesto mais fino\n da tela e não pode ficar por baixo de um glifo. Somem enquanto uma\n ferramenta está armada — ali o toque é desenho, não ajuste. */}\n {pracaComAlcas && editing && !tool && !escolhendo && onUpdateZone && (\n <ZoneHandles\n key={pracaComAlcas.id}\n zone={pracaEscolhida!}\n ppm={ppm}\n toWorld={toWorld}\n onPreview={(z) => setPreviaPraca(z)}\n onCommit={(patch) => {\n // O recorte mudou, então quem caiu dentro mudou junto. Recalcular\n // aqui — e não na tela que grava — mantém a conta no mesmo lugar\n // que a fez nascer, com os mesmos metros absolutos.\n const depois = { ...pracaEscolhida!, ...patch }\n onUpdateZone(pracaComAlcas.id, {\n ...patch,\n tableIds: tablesInZone(\n {\n shape: (depois.shape ?? 'rectangle') as 'rectangle' | 'ellipse' | 'polygon',\n posX: depois.posX ?? undefined, posY: depois.posY ?? undefined,\n widthM: depois.widthM ?? undefined, heightM: depois.heightM ?? undefined,\n polygon: depois.polygon ?? undefined,\n },\n tables.map((t) => ({\n id: t.id,\n center: tableCenter(t, origemDe.get(t.areaId ?? '') ?? { x: 0, y: 0 }),\n })),\n ),\n })\n }}\n onRefuse={(motivo) => onRefuseZone?.(motivo)}\n />\n )}\n\n {/* A FOLHA DE CAPTURA: só enquanto uma ferramenta de praça está ligada,\n e por cima de tudo.\n\n Folgada de 50 m de propósito. Enquanto o enquadramento anima entre\n proporções diferentes — girar o tablet — o `viewBox` não preenche o\n palco, e a borda deixava o toque cair nos glifos de baixo: o gesto\n virava arrasto de mesa em vez de desenho de praça. */}\n {tool && onDrawZone && (\n <>\n <rect\n x={box.x - 50} y={box.y - 50} width={box.w + 100} height={box.h + 100}\n fill=\"transparent\"\n style={{ cursor: 'crosshair', touchAction: 'none' }}\n onPointerDown={(e) => {\n const f = tool\n const meu = ++gestoRef.current\n const inicio = toWorld(e.clientX, e.clientY)\n tracoRef.current = [inicio]\n iniciarArrasto(e, {\n onMove: (ponto) => {\n if (meu !== gestoRef.current) return\n if (f === 'polygon') {\n // Um ponto a cada 3 cm. O ponteiro do tablet dispara a\n // 240 Hz, e o traço cru chegava a milhares de pontos para\n // um contorno de 10 m.\n const ult = tracoRef.current[tracoRef.current.length - 1]\n if (ult && Math.hypot(ponto.x - ult.x, ponto.y - ult.y) < 0.03) return\n tracoRef.current = [...tracoRef.current, ponto]\n setDesenho({ box: null, stroke: tracoRef.current })\n } else {\n setDesenho({ box: boxFromPoints(inicio, ponto), stroke: [] })\n }\n },\n onEnd: (fim, _d, moveu) => {\n const traco = tracoRef.current\n setDesenho({ box: null, stroke: [] })\n tracoRef.current = []\n // Gesto invalidado por `Esc` — ou toque sem arrasto, que é\n // clique e não desenho.\n if (meu !== gestoRef.current || !moveu) return\n const draft = zoneFromDrawing(f, {\n box: f === 'polygon' ? null : boxFromPoints(inicio, fim),\n stroke: traco,\n zones: zones ?? [],\n areas,\n })\n // Quem a praça pegou é conta da GEOMETRIA, e ela está toda\n // aqui, em metros absolutos: a praça cruza ambientes, e uma\n // coordenada local responderia à pergunta errada.\n if (draft.ok) {\n draft.fields.tableIds = tablesInZone(draft.fields, tables.map((t) => ({\n id: t.id,\n center: tableCenter(t, origemDe.get(t.areaId ?? '') ?? { x: 0, y: 0 }),\n })))\n }\n onDrawZone(draft)\n },\n onCancel: () => { setDesenho({ box: null, stroke: [] }); tracoRef.current = [] },\n })\n }}\n />\n <ZoneDrawLayer tool={tool} color={corDoDesenho} box={desenho.box} stroke={desenho.stroke} />\n </>\n )}\n </svg>\n </div>\n )\n}\n\n/**\n * A MESA no palco: cadeiras, tampo na cor do tom, número e os chips da\n * operação — gente em cima, conta embaixo.\n *\n * **O tampo gira com `rotation`; os chips e o número NÃO.** A razão está no\n * V1, e é a melhor frase do arquivo: *\"texto de cabeça para baixo não ajuda\n * ninguém.\"*\n */\nconst TableGlyph = memo(function TableGlyph({ table, center, selected, dimmed, onSelect, onDragStart, dragging }: {\n table: PlanTableView\n center: { x: number; y: number }\n selected?: boolean\n dimmed?: boolean\n onSelect?: (t: PlanTableView) => void\n onDragStart?: (e: React.PointerEvent) => void\n dragging?: boolean\n}) {\n const { w, h } = tableSize(table)\n const cores = TONE_SVG[table.tone]\n const ocupada = isTomOcupado(table.tone)\n const redonda = table.shape === 'round'\n const cadeiras = chairPositions(table.shape ?? 'rectangle', table.seats ?? 0, w, h)\n const fontSize = Math.max(0.28, Math.min(0.55, w * 0.42))\n const rotulo = `${table.label}, ${TONE_LABEL[table.tone].toLowerCase()}${table.billRequested ? ', conta pedida' : ''}${table.assignedToMe ? ', escalada para você' : ''}`\n\n return (\n <g\n transform={`translate(${center.x} ${center.y})`}\n opacity={dimmed ? 0.35 : dragging ? 0.75 : 1}\n style={{\n cursor: onDragStart ? (dragging ? 'grabbing' : 'grab') : onSelect ? 'pointer' : undefined,\n // Sem transição ENQUANTO arrasta: a mesa perseguiria o dedo com meio\n // segundo de atraso, e o gesto deixa de parecer direto.\n transition: dragging ? 'none' : 'opacity 200ms',\n touchAction: onDragStart ? 'none' : undefined,\n }}\n onPointerDown={onDragStart}\n onClick={onSelect ? (e) => { e.stopPropagation(); onSelect(table) } : undefined}\n onKeyDown={onSelect ? (e) => {\n if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); onSelect(table) }\n } : undefined}\n role={onSelect ? 'button' : undefined}\n tabIndex={onSelect ? 0 : undefined}\n aria-label={rotulo}\n aria-current={selected ? 'true' : undefined}\n >\n <title>{rotulo}</title>\n <g transform={`rotate(${table.rotation || 0}) translate(${-w / 2} ${-h / 2})`}>\n {cadeiras.map((c, i) => (\n <rect\n key={i}\n x={c.x - 0.2} y={c.y - 0.14} width={0.4} height={0.28} rx={0.06}\n fill={cores.chair} opacity={0.55}\n transform={`rotate(${c.rot} ${c.x} ${c.y})`}\n />\n ))}\n {/* DOIS anéis, e a diferença entre eles é a regra: a seleção é\n TRACEJADA e a conta pedida é SÓLIDA. Conta pedida não é um tom —\n é um pedido esperando resposta, e sobrevive por cima de qualquer\n cor de mesa. */}\n {(selected || table.billRequested) && (\n redonda ? (\n <circle\n cx={w / 2} cy={h / 2} r={w / 2 + RING_PAD}\n fill=\"none\"\n stroke={table.billRequested ? CONTA_PEDIDA_SVG : 'var(--pos-primary)'}\n strokeWidth={0.07}\n strokeDasharray={table.billRequested ? undefined : '0.18 0.1'}\n />\n ) : (\n <rect\n x={-RING_PAD} y={-RING_PAD} width={w + RING_PAD * 2} height={h + RING_PAD * 2} rx={0.2}\n fill=\"none\"\n stroke={table.billRequested ? CONTA_PEDIDA_SVG : 'var(--pos-primary)'}\n strokeWidth={0.07}\n strokeDasharray={table.billRequested ? undefined : '0.18 0.1'}\n />\n )\n )}\n {redonda ? (\n <circle cx={w / 2} cy={h / 2} r={w / 2} fill={cores.fill} stroke={cores.stroke} strokeWidth={0.04} />\n ) : (\n <rect x={0} y={0} width={w} height={h} rx={0.12} fill={cores.fill} stroke={cores.stroke} strokeWidth={0.04} />\n )}\n </g>\n\n <text\n x={0} y={table.name ? -0.02 : 0}\n textAnchor=\"middle\" dominantBaseline=\"middle\"\n fontSize={fontSize} fontWeight={700} fill={cores.label}\n pointerEvents=\"none\" style={{ fontFamily: 'inherit' }}\n >\n {table.label}\n </text>\n {table.name && (\n <text\n x={0} y={fontSize * 0.75}\n textAnchor=\"middle\" dominantBaseline=\"middle\"\n fontSize={fontSize * 0.42} fill={cores.label} opacity={0.8}\n pointerEvents=\"none\" style={{ fontFamily: 'inherit' }}\n >\n {table.name}\n </text>\n )}\n {/* A BOLINHA DA ESCALA DIRETA, literal do V1: canto superior direito,\n cor primária, contorno da tela para ela não se confundir com a mesa.\n Fora do `<g>` que rotaciona: o ponto fica sempre no mesmo canto para\n o olho, mesmo com a mesa girada. */}\n {table.assignedToMe && (\n <circle\n cx={w / 2 - 0.02} cy={-h / 2 + 0.02} r={0.14}\n fill=\"var(--pos-primary)\" stroke=\"var(--pos-0)\" strokeWidth={0.04}\n pointerEvents=\"none\"\n />\n )}\n {ocupada && (table.guests ?? 0) > 0 && <Chip y={-h / 2 - 0.42} text={`+${table.guests}`} />}\n {ocupada && table.info && <Chip y={h / 2 + 0.42} text={table.info} />}\n </g>\n )\n})\n\nfunction Chip({ y, text }: { y: number; text: string }) {\n const fontSize = 0.24\n const largura = Math.max(0.6, text.length * fontSize * 0.58 + 0.3)\n return (\n <g transform={`translate(0 ${y})`} pointerEvents=\"none\">\n <rect x={-largura / 2} y={-0.18} width={largura} height={0.36} rx={0.18} fill=\"var(--pos-fg)\" opacity={0.85} />\n <text\n x={0} y={0.01} textAnchor=\"middle\" dominantBaseline=\"middle\"\n fontSize={fontSize} fontWeight={600} fill=\"var(--pos-1)\"\n style={{ fontFamily: 'inherit' }}\n >\n {text}\n </text>\n </g>\n )\n}\n","// ---------------------------------------------------------------------------\n// A BUSCA DO CARDÁPIO — três regras do V1 que não vieram com as cores.\n//\n// `ProductCatalog.tsx` filtra assim:\n//\n// const normalize = (str) => str.normalize('NFD').replace(/[̀-ͯ]/g, '').toLowerCase()\n// if (search.length >= 2) {\n// const q = normalize(search)\n// list = list.filter(p => normalize(p.name).includes(q)\n// || (p.barcode && p.barcode.includes(search)))\n// }\n//\n// 1. **SEM ACENTO, nos dois lados.** É a regra que mais custa numa casa\n// brasileira, e o Pertinho prova por que: dos 1.401 produtos, **271 têm\n// acento** — e o cadastro é inconsistente dentro do mesmo nome. «Agua Sem\n// Gás» está gravado exatamente assim. Sem normalizar, quem digita «água»\n// não acha (o registro diz «Agua») e quem digita «gas» também não (o\n// registro diz «Gás»). Normalizar as DUAS pontas resolve os dois sentidos.\n//\n// 2. **A partir de DUAS letras.** Com uma, quase tudo casa: a lista inteira\n// salta sob o dedo e não filtrou nada. O V1 espera a segunda.\n//\n// 3. **Código de barras por PEDAÇO**, e no texto cru — dígito não tem acento, e\n// o operador digita os últimos números da etiqueta amassada, não os treze.\n// O `submitCode` (código + Enter) continua exigindo igualdade exata: lá o\n// gesto é «este é o produto», aqui é «me mostre os parecidos».\n// ---------------------------------------------------------------------------\n\n/** O mínimo de letras para a busca começar a filtrar — o `>= 2` do V1. */\nexport const MENU_SEARCH_MIN = 2\n\n/** Minúsculas e sem acento, como o `normalize` do V1. */\nexport function semAcento(s: string): string {\n return s.normalize('NFD').replace(/[̀-ͯ]/g, '').toLowerCase()\n}\n\nexport interface MenuSearchable {\n name: string\n /** O código de barras, quando a casa cadastrou. */\n code?: string | null\n}\n\n/** A busca está filtrando? Abaixo do mínimo, a lista fica como estava. */\nexport function menuSearchActive(query: string): boolean {\n return query.trim().length >= MENU_SEARCH_MIN\n}\n\n/**\n * Este item casa com o que foi digitado?\n *\n * Só faz sentido perguntar quando `menuSearchActive` é verdade — com menos de\n * duas letras o V1 não filtra, e responder aqui esconderia essa regra.\n */\nexport function menuMatches(item: MenuSearchable, query: string): boolean {\n const cru = query.trim()\n if (cru.length < MENU_SEARCH_MIN) return true\n const q = semAcento(cru)\n if (semAcento(item.name).includes(q)) return true\n // O código vai pelo texto CRU e por pedaço, como no V1.\n return !!item.code && item.code.includes(cru)\n}\n\n\n// ---------------------------------------------------------------------------\n// QUEM ENTRA NO CARDÁPIO DO PDV.\n//\n// O V1 filtra o catálogo por CANAL (`lib/catalog/vitrine.ts`):\n//\n// .eq('active', true).eq('is_for_sale', true).gt('sale_price', 0)\n// .eq(COLUNA_DO_CANAL[canal], true) // canal 'pdv' → `pdv_available`\n//\n// O V2 tem o mesmo eixo — `plg_menu_items.available_for_pos`, ao lado de\n// `available_for_delivery` e `delivery_price` — e o provider já o lê\n// (`availableForPos`). O que faltava era a TELA perguntar: ela filtrava só por\n// «não está escondido», e um item marcado só para delivery aparecia no salão.\n//\n// Medido no cluster em 29-09: um item assim existe — «Massionetta», da Papa\n// Léguas Tacos, `status: available` com `available_for_pos: false`. Não é o\n// Pertinho, mas é a mesma tela, e 11 itens fazem o caminho simétrico\n// (só-PDV, corretamente exibidos).\n//\n// O `gt('sale_price', 0)` do V1 entra junto: item sem preço no cardápio é quase\n// sempre cadastro inacabado, e lançá-lo põe uma linha de R$ 0,00 na conta.\n// Nenhum item do cluster está assim hoje — a regra é do contrato, não do susto.\n// ---------------------------------------------------------------------------\n\nexport interface MenuSellable {\n /** Escondido no cardápio: não entra em canal nenhum. */\n isActive?: boolean\n /** Marcado para o PDV. Ausente conta como SIM, como o `?? true` do provider. */\n availableForPos?: boolean\n /** O preço em centavos, como o PDV conta dinheiro. */\n priceCents?: number\n}\n\n/**\n * Este item aparece no cardápio do SALÃO?\n *\n * Duas perguntas, e só estas: está escondido no cardápio, e a casa o marcou\n * para o PDV. As duas HONRAM uma decisão que alguém já tomou no cadastro — é\n * por isso que valem sem perguntar nada a ninguém.\n *\n * O preço NÃO entra aqui. Ver `menuItemHasPrice`.\n */\nexport function menuItemInPos(item: MenuSellable): boolean {\n if (item.isActive === false) return false\n if (item.availableForPos === false) return false\n return true\n}\n\n/**\n * A terceira regra do V1 — `gt('sale_price', 0)` —, medida e AINDA NÃO APLICADA.\n *\n * Ela é diferente das outras duas: escondido e fora-do-canal honram uma decisão\n * que a casa tomou, e esta IMPÕE uma regra sobre um cadastro que ninguém pediu\n * para esconder. Medido no cluster em 29-09, o que ela tiraria da tela:\n *\n * · Synthetic Bistro — **2 dos 4** itens\n * · Zedek Pizzas — 1 de 16\n * · Pertinho do Céu — nenhum\n *\n * Metade do cardápio de uma casa sumindo é decisão de produto, não conserto de\n * defeito. A regra fica escrita, testada e exportada, esperando o founder — e o\n * raciocínio do V1 a favor dela é bom: item de R$ 0,00 no cardápio é quase\n * sempre cadastro pela metade, e lançá-lo põe uma linha de R$ 0,00 na conta de\n * alguém.\n */\nexport function menuItemHasPrice(item: MenuSellable): boolean {\n return (item.priceCents ?? 0) > 0\n}\n","// ---------------------------------------------------------------------------\n// O CARDÁPIO VAZIO — e por quê.\n//\n// O V1 diz uma frase só: «Nenhum produto encontrado» (`ProductCatalog.tsx:340`,\n// no `grouped.length === 0`). Ela cobre busca, categoria e casa vazia.\n//\n// O V2 melhorou o caso da BUSCA — nomeia o termo e sugere o código do item —,\n// mas usava essa frase para TODOS os casos. Sem busca, `query` é vazio e o\n// título saía literalmente assim:\n//\n// Nada encontrado para “”\n//\n// Aspas vazias, falando de uma busca que o operador não fez. Ele fica\n// procurando o que digitou de errado.\n// ---------------------------------------------------------------------------\n\nimport { menuSearchActive } from './menuSearch'\n\nexport interface CatalogEmptyText {\n title: string\n hint?: string\n}\n\n/**\n * O que dizer quando não há item para mostrar.\n *\n * A busca vem primeiro: quando há termo, ele é a causa mais provável e o\n * operador tem um gesto (mudar o termo). Sem termo, a frase é a do V1 — e sem\n * dica, porque não há o que sugerir a quem não pediu nada.\n */\nexport function catalogEmpty(query?: string): CatalogEmptyText {\n const termo = (query ?? '').trim()\n // O MESMO limiar do filtro, e não «tem texto».\n //\n // Com uma letra a busca do V1 não filtra (`menuSearchActive`), então a lista\n // que aparece é a da categoria — e culpar a busca ali manda o operador\n // corrigir um termo que não está fazendo nada. Duas fontes decidindo a mesma\n // coisa dão duas respostas, e esta tela mostrava a errada.\n if (termo && menuSearchActive(termo)) {\n return {\n title: `Nada encontrado para “${termo}”`,\n hint: 'Tente o código do item ou parte do nome.',\n }\n }\n return { title: 'Nenhum produto encontrado' }\n}\n","// ---------------------------------------------------------------------------\n// O SALÃO VAZIO — e por quê.\n//\n// O V1 escolhe a frase pela CAUSA:\n//\n// {escopo.restrito && tables.length > 0\n// ? 'Nenhuma mesa na sua praça agora'\n// : 'Nenhuma mesa encontrada'} (`WaiterTables.tsx:329`)\n//\n// O V2 dizia sempre «Nenhuma mesa nesta área» com a dica «Escolha outra área\n// acima». Quando a causa é o FILTRO, a dica está certa. Quando é o ESCOPO, ela\n// manda o garçom fazer o que ele não pode: o recorte é a praça dele, não o\n// filtro — e trocar de área não traz mesa nenhuma.\n//\n// Uma dica que não resolve é pior que nenhuma: ela gasta a tentativa do\n// operador e o deixa achando que o sistema está quebrado.\n// ---------------------------------------------------------------------------\n\nexport interface FloorEmptyState {\n /** O garçom está recortado a praças/mesas dele. */\n scoped: boolean\n /** A casa tem mesas cadastradas (fora do recorte e do filtro). */\n houseHasTables: boolean\n /** Há um filtro de área ligado agora. */\n filtered: boolean\n}\n\nexport interface FloorEmptyText {\n title: string\n hint?: string\n}\n\n/**\n * O que dizer quando não há mesa para mostrar.\n *\n * A ordem das perguntas é a do V1: primeiro o escopo, porque ele é o recorte\n * que o operador NÃO controla.\n */\nexport function floorEmpty(s: FloorEmptyState): FloorEmptyText {\n // A casa não tem mesa nenhuma: nem escopo nem filtro explicam, e mandar\n // trocar de área seria mentir sobre a causa.\n if (!s.houseHasTables) return { title: 'Nenhuma mesa encontrada' }\n\n // O recorte é a praça dele. A frase é a do V1, e NÃO leva dica: não há gesto\n // que resolva — quem muda escala é quem monta a escala.\n if (s.scoped) return { title: 'Nenhuma mesa na sua praça agora' }\n\n // Sobrou o filtro, que é o único caso em que trocar de área ajuda.\n if (s.filtered) {\n return { title: 'Nenhuma mesa nesta área', hint: 'Escolha outra área acima.' }\n }\n\n return { title: 'Nenhuma mesa encontrada' }\n}\n","// ---------------------------------------------------------------------------\n// O ícone da ficha de categoria.\n//\n// Portado de `ICONE_CATEGORIA` em `beautyplace/src/components/orders/\n// ProductCatalog.tsx` — os doze pares dele estão todos aqui, e `Utensils` é a\n// queda, como lá.\n//\n// **Onde eu me afastei do V1, de propósito.** O mapa dele casa por nome\n// EXATO (`ICONE_CATEGORIA[cat.name]`), e contra as vinte e três categorias\n// reais do Pertinho isso acerta TRÊS: \"Bebidas\", \"Entradas\", \"Sobremesas\". As\n// outras vinte — \"Entradas/Petiscos\", \"BEBIDAS ALMOÇO\", \"Pratos principais\",\n// \"Guarnição - acompanhamentos\", \"Hamburguer\", \"Sanduiche\", \"Vinhos\" — caem no\n// genérico, e uma faixa em que vinte de vinte e três fichas têm o mesmo\n// desenho não ajuda ninguém a achar nada. Portar isso ao pé da letra seria\n// reproduzir fielmente um recurso que não funciona.\n//\n// Então o casamento é por PALAVRA, com o texto normalizado (sem acento, sem\n// caixa). Os pares do V1 continuam todos valendo — \"Bebidas\" ainda é `CupSoda`\n// —, e \"BEBIDAS ALMOÇO\" passa a ser também.\n//\n// A ordem da lista IMPORTA: a primeira palavra que aparecer no nome ganha.\n// \"Bebidas almoço\" tem \"bebida\" e \"almoço\"; quem manda é a bebida, porque é o\n// que a ficha está vendendo. Por isso as palavras mais específicas vêm antes\n// das genéricas.\n// ---------------------------------------------------------------------------\n\nimport {\n Beef, CakeSlice, Coffee, Croissant, CupSoda, Fish, GlassWater, IceCreamCone,\n Pizza, Salad, Sandwich, Soup, Utensils, Wheat, Wine, type LucideIcon,\n} from 'lucide-react'\n\n/** Sem acento e sem caixa: \"Guarnição\" e \"GUARNICAO\" são a mesma palavra. */\nfunction normalizar(s: string): string {\n return s.normalize('NFD').replace(/[̀-ͯ]/g, '').toLowerCase()\n}\n\n/** Palavra → ícone, do mais específico para o mais genérico. */\nconst POR_PALAVRA: Array<[string, LucideIcon]> = [\n // --- os doze pares do V1, primeiro -------------------------------------\n ['pizza', Pizza],\n ['calzone', Wheat],\n ['burger', Sandwich],\n ['sobremesa', IceCreamCone],\n ['doce', CakeSlice],\n ['cafe', Coffee],\n ['lanche', Croissant],\n ['bebida', CupSoda],\n ['drink', CupSoda],\n ['entrada', Salad],\n ['principai', Beef],\n ['acompanhamento', Utensils],\n // --- o vocabulário que a casa usa de verdade ----------------------------\n ['hamburguer', Sandwich],\n ['sanduiche', Sandwich],\n ['vinho', Wine],\n ['espumante', Wine],\n ['cerveja', GlassWater],\n ['suco', GlassWater],\n ['petisco', Salad],\n ['salada', Salad],\n ['sopa', Soup],\n ['caldo', Soup],\n ['peixe', Fish],\n ['frutos do mar', Fish],\n ['carne', Beef],\n ['massa', Wheat],\n ['couvert', Wheat],\n ['guarnicao', Utensils],\n ['executivo', Utensils],\n ['almoco', Utensils],\n ['kids', IceCreamCone],\n]\n\n/** A queda do V1: `Utensils`. */\nexport function categoryIcon(label: string): LucideIcon {\n const nome = normalizar(label)\n for (const [palavra, Icone] of POR_PALAVRA) if (nome.includes(palavra)) return Icone\n return Utensils\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 { PlanStage, type PlanZone } from './PlanStage'\nimport { catalogEmpty } from './catalogEmpty'\nimport { floorEmpty } from './floorEmpty'\nimport type { ZoneDraft, ZoneTool } from './zoneDraft'\nimport type { ZoneGeometry, ZoneMembershipAction } from './zoneEditing'\nimport type { FloorArea } from './floorGeometry'\nimport { Map } from 'lucide-react'\nimport { categoryIcon } from './categoryIcon'\nimport { Fragment } from 'react'\nimport {\n AlertTriangle, CalendarCheck, CheckCircle2, Clock, Minus, Plus, Receipt, Search, Users,\n Utensils, Wrench,\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'\nimport { menuMatches, menuSearchActive } from './menuSearch'\nimport {\n deriveTableTone, isTomOcupado, TONE_LABEL, CONTA_PEDIDA_LABEL, type TableTone,\n} from './tableTone'\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/** Um ícone por TOM. Seis tons, seis ícones — a cor nunca carrega o sentido\n * sozinha: numa tela lavada pelo sol, o que sobra é o glifo e a palavra. */\nconst TONE_ICON: Record<TableTone, typeof Clock> = {\n livre: Utensils,\n ocupada: Users,\n atrasada: Users,\n parada: Users,\n reservada: CalendarCheck,\n manutencao: Wrench,\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\n/**\n * O rótulo da pastilha — e para a mesa PARADA ele diz HÁ QUANTO TEMPO.\n *\n * O V1 escreve a duração de verdade e explica por quê:\n *\n * > *\"Vermelho é «sem pedido há 1 h»: a pastilha diz isso, senão o operador vê\n * > o mesmo «cerca de 1 hora» do laranja e não sabe por que a cor mudou.\"*\n *\n * O V2 mostrava a constante `'Sem pedido há 1 h'` em toda mesa parada. Agora\n * mesmo, no Pertinho, oito mesas estão paradas e as oito dizem a mesma frase —\n * a de cinco horas e a de sessenta e um minutos são indistinguíveis, e é\n * justamente entre essas duas que o gerente escolhe em qual mesa encostar\n * primeiro.\n *\n * Conta do `lastOrderAt`, e cai para a abertura quando não há item nenhum: é o\n * `last_item_at ?? opened_at` do V1, e é o que faz a mesa aberta há duas horas\n * sem pedir nada dizer «sem pedido há 2 horas» em vez de «agora».\n */\nexport function toneBadgeLabel(\n tone: TableTone,\n p: { lastOrderAt?: string | null; openedAt?: string | null },\n now = Date.now(),\n): string {\n if (tone !== 'parada') return TONE_LABEL[tone]\n const desde = p.lastOrderAt ?? p.openedAt\n const quanto = desde ? elapsed(desde, now) : undefined\n return quanto ? `Sem pedido há ${quanto}` : TONE_LABEL.parada\n}\n\n/**\n * A pastilha do salão, por TOM — a do V1.\n *\n * «Fechar conta» NÃO entra aqui. O V1 é literal: *\"ganha o anel, e é o único\n * estado que ganha\"* — a pastilha segue dizendo o tom, e o pedido aparece como\n * uma etiqueta no canto do cartão, por CIMA.\n *\n * A versão anterior trocava ícone e rótulo pelo «Fechar conta», e com isso a\n * mesa parada que pedia a conta perdia a única frase que dizia há quanto tempo\n * ela está parada — no cartão que o operador mais precisa ler. O CSS do anel,\n * duas telas adiante, já afirmava a regra certa: *\"o anel é o único sinal que\n * ela ganha\"*.\n */\nfunction ToneBadge({ tone, label }: { tone: TableTone; label: string }) {\n const Icon = TONE_ICON[tone]\n return (\n <span className=\"pos-badge\" data-tone={tone}>\n <Icon size={12} strokeWidth={2.4} aria-hidden />\n {label}\n </span>\n )\n}\n\n/** A etiqueta de canto do V1 — vermelha, por cima de qualquer tom. */\nfunction BillPill() {\n return (\n <span className=\"pos-tbl__bill\">\n <Receipt size={11} strokeWidth={2.6} aria-hidden />\n {CONTA_PEDIDA_LABEL}\n </span>\n )\n}\n\n/**\n * Há quanto tempo, na língua de quem lê — o `formatDistanceToNow` do V1.\n *\n * `453h22` é um número, não uma resposta: ninguém converte quatrocentas e\n * cinquenta horas em \"dezenove dias\" no meio do serviço. E essas comandas\n * existem — sete das doze abertas do Pertinho têm zero itens e dias de idade\n * (V1-079). O formato precisa aguentá-las sem virar ruído.\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 if (minutes < 1) return 'agora'\n if (minutes < 60) return `${minutes} min`\n const horas = Math.round(minutes / 60)\n if (horas === 1) return 'cerca de 1 hora'\n if (horas < 24) return `${horas} horas`\n const dias = Math.round(horas / 24)\n return dias === 1 ? '1 dia' : `${dias} dias`\n}\n\n/**\n * A idade em UMA PASTILHA de 200px — «agora · 45min · 2h · 3d».\n *\n * O V1 tem as duas formas e explica por quê: *\"`formatDistanceToNow` devolve\n * «cerca de 1 hora» e «5 meses»: numa pastilha de 200px isso é a coisa mais\n * larga da linha. Aqui o tempo é um número.\"*\n *\n * O cartão da mesa tem largura e fica com `elapsed`, por extenso. A ficha da\n * bandeja não tem, e o valor da comanda divide a linha com ela.\n *\n * E arredonda para BAIXO, como o V1: uma comanda de 90 minutos tem uma hora\n * cheia, não duas. Arredondar para cima envelhece a comanda e dispara o olho\n * do gerente para uma mesa que ainda está no prazo.\n */\nexport function briefElapsed(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 if (minutes < 1) return 'agora'\n if (minutes < 60) return `${minutes}min`\n const horas = Math.floor(minutes / 60)\n if (horas < 24) return `${horas}h`\n return `${Math.floor(horas / 24)}d`\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 */\n/**\n * O salão enquanto ele carrega.\n *\n * Um esqueleto só vale se tiver a FORMA do que vem — inclusive os cabeçalhos\n * de grupo. O anterior desenhava cartões soltos, e quando o dado chegava a\n * tela se reorganizava inteira: nasciam as faixas OCUPADAS e LIVRES e cada\n * cartão pulava de lugar. Quem já estava mirando uma mesa mirava outra.\n *\n * Por isso ele reproduz a grade de verdade: duas faixas, os contadores, e o\n * cartão com topo, selo, rodapé de tempo e valor. As proporções saem das\n * mesmas medidas do `.pos-tbl`, e não de números escolhidos a olho.\n *\n * `busy`/`free` são quantos cartões desenhar em cada faixa. O padrão é uma\n * casa pequena em serviço — poucas ocupadas, várias livres —, que é a forma\n * que o salão tem na maior parte do tempo.\n */\nexport function FloorSkeleton({ busy = 2, free = 6 }: { busy?: number; free?: number }) {\n const cards = (n: number, ocupada: boolean) => (\n <div className=\"pos-floor__g\">\n {Array.from({ length: n }, (_, i) => (\n <div\n key={i}\n className=\"pos-tbl pos-skel\"\n // O mesmo escalonamento dos cartões de verdade: a troca do esqueleto\n // pelo dado não muda o ritmo da entrada.\n style={{ ['--pos-stagger' as string]: `${Math.min(i, 11) * 20}ms` }}\n aria-hidden\n >\n <span className=\"pos-tbl__top\">\n <span className=\"pos-skel__b\" style={{ width: '52%', height: 19 }} />\n <span className=\"pos-skel__b\" style={{ width: 26, height: 13 }} />\n </span>\n {/* O selo de tom. Ocupada tem; livre também — e as duas com a mesma\n altura, senão o cartão encolhe quando o dado chega. */}\n <span className=\"pos-skel__b\" style={{ width: ocupada ? '58%' : '40%', height: 20, borderRadius: 'var(--pos-r-pill)' }} />\n <span className=\"pos-tbl__foot\">\n <span className=\"pos-skel__b\" style={{ width: 54, height: 13 }} />\n {ocupada && <span className=\"pos-skel__b\" style={{ width: 62, height: 14 }} />}\n </span>\n </div>\n ))}\n </div>\n )\n\n const head = (tone: 'busy' | 'free') => (\n <div className=\"pos-floor__h\" data-tone={tone} aria-hidden>\n <span className=\"pos-floor__dot\" />\n <span className=\"pos-skel__b\" style={{ width: tone === 'busy' ? 96 : 74, height: 11 }} />\n </div>\n )\n\n return (\n <div className=\"pos-floor pos-scroll\" aria-busy=\"true\" aria-label=\"Carregando as mesas\">\n {busy > 0 && <>{head('busy')}{cards(busy, true)}</>}\n {free > 0 && <>{head('free')}{cards(free, false)}</>}\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, focusAreaId, serviceAreas, editingPlan, onMoveTable, onPickTable, scoped, houseHasTables, areaFiltered, tool, onDrawZone, draftColor, selectedZoneId, onSelectZone, onUpdateZone, onRefuseZone, pickingZone, onToggleTableInZone, selectedAreaId, onSelectArea, dimmedIds }: {\n positions: PosPosition[]\n config: PosPositionConfig\n activeId?: string\n onSelect: (p: PosPosition) => void\n now: number\n /** As mesas fora do escopo do operador. A planta as ESMAECE; a grade as\n * REMOVE, e o recorte para ela acontece antes daqui. Ver `foraDoEscopo`. */\n dimmedIds?: ReadonlySet<string>\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 /** A área escolhida no rodapé: na planta ela é FOCO, não filtro. */\n focusAreaId?: string\n /** As praças desenhadas — a região de cada garçom. */\n serviceAreas?: PlanZone[]\n /** Editar a planta: a mesa passa a se arrastar em vez de abrir a comanda. */\n editingPlan?: boolean\n /** A ferramenta de praça armada e o que fazer com o gesto (ver PlanStage). */\n tool?: ZoneTool | null\n onDrawZone?: (draft: ZoneDraft) => void\n draftColor?: string\n selectedZoneId?: string | null\n onSelectZone?: (id: string | null) => void\n onUpdateZone?: (id: string, patch: Partial<ZoneGeometry>) => void\n onRefuseZone?: (reason: string) => void\n pickingZone?: boolean\n onToggleTableInZone?: (tableId: string, how: ZoneMembershipAction) => void\n selectedAreaId?: string | null\n onSelectArea?: (id: string | null) => void\n onMoveTable?: (id: string, to: { x: number; y: number }) => void\n /** Em edição, tocar a mesa ABRE A FICHA em vez de abrir a comanda. */\n onPickTable?: (id: string) => void\n /** O operador está recortado à praça dele — ver `floorEmpty`. */\n scoped?: boolean\n /** A casa tem mesa cadastrada, fora do recorte e do filtro. */\n houseHasTables?: boolean\n /** Há filtro de área ligado agora. */\n areaFiltered?: boolean\n}) {\n if (positions.length === 0) {\n // A FRASE SEGUE A CAUSA, como no V1: «Escolha outra área» só ajuda quando\n // a causa é o filtro. Ver `floorEmpty.ts`.\n const vazio = floorEmpty({\n scoped: !!scoped,\n houseHasTables: houseHasTables !== false,\n filtered: !!areaFiltered,\n })\n return <EmptyState title={vazio.title} hint={vazio.hint} Icon={Utensils} />\n }\n return layout === 'plan'\n ? <PlanFloor dimmedIds={dimmedIds} positions={positions} config={config} activeId={activeId} onSelect={onSelect} picking={picking} now={now} focusAreaId={focusAreaId} serviceAreas={serviceAreas} editingPlan={editingPlan} onMoveTable={onMoveTable} onPickTable={onPickTable} tool={tool} onDrawZone={onDrawZone} draftColor={draftColor} selectedZoneId={selectedZoneId} onSelectZone={onSelectZone} onUpdateZone={onUpdateZone} onRefuseZone={onRefuseZone} pickingZone={pickingZone} onToggleTableInZone={onToggleTableInZone} selectedAreaId={selectedAreaId} onSelectArea={onSelectArea} />\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 // OCUPADAS em cima, LIVRES embaixo — e cada grupo diz quantas são.\n //\n // É como o V1 desenha o salão, e o motivo é a pergunta do turno: \"o que está\n // acontecendo\" vem antes de \"onde posso sentar alguém\". Numa casa de 207\n // mesas, a ordem por número enterra as três ocupadas no meio de duzentas\n // livres, e o gerente rola a tela para achar o próprio serviço.\n //\n // A média de ocupação vai no cabeçalho das ocupadas porque é a leitura que\n // ela responde: mesa parada há muito tempo é mesa que ninguém está servindo.\n // O TOM manda, não o `status` do cadastro: é a regra do V1 (\"a comanda\n // manda\"), e é por isso que `status = 'occupied'` sem comanda cai em LIVRES\n // em vez de inflar o contador com resto de sincronização.\n const toneOf = (p: PosPosition) => posTone(p, now)\n const busy = positions.filter((p) => isTomOcupado(toneOf(p)))\n const free = positions.filter((p) => !isTomOcupado(toneOf(p)))\n // A média conta só o SERVIÇO de verdade — mesa com consumo.\n //\n // Sem esse filtro ela sai \"~23894 min em média\", porque as comandas vazias\n // de dias atrás (V1-079: sete das doze abertas do Pertinho têm zero itens,\n // algumas com 92 horas) entram no cálculo com o mesmo peso de uma mesa que\n // sentou há dez minutos. Uma média que nenhuma mesa se parece com não é uma\n // média — é um número que ocupa a linha.\n const mins = busy\n .filter((p) => (p.totalCents ?? 0) > 0)\n .map((p) => (p.openedAt ? Math.round((now - new Date(p.openedAt).getTime()) / 60_000) : null))\n .filter((m): m is number => m != null && m >= 0)\n const avg = mins.length ? Math.round(mins.reduce((a, b) => a + b, 0) / mins.length) : null\n\n const group = (label: string, tone: 'busy' | 'free', list: PosPosition[], extra?: string) =>\n list.length === 0 ? null : (\n <Fragment key={label}>\n <div className=\"pos-floor__h\" data-tone={tone}>\n <span className=\"pos-floor__dot\" aria-hidden />\n <span className=\"pos-floor__n\">{list.length} {label}</span>\n {extra && (\n <span className=\"pos-floor__x\">\n <Clock size={12} strokeWidth={2.2} aria-hidden />{extra}\n </span>\n )}\n </div>\n <div className=\"pos-floor__g\">{cards(list)}</div>\n </Fragment>\n )\n\n function cards(list: PosPosition[]) {\n return list.map((p, index) => {\n const since = elapsed(p.openedAt, now)\n return (\n <button\n key={p.id}\n className=\"pos-tbl\"\n data-tone={toneOf(p)}\n data-bill={p.billRequested || undefined}\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 {p.billRequested && <BillPill />}\n <ToneBadge tone={toneOf(p)} label={toneBadgeLabel(toneOf(p), p, now)} />\n {/* CONTAGEM ou NOME, nunca os dois — a regra do `TableCard.tsx`\n do V1:\n\n customer_count > 1 ? \"N pessoas\" : customer_name ?? nada\n\n Numa mesa de seis, o nome de quem abriu não identifica a mesa e\n a contagem identifica; numa mesa de um, \"1 pessoa\" não diz nada\n e o nome diz tudo. Escrever os dois gasta a única linha livre do\n cartão com a metade que não ajuda.\n\n Aqui ficava o nome do GARÇOM — quem serve no lugar de quem\n consome, e numa casa com três garçons um terço do salão\n parecendo a mesma mesa. */}\n {(p.guestCount ?? 0) > 1 ? (\n <span className=\"pos-tbl__who\">\n <Users size={12} strokeWidth={2.2} aria-hidden /> {p.guestCount} pessoas\n </span>\n ) : p.customerName ? (\n <span className=\"pos-tbl__who\">{p.customerName}</span>\n ) : null}\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 {/* O SINAL DA SEGUNDA CONTA.\n A view do salão traz uma comanda por mesa e cala as outras.\n Sem este selo, o garçom lê um valor achando que é a mesa. */}\n {(p.openBillCount ?? 0) > 1 && (\n <span className=\"pos-tbl__bills\" title={`${p.openBillCount} contas abertas nesta mesa`}>\n {p.openBillCount} contas\n </span>\n )}\n {p.totalCents != null && (\n <span className=\"pos-tbl__total pos-num\">{formatCents(p.totalCents)}</span>\n )}\n </span>\n </button>\n )\n })\n }\n\n return (\n <div className=\"pos-floor pos-scroll\" data-picking={picking}>\n {group(\n 'OCUPADAS',\n 'busy',\n busy,\n avg != null\n ? `~${avg < 60 ? `${avg} min` : `${Math.round(avg / 60)} h`} em média`\n : undefined,\n )}\n {group('LIVRES', 'free', free)}\n </div>\n )\n}\n\n/** O desenho que a categoria ganha quando o app não manda um. */\nfunction CategoryIcon({ label }: { label: string }) {\n const Icone = categoryIcon(label)\n return <Icone size={18} strokeWidth={2.1} aria-hidden />\n}\n\nconst CELL = 44\n\n/**\n * O TOM da mesa, numa função só.\n *\n * A grade e a planta pintam o mesmo salão, e duas cópias desta derivação são\n * duas chances de a mesma mesa aparecer laranja num lugar e vermelha no outro.\n */\nfunction posTone(p: PosPosition, now: number) {\n return deriveTableTone({\n status: p.status === 'free' ? 'available' : undefined,\n hasActiveOrder: p.status !== 'free',\n openedAt: p.openedAt,\n lastOrderAt: p.lastOrderAt,\n now,\n })\n}\n\nfunction PlanFloor({ positions, config, activeId, onSelect, picking, now, focusAreaId, serviceAreas, editingPlan, onMoveTable, onPickTable, tool, onDrawZone, draftColor, selectedZoneId, onSelectZone, onUpdateZone, onRefuseZone, pickingZone, onToggleTableInZone, selectedAreaId, onSelectArea, dimmedIds }: {\n positions: PosPosition[]; config: PosPositionConfig; activeId?: string\n onSelect: (p: PosPosition) => void; picking?: boolean; now: number\n focusAreaId?: string; serviceAreas?: PlanZone[]\n editingPlan?: boolean; onMoveTable?: (id: string, to: { x: number; y: number }) => void\n onPickTable?: (id: string) => void\n tool?: ZoneTool | null; onDrawZone?: (draft: ZoneDraft) => void; draftColor?: string\n selectedZoneId?: string | null; onSelectZone?: (id: string | null) => void\n onUpdateZone?: (id: string, patch: Partial<ZoneGeometry>) => void\n onRefuseZone?: (reason: string) => void\n pickingZone?: boolean; onToggleTableInZone?: (tableId: string, how: ZoneMembershipAction) => void\n selectedAreaId?: string | null; onSelectArea?: (id: string | null) => void\n dimmedIds?: ReadonlySet<string>\n}) {\n const toneOf = (p: PosPosition) => posTone(p, now)\n /**\n * A planta em METROS só existe se alguém tiver desenhado o salão.\n *\n * Sem posição, a planta real nasceria vazia — pior que a maquete em células.\n * A aba diz o que falta em vez de mostrar um salão em branco: é a régua do\n * porte — ação bloqueada DIZ o que falta, nunca um espaço morto em silêncio.\n *\n * **O texto anterior dizia que o Pertinho tem «cem mesas e NENHUMA com\n * coordenada». Isso deixou de ser verdade** (29-09): são 208 mesas, 200 com\n * `pos_x`/`pos_y`, e as duas praças estão desenhadas. A planta REAL desenha\n * — «2 ambiente(s), 218 mesa(s), 18 fora, 5 praça(s)». Quem escolhe entre\n * ela e a maquete é o operador, no segmentado «Simplificada · Planta baixa»;\n * a maquete é só o PADRÃO, e o porquê está no `floorLayout`.\n */\n const comPosicao = positions.filter((p) => p.posXM != null && p.posYM != null)\n /** Os ambientes DESENHADOS. Sem forma, não há origem para as coordenadas. */\n const areas: FloorArea[] = (config.zones ?? [])\n .filter((z) => z.shape != null && (z.widthM != null || z.polygon != null))\n .map((z) => ({\n id: z.id, name: z.label,\n shape: (z.shape ?? 'rect') as FloorArea['shape'],\n posX: z.posX ?? null, posY: z.posY ?? null,\n widthM: z.widthM ?? null, heightM: z.heightM ?? null,\n polygon: z.polygon ?? null,\n }))\n\n // A planta REAL: só quando há mesa posicionada E ambiente desenhado — a\n // coordenada sem origem não põe nada no lugar certo.\n if (comPosicao.length > 0 && areas.length > 0) {\n return (\n <PlanStage\n dimmedIds={dimmedIds}\n areas={areas}\n tables={comPosicao.map((p) => ({\n id: p.id,\n areaId: p.areaId ?? null,\n posX: p.posXM ?? null,\n posY: p.posYM ?? null,\n shape: (p.tableShape ?? 'rectangle') as 'round' | 'rectangle' | 'square',\n widthM: p.widthM ?? null,\n heightM: p.heightM ?? null,\n diameterM: p.diameterM ?? null,\n rotation: p.rotation ?? null,\n label: p.label,\n tone: toneOf(p),\n seats: p.seats ?? null,\n billRequested: p.billRequested,\n assignedToMe: p.assignedToMe,\n guests: p.guestCount ?? null,\n info: p.totalCents != null ? formatCents(p.totalCents) : null,\n }))}\n zones={serviceAreas}\n focusAreaId={focusAreaId}\n editing={editingPlan}\n onMoveTable={onMoveTable}\n tool={tool}\n onDrawZone={onDrawZone}\n draftColor={draftColor}\n selectedZoneId={selectedZoneId}\n onSelectZone={onSelectZone}\n onUpdateZone={onUpdateZone}\n onRefuseZone={onRefuseZone}\n pickingZone={pickingZone}\n onToggleTableInZone={onToggleTableInZone}\n selectedAreaId={selectedAreaId}\n onSelectArea={onSelectArea}\n activeId={activeId}\n onSelect={(t) => {\n // Em EDIÇÃO o toque abre a ficha; fora dela, abre a comanda. O mesmo\n // glifo, dois significados — e é o modo que decide, não o gesto.\n if (onPickTable) { haptic('tap'); onPickTable(t.id); return }\n const alvo = positions.find((p) => p.id === t.id)\n if (alvo) { haptic('tap'); onSelect(alvo) }\n }}\n />\n )\n }\n\n if (comPosicao.length === 0) {\n return (\n <div className=\"pos-plan__none\">\n <Map size={26} strokeWidth={1.7} aria-hidden />\n <p className=\"pos-empty__t\">A planta ainda não foi desenhada</p>\n <p className=\"pos-empty__h\">\n As {positions.length} mesas estão cadastradas, mas nenhuma tem lugar no\n salão. Em <strong>Planta do salão</strong>, «Organizar automaticamente»\n põe todas de uma vez — e depois é só arrastar o que ficou fora do lugar.\n </p>\n </div>\n )\n }\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, pending, onAdd, onRemove, query,\n menuLabel, onRefreshMenu, menuRefreshing,\n}: {\n categories: PosCategory[]\n items: PosItem[]\n activeCategoryId?: string\n onCategoryChange: (id: string) => void\n quantities: Record<string, number>\n /** Quanto de cada item ainda está no CARRINHO — o que dá para tirar daqui. */\n pending?: Record<string, number>\n onAdd: (item: PosItem) => void\n onRemove: (item: PosItem) => void\n query: string\n /** A idade desta cópia do cardápio — ver `menuFreshnessLabel`. */\n menuLabel?: string\n /**\n * Ir buscar o cardápio AGORA.\n *\n * Sem ele a linha de frescor não aparece: um app que não sabe revalidar não\n * deve prometer um botão que não faz nada.\n */\n onRefreshMenu?: () => void\n menuRefreshing?: boolean\n}) {\n // A busca do V1, com as três regras dele — ver `menuSearch`: sem acento nos\n // dois lados, a partir da SEGUNDA letra, e código de barras por pedaço.\n //\n // O filtro antigo fazia `toLowerCase()` só e comparava o código por\n // IGUALDADE. Dos 1.401 produtos do Pertinho, 271 têm acento, e o cadastro\n // erra dentro do mesmo nome — «Agua Sem Gás» está gravado assim, então «água»\n // não achava e «gas» também não.\n const searching = menuSearchActive(query)\n const shown = items.filter((i) =>\n searching\n ? menuMatches(i, query)\n : !activeCategoryId || i.categoryId === activeCategoryId,\n )\n\n /** Os itens em seções, na ordem do cardápio. Sem categoria vai para o fim. */\n const secoes: Array<[PosCategory | undefined, PosItem[]]> = []\n for (const c of categories) {\n const meus = shown.filter((i) => i.categoryId === c.id)\n if (meus.length > 0) secoes.push([c, meus])\n }\n const orfaos = shown.filter((i) => !categories.some((c) => c.id === i.categoryId))\n if (orfaos.length > 0) secoes.push([undefined, orfaos])\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 {/* O app pode mandar o ícone; quando não manda, o NOME decide.\n A ficha sempre soube desenhá-lo e ninguém o preenchia — o\n cardápio do Pertinho tem vinte e três fichas, e sem desenho\n nenhum a faixa é uma parede de texto do mesmo tamanho. */}\n <span className=\"pos-cat__icon\">\n {c.icon ?? <CategoryIcon label={c.label} />}\n </span>\n </button>\n ))}\n </div>\n )}\n\n {!searching && <hr className=\"pos-cats-rule\" />}\n\n {/* A IDADE DO CARDÁPIO, e o gesto de forçar.\n Discreta de propósito: ela só importa quando alguém desconfia do que\n está vendo — «acabou a picanha e ainda está aí». O resto do tempo é\n uma linha de 11px que ninguém precisa ler. */}\n {onRefreshMenu && (\n <div style={{\n display: 'flex', alignItems: 'center', justifyContent: 'flex-end',\n gap: '0.5rem', padding: '0 0.75rem 0.375rem', fontSize: 11, opacity: 0.55,\n }}>\n <span>{menuLabel}</span>\n <button\n type=\"button\"\n className=\"fz-tap\"\n onClick={() => { haptic('tap'); onRefreshMenu() }}\n disabled={menuRefreshing}\n style={{\n background: 'transparent', border: 0, padding: '0.125rem 0.25rem',\n color: 'inherit', font: 'inherit', textDecoration: 'underline',\n cursor: menuRefreshing ? 'default' : 'pointer',\n }}\n >\n Atualizar\n </button>\n </div>\n )}\n\n {shown.length === 0 ? (\n /* A FRASE SEGUE A CAUSA. Sem busca, `query` é vazio e o título saía\n «Nada encontrado para “”» — aspas vazias sobre uma busca que\n ninguém fez. Ver `catalogEmpty.ts`. */\n (() => { const v = catalogEmpty(query); return <EmptyState title={v.title} hint={v.hint} /> })()\n ) : (\n /* UMA SEÇÃO POR CATEGORIA, com o nome acima da grade — é assim que o\n V1 desenha o cardápio, e a razão aparece com \"Todas\": dezenove\n categorias numa grade plana são duzentos e cinquenta cartões sem\n nenhuma divisa, e achar \"Coca Cola\" vira rolagem cega.\n\n A ORDEM É A DO CARDÁPIO, não a alfabética — o V1 é explícito: é o\n `menu_order` das categorias, a mesma ordem das fichas coloridas do\n topo. Ordenar por nome faria a faixa de cima e a lista de baixo\n discordarem, e é a faixa que o operador usa para se orientar.\n\n Com uma categoria escolhida sobra uma seção só, e o rótulo continua\n pagando o espaço: ele confirma onde se está depois de rolar. */\n secoes.map(([cat, itens]) => (\n <div key={cat?.id ?? '__sem'}>\n <h3 className=\"pos-sect\">{cat?.label ?? 'Sem categoria'}</h3>\n <div className=\"pos-items\">\n {itens.map((item, index) => {\n const quantity = quantities[item.id] ?? 0\n const category = categories.find((c) => c.id === item.categoryId)\n /**\n * Tingir depende de estar NA COMANDA, não de ter categoria.\n *\n * `filled` exigia uma categoria, e o item órfão — que a tela já\n * agrupa em «Sem categoria» — ficava branco mesmo com três\n * unidades lançadas. O operador perdia justamente o retorno que\n * este cartão existe para dar. Sem categoria ele usa o tom neutro\n * da casa; o retorno é o mesmo.\n */\n const filled = quantity > 0\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 // Só se pode tirar o que AINDA NÃO FOI para a cozinha.\n //\n // O − do cardápio mexia na quantidade total, enviados\n // inclusive: dois chopes já na cozinha e o operador\n // apagava um daqui, sem cancelamento, sem motivo e sem\n // ninguém autorizando — a conta encolhia e o relatório\n // de cancelamentos não sabia de nada. Item enviado se\n // cancela pelo `⋯`, com motivo.\n disabled={(pending?.[item.id] ?? 0) === 0}\n // Bloqueado em silêncio ensina que o botão é enfeite. A\n // frase é a do V1, palavra por palavra, e só aparece no\n // caso que ela explica: há item na comanda, e nenhum\n // dele ainda pode voltar.\n title={quantity > 0 && (pending?.[item.id] ?? 0) === 0\n ? 'Já foi para a cozinha — use Cancelamento'\n : undefined}\n aria-label={`Tirar um ${item.name}`}\n >\n <Minus size={16} strokeWidth={2.6} aria-hidden />\n </button>\n {/* Zero é apagado; um é texto cheio. O V1 faz a mesma\n distinção, e é ela que deixa varrer a grade com o olho\n procurando o que já foi lançado. */}\n <span className=\"pos-step__n\" data-zero={quantity === 0 ? '' : undefined}>{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 </div>\n ))\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\n ? {\n // Duas cores da MESMA família: a viva é a tira de 5px (e a ficha\n // de categoria lá em cima — é a repetição que torna o vínculo\n // decorável); a `-on` é o card quando o item já está na comanda.\n // São diferentes de propósito: preencher com a cor cheia\n // transforma o card num bloco sólido e a tinta some.\n ['--pos-item-tone' as string]: `var(--pos-tone-${tone})`,\n ['--pos-item-tone-on' as string]: `var(--pos-tone-${tone}-on)`,\n }\n : {}),\n ...(filled && tone ? { background: `var(--pos-tone-${tone})` } : {}),\n }}\n >\n {children}\n </div>\n )\n}\n\n/**\n * O valor que a ficha da bandeja mostra — o SALDO, não o total.\n *\n * Regra do V1, e está numa linha só:\n *\n * ```ts\n * const openOrdersWithOutstandingBalance = openOrders.map(order => ({\n * ...order, total: order.balance ?? order.total,\n * }))\n * ```\n *\n * A bandeja responde **\"quanto ainda está lá fora\"**, não \"quanto foi lançado\".\n * Uma mesa de R$ 300 que já pagou R$ 250 aparece como R$ 50: o total dá ao caixa\n * um número que ele não vai receber, e numa casa com pagamento por participante\n * a soma da régua deixa de bater com o dinheiro que falta entrar.\n *\n * Zero é resultado válido e aparece como R$ 0,00 — conta paga e ainda aberta é\n * um estado de verdade (ninguém fechou), e a ficha continuar na bandeja é o que\n * lembra de fechá-la.\n *\n * Nunca negativo: pagamento a mais é troco a devolver, e um valor negativo na\n * régua leria como se a casa devesse dinheiro ao cliente.\n */\nexport function dockAmountCents(\n totalCents: number | undefined,\n paidByGuest?: Record<string, number>,\n): number | undefined {\n if (totalCents == null) return undefined\n if (!paidByGuest) return totalCents\n const pago = Object.values(paidByGuest).reduce((s, v) => s + (v || 0), 0)\n return Math.max(0, totalCents - pago)\n}\n","// ---------------------------------------------------------------------------\n// REABRIR uma comanda fechada.\n//\n// Portado do `OrderCart` do V1, onde o botão aparece sob três condições e uma\n// delas é uma recusa explicada:\n//\n// ```tsx\n// {orderStatus === 'closed' && !deliveryOverview && !courtesyEvent && (\n// <Button …>{isTableOrder ? 'Reabrir Mesa' : 'Reabrir Comanda'}</Button>\n// )}\n// ```\n//\n// A terceira é a que importa. Uma comanda encerrada como CORTESIA não oferece\n// reabertura — ela mostra o valor perdoado, o motivo, e a frase:\n//\n// > *\"A reabertura exige um estorno controlado da cortesia.\"*\n//\n// Reabrir ali significaria cobrar de novo uma conta que a casa já declarou\n// perdoada, sem desfazer o registro de quem perdoou. O V1 prefere dizer que\n// não dá e por quê — e é isso que separa uma recusa de um botão que some.\n//\n// O DELIVERY também fica de fora: o pedido dele tem um ciclo próprio (em rota,\n// entregue) e «reabrir» não é um passo dele.\n// ---------------------------------------------------------------------------\n\n/** O que impede a reabertura, ou `null` quando ela pode ser oferecida. */\nexport type ReopenBlock = 'not-closed' | 'courtesy' | 'delivery' | 'paid'\n\nexport interface ReopenState {\n /** `closed` é o único estado de onde se reabre. */\n status?: string | null\n /** A comanda foi encerrada como cortesia. */\n courtesy?: boolean\n /** É um pedido de delivery. */\n delivery?: boolean\n /**\n * A comanda já recebeu dinheiro?\n *\n * `undefined` é «NÃO SEI», e não sei também fecha a porta — mesma regra que\n * o painel de fechadas já aplica à cortesia: esconder um botão custa um\n * chamado, oferecê-lo errado custa uma conta cobrada duas vezes.\n */\n hasPayment?: boolean\n}\n\nexport function reopenBlock(state: ReopenState): ReopenBlock | null {\n if (state.status !== 'closed') return 'not-closed'\n if (state.courtesy) return 'courtesy'\n if (state.delivery) return 'delivery'\n // DINHEIRO JÁ RECEBIDO fecha a porta, pela mesma razão da cortesia.\n //\n // No V2 o fechamento levanta uma FATURA, e reabrir tem de cancelá-la —\n // senão ela fica de pé sobre uma comanda que voltou a andar, e o próximo\n // fechamento não a atualiza: `order_raise_receivable` reusa a fatura\n // existente e recopia as linhas, mas NÃO mexe no total nem na parcela. Uma\n // mesa reaberta de R$ 100 que vai a R$ 150 continuaria cobrando R$ 100.\n //\n // Cancelar é seguro enquanto ninguém pagou. Com pagamento, cancelar a\n // fatura apagaria a contrapartida de um dinheiro que entrou — isso é\n // ESTORNO, e estorno passa por gente.\n if (state.hasPayment !== false) return 'paid'\n return null\n}\n\n/** A explicação do V1 para o caso da cortesia. As outras duas nem desenham. */\nexport const COURTESY_REOPEN_NOTE = 'A reabertura exige um estorno controlado da cortesia.'\n\n/** E a mesma explicação para a comanda que já recebeu dinheiro. */\nexport const PAID_REOPEN_NOTE = 'A comanda já recebeu pagamento. A reabertura exige um estorno controlado.'\n\n/** O rótulo muda com o que se reabre — «Mesa» ou «Comanda», como no V1. */\nexport function reopenLabel(atTable: boolean, busy = false): string {\n if (busy) return 'Reabrindo...'\n return atTable ? 'Reabrir Mesa' : 'Reabrir Comanda'\n}\n\n/**\n * A pergunta antes de reabrir — literal, e ela diz o EFEITO.\n *\n * «Tem certeza?» não informa nada; esta frase diz para onde o estado volta, e\n * é isso que deixa a pessoa decidir.\n */\nexport const REOPEN_CONFIRM = 'Reabrir esta comanda? O status voltará para \"em andamento\".'\n\n/** O aviso de sucesso, na palavra do que foi reaberto. */\nexport function reopenedNotice(atTable: boolean): string {\n return atTable ? 'Mesa reaberta' : 'Comanda reaberta'\n}\n\nexport const REOPEN_FAILED = 'Erro ao reabrir'\n","// ---------------------------------------------------------------------------\n// «Saiu nota?» — o selo de uma comanda fechada.\n//\n// Portado de `seloDaComanda` em `beautyplace/src/components/orders/\n// PosClosedTablesPanel.tsx`, e o V1 explica por que a regra mora sozinha:\n//\n// \"Separado da busca porque a REGRA é o que erra: comanda dividida tem uma\n// invoice por pagamento, e perguntar «tem nota?» daria «sim» para a mesa de\n// quatro em que só um pediu CPF.\"\n//\n// Daí as três respostas em vez de duas. `parcial` não é um meio-termo\n// decorativo: é a mesa que o caixa PRECISA ver, porque ela parece resolvida e\n// não está — e no placar do turno ela conta como pendente.\n//\n// A nota CONSOLIDADA é o caso que vem de fora dessa contagem: uma NFC-e da\n// comanda inteira pertence ao pedido e não a nenhuma invoice. Sem ela aqui, o\n// painel escreveria \"Sem nota\" diante de um documento autorizado.\n// ---------------------------------------------------------------------------\n\nexport type FiscalSeal = 'com-nota' | 'sem-nota' | 'parcial'\n\nexport function comandaSeal(\n /**\n * Quantas notas a comanda DEVERIA ter.\n *\n * No V1 é a contagem de invoices; no V2 é a de PAGAMENTOS, porque o elo\n * daqui liga documento à comanda direto e não passa por invoice. A conta é a\n * mesma: uma conta dividida em quatro paga quatro vezes e pode gerar quatro\n * notas; uma comanda paga de uma vez espera uma.\n */\n expected: number,\n /** Quantas já têm documento AUTORIZADO. Rejeitado e em processo não valem. */\n issued: number,\n /** Uma NFC-e da comanda INTEIRA, que não corresponde a um pagamento só. */\n hasConsolidated = false,\n): FiscalSeal {\n if (hasConsolidated) return 'com-nota'\n if (issued <= 0) return 'sem-nota'\n // Sem saber quantas eram esperadas, uma nota já resolve: é o caso do balcão,\n // que paga de uma vez. Inventar um denominador aqui produziria «parcial» em\n // comanda inteira — um alarme que nunca se resolve.\n if (expected <= 1) return 'com-nota'\n return issued >= expected ? 'com-nota' : 'parcial'\n}\n\nexport interface SealTally {\n issuedCents: number\n issuedCount: number\n pendingCents: number\n pendingCount: number\n}\n\n/**\n * O PLACAR DO TURNO: quanto já saiu em nota e quanto ainda falta.\n *\n * A lista sozinha responde \"esta mesa saiu?\" — uma de cada vez. A pergunta do\n * fim do turno é de SOMA: \"falta emitir quanto?\". Sem isto o caixa desce a\n * lista contando de cabeça.\n *\n * `parcial` conta como PENDENTE. Arredondá-la para resolvida é exatamente o\n * erro que o selo existe para evitar.\n *\n * Comanda SEM selo não entra em nenhum dos dois lados: não saber se saiu nota\n * é diferente de saber que não saiu, e somá-la como pendente inventaria uma\n * dívida fiscal que ninguém apurou.\n */\nexport function tallySeals(\n items: Array<{ id: string; totalCents: number }>,\n seals: Record<string, FiscalSeal | undefined>,\n): SealTally {\n const acc: SealTally = { issuedCents: 0, issuedCount: 0, pendingCents: 0, pendingCount: 0 }\n for (const i of items) {\n const selo = seals[i.id]\n if (!selo) continue\n if (selo === 'com-nota') { acc.issuedCents += i.totalCents; acc.issuedCount += 1 }\n else { acc.pendingCents += i.totalCents; acc.pendingCount += 1 }\n }\n return acc\n}\n","// ---------------------------------------------------------------------------\n// «Mesas fechadas» — o que a coluna da direita mostra quando não há mesa aberta.\n//\n// Portado de `beautyplace/src/components/orders/PosClosedTablesPanel.tsx`, que\n// documenta o mesmo defeito que o V2 tinha:\n//\n// \"Esta coluna existia e não dizia nada: no Salão ela mostrava o cartão do\n// Balcão — «Venda de balcão · Lance um item do cardápio» — que é o texto de\n// OUTRO canal, apontando para um gesto que não é o do garçom que está olhando\n// uma grade de mesas.\"\n//\n// O que falta ao operador do salão, nesse mesmo espaço, é o passo DEPOIS do\n// fechamento: a mesa 12 fechou, qual foi o valor? o cliente voltou pedindo a\n// nota? Hoje isso mora na retaguarda, a duas telas de distância, e o caixa sai\n// do PDV no meio do turno para consultar.\n//\n// A lista é do DIA OPERACIONAL — o horizonte de quem está no turno — e o\n// título muda com o canal, porque \"Mesas fechadas\" num balcão sem mesa nenhuma\n// é o mesmo erro que o V1 corrigiu.\n// ---------------------------------------------------------------------------\n\nimport { COURTESY_REOPEN_NOTE, PAID_REOPEN_NOTE, reopenBlock, reopenLabel } from './reopen'\nimport { FileCheck, FileWarning, Receipt, RotateCcw } from 'lucide-react'\nimport { formatCents } from './money'\nimport { tallySeals, type FiscalSeal } from './fiscalSeal'\n\nexport interface ClosedTicket {\n id: string\n /** Encerrada como CORTESIA — não reabre. Ver `reopen.ts`. */\n courtesy?: boolean\n /** Já recebeu dinheiro? `undefined` = não sei, e não sei não reabre. */\n hasPayment?: boolean\n /** Nasceu no balcão/canal, e não numa mesa: muda a palavra do botão. */\n counterOrigin?: boolean\n reference?: string\n positionLabel?: string | null\n customerName?: string | null\n totalCents: number\n closedAt: string | null\n /**\n * Os dois campos que decidem a QUE CANAL esta conta pertence.\n *\n * Opcionais porque um app que só tem um canal não precisa deles; onde vêm, o\n * PDV corta a lista pelo canal corrente, com a regra do V1 — mesa ganha\n * primeiro, balcão é o padrão. Ver `./comandaChannel.ts`.\n */\n tableId?: string | null\n channel?: string | null\n /** A ESPÉCIE do V1 — responde quando `channel` é nulo, que é o caso de tudo\n * o que a migração trouxe. */\n kind?: string | null\n}\n\nconst hora = (iso: string | null): string => {\n if (!iso) return ''\n return new Date(iso).toLocaleTimeString('pt-BR', { hour: '2-digit', minute: '2-digit' })\n}\n\n/**\n * O NOME do canal, para as frases do painel.\n *\n * O painel era binário — balcão ou mesa —, e as abas de Retirada e Delivery\n * caíam no balcão: a tela do Delivery dizia «Histórico do balcão» e «Nenhuma\n * venda de balcão encerrada hoje». A palavra errada num canal que não é o\n * dele, que é o mesmo defeito que o trilho já tinha corrigido.\n *\n * Os nomes são os do dock do V1 (`TIPO`): Balcão · Retirada · Delivery.\n */\nconst NOME_DO_CANAL: Record<string, { de: string; artigo: string }> = {\n balcao: { de: 'do balcão', artigo: 'As vendas do balcão' },\n retirada: { de: 'da retirada', artigo: 'As vendas da retirada' },\n delivery: { de: 'do delivery', artigo: 'Os pedidos do delivery' },\n}\n\nexport function ClosedPanel({ items, counter, channel, loading, onOpen, onReopen, seals, sealsFailed }: {\n items: ClosedTicket[]\n /** No balcão a palavra \"mesa\" não existe — e o V1 troca o título por isso. */\n counter?: boolean\n /** Qual canal, quando `counter`. Sem ele, o painel fala como balcão. */\n channel?: string\n loading?: boolean\n onOpen?: (id: string) => void\n /**\n * REABRIR a conta. Ausente = a tela não oferece, e nada é desenhado.\n *\n * As três condições do V1 estão em `reopen.ts`; aqui só o desenho. A conta\n * encerrada como CORTESIA não ganha botão — ganha a frase que explica por\n * quê, porque sumir com ele deixaria a pergunta sem resposta.\n */\n onReopen?: (t: ClosedTicket) => void\n /** Saiu nota? Por comanda. Ausente = a casa não emite, ou ainda não sabe. */\n seals?: Record<string, FiscalSeal | undefined>\n /**\n * A busca dos selos FALHOU — e no V1 ela falhou de verdade: a tabela do elo\n * estava com RLS ligada e sem policy, o `.then()` sem `.catch()` engolia o\n * erro, e a tela ficava sem selo nenhum. Isso se lê como \"nenhuma mesa tem\n * nota\" em vez de \"não consegui saber\". Num painel cuja razão de existir é\n * dizer o que falta emitir, as duas não podem ter a mesma aparência.\n */\n sealsFailed?: boolean\n}) {\n const nome = NOME_DO_CANAL[channel ?? 'balcao'] ?? NOME_DO_CANAL.balcao\n const singular = counter ? 'venda' : 'mesa'\n const plural = counter ? 'vendas' : 'mesas'\n\n /**\n * «ÚLTIMAS» fechadas: a ordem é a do FECHAMENTO, não a da abertura.\n *\n * A lista chega ordenada por abertura porque é isso que importa numa comanda\n * ABERTA — há quanto tempo a mesa está de pé. Aqui a pergunta é outra: a\n * mesa que acabou de sair é a que o caixa ainda tem na cabeça, e ela pode ter\n * aberto muito antes da mesa ao lado.\n */\n const emOrdem = [...items].sort(\n (a, b) => new Date(b.closedAt ?? 0).getTime() - new Date(a.closedAt ?? 0).getTime(),\n )\n const total = emOrdem.reduce((s, i) => s + i.totalCents, 0)\n const placar = tallySeals(emOrdem, seals ?? {})\n const temPlacar = !sealsFailed && placar.issuedCount + placar.pendingCount > 0\n\n return (\n <div className=\"pos-closed\">\n <div className=\"pos-closed__head\">\n <h2 className=\"pos-closed__title\">\n {counter ? `Histórico ${nome.de}` : 'Mesas fechadas'}\n </h2>\n <span className=\"pos-closed__when\">hoje</span>\n </div>\n\n {emOrdem.length > 0 && (\n <div className=\"pos-closed__sum\">\n <span>{emOrdem.length} {emOrdem.length === 1 ? 'conta' : 'contas'}</span>\n <span className=\"pos-num\">{formatCents(total)}</span>\n </div>\n )}\n\n {/* O PLACAR DO TURNO. A lista responde \"esta mesa saiu?\", uma de cada\n vez; a pergunta do fim do turno é de soma — \"falta emitir quanto?\". */}\n {temPlacar && (\n <div className=\"pos-closed__score\">\n <div className=\"pos-closed__sc\">\n <span className=\"pos-closed__scl\">Com nota</span>\n <span className=\"pos-num pos-closed__scv\" data-tone=\"ok\">{formatCents(placar.issuedCents)}</span>\n <span className=\"pos-closed__scn\">\n {placar.issuedCount} {placar.issuedCount === 1 ? singular : plural}\n </span>\n </div>\n <div className=\"pos-closed__scd\" aria-hidden />\n <div className=\"pos-closed__sc\">\n <span className=\"pos-closed__scl\">A emitir</span>\n <span\n className=\"pos-num pos-closed__scv\"\n data-tone={placar.pendingCount > 0 ? 'warn' : undefined}\n >\n {formatCents(placar.pendingCents)}\n </span>\n <span className=\"pos-closed__scn\">\n {placar.pendingCount} {placar.pendingCount === 1 ? singular : plural}\n </span>\n </div>\n </div>\n )}\n\n {sealsFailed && (\n <p className=\"pos-closed__warn\">\n Não foi possível conferir as notas emitidas. A lista abaixo está\n completa; só o selo fiscal ficou de fora.\n </p>\n )}\n\n {loading ? (\n <div className=\"pos-closed__list\" aria-busy=\"true\" aria-label=\"Carregando as contas fechadas\">\n {Array.from({ length: 4 }, (_, i) => (\n <div className=\"pos-closed__row pos-skel\" key={i} aria-hidden>\n <span className=\"pos-skel__b\" style={{ width: '44%', height: 14 }} />\n <span className=\"pos-skel__b\" style={{ width: 58, height: 14 }} />\n </div>\n ))}\n </div>\n ) : emOrdem.length === 0 ? (\n /* As palavras do V1, inclusive a promessa do que se encontra ao tocar:\n é ela que faz o painel valer a coluna em vez de ser um histórico. */\n <div className=\"pos-closed__empty\">\n <Receipt size={22} strokeWidth={1.8} aria-hidden />\n <p className=\"pos-empty__t\">\n {counter ? `Nenhuma venda ${nome.de} encerrada hoje` : 'Nenhuma mesa fechada hoje'}\n </p>\n <p className=\"pos-empty__h\">\n {counter\n ? `${nome.artigo} aparecem aqui assim que o primeiro fechar.`\n : 'Ao fechar uma mesa ela aparece aqui — com os participantes, os pagamentos e a nota de cada um.'}\n </p>\n </div>\n ) : (\n <div className=\"pos-closed__list\">\n {emOrdem.map((t) => (\n <span className=\"pos-closed__wrap\" key={t.id}>\n {/* O botão de reabrir mora FORA do da linha: botão dentro de botão\n não é HTML válido e o clique de dentro nunca chega. */}\n {onReopen && reopenBlock({ status: 'closed', courtesy: t.courtesy, hasPayment: t.hasPayment }) === null && (\n <button\n className=\"pos-closed__reopen\"\n onClick={(e) => { e.stopPropagation(); onReopen(t) }}\n title={reopenLabel(!t.counterOrigin)}\n aria-label={`${reopenLabel(!t.counterOrigin)} ${t.positionLabel ?? t.reference ?? ''}`.trim()}\n >\n <RotateCcw size={13} strokeWidth={2.4} aria-hidden />\n </button>\n )}\n <button\n className=\"pos-closed__row\"\n onClick={() => onOpen?.(t.id)}\n disabled={!onOpen}\n >\n <span className=\"pos-closed__who\">\n <span className=\"pos-closed__where\">\n {t.positionLabel ?? t.reference ?? 'Conta'}\n {/* ÍCONE + TEXTO, não cor sozinha: numa tela operada de\n longe, uma pastilha verde não responde \"saiu nota?\". */}\n {seals?.[t.id] === 'com-nota' && (\n <span className=\"pos-closed__seal\" data-seal=\"ok\">\n <FileCheck size={11} strokeWidth={2.4} aria-hidden /> Nota\n </span>\n )}\n {seals?.[t.id] === 'parcial' && (\n <span className=\"pos-closed__seal\" data-seal=\"partial\">\n <FileWarning size={11} strokeWidth={2.4} aria-hidden /> Nota parcial\n </span>\n )}\n {seals?.[t.id] === 'sem-nota' && (\n <span className=\"pos-closed__seal\" data-seal=\"none\">Sem nota</span>\n )}\n </span>\n {/* A HORA primeiro, o cliente depois — a ordem do V1. É pela\n hora que o caixa acha a conta que alguém reclama agora. */}\n <span className=\"pos-closed__meta\">\n {[hora(t.closedAt), t.customerName].filter(Boolean).join(' · ')}\n </span>\n </span>\n <span className=\"pos-num pos-closed__total\">{formatCents(t.totalCents)}</span>\n </button>\n {/* Quem NÃO reabre ganha a razão, não o silêncio. Sumir com o\n botão deixaria a pergunta «por que esta não reabre?» sem\n resposta — é a regra do V1 para a cortesia, e ela vale igual\n para a conta que já recebeu dinheiro: as duas viram ESTORNO, e\n estorno tem outro caminho.\n\n A cortesia vem primeiro porque é a recusa mais forte, na mesma\n ordem que o `reopenBlock` aplica. «Não sei» (`hasPayment`\n indefinido) não escreve nada: ali o botão some porque a leitura\n falhou, e inventar uma explicação seria pior que não dar\n nenhuma. */}\n {onReopen && t.courtesy && (\n <span className=\"pos-closed__why\">{COURTESY_REOPEN_NOTE}</span>\n )}\n {onReopen && !t.courtesy && t.hasPayment === true && (\n <span className=\"pos-closed__why\">{PAID_REOPEN_NOTE}</span>\n )}\n </span>\n ))}\n </div>\n )}\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, Check, Clock, CreditCard, User, Users,\n AlertTriangle, ChefHat, ChevronDown, ChevronLeft, ChevronUp, ChevronRight, Minus, MoreHorizontal, Pencil, Percent, Phone,\n Plus, Printer, QrCode, Receipt, Trash2,\n} from 'lucide-react'\nimport { Fragment, useEffect, useRef, useState } from 'react'\nimport { accountFitsMethod, methodAsksAccount } from './accountFit'\nimport { asksInstallments, brandList } from './cardBrand'\nimport { haptic } from '../lib/haptics'\nimport { useSwipeAway } from '../lib/useSwipeAway'\nimport type { PosPaymentMethod, PosPositionStatus, PosVocabulary } from '../app/config'\nimport { formatCents, splitEvenly } from './money'\nimport { paymentSummary, type PaymentRow } from './paymentList'\nimport { GuestBar, type GuestDraft } from './GuestBar'\nimport { isAnonymousGuest, settlementsOf, type TicketGuest } from './session'\nimport type { LineState, Ticket, TicketLine, TicketTotals } from './session'\nimport { EmptyState, StatusBadge } from './views'\nimport { ClosedPanel, type ClosedTicket } from './ClosedPanel'\nimport type { FiscalSeal } from './fiscalSeal'\n\n/** Uma linha de couvert na conta. */\nexport interface OrderCover {\n id: string\n name: string\n unitAmount: number\n guestCount: number\n total: number\n discount: number\n /**\n * Quantos couverts cada participante levou, quando a casa já repartiu.\n *\n * Ausente quer dizer «nunca foi repartido» — e aí a folha começa com 1 em\n * cada um, que é a conta que a RPC aplicou. Ausente NÃO é zero: zero é uma\n * decisão que alguém tomou.\n */\n guestQuantities?: Array<{ guestId: string; qty: number }>\n /**\n * Quantos couverts a POLÍTICA cobra de quem tem nome e de quem não tem.\n *\n * O adapter já devolvia os dois (`qty_identified`/`qty_unidentified` da\n * cobrança) e este tipo não os declarava, então o `openingCoverQty` do app\n * não COMPILAVA: TS2559, «não tem nada em comum com a política». Em runtime a\n * folha abria certa — o Pertinho cobra 2 de quem tem nome, e era 2 que\n * aparecia, porque o objeto carrega os campos que o tipo omitia. O defeito\n * era de compilação, e ficou escondido porque o Vite não confere tipo e o\n * typecheck do app apontava para OUTRA árvore do SDK.\n */\n qtyIdentified?: number\n qtyUnidentified?: number\n}\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\n/**\n * O \"…\" da comanda.\n *\n * Desenhado à mão e não com um `<dialog>` porque ele vive DENTRO da coluna e\n * não deve prender o foco: o operador abre, lê por que a ação está apagada e\n * volta a lançar item. O que um overlay de verdade daria — Esc fecha, clicar\n * fora fecha — está implementado abaixo, que é o preço de desenhá-lo à mão.\n */\nfunction MoreMenu({\n actions, onPick,\n}: {\n actions: Array<{ id: string; label: string; disabledReason?: string; danger?: boolean; separator?: boolean }>\n onPick: (id: string) => void\n}) {\n const [open, setOpen] = useState(false)\n const boxRef = useRef<HTMLDivElement>(null)\n\n useEffect(() => {\n if (!open) return\n const onKey = (e: KeyboardEvent) => { if (e.key === 'Escape') { e.stopPropagation(); setOpen(false) } }\n const onDown = (e: PointerEvent) => {\n if (!boxRef.current?.contains(e.target as Node)) setOpen(false)\n }\n // `capture` no Esc: a tela inteira também escuta Esc (ela limpa a busca),\n // e sem capturar aqui um toque fecharia as duas coisas.\n document.addEventListener('keydown', onKey, true)\n document.addEventListener('pointerdown', onDown)\n return () => {\n document.removeEventListener('keydown', onKey, true)\n document.removeEventListener('pointerdown', onDown)\n }\n }, [open])\n\n return (\n <div className=\"pos-acts\" ref={boxRef}>\n <button\n type=\"button\"\n className=\"pos-btn pos-btn--ghost pos-acts__t\"\n aria-haspopup=\"menu\"\n aria-expanded={open}\n aria-label=\"Mais ações da comanda\"\n onClick={() => { haptic('tap'); setOpen((v) => !v) }}\n >\n <MoreHorizontal size={20} strokeWidth={2.2} aria-hidden />\n </button>\n {open && (\n <div className=\"pos-acts__m\" role=\"menu\">\n {actions.map((a) => (\n <Fragment key={a.id}>\n {/* O traço é do V1 (`separarAntes`): ele separa o que ENCERRA a\n comanda do que apenas a edita. Sem ele, «Encerrar como\n cortesia» e «Cancelamento» ficam encostados nas ações\n corriqueiras, e o dedo que escorrega uma linha faz a\n irreversível. */}\n {a.separator && <div className=\"pos-acts__sep\" role=\"separator\" />}\n <button\n type=\"button\"\n role=\"menuitem\"\n className={`pos-acts__i${a.danger ? ' pos-acts__i--danger' : ''}`}\n disabled={!!a.disabledReason}\n onClick={() => { setOpen(false); onPick(a.id) }}\n >\n <span className=\"pos-acts__l\">{a.label}</span>\n {/* O motivo fica NA linha, não num tooltip: o operador já tocou\n para descobrir que não pode, e mandá-lo procurar de novo é\n cobrar duas vezes pela mesma pergunta. */}\n {a.disabledReason && <span className=\"pos-acts__why\">{a.disabledReason}</span>}\n </button>\n </Fragment>\n ))}\n </div>\n )}\n </div>\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, moreActions, onMoreAction, onPrint, onDiscount,\n party, selectedGuestId = null, sharedLabel, serviceChargePercent = 0, guestPaidCents, payments,\n guestCount, onEditGuestCount, closedChannel,\n closed, closedIsCounter, closedLoading, closedSeals, closedSealsFailed, onOpenClosed, onReopenClosed, panel, hasOpenOrder, covers, onEditCover, settling, onServiceCharge,\n receivingAccounts, selectedAccountId, onSelectAccount, selectedInstallments, onSelectInstallments,\n selectedCardBrand, onSelectCardBrand,\n onSelectGuest, onAddGuest, onIdentifyGuest, onRemoveGuest, onLookupPhone,\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 /** As contas que podem receber a forma escolhida. */\n receivingAccounts?: Array<{ id: string; name: string; kind: string }>\n /** A bandeira escolhida — «Visa», «Alelo». Ver `brandList`. */\n selectedCardBrand?: string\n onSelectCardBrand?: (brand: string | undefined) => void\n selectedAccountId?: string\n onSelectAccount?: (id?: string) => void\n /** Em quantas vezes. Só o crédito parcela. */\n selectedInstallments?: number\n onSelectInstallments?: (n: number) => void\n /** Fechar a conta. Leva QUEM está pagando e QUANTO — nunca só o gesto. */\n onClose: (cobranca?: {\n guestIds: string[]\n /** O que se cobra NESTE gesto. */\n amountCents: number\n /** O que a comanda ainda deve, no total. */\n outstandingCents: number\n /** Para ONDE o dinheiro vai. Sem isto o razão não sabe onde creditar. */\n accountId?: string\n }) => 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 /**\n * O que mais se pode fazer com ESTA comanda — transferir, dar desconto,\n * cancelar item, encerrar como cortesia.\n *\n * Vive num `…` ao lado de \"Fechar conta\" e não em botões soltos: durante o\n * serviço só dois gestos se repetem (lançar e fechar), e uma fileira de seis\n * botões faz o operador mirar. O V1 resolveu assim e a leitura está certa.\n *\n * `disabledReason` é obrigatório para desabilitar: uma linha apagada que não\n * diz por quê vira chamado para o suporte. É o detalhe do V1 que mais\n * economiza pergunta — \"Disponível após enviar itens\" responde sozinho.\n */\n /**\n * As pessoas desta comanda.\n *\n * Vazio quer dizer \"ninguém identificado\", e aí a comanda é uma lista só —\n * é o caso comum do balcão. Com gente dentro, a conta passa a ser repartida\n * na tela, e o operador consegue responder \"quanto é o da Ana\" sem somar de\n * cabeça.\n */\n party?: TicketGuest[]\n /** `null` = a pastilha compartilhada. É o DESTINO dos próximos itens. */\n selectedGuestId?: string | null\n /** \"Mesa\" no salão, \"Balcão\" no balcão — vocabulário do canal. */\n sharedLabel?: string\n /** A taxa da mesa, para o participante que não tem a sua. */\n serviceChargePercent?: number\n /** Quanto cada um JÁ PAGOU. A chave do compartilhado é `mesa`. */\n guestPaidCents?: Record<string, number>\n /** O que já entrou nesta comanda, um por pagamento. */\n payments?: PaymentRow[]\n /**\n * Quantas pessoas SENTARAM — o fato de hoje.\n *\n * Separado de `guests` de propósito: aquele é a CAPACIDADE, e é ele que diz\n * quantas cadeiras a `GuestBar` desenha. O cabeçalho mostrava a capacidade\n * escrita «4 pessoas» numa mesa onde duas sentaram — e é esse número que o\n * couvert cobra, então o cabeçalho contradizia a conta.\n */\n guestCount?: number\n /** Abrir «Número de Pessoas». Ausente = o número não se muda daqui. */\n onEditGuestCount?: () => void\n /** Qual canal o painel de fechadas está mostrando — ele nomeia as frases. */\n closedChannel?: string\n /**\n * As contas fechadas hoje. `undefined` mantém o estado vazio de sempre —\n * o app decide se esta coluna tem esse papel.\n */\n closed?: ClosedTicket[]\n /**\n * Um painel que TOMA a coluna — hoje a «Escala de hoje».\n *\n * Substitui a comanda enquanto está aberto, em vez de cobrir a tela com um\n * diálogo: a planta continua à vista, e é dela que se escolhe o alvo.\n */\n panel?: React.ReactNode\n /**\n * Há comanda ABERTA nesta posição?\n *\n * Diferente de «a comanda tem itens». Sem isto o rail confundia as duas e\n * trocava a comanda recém-aberta pelo histórico do dia. Ausente, cai no\n * comportamento antigo.\n */\n hasOpenOrder?: boolean\n /** O couvert aplicado — linhas da conta, não itens do cardápio. */\n covers?: OrderCover[]\n /** Abrir a folha que reparte o couvert por participante — o lápis do V1. */\n onEditCover?: (cover: OrderCover) => void\n /** A escrita do fechamento está correndo — o «Finalizando…» do V1. */\n settling?: boolean\n /** Abre a folha da taxa de serviço a partir da linha dela no rodapé. */\n /** Recebe DE QUEM é a taxa: a pastilha do participante manda o id dele, e a\n * linha do rodapé não manda nada (é a da mesa). */\n onServiceCharge?: (guestId?: string) => void\n /** No balcão o título é \"Histórico do balcão\": lá não há mesa. */\n closedIsCounter?: boolean\n closedLoading?: boolean\n /** Saiu nota? Por conta fechada — é o que faz a lista valer mais que um\n * histórico: emitir nota se cobra depois, e a mesa sem nota só aparece\n * quando já é tarde. */\n closedSeals?: Record<string, FiscalSeal>\n /** A leitura fiscal falhou. Diferente de \"nenhuma tem nota\". */\n closedSealsFailed?: boolean\n onOpenClosed?: (id: string) => void\n /** REABRIR uma conta fechada. Ausente = a tela não oferece. Ver `reopen.ts`. */\n onReopenClosed?: (t: ClosedTicket) => void\n onSelectGuest?: (id: string | null) => void\n onAddGuest?: (draft: GuestDraft) => void | Promise<void>\n onIdentifyGuest?: (id: string, draft: GuestDraft) => void | Promise<void>\n onRemoveGuest?: (id: string) => void | Promise<void>\n onLookupPhone?: (phone: string) => Promise<{ id: string; name: string } | null>\n moreActions?: Array<{ id: string; label: string; disabledReason?: string; danger?: boolean; separator?: boolean }>\n onMoreAction?: (id: string) => void\n /**\n * `Imprimir` e `% Desconto`, ao lado do `…`.\n *\n * No V1 os três dividem a mesma linha acima de \"Fechar Comanda\", e não é\n * arbitrário: são as ações que se usam com a conta NA MÃO, no minuto em que\n * o cliente pede para fechar. Enterrá-las no menu custa um toque em cada\n * fechamento — e o fechamento é o que mais se repete na noite.\n */\n onPrint?: () => void\n onDiscount?: () => 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 /**\n * O fechamento é UM passo, não quatro.\n *\n * O desenho anterior perguntava em telas separadas o modo (inteiro ou\n * participante), depois quem paga, depois mostrava o resumo, e só então a\n * forma de pagamento. Quatro telas para responder uma pergunta só — QUEM\n * está pagando agora —, e o garçom perdia a conta no meio.\n *\n * Aqui a comanda já está repartida por participante. Fechar é MARCAR as\n * partes que vão ser pagas, ver o total subir, e escolher a forma. Fechar a\n * mesa inteira deixa de ser um modo: é marcar todas, que é o padrão.\n */\n const [stage, setStage] = useState<'order' | 'checkout'>('order')\n const [payGuests, setPayGuests] = useState<string[]>([])\n /**\n * Seções recolhidas, por chave de conta.\n *\n * Numa mesa de quatro, a comanda aberta é uma parede de itens e o nome de\n * quem pediu o quê fica soterrado. Recolhida, cada pessoa é uma linha com o\n * que interessa na hora de cobrar: quantos itens e quanto deu.\n */\n const [collapsed, setCollapsed] = useState<Set<string>>(() => new Set())\n /** Recolhida por padrão: ver a nota no bloco de pagamentos, abaixo. */\n const [pagamentosAbertos, setPagamentosAbertos] = useState(false)\n const pagos = paymentSummary(payments ?? [], { sharedLabel: sharedLabel ?? 'Mesa' })\n const identificados = (party ?? []).filter((g) => !isAnonymousGuest(g) && !g.settled)\n /** As contas — uma por participante, ou uma da mesa quando não há ninguém. */\n const contas = settlementsOf(ticket, party ?? [], {\n serviceChargePercent,\n paidCents: guestPaidCents,\n sharedLabel,\n })\n const chaveDe = (guestId: string | null) => guestId ?? '__mesa'\n /**\n * Conta sem NADA não é conta.\n *\n * `settlementsOf` devolve uma por participante, e é o certo: a pessoa existe\n * na mesa mesmo sem ter pedido. Mas a COMANDA mostra contas, e na Mesa 100\n * do Pertinho — vinte e duas pessoas, sessenta e nove itens, nenhum com dono\n * — isso virou vinte e um cartões de \"0 itens · R$ 0,00\" empurrando para\n * fora da tela o único que tinha algo dentro. É o mesmo ruído que o rateio\n * produzia, em outra forma.\n *\n * Quem não pediu, não deve couvert, não tem taxa e não pagou nada continua\n * na barra de pastilhas lá em cima, que é onde ela EXISTE. O que não existe\n * é a conta dela.\n */\n const temConta = (c: { items: unknown[]; coverCents: number; serviceCents: number; paidCents: number }) =>\n c.items.length > 0 || c.coverCents > 0 || c.serviceCents > 0 || c.paidCents > 0\n\n /**\n * Tocar a pastilha LEVA até a conta da pessoa.\n *\n * A pastilha escolhia o destino dos próximos itens e mais nada — e numa mesa\n * de vinte e dois a conta do Leonardo pode estar a doze cartões de rolagem\n * do topo, ou recolhida. Tocar o nome de alguém e a tela não se mexer é o\n * gesto respondendo \"anotado\" quando a pergunta era \"cadê ele\".\n *\n * Então o toque faz as três coisas: escolhe, ABRE se estiver recolhida, e\n * ROLA até ela. Sem a expansão, rolar levaria a um cabeçalho fechado; sem a\n * rolagem, expandir abriria algo fora da tela.\n */\n const irParaOParticipante = (id: string | null) => {\n onSelectGuest?.(id)\n const chave = id ?? '__mesa'\n setCollapsed((prev) => {\n if (!prev.has(chave)) return prev\n const next = new Set(prev)\n next.delete(chave)\n return next\n })\n // A ROLAGEM não acontece aqui: o cartão pode estar recolhido neste\n // instante, e rolar até um nó fechado o deixa na borda. Quem rola é o\n // efeito abaixo, depois que o React aplicou a expansão.\n // O contador faz de CADA toque um pedido novo. Sem ele, tocar duas vezes\n // no mesmo nome guardaria o mesmo valor, o React não re-renderizaria e o\n // segundo toque não levaria a lugar nenhum — exatamente quando o garçom\n // repete o gesto porque o primeiro não pareceu funcionar.\n setLevarAte((v) => ({ chave, n: (v?.n ?? 0) + 1 }))\n }\n const [levarAte, setLevarAte] = useState<{ chave: string; n: number }>()\n useEffect(() => {\n if (!levarAte) return\n const alvo = document.querySelector(`[data-conta=\"${CSS.escape(levarAte.chave)}\"]`)\n if (!alvo) return\n // Duas armadilhas de ABA OCULTA, e as duas custam o mesmo: a coluna fica\n // parada no topo e o toque parece não ter funcionado.\n //\n // 1. `requestAnimationFrame` NÃO dispara em aba oculta — por isso a\n // rolagem mora num efeito, que roda no commit, sempre.\n // 2. `behavior: 'smooth'` anima POR FRAMES, e sem frames não anda. Medido:\n // com a aba oculta, suave move 0px e `auto` move os 6128 esperados.\n //\n // O caso real é o garçom que deixou o PDV em segundo plano, escolheu a\n // pessoa e voltou. Suave onde dá para ver; instantâneo onde não dá.\n const podeAnimar = document.visibilityState === 'visible'\n && !window.matchMedia('(prefers-reduced-motion: reduce)').matches\n alvo.scrollIntoView({ behavior: podeAnimar ? 'smooth' : 'auto', block: 'nearest' })\n }, [levarAte])\n /**\n * A seleção vale contra as contas QUE EXISTEM AGORA.\n *\n * `payGuests` guarda chaves, e a comanda anda por baixo: um participante\n * sai da mesa e a chave dele fica marcada sem dono. A tela então somava\n * zero e oferecia `Confirmar R$ 0,00` — um botão que fecharia a mesa sem\n * cobrar nada. Contar pela INTERSEÇÃO com `contas` faz a seleção morta\n * desaparecer sozinha, sem depender de ninguém lembrar de limpá-la.\n */\n /** As que o FECHAMENTO oferece: as que têm conta. Marcar quem deve zero é\n * oferecer uma cobrança que não existe. */\n const contasVisiveis = contas.filter(temConta)\n const contasSelecionadas = contas.filter((c) => payGuests.includes(chaveDe(c.guestId)))\n const totalSelecionado = contasSelecionadas.reduce((s, c) => s + (c.balanceCents || c.totalCents), 0)\n const todasMarcadas = contasVisiveis.length > 0 && contasSelecionadas.length === contasVisiveis.length\n /** A taxa DO QUE ESTÁ MARCADO — não a da mesa inteira, que cobraria de quem\n * não está pagando agora. */\n const serviceSelecionadaCents = contasSelecionadas.reduce((s, c) => s + c.serviceCents, 0)\n /** As contas compatíveis com a forma escolhida — nunca todas as da casa. */\n const formaEscolhida = paymentMethods.find((m) => m.id === selectedPaymentId)\n const contasQueRecebem = !methodAsksAccount(formaEscolhida?.transactionType) ? [] : (receivingAccounts ?? []).filter((c) => (\n (!formaEscolhida?.allowedAccountKinds?.length\n || formaEscolhida.allowedAccountKinds.includes(c.kind))\n // A rede embaixo do cadastro: `allowed_account_types` é editável e pode\n // ficar frouxo; as regras de `financial_receive_payment` não mudam. Sem\n // isto o operador escolheria uma conta que a RPC recusa — com a mesa já\n // fechada. Ver `accountFit.ts`.\n && accountFitsMethod(formaEscolhida?.transactionType, c.kind)\n ))\n const contaEscolhida = contasQueRecebem.find((c) => c.id === selectedAccountId)\n /**\n * Quantas parcelas cabem — zero ou uma esconde o campo.\n *\n * Conta de DÉBITO nunca parcela, qualquer que seja o nome do método. Sem\n * conta escolhida ainda, vale o teto da forma: perguntar as parcelas antes\n * de saber a conta é o caso do crédito, em que as duas coisas casam.\n */\n const parcelasPossiveis = asksInstallments(\n formaEscolhida?.transactionType, contaEscolhida?.kind, formaEscolhida?.typeName,\n )\n ? formaEscolhida?.maxInstallments ?? 1\n : 1\n /** As bandeiras desta forma — `null` quando a pergunta não se faz. */\n const bandeiras = selectedPaymentId\n ? brandList(formaEscolhida?.transactionType, formaEscolhida?.typeName)\n : null\n /**\n * Quem já pagou — e com QUAL conta.\n *\n * O congelado do banco ganha do calculado, sempre que existir. A mesa\n * continua andando depois do pagamento: entra item, muda a taxa, some um\n * cancelamento — e o valor na tela tem de ser o do comprovante que o cliente\n * levou, não o que a tela somaria agora.\n *\n * Mas o congelado só existe depois que o fechamento gravou. Enquanto isso, a\n * pessoa cujo pago já cobre o total JÁ está quitada para quem opera, e o V1\n * concorda: ele filtra por `settlement.status === 'settled'`, que é o estado\n * calculado, e não pela coluna. Sem essa queda, o participante pago sumiria\n * da lista ativa (onde não tem mais o que fazer) e não apareceria no\n * histórico — sumiria da tela inteira, que é o pior dos dois mundos.\n */\n const quitados = contas\n .filter((c) => c.guestId != null && c.status === 'settled')\n .map((c) => {\n const congelado = party?.find((g) => g.id === c.guestId)?.settledBill\n return {\n conta: c,\n bill: congelado ?? {\n itemsCents: c.subtotalCents,\n sharedCents: 0,\n coverCents: c.coverCents,\n serviceCents: c.serviceCents,\n discountCents: 0,\n totalCents: c.totalCents,\n paidCents: c.paidCents,\n },\n }\n })\n /**\n * O fechamento começa no MODO — sempre.\n *\n * Eu pulava esse passo quando não havia dois identificados, e com isso o\n * gesto voltava a ser o do V2 antigo: tocar \"Fechar conta\" e cair na forma\n * de pagamento, sem nunca ver o que está sendo cobrado. O V1 abre no modo\n * em todos os casos; \"Fechar participante\" é que fica indisponível quando\n * não há duas pessoas com nome — e indisponível COM MOTIVO, não ausente.\n */\n const iniciarFechamento = () => {\n haptic('commit')\n // Todas marcadas: o caso comum é a mesa inteira pagando junto, e quem vai\n // dividir desmarca. O contrário — abrir vazio — faz o botão de confirmar\n // nascer morto em toda mesa que fecha inteira, que são quase todas.\n setPayGuests(contasVisiveis.map((c) => chaveDe(c.guestId)))\n // Mesa grande abre RECOLHIDA. Acima de três contas, a lista aberta passa\n // da altura da coluna e o rodapé com o total sai de vista — e o total é a\n // única coisa que o garçom precisa ver antes de cobrar. Até três, aberta:\n // conferir é mais barato que tocar.\n setCollapsed(contasVisiveis.length > 3\n ? new Set(contasVisiveis.map((c) => `pay:${chaveDe(c.guestId)}`))\n : new Set())\n setStage('checkout')\n }\n const empty = ticket.lines.length === 0\n /**\n * A coluna está mostrando o que FECHOU, não uma comanda.\n *\n * Aí o cabeçalho (\"Balcão · —\") e a barra de participantes são de outra\n * tela: nomeiam uma comanda que não existe e oferecem sentar gente numa\n * mesa que ninguém escolheu. Ficavam empilhados acima de \"Mesas fechadas\",\n * roubando a primeira dobra do painel para dizer nada.\n *\n * O RODAPÉ é pior: \"Subtotal R$ 0,00 · Total R$ 0,00\" e um \"Fechar conta\"\n * morto embaixo de uma lista de sessenta contas que somam R$ 4.849,62. Dois\n * totais na mesma coluna, e o de baixo — o falso — é o que tem o tamanho de\n * título.\n */\n /**\n * O HISTÓRICO É PARA QUEM NÃO TEM COMANDA, não para quem tem uma vazia.\n *\n * O V1 é literal sobre isso: *«A coluna da direita do SALÃO SEM COMANDA: as\n * mesas que fecharam hoje»*. Aqui a condição era `empty` — a comanda sem\n * LINHAS — e as duas coisas são diferentes no minuto que mais importa: o\n * grupo senta, o anfitrião abre a mesa, e ninguém pediu nada ainda.\n *\n * Nesse minuto a mesa está ocupada, a comanda existe no banco, e o rail\n * mostrava o histórico de mesas fechadas — **sem o cabeçalho e sem o `⋯`**,\n * que ele esconde. O garçom perdia transferência, cancelamento, taxa e\n * cortesia justamente na comanda em que a transferência é mais provável:\n * a que ainda não tem nada e vai mudar de mesa.\n */\n const mostrandoFechadas = (hasOpenOrder != null ? !hasOpenOrder : empty)\n && !!closed && tab === 'order' && stage === 'order'\n // O carrinho e a conta são duas listas, não uma com estados misturados.\n const pendentes = ticket.lines.filter((l) => (l.state ?? 'pending') === 'pending')\n const enviadas = ticket.lines.filter((l) => (l.state ?? 'pending') !== 'pending')\n const subtotalPendente = pendentes.reduce((sum, l) => sum + l.unitPriceCents * l.quantity, 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 !== 'order' && empty) setStage('order')\n\n /**\n * Trocar de comanda volta para a COMANDA.\n *\n * O passo é da cobrança de UMA mesa; ficar em \"como vai pagar\" ao abrir\n * outra é oferecer a forma de pagamento de uma conta que o operador nem\n * viu — e foi o que aconteceu: a mesa abria já no passo 3, sem itens à\n * vista, e o rail parecia vazio.\n */\n const ultimaPosicao = useRef(ticket.positionId)\n useEffect(() => {\n if (ultimaPosicao.current !== ticket.positionId) {\n ultimaPosicao.current = ticket.positionId\n setStage('order')\n setPayGuests([])\n setCollapsed(new Set())\n }\n }, [ticket.positionId])\n\n /**\n * O X da casca some no fechamento.\n *\n * Ele fecha o PDV inteiro e mora no canto de cima, a um dedo do cabeçalho do\n * passo. Sair dali com a maquininha na mão é perder a cobrança pela metade,\n * e o gesto de voltar já existe logo abaixo (\"Voltar à comanda\"). A casca é\n * de outro pacote, então a marca vai na raiz do documento e a CSS do PDV a\n * esconde — some sozinho ao sair do passo ou desmontar a coluna.\n */\n useEffect(() => {\n if (stage !== 'checkout') return\n document.documentElement.setAttribute('data-pos-checkout', '')\n return () => document.documentElement.removeAttribute('data-pos-checkout')\n }, [stage])\n\n const firedAt = ticket.lines\n .map((l) => l.firedAt)\n .filter((v): v is string => Boolean(v))\n .sort()[0]\n\n // ───────────────────────────────────────────────────────────────────────\n // UMA SUPERFÍCIE POR VEZ.\n //\n // A coluna da direita é multiuso: mostra a comanda, mas também a ficha da\n // mesa, a da praça, a do ambiente, a escala do turno e a bandeja de mesas\n // sem ambiente. Quando ela mostra OUTRA coisa, ela não é mais a comanda — e\n // tudo que pertence à comanda tem de sair junto.\n //\n // Isso estava escrito CINCO vezes, como `!panel &&` espalhado pelo corpo, e\n // bastava um bloco esquecido para vazar: com a ficha da Praça 1 aberta, o\n // rodapé continuava oferecendo «Imprimir», «Desconto» e «Fechar conta» — os\n // botões de uma comanda que não está ali. Fechar a conta de quem? O gerente\n // estava desenhando o salão.\n //\n // Aqui a regra passa a ter UM lugar: com superfície, a coluna é a superfície\n // e nada mais. Não há como esquecer um bloco, porque não há blocos a marcar.\n // ───────────────────────────────────────────────────────────────────────\n if (panel) {\n return (\n <aside\n className=\"pos-aside\"\n ref={containerRef as React.Ref<HTMLElement>}\n data-open={open ?? true}\n data-surface=\"\"\n aria-label={vocabulary.ticket}\n >\n <div className=\"pos-scroll\" style={{ flex: 1, minHeight: 0 }}>{panel}</div>\n </aside>\n )\n }\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 {/* O cabeçalho da comanda e a barra de participantes só existem quando\n a coluna É a comanda.\n\n Com a escala aberta eles roubavam metade do painel para dizer de que\n mesa era o pedido — informação de outra tela. E no FECHAMENTO valem\n menos ainda: quem está escolhendo forma de pagamento já sabe em que\n mesa está, e a barra de pastilhas ali em cima só convida a um toque\n que abandona a cobrança pela metade. */}\n {stage === 'order' && !mostrandoFechadas && (\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 {/* O número de pessoas é CLICÁVEL quando há para onde ir: ele\n multiplica o couvert, e ficava congelado no que a mesa declarou ao\n abrir — chegou mais gente, o couvert não seguia. Os outros\n pedaços da linha continuam texto, porque não há o que fazer com\n eles daqui. */}\n <span className=\"pos-tkt__meta\">\n {(() => {\n const quantas = guestCount ?? guests\n const pessoas = quantas != null\n ? `${quantas} ${quantas === 1 ? 'pessoa' : 'pessoas'}`\n : null\n const antes = [ticket.attendantName].filter(Boolean)\n const depois = [sinceLabel(ticket.seatedAt, now), customerPhone].filter(Boolean)\n if (!pessoas && antes.length === 0 && depois.length === 0) {\n return `Sem ${vocabulary.position} selecionada`\n }\n return (\n <>\n {antes.join(' · ')}\n {pessoas && (\n <>\n {antes.length > 0 && ' · '}\n {onEditGuestCount ? (\n <button\n className=\"pos-tkt__link\"\n onClick={() => { haptic('tap'); onEditGuestCount() }}\n title=\"Mudar o número de pessoas\"\n >\n {pessoas}\n </button>\n ) : pessoas}\n </>\n )}\n {depois.length > 0 && ((antes.length > 0 || pessoas) ? ' · ' : '')}\n {depois.join(' · ')}\n </>\n )\n })()}\n </span>\n </div>\n </header>\n )}\n\n {stage === 'order' && !mostrandoFechadas && party && onSelectGuest && (\n <GuestBar\n guests={party}\n seats={guests ?? ticket.guests ?? 0}\n tableServicePercent={serviceChargePercent}\n selectedGuestId={selectedGuestId}\n sharedLabel={sharedLabel}\n onSelectGuest={irParaOParticipante}\n onAddGuest={onAddGuest}\n onIdentifyGuest={onIdentifyGuest}\n onRemoveGuest={onRemoveGuest}\n onLookupPhone={onLookupPhone}\n />\n )}\n\n {/* A ATIVIDADE saiu das abas e virou uma opção do `⋯`.\n Duas abas permanentes cobravam um rótulo o tempo todo por uma tela\n que se consulta de vez em quando — e \"Pedido\" nomeava o que já está\n à vista. O caminho de volta é a barra abaixo, que só existe enquanto\n a atividade está aberta. */}\n {tab === 'activity' && (\n <button className=\"pos-tkt__back\" onClick={() => setTab('order')}>\n <ChevronLeft size={15} strokeWidth={2.4} aria-hidden />\n Voltar ao pedido\n {pendingCount > 0 && <span className=\"pos-tkt__pend\">{pendingCount} não lançado{pendingCount > 1 ? 's' : ''}</span>}\n </button>\n )}\n\n {stage !== 'order' ? null : (\n /* A lista de itens é da COMANDA. Nos passos do fechamento ela\n continuava renderizada por cima, e o rail mostrava a comanda inteira\n seguida do resumo: os mesmos itens duas vezes, com dois totais\n diferentes. Quem estava cobrando lia o de cima. */\n <div className=\"pos-scroll\" style={{ flex: 1, minHeight: 0 }} role=\"tabpanel\">\n {tab === 'order' ? (\n empty ? (\n // Sem comanda aberta, a coluna mostra o que FECHOU hoje.\n //\n // O \"comanda vazia · digite o código\" é o texto do BALCÃO, e no\n // salão ele aponta para um gesto que não é o de quem está olhando\n // uma grade de mesas — o V1 tem a mesma crítica escrita no fonte:\n // \"uma tela inteira de largura explicando um canal em que ninguém\n // está\". O que falta ali é o passo DEPOIS do fechamento.\n closed ? (\n <ClosedPanel\n items={closed}\n counter={closedIsCounter}\n channel={closedChannel}\n loading={closedLoading}\n seals={closedSeals}\n sealsFailed={closedSealsFailed}\n onOpen={onOpenClosed}\n onReopen={onReopenClosed}\n />\n ) : (\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 ) : (\n <>\n {/* ── O CARRINHO ─────────────────────────────────────────\n O que ainda NÃO foi para a cozinha, num bloco à parte e em\n destaque, como no V1.\n\n Misturado com o que já saiu, o item pendente some: o operador\n fecha a conta achando que mandou tudo, e a cozinha nunca viu\n os dois últimos pratos. Separado e com o subtotal do que está\n por enviar, a pergunta \"falta mandar alguma coisa?\" se\n responde de relance. */}\n {pendentes.length > 0 && (\n <div className=\"pos-cart\">\n <div className=\"pos-cart__head\">\n <span className=\"pos-cart__t\">Carrinho</span>\n <span className=\"pos-num pos-cart__v\">{formatCents(subtotalPendente)}</span>\n </div>\n {pendentes.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 </div>\n )}\n\n {/* A conta repartida por quem paga — a MESMA repartição do\n fechamento, e não um segundo desenho dela.\n\n A comanda mostrava um grupo \"Mesa\" com tudo dentro, e a\n divisão por pessoa só aparecia ao cobrar: o garçom descobria\n de quem era o quê na frente do cliente. Agora `settlementsOf`\n manda nas duas telas, então o que se vê a noite toda é o que\n se vai cobrar. Sem participante nenhum isto continua UM grupo\n sem cabeçalho — a lista de sempre. */}\n {/* Quem QUITOU sai daqui — a frase do V1 é literal: \"Eles saem\n da mesa ativa, mas continuam no histórico até o fechamento\n total.\" Deixá-lo na lista com um selo \"Quitado\" faz o garçom\n reler, a cada rodada, o nome de quem já foi embora. */}\n {contas.filter((c) => c.status !== 'settled' && temConta(c)).map((conta) => {\n const semDono = conta.guestId == null && (party ?? []).length === 0\n const chave = chaveDe(conta.guestId)\n const fechado = collapsed.has(chave)\n // As linhas EDITÁVEIS são as próprias: o rateio é fração de uma\n // linha da mesa e não tem botão de quantidade.\n const proprias = enviadas.filter((l) => (l.guestId ?? null) === conta.guestId)\n const pessoa = conta.guestId ? party?.find((g) => g.id === conta.guestId) : undefined\n const percent = pessoa?.serviceChargePercent != null\n ? pessoa.serviceChargePercent\n : serviceChargePercent\n const nItens = proprias.reduce((n, l) => n + l.quantity, 0)\n return (\n <div\n className=\"pos-gsec\"\n key={chave}\n data-conta={chave}\n data-grouped={semDono ? undefined : ''}\n >\n {!semDono && (\n <div className=\"pos-gsec__head pos-gsec__head--pick\">\n <button\n className=\"pos-gsec__open\"\n aria-expanded={!fechado}\n aria-label={`${fechado ? 'Ver' : 'Recolher'} os itens de ${conta.guestName}`}\n onClick={() => {\n haptic('tap')\n setCollapsed((prev) => {\n const next = new Set(prev)\n if (next.has(chave)) next.delete(chave); else next.add(chave)\n return next\n })\n }}\n >\n <span className=\"pos-gsec__name\">\n <ChevronRight\n className=\"pos-gsec__chev\"\n data-open={!fechado ? '' : undefined}\n size={15}\n strokeWidth={2.6}\n aria-hidden\n />\n <User size={14} strokeWidth={2.4} aria-hidden />\n {conta.guestName}\n {conta.status === 'settled' && <span className=\"pos-gsec__st\" data-st=\"settled\">Quitado</span>}\n {conta.status === 'partial' && <span className=\"pos-gsec__st\" data-st=\"partial\">Parcial</span>}\n </span>\n </button>\n {/* A taxa DESTA pessoa, clicável como a da mesa: a casa\n combina a taxa por participante, e o número que\n mostra a regra é onde se muda a regra. */}\n {percent > 0 && (onServiceCharge ? (\n <button\n className=\"pos-gsec__pct pos-num pos-tot__link\"\n onClick={() => { haptic('tap'); onServiceCharge(conta.guestId ?? undefined) }}\n aria-label={`Mudar a taxa de serviço de ${conta.guestName}`}\n >\n {percent}%\n </button>\n ) : (\n <span className=\"pos-gsec__pct pos-num\">{percent}%</span>\n ))}\n <span className=\"pos-gsec__n\">{nItens} {nItens === 1 ? 'item' : 'itens'}</span>\n <span className=\"pos-num pos-gsec__tot\">{formatCents(conta.totalCents)}</span>\n </div>\n )}\n {!fechado && proprias.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 {/* A TAXA como linha do cartão, no pé dele, em primária —\n é assim que o V1 a desenha, e é onde o cliente procura\n quando pergunta \"isso aqui é o quê?\". A pastilha de\n `13%` no cabeçalho diz a REGRA; esta linha diz o\n VALOR, e as duas abrem a mesma folha. */}\n {!fechado && conta.serviceCents > 0 && (\n <div className=\"pos-gsec__lines\">\n <div className=\"pos-gsec__r pos-gsec__r--svc\">\n {onServiceCharge ? (\n <button\n className=\"pos-tot__link\"\n onClick={() => { haptic('tap'); onServiceCharge(conta.guestId ?? undefined) }}\n >\n <Receipt size={13} strokeWidth={2.2} aria-hidden />\n Taxa de serviço ({percent}%)\n </button>\n ) : (\n <span>Taxa de serviço ({percent}%)</span>\n )}\n <span className=\"pos-num\">{formatCents(conta.serviceCents)}</span>\n </div>\n </div>\n )}\n {/* O que já entrou, e o que falta. Sem isto, a conta de\n quem pagou metade parece intocada. */}\n {!fechado && conta.paidCents > 0 && (\n <div className=\"pos-gsec__lines\">\n <div className=\"pos-gsec__r pos-gsec__r--paid\">\n <span><Check size={11} strokeWidth={3} aria-hidden /> Já pago</span>\n <span className=\"pos-num\">− {formatCents(conta.paidCents)}</span>\n </div>\n <div className=\"pos-gsec__r\">\n <span>Saldo</span>\n <span className=\"pos-num\">{formatCents(conta.balanceCents)}</span>\n </div>\n </div>\n )}\n </div>\n )\n })}\n {/* ── PARTICIPANTES FINALIZADOS ──────────────────────────\n Portado de `beautyplace/src/components/orders/OrderCart.tsx`:\n `settlements.filter(s => s.guestId != null && s.status ===\n 'settled')`. Os quatro miúdos — Itens · Rateio mesa · Couvert\n · Taxa — são os do V1, na ordem dele, e só aparecem quando\n maiores que zero: uma linha de quatro zeros não explica nada.\n\n Os números vêm CONGELADOS do banco, não recalculados: a mesa\n continua andando depois do pagamento, e o valor na tela tem de\n ser o do comprovante que o cliente levou. */}\n {quitados.length > 0 && (\n <div className=\"pos-done\">\n <div className=\"pos-done__head\">\n <h3 className=\"pos-done__t\">Participantes finalizados</h3>\n <p className=\"pos-done__h\">\n Eles saem da mesa ativa, mas continuam no histórico até o fechamento total.\n </p>\n </div>\n {quitados.map(({ conta, bill }) => (\n <div className=\"pos-done__c\" key={conta.guestId ?? 'mesa'}>\n <div className=\"pos-done__top\">\n <span>\n <span className=\"pos-done__n\">{conta.guestName}</span>\n <span className=\"pos-done__ok\">Quitado</span>\n </span>\n <span className=\"pos-done__vals\">\n <span className=\"pos-num pos-done__paid\">\n {formatCents(bill.paidCents || bill.totalCents)}\n </span>\n <span className=\"pos-done__tot\">Total {formatCents(bill.totalCents)}</span>\n </span>\n </div>\n <div className=\"pos-done__parts\">\n {bill.itemsCents > 0 && <span>Itens {formatCents(bill.itemsCents)}</span>}\n {bill.sharedCents > 0 && <span>Rateio mesa {formatCents(bill.sharedCents)}</span>}\n {bill.coverCents > 0 && <span>Couvert {formatCents(bill.coverCents)}</span>}\n {bill.serviceCents > 0 && <span>Taxa {formatCents(bill.serviceCents)}</span>}\n </div>\n </div>\n ))}\n </div>\n )}\n\n {/* \"Adicionar itens\" ABAIXO das linhas, como no V1.\n Antes ele só existia no estado vazio, e era justamente onde\n menos importa: numa comanda com seis linhas o caminho de\n volta ao cardápio era achar a linha da trilha — dois toques\n onde o V1 tem um, e o segundo pedido de uma mesa é a coisa\n mais comum que acontece nesta tela. */}\n {onBrowseCatalog && (\n <button className=\"pos-tr__add\" onClick={() => { haptic('tap'); onBrowseCatalog() }}>\n <Plus size={17} strokeWidth={2.4} aria-hidden />\n Adicionar itens\n </button>\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\n {/* Totais e ações só quando a coluna é a COMANDA.\n Com o painel da escala aberto, um \"Fechar conta\" embaixo dele seria o\n botão de outra tela — e nos PASSOS do fechamento o rodapé da comanda\n aparecia junto do total do passo: dois totais diferentes na mesma\n coluna, e o garçom lendo o de cima achando que era o da cobrança. */}\n {stage === 'order' && !mostrandoFechadas && (\n\n <div className=\"pos-tot\">\n <div className=\"pos-tot__r\">\n <span>Subtotal itens</span><span className=\"pos-num\">{formatCents(totals.subtotalCents)}</span>\n </div>\n\n {/* O COUVERT, uma linha por cobrança.\n Não é item de cardápio: ninguém pede couvert, ele entra por quantas\n pessoas sentaram. Por isso a linha mostra a CONTA — \"(4 pessoas ×\n R$ 12,00)\" — e não só o total: o número de pessoas é a única parte\n que costuma estar errada, e é a que o cliente contesta. */}\n {(covers ?? []).map((c) => (\n <div className=\"pos-tot__r\" key={c.id}>\n <span>\n {c.name}\n <span className=\"pos-tot__how\">\n {' '}({c.guestCount} {c.guestCount === 1 ? 'pessoa' : 'pessoas'} × {formatCents(Math.round(c.unitAmount * 100))})\n </span>\n </span>\n {/* O LÁPIS do V1, e a condição dele é a mesma: `guests.length > 0`.\n Sem participante não há por quem repartir, e um botão que abre\n uma folha vazia é pior que a ausência dele. */}\n {onEditCover && (ticket.party?.length ?? 0) > 0 && (\n <button\n className=\"pos-tot__edit\"\n onClick={() => onEditCover(c)}\n aria-label={`Editar ${c.name}`}\n title={`Editar ${c.name}`}\n >\n <Pencil size={12} strokeWidth={2.4} aria-hidden />\n </button>\n )}\n <span className=\"pos-num\">{formatCents(Math.round((c.total - c.discount) * 100))}</span>\n </div>\n ))}\n\n {totals.serviceCents > 0 && (\n <div className=\"pos-tot__r\">\n {/* A taxa é CLICÁVEL, como no V1: ela é a linha que mais gera\n pergunta na mesa, e quem precisa mexer nela está olhando para\n ela. Um número morto obriga a procurar o caminho no `⋯`.\n O percentual é o REAL desta comanda, não um 10% escrito à mão —\n a casa combina a taxa por mesa, e um rótulo fixo afirma uma\n conta que o banco não fez. */}\n {onServiceCharge ? (\n <button className=\"pos-tot__link\" onClick={() => { haptic('tap'); onServiceCharge() }}>\n <Receipt size={13} strokeWidth={2.2} aria-hidden />\n Taxa de serviço ({serviceChargePercent}%)\n </button>\n ) : (\n <span>Serviço {serviceChargePercent}%</span>\n )}\n <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\n {/* O QUE JÁ FOI PAGO.\n Sem esta lista, fechar uma conta em duas formas de pagamento é um\n ato de fé: a tela mostra um total menor e não diz por quê.\n Nasce RECOLHIDA pela razão que o V1 escreveu — mesa grande chega a\n catorze pagamentos, e a lista aberta empurrava para fora a LISTA DE\n ITENS, que é o que o operador lê o tempo todo. */}\n {pagos.totalCents > 0 && (\n <div className=\"pos-paid\">\n <button\n type=\"button\"\n className=\"pos-paid__h\"\n onClick={() => { haptic('tap'); setPagamentosAbertos((v) => !v) }}\n aria-expanded={pagamentosAbertos}\n >\n <span className=\"pos-paid__n\">\n {pagamentosAbertos\n ? <ChevronUp size={12} strokeWidth={2.4} aria-hidden />\n : <ChevronDown size={12} strokeWidth={2.4} aria-hidden />}\n <Check size={12} strokeWidth={2.4} aria-hidden />\n {pagos.countLabel}\n </span>\n <span className=\"pos-num pos-paid__v\">− {formatCents(pagos.totalCents)}</span>\n </button>\n {pagamentosAbertos && pagos.entries.map((e) => (\n <div className=\"pos-paid__r\" key={e.id}>\n <span className=\"pos-paid__who\">{e.label}</span>\n <span className=\"pos-num pos-paid__v\">− {formatCents(e.amountCents)}</span>\n </div>\n ))}\n </div>\n )}\n </div>\n )}\n\n {mostrandoFechadas ? null : 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={iniciarFechamento}\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 <>\n {/* A linha do V1: Imprimir · % Desconto · ⋯ — acima de Fechar. */}\n {(onPrint || onDiscount) && (\n <div className=\"pos-cta__aux\">\n {onPrint && (\n <button className=\"pos-btn pos-btn--ghost pos-cta__auxb\" onClick={() => { haptic('tap'); onPrint() }}>\n <Printer size={16} strokeWidth={2.2} aria-hidden /> Imprimir\n </button>\n )}\n {onDiscount && (\n <button\n className=\"pos-btn pos-btn--ghost pos-cta__auxb\"\n disabled={empty}\n onClick={() => { haptic('tap'); onDiscount() }}\n >\n <Percent size={16} strokeWidth={2.2} aria-hidden /> Desconto\n </button>\n )}\n {/* O `⋯` fica AQUI, com Imprimir e Desconto — e não ao lado do\n Fechar. É a linha das ações que se usam com a conta na mão,\n e é onde o V1 o desenha. Ao lado do Fechar ele some da\n vista: o olho vai para o botão grande e o `⋯` vira um\n apêndice dele. */}\n <MoreMenu\n actions={[\n ...(moreActions ?? []),\n // Sempre disponível: a atividade existe justamente para\n // responder \"o que já foi para a cozinha\" — inclusive\n // quando a comanda parece vazia na tela.\n { id: '__activity', label: tab === 'activity' ? 'Ver o pedido' : 'Ver atividades', separator: true },\n ]}\n onPick={(id) => {\n if (id === '__activity') { setTab(tab === 'activity' ? 'order' : 'activity'); return }\n onMoreAction?.(id)\n }}\n />\n </div>\n )}\n {/* Fechar conta sozinho, ocupando a largura: é o gesto que termina\n o atendimento, e não divide a linha com mais nada. */}\n {/* «FINALIZANDO…», a palavra do V1 enquanto a escrita corre.\n O PDV já se defendia do toque duplo (`if (settling) return` no\n `settleBill`), mas em SILÊNCIO: o operador tocava, nada mudava\n na tela, e o instinto é tocar de novo. A conta não saía duas\n vezes — e ele não tinha como saber disso, então esperava,\n tocava, esperava, e chamava alguém.\n Defender o dado e não dizer nada ao operador resolve metade do\n problema e deixa a metade que ele vê. */}\n <button\n className=\"pos-btn pos-btn--commit\"\n disabled={empty || settling}\n aria-busy={settling || undefined}\n onClick={iniciarFechamento}\n >\n {settling ? 'Finalizando…' : 'Fechar conta'}\n {!empty && !settling && <span className=\"pos-num\">{formatCents(totals.totalCents)}</span>}\n {closeShortcut && !settling && <kbd className=\"pos-kbd\">{closeShortcut}</kbd>}\n </button>\n </>\n )}\n </div>\n ) : (\n /* O FECHAMENTO, numa tela só.\n A comanda já mostra quem consumiu o quê; fechar é marcar as partes\n que vão ser pagas agora. Marcar sobe o total, desmarcar desce — e a\n forma de pagamento fica embaixo, onde já estava. Fechar a mesa\n inteira é o padrão (tudo marcado), dividir é desmarcar. */\n <div className=\"pos-checkout\">\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\">Fechar conta · {ticket.positionLabel ?? vocabulary.position}</span>\n </div>\n\n <div className=\"pos-gsecs pos-checkout__body\">\n {/* \"Todos\" é uma LINHA com a mesma caixa das outras, e não um link\n no cabeçalho: marcar todo mundo é a mesma pergunta que marcar\n um, e duas formas para a mesma pergunta fazem o garçom procurar\n qual delas vale. */}\n {contasVisiveis.length > 1 && (\n <div\n className=\"pos-gsec__all\"\n role=\"checkbox\"\n aria-checked={todasMarcadas}\n tabIndex={0}\n onClick={() => {\n haptic('tap')\n setPayGuests(todasMarcadas ? [] : contasVisiveis.map((c) => chaveDe(c.guestId)))\n }}\n onKeyDown={(e) => {\n if (e.key !== 'Enter' && e.key !== ' ') return\n e.preventDefault()\n setPayGuests(todasMarcadas ? [] : contasVisiveis.map((c) => chaveDe(c.guestId)))\n }}\n >\n <span className=\"pos-gsec__all-t\">Todos</span>\n <span className=\"pos-gsec__n\">{contasVisiveis.length} contas</span>\n <span className=\"pos-gsec__pick\" data-on={todasMarcadas ? '' : undefined} aria-hidden>\n {todasMarcadas && <Check size={13} strokeWidth={3.4} />}\n </span>\n </div>\n )}\n {contasVisiveis.map((c) => {\n const chave = chaveDe(c.guestId)\n const marcado = payGuests.includes(chave)\n const fechado = collapsed.has(`pay:${chave}`)\n const nItens = c.items.length\n const quitado = c.status === 'settled'\n return (\n <div className=\"pos-gsec pos-gsec--pick\" data-picked={marcado ? '' : undefined} key={chave}>\n {/* A LINHA INTEIRA marca e desmarca — é o gesto que mais\n se repete no fechamento, e cobrar um alvo de 22px para\n ele era pedir pontaria com o cliente esperando.\n Expandir tem alvo próprio: a seta e o nome. */}\n <div\n className=\"pos-gsec__head pos-gsec__head--pick\"\n role=\"checkbox\"\n aria-checked={marcado}\n aria-disabled={quitado || undefined}\n aria-label={`Cobrar ${c.guestName}`}\n tabIndex={quitado ? -1 : 0}\n onClick={() => {\n if (quitado) return\n haptic('tap')\n setPayGuests((prev) => (\n prev.includes(chave) ? prev.filter((x) => x !== chave) : [...prev, chave]\n ))\n }}\n onKeyDown={(e) => {\n if (e.key !== 'Enter' && e.key !== ' ') return\n e.preventDefault()\n if (quitado) return\n setPayGuests((prev) => (\n prev.includes(chave) ? prev.filter((x) => x !== chave) : [...prev, chave]\n ))\n }}\n >\n <button\n className=\"pos-gsec__open\"\n aria-expanded={!fechado}\n aria-label={`${fechado ? 'Ver' : 'Recolher'} os itens de ${c.guestName}`}\n onClick={(e) => {\n e.stopPropagation()\n haptic('tap')\n setCollapsed((prev) => {\n const next = new Set(prev)\n const k = `pay:${chave}`\n if (next.has(k)) next.delete(k); else next.add(k)\n return next\n })\n }}\n >\n <span className=\"pos-gsec__name\">\n <ChevronRight\n className=\"pos-gsec__chev\"\n data-open={!fechado ? '' : undefined}\n size={15}\n strokeWidth={2.6}\n aria-hidden\n />\n {c.guestName}\n {quitado && <span className=\"pos-gsec__st\" data-st=\"settled\">Quitado</span>}\n {c.status === 'partial' && <span className=\"pos-gsec__st\" data-st=\"partial\">Parcial</span>}\n </span>\n </button>\n <span className=\"pos-gsec__n\">{nItens} {nItens === 1 ? 'item' : 'itens'}</span>\n <span className=\"pos-num pos-gsec__tot\">\n {formatCents(c.balanceCents || c.totalCents)}\n </span>\n <span className=\"pos-gsec__pick\" data-on={marcado ? '' : undefined} aria-hidden>\n {marcado && <Check size={13} strokeWidth={3.4} />}\n </span>\n </div>\n\n {!fechado && (\n <div className=\"pos-gsec__lines\">\n {c.items.map((i) => (\n <div className=\"pos-gsec__r\" key={i.id}>\n <span>{qtyLabel(i.quantity)}× {i.name}</span>\n <span className=\"pos-num\">{formatCents(i.totalCents)}</span>\n </div>\n ))}\n {c.coverCents > 0 && (\n <div className=\"pos-gsec__r\"><span>Couvert</span><span className=\"pos-num\">{formatCents(c.coverCents)}</span></div>\n )}\n {c.serviceCents > 0 && (\n <div className=\"pos-gsec__r\"><span>Taxa de serviço</span><span className=\"pos-num\">{formatCents(c.serviceCents)}</span></div>\n )}\n {c.paidCents > 0 && (\n <div className=\"pos-gsec__r pos-gsec__r--paid\">\n <span><Check size={11} strokeWidth={3} aria-hidden /> Já pago</span>\n <span className=\"pos-num\">− {formatCents(c.paidCents)}</span>\n </div>\n )}\n </div>\n )}\n </div>\n )\n })}\n </div>\n\n <div className=\"pos-tot\">\n {/* A TAXA continua ao alcance durante a cobrança.\n Ela é a linha que mais gera conversa na mesa — e a conversa\n acontece justamente aqui, com a maquininha na mão. Escondê-la no\n fechamento obrigava a voltar à comanda, mexer, e refazer a\n seleção de quem paga. */}\n {(serviceSelecionadaCents > 0 || onServiceCharge) && (\n <div className=\"pos-tot__r\">\n {onServiceCharge ? (\n <button className=\"pos-tot__link\" onClick={() => { haptic('tap'); onServiceCharge() }}>\n <Receipt size={13} strokeWidth={2.2} aria-hidden />\n Taxa de serviço ({serviceChargePercent}%)\n </button>\n ) : (\n <span>Serviço {serviceChargePercent}%</span>\n )}\n <span className=\"pos-num\">{formatCents(serviceSelecionadaCents)}</span>\n </div>\n )}\n <div className=\"pos-tot__g\">\n <span className=\"pos-t-md\">\n {todasMarcadas || contasVisiveis.length === 1\n ? 'Total'\n : `Total · ${contasSelecionadas.length} de ${contasVisiveis.length}`}\n </span>\n <strong className=\"pos-t-display pos-num\">{formatCents(totalSelecionado)}</strong>\n </div>\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 {/* A CONTA DE RECEBIMENTO, depois da forma.\n Aparece com QUALQUER conta compatível, não só com duas ou mais —\n e a razão está no V1: *\"com uma conta só o seletor sumia e a\n conta era escolhida em silêncio: no débito o operador não via\n para onde o dinheiro ia.\"* Saber para onde vai é metade de\n registrar. */}\n {selectedPaymentId && contasQueRecebem.length > 0 && (\n <div className=\"pos-acct\">\n <span className=\"pos-acct__l\">Conta de recebimento</span>\n <select\n className=\"pos-acct__s\"\n value={selectedAccountId ?? ''}\n onChange={(e) => onSelectAccount?.(e.target.value || undefined)}\n aria-label=\"Conta de recebimento\"\n >\n <option value=\"\">Selecione…</option>\n {contasQueRecebem.map((c) => (\n <option key={c.id} value={c.id}>{c.name}</option>\n ))}\n </select>\n </div>\n )}\n\n {/* BANDEIRA — a pergunta que a conciliação faz no fim do mês.\n O V1 a desenha à ESQUERDA das parcelas, e só quando a forma tem\n bandeira: cartão (pelo `transaction_type`) ou vale-refeição (pelo\n NOME do tipo — o único `voucher` do Pertinho se chama «Gift\n Card», e oferecer Pluxee a um vale-presente seria pior que não\n perguntar). Ver `cardBrand.ts`. */}\n {bandeiras && (\n <div className=\"pos-acct\">\n <span className=\"pos-acct__l\">Bandeira</span>\n <select\n className=\"pos-acct__s\"\n value={selectedCardBrand ?? ''}\n onChange={(e) => onSelectCardBrand?.(e.target.value || undefined)}\n aria-label=\"Bandeira\"\n >\n <option value=\"\">Selecione…</option>\n {bandeiras.map((b) => (\n <option key={b} value={b}>{b}</option>\n ))}\n </select>\n </div>\n )}\n\n {/* PARCELAS — e a regra segue a CONTA, não o nome do método.\n O V1 é literal: *\"o nome do método é livre e mente ('Cielo - Link\n de Pagamento A vista' é conta de débito)\"*. Por isso o teste é o\n `kind` da conta escolhida, e não o rótulo do botão que o operador\n acabou de tocar. Débito é SEMPRE à vista. */}\n {selectedPaymentId && parcelasPossiveis > 1 && (\n <div className=\"pos-acct\">\n <span className=\"pos-acct__l\">Parcelas</span>\n <select\n className=\"pos-acct__s\"\n value={String(selectedInstallments ?? 1)}\n onChange={(e) => onSelectInstallments?.(Number(e.target.value))}\n aria-label=\"Parcelas\"\n >\n {Array.from({ length: parcelasPossiveis }, (_, i) => i + 1).map((n) => (\n <option key={n} value={n}>{n}×</option>\n ))}\n </select>\n </div>\n )}\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 // Nada marcado é nada a cobrar: o operador desmarcou todo mundo\n // e o botão precisa dizer isso, não fechar a mesa por zero.\n disabled={!selectedPaymentId || contasSelecionadas.length === 0}\n onClick={() => {\n haptic('commit')\n setPaid(true)\n window.setTimeout(() => { setPaid(false); setStage('order') }, 900)\n // QUEM e QUANTO vão junto. Sem eles o gesto dizia só \"fechou\",\n // e quem recebia cobrava a comanda inteira — a tela mostrando\n // R$ 40 e a conta levando R$ 160.\n onClose({\n guestIds: contasSelecionadas\n .map((c) => c.guestId)\n .filter((id): id is string => id != null),\n amountCents: totalSelecionado,\n // O SALDO de todas as contas, não o total bruto: o que já\n // foi pago não se cobra de novo, e é contra isto que a\n // cobrança se compara para saber se a conta zerou.\n outstandingCents: contasVisiveis.reduce(\n (s, c) => s + (c.balanceCents || c.totalCents), 0,\n ),\n accountId: selectedAccountId,\n })\n }}\n >\n {contasSelecionadas.length === 0 ? 'Marque quem vai pagar'\n : !selectedPaymentId ? 'Escolha a forma de pagamento'\n : <>Confirmar <span className=\"pos-num\">{formatCents(totalSelecionado)}</span></>}\n </button>\n </div>\n </div>\n )}\n\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\n/** `0,50×` quando parte, `1×` quando inteiro. Casas decimais num número que\n * não tem parte fracionária é ruído que o olho lê como preço. */\nfunction qtyLabel(q: number): string {\n return Number.isInteger(q)\n ? String(q)\n : q.toLocaleString('pt-BR', { minimumFractionDigits: 2, maximumFractionDigits: 2 })\n}\n\n/** O selo curto da linha enviada. \"Enviado\" é a palavra do V1 — e é a\n * pergunta que ela responde: isto já foi, ou ainda está no carrinho? */\nconst SENT_BADGE: Record<LineState, string> = {\n pending: '',\n fired: 'Enviado',\n delivered: 'Entregue',\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 {/* Nenhum ícone de estado na linha: o pendente é a barra âmbar da\n borda, e o enviado é o selo \"Enviado\". A panela ao lado do selo\n era a mesma informação duas vezes, e numa comanda de vinte e três\n itens ocupava uma coluna inteira de ruído. */}\n <span>\n <span className=\"pos-ln__n\">\n {state !== 'pending' && <span className=\"pos-ln__q pos-num\">{line.quantity}x</span>}\n {line.name}\n {/* A HORA do envio: é por ela que a cozinha e o salão conversam\n (\"saiu às 15:44?\"), e o V1 a põe ao lado do nome. */}\n {state !== 'pending' && line.firedAt && (\n <span className=\"pos-ln__at\">\n <Clock size={11} strokeWidth={2.2} aria-hidden />\n {new Date(line.firedAt).toLocaleTimeString('pt-BR', { hour: '2-digit', minute: '2-digit' })}\n </span>\n )}\n </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 {/* A linha PENDENTE se edita; a ENVIADA se lê.\n No V1 são dois desenhos diferentes, e a diferença é o que o\n operador precisa: no carrinho ele ainda mexe na quantidade, e os\n controles são grandes; depois de enviada, a mão sai da linha e o\n que importa é caber mais item na tela — a mesa de oito lança\n quarenta linhas numa noite. Manter o teclado de quantidade em item\n que já foi para a cozinha é oferecer um gesto que o servidor\n recusa, e ocupa o dobro da altura para isso. */}\n {state === 'pending' ? (\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 ) : (\n <span className=\"pos-ln__sent\">{SENT_BADGE[state]}</span>\n )}\n <span className=\"pos-ln__p pos-num\">\n {formatCents(line.unitPriceCents * line.quantity)}\n </span>\n </div>\n </div>\n )\n}\n","// ---------------------------------------------------------------------------\n// A IDADE DO CARDÁPIO NA TELA.\n//\n// O cardápio do PDV agora vem de uma cópia em memória que se revalida por\n// trás, e não de uma ida ao banco a cada gesto. Isso resolve o travamento e\n// cria uma pergunta nova: o operador não tem como saber se o que ele está\n// vendo é de agora ou de três horas atrás. Esta linha responde — e ao lado\n// dela mora o gesto de forçar a atualização, para quando a cozinha avisa que\n// acabou a picanha e ninguém quer esperar o próximo ciclo.\n//\n// Regra pura, sem relógio próprio: quem desenha passa o `now`.\n// ---------------------------------------------------------------------------\n\nimport { briefElapsed } from './views'\n\nexport interface MenuFreshness {\n /** Epoch ms de quando esta cópia do cardápio saiu do banco. */\n fetchedAt?: number\n /** Há uma revalidação em curso, por trás. */\n refreshing?: boolean\n /** A última revalidação falhou — o que está na tela é a cópia anterior. */\n failed?: boolean\n}\n\n/**\n * O rótulo da linha de frescor.\n *\n * A falha vem ANTES da idade porque é ela que muda a decisão: um cardápio de\n * 8 minutos é normal, um cardápio de 8 minutos que não consegue atualizar quer\n * dizer que a casa está sem rede e que a indisponibilidade de hoje pode não\n * ter chegado.\n */\nexport function menuFreshnessLabel(f: MenuFreshness, now: number = Date.now()): string {\n const idade = f.fetchedAt != null\n ? briefElapsed(new Date(f.fetchedAt).toISOString(), now)\n : undefined\n\n if (f.refreshing) return 'Atualizando cardápio…'\n if (f.failed) {\n return idade ? `Sem conexão · cardápio de ${idade} atrás` : 'Sem conexão'\n }\n if (!idade) return 'Cardápio'\n return idade === 'agora' ? 'Cardápio atualizado agora' : `Cardápio atualizado há ${idade}`\n}\n","// ---------------------------------------------------------------------------\n// O quadro do delivery — as colunas do V1, e não as que o V2 inventou.\n//\n// O V2 desenhava QUATRO colunas com nomes próprios («Recebido», «Em produção»,\n// «Pronto», «Saiu»). O V1 tem SEIS, com outros nomes, outro agrupamento de\n// estados e cores próprias — e o V1 é o contrato. Duas diferenças custam caro:\n//\n// - **«Aguardando preparo» não existia.** O pedido ACEITO e ainda não iniciado\n// caía junto do que já está na chapa, então a cozinha não conseguia ver o que\n// entrou na fila e ninguém pegou.\n// - **«Entregue» não existia.** O pedido terminado saía do quadro, e quem\n// procurava um pedido de meia hora atrás não tinha onde olhar.\n//\n// O quadro do V1 é alimentado por um CONECTOR DE CANAL (iFood, Rappi), por\n// unidade e atrás da permissão `restaurant_delivery / view` — não por `orders`.\n// Enquanto o V2 não tiver esse conector, o quadro é casca: as colunas certas e\n// um vazio que ADMITE que o canal não está ligado. Quadro vazio é honesto;\n// quadro com pedido inventado é pior que nenhum.\n// ---------------------------------------------------------------------------\n\n/**\n * O vocabulário de estado do V1, literal.\n *\n * `unknown` existe e não é defeito: é o pedido cujo canal ainda não respondeu o\n * estado, e o V1 o escreve na tela como «Aguardando estado do canal» em vez de\n * fingir que é novo.\n */\nexport type DeliveryStatus =\n | 'unknown' | 'new' | 'confirmed' | 'preparing'\n | 'ready' | 'dispatched' | 'delivered' | 'completed' | 'cancelled'\n\n/** Os estados que o V2 usava antes, e para onde eles vão. */\nconst LEGADO: Record<string, DeliveryStatus> = {\n received: 'new',\n out: 'dispatched',\n}\n\n/** O `statusLabels` do V1, palavra por palavra. */\nexport const DELIVERY_STATUS_LABELS: Record<DeliveryStatus, string> = {\n unknown: 'Aguardando estado do canal',\n new: 'Novo',\n confirmed: 'Aceito',\n preparing: 'Preparando',\n ready: 'Pronto',\n dispatched: 'Em rota',\n delivered: 'Entregue',\n completed: 'Concluído',\n cancelled: 'Cancelado',\n}\n\nexport interface DeliveryColumn {\n /** O nome que o V1 escreve no topo da coluna. */\n name: string\n states: DeliveryStatus[]\n /**\n * A cor da borda, no matiz do V1 (`border-blue-500` e companhia).\n *\n * Guardada como token para o CSS do pacote, porque aqui não há Tailwind — o\n * hex de cada um é o do V1, não um parecido.\n */\n tone: 'blue' | 'emerald' | 'amber' | 'violet' | 'slate'\n}\n\n/** As seis colunas do `DeliveryKanban`, na ordem em que o operador as lê. */\nexport const DELIVERY_COLUMNS: DeliveryColumn[] = [\n { name: 'Pedidos', states: ['unknown', 'new'], tone: 'blue' },\n { name: 'Aguardando preparo', states: ['confirmed'], tone: 'emerald' },\n { name: 'Preparando', states: ['preparing'], tone: 'amber' },\n { name: 'Pronto', states: ['ready'], tone: 'emerald' },\n { name: 'Em rota', states: ['dispatched'], tone: 'violet' },\n { name: 'Entregue', states: ['delivered', 'completed'], tone: 'slate' },\n]\n\n/** O estado, normalizado — inclusive o vocabulário antigo do V2. */\nexport function deliveryStatus(raw?: string | null): DeliveryStatus {\n if (!raw) return 'unknown'\n if (raw in LEGADO) return LEGADO[raw]\n return (DELIVERY_STATUS_LABELS as Record<string, string>)[raw]\n ? (raw as DeliveryStatus)\n : 'unknown'\n}\n\n/**\n * Em que coluna este pedido aparece — `undefined` quando em NENHUMA.\n *\n * `cancelled` não tem coluna no V1, e isso é decisão e não esquecimento: um\n * pedido cancelado no quadro de despacho é uma carta que alguém ainda vai tentar\n * mover. Ele existe na lista e no histórico, não na esteira.\n */\nexport function deliveryColumnOf(raw?: string | null): DeliveryColumn | undefined {\n const s = deliveryStatus(raw)\n return DELIVERY_COLUMNS.find((c) => c.states.includes(s))\n}\n\n/** O rótulo de tela de um estado. Enum cru nunca chega ao operador. */\nexport function deliveryStatusLabel(raw?: string | null): string {\n return DELIVERY_STATUS_LABELS[deliveryStatus(raw)]\n}\n\n// ---------------------------------------------------------------------------\n// De ONDE veio o pedido.\n//\n// Portado de `deliveryOriginLabel` em `beautyplace/src/lib/manualDelivery.ts`,\n// com os quatro nomes e a queda literais. O cartão do V1 mostra esta linha\n// logo abaixo do número — sem ela, o do V2 tinha um travessão no lugar de uma\n// informação que o banco já guarda: no Pertinho, 28 dos 30 pedidos de delivery\n// têm `delivery_source = 'ifood'`.\n//\n// A queda é «Delivery próprio», não «Outro»: um pedido sem canal externo é o\n// da própria casa, e dizer isso é mais útil que dizer que não se sabe.\n// ---------------------------------------------------------------------------\n\nconst ORIGEM: Record<string, string> = {\n ifood: 'iFood',\n opendelivery: 'OpenDelivery / 99',\n whatsapp: 'WhatsApp',\n digital_menu: 'Cardápio digital',\n}\n\nexport function deliveryOriginLabel(source?: string | null): string {\n return ORIGEM[source ?? ''] ?? (source || 'Delivery próprio')\n}\n\n// ---------------------------------------------------------------------------\n// POR QUANTO TEMPO o entregue fica na esteira.\n//\n// O V1 enuncia a regra na própria tela, e a frase é esta:\n//\n// > *\"Pedidos entregues permanecem aqui por 3 minutos após a confirmação da\n// > entrega. Depois, consulte Entregues e cancelados. Cancelados aparecem\n// > diretamente no histórico.\"*\n//\n// Lá quem corta é o servidor (o quadro vem pronto, e `?archive=true` troca de\n// visão). Aqui não há servidor no meio, então o corte é da tela — mas a regra\n// é a mesma, e os três minutos são dele.\n//\n// Por que existe: a coluna «Entregue» é uma confirmação, não um arquivo. Ela\n// responde *\"acabei de despachar aquele pedido?\"* nos segundos seguintes ao\n// toque. Sem o corte, ela vira a maior coluna do quadro até o fim do turno e\n// empurra para fora da tela as que ainda pedem trabalho — que são as únicas\n// que o operador precisa ver.\n// ---------------------------------------------------------------------------\n\n/** Os três minutos do V1, em milissegundos. */\nexport const DELIVERED_LINGER_MS = 3 * 60_000\n\nexport const DELIVERED_LINGER_NOTE =\n 'Pedidos entregues permanecem aqui por 3 minutos após a confirmação da entrega.'\n\n/**\n * Este pedido ainda aparece na esteira?\n *\n * `deliveredAt` ausente mantém o pedido: **não sei quando** não é **faz\n * tempo**, e sumir com um pedido por falta de carimbo esconde trabalho que\n * talvez ainda exista. É a mesma distinção do `lastOrderAt` na mesa.\n *\n * O cancelado nunca esteve aqui — some pela coluna, não pelo tempo.\n */\nexport function stillOnBoard(\n order: { dispatch?: string | null; deliveredAt?: string | null },\n now = Date.now(),\n): boolean {\n if (deliveryStatus(order.dispatch) !== 'delivered') return true\n if (!order.deliveredAt) return true\n const idade = now - new Date(order.deliveredAt).getTime()\n if (!Number.isFinite(idade)) return true\n return idade < DELIVERED_LINGER_MS\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 { deliveryStatusLabel, stillOnBoard, DELIVERED_LINGER_NOTE } from './deliveryColumns'\nimport { useEffect, useRef, useState } from 'react'\nimport { AlertTriangle, Bike, ChefHat, CheckCheck, Clock, Package, PackageCheck } from 'lucide-react'\nimport { haptic } from '../lib/haptics'\nimport type { DispatchStatus, PosPosition } from '../app/config'\nimport { formatCents } from './money'\nimport { EmptyState } from './views'\nimport { DELIVERY_COLUMNS, deliveryColumnOf, deliveryStatus } from './deliveryColumns'\n\n/**\n * O ícone de cada coluna do V1.\n *\n * O nome, os estados e a COR vêm de `./deliveryBoard.ts` — daqui sai só o\n * desenho. O V1 não tem ícone por coluna; ele é ganho do V2 e não muda o\n * contrato, porque o nome continua escrito ao lado.\n */\nconst ICONE: Record<string, typeof Clock> = {\n 'Pedidos': Package,\n 'Aguardando preparo': Clock,\n 'Preparando': ChefHat,\n 'Pronto': CheckCheck,\n 'Em rota': Bike,\n 'Entregue': PackageCheck,\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 // O quadro aparece VAZIO, não desaparece.\n //\n // Antes, sem pedido, o lugar todo virava um aviso e as colunas sumiam — então\n // quem abria o Delivery não tinha como saber que existe «Aguardando preparo»\n // nem em que ordem as coisas andam. O V1 desenha as seis sempre, cada uma com\n // o contador dela em zero; a estrutura do turno é informação, e ela vale\n // mesmo num momento em que não há o que mover.\n //\n // O aviso continua, mas ACIMA do quadro e dizendo a verdade do V2: não é que\n // não haja pedido agora, é que nenhum canal está ligado — o quadro do V1 é\n // alimentado por conector (iFood, Rappi) e o V2 ainda não tem nenhum.\n return (\n <>\n {orders.length === 0 && (\n <EmptyState\n title=\"Nenhum canal de delivery conectado\"\n hint=\"Os pedidos do iFood, Rappi e do cardápio próprio aparecem nestas colunas assim que um canal for ligado.\"\n Icon={Bike}\n />\n )}\n {/* A REGRA ENUNCIADA NA PRÓPRIA TELA, como no V1.\n A constante existia e nenhuma tela a montava: o pedido sumia da\n «Entregue» três minutos depois e o operador não tinha como saber por\n quê — parecia perda, não corte. O V1 põe a frase acima das colunas, em\n texto miúdo. Ver `DELIVERED_LINGER_NOTE`. */}\n <p className=\"pos-board__note\">{DELIVERED_LINGER_NOTE}</p>\n <div className=\"pos-board\">\n {DELIVERY_COLUMNS.map(({ name, states, tone }) => {\n const Icon = ICONE[name] ?? Clock\n // Por COLUNA, não por estado: «Pedidos» junta o novo e o que o canal\n // ainda não respondeu, e «Entregue» junta entregue e concluído. Comparar\n // com um estado só fazia os dois pares desaparecerem do quadro.\n // O corte dos TRÊS MINUTOS do V1 antes de montar a coluna: a\n // «Entregue» é confirmação, não arquivo. Ver `stillOnBoard`.\n const column = orders\n .filter((o) => stillOnBoard(o, now))\n .filter((o) => states.includes(deliveryStatus(o.dispatch)))\n return (\n <section\n key={name}\n className=\"pos-col\"\n aria-label={name}\n // A cor da borda é a do V1, matiz por matiz.\n style={{ ['--pos-col-edge' as string]: `var(--pos-deliv-${tone})` }}\n >\n <header className=\"pos-col__head\">\n <Icon size={15} strokeWidth={2.2} aria-hidden />\n <span className=\"pos-col__t\">{name}</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 // Pulsa só na PRIMEIRA coluna: ali o aplicativo já está\n // contando e a cozinha ainda não. Aceito (a segunda) não\n // pulsa — alguém já pegou.\n const awaiting = name === 'Pedidos' && !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) => deliveryColumnOf(g.from)?.name === name).map((g) => (\n <span key={`ghost-${g.id}`} className=\"pos-card pos-card--ghost\" aria-hidden />\n ))}\n {column.length === 0 && ghosts.every((g) => deliveryColumnOf(g.from)?.name !== name) && (\n <p className=\"pos-col__empty\">Nenhum</p>\n )}\n </div>\n </section>\n )\n })}\n </div>\n </>\n )\n}\n\n/**\n * O prazo, em palavras — só para o que AINDA não venceu.\n *\n * O atraso NÃO passa por aqui: o cartão troca de ramo antes\n * (`isLate ? … {late}min atrasado : … dueLabel(o, now)`), com ícone de alerta.\n * Cheguei a \"consertar\" esta função achando que ela dizia «agora» para um\n * pedido atrasado — dizia, no código, e **a tela nunca chegava a esse ramo**.\n * Quem provou foi um teste montando o componente de verdade; o teste de função\n * pura não tinha como ver.\n *\n * Fica registrado no lugar em que o próximo vai olhar: o `minutes <= 0` aqui é\n * o minuto do vencimento, não atraso.\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\n/**\n * O nome de cada estado — as PALAVRAS do V1, não um segundo vocabulário.\n *\n * Esta tabela dizia «Recebido», «Em produção» e «Saiu para entrega». Nenhuma\n * das três existe no V1: ele tem NOVE estados com nove nomes\n * (`statusLabels` do `DeliveryKanban.tsx`), portados literalmente em\n * `deliveryColumns.ts`. O resultado era o mesmo pedido chamado «Pedidos» na\n * coluna do quadro e «Recebido» no rail ao lado — duas palavras para um\n * estado, na mesma tela.\n *\n * A ponte de nomes antigos (`received→new`, `out→dispatched`) já existia em\n * `deliveryStatus`; aqui ela passa a ser o caminho, não uma exceção.\n */\nexport const DISPATCH_LABEL: Record<DispatchStatus, string> = {\n received: deliveryStatusLabel('received'),\n preparing: deliveryStatusLabel('preparing'),\n ready: deliveryStatusLabel('ready'),\n out: deliveryStatusLabel('out'),\n delivered: deliveryStatusLabel('delivered'),\n cancelled: deliveryStatusLabel('cancelled'),\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 {/* «Não cobrar» só quando o pedido DIZ que foi pago.\n \n Era `prepaid !== false`, o que fazia do DESCONHECIDO um «já pago»:\n uma comanda sem essa informação — toda comanda de delivery que veio\n da migração — mandava o operador não cobrar. Duas delas no Pertinho\n somam R$ 82,50 que a casa deixaria na porta.\n\n Sem a afirmação, o V1 mostra DOIS NÚMEROS e deixa o operador ler:\n *«Pago online: X · A cobrar: Y»* (`DeliveryKanban.tsx`). Ele nunca\n diz «não cobrar» — e é por isso que ele não erra quando não sabe. */}\n {order.prepaid === true ? (\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 <p className=\"pos-tot__r\">\n <span>Pago online</span>\n <span className=\"pos-num\">{formatCents(order.paidCents ?? 0)}</span>\n </p>\n )}\n {order.prepaid !== true && (\n <p className=\"pos-tot__r\">\n <span>A cobrar</span>\n <span className=\"pos-num\">\n {formatCents(Math.max(0, totals.totalCents - (order.paidCents ?? 0)))}\n </span>\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'\nimport { SheetLayer } from './SheetLayer'\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 <SheetLayer 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 </SheetLayer>\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// A fila de espera — quem chegou sem reserva.\n//\n// Portado de `beautyplace/src/hooks/useWaitlist.ts`, do\n// `components/waitlist/WaitlistPanel.tsx` e da migration\n// `20261002100000_fila_de_espera_restaurante.sql`. O que o V1 diz da própria\n// tela, e é a frase que define a funcionalidade:\n//\n// *\"Quem chegou sem reserva. O cliente acompanha a posição pelo link que\n// recebe no WhatsApp.\"*\n//\n// A fila não existe para o anfitrião gritar nomes — existe para o cliente\n// poder sair da porta.\n//\n// A regra que este arquivo existe para não deixar cair: **a posição é contada\n// DENTRO do bucket de tamanho, nunca na fila inteira.** Um casal que chega\n// depois de um grupo de dez não espera atrás dele: eles disputam mesas\n// diferentes. Contar na fila inteira faria o casal ver \"4º\" quando a mesa de\n// dois na frente dele é a primeira a vagar — e o número que a tela promete\n// seria mentira no único lugar em que o cliente olha.\n//\n// Quem calcula o bucket é o BANCO (`waitlist_size_bucket`): é a menor mesa\n// ativa da casa que comporta o grupo, e o balcão não conhece a grade de mesas.\n// Aqui só se CONTA sobre o que veio — a lista já chega inteira e ordenada, e\n// uma RPC por linha só para desenhar a lista seria uma ida ao banco por grupo\n// na fila.\n// ---------------------------------------------------------------------------\n\n/** Os cinco estados do V1, valor por valor — é o CHECK da tabela. */\nexport type WaitlistStatus = 'waiting' | 'called' | 'seated' | 'no_show' | 'cancelled'\n\n/** Um grupo esperando mesa. A unidade da fila é o GRUPO, não a pessoa. */\nexport interface WaitlistEntry {\n id: string\n /** Nome de quem espera. Walk-in não é cadastro: o nome vive na própria linha. */\n name: string\n /** O PRIMEIRO campo do formulário no V1 — ver `WaitlistEntrySheet`. */\n phone: string\n party: number\n /**\n * A menor mesa da casa que comporta o grupo, resolvida no banco.\n *\n * É a chave da contagem de posição. Ausente, a linha cai no próprio\n * `party` — uma casa que ainda não cadastrou mesa nenhuma continua tendo\n * fila, só que cada tamanho vira o seu próprio bucket.\n */\n sizeBucket?: number | null\n /** ISO. A ordem da fila, e o \"espera há…\" da linha. */\n joinedAt: string\n status: WaitlistStatus\n callExpiresAt?: string | null\n /** Quantas vezes já foi chamado. O segundo grito aparece na linha. */\n callCount?: number\n /** Ambiente preferido (opcional). `Tanto faz` é a ausência dele. */\n zoneId?: string | null\n /** «Cadeirinha, aniversário, mesa perto da janela…» */\n note?: string | null\n /** Preenchida por `withPositions`; 0 para quem não está mais aguardando. */\n position?: number\n}\n\n/** O que o balcão digita para pôr alguém na fila. */\nexport interface NewWaitlistEntry {\n name: string\n phone: string\n party: number\n zoneId?: string | null\n note?: string | null\n /**\n * A ficha que o telefone encontrou, quando encontrou.\n *\n * Só é preenchida por casamento com quem JÁ existe: a fila não cria pessoa,\n * senão o cadastro enche de quem passou na porta uma vez e nunca voltou.\n */\n personId?: string | null\n}\n\n/** Só quem ainda disputa mesa aparece no painel do anfitrião. */\nexport const ACTIVE_STATUSES: WaitlistStatus[] = ['waiting', 'called']\n\n/** O teto do contador de pessoas no V1: `Math.min(40, p + 1)`. */\nexport const MAX_PARTY = 40\n\n/**\n * A posição de cada um, DENTRO do seu bucket.\n *\n * Quem já foi chamado, sentou ou saiu devolve 0 — a mesma convenção da\n * `waitlist_position` do banco, e é o que a tela lê para trocar de estado sem\n * uma segunda pergunta. A ordenação por `joinedAt` é feita aqui e não confiada\n * à consulta: a lista chega ordenada hoje, e uma linha que entra por realtime\n * chega no fim independentemente da hora em que o grupo pisou na porta.\n */\nexport function withPositions(entries: WaitlistEntry[]): WaitlistEntry[] {\n const ordem = [...entries].sort((a, b) => a.joinedAt.localeCompare(b.joinedAt))\n const contador = new Map<number, number>()\n const posicao = new Map<string, number>()\n for (const e of ordem) {\n if (e.status !== 'waiting') { posicao.set(e.id, 0); continue }\n const bucket = bucketOf(e)\n const n = (contador.get(bucket) ?? 0) + 1\n contador.set(bucket, n)\n posicao.set(e.id, n)\n }\n return ordem.map((e) => ({ ...e, position: posicao.get(e.id) ?? 0 }))\n}\n\n/** O bucket que vale para contar. Sem o do banco, o tamanho do grupo serve. */\nfunction bucketOf(e: WaitlistEntry): number {\n return e.sizeBucket != null && e.sizeBucket > 0 ? e.sizeBucket : e.party\n}\n\n/**\n * O prazo do chamado estourou.\n *\n * O V1 NÃO marca falta sozinho, de propósito — o grupo pode estar entrando\n * pela porta no minuto em que o prazo vira. Isto só pinta a linha de vermelho;\n * quem decide continua sendo o anfitrião.\n */\nexport function isCallOverdue(e: WaitlistEntry, now: number): boolean {\n if (e.status !== 'called') return false\n if (!e.callExpiresAt) return false\n return new Date(e.callExpiresAt).getTime() < now\n}\n\n/**\n * A frase da linha chamada, literal do V1.\n *\n * O `Nx` só aparece a partir do segundo chamado: escrever «(1x)» em toda linha\n * chamada gastaria espaço para dizer o que já se sabe.\n */\nexport function calledLabel(e: WaitlistEntry, now: number): string | null {\n if (e.status !== 'called') return null\n const vezes = e.callCount ?? 1\n if (isCallOverdue(e, now)) return `Prazo estourado — chamado ${vezes}x`\n return `Chamado, aguardando na recepção${vezes > 1 ? ` (${vezes}x)` : ''}`\n}\n\n/**\n * O contador do topo: «3 grupos aguardando · 1 chamado».\n *\n * A unidade é o GRUPO, não a pessoa — quem lê precisa saber quantas MESAS\n * faltam, não quantas bocas. Os chamados só entram quando existem: um «· 0\n * chamados» permanente é ruído.\n */\nexport function waitingSummary(entries: WaitlistEntry[]): string {\n const aguardando = entries.filter((e) => e.status === 'waiting').length\n const chamados = entries.filter((e) => e.status === 'called').length\n const base = `${aguardando} ${aguardando === 1 ? 'grupo aguardando' : 'grupos aguardando'}`\n if (chamados === 0) return base\n return `${base} · ${chamados} chamado${chamados === 1 ? '' : 's'}`\n}\n\n/** O ± do formulário: nunca abaixo de 1, nunca acima de 40. Regra do V1. */\nexport function clampParty(n: number): number {\n if (!Number.isFinite(n)) return 1\n return Math.max(1, Math.min(MAX_PARTY, Math.trunc(n)))\n}\n\n/** Só os dígitos — é assim que o V1 mede se o telefone está completo. */\nexport function onlyDigits(s: string): string {\n return (s ?? '').replace(/\\D/g, '')\n}\n\n/**\n * `(00) 00000-0000` — a máscara do V1, e o formato em que o telefone é gravado.\n *\n * Grava formatado de propósito: é o que o anfitrião lê na linha da fila para\n * ligar, e reformatar na leitura obrigaria as duas pontas a concordar sobre um\n * formato que nenhuma das duas guarda.\n */\nexport function formatPhoneBR(raw: string): string {\n const d = onlyDigits(raw).slice(0, 11)\n if (d.length <= 2) return d\n if (d.length <= 6) return `(${d.slice(0, 2)}) ${d.slice(2)}`\n if (d.length <= 10) return `(${d.slice(0, 2)}) ${d.slice(2, 6)}-${d.slice(6)}`\n return `(${d.slice(0, 2)}) ${d.slice(2, 7)}-${d.slice(7)}`\n}\n\n/**\n * O submit libera? Regra do V1, os três termos:\n * nome com 2+ letras, telefone com 10+ dígitos, grupo maior que zero.\n *\n * O telefone entra na validação — e não é burocracia. É por ele que a casa\n * alcança o grupo que saiu da porta, e no V1 é ele que carrega o link da\n * posição. Uma linha na fila sem telefone é um cliente que só pode esperar de\n * pé.\n */\nexport function isEntryValid(e: Partial<NewWaitlistEntry>): boolean {\n return (e.name ?? '').trim().length >= 2\n && onlyDigits(e.phone ?? '').length >= 10\n && (e.party ?? 0) > 0\n}\n\n/** O que falta para «Colocar na fila» liberar — a tela DIZ, não emudece. */\nexport function entryBlocker(e: Partial<NewWaitlistEntry>): string | null {\n // A dica NÃO promete o link do WhatsApp: ele ainda não existe no V2, e uma\n // dica que promete o que a tela não faz é a mesma mentira do subtítulo.\n if (onlyDigits(e.phone ?? '').length < 10) return 'Informe o telefone com DDD — é por ele que a casa avisa o grupo.'\n if ((e.name ?? '').trim().length < 2) return 'Diga quem está esperando.'\n if ((e.party ?? 0) <= 0) return 'Quantas pessoas?'\n return null\n}\n\n/**\n * As mesas que servem para acomodar este grupo AGORA.\n *\n * Regra do `WaitlistSeatDialog` do V1, inteira: mesa ativa, LIVRE e com\n * capacidade suficiente; a do ambiente preferido primeiro, depois a MENOR que\n * serve. Sentar um casal na mesa de oito é o jeito mais rápido de a fila parar\n * de andar — a mesa de oito é a única que atende o grupo de sete que chega em\n * seguida.\n *\n * Mesa sem capacidade cadastrada (`seats` ausente) entra: o V2 aceita mesa sem\n * lugares declarados, e escondê-la faria a casa que nunca preencheu o campo ver\n * «nenhuma mesa serve» com o salão vazio.\n */\nexport function seatableTables<T extends { id: string; label: string; status: string; seats?: number; areaId?: string | null; zoneId?: string }>(\n positions: T[],\n party: number,\n preferredZoneId?: string | null,\n): T[] {\n const cabe = positions.filter((p) => p.status === 'free' && (p.seats == null || p.seats >= party))\n return cabe.sort((a, b) => {\n if (preferredZoneId) {\n const pa = zoneOf(a) === preferredZoneId ? 0 : 1\n const pb = zoneOf(b) === preferredZoneId ? 0 : 1\n if (pa !== pb) return pa - pb\n }\n const sa = a.seats ?? Number.MAX_SAFE_INTEGER\n const sb = b.seats ?? Number.MAX_SAFE_INTEGER\n if (sa !== sb) return sa - sb\n return a.label.localeCompare(b.label, 'pt-BR', { numeric: true })\n })\n}\n\nfunction zoneOf(p: { areaId?: string | null; zoneId?: string }): string | null {\n return p.zoneId ?? p.areaId ?? null\n}\n\n/**\n * Nenhuma mesa livre comporta o grupo — a frase do V1, com o número dentro.\n *\n * Ela não é um erro: é a instrução do que fazer em seguida (juntar mesas pelo\n * mapa). Um botão morto em silêncio deixaria o anfitrião tentando de novo.\n */\nexport function noTableFitsMessage(party: number): string {\n return `Nenhuma mesa livre comporta ${party} ${party === 1 ? 'pessoa' : 'pessoas'} agora. `\n + 'Junte mesas e acomode pelo mapa do salão, ou espere a próxima liberar.'\n}\n\n/** «espera há 12 min» / «há 1 h 20 min» — o relógio da linha. */\nexport function waitingFor(joinedAt: string, now: number): string {\n const min = Math.max(0, Math.floor((now - new Date(joinedAt).getTime()) / 60_000))\n if (min < 60) return `${min} min`\n const h = Math.floor(min / 60)\n const r = min % 60\n return r === 0 ? `${h} h` : `${h} h ${r} min`\n}\n\n/** O vazio do V1, palavra por palavra. */\nexport const EMPTY_TITLE = 'Ninguém na fila'\nexport const EMPTY_HINT = 'Quando o salão encher, coloque aqui quem chegar sem reserva.'\n\n/**\n * O subtítulo da tela.\n *\n * O V1 escreve *\"Quem chegou sem reserva. O cliente acompanha a posição pelo\n * link que recebe no WhatsApp.\"* — e a segunda frase é uma PROMESSA. Enquanto\n * o link público não existir no V2, repeti-la faria a tela mentir para o\n * anfitrião, que confiaria nela para deixar o cliente sair da porta.\n *\n * Então ela fica de fora até o link existir. O resto é verdade hoje.\n */\nexport const WAITLIST_SUBTITLE = 'Quem chegou sem reserva e está esperando mesa.'\n\n// ---------------------------------------------------------------------------\n// O CONTROLE DE ENTRADA — reserva e fila na mesma lista.\n//\n// Desenho NOVO, não porte. No V1 as duas vivem em telas separadas (`/reservas`\n// e `/fila`) e nada as encontra: nem a reserva vira linha de fila, nem a fila\n// sabe que há gente com hora marcada. O anfitrião é quem cruza as duas na\n// cabeça, olhando dois lugares — e é ele quem erra quando o salão enche.\n//\n// A regra que o founder pediu, e que organiza tudo: **quem tem reserva passa\n// na frente.** Não é cortesia; é que a casa já prometeu aquela mesa, e quem\n// chegou sem reserva está disputando o que sobrou.\n// ---------------------------------------------------------------------------\n\nimport type { PosReservation } from '../app/config'\n\n/** Uma reserva ainda está \"por entrar\"? Sentada, cancelada ou faltante, não. */\nexport function stillIncoming(r: { status: string }): boolean {\n return r.status !== 'seated' && r.status !== 'no_show' && r.status !== 'cancelled'\n}\n\n/**\n * A ordem das reservas na lista de entrada.\n *\n * **Quem JÁ CHEGOU vem antes**, e não é detalhe: essa gente está de pé na\n * recepção agora, enquanto a reserva das 21h ainda está em casa. Ordenar só\n * pelo horário empurraria para baixo justamente quem o anfitrião tem na frente\n * dele — e essa é a lista que ele lê para decidir quem senta na próxima mesa.\n *\n * Entre os que chegaram, quem chegou primeiro; entre os que não chegaram, a\n * hora marcada.\n */\nexport function incomingOrder(reservations: PosReservation[]): PosReservation[] {\n const chegou = (r: PosReservation) => r.status === 'arrived'\n return [...reservations].filter(stillIncoming).sort((a, b) => {\n const ca = chegou(a), cb = chegou(b)\n if (ca !== cb) return ca ? -1 : 1\n return a.at.localeCompare(b.at)\n })\n}\n\n/**\n * Quantos minutos a reserva está atrasada. Negativo (ainda não é a hora) vira 0.\n *\n * Só conta para quem NÃO chegou: uma reserva das 20h com o grupo de pé na\n * recepção desde as 20h05 não está atrasada — ela está esperando mesa, que é\n * outra conversa.\n */\nexport function minutesLate(r: { at: string; status: string }, now: number): number {\n if (r.status === 'arrived') return 0\n const min = Math.floor((now - new Date(r.at).getTime()) / 60_000)\n return min > 0 ? min : 0\n}\n\n/** «20:30» — o horário reservado, que é o que a linha da reserva mostra. */\nexport function clockOf(iso: string): string {\n return new Date(iso).toLocaleTimeString('pt-BR', { hour: '2-digit', minute: '2-digit' })\n}\n\n// ---------------------------------------------------------------------------\n// A BUSCA da coluna, na aba da Fila.\n// ---------------------------------------------------------------------------\n\n/** Sem acento e sem caixa: «Joao» acha «João», e «ANA» acha «ana». */\nfunction plain(s: string): string {\n return (s ?? '').normalize('NFD').replace(/[\\u0300-\\u036f]/g, '').toLowerCase()\n}\n\n/**\n * O grupo casa com o termo.\n *\n * Casa por **nome** e por **telefone** porque são os dois jeitos de a recepção\n * chamar alguém — o nome quando ela lembra, o número quando o cliente ligou\n * dizendo \"estou na fila\". O telefone compara só os DÍGITOS dos dois lados:\n * o banco guarda «(11) 99999-0000» e quem procura digita «99999» ou\n * «11999990000», e uma comparação sobre o texto formatado não casaria nenhum\n * dos dois.\n *\n * O número de PESSOAS entra também, mas só quando o termo é um número puro e\n * curto: buscar «4» numa fila cheia acha os grupos de quatro, que é a pergunta\n * de quem acabou de liberar uma mesa de quatro. Não vale para termo com letra,\n * senão «4 pessoas» casaria com qualquer coisa.\n */\nexport function entryMatches(\n row: { name?: string | null; phone?: string | null; party?: number },\n term: string,\n): boolean {\n const q = term.trim()\n if (!q) return true\n\n if (plain(row.name ?? '').includes(plain(q))) return true\n\n const digitos = onlyDigits(q)\n if (digitos) {\n const tel = onlyDigits(row.phone ?? '')\n if (tel && tel.includes(digitos)) return true\n // Só um termo INTEIRO de dígitos vira pergunta sobre tamanho do grupo.\n if (digitos === q && digitos.length <= 2 && row.party === Number(digitos)) return true\n }\n return false\n}\n\n/**\n * O vazio por FILTRO não é o vazio da fila.\n *\n * «Ninguém na fila» quer dizer *a casa está tranquila*; «Nada com “ana”» quer\n * dizer *apague o que você digitou*. Dizer a primeira frase quando a causa é a\n * segunda faz o anfitrião concluir que o grupo sumiu — e ele acabou de pôr o\n * grupo ali.\n */\nexport function filteredEmptyHint(term: string): string {\n return `Nada na fila com “${term.trim()}”. Limpe a busca para ver todo mundo.`\n}\n","// ---------------------------------------------------------------------------\n// A fila de espera, na tela do anfitrião.\n//\n// Portado do `WaitlistPanel` do V1. Ele é a tela que fica aberta no tablet da\n// porta durante o serviço, e a informação que ele carrega é sempre a mesma\n// pergunta: **quem é o próximo, e há quanto tempo ele está de pé.**\n//\n// A linha é lida de longe, com uma bandeja na mão: o número da posição é a\n// coisa maior do cartão, e o estado «chamado» pinta a borda inteira em vez de\n// pedir que alguém leia um selo. Quando o prazo estoura, a borda vira vermelha\n// — e continua sendo só uma cor: o sistema NÃO marca falta sozinho, porque o\n// grupo pode estar entrando pela porta no minuto em que o prazo vira.\n//\n// As três ações são as do V1, na mesma ordem: Chamar · Acomodar · Não veio.\n// ---------------------------------------------------------------------------\n\nimport { BellRing, Check, Clock, Phone, Plus, Search, UserRound, Users, UserX, Utensils } from 'lucide-react'\nimport type { PosReservation } from '../app/config'\nimport { haptic } from '../lib/haptics'\nimport { EmptyState } from './views'\nimport {\n calledLabel, clockOf, entryMatches, filteredEmptyHint, incomingOrder, isCallOverdue,\n minutesLate, waitingFor, waitingSummary, withPositions,\n EMPTY_HINT, EMPTY_TITLE, type WaitlistEntry,\n} from './waitlist'\n\nexport function WaitlistView({\n entries, reservations = [], zones, now, canSeat, onAdd, onCall, onSeat, onNoShow,\n onSeatReservation, onMarkArrived, busyId, query = '',\n}: {\n entries: WaitlistEntry[]\n /**\n * As reservas do dia que ainda não sentaram.\n *\n * Elas entram NA MESMA lista, acima da fila: a casa já prometeu aquela mesa,\n * e quem chegou sem reserva disputa o que sobrou. Duas listas em duas telas\n * era o anfitrião cruzando as duas na cabeça — e errando quando o salão\n * enche.\n */\n reservations?: PosReservation[]\n /** Os ambientes, só para nomear o «ambiente preferido» da linha. */\n zones?: Array<{ id: string; label: string }>\n now: number\n /**\n * Existe mesa livre que comporta este grupo AGORA?\n *\n * A pergunta é feita por linha porque a resposta muda por linha: a mesa de\n * dois que acabou de vagar serve o casal e não serve a família. Quem sabe é\n * a tela que tem o salão inteiro, não esta lista.\n */\n canSeat: (entry: WaitlistEntry) => boolean\n onAdd: () => void\n onCall: (entry: WaitlistEntry) => void\n onSeat: (entry: WaitlistEntry) => void\n onNoShow: (entry: WaitlistEntry) => void\n /** Acomodar a reserva — mesmo gesto do grupo da fila. */\n onSeatReservation?: (reservation: PosReservation) => void\n /** O CHECK-IN: o grupo da reserva se apresentou na recepção. */\n onMarkArrived?: (reservation: PosReservation) => void\n /** A linha que está esperando o servidor — só ela desliga. */\n busyId?: string\n /** O termo da caixa de busca da coluna. Filtra os DOIS grupos. */\n query?: string\n}) {\n // A posição é calculada sobre a fila INTEIRA e só depois se filtra: contar\n // sobre o resultado da busca faria o «2º» virar «1º» só porque alguém\n // digitou uma letra, e a posição é o número que a casa promete.\n const todos = withPositions(entries)\n const fila = todos.filter((e) => entryMatches(e, query))\n const reservas = incomingOrder(reservations)\n .filter((r) => entryMatches({ name: r.name, phone: r.phone, party: r.party }, query))\n const filtrando = query.trim().length > 0\n const vazio = fila.length === 0 && reservas.length === 0\n\n return (\n <div className=\"pos-wl pos-scroll\">\n <header className=\"pos-wl__head\">\n {/* A unidade do contador é o GRUPO, não a pessoa: quem lê precisa saber\n quantas MESAS faltam, não quantas bocas. */}\n <span className=\"pos-wl__count\">\n <Users size={14} strokeWidth={2.2} aria-hidden />\n {waitingSummary(todos)}\n </span>\n <button className=\"pos-wl__new\" onClick={() => { haptic('tap'); onAdd() }}>\n <Plus size={15} strokeWidth={2.6} aria-hidden />\n Novo\n </button>\n </header>\n\n {vazio ? (\n /* «Não tem» e «não achei» são coisas diferentes: a primeira diz que a\n casa está tranquila, a segunda manda apagar o que foi digitado.\n Trocar uma pela outra faz o anfitrião achar que o grupo sumiu. */\n filtrando ? (\n <EmptyState title=\"Nada encontrado\" hint={filteredEmptyHint(query)} Icon={Search} />\n ) : (\n <EmptyState\n title={EMPTY_TITLE}\n hint={EMPTY_HINT}\n Icon={UserRound}\n action={{ label: 'Colocar alguém na fila', onClick: onAdd }}\n />\n )\n ) : (\n <div className=\"pos-wl__list\">\n {reservas.length > 0 && (\n <>\n <h3 className=\"pos-wl__group\">Com reserva</h3>\n {reservas.map((r) => {\n const chegou = r.status === 'arrived'\n const atraso = minutesLate(r, now)\n return (\n <article key={r.id} className=\"pos-wl__row\" data-booked=\"true\" data-called={chegou || undefined}>\n {/* O HORÁRIO ocupa o lugar que a posição ocupa na fila: nas\n duas origens, é o número que responde \"quando\". */}\n <span className=\"pos-wl__pos pos-num\">{clockOf(r.at)}</span>\n\n <span className=\"pos-wl__who\">\n <span className=\"pos-wl__name\">{r.name}</span>\n <span className=\"pos-wl__meta\">\n <span className=\"pos-wl__chip\">\n <Users size={12} strokeWidth={2.2} aria-hidden />{r.party}\n </span>\n {r.phone && (\n <span className=\"pos-wl__chip\">\n <Phone size={12} strokeWidth={2.2} aria-hidden />{r.phone}\n </span>\n )}\n {r.channel && <span className=\"pos-wl__chip\">{r.channel}</span>}\n </span>\n {chegou && <span className=\"pos-wl__state\">Chegou — aguardando mesa</span>}\n {!chegou && atraso > 10 && (\n <span className=\"pos-wl__warn\">{atraso} min de atraso</span>\n )}\n {r.note && <span className=\"pos-wl__note\">“{r.note}”</span>}\n </span>\n\n <span className=\"pos-wl__do\">\n {/* Chegar NÃO abre comanda: é o check-in, e ele só diz\n que a gente está na casa. Quem abre é «Acomodar». */}\n {/* A célula existe MARCADA mesmo quando o botão sai: é\n ela que mantém «Acomodar» na mesma coluna da linha de\n baixo. Ver `.pos-wl__do` na folha de estilo. */}\n {chegou ? <span aria-hidden /> : (\n <button\n className=\"pos-wl__b\"\n disabled={busyId === r.id}\n onClick={() => { haptic('tap'); onMarkArrived?.(r) }}\n >\n <Check size={14} strokeWidth={2.4} aria-hidden />\n Chegou\n </button>\n )}\n <button\n className=\"pos-wl__b pos-wl__b--primary\"\n disabled={busyId === r.id}\n onClick={() => { haptic('tap'); onSeatReservation?.(r) }}\n >\n <Utensils size={14} strokeWidth={2.2} aria-hidden />\n Acomodar\n </button>\n <span aria-hidden />\n </span>\n </article>\n )\n })}\n </>\n )}\n\n {/* O título da fila só aparece quando há reserva do lado: sozinha,\n ela É a tela, e nomear um grupo único é ruído. */}\n {reservas.length > 0 && fila.length > 0 && <h3 className=\"pos-wl__group\">Sem reserva</h3>}\n {fila.map((e) => {\n const chamado = e.status === 'called'\n const estourou = isCallOverdue(e, now)\n const frase = calledLabel(e, now)\n const ambiente = e.zoneId ? zones?.find((z) => z.id === e.zoneId)?.label : undefined\n const cabe = canSeat(e)\n const ocupado = busyId === e.id\n\n return (\n <article\n key={e.id}\n className=\"pos-wl__row\"\n data-called={chamado || undefined}\n data-overdue={estourou || undefined}\n >\n {/* Quem já foi chamado não tem posição: ele saiu da contagem, e\n um «1º» ao lado de «Chamado» diria que ele ainda espera. */}\n <span className=\"pos-wl__pos pos-num\" aria-hidden={chamado}>\n {chamado ? <BellRing size={18} strokeWidth={2.4} /> : `${e.position}º`}\n </span>\n\n <span className=\"pos-wl__who\">\n <span className=\"pos-wl__name\">{e.name}</span>\n <span className=\"pos-wl__meta\">\n <span className=\"pos-wl__chip\">\n <Users size={12} strokeWidth={2.2} aria-hidden />{e.party}\n </span>\n <span className=\"pos-wl__chip\">\n <Clock size={12} strokeWidth={2.2} aria-hidden />espera há {waitingFor(e.joinedAt, now)}\n </span>\n {e.phone && (\n <span className=\"pos-wl__chip\">\n <Phone size={12} strokeWidth={2.2} aria-hidden />{e.phone}\n </span>\n )}\n {ambiente && <span className=\"pos-wl__chip\">prefere {ambiente}</span>}\n </span>\n {frase && <span className=\"pos-wl__state\">{frase}</span>}\n {e.note && <span className=\"pos-wl__note\">“{e.note}”</span>}\n {/* O aviso vem ANTES do toque, não depois. No V1 o anfitrião\n só descobre que nada serve depois de abrir o diálogo de\n mesas e encontrá-lo vazio. «Acomodar» continua ligado: a\n saída é juntar mesas pelo mapa, e ela é dele. */}\n {!cabe && (\n <span className=\"pos-wl__warn\">\n Nenhuma mesa livre comporta {e.party} {e.party === 1 ? 'pessoa' : 'pessoas'} agora\n </span>\n )}\n </span>\n\n <span className=\"pos-wl__do\">\n <button\n className=\"pos-wl__b\"\n disabled={ocupado}\n onClick={() => { haptic('tap'); onCall(e) }}\n >\n <BellRing size={14} strokeWidth={2.2} aria-hidden />\n {chamado ? 'Chamar de novo' : 'Chamar'}\n </button>\n\n <button\n className=\"pos-wl__b pos-wl__b--primary\"\n disabled={ocupado}\n onClick={() => { haptic('tap'); onSeat(e) }}\n >\n <Utensils size={14} strokeWidth={2.2} aria-hidden />\n Acomodar\n </button>\n\n <button\n className=\"pos-wl__b pos-wl__b--quiet\"\n disabled={ocupado}\n onClick={() => { haptic('tap'); onNoShow(e) }}\n >\n <UserX size={14} strokeWidth={2.2} aria-hidden />\n Não veio\n </button>\n </span>\n </article>\n )\n })}\n </div>\n )}\n </div>\n )\n}\n","// ---------------------------------------------------------------------------\n// «Colocar na fila de espera» — o formulário do V1.\n//\n// A ORDEM DOS CAMPOS É INFORMAÇÃO, e por isso ela é portada literalmente: o\n// telefone vem ANTES do nome porque é ele que faz a fila funcionar — é por ele\n// que o cliente é avisado, e é ele que amarra o walk-in a uma ficha que já\n// existe. Trocar a ordem para o \"natural\" (nome primeiro) faria o campo que\n// decide virar o campo que se esquece.\n//\n// Nada além disso, e é de propósito: o anfitrião está com uma fila de gente na\n// frente dele. Cadastro completo é tela de cadastro.\n// ---------------------------------------------------------------------------\n\nimport { useEffect, useRef, useState } from 'react'\nimport { Minus, Plus, UserCheck, UserPlus, X } from 'lucide-react'\nimport { SheetLayer } from './SheetLayer'\nimport {\n clampParty, entryBlocker, formatPhoneBR, isEntryValid, MAX_PARTY, onlyDigits,\n type NewWaitlistEntry,\n} from './waitlist'\n\nexport function WaitlistEntrySheet({ zones, onCancel, onConfirm, onLookupPhone, saving }: {\n /** Os ambientes da casa. Vazio: a pergunta não aparece, como no V1. */\n zones?: Array<{ id: string; label: string }>\n onCancel: () => void\n onConfirm: (entry: NewWaitlistEntry) => void\n /**\n * O telefone JÁ é de alguém?\n *\n * Regra do V1: se o número casa com uma ficha que existe, o walk-in entra no\n * histórico daquela pessoa — e o nome se preenche sozinho. Se NÃO casa, nada\n * é criado: quem passou na porta uma vez não vira cadastro sem querer.\n */\n onLookupPhone?: (digits: string) => Promise<{ id: string; name: string } | null>\n saving?: boolean\n}) {\n const [phone, setPhone] = useState('')\n const [name, setName] = useState('')\n const [party, setParty] = useState(2)\n const [zoneId, setZoneId] = useState('')\n const [note, setNote] = useState('')\n const [known, setKnown] = useState<{ id: string; name: string } | null>(null)\n const campo = useRef<HTMLInputElement>(null)\n /** Lido pelo efeito do telefone sem entrar nas dependências dele: o nome só\n * é preenchido oportunisticamente, e observá-lo refaria a busca a cada letra\n * que o anfitrião digita no campo seguinte. */\n const nomeRef = useRef('')\n nomeRef.current = name\n\n useEffect(() => { campo.current?.focus() }, [])\n\n // Busca com atraso: o anfitrião digita rápido e uma consulta por tecla é uma\n // ida ao banco por dígito do telefone.\n useEffect(() => {\n if (!onLookupPhone) return\n const digits = onlyDigits(phone)\n if (digits.length < 10) { setKnown(null); return }\n\n let vivo = true\n const t = window.setTimeout(() => {\n void onLookupPhone(digits).then((achado) => {\n if (!vivo) return\n setKnown(achado)\n if (achado && !nomeRef.current.trim()) setName(achado.name)\n }).catch(() => { if (vivo) setKnown(null) })\n }, 400)\n\n return () => { vivo = false; window.clearTimeout(t) }\n }, [phone, onLookupPhone])\n\n useEffect(() => {\n function onKey(event: KeyboardEvent) {\n if (event.key === 'Escape') { event.preventDefault(); onCancel() }\n }\n window.addEventListener('keydown', onKey, true)\n return () => window.removeEventListener('keydown', onKey, true)\n }, [onCancel])\n\n const draft: NewWaitlistEntry = {\n name, phone, party,\n zoneId: zoneId || null,\n note: note.trim() || null,\n personId: known?.id ?? null,\n }\n const pronto = isEntryValid(draft)\n const falta = entryBlocker(draft)\n\n const gravar = () => { if (pronto && !saving) onConfirm(draft) }\n\n return (\n <SheetLayer role=\"dialog\" aria-modal=\"true\" aria-label=\"Colocar na fila de espera\">\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 className=\"pos-t-xl\" style={{ display: 'inline-flex', alignItems: 'center', gap: 8 }}>\n <UserPlus size={18} strokeWidth={2.2} aria-hidden />\n Colocar na fila de espera\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 {/* PRIMEIRO campo, como no V1 — ver o cabeçalho deste arquivo. */}\n <label className=\"pos-labelled\">\n <span className=\"pos-t-sm\">Telefone (WhatsApp)</span>\n <span className=\"pos-input\">\n <input\n ref={campo}\n inputMode=\"tel\"\n placeholder=\"(00) 00000-0000\"\n value={phone}\n onChange={(e) => setPhone(formatPhoneBR(e.target.value))}\n onKeyDown={(e) => { if (e.key === 'Enter') gravar() }}\n autoComplete=\"off\"\n />\n </span>\n {known && (\n <span className=\"pos-wl__known\">\n <UserCheck size={12} strokeWidth={2.4} aria-hidden />\n Cliente conhecido: {known.name}\n </span>\n )}\n </label>\n\n <label className=\"pos-labelled\">\n <span className=\"pos-t-sm\">Nome</span>\n <span className=\"pos-input\">\n <input\n placeholder=\"Quem está esperando\"\n value={name}\n onChange={(e) => setName(e.target.value)}\n onKeyDown={(e) => { if (e.key === 'Enter') gravar() }}\n autoComplete=\"off\"\n />\n </span>\n </label>\n\n <div className=\"pos-labelled\">\n <span className=\"pos-t-sm\">Pessoas</span>\n {/* Padrão 2, teto 40 — os números do V1. Um grupo típico é um casal,\n e o padrão que acerta na maioria é um toque a menos por cliente\n numa fila de sexta à noite. */}\n <div className=\"pos-gcount\">\n <button\n type=\"button\"\n className=\"pos-gcount__step\"\n onClick={() => setParty((p) => clampParty(p - 1))}\n disabled={party <= 1}\n aria-label=\"Menos uma pessoa\"\n >\n <Minus size={18} strokeWidth={2.4} aria-hidden />\n </button>\n <input\n className=\"pos-gcount__n pos-num\"\n type=\"text\"\n inputMode=\"numeric\"\n pattern=\"[0-9]*\"\n value={String(party)}\n onChange={(e) => setParty(clampParty(Number(e.target.value.replace(/[^0-9]/g, '')) || 1))}\n onFocus={(e) => e.target.select()}\n aria-label=\"Número de pessoas\"\n />\n <button\n type=\"button\"\n className=\"pos-gcount__step\"\n onClick={() => setParty((p) => clampParty(p + 1))}\n disabled={party >= MAX_PARTY}\n aria-label=\"Mais uma pessoa\"\n >\n <Plus size={18} strokeWidth={2.4} aria-hidden />\n </button>\n </div>\n </div>\n\n {/* Só aparece onde há ambiente cadastrado — sem eles a pergunta só\n teria «Tanto faz» para responder. Regra do V1. */}\n {(zones ?? []).length > 0 && (\n <label className=\"pos-labelled\">\n <span className=\"pos-t-sm\">Ambiente preferido (opcional)</span>\n <select\n className=\"pos-dsc__sel\"\n value={zoneId}\n onChange={(e) => setZoneId(e.target.value)}\n aria-label=\"Ambiente preferido\"\n >\n <option value=\"\">Tanto faz</option>\n {(zones ?? []).map((z) => <option key={z.id} value={z.id}>{z.label}</option>)}\n </select>\n </label>\n )}\n\n <label className=\"pos-labelled\">\n <span className=\"pos-t-sm\">Observações (opcional)</span>\n {/* O exemplo é o do V1, e ele ensina para que o campo serve melhor\n do que qualquer rótulo. */}\n <textarea\n className=\"pos-wl__notes\"\n rows={2}\n placeholder=\"Cadeirinha, aniversário, mesa perto da janela…\"\n value={note}\n onChange={(e) => setNote(e.target.value)}\n />\n </label>\n\n {falta && <p className=\"pos-wl__warn\" style={{ margin: 0 }}>{falta}</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={gravar} disabled={!pronto || saving}>\n {saving ? 'Salvando...' : 'Colocar na fila'}\n </button>\n </footer>\n </div>\n </SheetLayer>\n )\n}\n","// ---------------------------------------------------------------------------\n// O cadastro de complementos deste produto SERVE?\n//\n// Portado do `ProductDetailModal` do V1, que valida antes de desenhar e recusa\n// o produto quando o cadastro não fecha. A razão é um beco sem saída:\n//\n// um grupo OBRIGATÓRIO sem nenhuma opção é uma exigência impossível.\n//\n// O V2 já não deixa o botão morto — ele diz «Falta: Ponto da carne». Mas com o\n// grupo vazio essa frase manda o operador cumprir o que não tem como: não há o\n// que escolher, e a folha prende. O V1 fecha a porta na entrada, com a frase\n// que diz a quem recorrer.\n// ---------------------------------------------------------------------------\n\n/** O que a tela mostra quando o cadastro está quebrado — literal do V1. */\nexport const MODIFIERS_NEED_REVIEW =\n 'O cadastro de complementos deste produto precisa de revisão. Peça ajuda ao garçom.'\n\n/** E quando o problema é de UM grupo, o V1 o nomeia. */\nexport function modifierGroupUnavailable(name: string): string {\n return `As opções de \"${name}\" estão indisponíveis. Peça ajuda ao garçom.`\n}\n\n/** A frase da leitura que falhou, para quem carrega os complementos. */\nexport const MODIFIERS_LOAD_FAILED =\n 'Não foi possível carregar os complementos. Tente novamente antes de adicionar o produto.'\n\nexport interface CheckableGroup {\n label: string\n min?: number\n max?: number\n options: readonly { priceDeltaCents?: number }[]\n}\n\n/**\n * O problema do cadastro, ou `null` quando ele serve.\n *\n * A ordem é a do V1: primeiro o que é malformado em QUALQUER grupo — porque\n * aí o defeito é do cadastro inteiro e não adianta nomear um —, depois o\n * primeiro grupo que não fecha sozinho.\n */\nexport function modifierGroupsProblem(groups: readonly CheckableGroup[]): string | null {\n // Número que não é número: `min` fracionário, preço `NaN` vindo de um campo\n // de texto. O V1 checa `isSafeInteger` e `isFinite` pelo mesmo motivo.\n const numerosQuebrados = groups.some((g) => (\n (g.min != null && !Number.isSafeInteger(g.min))\n || (g.max != null && !Number.isSafeInteger(g.max))\n || g.options.some((o) => o.priceDeltaCents != null && !Number.isFinite(o.priceDeltaCents))\n ))\n if (numerosQuebrados) return MODIFIERS_NEED_REVIEW\n\n const quebrado = groups.find((g) => {\n const min = g.min ?? 0\n const max = g.max ?? 1\n if (min < 0) return true\n // `max` abaixo de 1 — ou abaixo do próprio mínimo — é um grupo que não\n // deixa escolher o que exige.\n if (max < Math.max(1, min)) return true\n // O BECO: obrigatório e vazio.\n return min > 0 && g.options.length === 0\n })\n return quebrado ? modifierGroupUnavailable(quebrado.label) : null\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 { modifierGroupsProblem } from './modifierCheck'\nimport { formatCents } from './money'\nimport { SheetLayer } from './SheetLayer'\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 // O cadastro serve? Ver `modifierCheck.ts` — com ele quebrado a folha não\n // desenha grupo nenhum, porque escolher ali não leva a lugar nenhum.\n const problema = modifierGroupsProblem(groups)\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 (!problema && 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, problema, onCancel, onConfirm])\n\n return (\n <SheetLayer 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 {/* O CADASTRO QUEBRADO fecha a porta na entrada.\n Um grupo obrigatório e vazio faria o rodapé dizer «Falta: X» com\n nada para escolher — a folha prenderia o operador numa exigência\n impossível. O V1 recusa o produto antes, com a frase que diz a\n quem recorrer. Ver `modifierCheck.ts`. */}\n {problema && (\n <p className=\"pos-mgroup__bad\" role=\"alert\">{problema}</p>\n )}\n {!problema && 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 {!problema && 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={!!problema || missing.length > 0}\n onClick={() => onConfirm(chosen, note.trim())}\n >\n {problema\n ? 'Cadastro incompleto'\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 </SheetLayer>\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'\nimport { SheetLayer } from './SheetLayer'\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 <SheetLayer 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 </SheetLayer>\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'\nimport { SheetLayer } from './SheetLayer'\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 <SheetLayer 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 </SheetLayer>\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'\nimport { SheetLayer } from './SheetLayer'\n\n// SEIS, como em todo o resto do produto.\n//\n// O teclado pedia quatro enquanto os diálogos de desconto, taxa, cancelamento\n// e cortesia pediam seis — e o banco confere seis (`^[0-9]{6}$`). O PIN\n// digitado aqui NUNCA poderia bater: a tela dizia \"senha incorreta\" para a\n// senha certa, porque a pergunta é que estava errada.\nconst PIN_LENGTH = 6\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 <SheetLayer 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 </SheetLayer>\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'\nimport { SheetLayer } from './SheetLayer'\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 <SheetLayer 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 </SheetLayer>\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// A porta do PIN.\n//\n// Uma ação que pede autorização tem TRÊS destinos, e só três: pedir a senha,\n// negar, ou seguir. O que não pode existir é o quarto — seguir sem senha\n// porque o app esqueceu de ligar quem a confere.\n// ---------------------------------------------------------------------------\n\n/** Quando a ação pede PIN e o app não ligou quem o confere. */\nexport const PIN_SEM_VERIFICADOR =\n 'Esta ação exige autorização, e este aplicativo não tem quem confira a senha.'\n\nexport type PinGate =\n /** Abre a folha de autorização. */\n | { kind: 'ask' }\n /** Nega, e DIZ o que falta. */\n | { kind: 'deny'; message: string }\n /** A ação não pede senha. */\n | { kind: 'run' }\n\n/**\n * `requiresPin` sem `verifyPin` NEGA.\n *\n * Aqui estava `requiresPin && verifyPin`: um app que declarasse\n * `requiresPin: true` e esquecesse de ligar o verificador executava a ação\n * SEM PIN NENHUM — cancelar, descontar e dar cortesia passariam sem ninguém\n * responder por elas. E o comentário do portão prometia o contrário.\n *\n * Falta de verificador é falta de autorização, e falta de autorização nega.\n */\nexport function pinGate(\n requiresPin: boolean | undefined,\n hasVerifier: boolean,\n): PinGate {\n if (!requiresPin) return { kind: 'run' }\n if (!hasVerifier) return { kind: 'deny', message: PIN_SEM_VERIFICADOR }\n return { kind: 'ask' }\n}\n","// ---------------------------------------------------------------------------\n// QUANDO O MAPA DO SALÃO NÃO CARREGOU.\n//\n// O V1 mantém uma faixa `role=\"alert\"` no alto enquanto o carregamento das\n// mesas falhou, e ela não diz «erro»: diz a CONSEQUÊNCIA.\n//\n// Valores das mesas não atualizados. Não considere a ausência de comanda\n// como mesa livre. (WaiterTables.tsx, o `dataError`)\n//\n// É a diferença entre um aviso técnico e uma instrução de operação. A mesa que\n// aparece livre pode ter conta aberta — e abrir outra por cima é como nasce a\n// comanda duplicada, que foi exatamente o que se mediu na Mesa 23 do Pertinho.\n//\n// Por que não passa pelo `Notice`: ele some sozinho em 2,2 segundos, o que é\n// certo para «Taxa salva» e errado para um estado que PERSISTE. O aviso tem de\n// durar enquanto o dado estiver velho, como no V1.\n// ---------------------------------------------------------------------------\n\n/** A frase do V1, literal. */\nexport const FLOOR_STALE_WARNING =\n 'Valores das mesas não atualizados. Não considere a ausência de comanda como mesa livre.'\n\n/** O botão ao lado dela, também do V1. */\nexport const FLOOR_STALE_RETRY = 'Tentar novamente'\n","// ---------------------------------------------------------------------------\n// A ficha da PRAÇA selecionada.\n//\n// Portada de `beautyplace/src/components/salao/floor/PracaInspector.tsx`.\n//\n// A frase que organiza o arquivo inteiro está no V1: *\"a lista VIVA das mesas\n// que ela pegou — a lista vem do banco (o trigger é quem decide), não da conta\n// do cliente.\"* Aqui quem decide é a geometria, mas a regra sobrevive: a ficha\n// MOSTRA quem caiu dentro; ela não recalcula.\n//\n// E há um botão que parece um detalhe e é o coração: **«Escolher na planta»**.\n// O desenho nem sempre dá conta — uma mesa encostada na borda, um canto que o\n// contorno não pegou —, e sem ele a única saída seria redesenhar a praça\n// inteira por causa de uma mesa.\n// ---------------------------------------------------------------------------\n\nimport { useEffect, useState } from 'react'\nimport { Crosshair, MousePointerClick, Trash2, X } from 'lucide-react'\nimport { haptic } from '../lib/haptics'\nimport { ZONE_COLORS } from './zoneDraft'\nimport { zoneBounds, type ZoneGeometry } from './zoneEditing'\n\nexport interface InspectorZone extends ZoneGeometry {\n id: string\n name: string\n color?: string | null\n}\n\n/** A mesa como a ficha a lista. */\nexport interface InspectorZoneTable {\n id: string\n label: string\n name?: string | null\n /** Os nomes das OUTRAS praças a que ela pertence — o «também em:». */\n alsoIn?: string[]\n}\n\nconst FORMA_ROTULO: Record<string, string> = {\n rect: 'Retângulo',\n rectangle: 'Retângulo',\n ellipse: 'Elipse',\n polygon: 'Mão livre',\n}\n\nexport function ZoneInspector({\n zone, tables, picking, onPick, onRename, onRecolor, onDropTable, onZoom, onDelete,\n}: {\n zone: InspectorZone\n tables: InspectorZoneTable[]\n /** O modo «escolher na planta» está ligado? */\n picking: boolean\n onPick: (v: boolean) => void\n onRename: (name: string) => void\n onRecolor: (color: string) => void\n onDropTable: (tableId: string) => void\n onZoom?: () => void\n onDelete?: () => void\n}) {\n const [nome, setNome] = useState(zone.name)\n const [confirmando, setConfirmando] = useState(false)\n useEffect(() => { setNome(zone.name); setConfirmando(false) }, [zone.id, zone.name])\n\n const caixa = zoneBounds(zone)\n const forma = FORMA_ROTULO[zone.shape ?? 'rectangle'] ?? 'Praça'\n\n return (\n <div className=\"pos-insp\">\n <div className=\"pos-insp__head\">\n <span>\n <span className=\"pos-t-xs\">Praça</span>\n <strong className=\"pos-insp__t\">{zone.name}</strong>\n <span className=\"pos-insp__where\">\n {caixa\n ? `${forma} · ${caixa.w.toFixed(1)} × ${caixa.h.toFixed(1)} m · ${tables.length} mesa(s)`\n : `${tables.length} mesa(s)`}\n </span>\n </span>\n {onZoom && (\n <button className=\"pos-insp__zoom\" onClick={() => { haptic('tap'); onZoom() }} disabled={!caixa}>\n <Crosshair size={13} strokeWidth={2.3} aria-hidden /> Aproximar\n </button>\n )}\n </div>\n\n <label className=\"pos-insp__f\">\n <span className=\"pos-insp__l\">Nome</span>\n <input\n value={nome}\n onChange={(e) => setNome(e.target.value)}\n // Grava ao SAIR, como toda medida desta tela. E nome vazio VOLTA ao\n // que era: uma praça sem nome some da lista do rodapé, e o garçom\n // perde o filtro sem nada dizer que ele existia.\n onBlur={() => {\n const v = nome.trim()\n if (v && v !== zone.name) onRename(v)\n else setNome(zone.name)\n }}\n />\n </label>\n\n {/* A dica muda com a FORMA: puxar vértice e tirar ponto só existem na\n mão livre, e oferecer o gesto errado gasta o tempo de quem tenta. */}\n <p className=\"pos-insp__hint\">\n {zone.shape === 'polygon'\n ? 'Na planta: arraste o punho do centro para mover, puxe um ponto do contorno, toque no «+» de um lado para acrescentar um ponto, ou dois toques num ponto para tirá-lo.'\n : 'Na planta: arraste o punho do centro para mover e as alças do contorno para esticar.'}\n </p>\n\n <div className=\"pos-insp__f\">\n <span className=\"pos-insp__l\">Cor</span>\n <div className=\"pos-insp__cores\">\n {ZONE_COLORS.map((c) => (\n <button\n key={c}\n type=\"button\"\n className=\"pos-insp__cor\"\n aria-label={`Cor ${c}`}\n aria-pressed={zone.color === c}\n style={{ background: c }}\n onClick={() => { haptic('tap'); onRecolor(c) }}\n />\n ))}\n </div>\n </div>\n\n <div className=\"pos-insp__f\">\n <div className=\"pos-insp__mhead\">\n <span className=\"pos-insp__l\">Mesas da praça</span>\n <button\n className=\"pos-insp__pick\"\n aria-pressed={picking}\n onClick={() => { haptic('tap'); onPick(!picking) }}\n >\n <MousePointerClick size={13} strokeWidth={2.3} aria-hidden />\n {picking ? 'Concluir' : 'Escolher na planta'}\n </button>\n </div>\n\n {picking && (\n <p className=\"pos-insp__hint\">\n Clique numa mesa para tirá-la ou colocá-la nesta praça. Quem está\n dentro do desenho entra sozinha.\n </p>\n )}\n\n {tables.length === 0 ? (\n // O vazio EXPLICA e aponta as duas saídas. \"Nenhuma mesa\" sozinho\n // deixaria o gerente olhando um desenho certo sem saber o que fazer.\n <p className=\"pos-insp__hint\">\n Nenhuma mesa dentro do desenho. Mova a praça sobre as mesas ou\n escolha uma a uma na planta.\n </p>\n ) : (\n <ul className=\"pos-insp__mesas\">\n {tables.map((t) => (\n <li key={t.id}>\n <span className=\"pos-insp__mn\">\n <strong>{t.label}</strong>\n {t.name ? <span className=\"pos-insp__mx\"> · {t.name}</span> : null}\n {/* Uma mesa pode ser de DUAS praças. Sem esta linha, tirá-la\n daqui parece tirá-la do salão. */}\n {t.alsoIn && t.alsoIn.length > 0 && (\n <span className=\"pos-insp__malso\">também em: {t.alsoIn.join(', ')}</span>\n )}\n </span>\n <button\n className=\"pos-insp__mdrop\"\n aria-label={`Tirar a mesa ${t.label} da praça`}\n onClick={() => { haptic('tap'); onDropTable(t.id) }}\n >\n <X size={13} strokeWidth={2.6} aria-hidden />\n </button>\n </li>\n ))}\n </ul>\n )}\n </div>\n\n {onDelete && (\n confirmando ? (\n // A confirmação DIZ o que se perde e o que fica. \"Tem certeza?\" faz\n // o gerente decidir sem a informação que decide.\n <div className=\"pos-insp__confirm\" role=\"alertdialog\" aria-label={`Apagar a praça ${zone.name}?`}>\n <p className=\"pos-insp__ct\">Apagar a praça «{zone.name}»?</p>\n <p className=\"pos-insp__hint\">\n As {tables.length} mesa(s) continuam como estão; o que se perde é\n o recorte e a escala de quem atende esta praça.\n </p>\n <div className=\"pos-insp__cbtns\">\n <button className=\"pos-btn pos-btn--ghost\" onClick={() => setConfirmando(false)}>Cancelar</button>\n <button className=\"pos-btn pos-btn--danger\" onClick={() => { haptic('tap'); onDelete() }}>Apagar</button>\n </div>\n </div>\n ) : (\n <button className=\"pos-insp__detach\" onClick={() => setConfirmando(true)}>\n <Trash2 size={13} strokeWidth={2.3} aria-hidden /> Apagar praça\n </button>\n )\n )}\n </div>\n )\n}\n","// ---------------------------------------------------------------------------\n// «Organizar automaticamente» — as mesas em grade dentro do ambiente.\n//\n// Portado de `beautyplace/src/lib/salao/organizarMesas.ts`, e o V1 já o\n// descreve como deve ser: *\"Puro: nada de React nem de banco.\"* É a peça que\n// transforma um cadastro de cem mesas sem coordenada numa planta que existe —\n// e sem ela o editor abre num salão vazio, que é o estado do Pertinho hoje.\n// ---------------------------------------------------------------------------\n\nimport { areaBounds, tableSize, type Point, type TableShape } from './floorGeometry'\n\n/** Até onde a cadeira passa da borda do tampo: 0,28 de afastamento + 0,14 de\n * meia cadeira. */\nexport const CHAIR_M = 0.45\n/** Folga das bordas laterais e de baixo do ambiente. */\nexport const MARGIN_M = 0.4\n/** Folga de cima — o nome do ambiente mora no canto superior. */\nexport const MARGIN_TOP_M = 1.3\n/** Espaçamento mínimo padrão entre as mesas, já descontadas as cadeiras. */\nexport const DEFAULT_GAP_M = 0.6\n\nexport interface MeasuredTable {\n id: string\n shape?: TableShape | null\n widthM?: number | null\n heightM?: number | null\n diameterM?: number | null\n rotation?: number | null\n seats?: number | null\n}\n\nexport interface LabelledTable {\n id: string\n number?: number | null\n name?: string | null\n}\n\n/** O rótulo da mesa: o nome, se tiver; senão «Mesa N». */\nexport function tableLabel(m: LabelledTable): string {\n const nome = m.name?.trim()\n return nome || `Mesa ${m.number ?? ''}`.trim()\n}\n\n/**\n * Ordem «alfabética» de mesa é a do NÚMERO — 1, 2, … 10, e não 1, 10, 2.\n * Empate pelo nome, com comparação numérica embutida.\n */\nexport function compareTables(a: LabelledTable, b: LabelledTable): number {\n const n = (Number(a.number) || 0) - (Number(b.number) || 0)\n if (n !== 0) return n\n const r = tableLabel(a).localeCompare(tableLabel(b), 'pt-BR', { numeric: true, sensitivity: 'base' })\n return r !== 0 ? r : a.id.localeCompare(b.id)\n}\n\n/** As mesas cujo número está entre `de` e `ate` (em qualquer ordem), inclusive. */\nexport function tablesInRange<T extends { number?: number | null }>(tables: T[], de: number, ate: number): T[] {\n const lo = Math.min(de, ate)\n const hi = Math.max(de, ate)\n return tables.filter((m) => Number(m.number) >= lo && Number(m.number) <= hi)\n}\n\n/** O retângulo que a mesa ocupa no CHÃO: o tampo girado, mais as cadeiras. */\nexport function tableFootprint(m: MeasuredTable): { w: number; h: number } {\n const t = tableSize({\n shape: m.shape ?? 'rectangle',\n widthM: m.widthM ?? null,\n heightM: m.heightM ?? null,\n diameterM: m.diameterM ?? null,\n })\n const rad = ((Number(m.rotation) || 0) * Math.PI) / 180\n const cos = Math.abs(Math.cos(rad))\n const sin = Math.abs(Math.sin(rad))\n // A redonda não muda com o giro.\n const w = m.shape === 'round' ? t.w : t.w * cos + t.h * sin\n const h = m.shape === 'round' ? t.h : t.w * sin + t.h * cos\n const folga = (Number(m.seats) || 0) > 0 ? CHAIR_M * 2 : 0\n return { w: w + folga, h: h + folga }\n}\n\nexport interface Arrangement {\n /** O centro de cada mesa, em coordenadas LOCAIS do ambiente (vai em pos_x/pos_y). */\n positions: Map<string, Point>\n cols: number\n /** Linhas da grade; a última pode estar incompleta. */\n rows: number\n /** Cabe no tamanho ATUAL do ambiente, com o espaçamento mínimo. */\n fits: boolean\n /** O tamanho que o ambiente precisa ter para caber tudo. */\n neededWidthM: number\n neededHeightM: number\n}\n\nconst r2 = (v: number) => Math.round(v * 100) / 100\n\n/**\n * Espalha `n` células de tamanho `cel` num espaço `livre`: sobrando espaço,\n * distribui por igual (a mesma folga entre elas e nas pontas); apertado,\n * encosta nas pontas e divide o que sobra entre elas.\n */\nfunction spread(n: number, cel: number, livre: number, minimo: number): number[] {\n if (n <= 0) return []\n const sobra = livre - n * cel\n if (n === 1) return [Math.max(0, sobra / 2) + cel / 2]\n const porIgual = sobra / (n + 1)\n if (porIgual >= minimo) return Array.from({ length: n }, (_, i) => porIgual + i * (cel + porIgual) + cel / 2)\n const entre = Math.max(minimo, sobra / (n - 1))\n return Array.from({ length: n }, (_, i) => i * (cel + entre) + cel / 2)\n}\n\n/**\n * Distribui as mesas (JÁ na ordem desejada) numa grade que ocupa o ambiente\n * inteiro.\n *\n * A célula é a pegada da MAIOR mesa, para as colunas ficarem alinhadas. Entre\n * as grades que cabem, escolhe a de folgas mais parecidas na horizontal e na\n * vertical; nenhuma cabendo, informa o tamanho que o ambiente precisa ter.\n */\nexport function arrangeInArea(\n tables: Array<MeasuredTable & { id: string }>,\n area: { shape?: string | null; widthM?: number | null; heightM?: number | null; polygon?: Point[] | null },\n gapM = DEFAULT_GAP_M,\n): Arrangement {\n const b = areaBounds({\n shape: (area.shape ?? 'rect') as never,\n widthM: area.widthM ?? null,\n heightM: area.heightM ?? null,\n polygon: area.polygon ?? null,\n })\n const W = Math.max(0, b.width)\n const H = Math.max(0, b.height)\n const g = Math.max(0, gapM)\n const n = tables.length\n if (n === 0) {\n return { positions: new Map(), cols: 0, rows: 0, fits: true, neededWidthM: W, neededHeightM: H }\n }\n\n const pegadas = tables.map(tableFootprint)\n const celW = Math.max(...pegadas.map((p) => p.w))\n const celH = Math.max(...pegadas.map((p) => p.h))\n const livreW = W - 2 * MARGIN_M\n const livreH = H - MARGIN_TOP_M - MARGIN_M\n\n const ocupa = (k: number, cel: number) => k * cel + Math.max(0, k - 1) * g\n const maxCols = Math.max(1, Math.min(n, Math.floor((livreW + g) / (celW + g))))\n\n let escolha: { cols: number; rows: number } | null = null\n let melhor = Infinity\n for (let cols = 1; cols <= maxCols; cols++) {\n const rows = Math.ceil(n / cols)\n if (ocupa(rows, celH) > livreH) continue\n const folgaX = cols > 1 ? (livreW - cols * celW) / (cols - 1) : livreW - celW\n const folgaY = rows > 1 ? (livreH - rows * celH) / (rows - 1) : livreH - celH\n const desequilibrio = Math.abs(folgaX - folgaY)\n if (desequilibrio < melhor) { melhor = desequilibrio; escolha = { cols, rows } }\n }\n\n const fits = escolha !== null && ocupa(1, celW) <= livreW\n let cols = escolha?.cols ?? maxCols\n if (!escolha) {\n // Não cabe: o ambiente vai crescer — nos DOIS sentidos, mantendo a\n // proporção dele. Crescer só no comprimento transformava um salão de\n // 10 × 8 m com 137 mesas numa tripa de 10 × 85 m. E nunca menos colunas\n // do que já cabem na largura atual.\n const proporcao = W > 0 && H > 0 ? W / H : 1\n let menor = Infinity\n for (let c = maxCols; c <= n; c++) {\n const w = 2 * MARGIN_M + ocupa(c, celW)\n const h = MARGIN_TOP_M + MARGIN_M + ocupa(Math.ceil(n / c), celH)\n const erro = Math.abs(Math.log(w / h) - Math.log(proporcao))\n if (erro < menor) { menor = erro; cols = c }\n }\n }\n const rows = escolha?.rows ?? Math.ceil(n / cols)\n const neededWidthM = r2(Math.max(W, 2 * MARGIN_M + ocupa(cols, celW)))\n const neededHeightM = r2(Math.max(H, MARGIN_TOP_M + MARGIN_M + ocupa(rows, celH)))\n\n // Não cabendo, a grade é montada no tamanho que o ambiente PRECISA ter.\n const xs = spread(cols, celW, Math.max(livreW, neededWidthM - 2 * MARGIN_M), g)\n const ys = spread(rows, celH, Math.max(livreH, neededHeightM - MARGIN_TOP_M - MARGIN_M), g)\n\n const positions = new Map<string, Point>()\n tables.forEach((m, i) => {\n const c = i % cols\n const r = Math.floor(i / cols)\n positions.set(m.id, { x: r2(b.minX + MARGIN_M + xs[c]), y: r2(b.minY + MARGIN_TOP_M + ys[r]) })\n })\n\n return { positions, cols, rows, fits, neededWidthM, neededHeightM }\n}\n","// ---------------------------------------------------------------------------\n// O PLANO de «Organizar automaticamente».\n//\n// Portado de `OrganizarMesasDialog.montarPlano` do V1. Aqui está só o que não\n// é tela: o rascunho de quem vai para onde, a prévia do que vai acontecer, e\n// o plano final.\n//\n// A frase que governa o arquivo está no V1: *\"Nada grava antes do «Organizar»:\n// o rascunho é só a atribuição mesa → ambiente.\"* O operador mexe à vontade,\n// vê o resultado descrito em palavras, e só então decide.\n//\n// Três regras que o V1 aprendeu e que uma reescrita perderia:\n//\n// 1. **Desmarcar um ambiente DESFAZ o que foi feito para ele.** Senão o\n// rascunho guarda mesas indo para um ambiente que já não será organizado.\n//\n// 2. **O ambiente cresce nos DOIS sentidos.** Crescer só no comprimento\n// transformava um salão de 10 × 8 m com 137 mesas numa tripa de 10 × 85 m.\n// (A regra mora em `arrangeInArea`; aqui só se decide SE ele cresce.)\n//\n// 3. **Mesa que foi para um ambiente NÃO escolhido não é redistribuída.** Ela\n// só muda de ambiente e cai no canto dele — organizar um ambiente que o\n// operador não escolheu seria mexer no que ele não mandou mexer.\n// ---------------------------------------------------------------------------\n\nimport { placeAreas, type FloorArea } from './floorGeometry'\nimport { arrangeInArea, compareTables, DEFAULT_GAP_M, type MeasuredTable } from './arrangeTables'\nimport type { Point } from './floorGeometry'\n\n/** Um ambiente, do ponto de vista do plano. */\nexport interface PlanArea {\n id: string\n name: string\n shape?: string | null\n widthM?: number | null\n heightM?: number | null\n polygon?: Point[] | null\n}\n\n/** Uma mesa, com o ambiente em que ela está HOJE. */\nexport interface PlanTable extends MeasuredTable {\n id: string\n number?: number | null\n name?: string | null\n areaId?: string | null\n}\n\n/** O rascunho: só as mesas que MUDARAM de ambiente (`null` = sai da planta). */\nexport type Draft = Map<string, string | null>\n\n/** Onde a mesa está, contando o rascunho. */\nexport function effectiveArea(t: PlanTable, draft: Draft): string | null {\n return draft.has(t.id) ? draft.get(t.id)! : (t.areaId ?? null)\n}\n\n/**\n * Põe a mesa no ambiente ativo, ou tira de lá.\n *\n * Tirar tem dois sentidos, e o V1 os separa: a mesa que **era** deste ambiente\n * sai da planta; a que só **veio** de outro no rascunho volta para onde\n * estava. Tratar os dois como \"sai da planta\" mandaria para a bandeja uma mesa\n * que o operador só tinha movido por engano.\n */\nexport function toggleTable(draft: Draft, t: PlanTable, activeArea: string): Draft {\n const n = new Map(draft)\n if (effectiveArea(t, draft) === activeArea) {\n if (t.areaId === activeArea) n.set(t.id, null)\n else n.delete(t.id)\n } else if (t.areaId === activeArea) {\n n.delete(t.id)\n } else {\n n.set(t.id, activeArea)\n }\n return n\n}\n\n/** Desmarcar um ambiente desfaz o que o rascunho tinha feito para ele. */\nexport function releaseArea(draft: Draft, tables: PlanTable[], areaId: string): Draft {\n const n = new Map(draft)\n for (const [tableId, destino] of draft) {\n const t = tables.find((x) => x.id === tableId)\n if (destino === areaId || (destino === null && t?.areaId === areaId)) n.delete(tableId)\n }\n return n\n}\n\n/** Tira TODAS as mesas do ambiente ativo, pela mesma regra do `toggleTable`. */\nexport function clearArea(draft: Draft, tables: PlanTable[], activeArea: string): Draft {\n const n = new Map(draft)\n for (const t of tables) {\n if (effectiveArea(t, draft) !== activeArea) continue\n if (t.areaId === activeArea) n.set(t.id, null)\n else n.delete(t.id)\n }\n return n\n}\n\nexport interface AreaPreview {\n area: PlanArea\n tables: PlanTable[]\n cols: number\n rows: number\n fits: boolean\n neededWidthM: number\n neededHeightM: number\n positions: Map<string, Point>\n}\n\n/** O que VAI acontecer com cada ambiente escolhido, antes de gravar nada. */\nexport function previewArrangement(\n areas: PlanArea[], tables: PlanTable[], draft: Draft, chosen: string[], gapM = DEFAULT_GAP_M,\n): AreaPreview[] {\n const ordenadas = [...tables].sort(compareTables)\n return chosen\n .map((id) => areas.find((a) => a.id === id))\n .filter((a): a is PlanArea => a != null)\n .map((area) => {\n const lista = ordenadas.filter((t) => effectiveArea(t, draft) === area.id)\n const d = arrangeInArea(lista, area, gapM)\n return { area, tables: lista, ...d }\n })\n}\n\nexport interface ArrangementPlan {\n /**\n * O que muda em cada ambiente: o TAMANHO, quando as mesas não couberam, e a\n * POSIÇÃO, quando se pede «lado a lado».\n *\n * A posição faltava, e com ela faltava o caminho que o V1 chama de «Só pôr\n * os ambientes lado a lado» — o único útil quando os ambientes ainda estão\n * todos empilhados na origem, que é exatamente quando o cadeado do desenho\n * de praça está ligado.\n */\n areas: Array<{ id: string; widthM?: number; heightM?: number; posX?: number; posY?: number }>\n tables: Array<{ id: string; areaId: string | null; posX?: number; posY?: number }>\n}\n\n/** O plano final: o que gravar, e nada além disso. */\nexport function buildPlan(\n preview: AreaPreview[], draft: Draft, chosen: string[], { grow = true } = {},\n): ArrangementPlan {\n const areas: ArrangementPlan['areas'] = []\n const tables: ArrangementPlan['tables'] = []\n\n for (const p of preview) {\n // Polígono não cresce: esticar um contorno desenhado à mão não tem um\n // \"maior\" óbvio, e o V1 não arrisca adivinhar qual vértice mexer.\n if (!p.fits && grow && p.area.shape !== 'polygon') {\n areas.push({ id: p.area.id, widthM: p.neededWidthM, heightM: p.neededHeightM })\n }\n for (const t of p.tables) {\n const pos = p.positions.get(t.id)\n if (pos) tables.push({ id: t.id, areaId: p.area.id, posX: pos.x, posY: pos.y })\n }\n }\n\n for (const [tableId, destino] of draft) {\n if (destino === null) tables.push({ id: tableId, areaId: null })\n // Ambiente NÃO escolhido: muda de ambiente e cai no canto — ver o\n // cabeçalho, regra 3.\n else if (!chosen.includes(destino)) tables.push({ id: tableId, areaId: destino, posX: 1, posY: 1.5 })\n }\n\n return { areas, tables }\n}\n\n/**\n * A frase da prévia, por ambiente — a que evita a surpresa.\n *\n * O V1 tem DUAS frases para o «não coube», e a diferença entre elas é o que\n * vai acontecer de fato:\n *\n * - **o ambiente cresce** — retângulo, com «aumentar» ligado;\n * - **«não cabem … vão passar da borda»** — polígono, ou «aumentar»\n * desligado.\n *\n * O V2 dizia sempre a primeira. Mas o `buildPlan` recusa esticar polígono\n * («esticar um contorno desenhado à mão não tem um \"maior\" óbvio»), então a\n * prévia prometia um crescimento que não vinha: o operador lia «o ambiente\n * passa a 29,0 × 15,5 m», confirmava, e as mesas passavam da borda sem aviso.\n *\n * A prévia existe para evitar exatamente essa surpresa; dizer a frase errada é\n * pior do que não ter prévia.\n */\nexport function previewLine(p: AreaPreview, grow = true): string {\n const fileiras = p.rows === 1 ? 'fileira' : 'fileiras'\n const base = `${p.area.name}: ${p.tables.length} mesa(s) em ${p.rows} ${fileiras} de até ${p.cols}`\n if (p.fits) return base\n const cresce = grow && p.area.shape !== 'polygon'\n if (cresce) {\n return `${base} — o ambiente passa a ${p.neededWidthM.toFixed(1)} × ${p.neededHeightM.toFixed(1)} m`\n }\n const w = Number(p.area.widthM ?? 0).toFixed(1)\n const h = Number(p.area.heightM ?? 0).toFixed(1)\n return `${base} — não cabem em ${w} × ${h} m — vão passar da borda`\n}\n\n\n/**\n * O plano que SÓ espalha os ambientes, sem tocar em mesa.\n *\n * É o «Só pôr os ambientes lado a lado» do V1. Ele existe para o estado em que\n * nada mais funciona: ambientes empilhados na origem, ferramentas de praça\n * apagadas, e o operador sem um primeiro passo. O V1 o oferece como botão\n * próprio; aqui ele é o que o botão faz quando nenhum ambiente foi escolhido.\n *\n * As mesas ficam onde estão — elas são posicionadas DENTRO do ambiente, e o\n * ambiente é que se muda. É por isso que o V1 avisa «as praças não se movem»:\n * a praça é um recorte em coordenadas do mundo, e espalhar ambientes a deixa\n * para trás.\n */\nexport function spreadAreasPlan(areas: PlanArea[]): ArrangementPlan {\n // `posX: 0, posY: 0` EXPLÍCITO, e não por omissão.\n //\n // `placeAreas` decide entre espalhar e respeitar a posição gravada com\n // `needsAutoLayout`, que compara `Number(a.posX) === 0`. Com o campo\n // AUSENTE isso vira `Number(undefined) === 0`, ou seja `NaN === 0`, que é\n // falso — e a função caía no ramo «respeite a posição», devolvendo zero para\n // todos. O diálogo fechava dizendo que organizou e o salão continuava\n // empilhado.\n //\n // Aqui a origem é sempre zero de propósito: esta função existe para\n // ESPALHAR, e espalhar parte de todo mundo junto.\n const emZero: FloorArea[] = areas.map((a) => ({\n id: a.id, name: a.name,\n shape: (a.shape ?? 'rect') as FloorArea['shape'],\n widthM: a.widthM ?? null, heightM: a.heightM ?? null,\n polygon: a.polygon ?? null, posX: 0, posY: 0,\n }))\n return {\n areas: placeAreas(emZero).map((p) => ({\n id: p.area.id, posX: p.origin.x, posY: p.origin.y,\n })),\n tables: [],\n }\n}\n","// ---------------------------------------------------------------------------\n// «Organizar automaticamente», em duas etapas.\n//\n// Portada de `OrganizarMesasDialog` do V1.\n//\n// A etapa 1 pergunta QUAIS AMBIENTES; a etapa 2, QUAIS MESAS em cada um. E a\n// separação não é cerimônia: escolher ambiente é decisão de segundos, e pôr\n// cem mesas em duas praças é trabalho — juntar as duas numa tela só faria a\n// primeira desaparecer sob a segunda.\n//\n// O que o V1 sabe e uma caixa de «organizar» não:\n//\n// 1. **Nada grava antes do «Organizar».** O rascunho é só atribuição.\n// 2. **A prévia diz o que vai acontecer, em palavras**, incluindo o aviso de\n// que o ambiente vai crescer. É ela que evita a surpresa de ver um salão\n// de 10 m virar um de 29 m depois do fato.\n// 3. **O botão muda de nome com a escolha.** Sem ambiente marcado ele ainda\n// faz uma coisa útil — pôr os ambientes lado a lado — e diz isso.\n// ---------------------------------------------------------------------------\n\nimport { useMemo, useState } from 'react'\nimport { ArrowRight, LayoutGrid, Search, TriangleAlert, X } from 'lucide-react'\nimport { DEFAULT_GAP_M, compareTables, tableLabel, tablesInRange } from './arrangeTables'\nimport {\n buildPlan, clearArea, effectiveArea, previewArrangement, previewLine, releaseArea, spreadAreasPlan, toggleTable,\n type ArrangementPlan, type Draft, type PlanArea, type PlanTable,\n} from './arrangePlan'\nimport { SheetLayer } from './SheetLayer'\n\nexport function ArrangeSheet({ areas, tables, onCancel, onConfirm }: {\n areas: PlanArea[]\n tables: PlanTable[]\n onCancel: () => void\n onConfirm: (plan: ArrangementPlan) => void | Promise<void>\n}) {\n const [etapa, setEtapa] = useState<1 | 2>(1)\n /** «Só pôr os ambientes lado a lado» — o caminho do V1 para o salão ainda\n * empilhado na origem. Não toca em mesa nenhuma. */\n const soEspalhar = async () => {\n setSalvando(true)\n try { await onConfirm(spreadAreasPlan(areas)) } finally { setSalvando(false) }\n }\n const [escolhidos, setEscolhidos] = useState<string[]>([])\n const [ativo, setAtivo] = useState<string | null>(null)\n const [rascunho, setRascunho] = useState<Draft>(new Map())\n const [espacamento, setEspacamento] = useState(String(DEFAULT_GAP_M))\n const [aumentar, setAumentar] = useState(true)\n const [de, setDe] = useState('')\n const [ate, setAte] = useState('')\n const [busca, setBusca] = useState('')\n const [salvando, setSalvando] = useState(false)\n\n const ordenadas = useMemo(() => [...tables].sort(compareTables), [tables])\n const nomeDoAmbiente = useMemo(() => new Map(areas.map((a) => [a.id, a.name])), [areas])\n const esp = Math.max(0, Number(espacamento.replace(',', '.')) || 0)\n\n const previa = useMemo(\n () => previewArrangement(areas, ordenadas, rascunho, escolhidos, esp),\n [areas, ordenadas, rascunho, escolhidos, esp],\n )\n\n const contarNo = (id: string) => ordenadas.filter((t) => effectiveArea(t, rascunho) === id).length\n\n const marcarAmbiente = (id: string, marcado: boolean) => {\n setEscolhidos((prev) => (marcado ? [...prev, id] : prev.filter((x) => x !== id)))\n // Desmarcar DESFAZ o que o rascunho tinha feito para ele — senão sobram\n // mesas indo para um ambiente que já não será organizado.\n if (!marcado) setRascunho((prev) => releaseArea(prev, ordenadas, id))\n }\n\n const aplicarFaixa = () => {\n if (!ativo) return\n const a = parseInt(de, 10)\n const b = parseInt(ate || de, 10)\n if (!Number.isFinite(a) || !Number.isFinite(b)) return\n setRascunho((prev) => {\n let n = prev\n for (const t of tablesInRange(ordenadas, a, b)) {\n if (effectiveArea(t, n) !== ativo) n = toggleTable(n, t, ativo)\n }\n return n\n })\n setDe(''); setAte('')\n }\n\n const visiveis = useMemo(() => {\n const q = busca.trim().toLowerCase()\n if (!q) return ordenadas\n return ordenadas.filter((t) => tableLabel(t).toLowerCase().includes(q) || String(t.number) === q)\n }, [ordenadas, busca])\n\n const listaAtiva = ativo ? ordenadas.filter((t) => effectiveArea(t, rascunho) === ativo) : []\n\n const confirmar = async () => {\n setSalvando(true)\n try { await onConfirm(buildPlan(previa, rascunho, escolhidos, { grow: aumentar })) }\n finally { setSalvando(false) }\n }\n\n return (\n <SheetLayer>\n <div className=\"pos-sheet__scrim\" onClick={salvando ? undefined : onCancel} aria-hidden />\n <div className=\"pos-sheet__panel pos-sheet__panel--wide\" role=\"dialog\" aria-label=\"Organizar automaticamente\" aria-modal>\n <div className=\"pos-sheet__head\">\n <span>\n <h2 className=\"pos-sheet__title\">\n <LayoutGrid size={18} strokeWidth={2.2} aria-hidden />\n Organizar automaticamente\n </h2>\n <p className=\"pos-sheet__sub\">\n {etapa === 1\n ? 'Escolha os ambientes que vão ser organizados.'\n : 'Diga quais mesas ficam em cada ambiente. Ao organizar, elas são distribuídas em ordem de número pelo ambiente todo.'}\n </p>\n </span>\n <button className=\"pos-sheet__x\" onClick={onCancel} aria-label=\"Fechar\"><X size={20} /></button>\n </div>\n\n {etapa === 1 ? (\n <div className=\"pos-sheet__body pos-arr__e1\">\n <div className=\"pos-dsc__sec\">\n <span className=\"pos-dsc__lbl\">Ambientes</span>\n <ul className=\"pos-arr__ambs\">\n {areas.map((a) => {\n const marcado = escolhidos.includes(a.id)\n return (\n <li key={a.id}>\n <button\n className=\"pos-arr__amb\"\n aria-pressed={marcado}\n onClick={() => marcarAmbiente(a.id, !marcado)}\n >\n <span className=\"pos-arr__check\" aria-hidden>{marcado ? '✓' : ''}</span>\n <span className=\"pos-arr__an\">{a.name}</span>\n <span className=\"pos-num pos-arr__ac\">{contarNo(a.id)} mesa(s)</span>\n </button>\n </li>\n )\n })}\n </ul>\n </div>\n\n <div className=\"pos-dsc__sec\">\n <span className=\"pos-dsc__lbl\">Espaçamento mínimo entre as mesas (m)</span>\n <input\n className=\"pos-dsc__val\"\n inputMode=\"decimal\"\n value={espacamento}\n onChange={(e) => setEspacamento(e.target.value)}\n aria-label=\"Espaçamento mínimo entre as mesas, em metros\"\n />\n <p className=\"pos-sheet__hint\">\n Já contando as cadeiras. Sobrando espaço, as mesas se espalham\n pelo ambiente todo.\n </p>\n <label className=\"pos-arr__opt\">\n <input type=\"checkbox\" checked={aumentar} onChange={(e) => setAumentar(e.target.checked)} />\n <span>\n Aumentar o ambiente quando as mesas não couberem{' '}\n <span className=\"pos-arr__ox\">(só ambiente retangular)</span>\n </span>\n </label>\n </div>\n </div>\n ) : (\n <div className=\"pos-sheet__body pos-arr__e2\">\n {/* Uma aba por ambiente escolhido: a etapa 2 é sobre UM de cada\n vez, e a aba diz em qual se está mexendo. */}\n <div className=\"pos-arr__tabs\" role=\"tablist\">\n {escolhidos.map((id) => (\n <button\n key={id}\n role=\"tab\"\n className=\"pos-arr__tab\"\n aria-selected={ativo === id}\n onClick={() => setAtivo(id)}\n >\n {nomeDoAmbiente.get(id)} <span className=\"pos-num\">({contarNo(id)})</span>\n </button>\n ))}\n </div>\n\n <div className=\"pos-arr__cols\">\n <div className=\"pos-arr__left\">\n {/* A FAIXA: «da mesa 1 até a 50» põe cinquenta de uma vez.\n Sem ela, montar um ambiente de cem mesas é cem toques. */}\n <div className=\"pos-arr__faixa\">\n <label className=\"pos-insp__f\">\n <span className=\"pos-insp__l\">Da mesa</span>\n <input inputMode=\"numeric\" value={de} onChange={(e) => setDe(e.target.value)} />\n </label>\n <label className=\"pos-insp__f\">\n <span className=\"pos-insp__l\">até a mesa</span>\n <input inputMode=\"numeric\" value={ate} onChange={(e) => setAte(e.target.value)} />\n </label>\n <button className=\"pos-btn pos-btn--ghost\" disabled={!ativo || !de} onClick={aplicarFaixa}>\n Colocar em {ativo ? nomeDoAmbiente.get(ativo) : '…'}\n </button>\n </div>\n\n <div className=\"pos-arr__lhead\">\n <span className=\"pos-dsc__lbl\">\n {listaAtiva.length} mesa(s) em {ativo ? nomeDoAmbiente.get(ativo) : '…'}\n </span>\n <button\n className=\"pos-insp__detach\"\n disabled={!ativo || listaAtiva.length === 0}\n onClick={() => ativo && setRascunho((p) => clearArea(p, ordenadas, ativo))}\n >\n Tirar todas\n </button>\n </div>\n\n <ul className=\"pos-arr__chips\">\n {listaAtiva.map((t) => (\n <li key={t.id}>\n <button\n className=\"pos-arr__chip\"\n onClick={() => ativo && setRascunho((p) => toggleTable(p, t, ativo))}\n >\n {tableLabel(t)} <X size={12} strokeWidth={2.6} aria-hidden />\n </button>\n </li>\n ))}\n </ul>\n </div>\n\n <div className=\"pos-arr__right\">\n <div className=\"pos-arr__busca\">\n <Search size={14} strokeWidth={2.2} aria-hidden />\n <input\n value={busca}\n onChange={(e) => setBusca(e.target.value)}\n placeholder=\"Buscar mesa…\"\n aria-label=\"Buscar mesa\"\n />\n </div>\n <ul className=\"pos-arr__todas\">\n {visiveis.map((t) => {\n const onde = effectiveArea(t, rascunho)\n return (\n <li key={t.id}>\n <button\n className=\"pos-arr__row\"\n aria-pressed={onde === ativo}\n disabled={!ativo}\n onClick={() => ativo && setRascunho((p) => toggleTable(p, t, ativo))}\n >\n <span className=\"pos-arr__check\" aria-hidden>{onde === ativo ? '✓' : ''}</span>\n <span className=\"pos-arr__rn\">{tableLabel(t)}</span>\n {/* ONDE ela está hoje: sem isto, pôr uma mesa numa\n praça tira ela de outra sem nada dizer. */}\n <span className=\"pos-arr__rw\">\n {onde ? nomeDoAmbiente.get(onde) ?? '—' : 'fora da planta'}\n </span>\n </button>\n </li>\n )\n })}\n </ul>\n </div>\n </div>\n\n {/* A PRÉVIA, no pé: é ela que evita a surpresa. */}\n {previa.length > 0 && (\n <ul className=\"pos-arr__previa\">\n {previa.map((p) => (\n <li key={p.area.id} data-cresce={!p.fits && aumentar ? '' : undefined}>\n {!p.fits && aumentar && <TriangleAlert size={12} strokeWidth={2.4} aria-hidden />}\n {previewLine(p, aumentar)}\n </li>\n ))}\n </ul>\n )}\n </div>\n )}\n\n <div className=\"pos-sheet__foot\">\n {etapa === 1 ? (\n <>\n <button className=\"pos-btn pos-btn--ghost\" onClick={onCancel}>Cancelar</button>\n {/* SEM ambiente marcado o botão não morre: ele faz a coisa útil\n que o V1 tem num botão próprio — «Só pôr os ambientes lado a\n lado». É o único caminho quando os ambientes estão todos\n empilhados na origem, que é exatamente quando o cadeado do\n desenho de praça está ligado; deixá-lo desligado mandava o\n operador para um diálogo sem saída.\n\n O cabeçalho deste arquivo já PROMETIA isto («sem ambiente\n marcado ele ainda faz uma coisa útil»), e o código não\n cumpria. */}\n {escolhidos.length === 0 ? (\n <button className=\"pos-btn\" disabled={salvando} onClick={() => void soEspalhar()}>\n {salvando ? 'Organizando…' : 'Só pôr os ambientes lado a lado'}\n </button>\n ) : (\n <button\n className=\"pos-btn\"\n onClick={() => { setEtapa(2); setAtivo(escolhidos[0] ?? null) }}\n >\n Continuar <ArrowRight size={15} strokeWidth={2.4} aria-hidden />\n </button>\n )}\n </>\n ) : (\n <>\n <button className=\"pos-btn pos-btn--ghost\" onClick={() => setEtapa(1)}>Voltar</button>\n <button className=\"pos-btn\" disabled={salvando} onClick={() => void confirmar()}>\n {salvando ? 'Organizando…' : `Organizar ${escolhidos.length} ambiente(s)`}\n </button>\n </>\n )}\n </div>\n </div>\n </SheetLayer>\n )\n}\n","// ---------------------------------------------------------------------------\n// A ficha do AMBIENTE selecionado.\n//\n// Portada de `AmbienteInspector` do V1. É a mais curta das três fichas, e de\n// propósito: o ambiente é a parede. Nome, cor, e um caminho para o contorno —\n// que é a única coisa aqui que se mede.\n//\n// A linha do subtítulo traz a POSIÇÃO no mundo (`em (15.9, −1.3)`), que\n// nenhuma outra ficha traz. Ela é o que permite conferir se dois ambientes\n// estão encostados ou sobrepostos sem sair da planta.\n// ---------------------------------------------------------------------------\n\nimport { useEffect, useState } from 'react'\nimport { Crosshair, PencilRuler } from 'lucide-react'\nimport { haptic } from '../lib/haptics'\nimport { ZONE_COLORS } from './zoneDraft'\n\nexport interface InspectorArea {\n id: string\n name: string\n color?: string | null\n /** A caixa no mundo, em metros. */\n x: number\n y: number\n w: number\n h: number\n}\n\nexport function AreaInspector({ area, tables, onRename, onRecolor, onZoom, onEditOutline }: {\n area: InspectorArea\n tables: number\n onRename: (name: string) => void\n onRecolor: (color: string) => void\n onZoom?: () => void\n onEditOutline?: () => void\n}) {\n const [nome, setNome] = useState(area.name)\n useEffect(() => { setNome(area.name) }, [area.id, area.name])\n\n return (\n <div className=\"pos-insp\">\n <div className=\"pos-insp__head\">\n <span>\n <span className=\"pos-t-xs\">Ambiente</span>\n <strong className=\"pos-insp__t\">{area.name}</strong>\n <span className=\"pos-insp__where\">\n {tables} mesa(s) · {area.w.toFixed(1)} × {area.h.toFixed(1)} m ·\n {' '}em ({area.x.toFixed(1)}, {area.y.toFixed(1)})\n </span>\n </span>\n {onZoom && (\n <button className=\"pos-insp__zoom\" onClick={() => { haptic('tap'); onZoom() }}>\n <Crosshair size={13} strokeWidth={2.3} aria-hidden /> Aproximar\n </button>\n )}\n </div>\n\n <label className=\"pos-insp__f\">\n <span className=\"pos-insp__l\">Nome</span>\n <input\n value={nome}\n onChange={(e) => setNome(e.target.value)}\n // Nome vazio volta ao que era: um ambiente sem nome some das abas\n // do «Organizar» e da bandeja, e o operador perde o destino.\n onBlur={() => {\n const v = nome.trim()\n if (v && v !== area.name) onRename(v)\n else setNome(area.name)\n }}\n />\n </label>\n\n <div className=\"pos-insp__f\">\n <span className=\"pos-insp__l\">Cor</span>\n <div className=\"pos-insp__cores\">\n {ZONE_COLORS.map((c) => (\n <button\n key={c}\n type=\"button\"\n className=\"pos-insp__cor\"\n aria-label={`Cor ${c}`}\n aria-pressed={area.color === c}\n style={{ background: c }}\n onClick={() => { haptic('tap'); onRecolor(c) }}\n />\n ))}\n </div>\n </div>\n\n {onEditOutline && (\n <button className=\"pos-insp__detach pos-insp__outline\" onClick={() => { haptic('tap'); onEditOutline() }}>\n <PencilRuler size={13} strokeWidth={2.3} aria-hidden /> Editar contorno (tamanho / formato)\n </button>\n )}\n\n <p className=\"pos-insp__hint\">\n Arraste o ambiente no palco para posicioná-lo. As mesas vão junto.\n </p>\n </div>\n )\n}\n","// ---------------------------------------------------------------------------\n// «De quem são estas mesas?» — o escopo do salão.\n//\n// Portado de `FloorScopeBanner.tsx` do V1. A regra tem TRÊS casos, e o\n// terceiro é o que se esquece: **não mostrar nada**.\n// ---------------------------------------------------------------------------\n\nexport interface FloorScope {\n /** A ficha de pessoa de quem está logado. `null` = login sem ficha. */\n staffId?: string | null\n /** As praças atribuídas a essa pessoa AGORA. */\n areaIds: string[]\n /** As mesas escaladas diretamente para ela. */\n directTableIds: string[]\n}\n\nexport type ScopeNotice =\n | { kind: 'none' }\n | { kind: 'no-assignment'; text: string }\n | { kind: 'scoped'; description: string; seeingAll: boolean; text: string }\n\nconst SEM_ESCALA = 'Sem praça atribuída a você agora: vendo todas as mesas.'\n\n/**\n * O aviso que a tela deve mostrar — ou nenhum.\n *\n * Os três casos, na ordem em que o V1 os resolve:\n *\n * 1. **Login sem ficha de pessoa** (gerente por login, dono): NADA. *\"Não há\n * escala possível, e um aviso aqui seria ruído em toda tela.\"*\n * 2. **Casa sem praça desenhada**: NADA. *\"sem praça desenhada, nada muda\n * para ninguém.\"*\n * 3. **Pessoa sem vínculo vigente**: \"vendo todas\" — e a decisão do V1 é\n * explícita: *ninguém fica sem mesa por falta de escala*. O contrário\n * (esconder tudo) deixaria o garçom sem trabalho por um cadastro que\n * alguém esqueceu de fazer.\n */\nexport function scopeNotice(\n scope: FloorScope | null,\n areas: Array<{ id: string; name: string }>,\n seeingAll: boolean,\n): ScopeNotice {\n if (!scope || scope.staffId == null) return { kind: 'none' }\n const temVinculo = scope.areaIds.length > 0 || scope.directTableIds.length > 0\n if (!temVinculo && areas.length === 0) return { kind: 'none' }\n if (!temVinculo) return { kind: 'no-assignment', text: SEM_ESCALA }\n\n const description = scopeDescription(scope, areas)\n return {\n kind: 'scoped',\n description,\n seeingAll,\n text: seeingAll\n ? `Vendo todas as mesas. As suas (${description}) ficam em destaque.`\n : `Você está vendo só ${description}.`,\n }\n}\n\n/**\n * «a praça Salão» · «as praças A, B» · «3 mesas escaladas para você», unidos\n * por \" e \". Sem nada reconhecível, cai para \"as suas mesas\" — o aviso existe\n * para dizer de quem é o salão, e um aviso sem sujeito não diz nada.\n */\nexport function scopeDescription(\n scope: FloorScope,\n areas: Array<{ id: string; name: string }>,\n): string {\n const nomes = areas.filter((a) => scope.areaIds.includes(a.id)).map((a) => a.name)\n const diretas = scope.directTableIds.length\n const partes: string[] = []\n if (nomes.length) partes.push(nomes.length === 1 ? `a praça ${nomes[0]}` : `as praças ${nomes.join(', ')}`)\n if (diretas) partes.push(`${diretas} mesa${diretas > 1 ? 's' : ''} escalada${diretas > 1 ? 's' : ''} para você`)\n return partes.join(' e ') || 'as suas mesas'\n}\n\n/** A mesa está no escopo de quem olha? Sem escopo, todas estão. */\nexport function inScope(\n tableId: string,\n tableAreaIds: string[],\n scope: FloorScope | null,\n): boolean {\n if (!scope || scope.staffId == null) return true\n if (scope.areaIds.length === 0 && scope.directTableIds.length === 0) return true\n if (scope.directTableIds.includes(tableId)) return true\n return tableAreaIds.some((a) => scope.areaIds.includes(a))\n}\n","// ---------------------------------------------------------------------------\n// O aviso de escopo, acima do salão.\n//\n// Portado de `beautyplace/src/components/salao/FloorScopeBanner.tsx`. A regra\n// mora em `floorScope.ts` com testes — aqui é só o desenho.\n// ---------------------------------------------------------------------------\n\nimport { Eye, EyeOff, MapPinOff } from 'lucide-react'\nimport { scopeNotice, type FloorScope } from './floorScope'\nimport { haptic } from '../lib/haptics'\n\nexport function FloorScopeBanner({ scope, areas, seeingAll, onSeeAll }: {\n scope: FloorScope | null\n areas: Array<{ id: string; name: string }>\n seeingAll: boolean\n onSeeAll: (v: boolean) => void\n}) {\n const aviso = scopeNotice(scope, areas, seeingAll)\n if (aviso.kind === 'none') return null\n\n if (aviso.kind === 'no-assignment') {\n return (\n <p className=\"pos-scope pos-scope--none\" role=\"status\">\n <MapPinOff size={13} strokeWidth={2.2} aria-hidden />\n {aviso.text}\n </p>\n )\n }\n\n return (\n <p className=\"pos-scope\" role=\"status\">\n {seeingAll\n ? <Eye size={13} strokeWidth={2.2} aria-hidden />\n : <EyeOff size={13} strokeWidth={2.2} aria-hidden />}\n <span className=\"pos-scope__t\">{aviso.text}</span>\n <button className=\"pos-scope__b\" onClick={() => { haptic('tap'); onSeeAll(!seeingAll) }}>\n {seeingAll ? 'Só as minhas' : 'Ver todas'}\n </button>\n </p>\n )\n}\n","// ---------------------------------------------------------------------------\n// O CONTORNO do ambiente: retângulo, ou polígono desenhado ponto a ponto.\n//\n// Portado de `SectionEditor` do V1. E o gesto aqui é DIFERENTE do da praça, o\n// que é fácil de perder ao portar os dois no mesmo dia:\n//\n// - a **praça** se desenha num traço contínuo, e nasce ao soltar;\n// - o **ambiente** se desenha CLIQUE A CLIQUE, e fecha quando o dedo volta\n// ao primeiro ponto.\n//\n// São dois gestos porque são duas coisas: a praça é um recorte que se ajusta\n// no dia a dia; o ambiente é a parede, e parede se mede.\n//\n// A regra mais cara do arquivo não é geometria, é escopo — ver `outlinePatch`.\n// ---------------------------------------------------------------------------\n\nimport { polygonArea, type Point } from './floorGeometry'\n\n/** O V1 fecha o polígono a 15px de um canvas de 40px/m. */\nexport const CLOSE_RADIUS_M = 15 / 40\n\nexport type AreaShape = 'rectangle' | 'polygon'\n\nexport interface OutlineDraft {\n name: string\n color: string\n shape: AreaShape\n widthM: number\n heightM: number\n polygon: Point[]\n closed: boolean\n}\n\nconst r2 = (v: number) => Math.round(v * 100) / 100\n\n/**\n * O clique no canvas: acrescenta um ponto, ou FECHA o contorno.\n *\n * Fecha só com três pontos já postos — dois pontos e uma volta não cercam\n * nada — e só se o toque cair perto do primeiro. Devolve o rascunho novo, ou\n * o mesmo objeto quando o clique não muda nada (contorno já fechado).\n */\nexport function addOutlinePoint(\n polygon: Point[], closed: boolean, p: Point, closeRadiusM = CLOSE_RADIUS_M,\n): { polygon: Point[]; closed: boolean } {\n if (closed) return { polygon, closed }\n if (polygon.length >= 3) {\n const first = polygon[0]\n if (Math.hypot(first.x - p.x, first.y - p.y) < closeRadiusM) {\n return { polygon, closed: true }\n }\n }\n return { polygon: [...polygon, { x: r2(p.x), y: r2(p.y) }], closed: false }\n}\n\n/** Desfaz o último ponto. Desfazer também REABRE um contorno fechado. */\nexport function undoOutlinePoint(\n polygon: Point[], closed: boolean,\n): { polygon: Point[]; closed: boolean } {\n if (closed) return { polygon, closed: false }\n return { polygon: polygon.slice(0, -1), closed: false }\n}\n\n/**\n * O que impede de salvar — com as palavras do V1.\n *\n * `null` quando pode salvar.\n */\nexport function outlineRefusal(d: Pick<OutlineDraft, 'name' | 'shape' | 'polygon'>): string | null {\n if (!d.name.trim()) return 'Informe o nome'\n if (d.shape === 'polygon' && d.polygon.length < 3) return 'Desenhe ao menos 3 pontos'\n if (d.shape === 'polygon' && polygonArea(d.polygon) <= 0) return 'O contorno ficaria sem área.'\n return null\n}\n\nexport interface OutlinePatch {\n name: string\n color: string\n shape: AreaShape\n widthM: number\n heightM: number\n polygon: Point[] | null\n}\n\n/**\n * O patch — SÓ o que este diálogo edita.\n *\n * Duas coisas, e as duas vêm de erro real no V1:\n *\n * 1. **O polígono vira `null` quando a forma volta a retângulo.** Guardá-lo\n * \"por via das dúvidas\" deixa um contorno velho que a próxima leitura\n * pode preferir à largura e ao comprimento.\n *\n * 2. **`tenant_id` e `unit_id` NÃO entram.** O comentário do V1 é literal:\n * *\"editar um ambiente com outra unidade selecionada no topo da tela o\n * carregava para essa unidade, com todas as mesas dentro.\"* Um campo a\n * mais no update mudou o dono de um salão inteiro.\n */\nexport function outlinePatch(d: OutlineDraft): OutlinePatch {\n return {\n name: d.name.trim(),\n color: d.color,\n shape: d.shape,\n widthM: d.widthM,\n heightM: d.heightM,\n polygon: d.shape === 'polygon' ? d.polygon : null,\n }\n}\n","// ---------------------------------------------------------------------------\n// «Editar contorno (tamanho / formato)».\n//\n// Portada do `SectionEditor` do V1 — a metade que desenha. A outra metade\n// dele, a aba «Equipe», o próprio V1 removeu, e o comentário explica: ela\n// gravava numa tabela que nenhuma tela lia, e o garçom continuava vendo o\n// salão inteiro. Quem atende se define por PRAÇA.\n//\n// O canvas é em METROS, com a grade de 1 m visível: é o que transforma\n// \"desenhe o salão\" em \"meça o salão\". E o gesto é clique a clique, não\n// traço — a parede se mede, a praça se rabisca.\n// ---------------------------------------------------------------------------\n\nimport { useMemo, useState } from 'react'\nimport { PencilRuler, Undo2, Trash2, X } from 'lucide-react'\nimport {\n addOutlinePoint, outlinePatch, outlineRefusal, undoOutlinePoint,\n type AreaShape, type OutlineDraft, type OutlinePatch,\n} from './areaOutline'\nimport type { Point } from './floorGeometry'\nimport { ZONE_COLORS } from './zoneDraft'\nimport { SheetLayer } from './SheetLayer'\n\n/** Pixels por metro do canvas, como no V1. */\nconst PX = 40\n\nconst FORMATOS: Array<{ id: AreaShape; label: string }> = [\n { id: 'rectangle', label: 'Retangular' },\n { id: 'polygon', label: 'Formato livre (desenhar)' },\n]\n\nexport function AreaOutlineSheet({ area, onCancel, onSave }: {\n area: {\n name: string\n color?: string | null\n shape?: string | null\n widthM?: number | null\n heightM?: number | null\n polygon?: Point[] | null\n }\n onCancel: () => void\n onSave: (patch: OutlinePatch) => void | Promise<void>\n}) {\n const [draft, setDraft] = useState<OutlineDraft>(() => ({\n name: area.name,\n color: area.color ?? ZONE_COLORS[0],\n shape: area.shape === 'polygon' ? 'polygon' : 'rectangle',\n widthM: Number(area.widthM) || 8,\n heightM: Number(area.heightM) || 6,\n polygon: area.polygon ?? [],\n closed: (area.polygon?.length ?? 0) >= 3,\n }))\n const [salvando, setSalvando] = useState(false)\n\n const impedimento = outlineRefusal(draft)\n const livre = draft.shape === 'polygon'\n\n // O canvas acompanha a MEDIDA no retângulo, e é fixo no formato livre —\n // onde ainda não há medida para acompanhar.\n const canvas = livre\n ? { w: 640, h: 440 }\n : { w: Math.max(160, draft.widthM * PX), h: Math.max(120, draft.heightM * PX) }\n\n const grade = useMemo(() => {\n const linhas: Array<{ x1: number; y1: number; x2: number; y2: number }> = []\n for (let x = PX; x < canvas.w; x += PX) linhas.push({ x1: x, y1: 0, x2: x, y2: canvas.h })\n for (let y = PX; y < canvas.h; y += PX) linhas.push({ x1: 0, y1: y, x2: canvas.w, y2: y })\n return linhas\n }, [canvas.w, canvas.h])\n\n const clicarNoCanvas = (e: React.MouseEvent<SVGSVGElement>) => {\n if (!livre) return\n const r = e.currentTarget.getBoundingClientRect()\n const p: Point = { x: (e.clientX - r.left) / PX, y: (e.clientY - r.top) / PX }\n setDraft((d) => ({ ...d, ...addOutlinePoint(d.polygon, d.closed, p) }))\n }\n\n const medida = (texto: string, campo: 'widthM' | 'heightM') => {\n const v = Number(texto.replace(',', '.'))\n if (Number.isFinite(v) && v > 0) setDraft((d) => ({ ...d, [campo]: v }))\n }\n\n return (\n <SheetLayer>\n <div className=\"pos-sheet__scrim\" onClick={salvando ? undefined : onCancel} aria-hidden />\n <div className=\"pos-sheet__panel pos-sheet__panel--wide\" role=\"dialog\" aria-label=\"Editar contorno\" aria-modal>\n <div className=\"pos-sheet__head\">\n <span>\n <h2 className=\"pos-sheet__title\">\n <PencilRuler size={18} strokeWidth={2.2} aria-hidden />\n Editar ambiente\n </h2>\n <p className=\"pos-sheet__sub\">\n A área física do salão, em metros. Quem atende cada área se define\n na planta baixa, por praça.\n </p>\n </span>\n <button className=\"pos-sheet__x\" onClick={onCancel} aria-label=\"Fechar\"><X size={20} /></button>\n </div>\n\n <div className=\"pos-sheet__body pos-out__cols\">\n <div className=\"pos-out__form\">\n <label className=\"pos-insp__f\">\n <span className=\"pos-insp__l\">Nome</span>\n <input\n value={draft.name}\n placeholder=\"Ex.: Varanda, VIP…\"\n onChange={(e) => setDraft((d) => ({ ...d, name: e.target.value }))}\n />\n </label>\n\n <div className=\"pos-insp__f\">\n <span className=\"pos-insp__l\">Cor</span>\n <div className=\"pos-insp__cores\">\n {ZONE_COLORS.map((c) => (\n <button\n key={c} type=\"button\" className=\"pos-insp__cor\"\n aria-label={`Cor ${c}`} aria-pressed={draft.color === c}\n style={{ background: c }}\n onClick={() => setDraft((d) => ({ ...d, color: c }))}\n />\n ))}\n </div>\n </div>\n\n <div className=\"pos-insp__f\">\n <span className=\"pos-insp__l\">Formato</span>\n <div className=\"pos-out__formas\">\n {FORMATOS.map((f) => (\n <button\n key={f.id} className=\"pos-out__forma\"\n aria-pressed={draft.shape === f.id}\n onClick={() => setDraft((d) => ({ ...d, shape: f.id }))}\n >\n {f.label}\n </button>\n ))}\n </div>\n </div>\n\n {/* A FORMA muda a forma do diálogo: medidas viram instruções. */}\n {livre ? (\n <>\n <p className=\"pos-insp__hint\">\n Clique no canvas para adicionar pontos (em metros). Clique no\n primeiro ponto novamente para fechar o polígono.\n </p>\n <div className=\"pos-out__tools\">\n <button\n className=\"pos-btn pos-btn--ghost\"\n disabled={draft.polygon.length === 0}\n onClick={() => setDraft((d) => ({ ...d, ...undoOutlinePoint(d.polygon, d.closed) }))}\n >\n <Undo2 size={14} strokeWidth={2.3} aria-hidden /> Desfazer\n </button>\n <button\n className=\"pos-btn pos-btn--ghost\"\n disabled={draft.polygon.length === 0}\n onClick={() => setDraft((d) => ({ ...d, polygon: [], closed: false }))}\n >\n <Trash2 size={14} strokeWidth={2.3} aria-hidden /> Limpar\n </button>\n </div>\n <p className=\"pos-out__count\">\n <strong className=\"pos-num\">{draft.polygon.length}</strong> ponto(s)\n {draft.closed ? ' · fechado' : ''}\n </p>\n </>\n ) : (\n <div className=\"pos-insp__row\">\n <label className=\"pos-insp__f\">\n <span className=\"pos-insp__l\">Largura (m)</span>\n <input\n inputMode=\"decimal\" defaultValue={String(draft.widthM)}\n onBlur={(e) => medida(e.target.value, 'widthM')}\n />\n </label>\n <label className=\"pos-insp__f\">\n <span className=\"pos-insp__l\">Comprimento (m)</span>\n <input\n inputMode=\"decimal\" defaultValue={String(draft.heightM)}\n onBlur={(e) => medida(e.target.value, 'heightM')}\n />\n </label>\n </div>\n )}\n </div>\n\n <div className=\"pos-out__canvas\">\n <svg\n width={canvas.w} height={canvas.h}\n viewBox={`0 0 ${canvas.w} ${canvas.h}`}\n onClick={clicarNoCanvas}\n style={{ cursor: livre && !draft.closed ? 'crosshair' : 'default' }}\n role=\"img\"\n aria-label={livre ? 'Canvas do contorno, em metros' : 'Prévia do ambiente retangular'}\n >\n {/* A grade de 1 m é o que torna o canvas uma RÉGUA. */}\n {grade.map((l, i) => (\n <line key={i} {...l} stroke=\"var(--pos-line)\" strokeWidth={1} />\n ))}\n {livre ? (\n <>\n {draft.polygon.length >= 2 && (\n <polygon\n points={draft.polygon.map((p) => `${p.x * PX},${p.y * PX}`).join(' ')}\n fill={draft.color} fillOpacity={0.16}\n stroke={draft.color} strokeWidth={2}\n strokeDasharray={draft.closed ? undefined : '6 4'}\n strokeLinejoin=\"round\"\n />\n )}\n {draft.polygon.map((p, i) => (\n <circle\n key={i} cx={p.x * PX} cy={p.y * PX} r={5}\n // O PRIMEIRO ponto é um anel vazado: é nele que fecha, e\n // sem a distinção o operador não sabe para onde voltar.\n fill={i === 0 ? 'var(--pos-1)' : draft.color}\n stroke={draft.color} strokeWidth={2}\n />\n ))}\n </>\n ) : (\n <rect\n x={0} y={0} width={canvas.w} height={canvas.h}\n fill={draft.color} fillOpacity={0.16}\n stroke={draft.color} strokeWidth={2}\n />\n )}\n </svg>\n </div>\n </div>\n\n <div className=\"pos-sheet__foot\">\n <button className=\"pos-btn pos-btn--ghost\" onClick={onCancel}>Cancelar</button>\n <button\n className=\"pos-btn\"\n disabled={!!impedimento || salvando}\n onClick={async () => {\n setSalvando(true)\n try { await onSave(outlinePatch(draft)) } finally { setSalvando(false) }\n }}\n >\n {salvando ? 'Salvando…' : 'Salvar ambiente'}\n </button>\n </div>\n\n {impedimento && <p className=\"pos-sheet__why\" data-error=\"\">{impedimento}</p>}\n </div>\n </SheetLayer>\n )\n}\n","// ---------------------------------------------------------------------------\n// O QUE O OPERADOR LÊ quando a gravação falha.\n//\n// O V1 nunca mostra a resposta do servidor. Ele traduz um código por vez —\n// `courtesyErrorMessage`, `cancellationErrorMessage`,\n// `supervisorAuthorizationMessage` — e o `default` cai numa frase escrita para\n// gente. Nada de banco chega à tela.\n//\n// O V2 grava PELA TABELA, então não há código nenhum para traduzir: o que\n// volta do PostgREST é a mensagem do Postgres, em inglês e com o nome da\n// tabela dentro. Hoje ela aparece inteira na folha:\n//\n// new row violates row-level security policy for table \"plg_tables_courtesies\"\n//\n// O garçom não tem o que fazer com essa frase. Ela não diz o que ele tentou,\n// não diz o que falta, e ensina que o sistema quebra em vez de recusar — que é\n// a diferença entre chamar o gerente e chamar o suporte.\n//\n// Então: **o técnico vai para o console, o humano vai para a tela.** As\n// situações que o V1 nomeia usam as palavras dele; o resto usa uma frase só,\n// que diz o que aconteceu e que o detalhe ficou registrado.\n// ---------------------------------------------------------------------------\n\n/**\n * As marcas do que veio do banco ou da rede, e não de nós.\n *\n * Todas em inglês, porque o Postgres e o `fetch` só falam inglês: uma mensagem\n * NOSSA está em português e passa direto. É a inversão que evita traduzir\n * duas vezes a frase que já estava certa.\n */\nconst TECNICO = [\n 'violates', 'permission denied', 'duplicate key', 'does not exist',\n 'invalid input syntax', 'null value in column', 'constraint',\n 'relation ', 'column ', 'JWT', 'jwt', 'JSON object requested',\n 'Failed to fetch', 'NetworkError', 'fetch failed', 'Load failed',\n 'row-level security', 'syntax error',\n]\n\nexport function isTechnical(message: string): boolean {\n return TECNICO.some((m) => message.includes(m))\n}\n\n/** A frase genérica. Não pede para tentar de novo: pode ter gravado. */\nexport const WRITE_FAILED =\n 'Não foi possível concluir a operação. Confira a comanda antes de repetir.'\n\n/** A rede caiu — e aí repetir é seguro, porque nada chegou ao servidor. */\nexport const OFFLINE_FAILED =\n 'Sem conexão com o servidor. Verifique a rede e tente novamente.'\n\n/**\n * As duas situações que o V1 nomeia e que o V2 também alcança escrevendo\n * direto. As frases são dele, palavra por palavra.\n */\nexport const ALREADY_DONE =\n 'A tentativa foi reutilizada com dados diferentes. Feche e abra a operação novamente.'\nexport const NOT_ALLOWED =\n 'Você não tem permissão para esta operação. Peça a um gerente.'\n\n/**\n * A frase para a tela, e o que registrar no console.\n *\n * `technical` é `undefined` quando a mensagem já era nossa — aí ela vai para a\n * tela como está e não há nada a registrar.\n */\nexport function writeFailure(error: unknown): { text: string; technical?: string } {\n const cru = error instanceof Error ? error.message\n : typeof error === 'string' ? error\n : ''\n if (!cru) return { text: WRITE_FAILED, technical: String(error) }\n if (!isTechnical(cru)) return { text: cru }\n\n if (/Failed to fetch|NetworkError|fetch failed|Load failed/.test(cru)) {\n return { text: OFFLINE_FAILED, technical: cru }\n }\n if (cru.includes('duplicate key')) return { text: ALREADY_DONE, technical: cru }\n if (/row-level security|permission denied/.test(cru)) {\n return { text: NOT_ALLOWED, technical: cru }\n }\n return { text: WRITE_FAILED, technical: cru }\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, Circle, ClipboardList, ConciergeBell, Keyboard,\n LayoutGrid, Map as MapIcon, Store, ChevronDown, ChevronUp, type LucideIcon, MoreHorizontal, Pencil, PenLine, Receipt, Search, Settings2, ShoppingBag, Square,\n UserRound, UtensilsCrossed, X,\n} from 'lucide-react'\nimport { needsAutoLayout } from './floorGeometry'\nimport { isCancelable } from './cancelCheck'\nimport { viewListsOpenOrders } from './dockScope'\nimport { allowsCourtesyForChannel, courtesyBlockReason, type CourtesyChannel } from './courtesyGate'\nimport { searchPlaceholder, tableMatches, viewIsSearchable } from './searchSubject'\nimport { isDiscardable } from './discardCheck'\nimport { TableInspector, type TablePatch } from './TableInspector'\nimport { UnassignedTables } from './UnassignedTables'\nimport { TABLE_SHAPE_DIMS } from './floorGeometry'\nimport type {\n DispatchStatus, PickedModifier, PosAction, PosAppConfig, PosCategory, PosItem,\n PosMenu, PosPosition, PosReservation, PosStaff, PosTone, ReservationStatus,\n} from '../app/config'\nimport { ATRASO_MINUTOS } from './tableTone'\nimport { createKeymap } from '../keyboard'\nimport { directionOf, moveFocus } from '../keyboard'\nimport { accountFitsMethod, methodAsksAccount } from './accountFit'\nimport { brandList, keepBrand } from './cardBrand'\nimport { haptic } from '../lib/haptics'\nimport { formatCents } from './money'\nimport {\n bookReducer, countsOf, ticketAt, totalsOf,\n type Ticket, type TicketAction, type TicketBook, type TicketGuest, type TicketLine, type TicketTotals,\n} from './session'\nimport { channelSwitchDropsPosition, currentChannelId, ticketSlot } from './channelSlot'\nimport { closedBelongsToChannel, type ComandaChannel } from './comandaChannel'\nimport { effectiveServicePercent } from './serviceChargeGuard'\nimport type { PaymentRow } from './paymentList'\nimport { TicketRail, type OrderCover } from './TicketRail'\nimport type { GuestDraft } from './GuestBar'\nimport type { ClosedTicket } from './ClosedPanel'\nimport type { FiscalSeal } from './fiscalSeal'\nimport { CatalogSkeleton, CatalogView, FloorSkeleton, FloorView, ShiftView, briefElapsed, dockAmountCents, elapsed } from './views'\nimport { menuFreshnessLabel } from './menuFreshness'\nimport { DeliveryBoard } from './DeliveryBoard'\nimport { DispatchRail } from './DispatchRail'\nimport { ShortcutsOverlay } from './ShortcutsOverlay'\nimport { ReservationsView } from './ReservationsView'\nimport { WaitlistView } from './WaitlistView'\nimport { WaitlistEntrySheet } from './WaitlistEntrySheet'\nimport { noTableFitsMessage, seatableTables, type NewWaitlistEntry, type WaitlistEntry } from './waitlist'\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'\nimport { pinGate } from './pinGate'\nimport { FLOOR_STALE_WARNING, FLOOR_STALE_RETRY } from './floorStale'\nimport { nextZoneColor, type ZoneDraft, type ZoneFields, type ZoneTool } from './zoneDraft'\nimport type { ZoneGeometry } from './zoneEditing'\nimport { ZoneInspector, type InspectorZone } from './ZoneInspector'\nimport { ArrangeSheet } from './ArrangeSheet'\nimport { AreaInspector } from './AreaInspector'\nimport { FloorScopeBanner } from './FloorScopeBanner'\nimport { inScope, type FloorScope } from './floorScope'\nimport { AreaOutlineSheet } from './AreaOutlineSheet'\nimport type { OutlinePatch } from './areaOutline'\nimport { placeAreas } from './floorGeometry'\nimport { writeFailure } from './writeFailure'\nimport type { ArrangementPlan, PlanArea, PlanTable } from './arrangePlan'\nimport { tableDims } from './floorGeometry'\n\n/**\n * As três ferramentas de praça, com os rótulos do V1.\n *\n * `Square`/`Circle`/`PenLine` são os mesmos ícones de lá — o operador que\n * troca de versão reconhece a barra sem reaprender.\n */\nconst ZONE_TOOLS: Array<{ id: ZoneTool; label: string; Icon: LucideIcon }> = [\n { id: 'rectangle', label: 'Praça retangular', Icon: Square },\n { id: 'ellipse', label: 'Praça redonda', Icon: Circle },\n { id: 'polygon', label: 'Praça à mão livre', Icon: PenLine },\n]\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 * QUEM está pagando agora. Vazio = a comanda inteira.\n *\n * A tela de fechamento deixa marcar uma parte das contas, e essa escolha\n * mudava o total À VISTA e mais nada: o gesto terminava com `onClose()` sem\n * argumento, e quem recebia a conta cobrava sempre o valor cheio. Marcar um\n * de quatro mostrava R$ 40 e fechava R$ 160 — sem aviso.\n */\n guestIds?: string[]\n /**\n * O que se está cobrando NESTE gesto, em centavos.\n *\n * `totals.totalCents` é a comanda inteira e continua aqui: quem fecha\n * precisa saber as duas coisas — quanto a mesa deve e quanto entrou agora —\n * para decidir se a conta zerou. Confundir as duas é fechar mesa com saldo.\n */\n amountCents: number\n /**\n * O que a comanda AINDA DEVE, em centavos — o total menos o que já entrou.\n *\n * Não é `totals.totalCents`: uma mesa que já recebeu R$ 179,67 deve menos\n * do que soma. Comparar a cobrança com o total BRUTO acusa de parcial um\n * pagamento que na verdade quita a conta — foi o primeiro jeito que eu\n * escrevi esta regra, e ele recusava o fechamento correto.\n */\n outstandingCents: number\n /**\n * Para ONDE o dinheiro vai — a gaveta, o banco, o recebível do cartão.\n *\n * O razão precisa de um lado de débito, e ele é esta conta. Sem ela,\n * `financial_receive_payment` recusa com \"an account is required for\n * method %\" — e a recusa é justa: dinheiro que entra sem dizer onde é\n * dinheiro que ninguém concilia.\n */\n accountId?: string\n /**\n * Em quantas vezes. `1` é à vista, e é o que o débito sempre é.\n *\n * Vai ao razão junto com a forma: uma venda de 3× não é a mesma coisa que\n * três vendas, e o recebível do cartão só bate com a maquininha se souber\n * em quantas parcelas saiu.\n */\n installments?: number\n /**\n * A bandeira — «Visa», «Alelo».\n *\n * Vai ao razão junto com a forma: a conciliação do mês separa Visa de\n * Mastercard, e sem ela o extrato da adquirente não bate linha a linha.\n */\n cardBrand?: 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 /**\n * A fila de espera — quem chegou sem reserva.\n *\n * Só os ATIVOS (`waiting` e `called`). Quem sentou ou saiu não é fila: é\n * histórico, e ele não disputa a atenção de quem está com o salão cheio.\n */\n waitlist?: WaitlistEntry[]\n /** Pôr alguém na fila. Ausente, o botão «Novo» não aparece. */\n onWaitlistAdd?: (entry: NewWaitlistEntry) => Promise<void> | void\n /** Chamar (e rechamar) — o banco carimba o prazo de tolerância. */\n onWaitlistCall?: (entryId: string) => Promise<void> | void\n /** O grupo sentou na mesa `positionId`, na comanda `orderId`. */\n onWaitlistSeat?: (entryId: string, positionId: string) => Promise<void> | void\n /** Não compareceu ao chamado. Quem decide é o anfitrião, nunca o relógio. */\n onWaitlistNoShow?: (entryId: string) => Promise<void> | void\n /** O telefone já é de alguém? Ver `WaitlistEntrySheet.onLookupPhone`. */\n onWaitlistLookupPhone?: (digits: string) => Promise<{ id: string; name: string } | null>\n /**\n * O check-in da reserva, GRAVADO.\n *\n * Sem ele o estado «Chegou» continua existindo, só que na memória deste\n * terminal — que é como a tela de reservas já se comporta. Com ele, o outro\n * terminal do balcão também vê que o grupo se apresentou, e é essa a razão\n * de o gesto existir: duas pessoas atendendo a mesma porta.\n */\n onReservationArrived?: (reservationId: string) => Promise<void> | void\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 /**\n * Uma ação que o pacote não resolve sozinho.\n *\n * Vai com o CONTEXTO: sem saber de qual comanda a ação partiu, o app abriria\n * a folha de desconto sobre \"a comanda atual\" e acertaria por sorte — o\n * operador troca de mesa entre tocar o botão e a folha subir.\n */\n /** `guestId` só vem quando a ação foi pedida a partir de UM participante —\n * a pastilha de taxa ao lado do nome dele. */\n onAction?: (actionId: string, ctx: { positionId?: string; ticket: Ticket; guestId?: string }) => void\n /**\n * Descartar uma comanda vazia, pela régua do rodapé.\n *\n * O pacote só oferece o gesto onde ele é seguro (comanda de R$ 0,00 e sem\n * mesa); quem apaga no banco é o app.\n */\n onDiscardTicket?: (positionId: string) => void\n /**\n * As pessoas da comanda ativa.\n *\n * Por posição, porque a seleção é DESTA mesa: escolher a Ana na mesa 3 e\n * andar até a 5 não pode continuar lançando na Ana.\n *\n * O app é quem sabe: no salão são os participantes da mesa; no balcão\n * costuma não haver nenhum, e aí a comanda volta a ser uma lista só — que é\n * o comportamento do V1 e o certo para a fila do caixa.\n */\n /**\n * Um painel que toma a COLUNA da direita — hoje a «Escala de hoje».\n *\n * Aberto, ele substitui a comanda e a planta continua à vista: é dela que se\n * escolhe a praça ou a mesa a escalar. Em diálogo, o gesto exigia fechar,\n * olhar e reabrir.\n */\n railPanel?: React.ReactNode\n /** O couvert aplicado a cada comanda — linhas da conta, por posição. */\n coversByPosition?: Record<string, OrderCover[]>\n /**\n * Repartir o couvert por participante — o lápis do V1 na linha dos totais.\n *\n * Recebe a comanda junto porque o escritor precisa saber em qual delas\n * mexer, e o cartão do couvert só carrega o próprio id.\n */\n onEditCover?: (positionId: string, cover: OrderCover) => void\n /** O que já entrou em cada comanda, por pagamento. */\n paymentsByPosition?: Record<string, PaymentRow[]>\n /** Abrir «Número de Pessoas» da comanda corrente. */\n onEditGuestCount?: (positionId: string) => void\n /**\n * Uma posição OCUPADA acabou de ser escolhida.\n *\n * Existe para o app buscar o que ainda não trouxe: a comanda de canal\n * avulsa entra na bandeja com valor e idade, e as LINHAS dela só valem a\n * consulta quando alguém a toca — carregar as onze abertas no boot custaria\n * seis consultas cada.\n */\n onActivatePosition?: (positionId: string) => void\n /** As contas fechadas hoje — o que a coluna mostra sem comanda aberta. */\n closedTickets?: ClosedTicket[]\n /** Reabrir uma conta fechada — ver `reopen.ts`. */\n onReopenClosed?: (t: ClosedTicket) => void\n closedLoading?: boolean\n /** Saiu nota? Por conta fechada — ver `fiscalSeal.ts`. */\n closedSeals?: Record<string, FiscalSeal>\n /** A leitura fiscal falhou. O painel diz isso em vez de pintar tudo de\n * \"sem nota\": num painel que existe para apontar o que falta emitir, não\n * saber e saber que não são coisas diferentes. */\n closedSealsFailed?: boolean\n onOpenClosed?: (id: string) => void\n /**\n * O gesto de SAIR, em dois estágios.\n *\n * O ✕ do canto pertence ao hospedeiro e fecha o PDV inteiro. Mas quem está\n * com a mesa 12 aberta e toca ali quase nunca quer sair do PDV: quer largar\n * a mesa. O PDV registra aqui uma função que CONSOME o gesto quando há o que\n * largar, e devolve `false` quando não há — e aí o hospedeiro fecha, como\n * antes. Sem isto, um toque no canto tira o operador do caixa no meio do\n * serviço, e voltar custa dois gestos e uma tela de carregamento.\n */\n registerEscape?: (fn: () => boolean) => void\n /**\n * Mover uma mesa na planta. Sem isto não há «Editar planta» — o botão que\n * abre um modo sem ação é pior que a ausência dele.\n */\n onMoveTable?: (id: string, to: { x: number; y: number }) => void | Promise<void>\n /** Grava um campo da ficha da mesa. Sem isto a ficha não abre. */\n onUpdateTable?: (id: string, patch: TablePatch) => void | Promise<void>\n /**\n * Cria uma PRAÇA a partir do desenho. Sem isto as três ferramentas somem.\n *\n * Praça não é ambiente: ela é o RECORTE de atendimento, desenhado por cima\n * do chão, e pode cruzar dois ambientes. O vocabulário é contrato — foi\n * chamar uma de outra que fez a casa batizar os ambientes de «Praça 1».\n */\n onCreateZone?: (fields: ZoneFields) => void | Promise<void>\n /** Grava a geometria de uma praça já desenhada — mover, esticar, reformar. */\n onUpdateZone?: (id: string, patch: Partial<ZoneGeometry>) => void | Promise<void>\n /** Põe ou tira uma mesa da praça, à mão. */\n onTogglaMesaNaPraca?: (zoneId: string, tableId: string, how: 'include' | 'exclude' | 'reset') => void\n /** Apaga a praça. As mesas ficam; o que se perde é o recorte. */\n onDeleteZone?: (id: string) => void | Promise<void>\n /**\n * Aplica o plano de «Organizar automaticamente».\n *\n * Vai em LOTE de propósito: cem mesas em cem chamadas fariam o salão andar\n * a conta-gotas na tela e deixariam o banco num meio-termo se uma falhasse.\n */\n onArrange?: (plan: ArrangementPlan) => void | Promise<void>\n /**\n * Grava a ficha e o contorno do AMBIENTE — a parede, não o recorte.\n *\n * Nunca leva unidade nem inquilino: o V1 conta que um campo a mais no\n * update carregou um salão inteiro, com as mesas dentro, para a unidade que\n * estava selecionada no topo da tela.\n */\n onUpdateArea?: (id: string, patch: Partial<OutlinePatch>) => void | Promise<void>\n /**\n * De quem são estas mesas — a escala vigente de quem está logado.\n *\n * Sem ficha de pessoa (`staffId` nulo) a tela não mostra aviso nenhum: não\n * há escala possível, e um aviso em toda tela seria ruído.\n */\n floorScope?: FloorScope | null\n /**\n * A porta para o CADASTRO de mesas — número, lugares, criar em lote.\n *\n * O V1 a põe ao lado do `Simplificada | Planta baixa`, atrás de\n * `restaurant_tables_admin`. Aqui ela só existe quando o app manda o\n * atalho: quem decide a permissão é quem a conhece, e um botão que aparece\n * para negar depois é pior que a ausência dele.\n *\n * É diferente de «Editar planta»: lá se ARRUMA o salão desenhado, aqui se\n * CADASTRA a mesa que ainda não existe.\n */\n onConfigureTables?: () => void\n /**\n * Um controle do app na barra da PLANTA — hoje o \"Escala de hoje\".\n *\n * Vive aqui e não numa ação da comanda porque a pergunta é do salão, não da\n * conta: \"de quem é aquela mesa?\" se responde olhando a planta.\n */\n floorTool?: React.ReactNode\n /**\n * A planta vira um SELETOR.\n *\n * Com a escala aberta, tocar uma mesa escolhe o alvo em vez de abrir a\n * comanda — é o gesto do V1, e é mais direto do que procurar um nome entre\n * duzentos numa lista.\n */\n shiftMode?: boolean\n onPickTarget?: (t: { kind: 'area' | 'table'; id: string; label: string }) => void\n /** Chamado quando a tela sai do modo em que o painel da escala faz sentido. */\n onCloseShift?: () => void\n parties?: Record<string, TicketGuest[]>\n /**\n * A taxa DESTA comanda, quando ela difere da política da casa.\n *\n * A casa tem uma taxa; a mesa pode ter a sua, combinada na hora. O rodapé\n * precisa da taxa da MESA — com a da casa ele mostrava R$ 74,00 numa conta\n * que o banco já tinha fechado em R$ 83,62, e a diferença é o que o cliente\n * vê na maquininha.\n */\n serviceChargeByPosition?: Record<string, number>\n /** Sobrepõe o rótulo da pastilha compartilhada (\"Mesa\"/\"Balcão\"/\"Pedido\"). */\n sharedLabel?: string\n /** Quanto já foi pago em cada comanda, por participante (chave `mesa` = o\n * compartilhado). O rail recebe o da comanda ativa. */\n paidByPosition?: Record<string, Record<string, number>>\n /**\n * Senta mais uma pessoa. A POSIÇÃO vem junto: o app não tem como saber\n * sozinho em que mesa o operador está — quem sabe isso é esta tela.\n */\n /**\n * O cliente da comanda foi identificado.\n *\n * O app decide o que fazer com isso — gravar o nome na comanda e, quando a\n * primeira cadeira ainda não tem dono, dar o nome a ela também.\n */\n onIdentify?: (positionId: string, alias: string, phone?: string) => void | Promise<void>\n onAddGuest?: (draft: GuestDraft, positionId: string) => void | Promise<void>\n onIdentifyGuest?: (id: string, draft: GuestDraft) => void | Promise<void>\n onRemoveGuest?: (id: string) => void | Promise<void>\n onLookupPhone?: (phone: string) => Promise<{ id: string; name: string } | null>\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 /**\n * Por que ESTA ação não pode agora — a regra de NEGÓCIO, que é do app.\n *\n * O pacote sabe que \"não se cancela o que a cozinha não viu\": isso é sobre a\n * comanda e vale em qualquer casa. Mas \"cortesia não existe em retirada nem\n * em delivery, porque esses canais têm jornada própria de pagamento e\n * repasse\" é política do produto — e enfiá-la aqui faria o PDV carregar a\n * regra fiscal de um país dentro de um componente de tela.\n *\n * O que o app devolve VENCE o padrão do pacote: uma casa pode proibir o que\n * o pacote permitiria, e nunca o contrário.\n */\n actionGate?: (actionId: string, ctx: {\n /** O menu aberto — é dele que sai o canal da venda. */\n menuId?: string\n position?: PosPosition\n ticket: Ticket\n }) => string | undefined | false\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 * O mapa do salão não carregou — a mesa «livre» pode não estar.\n *\n * Faixa FIXA enquanto durar, com a frase do V1. Ver `floorStale.ts`.\n */\n /**\n * Há CAIXA ABERTO para quem está no teclado?\n *\n * O sexto motivo do V1 para a cortesia estar bloqueada — «Abra seu caixa para\n * usar a cortesia». `undefined` quer dizer «não sei» e não bloqueia: o app que\n * não lê sessão de caixa não deve negar por um caixa que ninguém conferiu.\n */\n cashOpen?: boolean\n floorStale?: boolean\n /** O «Tentar novamente» da faixa. Sem ele, o botão não aparece. */\n onRetryFloor?: () => void\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 * Sob que luz esta tela abre.\n *\n * `'dark'` (o padrão) é o terminal dedicado: ele vive sozinho num balcão, a\n * noite inteira, e o carvão é o fundo certo. `'light'` é o PDV aberto POR\n * CIMA de uma retaguarda clara — ali o operador estava numa tela de papel\n * meio segundo antes, e trocar o fundo faria a chave de modo parecer troca\n * de programa em vez de troca de lado da mesma casa.\n *\n * Não é um segundo design system: as duas peles declaram o MESMO conjunto\n * de `--pos-*`, e toque, ritmo, raio e tempo não mudam entre elas.\n */\n theme?: 'dark' | 'light'\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 /**\n * Quando esta cópia do cardápio saiu do banco (epoch ms).\n *\n * O cardápio do PDV não se relê a cada gesto — ver `catalog-cache` no\n * plugin-menu. O preço disso é que o operador não sabe de quando é o que\n * está vendo, e estes três campos são a resposta: a idade, a revalidação em\n * curso e o gesto de forçar. Sem `onRefreshMenu` nada disso aparece.\n */\n menuFetchedAt?: number\n menuRefreshing?: boolean\n /** A última revalidação falhou; o que está na tela é a cópia anterior. */\n menuStale?: boolean\n onRefreshMenu?: () => void\n /** Injected in tests so elapsed times are not wall-clock dependent. */\n now?: number\n}\n\n/**\n * Que espécie de posição cada linha da trilha mostra.\n *\n * A bandeja do rodapé lista o CANAL corrente; sem este mapa ela listava tudo,\n * e o Balcão exibia comanda de mesa. O cardápio é a exceção: ele é a tela da\n * comanda aberta, e ali a régua mostra tudo que está em aberto.\n */\nconst MENU_KIND: Record<string, PosPosition['kind']> = {\n floor: 'table',\n balcao: 'counter',\n // Retirada NÃO é balcão. Os dois mostram o cardápio e por isso pareciam o\n // mesmo canal, mas a conta se comporta ao contrário: ver a nota em\n // `PositionKind` e a regra em `./specialReuse.ts`.\n retirada: 'takeout',\n delivery: 'delivery',\n}\n\n/**\n * O `orders.channel` de cada menu.\n *\n * Irmão do `MENU_KIND`: aquele diz que RAIL o operador recebe, este diz em que\n * canal a conta nasce e por qual canal a lista de fechadas é cortada.\n */\nconst MENU_CHANNEL: Record<string, ComandaChannel> = {\n floor: 'dine_in',\n balcao: 'balcao',\n retirada: 'retirada',\n delivery: 'delivery',\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, waitlist: UserRound,\n}\n\n/**\n * Ícone por LINHA, quando a linha pede um.\n *\n * O mapa acima é por VIEW, e três canais diferentes — Balcão, Retirada e\n * Delivery — são todos `view: 'list'`. Sem isto a trilha desenhava a mesma\n * moto três vezes, e um menu em que três linhas seguidas têm o mesmo ícone\n * perde justamente o que o ícone serve para fazer: achar a linha sem ler.\n */\nconst NAMED_ICON: Record<string, LucideIcon> = {\n ConciergeBell, ShoppingBag, Bike, LayoutGrid, UtensilsCrossed, Banknote,\n CalendarClock, ClipboardList, Receipt, UserRound,\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\nconst capitalize = (t: string) => t.charAt(0).toUpperCase() + t.slice(1)\n\nexport function PosScreen({\n config, categories, items, positions, staff = [], reservations = [], terminalName, operatorName,\n waitlist = [], onWaitlistAdd, onWaitlistCall, onWaitlistSeat, onWaitlistNoShow, onWaitlistLookupPhone,\n onReservationArrived,\n connection = 'online', operatorId, onAction, onOpenPosition, onFire, onCloseBill, onDispatch,\n verifyPin, onAuthorised, actionGate, onDiscardTicket, initialTickets, notice: appNotice, cashOpen, floorStale, onRetryFloor, brandMark, brandName, className, theme, style, railTop,\n parties, sharedLabel, paidByPosition, serviceChargeByPosition,\n floorTool, shiftMode, onPickTarget, onCloseShift, registerEscape, onMoveTable: onMoveTableProp, onUpdateTable, onCreateZone, onUpdateZone, onTogglaMesaNaPraca, onDeleteZone, onArrange, onUpdateArea, floorScope, onConfigureTables,\n closedTickets, closedLoading, closedSeals, closedSealsFailed, onOpenClosed, onReopenClosed, railPanel, coversByPosition, onEditCover,\n paymentsByPosition, onEditGuestCount, onActivatePosition,\n onIdentify, onAddGuest, onIdentifyGuest, onRemoveGuest, onLookupPhone,\n unitSwitcher,\n loading = false,\n menuFetchedAt, menuRefreshing, menuStale, onRefreshMenu,\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\n /**\n * As comandas do pool chegam DEPOIS da montagem, e o livro é semeado uma vez.\n *\n * Sem isto, a mesa aberta abria vazia: o operador lançava, enviava para a\n * cozinha, voltava à mesa e não via nada — as linhas estavam no banco e o\n * livro tinha sido semeado com `{}` um segundo antes de elas chegarem.\n *\n * A fusão respeita quem está com a mão na comanda: linha pendente na tela\n * nunca é substituída pela versão do banco. Ver `hydrate` em session.ts.\n */\n useEffect(() => {\n if (!initialTickets) return\n dispatchBook({ type: 'hydrate', tickets: initialTickets, at: new Date(now).toISOString() })\n // `now` fora das dependências de propósito: ele anda a cada minuto e só\n // serve de carimbo para comanda que o livro ainda não tem.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [initialTickets])\n\n\n /**\n * A trilha, agrupada — e sem o que está oculto.\n *\n * `Map` e não um objeto: a ORDEM dos grupos é a ordem em que o primeiro menu\n * de cada um foi declarado, e essa ordem é do produto, não do alfabeto.\n */\n const railGroups = useMemo(() => {\n const by = new Map<string, PosMenu[]>()\n for (const m of config.menus) {\n if (m.hidden) continue\n const g = m.group ?? 'Operação'\n const list = by.get(g)\n if (list) list.push(m)\n else by.set(g, [m])\n }\n return [...by.entries()]\n }, [config.menus])\n const [activePositionId, setActivePositionId] = useState<string>()\n // `undefined` = TODAS as praças, e é o padrão.\n //\n // Antes o filtro abria já recortado na primeira praça, e o operador via um\n // pedaço do salão achando que via o salão — as mesas das outras praças\n // simplesmente não existiam para ele até descobrir a barra.\n const [activeZoneId, setActiveZoneId] = useState<string | undefined>(undefined)\n /** O AMBIENTE escolhido — o nível de cima do filtro do rodapé. */\n const [activeAmbienteId, setActiveAmbienteId] = useState<string | undefined>(undefined)\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 /**\n * De ONDE veio a acomodação em curso — reserva ou fila.\n *\n * A acomodação é o MESMO gesto para as duas (armar, escolher a mesa no\n * salão, a comanda abrir com nome e quantidade), e por isso `seating` é uma\n * só. O que muda é o que acontece DEPOIS: a reserva vira «Sentado» na lista\n * de reservas, o grupo da fila sai da fila. Com um estado só para as duas\n * origens, sentar alguém da fila marcaria a reserva de mesmo id — ou nada.\n */\n const [seatingFrom, setSeatingFrom] = useState<'reservation' | 'waitlist'>('reservation')\n /** A entrada da fila que está esperando resposta do servidor. */\n const [waitlistBusy, setWaitlistBusy] = useState<string>()\n const [waitlistForm, setWaitlistForm] = useState(false)\n const [waitlistSaving, setWaitlistSaving] = useState(false)\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 cobrancaRef = useRef<{\n guestIds: string[]; amountCents: number; outstandingCents: number\n accountId?: string; installments?: number; cardBrand?: string\n } | undefined>(undefined)\n /** A conta escolhida para receber. */\n const [accountId, setAccountId] = useState<string>()\n const [installments, setInstallments] = useState(1)\n const [cardBrand, setCardBrand] = useState<string>()\n /**\n * Conta ÚNICA compatível escolhe sozinha — mas continua VISÍVEL.\n *\n * O V1 é explícito: o seletor aparece com qualquer conta compatível, não só\n * com duas ou mais, *\"porque com uma conta só ele sumia e a conta era\n * escolhida em silêncio: no débito o operador não via para onde o dinheiro\n * ia.\"* Pré-selecionar poupa um toque; esconder esconde um fato.\n */\n useEffect(() => {\n const forma = config.paymentMethods.find((m) => m.id === paymentId)\n // NÃO NORMALIZAR ÀS CEGAS.\n //\n // Este efeito também roda quando `config.paymentMethods` muda — e ele\n // muda a cada `reload()` do PDV, que é o gesto mais frequente da tela. Se\n // a lista chegar vazia ou sem a forma escolhida por um instante, `forma`\n // vem `undefined` e as três normalizações abaixo leem isso como «a forma\n // não tem bandeira nem parcelas» e APAGAM o que o operador escolheu.\n //\n // Foi o que aconteceu num fechamento real em 29-09: Visa e 3× escolhidos\n // na tela, `card_brand` e `card_installments` NULOS no banco. A conta\n // sobreviveu porque o rail a manda explicitamente no `onClose`; a\n // bandeira e as parcelas dependem só daqui.\n //\n // Com forma escolhida e não encontrada, o estado é TRANSITÓRIO — não é\n // hora de decidir nada.\n if (paymentId && !forma) return\n const cabem = !methodAsksAccount(forma?.transactionType) ? [] : (config.receivingAccounts ?? []).filter((c) => (\n (!forma?.allowedAccountKinds?.length || forma.allowedAccountKinds.includes(c.kind))\n // A mesma rede do rail: o cadastro da casa pode oferecer uma conta que\n // `financial_receive_payment` recusa. Ver `accountFit.ts`.\n && accountFitsMethod(forma?.transactionType, c.kind)\n ))\n // Trocar de forma zera a conta: a anterior pode ser incompatível com a\n // nova, e uma conta de cartão herdada num pagamento em dinheiro é\n // exatamente o que o banco recusa.\n setAccountId((atual) => {\n if (atual && cabem.some((c) => c.id === atual)) return atual\n return cabem.length === 1 ? cabem[0].id : undefined\n })\n // As parcelas NORMALIZAM na origem, não só somem da tela. O V1 diz por\n // quê: *\"se a pessoa escolheu 3× no crédito e trocou para débito, o valor\n // antigo seguiria no payload.\"* Esconder o campo deixa o número vivo.\n if ((forma?.maxInstallments ?? 1) <= 1) setInstallments(1)\n // E a BANDEIRA normaliza pelo mesmo motivo, com a frase do V1 junto:\n // trocar de cartão para vale não pode levar a antiga — «Visa» num\n // vale-refeição. Esconder o campo deixaria o valor vivo no payload.\n setCardBrand((atual) => keepBrand(atual ?? '', brandList(forma?.transactionType, forma?.typeName)) || undefined)\n }, [paymentId, config.paymentMethods, config.receivingAccounts])\n\n /**\n * Conta de DÉBITO zera as parcelas, mesmo que a forma permitisse.\n *\n * É a regra que segue a CONTA e não o nome: um método chamado \"Cielo - Link\n * A vista\" pode ter teto de 12× cadastrado e liquidar numa conta de débito.\n * Quem manda é onde o dinheiro cai.\n */\n useEffect(() => {\n const conta = (config.receivingAccounts ?? []).find((c) => c.id === accountId)\n if (conta?.kind === 'card_receivable_debit') setInstallments(1)\n }, [accountId, config.receivingAccounts])\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 // Por CANAL, não um `__counter` para tudo: ver `./channelSlot.ts`. Com um\n // slot só, a sacola da retirada entrava na venda do balcão.\n const ticketKey = ticketSlot(activePositionId, menuId)\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 // A taxa que vale nesta comanda: a da mesa quando existe, a da casa quando\n // não. A da mesa ganha porque foi combinada DEPOIS — e é a que o banco já\n // usou para fechar o total.\n // A política da casa cai só na MESA — ver `effectiveServicePercent`.\n //\n // Antes a queda era cega: `?? config.serviceChargePercent`. No Pertinho isso\n // estava certo por ACIDENTE, porque não existe linha em `plg_tables_settings` e\n // a política lê 0. Com 13% salvos ali, o balcão passaria a mostrar 13% com o\n // banco gravando 0 — a tela pedindo uma gorjeta que a casa diz não cobrar\n // naquele canal.\n const taxaVigente = effectiveServicePercent(\n serviceChargeByPosition?.[ticketKey],\n config.serviceChargePercent,\n // O kind sai do PROP `positions`, não do `activePosition` — este nasce mais\n // abaixo, e a taxa é calculada antes dele. Sem posição escolhida, o canal do\n // menu responde.\n positions.find((p) => p.id === activePositionId)?.kind\n ?? (menuId ? MENU_KIND[menuId] : undefined),\n )\n // O couvert desta comanda, em centavos — soma no total, fora da taxa.\n const couvertCents = (coversByPosition?.[ticketKey] ?? [])\n .reduce((sum, c) => sum + Math.round((c.total - c.discount) * 100), 0)\n\n /** Os participantes desta comanda — e a taxa própria de cada um. */\n const party = parties ? (parties[ticketKey] ?? []) : undefined\n\n const totals = useMemo(\n // `party` entra porque a taxa de serviço é POR PARTICIPANTE quando alguém\n // tem a dele: é assim no papel e no V1, e sem isto a tela pedia uma\n // gorjeta que a conta não cobra. Ver a nota em `totalsOf`.\n () => totalsOf(ticket, { serviceChargePercent: taxaVigente, coverCents: couvertCents, party }),\n [ticket, taxaVigente, couvertCents, party],\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 /** O que ainda está no carrinho — o único que o cardápio pode desfazer. */\n const pendingByItem = useMemo(() => {\n const map: Record<string, number> = {}\n for (const l of ticket.lines) {\n if ((l.state ?? 'pending') !== 'pending') continue\n map[l.itemId] = (map[l.itemId] ?? 0) + l.quantity\n }\n return map\n }, [ticket.lines])\n\n // Quem está selecionado na comanda — o DESTINO dos próximos itens.\n //\n // Mora aqui em cima, antes de `ring`, porque é dependência dele: declarado\n // depois, o `useCallback` guardava a seleção do primeiro render e todo item\n // caía na mesa. O sintoma foi exatamente esse — a Ana selecionada, a água na\n // conta da mesa.\n const [selectedGuestId, setSelectedGuestId] = useState<string | null>(null)\n\n const ring = useCallback((item: PosItem, modifiers?: PickedModifier[], note?: string) => {\n dispatch({ type: 'add_item', item, lineId: nextLineId(), modifiers, note, guestId: selectedGuestId })\n }, [dispatch, selectedGuestId])\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 /** A posição ativa, em ref: `handleAction` é memoizada e ler o estado dali\n * entregaria a mesa de dois toques atrás. */\n const activePositionIdRef = useRef(activePositionId)\n activePositionIdRef.current = activePositionId\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 /** As mesas dadas a esta pessoa por NOME — não as da praça dela. */\n const minhas = useMemo(() => {\n const ids = floorScope?.directTableIds\n return ids && ids.length ? new Set(ids) : undefined\n }, [floorScope])\n\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 // ESCALADA PARA VOCÊ. O dado já existia em `FloorScope.directTableIds` e\n // ninguém o desenhava — só os testes o liam. Ver `assignedToMe` no glifo.\n if (minhas?.has(p.id)) p = { ...p, assignedToMe: true }\n const t = book[p.id]\n if (!t) return p\n // A TAXA É DA COMANDA, não da casa.\n //\n // Este recálculo existe para o cartão andar enquanto o garçom lança, antes\n // de o total do servidor chegar. Mas ele usava `config.serviceChargePercent`\n // — a política da CASA — e jogava fora o total da view, que já traz a taxa\n // congelada na abertura da mesa.\n //\n // Medido no Pertinho: `plg_tables_settings` com ZERO linhas (casa = 0%) e\n // comandas a 13%. As três mesas com conta mostravam exatamente o subtotal:\n // R$ 2.206,25 onde a conta era R$ 2.493,06; R$ 390,00 onde era R$ 440,70;\n // R$ 144,90 onde era R$ 163,74. O V1 mostra `order.total`, com a taxa\n // dentro (`WaiterTables.tsx:229`).\n const taxa = p.serviceChargePercent ?? config.serviceChargePercent\n const totalCents = totalsOf(t, { serviceChargePercent: taxa }).totalCents\n return { ...p, itemCount: counts[p.id] ?? p.itemCount, totalCents: totalCents || p.totalCents }\n }), [positions, opened, dispatched, settled, book, counts, config.serviceChargePercent, minhas])\n\n const activePosition = livePositions.find((p) => p.id === activePositionId)\n\n /**\n * Trocar de canal na trilha.\n *\n * Larga a posição escolhida, porque não largá-la era o defeito: estando na\n * Mesa 11 e tocando «Balcão», o item lançado caía na comanda da mesa com\n * gente sentada. A conta anterior NÃO se fecha nem se esconde — fica na\n * bandeja com a idade dela; ela só deixa de ser a que recebe o próximo item.\n */\n const trocarCanal = useCallback((id: string) => {\n if (channelSwitchDropsPosition(\n { menuId, activeKind: activePosition?.kind },\n { menuId: id, kind: MENU_KIND[id] },\n )) {\n setActivePositionId(undefined)\n setSelectedLineId(undefined)\n }\n setMenuId(id)\n }, [menuId, activePosition?.kind])\n\n /**\n * O canal que a trilha MARCA — que não é sempre o menu visível.\n *\n * Escolher uma mesa troca a view para o cardápio, e o cardápio que existe é o\n * do balcão; sem isto a trilha acendia «Balcão» com a comanda da Mesa 3\n * aberta, dizendo ao operador que ele estava num canal em que não estava.\n */\n const canalMarcado = currentChannelId(\n menuId,\n activePosition?.kind,\n config.menus.map((m) => ({ id: m.id, kind: MENU_KIND[m.id] })),\n )\n\n /**\n * As contas fechadas DO CANAL corrente.\n *\n * A lista chegava inteira e a tela a mostrava toda: no «Histórico do balcão»\n * do Pertinho apareciam sessenta contas de MESA — «Mesa 1 · R$ 201,03» — num\n * canal que não tinha uma única linha. As 3.766 contas históricas do V1 foram\n * importadas com `channel` nulo, então filtrar pela coluna não resolve; o\n * canal se DERIVA, e a mesa decide primeiro.\n *\n * O V1 já tinha corrigido o espelho disto, e deixou o motivo escrito: *\"uma\n * venda de balcão fechada não é «mesa fechada», e misturar as duas devolveria\n * ao garçom uma lista que não é a dele.\"*\n *\n * Sem `tableId` nem `channel` na linha, nada é cortado — um app de um canal só\n * continua vendo a lista dele.\n */\n const fechadasDoCanal = useMemo(() => {\n const alvo = canalMarcado ? MENU_CHANNEL[canalMarcado] : undefined\n if (!alvo || !closedTickets) return closedTickets\n const temEixo = closedTickets.some((c) => c.tableId !== undefined || c.channel !== undefined)\n if (!temEixo) return closedTickets\n return closedTickets.filter((c) => closedBelongsToChannel(c, alvo))\n }, [closedTickets, canalMarcado])\n\n\n // O primeiro ✕ larga a mesa; o segundo sai do PDV.\n const escapeRef = useRef<() => boolean>(() => false)\n escapeRef.current = () => {\n if (railOpen) { setRailOpen(false); return true }\n if (activePositionId) {\n setActivePositionId(undefined)\n setSelectedLineId(undefined)\n // Volta para onde a mesa é escolhida, não para o cardápio: largar a mesa\n // e ficar olhando o cardápio dela é meio gesto.\n const floor = config.menus.find((m) => m.view === 'floor')\n if (floor) setMenuId(floor.id)\n return true\n }\n return false\n }\n useEffect(() => {\n registerEscape?.(() => escapeRef.current())\n }, [registerEscape])\n\n // As pessoas DESTA comanda.\n //\n // Lista VAZIA, não `undefined`, quando o app declarou que esta tela tem\n // participantes: a comanda sem ninguém ainda precisa da barra — é ela que\n // tem o botão de sentar a primeira pessoa. Deixar `undefined` escondia a\n // barra exatamente onde ela é o único caminho.\n // A seleção zera ao trocar de posição: ela é o destino dos próximos itens, e\n // um destino que sobrevive à troca de mesa lança o pedido da mesa 5 na conta\n // de quem sentou na 3.\n useEffect(() => { setSelectedGuestId(null) }, [activePositionId])\n // E zera quando a pessoa escolhida deixa a comanda — excluída ou\n // transferida. Um destino que não existe mais grava linha órfã.\n useEffect(() => {\n if (selectedGuestId && !party?.some((g) => g.id === selectedGuestId)) setSelectedGuestId(null)\n }, [party, selectedGuestId])\n\n\n /**\n * O que entra no \"…\" da comanda, e por que cada coisa pode estar apagada.\n *\n * As ações já são declaradas em `config.actions` (rótulo e atalho); o que\n * falta é QUANDO elas valem. A regra vem do V1 e é sempre a mesma pergunta:\n * a ação mexe em algo que a cozinha já viu?\n *\n * - transferir e cancelar precisam de item ENVIADO — não se cancela o que\n * ninguém preparou, se apaga;\n * - desconto precisa de linha na conta;\n * - cortesia encerra a comanda, então precisa dela cheia;\n * - a taxa de serviço é do salão: no balcão não há quem sirva.\n *\n * `close_bill` e `fire` ficam de fora: são os dois botões do rodapé, e\n * repeti-los aqui daria dois caminhos para o mesmo gesto.\n */\n const moreActions = useMemo(() => {\n const fired = ticket.lines.filter((l) => l.state !== 'pending').length\n // O V1 abre DUAS portas com a mesma lista — cancelar e transferir —, e ela\n // não é «o que foi enviado»: é o que foi enviado E ainda não foi entregue.\n const cancelaveis = ticket.lines.filter((l) => isCancelable(l.state)).length\n const any = ticket.lines.length\n const atTable = activePosition?.kind === 'table'\n /** A comanda existe no banco? É o `!orderId` do V1. */\n const temComanda = !!activePosition?.ticketId || any > 0\n const canalDaCortesia: CourtesyChannel = atTable ? 'salao'\n : activePosition?.kind === 'delivery' ? 'delivery'\n : activePosition?.kind === 'takeout' ? 'retirada'\n : 'balcao'\n const why = {\n needsFired: cancelaveis === 0 ? 'Disponível após enviar itens' : undefined,\n needsAny: any === 0 ? 'A comanda está vazia' : undefined,\n needsTable: !atTable ? `Disponível para ${config.vocabulary.positionPlural.toLowerCase()} do salão` : undefined,\n }\n const gate: Record<string, string | undefined> = {\n transfer: why.needsFired,\n // NÃO use `??` aqui: `why.needsFired` é `undefined` justamente quando há\n // item enviado, e o segundo operando é uma string sempre verdadeira —\n // o Cancelamento ficava apagado para sempre, inclusive com a comanda\n // cheia. A frase é a do V1 e substitui a genérica só quando bloqueia.\n cancel_item: cancelaveis === 0 ? 'Nenhum item enviado para cancelar' : undefined,\n discount: why.needsAny,\n // A cortesia tem SEIS becos, e cada um pede uma ação diferente — ver\n // `courtesyGate.ts`. «A comanda está vazia» servia para todos, e mandava\n // o operador lançar item quando o problema era o caixa fechado.\n courtesy: allowsCourtesyForChannel(canalDaCortesia)\n ? courtesyBlockReason({\n hasOrder: temComanda,\n status: activePosition?.status === 'free' ? 'closed' : undefined,\n pendingCount: any - fired,\n paidCents: Object.values(paidByPosition?.[activePosition?.id ?? ''] ?? {})\n .reduce((a, b) => a + b, 0),\n balanceCents: totals.totalCents,\n // O SEXTO motivo do V1 — «Abra seu caixa para usar a cortesia».\n //\n // Ele ficou de fora enquanto o PDV não lia sessão de caixa. Agora\n // o app pode responder, e `undefined` continua querendo dizer «não\n // sei»: quem não conferiu não bloqueia. Não sei é melhor que negar\n // por um caixa que eu não olhei — mas saber e calar é pior, porque\n // a cortesia passa e o recebimento adiante é que recusa.\n cashOpen: cashOpen ?? true,\n }) ?? undefined\n : 'Disponível no salão e no balcão',\n service_charge: why.needsTable,\n // O histórico não existe antes de a comanda existir.\n //\n // Sem esta porta ele abria uma folha VAZIA — pior que um botão apagado,\n // porque o operador lê «não houve transferência» onde a resposta é «esta\n // mesa ainda não tem comanda». A frase é a do V1.\n transfer_history: temComanda ? undefined : 'Comanda ainda não aberta',\n split: why.needsAny,\n partial: why.needsAny,\n }\n return config.actions\n .filter((a) => !a.hidden && a.id !== 'close_bill' && a.id !== 'fire' && a.id !== 'open_table')\n .map((a) => ({\n id: a.id,\n label: a.label,\n // A regra do app primeiro: ela pode proibir o que o pacote permitiria.\n disabledReason: (actionGate?.(a.id, { menuId, position: activePosition, ticket }) || undefined)\n ?? gate[a.id],\n danger: a.id === 'cancel_item',\n // Os dois traços do V1, nas mesmas duas linhas: antes da cortesia e\n // antes do cancelamento. Separam o que ENCERRA do que edita.\n separator: a.id === 'courtesy' || a.id === 'cancel_item',\n }))\n }, [config.actions, config.vocabulary, ticket.lines, activePosition, actionGate, menuId, ticket])\n\n\n /**\n * A área escolhida FILTRA na grade e FOCA na planta.\n *\n * São duas respostas para a mesma pergunta, e a diferença é o que cada\n * vista sabe fazer. A grade não tem noção de lugar: esconder o que não\n * interessa é tudo o que ela pode. A planta TEM — e ali esconder custa o\n * contexto: um ambiente sozinho no meio do branco não diz onde ele fica.\n * Então a planta aproxima e apaga a vizinhança, em vez de removê-la.\n *\n * E o chão desenha MESA, só.\n *\n * Desde que a comanda de canal aberta virou posição — para chegar à bandeja,\n * onde o V1 a põe —, ela passou a ser desenhada também aqui: doze fichas de\n * «Balcão», «Retirada» e «Delivery» no meio do salão, pintadas com o TOM DE\n * MESA («Atrasada»), e a contagem subindo de 208 para 218. Nenhuma delas\n * existe na sala. A bandeja já sabia filtrar por canal; o chão não sabia.\n */\n const zonePositions = livePositions.filter((p) => (p.kind ?? 'table') === 'table')\n\n /** Pegar uma posição LEVA à comanda dela, no cardápio.\n *\n * A grade de mesas é um SELETOR, não um destino — é a regra do V1, e o\n * motivo está escrito no fonte dele: ficar no mapa obrigava a mesma mão a\n * achar a aba do cardápio antes de escrever qualquer coisa, um segundo\n * toque cuja única função era terminar o que o primeiro já pedia. Abrir\n * mesa livre já fazia isso (ver `confirmOpen`); pegar mesa OCUPADA não\n * fazia, e era a metade mais usada das duas: uma mesa se abre uma vez e se\n * volta a ela a noite inteira.\n *\n * A mesa livre não tem o que mostrar ainda, então pede para ser aberta. */\n const selectPosition = useCallback((p: PosPosition) => {\n // Com a escala aberta, a planta é um seletor: o toque ESCOLHE a mesa em\n // vez de abrir a comanda. Sem isto, escalar alguém para uma mesa exigiria\n // achá-la numa lista de duzentas — e o gerente está olhando para ela.\n if (shiftMode && onPickTarget) {\n haptic('tap')\n onPickTarget({ kind: 'table', id: p.id, label: p.label })\n return\n }\n if (p.status === 'free') {\n // Abrir é uma ação como as outras, e o app pode recusá-la — o V1 recusa\n // quando a lista de pedidos veio com erro, porque abrir mesa sobre uma\n // lista velha é como se cria a comanda duplicada. O aviso vai à tela em\n // vez de a folha subir: uma folha que abre para depois falhar já gastou\n // o gesto.\n const blocked = actionGate?.('open_table', { menuId, position: p, ticket })\n if (blocked) { setNotice({ text: blocked, tone: 'warn' }); return }\n setOpeningPosition(p)\n return\n }\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 onActivatePosition?.(p.id)\n setRailOpen(true)\n // O DELIVERY não vai para o cardápio.\n //\n // Nos outros canais o toque numa comanda é \"quero lançar mais coisa\", e o\n // cardápio é o destino certo. No delivery o pedido chega FECHADO — ele foi\n // montado do outro lado, pelo aplicativo ou pelo telefone —, e a pergunta\n // de quem toca é \"o que tem neste?\", não \"o que mais eu ponho?\".\n //\n // Trocar para o cardápio ali custava as duas coisas: tirava da vista o\n // quadro que é o seletor daquele canal, e oferecia um cardápio para um\n // pedido que ninguém vai editar. Agora o quadro fica, o cartão tocado\n // acende (`aria-current`) e os detalhes abrem na coluna, ao lado.\n if (p.kind === 'delivery') return\n const catalog = config.menus.find((m) => m.view === 'catalog')\n if (catalog) setMenuId(catalog.id)\n }, [config.menus, actionGate, menuId, ticket, shiftMode, onPickTarget, onActivatePosition])\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 if (seatingFrom === 'waitlist') {\n // A fila grava no BANCO: a linha some da fila para todo mundo, não só\n // para este terminal. A reserva continua no mapa local do turno\n // porque é assim que ela já funcionava aqui.\n void Promise.resolve(onWaitlistSeat?.(seating.id, p.id)).catch(() => {})\n } else {\n setBookings((prev) => ({ ...prev, [seating.id]: 'seated' }))\n setSeatedAt((prev) => ({ ...prev, [seating.id]: p.id }))\n }\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, seatingFrom, onWaitlistSeat, 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, guestId?: 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 const alvo = ticketKey\n // A confirmação era OTIMISTA e NUNCA se corrigia: o `void` descartava a\n // promessa, então uma escrita recusada deixava na tela «Enviado» e «1\n // item enviado à cozinha» sobre um item que a cozinha nunca viu. O\n // operador serve o prato que ninguém preparou, e ninguém fica sabendo.\n //\n // Agora a falha DESFAZ o carimbo: as linhas voltam a pendentes, no\n // mesmo slot em que foram lançadas (`alvo`, e não o slot em que o\n // operador estiver quando a resposta chegar), e o aviso diz o que o\n // servidor disse. Mostrar primeiro e corrigir depois é bom; mostrar e\n // não corrigir é mentir.\n void Promise.resolve(onFire?.(alvo, sent.map(stamp), {\n ...whole,\n lines: whole.lines.map((l) => ((l.state ?? 'pending') === 'pending' ? stamp(l) : l)),\n })).catch((e: unknown) => {\n for (const l of sent) {\n dispatchBook({ type: 'at', positionId: alvo, action: { type: 'set_line_state', lineId: l.id, state: 'pending' } })\n }\n setNotice({\n text: e instanceof Error ? e.message : 'Os itens não chegaram à cozinha.',\n tone: 'warn',\n })\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, { positionId: activePositionIdRef.current, ticket: ticketRef.current, guestId })\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 /**\n * QUEM está pagando e QUANTO, do rail até o fechamento.\n *\n * Em ref, não em estado: `settleBill` é memoizada e roda no mesmo tique do\n * toque. Um `useState` só valeria no render seguinte, e a conta sairia com a\n * seleção anterior — o erro que este conserto existe para tirar da tela.\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 = {\n ticket: current,\n totals,\n paymentMethodId: paymentId,\n guestIds: cobrancaRef.current?.guestIds,\n // Sem seleção, cobra-se a comanda inteira — o caso do balcão.\n amountCents: cobrancaRef.current?.amountCents ?? totals.totalCents,\n outstandingCents: cobrancaRef.current?.outstandingCents ?? totals.totalCents,\n accountId: cobrancaRef.current?.accountId ?? accountId,\n installments: cobrancaRef.current?.installments ?? installments,\n cardBrand: cobrancaRef.current?.cardBrand ?? cardBrand,\n }\n setSettling(true)\n try {\n // Guardado ANTES de soltar a posição: `activePosition` deriva de\n // `activePositionId`, que some logo abaixo, e a decisão de para onde ir\n // depende de saber que espécie de posição acabou de fechar.\n const closedPosition = activePosition\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 // Fechar uma MESA devolve à grade; um balcão fica no cardápio.\n //\n // Regra do V1, com o motivo escrito no fonte dele: quem acabou de fechar\n // a mesa 12 vai atender a próxima, e o passo seguinte é escolher qual —\n // a grade é que responde isso. Cair no cardápio sem comanda seria \"uma\n // tela de lançar item sem nada para lançar\".\n //\n // A exceção é o canal SEM mesa (balcão, retirada): lá o próximo pedido\n // começa pelo produto, e mandar o operador para a grade seria pedir que\n // ele escolhesse uma mesa que não vai usar.\n if (closedPosition?.kind === 'table') {\n const floor = config.menus.find((m) => m.view === 'floor')\n if (floor) setMenuId(floor.id)\n }\n setNotice({\n text: `${closedPosition?.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, config.menus])\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, guestId?: string) => {\n const action = config.actions.find((a) => a.id === actionId)\n const porta = pinGate(action?.requiresPin, !!verifyPin)\n if (porta.kind === 'deny') {\n haptic('warn'); setNotice({ text: porta.message, tone: 'warn' }); return\n }\n if (porta.kind === 'ask') { haptic('warn'); setPinFor(action!); return }\n haptic('tap')\n runAction(actionId, guestId)\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\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 /** Mexer na planta é um MODO, não uma tela: o mesmo palco, outro gesto. */\n const [editandoPlanta, setEditandoPlanta] = useState(false)\n const [salvandoPlanta, setSalvandoPlanta] = useState(false)\n /** A mesa aberta na FICHA, enquanto se edita a planta. */\n const [mesaNaFicha, setMesaNaFicha] = useState<string>()\n /** A ferramenta de praça armada: retângulo, elipse ou mão livre. */\n const [ferramenta, setFerramenta] = useState<ZoneTool | null>(null)\n /** A praça ESCOLHIDA para mexer — a que ganha as alças. */\n const [pracaNaFicha, setPracaNaFicha] = useState<string | null>(null)\n /** O modo «escolher mesas na planta» é DA praça escolhida. */\n const [escolhendoMesas, setEscolhendoMesas] = useState(false)\n /** A folha de «Organizar automaticamente» está aberta? */\n const [organizando, setOrganizando] = useState(false)\n /** O AMBIENTE escolhido para mexer, e o contorno dele aberto. */\n const [ambienteNaFicha, setAmbienteNaFicha] = useState<string | null>(null)\n const [contornoAberto, setContornoAberto] = useState(false)\n /**\n * «Ver todas» — e ele começa LIGADO quando não há escala.\n *\n * A decisão é do V1 e é sobre gente, não sobre tela: *ninguém fica sem mesa\n * por falta de escala*. Esconder tudo deixaria o garçom parado por um\n * cadastro que alguém esqueceu de fazer.\n */\n const [vendoTodas, setVendoTodas] = useState(false)\n /** Quantas mesas ainda não têm lugar no salão. */\n /** Mesas SEM lugar na planta. Só mesa: a comanda de balcão não está «fora do\n * salão», ela nunca esteve nele. */\n const foraDaPlanta = positions\n .filter((p) => (p.kind ?? 'table') === 'table')\n .filter((p) => p.posXM == null || p.posYM == null).length\n /**\n * O CADEADO do desenho de praça.\n *\n * Enquanto os ambientes estiverem todos empilhados na origem — layout\n * automático, sem posição no banco — desenhar praça pegaria mesas\n * diferentes das que estão na tela. O V1 apaga as ferramentas até que\n * alguém arraste um ambiente (ou mande organizar).\n */\n const plantaTravada = needsAutoLayout(\n (config.positions.zones ?? []).map((z) => ({ posX: z.posX ?? null, posY: z.posY ?? null })),\n )\n /** A cor com que a PRÓXIMA praça nasce — o contorno já sai nela. */\n const corDaProximaPraca = nextZoneColor(config.positions.serviceAreas ?? [])\n\n /**\n * O fim do gesto: a praça nasce, ou a recusa vai à tela.\n *\n * A recusa é do V1, palavra por palavra, e tem DOIS textos — um por gesto.\n * \"Desenhe maior\" não ensina nem a contornar nem a arrastar na diagonal.\n *\n * A ferramenta se desarma ao criar, como no V1: quem desenhou uma praça\n * quer conferi-la, não emendar outra. Na recusa ela FICA armada — o\n * operador errou o gesto, e rearmar seria um toque de castigo.\n */\n const aoDesenharPraca = useCallback(async (draft: ZoneDraft) => {\n if (!onCreateZone) return\n if (!draft.ok) {\n setNotice({ text: `${draft.title} — ${draft.detail}`, tone: 'warn' })\n return\n }\n setSalvandoPlanta(true)\n try {\n // Quantas mesas o desenho pegou — para AVISAR, e do mesmo lugar que\n // grava.\n //\n // O `PlanStage` já calcula isto ao soltar o traço (`tablesInZone`, com o\n // centro da mesa em metros absolutos) e o põe em `draft.fields`. Eu\n // tinha escrito um segundo cálculo aqui: duas contas para a mesma\n // pergunta, e no dia em que discordassem o aviso mentiria sobre o que\n // foi gravado.\n const pegas = draft.fields.tableIds ?? []\n await onCreateZone(draft.fields)\n setFerramenta(null)\n // E DIZ quantas pegou: o V1 não diz, e a pergunta «desenhei a praça e\n // ela não pegou nenhuma mesa, por quê?» está no FAQ dele por isso.\n setNotice({\n text: pegas.length > 0\n ? `${draft.fields.name} desenhada · ${pegas.length} mesa(s)`\n : `${draft.fields.name} desenhada — nenhuma mesa dentro do desenho`,\n tone: pegas.length > 0 ? 'ok' : 'warn',\n })\n } finally {\n setSalvandoPlanta(false)\n }\n }, [onCreateZone, zonePositions, config.positions.zones])\n\n /**\n * O fim de um gesto de alça: grava a geometria.\n *\n * Marca «Salvando…» pelo mesmo caminho do arrasto de mesa — o operador não\n * distingue \"mexi na mesa\" de \"mexi na praça\", e dois indicadores diferentes\n * para a mesma promessa ensinariam a ignorar os dois.\n */\n const aoMexerNaPraca = useCallback(async (id: string, patch: Partial<ZoneGeometry>) => {\n if (!onUpdateZone) return\n setSalvandoPlanta(true)\n try { await onUpdateZone(id, patch) } finally { setSalvandoPlanta(false) }\n }, [onUpdateZone])\n /**\n * Salvar é do GESTO, não de um botão.\n *\n * O V1 salva sozinho e diz \"Salvo\"/\"Salvando…\" num canto. Um botão de\n * salvar aqui pediria ao operador que lembrasse de apertá-lo depois de\n * arrastar cem mesas — e a única forma de descobrir que esqueceu seria\n * recarregar e ver tudo de volta ao lugar antigo.\n */\n /**\n * A FICHA da mesa mora no rail — o mesmo slot da Escala de hoje.\n *\n * O V1 a põe numa coluna à direita da planta; aqui a coluna à direita já\n * existe, e é a mesma que mostra a comanda. Abrir um diálogo por cima\n * esconderia a planta, que é justamente o que o gerente está olhando\n * enquanto ajusta — \"ele vê o resultado na hora\" não funciona se o\n * resultado estiver atrás da ficha.\n */\n const alvoDaFicha = mesaNaFicha ? livePositions.find((p) => p.id === mesaNaFicha) : undefined\n const fichaDaMesa = editandoPlanta && alvoDaFicha && onUpdateTable ? (\n <TableInspector\n table={{\n id: alvoDaFicha.id,\n number: Number(alvoDaFicha.label.replace(/\\D/g, '')) || 0,\n name: alvoDaFicha.customerName ? null : null,\n seats: alvoDaFicha.seats ?? 0,\n shape: (alvoDaFicha.tableShape ?? 'rectangle') as 'round' | 'rectangle' | 'square',\n widthM: alvoDaFicha.widthM ?? tableDims(alvoDaFicha.tableShape).widthM,\n heightM: alvoDaFicha.heightM ?? tableDims(alvoDaFicha.tableShape).heightM,\n diameterM: alvoDaFicha.diameterM ?? tableDims(alvoDaFicha.tableShape).diameterM,\n rotation: alvoDaFicha.rotation ?? 0,\n }}\n areaName={(config.positions.zones ?? []).find((z) => z.id === alvoDaFicha.zoneId)?.label ?? null}\n onSave={(patch) => { void onUpdateTable(alvoDaFicha.id, patch) }}\n onZoom={() => setActiveZoneId(alvoDaFicha.zoneId)}\n />\n ) : null\n\n /**\n * A FICHA DA PRAÇA, no mesmo slot da ficha da mesa.\n *\n * As duas nunca aparecem juntas: o toque escolhe UM alvo, e a coluna tem um\n * lugar só. Escolher uma praça solta a mesa e vice-versa.\n */\n const pracaDaFicha = pracaNaFicha\n ? (config.positions.serviceAreas ?? []).find((a) => a.id === pracaNaFicha)\n : undefined\n const nomePorPraca = new Map((config.positions.serviceAreas ?? []).map((a) => [a.id, a.name]))\n const fichaDaPraca = editandoPlanta && pracaDaFicha && onUpdateZone ? (\n <ZoneInspector\n zone={{\n id: pracaDaFicha.id,\n name: pracaDaFicha.name,\n color: pracaDaFicha.color ?? null,\n shape: (pracaDaFicha as { shape?: string }).shape as InspectorZone['shape'],\n posX: pracaDaFicha.posX ?? null,\n posY: pracaDaFicha.posY ?? null,\n widthM: pracaDaFicha.widthM ?? null,\n heightM: pracaDaFicha.heightM ?? null,\n polygon: pracaDaFicha.polygon ?? null,\n }}\n tables={(pracaDaFicha.tableIds ?? []).map((id) => {\n const mesa = livePositions.find((p) => p.id === id)\n return {\n id,\n label: mesa?.label ?? id,\n // As OUTRAS praças a que ela pertence. Sem isto, tirar a mesa daqui\n // parece tirá-la do salão.\n alsoIn: (config.positions.serviceAreas ?? [])\n .filter((a) => a.id !== pracaDaFicha.id && (a.tableIds ?? []).includes(id))\n .map((a) => nomePorPraca.get(a.id) ?? a.name),\n }\n })}\n picking={escolhendoMesas}\n onPick={setEscolhendoMesas}\n onRename={(name) => { void onUpdateZone(pracaDaFicha.id, { name } as never) }}\n onRecolor={(color) => { void onUpdateZone(pracaDaFicha.id, { color } as never) }}\n onDropTable={(id) => onTogglaMesaNaPraca?.(pracaDaFicha.id, id, 'exclude')}\n onZoom={() => setActiveZoneId(pracaDaFicha.id)}\n onDelete={onDeleteZone ? () => {\n void onDeleteZone(pracaDaFicha.id)\n setPracaNaFicha(null)\n setNotice({ text: `${pracaDaFicha.name} apagada`, tone: 'ok' })\n } : undefined}\n />\n ) : null\n\n /**\n * A FICHA DO AMBIENTE — a parede, no mesmo slot das outras duas.\n *\n * A caixa no mundo vem de `placeAreas`, e não dos campos crus: sem posição\n * gravada os ambientes ficam num arranjo automático, e a ficha tem de dizer\n * onde ele ESTÁ na tela, não onde o banco acha que ele está.\n */\n const ambientePosto = ambienteNaFicha\n ? placeAreas((config.positions.zones ?? []).map((z) => ({\n id: z.id, name: z.label,\n shape: (z.shape ?? 'rect') as 'rect' | 'ellipse' | 'polygon',\n posX: z.posX ?? null, posY: z.posY ?? null,\n widthM: z.widthM ?? null, heightM: z.heightM ?? null, polygon: z.polygon ?? null,\n }))).find((p) => p.area.id === ambienteNaFicha)\n : undefined\n const ambienteCru = ambienteNaFicha\n ? (config.positions.zones ?? []).find((z) => z.id === ambienteNaFicha)\n : undefined\n const fichaDoAmbiente = editandoPlanta && ambientePosto && ambienteCru && onUpdateArea ? (\n <AreaInspector\n area={{\n id: ambienteCru.id,\n name: ambienteCru.label,\n color: (ambienteCru as { color?: string | null }).color ?? null,\n x: ambientePosto.box.x, y: ambientePosto.box.y,\n w: ambientePosto.box.w, h: ambientePosto.box.h,\n }}\n tables={livePositions.filter((p) => p.zoneId === ambienteCru.id).length}\n onRename={(name) => { void onUpdateArea(ambienteCru.id, { name }) }}\n onRecolor={(color) => { void onUpdateArea(ambienteCru.id, { color }) }}\n onZoom={() => setActiveZoneId(ambienteCru.id)}\n onEditOutline={() => setContornoAberto(true)}\n />\n ) : null\n\n /**\n * A bandeja das mesas sem lugar, no mesmo rail da ficha.\n *\n * Aparece quando se edita a planta e NENHUMA mesa está aberta na ficha: as\n * duas respondem perguntas diferentes — \"como é esta mesa?\" e \"quais ainda\n * não entraram?\" —, e empilhá-las faria a segunda sumir embaixo da primeira\n * justamente quando há oito esperando.\n */\n const destino = activeZoneId && (config.positions.zones ?? []).some((z) => z.id === activeZoneId)\n ? (config.positions.zones ?? []).find((z) => z.id === activeZoneId)\n : (config.positions.zones ?? [])[0]\n const bandejaSemAmbiente = editandoPlanta && !alvoDaFicha && !pracaDaFicha && !ambientePosto && onUpdateTable ? (\n <UnassignedTables\n tables={livePositions\n .filter((p) => p.posXM == null || p.posYM == null)\n .map((p) => ({\n id: p.id,\n // O número derivado do RÓTULO, e o rótulo junto. O V1 mostra\n // `#{number} · {name}` porque tem a coluna `number`; aqui ela não\n // chega no `PosPosition`, então o dígito do rótulo é a melhor\n // aproximação — e quando não há dígito, o NOME identifica. Sem o\n // `name`, «Balcão», «Delivery» e «Cardápio» apareciam como três\n // linhas `#0` idênticas. Ver `unassignedLabel`.\n number: Number(p.label.replace(/\\D/g, '')) || 0,\n name: p.label,\n seats: p.seats ?? null,\n }))}\n targetName={destino?.label ?? null}\n onPlace={(m) => {\n if (!destino) return\n // O CENTRO do ambiente: o único ponto que existe em qualquer forma e\n // tamanho, e onde o olho procura pela mesa que acabou de aparecer.\n const z = destino\n const centro = {\n x: Math.round(((z.widthM ?? 10) / 2) * 100) / 100,\n y: Math.round(((z.heightM ?? 8) / 2) * 100) / 100,\n }\n void onUpdateTable(m.id, { zoneId: z.id, posX: centro.x, posY: centro.y } as never)\n }}\n />\n ) : null\n\n const onMoveTable = onMoveTableProp\n ? async (id: string, to: { x: number; y: number }) => {\n setSalvandoPlanta(true)\n try { await onMoveTableProp(id, to) } finally { setSalvandoPlanta(false) }\n }\n : undefined\n\n // Sair da planta FECHA a escala.\n //\n // O botão que a abre só existe no modo planta, então voltar para a grade\n // simplificada deixava o painel aberto sem caminho de volta: a coluna\n // inteira tomada por uma tela cujo controle tinha acabado de sumir. Quem\n // troca de vista está trocando de assunto.\n useEffect(() => {\n if (shiftMode && floorLayout !== 'plan') onCloseShift?.()\n }, [shiftMode, floorLayout, onCloseShift])\n const isPhone = usePhone()\n /**\n * A área escolhida FILTRA na grade e FOCA na planta.\n *\n * São duas respostas para a mesma pergunta, e a diferença é o que cada vista\n * sabe fazer. A grade não tem noção de lugar: esconder o que não interessa é\n * tudo o que ela pode. A planta TEM — e ali esconder custa o contexto: um\n * ambiente sozinho no meio do branco não diz onde ele fica. Então a planta\n * aproxima e apaga a vizinhança, em vez de removê-la.\n */\n /**\n * O que o rodapé lista: as PRAÇAS, se a casa as desenhou; os ambientes, se\n * não. A praça é o recorte que o garçom procura (\"as minhas mesas\") e é a\n * que tem cor; o ambiente é o chão, e já está escrito na planta.\n */\n const pracas = config.positions.serviceAreas ?? []\n const ambientes = config.positions.zones ?? []\n /** As mesas de cada praça, para o filtro da grade funcionar com elas. */\n /**\n * Quem pertence a cada praça — o que o BANCO diz.\n *\n * A conta é feita nos três gestos que mudam a geometria: desenhar a praça,\n * redimensioná-la e arrastar a mesa. É o modelo do V1, que faz isso num\n * gatilho — *«a lista vem do banco, não da conta da tela»*.\n *\n * Eu tinha posto aqui uma segunda conta, por geometria, a cada render. Ela\n * cobria o gesto que faltava (arrastar a mesa), mas ao preço de a tela\n * discordar do banco — duas fontes para a mesma pergunta. Com o\n * `moveTable` recalculando, a fonte volta a ser uma.\n */\n const mesasDaPraca = new Map(pracas.map((a) => [a.id, new Set(a.tableIds ?? [])]))\n\n /**\n * DOIS níveis, e o de cima filtra o de baixo: ambiente, depois praça.\n *\n * A praça vive DENTRO de um ambiente — no Pertinho, as Praças 1 a 3 são da\n * Área Aberta e as 4 e 5 da Coberta. Listar as cinco lado a lado com os dois\n * ambientes punha em fila coisas de ordens diferentes, e obrigava o garçom a\n * saber de cor a qual área cada praça pertence.\n *\n * O ambiente de uma praça é o das MESAS dela: é o vínculo que existe no\n * banco, e é o que continua verdadeiro se alguém mover a praça de lugar.\n */\n const ambienteDaPraca = new Map<string, string | undefined>()\n for (const a of pracas) {\n const primeira = (a.tableIds ?? []).map((id) => livePositions.find((p) => p.id === id)).find(Boolean)\n ambienteDaPraca.set(a.id, primeira?.zoneId ?? undefined)\n }\n const pracasDoAmbiente = (zoneId?: string) =>\n zoneId ? pracas.filter((a) => ambienteDaPraca.get(a.id) === zoneId) : pracas\n\n const plantaNaTela = floorLayout === 'plan' && !isPhone\n /**\n * A ESCALA recorta primeiro — antes da praça e antes da busca.\n *\n * É o recorte de quem o garçom É, não de onde ele está olhando: as outras\n * duas perguntas só fazem sentido dentro das mesas que são dele. E na\n * PLANTA o recorte não some com nada: um mapa com buracos é pior que um\n * mapa inteiro, e lá as mesas dos outros ficam translúcidas.\n */\n const mesasDaPracaPorMesa = useMemo(() => {\n const m = new Map<string, string[]>()\n for (const a of config.positions.serviceAreas ?? []) {\n for (const t of a.tableIds ?? []) m.set(t, [...(m.get(t) ?? []), a.id])\n }\n return m\n }, [config.positions.serviceAreas])\n const zonePositionsNoEscopo = vendoTodas || plantaNaTela\n ? zonePositions\n : zonePositions.filter((p) => inScope(p.id, mesasDaPracaPorMesa.get(p.id) ?? [], floorScope ?? null))\n\n /**\n * As mesas dos OUTROS, na planta — as que ficam translúcidas.\n *\n * O V1 escreve a distinção em duas linhas, no mapa que alimenta a planta:\n *\n * > *\"A planta ESMAECE o que está fora do escopo (contexto espacial); a\n * > grade REMOVE. Com «Ver todas», nada esmaece.\"*\n *\n * O V2 tinha a metade de cima — `plantaNaTela` já impede o recorte, e o\n * comentário logo acima promete que «lá as mesas dos outros ficam\n * translúcidas». Só que `dimmedIds` era uma prop que NINGUÉM passava: a\n * planta desenhava as 208 mesas com a mesma opacidade, e o garçom de uma\n * praça via as duas telas discordarem — a grade dizendo que ele tem doze\n * mesas e a planta mostrando o salão inteiro como se fosse dele.\n *\n * `undefined` e não um conjunto vazio quando não há recorte: o vazio ainda\n * faria a planta perguntar a cada mesa, e a resposta seria sempre a mesma.\n */\n const foraDoEscopo = useMemo(() => {\n if (vendoTodas || !floorScope) return undefined\n const fora = new Set<string>()\n for (const p of zonePositions) {\n if (!inScope(p.id, mesasDaPracaPorMesa.get(p.id) ?? [], floorScope)) fora.add(p.id)\n }\n return fora.size ? fora : undefined\n }, [vendoTodas, floorScope, zonePositions, mesasDaPracaPorMesa])\n\n const positionsDoFiltro = activeZoneId && !plantaNaTela\n ? zonePositionsNoEscopo.filter((p) => (\n mesasDaPraca.has(activeZoneId)\n ? (mesasDaPraca.get(activeZoneId)?.has(p.id) ?? false)\n : p.zoneId === activeZoneId\n ))\n : zonePositionsNoEscopo\n /**\n * E a BUSCA, por último — depois da praça, nunca no lugar dela.\n *\n * São duas perguntas diferentes: a praça é \"que parte do salão eu atendo\",\n * a busca é \"onde está a mesa 12\". Buscar dentro do recorte é o que o V1\n * faz, e é o que permite ao garçom procurar sem antes desfazer o filtro que\n * ele mesmo escolheu.\n *\n * Só na GRADE: a planta é um mapa, e sumir com as mesas de um mapa deixa\n * buracos onde o olho procura vizinhança. Lá o termo não filtra.\n */\n const positionsDoSalao = query.trim() && !plantaNaTela\n ? positionsDoFiltro.filter((p) => tableMatches({ label: p.label, name: p.customerName }, query))\n : positionsDoFiltro\n const wideRail = useWideRail()\n\n /** A faixa da view tem conteúdo? Se não, ela não é desenhada.\n *\n * Só o salão tem o que pôr ali (o segmentado de vista e o de praça); no\n * cardápio, no delivery e no caixa ela ficava vazia com 72px de altura,\n * empurrando o conteúdo para baixo sem dizer nada. A busca entra quando a\n * trilha é estreita demais para carregá-la. */\n const headHasContent = menu?.view === 'floor' || !wideRail\n /**\n * No telefone cabem os QUATRO canais, sem \"Mais\".\n *\n * Os canais de venda são quatro e sempre os mesmos; escondê-los atrás de um\n * quinto botão obriga dois toques para chegar ao Delivery, que no domingo à\n * noite é o canal mais movimentado da casa. O \"Mais\" só existe quando a casa\n * tem MAIS que os canais — e aí ele carrega o excedente, não um deles.\n *\n * A ordem muda com a tela de propósito: no telefone o Delivery vem antes da\n * Retirada porque é o que mais se toca ali; no desktop, onde tudo está à\n * vista de uma vez, vale a ordem do balcão para fora.\n */\n const visibleMenus = config.menus.filter((m) => !m.hidden)\n const phoneOrder = [...visibleMenus].sort((a, b) => {\n const peso = (m: PosMenu) => (m.id === 'delivery' ? 1 : m.id === 'retirada' ? 2 : 0)\n return peso(a) - peso(b)\n })\n const phoneTabs = phoneOrder.slice(0, Math.max(TABS_ON_PHONE, Math.min(4, phoneOrder.length)))\n const overflowTabs = phoneOrder.slice(phoneTabs.length)\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 /**\n * Quem responde é a página ATIVA — nunca o cardápio por decreto.\n *\n * Aqui o primeiro caractere ARRASTAVA o operador para o cardápio.\n * No salão isso é o oposto do que ele pediu: digitar «12» procurando\n * a mesa 12 trocava a tela por uma grade de produtos. O V1 filtra\n * onde você está, e é por isso que o rótulo diz o assunto.\n *\n * Numa visão que não busca nada — o caixa — o campo nem aparece, e\n * então buscar SÓ pode querer dizer cardápio; aí o salto volta a\n * fazer sentido e é o único caso em que ele acontece.\n */\n const cat = config.menus.find((m) => m.view === 'catalog')\n if (e.target.value && cat && !viewIsSearchable(menu?.view)) setMenuId(cat.id)\n }}\n // O rótulo diz o ASSUNTO do canal: \"Buscar\" não diz se vai achar a\n // mesa 12 ou o item 12, e o operador descobre digitando.\n placeholder={searchPlaceholder(menu?.view) ?? 'Buscar'}\n aria-label={searchPlaceholder(menu?.view) ?? 'Buscar'}\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={['pos', theme === 'light' ? 'pos-light' : '', className].filter(Boolean).join(' ')}\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 {/* A faixa de marca só existe quando o hospedeiro NÃO montou a sua.\n Um PDV aberto por cima de uma retaguarda põe o próprio seletor de\n conta no `railTop` — e ali acima ficava uma segunda linha dizendo\n o nome do PRODUTO, que empurrava a chave de modo 48px para baixo.\n Quem troca de modo via o entorno da chave pular, e uma chave cujo\n entorno se move deixa de ser lida como chave. */}\n {(brandMark || brandName || !railTop) && (\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\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 && viewIsSearchable(menu?.view) && <div className=\"pos-rail__search\">{searchField}</div>}\n\n\n {/* Uma seção por grupo, na ordem em que os menus foram declarados.\n O grupo sem nome é \"Operação\", que é como a trilha sempre foi e o\n que o V1 mostra: os CANAIS de venda, não as telas. */}\n {railGroups.map(([label, items]) => (\n <div key={label}>\n <div className=\"pos-rail__label pos-t-xs\">{label}</div>\n <div className=\"pos-nav\">\n {items.map((m) => {\n const Icon = (m.icon ? NAMED_ICON[m.icon] : undefined)\n ?? MENU_ICON[m.view] ?? ClipboardList\n return (\n <button\n key={m.id}\n className=\"pos-nav__item\"\n aria-current={m.id === canalMarcado ? 'page' : undefined}\n onClick={() => trocarCanal(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 </div>\n ))}\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 {/* A faixa só existe quando tem o que dizer.\n Não há TÍTULO de view: a trilha já mostra qual linha está acesa, e\n repetir \"Cardápio\" numa faixa de 72px é o nome da tela dito duas\n vezes ocupando o lugar do primeiro produto — o V1 não tem título\n em view nenhuma. Sem título e sem segmentado (que é o caso do\n cardápio), a faixa inteira sai e a grade começa no topo, como lá.\n A unidade também não volta aqui: ela vive dentro do seletor de\n conta, no alto da trilha. */}\n <div className=\"pos-head\" data-empty={!headHasContent || undefined}>\n\n {!wideRail && viewIsSearchable(menu?.view) && 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 {/* Com ÍCONE, como no V1: o par se reconhece de relance, e o\n rótulo confirma em vez de ser a única pista. */}\n {([['grid', 'Simplificada', LayoutGrid], ['plan', 'Planta baixa', MapIcon]] as const).map(([value, label, Icon]) => (\n <button\n key={value}\n className=\"pos-seg__btn\"\n aria-pressed={floorLayout === value}\n onClick={() => { haptic('tap'); setFloorLayout(value) }}\n >\n <Icon size={14} strokeWidth={2.2} aria-hidden /> {label}\n </button>\n ))}\n </span>\n )}\n\n {/* «Configurar mesas» divide a coluna com o segmentado, como no\n V1 — mesmo ícone, mesmo rótulo, e só no salão. */}\n {menu?.view === 'floor' && !isPhone && onConfigureTables && (\n <button\n className=\"pos-seg__gear\"\n onClick={() => { haptic('tap'); onConfigureTables() }}\n aria-label=\"Configurar mesas\"\n title=\"Configurar mesas\"\n >\n <Settings2 size={15} strokeWidth={2.2} aria-hidden />\n </button>\n )}\n\n </span>\n\n </div>\n\n {/* O subcabeçalho de CONFIGURAÇÃO da planta.\n Separado da linha de cima porque é outro assunto: lá se escolhe\n COMO ver o salão, aqui se mexe em quem atende e no desenho dele.\n Só no modo planta, que é onde praça e escala existem — na grade\n simplificada não há praça nenhuma para atribuir. */}\n {/* A barra da PLANTA: o que existe, e o botão de mexer nela.\n A contagem esconde o zero — \"0 fora\" permanente é ruído que\n ensina a ignorar a linha inteira, e é assim que o V1 a escreve. */}\n {menu?.view === 'floor' && plantaNaTela && (\n <div className=\"pos-subhead\">\n <span className=\"pos-planbar__n\">\n {(config.positions.zones ?? []).length} ambiente(s), {zonePositions.length} mesa(s)\n {foraDaPlanta > 0 ? `, ${foraDaPlanta} fora` : ''}\n {(config.positions.serviceAreas ?? []).length > 0\n ? `, ${config.positions.serviceAreas!.length} praça(s)` : ''}\n </span>\n {/* AS TRÊS FERRAMENTAS DE PRAÇA.\n Só em edição: desenhar região de atendimento é reforma de\n salão, não turno. O rótulo vive no `aria-label` e no título\n — três ícones numa barra que já tem texto. */}\n {editandoPlanta && onCreateZone && (\n <div className=\"pos-planbar__tools\" role=\"group\" aria-label=\"Desenhar praça\">\n <span className=\"pos-planbar__tl\">Praça</span>\n {ZONE_TOOLS.map(({ id, label, Icon }) => (\n <button\n key={id}\n className=\"pos-planbar__t\"\n aria-label={label}\n aria-pressed={ferramenta === id}\n disabled={plantaTravada}\n title={plantaTravada ? 'Organize os ambientes primeiro' : label}\n onClick={() => {\n haptic('tap')\n setFerramenta((f) => (f === id ? null : id))\n setPracaNaFicha(null)\n // Armar a ferramenta SOLTA a seleção: o próximo toque\n // é desenho, e a ficha aberta ofereceria campos de um\n // alvo que o gesto já não alcança.\n setMesaNaFicha(undefined)\n }}\n >\n <Icon size={15} strokeWidth={2.2} aria-hidden />\n </button>\n ))}\n </div>\n )}\n {/* DAQUI PARA A DIREITA é o que se FAZ com a planta. À\n esquerda fica o que ela É — a contagem e as ferramentas de\n desenho. É a divisão do V1 (`ml-auto` na barra dele), e sem\n ela os cinco controles viravam uma fileira sem hierarquia:\n «Escala de hoje» ao lado de «Concluir» ao lado dos ícones de\n praça, todos com o mesmo peso. */}\n {/* A zona da direita é UM bloco, não itens soltos.\n A barra mede ~856px com o rail aberto, e os cinco controles\n não cabem numa linha. Soltos, quem quebrava era o último —\n «Organizar automaticamente» descia sozinho, alinhado à\n ESQUERDA, parecendo pertencer à outra zona. Agrupados, eles\n descem juntos e continuam à direita, que é onde as ações\n estão. */}\n <span className=\"pos-subhead__acts\">\n {editandoPlanta && (\n <span className=\"pos-planbar__hint\" aria-live=\"polite\">\n {salvandoPlanta ? 'Salvando…' : 'Salvo'}\n </span>\n )}\n {floorTool}\n {onMoveTableProp && (\n <button\n className=\"pos-planbar__b\"\n aria-pressed={editandoPlanta}\n onClick={() => {\n haptic('tap')\n setEditandoPlanta((v) => !v)\n // A praça escolhida é de um MODO: fora dele as alças não\n // gravam nada, e deixá-las na tela ofereceria um gesto\n // que já não acontece.\n setPracaNaFicha(null)\n setAmbienteNaFicha(null)\n setContornoAberto(false)\n setEscolhendoMesas(false)\n // Sair da edição fecha a ficha: ela é de um modo que\n // acabou, e deixá-la aberta ofereceria campos que já não\n // gravam nada.\n setMesaNaFicha(undefined)\n }}\n >\n <Pencil size={14} strokeWidth={2.3} aria-hidden />\n {editandoPlanta ? 'Concluir' : 'Editar planta'}\n </button>\n )}\n {editandoPlanta && onArrange && (\n <button\n // Com o cadeado ligado ele vira o PRIMÁRIO, como no V1: as\n // ferramentas de praça estão apagadas ao lado, e a única\n // saída não pode ter o peso visual das outras.\n className={`pos-planbar__b pos-planbar__b--flat${plantaTravada ? ' pos-planbar__b--go' : ''}`}\n onClick={() => { haptic('tap'); setOrganizando(true) }}\n >\n <LayoutGrid size={14} strokeWidth={2.3} aria-hidden />\n Organizar automaticamente\n </button>\n )}\n </span>\n </div>\n )}\n\n {/* A INSTRUÇÃO DO GESTO é uma linha, não um item da barra.\n Espremida no fim da fileira ela competia com os botões e era a\n primeira coisa a quebrar em telas estreitas — justo o texto que\n explica o que fazer. Aqui ela fica onde as outras instruções da\n planta já moram, e o estado de salvamento sobe para junto das\n ações, como no V1. */}\n {menu?.view === 'floor' && plantaNaTela && editandoPlanta && !ferramenta && (\n <p className=\"pos-planbar__tip\" role=\"status\">\n Arraste as mesas para o lugar delas. Salva sozinho.\n </p>\n )}\n\n {/* O CADEADO. Com os ambientes empilhados na origem, o desenho seria\n feito sobre um layout que o banco não conhece, e a praça pegaria\n mesas diferentes das que estão na tela. O V1 diz isso com todas\n as letras, e é a frase que explica por que os ícones apagaram. */}\n {menu?.view === 'floor' && plantaNaTela && editandoPlanta && plantaTravada && onCreateZone && (\n <p className=\"pos-planbar__lock\" role=\"status\">\n <AlertTriangle size={13} strokeWidth={2.3} aria-hidden />\n Os ambientes ainda não têm posição gravada. Arraste um deles antes\n de desenhar praças — senão a praça pegaria mesas diferentes das que\n você vê aqui.\n </p>\n )}\n\n {/* A faixa de instrução do gesto armado — um texto por ferramenta,\n porque contornar e arrastar na diagonal não são a mesma coisa. */}\n {menu?.view === 'floor' && plantaNaTela && ferramenta && (\n <p className=\"pos-planbar__tip\" role=\"status\">\n {ferramenta === 'polygon'\n ? 'Contorne a área com o dedo ou o mouse, sem soltar. Ao soltar, a praça nasce.'\n : 'Arraste na diagonal para cobrir a área das mesas.'}\n {' '}<kbd className=\"pos-kbd\">Esc</kbd> cancela.\n </p>\n )}\n {menu?.view === 'floor' && floorLayout === 'plan' && !plantaNaTela && floorTool && (\n <div className=\"pos-subhead\">{floorTool}</div>\n )}\n\n {/* As praças, flutuando no rodapé das mesas.\n No cabeçalho elas competiam com \"como ver o salão\", que é outra\n pergunta. Embaixo e por cima da grade, ficam onde o polegar já\n está e se leem como o que são: um FILTRO do que está à vista. O\n vidro deixa as mesas aparecerem por trás — a barra não corta o\n salão em dois. */}\n {menu?.view === 'floor' && (ambientes.length > 0 || pracas.length > 0) && (\n <div className=\"pos-zonestack\">\n {/* O FILTRO do salão, em dois níveis: ambiente em cima, praça\n embaixo. O de cima recorta o de baixo — a praça vive dentro de um\n ambiente, e listar as duas ordens lado a lado obrigava o garçom a\n saber de cor a qual área cada praça pertence.\n\n Embaixo e por cima da grade, onde o polegar já está, e em vidro\n para as mesas continuarem aparecendo por trás: a barra não corta\n o salão em dois. */}\n {menu?.view === 'floor' && ambientes.length > 0 && (\n <div className=\"pos-zones\" role=\"group\" aria-label=\"Ambientes\">\n <button\n className=\"pos-zone\"\n aria-pressed={activeAmbienteId === undefined}\n onClick={() => {\n haptic('tap')\n setActiveAmbienteId(undefined)\n setActiveZoneId(undefined)\n }}\n >\n Todos\n </button>\n {ambientes.map((z) => (\n <button\n key={z.id}\n className=\"pos-zone\"\n aria-pressed={z.id === activeAmbienteId}\n onClick={() => {\n haptic('tap')\n const novo = z.id === activeAmbienteId ? undefined : z.id\n setActiveAmbienteId(novo)\n // Trocar de ambiente ZERA a praça: a que estava escolhida\n // é de outra área, e mantê-la mostraria um recorte vazio.\n setActiveZoneId(novo)\n }}\n >\n {z.color && <span className=\"pos-zone__dot\" style={{ background: z.color }} aria-hidden />}\n {z.label}\n </button>\n ))}\n </div>\n )}\n\n {menu?.view === 'floor' && pracasDoAmbiente(activeAmbienteId).length > 0 && (\n <div className=\"pos-zones pos-zones--sub\" role=\"group\" aria-label=\"Praças\">\n {pracasDoAmbiente(activeAmbienteId).map((a) => (\n <button\n key={a.id}\n className=\"pos-zone\"\n aria-pressed={a.id === activeZoneId}\n onClick={() => {\n haptic('tap')\n setActiveZoneId(a.id === activeZoneId ? activeAmbienteId : a.id)\n }}\n >\n {a.color && <span className=\"pos-zone__dot\" style={{ background: a.color }} aria-hidden />}\n {a.name}\n </button>\n ))}\n </div>\n )}\n\n </div>\n )}\n\n {/* O aviso de escopo, ACIMA do salão — na grade e na planta. Ele\n é a resposta a \"de quem são estas mesas?\", e ela precede\n qualquer outra pergunta sobre o salão. */}\n {menu?.view === 'floor' && !loading && (\n <FloorScopeBanner\n scope={floorScope ?? null}\n areas={(config.positions.serviceAreas ?? []).map((a) => ({ id: a.id, name: a.name }))}\n seeingAll={vendoTodas}\n onSeeAll={setVendoTodas}\n />\n )}\n {menu?.view === 'floor' && loading && <FloorSkeleton />}\n {menu?.view === 'floor' && !loading && (\n <FloorView\n // OS TRÊS FATOS que decidem a frase do salão vazio. O V1 escolhe\n // pela causa, e «escolha outra área» só ajuda numa delas.\n // Ver `floorEmpty.ts`.\n scoped={!vendoTodas && !!floorScope && !!foraDoEscopo?.size}\n houseHasTables={positions.length > 0}\n areaFiltered={!!activeZoneId}\n dimmedIds={foraDoEscopo}\n layout={isPhone ? 'grid' : floorLayout}\n positions={positionsDoSalao}\n config={config.positions}\n activeId={activePositionId}\n onSelect={selectPosition}\n now={now}\n picking={seating != null}\n focusAreaId={activeZoneId}\n serviceAreas={config.positions.serviceAreas}\n editingPlan={editandoPlanta}\n onMoveTable={onMoveTable}\n onPickTable={editandoPlanta ? (id) => { setMesaNaFicha(id); setPracaNaFicha(null); setAmbienteNaFicha(null); setEscolhendoMesas(false) } : undefined}\n tool={ferramenta}\n draftColor={corDaProximaPraca}\n onDrawZone={onCreateZone ? aoDesenharPraca : undefined}\n selectedZoneId={pracaNaFicha}\n onSelectZone={(id) => {\n setPracaNaFicha(id)\n setAmbienteNaFicha(null)\n // Um slot, um alvo: a coluna tem um lugar só, e deixar as\n // duas fichas disputá-lo põe o título de uma sobre o corpo da\n // outra — já aconteceu, e o sintoma não parece com a causa.\n setMesaNaFicha(undefined)\n if (!id) setEscolhendoMesas(false)\n }}\n onUpdateZone={onUpdateZone ? aoMexerNaPraca : undefined}\n onRefuseZone={(motivo) => setNotice({ text: `Não dá para deixar assim — ${motivo}`, tone: 'warn' })}\n selectedAreaId={ambienteNaFicha}\n onSelectArea={(id) => {\n // Um slot, um alvo — a mesma regra das outras duas fichas.\n setAmbienteNaFicha(id)\n setMesaNaFicha(undefined)\n setPracaNaFicha(null)\n setEscolhendoMesas(false)\n }}\n pickingZone={escolhendoMesas}\n onToggleTableInZone={pracaNaFicha && onTogglaMesaNaPraca\n ? (tableId, how) => onTogglaMesaNaPraca(pracaNaFicha, tableId, how)\n : undefined}\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 pending={pendingByItem}\n onAdd={addItem}\n onRemove={removeItem}\n query={query}\n menuLabel={menuFreshnessLabel(\n { fetchedAt: menuFetchedAt, refreshing: menuRefreshing, failed: menuStale }, now)}\n onRefreshMenu={onRefreshMenu}\n menuRefreshing={menuRefreshing}\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 // Sentar gente é coisa de MESA. A comanda de balcão virou posição\n // para chegar à bandeja, e sem este corte ela apareceria como\n // destino de uma reserva — «acomodar a família na Balcão #1898».\n positions={zonePositions}\n now={now}\n onOpenPosition={(id) => {\n const p = livePositions.find((x) => x.id === id)\n if (p) selectPosition(p)\n }}\n // O MESMO escritor da Fila. Aqui o check-in só mexia no estado\n // local: o anfitrião marcava «chegou» na tela de Reservas, o\n // banco seguia `confirmed`, e o terminal do balcão ao lado não\n // via nada. Meia correção — a Fila gravando e esta não — seria\n // pior que nenhuma: as duas telas mostram a MESMA reserva.\n onMarkArrived={(id) => {\n setBookings((prev) => ({ ...prev, [id]: 'arrived' }))\n void Promise.resolve(onReservationArrived?.(id)).catch((erro) => {\n // Falhou: a linha VOLTA, como na Fila.\n setBookings((prev) => {\n const { [id]: _, ...resto } = prev\n return resto\n })\n setNotice({ text: writeFailure(erro).text, tone: 'warn' })\n })\n }}\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 setSeatingFrom('reservation')\n setSeating(reservation)\n const floor = config.menus.find((m) => m.view === 'floor')\n if (floor) setMenuId(floor.id)\n }}\n />\n )}\n\n {/* A fila de espera. Vizinha das reservas de propósito: são a mesma\n operação vista da porta — quem quer mesa, antes e durante o\n serviço. */}\n {menu?.view === 'waitlist' && (\n <WaitlistView\n entries={waitlist}\n // As MESMAS reservas da outra aba, com o estado local do turno por\n // cima: é uma lista só, lida de dois lugares. Duas leituras\n // diferentes do mesmo dia é como as duas telas discordam.\n reservations={reservations.map((r) => ({\n ...r,\n ...(bookings[r.id] ? { status: bookings[r.id]! } : {}),\n }))}\n zones={(config.positions.zones ?? []).map((z) => ({ id: z.id, label: z.label }))}\n now={now}\n query={query}\n busyId={waitlistBusy}\n canSeat={(e) => seatableTables(zonePositions, e.party).length > 0}\n onAdd={() => setWaitlistForm(true)}\n onCall={(e) => {\n setWaitlistBusy(e.id)\n void Promise.resolve(onWaitlistCall?.(e.id))\n .then(() => setNotice({ text: `${e.name} foi chamado`, tone: 'ok' }))\n .catch((erro) => setNotice({ text: writeFailure(erro).text, tone: 'warn' }))\n .finally(() => setWaitlistBusy(undefined))\n }}\n onSeat={(e) => {\n // Armar, não abrir. Que mesa um grupo recebe é decisão de quem\n // está olhando o salão — mesma regra da reserva, e é por isso\n // que as duas passam pelo mesmo caminho.\n //\n // O aviso do V1 continua: quando nada serve, ele sai ANTES de\n // o anfitrião procurar mesa por mesa. Mas não bloqueia — juntar\n // duas mesas pelo mapa é a saída, e ela é dele.\n if (seatableTables(zonePositions, e.party).length === 0) {\n setNotice({ text: noTableFitsMessage(e.party), tone: 'warn' })\n }\n setSeatingFrom('waitlist')\n setSeating({ id: e.id, name: e.name, at: e.joinedAt, party: e.party, status: 'booked', phone: e.phone })\n const floor = config.menus.find((m) => m.view === 'floor')\n if (floor) setMenuId(floor.id)\n }}\n onNoShow={(e) => {\n setWaitlistBusy(e.id)\n void Promise.resolve(onWaitlistNoShow?.(e.id))\n .then(() => setNotice({ text: `${e.name} saiu da fila`, tone: 'ok' }))\n .catch((erro) => setNotice({ text: writeFailure(erro).text, tone: 'warn' }))\n .finally(() => setWaitlistBusy(undefined))\n }}\n onMarkArrived={(r) => {\n // O estado local entra JÁ: o check-in é um toque de balcão com\n // gente na frente, e esperar o banco para a linha mudar faz o\n // anfitrião tocar de novo.\n setBookings((prev) => ({ ...prev, [r.id]: 'arrived' }))\n setWaitlistBusy(r.id)\n void Promise.resolve(onReservationArrived?.(r.id))\n .then(() => setNotice({ text: `${r.name} chegou`, tone: 'ok' }))\n .catch((erro) => {\n // Falhou: a linha VOLTA. Um «Chegou» que ficou só na tela é\n // pior que nenhum — o outro terminal não o vê.\n setBookings((prev) => {\n const { [r.id]: _, ...resto } = prev\n return resto\n })\n setNotice({ text: writeFailure(erro).text, tone: 'warn' })\n })\n .finally(() => setWaitlistBusy(undefined))\n }}\n onSeatReservation={(r) => {\n // O MESMO caminho do grupo sem reserva: armar e escolher a mesa\n // na planta. Duas formas de sentar gente na mesma tela seria\n // ensinar dois gestos para uma decisão só.\n if (seatableTables(zonePositions, r.party).length === 0) {\n setNotice({ text: noTableFitsMessage(r.party), tone: 'warn' })\n }\n setSeatingFrom('reservation')\n setSeating(r)\n const floor = config.menus.find((m) => m.view === 'floor')\n if (floor) setMenuId(floor.id)\n }}\n />\n )}\n {/* A escala diz quem atende cada MESA; comanda de canal não tem garçom\n de salão, e oferecê-la aqui é pedir uma atribuição sem sentido. */}\n {menu?.view === 'shift' && <ShiftView positions={zonePositions} staff={staff} />}\n\n {/* A bandeja NÃO aparece onde a lista já está aberta: na planta do\n salão e no quadro do delivery. Ali a grade já mostra cada mesa\n ocupada, com nome, tempo e total — repetir as mesmas comandas\n numa faixa embaixo é dizer duas vezes a mesma coisa e roubar\n altura de quem está escolhendo a mesa. É assim no V1, onde a\n bandeja só acompanha o cardápio e os canais sem mesa.\n E DURANTE A ACOMODAÇÃO ela sai de cena por inteiro. A tela\n passou a fazer UMA pergunta — «em qual mesa?» — e a régua de\n comandas abertas não responde nenhuma parte dela: cada ficha ali\n é um convite a abandonar a escolha pela metade, com o grupo de pé\n esperando. A faixa flutuante em cima já diz quem está sendo\n acomodado; embaixo não sobra nada a dizer. */}\n <Dock\n paidByPosition={paidByPosition}\n positions={\n seating || viewListsOpenOrders(menu?.view)\n ? []\n : livePositions.filter((p) => {\n if (p.status === 'free') return false\n // A bandeja mostra o CANAL corrente, como no V1.\n //\n // Sem isto o Balcão exibia a comanda da Mesa 11: uma ficha\n // que, ao ser tocada, leva o operador para outro canal sem\n // avisar. A régua é \"o que está aberto AQUI\" — e é por ser\n // desse canal que a contagem da trilha e ela batem.\n //\n // O atalho `view === 'catalog'` saiu daqui. Ele existia\n // porque balcão e retirada dividiam o `kind` `counter`, e\n // filtrar por kind misturaria os dois de todo jeito. Com\n // `takeout` sendo um kind de verdade, cada canal responde\n // por si — e a bandeja da Retirada parou de oferecer a\n // conta do balcão, que ao ser tocada levava a venda para o\n // canal errado.\n //\n // A régua pergunta ao `canalMarcado`, NÃO ao `menu.id`.\n // São coisas diferentes desde que se descobriu que escolher\n // uma mesa joga o menu para o cardápio do BALCÃO (é o\n // primeiro `view: 'catalog'` da lista): comparando com o\n // menu cru, a bandeja ficava VAZIA justamente com uma mesa\n // aberta — o momento em que ela é o caminho mais curto para\n // a próxima. O V1 decide o canal ativo num lugar só e o usa\n // em dois, o trilho e a régua; aqui ele estava decidido num\n // lugar e usado em um.\n return canalMarcado ? MENU_KIND[canalMarcado] === p.kind : true\n })\n }\n activeId={activePositionId}\n onSelect={selectPosition}\n now={now}\n onDiscard={onDiscardTicket && ((p) => onDiscardTicket(p.id))}\n />\n\n {contornoAberto && ambienteCru && onUpdateArea && (\n <AreaOutlineSheet\n area={{\n name: ambienteCru.label,\n color: (ambienteCru as { color?: string | null }).color ?? null,\n shape: ambienteCru.shape ?? 'rectangle',\n widthM: ambienteCru.widthM ?? null,\n heightM: ambienteCru.heightM ?? null,\n polygon: ambienteCru.polygon ?? null,\n }}\n onCancel={() => setContornoAberto(false)}\n onSave={async (patch) => {\n setSalvandoPlanta(true)\n try {\n await onUpdateArea(ambienteCru.id, patch)\n setContornoAberto(false)\n setNotice({ text: 'Ambiente salvo', tone: 'ok' })\n } finally { setSalvandoPlanta(false) }\n }}\n />\n )}\n\n {organizando && onArrange && (\n <ArrangeSheet\n areas={(config.positions.zones ?? []).map<PlanArea>((z) => ({\n id: z.id, name: z.label,\n shape: z.shape ?? 'rect',\n widthM: z.widthM ?? null, heightM: z.heightM ?? null, polygon: z.polygon ?? null,\n }))}\n tables={livePositions.map<PlanTable>((p) => {\n const medidas = tableDims(p.tableShape)\n return {\n id: p.id,\n number: Number(p.label.replace(/\\D/g, '')) || 0,\n areaId: p.zoneId ?? null,\n // Formato que o desenho não conhece (o `bar` do balcão) cai\n // em retangular — ver `tableDims`.\n shape: (p.tableShape ?? 'rectangle') as 'round' | 'rectangle' | 'square',\n widthM: p.widthM ?? medidas.widthM,\n heightM: p.heightM ?? medidas.heightM,\n diameterM: p.diameterM ?? medidas.diameterM,\n rotation: p.rotation ?? 0,\n capacity: p.seats ?? 0,\n }\n })}\n onCancel={() => setOrganizando(false)}\n onConfirm={async (plan) => {\n setSalvandoPlanta(true)\n try {\n await onArrange(plan)\n setOrganizando(false)\n setNotice({ text: `${plan.tables.length} mesa(s) reposicionada(s)`, tone: 'ok' })\n } finally { setSalvandoPlanta(false) }\n }}\n />\n )}\n {/* A ACOMODAÇÃO EM CURSO — flutuando sobre o salão, não na bandeja.\n Ela morava dentro da régua de comandas abertas, que é outra coisa:\n ali ela disputava espaço com as pastilhas de praça e com a ficha\n da comanda ativa, e saía espremida e ilegível justamente no\n momento em que é a única instrução da tela.\n Aqui ela é o que de fato é: um MODO do aplicativo. Flutua sobre a\n planta, acima do aviso e da bandeja, e some quando a mesa é\n escolhida ou quando o anfitrião cancela. */}\n {seating && (\n <div className=\"pos-seating\" role=\"status\">\n <span className=\"pos-seating__pulse\" aria-hidden />\n <span className=\"pos-seating__who\">\n <span className=\"pos-seating__t\">{seating.name}</span>\n <span className=\"pos-seating__s pos-num\">\n {seating.party} {seating.party === 1 ? 'pessoa' : 'pessoas'} · escolha a {config.vocabulary.position}\n </span>\n </span>\n <button\n className=\"pos-seating__x\"\n onClick={() => setSeating(undefined)}\n aria-label=\"Cancelar a acomodação\"\n >\n <X size={15} strokeWidth={2.4} />\n </button>\n </div>\n )}\n {/* A FAIXA DO MAPA VELHO. Fixa enquanto o estado durar — ver\n `floorStale.ts`: o `Notice` some em 2,2s, e este aviso não pode. */}\n {floorStale && (\n <div className=\"pos-stale\" role=\"alert\">\n <AlertTriangle size={15} strokeWidth={2.4} aria-hidden />\n <span>{FLOOR_STALE_WARNING}</span>\n {onRetryFloor && (\n <button type=\"button\" className=\"pos-stale__b\" onClick={onRetryFloor}>\n {FLOOR_STALE_RETRY}\n </button>\n )}\n </div>\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 === canalMarcado ? 'page' : undefined}\n onClick={() => { haptic('tap'); trocarCanal(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 === canalMarcado ? 'page' : undefined}\n onClick={() => { haptic('tap'); trocarCanal(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 // O que JÁ ENTROU, do mesmo mapa que o rail do salão usa.\n order={{\n ...activePosition,\n paidCents: activePosition.paidCents\n ?? Object.values(paidByPosition?.[activePosition.id] ?? {}).reduce((a, b) => a + b, 0),\n }}\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 receivingAccounts={config.receivingAccounts}\n selectedAccountId={accountId}\n onSelectAccount={setAccountId}\n selectedInstallments={installments}\n selectedCardBrand={cardBrand}\n onSelectCardBrand={setCardBrand}\n onSelectInstallments={setInstallments}\n onClose={(cobranca) => {\n // Guardado ANTES de disparar a ação: `settleBill` é memoizada e\n // lê a cobrança pela ref — um estado aqui só existiria no render\n // seguinte, e o fechamento levaria a seleção da vez anterior.\n cobrancaRef.current = cobranca\n handleAction('close_bill')\n }}\n onFire={() => handleAction('fire')}\n fireShortcut={config.actions.find((a) => a.id === 'fire')?.shortcut}\n moreActions={moreActions}\n onMoreAction={handleAction}\n panel={fichaDaMesa ?? fichaDaPraca ?? fichaDoAmbiente ?? bandejaSemAmbiente ?? railPanel}\n // COMANDA ABERTA ≠ COMANDA COM ITENS. A mesa que o anfitrião acabou\n // de abrir não tem linha nenhuma e ainda assim é uma comanda: sem\n // isto o rail a trocava pelo histórico do dia, e com ele sumiam o\n // cabeçalho e o `⋯` — a mesa ficava sem transferência, cancelamento,\n // taxa nem cortesia.\n hasOpenOrder={activePosition?.status === 'occupied'}\n covers={coversByPosition?.[ticketKey]}\n settling={settling}\n onEditCover={onEditCover ? (c) => onEditCover(ticketKey, c) : undefined}\n payments={paymentsByPosition?.[ticketKey]}\n closedChannel={canalMarcado ?? undefined}\n onEditGuestCount={onEditGuestCount && activePosition ? () => onEditGuestCount(activePosition.id) : undefined}\n onServiceCharge={(guestId) => handleAction('service_charge', guestId)}\n closed={fechadasDoCanal}\n onReopenClosed={onReopenClosed}\n closedIsCounter={activePosition?.kind === 'counter' || menu?.view !== 'floor'}\n closedLoading={closedLoading}\n closedSeals={closedSeals}\n closedSealsFailed={closedSealsFailed}\n onOpenClosed={onOpenClosed}\n party={party}\n selectedGuestId={selectedGuestId}\n // A pastilha é um NOME na tela, e o vocabulário guarda a palavra em\n // caixa baixa (\"mesa\") porque ela também entra no meio de frases.\n sharedLabel={sharedLabel ?? capitalize(\n menu?.view === 'floor' || activePosition?.kind === 'table'\n ? config.vocabulary.position\n : menu?.label ?? config.vocabulary.position,\n )}\n serviceChargePercent={taxaVigente}\n guestPaidCents={paidByPosition?.[ticketKey]}\n onSelectGuest={setSelectedGuestId}\n onAddGuest={onAddGuest && ((draft) => onAddGuest(draft, ticketKey))}\n onIdentifyGuest={onIdentifyGuest}\n onRemoveGuest={onRemoveGuest}\n onLookupPhone={onLookupPhone}\n onPrint={() => handleAction('print')}\n onDiscount={() => handleAction('discount')}\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 // O nome digitado NESTA sessão ganha; sem ele, o que o banco já\n // sabe. `named` é o eco imediato do que o operador acabou de\n // escrever — some no F5 —, e `customerName` é o nome que a comanda\n // carrega. Sem a queda, reabrir o PDV apagava da tela um cliente que\n // continuava gravado na primeira cadeira.\n alias={activePositionId\n ? (named[activePositionId]?.alias ?? activePosition?.customerName)\n : 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 guestCount={activePosition?.guestCount}\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 // Quem SENTOU, não quantos lugares a mesa tem: «dividir por igual»\n // numa mesa de quatro lugares com duas pessoas saía pela metade.\n guests={activePosition?.guestCount ?? activePosition?.seats}\n onCancel={() => setSplitting(false)}\n onConfirm={() => setSplitting(false)}\n />\n )}\n\n {waitlistForm && (\n <WaitlistEntrySheet\n zones={(config.positions.zones ?? []).map((z) => ({ id: z.id, label: z.label }))}\n saving={waitlistSaving}\n onLookupPhone={onWaitlistLookupPhone}\n onCancel={() => setWaitlistForm(false)}\n onConfirm={(entry) => {\n setWaitlistSaving(true)\n void Promise.resolve(onWaitlistAdd?.(entry))\n .then(() => {\n setWaitlistForm(false)\n setNotice({ text: `${entry.name.trim()} entrou na fila de espera.`, tone: 'ok' })\n })\n .catch((erro) => setNotice({ text: writeFailure(erro).text, tone: 'warn' }))\n .finally(() => setWaitlistSaving(false))\n }}\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 // O nome da comanda TAMBÉM é gente.\n //\n // Quem identifica a mesa tem o telefone do cliente na mão naquele\n // instante; pedir o mesmo nome de novo na barra de participantes é\n // cobrar duas vezes pelo mesmo cadastro — e o segundo costuma não\n // acontecer, então a mesa fica com nome e a conta sem dono.\n onIdentify?.(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\nconst CHAVE_DOCK_RECOLHIDO = 'pos:dock-recolhido'\n\nfunction Dock({ positions, activeId, onSelect, now, onDiscard, paidByPosition }: {\n positions: PosPosition[]\n activeId?: string\n onSelect: (p: PosPosition) => void\n now: number\n /**\n * Descartar uma comanda VAZIA, de onde ela está à vista.\n *\n * Abrir um canal sem mesa (Balcão, Retirada) cria a comanda na hora, antes\n * de existir pedido — e a que não recebeu item nenhum fica na régua para\n * sempre, enchendo a contagem do canal. No Pertinho são sete das doze\n * abertas do dia, algumas com 92 horas.\n *\n * Só aparece em comanda de R$ 0,00 **e sem mesa**. Mesa fica de fora e a\n * razão é dura: ali \"vazia\" também quer dizer \"ocupada, ainda sem pedido\", e\n * soltá-la por engano devolve a mesa ao salão com gente sentada nela.\n */\n onDiscard?: (p: PosPosition) => void\n /** Quanto já foi pago em cada comanda, por participante — para a ficha\n * mostrar o SALDO e não o total. Ver `dockAmountCents`. */\n paidByPosition?: Record<string, Record<string, number>>\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 /**\n * Recolher é do TURNO, não da sessão inteira.\n *\n * `sessionStorage` guarda a escolha enquanto a aba vive e esquece quando ela\n * fecha. Em `localStorage`, o garçom que escondeu a faixa numa noite cheia a\n * encontraria escondida na segunda de manhã, sem lembrar por quê — e a faixa\n * é o caminho mais curto para trocar de mesa.\n */\n const [recolhido, setRecolhido] = useState(() => {\n try { return sessionStorage.getItem(CHAVE_DOCK_RECOLHIDO) === '1' } catch { return false }\n })\n const alternar = () => {\n haptic('tap')\n setRecolhido((v) => {\n const proximo = !v\n try { sessionStorage.setItem(CHAVE_DOCK_RECOLHIDO, proximo ? '1' : '0') } catch { /* aba privada */ }\n return proximo\n })\n }\n\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 // A faixa já some sozinha quando não há comanda aberta — ninguém precisa\n // esconder o que não existe. O recolhimento é para o outro caso: a noite em\n // que há doze abertas e o operador quer a grade inteira à vista.\n if (positions.length === 0) return null\n\n const rotulo = `${positions.length} comanda${positions.length === 1 ? '' : 's'} aberta${positions.length === 1 ? '' : 's'}`\n\n if (recolhido) {\n return (\n <footer className=\"pos-dock pos-dock--shut\">\n <button className=\"pos-dock__reopen\" onClick={alternar} aria-expanded={false}>\n <ChevronUp size={14} strokeWidth={2.4} aria-hidden />\n {rotulo}\n </button>\n </footer>\n )\n }\n\n return (\n /* O rótulo audível conta a MESMA lista que a visível. Antes ele vinha de\n um total da casa enquanto a bandeja mostra o canal corrente: quem ouve a\n tela recebia «dezoito comandas abertas» diante de cinco fichas. */\n <footer className=\"pos-dock\" aria-label={rotulo}>\n {/* A alça fica FORA da lista que rola: com doze comandas abertas, uma\n alça no fim da fila estaria a doze mesas de distância do polegar. */}\n <button\n className=\"pos-dock__shut\"\n onClick={alternar}\n aria-expanded\n aria-label=\"Recolher comandas abertas\"\n title=\"Recolher comandas abertas\"\n >\n <ChevronDown size={14} strokeWidth={2.4} aria-hidden />\n </button>\n <div className=\"pos-dock__strip pos-scroll-x\">\n {positions.map((p) => (\n <span key={p.id} className=\"pos-dchip__wrap\">\n {/* O ✕ mora FORA do botão da ficha: botão dentro de botão não é HTML\n válido e o clique de dentro nunca chega. */}\n {onDiscard && isDiscardable(p) && (\n <button\n className=\"pos-dchip__x\"\n onClick={(e) => { e.stopPropagation(); onDiscard(p) }}\n title=\"Descartar comanda vazia\"\n aria-label={`Descartar ${p.label}, comanda vazia`}\n >\n <X size={13} strokeWidth={2.6} aria-hidden />\n </button>\n )}\n <button\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 {/* O DISTINTIVO do V1: o número da mesa, ou o ÍCONE do canal.\n *«a etiqueta 'Del' só repetia, cortado, a palavra que está escrita\n ao lado — o ícone diz o canal sem gastar a etiqueta»*. Sem ele, a\n comanda de balcão virava «Ba» e a de retirada «Re». */}\n <span className=\"pos-dchip__tag pos-num\">\n {(() => {\n const numero = p.kind === 'table' ? p.label.replace(/\\D/g, '').slice(-3) : ''\n if (numero) return numero\n const Canal = p.kind === 'counter' ? Store\n : p.kind === 'delivery' ? Bike\n : p.kind === 'takeout' ? ShoppingBag\n : null\n return Canal\n ? <Canal size={14} strokeWidth={2.2} aria-hidden />\n : (p.label.replace(/\\D/g, '').slice(-3) || p.label.slice(0, 2))\n })()}\n </span>\n <span>\n {/* O CLIENTE, não o garçom — `{o.customer_name || 'Tipo #N'}` no\n `PosOpenTicketsDock.tsx` do V1. Mostrar `attendantName` fazia a\n ficha dizer quem SERVE onde deveria dizer quem CONSOME, e numa\n casa com três garçons um terço da régua ficava com o mesmo\n nome — que é o contrário do que uma régua de comandas serve. */}\n <span className=\"pos-dchip__t\">{p.customerName ?? p.label}</span>\n <span className=\"pos-dchip__s pos-num\">\n {/* O SALDO, não o total — `balance ?? total` no V1. A régua\n responde \"quanto ainda está lá fora\". */}\n {(() => {\n const saldo = dockAmountCents(p.totalCents, paidByPosition?.[p.id])\n return saldo != null && formatCents(saldo)\n })()}\n {briefElapsed(p.openedAt, now) && ` · ${briefElapsed(p.openedAt, now)}`}\n </span>\n </span>\n {(() => {\n // Dois avisos, e só dois: a conta pedida e a comanda velha. O V1\n // é literal em ambos, e a idade entra aqui porque uma comanda de\n // três dias na régua não se distingue de uma de dez minutos.\n const velha = p.openedAt\n && (now - new Date(p.openedAt).getTime()) >= ATRASO_MINUTOS * 60_000\n if (!p.billRequested && !velha) return null\n const texto = p.billRequested ? 'Conta pedida' : 'Aberta há mais de uma hora'\n return (\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.billRequested ? 'bill_requested' : 'attention'}\n title={texto}\n aria-label={texto}\n >\n {p.billRequested\n ? <Receipt size={14} strokeWidth={2.3} aria-hidden />\n : <AlertTriangle size={14} strokeWidth={2.3} aria-hidden />}\n </span>\n )\n })()}\n </button>\n </span>\n ))}\n </div>\n </footer>\n )\n}\n","// ---------------------------------------------------------------------------\n// LINHA QUE JÁ TEM DESCONTO NÃO ENTRA NA ESCOLHA.\n//\n// A regra do V1, em dois lugares do `OrderDiscountModal.tsx`:\n//\n// const itemsWithoutDiscount = allSelectableItems.filter(i => i.discountAmount === 0)\n// const toggleItem = (id) => { if (allWithDiscount.has(id)) return; … }\n// const selectAll = () => setSelectedItemIds(new Set(itemsWithoutDiscount.map(i => i.id)))\n//\n// O toque é ignorado e o «marcar todos» não a inclui. Não é capricho de tela: o\n// escritor SOBRESCREVE o abatimento da linha, então conceder de novo sobre uma\n// linha que já tem apaga o desconto anterior — o motivo, o autorizador e o\n// valor que alguém registrou. Para mudar, remove-se primeiro (é o que a lixeira\n// da seção «Com desconto» faz).\n//\n// O V2 pré-marcava TODAS as linhas. Medido no Pertinho em 29-09, na comanda da\n// Mesa 100: **74 das 83 linhas já tinham desconto, R$ 194,55 concedidos.** Abrir\n// a folha marcava as 83, e um único «Conceder» substituía os 74 abatimentos\n// pelo novo valor — sem aviso, sem confirmação, e com a tela mostrando um total\n// plausível depois.\n// ---------------------------------------------------------------------------\n\nexport interface DiscountableLine {\n id: string\n discountCents?: number\n}\n\n/** Esta linha pode receber desconto agora? */\nexport function lineTakesDiscount(line: DiscountableLine): boolean {\n return (line.discountCents ?? 0) <= 0\n}\n\n/**\n * As linhas que o «marcar todos» (e a seleção inicial) pega — só as sem\n * abatimento, como no V1.\n */\nexport function selectableLineIds(lines: readonly DiscountableLine[]): Set<string> {\n return new Set(lines.filter(lineTakesDiscount).map((l) => l.id))\n}\n\n/**\n * A frase para a linha travada.\n *\n * O V1 não tem texto aqui — ele só ignora o toque, e uma caixa que não marca\n * sem dizer por quê faz a pessoa tentar três vezes. A nossa diz a causa e o\n * caminho, que é a lixeira da seção «Com desconto» logo acima.\n */\nexport const LINHA_JA_TEM_DESCONTO = 'Já tem desconto — remova antes de conceder outro.'\n","// ---------------------------------------------------------------------------\n// «DESCONTOS APLICADOS»: o que a tela diz quando NÃO CONSEGUE LER o livro.\n//\n// O V1 põe a lista de abatimentos já concedidos no TOPO da folha de desconto, e\n// a razão é uma só: quem abriu essa folha vai conceder um abatimento, e a\n// primeira coisa que precisa saber é se já concederam. Sem a lista, o segundo\n// desconto sobre o mesmo prato só aparece quando a conta fecha — e aí o\n// dinheiro já saiu duas vezes.\n//\n// O V2 lia o livro assim:\n//\n// const linhas = await tables.getOrderDiscounts(orderId).catch(() => [])\n//\n// O `catch` engole TUDO: a RLS que recusa, a rede que cai, a tabela que não\n// existe. E os três viram a mesma coisa na tela — **«esta comanda não tem\n// desconto»** —, que é a única resposta que o operador não pode receber\n// errada. Na Mesa 100 do Pertinho, com R$ 194,55 já abatidos em 74 linhas, a\n// folha abria limpa.\n//\n// «Não sei» e «não tem» são respostas diferentes e levam a gestos diferentes:\n// com «não tem» o gerente concede; com «não sei» ele confere antes. Uma tela\n// que transforma a primeira na segunda decide pelo gerente, em silêncio, sobre\n// dinheiro.\n// ---------------------------------------------------------------------------\n\n// ---------------------------------------------------------------------------\n// E A SEGUNDA METADE, que é pior: a RLS não ERRA, ela ESCONDE.\n//\n// Tirar o `.catch` resolve a rede caída e a tabela ausente. Não resolve o caso\n// que está vivo no Pertinho: as 108 concessões têm `unit_id` NULO e a política\n// pede `has_permission('financial.read', unit_id)`. O PostgREST então responde\n// **200 com lista vazia** — não há erro para capturar, e «li e não tem» é\n// exatamente o que o livro vazio por recusa parece.\n//\n// Só que o V2 SABE que houve desconto: ele está somado nas linhas da comanda,\n// é o que o rodapé mostra como «Desconto − R$ 194,55» e é o que o papel\n// imprime. Quando o livro não explica o abatimento que a própria comanda\n// carrega, o livro está incompleto — e isso se descobre sem perguntar nada ao\n// banco.\n//\n// É a mesma pergunta que o caixa faz ao fechar: a soma das partes bate com o\n// total? Aqui ela responde se a lista que o gerente vai ler antes de conceder\n// está inteira.\n// ---------------------------------------------------------------------------\n\n/** O livro de abatimentos: o que já foi concedido, ou o fato de não dar para ler. */\nexport type DiscountBook<T> =\n | { known: true; grants: T[] }\n | { known: false; reason?: string }\n\nexport const BOOK_UNREADABLE_TITLE = 'Não foi possível ler os descontos já aplicados'\nexport const BOOK_UNREADABLE_HINT =\n 'Confira a comanda antes de conceder: pode já haver abatimento nela.'\n\n/** Lê o livro sem transformar falha em lista vazia. */\nexport async function readDiscountBook<T>(\n read: () => Promise<T[]>,\n): Promise<DiscountBook<T>> {\n try {\n return { known: true, grants: await read() }\n } catch (err) {\n return { known: false, reason: err instanceof Error ? err.message : undefined }\n }\n}\n\n/**\n * O livro está vazio de verdade?\n *\n * Só quando foi LIDO e não tinha nada. A dúvida não conta como vazio — é\n * justamente essa confusão que faz a folha abrir limpa sobre uma comanda com\n * desconto.\n */\nexport function bookIsEmpty<T>(book: DiscountBook<T> | undefined): boolean {\n return !!book && book.known && book.grants.length === 0\n}\n\n\n/** Quanto o livro explica, em centavos. */\nexport function bookTotalCents(\n grants: ReadonlyArray<{ amountCents?: number }>,\n): number {\n return grants.reduce((s, g) => s + Math.max(0, g.amountCents ?? 0), 0)\n}\n\n/**\n * O livro está INCOMPLETO — a comanda tem abatimento que ele não explica?\n *\n * `lineDiscountCents` é o desconto que as LINHAS carregam, que o PDV já soma\n * para mostrar o total. A folga de um centavo é para o arredondamento de cada\n * linha, não para esconder diferença.\n *\n * Devolve quanto está faltando, ou `null` quando o livro fecha.\n */\nexport function bookShortfallCents<T extends { amountCents?: number }>(\n book: DiscountBook<T> | undefined,\n lineDiscountCents: number,\n): number | null {\n if (!book || !book.known) return null\n const faltando = Math.max(0, lineDiscountCents) - bookTotalCents(book.grants)\n return faltando > 1 ? faltando : null\n}\n\n/** A frase do aviso quando o livro não fecha com a comanda. */\nexport const BOOK_INCOMPLETE_TITLE = 'A lista de descontos está incompleta'\nexport function bookIncompleteHint(formattedShortfall: string): string {\n return `Esta comanda tem ${formattedShortfall} de abatimento que não aparece aqui. `\n + 'Confira antes de conceder.'\n}\n","// ---------------------------------------------------------------------------\n// O TETO do desconto.\n//\n// Regra 4 do `OrderDiscountModal` do V1: o teto é o do MOTIVO e o do\n// AUTORIZADOR, **o menor dos dois**. «Cortesia até 100%» com um autorizador de\n// 15% continua 15%.\n//\n// Mora fora da folha porque é a única regra do desconto que se pode errar em\n// silêncio: uma tela que só olha o teto do motivo libera 100% para quem podia\n// 15, e o erro só aparece na conferência do mês.\n// ---------------------------------------------------------------------------\n\n/** `null` = ninguém limita, e aí o desconto vai até 100% pela regra do valor. */\nexport function discountCap(\n reasonMax?: number | null,\n authorizerMax?: number | null,\n): number | null {\n const tetos = [reasonMax, authorizerMax].filter(\n (v): v is number => typeof v === 'number' && Number.isFinite(v),\n )\n return tetos.length === 0 ? null : Math.min(...tetos)\n}\n\n/** A frase que explica a recusa — nomeando QUEM limita, que é o que resolve. */\nexport function capRefusal(\n percent: number,\n { reasonMax, authorizerMax, authorizerName }: {\n reasonMax?: number | null\n authorizerMax?: number | null\n authorizerName?: string\n },\n): string | null {\n const teto = discountCap(reasonMax, authorizerMax)\n if (teto == null || percent <= teto + 0.001) return null\n // Quem limita é quem tem o MENOR teto. Dizer «o motivo libera até 15%»\n // quando quem limita é a pessoa manda o operador trocar de motivo e falhar\n // de novo.\n const daPessoa = typeof authorizerMax === 'number' && authorizerMax === teto\n const doMotivo = typeof reasonMax === 'number' && reasonMax === teto\n if (daPessoa && !doMotivo) {\n return `${authorizerName ?? 'Quem autoriza'} libera até ${teto}%.`\n }\n return `Este motivo libera até ${teto}%.`\n}\n","// ---------------------------------------------------------------------------\n// A LINHA QUE DIZ O QUE FAZER.\n//\n// Cada diálogo do V1 tem um `DialogDescription`, e ele **muda com o passo**:\n//\n// {step === 'choose_mode' && 'Escolha o tipo de transferência.'}\n// {step === 'select_items' && 'Selecione os itens que deseja transferir.'}\n// {step === 'select_destination' && 'Escolha o destino da transferência.'}\n// {step === 'authorize' && 'Autorize a transferência com senha.'}\n//\n// O V2 trouxe os botões, os campos e as regras das cinco folhas e **deixou\n// estas frases para trás** — todas as folhas abriam com um título e nada mais.\n//\n// Elas não são decoração. A folha de transferência tem três modos e pode\n// mostrar oitenta e três linhas; a de cancelamento tem uma caixa vermelha no\n// topo e um seletor por linha. O que se espera do operador ali não é óbvio, e\n// o V1 gasta uma linha dizendo — que é mais barato do que ele descobrir\n// clicando.\n//\n// As frases são as dele, palavra por palavra. Onde o V2 uniu passos que o V1\n// separava (a autorização virou UMA folha para as quatro ações), a frase segue\n// a ação, não o passo — e é o app que a informa, porque só ele sabe qual ação\n// pediu autorização.\n// ---------------------------------------------------------------------------\n\n/** O subtítulo da folha de TRANSFERÊNCIA, por modo — literal do V1. */\nexport function transferSubtitle(\n kind: 'table' | 'guest' | 'items',\n picked: number,\n): string {\n if (kind !== 'items') return 'Escolha o tipo de transferência.'\n // O V1 separa em dois passos o que o V2 mostra numa folha só: primeiro os\n // itens, depois o destino. A frase acompanha onde o operador está.\n return picked === 0\n ? 'Selecione os itens que deseja transferir.'\n : 'Escolha o destino da transferência.'\n}\n\n/** O subtítulo da folha de CANCELAMENTO. */\nexport const CANCEL_SUBTITLE = 'Selecione os itens e quantidades que deseja cancelar.'\n\n/** O subtítulo da folha de DESCONTO. */\nexport const DISCOUNT_SUBTITLE = 'Gerencie os descontos dos itens da comanda.'\n\n/**\n * O subtítulo da folha de AUTORIZAÇÃO.\n *\n * O V1 tem uma frase por diálogo, com o artigo certo em cada uma: «Autorize a\n * transferência», «Autorize o cancelamento», «Autorize o desconto». No V2 a\n * folha é uma só, então a frase vem da ação — e quando a ação não é uma das\n * quatro conhecidas, a linha some em vez de sair com o artigo errado.\n */\nconst AUTORIZE: Record<string, string> = {\n discount: 'Autorize o desconto com senha.',\n cancel: 'Autorize o cancelamento com senha.',\n transfer: 'Autorize a transferência com senha.',\n service_charge: 'Autorize a alteração da taxa com senha.',\n courtesy: 'Autorize a cortesia com senha.',\n}\n\nexport function authorizeSubtitle(action: string | undefined): string | undefined {\n return action ? AUTORIZE[action] : undefined\n}\n","// ---------------------------------------------------------------------------\n// Desconto na comanda.\n//\n// Portado de `beautyplace/src/components/orders/OrderDiscountModal.tsx`, regra\n// por regra. O que o V1 sabe e uma tela de desconto ingênua não:\n//\n// 1. **Desconto é por LINHA, não pela comanda.** O operador marca quais itens\n// entram. \"10% na conta\" é a exceção que se faz marcando tudo, não o\n// padrão — e a diferença importa porque a taxa de serviço incide sobre a\n// base já descontada.\n//\n// 2. **Precisa de um AUTORIZADOR, e cada um tem o seu teto.** Não é um PIN\n// genérico de gerente: a lista diz \"Fulano — até 15%\", e quem autoriza\n// responde pelo valor. Sem ninguém cadastrado, a tela DIZ isso em vez de\n// mostrar um formulário que vai falhar no fim.\n//\n// 3. **Motivo OU memorando** — não os dois, e não nenhum. O V1 é literal:\n// \"Selecione um motivo ou informe no memorando.\" Desconto sem por quê é o\n// que ninguém consegue auditar depois.\n//\n// 4. **O teto é do MOTIVO e do AUTORIZADOR, o menor dos dois.** \"Cortesia\n// até 100%\" com um autorizador de 15% continua 15%.\n//\n// O que esta folha NÃO faz: ela não grava. Devolve a intenção montada e quem\n// chamou escreve — é o mesmo contrato das outras folhas deste pacote.\n// ---------------------------------------------------------------------------\n\nimport { useMemo, useState } from 'react'\nimport { AlertTriangle, Percent, Tag, Trash2, X } from 'lucide-react'\nimport { formatCents } from './money'\nimport { lineTakesDiscount, selectableLineIds, LINHA_JA_TEM_DESCONTO } from './discountSelectable'\nimport {\n BOOK_UNREADABLE_HINT, BOOK_UNREADABLE_TITLE, BOOK_INCOMPLETE_TITLE, bookIncompleteHint,\n bookShortfallCents, type DiscountBook,\n} from './discountBook'\nimport type { Ticket } from './session'\nimport { SheetLayer } from './SheetLayer'\nimport { capRefusal } from './discountCap'\nimport { DISCOUNT_SUBTITLE } from './sheetSubtitle'\n\n/** Um motivo cadastrado pela casa. */\n/**\n * Um desconto JÁ concedido nesta comanda — a lista «Descontos aplicados» que o\n * V1 desenha no topo do modal, antes de oferecer um novo.\n *\n * É a resposta a «já abateram alguma coisa aqui?». Sem ela o segundo desconto\n * sobre o mesmo prato é invisível até a conta fechar.\n */\nexport interface AppliedDiscount {\n id: string\n /** O item abatido. Vazio = desconto da comanda inteira. */\n itemName?: string | null\n percent?: number | null\n /** Quanto saiu, em centavos. */\n amountCents: number\n reasonName?: string | null\n memo?: string | null\n approvedByName?: string | null\n}\n\nexport interface DiscountReason {\n id: string\n name: string\n /** Teto do motivo, em porcentagem. Ausente = o motivo não limita. */\n maxPercent?: number | null\n}\n\n/** Quem pode liberar, e até quanto. */\nexport interface DiscountAuthorizer {\n id: string\n name: string\n /** Teto da PESSOA. O que vale é o menor entre este e o do motivo. */\n maxPercent?: number | null\n}\n\nexport interface DiscountIntent {\n lineIds: string[]\n mode: 'percent' | 'amount'\n value: number\n reasonId?: string\n memo?: string\n /**\n * Quem foi escolhido aqui — para a folha de autorização não perguntar de\n * novo. A pessoa é escolhida NESTA folha porque o teto dela limita o valor;\n * o PIN é pedido na próxima, que é onde ele é conferido no banco.\n */\n authorizerId?: string\n}\n\nexport function DiscountSheet({\n ticket, reasons, authorizers, onCancel, onConfirm, onRemove, error, applied, appliedUnknown, }: {\n ticket: Ticket\n reasons: DiscountReason[]\n authorizers: DiscountAuthorizer[]\n /** Os abatimentos que esta comanda já recebeu. Ver `AppliedDiscount`. */\n applied?: AppliedDiscount[]\n /**\n * O livro NÃO PÔDE SER LIDO — e isso não é o mesmo que estar vazio.\n *\n * Antes as duas coisas viravam a mesma tela limpa, porque a leitura fazia\n * `.catch(() => [])`. «Não sei» e «não tem» levam a gestos diferentes: com\n * «não tem» o gerente concede; com «não sei» ele confere antes. Ver\n * `./discountBook.ts`.\n */\n appliedUnknown?: boolean\n /**\n * TIRAR o abatimento destas linhas — a lixeira do V1 (`pendingRemoval`).\n *\n * Sem ela um desconto lançado no item errado não tem volta: o único caminho\n * é cancelar a linha e lançá-la de novo, o que troca um erro de desconto por\n * um cancelamento no relatório do turno.\n *\n * Ausente = a casa não tem escritor para isso, e aí a lixeira não aparece —\n * botão que não tem para onde ir é pior do que a ausência dele.\n */\n onRemove?: (lineIds: string[]) => void\n /**\n * A recusa do SERVIDOR — PIN errado, alçada estourada, comanda travada.\n *\n * Vive na folha, e não num aviso atrás dela: a folha cobre a tela, e um\n * recado que aparece por baixo não existe. Foi o que aconteceu ao portar a\n * conferência de PIN — a autorização era recusada corretamente e o operador\n * via a tela parada, sem uma palavra.\n */\n error?: string\n\n onCancel: () => void\n onConfirm: (intent: DiscountIntent) => void\n}) {\n // Só as linhas SEM abatimento nascem marcadas — a regra do V1. Ver\n // `selectableLineIds`: conceder sobre linha que já tem desconto apagaria o\n // anterior, com o motivo e o autorizador dele.\n const [picked, setPicked] = useState<Set<string>>(() => selectableLineIds(ticket.lines))\n const [mode, setMode] = useState<'percent' | 'amount'>('percent')\n const [raw, setRaw] = useState('')\n const [reasonId, setReasonId] = useState('')\n /**\n * Quem autoriza — e começa VAZIO mesmo com um só na lista.\n *\n * Pré-escolher pouparia um toque e tiraria o gesto que dá sentido ao campo:\n * quem autoriza responde pelo valor, e responder é um ato. Com o nome já\n * preenchido, o operador desconta em nome de alguém sem nunca tê-lo lido.\n */\n const [authorizerId, setAuthorizerId] = useState('')\n const [memo, setMemo] = useState('')\n\n // As linhas que já carregam abatimento — a segunda fonte do V1, e a única\n // que o PDV enxerga sempre (o livro de concessões some pela RLS).\n const comAbatimento = useMemo(\n () => ticket.lines.filter((l) => (l.discountCents ?? 0) > 0),\n [ticket.lines],\n )\n\n const base = useMemo(\n () => ticket.lines\n .filter((l) => picked.has(l.id))\n .reduce((sum, l) => sum + l.unitPriceCents * l.quantity, 0),\n [ticket.lines, picked],\n )\n\n const value = Number(raw.replace(',', '.')) || 0\n const cents = mode === 'percent' ? Math.round((base * value) / 100) : Math.round(value * 100)\n\n const reason = reasons.find((r) => r.id === reasonId)\n // O teto do MOTIVO. O da alçada de quem libera só se sabe quando se sabe\n // quem libera — e isso é pergunta da folha de autorização, que vem depois.\n const authorizer = authorizers.find((a) => a.id === authorizerId)\n\n const percentEquivalente = base > 0 ? (cents / base) * 100 : 0\n\n /** O que impede de confirmar — uma frase, a do V1 sempre que ela existe. */\n const impedimento =\n picked.size === 0 ? 'Escolha ao menos um item.'\n : value <= 0 ? 'Informe o desconto.'\n : mode === 'percent' && value > 100 ? 'Percentual não pode ser maior que 100%.'\n : cents > base ? 'O desconto é maior que o valor dos itens escolhidos.'\n // O AUTORIZADOR vem antes do motivo, como no V1: sem quem responda pelo\n // valor, o resto do formulário não tem para quem perguntar.\n : !authorizerId ? 'Selecione o usuário autorizador.'\n : !reasonId && !memo.trim() ? 'Selecione um motivo ou informe no memorando.'\n : capRefusal(percentEquivalente, {\n reasonMax: reason?.maxPercent,\n authorizerMax: authorizer?.maxPercent,\n authorizerName: authorizer?.name,\n }) ?? undefined\n\n return (\n <SheetLayer>\n {/* A cortina fecha ao toque, como nas outras folhas — e é o caminho que\n a mão já conhece quando a decisão é \"deixa pra lá\". */}\n <div className=\"pos-sheet__scrim\" onClick={onCancel} aria-hidden />\n <div className=\"pos-sheet__panel\" role=\"dialog\" aria-label=\"Desconto\" aria-modal>\n <div className=\"pos-sheet__head\">\n <h2 className=\"pos-sheet__title\"><Percent size={18} strokeWidth={2.2} aria-hidden /> Desconto</h2>\n <button className=\"pos-sheet__x\" onClick={onCancel} aria-label=\"Fechar\"><X size={20} /></button>\n </div>\n <p className=\"pos-sheet__sub\">{DISCOUNT_SUBTITLE}</p>\n\n {/* O garçom MONTA o desconto aqui; quem pode liberar é pergunta da folha\n de autorização, que sobe depois. Barrar a tela por falta de\n autorizador escondia o formulário inteiro e não explicava o gesto que\n falta — e o teto da alçada só se sabe quando se sabe QUEM autoriza. */}\n <div className=\"pos-sheet__body\">\n {/* AS LINHAS QUE JÁ TÊM ABATIMENTO, com a lixeira.\n O V1 tem duas fontes e usa as duas: o livro de concessões (com\n motivo e autor) e as próprias LINHAS\n (`i.discount_amount ?? 0) > 0`). O livro do V2 está invisível pela\n RLS no Pertinho; a linha o PDV enxerga sempre, e é sobre ela que a\n remoção opera. */}\n {onRemove && comAbatimento.length > 0 && (\n <div className=\"pos-dsc__sec\">\n <span className=\"pos-dsc__lbl\">\n <Tag size={13} strokeWidth={2.3} aria-hidden /> Com desconto\n </span>\n <ul className=\"pos-dsc__lines\">\n {comAbatimento.map((l) => (\n <li key={l.id}>\n <div className=\"pos-svc__guest\">\n <span className=\"pos-dsc__name\">\n <span className=\"pos-dsc__n\">{l.quantity}×</span> {l.name}\n </span>\n <span className=\"pos-num pos-dsc__granta\">\n −{formatCents(l.discountCents ?? 0)}\n </span>\n <button\n className=\"pos-dchip__x\"\n onClick={() => onRemove([l.id])}\n title=\"Tirar o desconto desta linha\"\n aria-label={`Tirar o desconto de ${l.name}`}\n >\n <Trash2 size={13} strokeWidth={2.4} aria-hidden />\n </button>\n </div>\n </li>\n ))}\n </ul>\n </div>\n )}\n {/* «DESCONTOS APLICADOS» vem PRIMEIRO, como no V1.\n Quem abriu esta folha vai conceder um abatimento, e a primeira\n coisa que precisa saber é se já concederam. Sem a lista, o segundo\n desconto sobre o mesmo prato só aparece quando a conta fecha —\n e aí o dinheiro já saiu duas vezes.\n\n Sem a lixeira do V1 de propósito: remover um desconto concedido\n precisa de um escritor que o V2 ainda não tem, e um botão de\n lixeira sobre dinheiro que não faz nada é pior do que a ausência\n dele. */}\n {(() => {\n // Dois avisos com a mesma cara e causas diferentes: não deu para LER\n // o livro, ou o livro não EXPLICA o abatimento que a comanda carrega.\n // O segundo é o que a RLS produz — ela não erra, ela esconde, e o\n // PostgREST devolve 200 com lista vazia.\n const livro: DiscountBook<{ amountCents?: number }> | undefined =\n appliedUnknown ? { known: false } : { known: true, grants: applied ?? [] }\n const faltando = bookShortfallCents(livro, ticket.lines.reduce(\n (s, l) => s + Math.max(0, l.discountCents ?? 0), 0))\n if (!appliedUnknown && faltando == null) return null\n return (\n <div className=\"pos-dsc__blind\" role=\"status\">\n <AlertTriangle size={14} strokeWidth={2.3} aria-hidden />\n <span>\n <strong>{appliedUnknown ? BOOK_UNREADABLE_TITLE : BOOK_INCOMPLETE_TITLE}</strong>\n <span>\n {appliedUnknown\n ? BOOK_UNREADABLE_HINT\n : bookIncompleteHint(formatCents(faltando ?? 0))}\n </span>\n </span>\n </div>\n )\n })()}\n {applied && applied.length > 0 && (\n <div className=\"pos-dsc__applied\">\n <span className=\"pos-dsc__lbl\">\n <Tag size={13} strokeWidth={2.3} aria-hidden /> Descontos aplicados\n </span>\n {applied.map((d) => (\n <div key={d.id} className=\"pos-dsc__grant\">\n <div className=\"pos-dsc__grantt\">\n <span>{d.itemName || 'Desconto'}</span>\n <span className=\"pos-num pos-dsc__granta\">-{formatCents(d.amountCents)}</span>\n </div>\n {/* A linha de baixo é o RASTRO: quanto foi pedido, por qual\n motivo e com que recado. O V1 separa com «•» e só desenha\n o que existe. */}\n <div className=\"pos-dsc__grantm\">\n {d.percent != null && <span className=\"pos-num\">{d.percent}%</span>}\n {d.approvedByName && <span>por {d.approvedByName}</span>}\n {d.reasonName && <span>{d.reasonName}</span>}\n {d.memo && <span className=\"pos-dsc__grantmemo\">{d.memo}</span>}\n </div>\n </div>\n ))}\n </div>\n )}\n <div className=\"pos-dsc__sec\">\n <span className=\"pos-dsc__lbl\">Em quais itens</span>\n <ul className=\"pos-dsc__lines\">\n {ticket.lines.map((l) => {\n const podeh = lineTakesDiscount(l)\n return (\n <li key={l.id}>\n <label className=\"pos-dsc__line\" data-locked={podeh ? undefined : ''}>\n <input\n type=\"checkbox\"\n checked={podeh && picked.has(l.id)}\n disabled={!podeh}\n onChange={() => setPicked((prev) => {\n const next = new Set(prev)\n if (next.has(l.id)) next.delete(l.id); else next.add(l.id)\n return next\n })}\n />\n <span className=\"pos-dsc__n\">{l.quantity}×</span>\n <span className=\"pos-dsc__name\">{l.name}</span>\n {/* A causa E o caminho: a lixeira está na seção acima. */}\n {!podeh && (\n <span className=\"pos-dsc__why\">{LINHA_JA_TEM_DESCONTO}</span>\n )}\n <span className=\"pos-num\">{formatCents(l.unitPriceCents * l.quantity)}</span>\n </label>\n </li>\n )\n })}\n </ul>\n </div>\n\n <div className=\"pos-dsc__sec\">\n <span className=\"pos-dsc__lbl\">Quanto</span>\n <div className=\"pos-dsc__row\">\n <span className=\"pos-seg\" role=\"group\" aria-label=\"Tipo de desconto\">\n {([['percent', '%'], ['amount', 'R$']] as const).map(([m, t]) => (\n <button\n key={m}\n className=\"pos-seg__btn\"\n aria-pressed={mode === m}\n onClick={() => setMode(m)}\n >\n {t}\n </button>\n ))}\n </span>\n <input\n className=\"pos-dsc__val\"\n inputMode=\"decimal\"\n value={raw}\n onChange={(e) => setRaw(e.target.value)}\n placeholder={mode === 'percent' ? '10' : '0,00'}\n aria-label=\"Valor do desconto\"\n />\n <span className=\"pos-dsc__eq pos-num\">− {formatCents(cents)}</span>\n </div>\n </div>\n\n {/* QUEM AUTORIZA, antes do porquê — é a pergunta que o V1 faz\n primeiro, e a lista diz o teto de cada um: «Fulano — até 15%».\n Não é um PIN genérico de gerente; é um nome que responde pelo\n valor. */}\n <div className=\"pos-dsc__sec\">\n <span className=\"pos-dsc__lbl\">Quem autoriza</span>\n {/* Sem ninguém cadastrado o campo vira beco: «Selecione o\n autorizador» para sempre, sem dizer como sair. A régua do\n porte é clara — ação bloqueada DIZ o que falta. */}\n {authorizers.length === 0 ? (\n <p className=\"pos-sheet__hint\">\n Nenhum autorizador de desconto está ativo. Cadastre quem pode\n liberar, e até quanto, em Financeiro › Descontos.\n </p>\n ) : (\n <select\n className=\"pos-dsc__sel\"\n value={authorizerId}\n onChange={(e) => setAuthorizerId(e.target.value)}\n aria-label=\"Usuario autorizador\"\n >\n <option value=\"\">Selecione o usuário autorizador…</option>\n {authorizers.map((a) => (\n <option key={a.id} value={a.id}>\n {a.name}{a.maxPercent != null ? ` · até ${a.maxPercent}%` : ''}\n </option>\n ))}\n </select>\n )}\n </div>\n\n <div className=\"pos-dsc__sec\">\n <span className=\"pos-dsc__lbl\">Por quê</span>\n <select\n className=\"pos-dsc__sel\"\n value={reasonId}\n onChange={(e) => setReasonId(e.target.value)}\n aria-label=\"Motivo\"\n >\n <option value=\"\">Sem motivo cadastrado — explique abaixo</option>\n {reasons.map((r) => (\n <option key={r.id} value={r.id}>\n {r.name}{r.maxPercent != null ? ` · até ${r.maxPercent}%` : ''}\n </option>\n ))}\n </select>\n <textarea\n className=\"pos-dsc__memo\"\n value={memo}\n onChange={(e) => setMemo(e.target.value)}\n placeholder=\"Memorando\"\n rows={2}\n aria-label=\"Memorando\"\n />\n </div>\n\n </div>\n\n <div className=\"pos-sheet__foot\">\n <button className=\"pos-btn pos-btn--ghost\" onClick={onCancel}>Cancelar</button>\n <button\n className=\"pos-btn\"\n disabled={!!impedimento}\n onClick={() => onConfirm({\n lineIds: [...picked],\n mode,\n value,\n authorizerId: authorizerId || undefined,\n reasonId: reasonId || undefined,\n memo: memo.trim() || undefined,\n })}\n >\n <Tag size={17} strokeWidth={2.2} aria-hidden />\n Aplicar desconto\n </button>\n </div>\n\n {/* A ação bloqueada DIZ o que falta. Um botão morto em silêncio é um\n chamado para o suporte. */}\n {(error || impedimento) && (\n <p className=\"pos-sheet__why\" data-error={error ? '' : undefined}>{error ?? impedimento}</p>\n )}\n </div>\n </SheetLayer>\n )\n}\n","// ---------------------------------------------------------------------------\n// A PRÉVIA DA TAXA — e por que ela não pode ter conta própria.\n//\n// A folha de taxa mostra «Taxa de serviço total» enquanto o operador digita. Ela\n// calculava assim:\n//\n// const fatia = Math.round(eligibleCents / abertos.length)\n// abertos.reduce((s, g) => s + Math.round(fatia * (percentDe(g) ?? efetivo) / 100), 0)\n//\n// Isto é uma TERCEIRA regra de taxa no PDV, depois da tela (`totalsOf`) e do\n// papel (`calculateBillTotals`) — e é a mais simplista das três. Ela erra de\n// dois jeitos ao mesmo tempo:\n//\n// 1. **Divide a base em partes iguais** entre os participantes, ignorando o\n// vínculo item↔participante que o V2 guarda e que as outras duas contas\n// respeitam. Quem tomou água paga a taxa do churrasco do vizinho.\n//\n// 2. **Esquece a parte da MESA.** Item sem dono não entra em participante\n// nenhum e simplesmente some da prévia.\n//\n// Medido no Pertinho: mesa em 13%, dois itens de R$ 10,00 — um da Pessoa 2 (com\n// override de 0%) e um da mesa. A prévia dizia **R$ 0,00**; a comanda ia cobrar\n// **R$ 1,30**. O operador decide a taxa olhando um número que não é o que vai\n// ser cobrado.\n//\n// Aqui a prévia passa a fazer o que a comanda faz: taxa por DONO, sobre o que\n// cada um consumiu, com o item sem dono entrando pelo percentual da mesa.\n// ---------------------------------------------------------------------------\n\n/**\n * A parte da taxa que JÁ FOI QUITADA, e por isso não se recalcula.\n *\n * O V1 monta a prévia como `settled_service_charge + Σ(base × percentual)`,\n * onde as bases elegíveis vêm do servidor já SEM quem fechou a conta. Aqui as\n * linhas chegam todas — inclusive as de quem quitou —, então o corte é feito\n * aqui: o dono quitado sai do laço e o valor dele entra somado.\n *\n * Sem isto, baixar a taxa da mesa de 13% para 10% mostrava a fatia de quem já\n * pagou recalculada em 10% — um número menor do que a casa recebeu, sobre\n * dinheiro que já entrou. Latente hoje (o fechamento por participante é a onda\n * seguinte) e escrito agora porque o consumidor está a um passo.\n */\nexport interface SettledService {\n isSettled: (guestId: string) => boolean\n /** A taxa já quitada, em centavos, congelada. */\n serviceCents: number\n}\n\nexport interface PreviewLine {\n unitPriceCents: number\n quantity: number\n discountCents?: number\n /** Nulo/ausente = a linha é da MESA. */\n guestId?: string | null\n}\n\n/**\n * Quanto de taxa esta comanda vai cobrar com os percentuais que estão na tela.\n *\n * `percentOf` devolve o percentual do participante — `null` quer dizer «usa o\n * da mesa», que é diferente de zero. Sem `lines` (o app que ainda não as passa)\n * cai na conta simples da mesa inteira, que é o comportamento de uma comanda\n * sem participante e não inventa distribuição nenhuma.\n */\nexport function previewServiceCents(\n lines: readonly PreviewLine[] | undefined,\n eligibleCents: number,\n tablePercent: number,\n percentOf: (guestId: string) => number | null | undefined,\n settled?: SettledService,\n): number {\n if (!lines || lines.length === 0) {\n return Math.round((eligibleCents * tablePercent) / 100)\n + Math.max(0, settled?.serviceCents ?? 0)\n }\n // Agrupa por dono antes de multiplicar: arredondar por linha e somar dá\n // centavo diferente de somar e arredondar, e o papel agrupa.\n const base = new Map<string | null, number>()\n for (const l of lines) {\n const dono = l.guestId ?? null\n // Quem já quitou não volta para a conta: a taxa dele é história, e entra\n // pelo valor congelado. Ver `SettledService`.\n if (dono != null && settled?.isSettled(dono)) continue\n // A base desconta, como no total da comanda e como no V1.\n const liquido = Math.max(0, l.unitPriceCents * l.quantity - Math.max(0, l.discountCents ?? 0))\n base.set(dono, (base.get(dono) ?? 0) + liquido)\n }\n // A parte já quitada entra ANTES do laço e não é multiplicada por nada.\n let total = Math.max(0, settled?.serviceCents ?? 0)\n for (const [dono, elegivel] of base) {\n const proprio = dono == null ? null : percentOf(dono)\n const percent = proprio != null ? proprio : tablePercent\n total += Math.round((elegivel * percent) / 100)\n }\n return total\n}\n","// ---------------------------------------------------------------------------\n// A taxa de serviço da comanda.\n//\n// Portado de `beautyplace/src/components/orders/ServiceChargeSelector.tsx`. É\n// a peça mais densa do PDV e a que o V2 tratava como uma constante — `10` num\n// arquivo de demo, numa casa que cobra 13% e isenta metade do cardápio.\n//\n// O que o V1 sabe, e uma caixa de \"digite o percentual\" não:\n//\n// 1. **A base não é o subtotal**, é o SUBTOTAL ELEGÍVEL: o que sobra depois\n// das isenções por produto e por categoria. Cobrar sobre o subtotal cobra\n// taxa sobre o que a casa disse que não cobra.\n//\n// 2. **Taxa é por PARTICIPANTE, não pela mesa.** Cada um pode ter o seu\n// percentual; vazio quer dizer \"usa o da mesa\", e vazio NÃO é zero.\n//\n// 3. **Quem já quitou sai da lista.** A parte que a pessoa pagou fica\n// congelada na conta e não se recalcula — mexer nela seria cobrar de novo\n// de quem já foi embora.\n//\n// 4. **Mudar exige autorizador e PIN.** A taxa é dinheiro de gorjeta da\n// equipe; quem a reduz responde pelo valor.\n//\n// 5. **\"Retirar taxa pendente\" é outra ação**, com motivo próprio — não é\n// \"põe zero\". Zero é uma política; retirar é um perdão pontual.\n//\n// A folha não grava: devolve a intenção montada, como as outras deste pacote.\n// ---------------------------------------------------------------------------\n\nimport { WAIVE_BANNER, WAIVE_LABEL } from './serviceChargeGuard'\nimport { previewServiceCents } from './servicePreview'\nimport { GUESTS_UNAVAILABLE } from './serviceChargeGuard'\nimport { useMemo, useState } from 'react'\nimport { Receipt, X, Star } from 'lucide-react'\nimport { formatCents } from './money'\nimport { SheetLayer } from './SheetLayer'\n\n/** Uma taxa cadastrada pela casa. */\nexport interface ServicePreset {\n id: string\n label: string\n percent: number\n isDefault?: boolean\n}\n\n/** Um participante da comanda, para o percentual dele. */\nexport interface ServiceGuest {\n id: string\n label: string\n /** `null` = usa a taxa da mesa. Vazio NÃO é zero. */\n percent?: number | null\n /** Quem já quitou não entra: a parte paga fica congelada. */\n settled?: boolean\n /**\n * A taxa que ESTE participante já pagou, em centavos — do `settledBill` que\n * o banco gravou na hora do pagamento, não do que a tela somaria agora.\n * Ver `SettledService` em `servicePreview`.\n */\n settledServiceCents?: number\n}\n\nexport interface ServiceChargeIntent {\n percent: number\n /** Só os participantes cujo percentual MUDOU. */\n guestOverrides: Array<{ guestId: string; percent: number | null }>\n}\n\nexport function ServiceChargeSheet({\n currentPercent, eligibleCents, lines, presets, guests, guestsUnavailable, authorizers, error,\n focusGuestId, onCancel, onConfirm,\n waivable, onWaive,\n}: {\n currentPercent: number\n /** A base ELEGÍVEL, já sem as isenções — não o subtotal. */\n eligibleCents: number\n /**\n * As linhas ELEGÍVEIS, com o dono de cada uma.\n *\n * Sem elas a prévia inventava a sua própria conta de taxa — a TERCEIRA no\n * PDV, depois da tela e do papel. Ver `previewServiceCents`.\n */\n lines?: Array<{ unitPriceCents: number; quantity: number; discountCents?: number; guestId?: string | null }>\n presets: ServicePreset[]\n /**\n * A saída de emergência está aberta?\n *\n * Só depois de o servidor RECUSAR a mudança por pagamento sem dono, e só\n * quando a intenção era BAIXAR a taxa — é o `offersWaive` do\n * `serviceChargeGuard`. Não é item de menu: é o que resta quando o caminho\n * normal fechou, e oferecê-la antes convidaria a usá-la como atalho para\n * não cobrar.\n */\n waivable?: boolean\n /**\n * A lista de participantes NÃO pôde ser lida.\n *\n * O V1 avisa e **trava o salvar** (`loadFailed` entra no `disabled` e no\n * early return do confirm). A regra é sobre dinheiro: a taxa incide por\n * participante, e sem saber quem já quitou a folha oferece como disponível\n * quem fechou a conta — mexer no percentual dele mexe num total que alguém\n * já pagou.\n */\n guestsUnavailable?: boolean\n /** Quem executa a retirada. Sem ele o aviso não aparece — um botão que não\n * tem para onde ir é pior do que a ausência dele. */\n onWaive?: () => void\n guests: ServiceGuest[]\n authorizers: Array<{ id: string; name: string }>\n /**\n * A recusa do SERVIDOR — PIN errado, alçada estourada, comanda travada.\n *\n * Vive na folha, e não num aviso atrás dela: a folha cobre a tela, e um\n * recado que aparece por baixo não existe. Foi o que aconteceu ao portar a\n * conferência de PIN — a autorização era recusada corretamente e o operador\n * via a tela parada, sem uma palavra.\n */\n error?: string\n\n /**\n * Abrir JÁ NAQUELA pessoa.\n *\n * O `13%` ao lado do nome de cada participante abre esta folha. Sem isto ela\n * abria na taxa da mesa, com a lista de todo mundo embaixo — e numa mesa de\n * vinte e duas pessoas o garçom precisava reencontrar, dentro da folha, a\n * linha em que acabou de tocar. O alvo já disse de quem é: a folha começa\n * ali.\n */\n focusGuestId?: string\n\n onCancel: () => void\n onConfirm: (intent: ServiceChargeIntent) => void\n}) {\n const foco = focusGuestId ? guests.find((g) => g.id === focusGuestId) : undefined\n const [percent, setPercent] = useState(currentPercent)\n const [custom, setCustom] = useState(String(currentPercent))\n const [isCustom, setIsCustom] = useState(false)\n const [overrides, setOverrides] = useState<Record<string, string>>(() => (\n // O campo da pessoa em foco nasce com o que ela tem hoje — vazio quer\n // dizer \"usa a da mesa\", e é um valor válido, não um campo por preencher.\n foco ? { [foco.id]: foco.percent != null ? String(foco.percent) : '' } : {}\n ))\n\n const efetivo = isCustom ? (Number(custom.replace(',', '.')) || 0) : percent\n\n // Quem já quitou some da lista — não é \"desabilitado\", é ausente: um campo\n // apagado ao lado de um nome convida a tentar, e a resposta seria não.\n const abertos = useMemo(() => guests.filter((g) => !g.settled), [guests])\n\n const percentDe = (g: ServiceGuest) => {\n const digitado = overrides[g.id]\n if (digitado !== undefined) return digitado === '' ? null : Number(digitado.replace(',', '.')) || 0\n return g.percent ?? null\n }\n\n // A prévia usa a MESMA conta da comanda e do papel — ver `previewServiceCents`.\n // O que os quitados já pagaram de taxa, congelado.\n const quitados = useMemo(() => guests.filter((g) => g.settled), [guests])\n const congelado = useMemo(\n () => quitados.reduce((s, g) => s + Math.max(0, g.settledServiceCents ?? 0), 0),\n [quitados],\n )\n\n const total = useMemo(\n () => previewServiceCents(lines, eligibleCents, efetivo, (id) => {\n const g = abertos.find((x) => x.id === id)\n return g ? percentDe(g) : null\n }, {\n isSettled: (id) => quitados.some((g) => g.id === id),\n serviceCents: congelado,\n }),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [lines, abertos, quitados, congelado, eligibleCents, efetivo, overrides],\n )\n\n const impedimento =\n // A recusa mais forte vem PRIMEIRO: com a lista de quitados incerta, não\n // há percentual válido nenhum. A frase é a do V1.\n guestsUnavailable ? GUESTS_UNAVAILABLE\n : efetivo < 0 ? 'A taxa não pode ser negativa.'\n : efetivo > 100 ? 'Percentual não pode ser maior que 100%.'\n : undefined\n\n return (\n <SheetLayer>\n <div className=\"pos-sheet__scrim\" onClick={onCancel} aria-hidden />\n <div className=\"pos-sheet__panel\" role=\"dialog\" aria-label=\"Taxa de serviço\" aria-modal>\n <div className=\"pos-sheet__head\">\n <h2 className=\"pos-sheet__title\">\n <Receipt size={18} strokeWidth={2.2} aria-hidden />\n {foco ? `Taxa de ${foco.label}` : 'Taxa de Serviço'}\n </h2>\n <button className=\"pos-sheet__x\" onClick={onCancel} aria-label=\"Fechar\"><X size={20} /></button>\n </div>\n\n {authorizers.length === 0 ? (\n <div className=\"pos-sheet__body\">\n <p className=\"pos-empty__t\">Nenhum autorizador de taxa está ativo.</p>\n <p className=\"pos-empty__h\">\n Cadastre quem pode alterar a taxa de serviço, em Financeiro › Taxa de serviço.\n </p>\n </div>\n ) : (\n <div className=\"pos-sheet__body\">\n {/* O SOCORRO vem primeiro, quando existe.\n O V1 o desenha no topo do corpo, antes da taxa atual: quem\n chegou aqui já teve a mudança recusada, e a pergunta dele\n mudou — não é mais «qual taxa», é «e agora?». */}\n {waivable && onWaive && (\n <div className=\"pos-svc__waive\" role=\"status\">\n <p className=\"pos-svc__waivet\">{WAIVE_BANNER}</p>\n <button className=\"pos-btn pos-btn--ghost pos-svc__waiveb\" onClick={onWaive}>\n {WAIVE_LABEL}\n </button>\n </div>\n )}\n\n {/* A TAXA DE AGORA, antes de qualquer campo.\n Sem ela o operador altera às cegas: \"13%\" digitado sobre o quê?\n O V1 abre o seletor já mostrando o que está valendo, e é essa\n comparação — de X para Y — que o gerente autoriza depois. */}\n <div className=\"pos-svc__now\">\n <span className=\"pos-svc__nowl\">{foco ? `Taxa de ${foco.label} hoje` : 'Taxa atual'}</span>\n <span className=\"pos-num pos-svc__nowv\">\n {foco ? (foco.percent != null ? `${foco.percent}%` : `${currentPercent}% (da mesa)`) : `${currentPercent}%`}\n </span>\n </div>\n\n {/* Com FOCO, os atalhos mudam a taxa DAQUELA pessoa; sem foco,\n a da mesa. É o mesmo controle respondendo à pergunta que o\n toque fez, e não dois controles parecidos. */}\n <div className=\"pos-dsc__sec\">\n <span className=\"pos-dsc__lbl\">{foco ? `Taxa de ${foco.label}` : 'Taxa Geral (Mesa)'}</span>\n {presets.length > 0 && (\n <div className=\"pos-svc__presets\">\n {presets.map((p) => (\n <button\n key={p.id}\n className=\"pos-svc__preset\"\n aria-pressed={foco\n ? (overrides[foco.id] ?? '') === String(p.percent)\n : !isCustom && percent === p.percent}\n onClick={() => {\n if (foco) { setOverrides((prev) => ({ ...prev, [foco.id]: String(p.percent) })); return }\n setIsCustom(false); setPercent(p.percent)\n }}\n >\n <span className=\"pos-svc__pn\">\n {p.label}\n {/* A ESTRELA do padrão da casa — o V1 a desenha ao lado\n do rótulo. Sem ela, três taxas cadastradas são três\n opções iguais, e quem não conhece a casa não sabe\n qual é a de sempre. `isDefault` já existia no tipo\n e não era desenhado por ninguém. */}\n {p.isDefault && <Star size={11} strokeWidth={2.6} className=\"pos-svc__star\" aria-label=\"padrão da casa\" />}\n </span>\n <span className=\"pos-num\">{p.percent}%</span>\n </button>\n ))}\n </div>\n )}\n <div className=\"pos-dsc__row\">\n {/* \"Ou\" pressupõe uma primeira opção. Sem atalhos cadastrados\n não há \"ou\": sobrava um rótulo de seção e um rótulo de\n linha empilhados dizendo a mesma coisa. */}\n {(presets.length > 0 || !foco) && (\n <span className=\"pos-dsc__lbl\">\n {foco ? 'Ou digite a taxa dela' : 'Ou digite uma taxa livre'}\n </span>\n )}\n <input\n className=\"pos-dsc__val\"\n inputMode=\"decimal\"\n value={foco ? (overrides[foco.id] ?? '') : (isCustom ? custom : '')}\n autoFocus={!!foco}\n onFocus={() => { if (!foco) setIsCustom(true) }}\n onChange={(e) => {\n if (foco) { setOverrides((prev) => ({ ...prev, [foco.id]: e.target.value })); return }\n setIsCustom(true); setCustom(e.target.value)\n }}\n // Em branco NÃO é zero: é \"usa a taxa da mesa\". Escrever o\n // número da mesa no placeholder é dizer isso sem uma frase.\n placeholder={foco ? String(efetivo) : 'Ex: 12.5'}\n aria-label={foco ? `Taxa de ${foco.label}` : 'Taxa livre'}\n />\n <span className=\"pos-dsc__eq\">%</span>\n </div>\n {foco && (\n <p className=\"pos-sheet__hint\">\n Em branco, {foco.label} paga a taxa da mesa ({efetivo}%).\n </p>\n )}\n </div>\n\n {/* Os dois números que decidem. O \"elegível\" é o que mais surpreende\n quem opera — e é por isso que ele aparece, em vez de o total\n sair de uma base invisível. */}\n <div className=\"pos-svc__sum\">\n <div className=\"pos-svc__line\">\n <span>Subtotal elegível</span>\n <span className=\"pos-num\">{formatCents(eligibleCents)}</span>\n </div>\n <div className=\"pos-svc__line pos-svc__line--strong\">\n <span>Taxa de serviço total</span>\n <span className=\"pos-num\">{formatCents(total)}</span>\n </div>\n </div>\n\n {abertos.length > 0 && (\n <div className=\"pos-dsc__sec\">\n <span className=\"pos-dsc__lbl\">\n {foco ? 'Os outros participantes' : 'Por Participante'}\n </span>\n <ul className=\"pos-dsc__lines\">\n {/* Quem está em foco já tem o campo lá em cima; repeti-lo\n aqui daria dois campos para o mesmo número, e o garçom\n teria de descobrir qual dos dois vale. */}\n {abertos.filter((g) => g.id !== foco?.id).map((g) => (\n <li key={g.id}>\n <div className=\"pos-svc__guest\">\n <span className=\"pos-dsc__name\">{g.label}</span>\n <input\n className=\"pos-dsc__val pos-svc__gv\"\n inputMode=\"decimal\"\n value={overrides[g.id] ?? (g.percent != null ? String(g.percent) : '')}\n onChange={(e) => setOverrides((p) => ({ ...p, [g.id]: e.target.value }))}\n // O placeholder é a taxa da MESA: em branco quer\n // dizer \"usa esta\", e não zero.\n placeholder={String(efetivo)}\n aria-label={`Taxa de ${g.label}`}\n />\n <span className=\"pos-dsc__eq\">%</span>\n </div>\n </li>\n ))}\n </ul>\n </div>\n )}\n </div>\n )}\n\n <div className=\"pos-sheet__foot\">\n <button className=\"pos-btn pos-btn--ghost\" onClick={onCancel}>Cancelar</button>\n {authorizers.length > 0 && (\n <button\n className=\"pos-btn\"\n disabled={!!impedimento}\n onClick={() => onConfirm({\n percent: efetivo,\n guestOverrides: Object.entries(overrides).map(([guestId, v]) => ({\n guestId,\n percent: v === '' ? null : Number(v.replace(',', '.')) || 0,\n })),\n })}\n >\n Salvar taxa\n </button>\n )}\n </div>\n\n {(error || (impedimento && authorizers.length > 0)) && (\n <p className=\"pos-sheet__why\" data-error={error ? '' : undefined}>{error ?? impedimento}</p>\n )}\n </div>\n </SheetLayer>\n )\n}\n","// ---------------------------------------------------------------------------\n// QUANTAS pessoas sentaram — e por que esse número não é cosmético.\n//\n// Portado do `GuestCountDialog` do V1 e do `onGuestCountChanged` do\n// `OrderModal`. O número de pessoas multiplica o COUVERT: errado, a conta sai\n// errada, e no V2 ele não podia ser corrigido depois de a comanda abrir.\n//\n// A regra toda cabe em uma frase: **o número nunca desce abaixo de quem já tem\n// nome**. Baixar de quatro para dois numa mesa com três pessoas identificadas\n// apagaria uma pessoa que pediu — então o pedido SOBE para o piso, em silêncio,\n// como no V1.\n// ---------------------------------------------------------------------------\n\nimport { isAnonymousGuest, type TicketGuest } from './session'\n\n/** O teto do V1, literal: um `input` de três dígitos. */\nexport const MAX_GUESTS = 999\n\n/**\n * O PISO: nunca menos que 1, nunca menos que o número de pessoas\n * IDENTIFICADAS.\n *\n * «Identificada» é a mesma pergunta que o resto do PDV faz (`isAnonymousGuest`):\n * tem telefone, tem ficha, ou alguém digitou um nome em cima de «Pessoa 3».\n * Quem continua «Pessoa 3» é cadeira, não pessoa, e cadeira pode sumir.\n */\nexport function guestCountFloor(party: TicketGuest[] | undefined): number {\n const identificadas = (party ?? []).filter((g) => !isAnonymousGuest(g)).length\n return Math.max(1, identificadas)\n}\n\n/**\n * O número que vale, dado o que o operador digitou.\n *\n * Sobe para o piso e desce do teto — a normalização que o V1 faz no `onBlur`.\n * Entrada vazia ou não-numérica vira o PISO, não zero: um campo limpo é «não\n * sei», e a resposta menos errada para «não sei» é o que já existe.\n */\nexport function normalizeGuestCount(\n entrada: string | number | null | undefined,\n piso: number,\n): number {\n const n = typeof entrada === 'number' ? entrada : parseInt(String(entrada ?? ''), 10)\n if (!Number.isFinite(n) || n < piso) return piso\n return Math.min(MAX_GUESTS, Math.trunc(n))\n}\n\n/**\n * Quantas cadeiras NOVAS o número pede.\n *\n * O V1 desenha essas vagas tracejadas no próprio diálogo, para o operador ver\n * o que vai nascer antes de confirmar.\n */\nexport function newSlotCount(alvo: number, party: TicketGuest[] | undefined): number {\n return Math.max(0, alvo - (party?.length ?? 0))\n}\n","// ---------------------------------------------------------------------------\n// «Número de Pessoas» — o `GuestCountDialog` do V1.\n//\n// O número multiplica o COUVERT, e no V2 ele ficava congelado no que a mesa\n// declarou ao abrir: chegou mais gente, o couvert não seguiu. Esta é a folha\n// que o V1 tem e o V2 não tinha.\n//\n// A lista de pessoas vem DENTRO, e a razão é a que o V1 escreveu: *trocar o\n// número e trocar QUEM são as pessoas é a mesma decisão* — separar as duas\n// obrigava o operador a fechar aqui, achar a pastilha da pessoa e abrir outro\n// diálogo.\n// ---------------------------------------------------------------------------\n\nimport { useEffect, useRef, useState } from 'react'\nimport { Minus, Plus, Users, X } from 'lucide-react'\nimport { SheetLayer } from './SheetLayer'\nimport { isAnonymousGuest, type TicketGuest } from './session'\nimport { guestCountFloor, newSlotCount, normalizeGuestCount, MAX_GUESTS } from './guestCount'\n\nexport interface GuestCountIntent {\n count: number\n /** Os nomes que o operador digitou, por participante. Só os que mudaram. */\n names: Record<string, string>\n}\n\nexport function GuestCountSheet({ label, current, party, onCancel, onConfirm, saving }: {\n /** O nome da posição — «Mesa 12», «Balcão». */\n label: string\n current: number\n party?: TicketGuest[]\n onCancel: () => void\n onConfirm: (intent: GuestCountIntent) => void\n saving?: boolean\n}) {\n const piso = guestCountFloor(party)\n const [texto, setTexto] = useState(String(Math.max(piso, current)))\n const [nomes, setNomes] = useState<Record<string, string>>({})\n const campo = useRef<HTMLInputElement>(null)\n\n useEffect(() => { campo.current?.focus(); campo.current?.select() }, [])\n\n const valor = normalizeGuestCount(texto, piso)\n const novas = newSlotCount(valor, party)\n\n useEffect(() => {\n function onKey(event: KeyboardEvent) {\n if (event.key === 'Escape') { event.preventDefault(); onCancel() }\n }\n window.addEventListener('keydown', onKey, true)\n return () => window.removeEventListener('keydown', onKey, true)\n }, [onCancel])\n\n const confirmar = () => onConfirm({ count: valor, names: nomes })\n\n return (\n <SheetLayer role=\"dialog\" aria-modal=\"true\" aria-label={`Número de pessoas · ${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\" style={{ display: 'inline-flex', alignItems: 'center', gap: 8 }}>\n <Users size={18} strokeWidth={2.2} aria-hidden />\n Número de Pessoas\n </span>\n <span className=\"pos-t-sm\" style={{ display: 'block' }}>{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 <div className=\"pos-gcount\">\n {/* O `−` PARA no piso, e fica desligado lá: baixar de quatro para\n dois numa mesa com três pessoas identificadas apagaria alguém\n que pediu. */}\n <button\n type=\"button\"\n className=\"pos-gcount__step\"\n onClick={() => setTexto(String(Math.max(piso, valor - 1)))}\n disabled={valor <= piso}\n aria-label=\"Uma pessoa menos\"\n >\n <Minus size={18} strokeWidth={2.4} aria-hidden />\n </button>\n <input\n ref={campo}\n className=\"pos-gcount__n pos-num\"\n type=\"text\"\n inputMode=\"numeric\"\n pattern=\"[0-9]*\"\n value={texto}\n onChange={(e) => setTexto(e.target.value.replace(/[^0-9]/g, ''))}\n onBlur={() => setTexto(String(valor))}\n onFocus={(e) => e.target.select()}\n aria-label=\"Número de pessoas\"\n />\n <button\n type=\"button\"\n className=\"pos-gcount__step\"\n onClick={() => setTexto(String(Math.min(MAX_GUESTS, valor + 1)))}\n disabled={valor >= MAX_GUESTS}\n aria-label=\"Uma pessoa mais\"\n >\n <Plus size={18} strokeWidth={2.4} aria-hidden />\n </button>\n </div>\n\n {valor <= piso && piso > 1 && (\n <p className=\"pos-t-sm\" style={{ margin: 0 }}>\n {piso === 1 ? 'Uma pessoa' : `${piso} pessoas`} já {piso === 1 ? 'tem' : 'têm'} nome\n nesta comanda — o número não desce abaixo disso.\n </p>\n )}\n\n {/* Trocar o número e trocar QUEM são as pessoas é a mesma decisão. */}\n {(party ?? []).length > 0 && (\n <div className=\"pos-gcount__list\">\n {(party ?? []).map((g, i) => {\n const nome = nomes[g.id] ?? g.name\n const anonimo = isAnonymousGuest({ ...g, name: nome })\n return (\n <div className=\"pos-gcount__row\" key={g.id}>\n <span className=\"pos-gcount__i\" data-anon={anonimo || undefined} aria-hidden>\n {nome.trim().charAt(0).toUpperCase() || String(i + 1)}\n </span>\n <span className=\"pos-input\">\n <input\n value={nome}\n onChange={(e) => setNomes((p) => ({ ...p, [g.id]: e.target.value }))}\n onFocus={(e) => { if (anonimo) e.target.select() }}\n placeholder={`Pessoa ${i + 1}`}\n aria-label={`Nome da pessoa ${i + 1}`}\n autoComplete=\"off\"\n />\n </span>\n </div>\n )\n })}\n {/* As vagas que vão NASCER, tracejadas — o operador vê antes de\n confirmar. Mesmo desenho da cadeira anônima no salão. */}\n {Array.from({ length: novas }, (_, i) => (\n <div className=\"pos-gcount__row pos-gcount__row--new\" key={`nova-${i}`}>\n <span className=\"pos-gcount__i pos-gcount__i--new\" aria-hidden>\n {(party ?? []).length + i + 1}\n </span>\n <span className=\"pos-gcount__ghost\">Pessoa {(party ?? []).length + i + 1}</span>\n </div>\n ))}\n </div>\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={confirmar} disabled={saving}>\n {saving ? 'Salvando...' : 'Confirmar'}\n </button>\n </footer>\n </div>\n </SheetLayer>\n )\n}\n","// ---------------------------------------------------------------------------\n// QUANTOS COUVERTS cada participante levou.\n//\n// O V1 tem um diálogo para isto (`CoverChargeEditDialog`): «Editar {nome}»,\n// «R$ X por unidade», um campo por participante e o total embaixo.\n//\n// Existe porque couvert **não é um por cabeça**. Uma pessoa pede dois, a\n// criança não paga, quem chegou no fim da noite também não. Sem o ajuste, a\n// única saída é cancelar a linha inteira — e aí o couvert some da conta em vez\n// de ficar certo.\n//\n// No V2 a coluna existe desde a migration 019 e NUNCA recebeu uma linha: o\n// couvert era sempre `unitário × número de pessoas`.\n// ---------------------------------------------------------------------------\n\nexport interface CoverGuestQty {\n guestId: string\n /** O nome que aparece na linha. */\n label: string\n qty: number\n}\n\n/**\n * A quantidade que o V1 aceita.\n *\n * `Math.max(0, qty)` é literal dele. O piso em zero é o que permite tirar UMA\n * pessoa do couvert sem tirar o couvert da mesa — que é o caso da criança.\n */\nexport function normalizeCoverQty(value: unknown): number {\n const n = Math.floor(Number(value))\n if (!Number.isFinite(n)) return 0\n return Math.max(0, n)\n}\n\n/** Quantas unidades no total — o número que o V1 mostra no rodapé. */\nexport function coverTotalQty(linhas: ReadonlyArray<{ qty: number }>): number {\n return linhas.reduce((s, l) => s + normalizeCoverQty(l.qty), 0)\n}\n\n/** Quanto a mesa paga de couvert, em centavos. */\nexport function coverTotalCents(unitCents: number, linhas: ReadonlyArray<{ qty: number }>): number {\n return Math.round(unitCents * coverTotalQty(linhas))\n}\n\n/**\n * Dá para salvar?\n *\n * **Zero em TODOS é salvável**, e de propósito: é como se zera um couvert\n * lançado por engano sem cancelar a linha. O que não se salva é uma lista\n * vazia — aí não há participante, e o gesto não tem sujeito.\n */\nexport function coverQtyBlock(linhas: ReadonlyArray<CoverGuestQty>): string | null {\n if (linhas.length === 0) return 'Esta comanda ainda não tem participantes.'\n return null\n}\n\n/**\n * A quantidade com que a folha ABRE, quando o couvert nunca foi repartido.\n *\n * O V1 usa a política, não um: `isIdentified ? qty_per_identified : qty_per_\n * unidentified`, com `?? 1` em cada (`OrdersDashboard.tsx:553-561`). É a mesma\n * conta que a RPC do V2 faz para somar o total — então abrir com «1 em cada»\n * ofereceria ao operador um ponto de partida que discorda do que a casa cobra.\n *\n * O caso que expõe isso é a casa que cobra de quem tem nome e NÃO cobra de quem\n * não se identificou: `qtyUnidentified` é zero, e «1 em cada» inventaria uma\n * cobrança.\n */\nexport function openingCoverQty(\n identificado: boolean,\n policy?: { qtyIdentified?: number; qtyUnidentified?: number },\n): number {\n const bruto = identificado ? policy?.qtyIdentified : policy?.qtyUnidentified\n // `?? 1` é o default do V1. `normalizeCoverQty` cuida do resto: zero fica\n // zero, negativo vira zero, fração trunca.\n return normalizeCoverQty(bruto ?? 1)\n}\n","// ---------------------------------------------------------------------------\n// EDITAR O COUVERT, por participante.\n//\n// Porte do `CoverChargeEditDialog` do V1, com as palavras dele: «Editar\n// {nome}», «R$ X por unidade», um campo por participante, e o total embaixo.\n//\n// Por que não é a folha de «Número de Pessoas»: lá o número é UM, da mesa;\n// aqui é um por cabeça, e a soma não precisa bater com quantos sentaram — é\n// exatamente essa diferença que o gesto existe para escrever.\n// ---------------------------------------------------------------------------\n\nimport { useState } from 'react'\nimport { Ticket, X } from 'lucide-react'\nimport { SheetLayer } from './SheetLayer'\nimport { formatCents } from './money'\nimport {\n normalizeCoverQty, coverTotalQty, coverTotalCents, coverQtyBlock,\n type CoverGuestQty,\n} from './coverQuantities'\n\nexport interface CoverChargeIntent {\n quantities: Array<{ guestId: string; qty: number }>\n}\n\nexport function CoverChargeSheet({\n chargeName, unitCents, guests, saving, onCancel, onConfirm,\n}: {\n chargeName: string\n unitCents: number\n guests: CoverGuestQty[]\n saving?: boolean\n onCancel: () => void\n onConfirm: (intent: CoverChargeIntent) => void\n}) {\n const [linhas, setLinhas] = useState<CoverGuestQty[]>(guests)\n const bloqueio = coverQtyBlock(linhas)\n const totalUnidades = coverTotalQty(linhas)\n\n const mudar = (guestId: string, valor: string) => {\n setLinhas((prev) => prev.map((l) => (\n l.guestId === guestId ? { ...l, qty: normalizeCoverQty(valor) } : l\n )))\n }\n\n return (\n <SheetLayer role=\"dialog\" aria-modal=\"true\" aria-label={`Editar ${chargeName}`}>\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\" style={{ display: 'inline-flex', alignItems: 'center', gap: 8 }}>\n <Ticket size={18} strokeWidth={2.2} aria-hidden />\n Editar {chargeName}\n </span>\n {/* A frase do V1, e ela é a que explica a coluna de números. */}\n <span className=\"pos-t-sm\" style={{ display: 'block' }}>\n {formatCents(unitCents)} por unidade\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\">\n {linhas.length === 0 ? (\n <p className=\"pos-t-sm\">{bloqueio}</p>\n ) : (\n <div className=\"pos-cvr\">\n {linhas.map((l) => (\n <label className=\"pos-cvr__row\" key={l.guestId}>\n <span className=\"pos-cvr__who\">{l.label}</span>\n <input\n className=\"pos-cvr__n pos-num\"\n type=\"number\"\n min={0}\n inputMode=\"numeric\"\n value={l.qty}\n onChange={(e) => mudar(l.guestId, e.target.value)}\n aria-label={`Quantos ${chargeName} para ${l.label}`}\n />\n </label>\n ))}\n </div>\n )}\n </div>\n\n <footer className=\"pos-sheet__foot\">\n {/* O rodapé do V1: quantas unidades e quanto dá. */}\n <span className=\"pos-cvr__tot\">\n <span className=\"pos-t-sm\">\n {totalUnidades} {totalUnidades === 1 ? 'unidade' : 'unidades'}\n </span>\n <strong className=\"pos-num\">{formatCents(coverTotalCents(unitCents, linhas))}</strong>\n </span>\n <button className=\"pos-btn\" onClick={onCancel}>Voltar</button>\n <button\n className=\"pos-btn pos-btn--primary\"\n disabled={!!bloqueio || !!saving}\n onClick={() => onConfirm({\n quantities: linhas.map((l) => ({ guestId: l.guestId, qty: normalizeCoverQty(l.qty) })),\n })}\n >\n Salvar\n </button>\n </footer>\n {bloqueio && <p className=\"pos-sheet__why\">{bloqueio}</p>}\n </div>\n </SheetLayer>\n )\n}\n","// ---------------------------------------------------------------------------\n// CONFERIR QUANTAS PESSOAS, antes de fechar.\n//\n// Regra do V1 (`OrderModal.tsx:775`), e ela tem DUAS condições:\n//\n// if (coverCharges.length > 0) {\n// const { data } = await supabase.from('cover_charge_settings')\n// .select('confirm_guest_count_on_close').limit(1).single()\n// if (data?.confirm_guest_count_on_close) { setGuestCountCloseOpen(true); return }\n// }\n// await doCloseOrder()\n//\n// Existe porque o couvert é POR PESSOA e o número muda durante a refeição —\n// gente que chega, gente que sai. Fechar com o número da ABERTURA cobra\n// errado, e ninguém percebe: o total simplesmente sai menor (ou maior) do que\n// a mesa consumiu.\n//\n// As duas condições importam:\n//\n// - **sem couvert, não pergunta.** Perguntar o número de pessoas numa comanda\n// que não cobra por pessoa é um passo a mais sem consequência nenhuma, e\n// todo passo sem consequência ensina o operador a confirmar no automático.\n// - **sem o interruptor, não pergunta.** A casa que não cobra couvert variável\n// já conferiu na abertura.\n//\n// O interruptor existe em `plg_tables_settings` e na tela de Configurações\n// desde sempre; o PDV é que nunca o consultava.\n// ---------------------------------------------------------------------------\n\nexport interface CloseGuestCheck {\n /** Quantas linhas de couvert a comanda tem. */\n coverCount: number\n /** A casa ligou «Confirmar número de pessoas ao fechar». */\n confirmOnClose: boolean\n /** A conferência já aconteceu neste gesto. */\n alreadyConfirmed?: boolean\n}\n\n/** Pergunta antes de fechar? */\nexport function asksGuestCountOnClose(c: CloseGuestCheck): boolean {\n if (c.alreadyConfirmed) return false\n if (c.coverCount <= 0) return false\n return c.confirmOnClose\n}\n","/**\n * Qual conta o toque no canal REABRE, em vez de começar outra.\n *\n * Porte literal de `specialOrderReuse.ts` do V1 — uma regra para os três\n * canais sem mesa, porque antes eram lidas como três:\n *\n * - **BALCÃO** reaproveita a conta DO DIA. O reaproveitamento é o que mantém o\n * número do balcão estável ao longo de um turno, mas no V1 ele não tinha fim:\n * uma conta deixada aberta em abril continuava sendo a que o canal reabria em\n * setembro, então a venda seguinte entrava numa conta com itens de outras\n * pessoas, mandados para a cozinha em dias que ninguém lembra, e ninguém\n * nunca a fechava.\n * - **RETIRADA** reaproveita só a VAZIA. Cada retirada é um cliente diferente,\n * então duas com item nunca se juntam — mas tocar no canal duas vezes não\n * pode deixar uma conta de R$ 0,00 para trás.\n * - **DELIVERY** nunca reaproveita: começa o pedido de outro cliente, e pedido\n * importado de canal não é candidato.\n *\n * A unidade entra em todas: numa conta com várias casas, o balcão da casa\n * seguinte é outra conta.\n *\n * Conta que cai fora da regra NÃO é escondida nem fechada — fica na bandeja com\n * a idade dela, porque conta aberta é dinheiro que não entrou. Ela só deixa de\n * ser aquela em que a próxima venda cai.\n *\n * O vocabulário é o do V2: a coluna é `channel` (`balcao` / `retirada` /\n * `delivery`), não o `type` do V1, e o fim de vida é `completed`, não `closed`.\n * A REGRA é a mesma, palavra por palavra.\n */\nexport type SpecialChannel = 'balcao' | 'retirada' | 'delivery'\n\n/** O pedaço de `orders` que a regra precisa — a comanda do PDV satisfaz. */\nexport interface ReusableOrder {\n id: string\n channel: string\n /** Comanda de mesa nunca é candidata, mesmo que o canal bata. */\n tableId?: string | null\n unitId?: string | null\n status: string\n totalCents: number\n openedAt: string\n}\n\n/** Meia-noite local do dia de `now` — o começo da janela do balcão. */\nexport function dayStart(now: Date): number {\n return new Date(now.getFullYear(), now.getMonth(), now.getDate()).getTime()\n}\n\nexport function findReusableSpecialOrder(\n orders: ReusableOrder[],\n channel: SpecialChannel,\n unitId: string | null | undefined,\n now: Date,\n): ReusableOrder | undefined {\n if (channel === 'delivery') return undefined\n const inicio = dayStart(now)\n return orders.find((o) => {\n if (o.channel !== channel) return false\n if (o.tableId) return false\n // `?? null` dos dois lados: conta de uma casa só grava `null`, e comparar\n // `null` com `undefined` faria a regra recusar a própria conta da casa.\n if ((o.unitId ?? null) !== (unitId ?? null)) return false\n if (o.status === 'completed' || o.status === 'cancelled') return false\n if (channel === 'retirada') return o.totalCents === 0\n const aberta = new Date(o.openedAt).getTime()\n // Data ilegível não é a conta de hoje: melhor uma conta nova que o\n // fantasma que esta regra existe para impedir.\n return Number.isFinite(aberta) && aberta >= inicio\n })\n}\n","// ---------------------------------------------------------------------------\n// Cancelar item da comanda.\n//\n// Portado de `beautyplace/src/components/orders/OrderCancellationModal.tsx`.\n// Duas coisas que o V1 sabe e uma tela de \"cancelar item\" não:\n//\n// 1. **O cancelamento é PARCIAL, por quantidade.** O V1 desenha um seletor de\n// 0 a N em cada linha, e não uma caixa de marcar. Três chopes saíram, um\n// voltou: cancela-se UM. Tratar a linha como tudo-ou-nada obriga o operador\n// a cancelar os três e lançar dois de novo — e o painel de turno passa a\n// contar três cancelamentos onde houve um.\n//\n// 2. **Motivo ou memorando**, nunca nenhum — a mesma frase do desconto:\n// \"Selecione um motivo ou informe no memorando.\" O que foi cancelado e por\n// quê é a pergunta que o painel de Operação responde no fim do dia; sem o\n// porquê, o ranking de cancelamento é uma lista de nomes de prato.\n//\n// 3. **«Cancelar todos os itens» é UM gesto, não N.** A mesa que pediu errado\n// inteira, o pedido lançado na comanda do vizinho: no V1 é uma caixa só, em\n// vermelho, no topo. Obrigar o operador a abrir vinte seletores para chegar\n// ao mesmo lugar é onde ele desiste e fecha a conta errada — e cada seletor\n// é uma chance de cancelar 2 onde eram 3.\n//\n// 4. **As linhas vêm agrupadas por participante**, mesa primeiro. Numa comanda\n// de oito pessoas a pergunta nunca é \"cancelar o chope\"; é \"cancelar o chope\n// DE QUEM\". Uma lista corrida de vinte linhas com três chopes iguais não\n// responde isso, e o operador cancela o chope de quem bebeu.\n//\n// E a regra que vem de fora: só se cancela o que a cozinha JÁ VIU. Item ainda\n// no carrinho não se cancela — se apaga. Por isso o `⋯` diz \"Nenhum item\n// enviado para cancelar\" quando não há linha enviada.\n// ---------------------------------------------------------------------------\n\nimport { isCancelable } from './cancelCheck'\nimport { useMemo, useState } from 'react'\nimport { Ban, User, X } from 'lucide-react'\nimport { formatCents } from './money'\nimport { groupLinesByGuest } from './session'\nimport type { Ticket, TicketGuest, TicketLine } from './session'\nimport { SheetLayer } from './SheetLayer'\nimport { CANCEL_SUBTITLE } from './sheetSubtitle'\n\nexport interface CancelReasonOption {\n id: string\n name: string\n}\n\nexport interface CancelIntent {\n /** Linha → quantas unidades cancelar. Só entram as maiores que zero. */\n quantities: Array<{ lineId: string; quantity: number }>\n reasonId?: string\n memo?: string\n}\n\nexport function CancelSheet({ ticket, party = [], reasons, error, onCancel, onConfirm }: {\n ticket: Ticket\n /**\n * Quem está na comanda. Vazio quer dizer \"ninguém identificado\" — e aí a\n * lista é corrida, como no balcão. Com gente dentro, o V1 agrupa.\n */\n party?: TicketGuest[]\n reasons: CancelReasonOption[]\n /**\n * A recusa do SERVIDOR — PIN errado, alçada estourada, comanda travada.\n *\n * Vive na folha, e não num aviso atrás dela: a folha cobre a tela, e um\n * recado que aparece por baixo não existe. Foi o que aconteceu ao portar a\n * conferência de PIN — a autorização era recusada corretamente e o operador\n * via a tela parada, sem uma palavra.\n */\n error?: string\n\n onCancel: () => void\n onConfirm: (intent: CancelIntent) => void\n}) {\n // Só o que a cozinha viu E ainda não entregou — é o `cancellableItems` do\n // V1. A pendente não aparece porque o servidor recusaria; a entregue, porque\n // o prato já está na mesa e o caminho dele é cortesia, não cancelamento.\n const enviados = useMemo(\n () => ticket.lines.filter((l) => isCancelable(l.state)),\n [ticket.lines],\n )\n const [qty, setQty] = useState<Record<string, number>>({})\n const [tudo, setTudo] = useState(false)\n const [reasonId, setReasonId] = useState('')\n const [memo, setMemo] = useState('')\n\n // «Tudo» é a linha CHEIA de cada item enviado — é o\n // `cancellableItems.map(i => ({ id: i.id, qty: i.quantity }))` do V1, e não\n // uma soma dos seletores: marcar a caixa zera o que foi escolhido à mão, para\n // que não haja duas respostas na tela ao mesmo tempo.\n const escolhidas = tudo\n ? enviados.map((l) => ({ lineId: l.id, quantity: l.quantity }))\n : enviados\n .map((l) => ({ lineId: l.id, quantity: qty[l.id] ?? 0 }))\n .filter((x) => x.quantity > 0)\n\n const totalCents = escolhidas.reduce((sum, x) => {\n const linha = enviados.find((l) => l.id === x.lineId)\n return sum + (linha ? linha.unitPriceCents * x.quantity : 0)\n }, 0)\n\n // Mesa primeiro, depois cada participante — a ordem do V1. Sem gente\n // identificada `groupLinesByGuest` devolve um grupo só, e a lista sai corrida\n // como estava: o balcão não ganha um cabeçalho «Mesa» para nada.\n const grupos = useMemo(\n () => groupLinesByGuest(enviados, party),\n [enviados, party],\n )\n const temGente = grupos.length > 1 || (grupos.length === 1 && grupos[0].guestId !== null)\n\n const impedimento =\n enviados.length === 0 ? 'Nenhum item enviado para cancelar.'\n : escolhidas.length === 0 ? 'Escolha quantas unidades cancelar.'\n : !reasonId && !memo.trim() ? 'Selecione um motivo ou informe no memorando.'\n : undefined\n\n const linhaDoItem = (l: TicketLine) => (\n <li key={l.id}>\n <div className=\"pos-svc__guest\">\n <span className=\"pos-dsc__name\">\n <span className=\"pos-dsc__n\">{l.quantity}×</span> {l.name}\n </span>\n {/* De 0 a N, como no V1 — e não uma caixa de marcar:\n três chopes saíram, um voltou, cancela-se UM. */}\n <select\n className=\"pos-dsc__sel pos-svc__gv\"\n value={qty[l.id] ?? 0}\n onChange={(e) => setQty((p) => ({ ...p, [l.id]: Number(e.target.value) }))}\n aria-label={`Cancelar quantas unidades de ${l.name}`}\n >\n {Array.from({ length: l.quantity + 1 }, (_, i) => (\n <option key={i} value={i}>{i}</option>\n ))}\n </select>\n <span className=\"pos-num\">{formatCents(l.unitPriceCents * l.quantity)}</span>\n </div>\n </li>\n )\n\n return (\n <SheetLayer>\n <div className=\"pos-sheet__scrim\" onClick={onCancel} aria-hidden />\n <div className=\"pos-sheet__panel\" role=\"dialog\" aria-label=\"Cancelamento\" aria-modal>\n <div className=\"pos-sheet__head\">\n <h2 className=\"pos-sheet__title\">\n <Ban size={18} strokeWidth={2.2} aria-hidden /> Cancelamento\n </h2>\n <button className=\"pos-sheet__x\" onClick={onCancel} aria-label=\"Fechar\"><X size={20} /></button>\n </div>\n <p className=\"pos-sheet__sub\">{CANCEL_SUBTITLE}</p>\n\n <div className=\"pos-sheet__body\">\n {enviados.length === 0 ? (\n <>\n <p className=\"pos-empty__t\">Nenhum item enviado para cancelar.</p>\n <p className=\"pos-empty__h\">\n Item que a cozinha ainda não viu se apaga na comanda, não se cancela.\n </p>\n </>\n ) : (\n <>\n {/* A caixa vermelha do V1, no topo e antes de tudo: ela é o caso\n do pedido inteiro lançado na comanda errada, e é o único\n gesto que não pede vinte toques. */}\n <label className=\"pos-dsc__all\">\n <input\n type=\"checkbox\"\n checked={tudo}\n onChange={(e) => { setTudo(e.target.checked); if (e.target.checked) setQty({}) }}\n />\n <span>Cancelar todos os itens</span>\n </label>\n\n {!tudo && (\n <div className=\"pos-dsc__sec\">\n <span className=\"pos-dsc__lbl\">Quantas unidades</span>\n {temGente ? (\n grupos.map((g) => (\n <div key={g.guestId ?? '__mesa__'} className=\"pos-dsc__grp\">\n <div className=\"pos-dsc__grph\">\n <User size={14} strokeWidth={2.2} aria-hidden />\n <span>{g.guestName}</span>\n </div>\n <ul className=\"pos-dsc__lines\">{g.lines.map(linhaDoItem)}</ul>\n </div>\n ))\n ) : (\n <ul className=\"pos-dsc__lines\">{enviados.map(linhaDoItem)}</ul>\n )}\n </div>\n )}\n\n <div className=\"pos-dsc__sec\">\n <span className=\"pos-dsc__lbl\">Por quê</span>\n <select\n className=\"pos-dsc__sel\"\n value={reasonId}\n onChange={(e) => setReasonId(e.target.value)}\n aria-label=\"Motivo do cancelamento\"\n >\n <option value=\"\">Selecione um motivo…</option>\n {reasons.map((r) => <option key={r.id} value={r.id}>{r.name}</option>)}\n </select>\n <textarea\n className=\"pos-dsc__memo\"\n value={memo}\n onChange={(e) => setMemo(e.target.value)}\n placeholder=\"Memorando\"\n rows={2}\n aria-label=\"Memorando\"\n />\n </div>\n\n {totalCents > 0 && (\n <div className=\"pos-svc__sum\">\n <div className=\"pos-svc__line pos-svc__line--strong\">\n <span>Sai da conta</span>\n <span className=\"pos-num\">− {formatCents(totalCents)}</span>\n </div>\n </div>\n )}\n </>\n )}\n </div>\n\n <div className=\"pos-sheet__foot\">\n <button className=\"pos-btn pos-btn--ghost\" onClick={onCancel}>Voltar</button>\n {enviados.length > 0 && (\n <button\n className=\"pos-btn\"\n disabled={!!impedimento}\n onClick={() => onConfirm({\n quantities: escolhidas,\n reasonId: reasonId || undefined,\n memo: memo.trim() || undefined,\n })}\n >\n Cancelar itens\n </button>\n )}\n </div>\n\n {(error || (impedimento && enviados.length > 0)) && (\n <p className=\"pos-sheet__why\" data-error={error ? '' : undefined}>{error ?? impedimento}</p>\n )}\n </div>\n </SheetLayer>\n )\n}\n","// ---------------------------------------------------------------------------\n// Quais linhas podem entrar na MESMA transferência de itens.\n//\n// Uma só, e é a regra do V1: **itens de um participante por vez**. A primeira\n// linha marcada fixa o dono da seleção; a de outro dono é RECUSADA no clique, e\n// desmarcar tudo libera o dono para começar de outro.\n//\n// Antes daqui o V2 deixava marcar de todo mundo e só travava o botão no fim, com\n// a mesma frase. Parece equivalente e não é: o operador que marcou cinco itens\n// de três pessoas descobre o problema no último passo e **não sabe qual deles\n// quebrou** — ele desmarca no escuro. O V1 recusa no gesto, então o que está\n// selecionado é sempre válido.\n//\n// A linha COMPARTILHADA (sem participante) é um dono como outro qualquer: no V1\n// ela entra sob a chave `__mesa__`, e transferir o compartilhado junto com o de\n// alguém é a mesma ambiguidade.\n// ---------------------------------------------------------------------------\n\n/** A chave de dono de uma linha. Sem participante, é a da mesa. */\nexport const SHARED_OWNER = '__mesa__'\n\nexport function ownerOfLine(line: { guestId?: string | null }): string {\n return line.guestId || SHARED_OWNER\n}\n\nexport interface PickOutcome {\n /** A seleção depois do clique — a MESMA de antes quando foi recusado. */\n picked: Set<string>\n /** A frase do V1, quando o clique foi recusado. */\n refusal?: string\n}\n\n/**\n * Marca ou desmarca uma linha, aplicando a regra do dono único.\n *\n * Desmarcar NUNCA é recusado: sair de uma seleção inválida não pode depender de\n * uma seleção válida.\n */\nexport function pickLineForTransfer(\n picked: Set<string>,\n lines: Array<{ id: string; guestId?: string | null }>,\n lineId: string,\n): PickOutcome {\n if (picked.has(lineId)) {\n const next = new Set(picked)\n next.delete(lineId)\n return { picked: next }\n }\n const linha = lines.find((l) => l.id === lineId)\n if (!linha) return { picked }\n const dono = ownerOfLine(linha)\n const donoAtual = [...picked]\n .map((id) => lines.find((l) => l.id === id))\n .filter(Boolean)\n .map((l) => ownerOfLine(l as { guestId?: string | null }))[0]\n if (donoAtual !== undefined && donoAtual !== dono) {\n return { picked, refusal: 'Selecione itens de apenas um participante por vez.' }\n }\n const next = new Set(picked)\n next.add(lineId)\n return { picked: next }\n}\n\n// ---------------------------------------------------------------------------\n// QUAIS modos de transferência existem para esta comanda.\n//\n// O V1 mostra os três e **desabilita dois** quando não há participante\n// identificado, com a frase no lugar onde estaria a explicação:\n//\n// disabled={!hasParticipants}\n// {hasParticipants ? 'Transfere um participante para outra mesa'\n// : 'Disponível em comandas com participantes'}\n//\n// onde `hasParticipants = guests.length > 0`.\n//\n// Mostrar e desabilitar, em vez de esconder: o operador que procura «transferir\n// um participante» precisa ver que o caminho existe e o que falta para ele\n// abrir. Um modo que some é um modo que a pessoa procura de novo amanhã.\n// ---------------------------------------------------------------------------\n\nexport const NO_GUESTS_HINT = 'Disponível em comandas com participantes'\n\n/** O subtítulo do modo, ou o motivo de ele estar fechado. */\nexport function transferModeHint(\n hint: string,\n needsGuests: boolean | undefined,\n guestCount: number,\n): { text: string; blocked: boolean } {\n const blocked = !!needsGuests && guestCount === 0\n return { text: blocked ? NO_GUESTS_HINT : hint, blocked }\n}\n\n// ---------------------------------------------------------------------------\n// PARA QUEM as linhas vão, no modo «Itens».\n//\n// O V1 monta a lista em quatro linhas, e as duas regras dela são exatamente as\n// que faltavam no V2:\n//\n// ```ts\n// if (sourceKey !== '__mesa__') opts.push({ value: '__mesa__', label: 'Mesa' })\n// for (const guest of guests) {\n// if (guest.guest_name !== sourceKey) opts.push({ value: String(guest.id), … })\n// }\n// ```\n//\n// 1. **A MESA é destino.** É o caminho de VOLTA: o item lançado no nome errado\n// volta a ser da mesa. O provedor do V2 sempre soube fazer isso — `toGuestId`\n// nulo apaga o vínculo e não cria outro, com o comentário «sem ele um item\n// posto na pessoa errada não teria saída» — e a folha nunca ofereceu o\n// botão. Saída sem porta é saída que não existe.\n//\n// 2. **A origem sai da lista.** Transferir o item do Fabiano PARA o Fabiano é\n// uma operação que grava auditoria e não muda nada; o V1 não a oferece, e\n// oferecê-la ensina que o gesto funcionou quando ele não fez nada.\n//\n// Uma diferença deliberada: quem **já quitou** também não é destino. O V1 não\n// guarda esse caso aqui (só ao escolher quem se muda), mas pendurar um item\n// novo na conta de quem já pagou muda um total que alguém fechou — e o V2 já\n// esconde a pessoa quitada na outra ponta do mesmo diálogo.\n// ---------------------------------------------------------------------------\n\n/** O rótulo do destino compartilhado. É o mesmo do agrupamento. */\nexport const SHARED_LABEL = 'Mesa'\n\nexport interface TransferDestination {\n /** `SHARED_OWNER` quando é a mesa. */\n value: string\n label: string\n}\n\n/**\n * Os destinos possíveis para as linhas selecionadas.\n *\n * `source` é o dono da seleção — `undefined` enquanto nada foi marcado, e aí a\n * lista sai inteira: não há origem para excluir ainda.\n */\nexport function transferDestinations(\n guests: Array<{ id: string; label: string; settled?: boolean }>,\n source: string | undefined,\n): TransferDestination[] {\n const opts: TransferDestination[] = []\n if (source !== SHARED_OWNER) opts.push({ value: SHARED_OWNER, label: SHARED_LABEL })\n for (const g of guests) {\n if (g.settled || g.id === source) continue\n opts.push({ value: g.id, label: g.label })\n }\n return opts\n}\n\n/** O dono da seleção atual, ou `undefined` se nada está marcado. */\nexport function selectionOwner(\n picked: Set<string> | string[],\n lines: Array<{ id: string; guestId?: string | null }>,\n): string | undefined {\n for (const id of picked) {\n const l = lines.find((x) => x.id === id)\n if (l) return ownerOfLine(l)\n }\n return undefined\n}\n","// ---------------------------------------------------------------------------\n// QUEM JÁ PAGOU NÃO SE TRANSFERE — e «já pagou» não é «fechou a conta».\n//\n// O V1 desabilita o participante assim (`OrderTransferModal.tsx:491`):\n//\n// const paid = participantPayments.get(g.id) || 0\n// const hasPaid = paid > 0\n// … disabled={hasPaid} … {hasPaid && <Badge>Já pagou</Badge>}\n//\n// A condição é **qualquer pagamento**, não a quitação. O V2 olhava só\n// `settlement_status === 'settled'`, e as duas coisas são diferentes: quem pagou\n// R$ 20 de uma parte de R$ 50 tem pagamento e NÃO está quitado.\n//\n// Medido no Pertinho em 29-09, em comanda ABERTA, com a folha de transferência\n// disponível:\n//\n// · Igor Cabral — R$ 33,90 pagos na comanda da Mesa 100 (R$ 2.493,06)\n// · Jackeline Costa — R$ 531,10 em 3 pagamentos, numa comanda de R$ 440,70\n//\n// Os dois apareciam na lista de «quem se muda». Mover um participante que já\n// pôs dinheiro leva o pagamento para outra mesa, e a conta de origem fica\n// devendo o que alguém já pagou — o erro mais difícil de achar depois, porque\n// as duas mesas fecham com números plausíveis.\n// ---------------------------------------------------------------------------\n\n/** O selo do V1, palavra por palavra. */\nexport const JA_PAGOU = 'Já pagou'\n\nexport interface TransferGuestMoney {\n /** A conta dele foi fechada e congelada. */\n settled?: boolean\n /** Quanto ele já pôs, em centavos — qualquer valor acima de zero basta. */\n paidCents?: number\n}\n\n/**\n * Este participante pode se mudar de mesa?\n *\n * Quitado OU com qualquer pagamento = não. Zero pago e sem quitação = sim, e\n * `undefined` conta como zero: a ausência de pagamento é o estado normal de\n * quase todo participante, e travar a transferência por falta de dado\n * impediria o gesto normal da casa.\n */\nexport function guestTransferBlocked(g: TransferGuestMoney): boolean {\n return g.settled === true || (g.paidCents ?? 0) > 0\n}\n\n/**\n * A frase para quando o participante ESCOLHIDO já pagou.\n *\n * O V1 não tem esta mensagem — ele só desabilita o botão. A segunda trava\n * existe porque desabilitar depende de a lista estar fresca: a seleção pode ter\n * sido feita antes de o pagamento chegar (outro aparelho cobrando a pessoa no\n * mesmo minuto), e aí o `disabled` aparece tarde, com o nome já escolhido.\n *\n * As palavras são as do V1 («Já pagou»), com o que fazer em seguida — porque\n * uma ação travada que não diz o motivo manda o garçom clicar de novo.\n */\nexport const GUEST_JA_PAGOU_IMPEDE =\n 'Este participante já pagou, e quem pôs dinheiro na conta não muda de mesa. Feche a parte dele ou transfira os itens.'\n","// ---------------------------------------------------------------------------\n// Transferência.\n//\n// Portado de `beautyplace/src/components/orders/OrderTransferModal.tsx`. Três\n// tipos, e o V1 os trata como três perguntas diferentes:\n//\n// **Mesa Inteira** a comanda muda de mesa — o grupo trocou de lugar.\n// **Participante** uma pessoa se muda, e leva o que consumiu.\n// **Itens** linhas mudam de dono dentro da mesma conta.\n//\n// A regra que só aparece andando: **\"Selecione itens de apenas um participante\n// por vez.\"** Transferir item é repontar o DONO da linha; misturar linhas de\n// duas pessoas numa transferência só deixaria o servidor adivinhar de quem é o\n// quê — e ele não adivinha, recusa.\n//\n// E a outra, silenciosa: **quem já pagou não se transfere.** O V1 marca o\n// participante com \"Já pagou\" e o tira da escolha. A parte quitada está\n// fechada; movê-la seria mover dinheiro que já entrou.\n// ---------------------------------------------------------------------------\n\nimport { useMemo, useState } from 'react'\nimport { ArrowLeftRight, User, X } from 'lucide-react'\nimport { formatCents } from './money'\nimport { guestTransferBlocked, GUEST_JA_PAGOU_IMPEDE, JA_PAGOU } from './transferGuestBlock'\nimport type { Ticket, TicketLine } from './session'\nimport {\n ownerOfLine, pickLineForTransfer, selectionOwner, transferDestinations, transferModeHint,\n SHARED_LABEL, SHARED_OWNER,\n} from './transferPick'\nimport { groupLinesByGuest } from './session'\nimport { SheetLayer } from './SheetLayer'\nimport { transferSubtitle } from './sheetSubtitle'\n\nexport type TransferKind = 'table' | 'guest' | 'items'\n\nexport interface TransferTarget {\n id: string\n label: string\n /**\n * A mesa já tem comanda aberta.\n *\n * Não é o mesmo que indisponível, e é por isso que a marca existe em vez de\n * um filtro só: **mudar a comanda INTEIRA** para uma mesa ocupada juntaria\n * duas contas que ninguém pediu para juntar, e o V1 nem oferece\n * (`fetchAvailableTables(true)`); **mudar UMA PESSOA** para uma mesa ocupada\n * é o caso normal — «o Fabiano foi sentar com o pessoal da 11» — e lá a\n * lista vem inteira (`fetchAvailableTables(false)`).\n *\n * Oferecer só mesa vazia nos dois casos fecha justamente o mais comum dos\n * dois.\n */\n occupied?: boolean\n}\n\nexport interface TransferGuest {\n id: string\n label: string\n /** Quitado: aparece marcado e não se transfere. */\n settled?: boolean\n /**\n * Quanto ele já pôs, em centavos.\n *\n * O V1 bloqueia por PAGAMENTO, não por quitação — ver\n * `guestTransferBlocked`. Quem pagou R$ 20 de R$ 50 não está quitado e\n * também não se muda de mesa.\n */\n paidCents?: number\n}\n\nexport interface TransferIntent {\n kind: TransferKind\n toTableId?: string\n guestId?: string\n toGuestId?: string | null\n lineIds?: string[]\n}\n\n/**\n * Os três modos, com o que o V1 escreve debaixo de cada um.\n *\n * O subtítulo não é enfeite: ele é a diferença entre «Participantes» e\n * «Itens», que de outro modo são duas palavras que não dizem o que fazem.\n * Um move uma PESSOA para outra mesa; o outro move linhas ENTRE as pessoas\n * da mesma mesa. Sem a frase, os dois são adivinhação.\n *\n * E dois deles **não existem sem gente identificada**: transferir participante\n * ou item entre participantes numa comanda que não tem nenhum é um destino\n * vazio. O V1 desabilita os dois e diz por quê, na mesma linha onde estaria a\n * explicação. O V2 oferecia os três sempre, e o operador do balcão só\n * descobria o beco depois de escolher — com a lista de participantes vazia e\n * um «Selecione o participante e a mesa de destino.» que ele não tem como\n * atender.\n */\nconst TIPOS: Array<{\n id: TransferKind\n label: string\n hint: string\n /** Sem participante identificado, este modo não tem destino. */\n needsGuests?: boolean\n}> = [\n { id: 'table', label: 'Mesa Inteira', hint: 'Transfere tudo para outra mesa' },\n {\n id: 'guest',\n label: 'Participantes',\n hint: 'Transfere um participante para outra mesa',\n needsGuests: true,\n },\n {\n id: 'items',\n label: 'Itens',\n hint: 'Transfere itens entre participantes da mesa',\n needsGuests: true,\n },\n]\n\n// A frase e a decisão moram em `transferPick.ts`, ao lado da outra regra de\n// transferência do V1 — e lá elas têm teste.\n\nexport function TransferSheet({\n ticket, positionLabel, tables, guests, authorizers, error, onCancel, onConfirm,\n}: {\n ticket: Ticket\n /** A mesa de onde se sai — o V1 mostra \"Mesa atual:\". */\n positionLabel?: string\n /** As mesas para onde se pode ir. */\n tables: TransferTarget[]\n guests: TransferGuest[]\n authorizers: Array<{ id: string; name: string }>\n /**\n * A recusa do SERVIDOR — PIN errado, alçada estourada, comanda travada.\n *\n * Vive na folha, e não num aviso atrás dela: a folha cobre a tela, e um\n * recado que aparece por baixo não existe. Foi o que aconteceu ao portar a\n * conferência de PIN — a autorização era recusada corretamente e o operador\n * via a tela parada, sem uma palavra.\n */\n error?: string\n\n onCancel: () => void\n onConfirm: (intent: TransferIntent) => void\n}) {\n const [kind, setKind] = useState<TransferKind>('table')\n const [toTableId, setToTableId] = useState('')\n const [guestId, setGuestId] = useState('')\n const [toGuestId, setToGuestId] = useState('')\n const [picked, setPicked] = useState<Set<string>>(() => new Set())\n /** A recusa do último clique. Aparece onde o V1 põe o toast. */\n const [recusa, setRecusa] = useState<string>()\n\n // O DONO da seleção — a origem. `pickLineForTransfer` garante que é um só.\n const origem = useMemo(\n () => selectionOwner(picked, ticket.lines),\n [picked, ticket.lines],\n )\n const paraQuem = useMemo(\n () => transferDestinations(guests, origem),\n [guests, origem],\n )\n // As linhas na ordem do V1: mesa primeiro, depois cada participante.\n const porDono = useMemo(\n () => groupLinesByGuest(\n ticket.lines,\n guests.map((g) => ({ id: g.id, name: g.label })),\n SHARED_LABEL,\n ),\n [ticket.lines, guests],\n )\n\n // A comanda inteira só vai para mesa VAZIA; uma pessoa vai para qualquer\n // mesa. É a diferença entre `freeOnly` true e false no V1.\n const destinos = useMemo(\n () => (kind === 'table' ? tables.filter((t) => !t.occupied) : tables),\n [tables, kind],\n )\n\n const impedimento =\n kind === 'table' && !toTableId ? 'Selecione a mesa de destino.'\n : kind === 'guest' && (!guestId || !toTableId) ? 'Selecione o participante e a mesa de destino.'\n // A SEGUNDA trava do dinheiro. A primeira é o `disabled` da lista, e ela\n // depende de a lista estar fresca — ver `GUEST_JA_PAGOU_IMPEDE`.\n : kind === 'guest' && guestTransferBlocked(guests.find((g) => g.id === guestId) ?? {})\n ? GUEST_JA_PAGOU_IMPEDE\n : kind === 'items' && picked.size === 0 ? 'Selecione ao menos um item para transferir.'\n : kind === 'items' && !toGuestId ? 'Selecione o destino da transferência.'\n : undefined\n\n return (\n <SheetLayer>\n <div className=\"pos-sheet__scrim\" onClick={onCancel} aria-hidden />\n <div className=\"pos-sheet__panel\" role=\"dialog\" aria-label=\"Transferência\" aria-modal>\n <div className=\"pos-sheet__head\">\n <h2 className=\"pos-sheet__title\">\n <ArrowLeftRight size={18} strokeWidth={2.2} aria-hidden /> Transferência\n </h2>\n <button className=\"pos-sheet__x\" onClick={onCancel} aria-label=\"Fechar\"><X size={20} /></button>\n </div>\n <p className=\"pos-sheet__sub\">{transferSubtitle(kind, picked.size)}</p>\n\n <div className=\"pos-sheet__body\">\n {positionLabel && (\n <p className=\"pos-sheet__from\">Mesa atual: <strong>{positionLabel}</strong></p>\n )}\n\n <div className=\"pos-dsc__sec\">\n <span className=\"pos-dsc__lbl\">Tipo</span>\n <span className=\"pos-seg\" role=\"group\" aria-label=\"Tipo de transferência\">\n {TIPOS.map((t) => {\n const { text: dica, blocked: bloqueado } =\n transferModeHint(t.hint, t.needsGuests, guests.length)\n return (\n <button\n key={t.id}\n className=\"pos-seg__btn pos-seg__btn--tall\"\n aria-pressed={kind === t.id}\n disabled={bloqueado}\n title={dica}\n onClick={() => {\n setKind(t.id)\n // A mesa escolhida pode não valer no outro modo: quem\n // apontou a 11 ocupada para MUDAR uma pessoa e então\n // trocou para a comanda inteira ficaria com um destino\n // que sumiu da lista e um botão ligado.\n if (t.id === 'table'\n && tables.find((m) => m.id === toTableId)?.occupied) setToTableId('')\n }}\n >\n <span className=\"pos-seg__t\">{t.label}</span>\n <span className=\"pos-seg__h\">{dica}</span>\n </button>\n )\n })}\n </span>\n </div>\n\n {kind === 'guest' && (\n <div className=\"pos-dsc__sec\">\n <span className=\"pos-dsc__lbl\">Participante</span>\n <select\n className=\"pos-dsc__sel\"\n value={guestId}\n onChange={(e) => setGuestId(e.target.value)}\n aria-label=\"Quem se muda\"\n >\n <option value=\"\">Selecione…</option>\n {guests.map((g) => {\n const travado = guestTransferBlocked(g)\n return (\n <option key={g.id} value={g.id} disabled={travado}>\n {g.label}{travado ? ` · ${JA_PAGOU}` : ''}\n </option>\n )\n })}\n </select>\n </div>\n )}\n\n {kind === 'items' && (\n <>\n <div className=\"pos-dsc__sec\">\n <span className=\"pos-dsc__lbl\">Itens</span>\n {porDono.map((g) => (\n <div key={g.guestId ?? SHARED_OWNER} className=\"pos-dsc__grp\">\n <div className=\"pos-dsc__grph\">\n <User size={14} strokeWidth={2.2} aria-hidden />\n <span>{g.guestName}</span>\n </div>\n <ul className=\"pos-dsc__lines\">\n {g.lines.map((l: TicketLine) => (\n <li key={l.id}>\n {/* A linha de OUTRO dono aparece apagada assim que a\n primeira é marcada: a regra do «um participante por\n vez» deixa de ser uma recusa que surge no clique e\n passa a ser visível antes dele. */}\n <label\n className=\"pos-dsc__line\"\n data-off={origem !== undefined && ownerOfLine(l) !== origem ? '' : undefined}\n >\n <input\n type=\"checkbox\"\n checked={picked.has(l.id)}\n onChange={() => {\n // A regra do dono único é aplicada NO CLIQUE, como\n // no V1 — ver `./transferPick.ts`. Deixar marcar e\n // travar no fim fazia o operador descobrir o\n // problema no último passo, sem saber qual item o\n // causou.\n //\n // FORA do atualizador: o React pode reexecutar um\n // atualizador de estado, e ele tem de ser puro.\n // Avisar de dentro dele é pedir que a recusa\n // apareça uma segunda vez, em outro momento.\n const r = pickLineForTransfer(picked, ticket.lines, l.id)\n setRecusa(r.refusal)\n setPicked(r.picked)\n // A origem mudou? O destino escolhido pode ter\n // saído da lista — desmarcar tudo e recomeçar por\n // outra pessoa deixava «Mesa» apontada com a Mesa\n // virando a própria origem.\n const nova = selectionOwner(r.picked, ticket.lines)\n if (nova !== origem) setToGuestId('')\n }}\n />\n <span className=\"pos-dsc__n\">{l.quantity}×</span>\n <span className=\"pos-dsc__name\">{l.name}</span>\n <span className=\"pos-num\">{formatCents(l.unitPriceCents * l.quantity)}</span>\n </label>\n </li>\n ))}\n </ul>\n </div>\n ))}\n </div>\n <div className=\"pos-dsc__sec\">\n <span className=\"pos-dsc__lbl\">Para</span>\n <select\n className=\"pos-dsc__sel\"\n value={toGuestId}\n onChange={(e) => setToGuestId(e.target.value)}\n aria-label=\"Novo dono das linhas\"\n >\n <option value=\"\">Selecione…</option>\n {paraQuem.map((d) => <option key={d.value} value={d.value}>{d.label}</option>)}\n </select>\n </div>\n </>\n )}\n\n {(kind === 'table' || kind === 'guest') && (\n <div className=\"pos-dsc__sec\">\n <span className=\"pos-dsc__lbl\">Mesa de destino</span>\n <select\n className=\"pos-dsc__sel\"\n value={toTableId}\n onChange={(e) => setToTableId(e.target.value)}\n aria-label=\"Mesa de destino\"\n >\n <option value=\"\">Selecione…</option>\n {destinos.map((t) => (\n <option key={t.id} value={t.id}>\n {t.label}{t.occupied ? ' · ocupada' : ''}\n </option>\n ))}\n </select>\n </div>\n )}\n </div>\n\n <div className=\"pos-sheet__foot\">\n <button className=\"pos-btn pos-btn--ghost\" onClick={onCancel}>Voltar</button>\n <button\n className=\"pos-btn\"\n disabled={!!impedimento}\n onClick={() => onConfirm({\n kind,\n toTableId: toTableId || undefined,\n guestId: guestId || undefined,\n // «Mesa» vai como NULO: é o que devolve a linha ao\n // compartilhado no provedor — apaga o vínculo e não cria outro.\n toGuestId: toGuestId === SHARED_OWNER ? null : (toGuestId || undefined),\n lineIds: kind === 'items' ? [...picked] : undefined,\n })}\n >\n Transferir\n </button>\n </div>\n\n {/* A recusa do clique vem PRIMEIRO e com cara de erro: ela explica\n algo que o operador acabou de tentar, e por isso é mais urgente que\n o impedimento, que apenas descreve o que ainda falta. */}\n {(error || recusa || impedimento) && (\n <p className=\"pos-sheet__why\" data-error={error || recusa ? '' : undefined}>\n {error ?? recusa ?? impedimento}\n </p>\n )}\n </div>\n </SheetLayer>\n )\n}\n","// ---------------------------------------------------------------------------\n// Encerrar como cortesia.\n//\n// Portado de `beautyplace/src/components/orders/OrderCourtesyModal.tsx`. É a\n// ação mais curta do `⋯` e a mais cara: ela fecha a comanda e a casa não\n// recebe nada.\n//\n// Por isso o V1 pede o motivo POR EXTENSO — com no mínimo cinco caracteres, e\n// a frase está no código dele: \"Explique o motivo da cortesia com pelo menos 5\n// caracteres.\" Uma cortesia sem explicação é uma venda que sumiu do caixa sem\n// ninguém conseguir dizer por quê, e o valor aparece no fechamento do mês como\n// diferença.\n//\n// O outro limite vem de fora e mora no `actionGate` do app: cortesia existe\n// só em salão e balcão. Retirada e delivery têm jornada própria de pagamento e\n// repasse — ver `allowsCourtesyForChannel`.\n// ---------------------------------------------------------------------------\n\nimport { useState } from 'react'\nimport { Gift, X } from 'lucide-react'\nimport { formatCents } from './money'\nimport { SheetLayer } from './SheetLayer'\n\nexport interface CourtesyIntent {\n reason: string\n}\n\n/** O teto do motivo, como no V1: corta em 500 e mostra o quanto foi usado. */\nconst REASON_MAX = 500\n\nexport function CourtesySheet({ totalCents, authorizers, error, onCancel, onConfirm }: {\n /** O que a casa deixa de receber. Mostrado em cima, não escondido. */\n totalCents: number\n authorizers: Array<{ id: string; name: string }>\n /**\n * A recusa do SERVIDOR — PIN errado, alçada estourada, comanda travada.\n *\n * Vive na folha, e não num aviso atrás dela: a folha cobre a tela, e um\n * recado que aparece por baixo não existe. Foi o que aconteceu ao portar a\n * conferência de PIN — a autorização era recusada corretamente e o operador\n * via a tela parada, sem uma palavra.\n */\n error?: string\n\n onCancel: () => void\n onConfirm: (intent: CourtesyIntent) => void\n}) {\n const [reason, setReason] = useState('')\n\n const impedimento =\n reason.trim().length < 5 ? 'Explique o motivo da cortesia com pelo menos 5 caracteres.'\n : undefined\n\n return (\n <SheetLayer>\n <div className=\"pos-sheet__scrim\" onClick={onCancel} aria-hidden />\n <div className=\"pos-sheet__panel\" role=\"dialog\" aria-label=\"Encerrar como cortesia\" aria-modal>\n <div className=\"pos-sheet__head\">\n <h2 className=\"pos-sheet__title\">\n <Gift size={18} strokeWidth={2.2} aria-hidden /> Encerrar como cortesia\n </h2>\n <button className=\"pos-sheet__x\" onClick={onCancel} aria-label=\"Fechar\"><X size={20} /></button>\n </div>\n\n <div className=\"pos-sheet__body\">\n {/* O QUE VAI ACONTECER, antes do valor — a linha que o V1 escreve no\n subtítulo do diálogo, literal. Ela responde a pergunta que o\n nome «cortesia» deixa em aberto: a comanda não some, ela vai para\n o caixa como registro de auditoria, e ninguém recebe nada. Sem a\n frase, «encerrar como cortesia» parece apagar a conta. */}\n <p className=\"pos-sheet__lead\">\n A comanda será vinculada ao caixa para auditoria, sem gerar\n recebimento em dinheiro, cartão ou PIX.\n </p>\n {/* O valor primeiro. Quem autoriza precisa ver quanto está perdoando\n antes de digitar a senha — não depois. */}\n <div className=\"pos-svc__sum\">\n <div className=\"pos-svc__line pos-svc__line--strong\">\n <span>Valor da cortesia</span>\n <span className=\"pos-num\">{formatCents(totalCents)}</span>\n </div>\n {/* A regra ANTES do campo, como no V1 — e é a linha que ele\n escreve logo abaixo do valor. Ela existe porque a recusa\n correspondente vem do servidor\n (`COURTESY_REQUIRES_UNPAID_ORDER`) e chegaria depois de a\n pessoa ter escolhido o autorizador e digitado o motivo. Dizer\n a condição aqui custa uma linha; descobri-la no fim custa o\n gesto inteiro. */}\n <p className=\"pos-svc__note\">\n Disponível somente antes de registrar qualquer pagamento.\n </p>\n </div>\n\n <div className=\"pos-dsc__sec\">\n <span className=\"pos-dsc__lbl\">Motivo da cortesia</span>\n <textarea\n className=\"pos-dsc__memo\"\n value={reason}\n // O V1 CORTA no 500 em vez de recusar depois:\n // `setReason(event.target.value.slice(0, 500))`. Um `maxLength`\n // sozinho deixaria o colar de um texto longo entrar pela metade\n // sem dizer nada; cortar na origem faz o contador se mexer e a\n // pessoa ver onde bateu o teto.\n onChange={(e) => setReason(e.target.value.slice(0, REASON_MAX))}\n placeholder=\"Ex.: cortesia autorizada para recuperação do atendimento\"\n rows={3}\n aria-label=\"Motivo da cortesia\"\n />\n <p className=\"pos-dsc__count pos-num\">{reason.length}/{REASON_MAX}</p>\n </div>\n </div>\n\n <div className=\"pos-sheet__foot\">\n <button className=\"pos-btn pos-btn--ghost\" onClick={onCancel}>Voltar</button>\n <button\n className=\"pos-btn\"\n disabled={!!impedimento}\n onClick={() => onConfirm({ reason: reason.trim() })}\n >\n Encerrar como cortesia\n </button>\n </div>\n\n {(error || impedimento) && <p className=\"pos-sheet__why\" data-error={error ? '' : undefined}>{error ?? impedimento}</p>}\n </div>\n </SheetLayer>\n )\n}\n","// ---------------------------------------------------------------------------\n// A CAMPAINHA DO SALÃO.\n//\n// O V1 relê a planta quando outro tablet mexe numa mesa\n// (`WaiterTables.tsx`). O V2 não relia: medido com o PDV aberto, 35 segundos\n// sem nenhuma releitura — o segundo garçom só via a mesa que o primeiro abriu\n// se algo o fizesse recarregar, e nada fazia.\n//\n// **Não é `postgres_changes`, e não pode ser.** O Realtime aplica a política de\n// leitura antes de entregar, e a desta base resolve a conta por CABEÇALHO, que\n// o Realtime não manda. Assinar daria `SUBSCRIBED` e zero eventos — a tela\n// pareceria viva. Ver o CHANGELOG do `@fayz-ai/ui` (o vigia de conversas), que\n// já pagou esse preço, e a migration 035 do plugin-tables.\n//\n// Aqui se ouve um BROADCAST num tópico cujo nome carrega a conta. Quem toca é\n// o gatilho da 035; o anúncio é vazio, então ouvir não revela nada.\n// ---------------------------------------------------------------------------\n\nimport { useEffect, useRef } from 'react'\n\n/** O nome do tópico. O uuid da conta é o que separa uma casa da outra. */\nexport function floorTopic(tenantId: string): string {\n return `salao:${tenantId}`\n}\n\ntype ClienteRealtime = {\n channel: (nome: string) => {\n on: (tipo: string, filtro: { event: string }, cb: () => void) => any\n subscribe: () => any\n }\n removeChannel: (canal: unknown) => void\n}\n\n/**\n * Relê a planta quando outro tablet mexe no salão.\n *\n * Silencioso por construção: sem cliente ou sem conta, não assina e não\n * reclama — o PDV continua funcionando como hoje, só sem a atualização\n * automática. É o mesmo grau de degradação da contagem de contas abertas.\n */\nexport function useFloorBell(\n client: ClienteRealtime | null | undefined,\n tenantId: string | null | undefined,\n onRing: () => void,\n): void {\n // O `onRing` costuma ser recriado a cada render; guardá-lo numa caixa evita\n // derrubar e refazer a assinatura a cada tecla digitada na busca.\n const ring = useRef(onRing)\n useEffect(() => { ring.current = onRing }, [onRing])\n\n useEffect(() => {\n if (!client || !tenantId) return\n let canal: unknown\n try {\n canal = client.channel(floorTopic(tenantId))\n .on('broadcast', { event: 'salao' }, () => ring.current())\n .subscribe()\n } catch {\n return\n }\n return () => {\n try { client.removeChannel(canal) } catch { /* o canal já foi */ }\n }\n }, [client, tenantId])\n}\n","// ---------------------------------------------------------------------------\n// O espelho da conta, na bobina de 80 mm.\n//\n// Portado de `beautyplace/src/lib/tableBillPrint.ts`. É o papel que vai para a\n// mesa quando o cliente pede a conta, e por isso ele NÃO é um resumo: é um\n// espelho. Três decisões do V1 que uma \"impressão bonita\" perderia:\n//\n// 1. **O item cancelado APARECE, riscado**, com quem autorizou e por quê. A\n// pergunta que chega na mesa é \"por que isso saiu da conta?\", e quem\n// responde é o papel — não o gerente, de memória.\n// 2. **Agrupado por participante**, na ordem em que as pessoas sentaram, com\n// o compartilhado primeiro. É assim que a mesa confere: cada um procura o\n// próprio nome.\n// 3. **A taxa é calculada por pessoa sobre a base elegível.** O mesmo cálculo\n// da tela, escrito uma vez — um papel que diverge da tela vira discussão\n// no caixa, e o papel sempre perde.\n//\n// E uma que é segurança, não estética: **tudo que vem do cadastro é escapado**.\n// Nome de produto, observação, participante e unidade são digitados por gente,\n// e a impressão os escreve numa janela nova — sem escape, um nome de produto\n// com `<script>` executa no PDV.\n// ---------------------------------------------------------------------------\n\nimport { formatCents } from './money'\nimport type { Ticket, TicketGuest, TicketLine } from './session'\n\nexport interface BillCancellation {\n name: string\n quantity: number\n totalCents: number\n authorizerName?: string\n guestName?: string | null\n memo?: string | null\n}\n\nexport interface BillCover {\n name: string\n guestCount: number\n totalCents: number\n discountCents?: number\n}\n\nexport interface BillPrintParams {\n unitName: string\n /** \"ESPELHO DA MESA\" no salão; \"ESPELHO DA COMANDA\" fora dele. */\n title: string\n positionLabel: string\n /** Como se chama o que a mesa dividiu: \"Mesa\", \"Balcão\", \"Pedido\". */\n sharedLabel: string\n reference: string\n printedAt?: Date\n lines: TicketLine[]\n party: TicketGuest[]\n cancellations?: BillCancellation[]\n covers?: BillCover[]\n serviceChargePercent: number\n paidCents?: number\n balanceCents?: number | null\n /** O rodapé do papel. A casa assina o que entrega. */\n footer?: string\n}\n\nexport interface BillTotals {\n itemsCents: number\n discountCents: number\n coverCents: number\n coverDiscountCents: number\n serviceCents: number\n totalCents: number\n paidCents: number\n balanceCents: number\n}\n\n/**\n * A conta do papel.\n *\n * A taxa sai POR PARTICIPANTE — cada um sobre a sua base elegível, com o\n * percentual dele quando tem um. Somar tudo e aplicar uma taxa só dá outro\n * número sempre que alguém tem isenção ou percentual próprio, e a diferença\n * aparece no papel que o cliente está segurando.\n */\nexport function calculateBillTotals(p: BillPrintParams): BillTotals {\n const percentOf = new Map(p.party.map((g) => [g.id, g.serviceChargePercent] as const))\n let itemsCents = 0\n let discountCents = 0\n const elegivelPor = new Map<string | null, number>()\n\n for (const l of p.lines) {\n const bruto = l.unitPriceCents * l.quantity\n const desconto = Math.max(0, l.discountCents ?? 0)\n itemsCents += bruto\n discountCents += desconto\n if (l.exemptFromService) continue\n const dono = l.guestId ?? null\n elegivelPor.set(dono, (elegivelPor.get(dono) ?? 0) + Math.max(0, bruto - desconto))\n }\n\n let serviceCents = 0\n for (const [dono, elegivel] of elegivelPor) {\n const proprio = dono == null ? null : percentOf.get(dono)\n const percent = proprio != null ? proprio : p.serviceChargePercent\n serviceCents += Math.round((elegivel * percent) / 100)\n }\n\n const coverCents = (p.covers ?? []).reduce((s, c) => s + c.totalCents, 0)\n const coverDiscountCents = (p.covers ?? []).reduce((s, c) => s + Math.max(0, c.discountCents ?? 0), 0)\n const totalCents = itemsCents - discountCents + coverCents - coverDiscountCents + serviceCents\n const paidCents = Math.max(0, p.paidCents ?? 0)\n const balanceCents = p.balanceCents == null\n ? Math.max(0, totalCents - paidCents)\n : Math.max(0, p.balanceCents)\n\n return { itemsCents, discountCents, coverCents, coverDiscountCents, serviceCents, totalCents, paidCents, balanceCents }\n}\n\n/** Nada vindo do cadastro entra cru no documento. */\nconst esc = (v: string | number | null | undefined) => String(v ?? '')\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&#039;')\n\nconst money = (cents: number) => (cents < 0 ? `-${formatCents(Math.abs(cents))}` : formatCents(cents))\n\nfunction linhasDe(lines: TicketLine[]): string {\n if (lines.length === 0) return '<div class=\"empty\">Nenhum item registrado</div>'\n return lines.map((l) => {\n const desconto = Math.max(0, l.discountCents ?? 0)\n const obs = l.note?.trim()\n ? `<div class=\"notes\">Obs.: ${esc(l.note.trim())}</div>` : ''\n const desc = desconto > 0\n ? `<div class=\"subvalue\">Desconto: ${money(-desconto)}</div>` : ''\n return `<div class=\"item-row\">\n <span>${esc(l.quantity)}x ${esc(l.name)}</span>\n <strong>${money(l.unitPriceCents * l.quantity)}</strong>\n </div>${escolhas(l)}${obs}${desc}`\n }).join('')\n}\n\n/**\n * Os blocos por pessoa.\n *\n * O compartilhado primeiro, depois cada participante na ordem em que sentou —\n * e no fim as linhas de quem saiu da comanda. Essas últimas existem porque um\n * participante removido no meio do serviço deixa as linhas dele para trás, e\n * item pago que não aparece no papel é o cliente conferindo uma conta menor\n * do que a que vai pagar.\n */\n/**\n * O QUE FOI ESCOLHIDO em cima do item — e por que o preço não é o do cardápio.\n *\n * `basePriceCents` existe no `TicketLine` com esta finalidade escrita ao lado\n * dele: *\"kept so the bill can show the breakdown\"*. Nada lia. O papel\n * imprimia «1x X-Burguer R$ 45,00» onde o cardápio na parede diz R$ 38,00, e a\n * única resposta possível à pergunta do cliente era o garçom lembrar.\n *\n * As opções sem acréscimo entram TAMBÉM, e sem valor: «sem cebola» não muda a\n * conta e é metade do motivo de o prato estar certo. O papel é o comprovante\n * do que foi pedido, não só do que foi cobrado.\n *\n * A base só aparece quando há acréscimo — repetir «R$ 38,00» embaixo de «R$\n * 38,00» só gasta bobina.\n */\nfunction escolhas(l: TicketLine): string {\n const mods = l.modifiers ?? []\n if (mods.length === 0) return ''\n const base = l.basePriceCents\n const acrescimo = mods.reduce((s, m) => s + m.priceDeltaCents, 0)\n const linhaBase = base != null && acrescimo !== 0\n ? `<div class=\"mod\"><span>Item</span><span>${money(base * l.quantity)}</span></div>`\n : ''\n return `<div class=\"mods\">${linhaBase}${mods.map((m) => `<div class=\"mod\">\n <span>+ ${esc(m.label)}</span>\n <span>${m.priceDeltaCents !== 0 ? money(m.priceDeltaCents * l.quantity) : ''}</span>\n </div>`).join('')}</div>`\n}\n\nfunction blocos(p: BillPrintParams): string {\n const nomeDe = new Map(p.party.map((g) => [g.id, g.name] as const))\n const grupos = new Map<string, TicketLine[]>()\n for (const l of p.lines) {\n const chave = l.guestId ?? '__shared__'\n grupos.set(chave, [...(grupos.get(chave) ?? []), l])\n }\n\n const orfaos = [...grupos.keys()].filter((k) => k !== '__shared__' && !nomeDe.has(k))\n const ordem = [\n ...(grupos.has('__shared__') ? ['__shared__'] : []),\n ...p.party.map((g) => g.id).filter((id) => grupos.has(id)),\n ...orfaos,\n ]\n if (ordem.length === 0) return linhasDe([])\n\n // DOIS sem nome não podem virar o MESMO cabeçalho.\n //\n // O V1 desempata com o id (`Participante 7`), porque lá ele é um inteiro\n // curto. Aqui a chave é um uuid, que no papel não diz nada a ninguém — então\n // o desempate é a ORDEM, que cumpre a mesma função: separar os blocos para\n // quem confere a conta na mesa. Sem isto, duas pessoas sem nome recebem\n // «PARTICIPANTE» duas vezes e ninguém sabe de quem é o quê.\n const numeroDoOrfao = new Map(orfaos.map((k, i) => [k, i + 1] as const))\n\n return ordem.map((chave) => {\n const rotulo = chave === '__shared__'\n ? p.sharedLabel\n : (nomeDe.get(chave) ?? (orfaos.length > 1\n ? `Participante ${numeroDoOrfao.get(chave)}`\n : 'Participante'))\n return `<section>\n <div class=\"section-title\">${esc((rotulo || p.sharedLabel).toUpperCase())}</div>\n ${linhasDe(grupos.get(chave) ?? [])}\n </section>`\n }).join('')\n}\n\nfunction cancelados(items: BillCancellation[]): string {\n if (items.length === 0) return ''\n const qtd = items.reduce((s, i) => s + i.quantity, 0)\n return `<section class=\"cancelled\">\n <div class=\"section-title\">ITENS CANCELADOS <span>${esc(qtd)}</span></div>\n ${items.map((i) => `<div class=\"cancelled-row\">\n <div class=\"item-row\"><span>${esc(i.quantity)}x ${esc(i.name)}</span><strong>${money(i.totalCents)}</strong></div>\n ${i.guestName ? `<div class=\"notes\">Participante: ${esc(i.guestName)}</div>` : ''}\n <div class=\"notes\">Responsável: ${esc(i.authorizerName || '-')}</div>\n ${i.memo?.trim() ? `<div class=\"notes\">Motivo: ${esc(i.memo.trim())}</div>` : ''}\n </div>`).join('')}\n </section>`\n}\n\nconst resumo = (label: string, cents: number, cls = '') =>\n `<div class=\"summary-row ${cls}\"><span>${esc(label)}</span><strong>${money(cents)}</strong></div>`\n\n/** Monta o documento sem tocar em `window` — é o que torna isto testável. */\nexport function buildBillHtml(p: BillPrintParams): string {\n const t = calculateBillTotals(p)\n const quando = new Intl.DateTimeFormat('pt-BR', {\n day: '2-digit', month: '2-digit', year: 'numeric', hour: '2-digit', minute: '2-digit',\n }).format(p.printedAt ?? new Date())\n\n const couvert = (p.covers ?? []).length > 0\n ? `<section><div class=\"section-title\">COUVERT</div>${(p.covers ?? []).map((c) => {\n const d = Math.max(0, c.discountCents ?? 0)\n return `<div class=\"item-row\"><span>${esc(c.guestCount)}x ${esc(c.name)}</span><strong>${money(c.totalCents)}</strong></div>\n ${d > 0 ? `<div class=\"subvalue\">Desconto: ${money(-d)}</div>` : ''}`\n }).join('')}</section>`\n : ''\n\n // Cada linha só entra quando tem o que dizer: um \"Desconto R$ 0,00\" no papel\n // faz o cliente procurar um desconto que não existe.\n const sumario = [\n resumo('Subtotal', t.itemsCents),\n t.discountCents > 0 ? resumo('Desconto', -t.discountCents) : '',\n t.coverCents > 0 ? resumo('Couvert', t.coverCents) : '',\n t.coverDiscountCents > 0 ? resumo('Desconto couvert', -t.coverDiscountCents) : '',\n t.serviceCents > 0 ? resumo('Taxa de serviço', t.serviceCents) : '',\n resumo('TOTAL', t.totalCents, 'total'),\n t.paidCents > 0 ? resumo('Já pago', t.paidCents) : '',\n t.paidCents > 0 || p.balanceCents != null ? resumo('SALDO', t.balanceCents, 'balance') : '',\n ].join('')\n\n return `<!doctype html>\n<html lang=\"pt-BR\">\n<head>\n <meta charset=\"utf-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n <title>Conta - ${esc(p.positionLabel)}</title>\n <style>\n @page { size: 80mm auto; margin: 0; }\n * { box-sizing: border-box; }\n html, body { margin: 0; padding: 0; background: #fff; color: #000; }\n body { width: 76mm; padding: 4mm; font: 12px/1.32 'Courier New', monospace; }\n h1 { margin: 0; text-align: center; font-size: 16px; line-height: 1.2; text-transform: uppercase; }\n h2 { margin: 3px 0 0; text-align: center; font-size: 13px; letter-spacing: .6px; }\n .meta { margin-top: 2px; text-align: center; font-size: 10px; }\n .table-title { margin: 10px 0 6px; border: 1.5pt solid #000; padding: 4px; text-align: center; font-size: 14px; font-weight: 700; text-transform: uppercase; }\n section { margin-top: 8px; }\n .section-title { display: flex; justify-content: space-between; border: 1pt solid #000; border-left-width: 4mm; padding: 3px 4px; font-weight: 700; text-transform: uppercase; }\n .item-row, .summary-row { display: flex; align-items: flex-start; justify-content: space-between; gap: 8px; padding-top: 4px; }\n .item-row span, .summary-row span { min-width: 0; overflow-wrap: anywhere; }\n .item-row strong, .summary-row strong { flex: 0 0 auto; white-space: nowrap; }\n .mods { padding: 1px 0 0 9px; font-size: 10px; }\n .mod { display: flex; justify-content: space-between; gap: 8px; }\n .mod span:last-child { flex: 0 0 auto; white-space: nowrap; }\n .notes { padding: 1px 0 0 9px; font-size: 10px; white-space: pre-wrap; overflow-wrap: anywhere; }\n .subvalue { padding-top: 1px; text-align: right; font-size: 10px; }\n .cancelled-row { padding-bottom: 3px; text-decoration-thickness: 1px; }\n .cancelled-row .item-row { text-decoration: line-through; }\n .empty { padding: 6px 0; text-align: center; }\n .summary { margin-top: 9px; border-top: 1px dashed #000; padding-top: 4px; }\n .summary-row.total { margin-top: 4px; border: 1.5pt solid #000; padding: 5px 4px; font-size: 15px; }\n .summary-row.balance { font-size: 13px; }\n footer { margin-top: 12px; text-align: center; font-size: 10px; }\n @media screen {\n body { margin: 0 auto; box-shadow: 0 0 16px rgba(0, 0, 0, .18); min-height: 100vh; }\n .section-title { background: #000; color: #fff; }\n }\n @media print { body { width: 76mm; } }\n </style>\n</head>\n<body>\n <h1>${esc(p.unitName)}</h1>\n <h2>${esc(p.title)}</h2>\n <div class=\"meta\">PEDIDO #${esc(p.reference)}</div>\n <div class=\"meta\">${esc(quando)}</div>\n <div class=\"table-title\">${esc(p.positionLabel)}</div>\n ${blocos(p)}\n ${couvert}\n ${cancelados(p.cancellations ?? [])}\n <div class=\"summary\">${sumario}</div>\n <footer>${esc(p.footer ?? 'Obrigado pela preferência!')}</footer>\n</body>\n</html>`\n}\n\n/**\n * Abre a janela e chama o diálogo do navegador.\n *\n * Devolve `false` quando o pop-up foi bloqueado — e esse `false` importa: sem\n * ele o operador aperta \"Imprimir\", não acontece nada, e ele aperta de novo.\n * Quem chama tem de dizer o que fazer (\"Permita pop-ups…\").\n */\nexport function printBill(p: BillPrintParams): boolean {\n const win = window.open('', '_blank', 'width=480,height=720')\n // `null` é o bloqueio clássico. Mas nem todo bloqueio devolve `null`: há\n // ambiente que devolve uma janela cujo `document` não é utilizável, e aí\n // qualquer chamada nele estoura. Como `printBill` responde `false` para\n // «não consegui abrir» — e quem chama já tem a frase certa para isso —, o\n // tropeço tem de virar `false`, não uma exceção crua na cara do operador.\n if (!win) return false\n try {\n // Sem `document.open()`: o V1 não chama, e era ELE que estourava aqui\n // («win.document.open is not a function»). Um `about:blank` recém-aberto\n // já está aberto para escrita — `write` basta.\n if (win.closed) return false\n // A janela da conta não precisa de alça para o PDV.\n win.opener = null\n win.document.write(buildBillHtml(p))\n win.document.close()\n } catch {\n try { win.close() } catch { /* já fechada */ }\n return false\n }\n\n // A janela se fecha sozinha depois de imprimir.\n //\n // O operador está com o cliente na frente: deixar o espelho aberto obriga a\n // um toque a mais em cada conta, e numa noite cheia sobram dez janelas de\n // conta abertas por cima do PDV. `afterprint` dispara tanto ao imprimir\n // quanto ao cancelar o diálogo, que é o certo — cancelar também significa\n // \"terminei aqui\".\n const fechar = () => { try { win.close() } catch { /* já fechada */ } }\n win.addEventListener('afterprint', fechar, { once: true })\n\n const abrir = () => {\n win.focus()\n win.print()\n // Rede de segurança: alguns navegadores não emitem `afterprint`. Sem ela,\n // a janela ficaria aberta justamente onde o evento falta.\n win.setTimeout(fechar, 1000)\n }\n if (win.document.readyState === 'complete') window.setTimeout(abrir, 50)\n else win.addEventListener('load', abrir, { once: true })\n return true\n}\n\n/** O título do papel segue o que a comanda É. */\nexport const billTitleFor = (kind?: Ticket['positionId'] | string): string =>\n kind === 'table' ? 'ESPELHO DA MESA' : 'ESPELHO DA COMANDA'\n","// ---------------------------------------------------------------------------\n// Conferir que a taxa GRAVADA é a que foi pedida.\n//\n// Irmã de `assertCancellation`, e pelo mesmo motivo: o V1 não fecha o diálogo\n// sem olhar a resposta do servidor — *\"Resposta inválida ao salvar a taxa de\n// serviço.\"* é a frase dele quando `service_charge_percent` e\n// `service_charge_amount` não voltam como números.\n//\n// O V2 precisa de mais que a checagem de tipo do V1, porque a escrita dele é\n// PARTIDA: primeiro a taxa da comanda, depois uma chamada por participante com\n// override. Se a terceira falhar, a comanda já está em 13% com dois\n// participantes no valor novo e o resto no velho — e ninguém é avisado. Uma\n// taxa meio aplicada não é um estado que alguém escolheu; é um estado que\n// sobrou.\n//\n// Por isso aqui se confere VALOR, não só forma: o que o banco devolveu tem de\n// ser o que a tela pediu, comanda e participantes.\n// ---------------------------------------------------------------------------\n\n/** A frase do V1, palavra por palavra. */\nexport const SERVICE_CHARGE_BAD_ANSWER = 'Resposta inválida ao salvar a taxa de serviço.'\n\nexport interface ServiceChargeAsked {\n /** A taxa da comanda. */\n percent: number\n /** Quem tem taxa própria. `null` = volta a herdar a da comanda. */\n overrides: Array<{ guestId: string; percent: number | null }>\n}\n\nexport interface ServiceChargeConfirmed {\n /** O que a comanda diz agora. `null` = herda a da casa. */\n percent: number | null\n /** O que cada participante diz agora. */\n guests: Array<{ id: string; percent: number | null }>\n}\n\n/** Duas taxas são a mesma quando valem o mesmo — `null` e 0 NÃO valem o mesmo:\n * «herda a da casa» e «não cobra» são decisões diferentes. */\nfunction mesma(a: number | null | undefined, b: number | null | undefined): boolean {\n if (a == null || b == null) return a == null && b == null\n // Milésimo de ponto percentual: a coluna é `numeric(6,3)`.\n return Math.abs(a - b) < 0.0005\n}\n\n/**\n * Lança quando o banco não confirma o que a tela pediu.\n *\n * Só olha os participantes que foram PEDIDOS: quem não entrou no gesto não é\n * assunto desta conferência, e exigir a lista inteira faria a checagem falhar\n * quando outra pessoa mexesse na mesa ao mesmo tempo.\n */\nexport function assertServiceCharge(\n asked: ServiceChargeAsked,\n got: ServiceChargeConfirmed | null | undefined,\n): void {\n if (!got || typeof got !== 'object') throw new Error(SERVICE_CHARGE_BAD_ANSWER)\n if (!mesma(got.percent, asked.percent)) throw new Error(SERVICE_CHARGE_BAD_ANSWER)\n\n const porId = new Map((got.guests ?? []).map((g) => [g.id, g.percent]))\n for (const o of asked.overrides) {\n if (!porId.has(o.guestId)) throw new Error(SERVICE_CHARGE_BAD_ANSWER)\n if (!mesma(porId.get(o.guestId), o.percent)) throw new Error(SERVICE_CHARGE_BAD_ANSWER)\n }\n}\n","// ---------------------------------------------------------------------------\n// «Escala de hoje»: quem atende cada praça AGORA.\n//\n// Portado de `beautyplace/src/components/salao/escala/EscalaPanel.tsx`.\n// Responde a pergunta que o gerente faz dez vezes por serviço — \"de quem é\n// aquela mesa?\" — e que hoje se responde gritando pelo salão.\n//\n// Duas coisas que o V1 sabe e uma lista de nomes não saberia:\n//\n// 1. **O alvo se escolhe NA PLANTA, não numa lista.** Com o painel aberto, a\n// grade de mesas vira um seletor: tocar a praça ou a mesa é mais direto do\n// que procurar um nome entre duzentos. Por isso o campo \"Onde\" é um espaço\n// à espera, com a frase \"Toque numa praça ou numa mesa da planta\".\n// 2. **O vazio explica a CONSEQUÊNCIA**, não o estado: \"Ninguém escalado\n// agora. Sem escala, cada garçom vê todas as mesas.\" Quem lê isso entende\n// por que deveria escalar, o que \"0 escalas\" nunca diria.\n//\n// E o rodapé é a regra mais fácil de errar: **o dia da casa não vira à\n// meia-noite.** A frase fica onde a palavra \"fim do dia\" aparece, porque é ali\n// que a dúvida nasce.\n// ---------------------------------------------------------------------------\n\nimport { useMemo, useState } from 'react'\nimport { CalendarClock, Clock, MapPin, Plus, UserMinus, UtensilsCrossed, X } from 'lucide-react'\nimport {\n canSaveDayCut, describeValidity, groupByTarget, roleLabel, shortTime,\n type ShiftAssignment, type ShiftRole,\n} from './shift'\n\nexport interface ShiftTargetPick {\n kind: 'area' | 'table'\n id: string\n label: string\n}\n\nexport interface ShiftPerson {\n id: string\n name: string\n}\n\n/**\n * A escala NA COLUNA da direita, e não numa folha por cima.\n *\n * Em modal ela cobria a planta — e a planta é de onde se escolhe o alvo. O\n * gesto do V1 é \"toque a praça, escolha quem atende\", e um diálogo no meio\n * obriga a fechar, olhar, reabrir. Na coluna os dois convivem: a mesa fica\n * visível enquanto se escala alguém para ela.\n */\nexport function ShiftPanel({\n assignments, people, areas, target, cutoff, loading, error, saving,\n onPickCleared, onAssign, onUnassign, onRetry, onClose, onSaveDayCut,\n}: {\n assignments: ShiftAssignment[]\n people: ShiftPerson[]\n /** Quantas praças a unidade tem — muda a frase do vazio. */\n areas: number\n /** O que o gerente tocou na planta enquanto o painel está aberto. */\n target: ShiftTargetPick | null\n cutoff?: string | null\n loading?: boolean\n error?: string\n saving?: boolean\n /**\n * Gravar o corte do dia. Ausente = o rodapé só informa, sem «mudar» — um app\n * que não deixa mudar não deve oferecer o link.\n */\n onSaveDayCut?: (hhmm: string) => void | Promise<void>\n onPickCleared: () => void\n onAssign: (input: { personId: string; role: ShiftRole; untilEndOfDay: boolean }) => void\n onUnassign: (id: string) => void\n onRetry?: () => void\n onClose: () => void\n}) {\n const [personId, setPersonId] = useState('')\n const [role, setRole] = useState<ShiftRole>('waiter')\n const [untilEndOfDay, setUntilEndOfDay] = useState(true)\n const grupos = useMemo(() => groupByTarget(assignments), [assignments])\n const hora = shortTime(cutoff)\n const [editandoCorte, setEditandoCorte] = useState(false)\n const [corte, setCorte] = useState(hora)\n\n return (\n <div className=\"pos-shift\" role=\"region\" aria-label=\"Escala de hoje\">\n <div className=\"pos-sheet__head\">\n <h2 className=\"pos-sheet__title\">\n <CalendarClock size={18} strokeWidth={2.2} aria-hidden /> Escala de hoje\n </h2>\n <button className=\"pos-sheet__x\" onClick={onClose} aria-label=\"Fechar\"><X size={20} /></button>\n </div>\n\n <p className=\"pos-shift__sub\">\n Quem atende cada praça agora. Vale na hora, em todos os aparelhos.\n </p>\n\n <div className=\"pos-sheet__body\">\n {/* ── Escalar alguém ─────────────────────────────────────────── */}\n <div className=\"pos-shift__form\">\n <div className=\"pos-dsc__sec\">\n <span className=\"pos-dsc__lbl\">\n Onde\n {target && (\n <button className=\"pos-shift__swap\" onClick={onPickCleared}>trocar</button>\n )}\n </span>\n {target ? (\n <p className=\"pos-shift__target\">\n {target.kind === 'area'\n ? <MapPin size={14} strokeWidth={2.4} aria-hidden />\n : <UtensilsCrossed size={14} strokeWidth={2.4} aria-hidden />}\n {target.label}\n </p>\n ) : (\n <p className=\"pos-shift__await\">\n {areas === 0\n ? 'Nenhuma praça desenhada nesta unidade. Desenhe uma em Configurações → Salão, ou escolha uma mesa na planta.'\n : 'Toque numa praça ou numa mesa da planta para escolher.'}\n </p>\n )}\n </div>\n\n <div className=\"pos-dsc__sec\">\n <span className=\"pos-dsc__lbl\">Quem</span>\n <select\n className=\"pos-dsc__sel\"\n value={personId}\n onChange={(e) => setPersonId(e.target.value)}\n disabled={!target || people.length === 0}\n aria-label=\"Quem vai atender\"\n >\n <option value=\"\">\n {people.length ? 'Escolher…' : 'Ninguém cadastrado nesta unidade'}\n </option>\n {people.map((p) => <option key={p.id} value={p.id}>{p.name}</option>)}\n </select>\n </div>\n\n <div className=\"pos-shift__pair\">\n <div className=\"pos-dsc__sec\">\n <span className=\"pos-dsc__lbl\">Papel</span>\n <select\n className=\"pos-dsc__sel\"\n value={role}\n onChange={(e) => setRole(e.target.value as ShiftRole)}\n aria-label=\"Papel\"\n >\n <option value=\"waiter\">Garçom</option>\n <option value=\"busser\">Cumim</option>\n </select>\n </div>\n <div className=\"pos-dsc__sec\">\n <span className=\"pos-dsc__lbl\">Até quando</span>\n <select\n className=\"pos-dsc__sel\"\n value={untilEndOfDay ? 'dia' : 'sempre'}\n onChange={(e) => setUntilEndOfDay(e.target.value === 'dia')}\n aria-label=\"Até quando\"\n >\n <option value=\"dia\">Fim do dia ({hora})</option>\n <option value=\"sempre\">Permanente</option>\n </select>\n </div>\n </div>\n\n <button\n className=\"pos-btn pos-shift__go\"\n disabled={!target || !personId || !!saving}\n onClick={() => { onAssign({ personId, role, untilEndOfDay }); setPersonId('') }}\n >\n <Plus size={16} strokeWidth={2.4} aria-hidden /> Escalar\n </button>\n </div>\n\n {/* ── Quem está escalado ─────────────────────────────────────── */}\n {loading ? (\n <p className=\"pos-empty__h\">Carregando…</p>\n ) : error ? (\n <div className=\"pos-shift__err\">\n <p className=\"pos-empty__t\">Não foi possível ler a escala.</p>\n <p className=\"pos-empty__h\">{error}</p>\n {onRetry && (\n <button className=\"pos-btn pos-btn--ghost\" onClick={onRetry}>Tentar de novo</button>\n )}\n </div>\n ) : grupos.length === 0 ? (\n // O vazio explica a CONSEQUÊNCIA, não o estado.\n <p className=\"pos-empty__h\">\n Ninguém escalado agora. Sem escala, cada garçom vê todas as mesas.\n </p>\n ) : (\n <div className=\"pos-shift__list\">\n {grupos.map((g) => (\n <div className=\"pos-shift__group\" key={g.key}>\n <p className=\"pos-shift__gname\">\n {g.kind === 'area'\n ? <span className=\"pos-shift__dot\" style={{ background: g.color ?? 'var(--pos-primary)' }} aria-hidden />\n : <UtensilsCrossed size={13} strokeWidth={2.4} aria-hidden />}\n {g.label}\n </p>\n <ul className=\"pos-shift__rows\">\n {g.rows.map((l) => (\n <li className=\"pos-shift__row\" key={l.id}>\n <span className=\"pos-shift__who\">\n <span className=\"pos-shift__name\">{l.personName ?? 'Sem nome'}</span>\n <span className=\"pos-shift__when\">{describeValidity(l)}</span>\n </span>\n <span className=\"pos-shift__act\">\n <span className=\"pos-shift__role\">{roleLabel(l.role)}</span>\n <button\n className=\"pos-shift__out\"\n aria-label={`Tirar ${l.personName ?? 'esta pessoa'} da escala`}\n disabled={!!saving}\n onClick={() => onUnassign(l.id)}\n >\n <UserMinus size={14} strokeWidth={2.4} aria-hidden />\n </button>\n </span>\n </li>\n ))}\n </ul>\n </div>\n ))}\n </div>\n )}\n </div>\n\n {/* O corte do dia, onde a palavra \"fim do dia\" aparece — e onde se MUDA.\n Antes era só a frase: o gerente lia que o dia vira às 06:00 e não tinha\n como dizer que na casa dele vira às 05:00. O V1 põe o «mudar» aqui, no\n mesmo lugar em que a regra é lida, e não numa tela de configuração. */}\n <div className=\"pos-shift__foot\">\n <Clock size={13} strokeWidth={2.4} aria-hidden />\n {editandoCorte ? (\n <>\n <span className=\"pos-dsc__lbl\">O dia vira às</span>\n <input\n className=\"pos-shift__cut\"\n type=\"time\"\n value={corte}\n onChange={(e) => setCorte(e.target.value)}\n aria-label=\"O dia vira às\"\n />\n <button\n className=\"pos-btn pos-btn--sm\"\n /* Apagado até `HH:MM` inteiro: corte meio digitado gravaria uma\n hora que ninguém quis. */\n disabled={!canSaveDayCut(corte) || !!saving}\n onClick={() => {\n void Promise.resolve(onSaveDayCut?.(corte)).then(() => setEditandoCorte(false))\n }}\n >\n Salvar\n </button>\n <button\n className=\"pos-btn pos-btn--ghost pos-btn--sm\"\n onClick={() => { setCorte(hora); setEditandoCorte(false) }}\n >\n Cancelar\n </button>\n </>\n ) : (\n <>\n O dia desta unidade vira às {hora}: a madrugada ainda é o turno de ontem.\n {onSaveDayCut && (\n <button\n type=\"button\"\n className=\"pos-shift__mudar\"\n onClick={() => { setCorte(hora); setEditandoCorte(true) }}\n >\n mudar\n </button>\n )}\n </>\n )}\n </div>\n </div>\n )\n}\n","// ---------------------------------------------------------------------------\n// «Precisa de autorização» — UMA folha para as quatro exceções.\n//\n// Antes cada diálogo pedia autorizador e PIN no meio dos próprios campos, e o\n// gerente chamado à mesa chegava numa tela já preenchida por outra pessoa: ele\n// digitava seis dígitos sem saber o que estava aprovando. Autorizar sem ler é\n// o mesmo que não autorizar — e o nome dele é o que fica no registro.\n//\n// Agora o garçom MONTA a operação e confirma; só então esta folha sobe, com o\n// que vai acontecer escrito em uma linha (\"Taxa de serviço de 10% para 13%\"),\n// e o gerente lê antes de liberar.\n//\n// A mudança é de ordem, não de regra: o PIN continua sendo conferido no\n// servidor, e continua sendo o id de quem autorizou que vai para o registro.\n// ---------------------------------------------------------------------------\n\nimport { useEffect, useState } from 'react'\nimport { Delete, ShieldCheck, X } from 'lucide-react'\nimport { SheetLayer } from './SheetLayer'\nimport { authorizeSubtitle } from './sheetSubtitle'\n\nexport interface AuthorizeLine {\n label: string\n /** O valor em destaque — \"de 10% para 13%\", \"R$ 24,00\", \"2 itens\". */\n value?: string\n /** Vermelho: o que sai da conta ou do caixa. */\n danger?: boolean\n}\n\nexport interface AuthorizeRequest {\n /** O título da operação: \"Desconto\", \"Taxa de serviço\", \"Cancelamento\". */\n action: string\n /** O que vai acontecer, em uma ou duas linhas que o gerente LÊ. */\n lines: AuthorizeLine[]\n}\n\nexport function AuthorizeSheet({\n request, actionId, subjectId, authorizers, error, busy, touchKeypad = false, presetAuthorizerId,\n onCancel, onConfirm, pinRejected,\n}: {\n request: AuthorizeRequest\n /** Qual PERMISSÃO gateia esta autorização — decide quem aparece na lista. */\n actionId?: string\n /**\n * O que está sendo autorizado — decide a FRASE, e só ela.\n *\n * Nasceu separado do `actionId` porque a transferência não tem permissão\n * própria: `plg_tables_authorizers` só tem `allows_cancel`, `allows_discount`,\n * `allows_courtesy` e `allows_service_charge`, então ela é gateada por\n * `cancel` — e o subtítulo saía «Autorize o CANCELAMENTO com senha» para\n * quem ia assinar uma transferência.\n *\n * Numa folha de assinatura, a palavra errada é o defeito mais caro que\n * existe: quem autoriza responde pelo que a frase diz. Omitido, segue o\n * `actionId`, que é o certo nas outras quatro.\n */\n subjectId?: string\n authorizers: Array<{ id: string; name: string }>\n /**\n * Quem a tela anterior JÁ escolheu.\n *\n * O desconto pergunta o autorizador dentro da própria folha, porque o teto\n * dele limita o valor e isso precisa ser sabido enquanto se digita. Sem\n * esta prop o operador escolhia a pessoa ali e escolhia de novo aqui — duas\n * perguntas para uma decisão, e a segunda podia contradizer a primeira,\n * liberando um valor acima do teto que a primeira tinha conferido.\n */\n presetAuthorizerId?: string\n error?: string\n busy?: boolean\n /**\n * Desenhar o teclado numérico na tela.\n *\n * `false` por padrão: o aparelho já tem teclado, e `inputMode=\"numeric\"`\n * levanta o numérico no celular. Só num terminal de balcão sem teclado\n * físico o teclado da tela paga o espaço que ocupa — e esse modo ainda\n * precisa existir como configuração da casa.\n */\n touchKeypad?: boolean\n onCancel: () => void\n onConfirm: (authorizerId: string, pin: string) => void\n /**\n * A senha foi RECUSADA (e não outra coisa que deu errado).\n *\n * Quando vira `true`, o campo se limpa. Regra do V1, que faz\n * `setPin('')` em `SUPERVISOR_INVALID`: seis pontinhos cheios depois de uma\n * recusa deixam o botão habilitado sobre a senha ERRADA, e o operador\n * reenvia a mesma — cada tentativa aproxima o bloqueio do autorizador.\n *\n * Só a senha errada. Rate limit e senha não definida NÃO limpam: ali o\n * problema não é o que foi digitado, e apagar faria o operador pensar que\n * errou a digitação.\n */\n pinRejected?: boolean\n}) {\n const [authorizerId, setAuthorizerId] = useState(presetAuthorizerId ?? authorizers[0]?.id ?? '')\n const [pin, setPin] = useState('')\n // A senha recusada se apaga sozinha — ver `pinRejected`.\n useEffect(() => { if (pinRejected) setPin('') }, [pinRejected])\n\n const impedimento =\n authorizers.length === 0 ? 'Nenhum autorizador está ativo para esta operação.'\n : !authorizerId ? 'Selecione quem autoriza.'\n : pin.length !== 6 ? 'Informe a senha de 6 dígitos.'\n : undefined\n\n return (\n <SheetLayer>\n <div className=\"pos-sheet__scrim\" onClick={onCancel} aria-hidden />\n <div className=\"pos-sheet__panel\" role=\"dialog\" aria-label=\"Precisa de autorização\" aria-modal>\n <div className=\"pos-sheet__head\">\n <h2 className=\"pos-sheet__title\">\n <ShieldCheck size={18} strokeWidth={2.2} aria-hidden /> Precisa de autorização\n </h2>\n <button className=\"pos-sheet__x\" onClick={onCancel} aria-label=\"Fechar\"><X size={20} /></button>\n </div>\n {/* «Autorize o cancelamento com senha.» — a frase do V1, com o artigo\n certo para cada ação. Ela vem do `actionId` porque a folha é UMA\n para as quatro; sem ele, some, em vez de sair com o artigo errado. */}\n {authorizeSubtitle(subjectId ?? actionId) && (\n <p className=\"pos-sheet__sub\">{authorizeSubtitle(subjectId ?? actionId)}</p>\n )}\n\n <div className=\"pos-sheet__body\">\n {/* O QUE está sendo aprovado, antes de qualquer campo. É a razão de\n esta folha existir: o gerente chega à mesa e lê. */}\n <div className=\"pos-auth__what\">\n <span className=\"pos-auth__action\">{request.action}</span>\n <ul className=\"pos-auth__lines\">\n {request.lines.map((l, i) => (\n <li className=\"pos-auth__line\" key={i} data-danger={l.danger || undefined}>\n <span>{l.label}</span>\n {l.value && <span className=\"pos-num pos-auth__v\">{l.value}</span>}\n </li>\n ))}\n </ul>\n </div>\n\n {authorizers.length === 0 ? (\n <p className=\"pos-empty__h\">\n Cadastre quem pode autorizar em Configurações › Comanda, e defina a senha de cada um.\n </p>\n ) : (\n <div className=\"pos-dsc__sec\">\n <span className=\"pos-dsc__lbl\">Quem autoriza</span>\n <select\n className=\"pos-dsc__sel\"\n value={authorizerId}\n onChange={(e) => setAuthorizerId(e.target.value)}\n aria-label=\"Autorizador\"\n >\n {authorizers.map((a) => <option key={a.id} value={a.id}>{a.name}</option>)}\n </select>\n {/* O PIN: bolinhas para ver, teclado do DISPOSITIVO para digitar.\n O teclado desenhado na tela só entra quando a casa roda num\n terminal sem teclado físico — e isso é configuração, não\n padrão: no tablet com teclado e no desktop ele rouba metade\n do diálogo para repetir o que o aparelho já faz melhor.\n `--pos-touch-keypad` fica FALSE até o modo touchscreen\n existir de verdade. */}\n <label className=\"pos-pin__field\">\n <span className=\"pos-pin__dots\" aria-hidden>\n {Array.from({ length: 6 }, (_, i) => (\n <span key={i} className=\"pos-pin__dot\" data-on={i < pin.length} />\n ))}\n </span>\n <input\n className=\"pos-pin__input\"\n type=\"password\"\n inputMode=\"numeric\"\n autoComplete=\"one-time-code\"\n maxLength={6}\n value={pin}\n onChange={(e) => setPin(e.target.value.replace(/\\D/g, '').slice(0, 6))}\n aria-label={`Senha do autorizador — ${pin.length} de 6 dígitos`}\n autoFocus\n />\n </label>\n\n {touchKeypad && (\n <div className=\"pos-pad\" role=\"group\" aria-label=\"Teclado numérico\">\n {['1', '2', '3', '4', '5', '6', '7', '8', '9'].map((d) => (\n <button\n key={d}\n className=\"pos-pad__b pos-num\"\n onClick={() => setPin((p) => (p.length < 6 ? p + d : p))}\n >\n {d}\n </button>\n ))}\n <button className=\"pos-pad__b\" onClick={() => setPin('')} aria-label=\"Limpar\">\n <X size={18} strokeWidth={2.4} aria-hidden />\n </button>\n <button\n className=\"pos-pad__b pos-num\"\n onClick={() => setPin((p) => (p.length < 6 ? p + '0' : p))}\n >\n 0\n </button>\n <button className=\"pos-pad__b\" onClick={() => setPin((p) => p.slice(0, -1))} aria-label=\"Apagar\">\n <Delete size={18} strokeWidth={2.4} aria-hidden />\n </button>\n </div>\n )}\n <span className=\"pos-gnote\">Fica registrado quem autorizou.</span>\n </div>\n )}\n </div>\n\n <div className=\"pos-sheet__foot\">\n <button className=\"pos-btn pos-btn--ghost\" onClick={onCancel}>Voltar</button>\n {authorizers.length > 0 && (\n <button\n className=\"pos-btn\"\n disabled={!!impedimento || !!busy}\n onClick={() => onConfirm(authorizerId, pin)}\n >\n {busy ? 'Autorizando…' : 'Autorizar'}\n </button>\n )}\n </div>\n\n {(error || impedimento) && (\n <p className=\"pos-sheet__why\" data-error={error ? '' : undefined}>{error ?? impedimento}</p>\n )}\n </div>\n </SheetLayer>\n )\n}\n","// ---------------------------------------------------------------------------\n// «Histórico de Transferências» — o que já mudou de lugar nesta comanda.\n//\n// Portado de `beautyplace/src/components/orders/OrderTransferHistory.tsx`.\n// A opção existia no `⋯` do V2 e não lia nada: abria e dizia que não havia\n// nada, sempre.\n//\n// A pergunta que ele responde chega sozinha no fim da noite: \"esta conta não\n// era da mesa 12?\". Transferência é o gesto que mais confunde quem não o fez —\n// a comanda muda de lugar, o total muda de mesa, e sem registro ninguém\n// consegue reconstruir o caminho. Por isso o V1 guarda de onde, para onde,\n// quantos itens e QUEM autorizou.\n// ---------------------------------------------------------------------------\n\nimport { ArrowLeftRight, UtensilsCrossed, User, Package, X } from 'lucide-react'\nimport type { LucideIcon } from 'lucide-react'\nimport { SheetLayer } from './SheetLayer'\n\nexport interface TransferLog {\n id: string\n kind: 'table' | 'guest' | 'items'\n fromLabel?: string\n toLabel?: string\n guestLabel?: string\n itemCount: number\n authorizedByName?: string\n note?: string\n createdAt: string\n}\n\nconst KIND_LABEL: Record<TransferLog['kind'], string> = {\n table: 'Mesa inteira',\n guest: 'Participante',\n items: 'Itens',\n}\n\nconst KIND_ICON: Record<TransferLog['kind'], LucideIcon> = {\n table: UtensilsCrossed,\n guest: User,\n items: Package,\n}\n\nconst quando = (iso: string) =>\n new Date(iso).toLocaleString('pt-BR', {\n day: '2-digit', month: '2-digit', year: '2-digit',\n hour: '2-digit', minute: '2-digit',\n })\n\nexport function TransferHistorySheet({ logs, loading, onClose }: {\n logs: TransferLog[]\n loading?: boolean\n onClose: () => void\n}) {\n return (\n <SheetLayer>\n <div className=\"pos-sheet__scrim\" onClick={onClose} aria-hidden />\n <div className=\"pos-sheet__panel\" role=\"dialog\" aria-label=\"Histórico de transferências\" aria-modal>\n <div className=\"pos-sheet__head\">\n <h2 className=\"pos-sheet__title\">\n <ArrowLeftRight size={18} strokeWidth={2.2} aria-hidden /> Histórico de transferências\n </h2>\n <button className=\"pos-sheet__x\" onClick={onClose} aria-label=\"Fechar\"><X size={20} /></button>\n </div>\n\n <div className=\"pos-sheet__body\">\n <p className=\"pos-empty__h\">Transferências realizadas nesta comanda.</p>\n\n {loading ? (\n <div className=\"pos-thist\">\n {Array.from({ length: 2 }, (_, i) => (\n <div className=\"pos-thist__c pos-skel\" key={i} aria-hidden>\n <span className=\"pos-skel__b\" style={{ width: '38%', height: 14 }} />\n <span className=\"pos-skel__b\" style={{ width: '62%', height: 13 }} />\n </div>\n ))}\n </div>\n ) : logs.length === 0 ? (\n <p className=\"pos-empty__t\">Nenhuma transferência registrada.</p>\n ) : (\n <div className=\"pos-thist\">\n {logs.map((t) => {\n const Icon = KIND_ICON[t.kind] ?? ArrowLeftRight\n return (\n <div className=\"pos-thist__c\" key={t.id}>\n <div className=\"pos-thist__h\">\n <span className=\"pos-thist__k\">\n <span className=\"pos-thist__i\" aria-hidden>\n <Icon size={14} strokeWidth={2.2} />\n </span>\n {KIND_LABEL[t.kind] ?? t.kind}\n </span>\n <span className=\"pos-thist__w\">{quando(t.createdAt)}</span>\n </div>\n <div className=\"pos-thist__b\">\n {/* De onde para onde — a linha que responde \"esta conta\n não era da mesa 12?\". */}\n {t.fromLabel && t.toLabel && (\n <p className=\"pos-thist__r\">\n {t.fromLabel} <ArrowLeftRight size={11} strokeWidth={2.4} aria-hidden /> {t.toLabel}\n </p>\n )}\n {t.guestLabel && <p className=\"pos-thist__r\">Participante: <strong>{t.guestLabel}</strong></p>}\n {t.itemCount > 0 && (\n <p className=\"pos-thist__r\">\n Itens: <strong>{t.itemCount}</strong>\n </p>\n )}\n {t.authorizedByName && (\n <p className=\"pos-thist__r pos-thist__r--who\">Autorizou: {t.authorizedByName}</p>\n )}\n {t.note && <p className=\"pos-thist__r pos-thist__r--who\">{t.note}</p>}\n </div>\n </div>\n )\n })}\n </div>\n )}\n </div>\n\n <div className=\"pos-sheet__foot\">\n <button className=\"pos-btn pos-btn--ghost\" onClick={onClose}>Fechar</button>\n </div>\n </div>\n </SheetLayer>\n )\n}\n","// ---------------------------------------------------------------------------\n// A pergunta antes do gesto que não se desfaz — na língua do PDV.\n//\n// Existe porque o V1 usa `window.confirm` e o V2 não pode: um diálogo do\n// sistema operacional ignora o tema, aparece fora da moldura em que o operador\n// está olhando, e — no caminho de quem opera esta tela por controle remoto ou\n// por um automatismo — TRAVA a página até alguém com mouse chegar perto.\n//\n// O produto já tem `ConfirmDialog` no kit de retaguarda; ele não serve aqui\n// porque o PDV é uma tomada de tela com tipografia e cores próprias, e uma\n// caixa do admin no meio dela se lê como outra aplicação.\n//\n// A pergunta diz o EFEITO, não «tem certeza?» — que não informa nada. É a\n// mesma escolha do V1 na frase da reabertura: *«O status voltará para \"em\n// andamento\"»*.\n// ---------------------------------------------------------------------------\n\nimport { AlertTriangle, X } from 'lucide-react'\nimport { SheetLayer } from './SheetLayer'\n\nexport function ConfirmSheet({\n title, description, confirmLabel = 'Confirmar', cancelLabel = 'Voltar',\n danger, onCancel, onConfirm,\n}: {\n title: string\n /** O EFEITO do gesto. Sem ela a pergunta é «tem certeza?» com outro nome. */\n description?: string\n confirmLabel?: string\n cancelLabel?: string\n /** Pinta a confirmação como destrutiva. */\n danger?: boolean\n onCancel: () => void\n onConfirm: () => void\n}) {\n return (\n <SheetLayer>\n <div className=\"pos-sheet__scrim\" onClick={onCancel} aria-hidden />\n <div className=\"pos-sheet__panel pos-sheet__panel--sm\" role=\"alertdialog\" aria-label={title} aria-modal>\n <div className=\"pos-sheet__head\">\n <h2 className=\"pos-sheet__title\">\n <AlertTriangle size={18} strokeWidth={2.2} aria-hidden /> {title}\n </h2>\n <button className=\"pos-sheet__x\" onClick={onCancel} aria-label=\"Fechar\"><X size={20} /></button>\n </div>\n {description && (\n <div className=\"pos-sheet__body\">\n <p className=\"pos-svc__note\">{description}</p>\n </div>\n )}\n <div className=\"pos-sheet__foot\">\n {/* VOLTAR primeiro: num gesto que não se desfaz, a saída é o que a\n mão encontra antes. */}\n <button className=\"pos-btn pos-btn--ghost\" onClick={onCancel}>{cancelLabel}</button>\n <button\n className={`pos-btn${danger ? ' pos-btn--danger' : ''}`}\n onClick={onConfirm}\n >\n {confirmLabel}\n </button>\n </div>\n </div>\n </SheetLayer>\n )\n}\n","// ---------------------------------------------------------------------------\n// COMO A COMANDA SE CHAMA na tela e no papel.\n//\n// O V1 promete uma coisa que o V2 não estava cumprindo: **toda comanda tem um\n// número**. Lá `order_number` é NOT NULL e a régua escreve\n// `{customer_name || '{TIPO} #{order_number}'}` sem nenhum caminho alternativo.\n//\n// No V2 o número sai de `next_sequence_authorized`, e `nextReference()` devolve\n// `undefined` quando a sequência falha — com um `console.warn` que ninguém no\n// balcão vai ler. A comanda nasce, funciona, recebe itens e recebe dinheiro,\n// e é a ÚNICA sem nome próprio:\n//\n// - na bandeja ela vira «Balcão», igual à próxima que falhar;\n// - no espelho impresso ela vira «PEDIDO #—».\n//\n// Duas comandas com a mesma etiqueta é o operador entregando a sacola errada,\n// e um papel sem número é o cliente voltando com uma conta que ninguém acha.\n//\n// Aqui a comanda passa a ter SEMPRE como ser chamada. O número da casa quando\n// existe; o começo do id quando não existe. O id não é bonito e não é o que a\n// casa usa para conversar — mas é único, está impresso nos dois lugares, e\n// permite achar a comanda. A alternativa não é um nome melhor: é nenhum.\n//\n// O que ISTO NÃO FAZ: inventar um número de sequência. Gravar «13» numa comanda\n// porque a sequência não respondeu colidiria com a décima terceira de verdade,\n// e aí duas comandas diferentes passariam a se chamar igual no relatório do dia\n// — que é pior do que a feiura de um id.\n// ---------------------------------------------------------------------------\n\n/** O prefixo que a casa põe na sequência, e que a etiqueta não precisa mostrar. */\nconst PREFIXO = /^PED-?0*/\n\n/**\n * A referência para mostrar: `1898` para a comanda numerada,\n * `046dfcd7` para a que ficou sem número.\n *\n * Devolve `undefined` só quando não há NEM número NEM id — o que não acontece\n * numa comanda gravada, e por isso não tem texto de reserva: um «—» aqui\n * esconderia um defeito em vez de mostrá-lo.\n */\nexport function displayRef(\n reference: string | null | undefined,\n orderId?: string | null,\n): string | undefined {\n const numero = String(reference ?? '').trim()\n if (numero) return numero.replace(PREFIXO, '') || numero\n const id = String(orderId ?? '').trim()\n return id ? id.slice(0, 8) : undefined\n}\n\n/**\n * O rótulo da ficha na bandeja — `{cliente}` ou `{Canal} #{referência}`.\n *\n * É a linha do V1, com o mesmo `||`: o nome de quem consome ganha do número\n * sempre que existe, porque é por ele que o balcão chama.\n */\nexport function orderChipLabel(\n channelLabel: string,\n reference: string | null | undefined,\n orderId?: string | null,\n customerName?: string | null,\n): string {\n const nome = customerName?.trim()\n if (nome) return nome\n const ref = displayRef(reference, orderId)\n return ref ? `${channelLabel} #${ref}` : channelLabel\n}\n","// ---------------------------------------------------------------------------\n// QUANTO CADA CANAL TEM ABERTO — e o salão não conta como os outros três.\n//\n// A regra é do V1, literal (`OrdersDashboard.tsx`):\n//\n// salao: new Set(openOrders.filter(o => o.table_id != null)\n// .map(o => o.table_id)).size,\n// balcao: openOrders.filter(o => canalDaComanda(o) === 'balcao').length,\n// retirada: openOrders.filter(o => o.type === 'takeout').length,\n// delivery: openOrders.filter(o => o.type === 'delivery').length,\n//\n// com a razão escrita ao lado: *«Mesa conta MESA, não comanda: duas contas na\n// mesma mesa são um lugar ocupado, e é lugar que o salão tem para dar. Os\n// outros três contam comanda, que é o que está na fila para sair.»*\n//\n// São duas perguntas diferentes vestidas com o mesmo número. No salão o\n// operador lê \"quantos lugares estão tomados\" para saber se cabe mais gente;\n// no balcão ele lê \"quantos pedidos estão na fila\". Contar comanda no salão\n// responde a pergunta do balcão com o dado do salão.\n//\n// E o corte de DATA não existe de propósito, também como no V1: *«Uma comanda\n// ABERTA é dinheiro que ainda não entrou, e esconder a de ontem não a fecha —\n// só tira do operador o único lugar em que ela aparecia.»*\n// ---------------------------------------------------------------------------\n\n/** As espécies que são do PDV. `sale` e `purchase` não são comanda de salão. */\nexport const ESPECIE_DE_SALAO = new Set(['dine_in', 'counter', 'takeout', 'delivery'])\n\nexport interface OpenOrderRow {\n channel?: string | null\n kind?: string | null\n}\n\n/**\n * Conta as comandas abertas por canal.\n *\n * `channelOf` é a tradução canal+espécie → canal (o `channelOfOrder` do core),\n * injetada para esta regra não amarrar o pacote a ela. Devolve `null` em dois\n * casos bem diferentes: a comanda sem canal nem espécie — que É mesa — e a\n * linha que não é do salão (`sale`, `purchase`). O segundo caso sai da conta;\n * sem isso, uma venda de estoque que ficasse aberta entraria como mesa.\n */\nexport function countOpenByChannel(\n rows: readonly OpenOrderRow[],\n channelOf: (row: OpenOrderRow) => string | null | undefined,\n): Record<string, number> {\n const out: Record<string, number> = {}\n for (const row of rows) {\n const canal = channelOf(row)\n if (!canal && row.kind && !ESPECIE_DE_SALAO.has(row.kind)) continue\n // `dine_in` é a queda de «não tem canal», não de «não é do PDV».\n const c = canal ?? 'dine_in'\n out[c] = (out[c] ?? 0) + 1\n }\n return out\n}\n\n/**\n * O salão passa a contar MESA.\n *\n * Recebe as contagens por comanda e as mesas com comanda aberta, e substitui a\n * do salão. Vale SEMPRE — inclusive quando a contagem por comanda falhou e veio\n * vazia —, porque este número sai de outra leitura: quem chama já sabe quais\n * mesas estão ocupadas.\n */\nexport function withDineInByTable(\n counts: Record<string, number>,\n occupiedTableIds: readonly (string | null | undefined)[],\n): Record<string, number> {\n const mesas = new Set(occupiedTableIds.filter((id): id is string => !!id))\n return { ...counts, dine_in: mesas.size }\n}\n","// ---------------------------------------------------------------------------\n// O QUE FOI TRANSFERIDO — dito de volta, por modo.\n//\n// O V1 confirma cada modo com a SUA frase:\n//\n// if (mode === 'items') `${n} item(ns) transferido(s) com sucesso!`\n// if (mode === 'table') `${sourceOrderLabel} transferida com sucesso!`\n// if (mode === 'participant') 'Participante transferido(a) com sucesso!'\n//\n// O V2 dizia «Transferência concluída» para os três. Parece equivalente e não\n// é: os três modos moram na MESMA folha, a um toque um do outro, e o que\n// distingue «mudei a comanda inteira de mesa» de «mudei uma linha de dono» é\n// justamente o que o aviso não dizia.\n//\n// Depois de transferir, a tela muda de lugar — a mesa de origem esvazia, a\n// bandeja se remonta. É nesse instante que o operador precisa ler o que\n// aconteceu, porque é o único momento em que ele ainda lembra o que pretendia.\n// Uma confirmação genérica não distingue o acerto do engano, e o engano aqui é\n// a comanda inteira de um grupo indo para a mesa de outro.\n// ---------------------------------------------------------------------------\n\nexport type TransferDoneKind = 'table' | 'guest' | 'items'\n\n/**\n * A frase de sucesso da transferência.\n *\n * `label` é a comanda de ORIGEM — «Mesa 189» ou «Comanda de balcão», o\n * `sourceOrderLabel` do V1.\n */\nexport function transferDoneMessage(\n kind: TransferDoneKind,\n { label, count }: { label?: string; count?: number } = {},\n): string {\n if (kind === 'items') {\n const n = Math.max(0, count ?? 0)\n return `${n} item(ns) transferido(s) com sucesso!`\n }\n if (kind === 'guest') return 'Participante transferido(a) com sucesso!'\n // A origem no meio da frase, como no V1: é ela que sai do lugar, e é o nome\n // dela que o garçom tem na cabeça.\n return `${label ?? 'Comanda de balcão'} transferida com sucesso!`\n}\n","// ---------------------------------------------------------------------------\n// Do botão do caixa para a palavra do razão.\n//\n// A casa cadastra as formas de pagamento dela em\n// `plg_financial_payment_method_types`, e cada uma tem um `transaction_type` —\n// sete valores no Pertinho. O razão fala outro vocabulário, menor: o\n// `PaymentMethod` de `@fayz-ai/core/orders`, que é quem decide em qual conta o\n// dinheiro cai.\n//\n// A tradução mora aqui, testada, porque errar nela não dá erro: dá dinheiro na\n// conta errada, e o furo só aparece na conciliação do mês.\n// ---------------------------------------------------------------------------\n\n/** O vocabulário do razão — o mesmo `PaymentMethod` de `@fayz-ai/core/orders`. */\nexport type LedgerMethod = 'cash' | 'pix' | 'credit_card' | 'debit_card' | 'transfer' | 'other'\n\n/**\n * Os sete `transaction_type` do catálogo, nos seis do razão.\n *\n * `bank_transfer` vira `transfer` porque é o mesmo movimento com outro nome.\n * `voucher` e `check` caem em `other` DE PROPÓSITO: o razão não tem conta\n * própria para nenhum dos dois, e mapeá-los em `pix` ou `cash` — que é o\n * atalho tentador — creditaria a gaveta com um vale-refeição que ninguém pode\n * sacar. `other` cai no caixa aberto do operador, que é onde um vale fica até\n * alguém conciliar.\n */\nconst DO_CATALOGO: Record<string, LedgerMethod> = {\n cash: 'cash',\n pix: 'pix',\n credit_card: 'credit_card',\n debit_card: 'debit_card',\n bank_transfer: 'transfer',\n voucher: 'other',\n check: 'other',\n}\n\n/**\n * Qual conta recebe este pagamento.\n *\n * Desconhecido vira `other` em vez de estourar: uma forma nova no catálogo não\n * pode impedir o fechamento de uma mesa com gente esperando. Ela cai no caixa\n * do operador e aparece na conciliação — visível, e não perdida.\n */\nexport function ledgerMethod(transactionType: string | null | undefined): LedgerMethod {\n if (!transactionType) return 'other'\n return DO_CATALOGO[transactionType] ?? 'other'\n}\n","// ---------------------------------------------------------------------------\n// Duas contas com o MESMO NOME no seletor de recebimento.\n//\n// Medido no Pertinho em 29-09: **9 nomes duplicados, 18 contas, e os 9 pares\n// têm a mesma assinatura** — uma com `unit_id` da unidade e outra com\n// `unit_id` nulo. «PagBank Crédito» e «PagBank Crédito». «Stone Débito» e\n// «Stone Débito». Zero exceções, o que aponta para migração e não para\n// cadastro à mão.\n//\n// Para quem opera, é uma escolha impossível: duas linhas idênticas, e uma\n// delas leva o dinheiro para o lugar certo. O PDV não conserta o cadastro —\n// isso é do Financeiro —, mas pode parar de oferecer a pergunta sem resposta.\n//\n// A regra: quando o nome colide, **a conta da unidade ativa ganha**. Ela é a\n// mais específica, e é a que o resto do sistema usa para escopo.\n// ---------------------------------------------------------------------------\n\nexport interface PickableAccount {\n id: string\n name: string\n kind: string\n /** A unidade dona. `null`/ausente = conta da conta inteira. */\n unitId?: string | null\n}\n\n/**\n * Resolve o empate por nome, preferindo a unidade ativa.\n *\n * Sem unidade ativa — ou quando nenhuma das homônimas é dela — a primeira\n * sobrevive, e a ordem de entrada manda. Nunca some com um nome inteiro: o\n * seletor perde a linha repetida, não a opção.\n */\nexport function dedupeAccountsByName<T extends PickableAccount>(\n accounts: readonly T[],\n activeUnitId?: string | null,\n): T[] {\n const porNome = new Map<string, T>()\n for (const c of accounts) {\n const atual = porNome.get(c.name)\n if (!atual) { porNome.set(c.name, c); continue }\n // A da unidade ativa ganha; se nenhuma for, fica a que chegou primeiro.\n if (activeUnitId && c.unitId === activeUnitId && atual.unitId !== activeUnitId) {\n porNome.set(c.name, c)\n }\n }\n // A ordem de ENTRADA se preserva: o seletor já vem ordenado por nome, e\n // reordenar aqui moveria a linha que o dedo estava mirando.\n const escolhidas = new Set([...porNome.values()].map((c) => c.id))\n return accounts.filter((c) => escolhidas.has(c.id))\n}\n","// ---------------------------------------------------------------------------\n// Quem precisa de caixa aberto para RECEBER em dinheiro.\n//\n// Portado do `useSettlementGate` do V1, que é onde a regra mora por inteiro:\n//\n// > QUITAR — efetivar o pagamento ou o recebimento — exige uma das duas:\n// > - permissão GERAL da direção (financeiro/gerência): quita sem caixa;\n// > - permissão PELO CAIXINHA da direção (recepção): quita somente com o\n// > próprio caixa aberto, movimentando o saldo do caixinha.\n//\n// No V2 a regra tem uma torção que precisa estar escrita: o cluster **sempre**\n// quer uma sessão para dinheiro — `financial_receive_payment` levanta\n// *«no open cash session (caixinha) for cash in this unit»* quando não acha\n// nenhuma. Então «quitar sem caixa» aqui não é receber fora do caixa: é ter o\n// direito de ABRIR um, com abertura zero, na hora do fechamento.\n//\n// A diferença que isso faz é de segurança, e é o motivo do porte: hoje o PDV\n// manda `openCashSession: true` para todo mundo, então a recepção que só pode\n// operar o próprio caixinha abre um caixa fantasma sem perceber — e o V1\n// recusa exatamente esse gesto, com uma frase que diz o que fazer.\n// ---------------------------------------------------------------------------\n\nexport interface CashGateState {\n /**\n * Tem o privilégio geral do Financeiro (`financial.manage`) — o `isAdmin`\n * ou a «permissão GERAL da direção» do V1.\n */\n privileged: boolean\n /** Existe um caixa ABERTO para esta pessoa nesta unidade. */\n hasOpenSession: boolean\n /** Tem ao menos o direito de lançar pelo caixinha (`financial.create`). */\n canSettle: boolean\n}\n\n/** A frase do V1, palavra por palavra, para quem tem caixinha e não o abriu. */\nexport const OPEN_YOUR_CASH = 'Abra o seu caixinha para registrar este recebimento.'\n\n/** E a do V1 para quem não tem direito nenhum de receber. */\nexport const CANNOT_RECEIVE = 'Você não tem permissão para registrar recebimentos.'\n\n/**\n * Pode receber em dinheiro agora? `null` quando sim.\n *\n * A ordem das perguntas é a do V1: o privilégio primeiro, porque ele dispensa\n * as outras duas; depois o direito de lançar; e por último o estado do caixa,\n * que é a única das três que a própria pessoa resolve em dois toques.\n */\nexport function cashReceiptBlock(state: CashGateState): string | null {\n if (state.privileged) return null\n if (!state.canSettle) return CANNOT_RECEIVE\n if (!state.hasOpenSession) return OPEN_YOUR_CASH\n return null\n}\n\n/**\n * O PDV pode abrir um caixa por conta própria neste fechamento?\n *\n * Só o privilegiado. Para o resto, abrir seria criar a gaveta de outra pessoa\n * — o V1 manda abrir o SEU caixinha, e esse gesto tem tela própria.\n */\nexport function mayOpenCashSession(state: CashGateState): boolean {\n return state.privileged\n}\n"]}