Components/Table

UI component

Table

Full-featured data table with 10 composable exports. Toolbar with search, filter pills, and CTA. Three header variants. Sort indicators. Row selection. Pagination with ellipsis. Empty and skeleton states.

10 exportsSort + select3 head variantsPaginationEmpty + skeleton
components/ui/Table.jsx
Full composition — interactive
Sort columns · filter pills · pagination
Campaigns8
NameStatusRevenueDate
SLAB Studioactive$12,4002025-06-12
Neon Dropdraft2025-06-08
Black Tapeactive$3,2002025-06-01
Signalactive$28,9002025-05-29
LOUD Typedraft2025-05-15
1–5 of 8
Header variants
variant="lime" · variant="dark" · variant="paper"
NameStatus
SLAB StudioActive
Neon DropDraft
NameStatus
Black TapePaused
SignalActive
NameStatus
LOUD TypeEnded
Grid OverrideActive
Special states
TableEmpty · TableSkeleton
NameStatus
No resultsClear filters to see all rows
NameStatusRevenue
10 Exports
All sub-components — one reference each
Table shell
Outer border + shadow
Orders8
lime
dark
paper
Name
Row A
Row B
Row C
Name
Selected row
Normal row
Asc ↑Desc ↓Idle ↕
monomutednormal
$28,9002025-06-12SLAB Studio
11–20 of 50
NameStatus
No campaigns yetCreate your first campaign
NameStatusRevenue
Props
PropTypeDefaultDescription
TableComponentOuter shell — border, shadow, overflow. Hoists Toolbar + Pagination automatically.
TableToolbarComponenttitle, count chip, search input, filter pills, CTA button.
TableHeadComponent<thead> with color variant: "lime" | "dark" | "paper".
TableBodyComponent<tbody> with optional zebra rows via striped prop.
TableRowComponent<tr> with hover, selected, clickable states.
TableThComponent<th> with sort chevron. sortDir: "asc"|"desc"|null + onSort.
TableTdComponent<td> with content helpers: mono, muted, dense, align.
TablePaginationComponentSmart page buttons with ellipsis collapse. total, page, perPage, onPage.
TableEmptyComponentDashed empty-state with glyph, message, hint, optional CTA action.
TableSkeletonComponentShimmer-loading skeleton rows. rows, cols props.
Usage
import { Table, TableToolbar, TableHead, TableBody,
         TableRow, TableTh, TableTd, TablePagination,
         TableEmpty, TableSkeleton } from "components/ui/Table";

<Table>
  <TableToolbar
    title="Campaigns" count={total} search
    filters={[{ label: "Active", value: "active" }]}
    action={{ label: "New", onClick: openNew }}
  />
  <TableHead variant="lime">
    <TableRow>
      <TableTh sortDir="asc" onSort={toggleSort}>Name</TableTh>
      <TableTh>Status</TableTh>
    </TableRow>
  </TableHead>
  {isLoading ? (
    <TableSkeleton rows={5} cols={3} />
  ) : rows.length === 0 ? (
    <TableEmpty message="No campaigns yet" />
  ) : (
    <TableBody striped>
      {rows.map(r => (
        <TableRow key={r.id} onClick={() => open(r)}>
          <TableTd>{r.name}</TableTd>
          <TableTd><Badge>{r.status}</Badge></TableTd>
        </TableRow>
      ))}
    </TableBody>
  )}
  <TablePagination total={total} page={page} onPage={setPage} />
</Table>