Real work software eventually needs a book: hundreds of rows, filters, a pipeline. The 013 density layer is Aura at its most conventional-looking — and the laws hold hardest exactly here, because density is where systems quietly start decorating and lying.
The table
13px type, 36px rows (30 under compact), hairline grid, sticky header, one accent — all from named tokens: --table-row-h, --table-head-h, --table-font, --table-grid. Sorting is server-driven by contract: the table renders and reports; deciding order is the data layer’s job (the demo sorts its five rows locally only because there is no server on this page). Every number in a cell is working data, set in the one workspace sans — the same sans a verified hero figure gets, because proof was never a typeface.
| Stage | |||
|---|---|---|---|
| Bright & Co | Qualifying | $8,600 | |
| Meridian Café | Proposal | $4,200 | |
| Ridge Hotel | At risk | $2,150 | |
| Anna Herrera | Won | $1,240 | |
| Tomas Lindqvist | Won | $960 |
Tags & chips
The Tag is the one sanctioned fill in the whole system — a low-alpha wash for a stage or a select value. Eight tones are defined in the sheet, but the switch currently resolves four of them to gray: only green, orange and red keep a hue of their own beside the neutral. blue, purple, teal and yellow all point at --tag-gray-bg. That is deliberate and it is the same restraint that neutralized provenance: a pipeline stage authored nothing, and a surface full of decorative washes makes the three tones that mean something (won, at risk, lost) stop meaning it.
The row above is rendered from the real Tag, so it shows the collapse rather than describing it — four of those eight are the same swatch. Pass a tone that has been collapsed and nothing breaks; you simply get the neutral.
The RecordChip is the third identity system, after seats and generated avatars: a person, company or deal as a small initial-mark plus name. Its hue is a stable hash of the name — an identicon, not provenance. People keep the round mark; companies square it; the chip never wears a seat color, so a third party can never be mistaken for the team.
Filters & bulk
The filter bar emits a whitelisted AST — field, operator, value — over exactly the fields the object exposes. The client physically cannot name a column the server didn’t offer, so the safety property lives in the shape of the data, not in validation goodwill. Bulk actions carry a matching hard rule: reversible operations only. A batch of irreversible public acts is not a feature; it is how a bad night becomes a bad month.
The pipeline
The kanban board rounds out the book. Two doctrine points travel with it: drag is never allowed to be the only door — the cards must supply a plain move-to-stage control that calls the same onMove, so keyboard and touch owners move work without a drag — and each column’s sum is labeled if all close, because a pipeline total is a hope, not a figure. It carries no source line and no peel, since there is nothing to open.
| Prop | Type | Notes |
|---|---|---|
columns | KanbanColumnDef[] | id · name · tone (a Tag tone — and most of them are gray) · kind: open | won | lost · count · ifAllClose · currency |
cards | KanbanCardDef[] | id · columnId · position — layout only; content comes from renderCard |
renderCard | (id) => ReactNode | the card body; provenance and figures follow the same laws as everywhere |
onMove | (cardId, columnId, position) => void | fired by drag — and by the move-to-stage control the cards are obliged to supply, so drag is never the only door |