Composite preview

The docs show each component alone. This page shows what it feels like to compose them — three product surfaces, assembled from the same compose layer.

Scene 01

Compose a message

A mail composer in a single Card: recipient chips, subject, scheduled send, body — sent through one AsyncButton, confirmed by an imperative Modal.

Components: Card · Select · multiple · Input · Textarea · DatePicker · AsyncButton · Modal

New message
Draft, schedule, send — assembled from one Card and a handful of compose-layer parts.
To
Subject
Schedule
Body

Scene 02

Talk to a bot

A chat surface where AsyncButton owns the wait. Switch the model live; the next reply prefix reflects it.

Components: Card · Select · Textarea · AsyncButton

Chat
A composer wired straight to AsyncButton. Latency stays honest — no fake instant reply.
Hi — I'm an AsyncButton with a 1.5s setTimeout pretending to be an LLM. Try me.
What does AsyncButton actually buy me here?
A Promise-aware onClick: I show a spinner the whole time it's pending, never twice, never half. Then I let go.

Scene 03

Open the palette

⌘K, but composed. A Modal hosts Tabs hosting server-search Selects — each tab keeps its query when you switch.

Components: Modal · Tabs · keepMounted · Select · serverSideFilter

Click to open. Type in one tab, switch tabs, switch back — the query survives because the Tabs are kept mounted.