rt-chat-input 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +140 -0
- package/dist/chat-input.es.js +1294 -0
- package/dist/chat-input.umd.js +1 -0
- package/dist/style.css +1 -0
- package/dist/types/assets/images.d.ts +7 -0
- package/dist/types/components/ChatInput.vue.d.ts +92 -0
- package/dist/types/components/Modal.vue.d.ts +44 -0
- package/dist/types/components/Toast.vue.d.ts +6 -0
- package/dist/types/components/VoiceRecorder.vue.d.ts +30 -0
- package/dist/types/composables/useToast.d.ts +8 -0
- package/dist/types/icons/ArrowUpIcon.vue.d.ts +7 -0
- package/dist/types/icons/AttachmentIcon.vue.d.ts +7 -0
- package/dist/types/icons/KeyboardIcon.vue.d.ts +7 -0
- package/dist/types/icons/LoadingIcon.vue.d.ts +7 -0
- package/dist/types/icons/MicrophoneIcon.vue.d.ts +7 -0
- package/dist/types/icons/PlayIcon.vue.d.ts +7 -0
- package/dist/types/icons/SendIcon.vue.d.ts +7 -0
- package/dist/types/icons/StopIcon.vue.d.ts +7 -0
- package/dist/types/icons/index.d.ts +8 -0
- package/dist/types/index.d.ts +11 -0
- package/dist/types/types/index.d.ts +42 -0
- package/package.json +46 -0
package/README.md
ADDED
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
# @rongxiaobao/chat-input
|
|
2
|
+
|
|
3
|
+
一个基于 Vue 3 的多模态聊天输入框组件,集成了文本输入、语音录制(支持实时转写)、文件上传等功能。零外部 UI 框架依赖,轻量且易于集成。
|
|
4
|
+
|
|
5
|
+
## 特性
|
|
6
|
+
|
|
7
|
+
- 🎤 **高级语音录制**:支持波形可视化、音量检测、实时 WebSocket 转写。
|
|
8
|
+
- 📱 **移动端优化**:专为移动端设计的手势交互(上滑取消、侧滑编辑)。
|
|
9
|
+
- 📂 **文件预览**:内置图片和文件预览区域。
|
|
10
|
+
- 🎨 **主题定制**:内置 Light/Dark 主题,支持 CSS 变量自定义。
|
|
11
|
+
- 🔌 **零依赖**:完全移除 Element Plus 等重型 UI 库依赖,仅依赖 Vue 3。
|
|
12
|
+
- 🔋 **H5Plus 支持**:兼容 UniApp/H5Plus 环境的原生麦克风权限调用。
|
|
13
|
+
|
|
14
|
+
## 安装
|
|
15
|
+
|
|
16
|
+
```bash
|
|
17
|
+
npm install @rongxiaobao/chat-input
|
|
18
|
+
# 或
|
|
19
|
+
yarn add @rongxiaobao/chat-input
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
## 快速使用
|
|
23
|
+
|
|
24
|
+
```vue
|
|
25
|
+
<template>
|
|
26
|
+
<div class="chat-container">
|
|
27
|
+
<!-- 消息列表区域 (自定义) -->
|
|
28
|
+
<div class="message-list">...</div>
|
|
29
|
+
|
|
30
|
+
<!-- 输入框组件 -->
|
|
31
|
+
<ChatInput
|
|
32
|
+
placeholder="请输入消息..."
|
|
33
|
+
:ws-url="wsUrl"
|
|
34
|
+
@send="handleSend"
|
|
35
|
+
@voice="handleVoice"
|
|
36
|
+
@attach="handleAttach"
|
|
37
|
+
/>
|
|
38
|
+
</div>
|
|
39
|
+
</template>
|
|
40
|
+
|
|
41
|
+
<script setup>
|
|
42
|
+
import { ChatInput } from "@rongxiaobao/chat-input";
|
|
43
|
+
import "@rongxiaobao/chat-input/style.css"; // 引入样式
|
|
44
|
+
|
|
45
|
+
const wsUrl = "wss://your-api.com/ws/transcription";
|
|
46
|
+
|
|
47
|
+
const handleSend = (text, files) => {
|
|
48
|
+
console.log("发送消息:", text, files);
|
|
49
|
+
};
|
|
50
|
+
|
|
51
|
+
const handleVoice = (audioBlob, duration) => {
|
|
52
|
+
console.log("语音录制完成:", audioBlob, duration);
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
const handleAttach = (files) => {
|
|
56
|
+
console.log("文件列表更新:", files);
|
|
57
|
+
};
|
|
58
|
+
</script>
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
### 开箱即用(固定底部)
|
|
62
|
+
|
|
63
|
+
只需添加 `fixed` 属性,组件会自动固定在页面底部,无需额外 CSS。
|
|
64
|
+
|
|
65
|
+
```vue
|
|
66
|
+
<template>
|
|
67
|
+
<div class="page-content">
|
|
68
|
+
<!-- 聊天记录... -->
|
|
69
|
+
|
|
70
|
+
<!-- 自动固定在底部 -->
|
|
71
|
+
<ChatInput fixed />
|
|
72
|
+
</div>
|
|
73
|
+
</template>
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
## API 文档
|
|
77
|
+
|
|
78
|
+
### ChatInput 组件
|
|
79
|
+
|
|
80
|
+
#### Props
|
|
81
|
+
|
|
82
|
+
| 属性名 | 类型 | 默认值 | 说明 |
|
|
83
|
+
| ---------------------- | ----------------------------- | ------------------------- | --------------------------------------------------- |
|
|
84
|
+
| `placeholder` | `string` | `'请输入,或按住说话...'` | 输入框占位符 |
|
|
85
|
+
| `disabled` | `boolean` | `false` | 是否禁用 |
|
|
86
|
+
| `wsUrl` | `string` | `undefined` | 实时语音转写 WebSocket 地址 |
|
|
87
|
+
| `maxVoiceDuration` | `number` | `60` | 最大录音时长(秒) |
|
|
88
|
+
| `theme` | `'light' \| 'dark' \| 'auto'` | `'light'` | 主题模式 |
|
|
89
|
+
| `fixed` | `boolean` | `false` | 是否开启固定底部定位(开箱即用模式) |
|
|
90
|
+
| `bottomOffset` | `number \| string` | `36` | 底部距离偏移量(仅 fixed=true 时有效),数字单位 px |
|
|
91
|
+
| `showVoiceButton` | `boolean` | `true` | 是否显示语音按钮 |
|
|
92
|
+
| `showAttachmentButton` | `boolean` | `true` | 是否显示附件按钮 |
|
|
93
|
+
| `acceptFileTypes` | `string` | `'image/*,.pdf...'` | 允许上传的文件类型 |
|
|
94
|
+
|
|
95
|
+
#### Events
|
|
96
|
+
|
|
97
|
+
| 事件名 | 参数 | 说明 |
|
|
98
|
+
| -------- | --------------------------------- | -------------------------------------------------- |
|
|
99
|
+
| `send` | `(text: string, files: File[])` | 点击发送按钮或回车时触发 |
|
|
100
|
+
| `voice` | `(audio: Blob, duration: number)` | 语音录制完成时触发(仅非实时转写模式或纯语音模式) |
|
|
101
|
+
| `change` | `(text: string)` | 输入框内容变化时触发 |
|
|
102
|
+
| `attach` | `(files: File[])` | 附件列表变化时触发 |
|
|
103
|
+
| `error` | `(message: string)` | 发生错误时触发 |
|
|
104
|
+
|
|
105
|
+
### VoiceRecorder 组件
|
|
106
|
+
|
|
107
|
+
如果你只需要单独的语音录制按钮,可以使用此组件。
|
|
108
|
+
|
|
109
|
+
```vue
|
|
110
|
+
<script setup>
|
|
111
|
+
import { VoiceRecorder } from "@rongxiaobao/chat-input";
|
|
112
|
+
</script>
|
|
113
|
+
|
|
114
|
+
<template>
|
|
115
|
+
<VoiceRecorder variant="block" @voiceRecorded="(blob, duration) => {}" />
|
|
116
|
+
</template>
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
## 主题定制
|
|
120
|
+
|
|
121
|
+
组件使用 CSS 变量进行样式定义,你可以通过覆盖这些变量来定制主题:
|
|
122
|
+
|
|
123
|
+
```css
|
|
124
|
+
:root {
|
|
125
|
+
--chat-primary: #409eff; /* 主色调 */
|
|
126
|
+
--chat-bg: #ffffff; /* 输入框背景色 */
|
|
127
|
+
--chat-text: #303133; /* 文字颜色 */
|
|
128
|
+
--chat-border-radius: 8px; /* 圆角 */
|
|
129
|
+
|
|
130
|
+
/* 页面背景匹配 (用于 fixed 模式底栏) */
|
|
131
|
+
--chat-page-bg: #f8fafc; /* 浅色模式页面背景 */
|
|
132
|
+
--chat-page-bg-dark: #0f172a; /* 深色模式页面背景 */
|
|
133
|
+
}
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
更多变量请参考 `src/styles/variables.css`。
|
|
137
|
+
|
|
138
|
+
## License
|
|
139
|
+
|
|
140
|
+
MIT
|