A two-pane messaging panel: a selectable conversation list with unread dots on the left, and the chosen thread on the right with member and staff bubbles, timestamps, and a composer row.
Two-pane messaging panel: a selectable conversation list carrying snippets, times, and unread dots on the left, and the chosen thread on the right with member and staff bubbles, timestamps, and a composer row along the bottom.
Upgrade to Pro
Pro blocks install through the shadcn CLI with your license key and ship their full source. Docs and live previews stay open to everyone, so you can read every block's details first.
Swap YOUR_EMAIL and YOUR_KEY for the email and license key on your account. Find your license key on your account page.
Radix flavor
npx shadcn add "https://ui.beste.co/r/chat22?email=YOUR_EMAIL&license_key=YOUR_KEY"Base UI flavor
npx shadcn add "https://ui.beste.co/r-base/chat22?email=YOUR_EMAIL&license_key=YOUR_KEY"This installs the block to components/beste/block/chat22.tsx plus the badge23 component it uses for the eyebrow.
The installed file exports chat22Demo alongside the block: the exact props behind the preview above. Spread it to get a working inbox in one line.
import { Chat22, chat22Demo } from "@/components/beste/block/chat22";
export default function Page() {
return <Chat22 {...chat22Demo} />;
}Then replace the demo with your own props. Written out, a trimmed setup looks like this:
import { Chat22 } from "@/components/beste/block/chat22";
export default function Page() {
return (
<Chat22
badge={{ label: "Messaging" }}
heading="The conversation stays on the record"
description="Members message the practice, not a person's phone."
items={[
{
name: "Rowan Blake",
role: "Care plan, week 6",
snippet: "That works, thank you.",
time: "09:12",
unread: true,
status: "Replies usually within an hour",
messages: [
{ from: "member", text: "Can I move Thursday to the afternoon?", time: "08:54" },
{ from: "staff", text: "We have 14:30 or 15:15 with Priya.", time: "09:02" },
{ from: "member", text: "That works, thank you.", time: "09:12" },
],
},
]}
labels={{
inboxLabel: "Inbox",
composerPlaceholder: "Write a reply",
sendLabel: "Send",
}}
/>
);
}| Prop | Type | Default | Description |
|---|---|---|---|
badge | { label: string } | – | Monospace eyebrow above the hairline rule, rendered via Badge23 |
heading | string | – | Section heading in the left column |
description | string | – | Supporting paragraph, right-aligned from md up |
items | Conversation[] | [] | Inbox entries, each carrying its own thread |
labels | Chat22Labels | {} | Inbox kicker and composer copy, see below |
className | string | – | Extra classes for the outer <section> |
type Message = {
from: "member" | "staff";
text: string;
time: string;
};
type Conversation = {
name: string;
role: string;
snippet: string;
time: string;
unread?: boolean;
status: string;
messages?: Message[];
};
type Chat22Labels = {
inboxLabel?: string;
composerPlaceholder?: string;
sendLabel?: string;
};from decides the side and the fill: staff messages align right on the accent, member messages align left on the muted surface. There is no avatar in the bubble, the header pane carries the identity instead.unread on the conversation and opening a thread does not clear it, since read state belongs to your backend.<label> bound with useId, so the field is announced without a visible caption.truncate, so the inbox column keeps its width whatever the last message said.lg. Below that the inbox stacks above the thread with a rule between them rather than becoming a scrolling sidebar.Wiring the form up
This block ships the composer markup only; state, validation, and sending are yours to add. Our guide wires field markup like this to React Hook Form, TanStack Form, and Formisch on one field system.
chat31
A messaging section splitting a hairline matrix between the staff view and the member view, each half floating its own live asset above a title and a list of what that side gets.
chat12
Chat message thread with rich formatting, copy and thumbs-up/down action buttons on AI messages, and time-grouped message sections. Features hover-revealed action bars and smooth animations.
chat23
A messaging section pairing a light heading, a hairline table of response figures, and two actions with an image tile that floats a live conversation thread.
chat11
Full-featured chatbot window with message thread, AI and user avatars, timestamp display, typing indicator, and rich input area with send button. Suitable as the primary chat experience.