Tables
Tables display large datasets in a structured format. We use high-fidelity patterns for subscriptions, transactions, and data management.
Full Dashboard Template
Subscription Table Pattern
The standard Recura subscription list featuring tab-based filtering and the Action Reveal header system.
Subscription List
| Customer | Plan | Status | Billing Cycle | Actions | |
|---|---|---|---|---|---|
| Mark Luck | Enterprise Corp | Active | $299.00/mo | ||
| Sarah Johnson | Trial Plan | Trial | $0.00/mo | ||
| Michael Brown | Basic Plan | Paused | $99.00/mo |
<div className="dashboard-card p-0 overflow-hidden">
<div className="p-8 pb-4">
<div className="flex justify-between items-center mb-8">
<h3 className="text-xl font-extrabold tracking-tight">Subscription List</h3>
<div className="flex items-center gap-3">
<ActionRevealToggle show={showActions} onToggle={() => setShowActions(!showActions)} />
<div className={cn("flex gap-3 transition-all origin-right", !showActions && "w-0 opacity-0")}>
<button className="dashboard-action-btn-secondary">Print</button>
<button className="dashboard-action-btn-primary">Export</button>
</div>
</div>
</div>
<div className="flex gap-2 overflow-x-auto">
{tabs.map(tab => <TabButton active={tab === active} />)}
</div>
</div>
<table className="w-full">
{/* Standard table structure */}
</table>
<div className="p-8 border-t flex justify-center">
<div className="flex items-center gap-2">
<button className="pagination-btn"><ChevronLeft className="w-4 h-4" /> Back</button>
<button className="pagination-page-btn-active">1</button>
<button className="pagination-page-btn">2</button>
<button className="pagination-btn">Next <ChevronRight className="w-4 h-4" /></button>
</div>
</div>
</div>Transaction History Pattern
Recent Transactions
A simplified transaction list with high-contrast status badges for payment flows.
Recent Transactions
Track and manage customer payments
| Customer | Amount | Status | Action |
|---|---|---|---|
A Alex Johnson | $124.00 | Approved | |
S Sarah Miller | $50.00 | Failed | |
M Mike Ross | $89.99 | Pending |
Showing 1 to 6 of 14 results
<div className="dashboard-card overflow-hidden !p-0">
<div className="px-8 py-6 flex justify-between items-center">
<div>
<h3 className="text-base font-black">Recent Transactions</h3>
<p className="text-xs font-medium text-slate-400">Manage customer payments</p>
</div>
<button className="bg-slate-900 text-white dark:bg-white dark:text-slate-900 px-5 py-2.5 rounded-xl text-sm font-black">
Export CSV
</button>
</div>
<table className="w-full border-collapse">
<thead className="bg-slate-50/50 dark:bg-white/2"> ... </thead>
<tbody className="divide-y divide-gray-50 dark:divide-white/5">
{transactions.map(tx => (
<tr className="hover:bg-slate-50/30">
<td className="px-8 py-6 text-sm font-bold">{tx.customer}</td>
<td className="px-8 py-6 text-sm font-black text-right relative">
<button onClick={() => setOpenId(tx.id)}>View</button>
{openId === tx.id && <RowActionsMenu ref={menuRef} />}
</td>
</tr>
))}
</tbody>
</table>
<div className="px-8 py-5 flex justify-between items-center sm:flex-row flex-col gap-4">
<p className="text-xs font-bold text-slate-400">Showing 1 to 10 of 48 results</p>
<div className="flex items-center gap-2">
<button className="p-2 border rounded-xl"><ChevronLeft className="w-4 h-4" /></button>
<button className="w-9 h-9 rounded-xl bg-purple-600 text-white">1</button>
<button className="p-2 border rounded-xl"><ChevronRight className="w-4 h-4" /></button>
</div>
</div>
</div>Team Management Pattern
Team Members Table
A multi-filter management interface with role badges, status indicators, and relative activity tracking.
| Member | Role | Status | Last Active | Actions |
|---|---|---|---|---|
A Admin User admin@business.com | Owners | Active | Online | |
S Sarah Johnson sarah@business.com | Admin | Active | 5 min ago | |
M Michael Brown michael@business.com | Management | Active | 2 hours ago | |
E Emma Wilson emma@business.com | Support | Pending Invite | Pending | |
J John Doe john@business.com | Support | Inactive | 2 days ago |
<div className="dashboard-card p-0 overflow-hidden">
<div className="p-6 flex flex-wrap justify-between items-center bg-white dark:bg-slate-950 relative z-40">
<div className="relative flex-1 md:max-w-xl">
<Search className="absolute left-4 top-1/2 -translate-y-1/2 w-4 h-4" />
<input className="w-full pl-11 pr-4 py-2.5 rounded-xl bg-slate-50" />
</div>
<div className="flex gap-3">
<SimpleDropdown value={role} options={["All Roles", "Owners", "Admin", "Management"]} icon={Users} />
<SimpleDropdown value={status} options={["All Status", "Active", "Pending", "Inactive"]} icon={ListFilter} />
</div>
</div>
<table className="w-full">
<tr className="hover:bg-slate-50/50">
<td className="px-6 py-4">
<div className="flex items-center gap-3">
<Avatar name={m.name} />
<div><p className="font-bold">{m.name}</p><p className="text-[10px]">{m.email}</p></div>
</div>
</td>
<td className="text-center">
<Badge variant={m.role === 'Owners' ? 'primary' : 'secondary'}>{m.role}</Badge>
</td>
<td className="text-center relative">
<RowActionMenu zIndex={100} shadow="shadow-2xl" options={['Change Role', 'Edit Member', 'Deactivate', 'Remove']} />
</td>
</tr>
</table>
<div className="p-6 bg-slate-50 flex justify-between items-center relative z-30">
<div className="flex items-center gap-3">
<span className="text-[10px] font-black uppercase">Rows per page:</span>
<RowsPerPageSelector value={rowsPerPage} isOpen={isRowsOpen} onToggle={() => setIsRowsOpen(!isRowsOpen)} />
</div>
<div className="flex items-center gap-6">
<span className="text-[10px] font-black uppercase">1-10 of 48</span>
<div className="flex gap-1">
<button className="p-1.5 border rounded-lg"><ChevronLeft className="w-4 h-4" /></button>
<button className="p-1.5 border rounded-lg"><ChevronRight className="w-4 h-4" /></button>
</div>
</div>
</div>
</div>Pagination Patterns
Numeric Pager
Style 1: Standard subscription-style pager with Back/Next labels.
<div className="flex items-center gap-2">
<button className="pagination-btn">
<ChevronLeft className="w-4 h-4" />
Back
</button>
<button className="pagination-page-btn pagination-page-btn-active">1</button>
<button className="pagination-page-btn">2</button>
<button className="pagination-page-btn">3</button>
<button className="pagination-btn">
Next
<ChevronRight className="w-4 h-4" />
</button>
</div>Result Count Pager
Style 2: Transaction history style with 'Showing 1 to X of Y' detail.
Showing 1 to 10 of 48 results
<div className="flex flex-col sm:flex-row sm:items-center justify-between gap-4">
<p className="text-xs font-bold text-slate-400">
Showing <span className="text-slate-900">1</span> to <span className="text-slate-900">10</span> of <span className="text-slate-900">48</span> results
</p>
<div className="flex items-center gap-2">
<button className="pagination-btn px-2"><ChevronLeft className="w-4 h-4" /></button>
<div className="flex items-center gap-1">
<button className="w-9 h-9 rounded-xl bg-purple-600 text-white font-black text-xs shadow-lg">1</button>
<button className="w-9 h-9 rounded-xl bg-white border border-gray-100 text-slate-400 text-xs font-black">2</button>
</div>
<button className="pagination-btn px-2"><ChevronRight className="w-4 h-4" /></button>
</div>
</div>Interactive Details
Header Action Reveal
Exact parity with SubscriptionTable toggle logic.
Status Badge Library
Full set of standardized transaction/subscription badges.
Standard CSS Class Map
| Purpose | Global CSS Class |
|---|---|
| Table Card Wrapper | dashboard-card !p-0 overflow-hidden |
| Common Header Cell | table-header-cell |
| Standard Data Cell | table-data-cell |
| Row Hover Effect | table-row-hover |
| Primary Action Btn | dashboard-action-btn-primary |
| Secondary Action Btn | dashboard-action-btn-secondary |