@blueking/chat-x 0.0.5 → 0.0.7
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/dist/components/ai-selection/ai-selection.vue.d.ts +2 -2
- package/dist/components/index.d.ts +2 -1
- package/dist/index.css +1 -1
- package/dist/index.js +6 -6
- package/dist/index.js.map +1 -1
- package/dist/mcp/generated/docs/activity-message.md +428 -0
- package/dist/mcp/generated/docs/ai-image.md +227 -0
- package/dist/mcp/generated/docs/ai-loading.md +129 -0
- package/dist/mcp/generated/docs/ai-selection.md +436 -0
- package/dist/mcp/generated/docs/animation-text.md +199 -0
- package/dist/mcp/generated/docs/assistant-message.md +424 -0
- package/dist/mcp/generated/docs/chat-container.md +402 -0
- package/dist/mcp/generated/docs/chat-input.md +625 -0
- package/dist/mcp/generated/docs/cite-content.md +138 -0
- package/dist/mcp/generated/docs/code-content.md +199 -0
- package/dist/mcp/generated/docs/common-error-content.md +70 -0
- package/dist/mcp/generated/docs/constants.md +216 -0
- package/dist/mcp/generated/docs/content-render.md +238 -0
- package/dist/mcp/generated/docs/delete-tool.md +188 -0
- package/dist/mcp/generated/docs/desc-panel.md +139 -0
- package/dist/mcp/generated/docs/execution-summary.md +126 -0
- package/dist/mcp/generated/docs/file-content.md +300 -0
- package/dist/mcp/generated/docs/file-upload-btn.md +174 -0
- package/dist/mcp/generated/docs/flow-message.md +305 -0
- package/dist/mcp/generated/docs/highlight-keyword.md +144 -0
- package/dist/mcp/generated/docs/image-content.md +178 -0
- package/dist/mcp/generated/docs/image-preview-group.md +181 -0
- package/dist/mcp/generated/docs/image-preview.md +224 -0
- package/dist/mcp/generated/docs/info-message.md +124 -0
- package/dist/mcp/generated/docs/key-value-content.md +124 -0
- package/dist/mcp/generated/docs/latex-content.md +196 -0
- package/dist/mcp/generated/docs/loading-message.md +171 -0
- package/dist/mcp/generated/docs/markdown-content.md +186 -0
- package/dist/mcp/generated/docs/markdown-latex.md +208 -0
- package/dist/mcp/generated/docs/markdown-mermaid.md +250 -0
- package/dist/mcp/generated/docs/mermaid-content.md +185 -0
- package/dist/mcp/generated/docs/message-container.md +534 -0
- package/dist/mcp/generated/docs/message-render.md +329 -0
- package/dist/mcp/generated/docs/message-tools.md +376 -0
- package/dist/mcp/generated/docs/messages.md +472 -0
- package/dist/mcp/generated/docs/overflow-tips.md +209 -0
- package/dist/mcp/generated/docs/reasoning-message.md +233 -0
- package/dist/mcp/generated/docs/reference-content.md +132 -0
- package/dist/mcp/generated/docs/scroll-btn.md +155 -0
- package/dist/mcp/generated/docs/selection-footer.md +75 -0
- package/dist/mcp/generated/docs/shortcut-btn.md +202 -0
- package/dist/mcp/generated/docs/shortcut-btns.md +264 -0
- package/dist/mcp/generated/docs/shortcut-render.md +418 -0
- package/dist/mcp/generated/docs/text-content.md +74 -0
- package/dist/mcp/generated/docs/theme.md +388 -0
- package/dist/mcp/generated/docs/tool-btn.md +254 -0
- package/dist/mcp/generated/docs/tool-message.md +217 -0
- package/dist/mcp/generated/docs/toolcall-render.md +299 -0
- package/dist/mcp/generated/docs/use-animation-text.md +198 -0
- package/dist/mcp/generated/docs/use-clipboard.md +206 -0
- package/dist/mcp/generated/docs/use-command-selection.md +128 -0
- package/dist/mcp/generated/docs/use-container-scroll.md +56 -0
- package/dist/mcp/generated/docs/use-custom-tab.md +122 -0
- package/dist/mcp/generated/docs/use-global-config.md +154 -0
- package/dist/mcp/generated/docs/use-menu-keydown.md +164 -0
- package/dist/mcp/generated/docs/use-message-group.md +175 -0
- package/dist/mcp/generated/docs/use-observer-visible-list.md +189 -0
- package/dist/mcp/generated/docs/use-parent-scrolling.md +46 -0
- package/dist/mcp/generated/docs/user-feedback.md +229 -0
- package/dist/mcp/generated/docs/user-message.md +347 -0
- package/dist/mcp/generated/index.json +1311 -0
- package/dist/mcp/index.d.ts +2 -0
- package/dist/mcp/index.js +42 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/server.d.ts +2 -0
- package/dist/mcp/server.js +43 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/tools/get-component-doc.d.ts +19 -0
- package/dist/mcp/tools/get-component-doc.js +60 -0
- package/dist/mcp/tools/get-component-doc.js.map +1 -0
- package/dist/mcp/tools/list-components.d.ts +35 -0
- package/dist/mcp/tools/list-components.js +147 -0
- package/dist/mcp/tools/list-components.js.map +1 -0
- package/dist/mcp/tools/search-docs.d.ts +14 -0
- package/dist/mcp/tools/search-docs.js +82 -0
- package/dist/mcp/tools/search-docs.js.map +1 -0
- package/dist/mcp/utils/doc-loader.d.ts +35 -0
- package/dist/mcp/utils/doc-loader.js +64 -0
- package/dist/mcp/utils/doc-loader.js.map +1 -0
- package/package.json +5 -7
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
<!-- AI SUMMARY -->
|
|
2
|
+
## 快速了解
|
|
3
|
+
|
|
4
|
+
ReasoningMessage 展示 AI 思维链(Chain-of-Thought)推理过程,含可折叠标题与 Markdown 内容区;可传入 duration 并在结束后自动折叠。 content 为字符串数组(或兼容字符串)。由 MessageRender 在 reasoning 角色下使用,常出现在用户消息与正式回答之间。
|
|
5
|
+
|
|
6
|
+
### 关联组件
|
|
7
|
+
- **message-render** — 由 MessageRender 在 role 为 reasoning 时创建
|
|
8
|
+
- **assistant-message** — 推理结束后通常紧跟 Assistant 的正式回复
|
|
9
|
+
- **markdown-content** — 内容区通过 Markdown 渲染推理文本
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
<!-- FULL DOC -->
|
|
13
|
+
|
|
14
|
+
# ReasoningMessage 推理消息
|
|
15
|
+
|
|
16
|
+
> **层级**:分子组件 · **功能域**:消息展示
|
|
17
|
+
|
|
18
|
+
AI 思维链(Chain-of-Thought)推理过程展示组件。由**可点击标题栏**和**内容区域**组成,内容区支持 Markdown 渲染。`duration` 传入后自动折叠一次,用户可随时点击标题展开/收起。
|
|
19
|
+
|
|
20
|
+
## 组件结构
|
|
21
|
+
|
|
22
|
+
```
|
|
23
|
+
┌─────────────────────────────────────────────────┐
|
|
24
|
+
│ .ai-reasoning-message-title(可点击,toggle 折叠)│
|
|
25
|
+
│ ┌──────┐ 标题文案(思考中/已思考完成/思考失败) ▶ │
|
|
26
|
+
│ │ 加载图标│ 折叠图标 │
|
|
27
|
+
│ └──────┘ │
|
|
28
|
+
└─────────────────────────────────────────────────┘
|
|
29
|
+
▼ 展开时显示(v-show)
|
|
30
|
+
┌─────────────────────────────────────────────────┐
|
|
31
|
+
│ .ai-reasoning-message-content │
|
|
32
|
+
│ <MarkdownContent> × content.length │
|
|
33
|
+
│ (Error 时改为 CommonErrorContent) │
|
|
34
|
+
│ .markdown-body { color: #979ba5 }(灰色文字) │
|
|
35
|
+
└─────────────────────────────────────────────────┘
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
## 基础用法
|
|
39
|
+
|
|
40
|
+
```vue
|
|
41
|
+
<template>
|
|
42
|
+
<ReasoningMessage
|
|
43
|
+
:content="content"
|
|
44
|
+
:status="status"
|
|
45
|
+
/>
|
|
46
|
+
</template>
|
|
47
|
+
|
|
48
|
+
<script setup lang="ts">
|
|
49
|
+
import { ReasoningMessage, MessageStatus } from '@blueking/chat-x';
|
|
50
|
+
|
|
51
|
+
const status = MessageStatus.Complete;
|
|
52
|
+
const content = ['让我分析一下这个问题...', '首先需要考虑以下几个方面...'];
|
|
53
|
+
</script>
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
**渲染效果**
|
|
57
|
+
|
|
58
|
+
## 状态与视觉效果
|
|
59
|
+
|
|
60
|
+
| `status` | 标题文案 | 加载图标 | 标题 CSS 类 |
|
|
61
|
+
| ------------------------------ | ------------------ | ------------- | ------------- |
|
|
62
|
+
| `pending` / `streaming` / 其他 | 思考中 | `AiLoading` ✓ | `is-thinking` |
|
|
63
|
+
| `complete` / `success` | 已思考完成(耗时) | 无 | `is-complete` |
|
|
64
|
+
| `error` | 思考失败 | 无 | `is-error` |
|
|
65
|
+
|
|
66
|
+
> **说明**:`streaming` 通过 `switch` 的 `default` 分支显示"思考中",与 `pending` 效果相同。
|
|
67
|
+
|
|
68
|
+
### 思考中(pending / streaming)
|
|
69
|
+
|
|
70
|
+
### 完成状态(带耗时)
|
|
71
|
+
|
|
72
|
+
`duration` 传入后:
|
|
73
|
+
|
|
74
|
+
1. 标题显示"已思考完成 (耗时:x.xs)"
|
|
75
|
+
2. **自动折叠一次**(watch 触发后 `stop()`,后续不再自动折叠)
|
|
76
|
+
3. 用户点击标题可重新展开
|
|
77
|
+
|
|
78
|
+
### 错误状态(error)
|
|
79
|
+
|
|
80
|
+
`status: 'error'` 时,标题显示"思考失败",内容区改为 `CommonErrorContent` 渲染(将 `content` 数组 join `\n` 后传入):
|
|
81
|
+
|
|
82
|
+
## 折叠控制
|
|
83
|
+
|
|
84
|
+
### 自动折叠机制
|
|
85
|
+
|
|
86
|
+
组件内部 watch `duration` prop(`{ immediate: true }`):
|
|
87
|
+
|
|
88
|
+
- 当 `duration` **首次变为真值**时,将 `collapsed` 设为 `true` 并停止 watcher
|
|
89
|
+
- **一次性行为**:watcher 停止后,后续 `duration` 变化不再触发自动折叠
|
|
90
|
+
|
|
91
|
+
```typescript
|
|
92
|
+
// 组件内部逻辑(简化)
|
|
93
|
+
const { stop } = watch(
|
|
94
|
+
() => props.duration,
|
|
95
|
+
async duration => {
|
|
96
|
+
if (duration) {
|
|
97
|
+
collapsed.value = true;
|
|
98
|
+
await nextTick();
|
|
99
|
+
stop?.(); // 停止 watcher,后续 duration 变化不再自动折叠
|
|
100
|
+
}
|
|
101
|
+
},
|
|
102
|
+
{ immediate: true },
|
|
103
|
+
);
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
### 手动控制折叠状态
|
|
107
|
+
|
|
108
|
+
通过 `v-model:collapsed` 从外部读取或设置折叠状态:
|
|
109
|
+
|
|
110
|
+
```vue
|
|
111
|
+
<template>
|
|
112
|
+
<button @click="collapsed = !collapsed">
|
|
113
|
+
{{ collapsed ? '展开推理' : '收起推理' }}
|
|
114
|
+
</button>
|
|
115
|
+
<ReasoningMessage
|
|
116
|
+
v-model:collapsed="collapsed"
|
|
117
|
+
:content="content"
|
|
118
|
+
:status="status"
|
|
119
|
+
:duration="duration"
|
|
120
|
+
/>
|
|
121
|
+
</template>
|
|
122
|
+
|
|
123
|
+
<script setup lang="ts">
|
|
124
|
+
import { ref } from 'vue';
|
|
125
|
+
import { ReasoningMessage, MessageStatus } from '@blueking/chat-x';
|
|
126
|
+
|
|
127
|
+
const collapsed = ref(false);
|
|
128
|
+
const status = MessageStatus.Complete;
|
|
129
|
+
const duration = 2800;
|
|
130
|
+
const content = ['经过分析,结论如下...', '具体原因是...'];
|
|
131
|
+
</script>
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
## 在 MessageContainer 中使用
|
|
135
|
+
|
|
136
|
+
`MessageContainer` 会自动将 `role: 'reasoning'` 的消息渲染为 `ReasoningMessage`,无需手动引入:
|
|
137
|
+
|
|
138
|
+
```vue
|
|
139
|
+
<script setup lang="ts">
|
|
140
|
+
import { MessageRole, MessageStatus, type Message } from '@blueking/chat-x';
|
|
141
|
+
|
|
142
|
+
const messages = [
|
|
143
|
+
{
|
|
144
|
+
id: '1',
|
|
145
|
+
messageId: '1',
|
|
146
|
+
role: MessageRole.User,
|
|
147
|
+
content: '如何实现 TypeScript 中的深拷贝?',
|
|
148
|
+
status: MessageStatus.Complete,
|
|
149
|
+
},
|
|
150
|
+
{
|
|
151
|
+
id: '2',
|
|
152
|
+
messageId: '2',
|
|
153
|
+
role: MessageRole.Reasoning,
|
|
154
|
+
content: [
|
|
155
|
+
'用户问的是 TypeScript 深拷贝,需要考虑几种常见方案...',
|
|
156
|
+
'JSON.parse/stringify 有局限性(函数、循环引用等)...',
|
|
157
|
+
'structuredClone 是更现代的选择,但需要注意兼容性...',
|
|
158
|
+
],
|
|
159
|
+
status: MessageStatus.Complete,
|
|
160
|
+
duration: 2800, // 毫秒,传入后自动折叠
|
|
161
|
+
},
|
|
162
|
+
{
|
|
163
|
+
id: '3',
|
|
164
|
+
messageId: '3',
|
|
165
|
+
role: MessageRole.Assistant,
|
|
166
|
+
content: 'TypeScript 中实现深拷贝有以下几种方式...',
|
|
167
|
+
status: MessageStatus.Complete,
|
|
168
|
+
},
|
|
169
|
+
];
|
|
170
|
+
</script>
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
## API
|
|
174
|
+
|
|
175
|
+
### Props
|
|
176
|
+
|
|
177
|
+
组件 Props 继承自 `Partial<ReasoningMessage>`:
|
|
178
|
+
|
|
179
|
+
| 属性名 | 类型 | 说明 |
|
|
180
|
+
| --------- | -------------------- | ------------------------------------------------------------------------------ |
|
|
181
|
+
| content | `string \| string[]` | 推理内容;字符串数组时每项独立渲染为 `MarkdownContent`;字符串时自动包装为数组 |
|
|
182
|
+
| status | `MessageStatus` | 消息状态,决定标题文案、加载图标和 CSS 类 |
|
|
183
|
+
| duration | `number` | 推理耗时(毫秒);传入后标题追加耗时信息,并**触发一次自动折叠** |
|
|
184
|
+
| id | `number \| string` | 消息 ID(接收但不使用) |
|
|
185
|
+
| messageId | `number \| string` | 消息唯一标识(接收但不使用) |
|
|
186
|
+
|
|
187
|
+
### v-model
|
|
188
|
+
|
|
189
|
+
| 属性名 | 类型 | 默认值 | 说明 |
|
|
190
|
+
| --------- | --------- | ------- | ---------------------------------------------------------- |
|
|
191
|
+
| collapsed | `boolean` | `false` | 内容折叠状态;`duration` 首次传入时组件内部自动设为 `true` |
|
|
192
|
+
|
|
193
|
+
### 状态说明
|
|
194
|
+
|
|
195
|
+
| `status` | 标题文案 | 加载图标 | 标题背景 |
|
|
196
|
+
| ------------------ | ------------------------------------ | -------- | --------------- |
|
|
197
|
+
| `pending` | 思考中 | ✓ | `#f0f1f5` |
|
|
198
|
+
| `streaming` / 其他 | 思考中(default 分支) | ✓ | `#f0f1f5` |
|
|
199
|
+
| `complete` | 已思考完成(含 duration 则追加耗时) | ✗ | `#f0f1f5` |
|
|
200
|
+
| `success` | 已思考完成(同 complete) | ✗ | `#f0f1f5` |
|
|
201
|
+
| `error` | 思考失败 | ✗ | `#fff0f0`(红) |
|
|
202
|
+
|
|
203
|
+
## 类型定义
|
|
204
|
+
|
|
205
|
+
```typescript
|
|
206
|
+
import { MessageRole, MessageStatus, type ReasoningMessage } from '@blueking/chat-x';
|
|
207
|
+
|
|
208
|
+
// ReasoningMessage 继承自 BaseMessage<MessageRole.Reasoning, string[]>
|
|
209
|
+
interface ReasoningMessage {
|
|
210
|
+
id: string | number;
|
|
211
|
+
messageId: string | number;
|
|
212
|
+
role: MessageRole.Reasoning; // 'reasoning'
|
|
213
|
+
status: MessageStatus;
|
|
214
|
+
content: string[]; // TS 类型为 string[],组件内部实际兼容 string
|
|
215
|
+
duration?: number; // 推理耗时(毫秒)
|
|
216
|
+
name?: string;
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
enum MessageStatus {
|
|
220
|
+
Pending = 'pending',
|
|
221
|
+
Streaming = 'streaming',
|
|
222
|
+
Complete = 'complete',
|
|
223
|
+
Success = 'success',
|
|
224
|
+
Error = 'error',
|
|
225
|
+
Stop = 'stop',
|
|
226
|
+
}
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
## 关联组件
|
|
230
|
+
|
|
231
|
+
- [MessageRender](./message-render.md) — reasoning 角色由其实例化
|
|
232
|
+
- [AssistantMessage](./assistant-message.md) — 推理后常接正式回答
|
|
233
|
+
- [MarkdownContent](../atomic/markdown-content.md) — 推理正文 Markdown 渲染
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
<!-- AI SUMMARY -->
|
|
2
|
+
## 快速了解
|
|
3
|
+
|
|
4
|
+
ReferenceContent 以列表形式展示 AI 回复引用的参考文档:图标、标题、摘要与外链跳转。 由 ContentRender、ActivityMessage 等按消息类型分发时挂载。
|
|
5
|
+
|
|
6
|
+
### 关联组件
|
|
7
|
+
- **content-render** — ReferenceDocument 类型内容路由到本组件
|
|
8
|
+
- **activity-message** — 知识库等活动场景内嵌引用列表
|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
<!-- FULL DOC -->
|
|
12
|
+
|
|
13
|
+
# ReferenceContent 引用文档内容
|
|
14
|
+
|
|
15
|
+
> **层级**:原子组件 · **功能域**:辅助组件
|
|
16
|
+
|
|
17
|
+
引用文档列表渲染原子组件,用于展示 AI 回复中引用的参考文档,每项包含文档图标、标题、预览与跳转操作。
|
|
18
|
+
|
|
19
|
+
主要由 `ActivityMessage`(知识库问答场景)和 `ContentRender`(`reference_document` 类型内容)内部使用。
|
|
20
|
+
|
|
21
|
+
## 组件结构
|
|
22
|
+
|
|
23
|
+
```
|
|
24
|
+
<template>(无根元素,Fragment 模式)
|
|
25
|
+
v-for item in links(过滤 name 为空 → 映射为 { title, url, originFileUrl })
|
|
26
|
+
│
|
|
27
|
+
div.ai-reference-item(flex,height: 28px,padding: 0 12px,color: #3a84ff)
|
|
28
|
+
├── DocLinkIcon(color="#D66F6B",.ai-doc-link-icon,始终可见)
|
|
29
|
+
├── span.ai-reference-item-title(flex: 1,ellipsis,font-size: 12px)
|
|
30
|
+
│ @click → url && gotoLink(url, event)
|
|
31
|
+
│ (XSS 安全:{{ item.title }} 文本插值)
|
|
32
|
+
├── [v-if url && originFileUrl] PreviewIcon(.ai-common-icon)
|
|
33
|
+
│ v-tippy: "预览内容"
|
|
34
|
+
│ @click → gotoLink(url, event)
|
|
35
|
+
│ 默认 display: none,hover 父容器后 display: flex
|
|
36
|
+
└── [v-if url && originFileUrl] TargetIcon(.ai-common-icon)
|
|
37
|
+
v-tippy: "跳转详情"
|
|
38
|
+
@click → gotoLink(originFileUrl, event)
|
|
39
|
+
默认 display: none,hover 父容器后 display: flex
|
|
40
|
+
|
|
41
|
+
gotoLink(url, event):
|
|
42
|
+
event.stopPropagation() + event.preventDefault()
|
|
43
|
+
window.open(url, '_blank', 'noopener,noreferrer')
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
> **`v-for` key**:使用 `item.title`(即 `name`)作为 `:key`,同一组 `content` 中 `name` 须唯一,否则触发 Vue 重复 key 警告。
|
|
47
|
+
|
|
48
|
+
## 图标可见性规则
|
|
49
|
+
|
|
50
|
+
| 图标 | 始终显示 | 显示条件(数据层) | 显示条件(交互层) |
|
|
51
|
+
| ------------------------- | -------- | --------------------------------- | ------------------ |
|
|
52
|
+
| `DocLinkIcon`(红色书签) | ✓ | 无条件 | 无条件 |
|
|
53
|
+
| `PreviewIcon`(预览) | — | `url` 与 `originFileUrl` 均为真值 | 仅在 hover 时出现 |
|
|
54
|
+
| `TargetIcon`(跳转) | — | `url` 与 `originFileUrl` 均为真值 | 仅在 hover 时出现 |
|
|
55
|
+
|
|
56
|
+
即:只有 `url` 没有 `originFileUrl`(或反之),两个操作图标均不渲染。
|
|
57
|
+
|
|
58
|
+
## 基础用法
|
|
59
|
+
|
|
60
|
+
```vue
|
|
61
|
+
<template>
|
|
62
|
+
<ReferenceContent :content="references" />
|
|
63
|
+
</template>
|
|
64
|
+
|
|
65
|
+
<script setup lang="ts">
|
|
66
|
+
import { ReferenceContent } from '@blueking/chat-x';
|
|
67
|
+
import type { ReferenceDocumentContent } from '@blueking/chat-x';
|
|
68
|
+
|
|
69
|
+
const references: ReferenceDocumentContent[] = [
|
|
70
|
+
{ name: '蓝鲸 PaaS 平台文档', url: 'https://bk.tencent.com', originFile: '' },
|
|
71
|
+
{ name: '组件库使用指南', url: 'https://bk.tencent.com/docs', originFile: '' },
|
|
72
|
+
];
|
|
73
|
+
</script>
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
## 含预览与跳转(url + originFile)
|
|
77
|
+
|
|
78
|
+
同时提供 `url` 和 `originFile` 时,hover 后出现预览图标和跳转图标:
|
|
79
|
+
|
|
80
|
+
## 混合场景:过滤与图标差异
|
|
81
|
+
|
|
82
|
+
`name` 为空的项被过滤不渲染;`originFile` 为空时不显示 `PreviewIcon` / `TargetIcon`:
|
|
83
|
+
|
|
84
|
+
```typescript
|
|
85
|
+
const refs = [
|
|
86
|
+
{ name: '有预览和跳转', url: 'https://…/preview', originFile: 'https://…/origin' }, // 两图标
|
|
87
|
+
{ name: '仅有 url', url: 'https://…/only', originFile: '' }, // 无图标
|
|
88
|
+
{ name: '', url: 'https://…/filtered', originFile: '' }, // 被过滤
|
|
89
|
+
];
|
|
90
|
+
// 实际渲染 2 条,第 3 条因 name='' 被过滤
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
## API
|
|
94
|
+
|
|
95
|
+
### Props
|
|
96
|
+
|
|
97
|
+
| 属性名 | 类型 | 必填 | 说明 |
|
|
98
|
+
| ------- | ---------------------------- | ---- | --------------------------------------------- |
|
|
99
|
+
| content | `ReferenceDocumentContent[]` | ✓ | 引用文档列表;`name` 为空的项会被过滤,不渲染 |
|
|
100
|
+
|
|
101
|
+
### 类型定义
|
|
102
|
+
|
|
103
|
+
```typescript
|
|
104
|
+
export type ReferenceDocumentContent = {
|
|
105
|
+
name: string; // 文档标题(用作列表展示文本,也作为 v-for :key)
|
|
106
|
+
url: string; // 预览链接:标题点击、PreviewIcon 点击时打开
|
|
107
|
+
originFile: string; // 原始文件链接:TargetIcon 点击时打开;为空则不渲染两个操作图标
|
|
108
|
+
};
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
## 使用场景
|
|
112
|
+
|
|
113
|
+
`ReferenceContent` 在两处被内部使用:
|
|
114
|
+
|
|
115
|
+
**1. `ActivityMessage`(知识库问答)**
|
|
116
|
+
|
|
117
|
+
```typescript
|
|
118
|
+
// content 为 ReferenceDocumentContent[] 数组时直接传入
|
|
119
|
+
<ReferenceContent :content="Array.isArray(content) ? content : content?.referenceDocument || []" />
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
**2. `ContentRender`(content 类型路由)**
|
|
123
|
+
|
|
124
|
+
```typescript
|
|
125
|
+
// type === MessageContentType.ReferenceDocument 且 content 为数组时
|
|
126
|
+
h(ReferenceContent, { content: props.content as ReferenceDocumentContent[] });
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
## 关联组件
|
|
130
|
+
|
|
131
|
+
- [ContentRender](../molecular/content-render.md) — 内容类型分发
|
|
132
|
+
- [ActivityMessage](../molecular/activity-message.md) — 活动消息内引用
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
<!-- AI SUMMARY -->
|
|
2
|
+
## 快速了解
|
|
3
|
+
|
|
4
|
+
ScrollBtn 为底部浮动操作提供统一胶囊外壳(圆角、阴影),具体图标与行为由插槽与父级决定。 常由 MessageContainer 用于「返回底部」与「停止生成」等场景。
|
|
5
|
+
|
|
6
|
+
### 关联组件
|
|
7
|
+
- **message-container** — 消息列表底部固定区挂载滚动与停止按钮
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
<!-- FULL DOC -->
|
|
11
|
+
|
|
12
|
+
# ScrollBtn 滚动按钮
|
|
13
|
+
|
|
14
|
+
> **层级**:原子组件 · **功能域**:辅助组件
|
|
15
|
+
|
|
16
|
+
聊天容器底部浮动操作按钮的外壳组件,提供统一的胶囊样式(圆角 26px、高 24px、阴影),内容完全由插槽定制。
|
|
17
|
+
|
|
18
|
+
由 `MessageContainer` 内部管理"停止生成"和"返回底部"两个按钮的显示逻辑,通常不需要手动引入。
|
|
19
|
+
|
|
20
|
+
## 组件结构
|
|
21
|
+
|
|
22
|
+
```
|
|
23
|
+
div.ai-scroll-btn(flex,gap: 4px,width: fit-content,min-width: 84px,height: 24px)
|
|
24
|
+
.is-loading / .is-disabled → cursor: not-allowed,opacity: 0.65
|
|
25
|
+
border: 1px solid #dcdee5,border-radius: 26px
|
|
26
|
+
box-shadow: 0 -2px 6px 0 #0000001a
|
|
27
|
+
hover → border: #c4c6cc,box-shadow 加深,cursor: pointer
|
|
28
|
+
│
|
|
29
|
+
├── Loading(loading=true 时显示旋转加载图标)
|
|
30
|
+
├── <slot name="icon">(loading=false 时显示,无默认内容)
|
|
31
|
+
│ 子图标自动继承 .ai-common-icon 样式:14×14px,font-size: 14px
|
|
32
|
+
│
|
|
33
|
+
└── <slot name="title">(默认内容:{{ title }},XSS 安全)
|
|
34
|
+
传入 title slot 时完全替换 title prop 的文本
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
> **`loading` / `disabled` prop**:`loading` 为 `true` 时显示旋转加载图标替代 icon slot,且点击无效;`disabled` 为 `true` 时点击同样无效。两者均添加 `not-allowed` 光标和 `0.65` 透明度。
|
|
38
|
+
>
|
|
39
|
+
> **`@click` 事件**:通过内部 `handleClick` 处理,`loading` 或 `disabled` 时不触发。
|
|
40
|
+
|
|
41
|
+
## 基础用法:返回底部
|
|
42
|
+
|
|
43
|
+
```vue
|
|
44
|
+
<template>
|
|
45
|
+
<ScrollBtn
|
|
46
|
+
title="返回底部"
|
|
47
|
+
@click="toScrollBottom"
|
|
48
|
+
>
|
|
49
|
+
<template #icon>
|
|
50
|
+
<ArrowDownIcon />
|
|
51
|
+
</template>
|
|
52
|
+
</ScrollBtn>
|
|
53
|
+
</template>
|
|
54
|
+
|
|
55
|
+
<script setup lang="ts">
|
|
56
|
+
import { ScrollBtn } from '@blueking/chat-x';
|
|
57
|
+
import { ArrowDownIcon } from '@blueking/chat-x';
|
|
58
|
+
|
|
59
|
+
const toScrollBottom = () => {
|
|
60
|
+
/* 滚动逻辑 */
|
|
61
|
+
};
|
|
62
|
+
</script>
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
## 停止生成
|
|
66
|
+
|
|
67
|
+
```vue
|
|
68
|
+
<template>
|
|
69
|
+
<ScrollBtn
|
|
70
|
+
title="停止生成"
|
|
71
|
+
@click="stopStreaming"
|
|
72
|
+
>
|
|
73
|
+
<template #icon>
|
|
74
|
+
<CloseCircleIcon />
|
|
75
|
+
</template>
|
|
76
|
+
</ScrollBtn>
|
|
77
|
+
</template>
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
## 仅图标(不传 title)
|
|
81
|
+
|
|
82
|
+
不传 `title` prop 时,`title` slot 渲染空文本,按钮收缩至 `min-width: 84px`:
|
|
83
|
+
|
|
84
|
+
## 自定义 title slot
|
|
85
|
+
|
|
86
|
+
传入 `#title` 插槽时,完全覆盖 `title` prop 的文本渲染:
|
|
87
|
+
|
|
88
|
+
```vue
|
|
89
|
+
<template>
|
|
90
|
+
<ScrollBtn
|
|
91
|
+
title="此文本被覆盖"
|
|
92
|
+
@click="handleClick"
|
|
93
|
+
>
|
|
94
|
+
<template #icon>
|
|
95
|
+
<ArrowDownIcon />
|
|
96
|
+
</template>
|
|
97
|
+
<template #title>
|
|
98
|
+
<span style="color: #3a84ff; font-weight: 600;">新消息 ↓</span>
|
|
99
|
+
</template>
|
|
100
|
+
</ScrollBtn>
|
|
101
|
+
</template>
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
## API
|
|
105
|
+
|
|
106
|
+
### Props
|
|
107
|
+
|
|
108
|
+
| 属性名 | 类型 | 必填 | 说明 |
|
|
109
|
+
| -------- | --------- | ---- | ------------------------------------------------------------------------- |
|
|
110
|
+
| title | `string` | — | 按钮文本;被 `#title` 插槽覆盖时无效;XSS 安全(文本插值) |
|
|
111
|
+
| loading | `boolean` | — | 加载状态;为 `true` 时显示旋转 Loading 图标替代 icon slot,点击不触发事件 |
|
|
112
|
+
| disabled | `boolean` | — | 禁用状态;为 `true` 时点击不触发事件 |
|
|
113
|
+
|
|
114
|
+
### Events
|
|
115
|
+
|
|
116
|
+
| 事件名 | 参数 | 说明 |
|
|
117
|
+
| ------ | --------------------- | ------------------------------------------------ |
|
|
118
|
+
| click | `(event: MouseEvent)` | 点击按钮时触发;`loading` 或 `disabled` 时不触发 |
|
|
119
|
+
|
|
120
|
+
### Slots
|
|
121
|
+
|
|
122
|
+
| 插槽名 | 说明 |
|
|
123
|
+
| ------ | ------------------------------------------------------------------------- |
|
|
124
|
+
| icon | 图标区域,无默认内容;放置 `@blueking/chat-x` 图标时自动应用 14×14px 样式 |
|
|
125
|
+
| title | 文本区域,默认渲染 `title` prop;传入后**完全替换** prop 文本 |
|
|
126
|
+
|
|
127
|
+
## 在 MessageContainer 中的使用
|
|
128
|
+
|
|
129
|
+
`ScrollBtn` 由 `MessageContainer` 内置,根据状态自动控制显隐,无需手动管理:
|
|
130
|
+
|
|
131
|
+
```html
|
|
132
|
+
<!-- 停止生成:仅在流式输出时显示 -->
|
|
133
|
+
<ScrollBtn
|
|
134
|
+
v-show="messageStatus === MessageStatus.Streaming"
|
|
135
|
+
:title="t('停止生成')"
|
|
136
|
+
@click="$emit('stopStreaming')"
|
|
137
|
+
>
|
|
138
|
+
<template #icon><CloseCircleIcon /></template>
|
|
139
|
+
</ScrollBtn>
|
|
140
|
+
|
|
141
|
+
<!-- 返回底部:距底部超过 100px 且不在底部时显示 -->
|
|
142
|
+
<ScrollBtn
|
|
143
|
+
v-show="!isScrollBottom && scrollBottomHeight > 100"
|
|
144
|
+
:title="t('返回底部')"
|
|
145
|
+
@click="toScrollBottom"
|
|
146
|
+
>
|
|
147
|
+
<template #icon><ArrowDownIcon /></template>
|
|
148
|
+
</ScrollBtn>
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
两个按钮都渲染在 `div.ai-message-fixed-bottom` 容器内,由父布局定位到消息列表底部中央。
|
|
152
|
+
|
|
153
|
+
## 关联组件
|
|
154
|
+
|
|
155
|
+
- [MessageContainer](../molecular/message-container.md) — 底部固定区集成
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
<!-- AI SUMMARY -->
|
|
2
|
+
## 快速了解
|
|
3
|
+
|
|
4
|
+
SelectionFooter 为消息多选(如分享)提供底部操作栏:全选、取消与确认,并反映选中数量与 loading。 由 ChatContainer 在对应模式下自动挂载,业务一般无需单独引用。
|
|
5
|
+
|
|
6
|
+
### 关联组件
|
|
7
|
+
- **chat-container** — 多选/分享模式由容器渲染底部栏
|
|
8
|
+
- **message-container** — 与消息列表勾选状态联动
|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
<!-- FULL DOC -->
|
|
12
|
+
|
|
13
|
+
# SelectionFooter 选择操作栏
|
|
14
|
+
|
|
15
|
+
> **层级**:原子组件 · **功能域**:辅助组件
|
|
16
|
+
|
|
17
|
+
消息多选模式下的底部操作栏,提供全选、取消和确认操作。由 `ChatContainer` 在分享模式下自动渲染,通常不需要单独使用。
|
|
18
|
+
|
|
19
|
+
## 基础用法
|
|
20
|
+
|
|
21
|
+
```vue
|
|
22
|
+
<template>
|
|
23
|
+
<SelectionFooter
|
|
24
|
+
:is-all-selected="isAllSelected"
|
|
25
|
+
:selected-count="selectedCount"
|
|
26
|
+
:loading="false"
|
|
27
|
+
@toggle-all="handleToggleAll"
|
|
28
|
+
@cancel="handleCancel"
|
|
29
|
+
@confirm="handleConfirm"
|
|
30
|
+
/>
|
|
31
|
+
</template>
|
|
32
|
+
|
|
33
|
+
<script setup lang="ts">
|
|
34
|
+
import { ref } from 'vue';
|
|
35
|
+
import { SelectionFooter } from '@blueking/chat-x';
|
|
36
|
+
|
|
37
|
+
const isAllSelected = ref(false);
|
|
38
|
+
const selectedCount = ref(0);
|
|
39
|
+
|
|
40
|
+
const handleToggleAll = (checked: boolean) => {
|
|
41
|
+
isAllSelected.value = checked;
|
|
42
|
+
};
|
|
43
|
+
const handleCancel = () => {
|
|
44
|
+
console.log('取消');
|
|
45
|
+
};
|
|
46
|
+
const handleConfirm = () => {
|
|
47
|
+
console.log('确认');
|
|
48
|
+
};
|
|
49
|
+
</script>
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
**渲染效果**
|
|
53
|
+
|
|
54
|
+
## API
|
|
55
|
+
|
|
56
|
+
### Props
|
|
57
|
+
|
|
58
|
+
| 属性名 | 类型 | 必填 | 默认值 | 说明 |
|
|
59
|
+
| ------------- | --------- | ---- | ------- | ----------------------------- |
|
|
60
|
+
| isAllSelected | `boolean` | ✓ | — | 是否全选 |
|
|
61
|
+
| selectedCount | `number` | ✓ | — | 已选数量,为 0 时确认按钮禁用 |
|
|
62
|
+
| loading | `boolean` | — | `false` | 确认按钮加载状态 |
|
|
63
|
+
|
|
64
|
+
### Events
|
|
65
|
+
|
|
66
|
+
| 事件名 | 参数 | 说明 |
|
|
67
|
+
| ---------- | -------------------- | ------------ |
|
|
68
|
+
| toggle-all | `(checked: boolean)` | 切换全选状态 |
|
|
69
|
+
| cancel | — | 点击取消按钮 |
|
|
70
|
+
| confirm | — | 点击确认按钮 |
|
|
71
|
+
|
|
72
|
+
## 关联组件
|
|
73
|
+
|
|
74
|
+
- [ChatContainer](../molecular/chat-container.md) — 分享模式挂载
|
|
75
|
+
- [MessageContainer](../molecular/message-container.md) — 多选与消息列表
|