Conversation Handover Trail

One thread

Three people, two shifts, and the member never repeated herself

This is a real conversation, shortened. Nobody forwarded anything, and nobody asked her to explain it again.

Rowan Blake · moving a Wednesday appointment

08:12

Member writes in

Asks to move Wednesday to an afternoon, mentions she is fasting for a blood test that morning.

Arrives on her record, not in a shared inbox

08:19

Front desk picks it up

Sees the fasting note and the blood test already booked for 08:30, so does not offer a morning slot.

Portrait of Maya Coleman

Maya Coleman

Reception, Bramble Health

08:31

Handed to the clinician

The move needs a longer slot, so it goes to the clinician with the whole thread attached rather than a summary of it.

Portrait of Dr Amelia Frost

Dr Amelia Frost

Clinician

12:40

Afternoon shift takes over

A different receptionist offers 15:15, confirms it, and never asks her to repeat why the morning did not work.

Portrait of Tom Ashby

Tom Ashby

Reception, afternoon

12:41

Everything downstream follows

The reminder, the room, and the invoice all move with the appointment. Nothing is left pointing at Wednesday morning.

Automatic, no one had to remember

The whole exchange took four messages. On three separate systems it usually takes eleven, plus a phone call.

See how handover works
About this block

Conversation Handover TrailPRO

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.

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.

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/chat28?email=YOUR_EMAIL&license_key=YOUR_KEY"

Base UI flavor

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

This installs the block to components/beste/block/chat28.tsx plus the badge23 and button21 components it uses for the eyebrow and the action.

Quick start

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

tsx
import { Chat28, chat28Demo } from "@/components/beste/block/chat28";

export default function HandoverPage() {
  return <Chat28 {...chat28Demo} />;
}

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

tsx
import { Chat28 } from "@/components/beste/block/chat28";

export default function HandoverPage() {
  return (
    <Chat28
      badge={{ label: "One thread" }}
      heading="Three people, two shifts, and the member never repeated herself"
      description="This is a real conversation, shortened."
      threadLabel="Rowan Blake · moving a Wednesday appointment"
      entries={[
        {
          time: "08:12",
          action: "Member writes in",
          detail: "Asks to move Wednesday to an afternoon, mentions she is fasting.",
          system: "Arrives on her record, not in a shared inbox",
        },
        {
          time: "08:19",
          action: "Front desk picks it up",
          detail: "Sees the fasting note and does not offer a morning slot.",
          actor: {
            name: "Maya Coleman",
            role: "Reception, Bramble Health",
            avatar: { src: "/people/maya.jpg", alt: "Portrait of Maya Coleman" },
          },
        },
      ]}
      closing="The whole exchange took four messages."
      button={{ label: "See how handover works", href: "/product/handover" }}
    />
  );
}

Props

PropTypeDefaultDescription
badge{ label: string }Eyebrow above the heading, rendered through Badge23
headingstringSection heading, capped at max-w-2xl
descriptionstringSupporting paragraph, capped at max-w-xl
threadLabelstringThread identifier across the top of the panel
entriesHandoverEntry[][]The trail, in the order it happened
closingstringParagraph beside the closing action
button{ label: string; href: string }Outline closing action
classNamestringExtra classes for the outer section
ts
type ActionLink = {
  label: string;
  href: string;
};

type Actor = {
  name: string;
  role: string;
  avatar: { src: string; alt: string };
};

type HandoverEntry = {
  time: string;
  action: string;
  detail: string;
  actor?: Actor;
  system?: string;
};

Behavior notes

  • actor and system are alternatives, not both. When an entry has an actor the block renders the person and ignores system entirely, so an automatic step is expressed by omitting the actor rather than by a flag.
  • That is what lets the right column tell one story: every row answers "who did this", and "nobody, it just happened" is a valid answer.
  • Times are plain strings, never parsed, so the block stays free of server and client locale differences. They use tabular-nums so the column stays aligned.
  • The right column is flex items-start md:justify-end. The items-start is load-bearing: without it the actor block would stretch to the row height, which varies with the length of detail.
  • Rows use border-b with last:border-b-0, so the trail closes flush against the panel edge rather than drawing a rule on top of the border.
  • The panel's inner padding is on the rows container rather than each row, so the hairlines run the full width of the panel while the content stays inset.
  • The panel is bg-background on a bg-muted section, which is how the set raises a single object off the page.
  • Actor names use min-w-0 with truncate, so a long role wraps to an ellipsis rather than pushing the avatar out of alignment.

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

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.

PRO

chat25

Ask Your Data Spotlight

An assistant section where question pills swap the image tile beneath them, each floating a live answer card that cites the records it read, closing on three hairline guarantees and one action.