Messages
Conversation turns, with 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.
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.
Message actions
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)