/* ============================================================
   pos.css — POS full-screen (port từ Prototype/pos-ui.css + brand tokens §0.4)
   ============================================================ */
:root {
    --primary: #D94F1E;
    --accent: #F5A623;
    --primary-grad: linear-gradient(135deg, #D94F1E 0%, #FF6C3A 100%);
    --sidebar-bg: #1A0F0A;
    --ink: #1E293B; --ink-2: #64748B; --ink-3: #94A3B8;
    --line: #E2E8F0;
    --surface-dark: #14100C; --surface-darker: #0D0A07; --surface-panel: #211A14;
    --ok: #10B981; --ok-bg: #ECFDF5;
    --warn: #F59E0B; --warn-bg: #FEF3C7;
    --crit: #EF4444; --crit-bg: #FEF2F2;
    --info: #3B82F6; --info-bg: #EFF6FF;
    --r-sm: 8px; --r-md: 12px; --r-lg: 18px;
    --sh-sm: 0 2px 4px rgba(0,0,0,.05);
    --sh-md: 0 10px 20px -6px rgba(0,0,0,.12);
    --sh-lg: 0 24px 40px -10px rgba(0,0,0,.28);
    --tr: all .2s cubic-bezier(.4,0,.2,1);
}
*, *::before, *::after { box-sizing: border-box; }
html, body { height: 100%; margin: 0; }
body.pos {
    font-family: 'Be Vietnam Pro', system-ui, sans-serif;
    background: var(--surface-dark); color: var(--ink);
    overflow: hidden; user-select: none;
}
[x-cloak] { display: none !important; }
.money { font-weight: 700; font-variant-numeric: tabular-nums; }

/* ---- Shell grid ---- */
/* Cột rail 168px: ngón tay cần ô bấm ≥ 60px mỗi chiều, 92px cũ chỉ vừa con trỏ chuột. */
/* minmax(0,1fr) chứ không phải 1fr: '1fr' = minmax(AUTO,1fr), nên hàng thứ hai vẫn phình theo
   nội dung cột cao nhất. Giỏ nhiều món là đủ để đẩy nút "Thanh toán" và "Gợi ý Combo" xuống
   dưới đáy màn — body overflow:hidden nên không có cách nào cuộn tới.
   Hàng 'banner' cao auto: không có băng cảnh báo thì cao 0, có thì đẩy ba vùng bán xuống. */
.pos-shell { display: grid; grid-template-columns: 168px 1fr 380px; grid-template-rows: 56px auto minmax(0, 1fr);
    height: 100vh; grid-template-areas: "top top top" "banner banner banner" "rail grid cart"; overflow: hidden; }
.pos-top { grid-area: top; background: var(--surface-darker); color: #fff; display: flex;
    align-items: center; justify-content: space-between; padding: 0 18px; }
.pos-top .brand { font-family: 'Outfit', sans-serif; font-weight: 800; letter-spacing: .3px; }
.pos-top .brand b { background: var(--primary-grad); -webkit-background-clip: text; background-clip: text; -webkit-text-fill-color: transparent; }
.pos-top .meta { display: flex; align-items: center; gap: 14px; font-size: .82rem; color: #d8cfc8; }
.online-dot { width: 9px; height: 9px; border-radius: 50%; background: var(--ok); display: inline-block; margin-right: 5px; }
.online-dot.off { background: var(--crit); }

/* ---- Category rail ----
   Máy quầy dùng màn cảm ứng: mỗi nút là một mục tiêu chạm, không phải một dòng menu.
   Danh mục cuộn riêng trong .rail-scroll để nút "Gợi ý Combo" luôn đứng yên dưới đáy —
   để chung một vùng cuộn thì shop nhiều danh mục sẽ đẩy nó ra khỏi màn hình. */
.pos-rail { grid-area: rail; background: var(--sidebar-bg); display: flex; flex-direction: column;
    align-items: stretch; padding: 10px 8px; overflow: hidden; min-height: 0; }
.rail-scroll { flex: 1; min-height: 0; overflow-y: auto; overscroll-behavior: contain;
    display: flex; flex-direction: column; gap: 8px; padding-bottom: 6px; }
.rail-scroll::-webkit-scrollbar { width: 6px; }
.rail-scroll::-webkit-scrollbar-thumb { background: rgba(255,255,255,.18); border-radius: 3px; }
.rail-btn { background: rgba(255,255,255,.04); border: none; color: #e0d2c8; border-radius: 14px;
    padding: 12px 8px; font-size: .88rem; font-weight: 700; cursor: pointer; transition: var(--tr);
    display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 5px;
    line-height: 1.2; min-height: 64px; flex: none; text-align: center; overflow-wrap: anywhere; }
.rail-btn i { font-size: 1.5rem; }
/* Chấm màu nhóm — cùng màu với mặt thẻ món bên lưới, để rail là chỗ học bảng màu.
   Viền trắng mờ để chấm tối (nhóm màu đá/tím đậm) không chìm vào nền rail cũng tối. */
.rail-dot { width: 12px; height: 12px; border-radius: 50%; flex: none;
    box-shadow: 0 0 0 1.5px rgba(255,255,255,.35); }
.rail-btn.active { background: var(--primary-grad); color: #fff; box-shadow: var(--sh-sm); }
/* Nút đang chọn đã đổi hẳn nền sang gradient thương hiệu; giữ chấm ở đó là hai màu chỏi nhau. */
.rail-btn.active .rail-dot { box-shadow: 0 0 0 1.5px rgba(255,255,255,.9); }
.rail-btn:hover:not(.active) { background: rgba(255,255,255,.1); color: #fff; }
.rail-btn:active { transform: scale(.96); }

/* Vạch ngăn: dưới nó không còn là "lọc thực đơn" mà là công cụ trên giỏ hàng. */
.rail-sep { flex: none; height: 1px; background: rgba(255,255,255,.16); margin: 8px 4px; }
.rail-tool { flex: none; min-height: 74px; border-radius: 14px; cursor: pointer; position: relative;
    border: 1.5px dashed rgba(245,166,35,.55); background: rgba(245,166,35,.12); color: var(--accent);
    font-family: inherit; font-weight: 800; font-size: .86rem; line-height: 1.2; padding: 10px 8px;
    display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 5px;
    transition: var(--tr); }
.rail-tool i { font-size: 1.5rem; }
.rail-tool:hover { background: rgba(245,166,35,.2); }
.rail-tool:active { transform: scale(.96); }
.rail-tool .cnt { position: absolute; top: 6px; right: 8px; min-width: 22px; height: 22px; padding: 0 6px;
    border-radius: 20px; background: var(--ok); color: #fff; font-size: .72rem; font-weight: 800;
    display: inline-flex; align-items: center; justify-content: center; }

/* ---- Product grid ---- */
.pos-grid { grid-area: grid; background: #F6F1EC; padding: 14px; overflow-y: auto; min-height: 0; }
.grid-search { display: flex; gap: 10px; margin-bottom: 12px; }
.grid-search input { flex: 1; min-width: 0; border: 1px solid var(--line); border-radius: var(--r-md);
    padding: 10px 14px; font-size: .95rem; font-family: inherit; background: #fff; }
.prod-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(150px, 1fr)); gap: 12px; }
.prod-card { background: #fff; border-radius: var(--r-md); padding: 12px; cursor: pointer;
    box-shadow: var(--sh-sm); transition: var(--tr); border: 2px solid transparent; position: relative;
    display: flex; flex-direction: column; gap: 6px; min-height: 108px; }
.prod-card:hover { transform: translateY(-2px); box-shadow: var(--sh-md); border-color: var(--primary); }
.prod-card .name { font-weight: 600; font-size: .86rem; line-height: 1.2; }

/* ---- Mặt thẻ món: ảnh → emoji → chữ viết tắt (V0045) ----
   aspect-ratio CỐ ĐỊNH cho cả ba tầng. Đây là điều kiện sống còn của lưới trộn: cho khung cao theo
   nội dung thì thẻ có ảnh cao hơn thẻ không ảnh, hàng so le, và mắt mất luôn cái lưới đều đặn vốn
   là thứ giúp nhớ vị trí món. 4:3 chứ không 1:1 — vuông ăn thêm ~25% chiều cao mỗi thẻ, đổi lại
   mỗi màn hình mất gần một hàng món.
   Nền .face luôn là màu nhóm, kể cả khi vẽ ảnh đè lên: ảnh nền trong suốt (PNG cắt viền) rơi xuống
   đúng màu nhóm thay vì lọt xuống nền trắng của thẻ. */
.prod-card .face { position: relative; width: 100%; aspect-ratio: 4 / 3; border-radius: 10px;
    overflow: hidden; display: flex; align-items: center; justify-content: center; }
.prod-card .face-img { width: 100%; height: 100%; object-fit: cover; display: block; }
/* Chữ viết tắt in TRẮNG trên nền màu đậm — bảng màu trong CatalogVisual chọn theo đúng ràng buộc
   này. Bóng chữ mảnh để nét không tan vào ảnh nền ở những tông sáng hơn. */
.prod-card .face-glyph { color: #fff; font-weight: 800; font-size: 1.5rem; letter-spacing: 1px;
    text-shadow: 0 1px 2px rgba(0,0,0,.25); }
/* Emoji thì bỏ giãn cách và bóng chữ: hai thứ đó làm biến dạng glyph màu. */
.prod-card .face-glyph.is-emoji { font-size: 2rem; letter-spacing: 0; text-shadow: none; }

/* Chế độ 'text': không mặt thẻ, chỉ vạch màu nhóm bám mép trái. Thẻ thấp hơn nên một màn chứa
   thêm được khoảng một hàng rưỡi món — dành cho thực đơn dài mà thu ngân đã thuộc mặt chữ. */
.prod-card.lean { padding-left: 16px; }
.prod-card .cat-bar { position: absolute; left: 0; top: 10px; bottom: 10px; width: 5px;
    border-radius: 0 4px 4px 0; }

.prod-card .price { color: var(--primary); font-weight: 700; margin-top: auto; }
.prod-card .combo-tag { position: absolute; top: 8px; right: 8px; font-size: .6rem; font-weight: 700;
    background: var(--accent); color: #fff; padding: 2px 6px; border-radius: 20px; }
/* Thẻ có hai lối đi (Lẻ / Combo): thân thẻ không còn bấm được nên bỏ luôn con trỏ tay, tránh mời
   gọi một cú chạm không có tác dụng gì. */
.prod-card.has-pick { cursor: default; }
.prod-card .pick-row { display: grid; grid-template-columns: 1fr 1fr; gap: 6px; margin-top: 4px; }
.prod-card .pick-btn { padding: 8px 4px; border: 1px solid var(--line); border-radius: 8px; background: #fff;
    font-family: inherit; font-weight: 700; font-size: .8rem; cursor: pointer; transition: var(--tr); }
.prod-card .pick-btn:hover { border-color: var(--primary); color: var(--primary); }
.prod-card .pick-btn.combo { background: var(--accent); border-color: var(--accent); color: #fff; }
.prod-card .pick-btn.combo:hover { filter: brightness(1.08); color: #fff; }
/* Thẻ hết món: nút vẫn hiện nhưng lớp phủ "HẾT" nằm trên, nên chặn luôn con trỏ để không bấm xuyên. */
.prod-card.out .pick-row { pointer-events: none; }
.prod-card.out { opacity: .45; cursor: not-allowed; filter: grayscale(.6); }
.prod-card.out::after { content: "HẾT"; position: absolute; inset: 0; display: flex; align-items: center;
    justify-content: center; font-weight: 800; color: var(--crit); font-size: 1.1rem; letter-spacing: 2px;
    background: rgba(255,255,255,.35); border-radius: var(--r-md); }

/* ---- Cart panel ---- */
/* min-height:0 ở CẢ hai tầng (grid item và flex item): thiếu một tầng là danh sách món cứ dài ra
   thay vì cuộn, kéo theo phần tổng tiền + nút thanh toán rơi khỏi màn hình. */
.pos-cart { grid-area: cart; background: #fff; display: flex; flex-direction: column; border-left: 1px solid var(--line);
    min-height: 0; overflow: hidden; }
/* ---- Loại đơn (hàng nút đầu giỏ) ----
   Màu từng loại khớp nhãn loại đơn trên makeline (.type-take / .type-dine / .type-del) để thu
   ngân và bếp đọc cùng một bảng màu. Mang về — mặc định — giữ tông trung tính: nút ĐANG chọn
   chỉ "kêu" khi đơn khác mặc định, đúng lúc cần thu ngân để ý. */
.cart-type { flex: none; display: flex; gap: 6px; padding: 10px 12px 8px; border-bottom: 1px solid var(--line); }
.ot-btn { --ot: var(--ink-2); --ot-bg: #EEF2F6;
    flex: 1 1 0; min-width: 0; display: flex; align-items: center; justify-content: center; gap: 6px;
    min-height: 44px; padding: 6px 4px; cursor: pointer; border: 1.5px solid var(--line);
    border-radius: var(--r-md); background: #fff; color: var(--ink-2);
    font-family: inherit; font-weight: 700; font-size: .8rem; transition: var(--tr); }
.ot-btn i { font-size: 1.05rem; line-height: 1; }
.ot-btn span { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.ot-btn:active { transform: scale(.96); }
/* Từ 3 nút trở lên: icon trên, chữ dưới (như .cart-tool). Xếp ngang thì 4 nút trong 380px cắt
   chữ thành "Mang …" / "Giao …" — thu ngân phải nhận nút bằng icon, đúng thứ ta không muốn. */
.cart-type.stacked .ot-btn { flex-direction: column; gap: 3px; min-height: 50px; font-size: .74rem; }
.ot-btn.on { border-color: var(--ot); background: var(--ot-bg); color: var(--ot); box-shadow: inset 0 0 0 1px var(--ot); }
.ot-dine_in { --ot: #16A34A; --ot-bg: #ECFDF5; }
.ot-delivery { --ot: var(--info); --ot-bg: var(--info-bg); }
.ot-platform { --ot: #7C3AED; --ot-bg: #F5F3FF; }
/* Mang về đang chọn: viền đậm thôi, không tô màu — đây là trạng thái của đa số đơn. */
.ot-take_away.on { --ot: var(--ink); --ot-bg: #F8FAFC; }

/* Chip loại đơn trên tiêu đề màn Thanh toán — cùng màu với nút trong giỏ. */
/* Không khai --ot ở đây: .pay-type đứng SAU .ot-dine_in… nên khai ở đây sẽ đè mất màu từng loại. */
.pay-type {
    display: inline-flex; align-items: center; gap: 5px; margin: 0 4px; padding: 3px 10px;
    border: 1.5px solid var(--ot, var(--ink-2)); border-radius: 999px;
    background: var(--ot-bg, #F1F5F9); color: var(--ot, var(--ink-2));
    font-family: inherit; font-size: .85rem; font-weight: 700; cursor: pointer; vertical-align: middle; }
.pay-type.ot-take_away { --ot: var(--ink-2); --ot-bg: #F1F5F9; }

.cart-cust { flex: none; padding: 12px 16px; border-bottom: 1px solid var(--line); display: flex; align-items: center; gap: 10px;
    cursor: pointer; transition: var(--tr); }
.cart-cust:hover { background: #F8FAFC; }
.cart-cust > .bi:first-child { font-size: 1.6rem; color: var(--ink-3); }
.cart-cust > .bi-search { color: var(--ink-3); }
.cart-cust .who { flex: 1; min-width: 0; }
.cart-cust .who .nm { font-weight: 700; font-size: .9rem; }
.cart-cust .who .pts { font-size: .74rem; color: var(--ink-2); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
/* Có món mà chưa ai hỏi SĐT: dải đổi màu cảnh báo — nhắc, chưa phải lỗi. */
.cart-cust.pending { background: var(--warn-bg); box-shadow: inset 4px 0 0 var(--warn); }
.cart-cust.pending > .bi:first-child, .cart-cust.pending .who .nm { color: #B45309; }

/* ---- Tra / tạo khách theo SĐT (_CustomerLookup) ---- */
.cust-lookup-row { display: flex; gap: 8px; align-items: stretch; }
.cust-lookup-row input { flex: 1; min-width: 0; border: 1px solid var(--line); border-radius: var(--r-md); padding: 10px 12px;
    font-size: 1rem; font-family: inherit; user-select: text; }
.cust-lookup-row input[type=tel] { font-size: 1.08rem; font-weight: 600; letter-spacing: .02em; font-variant-numeric: tabular-nums; }
.cust-lookup-row input:focus { outline: none; border-color: var(--primary); box-shadow: 0 0 0 3px rgba(217,79,30,.15); }
.cust-lookup-row .ui-btn { padding: 0 14px; white-space: nowrap; }
.cust-lookup-new { margin-top: 10px; padding-top: 10px; border-top: 1px dashed var(--line); }
.cust-lookup-hint { font-size: .8rem; color: var(--ink-2); margin-bottom: 6px; }
.cust-lookup-hint.crit { color: var(--crit); margin: 6px 0 0; }
.cust-name-search { margin-top: 8px; }
.cust-name-search .cust-lookup-hint { margin: 6px 0 0; }
.cust-suggest { margin-top: 6px; border: 1px solid var(--line); border-radius: var(--r-md); overflow: hidden; }
.cust-suggest-item { display: flex; justify-content: space-between; align-items: center; gap: 12px; width: 100%;
                     padding: 10px 12px; border: 0; border-bottom: 1px solid var(--line); background: #fff; text-align: left; cursor: pointer; }
.cust-suggest-item:last-child { border-bottom: 0; }
.cust-suggest-item:hover, .cust-suggest-item:focus { background: rgba(217,79,30,.07); outline: none; }
.cust-suggest-name { font-weight: 600; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.cust-suggest-phone { font-variant-numeric: tabular-nums; color: var(--ink-2); white-space: nowrap; }

/* ---- Khung khách đầu màn thanh toán ---- */
.pay-cust { border: 1px solid var(--line); border-radius: var(--r-md); padding: 10px 12px; margin-bottom: 14px; }
.pay-cust.pending { border-color: var(--warn); background: var(--warn-bg); }
.pay-cust.required { border-color: var(--crit); background: var(--crit-bg); }
.pay-cust-title { display: flex; align-items: center; gap: 6px; font-size: .84rem; font-weight: 700; color: #B45309; margin-bottom: 8px; }
.pay-cust.required .pay-cust-title { color: var(--crit); }
.pay-cust-row { display: flex; align-items: center; gap: 10px; }
.pay-cust-row > .bi { font-size: 1.3rem; color: var(--ok); }
.pay-cust-row > .bi-person { color: var(--ink-3); }
.pay-cust-row .who { flex: 1; min-width: 0; }
.pay-cust-row .nm { font-weight: 700; font-size: .92rem; }
.pay-cust-row .sub { font-size: .76rem; color: var(--ink-2); }
.pay-cust-row .ui-btn { padding: 6px 12px; }

/* ---- Khung thành viên (pos.loyalty_panel_mode — _LoyaltyCard + dòng tóm tắt ở dải khách) ---- */
.loy-tier { display: inline-flex; align-items: center; padding: 2px 10px; border-radius: 999px; font-size: .74rem; font-weight: 800;
    color: #92400E; background: linear-gradient(135deg, #FDE68A, #FCD34D); white-space: nowrap; }
.loy-tier.sm { padding: 1px 8px; font-size: .68rem; }
.cust-loy { display: flex; align-items: center; gap: 6px; margin-top: 3px; min-width: 0; }
.cust-loy .loy-line { font-size: .72rem; color: var(--ink-2); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; min-width: 0; }
.loy-gift-dot { flex: none; font-size: .72rem; font-weight: 800; color: var(--primary); }
.loy-line.k-warn, .loy-hl.k-warn { color: #B45309; }
.loy-line.k-ok, .loy-hl.k-ok { color: #047857; }
.loy-line.k-gift { color: var(--primary); font-weight: 700; }

.loy-card { margin-top: 10px; padding: 10px 12px; border-radius: var(--r-md); background: #FFFBEB; border: 1px solid #FDE68A; }
.ui-modal-bd > .loy-card:first-child { margin-top: 0; }
.loy-head { display: flex; align-items: center; gap: 8px; }
.loy-mult { font-size: .72rem; font-weight: 700; color: #047857; }
.loy-pts { margin-left: auto; font-size: .82rem; color: var(--ink-2); }
.loy-pts b { font-size: 1.15rem; color: var(--ink); font-variant-numeric: tabular-nums; }
.loy-progress { margin-top: 8px; }
.loy-bar { height: 6px; border-radius: 999px; background: #FEF3C7; overflow: hidden; }
.loy-bar > i { display: block; height: 100%; border-radius: 999px; background: linear-gradient(90deg, #F59E0B, #D94F1E); }
.loy-sub { font-size: .74rem; color: var(--ink-2); margin-top: 3px; }
.loy-hl { display: flex; gap: 6px; align-items: baseline; font-size: .8rem; color: var(--ink-2); margin-top: 6px; }
.loy-gifts { margin-top: 10px; padding-top: 8px; border-top: 1px dashed #FCD34D; }
.loy-gifts-ttl { font-size: .78rem; font-weight: 800; color: var(--primary); margin-bottom: 4px; }
.loy-gift { display: flex; align-items: center; gap: 8px; padding: 6px 0; }
.loy-gift + .loy-gift { border-top: 1px solid #FEF3C7; }
.loy-gift .who { flex: 1; min-width: 0; }
.loy-gift .nm { font-weight: 700; font-size: .86rem; }
.loy-gift .loy-apply { padding: 4px 12px; font-size: .8rem; border-width: 1.5px; }
.loy-tag { font-size: .72rem; font-weight: 700; color: var(--ink-3); white-space: nowrap; }
.loy-tag.ok { color: #047857; }
.cart-lines { flex: 1; min-height: 0; overflow-y: auto; overscroll-behavior: contain; padding: 8px 12px; }
.cart-empty { text-align: center; color: var(--ink-3); padding: 40px 10px; font-size: .9rem; }
.cart-line { padding: 10px 8px; border-bottom: 1px dashed var(--line); }
.cart-line .top { display: flex; justify-content: space-between; gap: 8px; }
/* Dòng mở lại được màn tùy chọn. Vùng bấm nới rộng bằng padding âm bù lại: ngón tay trên màn
   cảm ứng không nhắm trúng một dòng chữ cao 16px. */
.cart-line .top.editable { cursor: pointer; margin: -4px -6px 0; padding: 4px 6px 0; border-radius: 8px; }
.cart-line .top.editable:active { background: var(--info-bg, #EFF6FF); }
.cart-line .nm { font-weight: 600; font-size: .88rem; }
.cart-line .nm .edit-hint { margin-left: 6px; font-size: .78rem; color: var(--ink-3); }
/* Nhãn "Chỉnh" trên đầu modal — thu ngân phải phân biệt được đang sửa dòng cũ hay thêm dòng mới,
   vì nút cuối modal làm hai việc khác hẳn nhau. */
.opt-edit-tag { display: inline-block; margin-right: 8px; padding: 2px 8px; border-radius: 999px;
    font-size: .72rem; font-weight: 800; color: #1D4ED8; background: var(--info-bg, #EFF6FF);
    vertical-align: middle; }
.cart-line .mods { font-size: .74rem; color: var(--ink-2); margin-top: 2px; }
.cart-line .qtyrow { display: flex; align-items: center; gap: 8px; margin-top: 6px; }
.qbtn { width: 26px; height: 26px; border-radius: 8px; border: 1px solid var(--line); background: #fff;
    cursor: pointer; font-weight: 700; color: var(--ink); }
/* Dòng "đổi điểm" không giới hạn số lượng — cho khối tổng tiền tự cuộn thay vì đẩy nút thanh toán đi. */
.cart-totals { flex: none; max-height: 38%; overflow-y: auto; padding: 12px 16px; border-top: 1px solid var(--line); font-size: .88rem; }
.cart-totals .row { display: flex; justify-content: space-between; padding: 3px 0; color: var(--ink-2); }
.cart-totals .row.grand { font-size: 1.25rem; font-weight: 800; color: var(--ink); padding-top: 8px; }
.cart-totals .row.disc { color: var(--ok); }
.cart-actions { flex: none; padding: 10px 14px 12px; display: flex; flex-direction: column; gap: 8px; border-top: 1px solid var(--line); }

/* Một dòng, chia đều — flex chứ không grid cột cố định: nút "Giảm giá" ẩn theo quyền, grid sẽ
   để lại một ô trống còn flex thì bốn nút còn lại tự giãn ra lấp chỗ. */
.cart-tools { display: flex; gap: 6px; }
.cart-tool { flex: 1 1 0; min-width: 0; display: flex; flex-direction: column; align-items: center;
    justify-content: center; gap: 3px; padding: 8px 2px; min-height: 54px; cursor: pointer;
    border: none; border-radius: var(--r-md); background: #F1F5F9; color: var(--ink-2);
    font-family: inherit; font-weight: 600; transition: var(--tr); }
.cart-tool i { font-size: 1.15rem; line-height: 1; }
/* Nhãn vẫn giữ chữ: icon trần bắt thu ngân mới phải đoán, mà đoán sai ở đây là mất tiền
   (bấm "Giữ đơn" khi định mở "Đơn giữ" là xoá sạch giỏ đang gọi dở). */
.cart-tool span { font-size: .66rem; line-height: 1.1; white-space: nowrap; max-width: 100%;
    overflow: hidden; text-overflow: ellipsis; }
.cart-tool:hover { background: #E2E8F0; color: var(--ink); }
.cart-tool:active { transform: scale(.96); }

/* ---- Guided selling footer ---- */
.guided { grid-column: 2 / 3; }
/* left phải bám theo bề rộng rail (168px) — lệch là chip đè lên cột danh mục. */
.guided-bar { position: absolute; left: 176px; right: 392px; bottom: 12px; display: flex; gap: 10px; z-index: 40; }
/* Cả chip là vùng bấm đồng ý — xem chú thích ở Index.cshtml. */
.guided-chip { background: #fff; border: 2px solid var(--accent); border-radius: 30px; padding: 8px 12px;
    display: flex; align-items: center; gap: 10px; box-shadow: var(--sh-md); font-size: .82rem; font-weight: 600;
    cursor: pointer; user-select: none; transition: var(--tr); }
.guided-chip:hover { box-shadow: var(--sh-lg); }
.guided-chip:active { transform: scale(.98); }
.guided-chip .yn { display: flex; gap: 4px; }
.guided-chip .yn button { border: none; width: 28px; height: 28px; border-radius: 50%; cursor: pointer; font-weight: 700; }
.guided-chip .yn .y { background: var(--ok); color: #fff; }
.guided-chip .yn .n { background: #EEF2F6; color: var(--ink-2); }
/* Mời lại sau khi món bị bỏ ra: cố tình nhạt hơn lời mời đầu — nó chỉ để cứu cú bấm nhầm, không
   được tranh chỗ với gợi ý mới. */
.guided-chip.reoffer { border-color: #E2E8F0; color: var(--ink-2); font-weight: 500; box-shadow: var(--sh-sm); }
.guided-chip.reoffer .yn .y { background: #E2E8F0; color: var(--ink-2); }

/* Khay chọn nhanh của kịch bản gợi ý */
/* Nhóm nước có thể tới vài chục món — lưới tự giãn cột và để .ui-modal-bd cuộn, không cắt bớt. */
.up-pick { display: grid; grid-template-columns: repeat(auto-fill, minmax(168px, 1fr)); gap: 10px; }
.up-pick.lines { grid-template-columns: 1fr; }
.up-hint { grid-column: 1 / -1; margin: 0 0 2px; font-size: .82rem; color: var(--ink-2); }
.up-tile { display: flex; align-items: center; justify-content: space-between; gap: 10px;
    background: #fff; border: 2px solid #EEF2F6; border-radius: var(--r-md); padding: 14px 16px;
    font-family: inherit; font-size: .92rem; font-weight: 600; color: var(--ink); cursor: pointer;
    text-align: left; transition: var(--tr); }
.up-tile:hover { border-color: var(--accent); }
.up-tile:active { transform: scale(.97); }
.up-tile .pr { font-weight: 700; color: var(--ink-2); white-space: nowrap; }

/* ---- Buttons ---- */
.ui-btn { font-family: inherit; font-weight: 600; border: none; border-radius: var(--r-md); cursor: pointer;
    transition: var(--tr); display: inline-flex; align-items: center; justify-content: center; gap: 8px;
    padding: 11px 18px; font-size: .92rem; }
.ui-btn:active { transform: scale(.97); }
.ui-btn:disabled { opacity: .45; cursor: not-allowed; }
.ui-btn-primary { background: var(--primary-grad); color: #fff; box-shadow: 0 4px 12px rgba(217,79,30,.25); }
.ui-btn-outline { background: #fff; color: var(--primary); border: 2px solid var(--primary); }
.ui-btn-ghost { background: #F1F5F9; color: var(--ink-2); }
.ui-btn-ok { background: var(--ok); color: #fff; }
.ui-btn-crit { background: var(--crit); color: #fff; }
.ui-btn-lg { padding: 15px 26px; font-size: 1.05rem; }
.ui-btn-block { width: 100%; }

/* ---- Idle overlay + T0 ---- */
.idle { position: fixed; inset: 0; background: var(--primary-grad); color: #fff; z-index: 600;
    display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 26px; text-align: center; }
.idle h1 { font-family: 'Outfit', sans-serif; font-size: 2.6rem; font-weight: 800; margin: 0; }
.idle p { font-size: 1.05rem; opacity: .92; margin: 0; }
.idle .actions { display: flex; gap: 14px; }
/* Vừa dùng cho <button> (màn Bắt đầu) vừa cho <a> (trang lỗi quầy) — nên phải tự khai khối và bỏ gạch chân. */
.idle .start { display: inline-block; text-decoration: none;
    background: #fff; color: var(--primary); font-size: 1.3rem; font-weight: 800;
    padding: 18px 48px; border-radius: 40px; border: none; cursor: pointer; box-shadow: var(--sh-lg); }
.idle .nosale { background: rgba(255,255,255,.16); color: #fff; border: 2px solid rgba(255,255,255,.4);
    padding: 16px 30px; border-radius: 40px; cursor: pointer; font-weight: 600; }

/* ---- Modals (port pos-ui.css) ---- */
.ui-overlay { position: fixed; inset: 0; background: rgba(13,10,7,.55); backdrop-filter: blur(3px);
    display: flex; align-items: center; justify-content: center; z-index: 700; padding: 20px; }
.ui-modal { background: #fff; border-radius: 22px; width: 100%; max-width: 440px; box-shadow: var(--sh-lg);
    overflow: hidden; animation: ui-pop .2s ease; }
.ui-modal.wide { max-width: 620px; }
/* Khổ cho modal có danh sách dài (chọn gói combo, tùy chọn của combo). Chỉ 900px chứ không
   rộng hơn: máy POS thường là 1024px ngang, trừ 2x20px đệm của lớp phủ là vừa khít. */
.ui-modal.xwide { max-width: 900px; }
@keyframes ui-pop { from { transform: scale(.94); opacity: 0; } }
.ui-modal-hd { padding: 16px 22px; display: flex; justify-content: space-between; align-items: center; border-bottom: 1px solid rgba(0,0,0,.06); }
.ui-modal-hd h3 { font-size: 1.12rem; font-weight: 700; margin: 0; }
.ui-x { border: none; background: #F1F5F9; width: 34px; height: 34px; border-radius: 50%; cursor: pointer; color: var(--ink-2); }
.ui-modal-bd { padding: 18px 22px; max-height: 66vh; overflow-y: auto; }
.ui-modal-ft { padding: 14px 22px 18px; display: flex; gap: 10px; }
.field { margin-bottom: 12px; }
.field label { display: block; font-size: .8rem; font-weight: 600; color: var(--ink-2); margin-bottom: 5px; }
.field input, .field select { width: 100%; border: 1px solid var(--line); border-radius: var(--r-md); padding: 10px 12px; font-size: .95rem; font-family: inherit; }
/* Nhóm lựa chọn xếp cạnh nhau. auto-fit chứ không auto-fill: món chỉ có một nhóm thì nhóm đó
   giãn hết bề ngang thay vì nép sang trái bỏ trống nửa khung. */
.opt-groups { display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 8px 16px; align-items: start; }
.opt-group { margin-bottom: 6px; }
.opt-group > label { display: block; font-weight: 700; margin-bottom: 6px; }
.opt-group.span-all { grid-column: 1 / -1; }
/* Món con của combo: danh sách đọc-để-xác-nhận, không bấm được, nên xếp dày hơn nhóm lựa chọn. */
.combo-line-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); gap: 0 12px; }

.opt-row { display: flex; align-items: center; justify-content: space-between; padding: 10px 12px;
    border: 1px solid var(--line); border-radius: var(--r-md); margin-bottom: 8px; cursor: pointer; }
.opt-row.sel { border-color: var(--primary); background: #FFF1EC; }
/* Món con đã bị lựa chọn ở slot thay đi — nói ra để thu ngân biết combo không còn ở dạng mặc định. */
.opt-row .swap-note { font-size: .74rem; font-weight: 700; color: #1D4ED8; background: var(--info-bg);
    border-radius: 20px; padding: 2px 9px; white-space: nowrap; }
/* Món khách đã bỏ: gạch ngang, KHÔNG ẩn đi. Thu ngân còn phải đọc lại cho khách rằng phần đó bị
   bỏ mà giá không giảm — đó là câu hay bị thắc mắc nhất ở quầy. */
.opt-row.omitted { opacity: .6; }
.opt-row.omitted > span:first-child { text-decoration: line-through; }
.opt-row .omit-note { font-size: .74rem; font-weight: 700; color: var(--crit); background: var(--crit-bg, #FEE2E2);
    border-radius: 20px; padding: 2px 9px; white-space: nowrap; }

/* ---- Nhóm CHIA PHẦN (3 miếng gà, 3 loại sốt) ---- */
/* Nhãn thành một hàng: tên nhóm bên trái, số miếng và bộ đếm bên phải. Bộ đếm phải nằm trong
   tầm mắt của ngón tay đang bấm, không phải cuối danh sách lựa chọn. */
.opt-group.portion-group > label { display: flex; align-items: center; gap: 8px; }
.opt-group.portion-group > label > span:first-child { flex: 1 1 auto; }
.portion-hint { font-size: .74rem; font-weight: 700; color: var(--muted, #6B7280); background: var(--chip-bg, #F3F4F6);
    border-radius: 20px; padding: 2px 9px; white-space: nowrap; }
.portion-count { font-size: .78rem; font-weight: 800; color: var(--primary); background: #FFF1EC;
    border: 1px solid var(--primary); border-radius: 20px; padding: 1px 10px; white-space: nowrap; }
/* Đã dùng hết lượt: đổi màu chứ không ẩn bộ đếm — "3/3" là tín hiệu dừng, không phải lỗi. */
.portion-count.full { color: #fff; background: var(--primary); }
/* Đuôi phải của một dòng lựa chọn: phụ thu và bộ đếm phần đứng cạnh nhau. */
.opt-tail { display: flex; align-items: center; gap: 10px; }
/* Bộ đếm phần của nhóm chia phần. Số nằm sát nút trừ để ngón tay không phải đi xa, và cả cụm
   nằm bên phải dòng — mắt thu ngân quét theo cột phải khi đọc lại cho khách. */
.portion-step { display: inline-flex; align-items: center; gap: 6px; background: #FFF1EC;
    border: 1px solid var(--primary); border-radius: 20px; padding: 2px 4px 2px 2px; }
.portion-step b { font-size: .92rem; font-weight: 800; color: var(--primary); min-width: 12px; text-align: center; }
.portion-step .pstep-unit { font-size: .7rem; font-weight: 700; color: var(--primary); padding-right: 4px; }
/* Nút trừ 26px: nhỏ hơn ngưỡng chạm nhưng nằm trong một dòng đã bấm được, và bấm trượt ra ngoài
   nút chỉ là cộng thêm một phần — sai một cú bấm chứ không mất lựa chọn. */
.pstep-btn { width: 26px; height: 26px; border: none; border-radius: 50%; background: #fff;
    color: var(--primary); font-size: 1.05rem; font-weight: 800; line-height: 1; cursor: pointer; }
/* Loại còn lại khi hết lượt: mờ nhưng VẪN bấm được — bấm vào thì không có gì xảy ra, thu ngân
   hiểu ngay là phải bỏ bớt một loại đang chọn. Khóa cứng pointer-events thì cú bấm rơi vào hư
   không và người ta tưởng màn hình treo. */
.opt-row.dim { opacity: .45; }

/* ---- Bảng chọn gói combo (bấm "Combo" trên thẻ món) ---- */
/* Lưới gói combo. minmax(300px) để dòng thành phần ("6× Gà sốt cay + 2× Gà lắc phô mai + …")
   còn đọc được; màn hẹp thì tự rơi về một cột chứ không bóp chữ. */
.combo-pick-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: 10px; align-items: stretch; }
.combo-pick { display: flex; align-items: center; gap: 12px; padding: 12px 14px; cursor: pointer;
    border: 1px solid var(--line); border-radius: var(--r-md); transition: var(--tr); }
.combo-pick:hover { border-color: var(--primary); background: #FFF1EC; }
.combo-pick .cp-main { flex: 1; min-width: 0; }
.combo-pick .cp-name { font-weight: 700; }
/* Kẹp ở 2 dòng: gói 6/8 miếng có 4 thành phần, để tự do thì thẻ đó cao gấp rưỡi các thẻ khác
   và cả hàng lưới bị kéo theo. */
.combo-pick .cp-parts { font-size: .78rem; color: var(--ink-2); margin-top: 2px;
    display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; }
.combo-pick .cp-money { text-align: right; white-space: nowrap; }
.combo-pick .cp-price { color: var(--primary); font-weight: 800; }
.combo-pick .cp-save { font-size: .74rem; font-weight: 700; color: var(--ok, #15803D); }

/* ---- Hai kiểu sắp xếp bảng chọn combo ----
   Markup chỉ có MỘT nhánh (cột -> khối -> gói, xem comboPickColumns trong pos.js); chỗ rẽ nằm ở
   đây. Kiểu "Giá" cho lớp cột và lớp khối `display: contents`, tức là chúng biến mất khỏi bố cục
   và các thẻ gói rơi thẳng vào lưới auto-fit bên trên — đúng cách bảng này vẫn xếp trước khi có
   nút đổi, không phải một bố cục mới trông na ná. */
.combo-pick-grid.by-price .cp-col,
.combo-pick-grid.by-price .cp-fam { display: contents; }

/* Kiểu "Nhóm": các cột đứng cạnh nhau, mỗi cột là một chồng khối. Cột TRÁI đầy trước (việc chia
   do JS làm, xem comboFamilyColumns) — đó là điểm khác biệt duy nhất đáng kể so với lưới thường,
   nơi hai thẻ cạnh nhau theo chiều ngang lại thuộc hai họ khác nhau. */
.combo-pick-grid.by-family { display: flex; gap: 14px; align-items: flex-start; }
.combo-pick-grid.by-family .cp-col { flex: 1 1 0; min-width: 0; display: flex; flex-direction: column; gap: 14px; }
.combo-pick-grid.by-family .cp-fam { display: flex; flex-direction: column; gap: 8px; }

/* Tiêu đề khối là thứ thu ngân ĐỌC CHO KHÁCH ("chỉ gà, hay có khoai với nước?"), nên nó phải đọc
   được từ khoảng cách đứng quầy — không phải một cái nhãn mờ. Số gói đi kèm để người ta biết ngay
   khối này có mấy bậc mà không phải đếm. */
.cp-fam-hd { display: flex; align-items: baseline; justify-content: space-between; gap: 8px;
    font-weight: 800; font-size: .92rem; color: var(--ink); padding-bottom: 5px;
    border-bottom: 2px solid var(--line); }
.cp-fam-hd .cp-fam-n { font-size: .74rem; font-weight: 700; color: var(--ink-2); white-space: nowrap; }

/* Dải cảnh báo "script trên máy cũ hơn trang". Vàng chứ không đỏ: bảng vẫn bán được ở kiểu phẳng,
   đây là việc cần làm lúc rảnh tay chứ không phải sự cố đang chặn đơn. */
.cp-stale { margin-bottom: 10px; padding: 8px 12px; border-radius: var(--r-md);
    background: #FEF3C7; border: 1px solid #FCD34D; color: #92400E;
    font-size: .82rem; font-weight: 600; }

/* Nút đổi kiểu, nằm trong đầu bảng cạnh tiêu đề. Cỡ chạm đủ lớn cho ngón tay trên màn cảm ứng
   đứng, nhưng không to đến mức trông như hành động chính — hành động chính vẫn là chọn gói. */
.cp-sort { display: flex; gap: 0; margin: 0 12px 0 auto; border: 1px solid var(--line);
    border-radius: var(--r-md); overflow: hidden; flex: none; }
.cp-sort button { min-width: 62px; padding: 8px 12px; border: 0; background: #fff; cursor: pointer;
    font-family: inherit; font-size: .82rem; font-weight: 700; color: var(--ink-2); transition: var(--tr); }
.cp-sort button + button { border-left: 1px solid var(--line); }
.cp-sort button.on { background: var(--primary); color: #fff; }
/* Cách trả: một trong hai, nút to cho màn cảm ứng. Cùng dáng với hàng nút loại đơn trong giỏ. */
.pay-method { display: grid; grid-template-columns: 1fr 1fr; gap: 8px; margin-bottom: 12px; }
.pm-btn { display: flex; align-items: center; justify-content: center; gap: 8px; min-height: 48px; cursor: pointer;
    border: 1.5px solid var(--line); border-radius: var(--r-md); background: #fff; color: var(--ink-2);
    font-family: inherit; font-weight: 700; font-size: .95rem; transition: var(--tr); }
.pm-btn i { font-size: 1.15rem; }
.pm-btn:active { transform: scale(.97); }
.pm-btn.on { border-color: var(--primary); background: #FFF1EC; color: var(--primary); box-shadow: inset 0 0 0 1px var(--primary); }
.pm-btn.bank.on { border-color: var(--info); background: var(--info-bg); color: var(--info); box-shadow: inset 0 0 0 1px var(--info); }
.pay-bank { text-align: center; padding: 18px 12px; border: 1.5px dashed var(--info); border-radius: var(--r-md); background: var(--info-bg); }
.pay-bank .lbl { font-size: .85rem; font-weight: 600; color: var(--ink-2); }
.pay-bank .amt { font-size: 2rem; font-weight: 800; color: var(--info); margin: 4px 0; }
.pay-bank .hint { font-size: .8rem; color: var(--ink-3); }
.pay-bank .pay-bank-qr { margin-top: 10px; color: var(--info); font-weight: 700; }
/* Mã VietQR: màn quay ra cho khách nên mã + số tiền chiếm gần hết chỗ; màn POS thấp (~768px)
   nên ảnh co theo chiều cao chứ không theo chiều ngang. */
.bank-qr-modal { max-width: 520px; }
.bank-qr-modal .ui-modal-bd { max-height: none; text-align: center; padding-top: 12px; }
.bank-qr-modal .bq-amt { font-size: 2.2rem; font-weight: 800; color: var(--info); line-height: 1.1; }
.bank-qr-modal .bq-img { display: flex; align-items: center; justify-content: center; min-height: 200px; margin: 8px 0; }
.bank-qr-modal .bq-img img { width: min(340px, 44vh); height: auto; aspect-ratio: 1; object-fit: contain; }
.bank-qr-modal .bq-wait, .bank-qr-modal .bq-fail { color: var(--ink-3); font-weight: 600; max-width: 280px; }
.bank-qr-modal .bq-fail { color: var(--crit); }
.bank-qr-modal .bq-fail i { display: block; font-size: 2rem; margin-bottom: 6px; }
.bank-qr-modal .bq-acct { display: grid; grid-template-columns: auto 1fr; gap: 3px 12px; margin: 0 auto 8px; max-width: 380px; text-align: left; font-size: .92rem; }
.bank-qr-modal .bq-acct dt { color: var(--ink-3); font-weight: 600; }
.bank-qr-modal .bq-acct dd { margin: 0; font-weight: 700; color: var(--ink); word-break: break-word; }
.bank-qr-modal .bq-acct .mono { font-variant-numeric: tabular-nums; letter-spacing: .03em; }
.bank-qr-modal .hint { font-size: .8rem; color: var(--ink-3); }
.bank-qr-modal .ui-modal-ft .ui-btn-ghost { white-space: nowrap; }
.tender-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 8px; margin-top: 8px; }
.tender-grid button { padding: 12px; border: 1px solid var(--line); border-radius: var(--r-md); background: #fff; cursor: pointer; font-weight: 700; }
.tender-grid button.sel { border-color: var(--primary); background: #FFF1EC; color: var(--primary); box-shadow: inset 0 0 0 1px var(--primary); }
.tender-lbl { display: block; font-size: .8rem; font-weight: 600; color: var(--ink-2); margin: 14px 0 5px; }
.denom-grid { display: grid; grid-template-columns: repeat(5, 1fr); gap: 6px; }
.denom-grid button { padding: 10px 4px; border: 1px solid var(--line); border-radius: var(--r-md); background: #F8FAFC;
    cursor: pointer; font-weight: 700; font-size: .85rem; font-family: inherit; }
.denom-grid button:active { transform: scale(.96); }
.denom-grid button.clear { background: #FEF2F2; color: var(--crit); border-color: #FECACA; }

/* ---- Gợi ý combo ----
   Ba màu = ba tình huống khác nhau về TIỀN, thu ngân phải phân biệt được trong một cái liếc:
   xanh lá = đổi được ngay và rẻ hơn; vàng = phải mời khách thêm món; xanh dương = combo có
   món khách chưa gọi (dư) nhưng vẫn rẻ hơn. */
.combo-plan { border: 1px solid var(--line); border-left: 5px solid var(--ink-3); border-radius: var(--r-md);
    padding: 12px 14px; margin-bottom: 12px; background: #fff; }
.combo-plan.full { border-left-color: var(--ok); }
.combo-plan.partial { border-left-color: var(--warn); }
.combo-plan.surplus { border-left-color: var(--info); }
.combo-plan .hd { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; margin-bottom: 8px; }
.combo-plan .hd .nm { font-weight: 800; font-size: 1rem; flex: 1; min-width: 0; }
.combo-plan .hd .save { font-size: 1rem; color: var(--ok); white-space: nowrap; }
.combo-plan .tag { font-size: .68rem; font-weight: 800; letter-spacing: .3px; padding: 3px 9px; border-radius: 20px;
    text-transform: uppercase; }
.combo-plan.full .tag { background: var(--ok-bg); color: #047857; }
.combo-plan.partial .tag { background: var(--warn-bg); color: #92400E; }
.combo-plan.surplus .tag { background: var(--info-bg); color: #1D4ED8; }
.combo-plan .grp { font-size: .78rem; color: var(--ink-2); margin-bottom: 6px; }
.combo-plan .grp b { display: block; font-size: .72rem; text-transform: uppercase; letter-spacing: .3px;
    color: var(--ink-3); margin-bottom: 4px; }
.combo-plan .pill { display: inline-block; background: #F1F5F9; border-radius: 20px; padding: 4px 11px;
    margin: 0 5px 5px 0; font-weight: 600; font-size: .8rem; }
.combo-plan .pill.add { background: var(--warn-bg); color: #92400E; }
/* Đỏ = dòng còn lại trùng món với combo → khách bị tính tiền hai lần nếu cứ thế chốt. */
.combo-plan .pill.dup { background: var(--crit-bg); color: #B91C1C; border: 1px solid var(--crit); }
.combo-plan .combo-warn { font-size: .82rem; font-weight: 600; color: #B91C1C; background: var(--crit-bg);
    border-radius: var(--r-sm); padding: 8px 11px; margin: 8px 0 4px; line-height: 1.45; }
.combo-plan .why { font-size: .84rem; color: var(--ink); margin: 8px 0 10px; line-height: 1.45; }
.combo-note { font-size: .78rem; color: var(--ink-3); border-top: 1px dashed var(--line); padding-top: 10px; margin-top: 4px; }

/* PIN pad */
.pin-display { text-align: center; font-size: 2rem; letter-spacing: 10px; font-weight: 800; margin: 6px 0 14px; min-height: 40px; }
.pin-pad { display: grid; grid-template-columns: repeat(3, 1fr); gap: 8px; }
.pin-pad button { padding: 16px; font-size: 1.3rem; font-weight: 700; border: 1px solid var(--line); border-radius: var(--r-md); background: #fff; cursor: pointer; }

/* Toast */
.toast-wrap { position: fixed; bottom: 20px; left: 50%; transform: translateX(-50%); z-index: 900; display: flex; flex-direction: column; gap: 8px; align-items: center; }
.toast { background: var(--surface-darker); color: #fff; padding: 12px 20px; border-radius: 14px; font-weight: 600; box-shadow: var(--sh-lg); display: flex; align-items: center; gap: 10px; animation: ui-pop .2s ease; }
.toast.ok i { color: #6EE7B7; } .toast.err i { color: #FCA5A5; }

/* Guard banner */
.guard-banner { background: var(--warn-bg); color: #92400E; padding: 8px 14px; font-size: .82rem; font-weight: 600; text-align: center; }

/* Máy in gặp sự cố (§5.16.E) — cam, không đỏ: đơn vẫn an toàn, chỉ hóa đơn chưa ra.
   Chồng băng có hàng RIÊNG trong lưới .pos-shell (vùng 'banner'), không fixed: bản fixed trước
   đây nổi trên đầu giỏ và nuốt mọi cú chạm vào hàng nút loại đơn ngay bên dưới — máy in báo lỗi
   là thu ngân không đổi được Mang về / Tại chỗ nữa. */
.banner-stack { grid-area: banner; display: flex; flex-direction: column; min-width: 0; }
.print-banner { background: var(--warn-bg); color: #92400E; padding: 8px 14px; font-size: .85rem; font-weight: 700;
    display: flex; align-items: center; justify-content: center; gap: 14px; border-bottom: 1px solid rgba(146, 64, 14, .15); }
.print-banner button:disabled { opacity: .5; cursor: not-allowed; }

/* Chip "đang chờ gửi" trên topbar (§5.10): đơn đã thu tiền, chưa lên được server. */
.queue-chip { display: inline-flex; align-items: center; gap: 6px; padding: 3px 12px; border-radius: 20px;
    background: rgba(245, 158, 11, .18); color: #B45309; font-weight: 800; }

/* Lịch sử đơn (modal) — bảng để tra lại một đơn đã bán rồi in lại.
   Hàng cao và nút to: thao tác này xảy ra khi có khách đang đứng đợi, trên màn cảm ứng. */
.hist-bar { display: flex; gap: 10px; align-items: center; flex-wrap: wrap; margin-bottom: 12px; }
.hist-tabs { display: flex; gap: 8px; align-items: center; }
.hist-bar .ui-btn { padding: 7px 14px; }
.hist-date, .hist-search { padding: 8px 12px; border: 1px solid var(--line); border-radius: var(--r-md); font-size: .9rem; }
.hist-search { flex: 1; min-width: 160px; }

.hist-table { width: 100%; border-collapse: collapse; font-size: .9rem; }
.hist-table th { text-align: left; font-size: .75rem; text-transform: uppercase; letter-spacing: .04em;
    color: var(--ink-3); padding: 6px 8px; border-bottom: 1px solid var(--line); }
.hist-table td { padding: 10px 8px; border-bottom: 1px solid var(--line); vertical-align: top; }
.hist-table .num { text-align: right; white-space: nowrap; }
.hist-sub { font-size: .75rem; color: var(--ink-3); margin-top: 2px; }

/* Tên món cắt bớt chứ không xuống dòng vô hạn: cột này chỉ để NHẬN RA đơn, chi tiết nằm ở tờ in. */
.hist-items { color: var(--ink-2, var(--ink-3)); max-width: 280px; overflow: hidden;
    display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; }

.hist-tag { display: inline-block; margin-left: 6px; padding: 1px 8px; border-radius: 10px;
    background: rgba(0,0,0,.06); font-weight: 700; font-size: .7rem; }
/* Đơn đã hủy vẫn hiện để tra được, nhưng phải nhìn ra ngay là không in lại được. */
.hist-void { opacity: .55; }
.hist-table button:disabled { opacity: .45; cursor: not-allowed; }
.hist-actions { display: flex; gap: 6px; justify-content: flex-end; flex-wrap: wrap; }
.hist-void-btn { color: var(--crit); }

/* Hủy đơn: hai lựa chọn to, cùng cỡ — thứ quyết định kho phải là một lần chạm có chủ ý. */
.void-sum { margin: 0 0 12px; color: var(--ink-2); font-size: .9rem; }
.void-types { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; margin-bottom: 14px; }
.void-type { font-family: inherit; text-align: left; padding: 12px 14px; border-radius: var(--r-md);
    border: 2px solid var(--line); background: #fff; cursor: pointer; transition: var(--tr);
    display: flex; flex-direction: column; gap: 4px; }
.void-type b { font-size: .98rem; color: var(--ink); }
.void-type span { font-size: .78rem; color: var(--ink-3); }
.void-type.on { border-color: var(--crit); background: var(--crit-bg); }
.void-type:disabled { opacity: .45; cursor: not-allowed; }
.void-hint { font-size: .78rem; color: var(--ink-3); margin: 8px 0 0; }
