ThiloDesign System
DV

Table

shadcn/ui
+ Data Table

Structured data display with rows and columns. Table is the look; DataTable is that same look with sorting, filtering and pagination wired in — use it for every table in the product.

@/components/ui/table · @/components/ui/data-table

Full live example

Table demo

Editable table with search, sort, inline editing, row selection, and all custom components integrated.

IDStatusPriorityPartnerAssignee
T7A3763
Open
NormalBanana CorpAS
T63JK93
In Review
NormalOrange LtdCW
T733U67
Open
CriticalPlum LogisticsAS
T9399A6
Testing
HighLemon LabsDB
T999U37
Done
LowApple IndustriesCW

Data Table

thilo · TanStack v8

DataTable is this same Table with a brain — it renders Table internally, so the look is identical. You pass columns + data instead of writing rows by hand, and it handles sorting, filtering and pagination. Use this for every table in the product — plain Table only for static demo markup.
@/components/ui/data-table

Click ID or Status to sort.

Title
Priority
Assignee
Created
T7A3763Fix login redirect
Open
HighDA13.5.2026
T7A3801Update ticket filters
In Progress
NormalMK12.5.2026
T7A3820Export to CSV
In Review
LowJB11.5.2026
T7A3855Mobile layout fix
Closed
CriticalDA10.5.2026
T7A3870API rate limit issue
Blocked
HighMK09.5.2026
T7A3902Dark mode polish
Done
LowJB08.5.2026

Tinted header

headerTint puts the sticky header on bg-table-header— one step off the panel surface, the same surface as a search input sitting above the table. Lighter than the panel in dark mode, a touch darker in light mode. Use it where the table is a screen's main content (Business Partners list); leave it off for tables tucked inside a card or a detail panel.

Title
Priority
Assignee
Created
T7A3763Fix login redirect
Open
HighDA13.5.2026
T7A3801Update ticket filters
In Progress
NormalMK12.5.2026
T7A3820Export to CSV
In Review
LowJB11.5.2026
T7A3855Mobile layout fix
Closed
CriticalDA10.5.2026
T7A3870API rate limit issue
Blocked
HighMK09.5.2026
T7A3902Dark mode polish
Done
LowJB08.5.2026

Empty state

ID
Title
Status
No tickets found. Try adjusting your filters.

Column definitions

PatternExample
Simple string{ accessorKey: "title", header: "Title" }
Sortable headerheader: ({ column }) => <Button onClick={() => column.toggleSorting(...)}>ID</Button>
Custom cellcell: ({ row }) => <StatusBadge status={row.getValue("status")} />
Computed cellcell: ({ row }) => <span>{row.original.firstName} {row.original.lastName}</span>
Actions cellcell: ({ row }) => <DropdownMenu>...</DropdownMenu>

Props — DataTable

PropTypeDescription
columnsColumnDef<T>[]TanStack column definitions — controls header, cell, sorting
dataT[]Row data array
emptyMessagestringMessage shown when data is empty
enableSortingbooleanEnables column sort (default: true when columns use toggleSorting)
enableFilteringbooleanEnables column text filter
enablePaginationbooleanAdds pagination controls below the table
onRowClick(row: T) => voidMakes rows clickable — used by the Business Partners list
borderedbooleanDraws the rounded outer border. false for tables inside a card/panel
resizablebooleanDrag a column's right edge to resize (default true). Table grows into horizontal scroll; min 60px; not persisted
fillHeightbooleanFill a height-constrained parent and scroll inside it, header pinned. Used by the ticket table
headerTintbooleanTints the sticky header bg-table-header — one step off the panel surface, same as the search input above it. Default false (bg-card). Used by the Business Partners list

Inline edit

Click any Partner cell to edit. Click 1 — selects (blue ring). Click 2 or Enter — enters edit mode directly in the cell.

IDStatusPartner — click to editPriority
T7A3763
Open
Banana Corp
Normal
T63JK93
In Review
Orange Ltd
Normal
T733U67
Open
Plum Logistics
Critical
T9399A6
Testing
Lemon Labs
High
T999U37
Done
Apple Industries
Low

Enter to save · Escape to cancel · click outside to save

Pattern demos

Two-line rows

title + subtitle — click either line to edit

IDTitleStatusPriority
THL-001
Fix login redirect loop
Bug in auth flow causing infinite redirect on mobile Safari
Open
High
THL-002
Update ticket filter panel
Date range + multi-select filters missing from sidebar
In Progress
Normal
THL-003
Export tickets to CSV
Include all visible columns, respect active filters
In Review
Low

Tree data

grouped by department — click arrow to expand/collapse

TitleStatusPriority
BSM Department2
Fix login redirect loop
Open
High
API rate limit on batch import
Blocked
High
Thilo Department2
Update ticket filter panel
In Progress
Normal
SLA countdown bar not rendering
In Progress
High
Finance Department1

Expandable rows

click a row to expand — shows description + assignee

TitleStatusPriority
Fix login redirect loop
Open
High
Update ticket filter panel
In Progress
Normal
Export tickets to CSV
In Review
Low

Ellipsis column

long text truncates with '...' — hover to see full content

IDTitleDescription
THL-001Fix login redirect loopUsers on mobile Safari get stuck in an infinite redirect loop after the session cookie expires mid-session. Reproduced on iOS 17.2+. Auth team confirmed the issue.
THL-002Update ticket filter panelThe filter panel is missing date range support and multi-value selection for status and priority fields. Users can only filter by one value at a time, which is a major usability issue.
THL-003Export tickets to CSVCSV export should include all visible columns and respect active filters. Delimiter should be configurable — semicolon for European locale, comma for US.

Summary row

footer row with ticket count and status breakdown

IDTitleStatusPriority
THL-001Fix login redirect loop
Open
High
THL-002Update ticket filter panel
In Progress
Normal
THL-003Export tickets to CSV
In Review
Low
THL-004Mobile layout overflow fix
Closed
Critical
THL-005API rate limit on batch import
Blocked
High
5 tickets total
Open: 1In Progress: 1In Review: 1Closed: 1Blocked: 1

Row drag sort

drag the ⠿ handle to reorder rows

TitleStatusPriority
Fix login redirect loop
Open
High
Update ticket filter panel
In Progress
Normal
Export tickets to CSV
In Review
Low
Mobile layout overflow fix
Closed
Critical

ColSpan / RowSpan

colspan and rowspan for merged cells

colspan — "Dates" header spans Created + Updated columns

IDTitleDatesStatus
CreatedUpdated
THL-001Fix login redirect13 May15 May
Open
THL-002Update filter panel12 May14 May
In Progress
THL-003Export to CSV11 May11 May
In Review

rowspan — Department cell spans multiple rows

DepartmentIDTitleStatus
BSMTHL-001Fix login redirect
Open
THL-005API rate limit issue
Blocked
ThiloTHL-002Update filter panel
In Progress
THL-007SLA countdown bar
In Progress

Grouped headers

two header rows — 'Dates' + 'Assignment' parent groups

IDTitleDatesAssignmentStatus
CreatedUpdatedAssigneeDepartment
THL-001Fix login redirect13 May15 MayDragana V.BSM
Open
THL-002Update filter panel12 May14 MayMarko K.Thilo
In Progress
THL-003Export to CSV11 May11 MayJovana B.Finance
In Review

Virtual list

10,000 rows — only visible rows are in the DOM

IDTitleStatusPriority
THL-00001Fix login flow
Open
Critical
THL-00002Update dashboard
In Progress
High
THL-00003Improve table filters
In Review
Normal
THL-00004Review export module
Blocked
Low
THL-00005Add notifications
Done
Critical
THL-00006Remove auth tokens
Closed
High
THL-00007Migrate sidebar
Open
Normal
THL-00008Refactor search
In Progress
Low
THL-00009Fix login flow
In Review
Critical
THL-00010Update dashboard
Blocked
High
THL-00011Improve table filters
Done
Normal
10,000 rows · showing 111 · 11 rows in DOM

Nested table

click a row to reveal its activity log as a nested table

TitleStatusPriority
Fix login redirect loop
Open
High
Update filter panel
In Progress
Normal
Export to CSV
In Review
Low

Image cell

hover over any photo to see a larger preview — works with any image URL

PhotoNameRoleDepartmentStatusPriority
Dragana V.Design LeadDesign
Open
High
Marko K.Support AgentSupport
In Progress
Normal
Jovana B.QA EngineerTech
In Review
Low
Stefan V.Account MgrFinance
Blocked
Critical
Ana P.HR ManagerHR
Done
Low

Table builder — admin

Partner
Status
Priority
Assignee
Banana Corp
Open
Normal
AS
Orange Ltd
In Review
Normal
CW
Plum Logistics
Open
Critical
AS
Lemon Labs
Testing
High
DB
Apple Industries
Done
Low
CW

Click any column header to rename it. Use + in the header to add a column, + Add row to add a row.

Sub-components

ComponentRole
TableRoot — sets width, border-collapse, and the 14px table type scale
TableHeaderWraps the header row group (<thead>)
TableBodyWraps the data row group (<tbody>)
TableRowA single row — add hover:bg-muted/40 for interactivity
TableHeadHeader cell (<th>) — text-[10px] uppercase pattern
TableCellData cell (<td>)
TableFooterSummary row group — totals, pagination

On this page