Table

A styled table for displaying rows of data.

Default

NameEmailRole
Jane Cooperjane@example.comAdmin
Cody Fishercody@example.comMember
Esther Howardesther@example.comMember

tsx

import {
  Table,
  TableHeader,
  TableBody,
  TableRow,
  TableHead,
  TableCell,
} from "@hummingbirdui/react";

export default function TableDefault() {
  return (
    <Table>
      <TableHeader>
        <TableRow>
          <TableHead>Name</TableHead>
          <TableHead>Email</TableHead>
          <TableHead>Role</TableHead>
        </TableRow>
      </TableHeader>
      <TableBody>
        <TableRow>
          <TableCell>Jane Cooper</TableCell>
          <TableCell>jane@example.com</TableCell>
          <TableCell>Admin</TableCell>
        </TableRow>
        <TableRow>
          <TableCell>Cody Fisher</TableCell>
          <TableCell>cody@example.com</TableCell>
          <TableCell>Member</TableCell>
        </TableRow>
        <TableRow>
          <TableCell>Esther Howard</TableCell>
          <TableCell>esther@example.com</TableCell>
          <TableCell>Member</TableCell>
        </TableRow>
      </TableBody>
    </Table>
  );
}

Striped

The striped prop applies a zebra background to alternating rows.

NameEmailRole
Jane Cooperjane@example.comAdmin
Cody Fishercody@example.comMember
Esther Howardesther@example.comMember

tsx

import {
  Table,
  TableHeader,
  TableBody,
  TableRow,
  TableHead,
  TableCell,
} from "@hummingbirdui/react";

export default function TableStriped() {
  return (
    <Table striped>
      <TableHeader>
        <TableRow>
          <TableHead>Name</TableHead>
          <TableHead>Email</TableHead>
          <TableHead>Role</TableHead>
        </TableRow>
      </TableHeader>
      <TableBody>
        <TableRow>
          <TableCell>Jane Cooper</TableCell>
          <TableCell>jane@example.com</TableCell>
          <TableCell>Admin</TableCell>
        </TableRow>
        <TableRow>
          <TableCell>Cody Fisher</TableCell>
          <TableCell>cody@example.com</TableCell>
          <TableCell>Member</TableCell>
        </TableRow>
        <TableRow>
          <TableCell>Esther Howard</TableCell>
          <TableCell>esther@example.com</TableCell>
          <TableCell>Member</TableCell>
        </TableRow>
      </TableBody>
    </Table>
  );
}

Striped columns

The stripedColumns prop applies a zebra background to alternating columns.

NameEmailRole
Jane Cooperjane@example.comAdmin
Cody Fishercody@example.comMember

tsx

import {
  Table,
  TableHeader,
  TableBody,
  TableRow,
  TableHead,
  TableCell,
} from "@hummingbirdui/react";

export default function TableStripedColumns() {
  return (
    <Table stripedColumns>
      <TableHeader>
        <TableRow>
          <TableHead>Name</TableHead>
          <TableHead>Email</TableHead>
          <TableHead>Role</TableHead>
        </TableRow>
      </TableHeader>
      <TableBody>
        <TableRow>
          <TableCell>Jane Cooper</TableCell>
          <TableCell>jane@example.com</TableCell>
          <TableCell>Admin</TableCell>
        </TableRow>
        <TableRow>
          <TableCell>Cody Fisher</TableCell>
          <TableCell>cody@example.com</TableCell>
          <TableCell>Member</TableCell>
        </TableRow>
      </TableBody>
    </Table>
  );
}

Hover

The hover prop highlights the row under the pointer.

NameEmailRole
Jane Cooperjane@example.comAdmin
Cody Fishercody@example.comMember
Esther Howardesther@example.comMember

tsx

import {
  Table,
  TableHeader,
  TableBody,
  TableRow,
  TableHead,
  TableCell,
} from "@hummingbirdui/react";

export default function TableHover() {
  return (
    <Table hover>
      <TableHeader>
        <TableRow>
          <TableHead>Name</TableHead>
          <TableHead>Email</TableHead>
          <TableHead>Role</TableHead>
        </TableRow>
      </TableHeader>
      <TableBody>
        <TableRow>
          <TableCell>Jane Cooper</TableCell>
          <TableCell>jane@example.com</TableCell>
          <TableCell>Admin</TableCell>
        </TableRow>
        <TableRow>
          <TableCell>Cody Fisher</TableCell>
          <TableCell>cody@example.com</TableCell>
          <TableCell>Member</TableCell>
        </TableRow>
        <TableRow>
          <TableCell>Esther Howard</TableCell>
          <TableCell>esther@example.com</TableCell>
          <TableCell>Member</TableCell>
        </TableRow>
      </TableBody>
    </Table>
  );
}

Bordered

The bordered prop adds borders around every cell.

NameEmailRole
Jane Cooperjane@example.comAdmin
Cody Fishercody@example.comMember

tsx

import {
  Table,
  TableHeader,
  TableBody,
  TableRow,
  TableHead,
  TableCell,
} from "@hummingbirdui/react";

export default function TableBordered() {
  return (
    <Table bordered>
      <TableHeader>
        <TableRow>
          <TableHead>Name</TableHead>
          <TableHead>Email</TableHead>
          <TableHead>Role</TableHead>
        </TableRow>
      </TableHeader>
      <TableBody>
        <TableRow>
          <TableCell>Jane Cooper</TableCell>
          <TableCell>jane@example.com</TableCell>
          <TableCell>Admin</TableCell>
        </TableRow>
        <TableRow>
          <TableCell>Cody Fisher</TableCell>
          <TableCell>cody@example.com</TableCell>
          <TableCell>Member</TableCell>
        </TableRow>
      </TableBody>
    </Table>
  );
}

Borderless

The borderless prop removes the default row borders.

NameEmailRole
Jane Cooperjane@example.comAdmin
Cody Fishercody@example.comMember

tsx

import {
  Table,
  TableHeader,
  TableBody,
  TableRow,
  TableHead,
  TableCell,
} from "@hummingbirdui/react";

export default function TableBorderless() {
  return (
    <Table borderless>
      <TableHeader>
        <TableRow>
          <TableHead>Name</TableHead>
          <TableHead>Email</TableHead>
          <TableHead>Role</TableHead>
        </TableRow>
      </TableHeader>
      <TableBody>
        <TableRow>
          <TableCell>Jane Cooper</TableCell>
          <TableCell>jane@example.com</TableCell>
          <TableCell>Admin</TableCell>
        </TableRow>
        <TableRow>
          <TableCell>Cody Fisher</TableCell>
          <TableCell>cody@example.com</TableCell>
          <TableCell>Member</TableCell>
        </TableRow>
      </TableBody>
    </Table>
  );
}

Sizes

The size prop offers two densities: md (default) and sm.

NameRole
Jane CooperAdmin
Cody FisherMember
NameRole
Jane CooperAdmin
Cody FisherMember

tsx

import {
  Table,
  TableHeader,
  TableBody,
  TableRow,
  TableHead,
  TableCell,
} from "@hummingbirdui/react";

export default function TableSizes() {
  return (
    <div className="flex flex-col gap-6">
      <Table size="md">
        <TableHeader>
          <TableRow>
            <TableHead>Name</TableHead>
            <TableHead>Role</TableHead>
          </TableRow>
        </TableHeader>
        <TableBody>
          <TableRow>
            <TableCell>Jane Cooper</TableCell>
            <TableCell>Admin</TableCell>
          </TableRow>
          <TableRow>
            <TableCell>Cody Fisher</TableCell>
            <TableCell>Member</TableCell>
          </TableRow>
        </TableBody>
      </Table>
      <Table size="sm">
        <TableHeader>
          <TableRow>
            <TableHead>Name</TableHead>
            <TableHead>Role</TableHead>
          </TableRow>
        </TableHeader>
        <TableBody>
          <TableRow>
            <TableCell>Jane Cooper</TableCell>
            <TableCell>Admin</TableCell>
          </TableRow>
          <TableRow>
            <TableCell>Cody Fisher</TableCell>
            <TableCell>Member</TableCell>
          </TableRow>
        </TableBody>
      </Table>
    </div>
  );
}

Colors

The color prop tints the whole table with neutral, primary, secondary, info, success, warning, or danger.

ColorStatus
neutralActive
ColorStatus
primaryActive
ColorStatus
secondaryActive
ColorStatus
infoActive
ColorStatus
successActive
ColorStatus
warningActive
ColorStatus
dangerActive

tsx

import {
  Table,
  TableHeader,
  TableBody,
  TableRow,
  TableHead,
  TableCell,
} from "@hummingbirdui/react";

const colors = [
  "neutral",
  "primary",
  "secondary",
  "info",
  "success",
  "warning",
  "danger",
] as const;

export default function TableColors() {
  return (
    <div className="flex flex-col gap-6">
      {colors.map((color) => (
        <Table key={color} color={color}>
          <TableHeader>
            <TableRow>
              <TableHead>Color</TableHead>
              <TableHead>Status</TableHead>
            </TableRow>
          </TableHeader>
          <TableBody>
            <TableRow>
              <TableCell>{color}</TableCell>
              <TableCell>Active</TableCell>
            </TableRow>
          </TableBody>
        </Table>
      ))}
    </div>
  );
}

Active

The active prop on TableRow or TableCell highlights a single row or cell.

NameStatus
Jane CooperActive
Cody FisherHighlighted row
Esther HowardHighlighted cell

tsx

import {
  Table,
  TableHeader,
  TableBody,
  TableRow,
  TableHead,
  TableCell,
} from "@hummingbirdui/react";

export default function TableActive() {
  return (
    <Table>
      <TableHeader>
        <TableRow>
          <TableHead>Name</TableHead>
          <TableHead>Status</TableHead>
        </TableRow>
      </TableHeader>
      <TableBody>
        <TableRow>
          <TableCell>Jane Cooper</TableCell>
          <TableCell>Active</TableCell>
        </TableRow>
        <TableRow active>
          <TableCell>Cody Fisher</TableCell>
          <TableCell>Highlighted row</TableCell>
        </TableRow>
        <TableRow>
          <TableCell>Esther Howard</TableCell>
          <TableCell active>Highlighted cell</TableCell>
        </TableRow>
      </TableBody>
    </Table>
  );
}

Highlight

The highlight prop emphasizes the table with a stronger surface treatment.

NameEmailRole
Jane Cooperjane@example.comAdmin
Cody Fishercody@example.comMember

tsx

import {
  Table,
  TableHeader,
  TableBody,
  TableRow,
  TableHead,
  TableCell,
} from "@hummingbirdui/react";

export default function TableHighlight() {
  return (
    <Table highlight>
      <TableHeader>
        <TableRow>
          <TableHead>Name</TableHead>
          <TableHead>Email</TableHead>
          <TableHead>Role</TableHead>
        </TableRow>
      </TableHeader>
      <TableBody>
        <TableRow>
          <TableCell>Jane Cooper</TableCell>
          <TableCell>jane@example.com</TableCell>
          <TableCell>Admin</TableCell>
        </TableRow>
        <TableRow>
          <TableCell>Cody Fisher</TableCell>
          <TableCell>cody@example.com</TableCell>
          <TableCell>Member</TableCell>
        </TableRow>
      </TableBody>
    </Table>
  );
}

The stickyHeader prop pins the header to the top while the body scrolls.

NameRole
Person 1Member
Person 2Member
Person 3Member
Person 4Member
Person 5Member
Person 6Member
Person 7Member
Person 8Member
Person 9Member
Person 10Member
Person 11Member
Person 12Member

tsx

import {
  Table,
  TableHeader,
  TableBody,
  TableRow,
  TableHead,
  TableCell,
} from "@hummingbirdui/react";

export default function TableStickyHeader() {
  return (
    <div className="max-h-48 overflow-y-auto">
      <Table stickyHeader highlight>
        <TableHeader>
          <TableRow>
            <TableHead>Name</TableHead>
            <TableHead>Role</TableHead>
          </TableRow>
        </TableHeader>
        <TableBody>
          {Array.from({ length: 12 }).map((_, i) => (
            <TableRow key={i}>
              <TableCell>Person {i + 1}</TableCell>
              <TableCell>Member</TableCell>
            </TableRow>
          ))}
        </TableBody>
      </Table>
    </div>
  );
}

Caption

TableCaption renders a caption above the table.

A list of recent team members.
NameRole
Jane CooperAdmin
Cody FisherMember

tsx

import {
  Table,
  TableCaption,
  TableHeader,
  TableBody,
  TableRow,
  TableHead,
  TableCell,
} from "@hummingbirdui/react";

export default function TableCaptionExample() {
  return (
    <Table>
      <TableCaption>A list of recent team members.</TableCaption>
      <TableHeader>
        <TableRow>
          <TableHead>Name</TableHead>
          <TableHead>Role</TableHead>
        </TableRow>
      </TableHeader>
      <TableBody>
        <TableRow>
          <TableCell>Jane Cooper</TableCell>
          <TableCell>Admin</TableCell>
        </TableRow>
        <TableRow>
          <TableCell>Cody Fisher</TableCell>
          <TableCell>Member</TableCell>
        </TableRow>
      </TableBody>
    </Table>
  );
}

TableFooter renders a summary row group at the bottom of the table.

ItemAmount
Widget$12.00
Gadget$8.00
Total$20.00

tsx

import {
  Table,
  TableHeader,
  TableBody,
  TableFooter,
  TableRow,
  TableHead,
  TableCell,
} from "@hummingbirdui/react";

export default function TableFooterExample() {
  return (
    <Table>
      <TableHeader>
        <TableRow>
          <TableHead>Item</TableHead>
          <TableHead>Amount</TableHead>
        </TableRow>
      </TableHeader>
      <TableBody>
        <TableRow>
          <TableCell>Widget</TableCell>
          <TableCell>$12.00</TableCell>
        </TableRow>
        <TableRow>
          <TableCell>Gadget</TableCell>
          <TableCell>$8.00</TableCell>
        </TableRow>
      </TableBody>
      <TableFooter>
        <TableRow>
          <TableCell>Total</TableCell>
          <TableCell>$20.00</TableCell>
        </TableRow>
      </TableFooter>
    </Table>
  );
}

API Reference

Table

PropTypeDefaultDescription
size"md" | "sm""md"Row density of the table.
color"default" | "neutral" | "primary" | "secondary" | "info" | "success" | "warning" | "danger""default"Color theme of the table.
stripedbooleanfalseApply a zebra background to alternating rows.
stripedColumnsbooleanfalseApply a zebra background to alternating columns.
borderedbooleanfalseAdd borders around every cell.
borderlessbooleanfalseRemove the default row borders.
hoverbooleanfalseHighlight the row under the pointer.
highlightbooleanfalseEmphasize the table with a stronger surface treatment.
stickyHeaderbooleanfalsePin the header to the top while the body scrolls.
activebooleanfalseHighlight the entire table.
asChildbooleanfalseRender as a child element instead of the default.
classNamestring—Additional classes merged with the generated classes.

TableRow

PropTypeDefaultDescription
activebooleanfalseHighlight the row.
classNamestring—Additional classes merged with the generated classes.

TableCell

PropTypeDefaultDescription
activebooleanfalseHighlight the cell.
classNamestring—Additional classes merged with the generated classes.

TableHeader, TableBody, TableFooter, TableHead, and TableCaption render their native table elements and accept only className alongside their standard element props.

Styling

Hummingbird React table is styled entirely through Hummingbird's utility classes and CSS variables.

  • See the full list of available table classes in the Class overview.
  • Visit the CSS Variables documentation to explore all available variables.