@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,181 @@
|
|
|
1
|
+
<!-- AI SUMMARY -->
|
|
2
|
+
## 快速了解
|
|
3
|
+
|
|
4
|
+
ImagePreviewGroup 通过 provide/inject 与子级 symbol 注册表管理多个 AiImage,点击任一子图时聚合已注册图片并打开内置全屏预览。 解决同屏多缩略图统一多图浏览与索引切换的需求。
|
|
5
|
+
|
|
6
|
+
### 关联组件
|
|
7
|
+
- **ai-image** — 子级注册并参与多图预览集合
|
|
8
|
+
- **image-preview** — 内置实例承载多图切换与工具栏
|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
<!-- FULL DOC -->
|
|
12
|
+
|
|
13
|
+
# ImagePreviewGroup 图片预览组
|
|
14
|
+
|
|
15
|
+
> **层级**:分子组件 · **功能域**:文件与图片
|
|
16
|
+
|
|
17
|
+
多图预览管理容器。通过 `provide/inject` + `Map<symbol>` 模式管理子级 `AiImage` 的注册与预览状态,点击任意子图片时自动收集所有已注册图片并打开多图预览。
|
|
18
|
+
|
|
19
|
+
## 组件结构
|
|
20
|
+
|
|
21
|
+
```
|
|
22
|
+
.ai-image-preview-group
|
|
23
|
+
├── <slot />(放置多个 AiImage)
|
|
24
|
+
└── ImagePreview(内置,按需显示)
|
|
25
|
+
v-model:visible="previewVisible"
|
|
26
|
+
v-model:current="activeIndex"
|
|
27
|
+
:images="previewImages"
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
## 工作原理
|
|
31
|
+
|
|
32
|
+
```
|
|
33
|
+
┌─ ImagePreviewGroup ──────────────────────────────────────┐
|
|
34
|
+
│ provide(IMAGE_PREVIEW_GROUP_KEY, { register, unregister, preview }) │
|
|
35
|
+
│ │
|
|
36
|
+
│ ┌─ AiImage ─┐ ┌─ AiImage ─┐ ┌─ AiImage ─┐ │
|
|
37
|
+
│ │ uid: sym1 │ │ uid: sym2 │ │ uid: sym3 │ │
|
|
38
|
+
│ │ onMounted → register(sym, getItem) │
|
|
39
|
+
│ │ onClick → groupContext.preview(sym) │
|
|
40
|
+
│ │ onUnmount → unregister(sym) │
|
|
41
|
+
│ └────────────┘ └────────────┘ └────────────┘ │
|
|
42
|
+
│ │
|
|
43
|
+
│ preview(uid) → 收集所有 registry 中的 ImageItem → │
|
|
44
|
+
│ 设置 activeIndex → 打开 ImagePreview │
|
|
45
|
+
└───────────────────────────────────────────────────────────────────────┘
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
## 基础用法
|
|
49
|
+
|
|
50
|
+
```vue
|
|
51
|
+
<template>
|
|
52
|
+
<ImagePreviewGroup>
|
|
53
|
+
<AiImage
|
|
54
|
+
v-for="(src, i) in images"
|
|
55
|
+
:key="i"
|
|
56
|
+
:src="src"
|
|
57
|
+
:width="160"
|
|
58
|
+
:height="120"
|
|
59
|
+
/>
|
|
60
|
+
</ImagePreviewGroup>
|
|
61
|
+
</template>
|
|
62
|
+
|
|
63
|
+
<script setup lang="ts">
|
|
64
|
+
import { AiImage, ImagePreviewGroup } from '@blueking/chat-x';
|
|
65
|
+
|
|
66
|
+
const images = [
|
|
67
|
+
'https://images.unsplash.com/photo-1506744038136-46273834b3fb?w=400&h=300&fit=crop',
|
|
68
|
+
'https://images.unsplash.com/photo-1469474968028-56623f02e42e?w=400&h=300&fit=crop',
|
|
69
|
+
'https://images.unsplash.com/photo-1447752875215-b2761acb3c5d?w=400&h=300&fit=crop',
|
|
70
|
+
];
|
|
71
|
+
</script>
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
## 带图片信息
|
|
75
|
+
|
|
76
|
+
配合 `showInfo` 和 `AiImage` 的 `previewProps`,在预览工具栏显示图片尺寸信息:
|
|
77
|
+
|
|
78
|
+
```vue
|
|
79
|
+
<template>
|
|
80
|
+
<ImagePreviewGroup :show-info="true">
|
|
81
|
+
<AiImage
|
|
82
|
+
v-for="(img, i) in images"
|
|
83
|
+
:key="i"
|
|
84
|
+
:src="img.src"
|
|
85
|
+
:preview-props="img.previewProps"
|
|
86
|
+
:width="160"
|
|
87
|
+
:height="120"
|
|
88
|
+
/>
|
|
89
|
+
</ImagePreviewGroup>
|
|
90
|
+
</template>
|
|
91
|
+
|
|
92
|
+
<script setup lang="ts">
|
|
93
|
+
import { AiImage, ImagePreviewGroup, type ImagePreviewConfig } from '@blueking/chat-x';
|
|
94
|
+
|
|
95
|
+
const images = [
|
|
96
|
+
{
|
|
97
|
+
src: '...缩略图地址...',
|
|
98
|
+
previewProps: {
|
|
99
|
+
src: '...高清原图地址...',
|
|
100
|
+
name: '湖泊风景.jpg',
|
|
101
|
+
width: 1920,
|
|
102
|
+
resolution: '1920×1080',
|
|
103
|
+
} as ImagePreviewConfig,
|
|
104
|
+
},
|
|
105
|
+
// ...更多图片
|
|
106
|
+
];
|
|
107
|
+
</script>
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
## 自定义下载
|
|
111
|
+
|
|
112
|
+
通过 `onDownload` 统一控制所有子图片的下载行为:
|
|
113
|
+
|
|
114
|
+
```vue
|
|
115
|
+
<template>
|
|
116
|
+
<ImagePreviewGroup :on-download="handleDownload">
|
|
117
|
+
<AiImage
|
|
118
|
+
v-for="(src, i) in images"
|
|
119
|
+
:key="i"
|
|
120
|
+
:src="src"
|
|
121
|
+
:width="160"
|
|
122
|
+
:height="120"
|
|
123
|
+
/>
|
|
124
|
+
</ImagePreviewGroup>
|
|
125
|
+
</template>
|
|
126
|
+
|
|
127
|
+
<script setup lang="ts">
|
|
128
|
+
import { AiImage, ImagePreviewGroup } from '@blueking/chat-x';
|
|
129
|
+
|
|
130
|
+
const handleDownload = (url: string) => {
|
|
131
|
+
window.open(`/api/download?url=${encodeURIComponent(url)}`);
|
|
132
|
+
};
|
|
133
|
+
</script>
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
## API
|
|
137
|
+
|
|
138
|
+
### Props
|
|
139
|
+
|
|
140
|
+
| 属性名 | 类型 | 默认值 | 说明 |
|
|
141
|
+
| ------------ | ----------------------- | ------- | --------------------------------------------- |
|
|
142
|
+
| maskClosable | `boolean` | `true` | 点击遮罩层是否关闭预览 |
|
|
143
|
+
| showInfo | `boolean` | `false` | 预览工具栏是否显示图片尺寸信息 |
|
|
144
|
+
| onDownload | `(url: string) => void` | — | 自定义下载回调;不传时使用默认 `<a>` 标签下载 |
|
|
145
|
+
|
|
146
|
+
### Slots
|
|
147
|
+
|
|
148
|
+
| 插槽名 | 说明 |
|
|
149
|
+
| ------- | ----------------------------------------------- |
|
|
150
|
+
| default | 放置子级 `AiImage` 组件 |
|
|
151
|
+
| extra | 预览工具栏的额外操作区域(透传给 ImagePreview) |
|
|
152
|
+
|
|
153
|
+
## 类型定义
|
|
154
|
+
|
|
155
|
+
```typescript
|
|
156
|
+
interface ImagePreviewGroupContext {
|
|
157
|
+
register: (uid: symbol, getItem: () => ImageItem) => void;
|
|
158
|
+
unregister: (uid: symbol) => void;
|
|
159
|
+
preview: (uid: symbol) => void;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
const IMAGE_PREVIEW_GROUP_KEY: InjectionKey<ImagePreviewGroupContext>;
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
## 与 AiImage 的协作关系
|
|
166
|
+
|
|
167
|
+
| AiImage 场景 | 行为 |
|
|
168
|
+
| ------------- | ---------------------------------------------------------------------------------------- |
|
|
169
|
+
| 未在 Group 内 | `inject` 返回 `null`,AiImage 内部自行渲染 `ImagePreview`(独立模式) |
|
|
170
|
+
| 在 Group 内 | `inject` 获取 Group 上下文;`onMounted` 注册自身;点击时调用 `groupContext.preview(uid)` |
|
|
171
|
+
|
|
172
|
+
## 使用场景
|
|
173
|
+
|
|
174
|
+
- AI 对话中一条消息包含多张图片,需要统一预览
|
|
175
|
+
- 图片画廊场景
|
|
176
|
+
- 任何需要"点击缩略图 → 多图预览切换"的场景
|
|
177
|
+
|
|
178
|
+
## 关联组件
|
|
179
|
+
|
|
180
|
+
- [AiImage](../atomic/ai-image.md) — 子级缩略图与注册
|
|
181
|
+
- [ImagePreview](./image-preview.md) — 内置全屏预览
|
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
<!-- AI SUMMARY -->
|
|
2
|
+
## 快速了解
|
|
3
|
+
|
|
4
|
+
ImagePreview 通过 Teleport 提供全屏图片预览,支持缩放、旋转、拖拽、下载、键盘与多图切换。 数据源可为 URL 字符串、ImageItem 或 File(自动 ObjectURL 并在关闭时回收)。 通常由 AiImage、ImagePreviewGroup、FileContent 等触发,业务较少直接单独挂载。
|
|
5
|
+
|
|
6
|
+
### 关联组件
|
|
7
|
+
- **ai-image** — 独立模式下由 AiImage 打开预览
|
|
8
|
+
- **image-preview-group** — 组内容器内持有一个实例做多图切换
|
|
9
|
+
- **file-content** — 文件列表点击缩略图触发预览
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
<!-- FULL DOC -->
|
|
13
|
+
|
|
14
|
+
# ImagePreview 图片预览
|
|
15
|
+
|
|
16
|
+
> **层级**:分子组件 · **功能域**:文件与图片
|
|
17
|
+
|
|
18
|
+
全屏图片预览组件,通过 `Teleport` 渲染到 `body`,支持缩放、旋转、拖拽、下载、键盘导航等功能。`images` 支持传入 URL 字符串、`ImageItem` 对象或 `File` 对象,File 对象会自动通过 `URL.createObjectURL` 生成预览并在关闭/卸载时回收。通常不直接使用,而是配合 `AiImage`、`ImagePreviewGroup` 或 `FileContent` 自动触发。
|
|
19
|
+
|
|
20
|
+
## 组件结构
|
|
21
|
+
|
|
22
|
+
```
|
|
23
|
+
Teleport(to="body")
|
|
24
|
+
└── .ai-image-preview(fixed,z-index: 10000,background: rgba(0,0,0,0.6))
|
|
25
|
+
├── .ai-image-preview-close(右上角关闭按钮)
|
|
26
|
+
├── .ai-image-preview-arrow-left(左切换箭头,多图时显示)
|
|
27
|
+
├── .ai-image-preview-arrow-right(右切换箭头,多图时显示)
|
|
28
|
+
├── .ai-image-preview-body(图片主体区域,支持拖拽/滚轮缩放)
|
|
29
|
+
│ ├── <img>(currentStatus !== 'error' 时)
|
|
30
|
+
│ ├── .ai-image-preview-error(加载失败时)
|
|
31
|
+
│ └── .ai-image-preview-loading(加载中,支持模糊缩略图)
|
|
32
|
+
└── PreviewToolbar(底部工具栏)
|
|
33
|
+
├── 页码(多图时: 1/3)
|
|
34
|
+
├── 缩小 / 放大 / 旋转 / 重置 / 下载
|
|
35
|
+
├── slot#extra(额外操作区域)
|
|
36
|
+
└── 图片信息(showInfo 时显示宽度/分辨率)
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
## 内部子组件
|
|
40
|
+
|
|
41
|
+
### PreviewToolbar
|
|
42
|
+
|
|
43
|
+
底部圆角工具栏,包含以下按钮:
|
|
44
|
+
|
|
45
|
+
| 按钮 | 功能 | tooltip |
|
|
46
|
+
| ---- | ------------------------------ | ------- |
|
|
47
|
+
| 缩小 | 按 15% 步进缩小(最小 0.1 倍) | 缩小 |
|
|
48
|
+
| 放大 | 按 15% 步进放大(最大 10 倍) | 放大 |
|
|
49
|
+
| 旋转 | 顺时针旋转 90° | 旋转 |
|
|
50
|
+
| 重置 | 重置缩放/旋转/位移 | 重置 |
|
|
51
|
+
| 下载 | 触发下载 | 下载 |
|
|
52
|
+
|
|
53
|
+
多图模式下还显示页码(如 "1 / 3")和分隔线。
|
|
54
|
+
|
|
55
|
+
### useImageTransform
|
|
56
|
+
|
|
57
|
+
图片变换 Composable,管理缩放/旋转/平移状态:
|
|
58
|
+
|
|
59
|
+
- `scale`:缩放比例(0.1 ~ 10,步进 15%)
|
|
60
|
+
- `rotate`:旋转角度(每次 +90°,累加不取模)
|
|
61
|
+
- `translateX / translateY`:拖拽偏移量
|
|
62
|
+
- 支持鼠标滚轮缩放和拖拽平移
|
|
63
|
+
- `resetTransform` 重置时跳过过渡动画(`skipTransition`),避免视觉闪烁
|
|
64
|
+
|
|
65
|
+
### usePreviewKeyboard
|
|
66
|
+
|
|
67
|
+
键盘导航 Composable:
|
|
68
|
+
|
|
69
|
+
| 按键 | 功能 |
|
|
70
|
+
| ----- | ------------------ |
|
|
71
|
+
| `Esc` | 关闭预览 |
|
|
72
|
+
| `←` | 上一张(多图模式) |
|
|
73
|
+
| `→` | 下一张(多图模式) |
|
|
74
|
+
|
|
75
|
+
预览打开时自动锁定 `body` 滚动(`overflow: hidden`),关闭时恢复。
|
|
76
|
+
|
|
77
|
+
## 基础用法(单图)
|
|
78
|
+
|
|
79
|
+
```vue
|
|
80
|
+
<template>
|
|
81
|
+
<button @click="visible = true">预览图片</button>
|
|
82
|
+
<ImagePreview
|
|
83
|
+
v-model:visible="visible"
|
|
84
|
+
:images="images"
|
|
85
|
+
/>
|
|
86
|
+
</template>
|
|
87
|
+
|
|
88
|
+
<script setup lang="ts">
|
|
89
|
+
import { ref } from 'vue';
|
|
90
|
+
import { ImagePreview } from '@blueking/chat-x';
|
|
91
|
+
|
|
92
|
+
const visible = ref(false);
|
|
93
|
+
const images = ['https://images.unsplash.com/photo-1506744038136-46273834b3fb?w=1920'];
|
|
94
|
+
</script>
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
## 多图预览
|
|
98
|
+
|
|
99
|
+
传入多张图片时,左右箭头和页码自动显示,支持循环切换:
|
|
100
|
+
|
|
101
|
+
```vue
|
|
102
|
+
<template>
|
|
103
|
+
<button @click="visibleMulti = true">预览多张图片</button>
|
|
104
|
+
<ImagePreview
|
|
105
|
+
v-model:visible="visibleMulti"
|
|
106
|
+
v-model:current="currentIndex"
|
|
107
|
+
:images="images"
|
|
108
|
+
:show-info="true"
|
|
109
|
+
/>
|
|
110
|
+
</template>
|
|
111
|
+
|
|
112
|
+
<script setup lang="ts">
|
|
113
|
+
import { ref } from 'vue';
|
|
114
|
+
import { ImagePreview, type ImageItem } from '@blueking/chat-x';
|
|
115
|
+
|
|
116
|
+
const visibleMulti = ref(false);
|
|
117
|
+
const currentIndex = ref(0);
|
|
118
|
+
const images: ImageItem[] = [
|
|
119
|
+
{ url: '...', name: '湖泊风景.jpg', width: 1920, resolution: '1920×1080' },
|
|
120
|
+
{ url: '...', name: '山谷日出.jpg', width: 1920, resolution: '1920×1280' },
|
|
121
|
+
{ url: '...', name: '森林小径.jpg', width: 1920, resolution: '1920×1280' },
|
|
122
|
+
];
|
|
123
|
+
</script>
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
## File 对象预览
|
|
127
|
+
|
|
128
|
+
`images` 数组中可直接传入 `File` 对象,组件会自动通过 `URL.createObjectURL` 生成预览 URL,并在预览关闭或组件卸载时自动调用 `URL.revokeObjectURL` 释放内存:
|
|
129
|
+
|
|
130
|
+
```vue
|
|
131
|
+
<template>
|
|
132
|
+
<button @click="visibleFile = true">预览 File 对象</button>
|
|
133
|
+
<ImagePreview
|
|
134
|
+
v-model:visible="visibleFile"
|
|
135
|
+
:images="fileImages"
|
|
136
|
+
/>
|
|
137
|
+
</template>
|
|
138
|
+
|
|
139
|
+
<script setup lang="ts">
|
|
140
|
+
import { ref } from 'vue';
|
|
141
|
+
import { ImagePreview } from '@blueking/chat-x';
|
|
142
|
+
|
|
143
|
+
const visibleFile = ref(false);
|
|
144
|
+
const fileImages = [
|
|
145
|
+
new File(['png-data'], 'screenshot.png', { type: 'image/png' }),
|
|
146
|
+
new File(['jpg-data'], 'photo.jpg', { type: 'image/jpeg' }),
|
|
147
|
+
];
|
|
148
|
+
</script>
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
> **ObjectURL 生命周期管理**:组件内部维护 `objectUrls` 数组,在以下时机自动回收:
|
|
152
|
+
>
|
|
153
|
+
> - `images` prop 变化触发 `normalizedImages` 重新计算时
|
|
154
|
+
> - `visible` 从 `true` 变为 `false` 时
|
|
155
|
+
> - 组件 `onBeforeUnmount` 时
|
|
156
|
+
|
|
157
|
+
## API
|
|
158
|
+
|
|
159
|
+
### Props
|
|
160
|
+
|
|
161
|
+
| 属性名 | 类型 | 默认值 | 说明 |
|
|
162
|
+
| ------------ | --------------------------------- | ------- | ----------------------------------------------------------- |
|
|
163
|
+
| images | `(File \| ImageItem \| string)[]` | `[]` | 图片列表;字符串自动转为 `{ url }`,File 自动转为 ObjectURL |
|
|
164
|
+
| maskClosable | `boolean` | `true` | 点击遮罩层是否关闭预览 |
|
|
165
|
+
| showInfo | `boolean` | `false` | 工具栏是否显示图片尺寸信息(width / resolution) |
|
|
166
|
+
| onDownload | `(url: string) => void` | — | 自定义下载回调;不传时使用默认 `<a>` 标签下载 |
|
|
167
|
+
|
|
168
|
+
### v-model
|
|
169
|
+
|
|
170
|
+
| 属性名 | 类型 | 必填 | 说明 |
|
|
171
|
+
| ------- | --------- | ---- | ----------------------- |
|
|
172
|
+
| visible | `boolean` | ✅ | 控制预览弹窗的显示/隐藏 |
|
|
173
|
+
| current | `number` | — | 当前展示的图片索引 |
|
|
174
|
+
|
|
175
|
+
### Slots
|
|
176
|
+
|
|
177
|
+
| 插槽名 | 说明 |
|
|
178
|
+
| ------ | -------------------------------------- |
|
|
179
|
+
| extra | 工具栏额外操作区域,渲染在下载按钮右侧 |
|
|
180
|
+
|
|
181
|
+
## 类型定义
|
|
182
|
+
|
|
183
|
+
```typescript
|
|
184
|
+
interface ImageItem {
|
|
185
|
+
url: string;
|
|
186
|
+
thumbnailUrl?: string;
|
|
187
|
+
name?: string;
|
|
188
|
+
file?: File;
|
|
189
|
+
width?: number;
|
|
190
|
+
height?: number;
|
|
191
|
+
resolution?: string;
|
|
192
|
+
downloadUrl?: string;
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
type ImageLoadingStatus = 'loading' | 'loaded' | 'error';
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
## 交互说明
|
|
199
|
+
|
|
200
|
+
| 操作 | 效果 |
|
|
201
|
+
| ------------- | --------------------------------------- |
|
|
202
|
+
| 滚轮向上 | 放大图片(15% 步进) |
|
|
203
|
+
| 滚轮向下 | 缩小图片(15% 步进) |
|
|
204
|
+
| 鼠标左键拖拽 | 平移图片 |
|
|
205
|
+
| 点击遮罩 | 关闭预览(`maskClosable` 为 `true` 时) |
|
|
206
|
+
| 点击关闭按钮 | 关闭预览 |
|
|
207
|
+
| 左/右箭头按钮 | 切换上/下一张(多图,循环切换) |
|
|
208
|
+
| `Esc` 键 | 关闭预览 |
|
|
209
|
+
| `←` / `→` 键 | 切换上/下一张(多图) |
|
|
210
|
+
|
|
211
|
+
## 使用场景
|
|
212
|
+
|
|
213
|
+
- 单张或多张图片的全屏预览
|
|
214
|
+
- AI 对话中点击图片放大查看(由 `AiImage` 自动触发)
|
|
215
|
+
- 文件列表中点击图片缩略图预览(由 `FileContent` 内部集成)
|
|
216
|
+
- 用户消息中点击附件图片预览(由 `UserMessage` → `FileContent` 自动触发)
|
|
217
|
+
- 需要旋转/缩放/下载操作的图片查看
|
|
218
|
+
- 传入 `File` 对象直接预览(无需手动管理 ObjectURL)
|
|
219
|
+
|
|
220
|
+
## 关联组件
|
|
221
|
+
|
|
222
|
+
- [AiImage](../atomic/ai-image.md) — 独立模式触发预览
|
|
223
|
+
- [ImagePreviewGroup](./image-preview-group.md) — 多图预览容器
|
|
224
|
+
- [FileContent](./file-content.md) — 附件列表点击预览
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
<!-- AI SUMMARY -->
|
|
2
|
+
## 快速了解
|
|
3
|
+
|
|
4
|
+
InfoMessage 以居中虚线分隔条展示系统提示、会话重置、时间戳等非对话信息;content 可为字符串或字符串数组。 由 MessageRender 在 info 角色下渲染,不承载用户与助手轮次内容。
|
|
5
|
+
|
|
6
|
+
### 关联组件
|
|
7
|
+
- **message-render** — 由 MessageRender 在 role 为 info 时创建
|
|
8
|
+
- **message-container** — 嵌入消息列表时由 MessageContainer 统一布局与滚动
|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
<!-- FULL DOC -->
|
|
12
|
+
|
|
13
|
+
# InfoMessage 信息消息
|
|
14
|
+
|
|
15
|
+
> **层级**:分子组件 · **功能域**:消息展示
|
|
16
|
+
|
|
17
|
+
系统信息分隔组件,在聊天消息列表中以**居中虚线分隔条**的形式展示非对话类信息(会话重置、时间节点、状态变更等)。
|
|
18
|
+
|
|
19
|
+
## 视觉原理
|
|
20
|
+
|
|
21
|
+
组件通过 `height: 0` + `border-bottom: 1px dashed #dcdee5` 生成一条贯穿全宽的虚线,内容文字区域设置白色背景"浮"在虚线中央,形成"文字刻在分隔线上"的视觉效果:
|
|
22
|
+
|
|
23
|
+
```
|
|
24
|
+
───── ─ ─ 以下是新的对话 ─ ─ ─────
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## 基础用法
|
|
28
|
+
|
|
29
|
+
`content` 传入字符串,渲染单行分隔信息:
|
|
30
|
+
|
|
31
|
+
```vue
|
|
32
|
+
<template>
|
|
33
|
+
<InfoMessage :content="content" />
|
|
34
|
+
</template>
|
|
35
|
+
|
|
36
|
+
<script setup lang="ts">
|
|
37
|
+
import { InfoMessage } from '@blueking/chat-x';
|
|
38
|
+
|
|
39
|
+
const content = '以下是新的对话';
|
|
40
|
+
</script>
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
**渲染效果**
|
|
44
|
+
|
|
45
|
+
## 多行信息
|
|
46
|
+
|
|
47
|
+
`content` 传入字符串数组时,每个元素渲染为一个独立的文字浮标,均居中排列在同一条虚线上:
|
|
48
|
+
|
|
49
|
+
```vue
|
|
50
|
+
<template>
|
|
51
|
+
<InfoMessage :content="['会话已重置', '以下是新的对话']" />
|
|
52
|
+
</template>
|
|
53
|
+
|
|
54
|
+
<script setup lang="ts">
|
|
55
|
+
import { InfoMessage } from '@blueking/chat-x';
|
|
56
|
+
</script>
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
**渲染效果**
|
|
60
|
+
|
|
61
|
+
## 典型使用场景
|
|
62
|
+
|
|
63
|
+
**会话分隔**
|
|
64
|
+
|
|
65
|
+
**时间节点**
|
|
66
|
+
|
|
67
|
+
**上下文清除**
|
|
68
|
+
|
|
69
|
+
## 在 MessageContainer 中使用
|
|
70
|
+
|
|
71
|
+
`InfoMessage` 通常不需要单独引入,`MessageContainer`(或 `MessageRender`)会对 `role: 'info'` 的消息自动渲染:
|
|
72
|
+
|
|
73
|
+
```vue
|
|
74
|
+
<template>
|
|
75
|
+
<MessageContainer :messages="messages" />
|
|
76
|
+
</template>
|
|
77
|
+
|
|
78
|
+
<script setup lang="ts">
|
|
79
|
+
import { MessageContainer, MessageRole, MessageStatus } from '@blueking/chat-x';
|
|
80
|
+
|
|
81
|
+
const messages = [
|
|
82
|
+
{
|
|
83
|
+
id: '1',
|
|
84
|
+
messageId: '1',
|
|
85
|
+
role: MessageRole.User,
|
|
86
|
+
content: '请帮我分析一下这份报告。',
|
|
87
|
+
status: MessageStatus.Complete,
|
|
88
|
+
},
|
|
89
|
+
// info 消息:role 为 'info',content 为字符串
|
|
90
|
+
{
|
|
91
|
+
id: '2',
|
|
92
|
+
messageId: '2',
|
|
93
|
+
role: MessageRole.Info, // 'info'
|
|
94
|
+
content: '上下文已达上限,已自动清除历史对话',
|
|
95
|
+
status: MessageStatus.Complete,
|
|
96
|
+
},
|
|
97
|
+
{
|
|
98
|
+
id: '3',
|
|
99
|
+
messageId: '3',
|
|
100
|
+
role: MessageRole.Assistant,
|
|
101
|
+
content: '好的,我来帮你分析这份报告...',
|
|
102
|
+
status: MessageStatus.Complete,
|
|
103
|
+
},
|
|
104
|
+
];
|
|
105
|
+
</script>
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
## API
|
|
109
|
+
|
|
110
|
+
### Props
|
|
111
|
+
|
|
112
|
+
组件 Props 继承自 `Partial<InfoMessage>`,所有字段均可选:
|
|
113
|
+
|
|
114
|
+
| 属性名 | 类型 | 说明 |
|
|
115
|
+
| --------- | -------------------- | ------------------------------------------------------------------ |
|
|
116
|
+
| content | `string \| string[]` | 信息内容。字符串渲染单行,数组渲染多个文字浮标,均居中排列在虚线上 |
|
|
117
|
+
| id | `number \| string` | 消息 ID(接收但不使用,由 MessageContainer 管理) |
|
|
118
|
+
| messageId | `number \| string` | 消息唯一标识(接收但不使用) |
|
|
119
|
+
| status | `MessageStatus` | 消息状态(接收但不使用,组件无状态相关渲染逻辑) |
|
|
120
|
+
| role | `MessageRole.Info` | 消息角色,固定为 `'info'` |
|
|
121
|
+
|
|
122
|
+
> **说明**:`content` 的 TypeScript 类型定义为 `string`(与 `BaseMessage` 泛型一致),但组件模板内部通过 `Array.isArray(content) ? content : [content]` 实际兼容字符串数组。
|
|
123
|
+
|
|
124
|
+
## 安全性
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
<!-- AI SUMMARY -->
|
|
2
|
+
## 快速了解
|
|
3
|
+
|
|
4
|
+
KeyValueContent 以多行 key : value 形式展示结构化数据,可选标题栏与 ThinkingIcon。 常见于用户消息等需要表格化键值的气泡展示。
|
|
5
|
+
|
|
6
|
+
### 关联组件
|
|
7
|
+
- **user-message** — 用户消息内展示结构化附加信息
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
<!-- FULL DOC -->
|
|
11
|
+
|
|
12
|
+
# KeyValueContent 键值对内容
|
|
13
|
+
|
|
14
|
+
> **层级**:原子组件 · **功能域**:辅助组件
|
|
15
|
+
|
|
16
|
+
键值对列表展示原子组件,每行以 `key : value` 格式渲染一条数据,支持可选标题栏(带 `ThinkingIcon`)。
|
|
17
|
+
|
|
18
|
+
主要被 `UserMessage` 内部用于渲染结构化引用内容(`property.extra.cite.data`),通常不需要手动引入。
|
|
19
|
+
|
|
20
|
+
## 组件结构
|
|
21
|
+
|
|
22
|
+
```
|
|
23
|
+
div.ai-key-value-content(flex column,gap: 8px,font-size: 12px,color: #4d4f56)
|
|
24
|
+
├── [v-if="title"] div.ai-key-value-title(flex,gap: 4px,font-size: 12px,font-weight: 700,color: #3a84ff)
|
|
25
|
+
│ ├── ThinkingIcon(14×14px)
|
|
26
|
+
│ └── {{ title }}
|
|
27
|
+
└── div.ai-key-value-content(flex column,无 gap) ← 与外层同名嵌套
|
|
28
|
+
└── div.key-value-item × N(flex row,gap: 3px,height: 20px)
|
|
29
|
+
├── div.item-key → {{ item.key }}(font-weight: bold,color: #333)
|
|
30
|
+
├── ":" → 硬编码文本节点,冒号不属于任何 div
|
|
31
|
+
└── div.item-value → {{ item.value }}(overflow hidden,ellipsis,nowrap)
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
> **注意**:内层也是 `.ai-key-value-content` 类(与外层同名),仅用于布局,无额外样式差异。
|
|
35
|
+
> **注意**:`v-for` 使用 `item.key` 作为 `:key`,`content` 中的 `key` 字段必须唯一,否则触发 Vue 重复 key 警告。
|
|
36
|
+
> **注意**:`item.value` 使用 `text-overflow: ellipsis` 截断,但**无 tooltip**(与 `DescPanel` 不同),过长内容会被静默截断。
|
|
37
|
+
|
|
38
|
+
## 基础用法
|
|
39
|
+
|
|
40
|
+
```vue
|
|
41
|
+
<template>
|
|
42
|
+
<KeyValueContent :content="data" />
|
|
43
|
+
</template>
|
|
44
|
+
|
|
45
|
+
<script setup lang="ts">
|
|
46
|
+
import { KeyValueContent } from '@blueking/chat-x';
|
|
47
|
+
|
|
48
|
+
const data = [
|
|
49
|
+
{ key: '名称', value: '蓝鲸智云' },
|
|
50
|
+
{ key: '版本', value: 'v3.0' },
|
|
51
|
+
{ key: '状态', value: '运行中' },
|
|
52
|
+
];
|
|
53
|
+
</script>
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
## 带标题
|
|
57
|
+
|
|
58
|
+
传入 `title` 时,顶部显示 `ThinkingIcon` + 标题文本(蓝色加粗):
|
|
59
|
+
|
|
60
|
+
```vue
|
|
61
|
+
<template>
|
|
62
|
+
<KeyValueContent
|
|
63
|
+
title="模型参数"
|
|
64
|
+
:content="[
|
|
65
|
+
{ key: '模型', value: 'GPT-4' },
|
|
66
|
+
{ key: '温度', value: '0.7' },
|
|
67
|
+
{ key: '最大 Token', value: '2048' },
|
|
68
|
+
{ key: '频率惩罚', value: '0.5' },
|
|
69
|
+
]"
|
|
70
|
+
/>
|
|
71
|
+
</template>
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
## 超长 value 截断
|
|
75
|
+
|
|
76
|
+
`.item-value` 固定 `white-space: nowrap`,超出容器宽度时截断显示省略号,**悬停无 tooltip**:
|
|
77
|
+
|
|
78
|
+
## API
|
|
79
|
+
|
|
80
|
+
### Props
|
|
81
|
+
|
|
82
|
+
| 属性名 | 类型 | 必填 | 说明 |
|
|
83
|
+
| ------- | ----------------------------------- | ---- | ----------------------------------------------------------------- |
|
|
84
|
+
| content | `{ key: string; value: string; }[]` | ✓ | 键值对数组;`key` 同时作为 `v-for` 的 `:key`,需保证唯一 |
|
|
85
|
+
| title | `string` | — | 标题文本;传入后在列表上方渲染 `ThinkingIcon + title`(蓝色加粗) |
|
|
86
|
+
|
|
87
|
+
## 使用场景
|
|
88
|
+
|
|
89
|
+
`KeyValueContent` 由 `UserMessage` 内部使用,渲染结构化引用内容(`property.extra.cite` 为对象类型时):
|
|
90
|
+
|
|
91
|
+
```typescript
|
|
92
|
+
// UserMessage 内部逻辑(简化)
|
|
93
|
+
const citeTitle = computed(() => {
|
|
94
|
+
const cite = props.property?.extra?.cite;
|
|
95
|
+
return cite && typeof cite !== 'string' ? cite.title : undefined;
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
const citeContent = computed(() => {
|
|
99
|
+
const cite = props.property?.extra?.cite;
|
|
100
|
+
return cite && typeof cite !== 'string' ? cite.data : cite;
|
|
101
|
+
});
|
|
102
|
+
// citeContent 为数组时 → <KeyValueContent :content="citeContent" :title="citeTitle" />
|
|
103
|
+
// citeContent 为字符串时 → <CiteContent :content="citeContent" />
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
如需在用户消息中展示结构化引用,将 `property.extra.cite` 设置为以下格式即可:
|
|
107
|
+
|
|
108
|
+
```typescript
|
|
109
|
+
const message = {
|
|
110
|
+
// ...
|
|
111
|
+
property: {
|
|
112
|
+
extra: {
|
|
113
|
+
cite: {
|
|
114
|
+
title: '引用标题',
|
|
115
|
+
data: [{ key: '字段名', value: '字段值' }],
|
|
116
|
+
},
|
|
117
|
+
},
|
|
118
|
+
},
|
|
119
|
+
};
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
## 关联组件
|
|
123
|
+
|
|
124
|
+
- [UserMessage](../molecular/user-message.md) — 键值气泡展示
|