Skip to content
shadcn.io

shadcn.io is not affiliated with official shadcn/ui

Bubble Chat Testimonials Block for React

A reverse split on drafting lines: a group chat of five dispatchers in a hairline frame, alternating message bubbles with a name, role and relative time above each, beside a header and one Shine Button.

Framework
UI library

Preview

Preview width

Installation

Part of Pro
Pro unlocks the code and one-line install of every Pro button and text effect, plus the MCP for your AI editor.
Have Pro already? Sign in to open it.Opens here as soon as you're Pro.

Overview

Customer quotes told as an overheard team chat, for React with Base UI. On wide screens the chat sits on the start side in a frame drawn with hairlines and plus marks on its corners, and a divider that meets the page's top rule with a plus separates it from the header and the one Shine Button on the other side. The chat has a channel header ("#route-desk" and a count of its replies) and five messages in alternating bubbles from people who plan courier routes with Haulmark: theirs in the muted style on the start side, the answers outlined on the end side. Each message carries an initials avatar and, above the bubble, the person's name, role and company and how long ago they wrote it. The messages fade up one after another on load, and nothing loops. On a phone the text comes first and the chat follows. It's built from Bubble, Message, Avatar, Shine Button, Button and Guides, with CSS only and your theme's tokens. For developer tools, communities and any product where authentic, unpolished praise beats a polished quote.

FAQ

How do I change the messages?

Edit REPLIES at the top of the file: each has the quote, the person's name, role and initials, and a time that is written as a relative label such as "5 min ago". The channel name is CHANNEL, and the reply count in the header is the length of the list, so it stays true when you add or remove a message.

How do I change which bubbles sit on the end side?

The helper isMine decides it from the position: every second message is on the end side, outlined. Return false for everything to keep the whole thread on the start side, as a plain group chat, or return true for the one customer you want to stand out. No bubble uses your primary colour, which stays on the Shine Button.

How are the lines drawn?

The chat's frame is Guides extend="sm" marks="corners" around a bg-card panel, so its four hairlines run a little past the corners with a plus on each. The divider is the header column's border-s, with a Guides marks="start" putting a plus where it meets the page's top rule. The grid takes back the column's padding so the divider runs rule to rule. All of it is decorative and takes your theme's colours.

How do screen readers read the thread?

The thread is an ordered list named after the channel. Each message is a figure: the name, role and time are the figcaption and the words are a blockquote, so they are read in the order they were written, whatever side they sit on. The initials avatars are hidden because the name is right beside them.

Can I show messages from a real chat?

Yes, map your messages into the Reply shape in a server component and pass them in place of REPLIES. Only share messages people agreed to publish, and keep the time label relative so the section never shows a stale date.

How does it fit a phone?

The header and its buttons come first, so the Shine Button is on the first screen, and the chat window follows at the full width of the page column. The bubbles take at most 80 percent of it, so a long message wraps inside its bubble instead of overflowing, and the name, role and time wrap onto a second line when they do not fit, at 320 pixels and up.

What about reduced motion?

The messages fade up in turn using CSS transitions, with no script, so the block renders on the server. With reduced motion every message is simply there from the first paint.

  • Pro

    An email-style thread for a tracing tool that turns a sceptic into an advocate, in a framed window beside a hairline divider: a subject line, earlier messages folded behind a disclosure row, the two latest open, and a Shine Button.

  • Pro

    A launch-week chat in a split: the headline and a Shine Button in a rail, and four messages ruled apart by hairlines, each with celebrate, love and ship-it reaction pills that really toggle and count.

  • Pro

    A reverse split: a notification window in a hairline frame where customer praise arrives as unread rows, with a new-count badge, rows that mark themselves read and a Mark all as read button, beside a header with a Shine Button.

  • Pro

    Six customer testimonials styled as social posts in cells with overshooting lines: initials avatar, verified tick, handle and age, the post and compact reply, share and like counts, with a Shine Button in the header.

  • Pro

    A split call to action built as a short chat: the headline at the start, and at the end a customer's quote in a bubble, answered by a reply bubble that holds the Shine Button to start free.

  • Pro

    A reverse split CTA for a support assistant between solid rails: an ask-me chat window in a hairline frame at the start (pick a question, watch the assistant type, read its answer) and the headline, a sentence and the Shine Button at the end.