Agentic BP DScode-first design system

ListPage

A list of records: the bar to find and filter them, the rows themselves, and the pages under them.

Master

Stage narrows the box the frame lives in, so watch the list on a phone. Switch between Table View, List View and Card View: the same records, laid out three ways. Tick rows and the bar over the list becomes what can be done to them. In Table View the bar, the rows and the pages hold still as one block: scroll and whatever sits above the list goes for good, while the rows scroll inside the table's own box with the column names held at its top. Search, set a filter, change the page size, and switch the state to see the loading, empty and failed lists. Turn the frame off to see the list on its own.

UAT-2
Search
HelpWhat's newFeedback
Northwind Holdings

Invoices

Refresh
InvoiceAccountStatusDueAmount
INV-4471Northwind HoldingsPaid12 Sep 2026$2,980.00
INV-4472Globex CorporationPartially paid13 Sep 2026$4,430.00
INV-4473Initech GroupUnpaid14 Sep 2026$5,880.00
INV-4474Umbrella HealthPaid15 Sep 2026$7,330.00
INV-4475Stark LogisticsPartially paid16 Sep 2026$8,780.00
INV-4476Northwind HoldingsUnpaid17 Sep 2026$10,230.00
INV-4477Globex CorporationPaid18 Sep 2026$11,680.00
INV-4478Initech GroupPartially paid19 Sep 2026$13,130.00
INV-4479Umbrella HealthUnpaid20 Sep 2026$14,580.00
INV-4480Stark LogisticsPaid21 Sep 2026$16,030.00
Showing 1 to 10 of 12 rows

Usage

Use ListPage for any screen that lists records: invoices, accounts, quotes. It is a blueprint: it composes kit pieces and keeps no state of its own, so the screen owns the filters, the rows and which page is showing. Pass the kit Toolbar as toolbar and the list itself as children. How the records are laid out is the Toolbar's own view menu: Table View is a kit Table that runs to the bottom of the page, the Pagination at its foot. The page is the only thing that scrolls: the Toolbar holds at the top under the compact PageHeader bar, the Table's column names hold under the Toolbar, and the page name with anything between it and the list — a summary, a notice — scrolls away behind the trail. Under that band is the scroll shadow: a lift that reaches both page edges while the bar and the table keep the page's side padding, drawn only once the band has pinned, and the column names give up their own line while it is. The pattern measures the bar and the names and says how far down they stop in --table-stick-top, so it keeps up when the filter bar opens. Give that PageHeader sticky, from the shell's onPageHeaderStick, and shadow false, since the band below carries the lift, List View a kit ListView with selection multiple (its ticks feed the same bulk bar), Card View a grid of kit Cards. The screen swaps children to match. pagination takes a kit Pagination, flush under the rows so it reads as the table's own footer, and it goes whenever something else is standing in for them. bulk is the bar of actions for the rows that are ticked; it takes the toolbar's place while something is selected, so the two are never both there. state swaps what stands in for the rows: loading draws kit Skeleton lines in their shape, empty shows what you pass as empty (a kit EmptyState), and error shows the error as a kit Callout. It goes inside the AppShell page, under the PageHeader, so it adds no page padding of its own. See contracts/listpage.json for the full contract.

Do's

  • A screen that lists records with a search, filters and pages.
  • A list that has to show loading, empty and failed states.
  • A list people can lay out more than one way.

Don'ts

  • Do not add state to it; it is a blueprint. Keep the filters, the rows, the selection and the page in the screen.
  • Do not build the bar, the rows or the pages inside it. Pass the kit pieces.
  • Do not show the bulk bar and the toolbar at once; passing bulk swaps them.
  • Do not add page padding around it. It sits in the AppShell page, which owns that.
  • Do not use it for one record's details. That is a record screen.
  • Do not use raw hex.
  • Do not give the table a caption that repeats label; the list is already named.
<ListPage
  state="ready"
/>