Layout
RecordList
Records as dense rows (identity, a few columns, a row menu) that re-flow to a compact two-line row on a phone.
<script>
import { RecordList, RecordRow, RecordCell } from "@codeatlasdev/ui";
</script>
<RecordList columns="minmax(0,1.2fr) minmax(0,1.6fr) 5rem 2.75rem" labels={["App", "Scopes", "Installs"]} aria-label="Apps">
{#each apps as app (app.id)}
<RecordRow>
{#snippet identity()}{app.name}{/snippet}
<RecordCell label="Scopes">{app.scopes}</RecordCell>
<RecordCell label="Installs">{app.installs}</RecordCell>
{#snippet actions()}<DropdownMenu>…</DropdownMenu>{/snippet}
</RecordRow>
{/each}
</RecordList>
The usual dashboard list is neither a table nor a card per record. Table with responsive="cards" makes each row three or four times taller on a phone, and a Card per record repeats the chrome. RecordList owns what every app hand-rolls around that shape: the flush container, the separators, one column template shared by the header and every row, the re-flow below a width, and a 44px actions cell.
columns is one grid-template-columns value: the identity first, one track per RecordCell, the actions track last. labels are the column headers of the identity and the cells. A row without actions simply leaves the last track out of columns.
Wide and stacked
Wide, the header is an aria-hidden row and every RecordCell keeps its label as a visually hidden dt, so assistive technology still gets “Scopes: read:invoices” per cell. Below 36rem of the list’s own width (a container query, not the viewport) the header disappears and the row becomes two lines: identity and actions on the first, the cells below as small label/value pairs that wrap. The same list behaves the same in a narrow card or beside a sidebar, and it needs no JavaScript, so server-rendered pages are correct from the first paint.
With no rows, render your own empty state instead of the list.
Apps
Identity with avatar, status chip and a row menu. Narrow the window or the container to see it stack.
- BI Billing
- Scopes
read:invoices write:invoices- Installs
- 128
- Status
- Live
- Created
- Mar 14, 2026
- SD Support desk
- Scopes
read:tickets- Installs
- 7
- Status
- Live
- Created
- Apr 2, 2026
- AE Analytics exporter
- Scopes
read:events read:users- Installs
- 0
- Status
- Draft
- Created
- May 21, 2026
Reference #245 · Pick in the gallery
Code
Phone width
A 344px slot: the same list stacked, because the list reads its own width.
- PK Production key
- Prefix
ca_live_9f2…- Last used
- 2 min ago
- Created
- Jan 8, 2026
- CP CI pipeline
- Prefix
ca_live_41c…- Last used
- Yesterday
- Created
- Feb 19, 2026
Reference #247 · Pick in the gallery
Code
Without a menu
No actions slot and no actions track: three columns that stack the same way.
https://example.com/hooks/orders- Events
- order.created
- Delivered
- 99.8%
https://example.com/hooks/refunds- Events
- refund.created refund.failed
- Delivered
- 100%
Reference #246 · Pick in the gallery
Code
Accessibility
The list is a real <ul> with one <li> per record: give it an aria-label. Per-cell labels are dt/dd pairs inside a dl, so they are announced with their value in both layouts. Put an aria-label that names the record on every action button (“Actions for Billing”), because the visible column header is hidden from assistive technology.
RecordList props
| Prop | Type | Default | Description |
|---|---|---|---|
columns | string | – | `grid-template-columns` shared by the header and every row: identity, one track per cell, then actions. |
labels | string[] | – | Column headers for the identity and each cell, in order. Omit for no header row. |
class | string | '' | Extra class names on the wrapper. |
children | Snippet | – | The RecordRows. |
RecordRow props
| Prop | Type | Default | Description |
|---|---|---|---|
identity | Snippet | – | First column: what the record is. Heads the stacked row. |
actions | Snippet | – | Last column, usually a DropdownMenu. At least 44px square. |
class | string | '' | Extra class names on the row. |
children | Snippet | – | The RecordCells, in the order of the `columns` tracks. |
RecordCell props
| Prop | Type | Default | Description |
|---|---|---|---|
label | string | – | The column name: kept for assistive technology on wide rows, painted above the value when stacked. |
class | string | '' | Extra class names on the cell. |
children | Snippet | – | The value. |