Components
Table
A responsive table component.
php artisan blatui:add table
| 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 |
| Total | $1,200.00 | ||
<x-ui.table>
<x-ui.table-caption>A list of your recent invoices.</x-ui.table-caption>
<x-ui.table-header>
<x-ui.table-row>
<x-ui.table-head class="w-[100px]">Invoice</x-ui.table-head>
<x-ui.table-head>Status</x-ui.table-head>
<x-ui.table-head>Method</x-ui.table-head>
<x-ui.table-head class="text-right">Amount</x-ui.table-head>
</x-ui.table-row>
</x-ui.table-header>
<x-ui.table-body>
<x-ui.table-row>
<x-ui.table-cell class="font-medium">INV001</x-ui.table-cell>
<x-ui.table-cell>Paid</x-ui.table-cell>
<x-ui.table-cell>Credit Card</x-ui.table-cell>
<x-ui.table-cell class="text-right">$250.00</x-ui.table-cell>
</x-ui.table-row>
<x-ui.table-row>
<x-ui.table-cell class="font-medium">INV002</x-ui.table-cell>
<x-ui.table-cell>Pending</x-ui.table-cell>
<x-ui.table-cell>PayPal</x-ui.table-cell>
<x-ui.table-cell class="text-right">$150.00</x-ui.table-cell>
</x-ui.table-row>
<x-ui.table-row>
<x-ui.table-cell class="font-medium">INV003</x-ui.table-cell>
<x-ui.table-cell>Unpaid</x-ui.table-cell>
<x-ui.table-cell>Bank Transfer</x-ui.table-cell>
<x-ui.table-cell class="text-right">$350.00</x-ui.table-cell>
</x-ui.table-row>
<x-ui.table-row>
<x-ui.table-cell class="font-medium">INV004</x-ui.table-cell>
<x-ui.table-cell>Paid</x-ui.table-cell>
<x-ui.table-cell>Credit Card</x-ui.table-cell>
<x-ui.table-cell class="text-right">$450.00</x-ui.table-cell>
</x-ui.table-row>
</x-ui.table-body>
<x-ui.table-footer>
<x-ui.table-row>
<x-ui.table-cell colspan="3">Total</x-ui.table-cell>
<x-ui.table-cell class="text-right">$1,200.00</x-ui.table-cell>
</x-ui.table-row>
</x-ui.table-footer>
</x-ui.table>
Actions
| Invoice | Status | Amount | Actions |
|---|---|---|---|
| INV001 | Paid | $250.00 |
|
| INV002 | Pending | $150.00 |
|
| INV003 | Unpaid | $350.00 |
|
<x-ui.table>
<x-ui.table-header>
<x-ui.table-row>
<x-ui.table-head>Invoice</x-ui.table-head>
<x-ui.table-head>Status</x-ui.table-head>
<x-ui.table-head class="text-right">Amount</x-ui.table-head>
<x-ui.table-head class="w-10"><span class="sr-only">Actions</span></x-ui.table-head>
</x-ui.table-row>
</x-ui.table-header>
<x-ui.table-body>
@foreach ([['INV001', 'Paid', '$250.00', 'secondary'], ['INV002', 'Pending', '$150.00', 'outline'], ['INV003', 'Unpaid', '$350.00', 'destructive']] as [$id, $status, $amount, $variant])
<x-ui.table-row>
<x-ui.table-cell class="font-medium">{{ $id }}</x-ui.table-cell>
<x-ui.table-cell><x-ui.badge :variant="$variant">{{ $status }}</x-ui.badge></x-ui.table-cell>
<x-ui.table-cell class="text-right tabular-nums">{{ $amount }}</x-ui.table-cell>
<x-ui.table-cell class="text-right">
<x-ui.dropdown-menu>
<x-ui.dropdown-menu-trigger>
<x-ui.button variant="ghost" size="icon-sm" aria-label="Actions for {{ $id }}">
<x-lucide-more-horizontal aria-hidden="true" />
</x-ui.button>
</x-ui.dropdown-menu-trigger>
<x-ui.dropdown-menu-content align="end">
<x-ui.dropdown-menu-item>View invoice</x-ui.dropdown-menu-item>
<x-ui.dropdown-menu-item>Edit</x-ui.dropdown-menu-item>
<x-ui.dropdown-menu-separator />
<x-ui.dropdown-menu-item variant="destructive">Delete</x-ui.dropdown-menu-item>
</x-ui.dropdown-menu-content>
</x-ui.dropdown-menu>
</x-ui.table-cell>
</x-ui.table-row>
@endforeach
</x-ui.table-body>
</x-ui.table>
Card
| Invoice | Status | Method | Amount |
|---|---|---|---|
| INV001 | Paid | Credit Card | $250.00 |
| INV002 | Pending | PayPal | $150.00 |
| INV003 | Unpaid | Bank Transfer | $350.00 |
{{-- The card variant wraps the table in a bordered, rounded surface. --}}
<x-ui.table variant="card" class="[&_tbody_tr:last-child]:border-0">
<x-ui.table-header>
<x-ui.table-row class="[&>th]:px-4">
<x-ui.table-head>Invoice</x-ui.table-head>
<x-ui.table-head>Status</x-ui.table-head>
<x-ui.table-head>Method</x-ui.table-head>
<x-ui.table-head class="text-right">Amount</x-ui.table-head>
</x-ui.table-row>
</x-ui.table-header>
<x-ui.table-body>
<x-ui.table-row class="[&>td]:px-4">
<x-ui.table-cell class="font-medium">INV001</x-ui.table-cell>
<x-ui.table-cell>Paid</x-ui.table-cell>
<x-ui.table-cell>Credit Card</x-ui.table-cell>
<x-ui.table-cell class="text-right">$250.00</x-ui.table-cell>
</x-ui.table-row>
<x-ui.table-row class="[&>td]:px-4">
<x-ui.table-cell class="font-medium">INV002</x-ui.table-cell>
<x-ui.table-cell>Pending</x-ui.table-cell>
<x-ui.table-cell>PayPal</x-ui.table-cell>
<x-ui.table-cell class="text-right">$150.00</x-ui.table-cell>
</x-ui.table-row>
<x-ui.table-row class="[&>td]:px-4">
<x-ui.table-cell class="font-medium">INV003</x-ui.table-cell>
<x-ui.table-cell>Unpaid</x-ui.table-cell>
<x-ui.table-cell>Bank Transfer</x-ui.table-cell>
<x-ui.table-cell class="text-right">$350.00</x-ui.table-cell>
</x-ui.table-row>
</x-ui.table-body>
</x-ui.table>
Comparison
| Feature | Hobby | Pro | Enterprise |
|---|---|---|---|
| Projects | 3 | Unlimited | Unlimited |
| Custom domains | |||
| Preview deploys | |||
| Team seats | 1 | 5 | Unlimited |
| Rollbacks | 3 days | Unlimited | Unlimited |
| SSO / SAML | |||
| Audit logs | |||
| SLA | 99.9% | 99.99% |
@php
$tiers = ['Hobby', 'Pro', 'Enterprise'];
$rows = [
['Projects', '3', 'Unlimited', 'Unlimited'],
['Custom domains', true, true, true],
['Preview deploys', true, true, true],
['Team seats', '1', '5', 'Unlimited'],
['Rollbacks', '3 days', 'Unlimited', 'Unlimited'],
['SSO / SAML', false, false, true],
['Audit logs', false, false, true],
['SLA', false, '99.9%', '99.99%'],
];
@endphp
<x-ui.table class="w-full max-w-2xl">
<x-ui.table-header>
<x-ui.table-row>
<x-ui.table-head>Feature</x-ui.table-head>
@foreach ($tiers as $i => $tier)
<x-ui.table-head class="text-center {{ $i === 1 ? 'text-primary font-semibold' : '' }}">{{ $tier }}</x-ui.table-head>
@endforeach
</x-ui.table-row>
</x-ui.table-header>
<x-ui.table-body>
@foreach ($rows as $row)
<x-ui.table-row>
<x-ui.table-cell class="font-medium">{{ $row[0] }}</x-ui.table-cell>
@foreach (array_slice($row, 1) as $cell)
<x-ui.table-cell class="text-center">
@if ($cell === true)
<x-lucide-check class="text-primary mx-auto size-4" aria-label="Included" />
@elseif ($cell === false)
<x-lucide-minus class="text-muted-foreground/40 mx-auto size-4" aria-label="Not included" />
@else
<span class="tabular-nums">{{ $cell }}</span>
@endif
</x-ui.table-cell>
@endforeach
</x-ui.table-row>
@endforeach
</x-ui.table-body>
</x-ui.table>
Selection
| Customer | Status | Amount | |
|---|---|---|---|
| Sofia Carter | Paid | $250.00 | |
| Jackson Doe | Pending | $150.00 | |
| Amelia Bell | Paid | $450.00 |
<x-ui.table>
<x-ui.table-header>
<x-ui.table-row>
<x-ui.table-head class="w-10"><x-ui.checkbox aria-label="Select all rows" /></x-ui.table-head>
<x-ui.table-head>Customer</x-ui.table-head>
<x-ui.table-head>Status</x-ui.table-head>
<x-ui.table-head class="text-right">Amount</x-ui.table-head>
</x-ui.table-row>
</x-ui.table-header>
<x-ui.table-body>
<x-ui.table-row data-state="selected">
<x-ui.table-cell><x-ui.checkbox checked aria-label="Select Sofia Carter" /></x-ui.table-cell>
<x-ui.table-cell class="font-medium">Sofia Carter</x-ui.table-cell>
<x-ui.table-cell><x-ui.badge variant="secondary">Paid</x-ui.badge></x-ui.table-cell>
<x-ui.table-cell class="text-right">$250.00</x-ui.table-cell>
</x-ui.table-row>
<x-ui.table-row>
<x-ui.table-cell><x-ui.checkbox aria-label="Select Jackson Doe" /></x-ui.table-cell>
<x-ui.table-cell class="font-medium">Jackson Doe</x-ui.table-cell>
<x-ui.table-cell><x-ui.badge variant="outline">Pending</x-ui.badge></x-ui.table-cell>
<x-ui.table-cell class="text-right">$150.00</x-ui.table-cell>
</x-ui.table-row>
<x-ui.table-row data-state="selected">
<x-ui.table-cell><x-ui.checkbox checked aria-label="Select Amelia Bell" /></x-ui.table-cell>
<x-ui.table-cell class="font-medium">Amelia Bell</x-ui.table-cell>
<x-ui.table-cell><x-ui.badge variant="secondary">Paid</x-ui.badge></x-ui.table-cell>
<x-ui.table-cell class="text-right">$450.00</x-ui.table-cell>
</x-ui.table-row>
</x-ui.table-body>
</x-ui.table>
Striped
| Name | Role | Status | |
|---|---|---|---|
| Olivia Martin | [email protected] | Owner | Active |
| Jackson Lee | [email protected] | Member | Active |
| Isabella Nguyen | [email protected] | Member | Invited |
| William Kim | [email protected] | Viewer | Suspended |
| Sofia Davis | [email protected] | Member | Active |
{{-- Zebra striping via a row-targeting arbitrary variant on the table. --}}
<x-ui.table class="[&_tbody_tr:nth-child(odd)]:bg-muted/50">
<x-ui.table-header>
<x-ui.table-row>
<x-ui.table-head>Name</x-ui.table-head>
<x-ui.table-head>Email</x-ui.table-head>
<x-ui.table-head>Role</x-ui.table-head>
<x-ui.table-head class="text-right">Status</x-ui.table-head>
</x-ui.table-row>
</x-ui.table-header>
<x-ui.table-body>
<x-ui.table-row>
<x-ui.table-cell class="font-medium">Olivia Martin</x-ui.table-cell>
<x-ui.table-cell class="text-muted-foreground">[email protected]</x-ui.table-cell>
<x-ui.table-cell>Owner</x-ui.table-cell>
<x-ui.table-cell class="text-right">Active</x-ui.table-cell>
</x-ui.table-row>
<x-ui.table-row>
<x-ui.table-cell class="font-medium">Jackson Lee</x-ui.table-cell>
<x-ui.table-cell class="text-muted-foreground">[email protected]</x-ui.table-cell>
<x-ui.table-cell>Member</x-ui.table-cell>
<x-ui.table-cell class="text-right">Active</x-ui.table-cell>
</x-ui.table-row>
<x-ui.table-row>
<x-ui.table-cell class="font-medium">Isabella Nguyen</x-ui.table-cell>
<x-ui.table-cell class="text-muted-foreground">[email protected]</x-ui.table-cell>
<x-ui.table-cell>Member</x-ui.table-cell>
<x-ui.table-cell class="text-right">Invited</x-ui.table-cell>
</x-ui.table-row>
<x-ui.table-row>
<x-ui.table-cell class="font-medium">William Kim</x-ui.table-cell>
<x-ui.table-cell class="text-muted-foreground">[email protected]</x-ui.table-cell>
<x-ui.table-cell>Viewer</x-ui.table-cell>
<x-ui.table-cell class="text-right">Suspended</x-ui.table-cell>
</x-ui.table-row>
<x-ui.table-row>
<x-ui.table-cell class="font-medium">Sofia Davis</x-ui.table-cell>
<x-ui.table-cell class="text-muted-foreground">[email protected]</x-ui.table-cell>
<x-ui.table-cell>Member</x-ui.table-cell>
<x-ui.table-cell class="text-right">Active</x-ui.table-cell>
</x-ui.table-row>
</x-ui.table-body>
</x-ui.table>
API Reference
Props, slots and exposed methods for
<x-ui.table>.
Props
| Prop | Type | Default | Description |
|---|---|---|---|
variant |
string
|
'default'
|
Container style. "card" wraps the table in a bordered, rounded surface on bg-card; "default" is a plain horizontally scrollable wrapper.
default
card
|
Slots
| Slot | Description |
|---|---|
default |
The table structure, composed from the sub-components: <x-ui.table-caption>, <x-ui.table-header>, <x-ui.table-body> and <x-ui.table-footer>, each holding <x-ui.table-row> with <x-ui.table-head> or <x-ui.table-cell> children. |