Tempa UI

Bubble Chat

Chat message bubbles for sender and receiver with different colors.

Code

components/BubbleChat.astro
    
      ---interface Props {  type: "sent" | "received";  message: string;  time?: string;  name?: string;  avatar?: string;  class?: string;} const {  type = "received",  message,  time,  name,  avatar,  class: className = "",} = Astro.props; const isSent = type === "sent"; const alignClass = isSent ? "justify-end" : "justify-start";const bubbleColor = isSent  ? "bg-black-onyx text-white-ghost rounded-br-md"  : "bg-black-onyx/10 text-black-onyx rounded-bl-md";const bubbleRound = isSent  ? "rounded-tl-xl rounded-tr-xl rounded-bl-xl"  : "rounded-tr-xl rounded-br-xl rounded-tl-xl";--- <div class={`flex ${alignClass} gap-2.5 ${className}`}>  {!isSent && avatar && (    <img      src={avatar}      alt={name ?? "Avatar"}      class="w-8 h-8 rounded-full object-cover shrink-0 self-end"      loading="lazy"    />  )}  {!isSent && !avatar && (    <div class="w-8 h-8 rounded-full bg-black-onyx/20 shrink-0 self-end flex items-center justify-center text-xs font-medium text-black-onyx/60">      {name ? name.charAt(0).toUpperCase() : "?"}    </div>  )}  <div class="max-w-[75%]">    {name && (      <p class="text-xs text-black-onyx/50 mb-1 px-1">{name}</p>    )}    <div class={`px-4 py-2.5 text-sm leading-relaxed ${bubbleColor} ${bubbleRound}`}>      {message}    </div>    {time && (      <p class={`text-xs text-black-onyx/40 mt-1 px-1 ${isSent ? "text-right" : "text-left"}`}>        {time}      </p>    )}  </div>  {isSent && avatar && (    <img      src={avatar}      alt={name ?? "Avatar"}      class="w-8 h-8 rounded-full object-cover shrink-0 self-end"      loading="lazy"    />  )}  {isSent && !avatar && (    <div class="w-8 h-8 rounded-full bg-black-onyx/20 shrink-0 self-end flex items-center justify-center text-xs font-medium text-black-onyx/60">      {name ? name.charAt(0).toUpperCase() : "?"}    </div>  )}</div> 
    
  

Preview

Chat Conversation

A

Alice

Hey! Have you checked out the new components?

10:30 AM

You

Not yet! Are they any good?

10:31 AM

Y
A

Alice

They're amazing! Super easy to use and fully accessible.

10:32 AM

You

Awesome, I'll take a look right now!

10:33 AM

Y

Usage

    
      <BubbleChat  type="received"  message="Hey! Have you checked out the new components?"  time="10:30 AM"  name="Alice"/> <BubbleChat  type="sent"  message="Not yet! Are they any good?"  time="10:31 AM"  name="You"/>
    
  

Props

Prop Type Default Description
type "sent" | "received" — Message direction. Sent = right-aligned, dark bubble.
message string — Message text content.
time string — Optional timestamp display.
name string — Sender name shown above bubble.
avatar string — Avatar image URL. Falls back to initial.
class string — Additional CSS classes.