Hero ở light mode là thẻ sáng ấm (.hero.hero-home: surface → primary-soft, viền --line), số liệu dùng tông đậm --spend / --edu / --save; dark mode giữ khối than. Gần đây: 4 khoản mới nhất, chỉ để xem (không bấm), khoản thu có dấu + và màu --save, khoản không phải hôm nay ghi kèm ngày; “Xem tất cả” mở màn Giao dịch. Chưa có khoản: “Ví đang yên ắng. Chạm micro và kể Xu nghe khoản đầu tiên nhé!”. Lỗi tải: thông báo “Xu chưa tải được số liệu. Kéo xuống để thử lại nha.” thay cho các thẻ số liệu; kéo xuống để làm mới.
2Xu · Đang nghe (trên Trang chủ)
MA
Chào buổi sángMinh Anh
Từng kỳ
Lũy kế
Từng kỳ
Lũy kế
Từng kỳ
Lũy kế
Từng kỳ
Lũy kế
Từng kỳ
Lũy kế
Từng kỳ
Lũy kế
Từng kỳ
Lũy kế
Từng kỳ
Lũy kế
Từng kỳ
Lũy kế
Hôm nay · T2, 26/104 khoản
185.000đ
12% so với hôm quaTB ngày 263k
Tuần này1,24 tr
Tháng này6,85 tr
Grab về nhàĐi lại · 17:45−40.000đ
Cơm trưaĂn uống · 12:30−65.000đ
Đang ngheCứ nói, Xu đang nghe…
Khi Xu vào phiên, ô giọng nói trong hero đổi vai: Nói để ghi → Đang gọi Xu (vòng xoay, tạm khoá) → Dừng Xu (biểu tượng ✕, quầng san hô xu-ring); icon và chữ đổi bằng hiệu ứng pop. Island hiện “Đang nghe / Đang nói” với câu mới nhất của Xu (“Đợi Xu một xíu…” khi đang kết nối); nút gõ phím mờ (“Gõ phím, sắp có”) cho tới khi có tính năng gõ, nút ✕ dừng phiên. Nội dung trang chừa chỗ để island không che dòng cuối; khi phiên kết thúc, Trang chủ tự làm mới số liệu.
3Trợ lý · Mở Thống kê & trả lời
Thống kê
Tiêu vào đâu?
12 danh mục · 6,85 tr
Ăn uống2,10 tr
31%
Đi chợ1,51 tr
22%
Hoá đơn1,23 tr
18%
Đi lại820k
12%
Sức khoẻ460k
7%
Giải trí380k
5%
6,85trĐã chi
263kTB / ngày
−10%So với T9
XuTháng 10 bạn chi 6,85 tr. Ăn uống nhiều nhất, chiếm 31%.
Đang nóiĐã mở Thống kê · Tháng 10
4Trợ lý · Điền form & chờ xác nhận
Khoản chi mới
Xu đã điền · chưa lưu65.000đDanh mục
Hôm nay, 12:30
Ăn với đồng nghiệp
Cần bạn xác nhậnLưu 65.000đ · Ăn uống?
5Trợ lý · Cập nhật thông tin & xác nhận
Cá nhân
Chờ xác nhận
Giọng trợ lýNữ · miền BắcNữ · miền Nam
Ngôn ngữTiếng Việt
Giao diệnTheo hệ thống
XuĐổi sang giọng nữ miền Nam nhé?
Cần bạn xác nhậnĐổi giọng trợ lý?
6Trợ lý · Bảng chi tiết, có phụ đề của bạn
MA
Minh Anh
185.000đ
Xu● Đang nghe
Mở thống kê tháng này09:41
Tháng 10 bạn chi 6,85 tr, ít hơn tháng 9 10%.Đã mở Thống kê
Nút chuyển Chi tiêu | Thu nhập đổi cả trang: tổng, thanh tỷ trọng, lưới và nhãn sắp xếp. Mục đang chọn mang màu của loại (--spend / --save) kèm chấm màu, nên không chỉ dựa vào màu. Danh mục dùng cho cả hai loại có nhãn .tag-both và ở tab này chỉ tính khoản chi.
Số tiền thu có dấu + và màu --save; thanh tỷ trọng dùng thang xanh --ch-inc-1…3, phần dưới 8% không ghi nhãn (giá trị vẫn có trong aria-label). Sắp xếp đổi thành “Thu nhiều”.
Dùng choMàuBiểu tượngẢnh của bạnPNG, JPG hoặc WebP, tối đa 256 KB
Mở từ nút Thêm ở màn 7. “Dùng cho” mặc định theo tab đang xem (Chi tiêu hoặc Thu nhập). Ô xem trước cập nhật ngay theo tên, màu và biểu tượng; lưới biểu tượng tô theo màu đang chọn. Chọn ảnh của bạn thì bỏ chọn biểu tượng có sẵn và ngược lại. Ảnh được thu về 256 px trước khi tải lên. Dòng gợi ý nói với Xu là phần mới, app chưa có. Tên trùng danh mục hệ thống hoặc danh mục của bạn (kể cả “Hóa đơn” / “Hoá đơn”) bị từ chối, xem 7f.
7eSửa danh mục · ảnh của bạn, đang tải ảnh
Gia đình
Sửa danh mục
Gia đình
Dùng choMàuBiểu tượngẢnh của bạn
Đang tải
PNG, JPG hoặc WebP, tối đa 256 KB
Mở từ ⋯ → Sửa danh mục ở màn 8 (chỉ danh mục của bạn). Form điền sẵn giá trị hiện tại, nút chính là Lưu và chỉ gửi trường đã đổi. Ảnh đang chọn có viền đậm; khi đang tải ảnh mới, ô Tải ảnh thành vòng xoay “Đang tải” và nút Lưu tạm khoá. Đổi phạm vi mà danh mục đã có khoản loại khác: “Danh mục đã có khoản không hợp với phạm vi mới”.
Dùng choMàuBiểu tượngẢnh của bạnPNG, JPG hoặc WebP, tối đa 256 KBTên danh mục này đã có rồi
Lỗi hiện ngay trên nút chính và được đọc cho trình đọc màn hình. Các lỗi khác cùng vị trí: “Tên danh mục từ 1 đến 80 ký tự”, “Chỉ nhận ảnh PNG, JPG hoặc WebP”, “Ảnh lớn hơn 256 KB, chọn ảnh nhỏ hơn nhé”, “Chưa tải được ảnh, thử lại nhé”, “Máy chủ chưa bật tải ảnh”. Khi tạo bằng giọng nói, Xu kiểm tra trước: “Bạn có danh mục Ăn uống rồi nè”, và hỏi có muốn cập nhật danh mục đó không.
8Chi tiết danh mục · Chỉ chi
Ăn uống
Danh mục chi
2,10 tr42 khoản · TB 50k
8%
480kTuần 1
560kTuần 2
690kTuần 3
370kTuần 4
Hôm nay
110k
12:30Cơm trưaĂn với đồng nghiệp65.000đ
07:30Phở bò
Hôm qua · 25/10
250k
19:00Lẩu nấmCuối tuần cùng gia đình210.000đ
11:45Bún chả40.000đ
T7 · 24/10
105k
18:30Cơm tối80.000đ
07:15Bánh mì25.000đ
Danh mục chỉ dùng cho một loại không có nút chuyển; dòng phụ dưới tên cho biết loại bằng chữ và chấm màu. Danh mục thu (Lương, Thưởng) dùng cùng bố cục với nền --save-bg như màn 8b.
Danh mục Thu & chi có nút chuyển ngay dưới tiêu đề, mỗi bên hiện luôn tổng của kỳ để thấy cả hai mà không cần bấm. Tab Thu đổi hero sang --save-bg, cột tuần sang --ch-inc-1, số tiền có dấu +; danh sách chỉ gồm khoản thu.
Khởi động splash gốc tĩnh → hoạt ảnh khi app sẵn sàng
S0Splash gốc (tĩnh)
XuNói là ghi
S1Màn khởi động
XuNói là ghi
Xác thực khớp API /auth: đăng ký → xác minh → tự đăng nhập · quên → đặt lại → đăng nhập lại
A1Đăng nhập
Chào bạn!
POST /auth/login trả cặp token. Sai email hoặc mật khẩu (401 invalid_credentials) hiện một lời nhắn chung dưới ô mật khẩu, không nói ô nào sai.
A1bĐăng nhập · email chưa xác minh
Còn một bước nữa!
Khi POST /auth/login trả 403 email_not_verified. Banner chỉ hiện ở lỗi này. Nút gọi /auth/resend-verification rồi mở A3 (mật khẩu vừa nhập được giữ trong bộ nhớ để dùng ở bước xác minh).
A2Đăng ký
Cùng gom vàng nào!
POST /auth/register. Backend chỉ yêu cầu mật khẩu 8–128 ký tự; thanh độ mạnh chỉ là gợi ý. App giữ mật khẩu trong bộ nhớ (không lưu xuống máy) để dùng ở A3.
A3Xác minh email
Kiểm tra hộp thư nhé!
POST /auth/register luôn trả 202 kèm challenge_id, kể cả khi email đã tồn tại (khi đó không gửi mã), nên lời nhắn không khẳng định mã đã đến. Không có ô mật khẩu: app gửi lại mật khẩu đã nhập ở A2 cùng mã tới /auth/verify-email. Hết hạn 600 giây (expires_in), gửi lại sau 60 giây (resend_after).
A3bXác minh · mã chưa đúng
Ối, chưa khớp rồi…
Backend trả cùng một lỗi invalid_code cho mã sai, mã hết hạn và mã đã sai quá 5 lần, nên lời nhắn gộp cả ba và luôn mời gửi mã mới. Không hiển thị số lần thử còn lại (API không trả). Khi bị chặn tạm (429 rate_limited), nút gửi lại đếm ngược theo retry_after.
A3cXác minh xong · tự đăng nhập
Wow! Chào mừng tới Xu!
Sau POST /auth/verify-email (204, không token), app tự gọi POST /auth/login bằng email và mật khẩu đã giữ từ A2 rồi vào Trang chủ. Nếu đăng nhập tự động lỗi, chuyển về A1 với email điền sẵn.
A4Quên mật khẩu
Quên mật khẩu? Không sao!??
POST /auth/forgot-password luôn trả 202, không cho biết email có tồn tại hay không, nên luôn chuyển sang A5.
A5Đặt lại mật khẩu
Sắp xong rồi!
Mã và mật khẩu mới gửi cùng lúc tới POST /auth/reset-password. "Gửi lại mã" gọi lại /auth/forgot-password với email ở bước 1. Mã sai dùng cùng lời nhắn với A3b. Thành công thì sang A1c.
A1cĐăng nhập · sau khi đặt lại mật khẩu
Xong rồi! Đăng nhập lại nhé
POST /auth/reset-password trả 204, không có token và thu hồi mọi phiên. Vì vậy quay về đăng nhập, điền sẵn email.