# IngredientBin
Ô khay topping, foam và nguyên liệu trên quầy pha: ảnh cắt từ tranh quầy, badge số lượng, và các trạng thái khách đang gọi, đã chọn, hết, bị khoá.
## Khi nào dùng
- Khay topping 4×3 (trân châu, thạch, pudding…) và 6 khay foam/đá/đường ở hàng dưới quầy.
- Khách đang gọi món nào thì khay đó nhấp nháy viền cam (`is-want`).
- Đo theo px sân khấu 768×1376: đặt trong `.tt-stage` rồi `TTMU.fitStage`.
## Biến thể
| Biến thể | Lớp | Dùng khi |
|---|---|---|
| Khay topping | `tt-bin` | 107×98px, badge 28px (`tt-bin__badge`) |
| Khay foam / đá / đường | `tt-bin` + `style="width:116px;height:158px"` | Có nhãn 2 dòng `tt-bin__label`, badge nhỏ `tt-bin__badge--sm` (24px) |
## Cấu trúc
```html
```
Ảnh là tranh `bg.jpg` 768×1376 cắt bằng `background-position` âm toạ độ góc trái-trên của khay (CSS đã đặt `background-size` và `no-repeat`; người dùng chỉ cần `background-image` và `background-position`).
Toạ độ khay topping (từ `TCOL`/`TROW` trong game.js): cột x = 285, 402, 520, 640; hàng y = 620, 728, 836. Khay foam: x = 19 + 124 × thứ tự (0..5), y = 975.
`__veil` luôn có trong DOM, chỉ hiện khi `is-empty` (chữ "Hết") hoặc `is-locked` (icon `ic_lock`).
## Trạng thái
| Trạng thái | Hiệu ứng |
|---|---|
| `:active`, `is-on` | Lớp phủ `on-fill` 28% (`::after`, xếp tầng: ảnh crop < lớp phủ nhấn < veil/nhãn < badge) |
| `is-want` | Viền `shadow-want` (trắng + cam `want`), nhịp 1.4s `tt-pulse`, nổi lên trên |
| `is-picked` | Viền `shadow-pick` (4px `target`) |
| `is-empty` | Lớp phủ `stage-paper` 75% + chữ "Hết" `stage-muted` 22px |
| `is-locked` | Lớp phủ `stage-ground` 85% + `ic_lock`; badge topping mờ, badge nhỏ ẩn |
## Token sử dụng
`shadow-want`, `shadow-pick`, `want`, `target`, `on-fill`, `stage-ink`, `outline`, `stage-paper`, `stage-ground`, `stage-muted`, `stage-track`, `alpha-veil` (độ đục lớp phủ Hết), `bin-label-bg` (nền nhãn FOAM MATCHA ở `hc`), `bin-badge`, `outline-soft`, `radius-10/14`.
## Khả năng tiếp cận
- Mỗi khay là `