BorderedTable

Borders, search, pagination, sortable, row selection (single or multiple + select all).

Tasks

Manage your tasks and progress.

1.Update software55%55%2025-01-05
2.Clean database70%70%2025-01-12
3.Cron job running30%30%2025-01-18
4.Fix bugs90%90%2025-02-01
5.Deploy staging100%100%2025-02-08
6.Run migrations45%45%2025-02-14
7.Sync assets20%20%2025-02-20
8.Backup data80%80%2025-02-22
9.Update dependencies60%60%2025-02-24
10.Refactor module A35%35%2025-02-25
Showing 1–10 of 20

BorderedListTable

List-style table with product rows (image, name, price, action). Toolbar, search, pagination, sort, selection, and row actions like BorderedTable.

Products

List of products with search, sort, and pagination.

Item
Actions

Product 1

Electronics · SKU-10000

$19.99

Product 2

Clothing · SKU-10001

$22.49

Product 3

Home · SKU-10002

$24.99

Product 4

Sports · SKU-10003

$27.49

Product 5

Books · SKU-10004

$29.99

Product 6

Electronics · SKU-10005

$32.49

Product 7

Clothing · SKU-10006

$34.99

Product 8

Home · SKU-10007

$37.49

Product 9

Sports · SKU-10008

$39.99

Product 10

Books · SKU-10009

$42.49
Showing 1–10 of 100

VirtualizedDataTable

Toolbar, sortable columns, Options column, row selection (single or multiple + select all). Windowing: only visible rows rendered.

Virtualized table

50 rows · only visible rows rendered

Options
Gecko
Browser 1
Win
1.0
A
2025-01-01
KHTML
Browser 2
OSX
2.1
B
2025-01-18
Trident
Browser 3
Linux
3.2
C
2025-02-04
Webkit
Browser 4
Win
4.3
A
2025-02-21
Presto
Browser 5
OSX
5.4
B
2025-01-11
Gecko
Browser 6
Linux
6.0
C
2025-01-28
KHTML
Browser 7
Win
7.1
A
2025-02-14
Trident
Browser 8
OSX
8.2
B
2025-01-04
Webkit
Browser 9
Linux
9.3
C
2025-01-21
Presto
Browser 10
Win
10.4
A
2025-02-07
Gecko
Browser 11
OSX
1.0
B
2025-02-24
KHTML
Browser 12
Linux
2.1
C
2025-01-14
Trident
Browser 13
Win
3.2
A
2025-01-31
Webkit
Browser 14
OSX
4.3
B
2025-02-17
Presto
Browser 15
Linux
5.4
C
2025-01-07
Gecko
Browser 16
Win
6.0
A
2025-01-24
KHTML
Browser 17
OSX
7.1
B
2025-02-10
Trident
Browser 18
Linux
8.2
C
2025-02-27
Webkit
Browser 19
Win
9.3
A
2025-01-17
Presto
Browser 20
OSX
10.4
B
2025-02-03
Gecko
Browser 21
Linux
1.0
C
2025-02-20
KHTML
Browser 22
Win
2.1
A
2025-01-10
Trident
Browser 23
OSX
3.2
B
2025-01-27
Webkit
Browser 24
Linux
4.3
C
2025-02-13
50 rows · only visible rows rendered

VirtualizedListView

Virtualized list with toolbar, search, and row selection. Product-style rows: image, name, price, action.

Virtualized list

5000 items · only visible rows rendered

Item

Product 1

Electronics · SKU-10000

$19.99

Product 2

Clothing · SKU-10001

$22.49

Product 3

Home · SKU-10002

$24.99

Product 4

Sports · SKU-10003

$27.49

Product 5

Books · SKU-10004

$29.99

Product 6

Electronics · SKU-10005

$32.49

Product 7

Clothing · SKU-10006

$34.99

Product 8

Home · SKU-10007

$37.49

Product 9

Sports · SKU-10008

$39.99

Product 10

Books · SKU-10009

$42.49

Product 11

Electronics · SKU-10010

$44.99

Product 12

Clothing · SKU-10011

$47.49

Product 13

Home · SKU-10012

$49.99

Product 14

Sports · SKU-10013

$52.49

Product 15

Books · SKU-10014

$54.99

Product 16

Electronics · SKU-10015

$57.49

Product 17

Clothing · SKU-10016

$59.99

Product 18

Home · SKU-10017

$62.49

Product 19

Sports · SKU-10018

$64.99

Product 20

Books · SKU-10019

$67.49

Product 21

Electronics · SKU-10020

$69.99

Product 22

Clothing · SKU-10021

$72.49

Product 23

Home · SKU-10022

$74.99
5000 items · only visible rows rendered

Table Skeleton

Loading placeholder for table.

How to use

BorderedTable, BorderedListTable, VirtualizedDataTable, VirtualizedListView, TableSkeleton. Copy the examples below.

1. Import

tsx
import {
  BorderedTable,
  BorderedListTable,
  VirtualizedDataTable,
  VirtualizedListView,
  TableSkeleton,
  Button,
  IconButton,
} from "@/app/components/ui";
import type {
  TableColumn,
  BorderedTableActionMenuItem,
  BorderedListTableActionMenuItem,
  VirtualizedDataTableActionMenuItem,
} from "@/app/components/ui";

2. BorderedTable

tsx
type TaskRow = { id: number; task: string; progress: number; createdAt: string };

const columns: TableColumn<TaskRow>[] = [
  { id: "task", header: "Task" },
  { id: "progress", header: "Progress", cell: (row) => `${row.progress}%`, sortValue: (row) => row.progress },
  { id: "createdAt", header: "Created" },
];

const actionMenu = (row: TaskRow): BorderedTableActionMenuItem<TaskRow>[] => [
  { label: "Edit", onClick: () => {} },
  { label: "Delete", onClick: () => {}, variant: "danger" },
];

<BorderedTable
  columns={columns}
  data={data}
  getRowKey={(row) => row.id}
  actionColumnMenu={actionMenu}
  fixedHeader
  stripe
  sortable
  selectable
  selectionMode="multiple"
  selectedRowKeys={selectedRowKeys}
  onSelectionChange={setSelectedRowKeys}
  searchKeys={["task"]}
  searchPlaceholder="Search"
  selectionBar={<><span>{selectedRowKeys.length} selected</span><Button onClick={() => setSelectedRowKeys([])}>Clear</Button></>}
/>

3. BorderedListTable

tsx
type ProductRow = { id: number; name: string; category: string; price: string };

const actionMenu = (row: ProductRow): BorderedListTableActionMenuItem<ProductRow>[] => [
  { label: "Edit", onClick: () => {} },
  { label: "Delete", onClick: () => {}, variant: "danger" },
];

<BorderedListTable<ProductRow>
  data={data}
  getRowKey={(row) => row.id}
  renderItem={(row) => (
    <div className="flex items-center gap-3">
      <span>{row.name}</span>
      <span>{row.category}</span>
      <span>${row.price}</span>
    </div>
  )}
  actionColumnMenu={actionMenu}
  searchKeys={["name", "category"]}
  selectable
  selectionMode="multiple"
  selectedRowKeys={selectedRowKeys}
  onSelectionChange={setSelectedRowKeys}
  stripe
/>

4. VirtualizedDataTable

tsx
const columns = [
  { key: "engine", header: "Engine", minWidth: "100px" },
  { key: "browser", header: "Browser", minWidth: "120px" },
  { key: "platform", header: "Platform", minWidth: "80px" },
];

<VirtualizedDataTable
  columns={columns}
  data={data}
  getRowKey={(row) => row.id}
  containerHeight={320}
  title="Virtualized table"
  subtitle="Only visible rows rendered"
  searchKeys={["engine", "browser"]}
  searchPlaceholder="Search"
  sortable
  selectable
  selectionMode="multiple"
  selectedRowKeys={selectedRowKeys}
  onSelectionChange={setSelectedRowKeys}
  actionColumnMenu={(row) => [
    { label: "Edit", onClick: () => {} },
    { label: "Delete", onClick: () => {}, variant: "danger" },
  ]}
/>

5. VirtualizedListView

tsx
type Item = { id: number; name: string; category: string; price: string };

<VirtualizedListView<Item>
  data={data}
  getRowKey={(item) => item.id}
  rowHeight={56}
  containerHeight={400}
  renderItem={(item) => (
    <div className="flex items-center gap-3">
      <span>{item.name}</span>
      <span>{item.category}</span>
      <span>${item.price}</span>
    </div>
  )}
  searchKeys={["name", "category"]}
  selectable
  selectionMode="multiple"
  selectedRowKeys={selectedRowKeys}
  onSelectionChange={setSelectedRowKeys}
/>

6. TableSkeleton

tsx
<TableSkeleton rows={5} cols={4} />