@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.
Files changed (85) hide show
  1. package/dist/components/ai-selection/ai-selection.vue.d.ts +2 -2
  2. package/dist/components/index.d.ts +2 -1
  3. package/dist/index.css +1 -1
  4. package/dist/index.js +6 -6
  5. package/dist/index.js.map +1 -1
  6. package/dist/mcp/generated/docs/activity-message.md +428 -0
  7. package/dist/mcp/generated/docs/ai-image.md +227 -0
  8. package/dist/mcp/generated/docs/ai-loading.md +129 -0
  9. package/dist/mcp/generated/docs/ai-selection.md +436 -0
  10. package/dist/mcp/generated/docs/animation-text.md +199 -0
  11. package/dist/mcp/generated/docs/assistant-message.md +424 -0
  12. package/dist/mcp/generated/docs/chat-container.md +402 -0
  13. package/dist/mcp/generated/docs/chat-input.md +625 -0
  14. package/dist/mcp/generated/docs/cite-content.md +138 -0
  15. package/dist/mcp/generated/docs/code-content.md +199 -0
  16. package/dist/mcp/generated/docs/common-error-content.md +70 -0
  17. package/dist/mcp/generated/docs/constants.md +216 -0
  18. package/dist/mcp/generated/docs/content-render.md +238 -0
  19. package/dist/mcp/generated/docs/delete-tool.md +188 -0
  20. package/dist/mcp/generated/docs/desc-panel.md +139 -0
  21. package/dist/mcp/generated/docs/execution-summary.md +126 -0
  22. package/dist/mcp/generated/docs/file-content.md +300 -0
  23. package/dist/mcp/generated/docs/file-upload-btn.md +174 -0
  24. package/dist/mcp/generated/docs/flow-message.md +305 -0
  25. package/dist/mcp/generated/docs/highlight-keyword.md +144 -0
  26. package/dist/mcp/generated/docs/image-content.md +178 -0
  27. package/dist/mcp/generated/docs/image-preview-group.md +181 -0
  28. package/dist/mcp/generated/docs/image-preview.md +224 -0
  29. package/dist/mcp/generated/docs/info-message.md +124 -0
  30. package/dist/mcp/generated/docs/key-value-content.md +124 -0
  31. package/dist/mcp/generated/docs/latex-content.md +196 -0
  32. package/dist/mcp/generated/docs/loading-message.md +171 -0
  33. package/dist/mcp/generated/docs/markdown-content.md +186 -0
  34. package/dist/mcp/generated/docs/markdown-latex.md +208 -0
  35. package/dist/mcp/generated/docs/markdown-mermaid.md +250 -0
  36. package/dist/mcp/generated/docs/mermaid-content.md +185 -0
  37. package/dist/mcp/generated/docs/message-container.md +534 -0
  38. package/dist/mcp/generated/docs/message-render.md +329 -0
  39. package/dist/mcp/generated/docs/message-tools.md +376 -0
  40. package/dist/mcp/generated/docs/messages.md +472 -0
  41. package/dist/mcp/generated/docs/overflow-tips.md +209 -0
  42. package/dist/mcp/generated/docs/reasoning-message.md +233 -0
  43. package/dist/mcp/generated/docs/reference-content.md +132 -0
  44. package/dist/mcp/generated/docs/scroll-btn.md +155 -0
  45. package/dist/mcp/generated/docs/selection-footer.md +75 -0
  46. package/dist/mcp/generated/docs/shortcut-btn.md +202 -0
  47. package/dist/mcp/generated/docs/shortcut-btns.md +264 -0
  48. package/dist/mcp/generated/docs/shortcut-render.md +418 -0
  49. package/dist/mcp/generated/docs/text-content.md +74 -0
  50. package/dist/mcp/generated/docs/theme.md +388 -0
  51. package/dist/mcp/generated/docs/tool-btn.md +254 -0
  52. package/dist/mcp/generated/docs/tool-message.md +217 -0
  53. package/dist/mcp/generated/docs/toolcall-render.md +299 -0
  54. package/dist/mcp/generated/docs/use-animation-text.md +198 -0
  55. package/dist/mcp/generated/docs/use-clipboard.md +206 -0
  56. package/dist/mcp/generated/docs/use-command-selection.md +128 -0
  57. package/dist/mcp/generated/docs/use-container-scroll.md +56 -0
  58. package/dist/mcp/generated/docs/use-custom-tab.md +122 -0
  59. package/dist/mcp/generated/docs/use-global-config.md +154 -0
  60. package/dist/mcp/generated/docs/use-menu-keydown.md +164 -0
  61. package/dist/mcp/generated/docs/use-message-group.md +175 -0
  62. package/dist/mcp/generated/docs/use-observer-visible-list.md +189 -0
  63. package/dist/mcp/generated/docs/use-parent-scrolling.md +46 -0
  64. package/dist/mcp/generated/docs/user-feedback.md +229 -0
  65. package/dist/mcp/generated/docs/user-message.md +347 -0
  66. package/dist/mcp/generated/index.json +1311 -0
  67. package/dist/mcp/index.d.ts +2 -0
  68. package/dist/mcp/index.js +42 -0
  69. package/dist/mcp/index.js.map +1 -0
  70. package/dist/mcp/server.d.ts +2 -0
  71. package/dist/mcp/server.js +43 -0
  72. package/dist/mcp/server.js.map +1 -0
  73. package/dist/mcp/tools/get-component-doc.d.ts +19 -0
  74. package/dist/mcp/tools/get-component-doc.js +60 -0
  75. package/dist/mcp/tools/get-component-doc.js.map +1 -0
  76. package/dist/mcp/tools/list-components.d.ts +35 -0
  77. package/dist/mcp/tools/list-components.js +147 -0
  78. package/dist/mcp/tools/list-components.js.map +1 -0
  79. package/dist/mcp/tools/search-docs.d.ts +14 -0
  80. package/dist/mcp/tools/search-docs.js +82 -0
  81. package/dist/mcp/tools/search-docs.js.map +1 -0
  82. package/dist/mcp/utils/doc-loader.d.ts +35 -0
  83. package/dist/mcp/utils/doc-loader.js +64 -0
  84. package/dist/mcp/utils/doc-loader.js.map +1 -0
  85. package/package.json +5 -7
@@ -0,0 +1,208 @@
1
+ <!-- AI SUMMARY -->
2
+ ## 快速了解
3
+
4
+ markdownItLatex 为 markdown-it 插件,解析 $...$、$$...$$、\\(...\\)、\\[...\\] 为 math_inline / math_block token,可选 LatexOption.replaceAlignStart。 不负责渲染,KaTeX 在 LatexContent 中异步渲染。与 Markdown 管道、ContentRender 中的公式展示链路配合。
5
+
6
+ ### 关联组件
7
+ - **latex-content** — 消费 math token 并 KaTeX 渲染
8
+ - **markdown-content** — Markdown 渲染管线
9
+ - **content-render** — 消息内容统一渲染入口
10
+
11
+ ---
12
+ <!-- FULL DOC -->
13
+
14
+ # markdownItLatex LaTeX 解析插件
15
+
16
+ > **分类**:plugin
17
+
18
+ Markdown-it LaTeX 解析插件,用于解析 LaTeX 数学公式语法。
19
+
20
+ ## 功能说明
21
+
22
+ 此插件只负责解析 LaTeX 语法,将其转换为 `math_inline` 和 `math_block` token。实际的 KaTeX 渲染在 `LatexContent` 组件中完成。
23
+
24
+ ## 支持的语法
25
+
26
+ | 语法 | 类型 | 示例 |
27
+ | --------- | -------- | ---------------------- |
28
+ | `$...$` | 行内公式 | `$E = mc^2$` |
29
+ | `$$...$$` | 块级公式 | `$$\sum_{i=1}^{n} i$$` |
30
+ | `\(...\)` | 行内公式 | `\(E = mc^2\)` |
31
+ | `\[...\]` | 块级公式 | `\[\sum_{i=1}^{n} i\]` |
32
+
33
+ ## 基础用法
34
+
35
+ ```typescript
36
+ import MarkdownIt from 'markdown-it';
37
+ import { markdownItLatex } from '@blueking/chat-x';
38
+
39
+ const md = new MarkdownIt().use(markdownItLatex);
40
+
41
+ // 解析包含 LaTeX 的 Markdown
42
+ const tokens = md.parse(`
43
+ 行内公式:$E = mc^2$
44
+
45
+ 块级公式:
46
+
47
+ $$
48
+ \\int_0^\\infty e^{-x^2} dx = \\frac{\\sqrt{\\pi}}{2}
49
+ $$
50
+ `);
51
+ ```
52
+
53
+ ## 配置选项
54
+
55
+ ```typescript
56
+ import MarkdownIt from 'markdown-it';
57
+ import { markdownItLatex, type LatexOption } from '@blueking/chat-x';
58
+
59
+ const options: LatexOption = {
60
+ replaceAlignStart: true, // 将 align* 替换为 aligned(KaTeX 不支持 align*)
61
+ };
62
+
63
+ const md = new MarkdownIt().use(markdownItLatex, options);
64
+ ```
65
+
66
+ ### 配置项
67
+
68
+ | 属性名 | 类型 | 默认值 | 说明 |
69
+ | ----------------- | --------- | ------ | -------------------------------- |
70
+ | replaceAlignStart | `boolean` | `true` | 是否将 `align*` 替换为 `aligned` |
71
+
72
+ ## Token 类型
73
+
74
+ 插件会生成以下两种 token:
75
+
76
+ ### math_inline
77
+
78
+ 行内数学公式 token:
79
+
80
+ ```typescript
81
+ {
82
+ type: 'math_inline',
83
+ tag: 'math',
84
+ content: 'E = mc^2',
85
+ markup: '$',
86
+ meta: { displayMode: false }
87
+ }
88
+ ```
89
+
90
+ ### math_block
91
+
92
+ 块级数学公式 token:
93
+
94
+ ```typescript
95
+ {
96
+ type: 'math_block',
97
+ tag: 'math',
98
+ content: '\\sum_{i=1}^{n} i = \\frac{n(n+1)}{2}',
99
+ markup: '$$',
100
+ block: true,
101
+ map: [startLine, endLine]
102
+ }
103
+ ```
104
+
105
+ ## 公式示例
106
+
107
+ ### 基础公式
108
+
109
+ ```markdown
110
+ 行内公式:$E = mc^2$
111
+
112
+ 块级公式:
113
+
114
+ $$
115
+ E = mc^2
116
+ $$
117
+ ```
118
+
119
+ ### 复杂公式
120
+
121
+ ```markdown
122
+ $$
123
+ \\frac{-b \\pm \\sqrt{b^2 - 4ac}}{2a}
124
+ $$
125
+ ```
126
+
127
+ ### 矩阵
128
+
129
+ ```markdown
130
+ $$
131
+ \\begin{pmatrix}
132
+ a & b \\\\
133
+ c & d
134
+ \\end{pmatrix}
135
+ $$
136
+ ```
137
+
138
+ ### 多行公式
139
+
140
+ ```markdown
141
+ $$
142
+ \\begin{aligned}
143
+ f(x) &= x^2 + 2x + 1 \\\\
144
+ &= (x + 1)^2
145
+ \\end{aligned}
146
+ $$
147
+ ```
148
+
149
+ ## 转义处理
150
+
151
+ 插件会正确处理转义的分隔符:
152
+
153
+ ```markdown
154
+ 这不是公式:\$100
155
+
156
+ 这是公式:$x = 100$
157
+ ```
158
+
159
+ ## 与 KaTeX 配合
160
+
161
+ 渲染由 `LatexContent` 组件完成,使用 KaTeX 库:
162
+
163
+ ```vue
164
+ <template>
165
+ <LatexContent :token="latexTokens" />
166
+ </template>
167
+
168
+ <script setup lang="ts">
169
+ import { LatexContent } from '@blueking/chat-x';
170
+
171
+ // latexTokens 是包含 math_inline 或 math_block 的 token 数组
172
+ </script>
173
+ ```
174
+
175
+ ## KaTeX 支持说明
176
+
177
+ KaTeX 支持的功能:
178
+
179
+ - 大多数 LaTeX 数学符号
180
+ - 分数、根号、指数
181
+ - 矩阵和数组
182
+ - 括号和分隔符
183
+ - 希腊字母和运算符
184
+ - 上下标和大型运算符
185
+
186
+ KaTeX 限制:
187
+
188
+ - 不支持 `align*` 环境(插件会自动替换为 `aligned`)
189
+ - 部分 LaTeX 宏不支持
190
+
191
+ ## 使用场景
192
+
193
+ - AI 数学问答
194
+ - 技术文档展示
195
+ - 教育类应用
196
+ - 科学计算结果展示
197
+
198
+ ## 注意事项
199
+
200
+ 1. **双反斜杠**:在 JavaScript 字符串中,`\` 需要写成 `\\`
201
+ 2. **环境支持**:建议使用 `aligned` 替代 `align*`
202
+ 3. **性能考虑**:KaTeX 渲染在组件中异步进行,避免阻塞主线程
203
+
204
+ ## 关联组件
205
+
206
+ - [LatexContent](../components/atomic/latex-content.md) — KaTeX 渲染
207
+ - [MarkdownContent](../components/atomic/markdown-content.md) — Markdown 内容
208
+ - [ContentRender](../components/molecular/content-render.md) — 内容渲染
@@ -0,0 +1,250 @@
1
+ <!-- AI SUMMARY -->
2
+ ## 快速了解
3
+
4
+ markdownItMermaid 为 markdown-it 插件,将 ```mermaid 代码块转为带 data-mermaid-code、data-mermaid-idx 的占位 DOM,便于前端挂载渲染。 实际绘图由 Mermaid 动态导入在 MermaidContent 中完成,支持流式场景节流与缓存。ContentRender 驱动完整消息 Markdown 流程。
5
+
6
+ ### 关联组件
7
+ - **mermaid-content** — 解析占位并渲染图表
8
+ - **markdown-content** — Markdown fence 管线
9
+ - **content-render** — 消息块级内容渲染
10
+
11
+ ---
12
+ <!-- FULL DOC -->
13
+
14
+ # markdownItMermaid Mermaid 解析插件
15
+
16
+ > **分类**:plugin
17
+
18
+ Markdown-it Mermaid 解析插件,用于解析 Mermaid 图表代码块。
19
+
20
+ ## 功能说明
21
+
22
+ 此插件将 Mermaid 代码块转换为特定的 HTML 结构,实际的 Mermaid 渲染在 `MermaidContent` 组件中完成。
23
+
24
+ ## 支持的语法
25
+
26
+ ````markdown
27
+ ```mermaid
28
+ graph TD
29
+ A[开始] --> B[结束]
30
+ ```
31
+ ````
32
+
33
+ ## 基础用法
34
+
35
+ ```typescript
36
+ import MarkdownIt from 'markdown-it';
37
+ import { markdownItMermaid } from '@blueking/chat-x';
38
+
39
+ const md = new MarkdownIt().use(markdownItMermaid);
40
+
41
+ const html = md.render(`
42
+ \`\`\`mermaid
43
+ graph TD
44
+ A[开始] --> B{判断}
45
+ B -->|是| C[处理]
46
+ B -->|否| D[结束]
47
+ C --> D
48
+ \`\`\`
49
+ `);
50
+
51
+ // 输出:
52
+ // <div class="mermaid-wrapper" data-mermaid-code="..." data-mermaid-idx="0"></div>
53
+ ```
54
+
55
+ ## 渲染结果
56
+
57
+ 插件会将 Mermaid 代码块转换为以下 HTML:
58
+
59
+ ```html
60
+ <div
61
+ class="mermaid-wrapper"
62
+ data-mermaid-code="graph%20TD%0A%20%20%20%20A%5B%E5%BC%80%E5%A7%8B%5D%20--%3E%20B%5B%E7%BB%93%E6%9D%9F%5D"
63
+ data-mermaid-idx="0"
64
+ ></div>
65
+ ```
66
+
67
+ - `data-mermaid-code`: URL 编码后的 Mermaid 代码
68
+ - `data-mermaid-idx`: 代码块索引
69
+
70
+ ## 支持的图表类型
71
+
72
+ ### 流程图 (Flowchart)
73
+
74
+ ````markdown
75
+ ```mermaid
76
+ graph TD
77
+ A[开始] --> B{条件判断}
78
+ B -->|是| C[执行操作]
79
+ B -->|否| D[结束]
80
+ C --> D
81
+ ```
82
+ ````
83
+
84
+ ### 时序图 (Sequence Diagram)
85
+
86
+ ````markdown
87
+ ```mermaid
88
+ sequenceDiagram
89
+ participant A as 客户端
90
+ participant B as 服务器
91
+ A->>B: 请求
92
+ B-->>A: 响应
93
+ ```
94
+ ````
95
+
96
+ ### 甘特图 (Gantt Chart)
97
+
98
+ ````markdown
99
+ ```mermaid
100
+ gantt
101
+ title 项目计划
102
+ dateFormat YYYY-MM-DD
103
+ section 阶段1
104
+ 任务1 :a1, 2024-01-01, 30d
105
+ 任务2 :after a1, 20d
106
+ section 阶段2
107
+ 任务3 :2024-02-01, 12d
108
+ ```
109
+ ````
110
+
111
+ ### 类图 (Class Diagram)
112
+
113
+ ````markdown
114
+ ```mermaid
115
+ classDiagram
116
+ class Animal {
117
+ +name: string
118
+ +age: int
119
+ +makeSound()
120
+ }
121
+ class Dog {
122
+ +breed: string
123
+ +bark()
124
+ }
125
+ Animal <|-- Dog
126
+ ```
127
+ ````
128
+
129
+ ### 状态图 (State Diagram)
130
+
131
+ ````markdown
132
+ ```mermaid
133
+ stateDiagram-v2
134
+ [*] --> 待处理
135
+ 待处理 --> 处理中: 开始处理
136
+ 处理中 --> 已完成: 处理完成
137
+ 处理中 --> 失败: 处理失败
138
+ 已完成 --> [*]
139
+ 失败 --> 待处理: 重试
140
+ ```
141
+ ````
142
+
143
+ ### 饼图 (Pie Chart)
144
+
145
+ ````markdown
146
+ ```mermaid
147
+ pie title 语言使用占比
148
+ "JavaScript" : 45
149
+ "TypeScript" : 35
150
+ "Python" : 15
151
+ "其他" : 5
152
+ ```
153
+ ````
154
+
155
+ ### ER 图 (Entity Relationship)
156
+
157
+ ````markdown
158
+ ```mermaid
159
+ erDiagram
160
+ 用户 ||--o{ 订单 : 创建
161
+ 订单 ||--|{ 订单明细 : 包含
162
+ 商品 ||--o{ 订单明细 : 包含于
163
+ ```
164
+ ````
165
+
166
+ ## 与 MermaidContent 组件配合
167
+
168
+ 实际渲染由 `MermaidContent` 组件完成:
169
+
170
+ ```vue
171
+ <template>
172
+ <MermaidContent
173
+ :token="mermaidTokens"
174
+ @mounted="handleMounted"
175
+ />
176
+ </template>
177
+
178
+ <script setup lang="ts">
179
+ import { MermaidContent } from '@blueking/chat-x';
180
+
181
+ // mermaidTokens 是包含 mermaid fence 的 token 数组
182
+ const handleMounted = ({ el }) => {
183
+ console.log('Mermaid 图表渲染完成:', el);
184
+ };
185
+ </script>
186
+ ```
187
+
188
+ ## 流式渲染
189
+
190
+ 组件支持流式渲染,在代码输入过程中实时更新图表:
191
+
192
+ ````vue
193
+ <template>
194
+ <ContentRender
195
+ :content="streamingContent"
196
+ :status="MessageStatus.Streaming"
197
+ />
198
+ </template>
199
+
200
+ <script setup lang="ts">
201
+ import { ref } from 'vue';
202
+ import { ContentRender, MessageStatus } from '@blueking/chat-x';
203
+
204
+ const streamingContent = ref('');
205
+
206
+ // 模拟流式输入 Mermaid 代码
207
+ const simulateStreaming = async () => {
208
+ const code = '```mermaid\ngraph TD\n A --> B\n```';
209
+ for (const char of code) {
210
+ await new Promise(r => setTimeout(r, 50));
211
+ streamingContent.value += char;
212
+ }
213
+ };
214
+ </script>
215
+ ````
216
+
217
+ ## 错误处理
218
+
219
+ 当 Mermaid 代码语法错误时:
220
+
221
+ 1. 插件仍会正常解析并输出 HTML
222
+ 2. `MermaidContent` 组件会捕获渲染错误
223
+ 3. 控制台会输出警告信息
224
+ 4. 图表区域保持空白,不会影响其他内容
225
+
226
+ ## 性能优化
227
+
228
+ - **节流渲染**:流式输入时使用 100ms 节流
229
+ - **代码缓存**:相同代码不会重复渲染
230
+ - **异步加载**:Mermaid 库按需动态导入
231
+
232
+ ## 使用场景
233
+
234
+ - AI 生成的流程图说明
235
+ - 技术文档中的架构图
236
+ - 项目计划展示
237
+ - 数据关系可视化
238
+
239
+ ## 注意事项
240
+
241
+ 1. **异步渲染**:Mermaid 库是动态导入的,首次渲染可能有短暂延迟
242
+ 2. **语法验证**:组件会先验证语法,无效代码不会尝试渲染
243
+ 3. **SVG 输出**:渲染结果是 SVG,可以自由缩放
244
+ 4. **样式覆盖**:可以通过 CSS 自定义图表样式
245
+
246
+ ## 关联组件
247
+
248
+ - [MermaidContent](../components/atomic/mermaid-content.md) — Mermaid 渲染
249
+ - [MarkdownContent](../components/atomic/markdown-content.md) — Markdown 内容
250
+ - [ContentRender](../components/molecular/content-render.md) — 内容渲染
@@ -0,0 +1,185 @@
1
+ <!-- AI SUMMARY -->
2
+ ## 快速了解
3
+
4
+ MermaidContent 将 info 为 mermaid 的 fence token 渲染为 SVG,模块级懒加载单例 Mermaid。 具备流式 throttle、错误静默与 SVG ID 随机化,避免多实例冲突。 由 MarkdownContent 在解析 mermaid 代码块时调用。
5
+
6
+ ### 关联组件
7
+ - **markdown-content** — 解析 mermaid 类型 fence 代码块后传入 token
8
+
9
+ ---
10
+ <!-- FULL DOC -->
11
+
12
+ # MermaidContent Mermaid 图表渲染
13
+
14
+ > **层级**:原子组件 · **功能域**:内容渲染
15
+
16
+ Markdown Token 层的 Mermaid 图表渲染原子组件,被 `MarkdownContent` 在检测到 mermaid fence token 时自动调用,通常无需手动引入。
17
+
18
+ 核心能力:**按需懒加载 Mermaid**(动态 import 单例)、**三级去重跳过**(代码比对 → 语法校验 → SVG 比对)、**100ms throttle** 流式防抖、**错误静默**(parse 失败时保持上一次 SVG)。
19
+
20
+ ## 组件结构与渲染流程
21
+
22
+ ```
23
+ props.token(Token[])
24
+
25
+ ├─ extractMermaidCode(tokens)
26
+ │ → 遍历找第一个 type==='fence' && info.trim()==='mermaid' && content 非空的 token
27
+ │ → 返回 content(无匹配返回空字符串)
28
+
29
+ └─ renderMermaid(throttle 100ms,leading + trailing)
30
+
31
+ ├─ 1. newCode === lastMermaidCode → return(代码未变,跳过)
32
+ ├─ 2. lastMermaidCode = newCode
33
+ ├─ 3. getMermaidInstance() → 动态 import('mermaid') 单例,初始化一次
34
+ ├─ 4. mermaid.parse(code, { suppressErrors: true })
35
+ │ → !isValid → return(语法无效,保持上次 SVG)
36
+ ├─ 5. mermaid.render('mermaid-content-' + randomId, code) → { svg }
37
+ ├─ 6. svgDomStr.value === svg → return(SVG 无变化,跳过)
38
+ └─ 7. svgDomStr.value = svg
39
+ nextTick → emit('mounted', { get el() { return mermaidContentRef.value } })
40
+
41
+ 模板:
42
+ div.mermaid-content(:key="svgDomStr",v-html="svgDomStr")
43
+ 注::key 绑定 svgDomStr,每次 SVG 变化会重建 div 而非就地 patch
44
+ ```
45
+
46
+ ## 基础用法
47
+
48
+ ```vue
49
+ <template>
50
+ <MermaidContent
51
+ :token="tokens"
52
+ @mounted="handleMounted"
53
+ />
54
+ </template>
55
+
56
+ <script setup lang="ts">
57
+ import { MermaidContent } from '@blueking/chat-x';
58
+ import type { Token } from 'markdown-it';
59
+
60
+ const tokens: Token[] = [
61
+ {
62
+ type: 'fence',
63
+ tag: 'code',
64
+ info: 'mermaid',
65
+ content: `graph TD
66
+ A[开始] --> B{判断}
67
+ B -->|是| C[执行]
68
+ B -->|否| D[结束]`,
69
+ } as Token,
70
+ ];
71
+
72
+ const handleMounted = ({ el }: { el: HTMLElement | null }) => {
73
+ // el 是 lazy getter,值为渲染后的 .mermaid-content 元素
74
+ console.log('渲染完成:', el);
75
+ };
76
+ </script>
77
+ ```
78
+
79
+ ## 支持的图表类型
80
+
81
+ ### 时序图(Sequence Diagram)
82
+
83
+ ### 甘特图(Gantt)
84
+
85
+ ### 类图(Class Diagram)
86
+
87
+ ### 状态图(State Diagram)
88
+
89
+ ### 饼图(Pie Chart)
90
+
91
+ ## 流式渲染
92
+
93
+ 流式输入时 Mermaid 语法逐步完整,组件通过 throttle + `parse` 语法校验避免无效渲染:
94
+
95
+ ```vue
96
+ <template>
97
+ <MermaidContent :token="streamingTokens" />
98
+ </template>
99
+
100
+ <script setup lang="ts">
101
+ import { ref } from 'vue';
102
+ import { MermaidContent } from '@blueking/chat-x';
103
+
104
+ const streamingTokens = ref([{ type: 'fence', tag: 'code', info: 'mermaid', content: '' }]);
105
+
106
+ const simulate = async () => {
107
+ const code = `graph TD\n A[开始] --> B[处理]\n B --> C[结束]`;
108
+ let content = '';
109
+ for (const char of code) {
110
+ await new Promise(r => setTimeout(r, 50));
111
+ content += char;
112
+ streamingTokens.value = [{ type: 'fence', tag: 'code', info: 'mermaid', content }];
113
+ }
114
+ };
115
+ </script>
116
+ ```
117
+
118
+ **流式过程中的行为**:
119
+
120
+ | 阶段 | `parse` 结果 | 行为 |
121
+ | -------------------------- | ------------ | ----------------------------------------- |
122
+ | 代码未变化 | — | 三级去重第 1 关:直接跳过,不调用 Mermaid |
123
+ | 语法不完整(如 `graph T`) | `false` | 三级去重第 2 关:跳过渲染,保持上次 SVG |
124
+ | 语法完整,SVG 相同 | `true` | 三级去重第 3 关:跳过 DOM 更新 |
125
+ | 语法完整,SVG 变化 | `true` | 更新 SVG,触发 `mounted` 事件 |
126
+
127
+ ## API
128
+
129
+ ### Props
130
+
131
+ | 属性名 | 类型 | 必填 | 说明 |
132
+ | ------ | --------- | ---- | -------------------------------------------------------------------------------------------- |
133
+ | token | `Token[]` | ✓ | markdown-it Token 数组;组件自动从中提取第一个 `type==='fence' && info==='mermaid'` 的 token |
134
+
135
+ ### Events
136
+
137
+ | 事件名 | 参数 | 触发时机 |
138
+ | ------- | ----------------------------- | ---------------------------------------------------------------------------------- |
139
+ | mounted | `{ el: HTMLElement \| null }` | SVG 更新后的 `nextTick`;`el` 为 lazy getter,返回当前 `.mermaid-content` 元素引用 |
140
+
141
+ ### Token 结构
142
+
143
+ ```typescript
144
+ // 组件只识别 type === 'fence' 且 info.trim() === 'mermaid' 的 token
145
+ {
146
+ type: 'fence';
147
+ tag?: 'code'; // 可选
148
+ info: 'mermaid'; // 必须严格等于 'mermaid'(trim 后)
149
+ content: string; // Mermaid 图表定义语法
150
+ }
151
+ ```
152
+
153
+ ## 性能与错误处理细节
154
+
155
+ ### 单例 Mermaid 实例
156
+
157
+ ```typescript
158
+ // 模块级变量,所有 MermaidContent 实例共享同一个 mermaid 模块
159
+ let mermaidInstance: MermaidModule | null = null;
160
+
161
+ // 初始化时调用一次(suppressErrorRendering: true 抑制 Mermaid 内部错误 UI)
162
+ mermaidInstance.default.initialize({ suppressErrorRendering: true });
163
+ ```
164
+
165
+ 首次渲染因动态 import 会有约 200~500ms 的网络加载延迟,之后复用实例无额外开销。
166
+
167
+ ### SVG ID 随机化
168
+
169
+ 每次调用 `mermaid.render` 时生成随机 ID:
170
+
171
+ ```typescript
172
+ mermaid.default.render('mermaid-content-' + Math.random().toString(36).substring(2, 15), code);
173
+ ```
174
+
175
+ 避免多个 MermaidContent 实例或同一实例多次渲染时 DOM ID 冲突。
176
+
177
+ ### 错误静默
178
+
179
+ - `mermaid.parse` 失败(语法无效)→ `return`,不修改 `svgDomStr`,保持上次成功的 SVG
180
+ - `mermaid.render` 抛出异常 → `console.warn`,不修改 `svgDomStr`,保持上次成功的 SVG
181
+ - 两种情况下组件界面均无错误提示(静默降级)
182
+
183
+ ## 关联组件
184
+
185
+ - [MarkdownContent](./markdown-content.md) — mermaid fence token 的来源与挂载