feat: bump client-services (accumulated feature work + deploy fixes)

Snapshot of in-progress work across local_backend, manager_dashboard,
and waiter_pwa (pricing, chat, fiscal, prep zones, recovery codes, CRM,
inventory, permissions), plus the nginx/docker-compose deploy fixes for
the Unraid + NPM reverse-proxy setup.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
2026-07-19 10:00:14 +03:00
co-authored by Claude Sonnet 5
parent 02ec1aa28f
commit 34ae328b0d
182 changed files with 34874 additions and 3556 deletions
+131 -7
View File
@@ -1,3 +1,18 @@
@font-face {
font-family: 'Google Sans';
src: url('/fonts/GoogleSans-Variable.ttf') format('truetype');
font-weight: 100 900;
font-style: normal;
font-display: swap;
}
@font-face {
font-family: 'Google Sans';
src: url('/fonts/GoogleSans-Variable-Italic.ttf') format('truetype');
font-weight: 100 900;
font-style: italic;
font-display: swap;
}
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
/* Prevent text selection everywhere — app behaves like native */
@@ -17,10 +32,25 @@ input, textarea, [contenteditable] {
100% { opacity: 1; }
}
@keyframes tab-alert {
0% { color: #f87171; }
50% { color: #ef444488; }
100% { color: #f87171; }
}
@keyframes gate-spin {
to { transform: rotate(360deg); }
}
/* Order item text pulse for "done" KDS status in order detail view */
@keyframes kds-ready-pulse-text {
0%,100% { color: #4ade80; }
50% { color: #bbf7d0; }
}
.kds-ready-flash-text {
animation: kds-ready-pulse-text 1.6s ease-in-out infinite;
}
:root {
/* "Free" table card — dark theme: muted blue-slate */
--card-free-bg: #243044;
@@ -47,7 +77,7 @@ input, textarea, [contenteditable] {
--primary-fg: #ffffff;
--border: #253245;
--shadow: rgba(0,0,0,0.35);
font-family: system-ui, 'Segoe UI', sans-serif;
font-family: 'Google Sans', system-ui, 'Segoe UI', sans-serif;
font-size: 16px;
color: var(--text);
background: var(--bg);
@@ -94,7 +124,7 @@ html, body {
.page {
display: flex;
flex-direction: column;
height: 100svh;
height: 100dvh;
overflow: hidden;
background: var(--bg);
}
@@ -380,7 +410,8 @@ html, body {
/* ── Product Grid ────────────────────────────────────────── */
.product-picker { display: flex; flex-direction: column; flex: 1; min-height: 0; }
.product-area { flex: 1; overflow-y: auto; min-height: 0; overscroll-behavior: contain; }
.product-area { flex: 1; overflow-y: auto; min-height: 0; overscroll-behavior: contain; scrollbar-width: none; }
.product-area::-webkit-scrollbar { display: none; }
/* Sub-category accordion */
.subcat-accordion { display: flex; flex-direction: column; gap: 4px; padding: 10px 12px; }
@@ -486,14 +517,31 @@ html, body {
font-weight: 600;
color: var(--text);
line-height: 1.35;
/* always occupy exactly 2 lines */
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
overflow: hidden;
min-height: calc(1.35em * 2);
}
.product-btn__price { font-size: 13px; color: var(--accent); font-weight: 600; margin-top: 4px; }
.product-btn__tags {
display: flex;
flex-wrap: wrap;
gap: 4px;
margin-top: 5px;
}
.product-tag-pill {
font-size: 9px;
font-weight: 600;
color: var(--accent);
background: color-mix(in srgb, var(--accent) 12%, transparent);
border: 1px solid color-mix(in srgb, var(--accent) 25%, transparent);
border-radius: 999px;
padding: 1px 6px;
line-height: 1.4;
white-space: nowrap;
text-transform: uppercase;
letter-spacing: 0.03em;
}
/* ── Cart Panel ──────────────────────────────────────────── */
.cart-panel {
@@ -523,14 +571,16 @@ html, body {
.order-item--cancelled { opacity: 0.3; text-decoration: line-through; }
.order-item--selected { background: rgba(245,158,11,0.10); border-radius: 8px; }
.order-item__row { display: flex; align-items: center; gap: 8px; }
.order-item__name { flex: 1; font-size: 17px; font-weight: 600; }
.order-item__name { flex: 1; font-size: 17px; font-weight: 600; color: #f59e0b; }
.order-item__name--served { color: var(--text); }
.order-item__name--cancelled { color: var(--muted); }
.order-item__qty { font-size: 15px; color: var(--muted); }
.order-item__price { font-size: 16px; color: var(--text); font-weight: 600; }
.order-item__modifier { font-size: 13px; color: var(--muted); padding-left: 16px; margin-top: 3px; }
.order-summary__total {
display: flex;
justify-content: space-between;
padding: 16px 0 8px;
padding: 16px 12px 8px;
font-size: 18px;
font-weight: 700;
color: var(--accent);
@@ -633,6 +683,78 @@ html, body {
}
.qty-value { font-size: 24px; font-weight: 700; min-width: 36px; text-align: center; }
/* ── Decimal quantity panel (kg / liter / gram / mL products) ── */
.qty-decimal-panel {
display: flex;
flex-direction: column;
gap: 10px;
align-items: center;
width: 100%;
}
.qty-decimal-input {
font-size: 24px;
font-weight: 700;
width: 90px;
text-align: center;
background: var(--bg3);
border: 2px solid var(--primary);
border-radius: 10px;
color: var(--text);
outline: none;
padding: 2px 4px;
/* hide spinner arrows */
-moz-appearance: textfield;
}
.qty-decimal-input::-webkit-outer-spin-button,
.qty-decimal-input::-webkit-inner-spin-button { -webkit-appearance: none; }
.qty-presets {
display: flex;
flex-wrap: wrap;
gap: 6px;
justify-content: center;
}
.qty-preset-btn {
padding: 6px 12px;
border-radius: 20px;
border: 1.5px solid var(--border);
background: var(--bg3);
color: var(--text2);
font-size: 13px;
font-weight: 600;
cursor: pointer;
transition: background 0.15s, border-color 0.15s, color 0.15s;
}
.qty-preset-btn--active {
background: var(--primary);
border-color: var(--primary);
color: var(--primary-fg);
}
.qty-offsets {
display: flex;
gap: 8px;
justify-content: center;
}
.qty-offset-btn {
padding: 7px 14px;
border-radius: 10px;
border: 1.5px solid var(--border);
font-size: 14px;
font-weight: 700;
cursor: pointer;
}
.qty-offset-btn--add {
background: rgba(34,197,94,0.12);
color: var(--success);
border-color: rgba(34,197,94,0.3);
}
.qty-offset-btn--sub {
background: rgba(248,113,113,0.12);
color: var(--danger);
border-color: rgba(248,113,113,0.3);
}
/* ── User Menu Dropdown ──────────────────────────────────── */
.user-menu-dropdown {
position: absolute;
@@ -680,3 +802,5 @@ html, body {
background: var(--border);
margin: 4px 0;
}
@keyframes longpress-fill { from { transform: scaleX(0); } to { transform: scaleX(1); } }