tsimport {XDSChatLayout} from '@xds/core/Chat'
| Guidance | Practices |
|---|---|
| Do | Compose messages using MessageList > Message > Bubble for consistent sender-aware styling and density. |
| Do | Set the density prop to control spacing globally — compact for sidebars, balanced for most views, spacious for long-form reading. Individual messages can override. |
| Do | Use the group prop on bubbles (first, middle, last) when a single sender sends multiple consecutive messages — it tightens corner radius to visually connect them. |
| Do | Use XDSChatSystemMessage with variant="divider" for date separators and default for inline status notices like joins, leaves, or topic changes. |
| Do | Put name on the first bubble and metadata on the last bubble in a message so they align with the bubble's inline padding. |
| Do | Provide an emptyState prop so new users see a clear prompt to start a conversation instead of a blank screen. |
| Do | Use the ghost bubble variant for AI-style responses that show rich content like code blocks or markdown without a visible boundary. |
| Don't | Don't use XDSChatSystemMessage for sender content — it has no avatar, alignment, or bubble. Use XDSChatMessage with a sender role instead. |
| Don't | Don't put long or multi-line content in a system message — keep it to a single short sentence. If you need more, use a bubble or a card. |
| Don't | Don't nest XDSChatMessage inside another XDSChatMessage — each message is a standalone article element with its own sender context. |
| Don't | Don't apply a fixed height directly on the message list — wrap it in a sized container and let the list fill with flex: 1. |
| Don't | Don't mix filled and ghost bubble variants within the same sender's messages — pick one style per side and use it consistently. |
| Don't | Don't place metadata or names on both the bubble and the message wrapper — pick one based on whether the content has a bubble boundary. |
tsx'use client';import {XDSChatLayout,XDSChatMessageList,XDSChatMessage,XDSChatMessageBubble,XDSChatSystemMessage,XDSChatComposer,} from '@xds/core/Chat';import {XDSMarkdown} from '@xds/core/Markdown';import * as stylex from '@stylexjs/stylex';const styles = stylex.create({panel: {width: 450,height: 600,borderRadius: 8,overflow: 'hidden',border: '1px solid var(--color-border)',},});export default function ChatLayoutPanelChat() {return (<div {...stylex.props(styles.panel)}><XDSChatLayoutcomposer={<XDSChatComposer onSubmit={() => {}} placeholder="Ask something..." />}><XDSChatMessageList><XDSChatSystemMessage variant="divider">Today</XDSChatSystemMessage><XDSChatMessage sender="user"><XDSChatMessageBubble>Can you review the Button component and fix the focus ring?</XDSChatMessageBubble></XDSChatMessage><XDSChatMessage sender="assistant"><XDSMarkdown density="compact">{`I'll check the Button component now.Found the issue — the border radius was hardcoded. Replaced with the theme token.`}</XDSMarkdown></XDSChatMessage><XDSChatMessage sender="user"><XDSChatMessageBubble>Nice, can you also check the Card component?</XDSChatMessageBubble></XDSChatMessage><XDSChatMessage sender="assistant"><XDSMarkdown density="compact">{`Checking the component now.Found the issue — the border radius was hardcoded. Replaced with the theme token.`}</XDSMarkdown></XDSChatMessage></XDSChatMessageList></XDSChatLayout></div>);}
tsx'use client';import {XDSChatLayout,XDSChatMessageList,XDSChatMessage,XDSChatMessageBubble,XDSChatComposer,XDSChatTokenizedText,} from '@xds/core/Chat';import {XDSAvatar} from '@xds/core/Avatar';import {XDSVStack} from '@xds/core/Stack';const TOKENS = [{value: '/review', label: '/review', variant: 'blue' as const}];export default function ChatLayoutShowcase() {return (<XDSVStack width={450}><XDSChatLayoutcomposer={<XDSChatComposeronSubmit={() => {}}placeholder="Ask something..."/>}><XDSChatMessageList><XDSChatMessage sender="user"><XDSChatMessageBubble><XDSChatTokenizedText tokens={TOKENS}>/review the changes in this file</XDSChatTokenizedText></XDSChatMessageBubble></XDSChatMessage><XDSChatMessage sender="assistant"><XDSChatMessageBubble variant="ghost">Reading the file now...</XDSChatMessageBubble></XDSChatMessage></XDSChatMessageList></XDSChatLayout></XDSVStack>);}