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:
+131
-7
@@ -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); } }
|
||||
|
||||
Reference in New Issue
Block a user