# CupSize
Nhóm chọn cỡ ly M hoặc L: hình ly vẽ bằng clip-path, kèm phụ phí "Size L +7k".
## Khi nào dùng
- Chọn ly cho đơn ở quầy hoặc trong bảng giá khi khách gọi size.
- Ly nhỏ `tt-cupsize__mini` còn dùng làm biểu tượng size trong ô thành phần của thẻ khách (CustomerCard).
## Biến thể
| Biến thể | Lớp | Dùng khi |
|---|---|---|
| Nhóm chọn | `tt-cupsize` | `role="radiogroup"`, hai lựa chọn chia đều |
| Lựa chọn | `tt-cupsize__option` | Nút `role="radio"` cao tối thiểu 52px |
| Ly M / L | `tt-cupsize__cup` · `tt-cupsize__cup--l` | 15×19 và 17×27, tô theo màu chữ |
| Ly nhỏ | `tt-cupsize__mini` · `tt-cupsize__mini--l` | 12×13 và 13×19, màu `soft`, dùng trong ô thẻ khách |
## Cấu trúc
```html
```
## Trạng thái
| Trạng thái | Hiệu ứng |
|---|---|
| `aria-checked="true"` | Viền `pink`, nền `pink` 18% |
| Focus bàn phím | Vòng `focus-ring` 3px (từ `.tt-app`) |
## Hành vi JS
`TTMU.cupSize(root, { onChange })` → `{ value, set(size), destroy() }` (hoặc `null` nếu đã gắn).
```js
var size = TTMU.cupSize(document.querySelector('.tt-cupsize'), {
onChange: function (s) { /* s = "M" hoặc "L" */ }
});
size.set('L');
```
Mũi tên (trái/phải/lên/xuống) đổi lựa chọn và dời focus, Home/End nhảy đầu/cuối; chỉ lựa chọn đang bật có `tabindex="0"`. Quy ước `onChange`: chỉ người dùng (bấm, phím) mới gọi, và chỉ khi cỡ ly đổi; `set()` từ code thì im lặng.
## Token sử dụng
`line`, `pink`, `shadow-on` (vòng trong của cỡ đang chọn ở `hc`), `soft`, `radius-12`, `space-8/10`.
## Khả năng tiếp cận
- Nhóm `role="radiogroup"` có `aria-label`; mỗi lựa chọn `role="radio"` + `aria-checked`.
- Hình ly `aria-hidden`; phụ phí nằm trong nhãn đọc ("Size L, phụ phí 7k").
- Lựa chọn đang bật có viền và nền, không chỉ dựa vào màu chữ.
## Nên / Không nên
| Nên | Không nên |
|---|---|
| Ghi phụ phí cạnh L (+7k) | Giấu giá thêm tới lúc thanh toán |
| Mỗi nhóm đúng một lựa chọn bật | Để cả hai `aria-checked="false"` |
## Nguồn
`.mcup`, `.mcup.L` (css/style.css dòng 362–363), `.bigsz`, `.bigsz.on`, `.bigsz .mcup` (dòng 245–248), `.chip.ic2 .mcup` (dòng 206); `sizeIc()` trong js/game.js; lấy ly M/L ở quầy (`data-a="size:M|L"`).
- `.bigsz` không còn được game gọi trong JS; DS dựng nhóm chọn từ phần CSS còn lại.
- Phụ phí 7k theo yêu cầu của DS (giá L của game cấu hình theo `S.sell.L`).
- `.chip.ic2 .mcup` (ly trong chip, `currentColor` .75) trùng kiểu với `tt-cupsize__cup`.