Confirmed the unread marker still lands at the right boundary. Item 23.
Chat - Indicators in context
Place typing, unread, and scroll indicators into a real thread layout instead of documenting them in isolation.
This demo shows that indicators are structural affordances, not floating utilities. Their value is clearest when they are rendered exactly where the thread layout expects them.
That is why this page keeps them inside a realistic thread rather than presenting them as isolated widgets.
Indicators.TypingIndicatorIndicators.UnreadMarkerIndicators.ScrollToBottomAffordance- thread header placement
- message-list row placement
Indicator thread
Key primitives
Indicators.TypingIndicatornear the thread header or composerIndicators.UnreadMarkerinside the message row pipelineIndicators.ScrollToBottomAffordanceinside a message-list-aware containerMessageList.Rootas the source of unseen-message and scroll state
Implementation notes
- Keep the example tied to a real thread so the placement rules are obvious.
- Show unread and typing state at the same time so the reader can see that the indicators solve different problems.
- Keep the layout realistic enough to justify the scroll affordance rather than presenting it as an isolated button.
When to use this pattern
Use this pattern when:
- the thread needs a visible unread boundary
- typing activity should be surfaced inline
- the scroll position is no longer always pinned to the latest message
This pattern is common in shared support queues, collaborative assistant surfaces, and any thread where users routinely scroll away from the newest message.
What to pay attention to
TypingIndicatorbelongs near thread-level context such as the header or composer area.UnreadMarkerbelongs in the row pipeline because it marks a message boundary, not a global thread status.ScrollToBottomAffordancedepends on message-list state, so it is easiest to reason about when it stays inside a message-list-aware container.
See also
- Continue with Indicators for the reference page.