An automation section listing each trigger against the message it sends on hairline rows with live switches, striking through the volume of any rule turned off and totalling the rest in a soft summary panel.
An automation section listing each trigger against the message it sends on hairline rows with live switches, striking through the volume of any rule turned off and totalling the rest in a soft summary panel.
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/chat30?email=YOUR_EMAIL&license_key=YOUR_KEY"Base UI flavor
npx shadcn add "https://ui.beste.co/r-base/chat30?email=YOUR_EMAIL&license_key=YOUR_KEY"This installs the block to components/beste/block/chat30.tsx, the shadcn/ui switch component it depends on, and the badge23 and button21 components it uses for the eyebrow and the action.
The installed file exports chat30Demo alongside the block: the exact props behind the preview above. Spread it to get a working section in one line.
import { Chat30, chat30Demo } from "@/components/beste/block/chat30";
export default function AutomationsPage() {
return <Chat30 {...chat30Demo} />;
}Then replace the demo with your own props. Written out, a trimmed setup looks like this:
import { Chat30 } from "@/components/beste/block/chat30";
export default function AutomationsPage() {
return (
<Chat30
badge={{ label: "What sends itself" }}
heading="Four messages nobody has to remember to write"
description="Turn each one on or off. Everything else stays manual."
triggerLabel="When this happens"
actionLabel="This goes out"
rules={[
{
trigger: "An appointment is booked",
action: "Confirmation with room, clinician, and what to bring",
detail: "Sent immediately, with a calendar file attached.",
sent: "1,284 last month",
defaultOn: true,
},
{
trigger: "An invoice passes thirty days",
action: "A single polite chase, then it stops",
detail: "One message, then it goes to a human list.",
sent: "38 last month",
defaultOn: false,
},
]}
summaryLabel="messages a month at this setting"
note="Nothing here can be scheduled outside your opening hours."
button={{ label: "See every automation", href: "/product/automations" }}
/>
);
}| Prop | Type | Default | Description |
|---|---|---|---|
badge | { label: string } | – | Eyebrow above the hairline rule, rendered through Badge23 |
heading | string | – | Section heading in the left column of the header |
description | string | – | Supporting paragraph, right-aligned from md up |
triggerLabel | string | – | Column heading, also the mobile label for the trigger |
actionLabel | string | – | Column heading, also the mobile label for the message |
rules | Rule[] | [] | Automation rules with their default state |
summaryLabel | string | – | Caption under the running total |
note | string | – | Policy line in the summary panel |
button | { label: string; href: string } | – | Outline action in the summary panel |
className | string | – | Extra classes for the outer section |
type ActionLink = {
label: string;
href: string;
};
type Rule = {
trigger: string;
action: string;
detail: string;
sent: string;
defaultOn?: boolean;
};defaultOn with a lazy initialiser. Changing rules after mount will not re-seed it, so the block owns that state from first render.sent is stripped to digits with replace(/[^\d]/g, "") and summed for every enabled rule. That means sent can be free text like "1,284 last month" and still count correctly, but any other number inside that string would be absorbed into the digits too.toLocaleString, which keeps the server and client output identical and avoids a hydration mismatch.htmlFor and a generated id, so clicking the message label toggles the rule.hidden md:grid and includes two empty aria-hidden spans to keep the four tracks aligned with the rows beneath.mt-12 md:mt-0 to compensate.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.
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.
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.