Chat

对话/AI 聊天组件:消息流(头像/标题/内容/操作区,内容走 MarkdownRender)+ 输入区(textarea + Upload 附件 + 发送)+ 提示区(Hint)。框架无关逻辑在 @chenzy-design/core(buildSendContent/appendDivider/toggleLike/toggleDislike/resetLastMessage/shouldShowBackBottom/resolveEnableUpload/shouldSendOnEnter)。受控/非受控 chats(对齐 Upload value 模式),变换经 onChatsChange 回传。align(leftRight/leftAlign)、mode(bubble/noBubble/userBubble)、sendHotKey(enter/shift+enter)、enableUpload 三态。消息流 role=log/aria-live=polite;滚动出现回到底部悬浮按钮(SHOW_SCROLL_GAP=100)。ref 方法 resetMessage/scrollToBottom(animation)/clearContext/sendMessage。所有自定义渲染走 Svelte snippet(renderInputArea/renderChatBoxAvatar/Title/Content/Action/renderFullChatBox/renderHintBox/renderDivider)。

设计文档

如何引入

import { Chat } from '@chenzy-design/svelte';

基础对话

chats + roleConfig,onMessageSend 里追加用户与助手消息。

助手

消息状态

status 支持 loading / incomplete / complete / error。

助手
生成中…
助手
助手
出错了

提示区

hints 提供快捷提问,点击触发 onHintClick。

助手

API 参考

Chat

Props

属性说明类型默认值
chats消息列表;传入即受控,否则内部维护Message[]undefined
roleConfig角色元数据(名称/头像/色),按 message.role 取RoleConfigundefined
align布局对齐(左右分列 / 全左对齐)'leftRight'|'leftAlign''leftRight'
mode气泡模式'bubble'|'noBubble'|'userBubble''bubble'
sendHotKey发送快捷键'enter'|'shift+enter''enter'
showClearContext是否展示清除上下文按钮booleanfalse
showStopGenerate是否展示停止生成按钮booleanfalse
hints提示项列表(点击追加为一条 user 消息)string[]undefined
enableUpload上传能力(true/false 或 {pasteUpload,dragUpload,clickUpload} 三态)boolean|EnableUploadPropstrue
uploadProps透传内部 Upload 的 propsUploadPropsundefined
markdownRenderProps透传消息内容 MarkdownRender 的 propsMarkdownRenderPropsundefined
placeholder输入框占位(缺省走 locale Chat.placeholder)stringundefined
topSlot顶部插槽Snippetundefined
bottomSlot底部插槽(列表与输入区之间)Snippetundefined
class根类名透传string''
style根内联样式stringundefined
onChatsChangechats 变化回调(受控父级据此更新)(chats: Message[]) => voidundefined
onMessageSend发送消息回调(content: string, attachment: UploadFileItem[]) => voidundefined
onInputChange输入变化回调(props: { value: string; attachment: UploadFileItem[] }) => voidundefined
onClear清除上下文回调() => voidundefined
onHintClick点击提示项回调(hint: string) => voidundefined
onStopGenerator停止生成回调() => voidundefined
onMessageCopy复制消息回调(message: Message) => voidundefined
onMessageDelete删除消息回调(message: Message) => voidundefined
onMessageReset重生成消息回调(message: Message) => voidundefined
onMessageGoodFeedback点赞回调(message: Message) => voidundefined
onMessageBadFeedback点踩回调(message: Message) => voidundefined
renderInputArea自定义整块输入区Snippet<[RenderInputAreaProps]>undefined
renderChatBoxAvatar自定义消息头像Snippet<[RenderAvatarProps]>undefined
renderChatBoxTitle自定义消息标题Snippet<[RenderTitleProps]>undefined
renderChatBoxContent自定义消息内容Snippet<[RenderContentProps]>undefined
renderChatBoxAction自定义消息操作区Snippet<[RenderActionProps]>undefined
renderFullChatBox自定义整条消息(提供拆分节点)Snippet<[RenderFullChatBoxProps]>undefined
renderHintBox自定义单个提示项Snippet<[RenderHintBoxProps]>undefined
renderDivider自定义清除上下文分割线Snippet<[Message]>undefined

Events

事件载荷说明
onChatsChange消息列表变化
onMessageSend发送消息
onInputChange输入内容/附件变化
onClear清除上下文
onHintClick点击提示项
onStopGenerator停止生成
onMessageCopy复制消息
onMessageDelete删除消息
onMessageReset重生成消息
onMessageGoodFeedback点赞
onMessageBadFeedback点踩

Slots

名称说明
topSlot顶部插槽
bottomSlot列表与输入区之间插槽
renderInputArea自定义整块输入区
renderChatBoxAvatar自定义头像
renderChatBoxTitle自定义标题
renderChatBoxContent自定义内容
renderChatBoxAction自定义操作区
renderFullChatBox自定义整条消息
renderHintBox自定义提示项
renderDivider自定义分割线

Methods

属性类型说明
resetMessage将最后一条消息重置为 loading(对齐 Semi resetMessage)
scrollToBottom滚动到底部;animation=true 带缓动
clearContext清除上下文(末尾追加 divider)
sendMessage以文本 + 附件发送一条消息

Accessibility

ARIA rolelog
键盘交互EnterShift+Enter
  • 消息流容器 role=log / aria-live=polite / aria-label 走 locale Chat.messageList,新消息被屏幕阅读器播报
  • 输入区 textarea,Enter/Shift+Enter 由 sendHotKey + core.shouldSendOnEnter 判定(组合输入 isComposing 时不发送)
  • 发送/上传/清除/复制/删除/重生成/赞/踩 均为原生 <button>,aria-label 走 locale;赞/踩 aria-pressed 反映激活态
  • 回到底部悬浮按钮为原生 <button>,滚动距底 > SHOW_SCROLL_GAP(100) 时出现,aria-label=Chat.backToBottom
  • 发送按钮 disabled 对齐 Semi getDisableSend:无文本且无附件 / 附件有未 success / 显式 disableSend

设计变量

变量默认值用法
--cd-chat-motion-duration var(--cd-motion-duration-fast)返回底部显隐 / 悬浮过渡时长