Bỏ qua tới nội dung
Component / 051 / NEXOFRAME

ActivityList

Mẫu chuẩn

Một danh sách có thứ tự gồm các hoạt động: ai (avatar và tên), làm gì (một câu), khi nào, và trạng thái. Người dùng có thể chọn một mục; composite báo mục đó qua một callback onItemSelect.

Composite tầng 2Dựng từ Avatar + StatusDotNgữ nghĩa <ol>1 callback onItemSelect

Playground

Bật hoặc tắt onItemSelect, và cắt danh sách bằng limit, để xem dòng đổi từ tĩnh sang một nút phủ cả dòng.

LIVE PREVIEW

Chưa chọn mục nào. Bấm một dòng. Đang hiện 3/3 mục.

import { ActivityList } from "@nexobox/ui";

<ActivityList
  aria-label="Công việc đang diễn ra"
  items={items}
  onItemSelect={(id) => takeover(id)}
/>

Bài toán

"Từ bản nháp đến kết quả: luôn biết ai đang phụ trách và bước tiếp theo." Người quản lý cần quét nhanh hàng chục hoạt động, mỗi dòng trả lời ai, việc gì, lúc nào, tới đâu rồi. Avatar và StatusDot là hai mảnh, nhưng thứ tự đọc của một dòng, cách nhấn vào một dòng và ngữ nghĩa danh sách có thứ tự không thuộc primitive nào.

Khi nào sử dụng

Nên dùng

Dòng thời gian các việc do người hoặc Human AI làm. Khi mỗi mục có một người phụ trách và một trạng thái.

Khi nào không dùng

Tránh dùng

Không dùng choDùng thay
Dữ liệu cần sắp xếp theo cộtTable
Tin nhắn hội thoạiMessageBubble
Danh sách lựa chọnRadioGroup, CheckboxCardGroup

Dựng từ

Primitive tầng 1Vai trong composite
Avatar (size="sm"), AvatarFallbackNgười phụ trách.
StatusDotTrạng thái của mục, có nhãn chữ.
ActivityList thêm gì
Ngữ nghĩa <ol>: thứ tự thời gian là thông tin
Một dòng nhấn được (nút phủ cả dòng) khi có onItemSelect
Kẻ border-divider giữa các dòng
limit: cắt danh sách, host tự quyết lối "xem tất cả"

Anatomy

#PhầnGhi chú
1Avatarsize="sm", bên trái. Chữ viết tắt khi không có ảnh.
2Tên và giờTên text-primary, giờ text-muted căn phải cùng hàng.
3Câu tóm tắttext-secondary, một câu nói việc gì.
4StatusDotstatus và statusLabel. Màu không thay nhãn chữ.
5Kẻ phân dòngborder-divider dưới mỗi dòng, trừ dòng cuối.

Variants

Không có prop variant. Trạng thái của từng mục do StatusDot mang, qua status và statusLabel của mỗi phần tử items.

States

Trạng tháiBiểu hiện
Có mụcDanh sách
RỗngHost render Empty. Composite không tự vẽ trạng thái rỗng
Dòng hover, focusKhi có onItemSelect: nền surface-hover, vòng focus trên nút của dòng

Bàn phím & trợ năng

Tab qua từng dòng, Enter / Space chọn -- mỗi dòng là một <button> khi có onItemSelect, không có thì dòng không nhận tiêu điểm.

Seam — host sở hữu gì

Composite không lọc, không sắp xếp, không định dạng thời gian, không điều hướng.

Host sở hữuCấp qua
Các mục đã lọc, đã định dạngitems
Chọn một mục dẫn tới đâuonItemSelect

API & triển khai

PropMặc địnhQuy ước
items—Bắt buộc. ReadonlyArray<{ id; actor: { name; initials; imageSrc? }; summary; time; status: StatusDotVariant; statusLabel }>.
limitundefinedCắt danh sách.
onItemSelectundefined(id: string) => void. Có thì mỗi dòng nhấn được.
aria-label—Bắt buộc.

Design tokens

--nf-semantic-border-divider, --nf-semantic-surface-hover, --nf-semantic-text-primary, --nf-semantic-text-secondary, --nf-semantic-text-muted, --nf-foundation-typography-ui-*, --nf-foundation-typography-caption-*, --nf-foundation-space-2, --nf-foundation-space-3, --nf-component-focus-*. Qua Avatar và StatusDot: token của hai primitive đó.

Do / Don't

Nên dùng

Câu tóm tắt nói việc: "Soạn phản hồi cho chị Lan". Thời gian tương đối do host định dạng. statusLabel bằng chữ.

Tránh dùng

"Hoạt động số 482". Để composite gọi new Date(). Chỉ màu chấm.