@ant-design/agentic-ui 2.29.59 → 2.30.0

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 (52) hide show
  1. package/dist/Bubble/List/index.d.ts +7 -0
  2. package/dist/Bubble/List/index.js +10 -1
  3. package/dist/Bubble/MessagesContent/MarkdownPreview.js +27 -3
  4. package/dist/Bubble/UserBubble.js +3 -1
  5. package/dist/Bubble/type.d.ts +7 -0
  6. package/dist/Hooks/useLanguage.d.ts +1 -0
  7. package/dist/I18n/locales.d.ts +1 -0
  8. package/dist/I18n/locales.js +3 -1
  9. package/dist/MarkdownEditor/plugin.d.ts +15 -0
  10. package/dist/MarkdownEditor/style.js +156 -326
  11. package/dist/MarkdownEditor/types.d.ts +9 -0
  12. package/dist/MarkdownInputField/AttachmentButton/AttachmentButtonPopover.js +1 -1
  13. package/dist/MarkdownInputField/hooks/useMarkdownInputFieldRefs.js +10 -3
  14. package/dist/MarkdownRenderer/AnimationText.d.ts +22 -0
  15. package/dist/MarkdownRenderer/AnimationText.js +124 -0
  16. package/dist/MarkdownRenderer/CharacterQueue.d.ts +36 -0
  17. package/dist/MarkdownRenderer/CharacterQueue.js +188 -0
  18. package/dist/MarkdownRenderer/MarkdownRenderer.d.ts +13 -0
  19. package/dist/MarkdownRenderer/MarkdownRenderer.js +348 -0
  20. package/dist/MarkdownRenderer/index.d.ts +11 -0
  21. package/dist/MarkdownRenderer/index.js +9 -0
  22. package/dist/MarkdownRenderer/renderers/ChartRenderer.d.ts +12 -0
  23. package/dist/MarkdownRenderer/renderers/ChartRenderer.js +395 -0
  24. package/dist/MarkdownRenderer/renderers/CodeRenderer.d.ts +7 -0
  25. package/dist/MarkdownRenderer/renderers/CodeRenderer.js +218 -0
  26. package/dist/MarkdownRenderer/renderers/MermaidRenderer.d.ts +7 -0
  27. package/dist/MarkdownRenderer/renderers/MermaidRenderer.js +43 -0
  28. package/dist/MarkdownRenderer/renderers/SchemaRenderer.d.ts +15 -0
  29. package/dist/MarkdownRenderer/renderers/SchemaRenderer.js +115 -0
  30. package/dist/MarkdownRenderer/renderers/index.d.ts +4 -0
  31. package/dist/MarkdownRenderer/renderers/index.js +4 -0
  32. package/dist/MarkdownRenderer/style.d.ts +16 -0
  33. package/dist/MarkdownRenderer/style.js +46 -0
  34. package/dist/MarkdownRenderer/types.d.ts +74 -0
  35. package/dist/MarkdownRenderer/types.js +1 -0
  36. package/dist/MarkdownRenderer/useMarkdownToReact.d.ts +23 -0
  37. package/dist/MarkdownRenderer/useMarkdownToReact.js +1240 -0
  38. package/dist/MarkdownRenderer/useStreaming.d.ts +29 -0
  39. package/dist/MarkdownRenderer/useStreaming.js +392 -0
  40. package/dist/Plugins/chart/AreaChart/index.js +4 -2
  41. package/dist/Plugins/chart/LineChart/index.js +4 -2
  42. package/dist/Plugins/chart/components/ChartContainer/ChartErrorBoundary.d.ts +8 -0
  43. package/dist/Plugins/chart/components/ChartContainer/ChartErrorBoundary.js +31 -6
  44. package/dist/Plugins/mermaid/style.js +0 -3
  45. package/dist/TaskList/TaskList.js +3 -12
  46. package/dist/TaskList/components/TaskListItem.js +3 -12
  47. package/dist/ThoughtChainList/ThoughtChainListItem.js +2 -4
  48. package/dist/ThoughtChainList/index.js +4 -21
  49. package/dist/ToolUseBarThink/index.js +20 -59
  50. package/dist/index.d.ts +1 -0
  51. package/dist/index.js +2 -0
  52. package/package.json +2 -2
@@ -0,0 +1,395 @@
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
+ function _define_property(obj, key, value) {
10
+ if (key in obj) {
11
+ Object.defineProperty(obj, key, {
12
+ value: value,
13
+ enumerable: true,
14
+ configurable: true,
15
+ writable: true
16
+ });
17
+ } else {
18
+ obj[key] = value;
19
+ }
20
+ return obj;
21
+ }
22
+ function _iterable_to_array_limit(arr, i) {
23
+ var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"];
24
+ if (_i == null) return;
25
+ var _arr = [];
26
+ var _n = true;
27
+ var _d = false;
28
+ var _s, _e;
29
+ try {
30
+ for(_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true){
31
+ _arr.push(_s.value);
32
+ if (i && _arr.length === i) break;
33
+ }
34
+ } catch (err) {
35
+ _d = true;
36
+ _e = err;
37
+ } finally{
38
+ try {
39
+ if (!_n && _i["return"] != null) _i["return"]();
40
+ } finally{
41
+ if (_d) throw _e;
42
+ }
43
+ }
44
+ return _arr;
45
+ }
46
+ function _non_iterable_rest() {
47
+ throw new TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
48
+ }
49
+ function _object_spread(target) {
50
+ for(var i = 1; i < arguments.length; i++){
51
+ var source = arguments[i] != null ? arguments[i] : {};
52
+ var ownKeys = Object.keys(source);
53
+ if (typeof Object.getOwnPropertySymbols === "function") {
54
+ ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function(sym) {
55
+ return Object.getOwnPropertyDescriptor(source, sym).enumerable;
56
+ }));
57
+ }
58
+ ownKeys.forEach(function(key) {
59
+ _define_property(target, key, source[key]);
60
+ });
61
+ }
62
+ return target;
63
+ }
64
+ function ownKeys(object, enumerableOnly) {
65
+ var keys = Object.keys(object);
66
+ if (Object.getOwnPropertySymbols) {
67
+ var symbols = Object.getOwnPropertySymbols(object);
68
+ if (enumerableOnly) {
69
+ symbols = symbols.filter(function(sym) {
70
+ return Object.getOwnPropertyDescriptor(object, sym).enumerable;
71
+ });
72
+ }
73
+ keys.push.apply(keys, symbols);
74
+ }
75
+ return keys;
76
+ }
77
+ function _object_spread_props(target, source) {
78
+ source = source != null ? source : {};
79
+ if (Object.getOwnPropertyDescriptors) {
80
+ Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));
81
+ } else {
82
+ ownKeys(Object(source)).forEach(function(key) {
83
+ Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
84
+ });
85
+ }
86
+ return target;
87
+ }
88
+ function _object_without_properties(source, excluded) {
89
+ if (source == null) return {};
90
+ var target = {}, sourceKeys, key, i;
91
+ if (typeof Reflect !== "undefined" && Reflect.ownKeys) {
92
+ sourceKeys = Reflect.ownKeys(source);
93
+ for(i = 0; i < sourceKeys.length; i++){
94
+ key = sourceKeys[i];
95
+ if (excluded.indexOf(key) >= 0) continue;
96
+ if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;
97
+ target[key] = source[key];
98
+ }
99
+ return target;
100
+ }
101
+ target = _object_without_properties_loose(source, excluded);
102
+ if (Object.getOwnPropertySymbols) {
103
+ sourceKeys = Object.getOwnPropertySymbols(source);
104
+ for(i = 0; i < sourceKeys.length; i++){
105
+ key = sourceKeys[i];
106
+ if (excluded.indexOf(key) >= 0) continue;
107
+ if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;
108
+ target[key] = source[key];
109
+ }
110
+ }
111
+ return target;
112
+ }
113
+ function _object_without_properties_loose(source, excluded) {
114
+ if (source == null) return {};
115
+ var target = {}, sourceKeys = Object.getOwnPropertyNames(source), key, i;
116
+ for(i = 0; i < sourceKeys.length; i++){
117
+ key = sourceKeys[i];
118
+ if (excluded.indexOf(key) >= 0) continue;
119
+ if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;
120
+ target[key] = source[key];
121
+ }
122
+ return target;
123
+ }
124
+ function _sliced_to_array(arr, i) {
125
+ return _array_with_holes(arr) || _iterable_to_array_limit(arr, i) || _unsupported_iterable_to_array(arr, i) || _non_iterable_rest();
126
+ }
127
+ function _type_of(obj) {
128
+ "@swc/helpers - typeof";
129
+ return obj && typeof Symbol !== "undefined" && obj.constructor === Symbol ? "symbol" : typeof obj;
130
+ }
131
+ function _unsupported_iterable_to_array(o, minLen) {
132
+ if (!o) return;
133
+ if (typeof o === "string") return _array_like_to_array(o, minLen);
134
+ var n = Object.prototype.toString.call(o).slice(8, -1);
135
+ if (n === "Object" && o.constructor) n = o.constructor.name;
136
+ if (n === "Map" || n === "Set") return Array.from(n);
137
+ if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _array_like_to_array(o, minLen);
138
+ }
139
+ import { Button, ConfigProvider } from "antd";
140
+ import clsx from "clsx";
141
+ import React, { useEffect, useMemo, useRef, useState } from "react";
142
+ import { ErrorBoundary } from "react-error-boundary";
143
+ import { Loading } from "../../Components/Loading";
144
+ import { ChartRender } from "../../Plugins/chart/ChartRender";
145
+ var extractTextContent = function extractTextContent1(children) {
146
+ var _children_props;
147
+ if (typeof children === 'string') return children;
148
+ if (typeof children === 'number') return String(children);
149
+ if (Array.isArray(children)) return children.map(extractTextContent).join('');
150
+ if (/*#__PURE__*/ React.isValidElement(children) && ((_children_props = children.props) === null || _children_props === void 0 ? void 0 : _children_props.children)) {
151
+ return extractTextContent(children.props.children);
152
+ }
153
+ return '';
154
+ };
155
+ /**
156
+ * 解析图表 JSON 配置。
157
+ * 支持两种格式:
158
+ * 1. 完整格式:{ config: [...], dataSource: [...], columns: [...] }
159
+ * 2. 简单格式:{ chartType, x, y, data: [...] }
160
+ */ var parseChartData = function parseChartData(code) {
161
+ try {
162
+ var parsed = JSON.parse(code.trim());
163
+ if (!parsed || (typeof parsed === "undefined" ? "undefined" : _type_of(parsed)) !== 'object') return null;
164
+ if (Array.isArray(parsed)) {
165
+ return {
166
+ config: parsed
167
+ };
168
+ }
169
+ return parsed;
170
+ } catch (unused) {
171
+ return null;
172
+ }
173
+ };
174
+ /** 图表渲染失败时用相同 props 重试一次(销毁再重建) */ var ChartWithRetry = function ChartWithRetry(props) {
175
+ var index = props.index, columnLength = props.columnLength, setColumnLength = props.setColumnLength, chartType = props.chartType, chartDataItems = props.chartDataItems, rest = props.rest, height = props.height, x = props.x, y = props.y, columns = props.columns;
176
+ var _useState = _sliced_to_array(useState(0), 2), retryKey = _useState[0], setRetryKey = _useState[1];
177
+ var handleChartError = React.useCallback(function(error, info) {
178
+ console.error('[MarkdownRenderer ChartBlockRenderer] 渲染失败:', {
179
+ chartType: chartType,
180
+ title: rest === null || rest === void 0 ? void 0 : rest.title,
181
+ x: x,
182
+ y: y,
183
+ dataSourceLength: chartDataItems.length,
184
+ columnsLength: columns.length,
185
+ error: error.message,
186
+ stack: error.stack,
187
+ componentStack: info.componentStack
188
+ });
189
+ setRetryKey(function(k) {
190
+ return k === 0 ? 1 : k;
191
+ });
192
+ }, [
193
+ chartType,
194
+ rest === null || rest === void 0 ? void 0 : rest.title,
195
+ x,
196
+ y,
197
+ chartDataItems.length,
198
+ columns.length
199
+ ]);
200
+ var handleRetry = React.useCallback(function() {
201
+ setRetryKey(function(k) {
202
+ return k + 1;
203
+ });
204
+ }, []);
205
+ var chartFallback = /*#__PURE__*/ React.createElement("div", {
206
+ style: {
207
+ padding: 12,
208
+ color: '#999',
209
+ fontSize: 12,
210
+ display: 'flex',
211
+ flexDirection: 'column',
212
+ alignItems: 'flex-start',
213
+ gap: 8
214
+ }
215
+ }, /*#__PURE__*/ React.createElement("span", null, "Chart: ", (rest === null || rest === void 0 ? void 0 : rest.title) || chartType), /*#__PURE__*/ React.createElement(Button, {
216
+ type: "link",
217
+ size: "small",
218
+ onClick: handleRetry
219
+ }, "重新渲染"));
220
+ return /*#__PURE__*/ React.createElement("div", {
221
+ style: {
222
+ margin: 'auto',
223
+ minWidth: 0,
224
+ width: columnLength === 1 ? '100%' : "calc(".concat(100 / columnLength, "% - 8px)"),
225
+ maxWidth: '100%',
226
+ flex: 1,
227
+ userSelect: 'none'
228
+ }
229
+ }, /*#__PURE__*/ React.createElement(ErrorBoundary, {
230
+ key: retryKey,
231
+ fallback: chartFallback,
232
+ onError: handleChartError
233
+ }, /*#__PURE__*/ React.createElement(ChartRender, {
234
+ chartType: chartType,
235
+ chartData: chartDataItems,
236
+ columnLength: columnLength,
237
+ onColumnLengthChange: setColumnLength,
238
+ title: rest === null || rest === void 0 ? void 0 : rest.title,
239
+ dataTime: rest === null || rest === void 0 ? void 0 : rest.dataTime,
240
+ groupBy: rest === null || rest === void 0 ? void 0 : rest.groupBy,
241
+ filterBy: rest === null || rest === void 0 ? void 0 : rest.filterBy,
242
+ colorLegend: rest === null || rest === void 0 ? void 0 : rest.colorLegend,
243
+ config: {
244
+ height: height,
245
+ x: x,
246
+ y: y,
247
+ columns: columns,
248
+ index: index,
249
+ rest: rest
250
+ }
251
+ })));
252
+ };
253
+ /**
254
+ * 图表渲染器——复用 MarkdownEditor 的 ChartRender 组件。
255
+ *
256
+ * 在 MarkdownEditor 中,图表由 HTML 注释(配置)+ 表格(数据)组合而成,
257
+ * Slate 解析器将其合并为 chart 节点(otherProps.config / dataSource / columns)。
258
+ *
259
+ * 在 MarkdownRenderer 中,chart 代码块的内容是序列化后的 JSON,
260
+ * 包含 config、dataSource、columns 等字段。
261
+ */ export var ChartBlockRenderer = function ChartBlockRenderer(props) {
262
+ var children = props.children, className = props.className;
263
+ var getPrefixCls = React.useContext(ConfigProvider.ConfigContext).getPrefixCls;
264
+ var prefixCls = getPrefixCls('agentic-md-editor');
265
+ var containerRef = useRef(null);
266
+ var _useState = _sliced_to_array(useState(2), 2), columnLength = _useState[0], setColumnLength = _useState[1];
267
+ var _useState1 = _sliced_to_array(useState(false), 2), mounted = _useState1[0], setMounted = _useState1[1];
268
+ var code = extractTextContent(children);
269
+ var chartData = useMemo(function() {
270
+ return parseChartData(code);
271
+ }, [
272
+ code
273
+ ]);
274
+ useEffect(function() {
275
+ // 延迟一帧渲染图表,确保容器已挂载到 DOM 且有正确的宽度
276
+ // 解决 recharts ResponsiveContainer 在零宽容器中崩溃的问题
277
+ var raf = requestAnimationFrame(function() {
278
+ setMounted(true);
279
+ });
280
+ return function() {
281
+ return cancelAnimationFrame(raf);
282
+ };
283
+ }, []);
284
+ useEffect(function() {
285
+ if (!mounted) return;
286
+ var updateWidth = function updateWidth() {
287
+ var _containerRef_current;
288
+ var width = ((_containerRef_current = containerRef.current) === null || _containerRef_current === void 0 ? void 0 : _containerRef_current.clientWidth) || 400;
289
+ var configs = (chartData === null || chartData === void 0 ? void 0 : chartData.config) ? Array.isArray(chartData.config) ? chartData.config : [
290
+ chartData.config
291
+ ] : [
292
+ chartData
293
+ ];
294
+ setColumnLength(Math.min(Math.floor(Math.max(width, 256) / 256), configs.length));
295
+ };
296
+ updateWidth();
297
+ window.addEventListener('resize', updateWidth);
298
+ return function() {
299
+ return window.removeEventListener('resize', updateWidth);
300
+ };
301
+ }, [
302
+ chartData,
303
+ mounted
304
+ ]);
305
+ if (!chartData) {
306
+ return /*#__PURE__*/ React.createElement("div", {
307
+ className: clsx("".concat(prefixCls, "-chart-block"), "".concat(prefixCls, "-chart-block--error"), className)
308
+ }, /*#__PURE__*/ React.createElement("pre", {
309
+ style: {
310
+ margin: 0,
311
+ padding: 12,
312
+ fontSize: 12
313
+ }
314
+ }, code));
315
+ }
316
+ var configs = Array.isArray(chartData.config) ? chartData.config : chartData.config ? [
317
+ chartData.config
318
+ ] : [
319
+ chartData
320
+ ];
321
+ var dataSource = chartData.dataSource || chartData.data || [];
322
+ var columns = chartData.columns || [];
323
+ return /*#__PURE__*/ React.createElement("div", {
324
+ ref: containerRef,
325
+ "data-be": "chart",
326
+ className: clsx(className),
327
+ style: {
328
+ flex: 1,
329
+ minWidth: 0,
330
+ width: '100%',
331
+ maxWidth: '100%',
332
+ margin: '1em 0',
333
+ overflow: 'hidden'
334
+ }
335
+ }, !mounted ? /*#__PURE__*/ React.createElement("div", {
336
+ style: {
337
+ padding: 12
338
+ }
339
+ }, /*#__PURE__*/ React.createElement(Loading, null)) : /*#__PURE__*/ React.createElement("div", {
340
+ style: {
341
+ display: 'flex',
342
+ flexWrap: 'wrap',
343
+ gap: 8,
344
+ userSelect: 'none'
345
+ }
346
+ }, configs.map(function(cfg, index) {
347
+ var _containerRef_current;
348
+ var chartType = cfg.chartType, x = cfg.x, y = cfg.y, rest = _object_without_properties(cfg, [
349
+ "chartType",
350
+ "x",
351
+ "y"
352
+ ]);
353
+ if (!chartType) {
354
+ return /*#__PURE__*/ React.createElement("div", {
355
+ key: index,
356
+ style: {
357
+ padding: 12,
358
+ color: '#999'
359
+ }
360
+ }, /*#__PURE__*/ React.createElement(Loading, null));
361
+ }
362
+ var chartDataItems = dataSource.map(function(item) {
363
+ var _chartType = item.chartType, rowData = _object_without_properties(item, [
364
+ "chartType"
365
+ ]);
366
+ var row = _object_spread_props(_object_spread({}, rowData), {
367
+ column_list: Object.keys(rowData)
368
+ });
369
+ if (x && row[x] !== undefined) {
370
+ var num = Number(row[x]);
371
+ if (!isNaN(num)) row[x] = num;
372
+ }
373
+ if (y && row[y] !== undefined) {
374
+ var num1 = Number(row[y]);
375
+ if (!isNaN(num1)) row[y] = num1;
376
+ }
377
+ return row;
378
+ });
379
+ var height = Math.min(400, ((_containerRef_current = containerRef.current) === null || _containerRef_current === void 0 ? void 0 : _containerRef_current.clientWidth) || 400);
380
+ return /*#__PURE__*/ React.createElement(ChartWithRetry, {
381
+ key: index,
382
+ index: index,
383
+ columnLength: columnLength,
384
+ setColumnLength: setColumnLength,
385
+ chartType: chartType,
386
+ chartDataItems: chartDataItems,
387
+ rest: rest,
388
+ height: height,
389
+ x: x,
390
+ y: y,
391
+ columns: columns
392
+ });
393
+ })));
394
+ };
395
+ ChartBlockRenderer.displayName = 'ChartBlockRenderer';
@@ -0,0 +1,7 @@
1
+ import React from 'react';
2
+ import type { RendererBlockProps } from '../types';
3
+ /**
4
+ * 代码块渲染器——复用 MarkdownEditor 的 CodeContainer 和样式体系。
5
+ * 不依赖 Slate 上下文,提供与 CodeRenderer readonly 模式一致的视觉效果。
6
+ */
7
+ export declare const CodeBlockRenderer: React.FC<RendererBlockProps>;
@@ -0,0 +1,218 @@
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
+ function _iterable_to_array_limit(arr, i) {
10
+ var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"];
11
+ if (_i == null) return;
12
+ var _arr = [];
13
+ var _n = true;
14
+ var _d = false;
15
+ var _s, _e;
16
+ try {
17
+ for(_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true){
18
+ _arr.push(_s.value);
19
+ if (i && _arr.length === i) break;
20
+ }
21
+ } catch (err) {
22
+ _d = true;
23
+ _e = err;
24
+ } finally{
25
+ try {
26
+ if (!_n && _i["return"] != null) _i["return"]();
27
+ } finally{
28
+ if (_d) throw _e;
29
+ }
30
+ }
31
+ return _arr;
32
+ }
33
+ function _non_iterable_rest() {
34
+ throw new TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
35
+ }
36
+ function _sliced_to_array(arr, i) {
37
+ return _array_with_holes(arr) || _iterable_to_array_limit(arr, i) || _unsupported_iterable_to_array(arr, i) || _non_iterable_rest();
38
+ }
39
+ function _unsupported_iterable_to_array(o, minLen) {
40
+ if (!o) return;
41
+ if (typeof o === "string") return _array_like_to_array(o, minLen);
42
+ var n = Object.prototype.toString.call(o).slice(8, -1);
43
+ if (n === "Object" && o.constructor) n = o.constructor.name;
44
+ if (n === "Map" || n === "Set") return Array.from(n);
45
+ if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _array_like_to_array(o, minLen);
46
+ }
47
+ import { ChevronsUpDown, Copy, Moon } from "@sofa-design/icons";
48
+ import copy from "copy-to-clipboard";
49
+ import React, { useCallback, useContext, useMemo, useState } from "react";
50
+ import { ActionIconBox } from "../../Components/ActionIconBox";
51
+ import { I18nContext } from "../../I18n";
52
+ import { CodeContainer } from "../../Plugins/code/components/CodeContainer";
53
+ import { LoadImage } from "../../Plugins/code/components/LoadImage";
54
+ import { langIconMap } from "../../Plugins/code/langIconMap";
55
+ var extractTextContent = function extractTextContent1(children) {
56
+ var _children_props;
57
+ if (typeof children === 'string') return children;
58
+ if (typeof children === 'number') return String(children);
59
+ if (Array.isArray(children)) return children.map(extractTextContent).join('');
60
+ if (/*#__PURE__*/ React.isValidElement(children) && ((_children_props = children.props) === null || _children_props === void 0 ? void 0 : _children_props.children)) {
61
+ return extractTextContent(children.props.children);
62
+ }
63
+ return '';
64
+ };
65
+ /**
66
+ * 代码块渲染器——复用 MarkdownEditor 的 CodeContainer 和样式体系。
67
+ * 不依赖 Slate 上下文,提供与 CodeRenderer readonly 模式一致的视觉效果。
68
+ */ export var CodeBlockRenderer = function CodeBlockRenderer(props) {
69
+ var _i18n_locale, _i18n_locale1, _i18n_locale2;
70
+ var language = props.language, children = props.children;
71
+ var _useState = _sliced_to_array(useState('github'), 2), theme = _useState[0], setTheme = _useState[1];
72
+ var _useState1 = _sliced_to_array(useState(true), 2), isExpanded = _useState1[0], setIsExpanded = _useState1[1];
73
+ var i18n = useContext(I18nContext);
74
+ var code = useMemo(function() {
75
+ return extractTextContent(children);
76
+ }, [
77
+ children
78
+ ]);
79
+ var fakeElement = useMemo(function() {
80
+ return {
81
+ type: 'code',
82
+ language: language || '',
83
+ value: code,
84
+ children: [
85
+ {
86
+ text: code
87
+ }
88
+ ]
89
+ };
90
+ }, [
91
+ language,
92
+ code
93
+ ]);
94
+ var handleCopy = useCallback(function() {
95
+ try {
96
+ copy(code);
97
+ } catch (error) {
98
+ console.error('复制失败:', error);
99
+ }
100
+ }, [
101
+ code
102
+ ]);
103
+ var langIcon = langIconMap.get((language === null || language === void 0 ? void 0 : language.toLowerCase()) || '');
104
+ return /*#__PURE__*/ React.createElement(CodeContainer, {
105
+ element: fakeElement,
106
+ showBorder: false,
107
+ hide: false,
108
+ onEditorClick: function onEditorClick() {},
109
+ theme: theme
110
+ }, /*#__PURE__*/ React.createElement("div", {
111
+ "data-testid": "code-toolbar",
112
+ contentEditable: false,
113
+ style: {
114
+ borderTopLeftRadius: 'inherit',
115
+ borderTopRightRadius: 'inherit',
116
+ backgroundColor: 'transparent',
117
+ paddingLeft: '0.25em',
118
+ paddingRight: '0.25em',
119
+ width: '100%',
120
+ position: 'sticky',
121
+ left: 0,
122
+ top: 0,
123
+ fontSize: '1em',
124
+ font: 'var(--font-text-h6-base)',
125
+ color: 'inherit',
126
+ justifyContent: 'space-between',
127
+ zIndex: 50,
128
+ height: '38px',
129
+ display: 'flex',
130
+ alignItems: 'center',
131
+ padding: '9px 12px',
132
+ gap: '16px',
133
+ alignSelf: 'stretch',
134
+ boxSizing: 'border-box',
135
+ userSelect: 'none',
136
+ borderBottom: isExpanded ? theme === 'chaos' ? '1px solid #161616' : '1px solid var(--color-gray-border-light)' : 'none'
137
+ }
138
+ }, /*#__PURE__*/ React.createElement("div", {
139
+ style: {
140
+ display: 'flex',
141
+ alignItems: 'center',
142
+ gap: 8
143
+ }
144
+ }, /*#__PURE__*/ React.createElement("div", {
145
+ style: {
146
+ display: 'flex',
147
+ alignItems: 'center',
148
+ cursor: 'pointer',
149
+ gap: 4,
150
+ font: 'inherit',
151
+ color: 'inherit',
152
+ userSelect: 'none'
153
+ }
154
+ }, langIcon && /*#__PURE__*/ React.createElement("div", {
155
+ style: {
156
+ height: '1em',
157
+ width: '1em',
158
+ fontSize: '16px',
159
+ display: 'flex'
160
+ }
161
+ }, /*#__PURE__*/ React.createElement(LoadImage, {
162
+ style: {
163
+ height: '1em',
164
+ width: '1em'
165
+ },
166
+ src: langIcon
167
+ })), /*#__PURE__*/ React.createElement("span", null, language || 'plain text'))), /*#__PURE__*/ React.createElement("div", {
168
+ style: {
169
+ display: 'flex',
170
+ gap: 5,
171
+ alignItems: 'center'
172
+ }
173
+ }, /*#__PURE__*/ React.createElement(ActionIconBox, {
174
+ title: (i18n === null || i18n === void 0 ? void 0 : (_i18n_locale = i18n.locale) === null || _i18n_locale === void 0 ? void 0 : _i18n_locale.theme) || '主题',
175
+ theme: theme === 'chaos' ? 'dark' : 'light',
176
+ onClick: function onClick() {
177
+ return setTheme(theme === 'github' ? 'chaos' : 'github');
178
+ }
179
+ }, /*#__PURE__*/ React.createElement(Moon, null)), /*#__PURE__*/ React.createElement(ActionIconBox, {
180
+ theme: theme === 'chaos' ? 'dark' : 'light',
181
+ title: (i18n === null || i18n === void 0 ? void 0 : (_i18n_locale1 = i18n.locale) === null || _i18n_locale1 === void 0 ? void 0 : _i18n_locale1.copy) || '复制',
182
+ style: {
183
+ fontSize: '1em',
184
+ lineHeight: '1.75em',
185
+ marginLeft: '0.125em'
186
+ },
187
+ onClick: handleCopy
188
+ }, /*#__PURE__*/ React.createElement(Copy, null)), /*#__PURE__*/ React.createElement(ActionIconBox, {
189
+ title: (i18n === null || i18n === void 0 ? void 0 : (_i18n_locale2 = i18n.locale) === null || _i18n_locale2 === void 0 ? void 0 : _i18n_locale2.expandCollapse) || '展开/收起',
190
+ theme: theme === 'chaos' ? 'dark' : 'light',
191
+ onClick: function onClick() {
192
+ return setIsExpanded(!isExpanded);
193
+ }
194
+ }, /*#__PURE__*/ React.createElement(ChevronsUpDown, null)))), /*#__PURE__*/ React.createElement("div", {
195
+ className: "code-editor-content",
196
+ style: {
197
+ borderBottomLeftRadius: 'inherit',
198
+ borderBottomRightRadius: 'inherit',
199
+ display: isExpanded ? 'block' : 'none'
200
+ }
201
+ }, /*#__PURE__*/ React.createElement("div", {
202
+ style: {
203
+ height: '100%',
204
+ width: '100%',
205
+ borderRadius: 'inherit',
206
+ padding: '12px 16px',
207
+ overflow: 'auto',
208
+ fontSize: '0.9em',
209
+ lineHeight: 1.6,
210
+ fontFamily: "'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, Courier, monospace",
211
+ whiteSpace: 'pre-wrap',
212
+ wordBreak: 'break-all'
213
+ }
214
+ }, /*#__PURE__*/ React.createElement("code", {
215
+ className: language ? "language-".concat(language) : undefined
216
+ }, children))));
217
+ };
218
+ CodeBlockRenderer.displayName = 'CodeBlockRenderer';
@@ -0,0 +1,7 @@
1
+ import React from 'react';
2
+ import type { RendererBlockProps } from '../types';
3
+ /**
4
+ * Mermaid 图表渲染器——复用 MarkdownEditor 的 MermaidRendererImpl。
5
+ * 将代码块文本包装为 CodeNode 格式后直接传递给已有的 Mermaid 渲染组件。
6
+ */
7
+ export declare const MermaidBlockRenderer: React.FC<RendererBlockProps>;
@@ -0,0 +1,43 @@
1
+ import React, { useMemo } from "react";
2
+ import { MermaidRendererImpl } from "../../Plugins/mermaid/MermaidRendererImpl";
3
+ var extractTextContent = function extractTextContent1(children) {
4
+ var _children_props;
5
+ if (typeof children === 'string') return children;
6
+ if (typeof children === 'number') return String(children);
7
+ if (Array.isArray(children)) return children.map(extractTextContent).join('');
8
+ if (/*#__PURE__*/ React.isValidElement(children) && ((_children_props = children.props) === null || _children_props === void 0 ? void 0 : _children_props.children)) {
9
+ return extractTextContent(children.props.children);
10
+ }
11
+ return '';
12
+ };
13
+ /**
14
+ * Mermaid 图表渲染器——复用 MarkdownEditor 的 MermaidRendererImpl。
15
+ * 将代码块文本包装为 CodeNode 格式后直接传递给已有的 Mermaid 渲染组件。
16
+ */ export var MermaidBlockRenderer = function MermaidBlockRenderer(props) {
17
+ var children = props.children;
18
+ var code = extractTextContent(children);
19
+ var fakeElement = useMemo(function() {
20
+ return {
21
+ type: 'code',
22
+ language: 'mermaid',
23
+ value: code,
24
+ children: [
25
+ {
26
+ text: code
27
+ }
28
+ ]
29
+ };
30
+ }, [
31
+ code
32
+ ]);
33
+ if (!code.trim()) return null;
34
+ return /*#__PURE__*/ React.createElement("div", {
35
+ "data-be": "mermaid",
36
+ style: {
37
+ margin: '1em 0'
38
+ }
39
+ }, /*#__PURE__*/ React.createElement(MermaidRendererImpl, {
40
+ element: fakeElement
41
+ }));
42
+ };
43
+ MermaidBlockRenderer.displayName = 'MermaidBlockRenderer';
@@ -0,0 +1,15 @@
1
+ import React from 'react';
2
+ import type { RendererBlockProps } from '../types';
3
+ /**
4
+ * Schema / Apaasify 渲染器
5
+ * 对齐 MarkdownEditor 的 ReadonlySchema 组件。
6
+ *
7
+ * 处理以下代码块语言:
8
+ * - ```schema → SchemaRenderer
9
+ * - ```apaasify → SchemaRenderer / 自定义 render
10
+ * - ```apassify → 同 apaasify(兼容旧版)
11
+ * - ```agentar-card → SchemaRenderer
12
+ */
13
+ export declare const SchemaBlockRenderer: React.FC<RendererBlockProps & {
14
+ apaasifyRender?: (value: any) => React.ReactNode;
15
+ }>;