Message
One sender's run: their consecutive messages, close in time. The name, the time, every bubble's text and the receipt start on one vertical edge, so a run reads as one unit on either side. The other party sits at the start with an avatar; the reader's own run sits at the end. A footer says how the bubble above it stands.
Loading the live example…
Installation
Run it where your components.json is. The first time, map the @keyline-ui registry: one command, in Installation.
Usage
Props
Put every consecutive message of a run in one Message: the header, then the bubbles, then at most one footer. Files go inside a bubble as Attachment cells.