# PlayingCard
Thẻ trân châu của Xì Dách Trân Châu: giá trị và biểu tượng loại trân châu ở hai góc, biểu tượng lớn ở giữa, có mặt úp hình ly trà sữa; ba cỡ thường, lớn và mini.
## Khi nào dùng
- Thẻ trên tay khách và nhà cái trong `CardHand`, hoặc thẻ lẻ trong luật chơi.
- Bộ 52 thẻ = 4 loại trân châu × 13 giá trị (2…10, J, Q, K, A). Chỉ vẽ thẻ do code chọn sẵn; không có logic chia hay xáo.
- Loại trân châu phân biệt bằng biểu tượng và tên đọc, màu chỉ là phần thêm.
## Biến thể
| Biến thể | Lớp | Dùng khi |
|---|---|---|
| Trân Châu Đen 🧋 | `tt-playcard` (mặc định) | `tc-den`: nền `card-den-bg`, chữ nâu đậm |
| Hoàng Kim 🟡 | `tt-playcard--vang` | `tc-vang`: chữ nâu cam |
| Trắng 3Q ⚪ | `tt-playcard--trang` | `tc-trang`: chữ xanh dương |
| Dâu Tây 🍓 | `tt-playcard--dau` | `tc-dau`: chữ hồng đỏ |
| Thường | `tt-playcard` | 36×52, bo 6px (`.xd-card`): thẻ của khách trên ghế |
| Lớn | `tt-playcard--large` | 40×56, bo 7px: thẻ nhà cái (`.xd-dealer-cards-wrap .xd-card`) |
| Mini | `tt-playcard--mini` | 28×40: ghế hẹp có 5 thẻ (Ngũ Linh); bổ sung của design system |
| Úp | `is-down` | Mặt ẩn, lưng nâu có 🧋 (`.xd-card.face-down`) |
## Cấu trúc
```html
A🍓
🍓
A
🧋
```
Tên đọc theo game (`title`): " ", ví dụ "Trân Châu Đen 7", "Trân Châu Hoàng Kim 10". Mặt và lưng luôn cùng có trong markup để `flip()` không phải dựng lại DOM. `__pip` là biểu tượng nhỏ ở góc (`.xd-card-mini-suit`).
## Trạng thái
| Trạng thái | Hiệu ứng |
|---|---|
| Ngửa | Nền và viền theo loại (`card--bg/-line`), bóng nhẹ |
| `is-down` | Gradient nâu `cardback-hi` → `cardback-lo`, viền 1.5px `cardback-line`, mặt ẩn, nhãn đọc "Thẻ trân châu úp" |
| Trong `CardHand` | Rê chuột nhấc thẻ lên 4px (do `tt-cardhand__slot`) |
## Hành vi JS
`TTMU.playingCard(el)` gắn một lần (đánh dấu `data-tt-bound="1"`, gắn lần hai trả về `null`) và trả về `{ faceDown, flip(), setFaceDown(flag), destroy() }`. Chỉ hiển thị, không có callback.
```js
var card = TTMU.playingCard(document.querySelector('.tt-playcard'));
card.flip(); // úp ↔ ngửa, trả về true nếu giờ đang úp
card.setFaceDown(true); // aria-label thành "Thẻ trân châu úp"; ngửa thì trả lại data-label
```
Thẻ dựng sẵn lúc úp vẫn cần `data-label` để `flip()` biết đọc tên gì khi ngửa.
## Token sử dụng
`card-den-*`, `card-vang-*`, `card-trang-*`, `card-dau-*` (mỗi loại `-bg`, `-ink`, `-line`), `cardback-hi`, `cardback-lo`, `cardback-line`, `outline` (bóng), `space-4`.
## Khả năng tiếp cận
- Thẻ là `role="img"` có `aria-label` ("Trân Châu Đen 7", "Thẻ trân châu úp"); phần bên trong `aria-hidden` để không đọc lặp.
- Loại trân châu phân biệt bằng biểu tượng 🧋🟡⚪🍓, chữ giá trị và tên đọc, không chỉ bằng màu.
- Ở Tương phản cao chữ thẻ đạt từ 7:1 trên nền thẻ, viền thẻ đạt 3:1 để thẻ tách khỏi nền trắng.
- Thẻ không tự nhận focus; thao tác là việc của khối chứa nó.
## Nên / Không nên
| Nên | Không nên |
|---|---|
| Ghi `aria-label` và `data-label` bằng " " | Để trình đọc đọc từng emoji rời |
| Giữ cả biểu tượng lẫn màu theo loại | Chỉ phân biệt loại bằng màu |
| Dùng `--mini` khi ghế ~95px có 4–5 thẻ | Tự thu nhỏ bằng `transform: scale` |
## Nguồn
`.xd-card`, `.xd-card.tc-den|tc-vang|tc-trang|tc-dau`, `.xd-card-top`, `.xd-card-val`, `.xd-card-mini-suit`, `.xd-card-suit`, `.xd-card-bottom`, `.xd-card.face-down`, `.xd-dealer-cards-wrap .xd-card` — css/xidach.css; `SUITS`, `createDeck()`, `renderCard()` trong js/xidach.js (bốn loại id, icon, name, bg, color; title "Thẻ trân châu úp").
- Màu chữ, viền và `bg` theo loại đổi sang token `card--bg/ink/line` (bốn theme gốc giữ nguyên hex của game; Tương phản cao đậm hơn cho chữ và viền). Gradient lưng `#78350f` → `#451a03` và viền `#d97706` đổi sang `cardback-*`.
- `style="background:…"` nội tuyến của game thành lớp `--vang|--trang|--dau`; `.xd-card:hover` (nhấc 4px) chuyển sang `tt-cardhand__slot`; hai `!important` của thẻ úp bỏ đi.
- Cỡ `--mini` là bổ sung của design system.