Skip to content

Records Table

A table after real people have used it — columns reordered from the keyboard, a selection bar that asks page-or-all, subtotals that survive collapsing, cells edited in place, and the empty state its own filters produced.

8 blocks71 lineslucide-reactAdded 10 Sept 2026

What's included

  • app/records-table-page.tsx
  • 8 blocks it is built from, installed with it
  • Needs lucide-react

Works with

  • React
  • Next.js
  • Tailwind CSS
  • TypeScript

npx hoverlab add records-table-page

Or over MCP, from your editor's agent — no account needed.

License

Free to read, copy and install, for personal and non-commercial projects. Shipping it in client work or a paid product needs Pro ($79 once). The source lands in your repo and stops being ours — no attribution, nothing to upgrade.

Was this useful?

Preview

Records

A table after it has been lived in — reordered, selected, grouped, edited, and filtered down to nothing.

Columns

5 of 8 shown

Column order: Name, Status, Owner, Plan, Created

Members

Showing 8 of 1,284 matching “active in the last year”

8 rows selected on this page

All 8 rows on this page are selected.

Members matching the current filter. Selecting every row on this page offers to extend the selection to all matching rows.
Select the 8 rows on this pageMemberPlanLast seen

Ama Boateng

ama@meridianfoods.com

Team2 minutes ago

Deniz Kaya

deniz@halden.co

Pro1 hour ago

Rafael Ortiz

rafael@northwind.dev

Free3 days ago

Yuki Tanaka

yuki@brightloom.jp

Team6 days ago

Nadia Haddad

nadia@cedarworks.io

Pro2 weeks ago

Tom Sørensen

tom@fjordlabs.no

Free1 month ago

Priya Raman

priya@sundara.in

Team1 month ago

Elise Marchand

elise@atelier9.fr

Free3 months ago

Accounts by segment

3 segments · 8 accounts

AccountOwnerSeatsARR
516$619,200
Acme CorpR. Patel240$288,000
InitechS. Okafor180$216,000
UmbrellaR. Patel96$115,200
105$100,800
GlobexJ. Lindqvist48$46,080
SoylentS. Okafor32$30,720
HooliJ. Lindqvist25$24,000
15$12,960
All segmentsincluding collapsed636$732,960

Account seats

Click a seat count or price to edit it.

AccountPlanSeatsMonthly
Acme CorpStudio
GlobexPro
InitechStudio
UmbrellaTeam

Enter commits a cell, Tab moves to the next, Escape leaves it. Nothing is written until you press Save.

ExpandCustomerPlanStatus
Northwind Ltdops@northwind.comTeamActive
Contosobilling@contoso.ioProActive
Initechadmin@initech.devProTrialing

No results match these filters

Nothing matched “renewal” with 4 filters applied. 1,284 records exist in total.

The real page, rendered in your current theme — every section below is a live block, not a screenshot.

Built from

All blocks
  1. Column Show, Hide & ReorderReordering that works from the keyboard rather than by drag alone, pinned columns that cannot be hidden or moved, and a guard so the last visible column cannot be unchecked into a blank table.
  2. Bulk Action BarThe selection bar that asks the question most tables skip: this page, or all 1,284 rows the filter matches. Typed confirmation above a threshold, an undo with the window counting down, and a select-all that names its own scope.
  3. Grouped Table with SubtotalsCollapsible group headers that carry their own subtotals while collapsed, with a grand total that sums every row rather than only the visible ones.
  4. Inline Editable TableEdit cells in the grid with staged changes, per-cell validation, the original value kept beside the attempt, and a save that counts what is still pending.
  5. Expandable Detail RowsRows that open into a full-width detail panel via colSpan, with aria-expanded and aria-controls wired to the detail row.
  6. Empty Because of FiltersThe empty state for a list emptied by its own filters: every active filter shown as a removable chip ordered by how many results it would restore, with clear-all deliberately second.
  7. Faceted Filter DrawerFacets with per-option counts, zero-result options disabled rather than hidden so the list never jumps, and a pending selection applied on a button that says how many choices changed.
  8. Record Inspector DrawerA non-modal drawer that keeps the list on screen, with previous and next controls for moving between records and an activity tab beside the fields.

Only want one section? Open it and copy that block instead — browse Data Tables.

Source

app/records-table-page.tsx
/**
 * The table screen, with the five things that happen to a table once real
 * people use it.
 *
 * `customers-table-page` next door is a table that works. This is the one
 * that has been lived in: columns someone rearranged, rows someone selected
 * a thousand of, groups with subtotals, cells edited in place, and a filter
 * set that returned nothing.
 *
 * The order follows a session rather than a taxonomy: shape the table,
 * act on it, read it, edit it, then look at one row closely.
 *
 *   column manager   reordering that works from the keyboard, not only by
 *                    drag — the accessibility failure most grids ship with
 *   bulk actions     and the question most selection bars skip: this page,
 *                    or all 1,284 rows the filter matched?
 *   grouped rows     subtotals that survive collapsing, so a folded group
 *                    still says something
 *   inline edit      staged changes with the original kept beside the new
 *   expandable       a row opened into a full-width panel
 *   empty            what the same table looks like when the filters have
 *                    excluded everything
 *
 * The empty state sits between the table and its filters on purpose. A list
 * emptied by its own filters is the one empty state that must not offer
 * "create your first record" — the records exist, the filters are hiding
 * them — and putting it directly above <FilterDrawerFacets> makes the
 * relationship the argument rather than a caption.
 *
 * <DrawerRecordDetail> is last because it is the one surface here that is
 * not the table: a non-modal drawer keeps the list on screen, and its
 * previous/next controls mean a person reviewing thirty records never
 * returns to the grid at all.
 */

import * as React from 'react'
import { DataTableColumnManager } from '@/components/data-table-column-manager'
import { DataTableBulkActions } from '@/components/data-table-bulk-actions'
import { DataTableGroupedRows } from '@/components/data-table-grouped-rows'
import { DataTableInlineEdit } from '@/components/data-table-inline-edit'
import { DataTableExpandable } from '@/components/data-table-expandable'
import { EmptyFilteredResults } from '@/components/empty-filtered-results'
import { FilterDrawerFacets } from '@/components/filter-drawer-facets'
import { DrawerRecordDetail } from '@/components/drawer-record-detail'

export default function RecordsTablePage() {
  return (
    <main className="min-h-screen bg-background text-foreground">
      <section className="mx-auto w-full max-w-6xl px-6 pb-2 pt-12">
        <h1 className="text-2xl font-bold tracking-tight">Records</h1>
        <p className="mt-1 text-sm text-muted-foreground">
          A table after it has been lived in — reordered, selected, grouped,
          edited, and filtered down to nothing.
        </p>
      </section>

      <DataTableColumnManager />
      <DataTableBulkActions />
      <DataTableGroupedRows />
      <DataTableInlineEdit />
      <DataTableExpandable />

      {/* Empty, then the filters that emptied it. */}
      <EmptyFilteredResults />
      <FilterDrawerFacets />

      <DrawerRecordDetail />
    </main>
  )
}

How to use it

  1. 1. Copy each of the 8 blocks above into components/ — each block page has its own copy button.
  2. 2. Drop this file at app/records-table-page.tsx. The imports already point at @/components/…, so they resolve with no edits.
  3. 3. Delete the sections you do not want. Every block takes props, so the copy changes without the layout moving.

For AI

The component, its props, the design tokens it expects and the command that installs it — as one prompt. Paste it into Claude, Cursor, v0 or ChatGPT and what they build around it will match the rest of the catalog instead of inventing its own system.

See the prompt

More App Screens

Open the full page for this page

Dashboard Overview

The screen an app opens on: shell, header, KPI row, chart and activity feed — numbers first, shape second, changes last.

App Screens5 blocks47 lines
Open the full page for this page

AI Assistant Screen

An agent working inside a real app: a transcript down the middle — reasoning, answer, then the one card that can act — with what it may read and what it noticed demoted to a rail.

App Screens7 blocks110 lines
Open the full page for this page

Project Board

A kanban board inside the app shell, with tabs that admit the board is one view among several and a header whose primary action is creating work.

App Screens3 blocks42 lines
Open the full page for this page

Customer List Screen

The canonical CRUD list — header, toolbar, sortable table and pagination framed as one panel instead of three stacked cards.

App Screens5 blocks37 lines
Open the full page for this page

Onboarding

A wizard for the session someone finishes and a checklist for the one they do not, with the only genuinely blocking step in front of both.

App Screens3 blocks45 lines
Open the full page for this page

Search Results

Built around the state a search page is in most of the time — empty — so recent queries lead and the facets sit in a sidebar that survives growing to twelve.

App Screens4 blocks47 lines
Open the full page for this page

Agent Run Detail

One run opened up in the order you would debug it — intent, actions, the retries that are invisible in both, then cost.

App Screens4 blocks49 lines
Open the full page for this page

Approvals Inbox

The queue, the same queue sorted by how long things have waited, and the policy that decided both — with the policy last so it is not scrolled past forever.

App Screens3 blocks45 lines
Open the full page for this page

Assistant Chat

The blank thread answered with real starter prompts, the model picker with the three numbers the choice turns on, and the four surfaces a session grows into — attachments, branches, canvas, threads.

App Screens6 blocks68 lines
Open the full page for this page

Agent Run Inspector

The three states an agent screen usually omits: the wait before the first token, the trace after something broke with retries costed in the open, and the diff it wants a person to accept.

App Screens5 blocks61 lines
Open the full page for this page

Retrieval Console

Why the answer said what it said: what is connected, how stale it is, what the query was allowed to see, what fitted in the window and what fell out — plus the failed-search state a debugging tool is most needed in.

App Screens7 blocks66 lines
Open the full page for this page

AI Editor

Five ways to reach a model without the cursor leaving the sentence — slash menu, inline completion, selection toolbar, action menu, property inspector — and the two surfaces that say where the answer came from.

App Screens7 blocks64 lines
Open the full page for this page

Analytics

The saved view and the comparison window first, because every figure below depends on both — then six charts, none of which load a charting library.

App Screens8 blocks68 lines
Open the full page for this page

Alerting

Thresholds with how often each has actually fired, what that produced, where it went — and the digest settings that exist because of the answer.

App Screens5 blocks54 lines
Open the full page for this page

Import Data

The flow between an empty product and a useful one, in the order it goes wrong: sample data offered with equal weight, a file, a URL, the column mapping everything stalls on, and an upload that survives the connection dropping.

App Screens7 blocks64 lines
Open the full page for this page

Account Setup

A profile form where the role options state what they actually change, the avatar crop works from the keyboard, and a navigation guard names the fields it is about to throw away.

App Screens4 blocks53 lines
Open the full page for this page

App Shell

The furniture that is on every screen and belongs to none — navbar, mobile drawer, command palette, shortcut sheet, header search, scope switcher, and the two shapes a detail view takes without losing the list.

App Screens8 blocks68 lines
Open the full page for this page

Workspace Activity

Backwards from now and forwards from it on one screen — a day-grouped timeline, a month grid where a busy Tuesday never changes the row height, and the state both are in on day one.

App Screens3 blocks51 lines
Open the full page for this page

First Run

What the product looks like while onboarding happens: a tour step anchored to the control it explains, the skeletons of the slowest load it will ever do, and the checklist that outlives both.

App Screens3 blocks50 lines