User Table
A people table with generated avatars, roles, statuses, and activity.
| User | Role | Status | Last seen |
|---|---|---|---|
| Owner | active | 2m ago | |
| Admin | active | 1h ago | |
| Developer | active | yesterday | |
| Developer | invited | never | |
| Billing | suspended | 3 weeks ago |
View codeHide code
import { DEMO_PEOPLE, getFirstName } from "@/lib/demo-people";
import {
UserTable,
type UserTableRow,
} from "@/components/blobz/user-table";
const USERS: readonly UserTableRow[] = [
{
avatar: {
name: getFirstName(DEMO_PEOPLE.janakiAmmal),
palette: ["#e7efff", "#91bafa"],
},
email: "janaki@example.com",
id: "janaki",
lastSeen: "2m ago",
name: DEMO_PEOPLE.janakiAmmal,
role: "Owner",
status: "active",
},
{
avatar: {
name: getFirstName(DEMO_PEOPLE.vikramSarabhai),
palette: ["#e3fff4", "#46c888"],
},
email: "vikram@example.com",
id: "vikram",
lastSeen: "1h ago",
name: DEMO_PEOPLE.vikramSarabhai,
role: "Admin",
status: "active",
},
{
avatar: {
name: getFirstName(DEMO_PEOPLE.kalpanaChawla),
palette: ["#e1fff9", "#4bd3b5"],
},
email: "kalpana@example.com",
id: "kalpana",
lastSeen: "yesterday",
name: DEMO_PEOPLE.kalpanaChawla,
role: "Developer",
status: "active",
},
{
avatar: {
name: getFirstName(DEMO_PEOPLE.srinivasaRamanujan),
palette: ["#e5f9ff", "#32c4d6"],
},
email: "srinivasa@example.com",
id: "srinivasa",
lastSeen: "never",
name: DEMO_PEOPLE.srinivasaRamanujan,
role: "Developer",
status: "invited",
},
{
avatar: {
name: getFirstName(DEMO_PEOPLE.gagandeepKang),
palette: ["#fff0dc", "#e7ad55"],
},
email: "gagandeep@example.com",
id: "gagandeep",
lastSeen: "3 weeks ago",
name: DEMO_PEOPLE.gagandeepKang,
role: "Billing",
status: "suspended",
},
];
export function UserTableExample() {
return <UserTable className="max-w-3xl" users={USERS} />;
}Installation
Register the Blobz registry once in your project, then install:
npx shadcn@latest add @blobz/user-tableThe base avatar is installed automatically.
Usage
import { UserTable } from "@/components/blobz/user-table";
<UserTable users={[{
id: "janaki",
name: "Janaki Ammal",
email: "janaki@example.com",
role: "Owner",
status: "active",
lastSeen: "2m ago",
avatar: { name: "Janaki" },
}]} />Status accepts active, invited, and suspended. On narrow screens, the table scrolls horizontally so every column remains readable.