All blocks

Data table

Table with header, rows, and pagination.

Preview

NameEmailRoleStatus
Jane Doejane@example.comAdminActive
Alex Chenalex@example.comMemberInvited
Sam Ortizsam@example.comMemberActive
Priya Patelpriya@example.comMemberSuspended

Code

import { MoreHorizontal } from "lucide-react"
import {
  Badge,
  Button,
  DropdownMenu,
  DropdownMenuContent,
  DropdownMenuItem,
  DropdownMenuTrigger,
  Pagination,
  PaginationContent,
  PaginationItem,
  PaginationLink,
  PaginationNext,
  PaginationPrevious,
  Table,
  TableBody,
  TableCell,
  TableHead,
  TableHeader,
  TableRow,
} from "@smaller-earth/ui"

const rows = [
  { id: 1, name: "Jane Doe", email: "jane@example.com", status: "Active", role: "Admin" },
  { id: 2, name: "Alex Chen", email: "alex@example.com", status: "Invited", role: "Member" },
  { id: 3, name: "Sam Ortiz", email: "sam@example.com", status: "Active", role: "Member" },
  { id: 4, name: "Priya Patel", email: "priya@example.com", status: "Suspended", role: "Member" },
]

export function DataTable() {
  return (
    <div className="w-full space-y-4">
      <Table>
        <TableHeader>
          <TableRow>
            <TableHead>Name</TableHead>
            <TableHead>Email</TableHead>
            <TableHead>Role</TableHead>
            <TableHead>Status</TableHead>
            <TableHead className="w-0" />
          </TableRow>
        </TableHeader>
        <TableBody>
          {rows.map((r) => (
            <TableRow key={r.id}>
              <TableCell className="font-medium">{r.name}</TableCell>
              <TableCell className="text-muted-foreground">{r.email}</TableCell>
              <TableCell>{r.role}</TableCell>
              <TableCell>
                <Badge variant={r.status === "Active" ? "secondary" : r.status === "Suspended" ? "destructive" : "outline"}>
                  {r.status}
                </Badge>
              </TableCell>
              <TableCell>
                <DropdownMenu>
                  <DropdownMenuTrigger render={<Button variant="ghost" size="sm" aria-label="Row actions"><MoreHorizontal className="size-4" /></Button>} />
                  <DropdownMenuContent align="end">
                    <DropdownMenuItem>Edit</DropdownMenuItem>
                    <DropdownMenuItem>Resend invite</DropdownMenuItem>
                    <DropdownMenuItem>Remove</DropdownMenuItem>
                  </DropdownMenuContent>
                </DropdownMenu>
              </TableCell>
            </TableRow>
          ))}
        </TableBody>
      </Table>
      <Pagination>
        <PaginationContent>
          <PaginationItem><PaginationPrevious href="#" /></PaginationItem>
          <PaginationItem><PaginationLink href="#" isActive>1</PaginationLink></PaginationItem>
          <PaginationItem><PaginationLink href="#">2</PaginationLink></PaginationItem>
          <PaginationItem><PaginationNext href="#" /></PaginationItem>
        </PaginationContent>
      </Pagination>
    </div>
  )
}