Replace entire UI
When to use
Use this when your product needs a custom chrome around chat - for example an admin template header, extra side panels, or a layout that does not match the default two-column shell. Pass components={{ ChatLayout: MyChatShell }} on ChatMain.
For smaller changes, prefer replacing individual components or classNames instead of rebuilding the whole shell.
Wrap or rebuild
You can wrap DefaultChatLayout to keep all built-in behavior, or call useChatController() and compose sidebar, header, messages, and input yourself.
Pitfall: a custom layout that never calls useChatController will render empty - that hook is how your UI receives channels, messages, and send handlers. See Hooks for the full return shape.
tsx
import ChatMain, { useChatController, DefaultChatLayout, type ChatLayoutSlotProps,} from "@realtimexsco/live-chat"; // Option A: wrap the default layoutfunction MyChatShell(props: ChatLayoutSlotProps) { return ( <div className="flex h-full flex-col"> <header className="shrink-0 border-b px-4 py-2 font-semibold">My App Chat</header> <div className="min-h-0 flex-1"> <DefaultChatLayout {...props} shellClassName="rounded-none shadow-none" /> </div> </div> );} // Option B: build entirely from scratchfunction MyFullChatUI(_props: ChatLayoutSlotProps) { const { activeChannel, conversationMessages, handleSendMessage } = useChatController(); return <div className="flex h-full">{/* your sidebar, header, messages, input */}</div>;} <ChatMain {...chatConfig} components={{ ChatLayout: MyChatShell }} />;