Bubble
One message: a frame holding the text, then any files, then its reactions on the bottom keyline. Bubbles in a run share their edges, so the run is one stack rather than a pile of boxes. Tone comes from who sent it, never decoration, and a message on its way runs a pending segment along its foot.
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
Text takes its direction from its first strong letter (dir="auto"), so a message in Hebrew reads right to left in an English conversation. The Message page shows a failed bubble and its Retry.