Messaging Overview Split

Messaging

The conversation lives on the record, not in someone's inbox

Members message the practice, the practice replies, and every word sits against the member it belongs to. Nobody forwards a thread to find out what was agreed.

11 min
median first reply inside clinic hours
0
messages lost between shifts
3 taps
from a message to a booked appointment
Soft blue gradient backdrop
C

Care team

Online

Rowan's intake is ready for review.
Approved. Book the first session for Wednesday.
Done, 09:00 in Clinic 2. Reminder is out.
About this block

Messaging Overview SplitPRO

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.

Chat23: Messaging Overview Split

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.

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.

Upgrade Now

Installation

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

bash
npx shadcn add "https://ui.beste.co/r/chat23?email=YOUR_EMAIL&license_key=YOUR_KEY"

Base UI flavor

bash
npx shadcn add "https://ui.beste.co/r-base/chat23?email=YOUR_EMAIL&license_key=YOUR_KEY"

This installs the block to components/beste/block/chat23.tsx, the chat33 thread piece it floats on the tile (installed to components/beste/piece/chat33.tsx), and the badge23 and button21 components it uses for the eyebrow and the actions.

Quick start

The installed file exports chat23Demo alongside the block: the exact props behind the preview above. Spread it to get a working section in one line.

tsx
import { Chat23, chat23Demo } from "@/components/beste/block/chat23";

export default function MessagingPage() {
  return <Chat23 {...chat23Demo} />;
}

Then replace the demo with your own props. Written out, a trimmed setup looks like this:

tsx
import { Chat23 } from "@/components/beste/block/chat23";
import { Chat33 } from "@/components/beste/piece/chat33";

export default function MessagingPage() {
  return (
    <Chat23
      badge={{ label: "Messaging" }}
      heading="The conversation lives on the record, not in someone's inbox"
      description="Every word sits against the member it belongs to."
      stats={[
        { value: "11 min", label: "median first reply inside clinic hours" },
        { value: "0", label: "messages lost between shifts" },
      ]}
      buttons={[
        { label: "See messaging", href: "/product/messaging" },
        { label: "Book a demo", href: "/demo" },
      ]}
      media={
        <Chat33
          name="Care team"
          status="Online"
          items={[
            { from: "them", text: "Rowan's intake is ready for review." },
            { from: "me", text: "Approved. Book the first session for Wednesday." },
          ]}
        />
      }
      image={{ src: "/backdrops/blue.jpg", alt: "Soft blue gradient backdrop" }}
    />
  );
}

Props

PropTypeDefaultDescription
badge{ label: string }Eyebrow above the heading, rendered through Badge23
headingstringSection heading
descriptionstringSupporting paragraph, capped at max-w-md
statsStat[][]Figure and label pairs in the response table
buttonsActionLink[][]Actions, first solid and the rest outlined
mediaReactNodeLive asset on the tile, chat33 in the demo
image{ src: string; alt: string }Backdrop behind the media tile
classNamestringExtra classes for the outer section
ts
type ActionLink = {
  label: string;
  href: string;
};

type Stat = {
  value: string;
  label: string;
};

Behavior notes

  • The stats are a real dl where the figure is the dt and its explanation the dd, laid out as a fixed 7rem track beside the label from sm up so every figure starts on the same left edge.
  • Below sm the grid collapses and the label stacks under its figure, which keeps long labels from squeezing the number.
  • Rows are sm:items-baseline, so the large figure and its small label sit on a shared baseline rather than being centered against each other.
  • Figures use tabular-nums, so the column stays optically aligned across different digit counts.
  • Rows carry border-t with no closing rule, so the table flows into the actions below it.
  • The layout is lg:grid-cols-2 with lg:items-center, so the tile stays centered against a copy column whose height varies with the number of stats.
  • Button tones are positional and not overridable: the first is primary, later ones are outline.

More Chat blocks

View all Chat
PRO

chat31

Two Sides Of One Conversation

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.

PRO

chat12

Conversational Thread with Reactions

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.

PRO

chat27

Inverted Out Of Hours Panel

A support section built as one dark panel, with a light heading, three hairline promises about who answers, two actions, and a bordered column floating a live on-call conversation.

PRO

chat22

Member Inbox And Thread

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.

PRO

chat29

Saved Reply Library

A messaging section where a hairline list of saved replies, each with what it is for and how often it is used, swaps a bordered preview card showing the message and the fields it fills in from the record.

PRO

chat28

Conversation Handover Trail

One member conversation walked through as timestamped hairline rows inside a bordered panel, each naming what happened and either the person who picked it up or the step that ran on its own.