ChatMessage
ChatMessageは、AIチャットインターフェース向けのメッセージ表示コンポーネントです。送信者のロール(assistant / user)に応じたバブルスタイル、タイピングインジケーター、配信ステータス、ホバーアクションをシンプルなAPIで制御できます。
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"は右揃えで表示されます。ロールに応じてレイアウトと配置が自動的に切り替わります。
<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プロパティに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(Root)、ChatMessageAvatar、ChatMessageContent、ChatMessageFooterの4部構成です。
Props
ChatMessage
role"assistant""assistant" | "user"送信者のロール。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"アバターのサイズ(sm / md / lg)。バブルとのギャップも合わせて調整される
typingfalseboolean | { variant?: "dots" | "cursor", color?: "default" | "primary" | "muted", speed?: "slow" | "default" | "fast", label?: string, showLabel?: boolean }trueにするとContentエリアにタイピングドットアニメーションを表示
actionsundefinedReactNodeホバー時に表示するアクションボタン(コピー・リアクションなど)
classNameundefinedstring追加のCSSクラス
| Name | Type | Default | Description |
|---|---|---|---|
role | "assistant" | "user" | "assistant" | 送信者のロール。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 | アバターのサイズ(sm / md / lg)。バブルとのギャップも合わせて調整される |
typing | boolean | { variant?: "dots" | "cursor", color?: "default" | "primary" | "muted", speed?: "slow" | "default" | "fast", label?: string, showLabel?: boolean } | false | trueにするとContentエリアにタイピングドットアニメーションを表示 |
actions | ReactNode | undefined | ホバー時に表示するアクションボタン(コピー・リアクションなど) |
className | string | undefined | 追加のCSSクラス |
ChatMessageAvatar
size"md""sm" | "md" | "lg"アバターの表示サイズ(sm: 24px / md: 28px / lg: 32px)
srcundefinedstringアバター画像のURL
alt"Avatar"stringアバター画像の代替テキスト
initialsundefinedstring画像がない場合に表示するイニシャル(1〜2文字)
iconundefinedReactNodeアバター内に表示するカスタムアイコン
classNameundefinedstring追加のCSSクラス
| Name | Type | Default | Description |
|---|---|---|---|
size | "sm" | "md" | "lg" | "md" | アバターの表示サイズ(sm: 24px / md: 28px / lg: 32px) |
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"フッターのフォントサイズを上書きする(省略するとコンテキストの値を使用)
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 | フッターのフォントサイズを上書きする(省略するとコンテキストの値を使用) |
className | string | undefined | 追加のCSSクラス |
Anatomy
Best Practices
推奨
- ✓role="assistant"にはChatMessageAvatarを含める
- ✓role="user"のFooterにstatusを指定して配信状態を示す
- ✓typing=trueのときはChatMessageContentを空にする
避けるべき
- ✗role="user"にChatMessageAvatarを配置しない
- ✗同じメッセージにtypingとchildrenを同時に使わない
- ✗汎用コンテンツ表示には使わない — Cardを使用する
Accessibility
キーボード操作
ARIA / WCAG
- アバターにaria-hidden="true"を設定(装飾的要素)
- 配信ステータスはスクリーンリーダーが読み取れるテキストで表示
- タイピングドットにaria-hidden="true"を設定