@ant-design/agentic-ui 2.30.10 → 2.30.12

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 (67) hide show
  1. package/dist/Bubble/MessagesContent/style.js +3 -1
  2. package/dist/Bubble/style.js +35 -13
  3. package/dist/ChatLayout/index.js +9 -1
  4. package/dist/ChatLayout/style.js +16 -13
  5. package/dist/Components/ActionIconBox/index.js +4 -0
  6. package/dist/Components/Button/IconButton/style.js +1 -1
  7. package/dist/Components/Button/ToggleButton/style.js +1 -1
  8. package/dist/History/components/HistoryList.d.ts +2 -12
  9. package/dist/History/components/HistoryList.js +48 -43
  10. package/dist/History/style.d.ts +4 -0
  11. package/dist/History/style.js +3 -2
  12. package/dist/Hooks/useAutoScroll.js +38 -14
  13. package/dist/Hooks/useLanguage.d.ts +1 -0
  14. package/dist/I18n/locales.d.ts +1 -0
  15. package/dist/I18n/locales.js +2 -0
  16. package/dist/MarkdownEditor/BaseMarkdownEditor.js +2 -1
  17. package/dist/MarkdownEditor/editor/Editor.js +22 -6
  18. package/dist/MarkdownEditor/editor/elements/AgenticUiBlocks/AgenticUiFileMapBlock.d.ts +4 -0
  19. package/dist/MarkdownEditor/editor/elements/AgenticUiBlocks/AgenticUiFileMapBlock.js +83 -0
  20. package/dist/MarkdownEditor/editor/elements/AgenticUiBlocks/agenticUiEmbedUtils.d.ts +10 -0
  21. package/dist/MarkdownEditor/editor/elements/AgenticUiBlocks/agenticUiEmbedUtils.js +44 -0
  22. package/dist/MarkdownEditor/editor/elements/Paragraph/index.js +27 -5
  23. package/dist/MarkdownEditor/editor/elements/index.js +3 -0
  24. package/dist/MarkdownEditor/editor/parser/parse/parseCode.js +2 -1
  25. package/dist/MarkdownEditor/editor/parser/parserSlateNodeToMarkdown.js +1 -0
  26. package/dist/MarkdownEditor/editor/plugins/handlePaste.js +2 -1
  27. package/dist/MarkdownEditor/editor/style.js +7 -3
  28. package/dist/MarkdownEditor/editor/tools/JinjaTemplatePanel/index.js +2 -2
  29. package/dist/MarkdownEditor/types.d.ts +10 -0
  30. package/dist/MarkdownInputField/AttachmentButton/AttachmentFileList/AttachmentFileIcon.js +1 -1
  31. package/dist/MarkdownInputField/AttachmentButton/AttachmentFileList/style.js +3 -3
  32. package/dist/MarkdownInputField/FileMapView/style.js +3 -2
  33. package/dist/MarkdownInputField/SkillModeBar/style.js +1 -1
  34. package/dist/MarkdownInputField/style.js +1 -1
  35. package/dist/MarkdownRenderer/MarkdownRenderer.js +10 -2
  36. package/dist/MarkdownRenderer/index.d.ts +4 -1
  37. package/dist/MarkdownRenderer/index.js +3 -0
  38. package/dist/MarkdownRenderer/markdownReactShared.d.ts +35 -28
  39. package/dist/MarkdownRenderer/markdownReactShared.js +179 -58
  40. package/dist/MarkdownRenderer/renderers/AgenticUiFileMapBlockRenderer.d.ts +6 -0
  41. package/dist/MarkdownRenderer/renderers/AgenticUiFileMapBlockRenderer.js +79 -0
  42. package/dist/MarkdownRenderer/renderers/index.d.ts +3 -0
  43. package/dist/MarkdownRenderer/renderers/index.js +3 -0
  44. package/dist/MarkdownRenderer/streaming/useStreamingMarkdownReact.js +3 -2
  45. package/dist/MarkdownRenderer/types.d.ts +21 -0
  46. package/dist/MarkdownRenderer/useStreaming.js +40 -13
  47. package/dist/Plugins/chart/components/ChartContainer/ChartErrorBoundary.d.ts +2 -0
  48. package/dist/Plugins/code/components/CodeRenderer.js +22 -6
  49. package/dist/Plugins/code/components/CodeToolbar.d.ts +2 -0
  50. package/dist/Plugins/code/components/CodeToolbar.js +11 -4
  51. package/dist/Plugins/code/hooks/useToolbarConfig.d.ts +3 -1
  52. package/dist/Plugins/code/hooks/useToolbarConfig.js +5 -3
  53. package/dist/Plugins/code/utils/index.d.ts +1 -0
  54. package/dist/Plugins/code/utils/index.js +1 -0
  55. package/dist/Plugins/code/utils/localPreview.d.ts +12 -0
  56. package/dist/Plugins/code/utils/localPreview.js +190 -0
  57. package/dist/ThoughtChainList/style.js +1 -1
  58. package/dist/ToolUseBarThink/style.js +1 -1
  59. package/dist/Workspace/Browser/index.d.ts +6 -0
  60. package/dist/Workspace/Browser/index.js +22 -13
  61. package/dist/Workspace/Browser/style.js +14 -15
  62. package/dist/Workspace/File/FileComponent.js +4 -4
  63. package/dist/Workspace/File/PreviewComponent.js +4 -4
  64. package/dist/Workspace/File/style.js +33 -39
  65. package/dist/Workspace/RealtimeFollow/style.js +78 -85
  66. package/dist/Workspace/style.js +41 -53
  67. package/package.json +1 -2
@@ -0,0 +1,83 @@
1
+ function _define_property(obj, key, value) {
2
+ if (key in obj) {
3
+ Object.defineProperty(obj, key, {
4
+ value: value,
5
+ enumerable: true,
6
+ configurable: true,
7
+ writable: true
8
+ });
9
+ } else {
10
+ obj[key] = value;
11
+ }
12
+ return obj;
13
+ }
14
+ function _object_spread(target) {
15
+ for(var i = 1; i < arguments.length; i++){
16
+ var source = arguments[i] != null ? arguments[i] : {};
17
+ var ownKeys = Object.keys(source);
18
+ if (typeof Object.getOwnPropertySymbols === "function") {
19
+ ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function(sym) {
20
+ return Object.getOwnPropertyDescriptor(source, sym).enumerable;
21
+ }));
22
+ }
23
+ ownKeys.forEach(function(key) {
24
+ _define_property(target, key, source[key]);
25
+ });
26
+ }
27
+ return target;
28
+ }
29
+ function ownKeys(object, enumerableOnly) {
30
+ var keys = Object.keys(object);
31
+ if (Object.getOwnPropertySymbols) {
32
+ var symbols = Object.getOwnPropertySymbols(object);
33
+ if (enumerableOnly) {
34
+ symbols = symbols.filter(function(sym) {
35
+ return Object.getOwnPropertyDescriptor(object, sym).enumerable;
36
+ });
37
+ }
38
+ keys.push.apply(keys, symbols);
39
+ }
40
+ return keys;
41
+ }
42
+ function _object_spread_props(target, source) {
43
+ source = source != null ? source : {};
44
+ if (Object.getOwnPropertyDescriptors) {
45
+ Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));
46
+ } else {
47
+ ownKeys(Object(source)).forEach(function(key) {
48
+ Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
49
+ });
50
+ }
51
+ return target;
52
+ }
53
+ import React from "react";
54
+ import { FileMapView } from "../../../../MarkdownInputField/FileMapView";
55
+ import { normalizeFileMapPropsFromJson } from "./agenticUiEmbedUtils";
56
+ export var AgenticUiFileMapBlock = function AgenticUiFileMapBlock(param) {
57
+ var attributes = param.attributes, children = param.children, element = param.element;
58
+ var _normalizeFileMapPropsFromJson = normalizeFileMapPropsFromJson(element.value), fileList = _normalizeFileMapPropsFromJson.fileList, className = _normalizeFileMapPropsFromJson.className;
59
+ var fileMap = new Map(fileList.map(function(f) {
60
+ return [
61
+ f.uuid || f.name,
62
+ f
63
+ ];
64
+ }));
65
+ return /*#__PURE__*/ React.createElement("div", _object_spread_props(_object_spread({}, attributes), {
66
+ contentEditable: false,
67
+ "data-testid": "agentic-ui-filemap-block",
68
+ style: {
69
+ margin: '0.75em 0'
70
+ }
71
+ }), /*#__PURE__*/ React.createElement(FileMapView, {
72
+ fileMap: fileMap,
73
+ className: className
74
+ }), /*#__PURE__*/ React.createElement("span", {
75
+ "data-testid": "agentic-ui-filemap-hidden-children",
76
+ style: {
77
+ display: 'none'
78
+ }
79
+ }, children));
80
+ };
81
+ AgenticUiFileMapBlock.displayName = 'AgenticUiFileMapBlock';
82
+ export var ReadonlyAgenticUiFileMapBlock = /*#__PURE__*/ React.memo(AgenticUiFileMapBlock);
83
+ ReadonlyAgenticUiFileMapBlock.displayName = 'ReadonlyAgenticUiFileMapBlock';
@@ -1,4 +1,5 @@
1
1
  import type { CSSProperties } from 'react';
2
+ import type { AttachmentFile } from '../../../../MarkdownInputField/AttachmentButton/types';
2
3
  import type { TaskListProps } from '../../../../TaskList/types';
3
4
  import type { ToolCall } from '../../../../ToolUseBar/BarItem';
4
5
  /**
@@ -18,3 +19,12 @@ export interface NormalizedToolUseBarEmbedProps {
18
19
  disableAnimation?: boolean;
19
20
  }
20
21
  export declare function normalizeToolUseBarPropsFromJson(parsed: unknown): NormalizedToolUseBarEmbedProps;
22
+ export interface NormalizedFileMapEmbedProps {
23
+ fileList: AttachmentFile[];
24
+ className?: string;
25
+ style?: CSSProperties;
26
+ }
27
+ /**
28
+ * 将 ```agentic-ui-filemap JSON 规范化为 FileMapView 所需 props
29
+ */
30
+ export declare function normalizeFileMapPropsFromJson(parsed: unknown): NormalizedFileMapEmbedProps;
@@ -167,3 +167,47 @@ export function normalizeToolUseBarPropsFromJson(parsed) {
167
167
  disableAnimation: disableAnimation
168
168
  };
169
169
  }
170
+ var fileItemFromRecord = function fileItemFromRecord(x, index) {
171
+ var name = x.name !== undefined && x.name !== null ? String(x.name) : "file-".concat(index);
172
+ var url = x.url !== undefined && x.url !== null ? String(x.url) : undefined;
173
+ var previewUrl = x.previewUrl !== undefined && x.previewUrl !== null ? String(x.previewUrl) : undefined;
174
+ var type = x.type !== undefined && x.type !== null ? String(x.type) : 'application/octet-stream';
175
+ var size = typeof x.size === 'number' ? x.size : undefined;
176
+ var uuid = x.uuid !== undefined && x.uuid !== null ? String(x.uuid) : x.id !== undefined && x.id !== null ? String(x.id) : "file-".concat(index);
177
+ var rawStatus = x.status;
178
+ var status = rawStatus === 'error' || rawStatus === 'uploading' || rawStatus === 'pending' || rawStatus === 'done' ? rawStatus : undefined;
179
+ var errorMessage = typeof x.errorMessage === 'string' ? x.errorMessage : undefined;
180
+ return {
181
+ name: name,
182
+ type: type,
183
+ url: url,
184
+ previewUrl: previewUrl,
185
+ uuid: uuid,
186
+ size: size,
187
+ status: status,
188
+ errorMessage: errorMessage
189
+ };
190
+ };
191
+ /**
192
+ * 将 ```agentic-ui-filemap JSON 规范化为 FileMapView 所需 props
193
+ */ export function normalizeFileMapPropsFromJson(parsed) {
194
+ var root = parsed && (typeof parsed === "undefined" ? "undefined" : _type_of(parsed)) === 'object' && !Array.isArray(parsed) ? parsed : null;
195
+ var rawItems = [];
196
+ if (root && Array.isArray(root.fileList)) {
197
+ rawItems = root.fileList;
198
+ } else if (root && Array.isArray(root.files)) {
199
+ rawItems = root.files;
200
+ } else if (Array.isArray(parsed)) {
201
+ rawItems = parsed;
202
+ }
203
+ var fileList = rawItems.filter(function(x) {
204
+ return !!x && (typeof x === "undefined" ? "undefined" : _type_of(x)) === 'object';
205
+ }).map(function(x, i) {
206
+ return fileItemFromRecord(x, i);
207
+ });
208
+ var className = root && typeof root.className === 'string' ? root.className : undefined;
209
+ return {
210
+ fileList: fileList,
211
+ className: className
212
+ };
213
+ }
@@ -97,7 +97,7 @@ function _unsupported_iterable_to_array(o, minLen) {
97
97
  if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _array_like_to_array(o, minLen);
98
98
  }
99
99
  import classNames from "clsx";
100
- import React, { useContext } from "react";
100
+ import React, { useContext, useEffect, useState } from "react";
101
101
  import { Node } from "slate";
102
102
  import { I18nContext } from "../../../../I18n";
103
103
  import { debugInfo } from "../../../../Utils/debugUtils";
@@ -115,6 +115,28 @@ export var Paragraph = function Paragraph(props) {
115
115
  var _useEditorStore = useEditorStore(), store = _useEditorStore.store, markdownEditorRef = _useEditorStore.markdownEditorRef, markdownContainerRef = _useEditorStore.markdownContainerRef, readonly = _useEditorStore.readonly, editorProps = _useEditorStore.editorProps;
116
116
  var locale = useContext(I18nContext).locale;
117
117
  var _useSelStatus = _sliced_to_array(useSelStatus(props.element), 1), selected = _useSelStatus[0];
118
+ // 将 store.inputComposition(可变对象属性)同步到 React state,
119
+ // 使 useMemo 能在组合输入状态变化时重新评估 isEmpty,
120
+ // 避免竞态导致占位符在组合结束后短暂闪现。
121
+ var _useState = _sliced_to_array(useState(false), 2), isComposing = _useState[0], setIsComposing = _useState[1];
122
+ useEffect(function() {
123
+ var container = markdownContainerRef.current;
124
+ if (!container) return;
125
+ var observer = new MutationObserver(function() {
126
+ setIsComposing(container.hasAttribute('data-composition'));
127
+ });
128
+ observer.observe(container, {
129
+ attributes: true,
130
+ attributeFilter: [
131
+ 'data-composition'
132
+ ]
133
+ });
134
+ return function() {
135
+ return observer.disconnect();
136
+ };
137
+ }, [
138
+ markdownContainerRef
139
+ ]);
118
140
  return React.useMemo(function() {
119
141
  var _props_element_children_every, _props_element_children, _props_element, _markdownEditorRef_current, _props_children;
120
142
  var str = Node.string(props.element).trim();
@@ -129,10 +151,9 @@ export var Paragraph = function Paragraph(props) {
129
151
  var hasOnlyTextNodes = (_props_element = props.element) === null || _props_element === void 0 ? void 0 : (_props_element_children = _props_element.children) === null || _props_element_children === void 0 ? void 0 : (_props_element_children_every = _props_element_children.every) === null || _props_element_children_every === void 0 ? void 0 : _props_element_children_every.call(_props_element_children, function(child) {
130
152
  return !child.type && !child.code && !child.tag;
131
153
  });
132
- // trim 后的字符串为空时,应该显示 placeholder
133
- // 需要满足:只有一个段落节点,且所有子节点都是纯文本节点
134
- // 注意:当只输入空格时,trim() 后为空,!str true,应该正确显示 placeholder
135
- var isEmpty = !str && ((_markdownEditorRef_current = markdownEditorRef.current) === null || _markdownEditorRef_current === void 0 ? void 0 : _markdownEditorRef_current.children.length) === 1 && hasOnlyTextNodes ? true : undefined;
154
+ // 组合输入进行中时,Slate 模型尚未更新(字符还在 IME 候选区),
155
+ // 此时强制视为非空以隐藏占位符,避免用户输入时占位符仍然可见。
156
+ var isEmpty = !str && !isComposing && ((_markdownEditorRef_current = markdownEditorRef.current) === null || _markdownEditorRef_current === void 0 ? void 0 : _markdownEditorRef_current.children.length) === 1 && hasOnlyTextNodes ? true : undefined;
136
157
  return /*#__PURE__*/ React.createElement("div", _object_spread_props(_object_spread({}, props.attributes), {
137
158
  "data-be": 'paragraph',
138
159
  "data-drag-el": true,
@@ -155,6 +176,7 @@ export var Paragraph = function Paragraph(props) {
155
176
  align,
156
177
  readonly,
157
178
  selected,
179
+ isComposing,
158
180
  (_markdownEditorRef_current = markdownEditorRef.current) === null || _markdownEditorRef_current === void 0 ? void 0 : _markdownEditorRef_current.children.length,
159
181
  editorProps.titlePlaceholderContent
160
182
  ]);
@@ -98,6 +98,7 @@ import { useEditorStore } from "../store";
98
98
  import { EditorUtils } from "../utils/editorUtils";
99
99
  import { AgenticUiTaskBlock, ReadonlyAgenticUiTaskBlock } from "./AgenticUiBlocks/AgenticUiTaskBlock";
100
100
  import { AgenticUiToolUseBarBlock, ReadonlyAgenticUiToolUseBarBlock } from "./AgenticUiBlocks/AgenticUiToolUseBarBlock";
101
+ import { AgenticUiFileMapBlock, ReadonlyAgenticUiFileMapBlock } from "./AgenticUiBlocks/AgenticUiFileMapBlock";
101
102
  import { Blockquote } from "./Blockquote";
102
103
  import { ReadonlyBlockquote } from "./Blockquote/ReadonlyBlockquote";
103
104
  import { Break } from "./Break";
@@ -250,6 +251,8 @@ var MElementComponent = function MElementComponent(props) {
250
251
  case 'agentic-ui-toolusebar':
251
252
  case 'agentic-ui-usertoolbar':
252
253
  return props.readonly ? /*#__PURE__*/ React.createElement(ReadonlyAgenticUiToolUseBarBlock, readonlyElementProps) : /*#__PURE__*/ React.createElement(AgenticUiToolUseBarBlock, props);
254
+ case 'agentic-ui-filemap':
255
+ return props.readonly ? /*#__PURE__*/ React.createElement(ReadonlyAgenticUiFileMapBlock, readonlyElementProps) : /*#__PURE__*/ React.createElement(AgenticUiFileMapBlock, props);
253
256
  case 'image':
254
257
  return props.readonly ? /*#__PURE__*/ React.createElement(ReadonlyEditorImage, readonlyElementProps) : /*#__PURE__*/ React.createElement(EditorImage, props);
255
258
  case 'media':
@@ -128,7 +128,8 @@ var processSchemaLanguage = function processSchemaLanguage(element, value) {
128
128
  'agentar-card': processSchemaLanguage,
129
129
  'agentic-ui-task': processAgenticUiJsonBlock('agentic-ui-task'),
130
130
  'agentic-ui-toolusebar': processAgenticUiJsonBlock('agentic-ui-toolusebar'),
131
- /** @deprecated 使用 `agentic-ui-toolusebar`,保留解析以兼容旧内容 */ 'agentic-ui-usertoolbar': processAgenticUiJsonBlock('agentic-ui-toolusebar')
131
+ /** @deprecated 使用 `agentic-ui-toolusebar`,保留解析以兼容旧内容 */ 'agentic-ui-usertoolbar': processAgenticUiJsonBlock('agentic-ui-toolusebar'),
132
+ 'agentic-ui-filemap': processAgenticUiJsonBlock('agentic-ui-filemap')
132
133
  };
133
134
  /**
134
135
  * 处理代码块节点
@@ -287,6 +287,7 @@ var inlineNode = new Set([
287
287
  case 'agentic-ui-task':
288
288
  case 'agentic-ui-toolusebar':
289
289
  case 'agentic-ui-usertoolbar':
290
+ case 'agentic-ui-filemap':
290
291
  str += handleCode(node, preString);
291
292
  break;
292
293
  case 'attach':
@@ -758,7 +758,8 @@ import { parseMarkdownToNodesAndInsert } from "./parseMarkdownToNodesAndInsert";
758
758
  'apaasify',
759
759
  'agentic-ui-task',
760
760
  'agentic-ui-toolusebar',
761
- 'agentic-ui-usertoolbar'
761
+ 'agentic-ui-usertoolbar',
762
+ 'agentic-ui-filemap'
762
763
  ].includes(rangeNode.type);
763
764
  };
764
765
  /**
@@ -203,7 +203,7 @@ var genStyle = function genStyle(token) {
203
203
  width: '8px',
204
204
  height: '8px'
205
205
  }), _define_property(_obj, '::-webkit-scrollbar-thumb', {
206
- backgroundColor: 'var(--color-gray-text-tertiary)',
206
+ backgroundColor: 'var(--color-gray-text-tertiary, var(--color-gray-text-light))',
207
207
  borderRadius: '20px'
208
208
  }), _define_property(_obj, '&-edit', {
209
209
  '> div.empty:first-child': {
@@ -222,7 +222,11 @@ var genStyle = function genStyle(token) {
222
222
  fontSize: '1em',
223
223
  lineHeight: '21px',
224
224
  wordBreak: 'break-word',
225
- whiteSpace: 'wrap'
225
+ whiteSpace: 'wrap',
226
+ // 防止占位符伪元素响应触摸/点击事件,避免在移动端
227
+ // 竞态窗口内占位符遮挡用户对实际文字的交互。
228
+ pointerEvents: 'none',
229
+ userSelect: 'none'
226
230
  }
227
231
  },
228
232
  '> div.empty:first-child [data-slate-node="text"]': {
@@ -366,7 +370,7 @@ var genStyle = function genStyle(token) {
366
370
  fontSize: '0.9rem',
367
371
  lineHeight: 'var(--line-height-base)',
368
372
  letterSpacing: 'var(--letter-spacing-base)',
369
- fontFamily: 'var(--font-family-base)'
373
+ fontFamily: 'var(--font-family-base, var(--font-family-text))'
370
374
  },
371
375
  'ul, ol': {
372
376
  margin: 0
@@ -337,12 +337,12 @@ export var JinjaTemplatePanel = function JinjaTemplatePanel() {
337
337
  }, loading ? /*#__PURE__*/ React.createElement("div", {
338
338
  style: {
339
339
  padding: 12,
340
- color: 'var(--color-text-secondary)'
340
+ color: 'var(--color-text-secondary, var(--color-gray-text-secondary, rgba(0,0,0,0.45)))'
341
341
  }
342
342
  }, locale.loading) : items.length === 0 ? notFoundContent !== null && notFoundContent !== void 0 ? notFoundContent : /*#__PURE__*/ React.createElement("div", {
343
343
  style: {
344
344
  padding: 12,
345
- color: 'var(--color-text-secondary)'
345
+ color: 'var(--color-text-secondary, var(--color-gray-text-secondary, rgba(0,0,0,0.45)))'
346
346
  }
347
347
  }, locale['jinja.panel.noTemplates']) : items.map(function(item, i) {
348
348
  return /*#__PURE__*/ React.createElement("div", {
@@ -637,4 +637,14 @@ export type MarkdownEditorProps = {
637
637
  * @description 当同时传入时,`renderMode` 优先
638
638
  */
639
639
  renderType?: RenderMode;
640
+ /**
641
+ * 自定义元素渲染函数(仅 `renderMode: 'markdown'` 时生效)
642
+ * @description 拦截并自定义 MarkdownRenderer 中任意块级/行内元素的渲染结果。
643
+ * 与 Slate 模式的 `eleItemRender` 对应,允许替换段落、标题、列表、图片等元素。
644
+ * 返回 `undefined` 时回退到默认渲染。
645
+ * @param props - 元素属性(tagName、node、children 等)
646
+ * @param defaultDom - 默认渲染结果
647
+ * @returns 自定义渲染节点,或 undefined 时回退到 defaultDom
648
+ */
649
+ eleRender?: (props: import('../MarkdownRenderer/types').MarkdownRendererEleProps, defaultDom: React.ReactNode) => React.ReactNode;
640
650
  };
@@ -108,7 +108,7 @@ var VideoThumbnail = function VideoThumbnail(param) {
108
108
  style: _object_spread_props(_object_spread({}, style), {
109
109
  position: 'relative',
110
110
  overflow: 'hidden',
111
- borderRadius: 'var(--radius-base)',
111
+ borderRadius: 'var(--radius-base, 4px)',
112
112
  flexShrink: 0
113
113
  })
114
114
  }, /*#__PURE__*/ React.createElement("video", {
@@ -83,8 +83,8 @@ var genStyle = function genStyle(token) {
83
83
  height: 'var(--padding-1x)'
84
84
  },
85
85
  '&::-webkit-scrollbar-thumb': {
86
- background: 'var(--color-gray-border-default)',
87
- borderRadius: 'var(--radius-base)'
86
+ background: 'var(--color-gray-border-default, var(--color-gray-border-light))',
87
+ borderRadius: 'var(--radius-base, var(--radius-control-xs, 4px))'
88
88
  },
89
89
  '&::-webkit-scrollbar-track': {
90
90
  background: 'transparent'
@@ -141,7 +141,7 @@ var genStyle = function genStyle(token) {
141
141
  background: 'var(--color-gray-bg-card-white)',
142
142
  boxSizing: 'border-box',
143
143
  boxShadow: 'var(--shadow-control-base)',
144
- borderRadius: 'var(--radius-base)',
144
+ borderRadius: 'var(--radius-base, var(--radius-control-xs, 4px))',
145
145
  border: 'none',
146
146
  overflow: 'hidden',
147
147
  img: {
@@ -80,7 +80,8 @@ var genStyle = function genStyle(token) {
80
80
  padding: 0,
81
81
  maxWidth: 'calc(285px * 3 + 4px * 2)',
82
82
  '& > :only-child': {
83
- marginTop: 8
83
+ marginTop: 8,
84
+ padding: 2
84
85
  }
85
86
  },
86
87
  '&::-webkit-scrollbar': {
@@ -271,7 +272,7 @@ var genStyle = function genStyle(token) {
271
272
  background: 'var(--color-gray-bg-card-white)',
272
273
  boxSizing: 'border-box',
273
274
  boxShadow: 'var(--shadow-control-base)',
274
- borderRadius: 'var(--radius-base)',
275
+ borderRadius: 'var(--radius-base, 4px)',
275
276
  border: 'none',
276
277
  overflow: 'hidden',
277
278
  img: {
@@ -99,7 +99,7 @@ var genStyle = function genStyle(token) {
99
99
  borderRadius: 'var(--radius-control-sm)'
100
100
  },
101
101
  '&:active': {
102
- backgroundColor: 'var(--color-gray-control-fill-pressed)',
102
+ backgroundColor: 'var(--color-gray-control-fill-pressed, var(--color-gray-control-fill-secondary-active))',
103
103
  outline: 'none',
104
104
  border: 'none'
105
105
  },
@@ -172,7 +172,7 @@ var genStyle = function genStyle(token) {
172
172
  maxHeight: 400,
173
173
  height: '100%',
174
174
  overflowY: 'visible',
175
- scrollbarColor: 'var(--color-gray-text-tertiary) transparent',
175
+ scrollbarColor: 'var(--color-gray-text-tertiary, #505c716b) transparent',
176
176
  scrollbarWidth: 'thin',
177
177
  '&&-disabled': {
178
178
  backgroundColor: 'rgba(0,0,0,0.04)',
@@ -140,6 +140,7 @@ import { useStyle as useEditorStyle } from "../MarkdownEditor/style";
140
140
  import { CharacterQueue } from "./CharacterQueue";
141
141
  import { AgenticUiTaskBlockRenderer } from "./renderers/AgenticUiTaskBlockRenderer";
142
142
  import { AgenticUiToolUseBarBlockRenderer } from "./renderers/AgenticUiToolUseBarBlockRenderer";
143
+ import { AgenticUiFileMapBlockRenderer } from "./renderers/AgenticUiFileMapBlockRenderer";
143
144
  import { ChartBlockRenderer } from "./renderers/ChartRenderer";
144
145
  import { CodeBlockRenderer } from "./renderers/CodeRenderer";
145
146
  import { MermaidBlockRenderer } from "./renderers/MermaidRenderer";
@@ -215,6 +216,12 @@ var SCHEMA_LANGUAGES = new Set([
215
216
  language: language
216
217
  }));
217
218
  }
219
+ if (language === 'agentic-ui-filemap') {
220
+ var FileMapComp = pluginComponents['agentic-ui-filemap'] || AgenticUiFileMapBlockRenderer;
221
+ return /*#__PURE__*/ React.createElement(FileMapComp, _object_spread_props(_object_spread({}, rest), {
222
+ language: language
223
+ }));
224
+ }
218
225
  if (SCHEMA_LANGUAGES.has(language)) {
219
226
  var SchemaComp = pluginComponents.schema || SchemaBlockRenderer;
220
227
  return /*#__PURE__*/ React.createElement(SchemaComp, _object_spread_props(_object_spread({}, rest), {
@@ -236,7 +243,7 @@ var SCHEMA_LANGUAGES = new Set([
236
243
  * - Markdown → hast → React 元素树(hast-util-to-jsx-runtime)
237
244
  * - 特殊块(code / mermaid / chart / katex)通过组件映射拦截渲染
238
245
  */ var InternalMarkdownRenderer = /*#__PURE__*/ forwardRef(function(props, ref) {
239
- var content = props.content, _props_streaming = props.streaming, streaming = _props_streaming === void 0 ? false : _props_streaming, isFinished = props.isFinished, queueOptions = props.queueOptions, plugins = props.plugins, remarkPlugins = props.remarkPlugins, htmlConfig = props.htmlConfig, className = props.className, style = props.style, customPrefixCls = props.prefixCls, linkConfig = props.linkConfig, streamingParagraphAnimation = props.streamingParagraphAnimation, apaasify = props.apaasify;
246
+ var content = props.content, _props_streaming = props.streaming, streaming = _props_streaming === void 0 ? false : _props_streaming, isFinished = props.isFinished, queueOptions = props.queueOptions, plugins = props.plugins, remarkPlugins = props.remarkPlugins, htmlConfig = props.htmlConfig, className = props.className, style = props.style, customPrefixCls = props.prefixCls, linkConfig = props.linkConfig, streamingParagraphAnimation = props.streamingParagraphAnimation, apaasify = props.apaasify, eleRender = props.eleRender;
240
247
  var getPrefixCls = useContext(ConfigProvider.ConfigContext).getPrefixCls;
241
248
  // 复用 MarkdownEditor 的 CSS 前缀和样式,保持渲染一致性
242
249
  var prefixCls = getPrefixCls('agentic-md-editor', customPrefixCls);
@@ -358,7 +365,8 @@ var SCHEMA_LANGUAGES = new Set([
358
365
  linkConfig: linkConfig,
359
366
  streaming: streaming,
360
367
  streamingParagraphAnimation: streamingParagraphAnimation,
361
- contentRevisionSource: streaming ? displayedContent : undefined
368
+ contentRevisionSource: streaming ? displayedContent : undefined,
369
+ eleRender: eleRender
362
370
  });
363
371
  return wrapVarSSR(wrapSSR(wrapContentSSR(/*#__PURE__*/ React.createElement("div", {
364
372
  ref: containerRef,
@@ -2,11 +2,14 @@ export { default as AnimationText } from './AnimationText';
2
2
  export type { AnimationConfig, AnimationTextProps } from './AnimationText';
3
3
  export { CharacterQueue } from './CharacterQueue';
4
4
  export { default as MarkdownRenderer } from './MarkdownRenderer';
5
+ export { AgenticUiFileMapBlockRenderer } from './renderers/AgenticUiFileMapBlockRenderer';
6
+ export { AgenticUiTaskBlockRenderer } from './renderers/AgenticUiTaskBlockRenderer';
7
+ export { AgenticUiToolUseBarBlockRenderer } from './renderers/AgenticUiToolUseBarBlockRenderer';
5
8
  export { ChartBlockRenderer } from './renderers/ChartRenderer';
6
9
  export { CodeBlockRenderer } from './renderers/CodeRenderer';
7
10
  export { MermaidBlockRenderer } from './renderers/MermaidRenderer';
8
11
  export { SchemaBlockRenderer } from './renderers/SchemaRenderer';
9
- export type { CharacterQueueOptions, MarkdownRendererProps, MarkdownRendererRef, RenderMode, RendererBlockProps, } from './types';
12
+ export type { CharacterQueueOptions, MarkdownRendererEleProps, MarkdownRendererProps, MarkdownRendererRef, RenderMode, RendererBlockProps, } from './types';
10
13
  export type { UseMarkdownToReactOptions } from './markdownReactShared';
11
14
  export { markdownToReactSync, useMarkdownToReact } from './useMarkdownToReact';
12
15
  export { useStreamingMarkdownReact } from './streaming/useStreamingMarkdownReact';
@@ -1,6 +1,9 @@
1
1
  export { default as AnimationText } from "./AnimationText";
2
2
  export { CharacterQueue } from "./CharacterQueue";
3
3
  export { default as MarkdownRenderer } from "./MarkdownRenderer";
4
+ export { AgenticUiFileMapBlockRenderer } from "./renderers/AgenticUiFileMapBlockRenderer";
5
+ export { AgenticUiTaskBlockRenderer } from "./renderers/AgenticUiTaskBlockRenderer";
6
+ export { AgenticUiToolUseBarBlockRenderer } from "./renderers/AgenticUiToolUseBarBlockRenderer";
4
7
  export { ChartBlockRenderer } from "./renderers/ChartRenderer";
5
8
  export { CodeBlockRenderer } from "./renderers/CodeRenderer";
6
9
  export { MermaidBlockRenderer } from "./renderers/MermaidRenderer";
@@ -1,7 +1,7 @@
1
1
  import React from 'react';
2
2
  import type { Processor } from 'unified';
3
3
  import { type MarkdownRemarkPlugin, type MarkdownToHtmlConfig } from '../MarkdownEditor/editor/utils/markdownToHtml';
4
- import type { RendererBlockProps } from './types';
4
+ import type { MarkdownRendererEleProps, RendererBlockProps } from './types';
5
5
  declare const createHastProcessor: (extraRemarkPlugins?: MarkdownRemarkPlugin[], config?: MarkdownToHtmlConfig) => Processor;
6
6
  /**
7
7
  * 构建与 MarkdownEditor Readonly 组件对齐的 hast→React 组件映射。
@@ -12,40 +12,40 @@ declare const createHastProcessor: (extraRemarkPlugins?: MarkdownRemarkPlugin[],
12
12
  declare const buildEditorAlignedComponents: (prefixCls: string, userComponents: Record<string, React.ComponentType<RendererBlockProps>>, streaming?: boolean, linkConfig?: {
13
13
  openInNewTab?: boolean | undefined;
14
14
  onClick?: ((url?: string) => boolean | void) | undefined;
15
- } | undefined, streamingParagraphAnimation?: boolean) => {
16
- p: (props: any) => React.ReactElement<any, string | React.JSXElementConstructor<any>>;
17
- h1: (props: any) => React.ReactElement<any, string | React.JSXElementConstructor<any>>;
18
- h2: (props: any) => React.ReactElement<any, string | React.JSXElementConstructor<any>>;
19
- h3: (props: any) => React.ReactElement<any, string | React.JSXElementConstructor<any>>;
20
- h4: (props: any) => React.ReactElement<any, string | React.JSXElementConstructor<any>>;
21
- h5: (props: any) => React.ReactElement<any, string | React.JSXElementConstructor<any>>;
22
- h6: (props: any) => React.ReactElement<any, string | React.JSXElementConstructor<any>>;
23
- blockquote: (props: any) => React.ReactElement<any, string | React.JSXElementConstructor<any>>;
24
- ul: (props: any) => React.ReactElement<any, string | React.JSXElementConstructor<any>>;
25
- ol: (props: any) => React.ReactElement<any, string | React.JSXElementConstructor<any>>;
26
- li: (props: any) => React.ReactElement<any, string | React.JSXElementConstructor<any>>;
27
- table: (props: any) => React.ReactElement<any, string | React.JSXElementConstructor<any>>;
15
+ } | undefined, streamingParagraphAnimation?: boolean, eleRender?: ((props: MarkdownRendererEleProps, defaultDom: React.ReactNode) => React.ReactNode) | undefined) => {
16
+ p: (props: any) => React.ReactNode;
17
+ h1: (props: any) => React.ReactNode;
18
+ h2: (props: any) => React.ReactNode;
19
+ h3: (props: any) => React.ReactNode;
20
+ h4: (props: any) => React.ReactNode;
21
+ h5: (props: any) => React.ReactNode;
22
+ h6: (props: any) => React.ReactNode;
23
+ blockquote: (props: any) => React.ReactNode;
24
+ ul: (props: any) => React.ReactNode;
25
+ ol: (props: any) => React.ReactNode;
26
+ li: (props: any) => React.ReactNode;
27
+ table: (props: any) => React.ReactNode;
28
28
  thead: (props: any) => React.ReactElement<any, string | React.JSXElementConstructor<any>>;
29
29
  tbody: (props: any) => React.ReactElement<any, string | React.JSXElementConstructor<any>>;
30
30
  tr: (props: any) => React.ReactElement<any, string | React.JSXElementConstructor<any>>;
31
31
  th: (props: any) => React.ReactElement<any, string | React.JSXElementConstructor<any>>;
32
32
  td: (props: any) => React.ReactElement<any, string | React.JSXElementConstructor<any>>;
33
33
  input: (props: any) => React.ReactElement<any, string | React.JSXElementConstructor<any>>;
34
- a: (props: any) => React.ReactElement<any, string | React.JSXElementConstructor<any>>;
35
- strong: (props: any) => React.ReactElement<any, string | React.JSXElementConstructor<any>>;
36
- em: (props: any) => React.ReactElement<any, string | React.JSXElementConstructor<any>>;
37
- del: (props: any) => React.ReactElement<any, string | React.JSXElementConstructor<any>>;
34
+ a: (props: any) => React.ReactNode;
35
+ strong: (props: any) => React.ReactNode;
36
+ em: (props: any) => React.ReactNode;
37
+ del: (props: any) => React.ReactNode;
38
38
  code: (props: any) => React.ReactElement<any, string | React.JSXElementConstructor<any>>;
39
- mark: (props: any) => React.ReactElement<any, string | React.JSXElementConstructor<any>>;
40
- kbd: (props: any) => React.ReactElement<any, string | React.JSXElementConstructor<any>>;
41
- sub: (props: any) => React.ReactElement<any, string | React.JSXElementConstructor<any>>;
42
- pre: (props: any) => React.ReactElement<any, string | React.JSXElementConstructor<any>>;
43
- img: (props: any) => React.ReactElement<any, string | React.JSXElementConstructor<any>>;
44
- video: (props: any) => React.ReactElement<any, string | React.JSXElementConstructor<any>>;
45
- audio: (props: any) => React.ReactElement<any, string | React.JSXElementConstructor<any>>;
46
- iframe: (props: any) => React.ReactElement<any, string | React.JSXElementConstructor<any>>;
47
- hr: (props: any) => React.ReactElement<any, string | React.JSXElementConstructor<any>>;
48
- sup: (props: any) => React.ReactElement<any, string | React.JSXElementConstructor<any>>;
39
+ mark: (props: any) => React.ReactNode;
40
+ kbd: (props: any) => React.ReactNode;
41
+ sub: (props: any) => React.ReactNode;
42
+ pre: (props: any) => React.ReactNode;
43
+ img: (props: any) => React.ReactNode;
44
+ video: (props: any) => React.ReactNode;
45
+ audio: (props: any) => React.ReactNode;
46
+ iframe: (props: any) => React.ReactNode;
47
+ hr: (props: any) => React.ReactNode;
48
+ sup: (props: any) => React.ReactNode;
49
49
  span: (props: any) => React.ReactElement<any, string | React.JSXElementConstructor<any>>;
50
50
  section: (props: any) => React.ReactElement<any, string | React.JSXElementConstructor<any>>;
51
51
  think: (props: any) => React.FunctionComponentElement<import("../ToolUseBarThink").ToolUseBarThinkProps>;
@@ -89,5 +89,12 @@ export interface UseMarkdownToReactOptions {
89
89
  * 与 `content`(常为 useStreaming 输出的可解析串)分离,避免占位符与正文切换时误判为非前缀修订。
90
90
  */
91
91
  contentRevisionSource?: string;
92
+ /**
93
+ * 自定义元素渲染拦截函数(markdown 渲染模式)。
94
+ * 允许在默认渲染结果基础上包装、替换任意元素。
95
+ * 返回 undefined 时回退到默认渲染。
96
+ */
97
+ eleRender?: (props: MarkdownRendererEleProps, defaultDom: React.ReactNode) => React.ReactNode;
92
98
  }
93
99
  export { buildEditorAlignedComponents, createHastProcessor, markLastParagraphStreamingTail, renderMarkdownBlock, splitMarkdownBlocks, };
100
+ export type { MarkdownRendererEleProps };