Skip to content

Components · 5

Tables

Rows and columns of records: sort them, act on several at once, open one for detail, or pack them tight. Rows move rather than jump, so you never lose your place.

Data table

Sortable records. Click a column header and the rows glide to their new places.

Tenants and rent status
JDJohn Doe4B₹24,0001 NovPaid
JSJane Smith2A₹18,5005 OctOverdue
AJAlex Johnson7C₹32,0001 NovPending
SLSam Lee1D₹15,00028 OctPending
CBChris Brown5A₹27,5001 NovPaid
  • Row reorder: layout 300ms ease-out
  • Sort arrow flips 200ms
  • Row hover 150ms
import { DataTable, type Column } from "@/components/ui/data-table";

Selectable table

Tick rows to act on several at once. The bulk bar covers the header, so the rows never move.

Tenants, with bulk actions
TenantUnitRentDueStatus
JDJohn Doe4B₹24,0001 NovPaid
JSJane Smith2A₹18,5005 OctOverdue
AJAlex Johnson7C₹32,0001 NovPending
SLSam Lee1D₹15,00028 OctPending
CBChris Brown5A₹27,5001 NovPaid
  • Tick draws 300ms
  • Bar in 200ms ease-out, out 150ms ease-in
  • Row tint 150ms
import { SelectableTable } from "@/components/ui/selectable-table";

Expandable table

Open a row to see its lease, deposit and recent payments without leaving the list.

Tenants with lease details
DetailsTenantUnitRentStatus
JDJohn Doe4B₹24,000Paid
JSJane Smith2A₹18,500Overdue
AJAlex Johnson7C₹32,000Pending
SLSam Lee1D₹15,000Pending
CBChris Brown5A₹27,500Paid
  • Chevron turns 90° 200ms
  • Detail grows 300ms ease-out
  • Closes 200ms ease-in
import { ExpandableTable } from "@/components/ui/expandable-table";

Compact table

Tighter rows with alternating backgrounds, for long lists like a ledger. Still sortable.

October ledger
1 OctRent · October4B+₹24,000
1 OctRent · October5A+₹27,500
3 OctPlumbing repair2A−₹3,200
4 OctRent · October1D+₹15,000
7 OctSociety maintenanceAll−₹18,000
9 OctRent · October7C+₹32,000
12 OctLift servicingAll−₹6,500
15 OctLate fee7C+₹500
18 OctPainting · 2A2A−₹11,000
  • Row reorder: layout 300ms ease-out
  • Row hover 150ms
<DataTable density="compact" striped … />

Table states

Placeholder rows while data loads, and an empty state with a next step. Switch between them.

Tenants and rent status
  • Loading rows shimmer 1.4s
  • Empty illustration floats 3.2s
<DataTable loading={isLoading} empty={<EmptyState … />} … />