Yugen UI

Tổng quan khả năng tiếp cận

Yugen UI được xây để mặc định đã tiếp cận được: ngữ nghĩa ARIA từ Radix, điều hướng bàn phím đầy đủ, focus rõ ràng và tương phản đạt WCAG 2.1 AA.

Nguyên tắc

Component lo phần cơ chế (role, phím, focus); bạn lo phần nội dung (nhãn, tiêu đề, alt, thứ tự trang). Cả hai cần đủ thì giao diện mới tiếp cận được.

Ngữ nghĩa trước

Phần tử gốc đúng (button, a, input, table) và role ARIA từ Radix. Không dựng nút bằng div.

Bàn phím ngang chuột

Mọi thao tác bằng chuột đều làm được bằng bàn phím, theo mẫu tương tác của WAI-ARIA APG.

Thấy được trạng thái

Focus 2px tương phản cao; chữ ≥ 4.5:1, viền control ≥ 3:1; không dùng màu làm tín hiệu duy nhất.

Nghe được thay đổi

Lỗi, thông báo và kết quả bất đồng bộ được đọc qua live region với mức độ phù hợp.

Tôn trọng tuỳ chọn người dùng

prefers-reduced-motion tắt animation lặp; theme sáng / tối theo hệ điều hành; bố cục reflow khi phóng to.

Bàn phím

Tab chỉ dừng một lần ở mỗi nhóm (roving tabindex); bên trong nhóm dùng phím mũi tên. Trong RTL, ← / → được đảo theo chiều đọc.

ComponentPhímHành vi
Mọi controlTabShift+TabTới / lùi control kế tiếp theo thứ tự DOM.
Button, ToggleButton, LinkEnterSpaceKích hoạt (Link chỉ Enter). ToggleButton đổi aria-pressed.
Checkbox, SwitchSpaceĐổi trạng thái.
RadioGroup, ToggleGroup, Toolbar←→↑↓HomeEndDi chuyển trong nhóm (RadioGroup chọn luôn mục mới).
Tabs←→HomeEndChuyển tab và hiện panel tương ứng; ↑ / ↓ khi tab dọc.
Menu, ContextMenu, MenubarEnter↓↑→EscMở, di chuyển giữa item, → mở menu con, Esc đóng và trả focus; gõ chữ để nhảy tới item.
DropdownEnterSpace↑↓EscMở listbox, chọn option, gõ chữ để nhảy (typeahead).
Combobox, TagPicker, Command↑↓EnterEscBackspaceGõ để lọc, ↑ / ↓ highlight, Enter chọn; Backspace ở ô trống xoá tag cuối (TagPicker).
Slider←→PageUpPageDownHomeEndGiảm / tăng một bước, bước lớn, về min / max.
Dialog, DrawerEscTabFocus bị giữ trong bề mặt; Esc đóng (trừ modalType="alert"); đóng xong focus về trigger.
Popover, HoverCard, TooltipEscĐóng. Tooltip mở khi trigger nhận focus bàn phím.
AccordionEnterSpace↑↓HomeEndMở / đóng panel, di chuyển giữa các header.
Tree↑↓→←HomeEnd→ mở nhánh / vào con, ← đóng nhánh / về cha.
List (navigationMode)↑↓→←Di chuyển giữa item; chế độ composite: → / ← vào / ra nội dung tương tác trong item.
ToastF8Nhảy tới vùng thông báo; Tab tới nút hành động / đóng.

Ngữ nghĩa cho trình đọc màn hình

Phần lớn do Radix cung cấp; Yugen bổ sung nhãn mặc định tiếng Việt cho nút đóng, phân trang, breadcrumb.

ComponentRole / thuộc tính
Dialog / DialogSurfacerole="dialog" hoặc alertdialog, aria-modal, tên từ DialogTitle, mô tả từ DialogDescription.
Menumenu, menuitem, menuitemcheckbox, menuitemradio, aria-expanded trên trigger.
Tabstablist, tab (aria-selected, aria-controls), tabpanel.
Checkbox, Switch, Radiocheckbox (aria-checked="mixed" khi indeterminate), switch, radiogroup / radio.
Sliderslider với aria-valuenow / min / max; tên từ label hoặc aria-label.
Dropdown, Comboboxcombobox + listbox / option, aria-expanded, aria-activedescendant. Trong Field, listbox của Combobox / TagPicker lấy tên từ nhãn (aria-labelledby).
Breadcrumb, Paginationnav có aria-label, trang hiện tại aria-current="page".
Tableth scope="col", cột sắp xếp có aria-sort; TableSelectionCell có nhãn “Chọn hàng”.
MessageBarrole="alert" cho error / warning, role="status" cho info / success.
ToastVùng thông báo của Radix: toast lỗi / cảnh báo đọc ngay (assertive), còn lại đọc lịch sự (polite).
Spinner, ProgressBarrole="progressbar", Spinner mặc định aria-label="Đang tải".
Avatar, Personarole="img" với tên người; chấm trạng thái có nhãn.
Field, Inputlabel for, aria-describedby trỏ tới hint / validation, aria-invalid khi lỗi.

Checklist trước khi phát hành

Đánh dấu khi kiểm tra — danh sách chỉ lưu trong phiên xem này.

Đã hoàn thành 0 / 10

Công cụ & trang liên quan

  • Kiểm tra tự động: axe DevTools, Accessibility Insights for Web, Lighthouse (phát hiện khoảng 30–40% lỗi — phần còn lại cần kiểm thử tay).
  • Trình đọc màn hình: NVDA (Windows, miễn phí), Narrator, VoiceOver (macOS / iOS), TalkBack (Android).
  • Chrome DevTools › Rendering: giả lập prefers-reduced-motion, prefers-color-scheme, forced-colors và các dạng mù màu.

Đọc tiếp: