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?
Activity events
System events sit quietly between messages without pretending to be messages. Exact-timestamp activities share one event and time, while each linked record keeps its own leading domain icon.
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 is identified by name without an avatar or animated glyph; 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
Message preview
The template editor lives at the latest edge of the conversation, where the next reply would normally appear.
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?
Message details
We’ve filled in what we know. Check these before sending.
Appears in the message below.
Completes the link behind “View quote”.
Hi , your quote is ready.
Message actions
Messages can carry compact links to the record or task they refer to. The action row stays inside the bubble and below the message body.
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)MessageActivityView (koala-thread-activity)MessageActivityLinkView? (only interactive activity element)string (koala-message-input)string? (koala-message-input)IReadOnlyList<MessageActionView>? (koala-message)string (koala-message-preview)