# XiDachTable Khung bàn Xì Dách Trân Châu, người chơi làm nhà cái: ví, mốc cược, các ghế khách, khu nhà cái, thanh nút Bốc Thêm / Dừng Bốc / So Toàn Bàn / Ván mới, banner diễn biến và bảng luật. ## Khi nào dùng - Màn minigame Xì Dách mở từ quán trà, thay cho cửa sổ `.xidach-card` của game. - Ghép sẵn `MinigameWallet`, `BetChips`, `MinigameResult`, `CardHand`, `XiDachSeat` và `PlayingCard`; bàn chỉ lo bố cục, bảng luật và việc chuyển nhóm nút. - Không chia bài, không tính điểm, không có tỉ lệ: code của bạn quyết định và truyền trạng thái vào. ## Biến thể | Phần | Lớp | Nội dung | |---|---|---| | Khung | `tt-mgframe tt-xidach` | `tt-mgframe` (khung chung với Bầu Cua: nền `panel`, viền 3.5px `counter`, bo 22px, rộng tối đa 480px) + `tt-xidach` (gốc định vị cho bảng luật) | | Ví | `tt-mgwallet tt-mgwallet--wide` | Tiêu đề, `tt-xidach__head-actions` (Luật chơi + ✕), thanh Két tiền | | Mốc cược | `tt-xidach__chips` > `tt-betchips--compact tt-betchips--framed` | Nhãn "Mốc cược chuẩn nhà con…" + 5 chip | | Khách | `tt-xidach__table` > `tt-xidach__players` | Lưới `XiDachSeat` cột tối thiểu 95px; trống thì `tt-xidach__empty` | | Nhà cái | `tt-xidach__dealer` | `CardHand` nhà cái + thanh nút `tt-xidach__actions` | | Banner | `tt-mgresult tt-mgresult--compact` | Dòng diễn biến ván | | Bảng luật | `tt-xidach__rules` | Hộp thoại phủ kín khung, `hidden` khi đóng | ## Cấu trúc ```html

🧋 Xì Dách Trân Châu

…Két tiền quán…
…
…các tt-xdseat…
…
``` Bảng luật phải là con trực tiếp của `tt-xidach`: khi mở, mọi con khác của khung được đặt `inert`. Đặt khung trong thẻ cuộn của minigame vì header ví dính đầu (`position: sticky`). ## Trạng thái | Trạng thái | Hiệu ứng | |---|---| | Đang chơi | Hiện nhóm `data-actions="play"` (Bốc Thêm, Dừng Bốc, So Toàn Bàn), ẩn nhóm `end` | | Hết ván / chưa chia | `setEnded(true)`: hiện nút "Chia Thẻ Ván Mới", ẩn ba nút kia | | Nút chưa đủ điều kiện | `disabled`; lý do nằm ở banner (`aria-describedby="banner"`), ví dụ "chưa đủ tuổi, hãy Bốc thêm" | | Mốc cược | `betChips.setDisabled(true)` khi ván đang diễn ra | | Bảng luật mở | Phủ kín khung (`z-index: 10`), phần còn lại `inert`, focus vào "Đã hiểu" | ## Hành vi JS `TTMU.xiDachTable(root, { onAction })` gắn một lần (gắn lần hai trả về `null`) và trả về `{ rulesOpen, showRules(flag), setEnded(flag), enable(name, flag), destroy() }`. ```js var table = TTMU.xiDachTable(document.querySelector('.tt-xidach'), { onAction: function (name) { // 'hit' | 'stand' | 'settle-all' | 'new-round' | 'close' if (name === 'new-round') { startRound(); table.setEnded(false); } } }); table.enable('hit', false); // khoá Bốc Thêm ``` - `onAction` chỉ gọi khi người dùng bấm nút `[data-action]`; `setEnded`, `enable`, `showRules` từ code không gọi callback. - `rules` và `rules-close` do bàn tự xử lý: mở bảng luật, chuyển focus, trả focus về nút Luật chơi khi đóng; Esc đóng bảng luật; Tab và Shift+Tab xoay vòng trong bảng (đúng `aria-modal`). Bảng mở sẵn lúc gắn JS cũng được khoá `inert` ngay, và `destroy()` khi bảng còn mở sẽ gỡ `inert`. Esc không đóng cả minigame, việc đó để code của bạn làm. - Hàng chip, ghế, tay bài, lá bài gắn riêng bằng `TTMU.betChips`, `TTMU.xiDachSeat`, `TTMU.cardHand`, `TTMU.playingCard`. ## Token sử dụng `panel`, `bg`, `counter`, `ink`, `soft`, `pink-d`, `line`, `shadow-modal`, `radius-16`, `space-4/6/8/10/12/14/16`, cùng token của các khối con. ## Khả năng tiếp cận - Bảng luật `role="dialog" aria-modal="true" aria-labelledby`, nằm trong khung nên `z-index: 10` (lớp nổi toàn màn hình của Dialog là 100050; bảng này không phủ cả trang). Mở bảng thì phần còn lại `inert`, đóng thì trả focus. - Mọi hành động là `