Arcana UI
Components

Table

Semantic HTML table with sortable columns, striped rows, hover states, and caption support.

Import

import { Table, TableHead, TableBody, TableRow, TableCell, TableHeader } from '@arcana-ui/core'

Usage

<Table caption="Team members">
  <TableHead>
    <TableRow>
      <TableHeader>Name</TableHeader>
      <TableHeader>Role</TableHeader>
      <TableHeader>Status</TableHeader>
    </TableRow>
  </TableHead>
  <TableBody>
    <TableRow>
      <TableCell>Alice Johnson</TableCell>
      <TableCell>Engineer</TableCell>
      <TableCell><Badge variant="success">Active</Badge></TableCell>
    </TableRow>
    <TableRow>
      <TableCell>Bob Chen</TableCell>
      <TableCell>Designer</TableCell>
      <TableCell><Badge variant="warning">Away</Badge></TableCell>
    </TableRow>
  </TableBody>
</Table>

Sortable columns

<Table>
  <TableHead>
    <TableRow>
      <TableHeader
        sortable
        sortDirection={sort.column === 'name' ? sort.direction : undefined}
        onSort={() => handleSort('name')}
      >
        Name
      </TableHeader>
      <TableHeader
        sortable
        sortDirection={sort.column === 'date' ? sort.direction : undefined}
        onSort={() => handleSort('date')}
      >
        Date
      </TableHeader>
    </TableRow>
  </TableHead>
  ...
</Table>

Table Props

PropTypeDefaultDescription
captionstring<caption> text for screen readers
stripedbooleanfalseAlternating row background colours
hoverablebooleanfalseHighlight row on hover
stickyHeaderbooleanfalsePin header row while scrolling
classNamestringAdditional CSS classes

TableHeader Props

PropTypeDefaultDescription
sortablebooleanfalseShow sort indicator
sortDirection'asc' | 'desc' | undefinedCurrent sort direction
onSort() => voidCalled when header is clicked to sort
align'left' | 'center' | 'right''left'Text alignment

TableCell Props

PropTypeDefaultDescription
align'left' | 'center' | 'right''left'Text alignment
colSpannumberSpan multiple columns

Responsive

Wrap in a scroll container for small screens:

<div style={{ overflowX: 'auto' }}>
  <Table>...</Table>
</div>

Empty state

<Table>
  <TableHead>...</TableHead>
  <TableBody>
    {data.length === 0 ? (
      <TableRow>
        <TableCell colSpan={3}>
          <EmptyState title="No records" description="No data to display." />
        </TableCell>
      </TableRow>
    ) : (
      data.map((row) => ...)
    )}
  </TableBody>
</Table>

Accessibility

  • Semantic <table>, <thead>, <tbody>, <th>, <td> elements
  • caption renders a <caption> for screen reader context
  • Sortable headers have aria-sort attribute (ascending / descending)
  • scope="col" on all <th> elements

On this page