Message
จาก shadcnโครงหนึ่งข้อความในบทสนทนา ประกอบด้วยรูปผู้ส่ง หัวข้อ เนื้อหา และท้ายข้อความ จัดชิดซ้าย–ขวาตามผู้ส่ง ใช้คู่กับ Bubble เพื่อสร้างกล่องคุย
ติดตั้ง
Terminal
pnpm dlx shadcn@latest add @whereui/messageต้องผูก registry และติดตั้ง @whereui/theme นำหน้าเสมอเมื่อติดตั้งครั้งแรก
การใช้งาน
import { Message, MessageAvatar, MessageContent, MessageHeader } from "@/components/ui/message"<Message align="start"> <MessageAvatar>{/* รูปหรืออักษรย่อ */}</MessageAvatar> <MessageContent> <MessageHeader>น้ำใจ</MessageHeader> {/* เนื้อหาข้อความ */} </MessageContent></Message>ข้อควรรู้
- align="start" สำหรับผู้ส่งฝั่งเรา, "end" สำหรับอีกฝ่าย ส่วนกล่องข้อความใช้ Bubble จัดสีให้เอง
- MessageGroup รวมข้อความหลายก้อนเป็นบทสนทนาเดียว
ซอร์สโค้ด
components/ui/message.tsx
import * as React from "react"import { cn } from "cn"function MessageGroup({ className, ...props }: React.ComponentProps<"div">) { return ( <div data-slot="message-group" className={cn("flex min-w-0 flex-col gap-2", className)} {...props} /> )}function Message({ className, align = "start", ...props}: React.ComponentProps<"div"> & { align?: "start" | "end" }) { return ( <div data-slot="message" data-align={align} className={cn( "group/message relative flex w-full min-w-0 gap-2 text-sm data-[align=end]:flex-row-reverse", className )} {...props} /> )}function MessageAvatar({ className, ...props }: React.ComponentProps<"div">) { return ( <div data-slot="message-avatar" className={cn( "flex w-fit min-w-8 shrink-0 items-center justify-center self-end overflow-hidden rounded-full bg-muted group-has-data-[slot=message-footer]/message:-translate-y-8", className )} {...props} /> )}function MessageContent({ className, ...props }: React.ComponentProps<"div">) { return ( <div data-slot="message-content" className={cn( "flex w-full min-w-0 flex-col gap-2.5 wrap-break-word group-data-[align=end]/message:*:data-slot:self-end", className )} {...props} /> )}function MessageHeader({ className, ...props }: React.ComponentProps<"div">) { return ( <div data-slot="message-header" className={cn( "flex max-w-full min-w-0 items-center px-3 text-xs font-medium text-muted-foreground group-has-data-[variant=ghost]/message:px-0", className )} {...props} /> )}function MessageFooter({ className, ...props }: React.ComponentProps<"div">) { return ( <div data-slot="message-footer" className={cn( "flex max-w-full min-w-0 items-center px-3 text-xs font-medium text-muted-foreground group-has-data-[variant=ghost]/message:px-0 group-data-[align=end]/message:justify-end", className )} {...props} /> )}export { MessageGroup, Message, MessageAvatar, MessageContent, MessageFooter, MessageHeader,}