ข้ามไปเนื้อหา
WhereUI

ค้นหาในเอกสาร

ค้นหาชื่อ component หรือหน้าเอกสาร

Message

จาก shadcn

โครงหนึ่งข้อความในบทสนทนา ประกอบด้วยรูปผู้ส่ง หัวข้อ เนื้อหา และท้ายข้อความ จัดชิดซ้าย–ขวาตามผู้ส่ง ใช้คู่กับ Bubble เพื่อสร้างกล่องคุย

น้ำ
น้ำใจ · 09:41
สวัสดีครับ ต้องการยื่นคำขอกู้กองทุนสวัสดิการครับ
ปี่
ปี่ (ฝ่ายสวัสดิการ) · 09:42
รับทราบค่ะ กรอกแบบฟอร์มและแนบสลิปเงินเดือนก่อนนะคะ
ส่งแล้ว · อ่านแล้ว
น้ำ
น้ำใจ · 09:45
ส่งเอกสารเรียบร้อยแล้วครับ

ติดตั้ง

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,}