输入框
输入框的文字与状态在 settings 里配置,业务组件放进输入框周围的插槽。
用法
配置项
booleantrue回答生成中是否允许继续发送。发送队列由 ChatKit 管理;设为 false 时,生成中按钮固定为停止,回车变成换行。sendTip 是发送按钮的悬停/聚焦提示;草稿为空、按钮禁用时仍可悬停查看,但不能发送。
输入建议
features.promptCompletion 默认关闭。提供候选即可在空输入框启用:
- 空输入框显示候选和「Tab 输入」chip。按无修饰键的 Tab 或激活 chip 只填入草稿,不发送;焦点和光标留在编辑器末尾,可直接输入。
- 有多条候选时,刚填入且尚未编辑的草稿可再次按 Tab 或激活「Tab 换一个」chip 来替换。手打、粘贴的相同文字不会被覆盖;只有一条候选时,再按 Tab 正常导航。
- 在输入框按 Escape 可退出本次补全,随后 Tab 正常导航;离开输入区后重新聚焦可再次使用。
空草稿只显示一种提示:
- 可编辑、有候选:显示候选和 chip,暂时隐藏
settings.placeholder。 - 可编辑、无候选:显示 placeholder。
- 禁用:隐藏候选和 chip,不能输入;设置了
settings.composer.disabledReason则显示禁用原因。
聚焦只暂停轮播,不隐藏候选。禁用原因仅在禁用且草稿为空时显示;已有草稿需要持续提示时,请在输入框外展示。
候选随正文高度增长,达到编辑器 max-height 后在同一编辑器视口滚动,chip 留在文字滚动区外。候选以编辑器真实空段落内的视图装饰显示,不进入草稿、发送内容或撤销历史。相同原文、宿主样式与宽度下,提示和填入正文共用段落内容盒、字体、行高及换行,仅候选文字使用较浅的 --chatkit-color-text-tertiary;段落边框的 currentColor 不随之变色。chip 位于段落外,保留独立操作样式。公开的段落盒模型/排版支持范围与例外见主题与样式覆盖。若宿主通过公开的 slots['composer.overlay'] 在输入区放置覆盖层,建议会退到输入框下方;这条物理位置不同的路径不保证同位置对齐。
onAccept(item, context) 只在候选成功写入草稿后通知宿主,返回值不能取消写入;编辑器因长度限制等原因拒绝写入时不会调用。context.trigger: 'tab' 表示输入区的 Tab 快捷键;'click' 表示 chip 原生按钮被激活,包含鼠标/触摸点击和按钮聚焦后按 Enter/Space,并非仅指鼠标。context.action: 'fill' 是首次填入空草稿,'replace' 是切换本功能填入且未编辑的草稿。
宿主可通过 renderChip 传入 React 组件或渲染函数,接收当前 item 和 action(fill / replace),仅渲染非交互的视觉内容;Chatkit 保留外层原生按钮及点击、键盘、焦点和可访问名称。返回内容会嵌在该按钮内,不能包含 button、链接、input、select、textarea 或任何可聚焦后代(包括 tabIndex / contentEditable);不要直接返回设计系统的 Button 组件。ReactNode 类型无法静态识别这些后代,请按此契约接入。设置 chipLayout: 'new-line' 可让 chip 独占候选下方一行。默认 auto 仅在段落左对齐/起始对齐、文字方向非 RTL、候选末尾没有换行、末行仍在编辑器可见区内,且右侧容得下 8px 间距与整个 chip 时将 chip 放在同行;否则另起一行,长文达到编辑器最大高度后留在滚动区外。无需覆盖内部 CSS class。
候选只在输入区没有焦点、草稿为空、页面可见时自动轮播;输入区获得焦点后候选保持稳定,可用 Tab 或 chip 主动切换。浏览器偏好减少动态效果时停止自动轮播,偏好变化会即时生效;如不需要自动轮播,可设置 rotateIntervalMs: false。功能关闭或组件卸载时也不轮播。草稿有提及、引用、技能或行内上传等结构化节点时不替换;独立附件保留。超过编辑器长度限制的候选不会写入,也不会触发 onAccept。
输入框周围的位置
见插槽。
从别处操作输入框
useComposer() 可以在插槽里的组件,或 <ChatkitProvider> 下的任何组件里使用:填入文字、插入引用、加附件、聚焦、发送。见 Hook 参考。
说明
- 默认回车发送,Shift+Enter 换行;输入法选词和候选面板的回车先交给对应交互处理。回答生成中允许排队时,有内容可继续发送;关闭
allowSendWhileSending后,生成中回车换行。 - 发送被受理(包括进入队列)后清空草稿;被
onSend拦下、未受理或受理前抛错时保留。受理后这一轮执行失败,不会自动恢复草稿。 - 上传未完成或失败、正文中存在未处理的附件时,发送会被阻止,需要等待、重试或移除附件。
settings.composer.hidden只隐藏输入框,不会禁用推荐问题、编辑、重新生成或代码中的发送入口。只读页面还需移除这些操作;disabled也只约束输入框交互。- 输入框隐藏或尚未挂载时,
useComposer()的写操作返回false,读取返回空内容;submit()的布尔值表示找到了输入框并触发提交,不代表发送已被受理。