ChatMessage
ChatMessage는 AI 채팅 인터페이스용 메시지 표시 컴포넌트입니다. assistant는 왼쪽, user는 오른쪽에 정렬되며, 타이핑 애니메이션, 전송 상태, 호버 액션을 지원합니다.
Playground
<div className="flex flex-col gap-4">
<ChatMessage avatarSize="md">
<ChatMessageAvatar />
<div className="flex flex-col gap-1">
<ChatMessageContent>Sure! Let me help you with that.</ChatMessageContent>
<ChatMessageFooter timestamp="12:33" />
</div>
</ChatMessage>
<ChatMessage role="user" color="muted">
<div className="flex flex-col gap-1 items-end">
<ChatMessageContent>That makes sense!</ChatMessageContent>
<ChatMessageFooter timestamp="12:34" />
</div>
</ChatMessage>
</div>Variants
Sizes
smdefaultlg| Size | 패딩 | 폰트 | Avatar |
|---|---|---|---|
sm | 12 × 6px | 13px | 24px |
default | 14 × 8px | 14px | 28px |
lg | 16 × 10px | 16px | 32px |
Features
Role
role="assistant"는 왼쪽 정렬, role="user"는 오른쪽 정렬로 표시됩니다. role에 따라 레이아웃과 정렬이 자동으로 전환됩니다.
<ChatMessage role="assistant">
<ChatMessageAvatar />
<div className="flex flex-col gap-1">
<ChatMessageContent>How can I help you?</ChatMessageContent>
<ChatMessageFooter timestamp="12:34" />
</div>
</ChatMessage>
<ChatMessage role="user" color="muted">
<div className="flex flex-col gap-1 items-end">
<ChatMessageContent>That makes sense!</ChatMessageContent>
<ChatMessageFooter timestamp="12:35" status="read" />
</div>
</ChatMessage>UI Type
Messenger는 버블 스타일 채팅 UI, History는 플랫 스타일 히스토리 UI입니다. 용도에 맞게 선택해 사용합니다.
Typing
typing=true로 설정하면 Content 영역에 타이핑 점 애니메이션이 표시됩니다. AI 응답 스트리밍 중에 사용합니다.
<ChatMessage role="assistant" typing>
<ChatMessageAvatar />
<ChatMessageContent />
</ChatMessage>Actions
actions prop에 ReactNode를 전달하면 버블에 호버 시 액션 버튼이 표시됩니다.
<ChatMessage
role="assistant"
actions={
<button className="p-1 rounded hover:bg-background-muted">
<svg>...</svg>
</button>
}
>
<ChatMessageAvatar />
<div className="flex flex-col gap-1">
<ChatMessageContent>How can I help?</ChatMessageContent>
<ChatMessageFooter timestamp="12:34" />
</div>
</ChatMessage>API
Component Structure
ChatMessage— Compound · Pure ReactChatMessage컨텍스트 프로바이더 + flex 컨테이너ChatMessageAvatar아바타(이미지, 이니셜, 아이콘)ChatMessageContent버블 또는 플랫 메시지 내용ChatMessageFooter타임스탬프와 전송 상태서브컴포넌트 구성. ChatMessage(루트), ChatMessageAvatar, ChatMessageContent, ChatMessageFooter로 구성됩니다.
Props
ChatMessage
role"assistant""assistant" | "user"발신자 role. assistant는 왼쪽 정렬, user는 오른쪽 정렬. 버블 색상도 자동 전환
variant"bubble""bubble" | "flat"버블 스타일. bubble(테두리), flat(배경 없음)
color"default""default" | "muted" | "primary" | "dark"버블 배경색. default(테두리), muted(연한 배경), primary(브랜드), dark
size"default""sm" | "default" | "lg"사이즈 스케일. sm, default, lg
radius"2xl""md" | "lg" | "xl" | "2xl"버블 모서리 둥글기
tailtrueboolean비대칭 테일, 아바타 쪽 버블 모서리를 0으로 설정합니다
avatarSizeundefined"sm" | "md" | "lg"아바타 크기, 버블과의 간격도 함께 조정됩니다
typingfalseboolean | { variant?: "dots" | "cursor", color?: "default" | "primary" | "muted", speed?: "slow" | "default" | "fast", label?: string, showLabel?: boolean }Content 영역에 타이핑 점 애니메이션 표시
actionsundefinedReactNode호버 시 표시되는 액션 버튼(복사, 리액션 등)
classNameundefinedstring추가 CSS 클래스
| Name | Type | Default | Description |
|---|---|---|---|
role | "assistant" | "user" | "assistant" | 발신자 role. assistant는 왼쪽 정렬, user는 오른쪽 정렬. 버블 색상도 자동 전환 |
variant | "bubble" | "flat" | "bubble" | 버블 스타일. bubble(테두리), flat(배경 없음) |
color | "default" | "muted" | "primary" | "dark" | "default" | 버블 배경색. default(테두리), muted(연한 배경), primary(브랜드), dark |
size | "sm" | "default" | "lg" | "default" | 사이즈 스케일. sm, default, lg |
radius | "md" | "lg" | "xl" | "2xl" | "2xl" | 버블 모서리 둥글기 |
tail | boolean | true | 비대칭 테일, 아바타 쪽 버블 모서리를 0으로 설정합니다 |
avatarSize | "sm" | "md" | "lg" | undefined | 아바타 크기, 버블과의 간격도 함께 조정됩니다 |
typing | boolean | { variant?: "dots" | "cursor", color?: "default" | "primary" | "muted", speed?: "slow" | "default" | "fast", label?: string, showLabel?: boolean } | false | Content 영역에 타이핑 점 애니메이션 표시 |
actions | ReactNode | undefined | 호버 시 표시되는 액션 버튼(복사, 리액션 등) |
className | string | undefined | 추가 CSS 클래스 |
ChatMessageAvatar
size"md""sm" | "md" | "lg"아바타 표시 크기
srcundefinedstring아바타 이미지 URL
alt"Avatar"string아바타 이미지 대체 텍스트
initialsundefinedstring이미지 없을 때 표시되는 이니셜(1~2자)
iconundefinedReactNode아바타 안에 표시되는 커스텀 아이콘
classNameundefinedstring추가 CSS 클래스
| Name | Type | Default | Description |
|---|---|---|---|
size | "sm" | "md" | "lg" | "md" | 아바타 표시 크기 |
src | string | undefined | 아바타 이미지 URL |
alt | string | "Avatar" | 아바타 이미지 대체 텍스트 |
initials | string | undefined | 이미지 없을 때 표시되는 이니셜(1~2자) |
icon | ReactNode | undefined | 아바타 안에 표시되는 커스텀 아이콘 |
className | string | undefined | 추가 CSS 클래스 |
ChatMessageContent
classNameundefinedstring추가 CSS 클래스
| Name | Type | Default | Description |
|---|---|---|---|
className | string | undefined | 추가 CSS 클래스 |
ChatMessageFooter
timestampundefinedstring타임스탬프 문자열(예: "12:34 PM")
statusundefinedReactNode | "sending" | "sent" | "read" | "error"전송 상태. sending, sent, read, error
sizeundefined"sm" | "default" | "lg"푸터 폰트 크기 오버라이드. 생략 시 ChatMessage root의 컨텍스트 값을 사용합니다
classNameundefinedstring추가 CSS 클래스
| Name | Type | Default | Description |
|---|---|---|---|
timestamp | string | undefined | 타임스탬프 문자열(예: "12:34 PM") |
status | ReactNode | "sending" | "sent" | "read" | "error" | undefined | 전송 상태. sending, sent, read, error |
size | "sm" | "default" | "lg" | undefined | 푸터 폰트 크기 오버라이드. 생략 시 ChatMessage root의 컨텍스트 값을 사용합니다 |
className | string | undefined | 추가 CSS 클래스 |
Anatomy
Best Practices
권장
- ✓role="assistant"에는 ChatMessageAvatar를 포함합니다
- ✓user 메시지 Footer에 status를 지정해 전송 상태를 표시합니다
- ✓typing=true일 때 ChatMessageContent를 비워 둡니다
지양
- ✗role="user"에 ChatMessageAvatar를 배치하지 않습니다
- ✗typing과 children을 동시에 사용하지 않습니다
- ✗일반 콘텐츠 표시에는 사용하지 않습니다. Card를 사용하세요
Accessibility
키보드 조작
ARIA / WCAG
- 아바타에 aria-hidden="true" 설정(장식용 요소)
- 전송 상태는 스크린 리더가 읽을 수 있는 텍스트로 표시
- 타이핑 점에 aria-hidden="true" 설정