# Character Chân dung nhân vật dùng chung cho khách, nhân viên và bạn bè: ảnh tròn hoặc vuông bo góc, tên, vai trò và huy hiệu tâm trạng; mặt khách cắt từ atlas `assets/Sprites/faces.webp`. ## Khi nào dùng - Hiển thị một nhân vật có tên: khách ở làn, người đánh giá, nhân viên, bạn bè. - Cần tâm trạng (bình thường, vui, giận) đổi theo diễn biến, kèm huy hiệu để không chỉ dựa vào hình. - Chỉ cần ảnh tròn nhỏ không tên thì dùng Avatar. ## Biến thể | Biến thể | Lớp | Dùng khi | |---|---|---| | Vừa (mặc định) | `tt-character` | Ảnh 60px (`.tfc.big`) | | Nhỏ | `tt-character tt-character--sm` | Ảnh 40px (`.tfc`), tên .78rem | | Lớn | `tt-character tt-character--lg` | Ảnh 88px, hồ sơ nhân vật | | Vuông | `tt-character--square` | Ảnh bo 14px, hợp nhân viên và bạn bè | | Có thoại | `tt-character--say` | Thêm `tt-character__say` chứa `tt-bubble` dưới tên | | Xếp dọc | `tt-character--stacked` | Ảnh trên, chữ giữa dưới | | Tâm trạng | `tt-character--mood-normal`, `--mood-happy`, `--mood-angry` | Chọn cột atlas và huy hiệu PNG (bình thường: không có huy hiệu) | ## Cấu trúc ```html
Cô Lan Khách Đang vui
``` - Atlas `faces.webp` 675×1980: 3 cột (tâm trạng) × 9 hàng (khách), ô 225×220. Người dùng đặt `background-image` và `--tt-row` (0–8) ở `style`; cột do lớp `--mood-*` quyết định. - Ảnh nhân viên, bạn bè: thay `__face` bằng ``. - Mặt shipper (`ship.webp`, 2 hàng) dùng ở ShipperBadge, không dùng ở đây. ## Trạng thái | Trạng thái | Hiệu ứng | |---|---| | `--mood-normal` | Cột 0, không có huy hiệu (trạng thái mặc định, chữ sr-only vẫn đọc "Bình thường") | | `--mood-happy` | Cột 1, huy hiệu `stk_heart.png` viền `mint` | | `--mood-angry` | Cột 2, huy hiệu `ic_angry.png` viền `warn` | ## Hành vi JS `TTMU.character(el)` gắn một lần cho `.tt-character`, trả về `{ mood, setMood(m), destroy() }` (gắn lần hai trả về `null`). ```js var c = TTMU.character(document.querySelector('.tt-character')); c.setMood('happy'); // đổi lớp --mood-* (ô atlas, huy hiệu) và chữ sr-only [data-tt-state] (tự tạo nếu thiếu) ``` `setMood` với giá trị lạ bị bỏ qua. Không có thao tác người dùng nên không có `onChange`. ## Token sử dụng `bg`, `panel`, `line`, `ink`, `soft`, `mint`, `warn`, `space-2/4/8/10/12`, `radius-round`, `radius-14`. ## Khả năng tiếp cận - Tâm trạng có ba lớp: ô atlas, huy hiệu PNG (giận, vui), và chữ `tt-sr-only[data-tt-state]` mà screen reader đọc được, kể cả ở tâm trạng bình thường. - Ảnh khi tên đã nằm cạnh: `aria-hidden="true"` (atlas) hoặc `alt=""` (img). Huy hiệu là trang trí (`aria-hidden`). - Viền huy hiệu `mint` / `warn` đạt 3:1 ở `hc`; ở bốn theme gốc huy hiệu vẫn phân biệt bằng hình (trái tim, mặt giận). ## Nên / Không nên | Nên | Không nên | |---|---| | Luôn kèm chữ tên và (nếu cần) chữ tâm trạng | Chỉ dựa vào màu viền huy hiệu | | Giữ `--tt-row` trong 0–8 | Tự đặt `background-size` khác tỉ lệ atlas | | Dùng `tt-bubble` bên trong `__say` | Tự vẽ bong bóng mới | ## Nguồn `.who .face`, `.tfc` (40×39), `.tfc.big` (60×59), `.tfc.rf` — css/style.css; `faceBg(who, e, w, h)` (`background-size: w*3 h*9`, ô 225×220) và `faceOf` (cột 2 khi kiên nhẫn dưới 30%) — js/game.js dòng 5246–5248. - Bổ sung có chủ đích: cỡ lớn 88px, biến thể vuông, huy hiệu tâm trạng bằng PNG (`ic_angry`, `stk_heart`), biến thể xếp dọc và có thoại.