@ant-design/agentic-ui 2.27.6 → 2.27.8
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/Bubble/Bubble.js +7 -1
- package/dist/Components/effects/EffectPlayer.js +4 -5
- package/dist/History/components/HistoryItem.js +13 -30
- package/dist/History/components/LoadMoreComponent.js +3 -5
- package/dist/History/components/NewChatComponent.js +6 -10
- package/dist/History/menu.js +6 -12
- package/dist/MarkdownEditor/editor/Editor.js +5 -11
- package/dist/MarkdownEditor/editor/components/MediaErrorLink.d.ts +16 -0
- package/dist/MarkdownEditor/editor/components/MediaErrorLink.js +90 -0
- package/dist/MarkdownEditor/editor/elements/{Blockquote.d.ts → Blockquote/index.d.ts} +1 -1
- package/dist/MarkdownEditor/editor/elements/{Blockquote.js → Blockquote/index.js} +1 -1
- package/dist/MarkdownEditor/editor/elements/{FootnoteDefinition.d.ts → FootnoteDefinition/index.d.ts} +1 -1
- package/dist/MarkdownEditor/editor/elements/{FootnoteDefinition.js → FootnoteDefinition/index.js} +2 -2
- package/dist/MarkdownEditor/editor/elements/{FootnoteReference.d.ts → FootnoteReference/index.d.ts} +1 -1
- package/dist/MarkdownEditor/editor/elements/{FootnoteReference.js → FootnoteReference/index.js} +3 -3
- package/dist/MarkdownEditor/editor/elements/{Head.d.ts → Head/index.d.ts} +1 -1
- package/dist/MarkdownEditor/editor/elements/{Head.js → Head/index.js} +4 -4
- package/dist/MarkdownEditor/editor/elements/Image/index.d.ts +11 -10
- package/dist/MarkdownEditor/editor/elements/Image/index.js +55 -148
- package/dist/MarkdownEditor/editor/elements/{Media.d.ts → Media/index.d.ts} +1 -1
- package/dist/MarkdownEditor/editor/elements/{Media.js → Media/index.js} +36 -107
- package/dist/MarkdownEditor/editor/elements/Mermaid/index.d.ts +3 -0
- package/dist/MarkdownEditor/editor/elements/{Mermaid.js → Mermaid/index.js} +13 -28
- package/dist/MarkdownEditor/editor/elements/Mermaid/style.d.ts +10 -0
- package/dist/MarkdownEditor/editor/elements/Mermaid/style.js +144 -0
- package/dist/MarkdownEditor/editor/elements/{Paragraph.d.ts → Paragraph/index.d.ts} +1 -1
- package/dist/MarkdownEditor/editor/elements/{Paragraph.js → Paragraph/index.js} +4 -4
- package/dist/MarkdownEditor/editor/elements/{Schema.js → Schema/index.js} +3 -3
- package/dist/MarkdownInputField/AttachmentButton/AttachmentButtonPopover.js +8 -13
- package/dist/MarkdownInputField/MarkdownInputField.js +4 -7
- package/dist/Plugins/code/components/AceEditor.js +5 -14
- package/dist/Plugins/mermaid/Mermaid.d.ts +0 -7
- package/dist/Plugins/mermaid/Mermaid.js +4 -501
- package/dist/Plugins/mermaid/MermaidFallback.d.ts +5 -0
- package/dist/Plugins/mermaid/MermaidFallback.js +21 -0
- package/dist/Plugins/mermaid/MermaidRendererImpl.d.ts +9 -0
- package/dist/Plugins/mermaid/MermaidRendererImpl.js +39 -0
- package/dist/Plugins/mermaid/style.d.ts +10 -0
- package/dist/Plugins/mermaid/style.js +219 -0
- package/dist/Plugins/mermaid/types.d.ts +1 -0
- package/dist/Plugins/mermaid/types.js +1 -0
- package/dist/Plugins/mermaid/useMermaidRender.d.ts +8 -0
- package/dist/Plugins/mermaid/useMermaidRender.js +303 -0
- package/dist/Plugins/mermaid/utils.d.ts +14 -0
- package/dist/Plugins/mermaid/utils.js +223 -0
- package/dist/TaskList/index.js +4 -8
- package/dist/ToolUseBar/BarItem/Content.js +5 -6
- package/dist/ToolUseBar/BarItem/index.js +6 -14
- package/dist/ToolUseBar/index.js +6 -13
- package/dist/ToolUseBarThink/index.js +6 -11
- package/dist/Utils/debugUtils.d.ts +9 -0
- package/dist/Utils/debugUtils.js +42 -0
- package/dist/index.d.ts +1 -0
- package/package.json +1 -1
- package/dist/MarkdownEditor/editor/elements/Mermaid.d.ts +0 -3
- /package/dist/MarkdownEditor/editor/elements/{Break.d.ts → Break/index.d.ts} +0 -0
- /package/dist/MarkdownEditor/editor/elements/{Break.js → Break/index.js} +0 -0
- /package/dist/MarkdownEditor/editor/elements/{Code.d.ts → Code/index.d.ts} +0 -0
- /package/dist/MarkdownEditor/editor/elements/{Code.js → Code/index.js} +0 -0
- /package/dist/MarkdownEditor/editor/elements/{ErrorBoundary.d.ts → ErrorBoundary/index.d.ts} +0 -0
- /package/dist/MarkdownEditor/editor/elements/{ErrorBoundary.js → ErrorBoundary/index.js} +0 -0
- /package/dist/MarkdownEditor/editor/elements/{Hr.d.ts → Hr/index.d.ts} +0 -0
- /package/dist/MarkdownEditor/editor/elements/{Hr.js → Hr/index.js} +0 -0
- /package/dist/MarkdownEditor/editor/elements/{InlineKatex.d.ts → InlineKatex/index.d.ts} +0 -0
- /package/dist/MarkdownEditor/editor/elements/{InlineKatex.js → InlineKatex/index.js} +0 -0
- /package/dist/MarkdownEditor/editor/elements/{Katex.d.ts → Katex/index.d.ts} +0 -0
- /package/dist/MarkdownEditor/editor/elements/{Katex.js → Katex/index.js} +0 -0
- /package/dist/MarkdownEditor/editor/elements/{Schema.d.ts → Schema/index.d.ts} +0 -0
|
@@ -1,11 +1,3 @@
|
|
|
1
|
-
function _array_like_to_array(arr, len) {
|
|
2
|
-
if (len == null || len > arr.length) len = arr.length;
|
|
3
|
-
for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];
|
|
4
|
-
return arr2;
|
|
5
|
-
}
|
|
6
|
-
function _array_with_holes(arr) {
|
|
7
|
-
if (Array.isArray(arr)) return arr;
|
|
8
|
-
}
|
|
9
1
|
function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
|
|
10
2
|
try {
|
|
11
3
|
var info = gen[key](arg);
|
|
@@ -35,44 +27,6 @@ function _async_to_generator(fn) {
|
|
|
35
27
|
});
|
|
36
28
|
};
|
|
37
29
|
}
|
|
38
|
-
function _iterable_to_array_limit(arr, i) {
|
|
39
|
-
var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"];
|
|
40
|
-
if (_i == null) return;
|
|
41
|
-
var _arr = [];
|
|
42
|
-
var _n = true;
|
|
43
|
-
var _d = false;
|
|
44
|
-
var _s, _e;
|
|
45
|
-
try {
|
|
46
|
-
for(_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true){
|
|
47
|
-
_arr.push(_s.value);
|
|
48
|
-
if (i && _arr.length === i) break;
|
|
49
|
-
}
|
|
50
|
-
} catch (err) {
|
|
51
|
-
_d = true;
|
|
52
|
-
_e = err;
|
|
53
|
-
} finally{
|
|
54
|
-
try {
|
|
55
|
-
if (!_n && _i["return"] != null) _i["return"]();
|
|
56
|
-
} finally{
|
|
57
|
-
if (_d) throw _e;
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
return _arr;
|
|
61
|
-
}
|
|
62
|
-
function _non_iterable_rest() {
|
|
63
|
-
throw new TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
|
|
64
|
-
}
|
|
65
|
-
function _sliced_to_array(arr, i) {
|
|
66
|
-
return _array_with_holes(arr) || _iterable_to_array_limit(arr, i) || _unsupported_iterable_to_array(arr, i) || _non_iterable_rest();
|
|
67
|
-
}
|
|
68
|
-
function _unsupported_iterable_to_array(o, minLen) {
|
|
69
|
-
if (!o) return;
|
|
70
|
-
if (typeof o === "string") return _array_like_to_array(o, minLen);
|
|
71
|
-
var n = Object.prototype.toString.call(o).slice(8, -1);
|
|
72
|
-
if (n === "Object" && o.constructor) n = o.constructor.name;
|
|
73
|
-
if (n === "Map" || n === "Set") return Array.from(n);
|
|
74
|
-
if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _array_like_to_array(o, minLen);
|
|
75
|
-
}
|
|
76
30
|
function _ts_generator(thisArg, body) {
|
|
77
31
|
var f, y, t, g, _ = {
|
|
78
32
|
label: 0,
|
|
@@ -168,447 +122,10 @@ function _ts_generator(thisArg, body) {
|
|
|
168
122
|
};
|
|
169
123
|
}
|
|
170
124
|
}
|
|
171
|
-
import React, { lazy, Suspense
|
|
172
|
-
import {
|
|
173
|
-
import {
|
|
174
|
-
import {
|
|
175
|
-
var mermaidLoader = null;
|
|
176
|
-
/**
|
|
177
|
-
* 加载 Mermaid 库
|
|
178
|
-
* 使用单例模式确保只加载一次,并初始化配置
|
|
179
|
-
*/ export var loadMermaid = /*#__PURE__*/ function() {
|
|
180
|
-
var _ref = _async_to_generator(function() {
|
|
181
|
-
return _ts_generator(this, function(_state) {
|
|
182
|
-
if (typeof window === 'undefined') {
|
|
183
|
-
throw new Error('Mermaid 仅在浏览器环境中可用');
|
|
184
|
-
}
|
|
185
|
-
if (!mermaidLoader) {
|
|
186
|
-
// 使用 webpack 魔法注释确保正确代码分割和解析
|
|
187
|
-
// webpackChunkName 指定 chunk 名称,webpackMode 指定加载模式
|
|
188
|
-
mermaidLoader = import(/* webpackChunkName: "mermaid" */ /* webpackMode: "lazy" */ "mermaid").then(function(module) {
|
|
189
|
-
var api = module.default;
|
|
190
|
-
if (api === null || api === void 0 ? void 0 : api.initialize) {
|
|
191
|
-
api.initialize({
|
|
192
|
-
startOnLoad: false
|
|
193
|
-
});
|
|
194
|
-
}
|
|
195
|
-
return api;
|
|
196
|
-
}).catch(function(error) {
|
|
197
|
-
mermaidLoader = null;
|
|
198
|
-
throw error;
|
|
199
|
-
});
|
|
200
|
-
}
|
|
201
|
-
return [
|
|
202
|
-
2,
|
|
203
|
-
mermaidLoader
|
|
204
|
-
];
|
|
205
|
-
});
|
|
206
|
-
});
|
|
207
|
-
return function loadMermaid() {
|
|
208
|
-
return _ref.apply(this, arguments);
|
|
209
|
-
};
|
|
210
|
-
}();
|
|
211
|
-
/**
|
|
212
|
-
* Mermaid 渲染器组件实现
|
|
213
|
-
* 负责实际的图表渲染逻辑
|
|
214
|
-
*/ /**
|
|
215
|
-
* 检查 Mermaid 代码是否可能完整
|
|
216
|
-
* 用于流式输入时判断是否应该尝试渲染
|
|
217
|
-
*/ var isCodeLikelyComplete = function(code) {
|
|
218
|
-
return isCodeBlockLikelyComplete(code, 'mermaid');
|
|
219
|
-
};
|
|
220
|
-
var MermaidRendererImpl = function(props) {
|
|
221
|
-
var _props_element;
|
|
222
|
-
var _useGetSetState = _sliced_to_array(useGetSetState({
|
|
223
|
-
code: '',
|
|
224
|
-
error: '',
|
|
225
|
-
isTyping: false
|
|
226
|
-
}), 2), state = _useGetSetState[0], setState = _useGetSetState[1];
|
|
227
|
-
var containerRef = useRef(null);
|
|
228
|
-
var divRef = useRef(null);
|
|
229
|
-
var timer = useRef(null);
|
|
230
|
-
var renderTimer = useRef(null); // 实际渲染的定时器
|
|
231
|
-
var mermaidRef = useRef(null);
|
|
232
|
-
var lastCodeRef = useRef(''); // 记录上一次的代码
|
|
233
|
-
var changeCountRef = useRef(0); // 记录变化次数
|
|
234
|
-
var id = useMemo(function() {
|
|
235
|
-
return 'm' + (Date.now() + Math.ceil(Math.random() * 1000));
|
|
236
|
-
}, []);
|
|
237
|
-
var isVisible = useIntersectionOnce(containerRef);
|
|
238
|
-
useEffect(function() {
|
|
239
|
-
var nextCode = props.element.value || '';
|
|
240
|
-
var currentState = state();
|
|
241
|
-
if (!isVisible) {
|
|
242
|
-
return undefined;
|
|
243
|
-
}
|
|
244
|
-
// 如果代码没有变化且没有错误,不需要重新渲染
|
|
245
|
-
if (currentState.code === nextCode && currentState.error === '') {
|
|
246
|
-
return undefined;
|
|
247
|
-
}
|
|
248
|
-
// 清理所有定时器
|
|
249
|
-
if (timer.current !== null) {
|
|
250
|
-
window.clearTimeout(timer.current);
|
|
251
|
-
timer.current = null;
|
|
252
|
-
}
|
|
253
|
-
if (renderTimer.current !== null) {
|
|
254
|
-
window.clearTimeout(renderTimer.current);
|
|
255
|
-
renderTimer.current = null;
|
|
256
|
-
}
|
|
257
|
-
if (!nextCode) {
|
|
258
|
-
timer.current = window.setTimeout(function() {
|
|
259
|
-
setState({
|
|
260
|
-
code: '',
|
|
261
|
-
error: '',
|
|
262
|
-
isTyping: false
|
|
263
|
-
});
|
|
264
|
-
if (divRef.current) {
|
|
265
|
-
divRef.current.innerHTML = '';
|
|
266
|
-
}
|
|
267
|
-
lastCodeRef.current = '';
|
|
268
|
-
changeCountRef.current = 0;
|
|
269
|
-
timer.current = null;
|
|
270
|
-
}, 0);
|
|
271
|
-
return function() {
|
|
272
|
-
if (timer.current !== null) {
|
|
273
|
-
window.clearTimeout(timer.current);
|
|
274
|
-
timer.current = null;
|
|
275
|
-
}
|
|
276
|
-
};
|
|
277
|
-
}
|
|
278
|
-
// 检测代码是否在快速变化(流式输入)
|
|
279
|
-
var isCodeChanging = nextCode !== lastCodeRef.current;
|
|
280
|
-
if (isCodeChanging) {
|
|
281
|
-
changeCountRef.current += 1;
|
|
282
|
-
lastCodeRef.current = nextCode;
|
|
283
|
-
// 如果代码在快速变化,标记为正在输入
|
|
284
|
-
setState({
|
|
285
|
-
isTyping: true
|
|
286
|
-
});
|
|
287
|
-
}
|
|
288
|
-
// 检查代码是否可能完整
|
|
289
|
-
var likelyComplete = isCodeLikelyComplete(nextCode);
|
|
290
|
-
// 防抖延迟:根据代码变化频率动态调整
|
|
291
|
-
// 如果代码变化频繁(流式输入),使用更长的延迟以减少抖动
|
|
292
|
-
var baseDelay = 500; // 增加基础延迟
|
|
293
|
-
var typingDelay = changeCountRef.current > 3 ? 1500 : 1200; // 频繁变化时延长到 1.5 秒
|
|
294
|
-
var delay = currentState.code ? likelyComplete ? baseDelay : typingDelay : 0;
|
|
295
|
-
// 第一层防抖:检测代码变化
|
|
296
|
-
timer.current = window.setTimeout(function() {
|
|
297
|
-
// 再次检查代码是否还在变化
|
|
298
|
-
var finalCode = props.element.value || '';
|
|
299
|
-
if (finalCode !== nextCode) {
|
|
300
|
-
// 代码还在变化,重新调度
|
|
301
|
-
timer.current = null;
|
|
302
|
-
return;
|
|
303
|
-
}
|
|
304
|
-
// 第二层防抖:实际渲染
|
|
305
|
-
// 如果代码可能不完整,再等待一段时间,增加延迟以减少抖动
|
|
306
|
-
var finalDelay = likelyComplete ? 200 : 800; // 增加延迟时间
|
|
307
|
-
renderTimer.current = window.setTimeout(/*#__PURE__*/ _async_to_generator(function() {
|
|
308
|
-
var _mermaidRef_current, api, _tmp, trimmedCode, svg, container, error, api1, finalCode, parseError, tempElement;
|
|
309
|
-
return _ts_generator(this, function(_state) {
|
|
310
|
-
switch(_state.label){
|
|
311
|
-
case 0:
|
|
312
|
-
_state.trys.push([
|
|
313
|
-
0,
|
|
314
|
-
5,
|
|
315
|
-
10,
|
|
316
|
-
11
|
|
317
|
-
]);
|
|
318
|
-
if (!((_mermaidRef_current = mermaidRef.current) !== null && _mermaidRef_current !== void 0)) return [
|
|
319
|
-
3,
|
|
320
|
-
1
|
|
321
|
-
];
|
|
322
|
-
_tmp = _mermaidRef_current;
|
|
323
|
-
return [
|
|
324
|
-
3,
|
|
325
|
-
3
|
|
326
|
-
];
|
|
327
|
-
case 1:
|
|
328
|
-
return [
|
|
329
|
-
4,
|
|
330
|
-
loadMermaid()
|
|
331
|
-
];
|
|
332
|
-
case 2:
|
|
333
|
-
_tmp = _state.sent();
|
|
334
|
-
_state.label = 3;
|
|
335
|
-
case 3:
|
|
336
|
-
api = _tmp;
|
|
337
|
-
mermaidRef.current = api;
|
|
338
|
-
// 验证代码是否完整(基本检查)
|
|
339
|
-
trimmedCode = nextCode.trim();
|
|
340
|
-
if (!trimmedCode) {
|
|
341
|
-
setState({
|
|
342
|
-
code: '',
|
|
343
|
-
error: ''
|
|
344
|
-
});
|
|
345
|
-
if (divRef.current) {
|
|
346
|
-
divRef.current.innerHTML = '';
|
|
347
|
-
}
|
|
348
|
-
timer.current = null;
|
|
349
|
-
return [
|
|
350
|
-
2
|
|
351
|
-
];
|
|
352
|
-
}
|
|
353
|
-
return [
|
|
354
|
-
4,
|
|
355
|
-
api.render(id, trimmedCode)
|
|
356
|
-
];
|
|
357
|
-
case 4:
|
|
358
|
-
svg = _state.sent().svg;
|
|
359
|
-
if (divRef.current) {
|
|
360
|
-
// 使用更平滑的更新方式,避免抖动
|
|
361
|
-
// 先设置透明度,然后更新内容,最后恢复透明度
|
|
362
|
-
container = divRef.current;
|
|
363
|
-
// 如果已有内容,先淡出
|
|
364
|
-
if (container.children.length > 0) {
|
|
365
|
-
container.style.opacity = '0';
|
|
366
|
-
container.style.transition = 'opacity 0.2s ease-in-out';
|
|
367
|
-
}
|
|
368
|
-
// 使用 requestAnimationFrame 确保平滑更新
|
|
369
|
-
requestAnimationFrame(function() {
|
|
370
|
-
// 清理旧内容
|
|
371
|
-
container.innerHTML = '';
|
|
372
|
-
// 创建隔离的容器包装 SVG
|
|
373
|
-
var wrapper = document.createElement('div');
|
|
374
|
-
wrapper.style.cssText = "\n position: relative;\n width: 100%;\n max-width: 100%;\n overflow: hidden;\n isolation: isolate;\n contain: layout style paint;\n display: flex;\n justify-content: center;\n align-items: center;\n min-height: 200px; /* 保持最小高度,避免尺寸抖动 */\n ";
|
|
375
|
-
// 解析 SVG 并添加隔离属性
|
|
376
|
-
var parser = new DOMParser();
|
|
377
|
-
var svgDoc = parser.parseFromString(svg, 'image/svg+xml');
|
|
378
|
-
var svgElement = svgDoc.querySelector('svg');
|
|
379
|
-
if (svgElement) {
|
|
380
|
-
// 确保 SVG 不会溢出
|
|
381
|
-
var existingStyle = svgElement.getAttribute('style') || '';
|
|
382
|
-
var newStyle = "".concat(existingStyle, "; max-width: 100%; height: auto; overflow: hidden;").trim();
|
|
383
|
-
svgElement.setAttribute('style', newStyle);
|
|
384
|
-
// 添加隔离属性和类名
|
|
385
|
-
svgElement.setAttribute('data-mermaid-svg', 'true');
|
|
386
|
-
svgElement.setAttribute('class', (svgElement.getAttribute('class') || '') + ' mermaid-isolated');
|
|
387
|
-
// 限制 SVG 内部元素的样式影响范围
|
|
388
|
-
var allElements = svgElement.querySelectorAll('*');
|
|
389
|
-
allElements.forEach(function(el) {
|
|
390
|
-
// 确保内部元素不会影响外部
|
|
391
|
-
if (el instanceof SVGElement) {
|
|
392
|
-
el.setAttribute('data-mermaid-internal', 'true');
|
|
393
|
-
}
|
|
394
|
-
});
|
|
395
|
-
wrapper.appendChild(svgElement);
|
|
396
|
-
} else {
|
|
397
|
-
// 如果解析失败,直接使用原始 SVG,但添加包装
|
|
398
|
-
var tempDiv = document.createElement('div');
|
|
399
|
-
tempDiv.innerHTML = svg;
|
|
400
|
-
var extractedSvg = tempDiv.querySelector('svg');
|
|
401
|
-
if (extractedSvg) {
|
|
402
|
-
extractedSvg.setAttribute('style', 'max-width: 100%; height: auto; overflow: hidden;');
|
|
403
|
-
extractedSvg.setAttribute('data-mermaid-svg', 'true');
|
|
404
|
-
wrapper.appendChild(extractedSvg);
|
|
405
|
-
} else {
|
|
406
|
-
wrapper.innerHTML = svg;
|
|
407
|
-
}
|
|
408
|
-
}
|
|
409
|
-
container.appendChild(wrapper);
|
|
410
|
-
// 恢复透明度,实现淡入效果
|
|
411
|
-
requestAnimationFrame(function() {
|
|
412
|
-
container.style.opacity = '1';
|
|
413
|
-
container.style.transition = 'opacity 0.3s ease-in-out';
|
|
414
|
-
});
|
|
415
|
-
});
|
|
416
|
-
}
|
|
417
|
-
// 渲染成功,重置状态
|
|
418
|
-
setState({
|
|
419
|
-
code: nextCode,
|
|
420
|
-
error: '',
|
|
421
|
-
isTyping: false
|
|
422
|
-
});
|
|
423
|
-
changeCountRef.current = 0; // 重置变化计数
|
|
424
|
-
return [
|
|
425
|
-
3,
|
|
426
|
-
11
|
|
427
|
-
];
|
|
428
|
-
case 5:
|
|
429
|
-
error = _state.sent();
|
|
430
|
-
api1 = mermaidRef.current;
|
|
431
|
-
finalCode = props.element.value || '';
|
|
432
|
-
// 如果代码还在变化中,不显示错误(可能是中间状态)
|
|
433
|
-
if (finalCode !== nextCode || state().isTyping) {
|
|
434
|
-
// 代码还在变化,可能是流式输入,不显示错误
|
|
435
|
-
renderTimer.current = null;
|
|
436
|
-
return [
|
|
437
|
-
2
|
|
438
|
-
];
|
|
439
|
-
}
|
|
440
|
-
if (!api1) return [
|
|
441
|
-
3,
|
|
442
|
-
9
|
|
443
|
-
];
|
|
444
|
-
_state.label = 6;
|
|
445
|
-
case 6:
|
|
446
|
-
_state.trys.push([
|
|
447
|
-
6,
|
|
448
|
-
8,
|
|
449
|
-
,
|
|
450
|
-
9
|
|
451
|
-
]);
|
|
452
|
-
return [
|
|
453
|
-
4,
|
|
454
|
-
api1.parse(finalCode)
|
|
455
|
-
];
|
|
456
|
-
case 7:
|
|
457
|
-
_state.sent();
|
|
458
|
-
// 如果能解析,说明可能是渲染问题,不显示错误
|
|
459
|
-
renderTimer.current = null;
|
|
460
|
-
return [
|
|
461
|
-
2
|
|
462
|
-
];
|
|
463
|
-
case 8:
|
|
464
|
-
parseError = _state.sent();
|
|
465
|
-
// 确实是语法错误,但只在代码稳定后显示
|
|
466
|
-
if (finalCode === nextCode && !state().isTyping) {
|
|
467
|
-
setState({
|
|
468
|
-
error: String(parseError),
|
|
469
|
-
code: '',
|
|
470
|
-
isTyping: false
|
|
471
|
-
});
|
|
472
|
-
// 确保清理渲染内容
|
|
473
|
-
if (divRef.current) {
|
|
474
|
-
divRef.current.innerHTML = '';
|
|
475
|
-
}
|
|
476
|
-
}
|
|
477
|
-
renderTimer.current = null;
|
|
478
|
-
return [
|
|
479
|
-
2
|
|
480
|
-
];
|
|
481
|
-
case 9:
|
|
482
|
-
// 其他错误,只在代码稳定后显示
|
|
483
|
-
if (finalCode === nextCode && !state().isTyping) {
|
|
484
|
-
setState({
|
|
485
|
-
error: String(error),
|
|
486
|
-
code: '',
|
|
487
|
-
isTyping: false
|
|
488
|
-
});
|
|
489
|
-
// 确保清理渲染内容
|
|
490
|
-
if (divRef.current) {
|
|
491
|
-
divRef.current.innerHTML = '';
|
|
492
|
-
}
|
|
493
|
-
}
|
|
494
|
-
return [
|
|
495
|
-
3,
|
|
496
|
-
11
|
|
497
|
-
];
|
|
498
|
-
case 10:
|
|
499
|
-
// 清理 Mermaid 生成的临时元素
|
|
500
|
-
tempElement = document.querySelector('#d' + id);
|
|
501
|
-
if (tempElement) {
|
|
502
|
-
tempElement.classList.add('hidden');
|
|
503
|
-
// 尝试移除临时元素,避免 DOM 污染
|
|
504
|
-
try {
|
|
505
|
-
if (tempElement.parentNode) {
|
|
506
|
-
tempElement.parentNode.removeChild(tempElement);
|
|
507
|
-
}
|
|
508
|
-
} catch (e) {
|
|
509
|
-
// 忽略移除失败
|
|
510
|
-
}
|
|
511
|
-
}
|
|
512
|
-
renderTimer.current = null;
|
|
513
|
-
return [
|
|
514
|
-
7
|
|
515
|
-
];
|
|
516
|
-
case 11:
|
|
517
|
-
timer.current = null;
|
|
518
|
-
return [
|
|
519
|
-
2
|
|
520
|
-
];
|
|
521
|
-
}
|
|
522
|
-
});
|
|
523
|
-
}), finalDelay);
|
|
524
|
-
}, delay);
|
|
525
|
-
return function() {
|
|
526
|
-
if (timer.current !== null) {
|
|
527
|
-
window.clearTimeout(timer.current);
|
|
528
|
-
timer.current = null;
|
|
529
|
-
}
|
|
530
|
-
if (renderTimer.current !== null) {
|
|
531
|
-
window.clearTimeout(renderTimer.current);
|
|
532
|
-
renderTimer.current = null;
|
|
533
|
-
}
|
|
534
|
-
};
|
|
535
|
-
}, [
|
|
536
|
-
props === null || props === void 0 ? void 0 : (_props_element = props.element) === null || _props_element === void 0 ? void 0 : _props_element.value,
|
|
537
|
-
id,
|
|
538
|
-
isVisible,
|
|
539
|
-
setState,
|
|
540
|
-
state
|
|
541
|
-
]);
|
|
542
|
-
var snapshot = state();
|
|
543
|
-
return /*#__PURE__*/ React.createElement("div", {
|
|
544
|
-
ref: containerRef,
|
|
545
|
-
style: {
|
|
546
|
-
marginBottom: '0.75em',
|
|
547
|
-
cursor: 'default',
|
|
548
|
-
userSelect: 'none',
|
|
549
|
-
padding: '0.75rem 0',
|
|
550
|
-
borderRadius: '1em',
|
|
551
|
-
display: 'flex',
|
|
552
|
-
justifyContent: 'center',
|
|
553
|
-
// 增加隔离:防止内容溢出影响其他元素
|
|
554
|
-
position: 'relative',
|
|
555
|
-
isolation: 'isolate',
|
|
556
|
-
contain: 'layout style paint',
|
|
557
|
-
overflow: 'hidden'
|
|
558
|
-
},
|
|
559
|
-
contentEditable: false
|
|
560
|
-
}, /*#__PURE__*/ React.createElement("div", {
|
|
561
|
-
contentEditable: false,
|
|
562
|
-
ref: divRef,
|
|
563
|
-
style: {
|
|
564
|
-
width: '100%',
|
|
565
|
-
maxWidth: '100%',
|
|
566
|
-
minHeight: '200px',
|
|
567
|
-
display: 'flex',
|
|
568
|
-
justifyContent: 'center',
|
|
569
|
-
visibility: snapshot.code && !snapshot.error ? 'visible' : 'hidden',
|
|
570
|
-
// 增加隔离样式
|
|
571
|
-
position: 'relative',
|
|
572
|
-
isolation: 'isolate',
|
|
573
|
-
contain: 'layout style paint',
|
|
574
|
-
overflow: 'hidden',
|
|
575
|
-
// 防止 SVG 样式影响外部
|
|
576
|
-
pointerEvents: snapshot.code && !snapshot.error ? 'auto' : 'none',
|
|
577
|
-
// 添加过渡效果,使更新更平滑
|
|
578
|
-
transition: 'opacity 0.3s ease-in-out, min-height 0.2s ease-in-out'
|
|
579
|
-
},
|
|
580
|
-
// 使用 data 属性标记,方便样式隔离
|
|
581
|
-
"data-mermaid-container": "true"
|
|
582
|
-
}), snapshot.isTyping && !snapshot.code && /*#__PURE__*/ React.createElement("div", {
|
|
583
|
-
style: {
|
|
584
|
-
textAlign: 'center',
|
|
585
|
-
color: '#6B7280',
|
|
586
|
-
padding: '0.5rem',
|
|
587
|
-
position: 'relative',
|
|
588
|
-
zIndex: 1,
|
|
589
|
-
fontStyle: 'italic'
|
|
590
|
-
}
|
|
591
|
-
}, "正在加载..."), snapshot.error && !snapshot.isTyping && /*#__PURE__*/ React.createElement("div", {
|
|
592
|
-
style: {
|
|
593
|
-
textAlign: 'center',
|
|
594
|
-
color: 'rgba(239, 68, 68, 0.8)',
|
|
595
|
-
padding: '0.5rem',
|
|
596
|
-
// 错误信息也增加隔离
|
|
597
|
-
position: 'relative',
|
|
598
|
-
zIndex: 1,
|
|
599
|
-
wordBreak: 'break-word',
|
|
600
|
-
maxWidth: '100%'
|
|
601
|
-
}
|
|
602
|
-
}, snapshot.error), !snapshot.code && !snapshot.error && !snapshot.isTyping && /*#__PURE__*/ React.createElement("div", {
|
|
603
|
-
style: {
|
|
604
|
-
textAlign: 'center',
|
|
605
|
-
color: '#6B7280',
|
|
606
|
-
padding: '0.5rem',
|
|
607
|
-
position: 'relative',
|
|
608
|
-
zIndex: 1
|
|
609
|
-
}
|
|
610
|
-
}, "Empty"));
|
|
611
|
-
};
|
|
125
|
+
import React, { lazy, Suspense } from "react";
|
|
126
|
+
import { MermaidFallback } from "./MermaidFallback";
|
|
127
|
+
import { MermaidRendererImpl } from "./MermaidRendererImpl";
|
|
128
|
+
import { loadMermaid } from "./utils";
|
|
612
129
|
/**
|
|
613
130
|
* Mermaid 渲染器组件
|
|
614
131
|
* 使用 React.lazy 延迟加载,仅在需要时加载 mermaid 库
|
|
@@ -631,20 +148,6 @@ var MermaidRendererImpl = function(props) {
|
|
|
631
148
|
}
|
|
632
149
|
});
|
|
633
150
|
}));
|
|
634
|
-
/**
|
|
635
|
-
* 加载中的占位组件
|
|
636
|
-
*/ var MermaidFallback = function() {
|
|
637
|
-
return /*#__PURE__*/ React.createElement("div", {
|
|
638
|
-
style: {
|
|
639
|
-
marginBottom: '0.75em',
|
|
640
|
-
padding: '0.75rem 0',
|
|
641
|
-
display: 'flex',
|
|
642
|
-
justifyContent: 'center',
|
|
643
|
-
alignItems: 'center',
|
|
644
|
-
color: '#6B7280'
|
|
645
|
-
}
|
|
646
|
-
}, "加载中...");
|
|
647
|
-
};
|
|
648
151
|
/**
|
|
649
152
|
* Mermaid 组件 - Mermaid图表渲染组件
|
|
650
153
|
*
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { ConfigProvider, Skeleton } from "antd";
|
|
2
|
+
import classNames from "classnames";
|
|
3
|
+
import React, { useContext } from "react";
|
|
4
|
+
import { useStyle } from "./style";
|
|
5
|
+
/**
|
|
6
|
+
* 加载中的占位组件
|
|
7
|
+
*/ export var MermaidFallback = function() {
|
|
8
|
+
var context = useContext(ConfigProvider.ConfigContext);
|
|
9
|
+
var baseCls = (context === null || context === void 0 ? void 0 : context.getPrefixCls('agentic-plugin-mermaid')) || 'agentic-plugin-mermaid';
|
|
10
|
+
var _useStyle = useStyle(baseCls), wrapSSR = _useStyle.wrapSSR, hashId = _useStyle.hashId;
|
|
11
|
+
return wrapSSR(/*#__PURE__*/ React.createElement("div", {
|
|
12
|
+
className: classNames("".concat(baseCls, "-fallback"), hashId)
|
|
13
|
+
}, /*#__PURE__*/ React.createElement(Skeleton.Image, {
|
|
14
|
+
active: true,
|
|
15
|
+
style: {
|
|
16
|
+
width: '100%',
|
|
17
|
+
minHeight: '200px',
|
|
18
|
+
maxWidth: '800px'
|
|
19
|
+
}
|
|
20
|
+
})));
|
|
21
|
+
};
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { ConfigProvider } from "antd";
|
|
2
|
+
import classNames from "classnames";
|
|
3
|
+
import React, { useContext, useMemo, useRef } from "react";
|
|
4
|
+
import { useIntersectionOnce } from "../../Hooks/useIntersectionOnce";
|
|
5
|
+
import { useMermaidRender } from "./useMermaidRender";
|
|
6
|
+
import { useStyle } from "./style";
|
|
7
|
+
/**
|
|
8
|
+
* Mermaid 渲染器组件实现
|
|
9
|
+
* 负责实际的图表渲染逻辑
|
|
10
|
+
*/ export var MermaidRendererImpl = function(props) {
|
|
11
|
+
var context = useContext(ConfigProvider.ConfigContext);
|
|
12
|
+
var baseCls = (context === null || context === void 0 ? void 0 : context.getPrefixCls('agentic-plugin-mermaid')) || 'plugin-mermaid';
|
|
13
|
+
var _useStyle = useStyle(baseCls), wrapSSR = _useStyle.wrapSSR, hashId = _useStyle.hashId;
|
|
14
|
+
var containerRef = useRef(null);
|
|
15
|
+
var divRef = useRef(null);
|
|
16
|
+
var id = useMemo(function() {
|
|
17
|
+
return 'm' + (Date.now() + Math.ceil(Math.random() * 1000));
|
|
18
|
+
}, []);
|
|
19
|
+
var isVisible = useIntersectionOnce(containerRef);
|
|
20
|
+
var _useMermaidRender = useMermaidRender(props.element.value || '', divRef, id, isVisible), error = _useMermaidRender.error, renderedCode = _useMermaidRender.renderedCode;
|
|
21
|
+
return wrapSSR(/*#__PURE__*/ React.createElement("div", {
|
|
22
|
+
ref: containerRef,
|
|
23
|
+
className: classNames(baseCls, hashId),
|
|
24
|
+
contentEditable: false
|
|
25
|
+
}, /*#__PURE__*/ React.createElement("div", {
|
|
26
|
+
contentEditable: false,
|
|
27
|
+
ref: divRef,
|
|
28
|
+
className: classNames(hashId),
|
|
29
|
+
style: {
|
|
30
|
+
visibility: renderedCode && !error ? 'visible' : 'hidden',
|
|
31
|
+
pointerEvents: renderedCode && !error ? 'auto' : 'none'
|
|
32
|
+
},
|
|
33
|
+
"data-mermaid-container": "true"
|
|
34
|
+
}), error && /*#__PURE__*/ React.createElement("div", {
|
|
35
|
+
className: classNames("".concat(baseCls, "-error"), hashId)
|
|
36
|
+
}, error), !renderedCode && !error && /*#__PURE__*/ React.createElement("div", {
|
|
37
|
+
className: classNames("".concat(baseCls, "-empty"), hashId)
|
|
38
|
+
}, "Empty")));
|
|
39
|
+
};
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/// <reference types="react" />
|
|
2
|
+
/**
|
|
3
|
+
* Mermaid 插件样式 Hook
|
|
4
|
+
* @param prefixCls - 样式类名前缀
|
|
5
|
+
* @returns 样式相关的 wrapSSR 和 hashId
|
|
6
|
+
*/
|
|
7
|
+
export declare function useStyle(prefixCls?: string): {
|
|
8
|
+
wrapSSR: (node: import("react").ReactElement<any, string | import("react").JSXElementConstructor<any>>) => import("react").JSX.Element;
|
|
9
|
+
hashId: string;
|
|
10
|
+
};
|