@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,202 @@
|
|
|
1
|
+
<!-- AI SUMMARY -->
|
|
2
|
+
## 快速了解
|
|
3
|
+
|
|
4
|
+
ShortcutBtn 渲染单个快捷指令入口,封装图标解析与「按钮 / 下拉菜单项」两种布局,并暴露根元素供父级测量。 由 ShortcutBtns、AiSelection、ChatInput 内部复用;含 components 的快捷指令可无默认图标。 通过 click 事件传出当前 Shortcut,append 槽常用于关闭按钮。
|
|
5
|
+
|
|
6
|
+
### 关联组件
|
|
7
|
+
- **shortcut-btns** — 快捷指令横向列表中作为单项渲染
|
|
8
|
+
- **ai-selection** — 划词浮窗内展示快捷操作按钮或溢出菜单项
|
|
9
|
+
- **chat-input** — 已选快捷指令在输入框底部以单按钮展示
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
<!-- FULL DOC -->
|
|
13
|
+
|
|
14
|
+
# ShortcutBtn 快捷指令按钮
|
|
15
|
+
|
|
16
|
+
> **层级**:原子组件 · **功能域**:输入交互
|
|
17
|
+
|
|
18
|
+
单个快捷指令的渲染单元,封装图标选择逻辑和两种布局模式(按钮 / 菜单项)。
|
|
19
|
+
|
|
20
|
+
被 `ShortcutBtns`(快捷指令栏)、`AiSelection`(划词浮窗)和 `ChatInput`(已选指令展示)内部使用,通常不需要手动引入。
|
|
21
|
+
|
|
22
|
+
## 组件结构
|
|
23
|
+
|
|
24
|
+
```
|
|
25
|
+
button.ai-shortcut-btn(flex,gap: 4px,height: 28px,padding: 0 4px,white-space: nowrap)
|
|
26
|
+
border: none,border-radius: 4px,background: transparent
|
|
27
|
+
transition: background-color 0.2s
|
|
28
|
+
mode="menu" → 追加 .is-menu-mode(height: 32px,padding: 0 12px,width: 100%,justify-content: flex-start)
|
|
29
|
+
│
|
|
30
|
+
├── <slot name="default">(覆盖后图标+名称全部替换)
|
|
31
|
+
│ ├── [shortcut.icon 为字符串 && 以 'http' 开头]
|
|
32
|
+
│ │ <img class="ai-common-icon ai-shortcut-btn-icon" :src="icon">
|
|
33
|
+
│ ├── [shortcut.icon 为字符串 && 不以 'http' 开头]
|
|
34
|
+
│ │ <span :class="icon" />(CSS 图标类名,无其他 class)
|
|
35
|
+
│ ├── [shortcut.icon 为函数或组件]
|
|
36
|
+
│ │ <component :is="typeof icon==='function' ? icon(h) : icon" class="ai-shortcut-btn-icon" />
|
|
37
|
+
│ ├── [shortcut 存在,无 icon,components 为空/未设置] → AgentIcon.ai-shortcut-btn-icon
|
|
38
|
+
│ ├── [shortcut 存在,无 icon,components 有内容] → 无图标
|
|
39
|
+
│ └── {{ shortcut?.name }}(XSS 安全,文本插值)
|
|
40
|
+
│
|
|
41
|
+
└── <slot name="append" />(渲染在名称之后,常用于关闭按钮)
|
|
42
|
+
|
|
43
|
+
defineExpose: { get $el() { return el.value } }(懒 getter,返回 button 元素引用)
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
> **`hover` cursor 说明**:CSS 中 `:hover` 先写 `cursor: pointer` 再写 `cursor: default`,后者覆盖前者,实际 hover 时显示默认指针。仅 `append` 槽内的 `.ai-close-icon` 恢复 `cursor: pointer`。
|
|
47
|
+
|
|
48
|
+
## 图标渲染规则
|
|
49
|
+
|
|
50
|
+
| `shortcut.icon` 类型 | 渲染结果 | 额外说明 |
|
|
51
|
+
| ------------------------------------- | --------------------------- | ---------------------------------------------- |
|
|
52
|
+
| 未设置(且 `components` 为空/未设置) | `AgentIcon`(默认图标) | `components: []` 与不传效果相同 |
|
|
53
|
+
| 未设置(且 `components` 有内容) | 无图标 | 表单类快捷指令 |
|
|
54
|
+
| `string`,以 `'http'` 开头 | `<img>` | 同时有 `.ai-common-icon .ai-shortcut-btn-icon` |
|
|
55
|
+
| `string`,不以 `'http'` 开头 | `<span :class="icon">` | 视为 CSS 图标类名,无其他 class |
|
|
56
|
+
| 函数 `(h) => Component/VNode` | `<component :is="icon(h)">` | 有 `.ai-shortcut-btn-icon` |
|
|
57
|
+
| 组件对象 | `<component :is="icon">` | 有 `.ai-shortcut-btn-icon` |
|
|
58
|
+
|
|
59
|
+
## 基础用法
|
|
60
|
+
|
|
61
|
+
```vue
|
|
62
|
+
<template>
|
|
63
|
+
<ShortcutBtn
|
|
64
|
+
:shortcut="shortcut"
|
|
65
|
+
@click="handleClick"
|
|
66
|
+
/>
|
|
67
|
+
</template>
|
|
68
|
+
|
|
69
|
+
<script setup lang="ts">
|
|
70
|
+
import { ShortcutBtn } from '@blueking/chat-x';
|
|
71
|
+
import type { Shortcut } from '@blueking/chat-x';
|
|
72
|
+
|
|
73
|
+
const shortcut: Shortcut = { id: 'ask-whale', name: '问问小鲸' };
|
|
74
|
+
|
|
75
|
+
const handleClick = (shortcut?: Shortcut) => {
|
|
76
|
+
console.log('选择了:', shortcut?.name);
|
|
77
|
+
};
|
|
78
|
+
</script>
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
> 从左到右:无 `icon`(默认 AgentIcon)、`components: []`(同样显示 AgentIcon)、有 `components`(无图标)。
|
|
82
|
+
|
|
83
|
+
## 图标类型对比
|
|
84
|
+
|
|
85
|
+
```vue
|
|
86
|
+
<template>
|
|
87
|
+
<!-- URL 图片图标 -->
|
|
88
|
+
<ShortcutBtn :shortcut="{ id: '1', name: '图片图标', icon: 'https://…/icon.png' }" />
|
|
89
|
+
|
|
90
|
+
<!-- CSS 类名图标(字体图标) -->
|
|
91
|
+
<ShortcutBtn :shortcut="{ id: '2', name: 'CSS 类图标', icon: 'bk-icon icon-star-shape' }" />
|
|
92
|
+
|
|
93
|
+
<!-- 函数/渲染函数图标 -->
|
|
94
|
+
<ShortcutBtn :shortcut="{ id: '3', name: '函数图标', icon: h => h('span', {}, '🚀') }" />
|
|
95
|
+
</template>
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
## 菜单模式(mode="menu")
|
|
99
|
+
|
|
100
|
+
`mode="menu"` 时切换为 `is-menu-mode` 布局:左对齐、`width: 100%`、高 32px、padding `0 12px`:
|
|
101
|
+
|
|
102
|
+
```vue
|
|
103
|
+
<template>
|
|
104
|
+
<div class="shortcut-menu">
|
|
105
|
+
<ShortcutBtn
|
|
106
|
+
v-for="item in shortcuts"
|
|
107
|
+
:key="item.id"
|
|
108
|
+
mode="menu"
|
|
109
|
+
:shortcut="item"
|
|
110
|
+
@click="handleClick"
|
|
111
|
+
/>
|
|
112
|
+
</div>
|
|
113
|
+
</template>
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
## append 插槽:添加关闭按钮
|
|
117
|
+
|
|
118
|
+
`#append` 渲染在名称之后,`@click.stop` 可阻止冒泡到 `@click`(父 ChatInput 使用场景):
|
|
119
|
+
|
|
120
|
+
```vue
|
|
121
|
+
<template>
|
|
122
|
+
<ShortcutBtn
|
|
123
|
+
:shortcut="shortcut"
|
|
124
|
+
@click="handleSelect"
|
|
125
|
+
>
|
|
126
|
+
<template #append>
|
|
127
|
+
<CloseIcon @click.stop="handleRemove" />
|
|
128
|
+
</template>
|
|
129
|
+
</ShortcutBtn>
|
|
130
|
+
</template>
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
## default 插槽:完全自定义内容
|
|
134
|
+
|
|
135
|
+
`default` 插槽覆盖**全部**默认内容(图标 + 名称),`shortcut` prop 仅传递给 `@click` 事件:
|
|
136
|
+
|
|
137
|
+
```vue
|
|
138
|
+
<template>
|
|
139
|
+
<ShortcutBtn
|
|
140
|
+
:shortcut="shortcut"
|
|
141
|
+
@click="handleClick"
|
|
142
|
+
>
|
|
143
|
+
<MoreAgentIcon />
|
|
144
|
+
<span>更多</span>
|
|
145
|
+
</ShortcutBtn>
|
|
146
|
+
</template>
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
## API
|
|
150
|
+
|
|
151
|
+
### Props
|
|
152
|
+
|
|
153
|
+
| 属性名 | 类型 | 必填 | 说明 |
|
|
154
|
+
| -------- | ----------------- | ---- | ------------------------------------------------------------ |
|
|
155
|
+
| shortcut | `Shortcut` | — | 快捷指令配置;缺省时按钮无内容,`click` 事件传递 `undefined` |
|
|
156
|
+
| mode | `'btn' \| 'menu'` | — | 布局模式;缺省为 `btn`(水平居中),`menu` 切换为列表项布局 |
|
|
157
|
+
|
|
158
|
+
### Events
|
|
159
|
+
|
|
160
|
+
| 事件名 | 参数 | 说明 |
|
|
161
|
+
| ------ | ----------------------- | -------------------------------------------------------------------- |
|
|
162
|
+
| click | `(shortcut?: Shortcut)` | 点击按钮时触发,传递当前 `shortcut` prop(无 prop 则为 `undefined`) |
|
|
163
|
+
|
|
164
|
+
### Slots
|
|
165
|
+
|
|
166
|
+
| 插槽名 | 说明 |
|
|
167
|
+
| ------- | -------------------------------------------------------------------- |
|
|
168
|
+
| default | 覆盖全部默认渲染(图标 + 名称);`shortcut` prop 仍用于 `click` 事件 |
|
|
169
|
+
| append | 追加在名称之后;常用于关闭/删除图标,建议配合 `@click.stop` 阻止冒泡 |
|
|
170
|
+
|
|
171
|
+
### Expose
|
|
172
|
+
|
|
173
|
+
| 属性名 | 类型 | 说明 |
|
|
174
|
+
| ------ | --------------------- | ------------------------------------------------------------------------- |
|
|
175
|
+
| `$el` | `HTMLElement \| null` | 懒 getter,返回根 `<button>` 元素引用;供 `ShortcutBtns` 计算可见性时使用 |
|
|
176
|
+
|
|
177
|
+
## 类型定义
|
|
178
|
+
|
|
179
|
+
```typescript
|
|
180
|
+
interface Shortcut {
|
|
181
|
+
id: string;
|
|
182
|
+
name: string;
|
|
183
|
+
description?: string;
|
|
184
|
+
icon?: string | Component | ((h: typeof h) => Component | VNode);
|
|
185
|
+
components?: ShortcutComponent[]; // 有内容时不显示默认 AgentIcon
|
|
186
|
+
formModel?: Record<string, unknown>;
|
|
187
|
+
}
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
## 在各组件中的使用场景
|
|
191
|
+
|
|
192
|
+
| 使用方 | 模式 | 特殊用法 |
|
|
193
|
+
| -------------- | ------------- | -------------------------------------------------------------------------------------------- |
|
|
194
|
+
| `ShortcutBtns` | btn | 可见项正常渲染;溢出项隐藏(CSS `visibility: hidden`),放入下拉菜单以 `mode="menu"` 展示 |
|
|
195
|
+
| `AiSelection` | btn / menu | 最多显示 `maxShortcutCount` 个按钮,超出时以 `#default` 插槽显示"更多",下拉用 `mode="menu"` |
|
|
196
|
+
| `ChatInput` | btn(已选态) | 使用 `#append` 插槽放置 `CloseIcon`,点击关闭删除已选快捷指令 |
|
|
197
|
+
|
|
198
|
+
## 关联组件
|
|
199
|
+
|
|
200
|
+
- [ShortcutBtns](./shortcut-btns.md) — 快捷指令列表容器
|
|
201
|
+
- [AiSelection](../molecular/ai-selection.md) — 划词浮窗内使用
|
|
202
|
+
- [ChatInput](../molecular/chat-input.md) — 已选快捷指令展示
|
|
@@ -0,0 +1,264 @@
|
|
|
1
|
+
<!-- AI SUMMARY -->
|
|
2
|
+
## 快速了解
|
|
3
|
+
|
|
4
|
+
ShortcutBtns 横向展示快捷指令按钮组,按容器宽度动态计算可见数量,溢出收入「更多」下拉。 默认由 ChatInput 嵌入附件槽;选中含 components 的指令后需配合 ShortcutRender 展示表单。 通过 selectShortcut 等与外层同步当前快捷指令。
|
|
5
|
+
|
|
6
|
+
### 关联组件
|
|
7
|
+
- **shortcut-btn** — 列表中每一项由 ShortcutBtn 渲染
|
|
8
|
+
- **chat-input** — 默认嵌入输入框底部附件区
|
|
9
|
+
- **shortcut-render** — 表单类快捷指令选中后的表单渲染
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
<!-- FULL DOC -->
|
|
13
|
+
|
|
14
|
+
# ShortcutBtns 快捷指令按钮组
|
|
15
|
+
|
|
16
|
+
> **层级**:原子组件 · **功能域**:输入交互
|
|
17
|
+
|
|
18
|
+
快捷指令按钮列表,内置**响应式溢出收起**:根据容器实际宽度动态计算可见数量,超出部分自动收入"更多"下拉菜单。
|
|
19
|
+
|
|
20
|
+
通常由 `ChatInput` 内部使用,一般不需要手动引入。
|
|
21
|
+
|
|
22
|
+
## 组件结构
|
|
23
|
+
|
|
24
|
+
```
|
|
25
|
+
div.shortcut-btns(flex,gap: 4px,width: 100%,min-width: 168px,max-width: 1000px,overflow: hidden)
|
|
26
|
+
│
|
|
27
|
+
├── ShortcutBtn.shortcut-btns-item × N(每个快捷指令)
|
|
28
|
+
│ height: 24px,padding: 0 6px,white-space: nowrap,background: #fff,border-radius: 4px
|
|
29
|
+
│ 溢出时追加 .shortcut-btns-item-hidden(position: absolute; visibility: hidden; pointer-events: none; opacity: 0)
|
|
30
|
+
│ 注意:隐藏项仍在 DOM 中,仅通过 CSS 不可见,offsetWidth 仍可读
|
|
31
|
+
│
|
|
32
|
+
└── [hiddenShortcuts.length > 0] Tippy(trigger="manual",append-to="body",interactive)
|
|
33
|
+
│ offset=[0,6],z-index=SHORTCUT_MENU_Z_INDEX,theme="ai-chat-box-light light"
|
|
34
|
+
├── ShortcutBtn.shortcut-btns-more(触发按钮)
|
|
35
|
+
│ MoreAgentIcon(rotate(90deg)) + "更多"
|
|
36
|
+
└── #content: div.shortcut-menu
|
|
37
|
+
ShortcutBtn(mode="menu") × 隐藏数量
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
## 响应式溢出机制(useObserverVisibleList)
|
|
41
|
+
|
|
42
|
+
组件使用 `ResizeObserver` 监听容器宽度变化,自动计算可见按钮列表:
|
|
43
|
+
|
|
44
|
+
```
|
|
45
|
+
calculateVisibleMenuItems 执行逻辑:
|
|
46
|
+
1. 遍历 shortcuts(按顺序)
|
|
47
|
+
2. 每项计算:neededWidth = totalWidth + itemWidth + gap(非首项才加 gap)
|
|
48
|
+
3. 判断:neededWidth + gap + moreButtonWidth ≤ containerWidth
|
|
49
|
+
→ true:加入 visibleItems,更新 totalWidth
|
|
50
|
+
→ false:break(后续项全部进入"更多"菜单)
|
|
51
|
+
4. 触发时机:ResizeObserver 回调 / itemRefs 变化 / moreItemRef 变化
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
- `shortcuts` prop 通过 `computed(() => props.shortcuts)` 包装为 `ComputedRef` 传入 `useObserverVisibleList`,确保 items 变化时计算逻辑能访问到最新数据
|
|
55
|
+
- `shortcuts` prop 更新时(深度 watch),`itemRefs` 重置为同等长度的 null 数组,再等待下一帧重新计算
|
|
56
|
+
- 隐藏项 = `shortcuts.filter(s => !visibleItems.includes(s))`,保持原始顺序
|
|
57
|
+
- `ResizeObserver` 在 `onScopeDispose` 时断开,无内存泄漏
|
|
58
|
+
|
|
59
|
+
## 基础用法
|
|
60
|
+
|
|
61
|
+
```vue
|
|
62
|
+
<template>
|
|
63
|
+
<ShortcutBtns
|
|
64
|
+
:shortcuts="shortcuts"
|
|
65
|
+
@select-shortcut="handleSelectShortcut"
|
|
66
|
+
/>
|
|
67
|
+
</template>
|
|
68
|
+
|
|
69
|
+
<script setup lang="ts">
|
|
70
|
+
import { ShortcutBtns } from '@blueking/chat-x';
|
|
71
|
+
import type { Shortcut } from '@blueking/chat-x';
|
|
72
|
+
|
|
73
|
+
const shortcuts: Shortcut[] = [
|
|
74
|
+
{ id: 'ask', name: '问问小鲸' },
|
|
75
|
+
{ id: 'translate', name: '翻译' },
|
|
76
|
+
{ id: 'summarize', name: '总结' },
|
|
77
|
+
{ id: 'explain', name: '解释代码' },
|
|
78
|
+
{ id: 'code-review', name: '代码审查' },
|
|
79
|
+
];
|
|
80
|
+
|
|
81
|
+
const handleSelectShortcut = (shortcut: Shortcut) => {
|
|
82
|
+
console.log('选择了:', shortcut.name);
|
|
83
|
+
};
|
|
84
|
+
</script>
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
## 带描述的快捷指令
|
|
88
|
+
|
|
89
|
+
`description` 字段由 `ShortcutRender` 表单弹窗使用(悬浮提示或说明文字),本组件不直接渲染:
|
|
90
|
+
|
|
91
|
+
```vue
|
|
92
|
+
<template>
|
|
93
|
+
<ShortcutBtns
|
|
94
|
+
:shortcuts="shortcuts"
|
|
95
|
+
@select-shortcut="handleSelectShortcut"
|
|
96
|
+
/>
|
|
97
|
+
</template>
|
|
98
|
+
|
|
99
|
+
<script setup lang="ts">
|
|
100
|
+
import { ShortcutBtns } from '@blueking/chat-x';
|
|
101
|
+
import type { Shortcut } from '@blueking/chat-x';
|
|
102
|
+
|
|
103
|
+
const shortcuts: Shortcut[] = [
|
|
104
|
+
{ id: 'translate', name: '翻译', description: '将文本翻译成指定语言' },
|
|
105
|
+
{ id: 'summarize', name: '总结', description: '自动总结长文本的核心要点' },
|
|
106
|
+
{ id: 'explain', name: '解释', description: '解释代码或概念' },
|
|
107
|
+
];
|
|
108
|
+
</script>
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
## 带表单的快捷指令
|
|
112
|
+
|
|
113
|
+
配置 `components` 后,`@select-shortcut` 事件仍正常触发,**表单弹窗逻辑需由父组件配合 `ShortcutRender` 实现**:
|
|
114
|
+
|
|
115
|
+
```vue
|
|
116
|
+
<template>
|
|
117
|
+
<ShortcutBtns
|
|
118
|
+
:shortcuts="shortcuts"
|
|
119
|
+
@select-shortcut="handleSelectShortcut"
|
|
120
|
+
/>
|
|
121
|
+
<ShortcutRender
|
|
122
|
+
v-if="activeShortcut"
|
|
123
|
+
:shortcut="activeShortcut"
|
|
124
|
+
@submit="handleFormSubmit"
|
|
125
|
+
@cancel="activeShortcut = null"
|
|
126
|
+
/>
|
|
127
|
+
</template>
|
|
128
|
+
|
|
129
|
+
<script setup lang="ts">
|
|
130
|
+
import { ref } from 'vue';
|
|
131
|
+
import { ShortcutBtns, ShortcutRender } from '@blueking/chat-x';
|
|
132
|
+
import type { Shortcut } from '@blueking/chat-x';
|
|
133
|
+
|
|
134
|
+
const activeShortcut = ref<Shortcut | null>(null);
|
|
135
|
+
|
|
136
|
+
const shortcuts: Shortcut[] = [
|
|
137
|
+
{
|
|
138
|
+
id: 'translate',
|
|
139
|
+
name: '翻译',
|
|
140
|
+
description: '将文本翻译成指定语言',
|
|
141
|
+
components: [
|
|
142
|
+
{
|
|
143
|
+
type: 'select',
|
|
144
|
+
key: 'targetLang',
|
|
145
|
+
name: '目标语言',
|
|
146
|
+
props: {
|
|
147
|
+
options: [
|
|
148
|
+
{ label: '英文', value: 'en' },
|
|
149
|
+
{ label: '中文', value: 'zh' },
|
|
150
|
+
],
|
|
151
|
+
},
|
|
152
|
+
},
|
|
153
|
+
{ type: 'textarea', key: 'content', name: '翻译内容', fillBack: true },
|
|
154
|
+
],
|
|
155
|
+
},
|
|
156
|
+
{
|
|
157
|
+
id: 'code-gen',
|
|
158
|
+
name: '代码生成',
|
|
159
|
+
components: [
|
|
160
|
+
{ type: 'input', key: 'language', name: '编程语言' },
|
|
161
|
+
{ type: 'textarea', key: 'description', name: '功能描述', fillBack: true },
|
|
162
|
+
],
|
|
163
|
+
},
|
|
164
|
+
];
|
|
165
|
+
|
|
166
|
+
const handleSelectShortcut = (shortcut: Shortcut) => {
|
|
167
|
+
if (shortcut.components?.length) {
|
|
168
|
+
activeShortcut.value = shortcut; // 打开表单弹窗
|
|
169
|
+
} else {
|
|
170
|
+
sendMessage(shortcut); // 直接发送
|
|
171
|
+
}
|
|
172
|
+
};
|
|
173
|
+
</script>
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
## 响应式溢出("更多"菜单)
|
|
177
|
+
|
|
178
|
+
当按钮数量超出容器可用宽度时,自动显示"更多"按钮,点击展开下拉菜单:
|
|
179
|
+
|
|
180
|
+
> 该 Demo 容器较窄时会自动触发溢出收起效果。`manyShortcuts` 共 12 项,超出容器宽度的按钮进入"更多"下拉菜单。
|
|
181
|
+
|
|
182
|
+
## API
|
|
183
|
+
|
|
184
|
+
### Props
|
|
185
|
+
|
|
186
|
+
| 属性名 | 类型 | 必填 | 说明 |
|
|
187
|
+
| --------- | ------------ | ---- | ------------------------------------------------------------------- |
|
|
188
|
+
| shortcuts | `Shortcut[]` | 是 | 快捷指令列表;`v-for` 使用 `shortcut.key \|\| shortcut.id` 作为 key |
|
|
189
|
+
|
|
190
|
+
### Events
|
|
191
|
+
|
|
192
|
+
| 事件名 | 参数 | 说明 |
|
|
193
|
+
| --------------- | ---------------------- | ---------------------------------------------------------------------------- |
|
|
194
|
+
| select-shortcut | `(shortcut: Shortcut)` | 点击任意快捷指令(含"更多"菜单中的项)时触发;从"更多"菜单选择后菜单自动关闭 |
|
|
195
|
+
|
|
196
|
+
## 类型定义
|
|
197
|
+
|
|
198
|
+
```typescript
|
|
199
|
+
interface Shortcut {
|
|
200
|
+
id: string;
|
|
201
|
+
name: string;
|
|
202
|
+
key?: string; // 自定义 v-for key,优先于 id
|
|
203
|
+
description?: string;
|
|
204
|
+
icon?: string | VNode | ((h: typeof h) => Component | VNode);
|
|
205
|
+
components?: ShortcutComponent[];
|
|
206
|
+
formModel?: Record<string, unknown>;
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
type ShortcutComponent =
|
|
210
|
+
| InputShortcutComponent // type: 'input'
|
|
211
|
+
| TextareaShortcutComponent // type: 'textarea'
|
|
212
|
+
| NumberShortcutComponent // type: 'number'
|
|
213
|
+
| SelectShortcutComponent // type: 'select'
|
|
214
|
+
| CheckboxGroupShortcutComponent // type: 'checkboxGroup'
|
|
215
|
+
| RadioGroupShortcutComponent // type: 'radioGroup'
|
|
216
|
+
| SwitcherShortcutComponent // type: 'switcher'
|
|
217
|
+
| TextShortcutComponent; // type: 'text'(纯文本展示)
|
|
218
|
+
|
|
219
|
+
interface BaseShortcutComponent<T> {
|
|
220
|
+
type: T;
|
|
221
|
+
key: string; // 表单字段 key,对应 formModel 中的属性名
|
|
222
|
+
name?: string; // 表单项 label
|
|
223
|
+
fillBack?: boolean; // true 时,该字段值在提交后回填至聊天输入框
|
|
224
|
+
props?: Record<string, any>; // 传给底层 bkui-vue 组件的 props
|
|
225
|
+
formItemProps?: Record<string, any>; // 传给 bkui-vue Form.Item 的 props
|
|
226
|
+
}
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
### 表单组件类型
|
|
230
|
+
|
|
231
|
+
| type 值 | 底层组件 | 说明 |
|
|
232
|
+
| --------------- | ------------------------- | --------------------------------------- |
|
|
233
|
+
| `input` | bkui-vue Input | 单行文本输入 |
|
|
234
|
+
| `textarea` | bkui-vue Input (textarea) | 多行文本输入 |
|
|
235
|
+
| `number` | bkui-vue Input (number) | 数字输入 |
|
|
236
|
+
| `select` | bkui-vue Select | 下拉选择,通过 `props.options` 配置选项 |
|
|
237
|
+
| `checkboxGroup` | bkui-vue Checkbox.Group | 多选框组 |
|
|
238
|
+
| `radioGroup` | bkui-vue Radio.Group | 单选框组 |
|
|
239
|
+
| `switcher` | bkui-vue Switcher | 开关 |
|
|
240
|
+
| `text` | 纯文本 | 仅展示说明文字,不收集值 |
|
|
241
|
+
|
|
242
|
+
## 样式说明
|
|
243
|
+
|
|
244
|
+
| 类名 | 样式 | 说明 |
|
|
245
|
+
| ---------------------------- | -------------------------------------------------------------------------- | -------------------------------------------------- |
|
|
246
|
+
| `.shortcut-btns` | `width: 100%; min-width: 168px; max-width: 1000px; overflow: hidden` | 容器,宽度撑满父元素,超出 1000px 截断 |
|
|
247
|
+
| `.shortcut-btns-item` | `height: 24px; padding: 0 6px; background: #fff; border-radius: 4px` | 每个快捷指令按钮的外层包装 class |
|
|
248
|
+
| `.shortcut-btns-item-hidden` | `position: absolute; visibility: hidden; pointer-events: none; opacity: 0` | 溢出按钮的隐藏态;仍在 DOM 中以便 offsetWidth 计算 |
|
|
249
|
+
| `.shortcut-btns-more` | `flex-shrink: 0; padding: 0 6px` | "更多"按钮,`MoreAgentIcon` 旋转 90° |
|
|
250
|
+
| `.shortcut-menu` | `@include menu.ai-common-menu-style` | 下拉菜单容器样式 |
|
|
251
|
+
|
|
252
|
+
## 注意事项
|
|
253
|
+
|
|
254
|
+
1. **`key` 字段优先于 `id`**:`v-for` 使用 `shortcut.key || shortcut.id`,当多个指令 `id` 相同但代表不同实例时,可通过 `key` 字段区分
|
|
255
|
+
2. **溢出项不可交互**:`.shortcut-btns-item-hidden` 通过 `pointer-events: none` 屏蔽点击,不会误触发事件
|
|
256
|
+
3. **"更多"菜单 Teleport 至 body**:Tippy 使用 `append-to="body"`,避免被父容器的 `overflow: hidden` 裁剪
|
|
257
|
+
4. **容器宽度限制**:`min-width: 168px` 和 `max-width: 1000px` 来自 `$chat-input-min-width` / `$chat-input-max-width` 变量,与输入框宽度保持一致
|
|
258
|
+
5. **表单流程在外部**:`ShortcutBtns` 只负责显示和触发事件,`components` 的表单弹窗逻辑需配合 `ShortcutRender` 实现(`ChatInput` 已内置此流程)
|
|
259
|
+
|
|
260
|
+
## 关联组件
|
|
261
|
+
|
|
262
|
+
- [ShortcutBtn](./shortcut-btn.md) — 列表项原子组件
|
|
263
|
+
- [ChatInput](../molecular/chat-input.md) — 默认嵌入输入框底部
|
|
264
|
+
- [ShortcutRender](../molecular/shortcut-render.md) — 表单类快捷指令的表单渲染
|