Data Table
A table with column sorting, row selection, client-side pagination, density, sticky header, column align/type, and expandable rows.
Preview
Controls
Device view renders in an isolated frame so real responsive breakpoints apply. Switch to Full for overflowing popovers.
Installation
php artisan ui:add data-table
Behavior layer (Alpine)
This component installs a self-registering Alpine module to
resources/js/ui/data-table.js. Import the behavior layer once
from your bundle so it loads (it hooks alpine:init):
import './data-table.js';
Registry contract
Install confidence
php artisan ui:add data-table
writes only the generated targets below. The CLI validates each file hash before writing and
prompts before replacing local changes unless --force is used.
- Version
- 1.1.1
- License
- open
- Stability
- stable
- Contract
- v2
- Foundation
- ≥ 1.0.0
| Type | Generated target |
|---|---|
| blade | resources/views/components/ui/data-table.blade.php |
| js | resources/js/ui/data-table.js |
Registry dependencies
Package dependencies
composer: jml/brok:^1.0
npm: alpinejs
Guidance
Structured comparisonCompare structured records across consistent attributes.
Use when
- Use when users need exact comparison across rows and columns, plus sorting or filtering. Do not use a table for narrative browsing or small mobile contexts where cards or lists are easier to scan.
- Displaying structured records that users need to scan, sort, select, or paginate.
- Column relationships matter more than a card-based presentation.
Avoid when
- Use when filtering, sorting, selection, and row actions are first-class tasks.
- The data is primarily hierarchical; use tree or nested list patterns.
- Small-screen users need task-oriented summaries; consider cards or a purpose-built responsive block.
- Task length
- medium
- Interaction cost
- medium
- Interruptiveness
- none
- Input precision
- none
- Mobile / touch risk
- high
- Accessibility risk
- high
- Needs background context
- No
- Comparison needed
- Yes
Preferred alternatives
- List or cards for narrative browsing
Anti-patterns
- Using cards when exact comparison is primary
- Forcing wide tables into narrow layouts without adaptation
Anatomy
toolbar
table
header
sortable column
row
selection control
pagination
empty state
Theming hooks
table header
selected row
pagination
Canonical examples
defaultselectionemptypaginated
API
manifest knowledge + registry-derived coverageProps
| Prop | Type / values | Default | Description |
|---|---|---|---|
| columns | array | [] | Column definitions, labels, keys, and sorting behavior. |
| rows | array | [] | Serializable row records rendered by the table. |
| pageSize | int | 10 | Rows displayed per client-side page. |
| selectable | bool | true | Enable row selection checkboxes. |
| perPage | int | 5 | Declared by @props in the registry Blade source. |
| density | string | comfortable | Declared by @props in the registry Blade source. |
| stickyHeader | bool | false | Declared by @props in the registry Blade source. |
| expandable | bool | false | Declared by @props in the registry Blade source. |
Slots
Components use the default Blade slot unless a documented subcomponent is installed by the registry item.
Data slots
data-table
pagination-item
pagination-link
pagination-next
pagination-previous
table-body
table-cell
table-row
Capabilities
Behavior
- Provides client-side sorting, row selection, and pagination.
- Selection state remains keyed to row identity rather than visual position.
- Client-side sorting, filtering, row selection, and pagination powered by Alpine.
- Installs a JavaScript behavior module when the registry item includes resources/js/ui files.
- Declares registry capability flags: a11y, interactive, responsive, rtl, darkMode, localized.
Usage
<x-ui.data-table class="max-w-2xl" />
Accessibility & localization
data-slot
Keyboard focus-visible
Localized labels
- Column sort controls expose the current sort direction.
- Selection checkboxes need row-specific accessible names.
- Uses semantic HTML and a stable
data-slotattribute for styling/scripting hooks. - Focus-visible rings use the
ringtoken so keyboard focus is always visible. - Disabled and invalid states are conveyed to assistive tech, not by color alone.
- Targets WCAG 2.2 AA; verify contrast in light, dark, admin and customer surfaces above.
- Labels go through
__()and the component uses logical properties (ms-*,text-start,start-*) so it mirrors correctly — flip the preview to RTL to confirm.
Source
The exact, editable file ui:add writes
into your app — copy it or own the whole thing. Previews
render this same code; there are no preview-only components.
Changelog
Current version: v1.1.1. See the site changelog for the full release history.