Table
A responsive table component.
| Invoice | Status | Method | Amount |
|---|---|---|---|
| INV001 | Paid | Credit Card | $250.00 |
| INV002 | Pending | PayPal | $150.00 |
| INV003 | Unpaid | Bank Transfer | $350.00 |
| INV004 | Paid | Credit Card | $450.00 |
| INV005 | Paid | PayPal | $550.00 |
| INV006 | Pending | Bank Transfer | $200.00 |
| INV007 | Unpaid | Credit Card | $300.00 |
| Total | $2,500.00 | ||
import { For } from "solid-js";import { Table, TableBody, TableCaption, TableCell, TableFooter, TableHead, TableHeader, TableRow,} from "~/components/ui/table";
const invoices = [ { invoice: "INV001", paymentStatus: "Paid", totalAmount: "$250.00", paymentMethod: "Credit Card", }, { invoice: "INV002", paymentStatus: "Pending", totalAmount: "$150.00", paymentMethod: "PayPal" }, { invoice: "INV003", paymentStatus: "Unpaid", totalAmount: "$350.00", paymentMethod: "Bank Transfer", }, { invoice: "INV004", paymentStatus: "Paid", totalAmount: "$450.00", paymentMethod: "Credit Card", }, { invoice: "INV005", paymentStatus: "Paid", totalAmount: "$550.00", paymentMethod: "PayPal" }, { invoice: "INV006", paymentStatus: "Pending", totalAmount: "$200.00", paymentMethod: "Bank Transfer", }, { invoice: "INV007", paymentStatus: "Unpaid", totalAmount: "$300.00", paymentMethod: "Credit Card", },];
export default function TableDemo() { return ( <Table> <TableCaption>A list of your recent invoices.</TableCaption> <TableHeader> <TableRow> <TableHead class="w-[100px]">Invoice</TableHead> <TableHead>Status</TableHead> <TableHead>Method</TableHead> <TableHead class="text-right">Amount</TableHead> </TableRow> </TableHeader> <TableBody> <For each={invoices}> {(invoice) => ( <TableRow> <TableCell class="font-medium">{invoice.invoice}</TableCell> <TableCell>{invoice.paymentStatus}</TableCell> <TableCell>{invoice.paymentMethod}</TableCell> <TableCell class="text-right">{invoice.totalAmount}</TableCell> </TableRow> )} </For> </TableBody> <TableFooter> <TableRow> <TableCell colSpan={3}>Total</TableCell> <TableCell class="text-right">$2,500.00</TableCell> </TableRow> </TableFooter> </Table> );}Installation
Usage
import { Table, TableBody, TableCaption, TableCell, TableHead, TableHeader, TableRow,} from "~/components/ui/table";<Table> <TableCaption>A list of your recent invoices.</TableCaption> <TableHeader> <TableRow> <TableHead class="w-[100px]">Invoice</TableHead> <TableHead>Status</TableHead> <TableHead>Method</TableHead> <TableHead class="text-right">Amount</TableHead> </TableRow> </TableHeader> <TableBody> <TableRow> <TableCell class="font-medium">INV001</TableCell> <TableCell>Paid</TableCell> <TableCell>Credit Card</TableCell> <TableCell class="text-right">$250.00</TableCell> </TableRow> </TableBody></Table>Composition
Use the following composition to build a Table:
Table├── TableCaption├── TableHeader│ └── TableRow│ ├── TableHead│ ├── TableHead│ ├── TableHead│ └── TableHead├── TableBody│ ├── TableRow│ │ ├── TableCell│ │ ├── TableCell│ │ ├── TableCell│ │ └── TableCell│ └── TableRow│ ├── TableCell│ ├── TableCell│ ├── TableCell│ └── TableCell└── TableFooterFooter
Use the <TableFooter /> component to add a footer to the table.
| Invoice | Status | Method | Amount |
|---|---|---|---|
| INV001 | Paid | Credit Card | $250.00 |
| INV002 | Pending | PayPal | $150.00 |
| INV003 | Unpaid | Bank Transfer | $350.00 |
| Total | $2,500.00 | ||
import { For } from "solid-js";import { Table, TableBody, TableCaption, TableCell, TableFooter, TableHead, TableHeader, TableRow,} from "~/components/ui/table";
const invoices = [ { invoice: "INV001", paymentStatus: "Paid", totalAmount: "$250.00", paymentMethod: "Credit Card", }, { invoice: "INV002", paymentStatus: "Pending", totalAmount: "$150.00", paymentMethod: "PayPal" }, { invoice: "INV003", paymentStatus: "Unpaid", totalAmount: "$350.00", paymentMethod: "Bank Transfer", },];
export default function TableFooterExample() { return ( <Table> <TableCaption>A list of your recent invoices.</TableCaption> <TableHeader> <TableRow> <TableHead class="w-[100px]">Invoice</TableHead> <TableHead>Status</TableHead> <TableHead>Method</TableHead> <TableHead class="text-right">Amount</TableHead> </TableRow> </TableHeader> <TableBody> <For each={invoices}> {(invoice) => ( <TableRow> <TableCell class="font-medium">{invoice.invoice}</TableCell> <TableCell>{invoice.paymentStatus}</TableCell> <TableCell>{invoice.paymentMethod}</TableCell> <TableCell class="text-right">{invoice.totalAmount}</TableCell> </TableRow> )} </For> </TableBody> <TableFooter> <TableRow> <TableCell colSpan={3}>Total</TableCell> <TableCell class="text-right">$2,500.00</TableCell> </TableRow> </TableFooter> </Table> );}Actions
A table showing actions for each row using a <DropdownMenu /> component.
| Product | Price | Actions |
|---|---|---|
| Wireless Mouse | $29.99 | |
| Mechanical Keyboard | $129.99 | |
| USB-C Hub | $49.99 |
import { MoreHorizontalIcon } from "lucide-solid";import { For } from "solid-js";import { Button } from "~/components/ui/button";import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuSeparator, DropdownMenuTrigger,} from "~/components/ui/dropdown-menu";import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow,} from "~/components/ui/table";
const products = [ { name: "Wireless Mouse", price: "$29.99" }, { name: "Mechanical Keyboard", price: "$129.99" }, { name: "USB-C Hub", price: "$49.99" },];
export default function TableActions() { return ( <Table> <TableHeader> <TableRow> <TableHead>Product</TableHead> <TableHead>Price</TableHead> <TableHead class="text-right">Actions</TableHead> </TableRow> </TableHeader> <TableBody> <For each={products}> {(product) => ( <TableRow> <TableCell class="font-medium">{product.name}</TableCell> <TableCell>{product.price}</TableCell> <TableCell class="text-right"> <DropdownMenu placement="bottom-end"> <DropdownMenuTrigger as={Button} variant="ghost" size="icon" class="size-8" aria-label={`Open actions for ${product.name}`} > <MoreHorizontalIcon /> </DropdownMenuTrigger> <DropdownMenuContent> <DropdownMenuItem>Edit</DropdownMenuItem> <DropdownMenuItem>Duplicate</DropdownMenuItem> <DropdownMenuSeparator /> <DropdownMenuItem variant="destructive">Delete</DropdownMenuItem> </DropdownMenuContent> </DropdownMenu> </TableCell> </TableRow> )} </For> </TableBody> </Table> );}Data Table
You can use the <Table /> component to build more complex data tables. Combine it with @tanstack/solid-table to create tables with sorting, filtering, and pagination.
API Reference
Table
A responsive native <table> wrapped in a scrollable container. It forwards standard table attributes.
TableCaption
A native <caption> that describes the table.
TableHeader and TableBody
Native <thead> and <tbody> sections.
TableFooter
A native <tfoot> for summary rows.
TableRow
A native <tr> row.
TableHead and TableCell
Native <th> and <td> cells.