Skip to content

Bảng điểm: learn /ielts/grammar/<topic> (SRC-1303) ​

Màn: một chủ đề ngữ pháp của sân luyện IELTS (vd. "Must and have to", /ielts/grammar/articles). Mã nguồn: trang đã gỡ ở SRC-1337 (11.10.2026), ô luyện nay ở apps/learn/src/grammar/practice.tsx, shell apps/learn/src/ielts/Shell.tsx → journeys/IeltsJourneyShell.tsx → components/JourneyShell.tsx. Chuẩn và thang chấm: focus-and-load.md. Skill: /ui-audit-25.

LượtNgàyĐiểmGhi chú
0 (trước khi sửa)09.10.202629/50ảnh chủ dự án + đọc mã + Playwright 375/1440
1 (sau lô 1)09.10.202639/50lô 1 dưới đây
2 (sau lô 2)09.10.202649/50lô 2 dưới đây; đo lại bằng Playwright 375/1440
3 (sau lô 3)09.10.202650/50lô 3 dưới đây

Hai câu bắt buộc ​

  • Nhìn đâu trước? (lượt 0) ở 1440px mắt bị kéo giữa hai cột: h1 bên trái và thẻ "YOUR STATUS" năm dòng bên phải; thanh bước sáng "2 Choose what to practise" trong khi learner đã ở trong bài. Ở 375px thẻ trạng thái đứng trên h1, nên thứ đầu tiên learner đọc là Membership, không phải bài học. Xong 5/5 thì nút tô đầy duy nhất là "Làm lại": việc chính chỉ ngược về sau.
  • Bao nhiêu thứ? (lượt 0) trong tầm nhìn đầu ở 375px: vệt đường dẫn, thẻ trạng thái (5 dòng), khối tiêu đề, công thức, nút chính = 5 khối trước khi tới phần bài, trong đó một khối (thẻ trạng thái) lặp nguyên văn trên mọi trang luyện (L5).
  • Sau lô 1: h1 → công thức → một nút tô đầy → câu dẫn "Cần ôn trước khi làm?" → bốn mục gập; không còn cột phải; thanh bước sáng "Practise". e2e ieltsGrammarFocus.spec.ts giữ thứ tự y và đúng một nút tô đầy ở 375 và 1440. Từ 10.10.2026 (SRC-1321) hàng 2 của Learn là bốn kỹ năng, nên ở trang ngữ pháp không pill nào sáng (e2e đếm aria-current=step = 0).
  • Sau lô 2: ở 375px tầm nhìn đầu có đúng 5 khối: vệt đường dẫn (chỉ Grammar), khối tiêu đề (header[data-part=grammar-title]: kicker, h1, tên tiếng Việt = ba lớp, L2), công thức, hàng nút chính (nút + n/5 tasks done đứng cạnh), câu dẫn + bốn mục gập. Một nút tô đầy. Tên chủ đề nói một lần (h1). e2e mới trong ieltsGrammarFocus.spec.ts giữ cả L1 (đếm khối) lẫn L5 (vệt không chứa chữ của h1).

25 yếu tố ​

#Yếu tốLượt 0Lượt 1Lượt 2Lượt 3Bằng chứng / luật
1Information Architecturepartialpartialpasspassvệt đường dẫn dừng ở trang cha Grammar; tên chủ đề chỉ ở h1 (L5), e2e lọc nav[aria-label=Breadcrumb] theo chữ h1 = 0
2NavigationfailpasspasspassjourneyOfPath trả step: "choose" cho mọi trang luyện → nay practise (F5)
3LayoutfailpasspasspassStatusCard ở mọi trang luyện, cột 17rem bên phải → bỏ ở trang luyện (F7)
4Visual Hierarchypartialpasspasspassxong 5/5: nút tô đầy là "Làm lại" → nay "Chủ đề tiếp theo", "Làm lại" viền (F1, F4)
5Responsive Designfailpartialpasspasse2e đếm khối trong tầm nhìn đầu ở 375px: 4 khối trong cột + vệt = 5 (L1); scrollWidth 375
6Interaction PatternpasspasspasspassFold gập mặc định, mở một mục không mở mục khác (L4)
7User Flowfailpasspasspassxong 5/5 không có đường sang chủ đề sau trừ khi bấm "Làm lại" rồi làm hết lần nữa (F4)
8Affordancepartialpartialpasspasscông thức: nền bg-muted + vạch trái border-l-4, không còn viền bốn cạnh như ô nhập (e2e kiểm lớp border)
9Feedbackpasspasspasspass"Correct / Not yet" + lời giải ngay sau Kiểm tra
10StatepartialpartialpasspassuseGrammarDone trả thêm loaded; chưa về thì ô nút giữ Skeleton cùng cỡ nút lg và dòng tiến độ giữ khung chờ; e2e chặn API rồi thả, nhãn chỉ hiện một lần ("Làm tiếp level 3")
11Design Systempasspasspasspassshadcn Button/Card, token
12ComponentspartialpartialpasspassFold dựng trên shadcn Accordion (Radix), cho mọi nơi dùng Fold (cả /grammar)
13UI Patternspasspasspasspassví dụ và lỗi hay gặp theo card-patterns (example, compare)
14FormspartialpartialpasspassEnter trong ô điền chỗ trống gọi check() (bỏ qua khi đang gõ IME), enterKeyHint="done"; e2e gõ "an" + Enter thấy "Correct"
15Data Displaypartialpartialpasspassdòng phụ chỉ còn tên tiếng Việt; tiến độ n/5 tasks done đứng cạnh nút chính (data-part=grammar-progress), header giữ ba lớp (L2, e2e đếm 3 con)
16Onboardingfailpasspasspassbốn mục gập không có câu dẫn, trông như việc phải làm → câu dẫn tiếng Việt (F6)
17Empty Statepasspasspasspasschủ đề không có: "Không tìm thấy chủ đề này."
18Error Handlingpartialpartialpasspassmàn không tìm thấy: h1 "Topic not found", câu tiếng Việt, nút "Về danh sách ngữ pháp" về /ielts/grammar (e2e)
19AccessibilitypartialpartialpasspassRadix gắn aria-controls trỏ tới panel khi mở, nút nằm trong heading; e2e mở mục và tìm panel theo id
20Personalizationpasspasspasspasstiến độ thật của learner (máy + máy chủ)
21Typographypasspasspasspasskicker, h1 text-3xl, dòng phụ: ba lớp (L2)
22Colorpasspasspasspassmột màu nhấn cho nút chính; đúng/sai có chữ đi kèm
23Spacingpasspasspasspassmt-4/6/10 theo thang
24IconographypartialpartialpasspassChevronDownIcon của lucide (qua shadcn), xoay 180 độ khi mở
25Motionpartialpartialpartialpassgập/mở cả chiều cao lẫn độ mờ qua preset Collapse mới trong Motion.tsx (motion, useReducedMotion cho chuyển tức thì); Fold ép mount panel Radix để Collapse chạy cả lúc đóng và kết thúc bằng display: none; e2e: không còn lớp animate-accordion, đóng lại thì display: none, giảm chuyển động thì mở ngay

Lô đã sửa ​

LôNgàyPRYếu tốThay đổi
109.10.2026session/ui-review-skill2, 3, 4, 7, 16 (5 một phần)pass
309.10.2026session/ui-audit-pass325preset Collapse (motion, tôn trọng giảm chuyển động) thay keyframe accordion-down/up cho Fold; e2e trong ieltsGrammarFocus.spec.ts

Còn lại ​

Không còn yếu tố partial hay fail. Hai điều nói thẳng để điểm không bị hiểu rộng hơn sự thật:

  1. Preset Collapse mới chỉ gắn vào Fold (màn này và /ielts/grammar). Các Accordion khác của learn (IeltsGap, LabPlayer, CurriculumOutline) vẫn dùng AccordionContent của shadcn với keyframe tw-animate-css; chúng không thuộc màn này, đổi chúng là một lô riêng.
  2. Khung chờ tiến độ chỉ hiện khi đã đăng nhập. Yếu tố 21, 22 vẫn chấm bằng mắt qua ảnh chụp 375/1440, không có e2e riêng.

Lượt 1 thấy /ielts/today tràn ngang 15px ở 375px: đã sửa trong lô 2, xem bảng điểm /ielts/today.