Data components
Show, sort, page and reorder data. Tables expose aria-sort, trees follow the WAI-ARIA tree pattern, and long lists stay fast with virtual scrolling.
11 components on this page. Every demo is live — change the theme in the header or flip a demo to right-to-left with its RTL button. 8 of them are React-only for now; Vue, Svelte and Angular versions are coming.
DataTable Link to DataTable
A sortable table with skeleton loading rows, custom cells and an accessible caption.
| Status | |||
|---|---|---|---|
| OSOmar Saleh | Engineering | 12 | Active |
| YKYousef Karim | Engineering | 9 | Active |
| LHLina Haddad | Design | 7 | Active |
| SNSara Nasser | Product | 4 | Away |
| MFMaya Fares | Design | 3 | Active |
Code
<DataTable
caption="Team members"
rows={members}
loading={isLoading}
columns={[
{ key: 'name', label: 'Name', sortable: true },
{ key: 'projects', label: 'Projects', sortable: true, align: 'end' },
{ key: 'status', label: 'Status', render: (m) => <Badge>{m.status}</Badge> },
]}
/> <DataTable caption="Team members" :rows="members" :loading="isLoading"
:columns="[{ key: 'name', label: 'Name', sortable: true },
{ key: 'projects', label: 'Projects', sortable: true, align: 'end' }]">
<template #cell-name="{ row }"><strong>{{ row.name }}</strong></template>
</DataTable> <DataTable rows={members} loading={isLoading}
columns={[{ key: 'name', label: 'Name', sortable: true },
{ key: 'projects', label: 'Projects', sortable: true, align: 'end' }]} /> <DataTable caption="Team members" rows={members}
sort={{ key: Astro.url.searchParams.get('sort') ?? 'name', direction: 'asc' }}
sortHref="?sort={key}&dir={dir}"
columns={[{ key: 'name', label: 'Name', sortable: true }]} /> <DataTable rows={members} loading={isLoading}
columns={[{ key: 'name', label: 'Name', sortable: true, width: 160 },
{ key: 'projects', label: 'Projects', sortable: true, align: 'end' }]} /> Tree Link to Tree
Hierarchical data with expand/collapse, single, multiple or checkbox selection, filtering and lazy loading.
- src
- components
- App.tsx
- main.tsx
- public
- remote (lazy)
- README.md
Checked: app
Code
ReactComing to Vue, Svelte and Angular.
<Tree label="Project files" selectionMode="checkbox" filter
nodes={[{ key: 'src', label: 'src', children: [{ key: 'app', label: 'App.tsx' }] }]}
selectedKeys={keys} onSelectionChange={setKeys} /> TreeTable Link to TreeTable
A table whose rows expand into child rows, with sortable columns.
| Owner | ||
|---|---|---|
| Engineering | Omar | $420,000 |
| Web platform | Yousef | $180,000 |
| Mobile | Rami | $140,000 |
| Infrastructure | Adam | $100,000 |
| Design | Lina | $160,000 |
| Operations | Sara | $90,000 |
Code
ReactComing to Vue, Svelte and Angular.
<TreeTable caption="Budget" nodes={budget} defaultExpandedKeys={['eng']}
columns={[{ key: 'name', label: 'Team' }, { key: 'cost', label: 'Cost', align: 'end', sortable: true }]} /> DataView Link to DataView
Render items as a list or grid with a layout toggle, sorting and built-in pagination.
- Desk lampHome$4912 in stock
- Wireless keyboardTech$89Sold out
- Notebook setOffice$1540 in stock
- HeadphonesTech$1295 in stock
Code
ReactComing to Vue, Svelte and Angular.
<DataView label="Products" items={products} showLayoutToggle paginator rows={4}
itemTemplate={(p, layout) => <ProductCard product={p} compact={layout === 'list'} />} /> Paginator Link to Paginator
Full paging control with rows-per-page, page report and jump-to-page.
Showing: records 1–10 of 240
Code
ReactComing to Vue, Svelte and Angular.
<Paginator totalRecords={240} rows={rows} first={first}
rowsPerPageOptions={[10, 20, 50]} showCurrentPageReport showJumpToPage
onPageChange={(s) => { setFirst(s.first); setRows(s.rows); }} /> Pagination Link to Pagination
A compact page switcher with ellipsis for long ranges.
Page: 5
Code
<Pagination value={page} pageCount={12} onChange={setPage} /> <Pagination v-model="page" :page-count="12" /> <Pagination bind:value={page} pageCount={12} /> <Pagination page={5} pageCount={12} href="?page={page}" /> <Pagination value={page} pageCount={12} onChange={setPage} /> VirtualScroller Link to VirtualScroller
Renders only the visible rows of very long lists, with optional lazy loading.
10,000 rows — only the visible ones are in the DOM.
00001 · GET /api/items/0 — 20000002 · GET /api/items/919 — 30000003 · GET /api/items/838 — 40000004 · GET /api/items/757 — 20000005 · GET /api/items/676 — 30000006 · GET /api/items/595 — 40000007 · GET /api/items/514 — 20000008 · GET /api/items/433 — 30000009 · GET /api/items/352 — 40000010 · GET /api/items/271 — 20000011 · GET /api/items/190 — 300Code
ReactComing to Vue, Svelte and Angular.
<VirtualScroller label="Log lines" items={lines} itemSize={36} height={280}
itemTemplate={(line, i) => <span>{i + 1}. {line}</span>} /> OrderList Link to OrderList
Reorder a list with buttons or the keyboard.
- Fix login bug
- Ship dark mode
- Write release notes
- Update dependencies
- Plan Q3 roadmap
Use Alt with arrow keys, Home or End to move the selected item.
Order: Fix login bug → Ship dark mode → Write release notes → Update dependencies → Plan Q3 roadmap
Code
ReactComing to Vue, Svelte and Angular.
<OrderList header="Priorities" value={items} onChange={setItems}
getKey={(i) => i.id} getLabel={(i) => i.name} /> PickList Link to PickList
Move items between two lists — available and selected.
- Lina
- Omar
- Sara
- Yousef
- Maya
- Adam
- Noor
Team: Noor
Code
ReactComing to Vue, Svelte and Angular.
<PickList value={lists} onChange={setLists} getKey={(p) => p.id} getLabel={(p) => p.name}
sourceHeader="Available" targetHeader="On the team" /> OrganizationChart Link to OrganizationChart
A top-down tree for org charts and hierarchies, with selection and collapsing.
Selected: none
Code
ReactComing to Vue, Svelte and Angular.
<OrganizationChart label="Company structure" collapsible selectionMode="single"
value={{ key: 'ceo', label: 'CEO', children: [{ key: 'cto', label: 'CTO' }, { key: 'cfo', label: 'CFO' }] }} /> Timeline Link to Timeline
Events in vertical, horizontal or alternating layouts, with status markers, icons or avatars, relative times, date groups, expandable details and a progress connector.
The rich options (layouts, dates, details) are React-only for now; other frameworks render the classic vertical timeline.
Yesterday
- (Oct 15, 2026, 6:12 PM)Order placed (completed)3 items · $128.00
- (Oct 15, 2026, 7:12 PM)Payment confirmed (completed)
Today
- (Oct 16, 2026, 6:12 PM)Lina Haddad: Shipped from Amman (current)Packed by Lina
Carrier: Aramex · Tracking 1Z 999 AA1 0123 4567
- Out for delivery
Code
<Timeline relative groupBy="day" items={[
{ title: 'Order placed', date: placedAt, status: 'complete', icon: <CartIcon /> },
{ title: 'Shipped', date: shippedAt, status: 'current', details: <Tracking id="1Z999" /> },
{ title: 'Delivered', status: 'upcoming' },
]} /> <Timeline :items="events" /> <Timeline items={events} /> <Timeline items={events} /> <Timeline items={events} />