Hệ thống thiết kế giao diện · Cổng gửi vé VeXeRe · Xe khách Hà Giang

Bộ giao diện Cổng gửi vé

Một bộ token, ba phông chữ, một màu nhấn: trang quản trị trên máy tính và ứng dụng đại lý trên điện thoại cùng nói một thứ tiếng. Mọi giá trị ở đây lấy từ design/tokens.cssdesign/antd-theme.ts trong kho mã.

v0.1GIAO DIỆN · 02.09.2026
Chế độ màu
Cỡ chữ
Đổi ngay trên trang này để xem cả hai chế độ và chế độ chữ to cho đại lý lớn tuổi.

1. Nguyên tắc

Bảng điều độ, không phải trang tiếp thị. Giao diện được đọc lướt và thao tác nhanh, nên số liệu và trạng thái phải đọc được trong một cái nhìn; trang trí chỉ còn một chỗ: tem vé màu vàng biển số.

Một nguồn token. Thành phần React và Ant Design chỉ dùng biến ngữ nghĩa (--ink, --accent, --ok…), không viết hex thô; đổi theme là đổi token, không sửa thành phần.

Điện thoại là chính với đại lý. Nút cao 44 px trở lên, chữ 16 px trở lên trong ô nhập (không bị iOS phóng to), bảng đổi thành thẻ, thanh điều hướng dưới tối đa 5 mục, có chế độ chữ to.

Màu không đứng một mình. Trạng thái luôn có chữ (và chấm/biểu tượng), số liệu luôn có nhãn; người mù màu và màn hình ngoài nắng vẫn đọc được.

Không cắt chữ. Dòng vé, ghi chú, tên khách được phép xuống dòng; không dùng dấu ba chấm cho nội dung nghiệp vụ (bài học từ app Vé247, mục 13).

2. Màu và trạng thái

Nền xám lạnh, chữ than, một màu nhấn là vàng biển số (biển xe kinh doanh vận tải), một màu xanh tuyến cho liên kết và lựa chọn. Số trong ngoặc là tỉ lệ tương phản đã tính cho chế độ sáng / tối.

--bg
Nền trang#F2F4F6 / #111820
--surface
Bề mặt#FFFFFF / #18212B
--surface-2
Đầu bảng, vùng phụ#E9EDF1 / #202B37
--ink
Chữ chính16,3 / 13,7 · AAA
--ink-2
Chữ phụ, đầu bảng9,1 / 10,0 · AAA
--muted
Chữ mờ, nhãn5,2 / 5,9 · AA
--accent
Vàng biển sốchữ than trên vàng 9,3 / 11,1
--primary
Xanh tuyến6,5 / 7,6 · liên kết, chọn
--ok
Đã gửi, thành côngchip 5,6 / 7,0
--warn
Chờ, cần chú ýchip 5,9 / 7,9
--bad
Huỷ, lỗichip 4,7 / 6,5
--info
Đã xếp, thông tinchip 5,2 / 6,0
--line-input
Viền ô nhập3,5 / 3,9 · đủ cho viền
focus
Vòng focusxanh ở nền sáng, vàng ở nền tối

Trạng thái vé (lõi) — chữ hiển thị, không hiện mã

Nháp Chờ xếp Đang xếp Đã xếp Đã xuất vé Đã gửi khách Hoàn thành Từ chối Đã huỷ

Trạng thái gửi theo kênh

SMS · chờ gửi SMS · đã nhận 17:02 Zalo · đã xem Email · lỗi, thử lại 2/3 Zalo OA · chưa bật Biểu tượng SVG một bộ (Lucide), nét 1,75 px; không dùng emoji làm biểu tượng.

3. Chữ

Barlow Condensed cho tiêu đề, đầu bảng, nhãn viết hoa: đọc như bảng giờ ở bến xe, tiết kiệm chỗ trên điện thoại. Be Vietnam Pro cho toàn bộ chữ đọc và điều khiển: dấu tiếng Việt chuẩn, nét đều ở cỡ nhỏ. JetBrains Mono cho mã vé, số điện thoại, biển số, tiền: số thẳng cột, không nhầm 0 với O. Cả ba đều có subset tiếng Việt trên Google Fonts (đã kiểm tra).

Hà Giang → Mỹ Đình · 17h30 · Giường A5
Bàn xếp vé — 7 vé chờ, 2 vé sắp hết hạn giữ chỗ

Đại lý Hoàng Su Phì gửi 3 vé cho khách Nguyễn Thị Hương, đi chuyến 17h30 ngày mai, cần tầng dưới vì có người già. Hệ thống đã giữ chỗ trên VeXeRe, giá đại lý 380.000 đ, gửi vé qua Zalo lúc 16:05.

0912 345 678 · NO97T9 · 24B-123.45 · 400.000 đ · 16:45 · 02/09/2026

Thang chữ

Vai tròPhôngCỡ / dòng / đậmDùng cho
Tiêu đề trangBarlow Condensed38 / 1,1 / 700Tên màn hình trên PC (điện thoại: 26)
Tiêu đề mụcBarlow Condensed30 / 1,15 / 700Khối lớn trong trang
Tiêu đề thẻBarlow Condensed20–22 / 1,2 / 600Tuyến, giờ trên thẻ vé; đầu cột bàn xếp
Nhãn viết hoaBarlow Condensed12,5 / 1,2 / 600 · +6 % giãnĐầu bảng, nhãn ô số liệu, nhóm chuyến
Chữ đọcBe Vietnam Pro15 (PC) · 16 (điện thoại) / 1,55 / 400Nội dung, ô nhập, thẻ vé
Chữ nhỏBe Vietnam Pro13,5 / 1,45 / 400–500Bảng dày, cảnh báo
Chú thíchBe Vietnam Pro12,5 / 1,35 / 400Trợ giúp dưới ô nhập, giờ gửi
Dữ liệuJetBrains Mono13,5 / 1,5 / 500 · tabularMã vé, SĐT, biển số, tiền (căn phải)
Chế độ chữ to×1,13 · nút 44–52Bật trong mục Tôi, lưu theo máy

4. Nút

Mỗi màn hình một nút vàng (hành động chính), còn lại xanh viền hoặc xám. Nút huỷ/xoá màu đỏ chỉ hiện trong hộp thoại xác nhận. Trên điện thoại nút chính cao 48 px, kéo hết chiều ngang ở thanh hành động dính đáy.

Chữ nút là động từ đúng việc: "Đẩy lên", "Xác nhận ghế", "Gửi lại vé"; không dùng "OK", "Submit".

5. Chip và tem vé

Tem vé là điểm nhận diện duy nhất của hệ thống: mã vé in trên nền vàng viền than như biển số xe. Nó xuất hiện ở bảng, thẻ vé, tin nhắn gửi khách (dạng chữ) và trang tra cứu; bấm biểu tượng để sao chép. Vé huỷ thì tem chuyển xám và gạch ngang, vẫn giữ mã để tra được.

NO97T9 VX-260902-0142 G5A768 Đã xếp Đã gửi khách 2 giường Tầng dưới Hết hạn giữ chỗ 16:45

6. Bảng trên PC, thẻ vé trên điện thoại

Bảng dày 40 px/dòng cho điều hành; đầu bảng dính, chữ viết hoa hẹp; tiền và số căn phải, phông mono; bảng rộng cuộn trong khung của nó, trang không bao giờ cuộn ngang. Dưới 768 px cùng dữ liệu đó hiện thành thẻ vé, không thu nhỏ bảng.

Tem véKháchChuyến ChỗĐại lýGiá bánTrạng tháiGửi khách
NO97T9Nguyễn Thị Hương0912 345 67817h30 · 03/09Hà Giang → Mỹ ĐìnhA5, A6Hoàng Su Phì800.000Đã gửi kháchZalo SMS
VX-0142Lý Seo Páo0388 210 45617h30 · 03/09Hà Giang → Mỹ ĐìnhQuản Bạ400.000Chờ xếpchưa gửi
SM3M1JTrần Văn Bình0977 888 12321h00 · 03/09Hà Giang → Mỹ ĐìnhB12Web380.000Đã xếpEmail lỗi
Q7E6J4Hoàng Mai Anh0356 777 00105h00 · 04/09Mỹ Đình → Hà GiangC1, C2, C3Đồng Văn1.140.000Đang xếpchưa gửi
G5A768Vàng A Sùng0705 978 39017h30 · 03/09Hà Giang → Mỹ ĐìnhA1Mèo Vạc400.000Đã huỷ · phí 0SMS huỷ
4HLPH0Công ty Du lịch Cao nguyên đá0243 222 999 · 6 khách09h00 · 05/09Hà Giang → Mỹ ĐìnhXếp tayĐại lý Hà Nội 12.280.000Đã xuất véEmail
Hiện 1–6 trong 128 vé dữ liệu ví dụ

Trên điện thoại: thẻ vé và thanh điều hướng dưới

16:054G ▪▪▪
Vé của tôi
Đang ngoại tuyến — 1 vé sẽ tự gửi khi có mạng
NO97T9Đã gửi khách
Nguyễn Thị Hương · 0912 345 678
17h30 Thứ Tư 03/09 · Hà Giang → Mỹ Đình
2 giường A5, A6Đón BX Hà Giang 17h15800.000 đ · đã thu
Có người già, cần tầng dưới — đã xếp đúng yêu cầu.
Zalo đã xem 16:07SMS đã nhận
VX-0142Chờ xếp
Lý Seo Páo · 0388 210 456
17h30 Thứ Tư 03/09 · Hà Giang → Mỹ Đình
1 giườngĐón Quản Bạ400.000 đ · thu tại xe
G5A768Đã huỷ
Vàng A Sùng · 0705 978 390
17h30 Thứ Tư 03/09 · Hà Giang → Mỹ Đình
Khách báo huỷ qua Zalo 15:40Phí huỷ 0 đ

Thẻ vé luôn theo một thứ tự: tem + trạng thái → tên và SĐT → chuyến (chữ hẹp, đậm) → chỗ, điểm đón, tiền → ghi chú → kết quả gửi → hai nút tối đa.

Vé huỷ gạch tên và chuyến, giữ nguyên tem và lý do; không ẩn khỏi danh sách trong ngày.

Ngoại tuyến có dải vàng nói rõ điều gì sẽ xảy ra; vé nhập lúc mất mạng xếp hàng và tự gửi.

Vé mới là nút tròn vàng giữa thanh dưới, ngón cái với tới; bốn mục còn lại là danh từ ngắn.

7. Biểu mẫu

Nhãn nằm trên ô, luôn hiện (không chỉ có gợi ý trong ô); ô số điện thoại mở bàn phím số; ngày và giờ chọn bằng chip thay vì gõ; lỗi hiện ngay dưới ô kèm biểu tượng; thanh hành động dính đáy trên điện thoại. Ô nhập trên điện thoại 16 px, cao 44 px.

Hệ thống tìm vé cũ của khách theo số này.
2
Điểm này chưa có trong danh sách của chuyến. Chọn điểm gần nhất hoặc ghi vào ghi chú cho nhà xe.
Trống thì lấy giá mặc định của tuyến: 400.000 đ/chỗ.

Ba cách nhập cùng một biểu mẫu: gõ tay, dán tin Zalo (hệ thống tách thành các ô), chụp ảnh sổ (AI đọc, đại lý xác nhận từng dòng trong bảng xem trước).

8. Bàn xếp vé (PC)

Hai cột: trái là hàng đợi nhóm theo chuyến với số vé chờ; phải là vé đang chọn, đề xuất ghế và một nút vàng. Đồng hồ hết hạn giữ chỗ hiện thành chip vàng, đổi đỏ khi còn dưới 10 phút. Phím tắt: J/K chuyển vé, Enter xác nhận, X từ chối.

Chờ xếp · 7

17h30 · 03/09 · Hà Giang → Mỹ Đình3
Lý Seo PáoChờ xếp1 giường · Quản Bạ · đẩy lên 15:58
Hoàng Mai AnhĐang xếp3 giường · Đồng Văn · 16:01
Nông Văn ToànChờ xếp2 ghế · web · 16:03
21h00 · 03/09 · Hà Giang → Mỹ Đình4
Đặng Thị MaiChờ xếp1 cabin · Hoàng Su Phì · 16:04

Vé VX-0142 · Lý Seo Páo

Khách
Lý Seo Páo · 0388 210 456
Chuyến
17h30 · Thứ Tư 03/09 · Hà Giang → Mỹ Đình
Yêu cầu
1 giường · đón Quản Bạ · thu tại xe
Đại lý
Quản Bạ (Vàng Thị Dín) · hoa hồng 10 %
Đề xuất từ VeXeReGiữ chỗ đến 16:45 · còn 38 phút
A1A2A7A8B3B4
Giường A7 tầng dưới · giá VeXeRe 400.000 đ · đại lý 360.000 đ · điểm đón Quản Bạ 18h20

9. Ô số liệu và biểu đồ

Ô số liệu: nhãn viết hoa hẹp, số lớn phông hẹp, chênh lệch so với kỳ trước có mũi tên và màu theo hướng tốt/xấu; ô cần chú ý mang chip chứ không tô cả ô. Biểu đồ: thanh mỏng, nhãn số trực tiếp, lưới mờ, một trục; màu theo kênh cố định (đã qua kiểm tra mù màu), luôn kèm bảng số.

Vé hôm nay128+12 % so với hôm qua
Đã gửi khách96%118 trên 123 vé đã xếp
Chờ xếp7cần xếp trong 30 phút
Sắp hết hạn giữ chỗ2gần nhất 16:45

Tin đã gửi theo kênh, 7 ngày qua dữ liệu ví dụ

Số tin gửi thành công; SMS là kênh dự phòng nên có mặt ở hầu hết vé.

SMSZalo cá nhânEmailZalo OA· Bảng số: Thống kê → Kênh gửi

10. Thông báo, trống, đang tải

Thông báo nói việc gì đã xảy ra và làm gì tiếp, không xin lỗi, không mơ hồ. Toast dưới cùng 4 giây, có nút hoàn tác khi hoàn tác được. Tải quá 300 ms thì hiện khung xám giữ chỗ (không nhảy bố cục). Màn trống là lời mời hành động.

Đã giữ chỗ A7 trên VeXeReVé sẽ tự huỷ lúc 16:45 nếu chưa thanh toán. Đại lý đã thu tiền → bấm Thanh toán để chốt.
Máy SIM im lặng 12 phútSMS đang xếp hàng; Zalo vẫn gửi bình thường. Kiểm tra máy Android trong Kênh gửi.
VeXeRe từ chối: ghế A7 vừa có người đặtHệ thống đã tải lại sơ đồ và đề xuất A8. Xác nhận lại hoặc chọn ghế khác.
Chuyến 17h30 đã tắt bán trực tuyếnVé mới của chuyến này chuyển sang xếp tay; gọi nhà xe 0912 000 111.
Đã gửi vé cho 0912 345 678 qua Zalo
Chưa có vé nào cho ngày maiVé đại lý đẩy lên sẽ hiện ở đây theo thời gian thực.

11. Chuyển động

150–250 ms, chỉ opacity và transform (không animate chiều cao); vé mới trượt vào đầu danh sách mà không làm dòng khác nhấp nháy; đang đọc giữa danh sách thì giữ nguyên vị trí cuộn; mọi hiệu ứng tắt khi máy bật "giảm chuyển động". Không có hiệu ứng trang trí.

Dòng mới trượt xuống 6 px kèm mờ dần 200 ms; dòng cũ đứng yên.

12. Điều hướng

PC: thanh bên 240 px, mục đang chọn nền vàng nhạt với vạch vàng, số việc chờ hiện dưới dạng huy hiệu vàng. Điện thoại: thanh dưới 5 mục (mục 6). Nút quay lại của trình duyệt luôn hoạt động; mọi màn hình có đường dẫn riêng để chia sẻ.

Thứ tự menu theo tần suất dùng của điều hành: việc phải làm ngay ở trên (bàn xếp vé, kênh gửi có sự cố), việc định kỳ ở dưới (đối soát, thống kê). Mô-đun tắt thì mục biến mất; không có mục "đang phát triển".

13. Kế thừa từ nền tảng cũ

Những lỗi đã trả giá ở Vé247, OSZalo và web xekhachhagiang.com được đổi thành quy tắc ở đây (chi tiết kèm nguồn trong tài liệu 02, mục 10).

Vé247 app
Không cắt chữ dòng vé. Ô dòng vé khoá 3 dòng từng cắt mất ghi chú khi khối ghi chú rơi xuống dòng 4. Ở đây dòng vé, ghi chú, tên khách luôn xuống dòng, không dùng dấu ba chấm cho nội dung nghiệp vụ.
Vé247 app
Nhãn huỷ giữ ngữ cảnh. Chữ "ĐÃ HUỶ" trơn không cho biết huỷ ở đâu; nay tên/chuyến gạch ngang kèm tem, lý do và phí huỷ.
Vé247 app
Vé mới tự hiện, không nhấp nháy. Vé từ cuộc gọi từng không xuất hiện cho tới khi kéo làm mới; danh sách dựng lại từng chớp. Nay dữ liệu đẩy qua SSE, chỉ dòng mới trượt vào, giữ vị trí cuộn khi đang đọc giữa danh sách.
Vé247 app
Không thêm thông báo thừa. Thông báo khay cho huỷ/từ chối bị người dùng bỏ vì gây rối; ở đây một sự kiện chỉ báo một lần, qua một kênh người dùng chọn.
Vé247 web
Không tô "xanh, đang tốt" từ suy đoán. Thẻ kênh từng hiện chấm xanh trong khi khoá đã hết hạn. Nay trạng thái mặc định là xám "chưa kiểm tra"; xanh chỉ sau khi thử kết nối thật; chấm xanh "nhịp thở" khi sống, đỏ đứng yên khi mất.
Vé247 web
Không giấu hành động sau hover; tách nút huỷ khỏi cụm nút thường. Nút xoá chỉ hiện khi hover nên màn cảm ứng không bao giờ thấy; nút Huỷ lẫn cụm nút từng bị bấm nhầm. Ở đây mọi hành động có đường vào bằng chạm, nút phá huỷ đứng riêng và có xác nhận.
Web 2026
Tràn ngang trên điện thoại từng xảy ra hai lần (lưới 1fr chứa hàng chip cuộn ngang; thanh phân trang thiếu flex-wrap). Quy tắc: minmax(0,1fr), min-width:0, overflow-x:clip, và phép kiểm tự động "chiều rộng cuộn ≤ chiều rộng màn" cho mọi màn.
Web 2026
Phông phải có subset tiếng Việt và tự host. Poppins thiếu subset nên tiêu đề có dấu lẫn phông; serif phương Tây vỡ dấu. Bộ này dùng Be Vietnam Pro, Barlow Condensed, JetBrains Mono (đều có subset), PWA tự host woff2 để chạy ngoại tuyến.
OSZalo
Dữ liệu từ nguồn không chắc phải qua xem trước. Kéo-thả tin từng tạo vé ngay dù thiếu trường. Dán tin Zalo hay AI đọc ảnh ở đây luôn ra bảng xem trước có sửa rồi mới tạo vé.
OSZalo
Một màn một việc; sửa tại chỗ kiểu Excel. Màn dồn 3–4 thẻ bị chê rối, đã tách tab con; người dùng chọn bấm đúp ô để sửa, Enter/blur tự lưu thay cho nút ✎ và bước xác nhận. Bàn xếp vé kế thừa cả hai.
OSZalo
Thời gian thực có kỷ luật. Màn nào cũng tải lại theo mọi sự kiện SSE từng làm nghẽn máy chủ và treo vòng quay trên điện thoại; huy hiệu đếm sai vì giới hạn 200 dòng. Nay mỗi màn chỉ nghe sự kiện của mình, huy hiệu lấy từ endpoint đếm riêng.
Web 2026
Hiệu năng đo thật. Số đo Playwright throttle nhiễu; chỉ tin Lighthouse thật (mobile ≥ 90). Gói JS từng nặng 874 KB vì nạp bản đồ ngay; ở đây tách gói màn nặng, gói đầu dưới 300 KB, khung giữ chỗ cố định kích thước.
Web 2026
Điện thoại: chữ 16–17 px, điểm chạm ≥ 44 px, thanh hành động dính đáy có vùng an toàn là những gì web đặt vé đã làm và được duyệt; chế độ "Chữ to" ở đây là công tắc chính thức.
Vé247 web
Huy hiệu nguồn bằng emoji (🌐 Web) khó thống nhất giữa máy; chữ 9–11 px từng có tương phản ~2:1. Nay biểu tượng SVG một bộ, sàn chữ 12,5 px với tương phản đã tính.

14. Kiểm tra trước bàn giao

  • Chữ chính ≥ 4,5:1, chữ phụ ≥ 3:1 ở cả hai chế độ (đã tính, mục 2).
  • Mọi điểm chạm ≥ 44 px; nút chính điện thoại 48 px; khoảng cách ≥ 8 px.
  • Ô nhập trên điện thoại ≥ 16 px; bàn phím đúng loại (tel, numeric).
  • Không cuộn ngang toàn trang; bảng cuộn trong khung hoặc thành thẻ.
  • Trạng thái có chữ và biểu tượng, không chỉ màu.
  • Không cắt chữ nghiệp vụ; tên dài xuống dòng.
  • Focus nhìn thấy được khi dùng bàn phím; thứ tự đọc màn hình khớp thứ tự nhìn.
  • Giảm chuyển động: mọi hiệu ứng tắt; khung xám không chớp.
  • Tải > 300 ms có khung giữ chỗ; gửi biểu mẫu có trạng thái đang xử lý → xong/lỗi.
  • Thanh dính (đầu/dưới) không che nội dung; chừa vùng an toàn của máy.
  • Không emoji làm biểu tượng; một bộ SVG, một nét.
  • Thử ở 375 px, 768 px, 1024 px, 1440 px và chế độ chữ to.
  • Không có hex thô trong thành phần (chạy kiểm tra token trước khi gộp).
  • Chữ nút là động từ đúng việc; thông báo nói rõ việc gì và làm gì tiếp.