Messages
Conversation turns. No avatar and no meta row — the name sits inside the bubble on the first message of a run, and the time plus delivery glyph sit in its bottom-right corner.
A conversation
Consecutive turns from one sender collapse into a run: one name, one squared tail corner on the last bubble. A day divider replaces per-message relative time.
Morning — has the searches pack come back yet?
It landed first thing. I'm reading it now.
One thing flagged on the drainage — nothing that blocks us, but I'll want a word before you sign.
Fine by me. Free after four?
Four works. I'll call you.
Delivery states
Success states are glyphs — a hollow clock, one tick, two ticks, two accent ticks — because they are glanced at, not read. Failure is the one state that takes words, next to the bubble that failed, because it is the only one needing action.
Delivery state: Sending.
Delivery state: Sent.
Delivery state: Delivered.
Delivery state: Read.
Delivery state: Failed.
An unverified name
A name the sender chose for themselves and we could not match to any record. Rendered as a quotation after the address we do trust, never in place of it — presenting an unverified name as fact is how a stranger gets to look like a colleague.
Hi, completion funds need to go to a different account — new details attached.
Dividers
A calendar day, and the first unread message. Both resolve client-side, so a day divider can't say Today the morning after.
Morning — has the searches pack come back yet?
Fine by me. Free after four?
The assistant
Same component, same geometry. Joey's identity is the koala-ai glyph inline before its name, replacing the avatar and the separate AI badge; the corner carries the time alone, since an assistant answer has no delivery state.
Which of my transactions are waiting on searches?
Three are waiting on searches: 14 Elm Row, 8 Bracken Close and Flat 2, Kilner Wharf. Elm Row has been waiting longest at eleven days.
Linear layout
Every turn on the left, for a log where direction carries no meaning.
We've received the signed contract.
Brilliant, thank you.
Message input
API
MessageView (koala-message)SendingSentDeliveredReadFailedMessageGrouping (set by KoalaThreadTagHelper.Group)string? (unverified, self-declared name)MessageContextView? (label + icon inside the bubble)string?TwoSidedLinear (koala-thread)string? (koala-thread)DateTimeOffset? (koala-thread-divider)string? (koala-thread-divider)NeutralPrimary (koala-thread-divider)string (koala-message-input)string? (koala-message-input)