@blueking/chat-x 0.0.50 → 0.0.51-beta.2
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/ag-ui/types/contents.d.ts +2 -0
- package/dist/ag-ui/types/messages.d.ts +5 -0
- package/dist/common/constants.d.ts +1 -1
- package/dist/components/ai-buttons/file-upload-btn/file-upload-btn.vue.d.ts +0 -2
- package/dist/components/chat-content/file-content/file-content.vue.d.ts +5 -2
- package/dist/components/chat-content/file-content/upload-file-item.vue.d.ts +12 -0
- package/dist/components/chat-content/file-content/upload-image-item.vue.d.ts +21 -0
- package/dist/components/chat-input/ai-slash-editor/ai-slash-editor.vue.d.ts +1 -1
- package/dist/components/chat-input/build-default-placeholder.d.ts +7 -0
- package/dist/components/chat-input/chat-input.vue.d.ts +1 -1
- package/dist/components/chat-message/message-container/message-container.vue.d.ts +1 -0
- package/dist/components/chat-message/message-render/message-render.vue.d.ts +2 -0
- package/dist/components/chat-message/user-message/user-message.vue.d.ts +3 -1
- package/dist/components/index.d.ts +2 -1
- package/dist/components/message-tools/message-time/format-message-time.d.ts +8 -0
- package/dist/components/message-tools/message-time/message-time.vue.d.ts +8 -0
- package/dist/components/message-tools/message-tools.vue.d.ts +11 -1
- package/dist/composables/use-custom-tab.d.ts +5 -3
- package/dist/composables/use-global-config.d.ts +3 -0
- package/dist/composables/use-message-group.d.ts +150 -72
- package/dist/icons/execution.d.ts +6 -0
- package/dist/icons/tools.d.ts +3 -0
- package/dist/index.css +1 -1
- package/dist/index.js +3124 -2837
- package/dist/index.js.map +1 -1
- package/dist/lang/lang.d.ts +8 -7
- package/dist/mcp/generated/docs/ai-slash-input.md +2 -0
- package/dist/mcp/generated/docs/assistant-message.md +9 -7
- package/dist/mcp/generated/docs/chat-container.md +38 -32
- package/dist/mcp/generated/docs/chat-input.md +18 -12
- package/dist/mcp/generated/docs/cite-content.md +3 -3
- package/dist/mcp/generated/docs/desc-panel.md +32 -10
- package/dist/mcp/generated/docs/execution-summary.md +3 -3
- package/dist/mcp/generated/docs/file-artifact-panel.md +6 -4
- package/dist/mcp/generated/docs/file-content.md +89 -73
- package/dist/mcp/generated/docs/file-upload-btn.md +16 -18
- package/dist/mcp/generated/docs/message-container.md +3 -0
- package/dist/mcp/generated/docs/message-render.md +2 -1
- package/dist/mcp/generated/docs/message-time.md +180 -0
- package/dist/mcp/generated/docs/message-tools.md +47 -12
- package/dist/mcp/generated/docs/messages.md +9 -0
- package/dist/mcp/generated/docs/toolcall-render.md +82 -43
- package/dist/mcp/generated/docs/use-artifact-preview.md +19 -17
- package/dist/mcp/generated/docs/use-custom-tab.md +12 -8
- package/dist/mcp/generated/docs/use-global-config.md +15 -5
- package/dist/mcp/generated/docs/user-message.md +9 -0
- package/dist/mcp/generated/docs/user-question-card.md +2 -0
- package/dist/mcp/generated/index.json +46 -6
- package/dist/types/input.d.ts +6 -0
- package/dist/utils/file.d.ts +7 -1
- package/dist/utils/index.d.ts +2 -0
- package/dist/utils/merge-tools-by-id.d.ts +6 -0
- package/dist/utils/upload-file.d.ts +35 -0
- package/package.json +3 -2
- package/skills/blueking-chat-x/SKILL.md +139 -0
- package/skills/blueking-chat-x/references/_index.md +131 -0
- package/skills/blueking-chat-x/references/components/activity-layout.md +134 -0
- package/skills/blueking-chat-x/references/components/activity-message.md +486 -0
- package/skills/blueking-chat-x/references/components/ai-image.md +230 -0
- package/skills/blueking-chat-x/references/components/ai-loading.md +131 -0
- package/skills/blueking-chat-x/references/components/ai-prompt-list.md +44 -0
- package/skills/blueking-chat-x/references/components/ai-selection.md +439 -0
- package/skills/blueking-chat-x/references/components/ai-skill-list.md +73 -0
- package/skills/blueking-chat-x/references/components/ai-slash-editor.md +43 -0
- package/skills/blueking-chat-x/references/components/ai-slash-input.md +56 -0
- package/skills/blueking-chat-x/references/components/ai-slash-menu.md +42 -0
- package/skills/blueking-chat-x/references/components/animation-text.md +202 -0
- package/skills/blueking-chat-x/references/components/assistant-message.md +498 -0
- package/skills/blueking-chat-x/references/components/chat-container.md +869 -0
- package/skills/blueking-chat-x/references/components/chat-input.md +769 -0
- package/skills/blueking-chat-x/references/components/cite-content.md +142 -0
- package/skills/blueking-chat-x/references/components/code-content.md +211 -0
- package/skills/blueking-chat-x/references/components/common-error-content.md +73 -0
- package/skills/blueking-chat-x/references/components/content-render.md +233 -0
- package/skills/blueking-chat-x/references/components/delete-tool.md +191 -0
- package/skills/blueking-chat-x/references/components/desc-panel.md +162 -0
- package/skills/blueking-chat-x/references/components/detail-section.md +91 -0
- package/skills/blueking-chat-x/references/components/execution-summary.md +128 -0
- package/skills/blueking-chat-x/references/components/file-artifact-panel.md +289 -0
- package/skills/blueking-chat-x/references/components/file-content.md +319 -0
- package/skills/blueking-chat-x/references/components/file-icon.md +109 -0
- package/skills/blueking-chat-x/references/components/file-upload-btn.md +159 -0
- package/skills/blueking-chat-x/references/components/flow-agent-content.md +264 -0
- package/skills/blueking-chat-x/references/components/flow-agent-node-detail.md +236 -0
- package/skills/blueking-chat-x/references/components/highlight-keyword.md +146 -0
- package/skills/blueking-chat-x/references/components/image-content.md +182 -0
- package/skills/blueking-chat-x/references/components/image-preview-group.md +184 -0
- package/skills/blueking-chat-x/references/components/image-preview.md +226 -0
- package/skills/blueking-chat-x/references/components/info-message.md +144 -0
- package/skills/blueking-chat-x/references/components/input-attachment.md +49 -0
- package/skills/blueking-chat-x/references/components/input-info-alert.md +42 -0
- package/skills/blueking-chat-x/references/components/interrupt-message.md +212 -0
- package/skills/blueking-chat-x/references/components/key-value-content.md +128 -0
- package/skills/blueking-chat-x/references/components/knowledge-rag-content.md +122 -0
- package/skills/blueking-chat-x/references/components/latex-content.md +200 -0
- package/skills/blueking-chat-x/references/components/loading-message.md +192 -0
- package/skills/blueking-chat-x/references/components/markdown-content.md +232 -0
- package/skills/blueking-chat-x/references/components/mermaid-content.md +189 -0
- package/skills/blueking-chat-x/references/components/message-container.md +645 -0
- package/skills/blueking-chat-x/references/components/message-loading.md +118 -0
- package/skills/blueking-chat-x/references/components/message-render.md +327 -0
- package/skills/blueking-chat-x/references/components/message-time.md +177 -0
- package/skills/blueking-chat-x/references/components/message-tools.md +416 -0
- package/skills/blueking-chat-x/references/components/model-selector.md +155 -0
- package/skills/blueking-chat-x/references/components/preview-toolbar.md +42 -0
- package/skills/blueking-chat-x/references/components/questions-container.md +85 -0
- package/skills/blueking-chat-x/references/components/reasoning-message.md +232 -0
- package/skills/blueking-chat-x/references/components/reference-content.md +135 -0
- package/skills/blueking-chat-x/references/components/reference-doc-content.md +109 -0
- package/skills/blueking-chat-x/references/components/scroll-btn.md +159 -0
- package/skills/blueking-chat-x/references/components/selection-footer.md +78 -0
- package/skills/blueking-chat-x/references/components/selection-question.md +88 -0
- package/skills/blueking-chat-x/references/components/shortcut-btn.md +204 -0
- package/skills/blueking-chat-x/references/components/shortcut-btns.md +266 -0
- package/skills/blueking-chat-x/references/components/shortcut-render.md +424 -0
- package/skills/blueking-chat-x/references/components/simple-table.md +101 -0
- package/skills/blueking-chat-x/references/components/text-content.md +77 -0
- package/skills/blueking-chat-x/references/components/tool-approval-card.md +183 -0
- package/skills/blueking-chat-x/references/components/tool-btn.md +317 -0
- package/skills/blueking-chat-x/references/components/tool-message.md +235 -0
- package/skills/blueking-chat-x/references/components/toolcall-render.md +348 -0
- package/skills/blueking-chat-x/references/components/user-feedback.md +233 -0
- package/skills/blueking-chat-x/references/components/user-message.md +424 -0
- package/skills/blueking-chat-x/references/components/user-question-answered-card.md +104 -0
- package/skills/blueking-chat-x/references/components/user-question-card.md +231 -0
- package/skills/blueking-chat-x/references/components/user-question-choice.md +105 -0
- package/skills/blueking-chat-x/references/components/user-question-option.md +42 -0
- package/skills/blueking-chat-x/references/components/vnode-renderer.md +122 -0
- package/skills/blueking-chat-x/references/composables/use-animation-text.md +196 -0
- package/skills/blueking-chat-x/references/composables/use-artifact-preview.md +231 -0
- package/skills/blueking-chat-x/references/composables/use-clipboard.md +203 -0
- package/skills/blueking-chat-x/references/composables/use-command-selection.md +150 -0
- package/skills/blueking-chat-x/references/composables/use-container-scroll.md +57 -0
- package/skills/blueking-chat-x/references/composables/use-custom-tab.md +158 -0
- package/skills/blueking-chat-x/references/composables/use-flow-node-actions.md +157 -0
- package/skills/blueking-chat-x/references/composables/use-full-screen.md +112 -0
- package/skills/blueking-chat-x/references/composables/use-global-config.md +148 -0
- package/skills/blueking-chat-x/references/composables/use-menu-keydown.md +163 -0
- package/skills/blueking-chat-x/references/composables/use-message-group.md +247 -0
- package/skills/blueking-chat-x/references/composables/use-observer-visible-list.md +188 -0
- package/skills/blueking-chat-x/references/composables/use-parent-scrolling.md +46 -0
- package/skills/blueking-chat-x/references/theme/theme.md +431 -0
- package/skills/blueking-chat-x/references/types/constants.md +307 -0
- package/skills/blueking-chat-x/references/types/interrupt.md +379 -0
- package/skills/blueking-chat-x/references/types/messages.md +553 -0
- package/skills/blueking-chat-x/references/types/schema.md +91 -0
- package/skills/blueking-chat-x/scripts/generate-references.mjs +314 -0
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
# ImagePreviewGroup 图片预览组
|
|
2
|
+
|
|
3
|
+
> 能力域:媒体文件 | 导入:`import { ImagePreviewGroup } from '@blueking/chat-x'` | since 1.0.0
|
|
4
|
+
|
|
5
|
+
通过 provide/inject 管理同组图片预览。 源码位置:src/components/image-preview/image-preview-group.vue。
|
|
6
|
+
|
|
7
|
+
**关联**:ai-image(子级注册并参与多图预览集合)、image-preview(内置实例承载多图切换与工具栏)
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# ImagePreviewGroup 图片预览组
|
|
12
|
+
## 源码事实
|
|
13
|
+
|
|
14
|
+
- **源码位置**:`src/components/image-preview/image-preview-group.vue`
|
|
15
|
+
- **能力域**:媒体文件
|
|
16
|
+
- **能力说明**:通过 provide/inject 管理同组图片预览。
|
|
17
|
+
|
|
18
|
+
> **能力域**:媒体文件
|
|
19
|
+
|
|
20
|
+
多图预览管理容器。通过 `provide/inject` + `Map<symbol>` 模式管理子级 `AiImage` 的注册与预览状态,点击任意子图片时自动收集所有已注册图片并打开多图预览。
|
|
21
|
+
|
|
22
|
+
## 组件结构
|
|
23
|
+
|
|
24
|
+
```
|
|
25
|
+
.ai-image-preview-group
|
|
26
|
+
├── <slot />(放置多个 AiImage)
|
|
27
|
+
└── ImagePreview(内置,按需显示)
|
|
28
|
+
v-model:visible="previewVisible"
|
|
29
|
+
v-model:current="activeIndex"
|
|
30
|
+
:images="previewImages"
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
## 工作原理
|
|
34
|
+
|
|
35
|
+
```
|
|
36
|
+
┌─ ImagePreviewGroup ──────────────────────────────────────┐
|
|
37
|
+
│ provide(IMAGE_PREVIEW_GROUP_KEY, { register, unregister, preview }) │
|
|
38
|
+
│ │
|
|
39
|
+
│ ┌─ AiImage ─┐ ┌─ AiImage ─┐ ┌─ AiImage ─┐ │
|
|
40
|
+
│ │ uid: sym1 │ │ uid: sym2 │ │ uid: sym3 │ │
|
|
41
|
+
│ │ onMounted → register(sym, getItem) │
|
|
42
|
+
│ │ onClick → groupContext.preview(sym) │
|
|
43
|
+
│ │ onUnmount → unregister(sym) │
|
|
44
|
+
│ └────────────┘ └────────────┘ └────────────┘ │
|
|
45
|
+
│ │
|
|
46
|
+
│ preview(uid) → 收集所有 registry 中的 ImageItem → │
|
|
47
|
+
│ 设置 activeIndex → 打开 ImagePreview │
|
|
48
|
+
└───────────────────────────────────────────────────────────────────────┘
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
## 基础用法
|
|
52
|
+
|
|
53
|
+
```vue
|
|
54
|
+
<template>
|
|
55
|
+
<ImagePreviewGroup>
|
|
56
|
+
<AiImage
|
|
57
|
+
v-for="(src, i) in images"
|
|
58
|
+
:key="i"
|
|
59
|
+
:src="src"
|
|
60
|
+
:width="160"
|
|
61
|
+
:height="120"
|
|
62
|
+
/>
|
|
63
|
+
</ImagePreviewGroup>
|
|
64
|
+
</template>
|
|
65
|
+
|
|
66
|
+
<script setup lang="ts">
|
|
67
|
+
import { AiImage, ImagePreviewGroup } from '@blueking/chat-x';
|
|
68
|
+
|
|
69
|
+
const images = [
|
|
70
|
+
'https://images.unsplash.com/photo-1506744038136-46273834b3fb?w=400&h=300&fit=crop',
|
|
71
|
+
'https://images.unsplash.com/photo-1469474968028-56623f02e42e?w=400&h=300&fit=crop',
|
|
72
|
+
'https://images.unsplash.com/photo-1447752875215-b2761acb3c5d?w=400&h=300&fit=crop',
|
|
73
|
+
];
|
|
74
|
+
</script>
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
## 带图片信息
|
|
78
|
+
|
|
79
|
+
配合 `showInfo` 和 `AiImage` 的 `previewProps`,在预览工具栏显示图片尺寸信息:
|
|
80
|
+
|
|
81
|
+
```vue
|
|
82
|
+
<template>
|
|
83
|
+
<ImagePreviewGroup :show-info="true">
|
|
84
|
+
<AiImage
|
|
85
|
+
v-for="(img, i) in images"
|
|
86
|
+
:key="i"
|
|
87
|
+
:src="img.src"
|
|
88
|
+
:preview-props="img.previewProps"
|
|
89
|
+
:width="160"
|
|
90
|
+
:height="120"
|
|
91
|
+
/>
|
|
92
|
+
</ImagePreviewGroup>
|
|
93
|
+
</template>
|
|
94
|
+
|
|
95
|
+
<script setup lang="ts">
|
|
96
|
+
import { AiImage, ImagePreviewGroup, type ImagePreviewConfig } from '@blueking/chat-x';
|
|
97
|
+
|
|
98
|
+
const images = [
|
|
99
|
+
{
|
|
100
|
+
src: '...缩略图地址...',
|
|
101
|
+
previewProps: {
|
|
102
|
+
src: '...高清原图地址...',
|
|
103
|
+
name: '湖泊风景.jpg',
|
|
104
|
+
width: 1920,
|
|
105
|
+
resolution: '1920×1080',
|
|
106
|
+
} as ImagePreviewConfig,
|
|
107
|
+
},
|
|
108
|
+
// ...更多图片
|
|
109
|
+
];
|
|
110
|
+
</script>
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
## 自定义下载
|
|
114
|
+
|
|
115
|
+
通过 `onDownload` 统一控制所有子图片的下载行为:
|
|
116
|
+
|
|
117
|
+
```vue
|
|
118
|
+
<template>
|
|
119
|
+
<ImagePreviewGroup :on-download="handleDownload">
|
|
120
|
+
<AiImage
|
|
121
|
+
v-for="(src, i) in images"
|
|
122
|
+
:key="i"
|
|
123
|
+
:src="src"
|
|
124
|
+
:width="160"
|
|
125
|
+
:height="120"
|
|
126
|
+
/>
|
|
127
|
+
</ImagePreviewGroup>
|
|
128
|
+
</template>
|
|
129
|
+
|
|
130
|
+
<script setup lang="ts">
|
|
131
|
+
import { AiImage, ImagePreviewGroup } from '@blueking/chat-x';
|
|
132
|
+
|
|
133
|
+
const handleDownload = (url: string) => {
|
|
134
|
+
window.open(`/api/download?url=${encodeURIComponent(url)}`);
|
|
135
|
+
};
|
|
136
|
+
</script>
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
## API
|
|
140
|
+
|
|
141
|
+
### Props
|
|
142
|
+
|
|
143
|
+
| 属性名 | 类型 | 默认值 | 说明 |
|
|
144
|
+
| ------------ | ----------------------- | ------- | --------------------------------------------- |
|
|
145
|
+
| maskClosable | `boolean` | `true` | 点击遮罩层是否关闭预览 |
|
|
146
|
+
| showInfo | `boolean` | `false` | 预览工具栏是否显示图片尺寸信息 |
|
|
147
|
+
| onDownload | `(url: string) => void` | — | 自定义下载回调;不传时使用默认 `<a>` 标签下载 |
|
|
148
|
+
|
|
149
|
+
### Slots
|
|
150
|
+
|
|
151
|
+
| 插槽名 | 说明 |
|
|
152
|
+
| ------- | ----------------------------------------------- |
|
|
153
|
+
| default | 放置子级 `AiImage` 组件 |
|
|
154
|
+
| extra | 预览工具栏的额外操作区域(透传给 ImagePreview) |
|
|
155
|
+
|
|
156
|
+
## 类型定义
|
|
157
|
+
|
|
158
|
+
```typescript
|
|
159
|
+
interface ImagePreviewGroupContext {
|
|
160
|
+
register: (uid: symbol, getItem: () => ImageItem) => void;
|
|
161
|
+
unregister: (uid: symbol) => void;
|
|
162
|
+
preview: (uid: symbol) => void;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
const IMAGE_PREVIEW_GROUP_KEY: InjectionKey<ImagePreviewGroupContext>;
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
## 与 AiImage 的协作关系
|
|
169
|
+
|
|
170
|
+
| AiImage 场景 | 行为 |
|
|
171
|
+
| ------------- | ---------------------------------------------------------------------------------------- |
|
|
172
|
+
| 未在 Group 内 | `inject` 返回 `null`,AiImage 内部自行渲染 `ImagePreview`(独立模式) |
|
|
173
|
+
| 在 Group 内 | `inject` 获取 Group 上下文;`onMounted` 注册自身;点击时调用 `groupContext.preview(uid)` |
|
|
174
|
+
|
|
175
|
+
## 使用场景
|
|
176
|
+
|
|
177
|
+
- AI 对话中一条消息包含多张图片,需要统一预览
|
|
178
|
+
- 图片画廊场景
|
|
179
|
+
- 任何需要"点击缩略图 → 多图预览切换"的场景
|
|
180
|
+
|
|
181
|
+
## 关联组件
|
|
182
|
+
|
|
183
|
+
- [AiImage](/components/medias/ai-image) — 子级缩略图与注册
|
|
184
|
+
- [ImagePreview](/components/medias/image-preview) — 内置全屏预览
|
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
# ImagePreview 图片预览
|
|
2
|
+
|
|
3
|
+
> 能力域:媒体文件 | 导入:`import { ImagePreview } from '@blueking/chat-x'` | since 1.0.0
|
|
4
|
+
|
|
5
|
+
图片全屏预览容器,支持缩放、旋转、下载工具栏。 源码位置:src/components/image-preview/image-preview.vue。
|
|
6
|
+
|
|
7
|
+
**关联**:ai-image(独立模式下由 AiImage 打开预览)、image-preview-group(组内容器内持有一个实例做多图切换)、file-content(文件列表点击缩略图触发预览)
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# ImagePreview 图片预览
|
|
12
|
+
## 源码事实
|
|
13
|
+
|
|
14
|
+
- **源码位置**:`src/components/image-preview/image-preview.vue`
|
|
15
|
+
- **能力域**:媒体文件
|
|
16
|
+
- **能力说明**:图片全屏预览容器,支持缩放、旋转、下载工具栏。
|
|
17
|
+
|
|
18
|
+
> **能力域**:媒体文件
|
|
19
|
+
|
|
20
|
+
全屏图片预览组件,通过 `Teleport` 渲染到 `body`,支持缩放、旋转、拖拽、下载、键盘导航等功能。`images` 支持传入 URL 字符串、`ImageItem` 对象或 `File` 对象,File 对象会自动通过 `URL.createObjectURL` 生成预览并在关闭/卸载时回收。通常不直接使用,而是配合 `AiImage`、`ImagePreviewGroup` 或 `FileContent` 自动触发。
|
|
21
|
+
|
|
22
|
+
## 组件结构
|
|
23
|
+
|
|
24
|
+
```
|
|
25
|
+
Teleport(to="body")
|
|
26
|
+
└── .ai-image-preview(fixed,z-index: 10000,background: rgba(0,0,0,0.6))
|
|
27
|
+
├── .ai-image-preview-close(右上角关闭按钮)
|
|
28
|
+
├── .ai-image-preview-arrow-left(左切换箭头,多图时显示)
|
|
29
|
+
├── .ai-image-preview-arrow-right(右切换箭头,多图时显示)
|
|
30
|
+
├── .ai-image-preview-body(图片主体区域,支持拖拽/滚轮缩放)
|
|
31
|
+
│ ├── <img>(currentStatus !== 'error' 时)
|
|
32
|
+
│ ├── .ai-image-preview-error(加载失败时)
|
|
33
|
+
│ └── .ai-image-preview-loading(加载中,支持模糊缩略图)
|
|
34
|
+
└── PreviewToolbar(底部工具栏)
|
|
35
|
+
├── 页码(多图时: 1/3)
|
|
36
|
+
├── 缩小 / 放大 / 旋转 / 重置 / 下载
|
|
37
|
+
├── slot#extra(额外操作区域)
|
|
38
|
+
└── 图片信息(showInfo 时显示宽度/分辨率)
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
## 内部子组件
|
|
42
|
+
|
|
43
|
+
### PreviewToolbar
|
|
44
|
+
|
|
45
|
+
底部圆角工具栏,包含以下按钮:
|
|
46
|
+
|
|
47
|
+
| 按钮 | 功能 | tooltip |
|
|
48
|
+
| ---- | ------------------------------ | ------- |
|
|
49
|
+
| 缩小 | 按 15% 步进缩小(最小 0.1 倍) | 缩小 |
|
|
50
|
+
| 放大 | 按 15% 步进放大(最大 10 倍) | 放大 |
|
|
51
|
+
| 旋转 | 顺时针旋转 90° | 旋转 |
|
|
52
|
+
| 重置 | 重置缩放/旋转/位移 | 重置 |
|
|
53
|
+
| 下载 | 触发下载 | 下载 |
|
|
54
|
+
|
|
55
|
+
多图模式下还显示页码(如 "1 / 3")和分隔线。
|
|
56
|
+
|
|
57
|
+
### useImageTransform
|
|
58
|
+
|
|
59
|
+
图片变换 Composable,管理缩放/旋转/平移状态:
|
|
60
|
+
|
|
61
|
+
- `scale`:缩放比例(0.1 ~ 10,步进 15%)
|
|
62
|
+
- `rotate`:旋转角度(每次 +90°,累加不取模)
|
|
63
|
+
- `translateX / translateY`:拖拽偏移量
|
|
64
|
+
- 支持鼠标滚轮缩放和拖拽平移
|
|
65
|
+
- `resetTransform` 重置时跳过过渡动画(`skipTransition`),避免视觉闪烁
|
|
66
|
+
|
|
67
|
+
### usePreviewKeyboard
|
|
68
|
+
|
|
69
|
+
键盘导航 Composable:
|
|
70
|
+
|
|
71
|
+
| 按键 | 功能 |
|
|
72
|
+
| ----- | ------------------ |
|
|
73
|
+
| `Esc` | 关闭预览 |
|
|
74
|
+
| `←` | 上一张(多图模式) |
|
|
75
|
+
| `→` | 下一张(多图模式) |
|
|
76
|
+
|
|
77
|
+
预览打开时自动锁定 `body` 滚动(`overflow: hidden`),关闭时恢复。
|
|
78
|
+
|
|
79
|
+
## 基础用法(单图)
|
|
80
|
+
|
|
81
|
+
```vue
|
|
82
|
+
<template>
|
|
83
|
+
<button @click="visible = true">预览图片</button>
|
|
84
|
+
<ImagePreview
|
|
85
|
+
v-model:visible="visible"
|
|
86
|
+
:images="images"
|
|
87
|
+
/>
|
|
88
|
+
</template>
|
|
89
|
+
|
|
90
|
+
<script setup lang="ts">
|
|
91
|
+
import { ref } from 'vue';
|
|
92
|
+
import { ImagePreview } from '@blueking/chat-x';
|
|
93
|
+
|
|
94
|
+
const visible = ref(false);
|
|
95
|
+
const images = ['https://images.unsplash.com/photo-1506744038136-46273834b3fb?w=1920'];
|
|
96
|
+
</script>
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
## 多图预览
|
|
100
|
+
|
|
101
|
+
传入多张图片时,左右箭头和页码自动显示,支持循环切换:
|
|
102
|
+
|
|
103
|
+
```vue
|
|
104
|
+
<template>
|
|
105
|
+
<button @click="visibleMulti = true">预览多张图片</button>
|
|
106
|
+
<ImagePreview
|
|
107
|
+
v-model:visible="visibleMulti"
|
|
108
|
+
v-model:current="currentIndex"
|
|
109
|
+
:images="images"
|
|
110
|
+
:show-info="true"
|
|
111
|
+
/>
|
|
112
|
+
</template>
|
|
113
|
+
|
|
114
|
+
<script setup lang="ts">
|
|
115
|
+
import { ref } from 'vue';
|
|
116
|
+
import { ImagePreview, type ImageItem } from '@blueking/chat-x';
|
|
117
|
+
|
|
118
|
+
const visibleMulti = ref(false);
|
|
119
|
+
const currentIndex = ref(0);
|
|
120
|
+
const images: ImageItem[] = [
|
|
121
|
+
{ url: '...', name: '湖泊风景.jpg', width: 1920, resolution: '1920×1080' },
|
|
122
|
+
{ url: '...', name: '山谷日出.jpg', width: 1920, resolution: '1920×1280' },
|
|
123
|
+
{ url: '...', name: '森林小径.jpg', width: 1920, resolution: '1920×1280' },
|
|
124
|
+
];
|
|
125
|
+
</script>
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
## File 对象预览
|
|
129
|
+
|
|
130
|
+
`images` 数组中可直接传入 `File` 对象,组件会自动通过 `URL.createObjectURL` 生成预览 URL,并在预览关闭或组件卸载时自动调用 `URL.revokeObjectURL` 释放内存:
|
|
131
|
+
|
|
132
|
+
```vue
|
|
133
|
+
<template>
|
|
134
|
+
<button @click="visibleFile = true">预览 File 对象</button>
|
|
135
|
+
<ImagePreview
|
|
136
|
+
v-model:visible="visibleFile"
|
|
137
|
+
:images="fileImages"
|
|
138
|
+
/>
|
|
139
|
+
</template>
|
|
140
|
+
|
|
141
|
+
<script setup lang="ts">
|
|
142
|
+
import { ref } from 'vue';
|
|
143
|
+
import { ImagePreview } from '@blueking/chat-x';
|
|
144
|
+
|
|
145
|
+
const visibleFile = ref(false);
|
|
146
|
+
const fileImages = [
|
|
147
|
+
new File(['png-data'], 'screenshot.png', { type: 'image/png' }),
|
|
148
|
+
new File(['jpg-data'], 'photo.jpg', { type: 'image/jpeg' }),
|
|
149
|
+
];
|
|
150
|
+
</script>
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
> **ObjectURL 生命周期管理**:组件内部维护 `objectUrls` 数组,在以下时机自动回收:
|
|
154
|
+
>
|
|
155
|
+
> - `normalizedImages` 计算属性重算时(会先 `revokeObjectUrls`,再按当前 `images` 与 `visible` 生成新列表)
|
|
156
|
+
> - **`visible` 为 `false` 时**:计算属性直接清空并 `revokeObjectURL`,避免仅依赖 `props.images` 时 computed 仍缓存**已失效**的 blob URL,导致关闭预览后再次打开加载失败
|
|
157
|
+
> - 组件 `onBeforeUnmount` 时
|
|
158
|
+
|
|
159
|
+
## API
|
|
160
|
+
|
|
161
|
+
### Props
|
|
162
|
+
|
|
163
|
+
| 属性名 | 类型 | 默认值 | 说明 |
|
|
164
|
+
| ------------ | --------------------------------- | ------- | ----------------------------------------------------------- |
|
|
165
|
+
| images | `(File \| ImageItem \| string)[]` | `[]` | 图片列表;字符串自动转为 `{ url }`,File 自动转为 ObjectURL |
|
|
166
|
+
| maskClosable | `boolean` | `true` | 点击遮罩层是否关闭预览 |
|
|
167
|
+
| showInfo | `boolean` | `false` | 工具栏是否显示图片尺寸信息(width / resolution) |
|
|
168
|
+
| onDownload | `(url: string) => void` | — | 自定义下载回调;不传时使用默认 `<a>` 标签下载 |
|
|
169
|
+
|
|
170
|
+
### v-model
|
|
171
|
+
|
|
172
|
+
| 属性名 | 类型 | 必填 | 说明 |
|
|
173
|
+
| ------- | --------- | ---- | ----------------------- |
|
|
174
|
+
| visible | `boolean` | ✅ | 控制预览弹窗的显示/隐藏 |
|
|
175
|
+
| current | `number` | — | 当前展示的图片索引 |
|
|
176
|
+
|
|
177
|
+
### Slots
|
|
178
|
+
|
|
179
|
+
| 插槽名 | 说明 |
|
|
180
|
+
| ------ | -------------------------------------- |
|
|
181
|
+
| extra | 工具栏额外操作区域,渲染在下载按钮右侧 |
|
|
182
|
+
|
|
183
|
+
## 类型定义
|
|
184
|
+
|
|
185
|
+
```typescript
|
|
186
|
+
interface ImageItem {
|
|
187
|
+
url: string;
|
|
188
|
+
thumbnailUrl?: string;
|
|
189
|
+
name?: string;
|
|
190
|
+
file?: File;
|
|
191
|
+
width?: number;
|
|
192
|
+
height?: number;
|
|
193
|
+
resolution?: string;
|
|
194
|
+
downloadUrl?: string;
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
type ImageLoadingStatus = 'loading' | 'loaded' | 'error';
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
## 交互说明
|
|
201
|
+
|
|
202
|
+
| 操作 | 效果 |
|
|
203
|
+
| ------------- | --------------------------------------- |
|
|
204
|
+
| 滚轮向上 | 放大图片(15% 步进) |
|
|
205
|
+
| 滚轮向下 | 缩小图片(15% 步进) |
|
|
206
|
+
| 鼠标左键拖拽 | 平移图片 |
|
|
207
|
+
| 点击遮罩 | 关闭预览(`maskClosable` 为 `true` 时) |
|
|
208
|
+
| 点击关闭按钮 | 关闭预览 |
|
|
209
|
+
| 左/右箭头按钮 | 切换上/下一张(多图,循环切换) |
|
|
210
|
+
| `Esc` 键 | 关闭预览 |
|
|
211
|
+
| `←` / `→` 键 | 切换上/下一张(多图) |
|
|
212
|
+
|
|
213
|
+
## 使用场景
|
|
214
|
+
|
|
215
|
+
- 单张或多张图片的全屏预览
|
|
216
|
+
- AI 对话中点击图片放大查看(由 `AiImage` 自动触发)
|
|
217
|
+
- 文件列表中点击图片缩略图预览(由 `FileContent` 内部集成)
|
|
218
|
+
- 用户消息中点击附件图片预览(由 `UserMessage` → `FileContent` 自动触发)
|
|
219
|
+
- 需要旋转/缩放/下载操作的图片查看
|
|
220
|
+
- 传入 `File` 对象直接预览(无需手动管理 ObjectURL)
|
|
221
|
+
|
|
222
|
+
## 关联组件
|
|
223
|
+
|
|
224
|
+
- [AiImage](/components/medias/ai-image) — 独立模式触发预览
|
|
225
|
+
- [ImagePreviewGroup](/components/medias/image-preview-group) — 多图预览容器
|
|
226
|
+
- [FileContent](/components/medias/file-content) — 附件列表点击预览
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
# InfoMessage 信息消息
|
|
2
|
+
|
|
3
|
+
> 能力域:消息系统 | 导入:`import { InfoMessage } from '@blueking/chat-x'` | since 0.0.20
|
|
4
|
+
|
|
5
|
+
渲染居中的系统信息提示。 源码位置:src/components/chat-message/info-message/info-message.vue。
|
|
6
|
+
|
|
7
|
+
**关联**:message-render(由 MessageRender 在 role 为 info 时创建)、message-container(嵌入消息列表时由 MessageContainer 统一布局与滚动)
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# InfoMessage 信息消息
|
|
12
|
+
|
|
13
|
+
## 源码事实
|
|
14
|
+
|
|
15
|
+
- **源码位置**:`src/components/chat-message/info-message/info-message.vue`
|
|
16
|
+
- **能力域**:消息系统
|
|
17
|
+
- **能力说明**:渲染居中的系统信息提示。
|
|
18
|
+
|
|
19
|
+
> **导出说明**:`InfoMessage` **未**从包入口导出(入口同名是 TS interface)。消费方经 `MessageRender` / `MessageContainer` 使用。下文 `InfoMessageComp` 为文档站内部示例。
|
|
20
|
+
|
|
21
|
+
系统信息分隔组件,在聊天消息列表中以**左右虚线夹中文案**的形式展示非对话类信息(会话重置、时间节点、状态变更等)。
|
|
22
|
+
|
|
23
|
+
## 视觉原理
|
|
24
|
+
|
|
25
|
+
根节点 `.ai-info-message` 为横向 flex:两侧通过 `::before` / `::after` 拉伸出虚线(主题边框色),中间 `.ai-info-message-body` 承载文案(主题次要文案色)。整块正常占位,避免旧实现 `height: 0` 导致内容被裁切遮挡:
|
|
26
|
+
|
|
27
|
+
```
|
|
28
|
+
─────── 以下是新的对话 ───────
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
多行时,多条 `.ai-info-message-content` 在 body 内纵向排列(`gap: 4px`),两侧虚线仍夹住整块文案区域。
|
|
32
|
+
## 基础用法
|
|
33
|
+
|
|
34
|
+
`content` 传入字符串,渲染单行分隔信息:
|
|
35
|
+
|
|
36
|
+
```vue
|
|
37
|
+
<template>
|
|
38
|
+
<MessageRender :message="message" />
|
|
39
|
+
</template>
|
|
40
|
+
|
|
41
|
+
<script setup lang="ts">
|
|
42
|
+
import { MessageRender, MessageRole, MessageStatus } from '@blueking/chat-x';
|
|
43
|
+
|
|
44
|
+
const message = {
|
|
45
|
+
id: '1',
|
|
46
|
+
messageId: '1',
|
|
47
|
+
role: MessageRole.Info,
|
|
48
|
+
content: '以下是新的对话',
|
|
49
|
+
status: MessageStatus.Complete,
|
|
50
|
+
};
|
|
51
|
+
</script>
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
**渲染效果**
|
|
55
|
+
|
|
56
|
+
## 多行信息
|
|
57
|
+
|
|
58
|
+
`content` 传入字符串数组时,每个元素渲染为一行居中文案,在中间 body 内纵向排列,两侧虚线夹住整块区域:
|
|
59
|
+
|
|
60
|
+
```vue
|
|
61
|
+
<template>
|
|
62
|
+
<MessageRender :message="message" />
|
|
63
|
+
</template>
|
|
64
|
+
|
|
65
|
+
<script setup lang="ts">
|
|
66
|
+
import { MessageRender, MessageRole, MessageStatus } from '@blueking/chat-x';
|
|
67
|
+
|
|
68
|
+
// 运行时 content 兼容 string[](TS 类型声明多为 string)
|
|
69
|
+
const message = {
|
|
70
|
+
id: '1',
|
|
71
|
+
messageId: '1',
|
|
72
|
+
role: MessageRole.Info,
|
|
73
|
+
content: ['会话已重置', '以下是新的对话'],
|
|
74
|
+
status: MessageStatus.Complete,
|
|
75
|
+
};
|
|
76
|
+
</script>
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
**渲染效果**
|
|
80
|
+
|
|
81
|
+
## 典型使用场景
|
|
82
|
+
|
|
83
|
+
**会话分隔**
|
|
84
|
+
|
|
85
|
+
**时间节点**
|
|
86
|
+
|
|
87
|
+
**上下文清除**
|
|
88
|
+
|
|
89
|
+
## 在 MessageContainer 中使用
|
|
90
|
+
|
|
91
|
+
`InfoMessage` 通常不需要单独引入,`MessageContainer`(或 `MessageRender`)会对 `role: 'info'` 的消息自动渲染:
|
|
92
|
+
|
|
93
|
+
```vue
|
|
94
|
+
<template>
|
|
95
|
+
<MessageContainer :messages="messages" />
|
|
96
|
+
</template>
|
|
97
|
+
|
|
98
|
+
<script setup lang="ts">
|
|
99
|
+
import { MessageContainer, MessageRole, MessageStatus } from '@blueking/chat-x';
|
|
100
|
+
|
|
101
|
+
const messages = [
|
|
102
|
+
{
|
|
103
|
+
id: '1',
|
|
104
|
+
messageId: '1',
|
|
105
|
+
role: MessageRole.User,
|
|
106
|
+
content: '请帮我分析一下这份报告。',
|
|
107
|
+
status: MessageStatus.Complete,
|
|
108
|
+
},
|
|
109
|
+
// info 消息:role 为 'info',content 为字符串
|
|
110
|
+
{
|
|
111
|
+
id: '2',
|
|
112
|
+
messageId: '2',
|
|
113
|
+
role: MessageRole.Info, // 'info'
|
|
114
|
+
content: '上下文已达上限,已自动清除历史对话',
|
|
115
|
+
status: MessageStatus.Complete,
|
|
116
|
+
},
|
|
117
|
+
{
|
|
118
|
+
id: '3',
|
|
119
|
+
messageId: '3',
|
|
120
|
+
role: MessageRole.Assistant,
|
|
121
|
+
content: '好的,我来帮你分析这份报告...',
|
|
122
|
+
status: MessageStatus.Complete,
|
|
123
|
+
},
|
|
124
|
+
];
|
|
125
|
+
</script>
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
## API
|
|
129
|
+
|
|
130
|
+
### Props
|
|
131
|
+
|
|
132
|
+
组件 Props 继承自 `Partial<InfoMessage>`,所有字段均可选:
|
|
133
|
+
|
|
134
|
+
| 属性名 | 类型 | 说明 |
|
|
135
|
+
| --------- | -------------------- | ------------------------------------------------------------------ |
|
|
136
|
+
| content | `string \| string[]` | 信息内容。字符串渲染单行;数组在中间区域纵向多行展示,两侧虚线夹住整块 |
|
|
137
|
+
| id | `number \| string` | 消息 ID(接收但不使用,由 MessageContainer 管理) |
|
|
138
|
+
| messageId | `number \| string` | 消息唯一标识(接收但不使用) |
|
|
139
|
+
| status | `MessageStatus` | 消息状态(接收但不使用,组件无状态相关渲染逻辑) |
|
|
140
|
+
| role | `MessageRole.Info` | 消息角色,固定为 `'info'` |
|
|
141
|
+
|
|
142
|
+
> **说明**:`content` 的 TypeScript 类型定义为 `string`(与 `BaseMessage` 泛型一致),但组件模板内部通过 `Array.isArray(content) ? content : [content]` 实际兼容字符串数组。
|
|
143
|
+
|
|
144
|
+
## 安全性
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
# InputAttachment 输入附件区
|
|
2
|
+
|
|
3
|
+
> 能力域:输入交互 | 导入:`import { InputAttachment } from '@blueking/chat-x'` | since 1.0.0
|
|
4
|
+
|
|
5
|
+
ChatInput 底部附件区布局,承载快捷按钮、文件与发送图标。 源码位置:src/components/chat-input/input-attachment/input-attachment.vue。
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# InputAttachment 输入附件区
|
|
10
|
+
|
|
11
|
+
> **能力域**:输入交互
|
|
12
|
+
|
|
13
|
+
## 源码事实
|
|
14
|
+
|
|
15
|
+
- **源码位置**:`src/components/chat-input/input-attachment/input-attachment.vue`
|
|
16
|
+
- **能力说明**:ChatInput 底部附件区布局,承载快捷按钮、文件与发送图标。
|
|
17
|
+
- **交互说明**:
|
|
18
|
+
- `sendMessage` 点击绑定在 `.send-message-icon` 容器上(覆盖图标与按钮空白区域),而非仅绑定在 `SendMessageIcon` 上。
|
|
19
|
+
- `Streaming` / `Pending` / `Fetching` 时展示 `LoadingMessageIcon`,点击发出 `stopSending`。
|
|
20
|
+
- `Disabled`、`sendDisabledTip`、`Pending`、`Streaming` 状态下点击发送容器不会发出 `sendMessage`。
|
|
21
|
+
|
|
22
|
+
## API 摘要
|
|
23
|
+
|
|
24
|
+
### Props
|
|
25
|
+
|
|
26
|
+
- `{ messageState?: MessageStatus; sendDisabledTip?: string; tippyOptions?: AITippyProps; }`
|
|
27
|
+
|
|
28
|
+
### Emits
|
|
29
|
+
|
|
30
|
+
- `{ (e: 'sendMessage'): void; (e: 'stopSending'): void; }`
|
|
31
|
+
|
|
32
|
+
### Slots
|
|
33
|
+
|
|
34
|
+
- `default`
|
|
35
|
+
- `before-send`(发送按钮左侧区域,ChatInput 默认在此渲染 ModelSelector)
|
|
36
|
+
- `send-icon`
|
|
37
|
+
|
|
38
|
+
### Expose
|
|
39
|
+
|
|
40
|
+
- 无。
|
|
41
|
+
|
|
42
|
+
## 组件依赖
|
|
43
|
+
|
|
44
|
+
- 无组件依赖或仅依赖基础库。
|
|
45
|
+
|
|
46
|
+
## 使用建议
|
|
47
|
+
|
|
48
|
+
- 优先通过上层组合组件使用;直接使用前请确认 props 数据结构来自对应类型定义。
|
|
49
|
+
- 自定义 `send-icon` 插槽时需自行处理发送/停止点击逻辑。
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# InputInfoAlert 输入提示条
|
|
2
|
+
|
|
3
|
+
> 能力域:输入交互 | 导入:`import { InputInfoAlert } from '@blueking/chat-x'` | since 1.0.0
|
|
4
|
+
|
|
5
|
+
ChatInput 上方的信息提示条。 源码位置:src/components/chat-input/input-info-alert.vue。
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# InputInfoAlert 输入提示条
|
|
10
|
+
|
|
11
|
+
> **能力域**:输入交互
|
|
12
|
+
|
|
13
|
+
## 源码事实
|
|
14
|
+
|
|
15
|
+
- **源码位置**:`src/components/chat-input/input-info-alert.vue`
|
|
16
|
+
- **能力说明**:ChatInput 上方的信息提示条。
|
|
17
|
+
|
|
18
|
+
## API 摘要
|
|
19
|
+
|
|
20
|
+
### Props
|
|
21
|
+
|
|
22
|
+
- `{ content: string; }`
|
|
23
|
+
|
|
24
|
+
### Emits
|
|
25
|
+
|
|
26
|
+
- 无。
|
|
27
|
+
|
|
28
|
+
### Slots
|
|
29
|
+
|
|
30
|
+
- 无。
|
|
31
|
+
|
|
32
|
+
### Expose
|
|
33
|
+
|
|
34
|
+
- 无。
|
|
35
|
+
|
|
36
|
+
## 组件依赖
|
|
37
|
+
|
|
38
|
+
- 无组件依赖或仅依赖基础库。
|
|
39
|
+
|
|
40
|
+
## 使用建议
|
|
41
|
+
|
|
42
|
+
- 优先通过上层组合组件使用;直接使用前请确认 props 数据结构来自对应类型定义。
|