Agentic BP DScode-first design system

RecordPage

One record: its name and actions at the top, the tabs of what belongs to it, the numbers that matter, and its details in sections underneath.

Master

Columns lays the details out in one, two or three; each column stops at 554px, so on a big screen the space past the last one stays empty, and the related invoices under the details keep the full width. Stage 1920, 2560 and 3008 draws the frame at that screen's real width, scaled down to fit. Stage narrows the box the frame lives in, so watch the record on a phone. Walk the record's tabs, fold a section of details away, dismiss the notice, and scroll: the name stays at the top and shrinks to one compact line whose trail ends in the record, while the tabs scroll away under it and the bar holds still beneath the name. Turn the frame off to see the record on its own.

UAT-2
Search
HelpWhat's newFeedback
Northwind Holdings

Apex Digital Services

Active
Refresh
StatusActiveUp 2.1% YoY
Current balance$12,600.50Up 4.8% MoM
Next payment05/26/20260
Customer since12/02/2017Up 8.4% YoY

Account Information

Account nameAccount name: The name on invoices and statements.The name on invoices and statements.
Apex Digital Services
StatusStatus: Whether the account can be billed.Whether the account can be billed.
Active
Account numberAccount number: Set when the account is created.Set when the account is created.
ACC-10428
IndustryIndustry: Used for reporting.Used for reporting.
Software & Technology
Account typeAccount type: Customer, prospect or partner.Customer, prospect or partner.
Customer
Account ownerAccount owner: Who looks after this account.Who looks after this account.
Jordan Ellis
Parent accountParent account: The account this one rolls up to.The account this one rolls up to.
Apex Holdings
Created onCreated on: When the record was created.When the record was created.
Mar 14, 2024

Billing Information

Billing cycleBilling cycle: How often invoices are raised.How often invoices are raised.
Monthly
Invoice deliveryInvoice delivery: How invoices reach the account.How invoices reach the account.
Email + customer portal
Billing dayBilling day: The day the cycle runs.The day the cycle runs.
1st of the month
Billing contactBilling contact: Who receives the invoice.Who receives the invoice.
Priya Raman
Payment termsPayment terms: How long they have to pay.How long they have to pay.
Net 30
Billing addressBilling address: Where invoices are addressed.Where invoices are addressed.
480 Harrison Street, Suite 220, Seattle, WA 98104
CurrencyCurrency: The currency invoices are raised in.The currency invoices are raised in.
USD — US Dollar
Tax IDTax ID: Used on tax documents.Used on tax documents.
US-91-4820117

Product Utilization

API callsAPI calls: Against the plan's monthly allowance.Against the plan's monthly allowance.
3.9M of 5M
SeatsSeats: Named users against the plan.Named users against the plan.
184 of 200
StorageStorage: Against the plan's storage.Against the plan's storage.
920 GB of 2 TB
Sandbox environmentsSandbox environments: Against the plan's sandboxes.Against the plan's sandboxes.
1 of 3

Recent Invoices

InvoiceDateDueAmountStatus
08/31/202609/30/2026$12,600.50Open
07/31/202608/30/2026$11,470.00Past due
06/30/202607/30/2026$11,470.00Past due
05/31/202606/30/2026$10,980.25Paid

Usage

Use RecordPage for a single record: an account, an invoice, a quote. It is a blueprint: it composes kit pieces and keeps no state of its own, so the screen owns the tab, the sections and what is open. Pass the kit PageHeader as header, with the trail, the record name, its status Badge and the record actions. tabs takes a kit Tabs of what belongs to the record, with counts. notice writes anything that needs saying about the record, as a kit Callout. toolbar takes a kit Toolbar for what acts on the tab that is showing; it stays at the top as the record scrolls, right under the compact header bar. summary takes a kit Scoreboard of the few numbers people came for. children are the details: kit Sections, each holding its FormDisplay rows straight in as children. columns (1, 2 or 3, default 2) and labelPosition (default start) are set once on the RecordPage and every Section of rows, or Form, inside the details follows them unless it sets its own; each column stops at 554px (--layout-column-max) and the rows stay at the start, so on a wide screen the space past the last column stays empty instead of stretching the rows. Never more than 3 columns, even at 2560px and wider. Related lists under the details, a Section holding a kit Table, keep the full width. Sections side by side use .layout-split from contracts/layout.json: two, three with .layout-split--thirds, or four with .layout-split--quarters. The name and the bar stay put; the tabs and the notice scroll away under them. A related list under the details is a Section holding a Table, which flows with the record rather than scrolling in a box of its own, so its header cells travel with it. onStickyChange says when the top has scrolled away: keep that boolean in the screen and pass it to the PageHeader as sticky, so the name shrinks to the kit's compact 52px bar whose trail ends in the record name. It goes in the AppShell page, which owns the page padding. See contracts/recordpage.json for the full contract.

Do's

  • One record with its details in sections.
  • A record whose related lists live behind tabs.

Don'ts

  • Do not add state to it; it is a blueprint. Keep the tab, the sections and the notice in the screen.
  • Do not build the header, the tabs or the bar inside it. Pass the kit pieces.
  • Do not put page padding around it. It sits in the AppShell page, which owns that.
  • Do not use it for a list of records. Use ListPage.
  • Do not stack more than one Callout over the record; say the one thing that matters.
  • Do not use raw hex.
  • Do not wrap the details in a Form just to get columns, or set a width on them. Pass columns to the RecordPage; the Sections follow.
  • Do not use more than 3 columns, even on a 2560px or wider screen.
  • Do not put a related Table into columns. A Section holding a Table stays full width on its own.
<RecordPage
  columns={2}
/>