@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
@@ -1,10 +1,59 @@
1
+ import { type PlanZone } from './PlanStage';
2
+ import type { ZoneDraft, ZoneTool } from './zoneDraft';
3
+ import type { ZoneGeometry, ZoneMembershipAction } from './zoneEditing';
1
4
  import { Search } from 'lucide-react';
2
5
  import type { PosCategory, PosItem, PosPosition, PosPositionConfig, PosPositionStatus, PosStaff } from '../app/config';
6
+ import { type TableTone } from './tableTone';
3
7
  /** Colour never carries the meaning alone: icon and word ride along. */
4
8
  export declare function StatusBadge({ status }: {
5
9
  status: PosPositionStatus;
6
10
  }): import("react").JSX.Element;
11
+ /**
12
+ * O rótulo da pastilha — e para a mesa PARADA ele diz HÁ QUANTO TEMPO.
13
+ *
14
+ * O V1 escreve a duração de verdade e explica por quê:
15
+ *
16
+ * > *"Vermelho é «sem pedido há 1 h»: a pastilha diz isso, senão o operador vê
17
+ * > o mesmo «cerca de 1 hora» do laranja e não sabe por que a cor mudou."*
18
+ *
19
+ * O V2 mostrava a constante `'Sem pedido há 1 h'` em toda mesa parada. Agora
20
+ * mesmo, no Pertinho, oito mesas estão paradas e as oito dizem a mesma frase —
21
+ * a de cinco horas e a de sessenta e um minutos são indistinguíveis, e é
22
+ * justamente entre essas duas que o gerente escolhe em qual mesa encostar
23
+ * primeiro.
24
+ *
25
+ * Conta do `lastOrderAt`, e cai para a abertura quando não há item nenhum: é o
26
+ * `last_item_at ?? opened_at` do V1, e é o que faz a mesa aberta há duas horas
27
+ * sem pedir nada dizer «sem pedido há 2 horas» em vez de «agora».
28
+ */
29
+ export declare function toneBadgeLabel(tone: TableTone, p: {
30
+ lastOrderAt?: string | null;
31
+ openedAt?: string | null;
32
+ }, now?: number): string;
33
+ /**
34
+ * Há quanto tempo, na língua de quem lê — o `formatDistanceToNow` do V1.
35
+ *
36
+ * `453h22` é um número, não uma resposta: ninguém converte quatrocentas e
37
+ * cinquenta horas em "dezenove dias" no meio do serviço. E essas comandas
38
+ * existem — sete das doze abertas do Pertinho têm zero itens e dias de idade
39
+ * (V1-079). O formato precisa aguentá-las sem virar ruído.
40
+ */
7
41
  export declare function elapsed(openedAt?: string, now?: number): string | undefined;
42
+ /**
43
+ * A idade em UMA PASTILHA de 200px — «agora · 45min · 2h · 3d».
44
+ *
45
+ * O V1 tem as duas formas e explica por quê: *"`formatDistanceToNow` devolve
46
+ * «cerca de 1 hora» e «5 meses»: numa pastilha de 200px isso é a coisa mais
47
+ * larga da linha. Aqui o tempo é um número."*
48
+ *
49
+ * O cartão da mesa tem largura e fica com `elapsed`, por extenso. A ficha da
50
+ * bandeja não tem, e o valor da comanda divide a linha com ela.
51
+ *
52
+ * E arredonda para BAIXO, como o V1: uma comanda de 90 minutos tem uma hora
53
+ * cheia, não duas. Arredondar para cima envelhece a comanda e dispara o olho
54
+ * do gerente para uma mesa que ainda está no prazo.
55
+ */
56
+ export declare function briefElapsed(openedAt?: string, now?: number): string | undefined;
8
57
  /**
9
58
  * O esqueleto do que está vindo, não um spinner.
10
59
  *
@@ -13,8 +62,25 @@ export declare function elapsed(openedAt?: string, now?: number): string | undef
13
62
  * abre com a mão indo para a primeira mesa, o salto é o que faz errar o alvo.
14
63
  * `aria-busy` no contêiner conta a mesma coisa para quem não vê o desenho.
15
64
  */
16
- export declare function FloorSkeleton({ count }: {
17
- count?: number;
65
+ /**
66
+ * O salão enquanto ele carrega.
67
+ *
68
+ * Um esqueleto só vale se tiver a FORMA do que vem — inclusive os cabeçalhos
69
+ * de grupo. O anterior desenhava cartões soltos, e quando o dado chegava a
70
+ * tela se reorganizava inteira: nasciam as faixas OCUPADAS e LIVRES e cada
71
+ * cartão pulava de lugar. Quem já estava mirando uma mesa mirava outra.
72
+ *
73
+ * Por isso ele reproduz a grade de verdade: duas faixas, os contadores, e o
74
+ * cartão com topo, selo, rodapé de tempo e valor. As proporções saem das
75
+ * mesmas medidas do `.pos-tbl`, e não de números escolhidos a olho.
76
+ *
77
+ * `busy`/`free` são quantos cartões desenhar em cada faixa. O padrão é uma
78
+ * casa pequena em serviço — poucas ocupadas, várias livres —, que é a forma
79
+ * que o salão tem na maior parte do tempo.
80
+ */
81
+ export declare function FloorSkeleton({ busy, free }: {
82
+ busy?: number;
83
+ free?: number;
18
84
  }): import("react").JSX.Element;
19
85
  export declare function CatalogSkeleton({ categories, items }: {
20
86
  categories?: number;
@@ -30,12 +96,15 @@ export declare function EmptyState({ title, hint, Icon, action }: {
30
96
  onClick: () => void;
31
97
  };
32
98
  }): import("react").JSX.Element;
33
- export declare function FloorView({ positions, config, activeId, onSelect, now, picking, layout }: {
99
+ export declare 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 }: {
34
100
  positions: PosPosition[];
35
101
  config: PosPositionConfig;
36
102
  activeId?: string;
37
103
  onSelect: (p: PosPosition) => void;
38
104
  now: number;
105
+ /** As mesas fora do escopo do operador. A planta as ESMAECE; a grade as
106
+ * REMOVE, e o recorte para ela acontece antes daqui. Ver `foraDoEscopo`. */
107
+ dimmedIds?: ReadonlySet<string>;
39
108
  /** A party is waiting: only the free tables are answers to the question. */
40
109
  picking?: boolean;
41
110
  /**
@@ -48,19 +117,61 @@ export declare function FloorView({ positions, config, activeId, onSelect, now,
48
117
  * grade é o padrão, e a planta é para quando a dúvida é geográfica.
49
118
  */
50
119
  layout?: 'grid' | 'plan';
120
+ /** A área escolhida no rodapé: na planta ela é FOCO, não filtro. */
121
+ focusAreaId?: string;
122
+ /** As praças desenhadas — a região de cada garçom. */
123
+ serviceAreas?: PlanZone[];
124
+ /** Editar a planta: a mesa passa a se arrastar em vez de abrir a comanda. */
125
+ editingPlan?: boolean;
126
+ /** A ferramenta de praça armada e o que fazer com o gesto (ver PlanStage). */
127
+ tool?: ZoneTool | null;
128
+ onDrawZone?: (draft: ZoneDraft) => void;
129
+ draftColor?: string;
130
+ selectedZoneId?: string | null;
131
+ onSelectZone?: (id: string | null) => void;
132
+ onUpdateZone?: (id: string, patch: Partial<ZoneGeometry>) => void;
133
+ onRefuseZone?: (reason: string) => void;
134
+ pickingZone?: boolean;
135
+ onToggleTableInZone?: (tableId: string, how: ZoneMembershipAction) => void;
136
+ selectedAreaId?: string | null;
137
+ onSelectArea?: (id: string | null) => void;
138
+ onMoveTable?: (id: string, to: {
139
+ x: number;
140
+ y: number;
141
+ }) => void;
142
+ /** Em edição, tocar a mesa ABRE A FICHA em vez de abrir a comanda. */
143
+ onPickTable?: (id: string) => void;
144
+ /** O operador está recortado à praça dele — ver `floorEmpty`. */
145
+ scoped?: boolean;
146
+ /** A casa tem mesa cadastrada, fora do recorte e do filtro. */
147
+ houseHasTables?: boolean;
148
+ /** Há filtro de área ligado agora. */
149
+ areaFiltered?: boolean;
51
150
  }): import("react").JSX.Element;
52
151
  /** Two letters is what fits on a table at plan scale, and it is what a floor
53
152
  * manager already reads on a printed roster. */
54
153
  export declare function initialsOf(name: string): string;
55
- export declare function CatalogView({ categories, items, activeCategoryId, onCategoryChange, quantities, onAdd, onRemove, query, }: {
154
+ export declare function CatalogView({ categories, items, activeCategoryId, onCategoryChange, quantities, pending, onAdd, onRemove, query, menuLabel, onRefreshMenu, menuRefreshing, }: {
56
155
  categories: PosCategory[];
57
156
  items: PosItem[];
58
157
  activeCategoryId?: string;
59
158
  onCategoryChange: (id: string) => void;
60
159
  quantities: Record<string, number>;
160
+ /** Quanto de cada item ainda está no CARRINHO — o que dá para tirar daqui. */
161
+ pending?: Record<string, number>;
61
162
  onAdd: (item: PosItem) => void;
62
163
  onRemove: (item: PosItem) => void;
63
164
  query: string;
165
+ /** A idade desta cópia do cardápio — ver `menuFreshnessLabel`. */
166
+ menuLabel?: string;
167
+ /**
168
+ * Ir buscar o cardápio AGORA.
169
+ *
170
+ * Sem ele a linha de frescor não aparece: um app que não sabe revalidar não
171
+ * deve prometer um botão que não faz nada.
172
+ */
173
+ onRefreshMenu?: () => void;
174
+ menuRefreshing?: boolean;
64
175
  }): import("react").JSX.Element;
65
176
  export declare function ListView({ positions, activeId, onSelect, now, emptyLabel }: {
66
177
  positions: PosPosition[];
@@ -73,4 +184,28 @@ export declare function ShiftView({ positions, staff }: {
73
184
  positions: PosPosition[];
74
185
  staff: PosStaff[];
75
186
  }): import("react").JSX.Element;
187
+ /**
188
+ * O valor que a ficha da bandeja mostra — o SALDO, não o total.
189
+ *
190
+ * Regra do V1, e está numa linha só:
191
+ *
192
+ * ```ts
193
+ * const openOrdersWithOutstandingBalance = openOrders.map(order => ({
194
+ * ...order, total: order.balance ?? order.total,
195
+ * }))
196
+ * ```
197
+ *
198
+ * A bandeja responde **"quanto ainda está lá fora"**, não "quanto foi lançado".
199
+ * Uma mesa de R$ 300 que já pagou R$ 250 aparece como R$ 50: o total dá ao caixa
200
+ * um número que ele não vai receber, e numa casa com pagamento por participante
201
+ * a soma da régua deixa de bater com o dinheiro que falta entrar.
202
+ *
203
+ * Zero é resultado válido e aparece como R$ 0,00 — conta paga e ainda aberta é
204
+ * um estado de verdade (ninguém fechou), e a ficha continuar na bandeja é o que
205
+ * lembra de fechá-la.
206
+ *
207
+ * Nunca negativo: pagamento a mais é troco a devolver, e um valor negativo na
208
+ * régua leria como se a casa devesse dinheiro ao cliente.
209
+ */
210
+ export declare function dockAmountCents(totalCents: number | undefined, paidByGuest?: Record<string, number>): number | undefined;
76
211
  //# sourceMappingURL=views.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"views.d.ts","sourceRoot":"","sources":["../../src/screen/views.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"views.d.ts","sourceRoot":"","sources":["../../src/screen/views.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,211 @@
1
+ /** Os cinco estados do V1, valor por valor — é o CHECK da tabela. */
2
+ export type WaitlistStatus = 'waiting' | 'called' | 'seated' | 'no_show' | 'cancelled';
3
+ /** Um grupo esperando mesa. A unidade da fila é o GRUPO, não a pessoa. */
4
+ export interface WaitlistEntry {
5
+ id: string;
6
+ /** Nome de quem espera. Walk-in não é cadastro: o nome vive na própria linha. */
7
+ name: string;
8
+ /** O PRIMEIRO campo do formulário no V1 — ver `WaitlistEntrySheet`. */
9
+ phone: string;
10
+ party: number;
11
+ /**
12
+ * A menor mesa da casa que comporta o grupo, resolvida no banco.
13
+ *
14
+ * É a chave da contagem de posição. Ausente, a linha cai no próprio
15
+ * `party` — uma casa que ainda não cadastrou mesa nenhuma continua tendo
16
+ * fila, só que cada tamanho vira o seu próprio bucket.
17
+ */
18
+ sizeBucket?: number | null;
19
+ /** ISO. A ordem da fila, e o "espera há…" da linha. */
20
+ joinedAt: string;
21
+ status: WaitlistStatus;
22
+ callExpiresAt?: string | null;
23
+ /** Quantas vezes já foi chamado. O segundo grito aparece na linha. */
24
+ callCount?: number;
25
+ /** Ambiente preferido (opcional). `Tanto faz` é a ausência dele. */
26
+ zoneId?: string | null;
27
+ /** «Cadeirinha, aniversário, mesa perto da janela…» */
28
+ note?: string | null;
29
+ /** Preenchida por `withPositions`; 0 para quem não está mais aguardando. */
30
+ position?: number;
31
+ }
32
+ /** O que o balcão digita para pôr alguém na fila. */
33
+ export interface NewWaitlistEntry {
34
+ name: string;
35
+ phone: string;
36
+ party: number;
37
+ zoneId?: string | null;
38
+ note?: string | null;
39
+ /**
40
+ * A ficha que o telefone encontrou, quando encontrou.
41
+ *
42
+ * Só é preenchida por casamento com quem JÁ existe: a fila não cria pessoa,
43
+ * senão o cadastro enche de quem passou na porta uma vez e nunca voltou.
44
+ */
45
+ personId?: string | null;
46
+ }
47
+ /** Só quem ainda disputa mesa aparece no painel do anfitrião. */
48
+ export declare const ACTIVE_STATUSES: WaitlistStatus[];
49
+ /** O teto do contador de pessoas no V1: `Math.min(40, p + 1)`. */
50
+ export declare const MAX_PARTY = 40;
51
+ /**
52
+ * A posição de cada um, DENTRO do seu bucket.
53
+ *
54
+ * Quem já foi chamado, sentou ou saiu devolve 0 — a mesma convenção da
55
+ * `waitlist_position` do banco, e é o que a tela lê para trocar de estado sem
56
+ * uma segunda pergunta. A ordenação por `joinedAt` é feita aqui e não confiada
57
+ * à consulta: a lista chega ordenada hoje, e uma linha que entra por realtime
58
+ * chega no fim independentemente da hora em que o grupo pisou na porta.
59
+ */
60
+ export declare function withPositions(entries: WaitlistEntry[]): WaitlistEntry[];
61
+ /**
62
+ * O prazo do chamado estourou.
63
+ *
64
+ * O V1 NÃO marca falta sozinho, de propósito — o grupo pode estar entrando
65
+ * pela porta no minuto em que o prazo vira. Isto só pinta a linha de vermelho;
66
+ * quem decide continua sendo o anfitrião.
67
+ */
68
+ export declare function isCallOverdue(e: WaitlistEntry, now: number): boolean;
69
+ /**
70
+ * A frase da linha chamada, literal do V1.
71
+ *
72
+ * O `Nx` só aparece a partir do segundo chamado: escrever «(1x)» em toda linha
73
+ * chamada gastaria espaço para dizer o que já se sabe.
74
+ */
75
+ export declare function calledLabel(e: WaitlistEntry, now: number): string | null;
76
+ /**
77
+ * O contador do topo: «3 grupos aguardando · 1 chamado».
78
+ *
79
+ * A unidade é o GRUPO, não a pessoa — quem lê precisa saber quantas MESAS
80
+ * faltam, não quantas bocas. Os chamados só entram quando existem: um «· 0
81
+ * chamados» permanente é ruído.
82
+ */
83
+ export declare function waitingSummary(entries: WaitlistEntry[]): string;
84
+ /** O ± do formulário: nunca abaixo de 1, nunca acima de 40. Regra do V1. */
85
+ export declare function clampParty(n: number): number;
86
+ /** Só os dígitos — é assim que o V1 mede se o telefone está completo. */
87
+ export declare function onlyDigits(s: string): string;
88
+ /**
89
+ * `(00) 00000-0000` — a máscara do V1, e o formato em que o telefone é gravado.
90
+ *
91
+ * Grava formatado de propósito: é o que o anfitrião lê na linha da fila para
92
+ * ligar, e reformatar na leitura obrigaria as duas pontas a concordar sobre um
93
+ * formato que nenhuma das duas guarda.
94
+ */
95
+ export declare function formatPhoneBR(raw: string): string;
96
+ /**
97
+ * O submit libera? Regra do V1, os três termos:
98
+ * nome com 2+ letras, telefone com 10+ dígitos, grupo maior que zero.
99
+ *
100
+ * O telefone entra na validação — e não é burocracia. É por ele que a casa
101
+ * alcança o grupo que saiu da porta, e no V1 é ele que carrega o link da
102
+ * posição. Uma linha na fila sem telefone é um cliente que só pode esperar de
103
+ * pé.
104
+ */
105
+ export declare function isEntryValid(e: Partial<NewWaitlistEntry>): boolean;
106
+ /** O que falta para «Colocar na fila» liberar — a tela DIZ, não emudece. */
107
+ export declare function entryBlocker(e: Partial<NewWaitlistEntry>): string | null;
108
+ /**
109
+ * As mesas que servem para acomodar este grupo AGORA.
110
+ *
111
+ * Regra do `WaitlistSeatDialog` do V1, inteira: mesa ativa, LIVRE e com
112
+ * capacidade suficiente; a do ambiente preferido primeiro, depois a MENOR que
113
+ * serve. Sentar um casal na mesa de oito é o jeito mais rápido de a fila parar
114
+ * de andar — a mesa de oito é a única que atende o grupo de sete que chega em
115
+ * seguida.
116
+ *
117
+ * Mesa sem capacidade cadastrada (`seats` ausente) entra: o V2 aceita mesa sem
118
+ * lugares declarados, e escondê-la faria a casa que nunca preencheu o campo ver
119
+ * «nenhuma mesa serve» com o salão vazio.
120
+ */
121
+ export declare function seatableTables<T extends {
122
+ id: string;
123
+ label: string;
124
+ status: string;
125
+ seats?: number;
126
+ areaId?: string | null;
127
+ zoneId?: string;
128
+ }>(positions: T[], party: number, preferredZoneId?: string | null): T[];
129
+ /**
130
+ * Nenhuma mesa livre comporta o grupo — a frase do V1, com o número dentro.
131
+ *
132
+ * Ela não é um erro: é a instrução do que fazer em seguida (juntar mesas pelo
133
+ * mapa). Um botão morto em silêncio deixaria o anfitrião tentando de novo.
134
+ */
135
+ export declare function noTableFitsMessage(party: number): string;
136
+ /** «espera há 12 min» / «há 1 h 20 min» — o relógio da linha. */
137
+ export declare function waitingFor(joinedAt: string, now: number): string;
138
+ /** O vazio do V1, palavra por palavra. */
139
+ export declare const EMPTY_TITLE = "Ningu\u00E9m na fila";
140
+ export declare const EMPTY_HINT = "Quando o sal\u00E3o encher, coloque aqui quem chegar sem reserva.";
141
+ /**
142
+ * O subtítulo da tela.
143
+ *
144
+ * O V1 escreve *"Quem chegou sem reserva. O cliente acompanha a posição pelo
145
+ * link que recebe no WhatsApp."* — e a segunda frase é uma PROMESSA. Enquanto
146
+ * o link público não existir no V2, repeti-la faria a tela mentir para o
147
+ * anfitrião, que confiaria nela para deixar o cliente sair da porta.
148
+ *
149
+ * Então ela fica de fora até o link existir. O resto é verdade hoje.
150
+ */
151
+ export declare const WAITLIST_SUBTITLE = "Quem chegou sem reserva e est\u00E1 esperando mesa.";
152
+ import type { PosReservation } from '../app/config';
153
+ /** Uma reserva ainda está "por entrar"? Sentada, cancelada ou faltante, não. */
154
+ export declare function stillIncoming(r: {
155
+ status: string;
156
+ }): boolean;
157
+ /**
158
+ * A ordem das reservas na lista de entrada.
159
+ *
160
+ * **Quem JÁ CHEGOU vem antes**, e não é detalhe: essa gente está de pé na
161
+ * recepção agora, enquanto a reserva das 21h ainda está em casa. Ordenar só
162
+ * pelo horário empurraria para baixo justamente quem o anfitrião tem na frente
163
+ * dele — e essa é a lista que ele lê para decidir quem senta na próxima mesa.
164
+ *
165
+ * Entre os que chegaram, quem chegou primeiro; entre os que não chegaram, a
166
+ * hora marcada.
167
+ */
168
+ export declare function incomingOrder(reservations: PosReservation[]): PosReservation[];
169
+ /**
170
+ * Quantos minutos a reserva está atrasada. Negativo (ainda não é a hora) vira 0.
171
+ *
172
+ * Só conta para quem NÃO chegou: uma reserva das 20h com o grupo de pé na
173
+ * recepção desde as 20h05 não está atrasada — ela está esperando mesa, que é
174
+ * outra conversa.
175
+ */
176
+ export declare function minutesLate(r: {
177
+ at: string;
178
+ status: string;
179
+ }, now: number): number;
180
+ /** «20:30» — o horário reservado, que é o que a linha da reserva mostra. */
181
+ export declare function clockOf(iso: string): string;
182
+ /**
183
+ * O grupo casa com o termo.
184
+ *
185
+ * Casa por **nome** e por **telefone** porque são os dois jeitos de a recepção
186
+ * chamar alguém — o nome quando ela lembra, o número quando o cliente ligou
187
+ * dizendo "estou na fila". O telefone compara só os DÍGITOS dos dois lados:
188
+ * o banco guarda «(11) 99999-0000» e quem procura digita «99999» ou
189
+ * «11999990000», e uma comparação sobre o texto formatado não casaria nenhum
190
+ * dos dois.
191
+ *
192
+ * O número de PESSOAS entra também, mas só quando o termo é um número puro e
193
+ * curto: buscar «4» numa fila cheia acha os grupos de quatro, que é a pergunta
194
+ * de quem acabou de liberar uma mesa de quatro. Não vale para termo com letra,
195
+ * senão «4 pessoas» casaria com qualquer coisa.
196
+ */
197
+ export declare function entryMatches(row: {
198
+ name?: string | null;
199
+ phone?: string | null;
200
+ party?: number;
201
+ }, term: string): boolean;
202
+ /**
203
+ * O vazio por FILTRO não é o vazio da fila.
204
+ *
205
+ * «Ninguém na fila» quer dizer *a casa está tranquila*; «Nada com “ana”» quer
206
+ * dizer *apague o que você digitou*. Dizer a primeira frase quando a causa é a
207
+ * segunda faz o anfitrião concluir que o grupo sumiu — e ele acabou de pôr o
208
+ * grupo ali.
209
+ */
210
+ export declare function filteredEmptyHint(term: string): string;
211
+ //# sourceMappingURL=waitlist.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"waitlist.d.ts","sourceRoot":"","sources":["../../src/screen/waitlist.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ export declare function isTechnical(message: string): boolean;
2
+ /** A frase genérica. Não pede para tentar de novo: pode ter gravado. */
3
+ export declare const WRITE_FAILED = "N\u00E3o foi poss\u00EDvel concluir a opera\u00E7\u00E3o. Confira a comanda antes de repetir.";
4
+ /** A rede caiu — e aí repetir é seguro, porque nada chegou ao servidor. */
5
+ export declare const OFFLINE_FAILED = "Sem conex\u00E3o com o servidor. Verifique a rede e tente novamente.";
6
+ /**
7
+ * As duas situações que o V1 nomeia e que o V2 também alcança escrevendo
8
+ * direto. As frases são dele, palavra por palavra.
9
+ */
10
+ export declare const ALREADY_DONE = "A tentativa foi reutilizada com dados diferentes. Feche e abra a opera\u00E7\u00E3o novamente.";
11
+ export declare const NOT_ALLOWED = "Voc\u00EA n\u00E3o tem permiss\u00E3o para esta opera\u00E7\u00E3o. Pe\u00E7a a um gerente.";
12
+ /**
13
+ * A frase para a tela, e o que registrar no console.
14
+ *
15
+ * `technical` é `undefined` quando a mensagem já era nossa — aí ela vai para a
16
+ * tela como está e não há nada a registrar.
17
+ */
18
+ export declare function writeFailure(error: unknown): {
19
+ text: string;
20
+ technical?: string;
21
+ };
22
+ //# sourceMappingURL=writeFailure.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"writeFailure.d.ts","sourceRoot":"","sources":["../../src/screen/writeFailure.ts"],"names":[],"mappings":"AAsCA,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAEpD;AAED,wEAAwE;AACxE,eAAO,MAAM,YAAY,kGACoD,CAAA;AAE7E,2EAA2E;AAC3E,eAAO,MAAM,cAAc,yEACwC,CAAA;AAEnE;;;GAGG;AACH,eAAO,MAAM,YAAY,mGAC+D,CAAA;AACxF,eAAO,MAAM,WAAW,gGACyC,CAAA;AAEjE;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,CAejF"}
@@ -0,0 +1,75 @@
1
+ import { type Box, type Point } from './floorGeometry';
2
+ /** As três ferramentas do V1, com o nome que cada uma grava em `shape`. */
3
+ export type ZoneTool = 'rectangle' | 'ellipse' | 'polygon';
4
+ /** A paleta do V1 (`SectionEditor.DEFAULT_COLORS`), na ordem. */
5
+ export declare const ZONE_COLORS: string[];
6
+ export interface ZoneFields {
7
+ name: string;
8
+ color: string;
9
+ shape: ZoneTool;
10
+ sortOrder: number;
11
+ posX?: number;
12
+ posY?: number;
13
+ widthM?: number;
14
+ heightM?: number;
15
+ polygon?: Point[];
16
+ /** As mesas que caíram dentro do desenho — o palco preenche. */
17
+ tableIds?: string[];
18
+ }
19
+ export type ZoneDraft = {
20
+ ok: true;
21
+ fields: ZoneFields;
22
+ }
23
+ /** A recusa, com as palavras do V1 — título e explicação do gesto. */
24
+ | {
25
+ ok: false;
26
+ title: string;
27
+ detail: string;
28
+ };
29
+ /**
30
+ * O próximo nome livre.
31
+ *
32
+ * Começa em `praças + 1` e anda enquanto o nome estiver tomado — por uma praça
33
+ * OU por um ambiente.
34
+ */
35
+ export declare function nextZoneName(zones: Array<{
36
+ name: string;
37
+ }>, areas?: Array<{
38
+ name: string;
39
+ }>): string;
40
+ /** A cor roda pela paleta na ordem em que as praças foram criadas. */
41
+ export declare function nextZoneColor(zones: unknown[]): string;
42
+ /**
43
+ * O gesto vira praça — ou vira recusa.
44
+ *
45
+ * `box` é o bbox do arrasto (retângulo e elipse); `stroke` é o traço cru da
46
+ * mão livre. Só um dos dois importa, conforme a ferramenta.
47
+ */
48
+ export declare function zoneFromDrawing(tool: ZoneTool, { box, stroke, zones, areas }: {
49
+ box: Box | null;
50
+ stroke: Point[];
51
+ zones: Array<{
52
+ name: string;
53
+ }>;
54
+ areas?: Array<{
55
+ name: string;
56
+ }>;
57
+ }): ZoneDraft;
58
+ /** A área que a praça ocupa, para a ficha dizer o tamanho do desenho. */
59
+ export declare function zoneArea(f: Pick<ZoneFields, 'shape' | 'widthM' | 'heightM' | 'polygon'>): number;
60
+ /**
61
+ * Que mesas a praça PEGOU.
62
+ *
63
+ * No V1 quem responde isto é um gatilho no banco; aqui responde a geometria,
64
+ * que já está toda em metros no palco. A conta é a mesma — o centro da mesa
65
+ * dentro do desenho — e fica num lugar só, ao lado do desenho que a originou,
66
+ * em vez de virar um segundo dialeto de geometria dentro do SQL.
67
+ *
68
+ * `centers` são os centros em metros ABSOLUTOS: a praça cruza ambientes, e
69
+ * uma coordenada local ao ambiente responderia à pergunta errada.
70
+ */
71
+ export declare function tablesInZone(f: Pick<ZoneFields, 'shape' | 'posX' | 'posY' | 'widthM' | 'heightM' | 'polygon'>, centers: Array<{
72
+ id: string;
73
+ center: Point;
74
+ }>): string[];
75
+ //# sourceMappingURL=zoneDraft.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zoneDraft.d.ts","sourceRoot":"","sources":["../../src/screen/zoneDraft.ts"],"names":[],"mappings":"AAuBA,OAAO,EAEL,KAAK,GAAG,EAAE,KAAK,KAAK,EACrB,MAAM,iBAAiB,CAAA;AAExB,2EAA2E;AAC3E,MAAM,MAAM,QAAQ,GAAG,WAAW,GAAG,SAAS,GAAG,SAAS,CAAA;AAE1D,iEAAiE;AACjE,eAAO,MAAM,WAAW,UAEvB,CAAA;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,QAAQ,CAAA;IACf,SAAS,EAAE,MAAM,CAAA;IACjB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,OAAO,CAAC,EAAE,KAAK,EAAE,CAAA;IACjB,gEAAgE;IAChE,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;CACpB;AAED,MAAM,MAAM,SAAS,GACjB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,UAAU,CAAA;CAAE;AAClC,sEAAsE;GACpE;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAA;AAIhD;;;;;GAKG;AACH,wBAAgB,YAAY,CAC1B,KAAK,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,EAC9B,KAAK,GAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAM,GAClC,MAAM,CAKR;AAED,sEAAsE;AACtE,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,MAAM,CAEtD;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,QAAQ,EACd,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;IAC7B,GAAG,EAAE,GAAG,GAAG,IAAI,CAAA;IACf,MAAM,EAAE,KAAK,EAAE,CAAA;IACf,KAAK,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IAC9B,KAAK,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAChC,GACA,SAAS,CAkCX;AAED,yEAAyE;AACzE,wBAAgB,QAAQ,CAAC,CAAC,EAAE,IAAI,CAAC,UAAU,EAAE,OAAO,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,CAAC,GAAG,MAAM,CAIhG;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,YAAY,CAC1B,CAAC,EAAE,IAAI,CAAC,UAAU,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,CAAC,EACjF,OAAO,EAAE,KAAK,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,KAAK,CAAA;CAAE,CAAC,GAC5C,MAAM,EAAE,CAUV"}
@@ -0,0 +1,56 @@
1
+ import { type Box, type Point } from './floorGeometry';
2
+ /** A praça, do ponto de vista da geometria. */
3
+ export interface ZoneGeometry {
4
+ /** Quais mesas a praça pegou, recalculado quando a geometria muda. */
5
+ tableIds?: string[];
6
+ shape?: 'rect' | 'rectangle' | 'ellipse' | 'polygon' | null;
7
+ posX?: number | null;
8
+ posY?: number | null;
9
+ widthM?: number | null;
10
+ heightM?: number | null;
11
+ polygon?: Point[] | null;
12
+ }
13
+ /**
14
+ * A caixa da praça.
15
+ *
16
+ * `null` quando não há geometria nenhuma: uma praça pode existir só para
17
+ * filtrar a lista de mesas, sem nunca ter sido desenhada — e aí não se
18
+ * desenha, em vez de virar um retângulo de zero por zero no canto do salão.
19
+ */
20
+ export declare function zoneBounds(z: ZoneGeometry): Box | null;
21
+ /** A praça deslocada — polígono anda ponto a ponto, caixa anda pela origem. */
22
+ export declare function moveZone<T extends ZoneGeometry>(z: T, delta: Point): T;
23
+ /**
24
+ * O patch de um movimento — só os campos daquela forma.
25
+ *
26
+ * O polígono manda vértices; a caixa manda origem. Misturar os dois apagaria
27
+ * a geometria da outra forma.
28
+ */
29
+ export declare function movePatch(z: ZoneGeometry): Partial<ZoneGeometry>;
30
+ /** O patch de um esticão: a caixa inteira, arredondada ao centímetro. */
31
+ export declare function resizePatch(box: Box): Partial<ZoneGeometry>;
32
+ /**
33
+ * O contorno que o banco aceitaria — e, quando não, POR QUE não.
34
+ *
35
+ * Devolver a frase junto é o ponto: «inválido» manda o operador adivinhar qual
36
+ * das três regras ele encostou.
37
+ */
38
+ export declare function polygonRefusal(points: Point[], { removing }?: {
39
+ removing?: boolean | undefined;
40
+ }): string | null;
41
+ /** O que o toque na mesa faz, no modo «escolher na planta». */
42
+ export type ZoneMembershipAction = 'include' | 'exclude' | 'reset';
43
+ /**
44
+ * Três saídas, não duas — e a do meio é a que o V1 teve de explicar.
45
+ *
46
+ * Repor uma mesa que ESTÁ dentro do desenho é **desfazer a exclusão**, e não
47
+ * fixá-la à mão: ela volta a seguir a geometria. Marcá-la como manual pregaria
48
+ * a mesa na praça para sempre, e quem só quis desfazer um clique errado
49
+ * descobriria isso meses depois, ao mover a praça e ver a mesa ficar para trás.
50
+ *
51
+ * `include` é o caso genuinamente manual: a mesa está FORA do desenho e mesmo
52
+ * assim é desta praça — a mesa encostada na borda, o canto que o contorno não
53
+ * pegou. Aí sim a decisão é de gente, e o recálculo não pode desfazê-la.
54
+ */
55
+ export declare function zoneToggleAction(isMember: boolean, insideGeometry: boolean): ZoneMembershipAction;
56
+ //# sourceMappingURL=zoneEditing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zoneEditing.d.ts","sourceRoot":"","sources":["../../src/screen/zoneEditing.ts"],"names":[],"mappings":"AAkBA,OAAO,EAEL,KAAK,GAAG,EAAE,KAAK,KAAK,EACrB,MAAM,iBAAiB,CAAA;AAExB,+CAA+C;AAC/C,MAAM,WAAW,YAAY;IAC3B,sEAAsE;IACtE,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;IACnB,KAAK,CAAC,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS,GAAG,SAAS,GAAG,IAAI,CAAA;IAC3D,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,OAAO,CAAC,EAAE,KAAK,EAAE,GAAG,IAAI,CAAA;CACzB;AAID;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,CAAC,EAAE,YAAY,GAAG,GAAG,GAAG,IAAI,CAStD;AAED,+EAA+E;AAC/E,wBAAgB,QAAQ,CAAC,CAAC,SAAS,YAAY,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,GAAG,CAAC,CAItE;AAED;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC,CAIhE;AAED,yEAAyE;AACzE,wBAAgB,WAAW,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,YAAY,CAAC,CAE3D;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE,QAAgB,EAAE;;CAAK,GAAG,MAAM,GAAG,IAAI,CAYxF;AAED,+DAA+D;AAC/D,MAAM,MAAM,oBAAoB,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,CAAA;AAElE;;;;;;;;;;;GAWG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,OAAO,EAAE,cAAc,EAAE,OAAO,GAAG,oBAAoB,CAGjG"}