IInbox

Roadmap

What is left to build, in what order, and which parts need designing before they can be coded.

This is the build plan, derived from surveying shadcn/ui (63 components), Atlassian (~70) and Polaris (~80), then diffing against both this codebase and the Figma library.

Where we are

Every non-icon component in the Figma library is now coded, along with the ten that had to be designed first. Each has a page, a live demo and a registry item.

What remains is the lower-priority tail — components that exist in other systems but not in this Figma file, listed at the end of Phase 3.

Phase 1 — designed in Figma, needs code only

Done. All of it, grouped into files so the docs stay navigable rather than sprawling to one page per component.

1a · Table and rows

ComponentFigmaNotes
Table Row177:776Default / Hover / Selected. A generic row, unlike the fixed GRID_COLS grid
Table Header Cell177:673Default / Sorted. Replaces the hand-rolled SortHeader in Exchange
Selectable Row476:525Unselected / Selected / Hover
Row Actions779:660The trailing action cluster, currently rebuilt per screen
Numbered Row471:488Ordered list item with a real number column
Group Header424:415Section label inside a list

1b · Chips, tiles and small display

ComponentFigmaNotes
Metric Tile649:566A compact stat — smaller than InsightCard
Avatar Cluster654:571Overlapping faces in a 40px footprint, distinct from AvatarGroup
Inline Chip455:448A chip that sits inside a line of prose
Link Chip471:476A URL rendered as a chip
Suggestion Chip663:640A tappable prompt suggestion
Icon Frame471:46040px framed icon, the larger sibling of IconTile
Accent Button170:637Brand / Ink / Violet / Danger × four states
Day Ring649:606Complete / Partial / Empty — a day's completion
Status Item662:631Active / Idle activity line
Nav Item662:618Plain / Badge sidebar entry
Nav Progress482:2285"Getting started · 1 of 5"
Trial Footer482:2295"14 days left · Upgrade"

1c · Files and attachments

ComponentFigmaNotes
Dropzone204:1416Idle / Active / Error. The one genuinely missing file primitive
Attachment Thumbnail207:1445Image / Add
Audio Attachment206:1502With a scrub bar and duration
Scrim88:352The overlay wash, currently inlined in Modal and CommandK
Sheet Header663:650The grabber-and-title row for mobile sheets

1d · Mail and merge

ComponentFigmaNotes
Recipient Field456:439A TO field holding recipient chips
Recipient Chip455:458Avatar plus name
Merge Field455:447Mapped / Missing — a mail-merge token
Message Actions427:398Copy / regenerate / share, currently inlined in Assistant
History Row21:14Default / Active conversation entry
Mobile Row657:604Navigate / Toggle — a settings row

Phase 2 — the AI and agent set

Done — see Agent set. Called out separately because it is the part of this library the big systems do not have: shadcn only added its AI primitives recently, and neither Atlassian nor Polaris ship anything equivalent.

ComponentFigmaNotes
Composer115:532Suggestion chips over an input — the Assistant screen fakes this today
Prompt Field663:624The single-line ask
Prompt Tile427:433A starter card with a title and description
Model Picker424:414Default / Open / Hover
Tool Call428:457Running / Done / Error — what the agent did, and how long it took
Transcript Row477:526Speaker, timestamp and utterance
Source Row662:632A grounded source with a citation count

StreamingIndicator is already shipped and belongs to this set.

Phase 3 — needs designing in Figma first

Done. All ten were designed into the Figma library (page Components, group Structure), then coded and documented. Every fill is bound to a token — the components carry no raw colours.

Tabs and Spinner were promotions: both already existed in the codebase, stranded inside messages.tsx and exchange.tsx.

ComponentFigmaStatus
Empty state1004:699shipped
Breadcrumb1004:709shipped
Pagination1005:695shipped
Stepper1005:713shipped
Accordion1005:737shipped
Popover1006:695shipped
Slider1006:703shipped
Drawer1006:714shipped
Spinnerpromotedshipped
Tabs12:11shipped

The screens now use them. The approval chain in Purchase requests is a Stepper, the Previous/Next in Spend insights is a Pagination, and the hand-rolled empty states in Purchase requests, Exchange (twice), Spend insights and Tasks are all EmptyState.

Two were deliberately left alone. The Assistant's action row and composer match their own Figma screen — three buttons and an external send — while the standalone MessageActions has four different buttons and Composer has no external send. They are different components for different places, and swapping one in would have broken the screen's fidelity.

The narrow cases were also left: the "Nothing matches" line inside a dropdown and the command palette's no-results line. An EmptyState card inside a menu is the wrong shape.

Lower priority, same category: Combobox, Context menu, Hover card, Toggle group, Date picker, Scroll area, Button group, Code block, Inline edit, Carousel, Input OTP, Rating, Resizable, Tree view.

Order

  1. Phase 3's promotions first — Tabs and Spinner already exist in the codebase and only need lifting into primitives. Cheapest possible wins, and they unblock other work.
  2. Phase 1a and 1b — the highest-reuse items, and several replace code that is currently duplicated per screen.
  3. Phase 2 — the differentiated set.
  4. The rest of Phase 3 — genuine design work, one at a time.

The rule that governs all of it

Where a component exists in Figma, it gets ported — not reinvented. This session has already produced two components that were hand-rolled inside screens while the real design sat in the library: the Exchange transaction modal had its own DetailRow, and Spend insights had its own selection bar. Both were replaced once the library was actually checked.

The cost of not checking is not a wasted afternoon. It is a system whose code and design quietly disagree.