@ant-design/agentic-ui 2.29.59 → 2.30.1
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/List/index.d.ts +11 -0
- package/dist/Bubble/List/index.js +13 -1
- package/dist/Bubble/MessagesContent/EXCEPTION.js +11 -2
- package/dist/Bubble/MessagesContent/MarkdownPreview.js +34 -4
- package/dist/Bubble/MessagesContent/index.js +39 -10
- package/dist/Bubble/MessagesContent/style.js +55 -22
- package/dist/Bubble/UserBubble.js +3 -1
- package/dist/Bubble/type.d.ts +11 -0
- package/dist/Hooks/useLanguage.d.ts +1 -0
- package/dist/I18n/locales.d.ts +1 -0
- package/dist/I18n/locales.js +5 -3
- package/dist/MarkdownEditor/BaseMarkdownEditor.js +37 -5
- package/dist/MarkdownEditor/editor/elements/AgenticUiBlocks/AgenticUiTaskBlock.d.ts +4 -0
- package/dist/MarkdownEditor/editor/elements/AgenticUiBlocks/AgenticUiTaskBlock.js +74 -0
- package/dist/MarkdownEditor/editor/elements/AgenticUiBlocks/AgenticUiToolUseBarBlock.d.ts +4 -0
- package/dist/MarkdownEditor/editor/elements/AgenticUiBlocks/AgenticUiToolUseBarBlock.js +114 -0
- package/dist/MarkdownEditor/editor/elements/AgenticUiBlocks/agenticUiEmbedUtils.d.ts +20 -0
- package/dist/MarkdownEditor/editor/elements/AgenticUiBlocks/agenticUiEmbedUtils.js +169 -0
- package/dist/MarkdownEditor/editor/elements/Table/EditableTable.d.ts +11 -0
- package/dist/MarkdownEditor/editor/elements/Table/EditableTable.js +207 -0
- package/dist/MarkdownEditor/editor/elements/Table/Table.js +10 -276
- package/dist/MarkdownEditor/editor/elements/Table/TableCellIndex/index.js +7 -227
- package/dist/MarkdownEditor/editor/elements/Table/TableCellIndexSpacer/index.js +20 -229
- package/dist/MarkdownEditor/editor/elements/Table/commands/tableCommands.d.ts +9 -0
- package/dist/MarkdownEditor/editor/elements/Table/commands/tableCommands.js +242 -0
- package/dist/MarkdownEditor/editor/elements/Table/utils/editableTableWidth.d.ts +20 -0
- package/dist/MarkdownEditor/editor/elements/Table/utils/editableTableWidth.js +60 -0
- package/dist/MarkdownEditor/editor/elements/Table/utils/useEditableTableColWidths.d.ts +6 -0
- package/dist/MarkdownEditor/editor/elements/Table/utils/useEditableTableColWidths.js +20 -0
- package/dist/MarkdownEditor/editor/elements/Table/utils/useEditableTableContentWidth.d.ts +10 -0
- package/dist/MarkdownEditor/editor/elements/Table/utils/useEditableTableContentWidth.js +103 -0
- package/dist/MarkdownEditor/editor/elements/index.js +7 -0
- package/dist/MarkdownEditor/editor/parser/parse/parseCode.js +33 -2
- package/dist/MarkdownEditor/editor/parser/parserSlateNodeToMarkdown.js +3 -0
- package/dist/MarkdownEditor/editor/plugins/handlePaste.js +4 -1
- package/dist/MarkdownEditor/plugin.d.ts +15 -0
- package/dist/MarkdownEditor/style.js +258 -326
- package/dist/MarkdownEditor/types.d.ts +14 -0
- package/dist/MarkdownInputField/AttachmentButton/AttachmentButtonPopover.js +1 -1
- package/dist/MarkdownInputField/AttachmentButton/AttachmentFileList/AttachmentFileIcon.js +2 -2
- package/dist/MarkdownInputField/AttachmentButton/AttachmentFileList/AttachmentFileListItem.js +11 -8
- package/dist/MarkdownInputField/AttachmentButton/index.js +7 -2
- package/dist/MarkdownInputField/AttachmentButton/types.d.ts +5 -1
- package/dist/MarkdownInputField/AttachmentButton/utils.d.ts +7 -0
- package/dist/MarkdownInputField/AttachmentButton/utils.js +9 -1
- package/dist/MarkdownInputField/FileMapView/FileMapViewItem.js +10 -5
- package/dist/MarkdownInputField/FileUploadManager/index.d.ts +9 -0
- package/dist/MarkdownInputField/FileUploadManager/index.js +20 -4
- package/dist/MarkdownInputField/MarkdownInputField.js +5 -3
- package/dist/MarkdownInputField/SendActions/index.d.ts +9 -0
- package/dist/MarkdownInputField/SendActions/index.js +3 -2
- package/dist/MarkdownInputField/hooks/useMarkdownInputFieldRefs.js +10 -3
- package/dist/MarkdownInputField/utils/renderHelpers.d.ts +8 -1
- package/dist/MarkdownInputField/utils/renderHelpers.js +5 -1
- package/dist/MarkdownRenderer/AnimationText.d.ts +19 -0
- package/dist/MarkdownRenderer/AnimationText.js +226 -0
- package/dist/MarkdownRenderer/CharacterQueue.d.ts +36 -0
- package/dist/MarkdownRenderer/CharacterQueue.js +188 -0
- package/dist/MarkdownRenderer/MarkdownRenderer.d.ts +13 -0
- package/dist/MarkdownRenderer/MarkdownRenderer.js +362 -0
- package/dist/MarkdownRenderer/index.d.ts +11 -0
- package/dist/MarkdownRenderer/index.js +9 -0
- package/dist/MarkdownRenderer/renderers/AgenticUiTaskBlockRenderer.d.ts +6 -0
- package/dist/MarkdownRenderer/renderers/AgenticUiTaskBlockRenderer.js +66 -0
- package/dist/MarkdownRenderer/renderers/AgenticUiToolUseBarBlockRenderer.d.ts +6 -0
- package/dist/MarkdownRenderer/renderers/AgenticUiToolUseBarBlockRenderer.js +134 -0
- package/dist/MarkdownRenderer/renderers/ChartRenderer.d.ts +12 -0
- package/dist/MarkdownRenderer/renderers/ChartRenderer.js +395 -0
- package/dist/MarkdownRenderer/renderers/CodeRenderer.d.ts +7 -0
- package/dist/MarkdownRenderer/renderers/CodeRenderer.js +218 -0
- package/dist/MarkdownRenderer/renderers/MermaidRenderer.d.ts +7 -0
- package/dist/MarkdownRenderer/renderers/MermaidRenderer.js +43 -0
- package/dist/MarkdownRenderer/renderers/SchemaRenderer.d.ts +15 -0
- package/dist/MarkdownRenderer/renderers/SchemaRenderer.js +115 -0
- package/dist/MarkdownRenderer/renderers/index.d.ts +4 -0
- package/dist/MarkdownRenderer/renderers/index.js +4 -0
- package/dist/MarkdownRenderer/style.d.ts +16 -0
- package/dist/MarkdownRenderer/style.js +47 -0
- package/dist/MarkdownRenderer/types.d.ts +74 -0
- package/dist/MarkdownRenderer/types.js +1 -0
- package/dist/MarkdownRenderer/useMarkdownToReact.d.ts +23 -0
- package/dist/MarkdownRenderer/useMarkdownToReact.js +1241 -0
- package/dist/MarkdownRenderer/useStreaming.d.ts +29 -0
- package/dist/MarkdownRenderer/useStreaming.js +399 -0
- package/dist/Plugins/chart/AreaChart/index.js +4 -2
- package/dist/Plugins/chart/ChartRender.js +1 -0
- package/dist/Plugins/chart/LineChart/index.js +4 -2
- package/dist/Plugins/chart/components/ChartContainer/ChartErrorBoundary.d.ts +8 -0
- package/dist/Plugins/chart/components/ChartContainer/ChartErrorBoundary.js +31 -6
- package/dist/Plugins/chart/index.js +3 -1
- package/dist/Plugins/mermaid/style.js +0 -3
- package/dist/TaskList/TaskList.js +3 -12
- package/dist/TaskList/components/TaskListItem.js +3 -12
- package/dist/ThoughtChainList/ThoughtChainListItem.js +2 -4
- package/dist/ThoughtChainList/index.js +4 -21
- package/dist/ToolUseBarThink/index.js +20 -59
- package/dist/index.d.ts +1 -0
- package/dist/index.js +2 -0
- package/package.json +2 -1
|
@@ -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
|
+
}>;
|