@fayz-ai/pos 0.20.5 → 0.21.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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 +10857 -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 +49 -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/styles.css CHANGED
@@ -24,6 +24,19 @@
24
24
  --pos-line: #242427; /* hairline between regions */
25
25
  --pos-line-strong: #35353A; /* control borders */
26
26
 
27
+ /* --- o véu, a cortina e a sombra --------------------------------------
28
+ Três coisas que o CSS costuma escrever à mão como `rgba(255,255,255,.06)`
29
+ ou `rgba(0,0,0,.5)` — e que, escritas à mão, PRENDEM a folha ao fundo
30
+ escuro: clarear é o gesto certo sobre carvão e o errado sobre papel.
31
+ Como token, a pele clara inverte o véu num lugar só. */
32
+ --pos-veil: rgba(255, 255, 255, 0.06); /* preenchimento de campo */
33
+ --pos-veil-2: rgba(255, 255, 255, 0.09); /* o mesmo, sob o cursor */
34
+ --pos-veil-3: rgba(255, 255, 255, 0.28); /* alça, divisórias sobre vidro */
35
+ --pos-scrim: rgba(0, 0, 0, 0.45); /* cortina atrás de uma folha */
36
+ --pos-shadow: rgba(0, 0, 0, 0.55); /* sombra projetada */
37
+ --pos-shadow-strong: rgba(0, 0, 0, 0.8); /* foco e cartão levantado */
38
+ --pos-primary-hover: color-mix(in srgb, var(--pos-primary) 88%, #FFF); /* mais vivo */
39
+
27
40
  /* --- text: three steps, all AA on --pos-1 or darker ------------------- */
28
41
  --pos-fg: #F7F7F8;
29
42
  --pos-fg-2: #A0A0A6;
@@ -39,34 +52,109 @@
39
52
  --pos-accent-dim: #1C2436;
40
53
  --pos-primary: #F7F7F8;
41
54
  --pos-primary-fg: #121214;
42
-
43
- /* --- status: its own language, always paired with icon + word --------- */
44
- --pos-ok: #4AA76C;
45
- --pos-warn: #D3982F;
55
+ /* A tinta sobre o card já lançado. No escuro o preenchimento é o matiz a
56
+ 26%, e é o CLARO que cabe em cima (6,9:1). */
57
+ --pos-on-filled: #F7F7F8;
58
+
59
+ /* --- status: its own language, always paired with icon + word ---------
60
+ OS NÚMEROS SÃO OS DO V1, decisão do founder em 29-09.
61
+ O V2 vinha com variantes mais surdas (#4AA76C, #D3982F, #E0722F, #DC5C55)
62
+ e uma razão escrita: cor forte em meia sala atrasada faz nada chamar. O
63
+ founder preferiu paridade literal, então aqui estão os tokens dele em
64
+ `hsl()` — e não convertidos para hex — para ficarem conferíveis contra
65
+ `beautyplace/src/index.css` linha por linha.
66
+ Este é o tema ESCURO, então vêm de `.dark` do V1 onde ele sobrescreve;
67
+ `--success` e `--warning` ele não sobrescreve, e herdam o `:root`. */
68
+ --pos-ok: hsl(142 76% 36%); /* V1 --success (:root) */
69
+ --pos-warn: hsl(38 92% 50%); /* V1 --warning (:root) */
70
+ /* «Atrasada»: entre o âmbar de ocupada e o vermelho de parada. O V1 tem um
71
+ token só para isto (`--late`), e sem ele os dois estados colapsam num. */
72
+ /* `24 85% 45%` = #D45F11. Contraste com o rótulo BRANCO do glifo: 3,86:1 —
73
+ MELHOR que o #E0722F que estava aqui (2,98:1), porque escurecer o fundo
74
+ aumenta o contraste com texto claro. Abaixo de 4,5:1 (texto normal) e acima
75
+ de 3:1 (texto grande), que é o caso: o número da mesa é desenhado grande no
76
+ `<svg>`. Eu tinha anotado o contrário no commit dos tons; era engano. */
77
+ --pos-late: hsl(24 85% 45%); /* V1 --late (.dark) */
46
78
  --pos-info: #5B8DEF;
47
- --pos-danger: #DC5C55;
48
-
49
- /* --- category identity: assigned per category by data, never a status --
50
- Saturados, na mesma força do mapa de mesas. Os pastéis vinham de quando o
51
- salão também era discreto; com as mesas pintadas em cheio, uma grade de
52
- cartões leitosos ao lado lia como outra tela, de outro produto.
53
- Continuam LONGE dos quatro tons de status em matiz — nenhum verde-livre,
54
- nenhum vermelho-atenção — porque cor aqui é identidade de categoria e lá é
55
- estado; iguais, a mesma mancha significaria duas coisas na mesma sessão.
56
- Todos escuros o bastante para texto `--pos-on-light` por cima passar AA. */
57
- --pos-tone-mint: #59C08A;
58
- --pos-tone-lilac: #A98BE0;
59
- --pos-tone-sky: #4FA3DE;
60
- --pos-tone-periwinkle: #7B86E4;
61
- --pos-tone-blush: #E0719E;
62
- --pos-tone-sand: #C9A268;
63
- --pos-tone-teal: #3FB8A0;
64
- --pos-tone-rose: #E07A6B;
65
-
66
- /* --- shape: softer than an instrument panel, tighter than a phone app -- */
67
- --pos-r: 10px;
68
- --pos-r-sm: 7px;
69
- --pos-r-xs: 5px;
79
+ --pos-danger: hsl(0 62.8% 30.6%);/* V1 --destructive (.dark) */
80
+
81
+ /* --- identidade de categoria: as SEIS cores do cardápio do V1 ----------
82
+ Aqui a cor não SINALIZA estado, como no salão — ela IDENTIFICA a família,
83
+ e identificador se decora: o garçom aprende "verde é almoço" e para de ler
84
+ o rótulo. Isso muda o registro exigido.
85
+
86
+ Por que sólida a 50% e não pastel: um tint de 14% sobre o quase-preto
87
+ sobrevive no escritório e converge para cinza no salão com sol, porque a
88
+ reflexão do ambiente lava a cromaticidade antes de lavar a luminosidade —
89
+ e cor que converge não se decora. Sólido a 50% é menos luminoso que o
90
+ pastel (0,45 contra 0,65 de luminância) e muito mais cromático: menos
91
+ brilho, mais cor.
92
+
93
+ Portado literal de `beautyplace/src/components/orders/ProductCatalog.tsx`,
94
+ matiz por matiz. */
95
+ --pos-tone-mint: hsl(145 60% 50%); /* verde */
96
+ --pos-tone-blush: hsl(340 68% 50%); /* rosa */
97
+ --pos-tone-sky: hsl(213 70% 50%); /* azul */
98
+ --pos-tone-sand: hsl(38 85% 50%); /* âmbar */
99
+ --pos-tone-teal: hsl(172 62% 50%); /* turquesa */
100
+ --pos-tone-lilac: hsl(270 58% 50%); /* roxo */
101
+ /* As duas sobras da paleta antiga, mantidas para cardápio com mais de seis
102
+ categorias — a rotação continua e ninguém fica sem cor. */
103
+ --pos-tone-periwinkle: hsl(255 62% 50%);
104
+ --pos-tone-rose: hsl(12 68% 50%);
105
+
106
+ /* O card do produto JÁ LANÇADO na comanda: o mesmo matiz rebaixado até a
107
+ tinta voltar a caber em cima. No escuro desce a 26%; no claro SOBE a 86%,
108
+ porque a tinta que tem de caber é a escura — num cardápio claro, o item
109
+ lançado ficar mais escuro que a folha é o que o olho lê como "este
110
+ entrou". Preencher com a cor CHEIA transformava o card num bloco sólido,
111
+ que foi o "layout quebrando ao marcar o item". */
112
+ --pos-tone-mint-on: hsl(145 45% 26%);
113
+ --pos-tone-blush-on: hsl(340 53% 26%);
114
+ --pos-tone-sky-on: hsl(213 55% 26%);
115
+ --pos-tone-sand-on: hsl(38 70% 26%);
116
+ --pos-tone-teal-on: hsl(172 47% 26%);
117
+ --pos-tone-lilac-on: hsl(270 43% 26%);
118
+ --pos-tone-periwinkle-on: hsl(255 47% 26%);
119
+ --pos-tone-rose-on: hsl(12 53% 26%);
120
+
121
+ /* --- shape ------------------------------------------------------------
122
+ UM número manda em todas as quinas do PDV.
123
+ Antes havia 108 `border-radius` no arquivo, dezoito valores diferentes —
124
+ 10px, 9px, 8px, 6px, 50%, 999px — e mudar o desenho do produto era caçar
125
+ um por um, deixando sempre algum para trás. Agora as quatro variáveis
126
+ derivam de `--pos-radius`: zero deixa tudo reto, `10px` devolve o
127
+ arredondado de antes, e a decisão é um toque.
128
+
129
+ `--pos-r-pill` (cápsulas: pastilhas, selos, a chave de modo) e
130
+ `--pos-r-round` (o que é círculo de verdade: avatar, ponto de estado)
131
+ seguem o mesmo botão por padrão, e podem ser soltos do conjunto se a casa
132
+ quiser cápsula redonda num produto de quinas retas. */
133
+ /* --- vidro ------------------------------------------------------------
134
+ As superfícies que FLUTUAM sobre o conteúdo — o cabeçalho, a régua de
135
+ categorias, a bandeja de comandas, o filtro de praças — usam o mesmo
136
+ vidro, e ele sai de três números. Mexer aqui muda as quatro de uma vez,
137
+ em vez de caçar `backdrop-filter` espalhado pelo arquivo.
138
+
139
+ `saturate` é o que separa vidro de fumaça: sem ele o desfoque só apaga o
140
+ que está atrás. `--pos-glass-bg` é a opacidade da camada — quanto mais
141
+ baixa, mais o salão aparece por trás. */
142
+ --pos-glass-blur: 22px;
143
+ --pos-glass-sat: 1.9;
144
+ --pos-glass-bg: 56%;
145
+
146
+ --pos-radius: 0px;
147
+ /* A folha que sobe do rodapé fica FORA do botão de quina da casa, de
148
+ propósito: a quina arredondada no topo de um bottom sheet é o que faz o
149
+ polegar ler "isto sobe e desce" antes de qualquer rótulo, e é convenção de
150
+ sistema (iOS), não escolha de marca. Quadrá-la junto com o resto faria a
151
+ folha parecer uma tela que colou no fundo. */
152
+ --pos-r-drawer: 18px;
153
+ --pos-r: var(--pos-radius);
154
+ --pos-r-sm: var(--pos-radius);
155
+ --pos-r-xs: var(--pos-radius);
156
+ --pos-r-pill: var(--pos-radius);
157
+ --pos-r-round: var(--pos-radius);
70
158
 
71
159
  /* --- rhythm: 4px base, and nothing off it ----------------------------- */
72
160
  --pos-1x: 4px; --pos-2x: 8px; --pos-3x: 12px;
@@ -97,6 +185,87 @@
97
185
  --pos-safe-b: env(safe-area-inset-bottom, 0px);
98
186
  --pos-safe-l: env(safe-area-inset-left, 0px);
99
187
 
188
+ }
189
+
190
+ /* ---------------------------------------------------------------------------
191
+ A pele clara.
192
+
193
+ O PDV nasceu escuro (referência CosyPOS) porque um terminal dedicado vive
194
+ sozinho num balcão. Mas ele também abre POR CIMA da retaguarda, e ali o
195
+ operador estava numa tela clara meio segundo antes — a troca de fundo lê
196
+ como "troquei de programa", não como "troquei de lado da mesma casa". O V1
197
+ resolveu assim, e é o que se porta.
198
+
199
+ Só COR muda. Alturas de toque, ritmo, raio, tempo e curva são os mesmos: a
200
+ pele não é um segundo design system, é a mesma peça sob outra luz.
201
+
202
+ O véu inverte — sobre papel, "mais claro" não destaca nada, então o campo
203
+ afunda em vez de subir. A sombra afrouxa, porque sombra forte sobre branco
204
+ lê como sujeira. E o primário deixa de ser branco: numa tela clara a coisa
205
+ mais brilhante não pode ser o botão, tem de ser o papel.
206
+ --------------------------------------------------------------------------- */
207
+ .pos.pos-light {
208
+ --pos-0: #F6F5F2; /* canvas — o papel quente da retaguarda, não branco */
209
+ --pos-1: #FFFFFF; /* painéis, trilha */
210
+ --pos-2: #FFFFFF; /* cartões sobre painel — separados por borda, não */
211
+ --pos-3: #F1EFEA; /* hover / cartão levantado */
212
+ --pos-4: #E7E4DD; /* pressionado / selecionado */
213
+
214
+ --pos-line: #E4E1DA;
215
+ --pos-line-strong: #C8C4BA;
216
+
217
+ --pos-fg: #1C1B18;
218
+ --pos-fg-2: #6B6862;
219
+ --pos-fg-3: #97938B;
220
+ /* Sobre um tom saturado o texto continua sendo o quase-preto: os tons de
221
+ categoria não clareiam junto com o fundo. */
222
+ --pos-on-light: #121214;
223
+
224
+ --pos-accent: #2F6FB5;
225
+ --pos-accent-fg: #FFFFFF;
226
+ --pos-accent-dim: #E3ECF7;
227
+ /* O primário é a tinta, não o papel. */
228
+ --pos-primary: #1C1B18;
229
+ --pos-primary-fg: #FFFFFF;
230
+ /* O hover DERIVA do primário, e não é um hex próprio.
231
+ Com um valor fixo, quem troca a marca troca só metade: o ChefControl
232
+ redefine `--pos-primary` para o Ouro e o hover continuava o preto do tema
233
+ — um botão dourado que ficava PRETO ao passar o mouse. Escurecer o próprio
234
+ primário funciona para qualquer marca, inclusive as que ainda não
235
+ existem. */
236
+ --pos-primary-hover: color-mix(in srgb, var(--pos-primary) 86%, #000);
237
+
238
+ /* Tema CLARO: os tokens do `:root` do V1, verbatim. */
239
+ --pos-ok: hsl(142 76% 36%); /* V1 --success */
240
+ --pos-warn: hsl(38 92% 50%); /* V1 --warning */
241
+ --pos-late: hsl(24 95% 50%); /* V1 --late */
242
+ --pos-info: #2F6FB5;
243
+ --pos-danger: hsl(0 84% 60%); /* V1 --destructive → --error (:root) */
244
+
245
+ /* O véu escurece em vez de clarear. */
246
+ --pos-veil: rgba(0, 0, 0, 0.04);
247
+ --pos-veil-2: rgba(0, 0, 0, 0.07);
248
+ --pos-veil-3: rgba(0, 0, 0, 0.18);
249
+ --pos-scrim: rgba(28, 27, 24, 0.32);
250
+ --pos-shadow: rgba(28, 27, 24, 0.14);
251
+ --pos-shadow-strong: rgba(28, 27, 24, 0.22);
252
+
253
+ /* O item lançado, sob a luz clara: o tint SOBE a 86% em vez de descer a
254
+ 26%. Mesmo gesto, outra direção — num cardápio claro, o item lançado
255
+ ficar mais escuro que a folha é o que o olho lê como "este entrou". */
256
+ --pos-tone-mint-on: hsl(145 50% 86%);
257
+ --pos-tone-blush-on: hsl(340 58% 86%);
258
+ --pos-tone-sky-on: hsl(213 60% 86%);
259
+ --pos-tone-sand-on: hsl(38 75% 86%);
260
+ --pos-tone-teal-on: hsl(172 52% 86%);
261
+ --pos-tone-lilac-on: hsl(270 48% 86%);
262
+ --pos-tone-periwinkle-on: hsl(255 52% 86%);
263
+ --pos-tone-rose-on: hsl(12 58% 86%);
264
+ /* E aqui o preenchimento é 86%: a tinta que cabe é a escura. */
265
+ --pos-on-filled: #101318;
266
+ }
267
+
268
+ .pos {
100
269
  position: fixed;
101
270
  /* Height, not `inset: 0`: installed on iOS the fixed box is laid out against
102
271
  the LAYOUT viewport, which stays tall when the keyboard is up — the dock
@@ -146,6 +315,15 @@
146
315
  @media (prefers-reduced-motion: reduce) {
147
316
  .pos *, .pos *::before, .pos *::after {
148
317
  transition-duration: 0.01ms !important; animation-duration: 0.01ms !important;
318
+ /* O ATRASO também, e não só a duração.
319
+ *
320
+ * A entrada dos cartões (`pos-card-in`) usa `animation-fill-mode: backwards`
321
+ * com `animation-delay: var(--pos-stagger)`: antes da sua vez, o cartão
322
+ * segura o estado inicial, que é `opacity: 0`. Zerar só a duração deixava o
323
+ * atraso de pé — até 220 ms de cardápio INVISÍVEL para quem pediu para não
324
+ * ter movimento. Quem desliga a animação espera ver a tela, não esperar por
325
+ * ela. */
326
+ animation-delay: 0ms !important;
149
327
  }
150
328
  }
151
329
 
@@ -156,7 +334,7 @@
156
334
  scrollbar-width: thin; scrollbar-color: var(--pos-line-strong) transparent;
157
335
  }
158
336
  .pos-scroll::-webkit-scrollbar { width: 10px; height: 10px; }
159
- .pos-scroll::-webkit-scrollbar-thumb { background: var(--pos-line-strong); border-radius: 5px; border: 3px solid transparent; background-clip: padding-box; }
337
+ .pos-scroll::-webkit-scrollbar-thumb { background: var(--pos-line-strong); border-radius: var(--pos-r-xs); border: 3px solid transparent; background-clip: padding-box; }
160
338
  .pos-scroll::-webkit-scrollbar-track { background: transparent; }
161
339
 
162
340
  /* --- type scale ---------------------------------------------------------
@@ -183,7 +361,7 @@
183
361
  background: var(--pos-2); font-size: 13px; color: var(--pos-fg-2);
184
362
  }
185
363
  .pos-pill strong { color: var(--pos-fg); font-weight: 600; }
186
- .pos-pill__dot { width: 7px; height: 7px; border-radius: 50%; flex: none; }
364
+ .pos-pill__dot { width: 7px; height: 7px; border-radius: var(--pos-r-round); flex: none; }
187
365
  .pos-pill[data-state='online'] .pos-pill__dot { background: var(--pos-ok); }
188
366
  .pos-pill[data-state='reconnecting'] .pos-pill__dot { background: var(--pos-warn); }
189
367
  .pos-pill[data-state='offline'] .pos-pill__dot { background: var(--pos-danger); }
@@ -192,7 +370,12 @@
192
370
 
193
371
  .pos-body {
194
372
  display: grid;
195
- grid-template-columns: 232px minmax(0, 1fr) 400px;
373
+ /* 224px é a trilha da RETAGUARDA (`w-56` do AdminShell), e as duas têm de
374
+ ser a mesma largura. Em 232px o seletor de conta e a chave de modo nasciam
375
+ 7px mais largos no PDV que na retaguarda — e como são a MESMA peça nos
376
+ dois lados, atravessar de um para o outro fazia os dois controles saltarem
377
+ de tamanho debaixo do dedo. Trocar de modo não pode mexer a mobília. */
378
+ grid-template-columns: 224px minmax(0, 1fr) 400px;
196
379
  min-height: 0; overflow: hidden; position: relative;
197
380
  transition: grid-template-columns 200ms var(--pos-e);
198
381
  }
@@ -239,25 +422,40 @@
239
422
  .pos-nav__text { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
240
423
  .pos-nav__count {
241
424
  margin-left: auto; min-width: 22px; height: 20px; padding: 0 6px;
242
- display: grid; place-items: center; border-radius: 10px;
425
+ display: grid; place-items: center; border-radius: var(--pos-r);
243
426
  background: var(--pos-3); color: var(--pos-fg-2); font-size: 12px; font-weight: 650;
244
427
  }
245
428
  .pos-nav__item[aria-current='page'] .pos-nav__count { background: color-mix(in srgb, var(--pos-accent) 32%, transparent); color: var(--pos-fg); }
246
429
 
247
430
  /* Uma fenda para o host pôr o que diz onde esta tela ESTÁ (a chave Balcão ⇄
248
431
  Retaguarda de quem abre o PDV de dentro de um back office). */
249
- .pos-rail__top { padding: var(--pos-2x) var(--pos-1x) 0; }
432
+ /* Sem recuo lateral próprio: o rail já tem o dele, e um segundo empurrão aqui
433
+ punha o seletor de conta 4px à direita de tudo o que vem abaixo — enquanto a
434
+ chave de modo, que NÃO é filha desta caixa, ficava 8px mais larga e vazava
435
+ para fora do rail. Três larguras diferentes na mesma coluna de 208px.
436
+ Agora conta, chave, busca e menu compartilham a mesma margem. */
437
+ /* Sem respiro próprio: os 12px do `.pos-rail` são os mesmos 12px do `pt-3` da
438
+ trilha da retaguarda, e os 8px daqui empurravam o seletor de conta do PDV
439
+ para baixo do da retaguarda. As duas peças são a MESMA, e atravessar de um
440
+ modo para o outro não pode mexê-las de lugar. */
441
+ /* Sem respiro ACIMA — os 12px do `.pos-rail` já são os 12px do `pt-3` da
442
+ trilha da retaguarda — e 8px ENTRE as duas peças, que é o vão que a
443
+ retaguarda tem entre o seletor de conta e a chave de modo. As duas peças são
444
+ as MESMAS nos dois modos, e atravessar de um para o outro não pode mexê-las
445
+ de lugar. */
446
+ .pos-rail__top { display: grid; gap: var(--pos-2x); padding: 0; }
447
+ .pos-rail__top > * { width: 100%; }
250
448
 
251
449
  /* A busca, logo abaixo daquela chave. Só existe com a trilha por extenso: numa
252
450
  trilha de 68px de ícones o campo não cabe, e ali ele volta para a faixa da
253
451
  view (ver `useWideRail` na tela). */
254
- .pos-rail__search { padding: var(--pos-2x) var(--pos-1x) var(--pos-1x); }
452
+ .pos-rail__search { padding: var(--pos-2x) 0 var(--pos-1x); }
255
453
 
256
454
  /* O disco com a inicial de quem atende. Sobrou da lista de turno que saiu do
257
455
  rail — a escolha do atendente ao abrir a mesa ainda o usa. */
258
456
  .pos-person__av {
259
457
  width: 28px; height: 28px; flex: none; display: grid; place-items: center;
260
- border-radius: 50%; font-size: 12px; font-weight: 700; color: #101318;
458
+ border-radius: var(--pos-r-round); font-size: 12px; font-weight: 700; color: #101318;
261
459
  }
262
460
 
263
461
  /* --- content ------------------------------------------------------------ */
@@ -284,7 +482,10 @@
284
482
  min-height: 69px; padding: var(--pos-3x) var(--pos-6x);
285
483
  display: flex; align-items: center; justify-content: center; gap: var(--pos-3x);
286
484
  border-top: 1px solid var(--pos-line);
287
- background: rgba(11, 11, 12, 0.88);
485
+ /* A faixa toma a cor do TEMA. Era `rgba(11,11,12,.88)` cravado — uma barra
486
+ preta atravessada no PDV claro, e o aviso "1 pedido enviado à cozinha"
487
+ saía em tinta escura sobre tinta escura. */
488
+ background: color-mix(in srgb, var(--pos-1) 88%, transparent);
288
489
  -webkit-backdrop-filter: blur(20px) saturate(130%);
289
490
  backdrop-filter: blur(20px) saturate(130%);
290
491
  font-size: 16px; font-weight: 600; letter-spacing: -0.014em; color: var(--pos-fg);
@@ -296,7 +497,7 @@
296
497
  }
297
498
  .pos-notice[data-leaving='true'] { animation: pos-notice-out 260ms var(--pos-e) both; }
298
499
  .pos-notice__i {
299
- width: 30px; height: 30px; flex: none; border-radius: 50%;
500
+ width: 30px; height: 30px; flex: none; border-radius: var(--pos-r-round);
300
501
  display: grid; place-items: center;
301
502
  background: var(--pos-3); color: var(--pos-fg);
302
503
  }
@@ -335,7 +536,16 @@
335
536
  ponta, ficava por baixo do botão. Fora de um takeover a variável não
336
537
  existe e o valor cai em 0. */
337
538
  padding: 0 calc(var(--pos-4x) + var(--fz-takeover-inset-right, 0px)) 0 var(--pos-4x);
338
- border-bottom: 1px solid var(--pos-line);
539
+ /* O cabeçalho é FIXO — ele fica sobre o salão enquanto as mesas rolam por
540
+ baixo. Em vidro, essa sobreposição se lê como o que é: uma camada. Opaco,
541
+ ele cortava a tela numa faixa que parecia outra seção, e o conteúdo
542
+ simplesmente sumia na borda. Mesmo conjunto da régua, da bandeja e do
543
+ filtro de praças — três números em `--pos-glass-*`. */
544
+ position: relative; z-index: 11;
545
+ background: color-mix(in srgb, var(--pos-0) var(--pos-glass-bg), transparent);
546
+ backdrop-filter: blur(var(--pos-glass-blur)) saturate(var(--pos-glass-sat));
547
+ -webkit-backdrop-filter: blur(var(--pos-glass-blur)) saturate(var(--pos-glass-sat));
548
+ border-bottom: 1px solid color-mix(in srgb, var(--pos-fg) 8%, transparent);
339
549
  }
340
550
  /* Coluna 1: a view e a unidade, lado a lado. `min-width: 0` para que seja o
341
551
  TÍTULO a encurtar com reticências, e não a unidade — o nome da unidade é o
@@ -351,12 +561,13 @@
351
561
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
352
562
  }
353
563
 
354
- .pos-seg { display: inline-flex; gap: 2px; padding: 3px; background: var(--pos-2); border-radius: 999px; }
355
- /* Título à esquerda, busca no meio, e à direita TODOS os segmentados — os de
356
- forma (Grade|Planta) e os de área (Salão|Balcão|…) numa fila só, e não um
357
- empurrando o outro para uma segunda linha. */
564
+ .pos-seg { display: inline-flex; gap: 2px; padding: 3px; background: var(--pos-2); border-radius: var(--pos-r-pill); }
565
+ /* O segmentado de forma vive na ESQUERDA da faixa, como no V1.
566
+ À direita ele ficava encostado na comanda, longe do salão que comanda — e
567
+ a leitura de uma tela de operação vai da esquerda para a direita: primeiro
568
+ "como estou vendo", depois o que está sendo visto. */
358
569
  .pos-head__views {
359
- grid-column: 3; justify-self: end;
570
+ grid-column: 1; justify-self: start;
360
571
  display: flex; align-items: center; gap: var(--pos-2x); min-width: 0;
361
572
  }
362
573
  .pos-head__views:empty { display: none; }
@@ -364,13 +575,80 @@
364
575
  coluna do meio fica vazia e o `1fr` dela é justamente o ar entre o título e
365
576
  os segmentados. */
366
577
  .pos-head > .pos-field { grid-column: 2; }
578
+ /* `inline-flex` + `nowrap`: com o ícone dentro, o botão era uma caixa de
579
+ bloco e o rótulo caía para a linha de baixo — ícone em cima, palavra
580
+ embaixo, o dobro da altura. */
367
581
  .pos-seg__btn {
368
- min-height: 36px; padding: 0 var(--pos-4x);
369
- border: none; border-radius: 999px; background: transparent;
582
+ display: inline-flex; align-items: center; gap: 6px; white-space: nowrap;
583
+ min-height: 36px; padding: 0 var(--pos-3x);
584
+ border: none; border-radius: var(--pos-r-pill); background: transparent;
370
585
  color: var(--pos-fg-2); font-size: 13px; font-weight: 550; cursor: pointer;
371
586
  transition: background var(--pos-t) var(--pos-e), color var(--pos-t) var(--pos-e);
372
587
  }
373
588
  .pos-seg__btn:hover { color: var(--pos-fg); }
589
+
590
+ /* «Descontos aplicados» — o que esta comanda já recebeu, antes de oferecer
591
+ mais um. Discreto: é contexto para a decisão, não a decisão. */
592
+ .pos-dsc__applied { display: flex; flex-direction: column; gap: 6px; }
593
+ .pos-dsc__grant {
594
+ padding: 8px 10px; border-radius: var(--pos-r-xs);
595
+ border: 1px solid color-mix(in srgb, var(--pos-primary) 22%, transparent);
596
+ background: color-mix(in srgb, var(--pos-primary) 7%, transparent);
597
+ }
598
+ .pos-dsc__grantt {
599
+ display: flex; align-items: baseline; justify-content: space-between; gap: 8px;
600
+ font-size: 13px; font-weight: 600;
601
+ }
602
+ .pos-dsc__granta { color: var(--pos-danger); white-space: nowrap; }
603
+ /* O rastro, com o «•» do V1 desenhado pela borda — sem um <span> por
604
+ separador, que some quando o campo do meio não existe. */
605
+ .pos-dsc__grantm {
606
+ display: flex; flex-wrap: wrap; gap: 4px 10px; margin-top: 3px;
607
+ font-size: 11px; color: var(--pos-fg-3);
608
+ }
609
+ .pos-dsc__grantm > * + *::before { content: '• '; }
610
+ .pos-dsc__grantmemo { font-style: italic; }
611
+
612
+ /* O socorro da taxa pendente. Âmbar como no V1 — é aviso, não erro: o caminho
613
+ normal fechou e este ainda está aberto. */
614
+ .pos-svc__waive {
615
+ display: flex; flex-direction: column; gap: 10px;
616
+ padding: 12px; border-radius: var(--pos-r);
617
+ border: 1px solid color-mix(in srgb, var(--pos-warn) 45%, transparent);
618
+ background: color-mix(in srgb, var(--pos-warn) 10%, transparent);
619
+ }
620
+ .pos-svc__waivet { font-size: 12.5px; line-height: 1.45; color: var(--pos-fg); }
621
+ .pos-svc__waiveb { width: 100%; justify-content: center; }
622
+
623
+ /* A estrela do padrão da casa. Âmbar como no V1, e alinhada ao texto —
624
+ ela qualifica o rótulo, não é um ícone de ação ao lado dele. */
625
+ .pos-svc__star { display: inline-block; margin-left: 4px; vertical-align: -1px; color: #F59E0B; }
626
+
627
+ /* A condição escrita sob o valor da cortesia — a linha do V1. Fica apagada de
628
+ propósito: é regra a saber, não aviso a atender. */
629
+ .pos-svc__note {
630
+ margin-top: 6px; font-size: 11px; line-height: 1.35; color: var(--pos-fg-3);
631
+ }
632
+ /* O contador do motivo. À direita, sob o campo, porque é sobre o que acabou de
633
+ ser digitado — e tabular para não dançar a cada tecla. */
634
+ .pos-dsc__count {
635
+ margin-top: 4px; text-align: right;
636
+ font-size: 11px; color: var(--pos-fg-3); font-variant-numeric: tabular-nums;
637
+ }
638
+
639
+ /* A variante ALTA do segmentado: rótulo em cima, a frase do V1 embaixo.
640
+ `nowrap` é do botão normal, que é de uma linha só; aqui a frase é a razão
641
+ de o botão existir e precisa caber, então a coluna empilha e o texto quebra. */
642
+ .pos-seg__btn--tall {
643
+ flex-direction: column; align-items: flex-start; gap: 2px;
644
+ white-space: normal; min-height: 48px; padding: 6px var(--pos-3x); text-align: left;
645
+ }
646
+ .pos-seg__t { font-size: 13px; font-weight: 650; }
647
+ .pos-seg__h { font-size: 11px; font-weight: 500; color: var(--pos-fg-3); line-height: 1.3; }
648
+ /* Modo sem destino possível: apagado e sem cursor, como no V1 — e a frase
649
+ embaixo continua legível, porque ela é justamente o motivo. */
650
+ .pos-seg__btn:disabled { opacity: 0.5; cursor: not-allowed; }
651
+ .pos-seg__btn:disabled:hover { background: transparent; color: var(--pos-fg-2); }
374
652
  .pos-seg__btn[aria-pressed='true'] { background: var(--pos-4); color: var(--pos-fg); }
375
653
 
376
654
  .pos-field {
@@ -388,11 +666,11 @@
388
666
  um preenchimento mais claro do mesmo tom já diz "campo" sem desenhar uma
389
667
  caixa, e deixa o contorno livre para significar FOCO, que é o que ele
390
668
  precisa significar. */
391
- border: 1px solid transparent; border-radius: 999px;
392
- background: rgba(255, 255, 255, 0.06);
669
+ border: 1px solid transparent; border-radius: var(--pos-r-pill);
670
+ background: var(--pos-veil);
393
671
  transition: background var(--pos-t) var(--pos-e), border-color var(--pos-t) var(--pos-e);
394
672
  }
395
- .pos-field:hover { background: rgba(255, 255, 255, 0.09); }
673
+ .pos-field:hover { background: var(--pos-veil-2); }
396
674
  .pos-field:focus-within {
397
675
  border-color: var(--pos-line-strong); background: var(--pos-1);
398
676
  box-shadow: 0 0 0 3px color-mix(in srgb, var(--pos-accent) 20%, transparent);
@@ -406,10 +684,36 @@
406
684
 
407
685
  /* --- floor -------------------------------------------------------------- */
408
686
 
687
+ /* O salão vem em GRUPOS — ocupadas em cima, livres embaixo —, então o
688
+ contêiner é uma coluna de seções e a grade mora dentro de cada uma. Antes
689
+ ele era a própria grade, e por isso as mesas saíam em ordem de número: numa
690
+ casa de 207 mesas, as três ocupadas ficavam enterradas no meio de duzentas
691
+ livres. */
409
692
  .pos-floor {
410
- flex: 1; display: grid; align-content: start; padding-bottom: var(--pos-6x);
411
- grid-template-columns: repeat(auto-fill, minmax(168px, 1fr));
412
- gap: var(--pos-3x); padding: var(--pos-4x);
693
+ flex: 1; display: flex; flex-direction: column; align-content: start;
694
+ gap: var(--pos-2x); padding: var(--pos-4x); padding-bottom: var(--pos-6x);
695
+ }
696
+ .pos-floor__g {
697
+ display: grid; grid-template-columns: repeat(auto-fill, minmax(168px, 1fr));
698
+ gap: var(--pos-3x);
699
+ }
700
+ /* O cabeçalho do grupo: ponto, contagem e — só nas ocupadas — a média.
701
+ Versalete e pequeno: ele organiza, não compete com o número da mesa. */
702
+ .pos-floor__h {
703
+ display: flex; align-items: center; gap: var(--pos-2x);
704
+ padding: var(--pos-2x) 2px var(--pos-1x);
705
+ }
706
+ .pos-floor__h + .pos-floor__g { margin-bottom: var(--pos-3x); }
707
+ .pos-floor__dot { width: 8px; height: 8px; border-radius: var(--pos-r-round); flex: none; }
708
+ .pos-floor__h[data-tone='busy'] .pos-floor__dot { background: var(--pos-warn); }
709
+ .pos-floor__h[data-tone='free'] .pos-floor__dot { background: var(--pos-ok); }
710
+ .pos-floor__n {
711
+ font-size: 12px; font-weight: 700; letter-spacing: 0.07em; text-transform: uppercase;
712
+ color: var(--pos-fg-2);
713
+ }
714
+ .pos-floor__x {
715
+ display: inline-flex; align-items: center; gap: 4px;
716
+ font-size: 12px; font-weight: 600; color: var(--pos-fg-3);
413
717
  }
414
718
  .pos-tbl {
415
719
  position: relative; display: flex; flex-direction: column; gap: var(--pos-2x);
@@ -427,7 +731,7 @@
427
731
  .pos-card[aria-current='true'],
428
732
  .pos-lrow[aria-current='true'] {
429
733
  border-color: var(--pos-fg); background: var(--pos-3);
430
- box-shadow: 0 0 0 2px var(--pos-fg), 0 8px 22px -8px rgba(0, 0, 0, 0.8);
734
+ box-shadow: 0 0 0 2px var(--pos-fg), 0 8px 22px -8px var(--pos-shadow-strong);
431
735
  }
432
736
  .pos-card[aria-current='true'] { --pos-edge: var(--pos-fg); }
433
737
  .pos-tbl__top { display: flex; align-items: flex-start; justify-content: space-between; gap: var(--pos-2x); }
@@ -436,7 +740,27 @@
436
740
  .pos-tbl__foot { margin-top: auto; display: flex; align-items: center; justify-content: space-between; gap: var(--pos-2x); }
437
741
  .pos-tbl__time { display: inline-flex; align-items: center; gap: 4px; font-size: 12px; color: var(--pos-fg-2); }
438
742
  .pos-tbl__total { font-size: 15px; font-weight: 650; }
439
- .pos-tbl__who { font-size: 12px; color: var(--pos-fg-3); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
743
+ /* O SELO DA SEGUNDA CONTA.
744
+ Discreto de propósito: ele não compete com o valor, que é o que o garçom
745
+ procura. Só precisa dizer «o número ao lado não é a mesa inteira». */
746
+ .pos-tbl__bills {
747
+ font-size: 11px; font-weight: 600; line-height: 1;
748
+ padding: 2px 6px; border-radius: 999px; white-space: nowrap;
749
+ /* O mesmo idioma do selo de «ocupada» logo abaixo — `--pos-warn` tem valor
750
+ claro e escuro, então o selo acompanha o tema em vez de fixar uma cor. */
751
+ color: var(--pos-warn);
752
+ background: color-mix(in srgb, var(--pos-warn) 15%, transparent);
753
+ }
754
+ /* `inline-flex`, não `block`: com a contagem de pessoas a linha ganhou um
755
+ ícone, e num contêiner de texto o SVG virava a primeira "palavra" — ele
756
+ ficava sozinho em cima e "2 pessoas" caía para a linha de baixo, ocupando
757
+ duas linhas onde o cartão só tem uma. */
758
+ .pos-tbl__who {
759
+ display: inline-flex; align-items: center; gap: 5px; min-width: 0;
760
+ font-size: 12px; color: var(--pos-fg-3);
761
+ overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
762
+ }
763
+ .pos-tbl__who > svg { flex: none; }
440
764
 
441
765
  /* One edge treatment across every card surface: the stripe is the card's own
442
766
  left edge, clipped by its radius. A `border-left` squares off against the
@@ -467,39 +791,66 @@
467
791
  * que a planta já usa, e os que passam contraste. A pastilha continua escrita,
468
792
  * porque cor sozinha nunca carrega o estado — 8% dos homens não separa
469
793
  * vermelho de verde, e um deles está no salão. */
470
- .pos-tbl[data-status='free'] {
471
- --pos-edge: var(--pos-ok);
472
- }
473
- .pos-tbl[data-status='occupied'] {
474
- --pos-edge: var(--pos-warn);
475
- background: var(--pos-warn); border-color: var(--pos-warn); color: var(--pos-on-light);
476
- }
477
- .pos-tbl[data-status='bill_requested'] {
478
- --pos-edge: var(--pos-info);
479
- background: var(--pos-info); border-color: var(--pos-info); color: #fff;
480
- }
481
- .pos-tbl[data-status='attention'] {
482
- --pos-edge: var(--pos-danger);
483
- background: var(--pos-danger); border-color: var(--pos-danger); color: #fff;
484
- }
485
-
486
- /* Dentro de um cartão pintado, todo texto herda a cor da frente: os cinzas
487
- (`--pos-fg-2/3`) foram calculados contra o fundo escuro e somem no âmbar. */
488
- .pos-tbl[data-status='occupied'] :is(.pos-tbl__seats, .pos-tbl__who, .pos-tbl__time, .pos-tbl__total),
489
- .pos-tbl[data-status='bill_requested'] :is(.pos-tbl__seats, .pos-tbl__who, .pos-tbl__time, .pos-tbl__total),
490
- .pos-tbl[data-status='attention'] :is(.pos-tbl__seats, .pos-tbl__who, .pos-tbl__time, .pos-tbl__total) {
491
- color: inherit; opacity: 0.85;
492
- }
493
- .pos-tbl[data-status='occupied'] .pos-tbl__total,
494
- .pos-tbl[data-status='bill_requested'] .pos-tbl__total,
495
- .pos-tbl[data-status='attention'] .pos-tbl__total { opacity: 1; }
496
-
497
- /* A pastilha, sobre o cartão pintado, vira um vidro do próprio tom em vez de
498
- um segundo bloco de cor brigando com o primeiro. */
499
- .pos-tbl[data-status='occupied'] .pos-badge,
500
- .pos-tbl[data-status='bill_requested'] .pos-badge,
501
- .pos-tbl[data-status='attention'] .pos-badge {
502
- background: rgba(0, 0, 0, 0.18); color: inherit;
794
+ /* Os SEIS tons do V1, com a receita dele: borda no tom a 50% e um BANHO a 5%
795
+ — não tinta cheia.
796
+ O V2 pintava a mesa ocupada de âmbar sólido, e o salão virava um mosaico em
797
+ que nada chamava. O V1 é explícito sobre isso: "um cartão carrega UM sinal;
798
+ borda de 2px + fundo + ícone + pastilha + pulsar diziam cinco vezes a mesma
799
+ coisa, e quando meia sala está atrasada nada mais aparece".
800
+ LIVRE fica quase sem pintura de propósito: se toda mesa tem cor, nenhuma
801
+ cor chama. A pastilha continua escrita, porque cor sozinha nunca carrega o
802
+ estado — 8% dos homens não separa vermelho de verde, e um deles está no
803
+ salão. */
804
+ .pos-tbl[data-tone='livre'] {
805
+ --pos-tone-c: var(--pos-ok);
806
+ }
807
+ .pos-tbl[data-tone='ocupada'] {
808
+ --pos-tone-c: var(--pos-warn);
809
+ }
810
+ /* «Atrasada» tem cor PRÓPRIA — nem o âmbar de ocupada, nem o vermelho de
811
+ parada. Sem ela, "aberta há mais de uma hora" e "sem pedir nada há uma hora"
812
+ viram o mesmo sinal, e o vermelho perde o que ele tem de dizer. */
813
+ .pos-tbl[data-tone='atrasada'] {
814
+ --pos-tone-c: var(--pos-late);
815
+ }
816
+ .pos-tbl[data-tone='parada'] {
817
+ --pos-tone-c: var(--pos-danger);
818
+ }
819
+ .pos-tbl[data-tone='reservada'],
820
+ .pos-tbl[data-tone='manutencao'] {
821
+ /* Cinza de propósito: não são urgência, e cor demais esconde a atrasada. */
822
+ --pos-tone-c: var(--pos-fg-3);
823
+ }
824
+
825
+ .pos-tbl[data-tone] {
826
+ --pos-edge: var(--pos-tone-c);
827
+ border-color: color-mix(in srgb, var(--pos-tone-c) 50%, transparent);
828
+ background: color-mix(in srgb, var(--pos-tone-c) 5%, var(--pos-2));
829
+ }
830
+ .pos-tbl[data-tone] .pos-badge {
831
+ background: color-mix(in srgb, var(--pos-tone-c) 12%, transparent);
832
+ color: var(--pos-tone-c);
833
+ }
834
+ .pos-tbl[data-tone='manutencao'] { background: var(--pos-3); }
835
+
836
+ /* «Fechar conta» é um PEDIDO esperando resposta, e mora POR CIMA do tom: a
837
+ mesa continua ocupada, atrasada ou parada, e o anel é o único sinal que ela
838
+ ganha — para seguir visível quando o salão inteiro estiver colorido. */
839
+ .pos-tbl[data-bill] {
840
+ box-shadow: 0 0 0 2px var(--pos-1), 0 0 0 4px var(--pos-danger);
841
+ }
842
+
843
+ /* A etiqueta de canto do V1: vermelha, fora da borda, por cima de qualquer
844
+ tom. Ela diz O QUE a mesa está esperando; o anel diz QUAL mesa, de longe.
845
+ As duas juntas porque o anel sozinho não se lê num salão colorido, e a
846
+ etiqueta sozinha não se acha numa grade de duzentas mesas. */
847
+ .pos-tbl__bill {
848
+ position: absolute; z-index: 1; top: -8px; right: -8px;
849
+ display: inline-flex; align-items: center; gap: 4px;
850
+ padding: 2px 8px; border-radius: 999px;
851
+ background: var(--pos-danger); color: #FFFFFF;
852
+ font-size: 10px; font-weight: 700; line-height: 16px; white-space: nowrap;
853
+ box-shadow: 0 1px 3px rgb(0 0 0 / 0.28);
503
854
  }
504
855
 
505
856
  /* O hover não pode clarear um cartão já pintado — ele apagaria o estado. */
@@ -520,11 +871,50 @@
520
871
 
521
872
  /* --- catalogue ---------------------------------------------------------- */
522
873
 
874
+ /* A faixa some quando não tem nada — ver `headHasContent` no PosScreen. */
875
+ .pos-head[data-empty] { display: none; }
876
+
523
877
  .pos-cats {
524
- display: grid; grid-template-columns: repeat(auto-fill, minmax(156px, 1fr));
525
- /* The selected card's outer ring needs somewhere to be. */
526
- gap: var(--pos-3x); padding: calc(var(--pos-3x) + 3px) var(--pos-4x) 3px;
527
- }
878
+ /* UMA faixa que rola na horizontal, como no V1 — não uma grade que quebra
879
+ em linhas.
880
+ Em grade, vinte categorias viravam cinco fileiras e comiam metade da tela
881
+ antes do primeiro produto; e o número de fileiras mudava com a largura, de
882
+ modo que a posição de "Bebidas" nunca era a mesma duas vezes. Numa faixa,
883
+ a ordem é estável e o polegar aprende onde as coisas ficam.
884
+ `scroll-padding` alinha o chip ao chegar pela seta do teclado. */
885
+ display: flex; flex-wrap: nowrap; align-items: stretch;
886
+ /* NÃO encolhe. Como filho de uma coluna flex, o padrão `shrink: 1` deixava a
887
+ régua ceder quando a janela ficava baixa: numa tela de 652px ela passava de
888
+ 72px para 20px e os chips apareciam como faixas coloridas sem texto. A
889
+ régua é o SELETOR do cardápio — ela não é a sobra da tela. */
890
+ flex: 0 0 auto;
891
+ /* E NÃO SOBE com o scroll. A régua é como se troca de seção do cardápio;
892
+ rolando até "Sobremesas" ela saía da tela, e voltar para as bebidas exigia
893
+ rolar o cardápio inteiro de volta só para alcançar o seletor. Fixa no topo
894
+ da área que rola, ela continua sendo o caminho entre as seções.
895
+ O fundo é obrigatório: sem ele os itens passam por baixo e se leem
896
+ sobrepostos aos chips. */
897
+ position: sticky; top: 0; z-index: 10;
898
+ background: color-mix(in srgb, var(--pos-0) var(--pos-glass-bg), transparent);
899
+ backdrop-filter: blur(var(--pos-glass-blur)) saturate(var(--pos-glass-sat));
900
+ -webkit-backdrop-filter: blur(var(--pos-glass-blur)) saturate(var(--pos-glass-sat));
901
+ overflow-x: auto; overscroll-behavior-x: contain;
902
+ scroll-snap-type: x proximity; scroll-padding-inline: var(--pos-4x);
903
+ gap: var(--pos-3x);
904
+ /* O respiro vertical é OBRIGATÓRIO aqui: `overflow-x: auto` também recorta
905
+ em cima e embaixo, e a ficha selecionada sobe 2px e carrega um anel de
906
+ 5px. Sem o respiro, o anel e o topo da ficha saem cortados — foi
907
+ exatamente o que apareceu ao trocar a grade pela faixa. */
908
+ padding: 10px var(--pos-4x);
909
+ /* A barra de rolagem não entra na conta da altura nem aparece: a faixa se
910
+ arrasta com o dedo e com a roda, e uma barra cinza sob as fichas leria
911
+ como uma régua que ninguém pediu. */
912
+ scrollbar-width: none;
913
+ }
914
+ .pos-cats::-webkit-scrollbar { display: none; }
915
+ /* A ficha não encolhe nem estica: largura pelo conteúdo, com um piso para o
916
+ nome de uma palavra não virar uma ficha estreitinha ao lado de uma larga. */
917
+ .pos-cats > .pos-cat { flex: 0 0 auto; min-width: 156px; scroll-snap-align: start; }
528
918
  /* A rule between the filter and what it filtered. Without it the two grids run
529
919
  together and the eye has to work out where the choosing stops. */
530
920
  .pos-cats-rule {
@@ -570,13 +960,341 @@
570
960
  .pos-cat__icon {
571
961
  order: 2; margin-left: auto; flex: none;
572
962
  width: 26px; height: 26px; display: grid; place-items: center;
573
- border-radius: 50%; background: rgba(0, 0, 0, 0.10);
963
+ border-radius: var(--pos-r-round); background: rgba(0, 0, 0, 0.10);
574
964
  }
575
965
  .pos-cat__name { display: block; font-size: 14px; font-weight: 700; letter-spacing: -0.015em; line-height: 1.15; }
576
966
  .pos-cat__n { font-size: 11px; font-weight: 600; color: rgba(16, 19, 24, 0.60); line-height: 1.2; }
577
967
 
968
+ /* O vazio da planta: ele EXPLICA, em vez de ser um salão em branco. */
969
+ .pos-plan__none {
970
+ flex: 1; display: grid; place-content: center; justify-items: center;
971
+ gap: var(--pos-2x); padding: var(--pos-8x) var(--pos-6x); text-align: center;
972
+ color: var(--pos-fg-3);
973
+ }
974
+ .pos-plan__none .pos-empty__h { max-width: 46ch; }
975
+
976
+ /* A segunda fileira do filtro — as praças do ambiente escolhido. Menor e
977
+ mais quieta: ela é o RECORTE de dentro, e a de cima é a que manda. */
978
+ .pos-zones--sub { padding-top: 0; }
979
+ .pos-zones--sub .pos-zone { font-size: 11.5px; padding-top: 4px; padding-bottom: 4px; }
980
+
981
+ /* A conta de recebimento, entre a forma e o botão de confirmar. */
982
+ .pos-acct { display: grid; gap: 5px; padding: var(--pos-3x) var(--pos-4x) 0; }
983
+ .pos-acct__l {
984
+ font-size: 11px; font-weight: 600; text-transform: uppercase;
985
+ letter-spacing: 0.04em; color: var(--pos-fg-3);
986
+ }
987
+ .pos-acct__s {
988
+ width: 100%; min-height: 44px; padding: 0 var(--pos-3x);
989
+ border: 1px solid var(--pos-line-strong); border-radius: var(--pos-r);
990
+ background: var(--pos-1); color: var(--pos-fg); font: inherit; font-size: 14px;
991
+ }
992
+ .pos-acct__s:focus-visible { outline: none; border-color: var(--pos-primary); }
993
+
994
+ /* O aviso de escopo — de quem são as mesas que estão à vista. */
995
+ .pos-scope {
996
+ display: flex; flex-wrap: wrap; align-items: center; gap: 4px var(--pos-3x);
997
+ margin: 0 var(--pos-4x); padding: 6px var(--pos-3x);
998
+ border: 1px solid color-mix(in srgb, var(--pos-primary) 30%, transparent);
999
+ border-radius: var(--pos-r);
1000
+ background: color-mix(in srgb, var(--pos-primary) 5%, transparent);
1001
+ font-size: 11.5px; color: var(--pos-fg-2);
1002
+ }
1003
+ .pos-scope > svg { flex: none; color: var(--pos-primary); }
1004
+ .pos-scope__t { min-width: 0; }
1005
+ .pos-scope__b {
1006
+ margin-left: auto; padding: 3px var(--pos-2x); border: 0;
1007
+ border-radius: var(--pos-r-sm); background: none;
1008
+ font: inherit; font-weight: 700; color: var(--pos-primary); cursor: pointer;
1009
+ }
1010
+ .pos-scope__b:hover { background: color-mix(in srgb, var(--pos-primary) 12%, transparent); }
1011
+ /* Sem praça atribuída: o mesmo lugar, o tom mais quieto — é um fato, não um
1012
+ alerta, e a pessoa continua vendo tudo. */
1013
+ .pos-scope--none {
1014
+ border-style: dashed; border-color: var(--pos-line-strong);
1015
+ background: none; color: var(--pos-fg-3);
1016
+ }
1017
+ .pos-scope--none > svg { color: var(--pos-fg-3); }
1018
+
1019
+ /* As mesas que ainda não entraram na planta. */
1020
+ .pos-unass { display: grid; gap: var(--pos-3x); padding: var(--pos-4x); align-content: start; min-height: 0; }
1021
+ .pos-unass__t { margin: 0; font-size: 14px; font-weight: 700; color: var(--pos-fg); }
1022
+ .pos-unass__h { margin: 3px 0 0; font-size: 11.5px; color: var(--pos-fg-3); }
1023
+ .pos-unass__list { margin: 0; padding: 0; list-style: none; display: grid; gap: 4px; overflow-y: auto; min-height: 0; }
1024
+ .pos-unass__row {
1025
+ display: flex; align-items: center; justify-content: space-between; gap: var(--pos-2x);
1026
+ padding: 6px var(--pos-2x); border: 1px solid var(--pos-line); border-radius: var(--pos-r);
1027
+ font-size: 13px; color: var(--pos-fg);
1028
+ }
1029
+ .pos-unass__n { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
1030
+ .pos-unass__sub { color: var(--pos-fg-3); font-size: 11.5px; }
1031
+ .pos-unass__b {
1032
+ flex: none; display: inline-flex; align-items: center; gap: 4px;
1033
+ padding: 4px var(--pos-2x); border: 1px solid var(--pos-line-strong);
1034
+ border-radius: var(--pos-r-pill); background: var(--pos-1);
1035
+ font-size: 11.5px; font-weight: 600; color: var(--pos-fg-2); cursor: pointer;
1036
+ }
1037
+ .pos-unass__b:hover:not(:disabled) { border-color: var(--pos-primary); color: var(--pos-fg); }
1038
+ .pos-unass__b:disabled { opacity: 0.45; cursor: not-allowed; }
1039
+
1040
+ /* ── A FICHA DA MESA, no rail ────────────────────────────────────────────
1041
+ Sem botão de salvar: cada campo grava ao sair, e o gerente vê a planta
1042
+ mudar atrás. Por isso ela mora aqui e não num diálogo — um diálogo cobriria
1043
+ justamente o que se está conferindo. */
1044
+ .pos-insp { display: grid; gap: var(--pos-3x); padding: var(--pos-4x); align-content: start; }
1045
+ /* O cabeçalho da ficha recua do canto: a casca flutua ali o «Voltar à
1046
+ retaguarda», e o «Aproximar» nascia com 36px debaixo dele — clicável em
1047
+ parte, ilegível no resto. Vale para a ficha da mesa e a da praça: as duas
1048
+ moram neste slot e as duas têm um botão no canto. */
1049
+ .pos-insp__head {
1050
+ display: flex; align-items: flex-start; justify-content: space-between;
1051
+ gap: var(--pos-2x); padding-right: 44px;
1052
+ }
1053
+ .pos-insp__t { display: block; font-size: 17px; font-weight: 700; color: var(--pos-fg); line-height: 1.2; }
1054
+ .pos-insp__where { display: block; margin-top: 2px; font-size: 11.5px; color: var(--pos-fg-3); }
1055
+ .pos-insp__zoom {
1056
+ flex: none; display: inline-flex; align-items: center; gap: 5px;
1057
+ padding: 5px var(--pos-2x); border: 1px solid var(--pos-line-strong);
1058
+ border-radius: var(--pos-r-pill); background: var(--pos-1);
1059
+ font-size: 11.5px; font-weight: 600; color: var(--pos-fg-2); cursor: pointer;
1060
+ }
1061
+ .pos-insp__zoom:disabled { opacity: 0.45; cursor: not-allowed; }
1062
+ .pos-insp__row { display: grid; grid-template-columns: 1fr 1fr; gap: var(--pos-2x); }
1063
+ .pos-insp__f { display: grid; gap: 4px; min-width: 0; }
1064
+ .pos-insp__l {
1065
+ display: flex; align-items: baseline; justify-content: space-between;
1066
+ font-size: 11px; font-weight: 600; text-transform: uppercase;
1067
+ letter-spacing: 0.04em; color: var(--pos-fg-3);
1068
+ }
1069
+ .pos-insp__deg { text-transform: none; letter-spacing: 0; color: var(--pos-fg-2); }
1070
+ .pos-insp__f input[type='number'],
1071
+ .pos-insp__f input[type='text'],
1072
+ .pos-insp__f input:not([type]) {
1073
+ width: 100%; min-height: 40px; padding: 0 var(--pos-3x);
1074
+ border: 1px solid var(--pos-line-strong); border-radius: var(--pos-r);
1075
+ background: var(--pos-1); color: var(--pos-fg); font: inherit; font-size: 14px;
1076
+ }
1077
+ .pos-insp__f input:focus-visible { outline: none; border-color: var(--pos-primary); }
1078
+ .pos-insp__f input[type='range'] { width: 100%; accent-color: var(--pos-primary); }
1079
+ .pos-insp__detach {
1080
+ display: inline-flex; align-items: center; gap: 6px; justify-content: flex-start;
1081
+ padding: var(--pos-2x); border: 0; border-radius: var(--pos-r);
1082
+ background: none; font-size: 12px; color: var(--pos-fg-3); cursor: pointer;
1083
+ }
1084
+ .pos-insp__detach:hover { background: var(--pos-2); color: var(--pos-danger); }
1085
+
1086
+ /* A FICHA DA PRAÇA: o que a da mesa não tem. */
1087
+ /* A dica e o vazio explicado — a mesma tinta, porque são a mesma voz. */
1088
+ .pos-insp__hint {
1089
+ margin: 0; padding: 6px var(--pos-2x); border-radius: var(--pos-radius);
1090
+ background: var(--pos-2); font-size: 11.5px; line-height: 1.45; color: var(--pos-fg-3);
1091
+ }
1092
+ .pos-insp__cores { display: flex; flex-wrap: wrap; gap: var(--pos-2x); }
1093
+ .pos-insp__cor {
1094
+ width: 26px; height: 26px; padding: 0; border-radius: var(--pos-r-round);
1095
+ border: 2px solid transparent; cursor: pointer; transition: border-color var(--pos-fast);
1096
+ }
1097
+ /* A escolhida ganha um aro da COR DO TEXTO, não da própria cor: um aro na
1098
+ mesma tinta some contra a amostra, e o operador não vê qual está valendo. */
1099
+ .pos-insp__cor[aria-pressed='true'] { border-color: var(--pos-fg); }
1100
+
1101
+ .pos-insp__mhead { display: flex; align-items: center; justify-content: space-between; gap: var(--pos-2x); }
1102
+ .pos-insp__pick {
1103
+ display: inline-flex; align-items: center; gap: 5px; padding: 4px var(--pos-2x);
1104
+ border: 1px solid var(--pos-line-strong); border-radius: var(--pos-r-pill);
1105
+ background: var(--pos-1); font-size: 11.5px; font-weight: 600;
1106
+ color: var(--pos-fg-2); cursor: pointer; transition: all var(--pos-fast);
1107
+ }
1108
+ .pos-insp__pick:hover { border-color: var(--pos-primary); color: var(--pos-fg); }
1109
+ .pos-insp__pick[aria-pressed='true'] {
1110
+ border-color: var(--pos-primary); background: var(--pos-primary); color: var(--pos-primary-fg);
1111
+ }
1112
+
1113
+ /* A lista rola sozinha: numa praça de vinte e quatro mesas ela empurraria o
1114
+ «Apagar praça» para fora da ficha, e o gerente rolaria a coluna inteira
1115
+ procurando um botão que estava logo abaixo. */
1116
+ .pos-insp__mesas {
1117
+ display: grid; gap: 4px; max-height: 220px; overflow-y: auto;
1118
+ margin: 0; padding: 0 2px 0 0; list-style: none;
1119
+ }
1120
+ .pos-insp__mesas li {
1121
+ display: flex; align-items: center; justify-content: space-between; gap: var(--pos-2x);
1122
+ padding: 5px var(--pos-2x); border: 1px solid var(--pos-line); border-radius: var(--pos-radius);
1123
+ font-size: 12.5px;
1124
+ }
1125
+ .pos-insp__mn { min-width: 0; }
1126
+ .pos-insp__mx { color: var(--pos-fg-3); }
1127
+ .pos-insp__malso { display: block; font-size: 10.5px; color: var(--pos-fg-3); }
1128
+ .pos-insp__mdrop {
1129
+ display: inline-flex; align-items: center; justify-content: center;
1130
+ width: 22px; height: 22px; flex: none; border: 0; border-radius: var(--pos-r-pill);
1131
+ background: none; color: var(--pos-fg-3); cursor: pointer;
1132
+ }
1133
+ .pos-insp__mdrop:hover { background: var(--pos-2); color: var(--pos-danger); }
1134
+
1135
+ .pos-insp__confirm {
1136
+ display: grid; gap: var(--pos-2x); padding: var(--pos-3x);
1137
+ border: 1px solid color-mix(in srgb, var(--pos-danger) 40%, transparent);
1138
+ border-radius: var(--pos-radius);
1139
+ background: color-mix(in srgb, var(--pos-danger) 6%, transparent);
1140
+ }
1141
+ .pos-insp__ct { margin: 0; font-size: 13px; font-weight: 700; color: var(--pos-fg); }
1142
+ .pos-insp__cbtns { display: flex; gap: var(--pos-2x); }
1143
+ .pos-insp__cbtns .pos-btn { flex: 1; }
1144
+ .pos-btn--danger {
1145
+ border-color: var(--pos-danger); background: var(--pos-danger); color: #fff;
1146
+ }
1147
+ .pos-btn--danger:hover:not(:disabled) { filter: brightness(1.08); }
1148
+
1149
+ /* A barra da planta: o que existe, e o botão de mexer nela. */
1150
+ .pos-planbar__n { font-size: 12px; color: var(--pos-fg-3); }
1151
+ .pos-planbar__b {
1152
+ display: inline-flex; align-items: center; gap: 5px;
1153
+ margin-left: auto; padding: 5px var(--pos-3x);
1154
+ border: 1px solid var(--pos-line-strong); border-radius: var(--pos-r-pill);
1155
+ background: var(--pos-1); font-size: 12px; font-weight: 600;
1156
+ color: var(--pos-fg-2); cursor: pointer; transition: all var(--pos-fast);
1157
+ }
1158
+ .pos-planbar__b:hover { border-color: var(--pos-primary); color: var(--pos-fg); }
1159
+ /* O «Organizar automaticamente» não é a ação principal da barra — o
1160
+ «Concluir» é. Sem `margin-left: auto` ele fica ao lado das ferramentas,
1161
+ onde a sequência é: desenhar praça, organizar mesas, concluir. */
1162
+ .pos-planbar__b--flat { margin-left: 0; }
1163
+ .pos-planbar__b[aria-pressed='true'] {
1164
+ border-color: var(--pos-primary); background: var(--pos-primary);
1165
+ color: var(--pos-primary-fg);
1166
+ }
1167
+ /* COM O CADEADO LIGADO, «Organizar automaticamente» é a única saída.
1168
+ O V1 o torna o botão primário nesse estado, e a razão é a da régua do
1169
+ porte: ação bloqueada diz o que falta E oferece o caminho. As três
1170
+ ferramentas apagadas ao lado explicam o problema; este botão é a resposta,
1171
+ e uma resposta não pode ter o mesmo peso visual do resto da barra. */
1172
+ .pos-planbar__b--go {
1173
+ border-color: var(--pos-warn);
1174
+ background: color-mix(in srgb, var(--pos-warn) 16%, var(--pos-1));
1175
+ color: var(--pos-fg);
1176
+ }
1177
+ .pos-planbar__b--go:hover { background: color-mix(in srgb, var(--pos-warn) 26%, var(--pos-1)); }
1178
+ /* «Salva sozinho» é promessa: o aviso a cumpre, e some quando se conclui. */
1179
+ .pos-planbar__hint { font-size: 11.5px; color: var(--pos-fg-3); }
1180
+
1181
+ /* AS TRÊS FERRAMENTAS DE PRAÇA, agrupadas numa moldura só.
1182
+ A moldura importa: soltos na barra, os três ícones leriam como mais três
1183
+ botões avulsos ao lado de «Editar planta», e nada diria que eles são uma
1184
+ escolha entre si. A palavra «Praça» dentro da moldura é o rótulo do grupo —
1185
+ é assim no V1, e é o que impede o operador de ler «quadrado» como forma da
1186
+ MESA. */
1187
+ .pos-planbar__tools {
1188
+ display: inline-flex; align-items: center; gap: 2px;
1189
+ padding: 3px; border: 1px solid var(--pos-line); border-radius: var(--pos-r-pill);
1190
+ }
1191
+ .pos-planbar__tl {
1192
+ padding: 0 5px 0 3px; font-size: 11px; font-weight: 600;
1193
+ color: var(--pos-fg-3); letter-spacing: 0.01em;
1194
+ }
1195
+ .pos-planbar__t {
1196
+ display: inline-flex; align-items: center; justify-content: center;
1197
+ width: 28px; height: 28px; border: 0; border-radius: var(--pos-r-pill);
1198
+ background: none; color: var(--pos-fg-2); cursor: pointer;
1199
+ transition: background var(--pos-fast), color var(--pos-fast);
1200
+ }
1201
+ .pos-planbar__t:hover:not(:disabled) { background: var(--pos-2); color: var(--pos-fg); }
1202
+ .pos-planbar__t[aria-pressed='true'] { background: var(--pos-primary); color: var(--pos-primary-fg); }
1203
+ /* Travado NÃO é invisível: o ícone apagado guarda o lugar e o `title` diz o
1204
+ que falta. Sumir com a ferramenta deixaria o operador procurando por ela. */
1205
+ .pos-planbar__t:disabled { opacity: 0.4; cursor: not-allowed; }
1206
+
1207
+ /* As duas faixas da planta, abaixo da barra: o cadeado e a instrução do
1208
+ gesto. Largura inteira porque são frases, não rótulos — espremidas na barra
1209
+ elas empurrariam o censo para fora. */
1210
+ .pos-planbar__lock,
1211
+ .pos-planbar__tip {
1212
+ display: flex; align-items: center; gap: 6px; flex: 0 0 auto;
1213
+ margin: 0 var(--pos-4x) var(--pos-3x);
1214
+ padding: 6px var(--pos-3x); border-radius: var(--pos-radius);
1215
+ font-size: 11.5px; line-height: 1.45;
1216
+ }
1217
+ .pos-planbar__lock {
1218
+ border: 1px solid color-mix(in srgb, var(--pos-warn) 40%, transparent);
1219
+ background: color-mix(in srgb, var(--pos-warn) 8%, transparent);
1220
+ color: var(--pos-fg-2);
1221
+ }
1222
+ .pos-planbar__lock svg { flex: none; color: var(--pos-warn); }
1223
+ .pos-planbar__tip {
1224
+ border: 1px solid color-mix(in srgb, var(--pos-primary) 30%, transparent);
1225
+ background: color-mix(in srgb, var(--pos-primary) 7%, transparent);
1226
+ color: var(--pos-fg-2);
1227
+ }
1228
+ /* Em edição o palco não rola com o dedo — o dedo está movendo mesa. */
1229
+ /* O vazio da planta ocupa o lugar do desenho, com a mesma moldura tracejada que
1230
+ o V1 usa: uma borda pontilhada diz "aqui vai entrar coisa" de um jeito que
1231
+ texto centrado sozinho não diz. */
1232
+ .pos-plan__empty {
1233
+ flex: 1 1 auto; min-height: 220px;
1234
+ display: flex; flex-direction: column; align-items: center; justify-content: center;
1235
+ gap: var(--pos-2x); padding: var(--pos-6x) var(--pos-4x);
1236
+ border: 1px dashed var(--pos-line); border-radius: var(--pos-r);
1237
+ color: var(--pos-fg-3); text-align: center;
1238
+ }
1239
+ .pos-plan__empty-t { font-size: 13px; font-weight: 600; color: var(--pos-fg-2); }
1240
+ .pos-plan__empty-h { font-size: 11px; line-height: 1.5; max-width: 34ch; }
1241
+
1242
+ .pos-plan2[data-editing] { touch-action: none; }
1243
+
1244
+ /* A planta e a trilha dela, numa coluna só. */
1245
+ .pos-plan__wrap { flex: 1; min-height: 0; display: flex; flex-direction: column; }
1246
+ .pos-plan__crumbs {
1247
+ flex: none; display: flex; align-items: center; gap: 4px;
1248
+ padding: var(--pos-3x) var(--pos-4x) 0; font-size: 13px; color: var(--pos-fg-3);
1249
+ }
1250
+ .pos-plan__crumb {
1251
+ padding: 3px var(--pos-2x); border: 0; border-radius: var(--pos-r-sm);
1252
+ background: none; font: inherit; font-weight: 600; color: var(--pos-fg-3);
1253
+ cursor: pointer; transition: background var(--pos-fast), color var(--pos-fast);
1254
+ }
1255
+ .pos-plan__crumb:hover { color: var(--pos-fg); }
1256
+ .pos-plan__crumb[aria-current='page'] { background: var(--pos-2); color: var(--pos-fg); cursor: default; }
1257
+ /* A contagem do que está EM FOCO — não a do salão inteiro. */
1258
+ .pos-plan__count { margin-left: auto; font-size: 12px; font-weight: 600; }
1259
+
1260
+ /* Os ambientes como atalho. Um salão de 64m não se lê inteiro. */
1261
+ .pos-plan__areas {
1262
+ flex: none; display: flex; gap: var(--pos-2x);
1263
+ padding: var(--pos-2x) var(--pos-4x) 0; overflow-x: auto; scrollbar-width: none;
1264
+ }
1265
+ .pos-plan__area {
1266
+ flex: none; padding: 5px var(--pos-3x);
1267
+ border: 1px solid var(--pos-line); border-radius: var(--pos-r-pill);
1268
+ background: var(--pos-1); font-size: 12px; font-weight: 600;
1269
+ color: var(--pos-fg-2); cursor: pointer;
1270
+ transition: all var(--pos-fast);
1271
+ }
1272
+ .pos-plan__area:hover { border-color: var(--pos-line-strong); color: var(--pos-fg); }
1273
+ .pos-plan__area[aria-pressed='true'] {
1274
+ border-color: var(--pos-primary); background: var(--pos-primary);
1275
+ color: var(--pos-primary-fg);
1276
+ }
1277
+
1278
+ /* A PLANTA em metros. O `viewBox` faz a conta de escala; o CSS só dá a caixa
1279
+ em que ela cabe, e a folga para o dedo não encostar nas bordas. */
1280
+ .pos-plan2 {
1281
+ flex: 1; min-height: 0; width: 100%;
1282
+ padding: var(--pos-3x);
1283
+ background: var(--pos-1);
1284
+ }
1285
+
1286
+ /* O nome da seção, acima da grade dela. Discreto de propósito: ele DIVIDE, e
1287
+ quem tem de gritar é o cartão do prato. */
1288
+ .pos-sect {
1289
+ margin: 0; padding: var(--pos-4x) var(--pos-4x) 0;
1290
+ font-size: 11px; font-weight: 800; text-transform: uppercase;
1291
+ letter-spacing: 0.06em; color: var(--pos-fg-3);
1292
+ }
1293
+ /* A grade abaixo de um rótulo não repete o respiro de cima. */
1294
+ .pos-sect + .pos-items { padding-top: var(--pos-2x); }
1295
+
578
1296
  .pos-items {
579
- flex: 1; display: grid; align-content: start; padding-bottom: var(--pos-6x);
1297
+ display: grid; align-content: start; padding-bottom: var(--pos-6x);
580
1298
  grid-template-columns: repeat(auto-fill, minmax(196px, 1fr));
581
1299
  gap: var(--pos-3x); padding: var(--pos-4x);
582
1300
  }
@@ -599,7 +1317,12 @@
599
1317
  background: var(--pos-item-tone, var(--pos-line-strong));
600
1318
  transition: width 280ms var(--pos-spring);
601
1319
  }
602
- .pos-item[data-filled='true']::before { width: 100%; }
1320
+ .pos-item[data-filled='true']::before {
1321
+ width: 100%;
1322
+ /* O preenchimento é o tom REBAIXADO, não a cor da tira. Ver a nota na
1323
+ paleta: com a cor cheia o card vira um bloco sólido e a tinta some. */
1324
+ background: var(--pos-item-tone-on, var(--pos-item-tone, var(--pos-3)));
1325
+ }
603
1326
  /* Content rides above the growing edge. */
604
1327
  .pos-item > * { position: relative; z-index: 1; }
605
1328
 
@@ -616,7 +1339,7 @@
616
1339
  .pos-item__id { display: flex; flex-direction: column; gap: 2px; min-width: 0; flex: 1; }
617
1340
  .pos-item__img {
618
1341
  flex: none; display: block; overflow: hidden;
619
- width: 52px; height: 52px; border-radius: var(--pos-r-sm, 8px);
1342
+ width: 52px; height: 52px; border-radius: var(--pos-r-sm);
620
1343
  background: var(--pos-3);
621
1344
  }
622
1345
  .pos-item__img img { width: 100%; height: 100%; object-fit: cover; display: block; }
@@ -626,14 +1349,14 @@
626
1349
  /* Quantity on the ticket paints the card in its own category identity — the
627
1350
  most legible selected state there is at arm's length. */
628
1351
  .pos-item { transition: background var(--pos-t) var(--pos-e), border-color var(--pos-t) var(--pos-e), color 180ms 90ms linear; }
629
- .pos-item[data-filled='true'] { color: #121214; border-color: transparent; }
1352
+ .pos-item[data-filled='true'] { color: var(--pos-on-filled, #121214); border-color: transparent; }
630
1353
  .pos-item__route { font-size: 10px; font-weight: 650; letter-spacing: 0.07em; text-transform: uppercase; color: var(--pos-fg-3); }
631
1354
  .pos-item__name { font-size: 15px; font-weight: 600; line-height: 1.25; }
632
1355
  .pos-item__price { font-size: 13px; font-weight: 550; color: var(--pos-fg-2); }
633
1356
  /* On a filled card the secondary text needs its own ink: --pos-fg-2 is tuned
634
1357
  for a dark surface and turns invisible on a pastel one. */
635
- .pos-item[data-filled='true'] .pos-item__route { color: rgba(16, 19, 24, 0.6); }
636
- .pos-item[data-filled='true'] .pos-item__price { color: rgba(16, 19, 24, 0.72); }
1358
+ .pos-item[data-filled='true'] .pos-item__route { color: color-mix(in srgb, var(--pos-on-filled, #101318) 60%, transparent); }
1359
+ .pos-item[data-filled='true'] .pos-item__price { color: color-mix(in srgb, var(--pos-on-filled, #101318) 72%, transparent); }
637
1360
  .pos-item__foot { margin-top: auto; display: flex; align-items: center; justify-content: flex-end; gap: var(--pos-2x); }
638
1361
 
639
1362
  /* The stepper on the card: add to THIS table without leaving the grid. */
@@ -656,6 +1379,9 @@
656
1379
  .pos-item[data-filled='true'] .pos-step__b:hover:not(:disabled) { background: rgba(255,255,255,0.85); }
657
1380
  .pos-item[data-filled='true'] .pos-step__b:disabled { color: rgba(0,0,0,0.35); }
658
1381
  .pos-step__n { min-width: 26px; text-align: center; font-size: 15px; font-weight: 700; font-variant-numeric: tabular-nums; }
1382
+ /* Zero apagado: numa grade de quarenta cartões é o que separa "não lancei" de
1383
+ "lancei um" sem obrigar a ler o número de cada um. */
1384
+ .pos-step__n[data-zero] { color: var(--pos-fg-3); font-weight: 600; }
659
1385
 
660
1386
  /* --- list view ---------------------------------------------------------- */
661
1387
 
@@ -686,7 +1412,7 @@
686
1412
 
687
1413
 
688
1414
  .pos-kbd {
689
- padding: 1px 5px; border: 1px solid var(--pos-line-strong); border-radius: 4px;
1415
+ padding: 1px 5px; border: 1px solid var(--pos-line-strong); border-radius: var(--pos-r-xs);
690
1416
  background: var(--pos-0); color: var(--pos-fg-3);
691
1417
  font-size: 10px; font-weight: 700; font-family: inherit; letter-spacing: 0.03em;
692
1418
  }
@@ -698,7 +1424,7 @@
698
1424
 
699
1425
  .pos-tkt__collapse {
700
1426
  display: none; margin-left: auto; place-items: center;
701
- height: 34px; width: 34px; border: none; border-radius: 999px;
1427
+ height: 34px; width: 34px; border: none; border-radius: var(--pos-r-pill);
702
1428
  background: none; color: var(--pos-fg-2); cursor: pointer;
703
1429
  }
704
1430
  .pos-tkt__collapse:hover { background: var(--pos-2); color: var(--pos-fg); }
@@ -748,20 +1474,25 @@
748
1474
  .pos-tab[aria-selected='true'] { color: var(--pos-fg); border-bottom-color: var(--pos-accent); }
749
1475
  .pos-tab__n {
750
1476
  min-width: 20px; height: 18px; padding: 0 5px; display: grid; place-items: center;
751
- border-radius: 9px; background: var(--pos-3); color: var(--pos-fg-2);
1477
+ border-radius: var(--pos-r-sm); background: var(--pos-3); color: var(--pos-fg-2);
752
1478
  font-size: 11px; font-weight: 700;
753
1479
  }
754
1480
  .pos-tab[aria-selected='true'] .pos-tab__n { background: var(--pos-4); color: var(--pos-fg); }
755
- .pos-tab__dot { width: 7px; height: 7px; border-radius: 50%; background: var(--pos-warn); }
1481
+ .pos-tab__dot { width: 7px; height: 7px; border-radius: var(--pos-r-round); background: var(--pos-warn); }
756
1482
 
757
1483
  .pos-activity { padding: var(--pos-3x) var(--pos-4x); display: grid; gap: var(--pos-4x); }
758
1484
 
759
1485
 
760
1486
 
761
1487
  .pos-ln {
762
- /* A coluna do marcador encolheu de 22px para 14px: com o ponto no lugar da
763
- bolha, o resto era recuo pago pelo NOME do prato, que é o que se lê. */
764
- display: grid; grid-template-columns: 14px minmax(0, 1fr) auto auto;
1488
+ /* TRÊS colunas: nome · selo · preço.
1489
+ Havia uma quarta, de 14px, só para o marcador de estado. Ela existia para
1490
+ a linha pendente e sobrava na enviada — e quando a enviada deixou de
1491
+ desenhar o marcador, o NOME caiu naquela coluna de 14px: "Cerveja
1492
+ Therezopolis 600ml" quebrava em três linhas com o selo "Enviado" por cima
1493
+ delas. O estado do pendente já é a barra âmbar do `::before`, que não
1494
+ ocupa coluna nenhuma. */
1495
+ display: grid; grid-template-columns: minmax(0, 1fr) auto auto;
765
1496
  align-items: center; gap: var(--pos-2x);
766
1497
  min-height: 58px; margin: 0 var(--pos-3x) var(--pos-2x);
767
1498
  padding: var(--pos-2x) var(--pos-3x) var(--pos-2x) var(--pos-2x);
@@ -782,46 +1513,100 @@
782
1513
  .pos-tot { padding: var(--pos-3x) var(--pos-4x); border-top: 1px solid var(--pos-line); background: transparent; }
783
1514
  .pos-tot__r { display: flex; align-items: baseline; justify-content: space-between; gap: var(--pos-3x); font-size: 13px; color: var(--pos-fg-2); margin-bottom: 6px; }
784
1515
  .pos-tot__r > span:last-child { color: var(--pos-fg-2); font-weight: 500; }
1516
+
1517
+ /* O que já entrou. Verde porque é dinheiro recebido, e o sinal é o MENOS: a
1518
+ linha desconta do total logo acima, ela não soma a ele. */
1519
+ .pos-paid { margin-top: 8px; display: flex; flex-direction: column; gap: 4px; }
1520
+ .pos-paid__h { display: flex; align-items: center; justify-content: space-between; gap: var(--pos-3x);
1521
+ width: 100%; background: none; border: 0; padding: 2px 0; cursor: pointer;
1522
+ font-size: 12px; font-weight: 600; color: var(--pos-ok); }
1523
+ .pos-paid__h:hover { opacity: .8; }
1524
+ .pos-paid__n { display: inline-flex; align-items: center; gap: 4px; }
1525
+ .pos-paid__r { display: flex; align-items: baseline; justify-content: space-between; gap: var(--pos-3x);
1526
+ font-size: 12px; color: var(--pos-ok); padding-left: 16px; }
1527
+ .pos-paid__who { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
1528
+ .pos-paid__v { font-weight: 600; white-space: nowrap; }
1529
+
1530
+ /* «Número de Pessoas»: o passo-a-passo do V1. Os botões são redondos e grandes
1531
+ porque o dedo do operador acerta um círculo de 44px, não um retângulo de 28. */
1532
+ .pos-gcount { display: flex; align-items: center; justify-content: center; gap: 12px; padding: 4px 0 8px; }
1533
+ .pos-gcount__step { display: inline-flex; align-items: center; justify-content: center;
1534
+ width: 46px; height: 46px; border-radius: 999px; flex: 0 0 auto; cursor: pointer;
1535
+ border: 1px solid var(--pos-edge, var(--pos-4)); background: var(--pos-2); color: var(--pos-fg-1); }
1536
+ .pos-gcount__step:hover:not(:disabled) { background: var(--pos-3); }
1537
+ .pos-gcount__step:disabled { opacity: .4; cursor: not-allowed; }
1538
+ .pos-gcount__n { width: 84px; height: 54px; text-align: center; font-size: 26px; font-weight: 700;
1539
+ border-radius: var(--pos-r); border: 1px solid var(--pos-4); background: var(--pos-1);
1540
+ color: var(--pos-fg-1); padding: 0 8px; }
1541
+ .pos-gcount__list { display: flex; flex-direction: column; gap: 6px; max-height: 40vh; overflow-y: auto; padding-right: 4px; }
1542
+ .pos-gcount__row { display: flex; align-items: center; gap: 8px; }
1543
+ .pos-gcount__row--new { opacity: .6; }
1544
+ .pos-gcount__i { display: inline-flex; align-items: center; justify-content: center;
1545
+ width: 28px; height: 28px; border-radius: 999px; flex: 0 0 auto; font-size: 11px; font-weight: 700;
1546
+ background: color-mix(in srgb, var(--pos-primary) 15%, transparent); color: var(--pos-primary); }
1547
+ .pos-gcount__i[data-anon] { background: var(--pos-3); color: var(--pos-fg-3); }
1548
+ .pos-gcount__i--new { background: none; border: 1px dashed var(--pos-4); color: var(--pos-fg-3); }
1549
+ .pos-gcount__ghost { display: flex; flex: 1; align-items: center; height: 36px; padding: 0 12px;
1550
+ border: 1px dashed var(--pos-4); border-radius: var(--pos-r); font-size: 13px; color: var(--pos-fg-3); }
1551
+
1552
+ /* Um pedaço clicável dentro de uma linha de texto: sublinhado pontilhado, e
1553
+ não cor — a linha toda é secundária, e pintar um trecho dela de primário
1554
+ faria ele competir com o total. */
1555
+ .pos-tkt__link { background: none; border: 0; padding: 0; font: inherit; color: inherit;
1556
+ cursor: pointer; text-decoration: underline; text-decoration-style: dotted;
1557
+ text-underline-offset: 2px; }
1558
+ .pos-tkt__link:hover { color: var(--pos-fg-1); }
785
1559
  .pos-tot__g { margin-top: var(--pos-2x); padding-top: var(--pos-2x); border-top: 1px dashed var(--pos-line-strong); }
786
1560
  .pos-tot__g { display: flex; justify-content: space-between; align-items: baseline; gap: var(--pos-3x); margin-top: var(--pos-3x); padding-top: var(--pos-3x); border-top: 1px dashed var(--pos-line-strong); }
787
1561
 
788
- .pos-pay { display: grid; grid-auto-flow: column; grid-auto-columns: 1fr; gap: var(--pos-3x); padding: var(--pos-3x) var(--pos-4x) 0; }
1562
+ /* De três a nove formas de pagamento.
1563
+ `grid-auto-flow: column` cabia as três do começo e espremia as nove de uma
1564
+ casa que aceita Pix, débito, crédito, vale e conta — cada ladrilho ficava
1565
+ com 35px de largura e o nome quebrava em três linhas. Em `auto-fit` elas
1566
+ passam a QUEBRAR em linhas, e a faixa rola se passar da altura. */
1567
+ .pos-pay {
1568
+ display: grid; grid-template-columns: repeat(auto-fit, minmax(88px, 1fr));
1569
+ gap: var(--pos-3x); padding: var(--pos-3x) var(--pos-4x) 0;
1570
+ max-height: 30vh; overflow-y: auto;
1571
+ }
789
1572
  /* Square holds the glyph; the word sits outside it. Keeping the label out of
790
1573
  the box lets the box stay a proper touch square instead of a tall pill
791
1574
  stretched to fit two lines of text. */
1575
+ /* O NOME mora DENTRO do quadrado que se aperta.
1576
+ Fora dele, o rótulo não era o alvo do toque — o dedo caía no quadrado e a
1577
+ palavra ficava ali como legenda — e, com o ladrilho escolhido em laranja
1578
+ cheio, o nome continuava preto por baixo, como se pertencesse a outra
1579
+ coisa. Dentro, o botão inteiro é uma peça só: alvo, ícone e palavra. */
792
1580
  .pos-pay__b {
793
- display: flex; flex-direction: column; align-items: center; gap: 7px;
794
- border: none; background: none; padding: 0; cursor: pointer;
795
- color: var(--pos-fg-2); font-size: 13px; font-weight: 550;
796
- transition: color var(--pos-t) var(--pos-e);
797
- }
798
- .pos-pay__b:hover { color: var(--pos-fg); }
799
- .pos-pay__b span {
800
- width: 100%; min-height: var(--pos-hit);
801
- display: grid; place-items: center;
1581
+ display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 6px;
1582
+ min-height: calc(var(--pos-hit) + 22px); padding: var(--pos-2x) 6px;
802
1583
  border: 1px solid var(--pos-line-strong); border-radius: var(--pos-r);
803
- background: var(--pos-2);
1584
+ background: var(--pos-2); cursor: pointer;
1585
+ color: var(--pos-fg-2); font-size: 12px; font-weight: 550; line-height: 1.2;
1586
+ text-align: center; overflow-wrap: anywhere; hyphens: auto;
804
1587
  transition: background var(--pos-t) var(--pos-e), border-color var(--pos-t) var(--pos-e), color var(--pos-t) var(--pos-e);
805
1588
  }
806
- .pos-pay__b:hover span { background: var(--pos-3); }
1589
+ .pos-pay__b:hover { color: var(--pos-fg); background: var(--pos-3); }
1590
+ .pos-pay__b span { display: grid; place-items: center; }
807
1591
  /* The radio reports itself with aria-checked, not aria-pressed — the selected
808
1592
  method has to read as chosen from across the counter, so it goes solid. */
809
- .pos-pay__b[aria-checked='true'] { color: var(--pos-fg); font-weight: 620; }
810
- .pos-pay__b[aria-checked='true'] span {
811
- background: var(--pos-primary); border-color: var(--pos-primary); color: var(--pos-primary-fg);
1593
+ .pos-pay__b[aria-checked='true'] {
1594
+ background: var(--pos-primary); border-color: var(--pos-primary);
1595
+ color: var(--pos-primary-fg); font-weight: 700;
812
1596
  box-shadow: 0 0 0 3px rgba(247, 247, 248, 0.16);
813
1597
  }
1598
+ .pos-pay__b[aria-checked='true']:hover { background: var(--pos-primary); }
814
1599
 
815
1600
  .pos-cta { padding: var(--pos-4x); padding-bottom: calc(var(--pos-4x) + var(--pos-safe-b)); }
816
1601
  .pos-btn {
817
1602
  display: inline-flex; align-items: center; justify-content: center; gap: var(--pos-2x);
818
1603
  width: 100%; min-height: 60px;
819
- border: 1px solid var(--pos-primary); border-radius: var(--pos-r-pill, 999px);
1604
+ border: 1px solid var(--pos-primary); border-radius: var(--pos-r-pill);
820
1605
  background: var(--pos-primary); color: var(--pos-primary-fg);
821
1606
  font-size: 17px; font-weight: 620; letter-spacing: -0.012em; cursor: pointer;
822
1607
  transition: background var(--pos-t) var(--pos-e), transform var(--pos-t) var(--pos-e);
823
1608
  }
824
- .pos-btn:hover:not(:disabled) { background: #FFFFFF; border-color: #FFFFFF; }
1609
+ .pos-btn:hover:not(:disabled) { background: var(--pos-primary-hover); border-color: var(--pos-primary-hover); }
825
1610
  .pos-btn:active:not(:disabled) { transform: scale(0.99); }
826
1611
  .pos-btn:disabled { background: var(--pos-2); border-color: var(--pos-line); color: var(--pos-fg-3); cursor: not-allowed; }
827
1612
  .pos-btn .pos-kbd { background: rgba(0,0,0,0.08); border-color: rgba(0,0,0,0.16); color: inherit; opacity: 0.75; }
@@ -838,20 +1623,57 @@
838
1623
  flex: 1; display: flex; flex-direction: column; align-items: center; justify-content: center;
839
1624
  gap: var(--pos-2x); padding: var(--pos-8x) var(--pos-4x); text-align: center; color: var(--pos-fg-3);
840
1625
  }
841
- .pos-empty__icon { width: 44px; height: 44px; display: grid; place-items: center; border-radius: 50%; background: var(--pos-2); color: var(--pos-fg-3); }
1626
+ .pos-empty__icon { width: 44px; height: 44px; display: grid; place-items: center; border-radius: var(--pos-r-round); background: var(--pos-2); color: var(--pos-fg-3); }
842
1627
  .pos-empty__t { font-size: 15px; font-weight: 600; color: var(--pos-fg-2); }
843
1628
  .pos-empty__s { font-size: 13px; max-width: 34ch; }
844
1629
 
845
1630
  /* --- bottom dock: open tickets ------------------------------------------ */
846
1631
 
847
- .pos-dock {
848
- display: flex; gap: 0; padding: 0 var(--pos-2x);
849
- background: var(--pos-0); border-top: 1px solid var(--pos-line);
850
- /* Scroll snapping so a chip never comes to rest half-cut at the edge. */
1632
+ /* A BANDEJA é a moldura; quem rola é a fita de dentro.
1633
+ Enquanto a alça de recolher vivia na mesma caixa que rola, ela ficava a doze
1634
+ comandas de distância do polegar numa noite cheia — que é exatamente a noite
1635
+ em que alguém quer a grade inteira à vista. */
1636
+ .pos-dock { position: relative; display: flex; }
1637
+ .pos-dock__strip {
1638
+ display: flex; gap: 0; padding: 0 var(--pos-2x); flex: 1; min-width: 0;
851
1639
  scroll-snap-type: x proximity; scroll-padding-inline: var(--pos-4x);
852
1640
  overflow-x: auto; scrollbar-width: none;
853
1641
  }
1642
+ .pos-dock__strip::-webkit-scrollbar { display: none; }
1643
+ /* A alça, encostada no canto de cima à direita — a medida e o lugar do V1. */
1644
+ .pos-dock__shut {
1645
+ position: absolute; right: 0; top: 0; z-index: 2;
1646
+ display: grid; place-items: center; width: 28px; height: 28px;
1647
+ border: 1px solid var(--pos-line); border-top: none; border-right: none;
1648
+ border-bottom-left-radius: var(--pos-r);
1649
+ background: var(--pos-1); color: var(--pos-fg-3); cursor: pointer;
1650
+ transition: background var(--pos-fast), color var(--pos-fast);
1651
+ }
1652
+ .pos-dock__shut:hover { background: var(--pos-3); color: var(--pos-fg); }
1653
+ /* Recolhida, a bandeja é UMA linha que diz quantas estão abertas e volta. */
1654
+ .pos-dock--shut { padding: 0; }
1655
+ .pos-dock__reopen {
1656
+ display: flex; align-items: center; justify-content: center; gap: 6px;
1657
+ width: 100%; height: 34px; border: none; background: none; cursor: pointer;
1658
+ font-size: 12px; font-weight: 600; color: var(--pos-fg-2);
1659
+ transition: background var(--pos-fast), color var(--pos-fast);
1660
+ }
1661
+ .pos-dock__reopen:hover { background: var(--pos-3); color: var(--pos-fg); }
1662
+
1663
+ .pos-dock {
1664
+ display: flex; gap: 0;
1665
+ /* Mesmo vidro do filtro de praças: a bandeja fica SOBRE o salão em vez de
1666
+ ser mais uma faixa opaca cortando a tela. As mesas continuam aparecendo
1667
+ por trás, e a fita de comandas se lê como uma camada — que é o que ela é.
1668
+ Uma cor sólida a cada canto empilhava três planos de fundo diferentes no
1669
+ mesmo rodapé. */
1670
+ background: color-mix(in srgb, var(--pos-0) var(--pos-glass-bg), transparent);
1671
+ backdrop-filter: blur(var(--pos-glass-blur)) saturate(var(--pos-glass-sat));
1672
+ -webkit-backdrop-filter: blur(var(--pos-glass-blur)) saturate(var(--pos-glass-sat));
1673
+ border-top: 1px solid color-mix(in srgb, var(--pos-fg) 8%, transparent);
1674
+ }
854
1675
  .pos-dock::-webkit-scrollbar { display: none; }
1676
+
855
1677
  .pos-dchip {
856
1678
  flex: 0 0 auto; display: flex; align-items: center; gap: var(--pos-3x);
857
1679
  min-height: 68px; padding: 0 var(--pos-4x);
@@ -890,7 +1712,7 @@
890
1712
  }
891
1713
  .pos-dchip__st {
892
1714
  margin-left: var(--pos-2x); width: 26px; height: 26px; flex: none;
893
- display: grid; place-items: center; border-radius: 50%;
1715
+ display: grid; place-items: center; border-radius: var(--pos-r-round);
894
1716
  }
895
1717
  .pos-dchip__st[data-status='occupied'] { background: color-mix(in srgb, var(--pos-warn) 18%, transparent); color: var(--pos-warn); }
896
1718
  .pos-dchip__st[data-status='bill_requested'] { background: color-mix(in srgb, var(--pos-info) 18%, transparent); color: var(--pos-info); }
@@ -926,7 +1748,7 @@
926
1748
  .pos-body { grid-template-columns: 60px minmax(0, 1fr); }
927
1749
  .pos-aside {
928
1750
  position: absolute; inset: 0 0 0 auto; width: min(420px, 88vw); z-index: 30;
929
- transform: translateX(101%); box-shadow: -24px 0 48px rgba(0,0,0,0.5);
1751
+ transform: translateX(101%); box-shadow: -24px 0 48px var(--pos-shadow);
930
1752
  transition: transform 220ms var(--pos-e);
931
1753
  }
932
1754
  .pos-aside[data-open='true'] { transform: translateX(0); }
@@ -952,7 +1774,14 @@
952
1774
  Acima de 640px nada disto existe: a trilha da esquerda volta a ser a
953
1775
  navegação, que é o desenho certo para um terminal de balcão de 15".
954
1776
  -------------------------------------------------------------------------- */
955
- .pos-navbar { display: none; }
1777
+ /* Peças de CELULAR: existem só dentro da media query de 640px.
1778
+ Sem esta linha, o `.pos-cartbar` (a barra "Mesa 11 · 2 itens · R$ 74,00" que
1779
+ reabre a comanda no celular) nascia visível no desktop e ocupava a TERCEIRA
1780
+ COLUNA do grid — a coluna da comanda. O aside era empurrado para a linha 2,
1781
+ embaixo do rail esquerdo, com 208px de largura. O caminho para ver isso é
1782
+ estreito e por isso escapou: só acontece com a mesa selecionada, comanda com
1783
+ itens, ao tocar "Adicionar itens". */
1784
+ .pos-navbar, .pos-cartbar { display: none; }
956
1785
  .pos-more { display: none; }
957
1786
 
958
1787
  @media (max-width: 640px) {
@@ -1072,7 +1901,7 @@
1072
1901
  .pos-navbar__text { font-size: 11px; font-weight: 550; letter-spacing: 0.01em; }
1073
1902
  .pos-navbar__count {
1074
1903
  position: absolute; top: -4px; right: -10px;
1075
- min-width: 16px; padding: 0 4px; border-radius: 999px;
1904
+ min-width: 16px; padding: 0 4px; border-radius: var(--pos-r-pill);
1076
1905
  background: var(--pos-accent); color: var(--pos-accent-fg);
1077
1906
  font-size: 10px; font-weight: 700; line-height: 16px; text-align: center;
1078
1907
  }
@@ -1080,7 +1909,7 @@
1080
1909
  .pos-more { display: block; position: fixed; inset: 0; z-index: 50; }
1081
1910
  .pos-more__scrim {
1082
1911
  position: absolute; inset: 0; border: none; padding: 0;
1083
- background: rgba(0, 0, 0, 0.55); cursor: pointer;
1912
+ background: var(--pos-scrim); cursor: pointer;
1084
1913
  }
1085
1914
  /* Entra pela ESQUERDA, de onde a trilha saiu: é a mesma navegação, guardada
1086
1915
  no mesmo lado em que ela morava na tela larga. */
@@ -1099,7 +1928,7 @@
1099
1928
  .pos-more__head { display: flex; align-items: center; gap: var(--pos-2x); }
1100
1929
  .pos-more__close {
1101
1930
  margin-left: auto; display: grid; place-items: center;
1102
- height: 36px; width: 36px; border: none; border-radius: 999px;
1931
+ height: 36px; width: 36px; border: none; border-radius: var(--pos-r-pill);
1103
1932
  background: none; color: var(--pos-fg-2); cursor: pointer;
1104
1933
  }
1105
1934
  .pos-more__close:hover { background: var(--pos-2); color: var(--pos-fg); }
@@ -1177,20 +2006,31 @@
1177
2006
  .saas-takeover-panel:has(.pos[data-cart-open]) ~ .saas-takeover-close { display: none; }
1178
2007
 
1179
2008
  .pos-sheet-scrim {
2009
+ /* 55: ABAIXO do `.pos-aside`, que é 60.
2010
+ Este scrim é o fundo escuro ATRÁS da comanda-folha do celular, e não
2011
+ tem nada a ver com o das folhas de diálogo (que têm o seu, interno).
2012
+ Subi os dois juntos ao levar `.pos-sheet` para 200 e este passou a
2013
+ cobrir o drawer: o detalhe da mesa aparecia inteiro sob um desfoque de
2014
+ 10px, ilegível. */
1180
2015
  display: block; position: fixed; inset: 0; z-index: 55;
1181
2016
  border: none; padding: 0;
1182
- background: rgba(0, 0, 0, 0.45);
2017
+ background: var(--pos-scrim);
1183
2018
  -webkit-backdrop-filter: blur(10px) saturate(115%);
1184
2019
  backdrop-filter: blur(10px) saturate(115%);
1185
2020
  }
1186
2021
  .pos-aside {
1187
2022
  top: max(4rem, env(safe-area-inset-top));
1188
- border-radius: 22px 22px 0 0;
1189
- border-top: 1px solid rgba(255, 255, 255, 0.10);
1190
- background: color-mix(in srgb, var(--pos-1) 88%, transparent);
1191
- -webkit-backdrop-filter: blur(24px) saturate(160%);
1192
- backdrop-filter: blur(24px) saturate(160%);
1193
- box-shadow: 0 -18px 48px rgba(0, 0, 0, 0.55);
2023
+ border-radius: var(--pos-r-drawer) var(--pos-r-drawer) 0 0;
2024
+ /* A 88% a régua de categorias passava por trás como uma FAIXA de verde,
2025
+ laranja e roxo atravessando o alto da comanda — vidro virou vitral, e no
2026
+ fechamento de conta era a primeira coisa que o olho encontrava. A 96% o
2027
+ salão continua insinuado e nenhuma cor atravessa. */
2028
+ background: color-mix(in srgb, var(--pos-1) 96%, transparent);
2029
+ -webkit-backdrop-filter: blur(28px) saturate(140%);
2030
+ backdrop-filter: blur(28px) saturate(140%);
2031
+ box-shadow: 0 -18px 48px var(--pos-shadow);
2032
+ /* A quina só existe se ela CORTAR o que está dentro. */
2033
+ overflow: hidden;
1194
2034
  }
1195
2035
  /* A alça: 36×5 centrada, com respiro acima e abaixo — a medida do iOS, e a
1196
2036
  que o polegar reconhece como "isto se arrasta" sem nenhum rótulo. */
@@ -1199,11 +2039,30 @@
1199
2039
  height: 26px; flex: none; cursor: grab; touch-action: none;
1200
2040
  }
1201
2041
  .pos-aside__grab::before {
1202
- content: ''; width: 36px; height: 5px; border-radius: 999px;
1203
- background: rgba(255, 255, 255, 0.28);
2042
+ content: ''; width: 36px; height: 5px; border-radius: var(--pos-r-pill);
2043
+ background: var(--pos-veil-3);
1204
2044
  }
1205
2045
  .pos-aside[data-dragging='true'] { transition: none; }
1206
2046
  .pos-aside[data-dragging='true'] .pos-aside__grab { cursor: grabbing; }
2047
+
2048
+ /* A FOLHA também sobe do rodapé no celular.
2049
+ Centrada, ela virava um cartão branco no meio do drawer — e o founder leu
2050
+ exatamente assim: "os modais estão carregando dentro do bottom drawer".
2051
+ Ancorada embaixo, largura cheia e quina de iOS no topo, ela é
2052
+ inconfundivelmente uma camada acima de tudo, e o polegar a alcança sem
2053
+ subir a mão. */
2054
+ .pos-sheet { place-items: end stretch; }
2055
+ .pos-sheet__panel {
2056
+ width: 100%; max-height: min(88vh, 100% - 3rem);
2057
+ border: none; border-top: 1px solid var(--pos-line-strong);
2058
+ border-radius: var(--pos-r-drawer) var(--pos-r-drawer) 0 0;
2059
+ padding-bottom: env(safe-area-inset-bottom);
2060
+ animation: pos-sheet-up 220ms var(--pos-e);
2061
+ }
2062
+ @keyframes pos-sheet-up { from { transform: translateY(100%); } }
2063
+ @media (prefers-reduced-motion: reduce) {
2064
+ .pos-sheet__panel { animation: none; }
2065
+ }
1207
2066
  @media (prefers-reduced-motion: reduce) {
1208
2067
  .pos-aside { transition: none; }
1209
2068
  }
@@ -1231,7 +2090,7 @@
1231
2090
  .pos-skel { pointer-events: none; cursor: default; }
1232
2091
  .pos-skel::before { display: none; }
1233
2092
  .pos-skel__b {
1234
- display: block; border-radius: 6px;
2093
+ display: block; border-radius: var(--pos-r-sm);
1235
2094
  background: linear-gradient(
1236
2095
  90deg,
1237
2096
  var(--pos-3) 25%,
@@ -1278,7 +2137,7 @@
1278
2137
  transition: background var(--pos-t) var(--pos-e), border-color var(--pos-t) var(--pos-e), transform var(--pos-t) var(--pos-e);
1279
2138
  }
1280
2139
  .pos-pt:hover { transform: scale(1.03); z-index: 3; }
1281
- .pos-pt[data-shape='round'] { border-radius: 50%; }
2140
+ .pos-pt[data-shape='round'] { border-radius: var(--pos-r-round); }
1282
2141
  .pos-pt[data-shape='bar'] { border-radius: var(--pos-r-xs); }
1283
2142
  .pos-pt[data-status='free'] { background: var(--pos-3); border-color: var(--pos-line-strong); color: var(--pos-fg-2); }
1284
2143
  .pos-pt[data-status='occupied'] { background: var(--pos-warn); border-color: var(--pos-warn); color: var(--pos-on-light); }
@@ -1290,7 +2149,7 @@
1290
2149
  .pos-pt[aria-current='true'] {
1291
2150
  outline: 3px solid var(--pos-fg);
1292
2151
  outline-offset: 3px;
1293
- box-shadow: 0 0 0 7px var(--pos-1), 0 8px 26px -6px rgba(0, 0, 0, 0.8);
2152
+ box-shadow: 0 0 0 7px var(--pos-1), 0 8px 26px -6px var(--pos-shadow-strong);
1294
2153
  transform: scale(1.04);
1295
2154
  z-index: 5;
1296
2155
  }
@@ -1299,7 +2158,7 @@
1299
2158
 
1300
2159
  /* Seats: small dots hugging the table, so a six-top reads as a six-top. */
1301
2160
  .pos-seat {
1302
- position: absolute; width: 13px; height: 13px; border-radius: 50%;
2161
+ position: absolute; width: 13px; height: 13px; border-radius: var(--pos-r-round);
1303
2162
  background: var(--pos-3); border: 1px solid var(--pos-line-strong);
1304
2163
  pointer-events: none;
1305
2164
  }
@@ -1313,14 +2172,20 @@
1313
2172
  border-top: 1px solid var(--pos-line); font-size: 12px; color: var(--pos-fg-2);
1314
2173
  }
1315
2174
  .pos-legend__k { display: inline-flex; align-items: center; gap: 6px; }
1316
- .pos-legend__sw { width: 12px; height: 12px; border-radius: 3px; }
2175
+ .pos-legend__sw { width: 12px; height: 12px; border-radius: var(--pos-r-xs); }
1317
2176
 
1318
2177
  /* --- modifier sheet -----------------------------------------------------
1319
2178
  Only for items that ask a question. A sheet in front of a beer is a tax on
1320
2179
  every round.
1321
2180
  ------------------------------------------------------------------------- */
1322
2181
 
1323
- .pos-sheet { position: fixed; inset: 0; z-index: 60; display: grid; place-items: center; }
2182
+ /* Acima da CASCA, não só acima do PDV.
2183
+ Enquanto a folha morava dentro do takeover, `z-index: 60` só competia com
2184
+ irmãos do PDV. Levada ao `body` pelo portal, ela passou a ser irmã do
2185
+ próprio takeover — que é `z-[120]` — e abria ATRÁS dele: o clique em
2186
+ "Desconto" montava a folha, e a tela não mudava. Daí o número alto e o
2187
+ comentário: quem mexer no z-index da casca precisa passar por aqui. */
2188
+ .pos-sheet { position: fixed; inset: 0; z-index: 200; display: grid; place-items: center; }
1324
2189
  .pos-sheet__scrim {
1325
2190
  position: absolute; inset: 0;
1326
2191
  /* Strong enough to isolate the foreground; below that the floor behind keeps
@@ -1332,9 +2197,14 @@
1332
2197
  position: relative; display: flex; flex-direction: column;
1333
2198
  width: min(560px, 92vw); max-height: min(80vh, 720px);
1334
2199
  border: 1px solid var(--pos-line-strong); border-radius: var(--pos-r);
1335
- background: var(--pos-1); box-shadow: 0 32px 64px rgba(0, 0, 0, 0.55);
2200
+ background: var(--pos-1); box-shadow: 0 32px 64px var(--pos-shadow);
1336
2201
  animation: pos-sheet-in 180ms var(--pos-e);
1337
2202
  }
2203
+ /* «Organizar automaticamente» é uma folha LARGA: a etapa 2 tem duas listas
2204
+ lado a lado — o que já está no ambiente e o catálogo inteiro —, e empilhar
2205
+ as duas faria o operador rolar entre elas para conferir cada mesa. */
2206
+ .pos-sheet__panel--wide { width: min(1000px, 94vw); max-height: min(88vh, 820px); }
2207
+
1338
2208
  @keyframes pos-sheet-in { from { opacity: 0; transform: translateY(8px) scale(0.99); } }
1339
2209
  @media (prefers-reduced-motion: reduce) { .pos-sheet__panel { animation: none; } }
1340
2210
 
@@ -1342,7 +2212,136 @@
1342
2212
  display: flex; align-items: flex-start; justify-content: space-between; gap: var(--pos-3x);
1343
2213
  padding: var(--pos-4x); border-bottom: 1px solid var(--pos-line);
1344
2214
  }
1345
- .pos-sheet__body { padding: var(--pos-4x); display: grid; gap: var(--pos-4x); min-height: 0; }
2215
+ /* O CORPO É QUE ROLA — não a folha inteira, e não a página atrás dela.
2216
+ Sem `overflow-y` aqui, o painel (flex column com `max-height`) simplesmente
2217
+ cortava o conteúdo que não coubesse: a folha da escala, com a lista da
2218
+ equipe e as pessoas já escaladas, ficava sem o botão "Escalar" e sem o
2219
+ rodapé do corte do dia. Vale para TODAS as folhas — a escala só foi a
2220
+ primeira alta o bastante para mostrar. O `flex: 1 1 auto` com `min-height:
2221
+ 0` é o par que faz um filho de coluna flex poder encolher e rolar. */
2222
+ .pos-sheet__body {
2223
+ padding: var(--pos-4x); display: grid; gap: var(--pos-4x);
2224
+ flex: 1 1 auto; min-height: 0; overflow-y: auto; overscroll-behavior: contain;
2225
+ }
2226
+ /* Cabeçalho e rodapé não encolhem: são o título e o botão que decide. */
2227
+ .pos-sheet__head, .pos-sheet__foot { flex: 0 0 auto; }
2228
+
2229
+ /* ── A folha de desconto ───────────────────────────────────────────────── */
2230
+ .pos-sheet__title { display: flex; align-items: center; gap: var(--pos-2x); margin: 0; font-size: 19px; font-weight: 660; }
2231
+ /* O subtítulo da folha: a frase que explica a ETAPA. Ela muda entre a 1 e a
2232
+ 2, e é o único lugar que diz o que o operador está respondendo agora. */
2233
+ .pos-sheet__sub { margin: 4px 0 0; font-size: 12.5px; line-height: 1.45; color: var(--pos-fg-3); }
2234
+ .pos-sheet__x {
2235
+ width: var(--pos-hit-3); height: var(--pos-hit-3); flex: none;
2236
+ display: grid; place-items: center; border: 0; border-radius: var(--pos-r-sm);
2237
+ background: transparent; color: var(--pos-fg-2); cursor: pointer;
2238
+ }
2239
+ .pos-sheet__x:hover { background: var(--pos-3); color: var(--pos-fg); }
2240
+ /* O motivo de não poder confirmar fica ABAIXO do botão, onde o olho volta
2241
+ depois de bater nele — e não num tooltip que exige uma segunda tentativa. */
2242
+ /* A dica que explica um campo VAZIO. Em branco não é zero — é "usa a taxa da
2243
+ mesa" —, e essa é a frase que o operador precisa ler antes de apagar. */
2244
+ .pos-sheet__hint {
2245
+ margin: 6px 0 0; font-size: 11.5px; color: var(--pos-fg-3);
2246
+ }
2247
+ .pos-sheet__why {
2248
+ margin: 0; padding: 0 var(--pos-4x) var(--pos-4x);
2249
+ font-size: 13px; color: var(--pos-warn); text-align: right;
2250
+ }
2251
+
2252
+ .pos-dsc__sec { display: grid; gap: var(--pos-2x); }
2253
+ .pos-dsc__lbl {
2254
+ font-size: 12px; font-weight: 700; letter-spacing: 0.06em; text-transform: uppercase;
2255
+ color: var(--pos-fg-3);
2256
+ }
2257
+ /* A lista rola sozinha: numa comanda de quinze itens ela empurrava o botão
2258
+ para fora da folha, e o operador escolhia sem ver o que ia aplicar. */
2259
+ .pos-dsc__lines { list-style: none; margin: 0; padding: 0; display: grid; gap: 2px; max-height: 208px; overflow-y: auto; }
2260
+ .pos-dsc__line {
2261
+ display: grid; grid-template-columns: auto auto minmax(0, 1fr) auto;
2262
+ align-items: center; gap: var(--pos-2x);
2263
+ min-height: var(--pos-hit-3); padding: 0 var(--pos-2x);
2264
+ border-radius: var(--pos-r-sm); cursor: pointer;
2265
+ }
2266
+ .pos-dsc__line:hover { background: var(--pos-3); }
2267
+ .pos-dsc__n { font-size: 13px; font-weight: 650; color: var(--pos-fg-3); }
2268
+ .pos-dsc__name { font-size: 14.5px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
2269
+ .pos-dsc__row { display: grid; grid-template-columns: auto minmax(0, 1fr) auto; gap: var(--pos-2x); align-items: center; }
2270
+ .pos-dsc__val, .pos-dsc__sel, .pos-dsc__memo, .pos-dsc__pin {
2271
+ min-height: var(--pos-hit-2); padding: 0 var(--pos-3x);
2272
+ border: 1px solid var(--pos-line-strong); border-radius: var(--pos-r-sm);
2273
+ background: var(--pos-2); color: var(--pos-fg); font: inherit; font-size: 15px;
2274
+ }
2275
+ .pos-dsc__memo { padding: var(--pos-2x) var(--pos-3x); resize: vertical; line-height: 1.4; }
2276
+ .pos-dsc__val { text-align: right; font-variant-numeric: tabular-nums; }
2277
+ /* O valor em dinheiro do que foi digitado, ao lado — o operador confere o
2278
+ resultado sem fazer a conta de cabeça, que é onde o desconto erra. */
2279
+ .pos-dsc__eq { font-size: 15px; font-weight: 650; color: var(--pos-warn); min-width: 96px; text-align: right; }
2280
+
2281
+ /* ── A folha de taxa de serviço ────────────────────────────────────────── */
2282
+ /* As taxas cadastradas em fileira: escolher a da casa é um toque, e digitar
2283
+ é a exceção. Em coluna, a lista empurrava os dois números que decidem
2284
+ (elegível e total) para fora da folha. */
2285
+ .pos-svc__presets { display: flex; flex-wrap: wrap; gap: var(--pos-2x); }
2286
+ .pos-svc__preset {
2287
+ display: grid; gap: 1px; justify-items: start;
2288
+ min-height: var(--pos-hit-2); padding: var(--pos-2x) var(--pos-3x);
2289
+ border: 1px solid var(--pos-line-strong); border-radius: var(--pos-r-sm);
2290
+ background: var(--pos-2); color: var(--pos-fg); cursor: pointer; font: inherit;
2291
+ }
2292
+ .pos-svc__preset[aria-pressed='true'] {
2293
+ border-color: var(--pos-accent);
2294
+ background: color-mix(in srgb, var(--pos-accent) 14%, var(--pos-2));
2295
+ }
2296
+ .pos-svc__pn { font-size: 13px; color: var(--pos-fg-2); }
2297
+ .pos-svc__preset[aria-pressed='true'] .pos-svc__pn { color: var(--pos-fg); }
2298
+
2299
+ /* Os dois números que decidem, num bloco próprio. O "elegível" é o que mais
2300
+ surpreende quem opera — a taxa não incide sobre o subtotal —, e escondê-lo
2301
+ faria o total sair de uma base invisível. */
2302
+ .pos-svc__sum {
2303
+ display: grid; gap: var(--pos-1x);
2304
+ padding: var(--pos-3x); border-radius: var(--pos-r);
2305
+ background: var(--pos-3);
2306
+ }
2307
+ .pos-svc__line { display: flex; justify-content: space-between; gap: var(--pos-3x); font-size: 14px; color: var(--pos-fg-2); }
2308
+ .pos-svc__line--strong { font-size: 15px; font-weight: 650; color: var(--pos-fg); }
2309
+ .pos-svc__line--strong .pos-num { color: var(--pos-accent); }
2310
+
2311
+ .pos-svc__guest {
2312
+ display: grid; grid-template-columns: minmax(0, 1fr) 84px auto;
2313
+ align-items: center; gap: var(--pos-2x);
2314
+ min-height: var(--pos-hit-3); padding: 0 var(--pos-2x);
2315
+ }
2316
+ .pos-svc__gv { min-height: 36px; }
2317
+ /* O preço tem COLUNA, não largura própria.
2318
+ Cada linha é a sua própria grade, e a terceira coluna é `auto`: «R$ 8,90»
2319
+ empurrava o seletor 9px para a direita e a fileira inteira ficava serrilhada.
2320
+ Largura mínima e alinhamento à direita fazem as três colunas se
2321
+ corresponderem de uma linha para a outra. */
2322
+ .pos-dsc__lines .pos-svc__guest > .pos-num {
2323
+ min-width: 76px; text-align: right; font-variant-numeric: tabular-nums;
2324
+ }
2325
+
2326
+ /* "Adicionar itens", ao pé das linhas da comanda. Sem preenchimento e sem
2327
+ contorno cheio: ele é um caminho, não a ação da tela — o botão que decide
2328
+ está no rodapé e não pode ter concorrente. */
2329
+ .pos-tr__add {
2330
+ display: flex; align-items: center; justify-content: center; gap: var(--pos-2x);
2331
+ width: calc(100% - var(--pos-3x) * 2); margin: var(--pos-2x) var(--pos-3x) var(--pos-4x);
2332
+ min-height: var(--pos-hit-2);
2333
+ border: 1px dashed var(--pos-line-strong); border-radius: var(--pos-r);
2334
+ background: transparent; color: var(--pos-fg-2);
2335
+ font: inherit; font-size: 14.5px; font-weight: 550; cursor: pointer;
2336
+ transition: background var(--pos-t) var(--pos-e), color var(--pos-t) var(--pos-e);
2337
+ }
2338
+ .pos-tr__add:hover { background: var(--pos-3); color: var(--pos-fg); }
2339
+
2340
+ /* "Mesa atual:" — de onde se sai. Sem isto a folha pergunta o destino sem
2341
+ dizer a origem, e numa casa de 207 mesas o operador confere no que já
2342
+ fechou atrás da folha. */
2343
+ .pos-sheet__from { margin: 0; font-size: 14px; color: var(--pos-fg-2); }
2344
+ .pos-sheet__from strong { color: var(--pos-fg); font-weight: 650; }
1346
2345
  .pos-sheet__foot {
1347
2346
  display: grid; grid-template-columns: auto 1fr; gap: var(--pos-2x);
1348
2347
  padding: var(--pos-3x) var(--pos-4x) var(--pos-4x); border-top: 1px solid var(--pos-line);
@@ -1412,11 +2411,11 @@
1412
2411
 
1413
2412
  .pos-ln__state {
1414
2413
  width: 14px; height: 22px; flex: none;
1415
- display: grid; place-items: center; border-radius: 50%;
2414
+ display: grid; place-items: center; border-radius: var(--pos-r-round);
1416
2415
  color: var(--pos-fg-3);
1417
2416
  }
1418
2417
  .pos-ln[data-state='pending'] .pos-ln__state::before {
1419
- content: ''; width: 8px; height: 8px; border-radius: 50%;
2418
+ content: ''; width: 8px; height: 8px; border-radius: var(--pos-r-round);
1420
2419
  background: currentColor;
1421
2420
  }
1422
2421
  /* Pending is the only state that still needs someone to do something, so it
@@ -1457,7 +2456,7 @@
1457
2456
  .pos-pt__badge {
1458
2457
  position: absolute; top: -9px; left: 50%; transform: translateX(-50%);
1459
2458
  min-width: 24px; height: 18px; padding: 0 5px;
1460
- display: grid; place-items: center; border-radius: 9px;
2459
+ display: grid; place-items: center; border-radius: var(--pos-r-sm);
1461
2460
  background: var(--pos-4); color: var(--pos-fg);
1462
2461
  font-size: 11px; font-weight: 700; border: 1px solid var(--pos-0);
1463
2462
  }
@@ -1500,7 +2499,7 @@
1500
2499
 
1501
2500
  .pos-pin__dots { display: flex; justify-content: center; gap: var(--pos-3x); padding: var(--pos-2x) 0; }
1502
2501
  .pos-pin__dot {
1503
- width: 16px; height: 16px; border-radius: 50%;
2502
+ width: 16px; height: 16px; border-radius: var(--pos-r-round);
1504
2503
  border: 2px solid var(--pos-line-strong); background: transparent;
1505
2504
  transition: background var(--pos-t) var(--pos-e), border-color var(--pos-t) var(--pos-e);
1506
2505
  }
@@ -1561,11 +2560,29 @@
1561
2560
  }
1562
2561
  /* Columns are lanes, not floating cards: giving them a surface makes an empty
1563
2562
  "Pronto" read as a state of the kitchen instead of a rendering gap. */
2563
+ /* As cores das colunas do delivery, no matiz do V1.
2564
+ *
2565
+ * O `DeliveryKanban` pinta a borda de cada coluna com um Tailwind 500 — e são
2566
+ * ESTES hexes, não parecidos: o operador aprende o quadro pela cor antes de ler
2567
+ * o nome, e um verde diferente é um quadro diferente.
2568
+ *
2569
+ * `slate-400` é o único 400 da lista, e também no V1: «Entregue» é o que já
2570
+ * saiu de cena e não deve competir com o que ainda está na esteira. */
2571
+ :root {
2572
+ --pos-deliv-blue: #3b82f6; /* border-blue-500 — Pedidos */
2573
+ --pos-deliv-emerald: #10b981; /* border-emerald-500 — Aguardando preparo, Pronto */
2574
+ --pos-deliv-amber: #f59e0b; /* border-amber-500 — Preparando */
2575
+ --pos-deliv-violet: #8b5cf6; /* border-violet-500 — Em rota */
2576
+ --pos-deliv-slate: #94a3b8; /* border-slate-400 — Entregue */
2577
+ }
2578
+
1564
2579
  .pos-col {
1565
2580
  display: flex; flex-direction: column; min-height: 0;
1566
2581
  border: 1px solid var(--pos-line); border-radius: var(--pos-r);
1567
2582
  background: var(--pos-1); overflow: hidden;
1568
2583
  }
2584
+ /* No TOPO, como no V1 — ele usa `border-t-4` na seção da coluna. */
2585
+ .pos-col[style*="--pos-col-edge"] { border-top: 3px solid var(--pos-col-edge); }
1569
2586
  .pos-col__head {
1570
2587
  display: flex; align-items: center; gap: var(--pos-2x);
1571
2588
  padding: var(--pos-3x); border-bottom: 1px solid var(--pos-line);
@@ -1574,7 +2591,7 @@
1574
2591
  .pos-col__t { font-size: 12px; font-weight: 700; letter-spacing: 0.06em; text-transform: uppercase; color: var(--pos-fg); }
1575
2592
  .pos-col__n {
1576
2593
  margin-left: auto; min-width: 20px; height: 18px; padding: 0 5px;
1577
- display: grid; place-items: center; border-radius: 9px;
2594
+ display: grid; place-items: center; border-radius: var(--pos-r-sm);
1578
2595
  background: var(--pos-2); font-size: 11px; font-weight: 700; color: var(--pos-fg-2);
1579
2596
  }
1580
2597
  .pos-col__body {
@@ -1704,7 +2721,7 @@
1704
2721
  }
1705
2722
  .pos-user__av {
1706
2723
  width: 30px; height: 30px; flex: none; display: grid; place-items: center;
1707
- border-radius: 50%; background: var(--pos-primary); color: var(--pos-primary-fg);
2724
+ border-radius: var(--pos-r-round); background: var(--pos-primary); color: var(--pos-primary-fg);
1708
2725
  font-size: 13px; font-weight: 700;
1709
2726
  }
1710
2727
  .pos-user__txt { flex: 1; min-width: 0; display: flex; flex-direction: column; }
@@ -1715,7 +2732,7 @@
1715
2732
  /* Sem segunda linha, o ponto acompanha o nome em vez de flutuar sob ele. */
1716
2733
  .pos-user__name--dotted { display: flex; align-items: center; gap: 6px; }
1717
2734
  .pos-user__meta { display: flex; align-items: center; gap: 5px; font-size: 11px; line-height: 1.25; }
1718
- .pos-user__dot { width: 6px; height: 6px; border-radius: 50%; flex: none; background: var(--pos-ok); }
2735
+ .pos-user__dot { width: 6px; height: 6px; border-radius: var(--pos-r-round); flex: none; background: var(--pos-ok); }
1719
2736
  .pos-user[data-state='reconnecting'] .pos-user__dot { background: var(--pos-warn); }
1720
2737
  .pos-user[data-state='offline'] .pos-user__dot { background: var(--pos-danger); }
1721
2738
  /* Losing the network is the one thing worth shouting about from the rail. */
@@ -1735,12 +2752,12 @@
1735
2752
  /* The hint only fits once the field is open; collapsed it just spills. */
1736
2753
  .pos-field__clear {
1737
2754
  flex: none; width: 26px; height: 26px; display: grid; place-items: center;
1738
- border: none; border-radius: 50%; background: var(--pos-3); color: var(--pos-fg-2);
2755
+ border: none; border-radius: var(--pos-r-round); background: var(--pos-3); color: var(--pos-fg-2);
1739
2756
  cursor: pointer;
1740
2757
  }
1741
2758
  .pos-field__clear:hover { background: var(--pos-4); color: var(--pos-fg); }
1742
2759
  .pos-field__hint {
1743
- flex: none; padding: 2px 6px; border-radius: 4px; border: 1px solid var(--pos-line-strong);
2760
+ flex: none; padding: 2px 6px; border-radius: var(--pos-r-xs); border: 1px solid var(--pos-line-strong);
1744
2761
  background: var(--pos-0); color: var(--pos-fg-3); font-size: 10px; font-weight: 700;
1745
2762
  }
1746
2763
 
@@ -1767,11 +2784,11 @@
1767
2784
  sees, and then the markers read as three unrelated bullets. */
1768
2785
  .pos-ev:not(:last-child)::before {
1769
2786
  content: ''; position: absolute; left: 10px; top: 16px; bottom: -2px; width: 2px;
1770
- border-radius: 1px; background: var(--pos-4);
2787
+ border-radius: var(--pos-r-xs); background: var(--pos-4);
1771
2788
  }
1772
2789
  .pos-ev__mark {
1773
2790
  position: relative; z-index: 1;
1774
- width: 10px; height: 10px; margin: 5px auto 0; border-radius: 50%;
2791
+ width: 10px; height: 10px; margin: 5px auto 0; border-radius: var(--pos-r-round);
1775
2792
  background: var(--pos-fg-2); box-shadow: 0 0 0 3px var(--pos-1);
1776
2793
  }
1777
2794
  .pos-ev[data-done='false'] .pos-ev__mark {
@@ -1910,7 +2927,11 @@
1910
2927
  .pos-back {
1911
2928
  display: flex; align-items: center; gap: var(--pos-2x);
1912
2929
  width: 100%; min-height: 56px; padding: 0 var(--pos-4x);
1913
- border: none; border-bottom: 1px solid var(--pos-line);
2930
+ /* Sem régua embaixo. O cabeçalho do passo vem logo abaixo com a sua, e as
2931
+ duas juntas — mais a borda do topo do drawer e a do primeiro cartão —
2932
+ empilhavam quatro linhas horizontais nos primeiros 120px da tela. O
2933
+ caminho de volta se separa pelo espaço, não por mais um traço. */
2934
+ border: none;
1914
2935
  background: transparent; color: var(--pos-fg-2);
1915
2936
  font-size: 15px; font-weight: 550; text-align: left; cursor: pointer;
1916
2937
  transition: background var(--pos-t) var(--pos-e), color var(--pos-t) var(--pos-e);
@@ -1919,11 +2940,6 @@
1919
2940
  .pos-back:active { background: var(--pos-3); }
1920
2941
  .pos-back svg { flex: none; }
1921
2942
 
1922
- .pos-checkout__head {
1923
- display: flex; align-items: center; gap: var(--pos-2x);
1924
- padding: var(--pos-4x) var(--pos-4x) 0;
1925
- }
1926
-
1927
2943
  .pos-empty__b {
1928
2944
  margin-top: var(--pos-2x); min-height: var(--pos-hit-2); padding: 0 var(--pos-4x);
1929
2945
  border: 1px solid var(--pos-line-strong); border-radius: var(--pos-r);
@@ -2018,7 +3034,7 @@
2018
3034
  .pos-res__b {
2019
3035
  display: inline-flex; align-items: center; justify-content: center; gap: 7px;
2020
3036
  min-height: 52px; padding: 0 var(--pos-4x);
2021
- border: 1px solid var(--pos-line-strong); border-radius: 999px;
3037
+ border: 1px solid var(--pos-line-strong); border-radius: var(--pos-r-pill);
2022
3038
  background: transparent; color: var(--pos-fg-2);
2023
3039
  font-size: 14px; font-weight: 600; cursor: pointer;
2024
3040
  transition: background var(--pos-t) var(--pos-e), color var(--pos-t) var(--pos-e), transform var(--pos-t) var(--pos-e);
@@ -2030,7 +3046,7 @@
2030
3046
  background: var(--pos-primary); border-color: var(--pos-primary); color: var(--pos-primary-fg);
2031
3047
  font-weight: 650;
2032
3048
  }
2033
- .pos-res__b--primary:hover { background: #fff; border-color: #fff; color: var(--pos-primary-fg); }
3049
+ .pos-res__b--primary:hover { background: var(--pos-primary-hover); border-color: var(--pos-primary-hover); color: var(--pos-primary-fg); }
2034
3050
  .pos-res__at {
2035
3051
  min-width: 116px;
2036
3052
  border-color: color-mix(in srgb, var(--pos-ok) 45%, transparent);
@@ -2046,48 +3062,80 @@
2046
3062
  .pos-res__do { grid-column: 2 / -1; justify-content: flex-end; }
2047
3063
  }
2048
3064
 
2049
- /* --- seating a party ----------------------------------------------------
2050
- A booking waiting for a table. It rides in the dock with the open tickets
2051
- because that is where the operator already looks for "what is in my hands
2052
- right now".
3065
+ /* --- acomodação em curso -------------------------------------------------
3066
+ Um grupo esperando mesa. Ela vivia DENTRO da bandeja de comandas abertas,
3067
+ e aquilo é a régua de comandas — não um lugar para o modo do aplicativo:
3068
+ espremida entre as pastilhas de praça e a ficha da comanda ativa, a única
3069
+ instrução da tela saía ilegível.
3070
+
3071
+ Agora ela FLUTUA sobre a planta, ancorada no `.pos-main` (que já é
3072
+ `position: relative` por causa da faixa de aviso). Fica acima da bandeja e
3073
+ do aviso no empilhamento, centrada, e larga o suficiente para o nome caber
3074
+ sem quebrar — é o nome que o anfitrião procura quando olha para cá.
2053
3075
  ------------------------------------------------------------------------- */
2054
3076
 
2055
3077
  .pos-seating {
2056
- /* Same borderless language as the rest of the strip, but FILLED: this is not
2057
- another table to pick from, it is the app being in a mode, and a mode has
2058
- to be visible from anywhere on screen.
2059
- It also has to stop touching the strip: two filled blocks flush against
2060
- each other read as one confused thing, which is exactly what happened next
2061
- to the inverted active chip. */
2062
- /* Sticky, because it is the MODE and not an item in the list: when the strip
2063
- scrolls to the active table it would carry the one thing the operator has
2064
- to finish off the screen. */
2065
- position: sticky; left: 0; z-index: 2;
2066
- flex: 0 0 auto; display: flex; align-items: center; gap: var(--pos-3x);
2067
- min-height: 68px; padding: 0 var(--pos-3x) 0 var(--pos-4x);
2068
- margin-right: var(--pos-3x);
2069
- border: none; border-right: 2px solid var(--pos-0); border-radius: 0;
2070
- background: var(--pos-accent); color: #fff;
2071
- box-shadow: 6px 0 12px -6px rgba(0, 0, 0, 0.6);
2072
- }
2073
- /* While a party is waiting, nothing else in the strip claims to be primary:
2074
- the mode is the one thing the operator has to finish. */
2075
- .pos-dock:has(.pos-seating) .pos-dchip[aria-current='true'] {
2076
- background: var(--pos-3); color: var(--pos-fg);
2077
- }
2078
- .pos-dock:has(.pos-seating) .pos-dchip[aria-current='true'] .pos-dchip__t { color: var(--pos-fg); }
2079
- .pos-dock:has(.pos-seating) .pos-dchip[aria-current='true'] .pos-dchip__s { color: var(--pos-fg-2); }
2080
- .pos-dock:has(.pos-seating) .pos-dchip[aria-current='true'] .pos-dchip__tag { background: var(--pos-4); color: var(--pos-fg); }
3078
+ position: absolute; z-index: 45;
3079
+ left: 50%; transform: translateX(-50%);
3080
+ /* EM CIMA — mas SOBRE A GRADE, não sobre o cabeçalho.
3081
+ Ela estava acima do rodapé, disputando com as fichas e as pastilhas de
3082
+ praça. Subiu; e subiu demais: encostada nas abas, ela flutuava sobre a
3083
+ barra clara, onde não há o que desfocar e o vidro não se lê como vidro.
3084
+ Agora ela desce o bastante para pousar sobre os CARTÕES — que é o que dá
3085
+ profundidade ao desfoque e o que o olho está olhando. */
3086
+ top: 104px;
3087
+ max-width: min(520px, calc(100% - var(--pos-6x) * 2));
3088
+ display: flex; align-items: center; gap: var(--pos-3x);
3089
+ min-height: 60px; padding: var(--pos-2x) var(--pos-2x) var(--pos-2x) var(--pos-5x);
3090
+ border-radius: var(--pos-r-pill);
3091
+ /* VIDRO, não tinta chapada.
3092
+ A faixa cobre parte da grade enquanto o operador escolhe, e um bloco opaco
3093
+ apaga as mesas que estão debaixo dela — justamente as que ele está
3094
+ olhando. Com o fundo translúcido e desfocado, ela continua legível e o
3095
+ salão continua visível através dela. O `-webkit-` fica: o Safari do
3096
+ terminal ainda o pede. */
3097
+ /* Mais vidro que tinta: a 82% sobre fundo claro a translucidez não aparecia
3098
+ e a peça lia como um bloco chapado. A 60%, com desfoque maior, as mesas
3099
+ atravessam — e é isso que diz «isto está POR CIMA, e é temporário». */
3100
+ background: color-mix(in srgb, var(--pos-accent) 60%, transparent);
3101
+ -webkit-backdrop-filter: blur(22px) saturate(180%);
3102
+ backdrop-filter: blur(22px) saturate(180%);
3103
+ /* A borda clara é o que desenha a quina do vidro contra o que passa por
3104
+ baixo; sem ela a peça se dissolve na grade em vez de flutuar sobre ela. */
3105
+ border: 1px solid color-mix(in srgb, #fff 45%, transparent);
3106
+ color: #fff;
3107
+ /* A sombra é o que a faz parecer POR CIMA em vez de colada: sem ela, sobre a
3108
+ planta clara, o bloco lê como mais um retângulo do salão. */
3109
+ box-shadow: 0 10px 30px -8px rgba(0, 0, 0, 0.45), 0 2px 6px rgba(0, 0, 0, 0.2);
3110
+ animation: pos-seating-in 180ms var(--pos-e) both;
3111
+ }
3112
+ /* Sem `backdrop-filter` (navegador antigo), a translucidez sozinha deixaria o
3113
+ texto sobre as mesas. Aí a tinta volta a ser chapada — feio é melhor que
3114
+ ilegível. */
3115
+ @supports not (backdrop-filter: blur(4px)) {
3116
+ .pos-seating { background: var(--pos-accent); }
3117
+ }
3118
+ @keyframes pos-seating-in {
3119
+ from { opacity: 0; transform: translate(-50%, -10px); }
3120
+ to { opacity: 1; transform: translate(-50%, 0); }
3121
+ }
3122
+ @media (prefers-reduced-motion: reduce) { .pos-seating { animation: none; } }
3123
+ .pos-seating__who { min-width: 0; }
3124
+ /* A regra que descontava a altura da bandeja saiu junto com a bandeja: durante
3125
+ a escolha da mesa não há régua embaixo para desviar. */
2081
3126
  .pos-seating__pulse {
2082
- width: 9px; height: 9px; flex: none; border-radius: 50%;
3127
+ width: 9px; height: 9px; flex: none; border-radius: var(--pos-r-round);
2083
3128
  background: #fff; animation: pos-pulse 1.6s ease-in-out infinite;
2084
3129
  }
2085
3130
  @keyframes pos-pulse { 50% { opacity: 0.25; } }
2086
3131
  @media (prefers-reduced-motion: reduce) { .pos-seating__pulse { animation: none; } }
2087
- .pos-seating__t { display: block; font-size: 13.5px; font-weight: 650; }
2088
- .pos-seating__s { display: block; font-size: 12.5px; color: rgba(255, 255, 255, 0.82); }
3132
+ .pos-seating__t {
3133
+ display: block; font-size: 15px; font-weight: 700; letter-spacing: -0.01em;
3134
+ white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
3135
+ }
3136
+ .pos-seating__s { display: block; font-size: 12.5px; color: rgba(255, 255, 255, 0.86); }
2089
3137
  .pos-seating__x {
2090
- width: 32px; height: 32px; flex: none; display: grid; place-items: center;
3138
+ width: 40px; height: 40px; flex: none; display: grid; place-items: center;
2091
3139
  border: none; border-radius: var(--pos-r-xs); background: transparent;
2092
3140
  color: rgba(255, 255, 255, 0.82); cursor: pointer;
2093
3141
  }
@@ -2119,6 +3167,78 @@
2119
3167
 
2120
3168
  /* The order stage can carry two actions: what to do next, and the way past it. */
2121
3169
  .pos-cta--stack { display: grid; gap: var(--pos-2x); }
3170
+
3171
+ /* ── O "…" da comanda ──────────────────────────────────────────────────────
3172
+ `auto` e não uma largura fixa: o gatilho tem o tamanho do piso de toque e o
3173
+ botão principal fica com todo o resto, em qualquer largura de coluna. */
3174
+ .pos-cta__row { display: grid; grid-template-columns: 1fr auto; gap: var(--pos-2x); }
3175
+ /* Imprimir e Desconto dividem a linha, meio a meio — nenhum dos dois é a ação
3176
+ da tela, e dar mais peso a um seria escolher por quem opera. */
3177
+ .pos-cta__aux { display: grid; grid-template-columns: 1fr 1fr; gap: var(--pos-2x); }
3178
+
3179
+ /* O ✕ de descartar, sobre o canto da ficha. Discreto até o ponteiro chegar:
3180
+ ele é a saída de um engano, não uma ação do turno. */
3181
+ .pos-dchip__wrap { position: relative; display: flex; flex: none; }
3182
+ .pos-dchip__x {
3183
+ position: absolute; top: 4px; right: 4px; z-index: 2;
3184
+ width: 20px; height: 20px; display: grid; place-items: center;
3185
+ border: 0; border-radius: var(--pos-r-round); cursor: pointer;
3186
+ background: var(--pos-3); color: var(--pos-fg-2);
3187
+ opacity: 0; transition: opacity var(--pos-t) var(--pos-e), background var(--pos-t) var(--pos-e);
3188
+ }
3189
+ .pos-dchip__wrap:hover .pos-dchip__x,
3190
+ .pos-dchip__x:focus-visible { opacity: 1; }
3191
+ .pos-dchip__x:hover { background: var(--pos-danger); color: #fff; }
3192
+ /* Num toque não há ponteiro: ali ele fica sempre visível, senão o gesto não
3193
+ existe para quem opera de tablet — que é a maioria. */
3194
+ @media (hover: none) { .pos-dchip__x { opacity: 1; } }
3195
+ .pos-cta__auxb {
3196
+ width: 100%; min-height: 48px; padding: 0 var(--pos-3x);
3197
+ display: inline-flex; align-items: center; justify-content: center; gap: var(--pos-2x);
3198
+ border: 1px solid var(--pos-line-strong); border-radius: var(--pos-r);
3199
+ font-size: 14.5px;
3200
+ }
3201
+ .pos-cta__auxb:hover:not(:disabled) { background: var(--pos-3); color: var(--pos-fg); }
3202
+ .pos-cta__auxb:disabled { opacity: 0.45; cursor: not-allowed; }
3203
+
3204
+ /* NOME PRÓPRIO, e não é capricho: `.pos-more` já era o painel «Mais
3205
+ opções» da navbar de celular, que nasce `display:none` no desktop. As duas
3206
+ coisas dividindo a classe faziam o `⋯` da comanda — as CINCO ações do V1 —
3207
+ sumir da tela grande, alcançáveis só por atalho. */
3208
+ .pos-acts { position: relative; }
3209
+ .pos-acts__t {
3210
+ width: var(--pos-hit-2); min-width: var(--pos-hit-2); padding: 0;
3211
+ display: inline-flex; align-items: center; justify-content: center;
3212
+ }
3213
+ /* Sobe a partir do rodapé, encostado à direita: é de lá que ele foi aberto, e
3214
+ um menu que nasce longe do dedo faz o olho procurar. */
3215
+ .pos-acts__m {
3216
+ position: absolute; bottom: calc(100% + var(--pos-2x)); right: 0; z-index: 30;
3217
+ min-width: 248px; padding: var(--pos-1x);
3218
+ display: grid; gap: 2px;
3219
+ background: var(--pos-1);
3220
+ border: 1px solid var(--pos-line-strong);
3221
+ border-radius: var(--pos-r);
3222
+ box-shadow: 0 18px 40px -12px var(--pos-shadow);
3223
+ }
3224
+ .pos-acts__i {
3225
+ display: grid; gap: 1px; justify-items: start; text-align: left;
3226
+ padding: var(--pos-2x) var(--pos-3x);
3227
+ border: 0; border-radius: var(--pos-r-sm);
3228
+ background: transparent; color: var(--pos-fg); cursor: pointer;
3229
+ font: inherit;
3230
+ }
3231
+ .pos-acts__i:hover:not(:disabled) { background: var(--pos-3); }
3232
+ /* Desabilitado continua LEGÍVEL: a linha existe para ser lida junto com o
3233
+ motivo, e um cinza de 35% torna inútil justamente o texto que a explica. */
3234
+ .pos-acts__i:disabled { cursor: not-allowed; color: var(--pos-fg-2); }
3235
+ .pos-acts__i--danger:not(:disabled) { color: var(--pos-danger); }
3236
+ .pos-acts__sep {
3237
+ height: 1px; margin: var(--pos-1x) calc(var(--pos-1x) * -1);
3238
+ background: var(--pos-line);
3239
+ }
3240
+ .pos-acts__l { font-size: 15px; font-weight: 550; }
3241
+ .pos-acts__why { font-size: 12.5px; color: var(--pos-fg-3); line-height: 1.3; }
2122
3242
  .pos-btn--wide { width: 100%; min-height: 48px; font-size: 14px; }
2123
3243
  .pos-hint {
2124
3244
  display: flex; align-items: center; justify-content: center; gap: 7px;
@@ -2129,3 +3249,1380 @@
2129
3249
 
2130
3250
  .pos-scroll-x { overflow-x: auto; overscroll-behavior-x: contain; scrollbar-width: none; }
2131
3251
  .pos-scroll-x::-webkit-scrollbar { display: none; }
3252
+
3253
+ /* ---------------------------------------------------------------------------
3254
+ Participantes: as pastilhas em cima, os cartões por pessoa na conta.
3255
+ Portado de GuestBar.tsx + OrderCart.tsx do V1.
3256
+ --------------------------------------------------------------------------- */
3257
+ .pos-guests {
3258
+ display: flex; align-items: center; gap: var(--pos-2x);
3259
+ /* Respiro em cima: a barra encostava na linha "4 pessoas · 2h14" do
3260
+ cabeçalho, e as duas se liam como um bloco só. */
3261
+ padding: var(--pos-3x) var(--pos-3x) var(--pos-2x);
3262
+ border-bottom: 1px solid var(--pos-line);
3263
+ background: var(--pos-veil);
3264
+ }
3265
+ .pos-guests__add {
3266
+ flex: 0 0 auto; width: 34px; height: 34px; border-radius: var(--pos-r-pill);
3267
+ display: grid; place-items: center;
3268
+ border: 1px dashed var(--pos-line-strong); background: transparent; color: var(--pos-fg-2);
3269
+ cursor: pointer;
3270
+ }
3271
+ .pos-guests__add:hover { background: var(--pos-veil-2); color: var(--pos-fg); }
3272
+ .pos-guests__scroll {
3273
+ display: flex; align-items: center; gap: 6px;
3274
+ min-width: 0; flex: 1; overflow-x: auto; scrollbar-width: none;
3275
+ padding: 2px;
3276
+ }
3277
+ .pos-guests__scroll::-webkit-scrollbar { display: none; }
3278
+ .pos-gchip__wrap { position: relative; display: inline-flex; flex: 0 0 auto; }
3279
+ .pos-gchip {
3280
+ display: inline-flex; align-items: center; gap: 6px; flex: 0 0 auto;
3281
+ min-height: 34px; padding: 6px 13px; border-radius: var(--pos-r-pill);
3282
+ font-size: 13px; font-weight: 600; line-height: 1;
3283
+ border: 1px solid var(--pos-line); background: var(--pos-2); color: var(--pos-fg);
3284
+ cursor: pointer; white-space: nowrap;
3285
+ }
3286
+ .pos-gchip:hover { background: var(--pos-veil-2); }
3287
+ .pos-gchip[aria-pressed='true'] {
3288
+ background: var(--pos-primary); border-color: var(--pos-primary); color: var(--pos-on-filled);
3289
+ }
3290
+ /* A cadeira sem nome está PEDINDO alguma coisa — o tracejado diz isso. */
3291
+ .pos-gchip[data-anon] {
3292
+ border-style: dashed; background: transparent; color: var(--pos-fg-2);
3293
+ }
3294
+ .pos-gchip[data-settled] { opacity: 0.72; }
3295
+ .pos-gchip__i {
3296
+ display: inline-grid; place-items: center; width: 19px; height: 19px;
3297
+ border-radius: var(--pos-r-pill); font-size: 10px; font-weight: 800;
3298
+ background: color-mix(in srgb, var(--pos-primary) 20%, transparent);
3299
+ color: var(--pos-primary);
3300
+ }
3301
+ .pos-gchip[aria-pressed='true'] .pos-gchip__i {
3302
+ background: color-mix(in srgb, var(--pos-on-filled) 26%, transparent);
3303
+ color: var(--pos-on-filled);
3304
+ }
3305
+ .pos-gchip[data-anon] .pos-gchip__i {
3306
+ background: var(--pos-veil-2); color: var(--pos-fg-2);
3307
+ }
3308
+ .pos-gchip__ok {
3309
+ font-size: 10px; font-weight: 700; text-transform: uppercase; letter-spacing: 0.04em;
3310
+ color: var(--pos-ok);
3311
+ }
3312
+ /* O ✕ mora FORA do botão: botão dentro de botão não é HTML válido. */
3313
+ .pos-gchip__x {
3314
+ position: absolute; top: -3px; right: -3px; width: 16px; height: 16px;
3315
+ border-radius: var(--pos-r-pill); border: none; display: grid; place-items: center;
3316
+ background: var(--pos-danger); color: var(--pos-on-filled);
3317
+ cursor: pointer; opacity: 0; transition: opacity 120ms ease;
3318
+ }
3319
+ .pos-gchip__wrap:hover .pos-gchip__x,
3320
+ .pos-gchip__x:focus-visible { opacity: 1; }
3321
+
3322
+ .pos-gfield { display: flex; align-items: center; gap: 8px; color: var(--pos-fg-2); }
3323
+ .pos-gfield .pos-dsc__val { flex: 1; text-align: left; }
3324
+ .pos-gmatch {
3325
+ display: inline-flex; align-items: center; gap: 5px; margin-top: 6px;
3326
+ font-size: 11px; font-weight: 600; color: var(--pos-ok);
3327
+ }
3328
+
3329
+ .pos-gsec[data-grouped] {
3330
+ border: 1px solid var(--pos-line); border-radius: var(--pos-r);
3331
+ overflow: hidden; margin: var(--pos-3x) var(--pos-3x) 0;
3332
+ background: var(--pos-2);
3333
+ }
3334
+ /* O último respira embaixo também — senão o cartão encosta no "Adicionar
3335
+ itens" e os dois viram um bloco só. */
3336
+ .pos-gsec[data-grouped]:last-of-type { margin-bottom: var(--pos-3x); }
3337
+ .pos-gsec__head {
3338
+ padding: 8px var(--pos-3x); border-bottom: 1px solid var(--pos-line);
3339
+ background: var(--pos-veil-2); display: grid; gap: 3px;
3340
+ /* O cabeçalho é um <button>: sem isto ele herda a fonte do agente do
3341
+ usuário e a linha inteira muda de tipo ao virar controle. */
3342
+ width: 100%; border-left: 0; border-right: 0; border-top: 0;
3343
+ font: inherit; color: inherit; text-align: left; cursor: pointer;
3344
+ transition: background var(--pos-fast);
3345
+ }
3346
+ .pos-gsec__head:hover { background: var(--pos-3); }
3347
+ /* O chevron gira; ele é o único sinal de que a seção abre. */
3348
+ .pos-gsec__chev {
3349
+ color: var(--pos-fg-3); flex: 0 0 auto;
3350
+ transition: transform var(--pos-fast);
3351
+ }
3352
+ .pos-gsec__chev[data-open] { transform: rotate(90deg); }
3353
+ .pos-gsec__n {
3354
+ margin-left: auto; font-size: 11px; font-weight: 600; color: var(--pos-fg-3);
3355
+ white-space: nowrap;
3356
+ }
3357
+
3358
+ /* ---- Fechamento: a MESMA seção, com uma caixa de marcar ----------------
3359
+ Marcar decide quem paga; o resto da linha abre a lista. Dois alvos, porque
3360
+ conferir os itens de alguém não pode tirá-lo da cobrança. */
3361
+ .pos-gsec--pick { transition: border-color var(--pos-fast), background var(--pos-fast); }
3362
+ .pos-gsec--pick[data-picked] {
3363
+ border-color: var(--pos-primary);
3364
+ background: color-mix(in srgb, var(--pos-primary) 5%, var(--pos-2));
3365
+ }
3366
+ /* A LINHA INTEIRA marca; a seta e o nome expandem. Dois alvos, e o maior é o
3367
+ gesto que mais se repete. */
3368
+ /* O RECUO é do botão, não da linha.
3369
+ Com o padding na linha, a faixa à esquerda da seta pertencia ao alvo de
3370
+ MARCAR: o dedo mirava no nome, caía dois pixels antes e desmarcava a conta
3371
+ em vez de abrir a lista. Passando o recuo para dentro do botão, tudo o que
3372
+ parece "nome e seta" é o alvo de expandir. */
3373
+ .pos-gsec__head--pick {
3374
+ display: flex; align-items: center; gap: var(--pos-2x);
3375
+ padding: 0 var(--pos-2x) 0 0;
3376
+ }
3377
+ .pos-gsec__head--pick > .pos-gsec__open { padding: 8px var(--pos-2x) 8px var(--pos-3x); }
3378
+ .pos-gsec__head--pick[aria-disabled='true'] { opacity: 0.55; cursor: not-allowed; }
3379
+ /* A caixa fica à DIREITA: o polegar direito alcança a borda direita do tablet
3380
+ sem atravessar a tela. */
3381
+ .pos-gsec__pick {
3382
+ flex: 0 0 auto; width: 22px; height: 22px; border-radius: 6px;
3383
+ border: 2px solid var(--pos-line-2); background: var(--pos-1);
3384
+ display: inline-flex; align-items: center; justify-content: center;
3385
+ color: var(--pos-primary-fg); transition: all var(--pos-fast);
3386
+ }
3387
+ .pos-gsec__pick[data-on] { border-color: var(--pos-primary); background: var(--pos-primary); }
3388
+ .pos-gsec__open {
3389
+ order: 1; flex: 1 1 auto; min-width: 0; display: flex; align-items: center;
3390
+ padding: 0; border: 0; background: none; font: inherit; color: inherit;
3391
+ text-align: left; cursor: pointer;
3392
+ }
3393
+ /* A ordem da linha: nome → taxa → contagem → total → caixa. Sem `order`
3394
+ explícito na pastilha da taxa ela caía em `order: 0` e saltava para ANTES
3395
+ da seta, virando a primeira coisa da linha. */
3396
+ .pos-gsec__head--pick > .pos-gsec__pct { order: 2; }
3397
+ .pos-gsec__head--pick > .pos-gsec__n { order: 3; margin-left: auto; }
3398
+ .pos-gsec__head--pick > .pos-gsec__tot { order: 4; }
3399
+ .pos-gsec__head--pick > .pos-gsec__pick { order: 5; }
3400
+
3401
+ /* A linha "Todos": a mesma caixa e a MESMA sangria dos cartões — recuada, ela
3402
+ parecia de outra lista, e o olho procurava a que coluna cada caixa pertence. */
3403
+ .pos-gsec__all {
3404
+ display: flex; align-items: center; gap: var(--pos-2x);
3405
+ margin: 0; padding: 10px var(--pos-3x);
3406
+ border: 0; border-bottom: 1px solid var(--pos-line-strong);
3407
+ cursor: pointer; transition: background var(--pos-fast), border-color var(--pos-fast);
3408
+ }
3409
+ .pos-gsec__all:hover { background: var(--pos-2); }
3410
+ .pos-gsec__all[aria-checked='true'] { border-bottom-color: var(--pos-primary); }
3411
+ .pos-gsec__all-t {
3412
+ font-size: 12px; font-weight: 800; text-transform: uppercase; letter-spacing: 0.04em;
3413
+ color: var(--pos-fg);
3414
+ }
3415
+ .pos-gsec__all > .pos-gsec__n { margin-left: auto; }
3416
+
3417
+ /* O X da casca sai do caminho enquanto se cobra. */
3418
+ :root[data-pos-checkout] .saas-takeover-close { display: none; }
3419
+ /* A taxa dentro do cartão: em primária, e com a régua fina de cima que o V1
3420
+ desenha entre os itens e ela. */
3421
+ .pos-gsec__r--svc {
3422
+ padding-top: 6px; margin-top: 3px; border-top: 1px solid var(--pos-line);
3423
+ color: var(--pos-primary); font-weight: 650;
3424
+ }
3425
+ .pos-gsec__r--paid { color: var(--pos-ok); font-weight: 600; }
3426
+ .pos-gsec__r--paid > span:first-child { display: inline-flex; align-items: center; gap: 4px; }
3427
+ /* "Selecionar todos" mora no cabeçalho do passo, onde estava "Passo N de 3". */
3428
+ .pos-checkout__all {
3429
+ padding: 0; border: 0; background: none; cursor: pointer;
3430
+ font-size: 11px; font-weight: 700; color: var(--pos-primary);
3431
+ white-space: nowrap; text-decoration: underline; text-underline-offset: 2px;
3432
+ }
3433
+ .pos-gsec__top { display: flex; align-items: center; justify-content: space-between; gap: 8px; }
3434
+ .pos-gsec__name {
3435
+ display: inline-flex; align-items: center; gap: 6px;
3436
+ font-size: 12px; font-weight: 800; text-transform: uppercase; letter-spacing: 0.04em;
3437
+ color: var(--pos-fg);
3438
+ }
3439
+ .pos-gsec__name > svg { color: var(--pos-primary); }
3440
+ .pos-gsec__pct {
3441
+ padding: 1px 6px; border-radius: var(--pos-r-pill); font-size: 10px; font-weight: 700;
3442
+ text-transform: none; letter-spacing: 0;
3443
+ background: color-mix(in srgb, var(--pos-primary) 12%, transparent); color: var(--pos-primary);
3444
+ }
3445
+ /* A pastilha da taxa do participante herda o mesmo tracejado do rodapé: a
3446
+ mesma pergunta, atendida pela mesma folha, tem de parecer a mesma coisa. */
3447
+ .pos-gsec__pct.pos-tot__link { gap: 0; text-underline-offset: 2px; }
3448
+ .pos-gsec__tot { font-size: 12px; font-weight: 700; color: var(--pos-fg-2); }
3449
+ .pos-gsec__paid { display: flex; align-items: center; justify-content: space-between; font-size: 11px; }
3450
+ .pos-gsec__ok { display: inline-flex; align-items: center; gap: 4px; font-weight: 600; color: var(--pos-ok); }
3451
+ .pos-gsec__due { font-weight: 700; color: var(--pos-primary); }
3452
+
3453
+ /* A recusa do servidor é vermelha; o impedimento local segue discreto. Os dois
3454
+ ocupam a mesma linha porque nunca importam ao mesmo tempo: enquanto falta
3455
+ preencher, não houve tentativa; depois da tentativa, o que importa é a
3456
+ resposta. */
3457
+ .pos-sheet__why[data-error] {
3458
+ color: var(--pos-danger);
3459
+ font-weight: 600;
3460
+ }
3461
+
3462
+ /* ---------------------------------------------------------------------------
3463
+ «Escala de hoje». Portado de EscalaPanel.tsx do V1.
3464
+ --------------------------------------------------------------------------- */
3465
+ /* Na COLUNA, não numa folha: ela ocupa a largura do rail e rola dentro dele. */
3466
+ .pos-shift { display: flex; flex-direction: column; min-height: 0; }
3467
+ .pos-shift .pos-sheet__body { padding-top: 0; }
3468
+ .pos-shift__sub {
3469
+ flex: 0 0 auto;
3470
+ margin: 0; padding: 0 var(--pos-4x) var(--pos-3x);
3471
+ font-size: 12px; color: var(--pos-fg-2);
3472
+ }
3473
+ .pos-shift__form {
3474
+ display: grid; gap: var(--pos-3x);
3475
+ padding: var(--pos-3x); border: 1px solid var(--pos-line); border-radius: var(--pos-r);
3476
+ background: var(--pos-veil);
3477
+ }
3478
+ .pos-shift__swap {
3479
+ margin-left: auto; border: none; background: none; cursor: pointer;
3480
+ font: inherit; font-size: 11px; text-transform: none; letter-spacing: 0;
3481
+ color: var(--pos-primary); text-decoration: underline; text-underline-offset: 2px;
3482
+ }
3483
+ .pos-shift__target {
3484
+ display: flex; align-items: center; gap: 6px; margin: 0;
3485
+ padding: 7px 10px; border-radius: var(--pos-r-sm); background: var(--pos-veil-2);
3486
+ font-size: 13px; font-weight: 600; color: var(--pos-fg);
3487
+ }
3488
+ /* Um espaço À ESPERA, não um campo vazio: o tracejado diz que falta um gesto
3489
+ na planta — e é lá que o gesto acontece. */
3490
+ .pos-shift__await {
3491
+ margin: 0; padding: 12px 10px; text-align: center;
3492
+ border: 1px dashed var(--pos-line-strong); border-radius: var(--pos-r-sm);
3493
+ font-size: 11px; line-height: 1.45; color: var(--pos-fg-2);
3494
+ }
3495
+ .pos-shift__pair { display: grid; grid-template-columns: 1fr 1fr; gap: var(--pos-2x); }
3496
+ .pos-shift__go { width: 100%; justify-content: center; gap: 6px; }
3497
+ .pos-shift__err { display: grid; gap: 6px; justify-items: center; padding: var(--pos-4x) 0; }
3498
+ .pos-shift__list { display: grid; gap: var(--pos-3x); margin-top: var(--pos-4x); }
3499
+ .pos-shift__group { display: grid; gap: 5px; }
3500
+ .pos-shift__gname {
3501
+ display: flex; align-items: center; gap: 6px; margin: 0;
3502
+ font-size: 13px; font-weight: 700; color: var(--pos-fg);
3503
+ }
3504
+ .pos-shift__dot { width: 10px; height: 10px; border-radius: var(--pos-r-xs); flex: none; }
3505
+ .pos-shift__rows { list-style: none; margin: 0; padding: 0; display: grid; gap: 4px; }
3506
+ .pos-shift__row {
3507
+ display: flex; align-items: center; justify-content: space-between; gap: 8px;
3508
+ padding: 7px 10px; border: 1px solid var(--pos-line); border-radius: var(--pos-r-sm);
3509
+ font-size: 13px;
3510
+ }
3511
+ .pos-shift__who { display: flex; align-items: baseline; gap: 6px; min-width: 0; }
3512
+ .pos-shift__name { font-weight: 600; color: var(--pos-fg); }
3513
+ .pos-shift__when { font-size: 11px; color: var(--pos-fg-2); }
3514
+ .pos-shift__act { display: flex; align-items: center; gap: 6px; flex: none; }
3515
+ .pos-shift__role {
3516
+ padding: 2px 7px; border-radius: var(--pos-r-pill); font-size: 10px; font-weight: 700;
3517
+ background: var(--pos-veil-2); color: var(--pos-fg-2);
3518
+ }
3519
+ .pos-shift__out {
3520
+ display: grid; place-items: center; width: 24px; height: 24px;
3521
+ border: none; border-radius: var(--pos-r-sm); background: none; cursor: pointer;
3522
+ color: var(--pos-danger);
3523
+ }
3524
+ .pos-shift__out:hover { background: color-mix(in srgb, var(--pos-danger) 12%, transparent); }
3525
+ .pos-shift__out:disabled { opacity: 0.4; cursor: default; }
3526
+ .pos-shift__foot {
3527
+ flex: 0 0 auto;
3528
+ display: flex; align-items: center; gap: 6px;
3529
+ padding: var(--pos-3x) var(--pos-4x);
3530
+ border-top: 1px solid var(--pos-line);
3531
+ font-size: 11px; line-height: 1.4; color: var(--pos-fg-2);
3532
+ /* Em edição entram rótulo, campo e dois botões: sem quebra, o Cancelar
3533
+ escapa pela direita numa gaveta estreita. */
3534
+ flex-wrap: wrap;
3535
+ }
3536
+ /* «mudar» é um LINK no meio da frase, e não um botão: ele continua a leitura,
3537
+ e um botão ali roubaria o peso da própria regra que a frase enuncia. */
3538
+ .pos-shift__mudar {
3539
+ border: 0; background: none; padding: 0; cursor: pointer;
3540
+ font: inherit; color: var(--pos-primary); text-underline-offset: 2px;
3541
+ }
3542
+ .pos-shift__mudar:hover { text-decoration: underline; }
3543
+ .pos-shift__cut {
3544
+ height: 26px; padding: 0 6px;
3545
+ border: 1px solid var(--pos-line); border-radius: var(--pos-r-sm);
3546
+ background: var(--pos-1); color: var(--pos-fg); font: inherit;
3547
+ /* O campo de hora do navegador ignora `font-size` herdado em alguns temas;
3548
+ fixar evita que ele cresça e empurre os botões para a linha de baixo. */
3549
+ font-size: 12px;
3550
+ }
3551
+
3552
+ /* A raiz que o app monta só para as FOLHAS, fora da tela do PDV.
3553
+ Ela existe para as variáveis `--pos-*` chegarem lá; sem ocupar espaço nem
3554
+ capturar o clique quando nenhuma folha está aberta. */
3555
+ /* A raiz das folhas NÃO PINTA.
3556
+ Ela existe só para as variáveis `--pos-*` alcançarem as folhas, e herdava o
3557
+ `background` do `.pos` — sendo `fixed; inset: 0`, cobria a tela inteira com
3558
+ o bege do PDV e apagava o salão atrás. Com a cortina por cima disso, o
3559
+ resultado era um modal boiando num fundo lavado, sem a tela de trás. */
3560
+ .pos-sheets {
3561
+ position: fixed; inset: 0; pointer-events: none; z-index: 70;
3562
+ background: transparent;
3563
+ }
3564
+ .pos-sheets:empty { display: none; }
3565
+ .pos-sheets > * { pointer-events: auto; }
3566
+
3567
+ /* ---------------------------------------------------------------------------
3568
+ «Mesas fechadas» — a coluna da direita sem mesa selecionada.
3569
+ Portado de PosClosedTablesPanel.tsx do V1.
3570
+ --------------------------------------------------------------------------- */
3571
+ .pos-closed { display: flex; flex-direction: column; min-height: 0; flex: 1; }
3572
+ .pos-closed__head {
3573
+ display: flex; align-items: baseline; gap: var(--pos-2x); flex: 0 0 auto;
3574
+ padding: var(--pos-4x) var(--pos-4x) var(--pos-3x);
3575
+ }
3576
+ .pos-closed__title {
3577
+ margin: 0; font-size: 17px; font-weight: 660; color: var(--pos-fg);
3578
+ white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
3579
+ }
3580
+ .pos-closed__when { font-size: 12px; color: var(--pos-fg-2); }
3581
+ .pos-closed__sum {
3582
+ display: flex; align-items: center; justify-content: space-between;
3583
+ flex: 0 0 auto; padding: 8px var(--pos-4x);
3584
+ border-block: 1px solid var(--pos-line); background: var(--pos-veil);
3585
+ font-size: 12px; font-weight: 600; color: var(--pos-fg-2);
3586
+ }
3587
+ .pos-closed__sum .pos-num { font-size: 14px; color: var(--pos-fg); }
3588
+ .pos-closed__list {
3589
+ flex: 1 1 auto; min-height: 0; overflow-y: auto;
3590
+ padding: var(--pos-2x) var(--pos-3x) var(--pos-4x);
3591
+ display: grid; gap: 4px; align-content: start;
3592
+ }
3593
+ .pos-closed__row {
3594
+ display: flex; align-items: center; justify-content: space-between; gap: var(--pos-3x);
3595
+ width: 100%; padding: 9px 11px; border: 1px solid transparent; border-radius: var(--pos-r-sm);
3596
+ background: none; font: inherit; text-align: left; cursor: pointer;
3597
+ }
3598
+ .pos-closed__row:hover:not(:disabled) { background: var(--pos-veil-2); border-color: var(--pos-line); }
3599
+ .pos-closed__row:disabled { cursor: default; }
3600
+ .pos-closed__who { display: grid; gap: 1px; min-width: 0; }
3601
+ .pos-closed__where {
3602
+ font-size: 14px; font-weight: 620; color: var(--pos-fg);
3603
+ white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
3604
+ }
3605
+ .pos-closed__meta {
3606
+ font-size: 11.5px; color: var(--pos-fg-2);
3607
+ white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
3608
+ }
3609
+ .pos-closed__total { flex: none; font-size: 14px; font-weight: 700; color: var(--pos-fg); }
3610
+ /* O PLACAR do turno: duas colunas com uma régua no meio, como no V1. */
3611
+ .pos-closed__score {
3612
+ display: flex; align-items: stretch; text-align: center;
3613
+ border-bottom: 1px solid var(--pos-line); flex: none;
3614
+ }
3615
+ .pos-closed__sc { flex: 1; padding: var(--pos-2x) var(--pos-3x); display: grid; gap: 1px; }
3616
+ .pos-closed__scd { width: 1px; background: var(--pos-line); }
3617
+ .pos-closed__scl {
3618
+ font-size: 10px; font-weight: 600; text-transform: uppercase;
3619
+ letter-spacing: 0.05em; color: var(--pos-fg-3);
3620
+ }
3621
+ .pos-closed__scv { font-size: 14px; font-weight: 700; color: var(--pos-fg-2); }
3622
+ .pos-closed__scv[data-tone='ok'] { color: var(--pos-ok); }
3623
+ .pos-closed__scv[data-tone='warn'] { color: var(--pos-warn); }
3624
+ .pos-closed__scn { font-size: 10px; color: var(--pos-fg-3); }
3625
+
3626
+ /* Não saber ≠ saber que não. O aviso existe para essas duas não se parecerem. */
3627
+ .pos-closed__warn {
3628
+ flex: none; margin: 0; padding: var(--pos-2x) var(--pos-4x);
3629
+ border-bottom: 1px solid var(--pos-line);
3630
+ background: color-mix(in srgb, var(--pos-warn) 12%, transparent);
3631
+ font-size: 11.5px; color: var(--pos-warn);
3632
+ }
3633
+
3634
+ /* O selo: ícone E palavra. De longe, cor sozinha não responde "saiu nota?". */
3635
+ .pos-closed__seal {
3636
+ display: inline-flex; align-items: center; gap: 3px; flex: none;
3637
+ margin-left: 6px; padding: 1px 5px; border-radius: var(--pos-r-sm);
3638
+ font-size: 10px; font-weight: 600; text-transform: none; letter-spacing: 0;
3639
+ }
3640
+ .pos-closed__seal[data-seal='ok'] {
3641
+ background: color-mix(in srgb, var(--pos-ok) 14%, transparent); color: var(--pos-ok);
3642
+ }
3643
+ .pos-closed__seal[data-seal='partial'] {
3644
+ background: color-mix(in srgb, var(--pos-warn) 16%, transparent); color: var(--pos-warn);
3645
+ }
3646
+ .pos-closed__seal[data-seal='none'] {
3647
+ background: var(--pos-veil-2); color: var(--pos-fg-3);
3648
+ }
3649
+
3650
+ .pos-closed__empty {
3651
+ flex: 1; display: grid; place-content: center; justify-items: center; gap: 5px;
3652
+ padding: var(--pos-6x) var(--pos-4x); text-align: center; color: var(--pos-fg-3);
3653
+ }
3654
+ .pos-closed__empty > svg { color: var(--pos-fg-3); margin-bottom: 2px; }
3655
+
3656
+ /* ---------------------------------------------------------------------------
3657
+ «Fechar conta» é VERDE.
3658
+ -------------------------------------------------------------------------
3659
+ O botão usava a primária da casa, e no ChefControl isso é o Ouro — a mesma
3660
+ cor do aviso de taxa e do realce do cardápio. O gesto que TERMINA o
3661
+ atendimento e move dinheiro precisa de uma cor só dele, que não se repete em
3662
+ mais nada da tela.
3663
+
3664
+ O verde vem do token de "deu certo" (`--pos-ok`), e não de um hex novo: é a
3665
+ mesma cor que já diz "pago" na comanda, então a tela continua com um
3666
+ vocabulário de cor só. */
3667
+ .pos-btn--commit {
3668
+ background: var(--pos-ok);
3669
+ border-color: var(--pos-ok);
3670
+ color: var(--pos-on-filled);
3671
+ width: 100%;
3672
+ }
3673
+ .pos-btn--commit:hover:not(:disabled) {
3674
+ background: color-mix(in srgb, var(--pos-ok) 88%, #000);
3675
+ border-color: color-mix(in srgb, var(--pos-ok) 88%, #000);
3676
+ }
3677
+ .pos-btn--commit .pos-kbd {
3678
+ background: color-mix(in srgb, var(--pos-on-filled) 16%, transparent);
3679
+ border-color: color-mix(in srgb, var(--pos-on-filled) 26%, transparent);
3680
+ }
3681
+ /* Com o `⋯` dentro dela, a linha auxiliar passa a ter três peças: os dois
3682
+ rótulos dividem o espaço e o `⋯` fica do tamanho do toque. */
3683
+ .pos-cta__aux { display: grid; grid-template-columns: 1fr 1fr auto; gap: var(--pos-2x); }
3684
+
3685
+ /* A barra de volta, enquanto a atividade está aberta no lugar do pedido. */
3686
+ .pos-tkt__back {
3687
+ display: flex; align-items: center; gap: 6px; flex: 0 0 auto;
3688
+ width: 100%; padding: 9px var(--pos-4x);
3689
+ border: none; border-bottom: 1px solid var(--pos-line);
3690
+ background: var(--pos-veil); color: var(--pos-fg-2);
3691
+ font: inherit; font-size: 12.5px; font-weight: 600; text-align: left; cursor: pointer;
3692
+ }
3693
+ .pos-tkt__back:hover { background: var(--pos-veil-2); color: var(--pos-fg); }
3694
+ .pos-tkt__pend { margin-left: auto; font-size: 11px; font-weight: 700; color: var(--pos-warn); }
3695
+
3696
+ /* Os botões de AÇÃO falam mais alto.
3697
+ Fechar conta, Enviar, Imprimir, Desconto: são o que a mão procura sem ler.
3698
+ O peso normal deixava o rótulo com o mesmo tom do texto da comanda logo
3699
+ acima, e o botão virava mais uma linha da lista. */
3700
+ /* `.pos` na frente porque o reset de `button` do hospedeiro traz
3701
+ `font: inherit` — e o atalho `font` zera o peso. Sem a raiz na regra, o
3702
+ rótulo voltava a 400 e o botão desaparecia dentro da lista. */
3703
+ .pos .pos-btn { font-weight: 700; }
3704
+ .pos .pos-btn__l1 { font-weight: 700; }
3705
+ .pos .pos-btn .pos-num { font-weight: 700; }
3706
+
3707
+ /* ---------------------------------------------------------------------------
3708
+ O subcabeçalho de configuração da planta, e o filtro de praças flutuante.
3709
+ --------------------------------------------------------------------------- */
3710
+ /* A barra da planta ENVOLVE, mas o rótulo de um botão não quebra ao meio.
3711
+ Com o rail aberto sobram ~800px, e «Organizar automaticamente» nascia em
3712
+ duas linhas dentro do próprio botão — um controle com a altura de dois e o
3713
+ texto partido no meio da palavra. Quem envolve é a BARRA; cada peça fica
3714
+ inteira ou desce para a linha de baixo. */
3715
+ .pos-subhead {
3716
+ display: flex; align-items: center; flex-wrap: wrap; gap: var(--pos-2x); flex: 0 0 auto;
3717
+ padding: 0 var(--pos-4x) var(--pos-3x);
3718
+ }
3719
+ .pos-subhead > * { white-space: nowrap; }
3720
+ /* AS DUAS ZONAS da barra da planta: à esquerda o que ela É (contagem,
3721
+ ferramentas de desenho); à direita o que se FAZ com ela (estado, escala,
3722
+ organizar, concluir). É o `ml-auto` do `EditorToolbar` do V1, e é ele mesmo
3723
+ — `margin-left: auto` empurra o bloco para a direita quando sobra espaço e
3724
+ se rende quando não sobra, sem um elemento vazio para isso.
3725
+ As ações são UM bloco, não itens soltos: a barra mede ~856px com o rail
3726
+ aberto, e soltos quem quebrava era só o último — «Organizar
3727
+ automaticamente» descia sozinho, alinhado à ESQUERDA, parecendo pertencer à
3728
+ outra zona. */
3729
+ .pos-subhead__acts {
3730
+ display: flex; align-items: center; gap: var(--pos-2x);
3731
+ flex-wrap: wrap; justify-content: flex-end;
3732
+ margin-left: auto;
3733
+ }
3734
+ /* O censo é a única peça que pode envolver: ele é frase, não rótulo. */
3735
+ .pos-planbar__n { white-space: normal; }
3736
+
3737
+ /* As praças flutuam sobre as mesas, no rodapé.
3738
+ `absolute` dentro de `.pos-main` (que é `relative`), e não `sticky`: como
3739
+ irmã da área que rola, a barra sticky se prendia ao TOPO do fluxo, que é
3740
+ onde ela nasce. Ancorada ao pé da coluna do salão ela fica onde o polegar
3741
+ já está — e continua dentro da coluna, sem cobrir a comanda ao lado. */
3742
+ /* A PILHA flutuante: ambientes em cima, praças embaixo.
3743
+ Cada fileira era `position: absolute` com o mesmo `bottom`, então a segunda
3744
+ caía exatamente sobre a primeira e só a de cima aparecia. Quem flutua é a
3745
+ pilha; as fileiras dentro dela empilham normalmente. */
3746
+ .pos-zonestack {
3747
+ position: absolute; left: 50%; transform: translateX(-50%);
3748
+ bottom: calc(var(--pos-4x) + var(--pos-safe-b)); z-index: 12;
3749
+ display: grid; gap: 5px; justify-items: center;
3750
+ max-width: calc(100% - var(--pos-6x));
3751
+ }
3752
+ .pos-zones {
3753
+ display: flex; align-items: center; gap: 4px; width: max-content; max-width: 100%;
3754
+ padding: 5px; overflow-x: auto; scrollbar-width: none;
3755
+ border: 1px solid color-mix(in srgb, var(--pos-fg) 10%, transparent);
3756
+ border-radius: var(--pos-r-pill);
3757
+ /* Vidro: as mesas continuam visíveis por trás, e a barra não corta o salão
3758
+ em dois. `saturate` é o que dá o brilho de vidro em vez de fumaça. */
3759
+ background: color-mix(in srgb, var(--pos-1) var(--pos-glass-bg), transparent);
3760
+ backdrop-filter: blur(var(--pos-glass-blur)) saturate(var(--pos-glass-sat));
3761
+ -webkit-backdrop-filter: blur(var(--pos-glass-blur)) saturate(var(--pos-glass-sat));
3762
+ box-shadow: 0 6px 24px -8px var(--pos-shadow), 0 1px 0 color-mix(in srgb, var(--pos-fg) 6%, transparent) inset;
3763
+ }
3764
+ .pos-zones::-webkit-scrollbar { display: none; }
3765
+ @supports not (backdrop-filter: blur(1px)) {
3766
+ .pos-zones { background: var(--pos-1); }
3767
+ .pos-head, .pos-cats, .pos-dock { background: var(--pos-0); }
3768
+ }
3769
+ .pos-zone {
3770
+ display: inline-flex; align-items: center; gap: 6px; flex: 0 0 auto;
3771
+ min-height: 32px; padding: 0 13px; border-radius: var(--pos-r-pill);
3772
+ border: none; background: none; color: var(--pos-fg-2);
3773
+ font: inherit; font-size: 13px; font-weight: 600; white-space: nowrap; cursor: pointer;
3774
+ transition: background var(--pos-t) var(--pos-e), color var(--pos-t) var(--pos-e);
3775
+ }
3776
+ .pos-zone:hover { color: var(--pos-fg); background: var(--pos-veil-2); }
3777
+ .pos-zone[aria-pressed='true'] {
3778
+ background: var(--pos-fg); color: var(--pos-1);
3779
+ }
3780
+ .pos-zone__dot { width: 8px; height: 8px; border-radius: var(--pos-r-round); flex: none; }
3781
+ .pos-zone[aria-pressed='true'] .pos-zone__dot { box-shadow: 0 0 0 2px color-mix(in srgb, var(--pos-1) 40%, transparent); }
3782
+
3783
+ /* ---------------------------------------------------------------------------
3784
+ Carrinho × enviado: dois desenhos, como no V1.
3785
+ --------------------------------------------------------------------------- */
3786
+ /* A linha ENVIADA é de leitura: sem controles, mais baixa, e com a hora ao
3787
+ lado do nome. Numa mesa de oito são quarenta linhas na noite, e o que o
3788
+ operador quer ali é caber tudo na tela. */
3789
+ .pos-ln[data-state='fired'], .pos-ln[data-state='delivered'] { min-height: 44px; padding-block: 6px; }
3790
+ .pos-ln__q { margin-right: 6px; color: var(--pos-fg-2); font-weight: 700; }
3791
+ .pos-ln__at {
3792
+ display: inline-flex; align-items: center; gap: 3px; margin-left: 7px;
3793
+ font-size: 11px; font-weight: 500; color: var(--pos-fg-3); white-space: nowrap;
3794
+ }
3795
+ .pos-ln__sent {
3796
+ flex: none; padding: 2px 8px; border-radius: var(--pos-r-pill);
3797
+ background: var(--pos-veil-2); color: var(--pos-fg-2);
3798
+ font-size: 10.5px; font-weight: 700; white-space: nowrap;
3799
+ }
3800
+
3801
+ /* ---------------------------------------------------------------------------
3802
+ O CARRINHO: o que ainda não foi para a cozinha.
3803
+ -------------------------------------------------------------------------
3804
+ Um bloco à parte, em destaque, como no V1. Misturado com o que já saiu, o
3805
+ item pendente some — e o operador fecha a conta achando que mandou tudo
3806
+ enquanto a cozinha nunca viu os dois últimos pratos. */
3807
+ .pos-cart {
3808
+ margin: 0 var(--pos-3x) var(--pos-3x);
3809
+ border: 1px solid color-mix(in srgb, var(--pos-accent) 40%, transparent);
3810
+ border-radius: var(--pos-r);
3811
+ background: color-mix(in srgb, var(--pos-accent) 8%, var(--pos-1));
3812
+ overflow: hidden;
3813
+ }
3814
+ .pos-cart__head {
3815
+ display: flex; align-items: center; justify-content: space-between;
3816
+ padding: 7px var(--pos-3x);
3817
+ border-bottom: 1px solid color-mix(in srgb, var(--pos-accent) 26%, transparent);
3818
+ background: color-mix(in srgb, var(--pos-accent) 14%, transparent);
3819
+ }
3820
+ .pos-cart__t {
3821
+ font-size: 11px; font-weight: 800; letter-spacing: 0.06em; text-transform: uppercase;
3822
+ color: var(--pos-fg);
3823
+ }
3824
+ .pos-cart__v { font-size: 13px; font-weight: 700; color: var(--pos-fg); }
3825
+ /* Dentro do carrinho a linha não tem fundo próprio: o bloco já é o destaque. */
3826
+ .pos-cart .pos-ln { background: transparent; }
3827
+
3828
+ /* A conta do rodapé: o couvert e a taxa clicável. */
3829
+ .pos-tot__how { font-size: 11px; color: var(--pos-fg-3); }
3830
+ /* O que se pode MUDAR fica em primária com sublinhado TRACEJADO.
3831
+ Só a cor não basta: num rodapé de números a primária lê como destaque de
3832
+ valor, não como convite a tocar — o founder pediu a taxa de novo depois de
3833
+ ela já estar clicável. O tracejado é a convenção de "isto abre alguma
3834
+ coisa" que não se confunde com link de navegação. */
3835
+ .pos-tot__link {
3836
+ display: inline-flex; align-items: center; gap: 5px;
3837
+ border: none; background: none; padding: 0; cursor: pointer;
3838
+ font: inherit; color: var(--pos-primary); text-align: left;
3839
+ text-decoration: underline dashed;
3840
+ text-decoration-thickness: 1px; text-underline-offset: 3px;
3841
+ }
3842
+ .pos-tot__link:hover { text-decoration-style: solid; }
3843
+ .pos-tot__link:hover { text-decoration: underline; text-underline-offset: 2px; }
3844
+
3845
+ /* A cadeira que ainda não tem nome: tracejada, como a anônima — as duas estão
3846
+ pedindo a mesma coisa, e desenhá-las igual é dizer isso sem texto. */
3847
+ .pos-gchip--empty {
3848
+ border-style: dashed; background: transparent; color: var(--pos-fg-3);
3849
+ }
3850
+ .pos-gchip--empty:hover { color: var(--pos-fg-2); background: var(--pos-veil-2); }
3851
+ .pos-gchip--empty .pos-gchip__i {
3852
+ background: var(--pos-veil-2); color: var(--pos-fg-3); font-size: 13px; font-weight: 600;
3853
+ }
3854
+
3855
+ /* A explicação curta abaixo de um campo do diálogo de pessoa. */
3856
+ .pos-gnote { display: block; margin-top: 5px; font-size: 11px; color: var(--pos-fg-3); }
3857
+
3858
+ /* ---------------------------------------------------------------------------
3859
+ «Precisa de autorização»: o QUE está sendo aprovado, antes do PIN.
3860
+ --------------------------------------------------------------------------- */
3861
+ .pos-auth__what {
3862
+ padding: var(--pos-3x); border: 1px solid var(--pos-line); border-radius: var(--pos-r);
3863
+ background: var(--pos-veil);
3864
+ }
3865
+ .pos-auth__action {
3866
+ display: block; margin-bottom: 7px;
3867
+ font-size: 11px; font-weight: 800; letter-spacing: 0.06em; text-transform: uppercase;
3868
+ color: var(--pos-fg-2);
3869
+ }
3870
+ .pos-auth__lines { list-style: none; margin: 0; padding: 0; display: grid; gap: 5px; }
3871
+ .pos-auth__line {
3872
+ display: flex; align-items: baseline; justify-content: space-between; gap: var(--pos-3x);
3873
+ font-size: 14px; color: var(--pos-fg);
3874
+ }
3875
+ .pos-auth__v { font-weight: 700; flex: none; }
3876
+ .pos-auth__line[data-danger] .pos-auth__v { color: var(--pos-danger); }
3877
+
3878
+ /* A linha ENVIADA fica ainda mais compacta: sem moldura e mais baixa.
3879
+ Seis linhas com borda são seis quadros competindo com a única coisa que
3880
+ importa ali — o que a mesa consumiu. Um filete entre elas basta. */
3881
+ .pos-ln[data-state='fired'], .pos-ln[data-state='delivered'] {
3882
+ min-height: 38px; padding-block: 4px;
3883
+ border: none; border-radius: 0;
3884
+ border-bottom: 1px solid var(--pos-line);
3885
+ }
3886
+ .pos-gsec .pos-ln[data-state='fired']:last-child,
3887
+ .pos-gsec .pos-ln[data-state='delivered']:last-child { border-bottom: none; }
3888
+
3889
+ /* ---------------------------------------------------------------------------
3890
+ Fechar conta em passos: modo → participantes → pagamento.
3891
+ --------------------------------------------------------------------------- */
3892
+ .pos-mode { display: grid; gap: var(--pos-2x); padding: 0 var(--pos-4x); }
3893
+ .pos-mode__b {
3894
+ display: flex; align-items: center; gap: var(--pos-3x);
3895
+ padding: var(--pos-3x); border: 1px solid var(--pos-line); border-radius: var(--pos-r);
3896
+ background: var(--pos-2); text-align: left; cursor: pointer; font: inherit;
3897
+ }
3898
+ .pos-mode__b:hover { border-color: var(--pos-primary); background: var(--pos-3); }
3899
+ .pos-mode__i {
3900
+ display: grid; place-items: center; width: 38px; height: 38px; flex: none;
3901
+ border-radius: var(--pos-r-round);
3902
+ }
3903
+ .pos-mode__i[data-tone='who'] { background: color-mix(in srgb, var(--pos-info) 14%, transparent); color: var(--pos-info); }
3904
+ .pos-mode__i[data-tone='all'] { background: color-mix(in srgb, var(--pos-ok) 14%, transparent); color: var(--pos-ok); }
3905
+ .pos-mode__t { display: block; font-size: 14px; font-weight: 700; color: var(--pos-fg); }
3906
+ .pos-mode__h { display: block; margin-top: 2px; font-size: 12px; color: var(--pos-fg-2); }
3907
+
3908
+ .pos-paywho { display: grid; gap: 4px; padding: 0 var(--pos-3x); overflow-y: auto; }
3909
+ .pos-paywho__b {
3910
+ display: flex; align-items: center; justify-content: space-between; gap: var(--pos-3x);
3911
+ padding: 11px var(--pos-3x); border: 1px solid var(--pos-line); border-radius: var(--pos-r);
3912
+ background: var(--pos-2); font: inherit; text-align: left; cursor: pointer;
3913
+ }
3914
+ .pos-paywho__b[aria-pressed='true'] {
3915
+ border-color: var(--pos-primary);
3916
+ background: color-mix(in srgb, var(--pos-primary) 10%, var(--pos-2));
3917
+ }
3918
+ .pos-paywho__n { display: flex; align-items: center; gap: 8px; font-size: 14px; font-weight: 600; color: var(--pos-fg); }
3919
+ .pos-paywho__s {
3920
+ display: inline-grid; place-items: center; min-width: 22px; height: 22px; padding: 0 5px;
3921
+ border-radius: var(--pos-r-sm); background: var(--pos-veil-2);
3922
+ font-size: 11px; font-weight: 700; color: var(--pos-fg-2);
3923
+ }
3924
+
3925
+ /* ---------------------------------------------------------------------------
3926
+ Linhas selecionáveis (desconto, cancelamento, transferência).
3927
+ -------------------------------------------------------------------------
3928
+ Eram `<input type="checkbox">` crus: o quadradinho do sistema operacional no
3929
+ meio de campos desenhados, com outro azul, outro raio e outro tamanho de
3930
+ toque. Agora a LINHA inteira é o alvo e o estado se lê pela linha — que é
3931
+ como as pastilhas de participante já funcionam. */
3932
+ .pos-dsc__lines { list-style: none; margin: 0; padding: 0; display: grid; gap: 4px; }
3933
+ .pos-dsc__line {
3934
+ display: flex; align-items: center; gap: var(--pos-3x);
3935
+ padding: 9px var(--pos-3x);
3936
+ border: 1px solid var(--pos-line); border-radius: var(--pos-r);
3937
+ background: var(--pos-2); cursor: pointer;
3938
+ transition: background var(--pos-t) var(--pos-e), border-color var(--pos-t) var(--pos-e);
3939
+ }
3940
+ .pos-dsc__line:hover { background: var(--pos-3); }
3941
+ .pos-dsc__line:has(input:checked) {
3942
+ border-color: var(--pos-primary);
3943
+ background: color-mix(in srgb, var(--pos-primary) 10%, var(--pos-2));
3944
+ }
3945
+ .pos-dsc__line input[type='checkbox'] {
3946
+ appearance: none; -webkit-appearance: none;
3947
+ width: 18px; height: 18px; flex: none; margin: 0;
3948
+ border: 1.5px solid var(--pos-line-strong); border-radius: var(--pos-r-xs);
3949
+ background: var(--pos-1); cursor: pointer; position: relative;
3950
+ }
3951
+ .pos-dsc__line input[type='checkbox']:checked {
3952
+ border-color: var(--pos-primary); background: var(--pos-primary);
3953
+ }
3954
+ .pos-dsc__line input[type='checkbox']:checked::after {
3955
+ content: ''; position: absolute; inset: 0;
3956
+ background: var(--pos-primary-fg);
3957
+ clip-path: polygon(14% 46%, 8% 54%, 38% 82%, 92% 26%, 85% 19%, 38% 68%);
3958
+ }
3959
+ .pos-dsc__line .pos-dsc__name { flex: 1; min-width: 0; font-size: 14px; color: var(--pos-fg); }
3960
+ .pos-dsc__line .pos-dsc__n { color: var(--pos-fg-2); font-weight: 700; margin-right: 6px; }
3961
+ .pos-dsc__line .pos-num { flex: none; font-weight: 600; }
3962
+
3963
+ /* O campo de PIN: as bolinhas mostram, o input invisível recebe.
3964
+ O input fica por cima e transparente — assim o toque levanta o teclado do
3965
+ aparelho e o foco tem onde morar, sem um segundo teclado na tela. */
3966
+ .pos-pin__field { position: relative; display: block; }
3967
+ .pos-pin__input {
3968
+ position: absolute; inset: 0; width: 100%; height: 100%;
3969
+ border: none; background: transparent; color: transparent;
3970
+ caret-color: transparent; font-size: 16px; /* 16px: abaixo disso o iOS dá zoom */
3971
+ cursor: pointer;
3972
+ }
3973
+ .pos-pin__input:focus { outline: none; }
3974
+ .pos-pin__field:focus-within .pos-pin__dots {
3975
+ border-color: var(--pos-primary);
3976
+ box-shadow: 0 0 0 3px color-mix(in srgb, var(--pos-primary) 22%, transparent);
3977
+ }
3978
+ .pos-pin__field .pos-pin__dots {
3979
+ display: flex; align-items: center; justify-content: center; gap: var(--pos-3x);
3980
+ min-height: var(--pos-hit-2); padding: 0 var(--pos-3x);
3981
+ border: 1px solid var(--pos-line-strong); border-radius: var(--pos-r);
3982
+ background: var(--pos-1);
3983
+ transition: border-color var(--pos-t) var(--pos-e), box-shadow var(--pos-t) var(--pos-e);
3984
+ }
3985
+
3986
+ /* Histórico de transferências. */
3987
+ .pos-thist { display: grid; gap: var(--pos-2x); }
3988
+ .pos-thist__c {
3989
+ display: grid; gap: 7px; padding: var(--pos-3x);
3990
+ border: 1px solid var(--pos-line); border-radius: var(--pos-r); background: var(--pos-2);
3991
+ }
3992
+ .pos-thist__h { display: flex; align-items: center; justify-content: space-between; gap: var(--pos-2x); }
3993
+ .pos-thist__k {
3994
+ display: inline-flex; align-items: center; gap: 7px;
3995
+ font-size: 12px; font-weight: 700; color: var(--pos-fg);
3996
+ }
3997
+ .pos-thist__i {
3998
+ display: grid; place-items: center; width: 26px; height: 26px;
3999
+ border-radius: var(--pos-r-sm);
4000
+ background: color-mix(in srgb, var(--pos-primary) 14%, transparent);
4001
+ color: var(--pos-primary);
4002
+ }
4003
+ .pos-thist__w { font-size: 11px; color: var(--pos-fg-3); font-variant-numeric: tabular-nums; }
4004
+ .pos-thist__b { display: grid; gap: 2px; }
4005
+ .pos-thist__r {
4006
+ display: flex; align-items: center; gap: 5px; margin: 0;
4007
+ font-size: 13px; color: var(--pos-fg-2);
4008
+ }
4009
+ .pos-thist__r strong { color: var(--pos-fg); font-weight: 650; }
4010
+ .pos-thist__r--who { font-size: 11.5px; color: var(--pos-fg-3); }
4011
+
4012
+ /* A taxa que está valendo, no alto do seletor. */
4013
+ .pos-svc__now {
4014
+ display: flex; align-items: baseline; justify-content: space-between;
4015
+ padding: var(--pos-3x); border: 1px solid var(--pos-line); border-radius: var(--pos-r);
4016
+ background: var(--pos-veil);
4017
+ }
4018
+ .pos-svc__nowl {
4019
+ font-size: 11px; font-weight: 700; letter-spacing: .06em; text-transform: uppercase;
4020
+ color: var(--pos-fg-2);
4021
+ }
4022
+ .pos-svc__nowv { font-size: 22px; font-weight: 700; color: var(--pos-fg); }
4023
+
4024
+ /* Modo indisponível: apagado, mas ainda legível — o subtítulo diz por quê. */
4025
+ .pos-mode__b:disabled { opacity: 0.55; cursor: not-allowed; }
4026
+ .pos-mode__b:disabled:hover { border-color: var(--pos-line); background: var(--pos-2); }
4027
+
4028
+ /* ---------------------------------------------------------------------------
4029
+ Os passos do fechamento têm SEMPRE a mesma forma.
4030
+ -------------------------------------------------------------------------
4031
+ Voltar no topo, o assunto do passo ao lado, o conteúdo rolando no meio e a
4032
+ ação presa embaixo. Um botão que muda de altura a cada passo obriga o garçom
4033
+ a procurá-lo — e ele está com o cliente esperando e a maquininha na mão. */
4034
+ .pos-checkout { display: flex; flex-direction: column; min-height: 0; flex: 1; }
4035
+ .pos-checkout__head {
4036
+ display: flex; align-items: baseline; justify-content: space-between; gap: var(--pos-2x);
4037
+ flex: 0 0 auto; padding: var(--pos-2x) var(--pos-4x) var(--pos-3x);
4038
+ }
4039
+ .pos-step__of {
4040
+ font-size: 11px; font-weight: 600; color: var(--pos-fg-3); white-space: nowrap;
4041
+ }
4042
+ /* O corpo é o ÚNICO que rola. */
4043
+ .pos-checkout__body {
4044
+ flex: 1 1 auto; min-height: 0; overflow-y: auto;
4045
+ align-content: start; padding-bottom: var(--pos-3x);
4046
+ }
4047
+ .pos-checkout .pos-cta { flex: 0 0 auto; }
4048
+ .pos-checkout .pos-tot { flex: 0 0 auto; }
4049
+ .pos-checkout .pos-back { flex: 0 0 auto; }
4050
+
4051
+ /* ---------------------------------------------------------------------------
4052
+ «Resumo da conta» — o que vai ser cobrado, por pessoa.
4053
+ -------------------------------------------------------------------------
4054
+ Um cartão por conta, com o estado no alto. O corpo separa o que a pessoa
4055
+ pediu do que a mesa rateou, e fecha com taxa, couvert e o que falta pagar —
4056
+ é a tela que o garçom vira para o cliente antes de passar o cartão. */
4057
+ .pos-sumy { display: grid; gap: var(--pos-3x); padding: 0 var(--pos-3x); }
4058
+ .pos-sumy__c {
4059
+ border: 1px solid var(--pos-line); border-radius: var(--pos-r);
4060
+ background: var(--pos-2); overflow: hidden;
4061
+ }
4062
+ .pos-sumy__h {
4063
+ display: flex; align-items: center; justify-content: space-between; gap: var(--pos-2x);
4064
+ padding: 8px var(--pos-3x);
4065
+ border-bottom: 1px solid var(--pos-line); background: var(--pos-veil-2);
4066
+ }
4067
+ .pos-sumy__n {
4068
+ display: inline-flex; align-items: center; gap: 6px;
4069
+ font-size: 13px; font-weight: 700; color: var(--pos-fg);
4070
+ }
4071
+ .pos-sumy__n > svg { color: var(--pos-fg-2); }
4072
+ /* O estado é a primeira coisa que se lê: quem já pagou não se cobra de novo. */
4073
+ .pos-sumy__st {
4074
+ padding: 2px 8px; border-radius: var(--pos-r-pill);
4075
+ font-size: 10px; font-weight: 700; letter-spacing: .04em; text-transform: uppercase;
4076
+ }
4077
+ .pos-sumy__st[data-st='settled'] { background: color-mix(in srgb, var(--pos-ok) 14%, transparent); color: var(--pos-ok); }
4078
+ .pos-sumy__st[data-st='partial'] { background: color-mix(in srgb, var(--pos-warn) 16%, transparent); color: var(--pos-warn); }
4079
+ .pos-sumy__st[data-st='open'] { background: color-mix(in srgb, var(--pos-info) 14%, transparent); color: var(--pos-info); }
4080
+
4081
+ .pos-sumy__b { display: grid; gap: 3px; padding: var(--pos-3x); }
4082
+ .pos-sumy__r {
4083
+ display: flex; align-items: baseline; justify-content: space-between; gap: var(--pos-3x);
4084
+ font-size: 13px; color: var(--pos-fg);
4085
+ }
4086
+ .pos-sumy__r > span:first-child { min-width: 0; overflow-wrap: anywhere; }
4087
+ /* O rateio em itálico e apagado: é o que a pessoa NÃO pediu, e a diferença
4088
+ precisa se ver sem ler o rótulo. */
4089
+ .pos-sumy__r--shared { font-style: italic; color: var(--pos-fg-2); }
4090
+ .pos-sumy__lbl {
4091
+ display: inline-flex; align-items: center; gap: 5px; margin-top: 6px;
4092
+ font-size: 10px; font-weight: 700; letter-spacing: .05em; text-transform: uppercase;
4093
+ color: var(--pos-fg-3);
4094
+ }
4095
+ .pos-sumy__r--sum {
4096
+ margin-top: 6px; padding-top: 7px; border-top: 1px dashed var(--pos-line-strong);
4097
+ font-weight: 700;
4098
+ }
4099
+ .pos-sumy__r--paid { color: var(--pos-ok); font-weight: 600; }
4100
+ .pos-sumy__r--due { color: var(--pos-primary); font-weight: 700; font-size: 14px; }
4101
+
4102
+ /* As linhas de detalhe dentro do cartão de cada pessoa — usadas na comanda
4103
+ e no resumo do fechamento, porque são a MESMA coisa. */
4104
+ /* No FECHAMENTO os cartões se encostam: doze contas com respiro entre cada
4105
+ uma empurram o total para fora da tela, e a régua de 1px já separa. */
4106
+ /* ── Participantes finalizados ──────────────────────────────────────────
4107
+ Quem pagou sai da lista ativa e reaparece aqui. O cartão é mais quieto que
4108
+ o de cima de propósito: é histórico, não trabalho — o garçom passa o olho
4109
+ para conferir quem já foi, não para agir. */
4110
+ .pos-done { margin: var(--pos-4x) var(--pos-3x) var(--pos-3x); }
4111
+ .pos-done__head { padding-top: var(--pos-3x); border-top: 1px solid var(--pos-line); }
4112
+ .pos-done__t {
4113
+ margin: 0; font-size: 11px; font-weight: 800; text-transform: uppercase;
4114
+ letter-spacing: 0.06em; color: var(--pos-fg-2);
4115
+ }
4116
+ .pos-done__h { margin: 4px 0 0; font-size: 11.5px; color: var(--pos-fg-3); }
4117
+ .pos-done__c {
4118
+ margin-top: var(--pos-2x); padding: var(--pos-3x);
4119
+ border: 1px solid var(--pos-line); border-radius: var(--pos-r);
4120
+ background: var(--pos-veil-2);
4121
+ }
4122
+ .pos-done__top { display: flex; align-items: flex-start; justify-content: space-between; gap: var(--pos-3x); }
4123
+ .pos-done__n { display: block; font-size: 13.5px; font-weight: 700; color: var(--pos-fg); }
4124
+ .pos-done__ok { display: block; margin-top: 1px; font-size: 11px; font-weight: 600; color: var(--pos-primary); }
4125
+ .pos-done__vals { text-align: right; flex: none; }
4126
+ .pos-done__paid { display: block; font-size: 13.5px; font-weight: 700; color: var(--pos-fg); }
4127
+ .pos-done__tot { display: block; margin-top: 1px; font-size: 11px; color: var(--pos-fg-3); }
4128
+ /* Os quatro miúdos numa linha que quebra: numa coluna estreita eles viram
4129
+ duas, e nunca uma palavra cortada no meio. */
4130
+ .pos-done__parts {
4131
+ display: flex; flex-wrap: wrap; gap: 2px var(--pos-3x);
4132
+ margin-top: var(--pos-2x); font-size: 11px; color: var(--pos-fg-3);
4133
+ }
4134
+
4135
+ .pos-gsecs { display: grid; gap: 0; padding: 0; align-content: start; }
4136
+ .pos-gsecs > .pos-gsec + .pos-gsec { border-top: 1px solid var(--pos-line); }
4137
+ .pos-gsec__lines { display: grid; gap: 3px; padding: var(--pos-2x) var(--pos-3x) var(--pos-3x); }
4138
+ .pos-gsec__r {
4139
+ display: flex; align-items: baseline; justify-content: space-between; gap: var(--pos-3x);
4140
+ font-size: 13px; color: var(--pos-fg);
4141
+ }
4142
+ .pos-gsec__r > span:first-child { min-width: 0; overflow-wrap: anywhere; }
4143
+ /* O que a pessoa NÃO pediu se lê diferente, sem precisar do rótulo. */
4144
+ .pos-gsec__r--shared { font-style: italic; color: var(--pos-fg-2); }
4145
+ .pos-gsec__lbl {
4146
+ display: inline-flex; align-items: center; gap: 5px; margin-top: 4px;
4147
+ font-size: 10px; font-weight: 700; letter-spacing: .05em; text-transform: uppercase;
4148
+ color: var(--pos-fg-3);
4149
+ }
4150
+ .pos-gsec__st {
4151
+ margin-left: 6px; padding: 2px 7px; border-radius: var(--pos-r-pill);
4152
+ font-size: 9.5px; font-weight: 700; letter-spacing: .04em; text-transform: uppercase;
4153
+ }
4154
+ .pos-gsec__st[data-st='settled'] { background: color-mix(in srgb, var(--pos-ok) 14%, transparent); color: var(--pos-ok); }
4155
+ .pos-gsec__st[data-st='partial'] { background: color-mix(in srgb, var(--pos-warn) 16%, transparent); color: var(--pos-warn); }
4156
+ .pos-gsec__st[data-st='open'] { background: color-mix(in srgb, var(--pos-info) 14%, transparent); color: var(--pos-info); }
4157
+
4158
+
4159
+ /* ── «Organizar automaticamente» ──────────────────────────────────────── */
4160
+ .pos-arr__e1, .pos-arr__e2 { display: grid; gap: var(--pos-4x); }
4161
+
4162
+ .pos-arr__ambs { display: grid; gap: var(--pos-2x); margin: 0; padding: 0; list-style: none; }
4163
+ .pos-arr__amb {
4164
+ display: flex; align-items: center; gap: var(--pos-3x); width: 100%;
4165
+ padding: var(--pos-3x); border: 1px solid var(--pos-line); border-radius: var(--pos-radius);
4166
+ background: var(--pos-1); font-size: 13.5px; color: var(--pos-fg); cursor: pointer;
4167
+ transition: all var(--pos-fast); text-align: left;
4168
+ }
4169
+ .pos-arr__amb:hover { border-color: var(--pos-line-strong); }
4170
+ .pos-arr__amb[aria-pressed='true'] {
4171
+ border-color: var(--pos-primary);
4172
+ background: color-mix(in srgb, var(--pos-primary) 8%, transparent);
4173
+ }
4174
+ .pos-arr__an { flex: 1; min-width: 0; font-weight: 600; }
4175
+ .pos-arr__ac { color: var(--pos-fg-3); font-size: 12px; }
4176
+ /* A marca é um quadrado que EXISTE mesmo vazio: sem ele a linha marcada e a
4177
+ não marcada têm larguras diferentes, e a lista dança a cada toque. */
4178
+ .pos-arr__check {
4179
+ display: inline-grid; place-items: center; width: 18px; height: 18px; flex: none;
4180
+ border: 1.5px solid var(--pos-line-strong); border-radius: 4px;
4181
+ font-size: 12px; font-weight: 800; color: var(--pos-primary-fg);
4182
+ }
4183
+ [aria-pressed='true'] > .pos-arr__check { background: var(--pos-primary); border-color: var(--pos-primary); }
4184
+
4185
+ .pos-arr__opt { display: flex; align-items: flex-start; gap: var(--pos-2x); font-size: 12.5px; cursor: pointer; }
4186
+ .pos-arr__opt input { margin-top: 2px; accent-color: var(--pos-primary); }
4187
+ .pos-arr__ox { color: var(--pos-fg-3); }
4188
+
4189
+ .pos-arr__tabs { display: flex; flex-wrap: wrap; gap: var(--pos-2x); }
4190
+ .pos-arr__tab {
4191
+ padding: 5px var(--pos-3x); border: 1px solid var(--pos-line); border-radius: var(--pos-r-pill);
4192
+ background: var(--pos-1); font-size: 12.5px; font-weight: 600; color: var(--pos-fg-2); cursor: pointer;
4193
+ }
4194
+ .pos-arr__tab[aria-selected='true'] {
4195
+ border-color: var(--pos-primary); background: var(--pos-primary); color: var(--pos-primary-fg);
4196
+ }
4197
+
4198
+ .pos-arr__cols { display: grid; grid-template-columns: 1fr 1fr; gap: var(--pos-4x); min-height: 0; }
4199
+ .pos-arr__left, .pos-arr__right { display: grid; gap: var(--pos-2x); align-content: start; min-width: 0; }
4200
+ .pos-arr__faixa { display: grid; grid-template-columns: 1fr 1fr auto; gap: var(--pos-2x); align-items: end; }
4201
+ .pos-arr__lhead { display: flex; align-items: center; justify-content: space-between; gap: var(--pos-2x); }
4202
+ .pos-arr__chips {
4203
+ display: flex; flex-wrap: wrap; gap: 4px; max-height: 200px; overflow-y: auto;
4204
+ margin: 0; padding: 0; list-style: none;
4205
+ }
4206
+ .pos-arr__chip {
4207
+ display: inline-flex; align-items: center; gap: 4px;
4208
+ padding: 3px 7px; border: 1px solid var(--pos-line); border-radius: var(--pos-r-pill);
4209
+ background: var(--pos-2); font-size: 11.5px; color: var(--pos-fg-2); cursor: pointer;
4210
+ }
4211
+ .pos-arr__chip:hover { border-color: var(--pos-danger); color: var(--pos-danger); }
4212
+
4213
+ .pos-arr__busca {
4214
+ display: flex; align-items: center; gap: var(--pos-2x);
4215
+ padding: 0 var(--pos-3x); border: 1px solid var(--pos-line); border-radius: var(--pos-radius);
4216
+ color: var(--pos-fg-3);
4217
+ }
4218
+ .pos-arr__busca input {
4219
+ flex: 1; min-width: 0; padding: 7px 0; border: 0; background: none;
4220
+ font: inherit; font-size: 13px; color: var(--pos-fg); outline: none;
4221
+ }
4222
+ .pos-arr__todas {
4223
+ display: grid; gap: 2px; max-height: 260px; overflow-y: auto;
4224
+ margin: 0; padding: 0; list-style: none;
4225
+ }
4226
+ .pos-arr__row {
4227
+ display: flex; align-items: center; gap: var(--pos-2x); width: 100%;
4228
+ padding: 5px var(--pos-2x); border: 0; border-radius: var(--pos-radius);
4229
+ background: none; font-size: 12.5px; color: var(--pos-fg); cursor: pointer; text-align: left;
4230
+ }
4231
+ .pos-arr__row:hover:not(:disabled) { background: var(--pos-2); }
4232
+ .pos-arr__row:disabled { opacity: 0.5; cursor: not-allowed; }
4233
+ .pos-arr__rn { flex: 1; min-width: 0; }
4234
+ .pos-arr__rw { color: var(--pos-fg-3); font-size: 11px; }
4235
+
4236
+ /* A PRÉVIA: uma linha por ambiente, e a que vai crescer fica em âmbar. */
4237
+ .pos-arr__previa {
4238
+ display: grid; gap: 4px; margin: 0; padding: var(--pos-3x); list-style: none;
4239
+ border: 1px solid var(--pos-line); border-radius: var(--pos-radius);
4240
+ background: var(--pos-2); font-size: 12px; color: var(--pos-fg-2);
4241
+ }
4242
+ .pos-arr__previa li { display: flex; align-items: center; gap: 6px; }
4243
+ .pos-arr__previa li[data-cresce] { color: var(--pos-warn); font-weight: 600; }
4244
+
4245
+
4246
+ /* ── «Editar contorno» do ambiente ────────────────────────────────────── */
4247
+ .pos-out__cols { display: grid; grid-template-columns: 280px 1fr; gap: var(--pos-4x); align-items: start; }
4248
+ .pos-out__form { display: grid; gap: var(--pos-3x); align-content: start; min-width: 0; }
4249
+ .pos-out__formas { display: grid; gap: var(--pos-2x); }
4250
+ .pos-out__forma {
4251
+ padding: 7px var(--pos-3x); border: 1px solid var(--pos-line); border-radius: var(--pos-radius);
4252
+ background: var(--pos-1); font-size: 12.5px; color: var(--pos-fg); cursor: pointer;
4253
+ text-align: left; transition: all var(--pos-fast);
4254
+ }
4255
+ .pos-out__forma[aria-pressed='true'] {
4256
+ border-color: var(--pos-primary);
4257
+ background: color-mix(in srgb, var(--pos-primary) 8%, transparent);
4258
+ font-weight: 600;
4259
+ }
4260
+ .pos-out__tools { display: flex; gap: var(--pos-2x); }
4261
+ .pos-out__tools .pos-btn { flex: 1; }
4262
+ .pos-out__count { margin: 0; font-size: 12px; color: var(--pos-fg-3); }
4263
+
4264
+ /* O canvas rola nos DOIS sentidos: um salão de 29 m dá 1160px de desenho, e
4265
+ cortá-lo esconderia justamente a parede que se está medindo. */
4266
+ .pos-out__canvas {
4267
+ overflow: auto; max-height: 460px;
4268
+ border: 1px solid var(--pos-line); border-radius: var(--pos-radius);
4269
+ background: var(--pos-2);
4270
+ }
4271
+ .pos-out__canvas svg { display: block; }
4272
+
4273
+ /* O caminho para o contorno não é destrutivo — não pode herdar o vermelho do
4274
+ «Tirar da planta», que mora na mesma classe. */
4275
+ .pos-insp__outline:hover { color: var(--pos-fg); }
4276
+
4277
+
4278
+ /* ── O aviso de escopo do salão ───────────────────────────────────────── */
4279
+ .pos-scope {
4280
+ display: flex; align-items: center; gap: var(--pos-2x); flex: 0 0 auto;
4281
+ margin: 0 var(--pos-4x) var(--pos-3x);
4282
+ padding: 6px var(--pos-3x); border-radius: var(--pos-radius);
4283
+ border: 1px solid color-mix(in srgb, var(--pos-primary) 30%, transparent);
4284
+ background: color-mix(in srgb, var(--pos-primary) 7%, transparent);
4285
+ font-size: 11.5px; line-height: 1.45; color: var(--pos-fg-2);
4286
+ }
4287
+ .pos-scope svg { flex: none; color: var(--pos-primary); }
4288
+ .pos-scope__t { min-width: 0; }
4289
+ /* «Sem praça atribuída» é informação, não alerta: ninguém fez nada errado, e
4290
+ o tracejado diz "provisório" sem pintar a faixa de aviso. */
4291
+ .pos-scope--none {
4292
+ border-style: dashed; border-color: var(--pos-line-strong);
4293
+ background: none; color: var(--pos-fg-3);
4294
+ }
4295
+ .pos-scope--none svg { color: var(--pos-fg-3); }
4296
+ .pos-scope__b {
4297
+ margin-left: auto; flex: none; padding: 3px var(--pos-2x);
4298
+ border: 0; border-radius: var(--pos-r-pill);
4299
+ background: none; font-size: 11.5px; font-weight: 600;
4300
+ color: var(--pos-primary); cursor: pointer;
4301
+ }
4302
+ .pos-scope__b:hover { background: color-mix(in srgb, var(--pos-primary) 12%, transparent); }
4303
+
4304
+
4305
+ /* «Configurar mesas», ao lado do segmentado de vista. Quadrado como o
4306
+ segmentado é alto: dois controles na mesma coluna precisam da mesma
4307
+ altura, senão a linha fica com um degrau. */
4308
+ .pos-seg__gear {
4309
+ display: inline-flex; align-items: center; justify-content: center;
4310
+ width: 34px; height: 34px; flex: none;
4311
+ border: 1px solid var(--pos-line-strong); border-radius: var(--pos-radius);
4312
+ background: var(--pos-1); color: var(--pos-fg-2); cursor: pointer;
4313
+ transition: all var(--pos-fast);
4314
+ }
4315
+ .pos-seg__gear:hover { border-color: var(--pos-primary); color: var(--pos-fg); }
4316
+
4317
+ /* Reabrir uma conta fechada. O botão mora FORA da linha (botão dentro de botão
4318
+ não recebe clique) e fica discreto: reabrir é exceção, não rotina. */
4319
+ .pos-closed__wrap { position: relative; display: block; }
4320
+ .pos-closed__reopen {
4321
+ position: absolute; right: 6px; top: 6px; z-index: 1;
4322
+ display: grid; place-items: center; width: 24px; height: 24px;
4323
+ border: none; border-radius: var(--pos-r-xs); background: transparent;
4324
+ color: var(--pos-fg-3); cursor: pointer;
4325
+ }
4326
+ .pos-closed__reopen:hover { background: var(--pos-3); color: var(--pos-fg); }
4327
+ /* A razão de a cortesia não reabrir, sob a linha. */
4328
+ .pos-closed__why {
4329
+ display: block; padding: 0 var(--pos-3x) 6px;
4330
+ font-size: 11px; line-height: 1.35; color: var(--pos-fg-3);
4331
+ }
4332
+
4333
+ /* A folha de CONFIRMAÇÃO é estreita: ela faz UMA pergunta, e uma folha larga
4334
+ para uma pergunta curta parece que esconde mais coisa abaixo da dobra. */
4335
+ .pos-sheet__panel--sm { max-width: 420px; }
4336
+
4337
+ /* «Cancelar todos os itens» — a caixa vermelha do topo do cancelamento.
4338
+ Ela não é mais uma linha da lista: é a alternativa à lista inteira, e por
4339
+ isso tem a cor do que vai sair da conta. Herda o desenho da caixa das linhas
4340
+ selecionáveis, trocando só o azul pelo vermelho. */
4341
+ .pos-dsc__all {
4342
+ display: flex; align-items: center; gap: var(--pos-3x);
4343
+ padding: 11px var(--pos-3x);
4344
+ border: 1px solid color-mix(in srgb, var(--pos-danger) 34%, transparent);
4345
+ border-radius: var(--pos-r);
4346
+ background: color-mix(in srgb, var(--pos-danger) 7%, var(--pos-2));
4347
+ cursor: pointer; font-size: 14.5px; font-weight: 600; color: var(--pos-danger);
4348
+ transition: background var(--pos-t) var(--pos-e);
4349
+ }
4350
+ .pos-dsc__all:hover { background: color-mix(in srgb, var(--pos-danger) 12%, var(--pos-2)); }
4351
+ .pos-dsc__all input[type='checkbox'] {
4352
+ appearance: none; -webkit-appearance: none;
4353
+ width: 18px; height: 18px; flex: none; margin: 0;
4354
+ border: 1.5px solid color-mix(in srgb, var(--pos-danger) 55%, transparent);
4355
+ border-radius: var(--pos-r-xs);
4356
+ background: var(--pos-1); cursor: pointer; position: relative;
4357
+ }
4358
+ .pos-dsc__all input[type='checkbox']:checked {
4359
+ border-color: var(--pos-danger); background: var(--pos-danger);
4360
+ }
4361
+ .pos-dsc__all input[type='checkbox']:checked::after {
4362
+ content: ''; position: absolute; inset: 0;
4363
+ background: var(--pos-1);
4364
+ clip-path: polygon(14% 46%, 8% 54%, 38% 82%, 92% 26%, 85% 19%, 38% 68%);
4365
+ }
4366
+
4367
+ /* O grupo por participante. A faixa é discreta de propósito: ela responde
4368
+ «de quem», e quem decide continua sendo o seletor de quantidade. */
4369
+ .pos-dsc__grp {
4370
+ border: 1px solid var(--pos-line); border-radius: var(--pos-r);
4371
+ overflow: hidden; margin-bottom: var(--pos-2x);
4372
+ }
4373
+ .pos-dsc__grph {
4374
+ display: flex; align-items: center; gap: var(--pos-2x);
4375
+ padding: 7px var(--pos-3x);
4376
+ background: var(--pos-3);
4377
+ font-size: 11.5px; font-weight: 700; letter-spacing: .06em; text-transform: uppercase;
4378
+ color: var(--pos-fg-2);
4379
+ }
4380
+ .pos-dsc__grph svg { color: var(--pos-primary); }
4381
+ .pos-dsc__grp .pos-dsc__lines {
4382
+ padding: var(--pos-2x);
4383
+ /* SEM rolagem própria. A lista solta tem teto de 208px e rola por dentro —
4384
+ dentro de um grupo isso vira vinte e três áreas de rolagem empilhadas, cada
4385
+ uma cortando a própria última linha ao meio. Quem rola é o corpo da folha,
4386
+ uma vez. */
4387
+ max-height: none; overflow: visible;
4388
+ }
4389
+
4390
+ /* A linha de outro dono, na transferência de itens. Apagada, não escondida:
4391
+ o operador precisa ver que o item existe e entender por que não pode entrar
4392
+ nesta transferência — é a regra do «um participante por vez» dita antes do
4393
+ clique, em vez de recusada depois dele. */
4394
+ .pos-dsc__line[data-off] { opacity: .42; }
4395
+ .pos-dsc__line[data-off]:hover { background: var(--pos-2); }
4396
+
4397
+ /* A linha que explica a operação, no alto do corpo da folha. Texto de leitura,
4398
+ não rótulo: tamanho de corpo e a cor secundária, para não competir com o
4399
+ número que vem logo abaixo. */
4400
+ .pos-sheet__lead {
4401
+ margin: 0 0 var(--pos-3x); font-size: 13.5px; line-height: 1.45;
4402
+ color: var(--pos-fg-2);
4403
+ }
4404
+
4405
+ /* «Não consegui ler os descontos já aplicados».
4406
+ Âmbar, e no topo do corpo: é um aviso sobre o que a tela NÃO sabe, e quem
4407
+ vai conceder dinheiro precisa lê-lo antes de digitar o valor — não depois. */
4408
+ .pos-dsc__blind {
4409
+ display: flex; align-items: flex-start; gap: var(--pos-2x);
4410
+ padding: 9px var(--pos-3x); margin-bottom: var(--pos-2x);
4411
+ border: 1px solid color-mix(in srgb, var(--pos-warn) 34%, transparent);
4412
+ border-radius: var(--pos-r);
4413
+ background: color-mix(in srgb, var(--pos-warn) 8%, var(--pos-2));
4414
+ color: var(--pos-fg);
4415
+ }
4416
+ .pos-dsc__blind svg { flex: none; margin-top: 1px; color: var(--pos-warn); }
4417
+ .pos-dsc__blind > span { display: grid; gap: 2px; }
4418
+ .pos-dsc__blind strong { font-size: 13.5px; font-weight: 650; }
4419
+ .pos-dsc__blind > span > span { font-size: 12.5px; color: var(--pos-fg-2); }
4420
+
4421
+ /* --- fila de espera ------------------------------------------------------
4422
+ Irmã da lista de reservas, e de propósito: reserva e fila são a MESMA
4423
+ operação vista da porta — quem quer mesa, antes e durante o serviço. Duas
4424
+ telas vizinhas com dois desenhos fazem o anfitrião reaprender a mesma coisa
4425
+ ao trocar de aba.
4426
+
4427
+ A diferença é o que a borda esquerda diz: na reserva ela marca atraso; aqui
4428
+ ela marca o CHAMADO, que é o estado que o anfitrião precisa achar de longe
4429
+ com uma bandeja na mão.
4430
+ ------------------------------------------------------------------------- */
4431
+ .pos-wl { flex: 1; padding: var(--pos-4x); display: grid; gap: var(--pos-3x); align-content: start; }
4432
+ .pos-wl__head {
4433
+ display: flex; align-items: center; justify-content: space-between; gap: var(--pos-3x);
4434
+ padding-bottom: var(--pos-2x); border-bottom: 1px solid var(--pos-line);
4435
+ }
4436
+ .pos-wl__count { display: inline-flex; align-items: center; gap: 6px; font-size: 13px; color: var(--pos-fg-2); }
4437
+ .pos-wl__new {
4438
+ display: inline-flex; align-items: center; justify-content: center; gap: 6px;
4439
+ min-height: 40px; padding: 0 var(--pos-4x);
4440
+ border: 1px solid var(--pos-primary); border-radius: var(--pos-r-pill);
4441
+ background: var(--pos-primary); color: var(--pos-primary-fg);
4442
+ font-size: 14px; font-weight: 650; cursor: pointer;
4443
+ transition: background var(--pos-t) var(--pos-e), transform var(--pos-t) var(--pos-e);
4444
+ }
4445
+ .pos-wl__new:hover { background: var(--pos-primary-hover); border-color: var(--pos-primary-hover); }
4446
+ .pos-wl__new:active { transform: scale(0.985); }
4447
+
4448
+ .pos-wl__list { display: grid; gap: var(--pos-2x); }
4449
+ /* O título só aparece quando há DOIS grupos: com uma origem só, nomeá-la é
4450
+ ruído — a tela inteira já é aquilo. */
4451
+ .pos-wl__group {
4452
+ margin: var(--pos-3x) 0 0; font-size: 11.5px; font-weight: 700;
4453
+ letter-spacing: 0.06em; text-transform: uppercase; color: var(--pos-fg-3);
4454
+ }
4455
+ .pos-wl__group:first-child { margin-top: 0; }
4456
+
4457
+ /* A RESERVA se distingue pela borda, não por outra caixa: é a mesma linha da
4458
+ fila com outra origem, e desenhá-la diferente faria o anfitrião ler duas
4459
+ tabelas onde existe uma lista de entrada só. */
4460
+ .pos-wl__row[data-booked='true']::before { background: var(--pos-accent); }
4461
+ .pos-wl__row[data-booked='true'] .pos-wl__pos { font-size: 17px; color: var(--pos-fg); }
4462
+ /* Chegou: a linha acende como a do chamado — nas duas origens, a cor quer
4463
+ dizer "esta gente está de pé aí fora agora". */
4464
+ .pos-wl__row[data-booked='true'][data-called='true'] { background: color-mix(in srgb, var(--pos-accent) 9%, var(--pos-2)); }
4465
+ .pos-wl__row[data-booked='true'][data-called='true']::before { background: var(--pos-ok); }
4466
+ .pos-wl__row[data-booked='true'] .pos-wl__state { color: var(--pos-ok); }
4467
+ .pos-wl__row {
4468
+ display: grid; grid-template-columns: 64px minmax(0, 1fr) auto;
4469
+ align-items: center; gap: var(--pos-3x);
4470
+ min-height: var(--pos-hit); padding: var(--pos-3x);
4471
+ border: 1px solid var(--pos-line); border-radius: var(--pos-r);
4472
+ background: var(--pos-2);
4473
+ position: relative; overflow: hidden;
4474
+ }
4475
+ .pos-wl__row::before {
4476
+ content: ''; position: absolute; inset: 0 auto 0 0; width: 4px;
4477
+ background: var(--pos-line-strong);
4478
+ }
4479
+ .pos-wl__row[data-called='true']::before { background: var(--pos-primary); }
4480
+ /* O prazo estourado NÃO é um erro do sistema: é uma informação para o
4481
+ anfitrião decidir. Por isso a cor pinta a borda e o estado, e não um alerta
4482
+ sobre a linha. */
4483
+ .pos-wl__row[data-overdue='true']::before { background: var(--pos-danger); }
4484
+ .pos-wl__row[data-called='true'] { background: color-mix(in srgb, var(--pos-primary) 7%, var(--pos-2)); }
4485
+ .pos-wl__row[data-overdue='true'] { background: color-mix(in srgb, var(--pos-danger) 8%, var(--pos-2)); }
4486
+
4487
+ /* A POSIÇÃO é a coisa maior do cartão: é a resposta da única pergunta que a
4488
+ fila responde, e ela é lida de pé, a um metro de distância. */
4489
+ .pos-wl__pos {
4490
+ display: inline-flex; align-items: center; justify-content: center;
4491
+ font-size: 22px; font-weight: 750; letter-spacing: -0.03em;
4492
+ color: var(--pos-fg-2); padding-left: 4px;
4493
+ }
4494
+ .pos-wl__row[data-called='true'] .pos-wl__pos { color: var(--pos-primary); }
4495
+ .pos-wl__row[data-overdue='true'] .pos-wl__pos { color: var(--pos-danger); }
4496
+
4497
+ .pos-wl__who { min-width: 0; }
4498
+ .pos-wl__name { display: block; font-size: 15px; font-weight: 620; }
4499
+ .pos-wl__meta { display: flex; flex-wrap: wrap; gap: var(--pos-2x); margin-top: 3px; }
4500
+ .pos-wl__chip { display: inline-flex; align-items: center; gap: 4px; font-size: 12px; color: var(--pos-fg-2); }
4501
+ .pos-wl__state { display: block; margin-top: 4px; font-size: 12px; font-weight: 650; color: var(--pos-primary); }
4502
+ .pos-wl__row[data-overdue='true'] .pos-wl__state { color: var(--pos-danger); }
4503
+ .pos-wl__note { display: block; margin-top: 3px; font-size: 12px; color: var(--pos-fg-2); font-style: italic; }
4504
+ .pos-wl__warn { display: block; margin-top: 4px; font-size: 12px; color: var(--pos-warn); }
4505
+ .pos-wl__known {
4506
+ display: inline-flex; align-items: center; gap: 5px; margin-top: 4px;
4507
+ font-size: 12px; font-weight: 600; color: var(--pos-ok);
4508
+ }
4509
+
4510
+ .pos-wl__do {
4511
+ /* TRÊS POSIÇÕES FIXAS, e é por isso que elas não se mexem.
4512
+ A reserva tem duas ações e o grupo da fila tem três; com largura `auto`
4513
+ cada linha media pelo próprio conteúdo e «Acomodar» — a ação que a mão
4514
+ procura — caía em coluna diferente a cada linha. Numa lista que se lê de
4515
+ pé, o alvo tem de estar sempre no mesmo lugar.
4516
+ A célula vazia é declarada no JSX com um `<span aria-hidden />`: é o que
4517
+ segura a coluna quando a ação não existe naquela linha. */
4518
+ display: grid;
4519
+ grid-template-columns: minmax(0, 1fr) minmax(0, 1fr) minmax(0, 1fr);
4520
+ align-items: center; gap: var(--pos-2x);
4521
+ width: min(408px, 52vw);
4522
+ }
4523
+ .pos-wl__b {
4524
+ display: inline-flex; align-items: center; justify-content: center; gap: 7px;
4525
+ min-height: 52px; padding: 0 var(--pos-4x);
4526
+ border: 1px solid var(--pos-line-strong); border-radius: var(--pos-r-pill);
4527
+ background: transparent; color: var(--pos-fg-2);
4528
+ font-size: 14px; font-weight: 600; cursor: pointer; white-space: nowrap;
4529
+ transition: background var(--pos-t) var(--pos-e), color var(--pos-t) var(--pos-e), transform var(--pos-t) var(--pos-e);
4530
+ }
4531
+ .pos-wl__b:hover:not(:disabled) { background: var(--pos-3); color: var(--pos-fg); }
4532
+ .pos-wl__b:active:not(:disabled) { transform: scale(0.985); }
4533
+ .pos-wl__b:disabled { opacity: 0.45; cursor: default; }
4534
+ .pos-wl__b--primary {
4535
+ background: var(--pos-primary); border-color: var(--pos-primary); color: var(--pos-primary-fg); font-weight: 650;
4536
+ }
4537
+ .pos-wl__b--primary:hover:not(:disabled) { background: var(--pos-primary-hover); border-color: var(--pos-primary-hover); color: var(--pos-primary-fg); }
4538
+ /* «Não veio» fecha a linha para sempre. Ele não compete de cor com as duas
4539
+ ações que fazem a fila andar. */
4540
+ .pos-wl__b--quiet { border-color: transparent; color: var(--pos-fg-3); }
4541
+
4542
+ .pos-wl__notes {
4543
+ width: 100%; resize: vertical; min-height: 56px; padding: 10px 12px;
4544
+ border: 1px solid var(--pos-line-strong); border-radius: var(--pos-r);
4545
+ background: var(--pos-1); color: var(--pos-fg);
4546
+ font: inherit; font-size: 14px;
4547
+ }
4548
+ .pos-wl__notes::placeholder { color: var(--pos-fg-3); }
4549
+ .pos-wl__notes:focus-visible { outline: none; border-color: var(--pos-accent); }
4550
+
4551
+ @media (max-width: 1180px) {
4552
+ /* Os botões caem para baixo antes de qualquer coisa ser truncada: um nome
4553
+ que o anfitrião não lê é pior do que uma linha de duas alturas. */
4554
+ .pos-wl__row { grid-template-columns: 56px minmax(0, 1fr); }
4555
+ .pos-wl__do { grid-column: 1 / -1; justify-content: flex-end; min-width: 0; flex-wrap: wrap; }
4556
+ }
4557
+ /* O cadastro de complementos quebrado — e por que ele é um aviso e não um
4558
+ campo apagado: quem lê precisa saber a quem recorrer, não adivinhar. */
4559
+ .pos-mgroup__bad {
4560
+ margin: 0; padding: var(--pos-3x);
4561
+ border: 1px solid color-mix(in srgb, var(--pos-warn) 40%, transparent);
4562
+ border-radius: var(--pos-r);
4563
+ background: color-mix(in srgb, var(--pos-warn) 10%, transparent);
4564
+ color: var(--pos-fg); font-size: 14px; line-height: 1.4;
4565
+ }
4566
+
4567
+ /* A FAIXA DO MAPA VELHO — ver `floorStale.ts`.
4568
+ Fica no alto do palco e NÃO some sozinha: ela descreve um estado, não um
4569
+ evento. `--pos-warn` já tem tom claro e escuro. */
4570
+ .pos-stale {
4571
+ display: flex; align-items: center; gap: var(--pos-2x);
4572
+ padding: 8px var(--pos-3x); font-size: 13px; line-height: 1.35;
4573
+ color: var(--pos-warn);
4574
+ background: color-mix(in srgb, var(--pos-warn) 12%, transparent);
4575
+ border-bottom: 1px solid color-mix(in srgb, var(--pos-warn) 30%, transparent);
4576
+ }
4577
+ .pos-stale > span { min-width: 0; }
4578
+ .pos-stale__b {
4579
+ margin-left: auto; flex: none; cursor: pointer;
4580
+ padding: 4px 10px; border-radius: 999px; font-size: 12px; font-weight: 600;
4581
+ color: var(--pos-warn); background: transparent;
4582
+ border: 1px solid color-mix(in srgb, var(--pos-warn) 45%, transparent);
4583
+ }
4584
+ .pos-stale__b:hover { background: color-mix(in srgb, var(--pos-warn) 18%, transparent); }
4585
+
4586
+ /* A LEGENDA DA ESTEIRA — a regra dos 3 minutos, dita na própria tela.
4587
+ Miúda e apagada como no V1: ela explica, não compete com as colunas. */
4588
+ .pos-board__note {
4589
+ margin: 0 var(--pos-3x) var(--pos-2x);
4590
+ font-size: 12px; line-height: 1.4; color: var(--pos-fg-3);
4591
+ }
4592
+
4593
+ /* EDITAR O COUVERT — uma linha por participante, nome à esquerda e a
4594
+ quantidade à direita, como no diálogo do V1. */
4595
+ .pos-cvr { display: flex; flex-direction: column; gap: var(--pos-2x); }
4596
+ .pos-cvr__row { display: flex; align-items: center; gap: var(--pos-3x); }
4597
+ .pos-cvr__who { flex: 1; min-width: 0; font-size: 14px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
4598
+ .pos-cvr__n {
4599
+ flex: none; width: 72px; height: 34px; text-align: center; font-size: 15px;
4600
+ border-radius: var(--pos-r-2, 8px); border: 1px solid var(--pos-edge);
4601
+ background: var(--pos-1); color: var(--pos-fg);
4602
+ }
4603
+ /* O total fica à ESQUERDA do rodapé e empurra os botões: ele é o número que a
4604
+ pessoa confere antes de salvar, não um detalhe ao lado do botão. */
4605
+ .pos-cvr__tot { margin-right: auto; display: inline-flex; align-items: baseline; gap: var(--pos-2x); }
4606
+
4607
+ /* O LÁPIS do couvert, na linha dos totais. Discreto: ele não compete com o
4608
+ valor, que é o que a pessoa lê. Aparece só quando há participante. */
4609
+ .pos-tot__edit {
4610
+ flex: none; cursor: pointer; margin-left: var(--pos-2x);
4611
+ display: inline-flex; align-items: center; justify-content: center;
4612
+ width: 20px; height: 20px; border-radius: 999px;
4613
+ border: 0; background: transparent; color: var(--pos-fg-3);
4614
+ }
4615
+ .pos-tot__edit:hover { background: var(--pos-2); color: var(--pos-fg); }
4616
+
4617
+ /* O motivo de a linha não aceitar desconto, ao lado do nome. Discreto: é
4618
+ explicação, não alerta — a linha não está errada, só já foi abatida. */
4619
+ /* `--pos-fg-3`, e não um `--pos-muted` inventado: esse token NÃO EXISTE neste
4620
+ arquivo, e a regra teria caído na cor herdada em silêncio. */
4621
+ .pos .pos-dsc__why {
4622
+ font-size: 11.5px;
4623
+ font-weight: 520;
4624
+ color: var(--pos-fg-3);
4625
+ white-space: nowrap;
4626
+ }
4627
+ .pos .pos-dsc__line[data-locked] { opacity: .62; }
4628
+ .pos .pos-dsc__line[data-locked] input { cursor: not-allowed; }