@fayz-ai/pos 0.20.4 → 0.21.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/app/config.d.ts +216 -4
- package/dist/app/config.d.ts.map +1 -1
- package/dist/index.d.ts +101 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10849 -2517
- package/dist/index.js.map +1 -1
- package/dist/lib/useFloorBell.d.ts +21 -0
- package/dist/lib/useFloorBell.d.ts.map +1 -0
- package/dist/screen/AreaInspector.d.ts +19 -0
- package/dist/screen/AreaInspector.d.ts.map +1 -0
- package/dist/screen/AreaOutlineSheet.d.ts +15 -0
- package/dist/screen/AreaOutlineSheet.d.ts.map +1 -0
- package/dist/screen/ArrangeSheet.d.ts +8 -0
- package/dist/screen/ArrangeSheet.d.ts.map +1 -0
- package/dist/screen/AuthorizeSheet.d.ts +73 -0
- package/dist/screen/AuthorizeSheet.d.ts.map +1 -0
- package/dist/screen/CancelSheet.d.ts +35 -0
- package/dist/screen/CancelSheet.d.ts.map +1 -0
- package/dist/screen/ClosedPanel.d.ts +55 -0
- package/dist/screen/ClosedPanel.d.ts.map +1 -0
- package/dist/screen/ConfirmSheet.d.ts +12 -0
- package/dist/screen/ConfirmSheet.d.ts.map +1 -0
- package/dist/screen/CourtesySheet.d.ts +23 -0
- package/dist/screen/CourtesySheet.d.ts.map +1 -0
- package/dist/screen/CoverChargeSheet.d.ts +16 -0
- package/dist/screen/CoverChargeSheet.d.ts.map +1 -0
- package/dist/screen/DeliveryBoard.d.ts +13 -0
- package/dist/screen/DeliveryBoard.d.ts.map +1 -1
- package/dist/screen/DiscountSheet.d.ts +85 -0
- package/dist/screen/DiscountSheet.d.ts.map +1 -0
- package/dist/screen/DispatchRail.d.ts.map +1 -1
- package/dist/screen/FloorScopeBanner.d.ts +11 -0
- package/dist/screen/FloorScopeBanner.d.ts.map +1 -0
- package/dist/screen/GuestBar.d.ts +51 -0
- package/dist/screen/GuestBar.d.ts.map +1 -0
- package/dist/screen/GuestCountSheet.d.ts +16 -0
- package/dist/screen/GuestCountSheet.d.ts.map +1 -0
- package/dist/screen/IdentitySheet.d.ts.map +1 -1
- package/dist/screen/ModifierSheet.d.ts.map +1 -1
- package/dist/screen/OpenTableSheet.d.ts.map +1 -1
- package/dist/screen/PinSheet.d.ts.map +1 -1
- package/dist/screen/PlanStage.d.ts +130 -0
- package/dist/screen/PlanStage.d.ts.map +1 -0
- package/dist/screen/PosScreen.d.ts +350 -3
- package/dist/screen/PosScreen.d.ts.map +1 -1
- package/dist/screen/ServiceChargeSheet.d.ts +98 -0
- package/dist/screen/ServiceChargeSheet.d.ts.map +1 -0
- package/dist/screen/SheetLayer.d.ts +8 -0
- package/dist/screen/SheetLayer.d.ts.map +1 -0
- package/dist/screen/ShiftPanel.d.ts +45 -0
- package/dist/screen/ShiftPanel.d.ts.map +1 -0
- package/dist/screen/ShortcutsOverlay.d.ts.map +1 -1
- package/dist/screen/SplitSheet.d.ts.map +1 -1
- package/dist/screen/TableInspector.d.ts +22 -0
- package/dist/screen/TableInspector.d.ts.map +1 -0
- package/dist/screen/TicketRail.d.ts +175 -2
- package/dist/screen/TicketRail.d.ts.map +1 -1
- package/dist/screen/TransferHistorySheet.d.ts +17 -0
- package/dist/screen/TransferHistorySheet.d.ts.map +1 -0
- package/dist/screen/TransferSheet.d.ts +65 -0
- package/dist/screen/TransferSheet.d.ts.map +1 -0
- package/dist/screen/UnassignedTables.d.ts +14 -0
- package/dist/screen/UnassignedTables.d.ts.map +1 -0
- package/dist/screen/WaitlistEntrySheet.d.ts +23 -0
- package/dist/screen/WaitlistEntrySheet.d.ts.map +1 -0
- package/dist/screen/WaitlistView.d.ts +41 -0
- package/dist/screen/WaitlistView.d.ts.map +1 -0
- package/dist/screen/ZoneDrawLayer.d.ts +11 -0
- package/dist/screen/ZoneDrawLayer.d.ts.map +1 -0
- package/dist/screen/ZoneHandles.d.ts +18 -0
- package/dist/screen/ZoneHandles.d.ts.map +1 -0
- package/dist/screen/ZoneInspector.d.ts +27 -0
- package/dist/screen/ZoneInspector.d.ts.map +1 -0
- package/dist/screen/accountFit.d.ts +17 -0
- package/dist/screen/accountFit.d.ts.map +1 -0
- package/dist/screen/accountPick.d.ts +16 -0
- package/dist/screen/accountPick.d.ts.map +1 -0
- package/dist/screen/areaOutline.d.ts +59 -0
- package/dist/screen/areaOutline.d.ts.map +1 -0
- package/dist/screen/arrangePlan.d.ts +109 -0
- package/dist/screen/arrangePlan.d.ts.map +1 -0
- package/dist/screen/arrangeTables.d.ts +69 -0
- package/dist/screen/arrangeTables.d.ts.map +1 -0
- package/dist/screen/billPrint.d.ts +66 -0
- package/dist/screen/billPrint.d.ts.map +1 -0
- package/dist/screen/cancelCheck.d.ts +31 -0
- package/dist/screen/cancelCheck.d.ts.map +1 -0
- package/dist/screen/cardBrand.d.ts +44 -0
- package/dist/screen/cardBrand.d.ts.map +1 -0
- package/dist/screen/cashGate.d.ts +31 -0
- package/dist/screen/cashGate.d.ts.map +1 -0
- package/dist/screen/catalogEmpty.d.ts +13 -0
- package/dist/screen/catalogEmpty.d.ts.map +1 -0
- package/dist/screen/categoryIcon.d.ts +4 -0
- package/dist/screen/categoryIcon.d.ts.map +1 -0
- package/dist/screen/channelSlot.d.ts +93 -0
- package/dist/screen/channelSlot.d.ts.map +1 -0
- package/dist/screen/comandaChannel.d.ts +25 -0
- package/dist/screen/comandaChannel.d.ts.map +1 -0
- package/dist/screen/courtesyGate.d.ts +31 -0
- package/dist/screen/courtesyGate.d.ts.map +1 -0
- package/dist/screen/coverQuantities.d.ts +46 -0
- package/dist/screen/coverQuantities.d.ts.map +1 -0
- package/dist/screen/deliveryColumns.d.ts +54 -0
- package/dist/screen/deliveryColumns.d.ts.map +1 -0
- package/dist/screen/discardCheck.d.ts +8 -0
- package/dist/screen/discardCheck.d.ts.map +1 -0
- package/dist/screen/discountBook.d.ts +40 -0
- package/dist/screen/discountBook.d.ts.map +1 -0
- package/dist/screen/discountCap.d.ts +9 -0
- package/dist/screen/discountCap.d.ts.map +1 -0
- package/dist/screen/discountSelectable.d.ts +20 -0
- package/dist/screen/discountSelectable.d.ts.map +1 -0
- package/dist/screen/dockScope.d.ts +9 -0
- package/dist/screen/dockScope.d.ts.map +1 -0
- package/dist/screen/fiscalSeal.d.ts +40 -0
- package/dist/screen/fiscalSeal.d.ts.map +1 -0
- package/dist/screen/floorEmpty.d.ts +20 -0
- package/dist/screen/floorEmpty.d.ts.map +1 -0
- package/dist/screen/floorGeometry.d.ts +295 -0
- package/dist/screen/floorGeometry.d.ts.map +1 -0
- package/dist/screen/floorScope.d.ts +49 -0
- package/dist/screen/floorScope.d.ts.map +1 -0
- package/dist/screen/floorStale.d.ts +5 -0
- package/dist/screen/floorStale.d.ts.map +1 -0
- package/dist/screen/guestCount.d.ts +28 -0
- package/dist/screen/guestCount.d.ts.map +1 -0
- package/dist/screen/guestCountOnClose.d.ts +11 -0
- package/dist/screen/guestCountOnClose.d.ts.map +1 -0
- package/dist/screen/ledgerMethod.d.ts +11 -0
- package/dist/screen/ledgerMethod.d.ts.map +1 -0
- package/dist/screen/menuFreshness.d.ts +18 -0
- package/dist/screen/menuFreshness.d.ts.map +1 -0
- package/dist/screen/menuSearch.d.ts +55 -0
- package/dist/screen/menuSearch.d.ts.map +1 -0
- package/dist/screen/modifierCheck.d.ts +23 -0
- package/dist/screen/modifierCheck.d.ts.map +1 -0
- package/dist/screen/openChannelCounts.d.ts +26 -0
- package/dist/screen/openChannelCounts.d.ts.map +1 -0
- package/dist/screen/orderRef.d.ts +17 -0
- package/dist/screen/orderRef.d.ts.map +1 -0
- package/dist/screen/paymentList.d.ts +26 -0
- package/dist/screen/paymentList.d.ts.map +1 -0
- package/dist/screen/pinGate.d.ts +28 -0
- package/dist/screen/pinGate.d.ts.map +1 -0
- package/dist/screen/reopen.d.ts +36 -0
- package/dist/screen/reopen.d.ts.map +1 -0
- package/dist/screen/searchSubject.d.ts +22 -0
- package/dist/screen/searchSubject.d.ts.map +1 -0
- package/dist/screen/serviceChargeCheck.d.ts +29 -0
- package/dist/screen/serviceChargeCheck.d.ts.map +1 -0
- package/dist/screen/serviceChargeGuard.d.ts +145 -0
- package/dist/screen/serviceChargeGuard.d.ts.map +1 -0
- package/dist/screen/servicePreview.d.ts +35 -0
- package/dist/screen/servicePreview.d.ts.map +1 -0
- package/dist/screen/session.d.ts +207 -0
- package/dist/screen/session.d.ts.map +1 -1
- package/dist/screen/sheetSubtitle.d.ts +8 -0
- package/dist/screen/sheetSubtitle.d.ts.map +1 -0
- package/dist/screen/shift.d.ts +97 -0
- package/dist/screen/shift.d.ts.map +1 -0
- package/dist/screen/specialReuse.d.ts +45 -0
- package/dist/screen/specialReuse.d.ts.map +1 -0
- package/dist/screen/svgDrag.d.ts +24 -0
- package/dist/screen/svgDrag.d.ts.map +1 -0
- package/dist/screen/tableTone.d.ts +64 -0
- package/dist/screen/tableTone.d.ts.map +1 -0
- package/dist/screen/transferDone.d.ts +12 -0
- package/dist/screen/transferDone.d.ts.map +1 -0
- package/dist/screen/transferGuestBlock.d.ts +30 -0
- package/dist/screen/transferGuestBlock.d.ts.map +1 -0
- package/dist/screen/transferPick.d.ts +51 -0
- package/dist/screen/transferPick.d.ts.map +1 -0
- package/dist/screen/views.d.ts +139 -4
- package/dist/screen/views.d.ts.map +1 -1
- package/dist/screen/waitlist.d.ts +211 -0
- package/dist/screen/waitlist.d.ts.map +1 -0
- package/dist/screen/writeFailure.d.ts +22 -0
- package/dist/screen/writeFailure.d.ts.map +1 -0
- package/dist/screen/zoneDraft.d.ts +75 -0
- package/dist/screen/zoneDraft.d.ts.map +1 -0
- package/dist/screen/zoneEditing.d.ts +56 -0
- package/dist/screen/zoneEditing.d.ts.map +1 -0
- package/dist/styles.css +2697 -200
- 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
|
-
|
|
44
|
-
--pos-
|
|
45
|
-
|
|
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:
|
|
48
|
-
|
|
49
|
-
/* ---
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
--pos-tone-
|
|
64
|
-
--pos-tone-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
--pos-
|
|
68
|
-
--pos-
|
|
69
|
-
|
|
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:
|
|
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:
|
|
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
|
-
|
|
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:
|
|
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
|
-
|
|
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)
|
|
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:
|
|
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
|
-
|
|
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:
|
|
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
|
-
|
|
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:
|
|
355
|
-
/*
|
|
356
|
-
|
|
357
|
-
|
|
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:
|
|
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
|
-
|
|
369
|
-
|
|
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:
|
|
392
|
-
background:
|
|
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:
|
|
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:
|
|
411
|
-
|
|
412
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
.
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
.
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
/*
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
.pos-tbl[data-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
.pos-tbl[data-
|
|
496
|
-
|
|
497
|
-
/*
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
.pos-tbl[data-
|
|
502
|
-
|
|
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
|
-
|
|
525
|
-
|
|
526
|
-
|
|
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:
|
|
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
|
-
|
|
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 {
|
|
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
|
|
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:
|
|
636
|
-
.pos-item[data-filled='true'] .pos-item__price { color:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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
|
-
/*
|
|
763
|
-
|
|
764
|
-
|
|
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
|
-
|
|
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:
|
|
794
|
-
|
|
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
|
|
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'] {
|
|
810
|
-
|
|
811
|
-
|
|
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
|
|
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:
|
|
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:
|
|
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
|
-
.
|
|
848
|
-
|
|
849
|
-
|
|
850
|
-
|
|
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:
|
|
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
|
|
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
|
-
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
1189
|
-
|
|
1190
|
-
|
|
1191
|
-
|
|
1192
|
-
|
|
1193
|
-
|
|
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:
|
|
1203
|
-
background:
|
|
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:
|
|
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:
|
|
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
|
|
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:
|
|
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:
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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
|
-
|
|
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:
|
|
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:
|
|
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
|
-
/* ---
|
|
2050
|
-
|
|
2051
|
-
|
|
2052
|
-
|
|
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
|
-
|
|
2057
|
-
|
|
2058
|
-
|
|
2059
|
-
|
|
2060
|
-
|
|
2061
|
-
|
|
2062
|
-
|
|
2063
|
-
|
|
2064
|
-
|
|
2065
|
-
|
|
2066
|
-
|
|
2067
|
-
min-height:
|
|
2068
|
-
|
|
2069
|
-
|
|
2070
|
-
|
|
2071
|
-
|
|
2072
|
-
|
|
2073
|
-
|
|
2074
|
-
|
|
2075
|
-
|
|
2076
|
-
|
|
2077
|
-
|
|
2078
|
-
|
|
2079
|
-
|
|
2080
|
-
|
|
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:
|
|
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 {
|
|
2088
|
-
|
|
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:
|
|
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; }
|