# 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…
…
…
📖 LUẬT CHƠI XÌ DÁCH TRÂN CHÂU
⚡Xì Dách: …
```
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à `