nextui.dev
Home
Docs
Saved
Pricing
Components37
  • Forms & inputs7
  • Cards13
  • Buttons, badges & avatars8
  • Feedback & display6
  • Effects3
Agents17
  • Chat inputNew
  • Task checklistNew
  • ReasoningNew
  • Tool callNew
  • Tool approvalNew
  • SourcesNew
  • Agent timelineNew
  • Artifact panelNew
  • Streaming messageNew
  • Conversation shellNew
  • Voice agentNew
  • Voice orbNew
  • Thinking ring
  • Thinking waveNew
  • Thinking sparkle
  • Thinking bot
  • Prompt deckNew
Blocks20
  • Agent chatNew
  • Pill heroNew
  • Grid hero
  • Moodboard generatorNew
  • Waitlist heroNew
  • Intro bannerNew
  • Creative home heroNew
  • Chat heroNew
  • App shelfNew
  • Usage card
  • Design resultsNew
  • Pricing tiers
  • Dashboard home
  • The shiftNew
  • Launch perksNew
  • Testimonials
  • Quote
  • Team
  • Leads tableNew
  • Sign in
Pages10
  • ASCII workspace$49
  • CRM overviewNew
  • Marketing dashboardNew
  • Developer portfolio$49
  • Particle landing$49
  • Particle story$49
  • Statement converter$49
  • AI photo studio$49
  • Group card launch$49
  • Month-end storyNew
Themes9
  • Default
  • Ember
  • Ocean
  • Forest
  • Grape
  • Rose
  • Amber
  • Clay
  • Brutal
Upgrade
nextui.dev

nextui components, blocks and themes you install with one command.

Product

  • Components
  • Blocks
  • Themes
  • Pricing

Resources

  • Docs
  • Roadmap
  • GitHub

Legal

  • License
  • Privacy
  • Terms
  • Refunds

nextUI

[ 200 OK ] · nextUI

© 2026 NEXTUI • All rights reserved.

Upgrade
ComponentsAI & agentsConversation shell
Copy promptCopy prompt

Customize

The agent is answering: Send becomes Stop and sending is blocked

Heading of the empty state

Composer placeholder

Title of the open chat, shown in the top bar breadcrumb

Product name next to the logo

Play a scripted two-turn chat on a loop while on screen, for demos

JSX · copied with Copy prompt

<ConversationShell autoPlay />

Conversation shellNew

App frame for an AI agent chat: a top bar with breadcrumb, search and Ask AI over a chat panel, a message list that sticks to the newest message while it streams, a jump-to-latest button once you scroll up, an empty state with suggestions, and a growing composer with Send / Stop.

Installation

Set your access key from API keys as NEXTUI_TOKEN in .env.local and add the @nextui namespace below to components.json once. Then every item installs by name. Each install counts as a copy on a free account.

$pnpm dlx shadcn@latest add @nextui/conversation-shell
1{
2 "registries": {
3 "@nextui": {
4 "url": "https://nextui.dev/r/{name}.json",
5 "headers": { "Authorization": "Bearer ${NEXTUI_TOKEN}" }
6 }
7 }
8}

Usage

1"use client";
2
3import { useChat } from "@ai-sdk/react";
4import { ConversationShell } from "@/components/nextui/conversation-shell";
5import { StreamingMessage } from "@/components/nextui/streaming-message";
6import { ToolCall } from "@/components/nextui/tool-call";
7
8export function Chat() {
9 const { messages, sendMessage, status, stop } = useChat();
10
11 return (
12 <ConversationShell
13 busy={status === "submitted" || status === "streaming"}
14 onStop={stop}
15 onSend={(text) => sendMessage({ text })}
16 messages={messages.map((m) => ({
17 id: m.id,
18 role: m.role === "user" ? "user" : "assistant",
19 content: m.parts.map((part, i) =>
20 part.type === "text" ? (
21 m.role === "user" ? part.text : <StreamingMessage key={i} part={part} />
22 ) : part.type.startsWith("tool-") ? (
23 <ToolCall key={i} part={part as never} />
24 ) : null,
25 ),
26 }))}
27 />
28 );
29}

API reference

Edit props live in the preview above, or see all 12 props
PropTypeDefaultDescription
messages{ id: string; role: "user" | "assistant"; content: ReactNode }[]–The thread, oldest first; content can be text or any primitive
onSend(text: string) => void–Called with the composer text on Enter or Send; also called by suggestion chips
busybooleanfalseThe agent is answering: Send becomes Stop and sending is blocked
onStop() => void–Called by the Stop button
suggestionsstring[]–Prompts on the empty state
emptyTitleReactNode"What should the agent do?"Heading of the empty state
placeholderstring"Ask the agent…"Composer placeholder
titlestring"Launch planning"Title of the open chat, shown in the top bar breadcrumb
brandstring"Agent"Product name next to the logo
onAskAI() => void–Called by the Ask AI button in the top bar
autoPlaybooleanfalsePlay a scripted two-turn chat on a loop while on screen, for demos
classNamestring–Extra classes on the frame; set the height here (default h-[600px])

Related

All components

Chat inputNew

Task checklistNew

ReasoningNew

Sign in to see the code

Preview it freely. A free account copies code and prompts a few times a day.

Sign in