Message
shadcn-collections/messageFreeComponent
Message bubble or chat component
Install it
npx shadcn@latest add https://chatcn.me/r/message.jsonSource
1"use client";2import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar";3import { cn } from "@/lib/utils";4import {5 Tooltip,6 TooltipProvider,7 TooltipTrigger,8 TooltipContent,9} from "@/components/ui/tooltip";10import { createContext, useContext } from "react";1112type MessageVariant = "user" | "ai";1314type MessageProps = {15 children: React.ReactNode;16 className?: string;17 variant?: MessageVariant;18} & React.HTMLProps<HTMLDivElement>;1920type MessageContext = {21 disabled?: boolean;22 variant: MessageVariant;23};2425const MessageContext = createContext<MessageContext>({26 disabled: false,27 variant: "ai",28});2930function useMessageContext() {31 const ctx = useContext(MessageContext);32 if (!ctx) {33 throw Error("useMessageContext must be used within a Message");34 }35 return ctx;36}3738export function Message({39 children,40 className,41 variant = "ai",42 ...props43}: MessageProps) {44 return (45 <TooltipProvider>46 <MessageContext.Provider value={{ disabled: false, variant }}>47 <div48 className={cn(49 "flex gap-3 items-end group/message",50 "animate-in fade-in-0 slide-in-from-bottom-2 duration-300 ease-out",51 variant === "user" && "flex-row-reverse",52 className53 )}54 {...props}55 >56 {children}57 </div>58 </MessageContext.Provider>59 </TooltipProvider>60 );61}6263type MessageAvatarProps = {64 src: string;65 alt: string;66 fallback?: string;67 className?: string;68};6970export function MessageAvatar({71 src,72 alt,73 fallback,74 className,75}: MessageAvatarProps) {76 const { variant } = useMessageContext();7778 return (79 <Avatar className={cn("h-8 w-8 shrink-0", className)}>80 <AvatarImage src={src} alt={alt} className="object-cover" />81 <AvatarFallback82 className={cn(83 "text-xs font-medium",84 variant === "user"85 ? "bg-primary text-primary-foreground"86 : "bg-muted text-muted-foreground"87 )}88 >89 {fallback || alt?.slice(0, 2).toUpperCase()}90 </AvatarFallback>91 </Avatar>92 );93}9495type MessageContentProps = {96 className?: string;97 children: React.ReactNode;98} & React.HTMLProps<HTMLDivElement>;99100export function MessageContent({ children, className }: MessageContentProps) {101 const { variant } = useMessageContext();102 const isUser = variant === "user";103104 return (105 <div className="relative max-w-[80%]">106 <div107 className={cn(108// … truncated
What it pulls in
Other registry items
Files it writes
More from shadcn-collections
All 24 items| Component | Registry | Kind | Access | Installs | Command |
|---|---|---|---|---|---|
| Audio Visualizeraudio-visualizer | shadcn-collections | Components | Free | 4 deps | |
| Calendarcalendar | shadcn-collections | Components | Free | no deps | |
| Chat Containerchat-container | shadcn-collections | Components | Free | no deps | |
| Code Editorcode-editor | shadcn-collections | Components | Free | no deps | |
| Code Blockcodeblock | shadcn-collections | Components | Free | 1 dep | |
| Command Blockcommand-block | shadcn-collections | Components | Free | no deps | |
| Command Tabscommand-tabs | shadcn-collections | Components | Free | no deps | |
| Emailemail | shadcn-collections | Components | Free | no deps |
