控制组件
交互控制相关组件:ControlPanel、Input、RecommendedQuestions。
ControlPanel
语音/文字输入控制面板,支持模式切换。
基本用法
import {PilotKit, ControlPanel} from '@bdky/aaas-pilot-kit-react-widget';
function App() {
return (
<PilotKit {...props}>
<ControlPanel />
</PilotKit>
);
}
响应式适配
📱 详见 响应式适配指南
| 特性 | PC 端 | 移动端 |
|---|---|---|
| 输入框宽度 | 479px 固定 | 100% 自适应 |
| 按钮大小 | 54-55px | 50px |
| 布局 | 居中绝对定位 | 全宽 flex |
| 挂断按钮 | 可选显示 | 始终显示 |
Props
| 属性 | 类型 | 默认值 | 说明 |
|---|---|---|---|
variant | 'auto' | 'mobile' | 'desktop' | 'auto' | 显示模式 |
className | string | - | 自定义类名 |
style | CSSProperties | - | 自定义样式 |
mode | 'voice' | 'text' | - | 受控模式 |
defaultMode | 'voice' | 'text' | 'voice' | 默认模式 |
onModeChange | (mode) => void | - | 模式切换回调 |
inputValue | string | - | 受控输入值 |
inputPlaceholder | string | '请输入...' | 输入框占位符 |
inputDisabled | boolean | false | 是否禁用输入 |
onInputChange | (value) => void | - | 输入变化回调 |
onSend | (value) => void | - | 发送回调 |
onMuteToggle | (muted) => void | - | 静音切换回调 |
showHangupButton | boolean | false | 是否显示挂断按钮 |
onHangup | () => void | - | 挂断回调 |
自定义图标
| 属性 | 类型 | 说明 |
|---|---|---|
muteIcon | ReactNode | 静音状态图标 |
unmuteIcon | ReactNode | 非静音状态图标 |
hangupIcon | ReactNode | 挂断按钮图标 |
asrIcon | ReactNode | ASR 模式图标 |
keyboardIcon | ReactNode | 键盘模式图标 |
sendIcon | ReactNode | 发送按钮图标 |
自定义渲染
<ControlPanel>
{/* 完全自定义控制面板 */}
<div className="my-control-panel">
<button>自定义按钮</button>
</div>
</ControlPanel>
样式定制
| 类名 | 说明 |
|---|---|
.apk-control-panel | 根容器 |
.apk-control-panel--mobile | 移动端样式 |
.apk-control-panel__inner | 内层容器 |
.apk-control-panel__mode-btn | 模式切换按钮 |
.apk-control-panel__input-wrapper | 输入框容器 |
.apk-control-panel__input | 输入框 |
.apk-control-panel__send-btn | 发送按钮 |
.apk-control-panel__mic-btn | 麦克风按钮 |
.apk-control-panel__hangup-btn | 挂断按钮 |
.apk-control-panel__icon | 图标 |
.apk-control-panel__icon-mute | 静音图标 |
Input
独立的文字输入框组件。
基本用法
import {PilotKit, Input} from '@bdky/aaas-pilot-kit-react-widget';
function App() {
return (
<PilotKit {...props}>
<Input placeholder="输入消息..." />
</PilotKit>
);
}
响应式适配
| 特性 | PC 端 | 移动端 |
|---|---|---|
| 宽度 | 479px | 100% |
| 高度 | 55px | 50px |
| 圆角 | 28px | 20px |
| 内边距 | 24px | 16px |
Props
| 属性 | 类型 | 默认值 | 说明 |
|---|---|---|---|
variant | 'auto' | 'mobile' | 'desktop' | 'auto' | 显示模式 |
className | string | - | 自定义类名 |
style | CSSProperties | - | 自定义样式 |
value | string | - | 受控值 |
defaultValue | string | '' | 默认值 |
placeholder | string | '请输入...' | 占位符 |
disabled | boolean | false | 是否禁用 |
maxLength | number | - | 最大长度 |
autoFocus | boolean | false | 是否自动聚焦 |
status | 'default' | 'error' | 'warning' | 'default' | 状态 |
loading | boolean | false | 是否加载中 |
showSendIcon | boolean | true | 是否显示发送图标 |
sendIcon | ReactNode | - | 自定义发送图标 |
onChange | (e) => void | - | 原生 change 事件 |
onTextChange | (value) => void | - | 文本变化回调 |
onSend | (value) => void | - | 发送回调 |
onFocus | (e) => void | - | 聚焦回调 |
onBlur | (e) => void | - | 失焦回调 |
onKeyDown | (e) => void | - | 按键回调 |
自定义渲染
<Input>
{({value, setValue, handleSend, disabled, loading}) => (
<div className="my-input">
<input
value={value}
onChange={e => setValue(e.target.value)}
disabled={disabled}
/>
<button onClick={handleSend} disabled={loading}>
发送
</button>
</div>
)}
</Input>
样式定制
| 类名 | 说明 |
|---|---|
.apk-input | 根容器 |
.apk-input--mobile | 移动端样式 |
.apk-input--desktop | 桌面端样式 |
.apk-input__field | 输入框 |
.apk-input__send-icon | 发送图标 |
.apk-input__loader | 加载指示器 |
.apk-input--error | 错误状态 |
.apk-input--warning | 警告状态 |
.apk-input--disabled | 禁用状态 |
.apk-input--loading | 加载状态 |
RecommendedQuestions
推荐问题列表组件。
基本用法
import {PilotKit, RecommendedQuestions} from '@bdky/aaas-pilot-kit-react-widget';
function App() {
const pilotKitRef = useRef(null);
return (
<PilotKit ref={pilotKitRef} {...props}>
<RecommendedQuestions
questions={['介绍一下自己', '你能做什么?', '帮我查询订单']}
onQuestionClick={q => pilotKitRef.current?.input(q)}
/>
</PilotKit>
);
}
响应式适配
| 特性 | PC 端 | 移动端 |
|---|---|---|
| 布局 | 水平排列 | 垂直排列 |
| 背景 | 半透明胶囊 | 透明 |
| 问题项 | 文字 + 箭头 | 卡片样式 |
| 标题 | 显示 | 默认隐藏 |
| 分隔符 | 显示 | 隐藏 |
Props
| 属性 | 类型 | 默认值 | 说明 |
|---|---|---|---|
variant | 'auto' | 'mobile' | 'desktop' | 'auto' | 显示模式 |
className | string | - | 自定义类名 |
style | CSSProperties | - | 自定义样式 |
questions | string[] | [] | 问题列表 |
title | string | '试试这样问:' | 标题文本 |
showTitle | boolean | false | 是否显示标题 |
showDivider | boolean | true | 是否显示分隔符 |
expanded | boolean | false | 是否展开状态 |
arrowIcon | ReactNode | - | 自定义箭头图标 |
onQuestionClick | (question: string) => void | - | 点击问题回调 |
样式定制
| 类名 | 说明 |
|---|---|
.apk-recommended-questions | 根容器 |
.apk-recommended-questions--mobile | 移动端样式 |
.apk-recommended-questions__title | 标题 |
.apk-recommended-questions__divider | 分隔符 |
.apk-recommended-questions__list | 问题列表 |
.apk-recommended-questions__item | 问题项 |
.apk-recommended-questions__arrow | 箭头图标 |
.apk-recommended-questions__arrow-icon | 移动端箭头图标 |
相关
- PilotKit - 核心容器组件
- React SDK Hooks - 底层 Hooks