# Coachmark Bong bóng hướng dẫn màu xanh dương kèm vòng nhấp nháy quanh phần tử cần thao tác ("Nhấn giữ hũ trà để rót, thả tay ở vạch xanh"). ## Khi nào dùng - Hướng dẫn người chơi mới ở quầy pha: chỉ vào đúng nút/hũ cần chạm tiếp theo. - Mỗi lúc chỉ một coachmark và một đích. - Lời của khách thì dùng Bubble, tin báo kết quả thì dùng Toast. ## Biến thể | Biến thể | Lớp | Dùng khi | |---|---|---| | Bong bóng | `tt-coach` | Nền `coach`, chữ `on-fill` 800 cỡ 19px, bo 14, cạnh nổi `shadow-coach` | | Đích | `tt-coach-target` | Thêm vào phần tử cần chỉ: vòng 4px `coach` + vòng nhấp nháy | ## Cấu trúc ```html
Nhấn giữ hũ trà để rót, thả tay ở vạch xanh
``` Bạn tự định vị `tt-coach` (game đặt `absolute` trên sân khấu). Phần tử đích phải có `position: relative` hoặc `absolute` để vòng nhấp nháy bám đúng. ## Trạng thái | Trạng thái | Hiệu ứng | |---|---| | Hiện / ẩn | Bỏ hoặc thêm thuộc tính `hidden` trên `tt-coach` | | Đích đang được chỉ | Vòng ngoài dịch từ scale .96 đến 1.08 và mờ dần, 1.1s lặp vô hạn (`tt-ring`) | | `prefers-reduced-motion` | Vòng nhấp nháy đứng yên, vòng 4px vẫn còn | Lưu ý: chữ đổi thì cập nhật bằng `textContent`, không dùng `innerHTML`. ## Token sử dụng `coach`, `on-fill`, `shadow-coach`, `radius-14`, `space-6`, `space-12`. ## Khả năng tiếp cận - `pointer-events: none`: bong bóng không chặn thao tác thật dưới nó. - Chữ trắng 19px đậm trên `coach`; bong bóng không phải kênh duy nhất, hành động đích vẫn dùng được khi không có coachmark. - Nên đặt `tt-coach` trong vùng `role="status"` (hoặc `aria-live="polite"`) nếu muốn screen reader đọc câu hướng dẫn mới. - Vòng nhấp nháy chỉ là trang trí, người dùng giảm chuyển động sẽ chỉ thấy vòng tĩnh. ## Nên / Không nên | Nên | Không nên | |---|---| | Một câu ngắn, bắt đầu bằng động từ ("Nhấn giữ…", "Chạm…") | Viết đoạn dài trong bong bóng 420px | | Bỏ `tt-coach-target` khi người chơi đã làm xong | Để vòng nhấp nháy mãi trên nhiều phần tử | | Đặt coachmark gần đích, không che đích | Che đúng nút cần bấm | Lưu ý: `tt-bin.is-want` (0,2,0) thắng `tt-coach-target` (0,1,0) ở `box-shadow` và `animation`, nên khay đang `is-want` giữ vòng cam của nó, không hiện vòng `coach`; đừng bật cả hai trên cùng một khay. ## Nguồn `#q3coach` — css/style.css dòng 634 (min-height 40, padding 6px 12px, 19px/800/1.15, bo 14, bóng `0 4px 0`); `.q3z.q3coachT` dòng 630 (vòng 4px `#4a90c8` thành `coach`); `.q3z.q3coachT::before` dòng 631 (inset −10px, viền 5px, bo 18, `q3ring 1.1s ease-out infinite`); keyframes `q3ring` dòng 632 trùng `tt-ring` trong base nên dùng lại.