@blueking/chat-x 0.0.5 → 0.0.6

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.
Files changed (80) hide show
  1. package/dist/mcp/generated/docs/activity-message.md +428 -0
  2. package/dist/mcp/generated/docs/ai-image.md +227 -0
  3. package/dist/mcp/generated/docs/ai-loading.md +129 -0
  4. package/dist/mcp/generated/docs/ai-selection.md +436 -0
  5. package/dist/mcp/generated/docs/animation-text.md +199 -0
  6. package/dist/mcp/generated/docs/assistant-message.md +424 -0
  7. package/dist/mcp/generated/docs/chat-container.md +365 -0
  8. package/dist/mcp/generated/docs/chat-input.md +625 -0
  9. package/dist/mcp/generated/docs/cite-content.md +138 -0
  10. package/dist/mcp/generated/docs/code-content.md +199 -0
  11. package/dist/mcp/generated/docs/common-error-content.md +70 -0
  12. package/dist/mcp/generated/docs/constants.md +216 -0
  13. package/dist/mcp/generated/docs/content-render.md +238 -0
  14. package/dist/mcp/generated/docs/delete-tool.md +188 -0
  15. package/dist/mcp/generated/docs/desc-panel.md +139 -0
  16. package/dist/mcp/generated/docs/execution-summary.md +126 -0
  17. package/dist/mcp/generated/docs/file-content.md +300 -0
  18. package/dist/mcp/generated/docs/file-upload-btn.md +174 -0
  19. package/dist/mcp/generated/docs/flow-message.md +305 -0
  20. package/dist/mcp/generated/docs/highlight-keyword.md +144 -0
  21. package/dist/mcp/generated/docs/image-content.md +178 -0
  22. package/dist/mcp/generated/docs/image-preview-group.md +181 -0
  23. package/dist/mcp/generated/docs/image-preview.md +224 -0
  24. package/dist/mcp/generated/docs/info-message.md +124 -0
  25. package/dist/mcp/generated/docs/key-value-content.md +124 -0
  26. package/dist/mcp/generated/docs/latex-content.md +196 -0
  27. package/dist/mcp/generated/docs/loading-message.md +171 -0
  28. package/dist/mcp/generated/docs/markdown-content.md +186 -0
  29. package/dist/mcp/generated/docs/markdown-latex.md +208 -0
  30. package/dist/mcp/generated/docs/markdown-mermaid.md +250 -0
  31. package/dist/mcp/generated/docs/mermaid-content.md +185 -0
  32. package/dist/mcp/generated/docs/message-container.md +534 -0
  33. package/dist/mcp/generated/docs/message-render.md +329 -0
  34. package/dist/mcp/generated/docs/message-tools.md +376 -0
  35. package/dist/mcp/generated/docs/messages.md +472 -0
  36. package/dist/mcp/generated/docs/overflow-tips.md +209 -0
  37. package/dist/mcp/generated/docs/reasoning-message.md +233 -0
  38. package/dist/mcp/generated/docs/reference-content.md +132 -0
  39. package/dist/mcp/generated/docs/scroll-btn.md +155 -0
  40. package/dist/mcp/generated/docs/selection-footer.md +75 -0
  41. package/dist/mcp/generated/docs/shortcut-btn.md +202 -0
  42. package/dist/mcp/generated/docs/shortcut-btns.md +264 -0
  43. package/dist/mcp/generated/docs/shortcut-render.md +418 -0
  44. package/dist/mcp/generated/docs/text-content.md +74 -0
  45. package/dist/mcp/generated/docs/theme.md +388 -0
  46. package/dist/mcp/generated/docs/tool-btn.md +254 -0
  47. package/dist/mcp/generated/docs/tool-message.md +217 -0
  48. package/dist/mcp/generated/docs/toolcall-render.md +299 -0
  49. package/dist/mcp/generated/docs/use-animation-text.md +198 -0
  50. package/dist/mcp/generated/docs/use-clipboard.md +206 -0
  51. package/dist/mcp/generated/docs/use-command-selection.md +128 -0
  52. package/dist/mcp/generated/docs/use-container-scroll.md +56 -0
  53. package/dist/mcp/generated/docs/use-custom-tab.md +122 -0
  54. package/dist/mcp/generated/docs/use-global-config.md +154 -0
  55. package/dist/mcp/generated/docs/use-menu-keydown.md +164 -0
  56. package/dist/mcp/generated/docs/use-message-group.md +175 -0
  57. package/dist/mcp/generated/docs/use-observer-visible-list.md +189 -0
  58. package/dist/mcp/generated/docs/use-parent-scrolling.md +46 -0
  59. package/dist/mcp/generated/docs/user-feedback.md +229 -0
  60. package/dist/mcp/generated/docs/user-message.md +347 -0
  61. package/dist/mcp/generated/index.json +1311 -0
  62. package/dist/mcp/index.d.ts +2 -0
  63. package/dist/mcp/index.js +42 -0
  64. package/dist/mcp/index.js.map +1 -0
  65. package/dist/mcp/server.d.ts +2 -0
  66. package/dist/mcp/server.js +43 -0
  67. package/dist/mcp/server.js.map +1 -0
  68. package/dist/mcp/tools/get-component-doc.d.ts +19 -0
  69. package/dist/mcp/tools/get-component-doc.js +60 -0
  70. package/dist/mcp/tools/get-component-doc.js.map +1 -0
  71. package/dist/mcp/tools/list-components.d.ts +35 -0
  72. package/dist/mcp/tools/list-components.js +147 -0
  73. package/dist/mcp/tools/list-components.js.map +1 -0
  74. package/dist/mcp/tools/search-docs.d.ts +14 -0
  75. package/dist/mcp/tools/search-docs.js +82 -0
  76. package/dist/mcp/tools/search-docs.js.map +1 -0
  77. package/dist/mcp/utils/doc-loader.d.ts +35 -0
  78. package/dist/mcp/utils/doc-loader.js +64 -0
  79. package/dist/mcp/utils/doc-loader.js.map +1 -0
  80. package/package.json +5 -7
@@ -0,0 +1,472 @@
1
+ <!-- AI SUMMARY -->
2
+ ## 快速了解
3
+
4
+ 文档说明 Message 联合类型、BaseMessage、MessageRole、MessageStatus、User/Assistant/Tool/Activity/Reasoning 等具体形态及 MessageContentType。 业务构造 messages 数组供 ChatContainer/MessageContainer 渲染;Tool 消息经 useMessageGroup 注入 Assistant。可声明合并扩展 AIBluekingMessageMap。
5
+
6
+ ### 关联组件
7
+ - **message-container** — 列表渲染与工具栏
8
+ - **message-render** — 按 role 分发渲染
9
+ - **chat-container** — 数据源与交互入口
10
+
11
+ ---
12
+ <!-- FULL DOC -->
13
+
14
+ # 消息类型
15
+
16
+ > **分类**:type
17
+
18
+ `@blueking/chat-x` 提供了完整的消息类型定义,用于构建 AI 对话消息。
19
+
20
+ ## 消息基础类型
21
+
22
+ ### Message
23
+
24
+ 所有消息类型的联合类型:
25
+
26
+ ```typescript
27
+ type Message = MessageMap[MessageType];
28
+ ```
29
+
30
+ ### BaseMessage
31
+
32
+ 消息基础接口:
33
+
34
+ ```typescript
35
+ interface BaseMessage<T extends MessageType, C = string> {
36
+ // 消息唯一 ID(客户端生成)
37
+ id: number | string;
38
+
39
+ // 消息 ID(服务端返回)
40
+ messageId: number | string;
41
+
42
+ // 消息角色
43
+ role: T;
44
+
45
+ // 消息内容
46
+ content: C;
47
+
48
+ // 消息状态
49
+ status: MessageStatus;
50
+
51
+ // 消息名称(可选)
52
+ name?: string;
53
+
54
+ // 消息属性(可选)
55
+ property?: {
56
+ extra?: {
57
+ // 引用内容
58
+ cite:
59
+ | string
60
+ | {
61
+ title: string;
62
+ data: { key: string; value: string }[];
63
+ type: 'structured';
64
+ };
65
+ // 快捷指令名称
66
+ command: string;
67
+ // 上下文信息
68
+ context: Record<string, any>[];
69
+ // 快捷指令配置
70
+ shortcut?: Shortcut;
71
+ // 暂停标记:为 true 时该消息所在消息组不显示 MessageTools 工具栏
72
+ pause?: boolean;
73
+ };
74
+ };
75
+ }
76
+ ```
77
+
78
+ ## 消息角色
79
+
80
+ ```typescript
81
+ enum MessageRole {
82
+ // 用户消息
83
+ User = 'user',
84
+
85
+ // AI 助手消息
86
+ Assistant = 'assistant',
87
+
88
+ // 系统消息
89
+ System = 'system',
90
+
91
+ // 开发者消息
92
+ Developer = 'developer',
93
+
94
+ // 引导消息
95
+ Guide = 'guide',
96
+
97
+ // 隐藏消息(不显示)
98
+ Hidden = 'hidden',
99
+ HiddenAssistant = 'hidden-assistant',
100
+ HiddenGuide = 'hidden-guide',
101
+ HiddenSystem = 'hidden-system',
102
+ HiddenUser = 'hidden-user',
103
+
104
+ // 信息消息
105
+ Info = 'info',
106
+
107
+ // 加载中消息
108
+ Loading = 'loading',
109
+
110
+ // 暂停消息
111
+ Pause = 'pause',
112
+
113
+ // 占位消息
114
+ Placeholder = 'placeholder',
115
+
116
+ // 推理过程消息
117
+ Reasoning = 'reasoning',
118
+
119
+ // 模板消息
120
+ TemplateAssistant = 'template-assistant',
121
+ TemplateGuide = 'template-guide',
122
+ TemplateHidden = 'template-hidden',
123
+ TemplateSystem = 'template-system',
124
+ TemplateUser = 'template-user',
125
+
126
+ // 工具调用消息
127
+ Tool = 'tool',
128
+
129
+ // 活动消息(如引用文档)
130
+ Activity = 'activity',
131
+ }
132
+ ```
133
+
134
+ ## 消息状态
135
+
136
+ ```typescript
137
+ enum MessageStatus {
138
+ // 等待中
139
+ Pending = 'pending',
140
+
141
+ // 流式输出中
142
+ Streaming = 'streaming',
143
+
144
+ // 已完成
145
+ Complete = 'complete',
146
+
147
+ // 错误
148
+ Error = 'error',
149
+
150
+ // 已停止
151
+ Stop = 'stop',
152
+
153
+ // 已禁用
154
+ Disabled = 'disabled',
155
+ }
156
+ ```
157
+
158
+ ## 具体消息类型
159
+
160
+ ### UserMessage
161
+
162
+ 用户消息:
163
+
164
+ ```typescript
165
+ type UserMessage = BaseMessage<MessageRole.User, InputContent[] | string>;
166
+
167
+ // 示例
168
+ const userMessage: UserMessage = {
169
+ id: '1',
170
+ messageId: 1,
171
+ role: MessageRole.User,
172
+ content: '你好',
173
+ status: MessageStatus.Complete,
174
+ };
175
+ ```
176
+
177
+ ### AssistantMessage
178
+
179
+ AI 助手消息:
180
+
181
+ ```typescript
182
+ interface AssistantMessage extends BaseMessage<MessageRole.Assistant> {
183
+ // 工具调用列表
184
+ toolCalls?: ToolCall[];
185
+ }
186
+
187
+ // 工具调用
188
+ type ToolCall = {
189
+ id: string;
190
+ type: MessageContentType.Function;
191
+ function: FunctionCall;
192
+ };
193
+
194
+ type FunctionCall = {
195
+ name: string;
196
+ arguments: string;
197
+ description?: string;
198
+ mcpName?: string;
199
+ };
200
+
201
+ // 示例
202
+ const assistantMessage: AssistantMessage = {
203
+ id: '2',
204
+ messageId: 2,
205
+ role: MessageRole.Assistant,
206
+ content: '你好!有什么可以帮助你的?',
207
+ status: MessageStatus.Complete,
208
+ toolCalls: [
209
+ {
210
+ id: 'call_1',
211
+ type: MessageContentType.Function,
212
+ function: {
213
+ name: 'get_weather',
214
+ arguments: '{"city": "北京"}',
215
+ },
216
+ },
217
+ ],
218
+ };
219
+ ```
220
+
221
+ ### ReasoningMessage
222
+
223
+ 推理过程消息:
224
+
225
+ ```typescript
226
+ interface ReasoningMessage extends BaseMessage<MessageRole.Reasoning, string[]> {
227
+ // 推理耗时(毫秒)
228
+ duration?: number;
229
+ }
230
+
231
+ // 示例
232
+ const reasoningMessage: ReasoningMessage = {
233
+ id: '3',
234
+ messageId: 3,
235
+ role: MessageRole.Reasoning,
236
+ content: ['让我分析一下这个问题...', '首先,需要考虑以下几点:', '1. 技术可行性'],
237
+ status: MessageStatus.Complete,
238
+ duration: 3500,
239
+ };
240
+ ```
241
+
242
+ ### ToolMessage
243
+
244
+ 工具调用结果消息:
245
+
246
+ ```typescript
247
+ interface ToolMessage extends BaseMessage<MessageRole.Tool, string> {
248
+ // 工具调用 ID(对应 AssistantMessage 中的 toolCalls[].id)
249
+ toolCallId: string;
250
+
251
+ // 执行耗时(毫秒)
252
+ duration: number;
253
+
254
+ // 错误信息
255
+ error?: string;
256
+ }
257
+
258
+ // 示例
259
+ const toolMessage: ToolMessage = {
260
+ id: '4',
261
+ messageId: 4,
262
+ role: MessageRole.Tool,
263
+ content: '{"temperature": 25, "weather": "晴天"}',
264
+ status: MessageStatus.Complete,
265
+ toolCallId: 'call_1',
266
+ duration: 1200,
267
+ };
268
+ ```
269
+
270
+ ### ActivityMessage
271
+
272
+ 活动消息(如引用文档、知识检索):
273
+
274
+ ```typescript
275
+ // 引用文档内容类型
276
+ type ReferenceDocumentContent = {
277
+ name: string;
278
+ originFile: string;
279
+ url: string;
280
+ };
281
+
282
+ // 知识检索内容类型
283
+ type KnowledgeRagContent = {
284
+ content: string;
285
+ referenceDocument: ReferenceDocumentContent[];
286
+ };
287
+
288
+ interface ActivityMessage extends BaseMessage<MessageRole.Activity, KnowledgeRagContent | ReferenceDocumentContent[]> {
289
+ activityType: MessageContentType.KnowledgeRag | MessageContentType.ReferenceDocument | string;
290
+ }
291
+
292
+ // 示例 1:引用文档
293
+ const referenceMessage: ActivityMessage = {
294
+ id: '5',
295
+ messageId: 5,
296
+ role: MessageRole.Activity,
297
+ content: [
298
+ { name: '参考文档 1', url: 'https://example.com/1', originFile: 'https://example.com/origin/1' },
299
+ { name: '参考文档 2', url: 'https://example.com/2', originFile: 'https://example.com/origin/2' },
300
+ ],
301
+ status: MessageStatus.Complete,
302
+ activityType: 'reference',
303
+ };
304
+
305
+ // 示例 2:知识检索(knowledge_rag)
306
+ const knowledgeRagMessage: ActivityMessage = {
307
+ id: '6',
308
+ messageId: 6,
309
+ role: MessageRole.Activity,
310
+ content: {
311
+ content: '开始召回知识\n重排召回结果中\n完成召回并分类\n',
312
+ referenceDocument: [
313
+ { name: '知识文档 1', url: 'https://example.com/doc1', originFile: 'https://example.com/origin/doc1' },
314
+ { name: '知识文档 2', url: 'https://example.com/doc2', originFile: 'https://example.com/origin/doc2' },
315
+ ],
316
+ },
317
+ status: MessageStatus.Complete,
318
+ activityType: 'knowledge_rag',
319
+ };
320
+ ```
321
+
322
+ **ActivityMessage 类型说明:**
323
+
324
+ | activityType | content 类型 | 说明 |
325
+ | ----------------- | ---------------------------- | ---------------------------------------- |
326
+ | `'reference'` | `ReferenceDocumentContent[]` | 引用文档列表 |
327
+ | `'knowledge_rag'` | `KnowledgeRagContent` | 知识检索结果,包含检索过程内容和引用文档 |
328
+
329
+ **ReferenceDocumentContent 字段说明:**
330
+
331
+ | 字段 | 类型 | 说明 |
332
+ | ------------ | -------- | ---------------- |
333
+ | `name` | `string` | 文档名称 |
334
+ | `url` | `string` | 文档预览链接 |
335
+ | `originFile` | `string` | 文档原始文件链接 |
336
+
337
+ ### InfoMessage
338
+
339
+ 信息消息:
340
+
341
+ ```typescript
342
+ type InfoMessage = BaseMessage<MessageRole.Info, string>;
343
+
344
+ // 示例
345
+ const infoMessage: InfoMessage = {
346
+ id: '6',
347
+ messageId: 6,
348
+ role: MessageRole.Info,
349
+ content: '会话已开始',
350
+ status: MessageStatus.Complete,
351
+ };
352
+ ```
353
+
354
+ ### LoadingMessage
355
+
356
+ 加载中消息,用于在等待 AI 响应时显示加载状态:
357
+
358
+ ```typescript
359
+ type LoadingMessage = BaseMessage<MessageRole.Loading, string>;
360
+
361
+ // 示例
362
+ const loadingMessage: LoadingMessage = {
363
+ id: 'loading',
364
+ messageId: '',
365
+ role: MessageRole.Loading,
366
+ content: '',
367
+ status: MessageStatus.Pending,
368
+ };
369
+ ```
370
+
371
+ ## 消息内容类型
372
+
373
+ ```typescript
374
+ enum MessageContentType {
375
+ // 二进制内容
376
+ Binary = 'binary',
377
+
378
+ // 函数调用
379
+ Function = 'function',
380
+
381
+ // 键值对
382
+ KeyValue = 'key-value',
383
+
384
+ // 知识检索
385
+ KnowledgeRag = 'knowledge-rag',
386
+
387
+ // 其他
388
+ Other = 'other',
389
+
390
+ // 引用文档
391
+ ReferenceDocument = 'reference-document',
392
+
393
+ // 文本
394
+ Text = 'text',
395
+ }
396
+ ```
397
+
398
+ ## 类型扩展
399
+
400
+ 支持通过声明合并扩展消息类型:
401
+
402
+ ```typescript
403
+ // 在项目中扩展
404
+ declare global {
405
+ interface AIBluekingMessageMap {
406
+ 'custom-role': CustomMessage;
407
+ }
408
+ }
409
+
410
+ interface CustomMessage extends BaseMessage<'custom-role'> {
411
+ customField: string;
412
+ }
413
+ ```
414
+
415
+ ## 使用示例
416
+
417
+ ```vue
418
+ <template>
419
+ <MessageContainer
420
+ :messages="messages"
421
+ :message-status="messageStatus"
422
+ :on-agent-action="handleAgentAction"
423
+ :on-user-action="handleUserAction"
424
+ />
425
+ </template>
426
+
427
+ <script setup lang="ts">
428
+ import { ref } from 'vue';
429
+ import { MessageContainer, MessageRole, MessageStatus, type Message } from '@blueking/chat-x';
430
+
431
+ const messageStatus = ref<MessageStatus>(MessageStatus.Complete);
432
+
433
+ const messages = ref<Message[]>([
434
+ {
435
+ id: '1',
436
+ messageId: 1,
437
+ role: MessageRole.User,
438
+ content: '你好',
439
+ status: MessageStatus.Complete,
440
+ },
441
+ {
442
+ id: '2',
443
+ messageId: 2,
444
+ role: MessageRole.Reasoning,
445
+ content: ['思考中...', '分析问题...'],
446
+ status: MessageStatus.Complete,
447
+ duration: 2000,
448
+ },
449
+ {
450
+ id: '3',
451
+ messageId: 3,
452
+ role: MessageRole.Assistant,
453
+ content: '你好!有什么可以帮助你的?',
454
+ status: MessageStatus.Complete,
455
+ },
456
+ ]);
457
+
458
+ const handleAgentAction = async tool => {
459
+ console.log('Agent action:', tool);
460
+ };
461
+
462
+ const handleUserAction = async tool => {
463
+ console.log('User action:', tool);
464
+ };
465
+ </script>
466
+ ```
467
+
468
+ ## 关联组件
469
+
470
+ - [MessageContainer](../components/molecular/message-container.md) — 消息列表
471
+ - [MessageRender](../components/molecular/message-render.md) — 单条消息渲染
472
+ - [ChatContainer](../components/molecular/chat-container.md) — 聊天容器
@@ -0,0 +1,209 @@
1
+ <!-- AI SUMMARY -->
2
+ ## 快速了解
3
+
4
+ v-overflow-tips 在元素水平溢出(scrollWidth > clientWidth)时于 mouseenter 懒创建 Tippy,展示完整文本或自定义 text/content。 结合 IntersectionObserver 仅在可见时绑定悬停;隐藏时销毁实例。指令值为 Partial<TippyProps> 与 disabled 等。 DescPanel、ExecutionSummary、ToolcallRender、AiSlashMenu 等用于标题或列表溢出提示。
5
+
6
+ ### 关联组件
7
+ - **desc-panel** — 工具描述面板溢出
8
+ - **execution-summary** — 执行摘要标签溢出
9
+ - **toolcall-render** — 工具标题行溢出
10
+ - **chat-input** — AiSlashMenu 资源项(侧栏子模块)
11
+
12
+ ---
13
+ <!-- FULL DOC -->
14
+
15
+ # OverflowTips 溢出提示指令
16
+
17
+ > **分类**:directive
18
+
19
+ 当元素文本**水平溢出**(`scrollWidth > clientWidth`)时,鼠标悬停自动弹出 Tippy tooltip 显示完整内容;未溢出时不创建实例,零性能损耗。
20
+
21
+ ## 工作原理
22
+
23
+ ```
24
+ 元素挂载
25
+
26
+
27
+ IntersectionObserver 监听可见性(threshold=0.1)
28
+
29
+ ├─ 可见 → 绑定 mouseenter / mouseleave
30
+ └─ 不可见 → 解绑 mouseenter / mouseleave
31
+
32
+ ▼ mouseenter 触发
33
+ scrollWidth > clientWidth ?
34
+ │ │
35
+ 否 是
36
+ │ │
37
+ 直接返回 创建 Tippy 实例
38
+ [trigger: mouseenter]
39
+ [delay: 300ms, 0ms]
40
+
41
+ ┌──────────┴──────────┐
42
+ onShow onHidden
43
+ 再次校验溢出 destroy() 销毁实例
44
+ false → 取消 instance = undefined
45
+ ```
46
+
47
+ ## 基础用法
48
+
49
+ 文本未溢出时不会弹出 tooltip;只有超出容器宽度才触发。元素需自行设置省略号 CSS。
50
+
51
+ ```vue
52
+ <template>
53
+ <div
54
+ v-overflow-tips
55
+ class="ellipsis"
56
+ >
57
+ 这是一段很长的文本内容,会触发溢出省略效果并弹出 tooltip 提示完整内容
58
+ </div>
59
+ </template>
60
+
61
+ <script setup lang="ts">
62
+ import { OverflowTips as vOverflowTips } from '@blueking/chat-x';
63
+ </script>
64
+
65
+ <style scoped>
66
+ .ellipsis {
67
+ width: 240px;
68
+ overflow: hidden;
69
+ text-overflow: ellipsis;
70
+ white-space: nowrap;
71
+ }
72
+ </style>
73
+ ```
74
+
75
+ ## 自定义提示内容
76
+
77
+ 通过 `text` 或 `content`(别名)指定 tooltip 显示内容,优先级:`text > content > el.innerText`。
78
+
79
+ ```vue
80
+ <template>
81
+ <div
82
+ v-overflow-tips="{ text: '自定义 tooltip 内容:完整的蓝鲸智云 AI 小鲸组件使用说明' }"
83
+ class="ellipsis"
84
+ >
85
+ 悬浮查看自定义 tooltip 内容(与元素 innerText 不同)
86
+ </div>
87
+ </template>
88
+
89
+ <script setup lang="ts">
90
+ import { OverflowTips as vOverflowTips } from '@blueking/chat-x';
91
+ </script>
92
+ ```
93
+
94
+ ## 控制 placement 和禁用
95
+
96
+ `placement` 默认 `'auto'`(Tippy 自动选择最优方向);`disabled: true` 完全跳过 tooltip 创建。
97
+
98
+ ```vue
99
+ <template>
100
+ <div
101
+ v-overflow-tips="{ placement: 'bottom', disabled: isDisabled }"
102
+ class="ellipsis"
103
+ >
104
+ 可以切换弹出方向或禁用 tooltip
105
+ </div>
106
+ </template>
107
+
108
+ <script setup lang="ts">
109
+ import { ref } from 'vue';
110
+ import { OverflowTips as vOverflowTips } from '@blueking/chat-x';
111
+
112
+ const isDisabled = ref(false);
113
+ </script>
114
+ ```
115
+
116
+ ## API
117
+
118
+ ### 指令值类型
119
+
120
+ ```typescript
121
+ type OverflowTipsValue = Partial<TippyProps> & {
122
+ disabled?: boolean; // 禁用 tooltip
123
+ text?: string; // 自定义提示内容(优先级最高)
124
+ content?: string; // text 的别名
125
+ };
126
+ ```
127
+
128
+ 指令值是 `Partial<TippyProps>` 的超集,所有 Tippy.js 配置均可透传,但覆盖 `onHidden` 会导致实例无法自动销毁。
129
+
130
+ ### 常用配置项
131
+
132
+ | 属性 | 类型 | 默认值 | 说明 |
133
+ | ----------- | ---------------------------- | --------------- | ----------------------------------------------- |
134
+ | `text` | `string` | `el.innerText` | 自定义提示内容,优先级最高 |
135
+ | `content` | `string` | `el.innerText` | `text` 的别名,`text` 存在时忽略 |
136
+ | `placement` | `Placement` | `'auto'` | tooltip 弹出方向,支持所有 Tippy placement 值 |
137
+ | `disabled` | `boolean` | `false` | `true` 时跳过 tooltip 创建,mouseenter 直接返回 |
138
+ | `delay` | `number \| [number, number]` | `[300, 0]` | 显示/隐藏延迟(ms) |
139
+ | `theme` | `string` | `'ai-chat-box'` | Tippy 主题,默认使用组件库内置主题 |
140
+
141
+ ### 其他 Tippy.js 配置
142
+
143
+ 可直接传入任何 `tippy.js` 的 `Props`,如 `arrow`、`maxWidth`、`offset` 等,会覆盖上述默认值(除内部的 `trigger`、`onShow`、`onHidden` 逻辑外)。
144
+
145
+ > **注意**:不要覆盖 `onHidden`,否则 Tippy 实例无法在隐藏后自动销毁,导致内存泄漏。
146
+
147
+ ## 溢出检测规则
148
+
149
+ 指令通过 `scrollWidth > clientWidth` 判断**水平溢出**:
150
+
151
+ - 仅检测水平方向,多行文本的垂直截断(`-webkit-line-clamp`)无法被检测到
152
+ - `onShow` 会在 tooltip 即将显示时**再次校验**溢出状态,动态缩放容器后同样有效
153
+ - 若两次校验均未溢出,tooltip 不会弹出
154
+
155
+ ## 生命周期细节
156
+
157
+ | 时机 | 行为 |
158
+ | ------------------- | --------------------------------------------------------------------- |
159
+ | `mounted` | 创建 `IntersectionObserver`(阈值 10%),注册 `unObserverFunc` 到元素 |
160
+ | 元素进入视口 | 绑定 `mouseenter` / `mouseleave` 事件 |
161
+ | 元素离开视口 | 解绑 `mouseenter` / `mouseleave` |
162
+ | `mouseenter` + 溢出 | 创建 Tippy 实例;`DelayMs+16ms` 后补偿首次不显示的 bug |
163
+ | `onHidden` | 销毁实例(`destroy()`),`instance = undefined` |
164
+ | `beforeUnmount` | 解绑所有事件,调用 `unObserverFunc` 停止 Observer |
165
+
166
+ > **无 `update` 钩子**:`binding.value` 在运行时变化(如 `disabled` 切换)不会更新已创建的 Tippy 实例,只影响下一次 `mouseenter` 时的行为。
167
+
168
+ ## 样式要求
169
+
170
+ 指令不会自动设置省略号 CSS,需在元素上手动添加:
171
+
172
+ **单行截断**:
173
+
174
+ ```css
175
+ .ellipsis {
176
+ overflow: hidden;
177
+ text-overflow: ellipsis;
178
+ white-space: nowrap;
179
+ }
180
+ ```
181
+
182
+ **多行截断(`-webkit-line-clamp`)**:
183
+
184
+ ```css
185
+ /* 注意:多行截断时 scrollWidth <= clientWidth,tooltip 不会触发 */
186
+ .ellipsis-multiline {
187
+ display: -webkit-box;
188
+ -webkit-line-clamp: 2;
189
+ -webkit-box-orient: vertical;
190
+ overflow: hidden;
191
+ }
192
+ ```
193
+
194
+ > 多行截断通过 `-webkit-line-clamp` 实现,`scrollWidth` 不变,指令**无法检测**此类溢出,tooltip 不会弹出。
195
+
196
+ ## 注意事项
197
+
198
+ 1. **仅检测水平溢出**:`scrollWidth > clientWidth`,多行 `line-clamp` 溢出无效
199
+ 2. **无 `update` 钩子**:`disabled` 等状态变化仅在下次 `mouseenter` 生效
200
+ 3. **勿覆盖 `onHidden`**:会导致 Tippy 实例无法自动销毁
201
+ 4. **默认主题**:`'ai-chat-box'` 是组件库内置主题,替换为其他主题需引入对应 CSS
202
+ 5. **事件冒泡**:`mouseenter` 内调用了 `stopPropagation()`,父元素不会收到该事件
203
+
204
+ ## 关联组件
205
+
206
+ - [DescPanel](../components/atomic/desc-panel.md) — 描述区溢出
207
+ - [ExecutionSummary](../components/molecular/execution-summary.md) — 侧栏摘要标签
208
+ - [ToolcallRender](../components/molecular/toolcall-render.md) — 工具调用标题
209
+ - [ChatInput](../components/molecular/chat-input.md) — `@` 菜单项(内部 AiSlashMenu)