dashboard pattern

List (table)

Index page for a resource — filter / sort / paginate / select / bulk-action.

When to use it

CRUD entry point for any resource (users, projects, invoices, tickets).

  • Filter to result set in <5s
  • Bulk select 10+ items in <10s
  • Server-side pagination

Layout regions

  • header
  • sidebar
  • main
  • page-header
  • toolbar
  • table
  • bulk-bar

States

  • default
  • loading
  • empty
  • partial
  • error

Example

Next.js — server-side params from URL, TanStack Table

// app/(app)/projects/page.tsx — Server Component
import { listProjects } from '@/lib/api.server'

export default async function ProjectsPage({ searchParams }) {
  const sp = await searchParams
  const page = Number(sp.page ?? 1)
  const sort = String(sp.sort ?? 'createdAt:desc')
  const q = String(sp.q ?? '')
  const { rows, total } = await listProjects({ page, pageSize: 25, sort, q })
  return (
    <DashboardLayout>
      <Stack size="4">
        <PageHeader title="Projects" cta={<Button asChild><Link href="/projects/new">New project</Link></Button>} />
        <Toolbar><Search defaultValue={q} /><FilterChips /></Toolbar>
        <ProjectsTable rows={rows} total={total} page={page} sort={sort} />
      </Stack>
    </DashboardLayout>
  )
}

The full List (table) pattern specifies 4 exact microcopy strings, 2 motion specs, 4 composition rules, 2 more code examples — all gated behind the full recipe. Get the full recipe.

Build the List (table) pattern in your project.