ChatBubble 聊天气泡
支持三种消息角色变体的聊天 UI 组件,粗边框气泡 + 阴影偏移让对话界面充满个性张力。
预览
颜色(仅 sent 生效)
尺寸
安装
pnpm dlx brutx-vue@latest add chat-bubble用法
<script setup>
import { ChatBubble } from 'brutx-ui-vue'
const message = {
id: '1',
variant: 'received',
name: 'Alex',
content: '这个 UI 库太好用了!',
timestamp: '14:01',
}
</script>
<template>
<div class="flex flex-col gap-3">
<ChatBubble :message="{ id: '1', variant: 'received', name: 'Alex', content: '你好!' }" />
<ChatBubble :message="{ id: '2', variant: 'sent', content: '嘿!' }" />
<ChatBubble :message="{ id: '3', variant: 'system', content: '对话已开始' }" />
</div>
</template>颜色变体
color 属性用于为 variant="sent" 的气泡切换背景配色,与 variant 正交组合(如 variant="sent" color="accent")。received 与 system 气泡不受 color 影响。
<script setup>
import { ChatBubble } from 'brutx-ui-vue'
</script>
<template>
<div class="flex flex-col gap-3">
<ChatBubble :message="{ id: '1', variant: 'sent', content: '默认配色', timestamp: '14:00' }" color="default" />
<ChatBubble :message="{ id: '2', variant: 'sent', content: '主色配色', timestamp: '14:01' }" color="primary" />
<ChatBubble :message="{ id: '3', variant: 'sent', content: '强调色配色', timestamp: '14:02' }" color="accent" />
</div>
</template>变体
消息角色
| 变体 | 样式 | 用途 |
|---|---|---|
received | 左对齐,背景色 | 对方消息 |
sent | 右对齐,主色背景 | 自己发送的消息 |
system | 居中,斜体,虚线边框,无阴影,强制 text-xs | 系统通知 |
注意:
system变体会忽略sizeprop,始终使用text-xs;同时隐藏头像和发送者名称。
颜色
| 颜色 | 说明 |
|---|---|
default | 默认配色,sent 气泡使用主色(brutal-primary)背景 |
primary | 主色配色,sent 气泡使用主色(brutal-primary)背景,并附加主色阴影(shadow-brutal-primary) |
accent | 强调色配色,sent 气泡使用强调色(brutal-accent)背景 |
尺寸
size 属性同时控制气泡的内边距、文字大小以及头像尺寸。
| 尺寸 | 气泡内边距 | 文字大小 | 头像尺寸 |
|---|---|---|---|
sm | px-3 py-1.5 | text-xs | w-6 h-6 |
default | px-4 py-2.5 | text-sm | w-8 h-8 |
lg | px-5 py-3.5 | text-base | w-10 h-10 |
<script setup>
import { ChatBubble } from 'brutx-ui-vue'
</script>
<template>
<div class="flex flex-col gap-3">
<ChatBubble :message="{ id: '1', variant: 'sent', name: '我', content: '小号气泡', timestamp: '14:00' }" size="sm" />
<ChatBubble :message="{ id: '2', variant: 'sent', name: '我', content: '默认气泡', timestamp: '14:01' }" size="default" />
<ChatBubble :message="{ id: '3', variant: 'sent', name: '我', content: '大号气泡', timestamp: '14:02' }" size="lg" />
</div>
</template>子组件
ChatContainer 聊天容器
支持时间分组的聊天消息容器:
<script setup>
import { ChatContainer } from 'brutx-ui-vue'
const messages = [
{ id: '1', variant: 'received', name: 'Alex', content: '你好!', timestamp: new Date() },
{ id: '2', variant: 'sent', content: '嘿!', timestamp: new Date(), status: 'read' },
]
</script>
<template>
<ChatContainer :messages="messages" group-by-time show-status />
</template>数据类型
ChatMessage
interface ChatMessage {
id: string // 消息唯一标识(必填)
content: string // 消息文本内容(必填)
variant?: 'sent' | 'received' | 'system' // 消息变体,默认 'received'
avatar?: string // 头像图片 URL,加载失败时回退为首字母缩写
name?: string // 发送者姓名,用于显示名称和生成首字母缩写
timestamp?: string | Date // 时间戳,字符串直接展示,Date 对象按 dateFormat 或 toLocaleString 格式化
status?: MessageStatus // 消息状态,仅对 variant="sent" 有效
}MessageStatus
type MessageStatus = 'sending' | 'sent' | 'delivered' | 'read' | 'failed'| 状态 | 图标 | 样式 |
|---|---|---|
sending | 旋转加载图标 | 半透明 + 旋转动画 |
sent | 单勾 | 半透明 |
delivered | 双勾 | 略深 |
read | 双勾 | 主题主色 |
failed | 警告图标 | 销毁色 |
注意:
status在类型层面为上述闭联合类型,但消息数据通常来自后端 API,运行时可能拿到枚举之外的未知值;此时 ChatBubble 会静默忽略该状态(不显示状态图标),不会抛出错误。
API 参考
ChatBubble
| 名称 | 类型 | 默认值 | 说明 |
|---|---|---|---|
message必填 | ChatMessage | — | 要展示的聊天消息对象,包含 id、content、角色、时间戳以及可选头像和状态信息。 |
详情声明类型ChatMessage 关联类型 ChatMessage 类型定义 — ChatMessageexport interface ChatMessage {
id: string
content: string
/** 消息角色,默认 'received' */
variant?: 'sent' | 'received' | 'system'
/** 头像图片 URL;加载失败时回退为首字母缩写 */
avatar?: string
/** 发送者姓名,用于展示名称与生成首字母缩写 */
name?: string
/**
* 时间戳。
* - `string`:按原样直接展示(不做格式化,传入方负责提供展示格式);
* - `Date`:按 `dateFormat` 或 `toLocaleString` 格式化。
*/
timestamp?: string | Date
/**
* 消息状态,**仅对 `variant === 'sent'` 生效**;received/system 携带时会被静默忽略。
*/
status?: MessageStatus
}默认值详情
来源packages/ui/src/components/chat-bubble/ChatBubble.vue | |||
color | "accent" | "default" | "primary" | undefined | "default" | 设置 sent 角色气泡的配色;received 和 system 角色不受此属性影响。 |
详情声明类型NonNullable<"default" | "primary" | "accent" | null | undefined> | undefined 字面量
默认值详情
来源packages/ui/src/components/chat-bubble/ChatBubble.vue | |||
size | "default" | "lg" | "sm" | undefined | "default" | 设置气泡内边距和文字尺寸,并同步调整头像尺寸。 |
详情声明类型NonNullable<"default" | "lg" | "sm" | null | undefined> | undefined 字面量
默认值详情
来源packages/ui/src/components/chat-bubble/ChatBubble.vue | |||
showAvatar | boolean | undefined | true | 控制头像区域的显示;system 角色始终不显示头像。 |
详情声明类型boolean | undefined 字面量
默认值详情
来源packages/ui/src/components/chat-bubble/ChatBubble.vue | |||
showStatus | boolean | undefined | true | 控制发送状态图标的显示;状态图标只用于 sent 角色。 |
详情声明类型boolean | undefined 字面量
默认值详情
来源packages/ui/src/components/chat-bubble/ChatBubble.vue | |||
showTimestamp | boolean | undefined | true | 控制消息时间戳的显示。 |
详情声明类型boolean | undefined 字面量
默认值详情
来源packages/ui/src/components/chat-bubble/ChatBubble.vue | |||
dateFormat | ((date: Date) => string) | undefined | undefined | 自定义消息日期和时间的格式化函数;未提供时使用 Date.toLocaleString。 |
详情声明类型((date: Date) => string) | undefined 默认值详情
来源packages/ui/src/components/chat-bubble/ChatBubble.vue | |||
class | string | undefined | undefined | 追加到消息气泡根元素的自定义 CSS 类。 |
详情声明类型string | undefined 默认值详情
来源packages/ui/src/components/chat-bubble/ChatBubble.vue | |||
| 名称 | 签名或类型 | 说明 |
|---|---|---|
#default | {} | 替换消息主体内容;未提供时显示 message.content。 |
详情声明类型{}来源packages/ui/src/components/chat-bubble/ChatBubble.vue | ||
ChatContainer
| 名称 | 类型 | 默认值 | 说明 |
|---|---|---|---|
messages必填 | ChatMessage[] | — | 按顺序展示的聊天消息数组。 |
详情声明类型ChatMessage[] 关联类型 ChatMessage 类型定义 — ChatMessageexport interface ChatMessage {
id: string
content: string
/** 消息角色,默认 'received' */
variant?: 'sent' | 'received' | 'system'
/** 头像图片 URL;加载失败时回退为首字母缩写 */
avatar?: string
/** 发送者姓名,用于展示名称与生成首字母缩写 */
name?: string
/**
* 时间戳。
* - `string`:按原样直接展示(不做格式化,传入方负责提供展示格式);
* - `Date`:按 `dateFormat` 或 `toLocaleString` 格式化。
*/
timestamp?: string | Date
/**
* 消息状态,**仅对 `variant === 'sent'` 生效**;received/system 携带时会被静默忽略。
*/
status?: MessageStatus
}默认值详情
来源packages/ui/src/components/chat-bubble/ChatContainer.vue | |||
groupByTime | boolean | undefined | false | 启用按真实日历日期和时间间隔对消息分组,并显示日期或时刻分隔标签。
|
详情声明类型boolean | undefined 字面量
默认值详情
来源packages/ui/src/components/chat-bubble/ChatContainer.vue | |||
groupInterval | number | undefined | 5 | 同一日期内相邻消息允许归入同一时间组的最大间隔,单位为分钟;小于 1 的值按 1 分钟处理。 |
详情声明类型number | undefined 默认值详情
来源packages/ui/src/components/chat-bubble/ChatContainer.vue | |||
showAvatar | boolean | undefined | true | 控制各条消息头像区域的显示。 |
详情声明类型boolean | undefined 字面量
默认值详情
来源packages/ui/src/components/chat-bubble/ChatContainer.vue | |||
showStatus | boolean | undefined | true | 控制 sent 消息状态图标的显示。 |
详情声明类型boolean | undefined 字面量
默认值详情
来源packages/ui/src/components/chat-bubble/ChatContainer.vue | |||
showTimestamp | boolean | undefined | true | 控制各条消息时间戳的显示。 |
详情声明类型boolean | undefined 字面量
默认值详情
来源packages/ui/src/components/chat-bubble/ChatContainer.vue | |||
dateFormat | ((date: Date) => string) | undefined | undefined | 格式化消息时间和分组标签的函数;未提供时使用本地日期时间格式。 |
详情声明类型((date: Date) => string) | undefined 默认值详情
来源packages/ui/src/components/chat-bubble/ChatContainer.vue | |||
class | string | undefined | undefined | 追加到聊天容器根元素的自定义 CSS 类。 |
详情声明类型string | undefined 默认值详情
来源packages/ui/src/components/chat-bubble/ChatContainer.vue | |||
注意: 当
groupByTime为true时:
- 带有效时间戳的消息按时间升序排序,乱序输入也能得到连续、不跳变的日期分组;缺失或无法解析出有效时间戳的消息(如
'14:30'、'昨天'等展示型字符串)按原索引锚定在原始位置,不沉底、相对顺序不变;- 分组边界基于真实日历日期(年/月/日)比较,与
dateFormat的展示字符串解耦:即使自定义格式只输出时间维度(如 HH:mm),跨日期的消息也不会被误合并、同日期的消息也不会被拆成多个日期组;- 分组之间显示分隔线和日期标签(今天/昨天/具体日期);
- 同一日期内相邻消息时间差超过
groupInterval分钟时,进一步拆分为独立分组,并展示具体时刻(HH:mm,可用dateFormat自定义),不重复日期标签。
可访问性
- ARIA 属性:ChatContainer 使用
role="log"以支持无障碍访问 - 语义化:消息气泡使用语义化结构,支持屏幕阅读器正确朗读