For AI agents: the complete documentation index is available at https://wallarm.github.io/design-system/llms.txt, the full documentation bundle is available at https://wallarm.github.io/design-system/llms-full.txt, and this page is available as Markdown at https://wallarm.github.io/design-system/components/conversation.md.

Conversation

Stick-to-bottom for the Wally log: Conversation takes ChatBody’s place between ChatHeader and ChatFooter, and ConversationContent renders the built ChatBody (role=log) as the scroller. While an answer streams the view follows it; once the reader scrolls up it stops following and ConversationScrollButton appears. Scrolling back down, clicking the button or changing autoScrollKey (pass the last user message id) re-sticks. ConversationEmptyState is the greeting for an empty chat, rendered inside the scroller. The scroll button is the stock small icon-only Button, floated at the bottom centre.

Source · Storybook

Usage

import { AssistantMessage, AssistantMessageContent } from '@wallarm-org/design-system/AssistantMessage';
import { Chat, ChatFooter, ChatHeader, ChatHeaderTitle } from '@wallarm-org/design-system/Chat';
import { ChatInput, ChatInputSubmit, ChatInputTextarea } from '@wallarm-org/design-system/ChatInput';
import { Conversation, ConversationContent, ConversationScrollButton } from '@wallarm-org/design-system/Conversation';
import { MessageActions, MessageTimestamp } from '@wallarm-org/design-system/MessageActions';
import { UserMessage, UserMessageBubble } from '@wallarm-org/design-system/UserMessage';

Examples

Empty

ConversationEmptyState with greeting pills, over the strong background.

Streaming

A paragraph streams in every 600ms. The view follows the growing answer; scroll up and it stops following and the scroll button appears.

Analytics

data-analytics-id on ConversationScrollButton lands on its <button>. Scroll the log up to reveal it. Keep analytics off the Conversation root — a click anywhere inside would resolve to it.

Props

PropTypeDefaultDescription
thresholdnumber | undefined70Distance in px from the bottom that still counts as "at bottom". Default 70.
autoScrollKeystring | number | undefinedWhen it changes, re-stick and scroll to the bottom even if the reader scrolled up. Pass the last user message id, so sending always reveals the answer. For a thread switch, remount instead: key={threadId}.
defaultCheckedboolean | undefined
defaultValuestring | number | readonly string[] | undefined
autoFocusboolean | undefined
idstring | undefined
tabIndexnumber | undefined
titlestring | undefined
relstring | undefined
onChangeChangeEventHandler<T, Element> | undefined
data-testidstring | undefined

ConversationContent

PropTypeDefaultDescription
contentClassNamestring | undefinedClasses for the inner column (flex flex-col, no gap — v1 §3.1).
defaultCheckedboolean | undefined
defaultValuestring | number | readonly string[] | undefined
autoFocusboolean | undefined
idstring | undefined
tabIndexnumber | undefined
titlestring | undefined
relstring | undefined
onChangeChangeEventHandler<T, Element> | undefined
data-testidstring | undefined

ConversationEmptyState

PropTypeDefaultDescription
titleReactNodeHow can I help you today?Greeting heading. Default 'How can I help you today?'.
defaultCheckedboolean | undefined
defaultValuestring | number | readonly string[] | undefined
autoFocusboolean | undefined
idstring | undefined
tabIndexnumber | undefined
relstring | undefined
onChangeChangeEventHandler<T, Element> | undefined
data-testidstring | undefined

ConversationScrollButton

PropTypeDefaultDescription
labelstring | undefinedScroll to latest messageAccessible name and tooltip. Default 'Scroll to latest message'.
titlestring | undefined
defaultCheckedboolean | undefined
defaultValuestring | number | readonly string[] | undefined
autoFocusboolean | undefined
idstring | undefined
tabIndexnumber | undefined
relstring | undefined
onChangeChangeEventHandler<T, Element> | undefined
type"button" | "submit" | "reset" | undefined
disabledboolean | undefined
namestring | undefined
valuestring | number | readonly string[] | undefined
data-testidstring | undefined

Explorer