@ant-design/agentic-ui 2.30.22 → 2.30.24

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 (58) hide show
  1. package/dist/Bubble/MessagesContent/MarkdownPreview.d.ts +0 -58
  2. package/dist/Bubble/MessagesContent/MarkdownPreview.js +79 -156
  3. package/dist/Hooks/useAutoScroll.js +6 -4
  4. package/dist/MarkdownEditor/BaseMarkdownEditor.d.ts +1 -50
  5. package/dist/MarkdownEditor/BaseMarkdownEditor.js +11 -55
  6. package/dist/MarkdownEditor/editor/Editor.js +11 -9
  7. package/dist/MarkdownEditor/editor/elements/Code/index.js +1 -0
  8. package/dist/MarkdownEditor/editor/plugins/elements.d.ts +2 -0
  9. package/dist/MarkdownEditor/editor/plugins/elements.js +4 -2
  10. package/dist/MarkdownEditor/editor/plugins/handlePaste.js +46 -35
  11. package/dist/MarkdownEditor/editor/plugins/hotKeyCommands/backspace.js +133 -133
  12. package/dist/MarkdownEditor/editor/plugins/hotKeyCommands/enter.js +156 -140
  13. package/dist/MarkdownEditor/editor/plugins/hotKeyCommands/match.d.ts +2 -1
  14. package/dist/MarkdownEditor/editor/plugins/hotKeyCommands/match.js +23 -4
  15. package/dist/MarkdownEditor/editor/plugins/hotKeyCommands/tab.js +40 -36
  16. package/dist/MarkdownEditor/editor/plugins/index.d.ts +1 -0
  17. package/dist/MarkdownEditor/editor/plugins/index.js +1 -0
  18. package/dist/MarkdownEditor/editor/plugins/useKeyboard.js +46 -44
  19. package/dist/MarkdownEditor/editor/plugins/withCodeTagPlugin.js +1 -13
  20. package/dist/MarkdownEditor/editor/plugins/withMarkdown.js +2 -1
  21. package/dist/MarkdownEditor/editor/plugins/withSanitizeInvalidChildren.d.ts +7 -0
  22. package/dist/MarkdownEditor/editor/plugins/withSanitizeInvalidChildren.js +217 -0
  23. package/dist/MarkdownEditor/editor/store.d.ts +3 -1
  24. package/dist/MarkdownEditor/editor/store.js +15 -29
  25. package/dist/MarkdownEditor/editor/utils/editorCommands.js +98 -17
  26. package/dist/MarkdownEditor/editor/utils/editorUtils.d.ts +11 -0
  27. package/dist/MarkdownEditor/editor/utils/editorUtils.js +43 -6
  28. package/dist/MarkdownEditor/editor/utils/keyboard.js +14 -12
  29. package/dist/MarkdownEditor/types.d.ts +36 -414
  30. package/dist/MarkdownEditor/types.js +1 -4
  31. package/dist/MarkdownInputField/MarkdownInputField.js +2 -0
  32. package/dist/MarkdownInputField/SendActions/index.js +7 -4
  33. package/dist/MarkdownInputField/SendButton/index.d.ts +6 -0
  34. package/dist/MarkdownInputField/SendButton/index.js +6 -0
  35. package/dist/MarkdownInputField/hooks/useMarkdownInputFieldHandlers.d.ts +2 -1
  36. package/dist/MarkdownInputField/hooks/useMarkdownInputFieldHandlers.js +6 -1
  37. package/dist/MarkdownRenderer/AnimationText.d.ts +1 -5
  38. package/dist/MarkdownRenderer/AnimationText.js +2 -8
  39. package/dist/MarkdownRenderer/CharacterQueue.d.ts +0 -2
  40. package/dist/MarkdownRenderer/CharacterQueue.js +2 -2
  41. package/dist/MarkdownRenderer/MarkdownRenderer.d.ts +1 -9
  42. package/dist/MarkdownRenderer/MarkdownRenderer.js +1 -9
  43. package/dist/MarkdownRenderer/StreamingCursor.d.ts +4 -0
  44. package/dist/MarkdownRenderer/StreamingCursor.js +20 -0
  45. package/dist/MarkdownRenderer/markdownReactShared.d.ts +8 -38
  46. package/dist/MarkdownRenderer/markdownReactShared.js +9 -45
  47. package/dist/MarkdownRenderer/renderers/ChartRenderer.js +9 -1
  48. package/dist/MarkdownRenderer/streaming/MarkdownBlockPiece.d.ts +1 -3
  49. package/dist/MarkdownRenderer/streaming/MarkdownBlockPiece.js +16 -28
  50. package/dist/MarkdownRenderer/style.js +18 -0
  51. package/dist/MarkdownRenderer/types.d.ts +14 -86
  52. package/dist/MarkdownRenderer/useStreaming.d.ts +1 -10
  53. package/dist/MarkdownRenderer/useStreaming.js +5 -13
  54. package/dist/ThoughtChainList/MarkdownEditor.d.ts +1 -35
  55. package/dist/ThoughtChainList/MarkdownEditor.js +5 -44
  56. package/dist/Workspace/RealtimeFollow/index.d.ts +3 -0
  57. package/dist/Workspace/RealtimeFollow/index.js +5 -3
  58. package/package.json +2 -2
@@ -1,77 +1,19 @@
1
1
  import React from 'react';
2
2
  import { MarkdownEditorProps } from '../../';
3
3
  import { MessageBubbleData } from '../type';
4
- /**
5
- * MarkdownPreview 组件用于渲染 Markdown 内容的预览。
6
- *
7
- * @param {Object} props - 组件的属性。
8
- * @param {string} props.content - 要渲染的 Markdown 内容。
9
- * @param {MarkdownEditorProps['fncProps']} props.fncProps - Markdown 编辑器的函数属性。
10
- * @param {boolean} [props.typing] - 是否启用打字机效果。
11
- * @param {React.ReactNode} props.extra - 额外的 React 节点。
12
- * @param {React.ReactNode} props.docListNode - 文档列表节点。
13
- * @param {React.RefObject<HTMLDivElement>} props.htmlRef - HTML 元素的引用。
14
- *
15
- * @returns {JSX.Element} 渲染的 Markdown 预览组件。
16
- */
17
4
  export interface MarkdownPreviewProps {
18
- /** markdown 源文本内容,例如: "# 标题\n这是正文" */
19
5
  content: string;
20
- /** markdown 编辑器的功能属性配置,控制编辑器行为 */
21
6
  fncProps?: MarkdownEditorProps['fncProps'];
22
7
  placement?: 'left' | 'right';
23
- /** 是否启用打字机效果,例如: true */
24
8
  typing?: boolean;
25
- /** 额外的 React 节点,用于显示附加内容,例如: <Button>更多</Button> */
26
9
  extra?: React.ReactNode;
27
- /** 文档列表节点,用于展示相关文档,例如: <DocList items={[...]} /> */
28
10
  docListNode?: React.ReactNode;
29
- /** HTML 元素的引用,用于获取容器尺寸,例如: useRef<HTMLDivElement>(null) */
30
11
  htmlRef?: React.RefObject<HTMLDivElement>;
31
- /** 内容是否已完成加载,例如: true */
32
12
  isFinished?: boolean;
33
13
  style?: React.CSSProperties;
34
14
  originData?: MessageBubbleData;
35
15
  markdownRenderConfig?: MarkdownEditorProps;
36
- /** 在 content 前面插入的 DOM 元素,例如: <div>前置内容</div> */
37
16
  beforeContent: React.ReactNode;
38
- /** 在 content 后面插入的 DOM 元素,例如: <div>后置内容</div> */
39
17
  afterContent: React.ReactNode;
40
18
  }
41
- /**
42
- * Markdown 预览组件
43
- * @component MarkdownPreview
44
- *
45
- * @param {Object} props - 组件属性
46
- * @param {string} props.content - Markdown 内容
47
- * @param {ReactNode} props.extra - 额外的内容
48
- * @param {boolean} props.typing - 是否正在输入
49
- * @param {React.RefObject} props.htmlRef - HTML 元素的引用
50
- * @param {Object} props.fncProps - 功能属性
51
- * @param {ReactNode} props.docListNode - 文档列表节点
52
- * @param {boolean} props.isFinished - 内容是否已完成
53
- * @param {ReactNode} props.beforeContent - 在 content 前面插入的 DOM 元素
54
- * @param {ReactNode} props.afterContent - 在 content 后面插入的 DOM 元素
55
- *
56
- * @description
57
- * 这是一个用于渲染 Markdown 内容的预览组件。它支持以下功能:
58
- * - 普通 Markdown 渲染
59
- * - 支持打字机效果
60
- * - 错误边界处理
61
- * - 支持 Apaasify 自定义渲染
62
- * - 支持紧凑模式和标准模式
63
- * - 支持弹出层展示额外内容
64
- * - 支持在 content 前后插入自定义 DOM 元素
65
- *
66
- * @example
67
- * ```tsx
68
- * <MarkdownPreview
69
- * content="# Hello World"
70
- * typing={false}
71
- * htmlRef={ref}
72
- * beforeContent={<div>前置内容</div>}
73
- * afterContent={<div>后置内容</div>}
74
- * />
75
- * ```
76
- */
77
19
  export declare const MarkdownPreview: (props: MarkdownPreviewProps) => React.JSX.Element;
@@ -50,7 +50,7 @@ function _object_spread_props(target, source) {
50
50
  }
51
51
  return target;
52
52
  }
53
- import { Popover, theme } from "antd";
53
+ import { Popover } from "antd";
54
54
  import React, { useContext, useEffect, useMemo } from "react";
55
55
  import { ErrorBoundary } from "react-error-boundary";
56
56
  import { MarkdownEditor, parserMdToSchema } from "../..";
@@ -58,99 +58,69 @@ import { useLocale } from "../../I18n";
58
58
  import { MarkdownRenderer } from "../../MarkdownRenderer";
59
59
  import { BubbleConfigContext } from "../BubbleConfigProvide";
60
60
  import { MessagesContext } from "./BubbleContext";
61
- /**
62
- * Markdown 预览组件
63
- * @component MarkdownPreview
64
- *
65
- * @param {Object} props - 组件属性
66
- * @param {string} props.content - Markdown 内容
67
- * @param {ReactNode} props.extra - 额外的内容
68
- * @param {boolean} props.typing - 是否正在输入
69
- * @param {React.RefObject} props.htmlRef - HTML 元素的引用
70
- * @param {Object} props.fncProps - 功能属性
71
- * @param {ReactNode} props.docListNode - 文档列表节点
72
- * @param {boolean} props.isFinished - 内容是否已完成
73
- * @param {ReactNode} props.beforeContent - 在 content 前面插入的 DOM 元素
74
- * @param {ReactNode} props.afterContent - 在 content 后面插入的 DOM 元素
75
- *
76
- * @description
77
- * 这是一个用于渲染 Markdown 内容的预览组件。它支持以下功能:
78
- * - 普通 Markdown 渲染
79
- * - 支持打字机效果
80
- * - 错误边界处理
81
- * - 支持 Apaasify 自定义渲染
82
- * - 支持紧凑模式和标准模式
83
- * - 支持弹出层展示额外内容
84
- * - 支持在 content 前后插入自定义 DOM 元素
85
- *
86
- * @example
87
- * ```tsx
88
- * <MarkdownPreview
89
- * content="# Hello World"
90
- * typing={false}
91
- * htmlRef={ref}
92
- * beforeContent={<div>前置内容</div>}
93
- * afterContent={<div>后置内容</div>}
94
- * />
95
- * ```
96
- */ export var MarkdownPreview = function MarkdownPreview(props) {
97
- var _ref, _ref1, _ref2;
98
- var _props_markdownRenderConfig, _props_markdownRenderConfig1, _props_originData, _props_originData1, _props_originData2;
61
+ var CONTAINER_STYLE = {
62
+ display: 'flex',
63
+ flexDirection: 'column',
64
+ minWidth: 0,
65
+ maxWidth: '100%'
66
+ };
67
+ var POPOVER_SHARED_STYLE = {
68
+ padding: 0,
69
+ borderRadius: 'var(--radius-control-sm)',
70
+ background: 'var(--color-primary-bg-page)',
71
+ boxShadow: 'var(--shadow-control-base)'
72
+ };
73
+ export var MarkdownPreview = function MarkdownPreview(props) {
74
+ var _ref, _ref1, _ref2, _ref3, _ref4, _ref5;
75
+ var _props_originData, _props_originData1, _props_originData2, _props_originData3;
99
76
  var content = props.content, extra = props.extra, typing = props.typing, htmlRef = props.htmlRef, fncProps = props.fncProps, docListNode = props.docListNode, beforeContent = props.beforeContent, afterContent = props.afterContent;
100
- var MarkdownEditorRef = React.useRef(undefined);
77
+ var editorRef = React.useRef(undefined);
101
78
  var hidePadding = (useContext(MessagesContext) || {}).hidePadding;
102
79
  var config = useContext(BubbleConfigContext);
103
80
  var locale = useLocale();
104
81
  var standalone = config === null || config === void 0 ? void 0 : config.standalone;
105
82
  var extraShowOnHover = config === null || config === void 0 ? void 0 : config.extraShowOnHover;
106
- var token = theme.useToken().token;
107
- var renderMode = (_ref = (_ref1 = (_props_markdownRenderConfig = props.markdownRenderConfig) === null || _props_markdownRenderConfig === void 0 ? void 0 : _props_markdownRenderConfig.renderMode) !== null && _ref1 !== void 0 ? _ref1 : (_props_markdownRenderConfig1 = props.markdownRenderConfig) === null || _props_markdownRenderConfig1 === void 0 ? void 0 : _props_markdownRenderConfig1.renderType) !== null && _ref !== void 0 ? _ref : 'slate';
108
- var shouldAnimateMarkdown = Boolean(typing) && ((_ref2 = (_props_originData = props.originData) === null || _props_originData === void 0 ? void 0 : _props_originData.isLast) !== null && _ref2 !== void 0 ? _ref2 : true);
109
- var isPaddingHidden = useMemo(function() {
110
- return !!extra;
111
- }, [
112
- extra,
113
- typing
114
- ]);
83
+ var rc = props.markdownRenderConfig;
84
+ var renderMode = (_ref = (_ref1 = rc === null || rc === void 0 ? void 0 : rc.renderMode) !== null && _ref1 !== void 0 ? _ref1 : rc === null || rc === void 0 ? void 0 : rc.renderType) !== null && _ref !== void 0 ? _ref : 'slate';
85
+ var isStreaming = ((_ref2 = (_ref3 = rc === null || rc === void 0 ? void 0 : rc.streaming) !== null && _ref3 !== void 0 ? _ref3 : rc === null || rc === void 0 ? void 0 : rc.typewriter) !== null && _ref2 !== void 0 ? _ref2 : Boolean(typing)) && ((_ref4 = (_props_originData = props.originData) === null || _props_originData === void 0 ? void 0 : _props_originData.isLast) !== null && _ref4 !== void 0 ? _ref4 : true);
86
+ var isFinished = (_ref5 = (_props_originData1 = props.originData) === null || _props_originData1 === void 0 ? void 0 : _props_originData1.isFinished) !== null && _ref5 !== void 0 ? _ref5 : props.isFinished;
87
+ var noPadding = !!extra;
115
88
  useEffect(function() {
116
- var _MarkdownEditorRef_current;
89
+ var _editorRef_current;
117
90
  if (renderMode !== 'slate') return;
118
- var schema = parserMdToSchema(content).schema;
119
- (_MarkdownEditorRef_current = MarkdownEditorRef.current) === null || _MarkdownEditorRef_current === void 0 ? void 0 : _MarkdownEditorRef_current.store.updateNodeList(schema);
91
+ (_editorRef_current = editorRef.current) === null || _editorRef_current === void 0 ? void 0 : _editorRef_current.store.updateNodeList(parserMdToSchema(content).schema);
120
92
  }, [
121
93
  content,
122
94
  renderMode
123
95
  ]);
124
96
  var markdown = useMemo(function() {
125
- var _ref, _ref1;
126
- var _content_includes, _htmlRef_current, _htmlRef_current1, _props_markdownRenderConfig, _props_originData, _props_originData1, _props_originData2, _props_markdownRenderConfig1, _props_markdownRenderConfig2, _props_originData3, _props_markdownRenderConfig3;
127
- // MarkdownRenderer 渲染路径——轻量,不创建 Slate 实例
97
+ var _content_includes, _htmlRef_current, _htmlRef_current1, _props_originData, _props_originData1, _props_originData2;
128
98
  if (renderMode === 'markdown') {
129
- var _props_originData4, _props_markdownRenderConfig4, _props_markdownRenderConfig5, _props_markdownRenderConfig6, _props_markdownRenderConfig7, _props_markdownRenderConfig8, _props_markdownRenderConfig9, _props_markdownRenderConfig10, _props_markdownRenderConfig11;
130
99
  return /*#__PURE__*/ React.createElement(MarkdownRenderer, {
131
100
  content: content,
132
- streaming: shouldAnimateMarkdown,
133
- isFinished: (_props_originData4 = props.originData) === null || _props_originData4 === void 0 ? void 0 : _props_originData4.isFinished,
134
- plugins: (_props_markdownRenderConfig4 = props.markdownRenderConfig) === null || _props_markdownRenderConfig4 === void 0 ? void 0 : _props_markdownRenderConfig4.plugins,
135
- queueOptions: (_props_markdownRenderConfig5 = props.markdownRenderConfig) === null || _props_markdownRenderConfig5 === void 0 ? void 0 : _props_markdownRenderConfig5.queueOptions,
136
- streamingParagraphAnimation: (_props_markdownRenderConfig6 = props.markdownRenderConfig) === null || _props_markdownRenderConfig6 === void 0 ? void 0 : _props_markdownRenderConfig6.streamingParagraphAnimation,
101
+ streaming: isStreaming,
102
+ isFinished: isFinished,
103
+ plugins: rc === null || rc === void 0 ? void 0 : rc.plugins,
104
+ remarkPlugins: rc === null || rc === void 0 ? void 0 : rc.markdownToHtmlOptions,
105
+ queueOptions: rc === null || rc === void 0 ? void 0 : rc.queueOptions,
106
+ streamingParagraphAnimation: rc === null || rc === void 0 ? void 0 : rc.streamingParagraphAnimation,
137
107
  fncProps: fncProps,
138
- linkConfig: (_props_markdownRenderConfig7 = props.markdownRenderConfig) === null || _props_markdownRenderConfig7 === void 0 ? void 0 : _props_markdownRenderConfig7.linkConfig,
108
+ linkConfig: rc === null || rc === void 0 ? void 0 : rc.linkConfig,
109
+ codeProps: rc === null || rc === void 0 ? void 0 : rc.codeProps,
110
+ apaasify: rc === null || rc === void 0 ? void 0 : rc.apaasify,
111
+ fileMapConfig: rc === null || rc === void 0 ? void 0 : rc.fileMapConfig,
112
+ eleRender: rc === null || rc === void 0 ? void 0 : rc.eleRender,
139
113
  style: _object_spread({
140
114
  maxWidth: standalone ? '100%' : undefined,
141
- padding: isPaddingHidden ? 0 : undefined,
142
- margin: isPaddingHidden ? 0 : undefined
143
- }, ((_props_markdownRenderConfig8 = props.markdownRenderConfig) === null || _props_markdownRenderConfig8 === void 0 ? void 0 : _props_markdownRenderConfig8.style) || {}),
144
- codeProps: (_props_markdownRenderConfig9 = props.markdownRenderConfig) === null || _props_markdownRenderConfig9 === void 0 ? void 0 : _props_markdownRenderConfig9.codeProps,
145
- apaasify: (_props_markdownRenderConfig10 = props.markdownRenderConfig) === null || _props_markdownRenderConfig10 === void 0 ? void 0 : _props_markdownRenderConfig10.apaasify,
146
- fileMapConfig: (_props_markdownRenderConfig11 = props.markdownRenderConfig) === null || _props_markdownRenderConfig11 === void 0 ? void 0 : _props_markdownRenderConfig11.fileMapConfig
115
+ padding: noPadding ? 0 : undefined,
116
+ margin: noPadding ? 0 : undefined
117
+ }, (rc === null || rc === void 0 ? void 0 : rc.style) || {})
147
118
  });
148
119
  }
149
- // Slate 渲染路径——保持向后兼容
150
120
  var minWidth = (content === null || content === void 0 ? void 0 : (_content_includes = content.includes) === null || _content_includes === void 0 ? void 0 : _content_includes.call(content, 'chartType')) ? standalone ? Math.max(((htmlRef === null || htmlRef === void 0 ? void 0 : (_htmlRef_current = htmlRef.current) === null || _htmlRef_current === void 0 ? void 0 : _htmlRef_current.clientWidth) || 600) - 23, 500) : Math.min(((htmlRef === null || htmlRef === void 0 ? void 0 : (_htmlRef_current1 = htmlRef.current) === null || _htmlRef_current1 === void 0 ? void 0 : _htmlRef_current1.clientWidth) || 600) - 128, 500) : undefined;
151
- return /*#__PURE__*/ React.createElement(MarkdownEditor, _object_spread_props(_object_spread({}, props.markdownRenderConfig || {}), {
121
+ return /*#__PURE__*/ React.createElement(MarkdownEditor, _object_spread_props(_object_spread({}, rc || {}), {
152
122
  fncProps: fncProps,
153
- editorRef: MarkdownEditorRef,
123
+ editorRef: editorRef,
154
124
  initValue: content,
155
125
  toc: false,
156
126
  width: "100%",
@@ -160,7 +130,7 @@ import { MessagesContext } from "./BubbleContext";
160
130
  actions: {
161
131
  fullScreen: 'modal'
162
132
  }
163
- }, ((_props_markdownRenderConfig = props.markdownRenderConfig) === null || _props_markdownRenderConfig === void 0 ? void 0 : _props_markdownRenderConfig.tableConfig) || {}),
133
+ }, (rc === null || rc === void 0 ? void 0 : rc.tableConfig) || {}),
164
134
  deps: [
165
135
  String((_props_originData = props.originData) === null || _props_originData === void 0 ? void 0 : _props_originData.isLast),
166
136
  String((_props_originData1 = props.originData) === null || _props_originData1 === void 0 ? void 0 : _props_originData1.isFinished),
@@ -169,116 +139,69 @@ import { MessagesContext } from "./BubbleContext";
169
139
  rootContainer: htmlRef,
170
140
  editorStyle: _object_spread({
171
141
  fontSize: 14
172
- }, ((_props_markdownRenderConfig1 = props.markdownRenderConfig) === null || _props_markdownRenderConfig1 === void 0 ? void 0 : _props_markdownRenderConfig1.editorStyle) || {}),
173
- typewriter: ((_ref = (_props_markdownRenderConfig2 = props.markdownRenderConfig) === null || _props_markdownRenderConfig2 === void 0 ? void 0 : _props_markdownRenderConfig2.typewriter) !== null && _ref !== void 0 ? _ref : shouldAnimateMarkdown) && ((_ref1 = (_props_originData3 = props.originData) === null || _props_originData3 === void 0 ? void 0 : _props_originData3.isLast) !== null && _ref1 !== void 0 ? _ref1 : true),
142
+ }, (rc === null || rc === void 0 ? void 0 : rc.editorStyle) || {}),
143
+ streaming: isStreaming,
174
144
  style: _object_spread({
175
145
  minWidth: minWidth ? "min(".concat(minWidth, "px,100%)") : undefined,
176
146
  maxWidth: standalone ? '100%' : undefined,
177
- padding: isPaddingHidden ? 0 : undefined,
178
- margin: isPaddingHidden ? 0 : undefined
179
- }, ((_props_markdownRenderConfig3 = props.markdownRenderConfig) === null || _props_markdownRenderConfig3 === void 0 ? void 0 : _props_markdownRenderConfig3.style) || {}),
147
+ padding: noPadding ? 0 : undefined,
148
+ margin: noPadding ? 0 : undefined
149
+ }, (rc === null || rc === void 0 ? void 0 : rc.style) || {}),
180
150
  readonly: true
181
151
  }));
182
152
  }, [
183
153
  hidePadding,
184
154
  typing,
185
- (_props_originData1 = props.originData) === null || _props_originData1 === void 0 ? void 0 : _props_originData1.isLast,
186
- (_props_originData2 = props.originData) === null || _props_originData2 === void 0 ? void 0 : _props_originData2.isFinished,
187
- isPaddingHidden,
155
+ (_props_originData2 = props.originData) === null || _props_originData2 === void 0 ? void 0 : _props_originData2.isLast,
156
+ (_props_originData3 = props.originData) === null || _props_originData3 === void 0 ? void 0 : _props_originData3.isFinished,
157
+ noPadding,
188
158
  content,
189
159
  renderMode,
190
- props.markdownRenderConfig,
160
+ rc,
191
161
  fncProps,
192
162
  standalone
193
163
  ]);
194
164
  var errorDom = /*#__PURE__*/ React.createElement("div", {
195
165
  style: {
196
166
  padding: 'var(--padding-5x)',
197
- background: ' #FFFFFF',
198
- color: token.colorError,
167
+ background: 'var(--ant-color-bg-container, #fff)',
168
+ color: 'var(--ant-color-error, #ff4d4f)',
199
169
  borderRadius: '16px 16px 2px 16px',
200
- border: '1px solid ' + token.colorErrorBorder,
170
+ border: '1px solid var(--ant-color-error-border, #ffccc7)',
201
171
  marginLeft: props.placement === 'right' ? 0 : 24,
202
172
  marginRight: props.placement === 'right' ? 24 : 0
203
173
  }
204
174
  }, (locale === null || locale === void 0 ? void 0 : locale['error.unexpected']) || '出现点意外情况,请重新发送');
205
- // 未开启 extraShowOnHover 时,extra 常驻展示(左右均作为兄弟节点渲染)
206
- if (!extraShowOnHover) {
207
- return /*#__PURE__*/ React.createElement("div", {
208
- style: {
209
- display: 'flex',
210
- flexDirection: 'column',
211
- minWidth: 0,
212
- maxWidth: '100%'
213
- }
214
- }, /*#__PURE__*/ React.createElement(ErrorBoundary, {
215
- fallback: errorDom
216
- }, beforeContent, markdown, docListNode, afterContent), extra);
217
- }
218
- // extraShowOnHover 开启时,无 extra 直接返回内容,避免 hover 出现空浮层
219
- // 生成中(typing)时不使用 Popover,避免 hover 展示 extra
220
- if (!extra || typing) {
221
- return /*#__PURE__*/ React.createElement("div", {
222
- style: {
223
- display: 'flex',
224
- flexDirection: 'column',
225
- minWidth: 0,
226
- maxWidth: '100%'
227
- }
228
- }, /*#__PURE__*/ React.createElement(ErrorBoundary, {
229
- fallback: errorDom
230
- }, beforeContent, markdown, docListNode, afterContent));
231
- }
232
- // extraShowOnHover 开启时,左右两侧均通过 Popover 在 hover 时展示 extra
175
+ var body = /*#__PURE__*/ React.createElement("div", {
176
+ style: CONTAINER_STYLE
177
+ }, /*#__PURE__*/ React.createElement(ErrorBoundary, {
178
+ fallback: errorDom
179
+ }, beforeContent, markdown, docListNode, afterContent), !extraShowOnHover && extra);
180
+ if (!extraShowOnHover || !extra || typing) return body;
233
181
  var isLeft = props.placement === 'left';
234
- var popoverAlign = isLeft ? {
235
- points: [
236
- 'tl',
237
- 'bl'
238
- ],
239
- offset: [
240
- 0,
241
- -12
242
- ]
243
- } : {
244
- points: [
245
- 'tr',
246
- 'br'
247
- ],
248
- offset: [
249
- 0,
250
- -12
251
- ]
252
- };
253
- var popoverPlacement = isLeft ? 'bottomLeft' : 'bottomRight';
254
182
  return /*#__PURE__*/ React.createElement(Popover, {
255
183
  trigger: "hover",
256
- align: popoverAlign,
184
+ align: {
185
+ points: isLeft ? [
186
+ 'tl',
187
+ 'bl'
188
+ ] : [
189
+ 'tr',
190
+ 'br'
191
+ ],
192
+ offset: [
193
+ 0,
194
+ -12
195
+ ]
196
+ },
257
197
  content: extra,
258
198
  styles: {
259
- root: {
260
- padding: 0,
261
- borderRadius: 'var(--radius-control-sm)',
262
- background: 'var(--color-primary-bg-page)',
263
- boxShadow: 'var(--shadow-control-base)'
264
- },
265
- body: {
266
- padding: 'var(--padding-0-5x)',
267
- borderRadius: 'var(--radius-control-sm)',
268
- background: 'var(--color-primary-bg-page)',
269
- boxShadow: 'var(--shadow-control-base)'
270
- }
199
+ root: POPOVER_SHARED_STYLE,
200
+ body: _object_spread_props(_object_spread({}, POPOVER_SHARED_STYLE), {
201
+ padding: 'var(--padding-0-5x)'
202
+ })
271
203
  },
272
204
  arrow: false,
273
- placement: popoverPlacement
274
- }, /*#__PURE__*/ React.createElement("div", {
275
- style: {
276
- display: 'flex',
277
- flexDirection: 'column',
278
- minWidth: 0,
279
- maxWidth: '100%'
280
- }
281
- }, /*#__PURE__*/ React.createElement(ErrorBoundary, {
282
- fallback: errorDom
283
- }, beforeContent, markdown, docListNode, afterContent)));
205
+ placement: isLeft ? 'bottomLeft' : 'bottomRight'
206
+ }, body);
284
207
  };
@@ -277,16 +277,18 @@ var SCROLL_TOLERANCE = 20;
277
277
  var container = containerRef.current;
278
278
  if (!container) return;
279
279
  observer.current = new MutationObserver(function(mutations) {
280
- var hasAddedNodes = mutations.some(function(m) {
281
- return m.addedNodes.length > 0;
280
+ var shouldCheck = mutations.some(function(m) {
281
+ var _ref, _ref1;
282
+ var _m_addedNodes, _m_removedNodes;
283
+ return ((_ref = (_m_addedNodes = m.addedNodes) === null || _m_addedNodes === void 0 ? void 0 : _m_addedNodes.length) !== null && _ref !== void 0 ? _ref : 0) > 0 || ((_ref1 = (_m_removedNodes = m.removedNodes) === null || _m_removedNodes === void 0 ? void 0 : _m_removedNodes.length) !== null && _ref1 !== void 0 ? _ref1 : 0) > 0 || m.type === 'characterData';
282
284
  });
283
- if (hasAddedNodes) checkScroll === null || checkScroll === void 0 ? void 0 : checkScroll();
285
+ if (shouldCheck) checkScroll === null || checkScroll === void 0 ? void 0 : checkScroll();
284
286
  });
285
287
  observer.current.observe(container, {
286
288
  childList: true,
287
289
  subtree: true,
288
290
  attributes: false,
289
- characterData: false
291
+ characterData: true
290
292
  });
291
293
  return function() {
292
294
  var _observer_current;
@@ -7,54 +7,5 @@ export * from './editor/elements';
7
7
  export * from './editor/utils';
8
8
  export * from './el';
9
9
  export * from './types';
10
- /**
11
- * BaseMarkdownEditor 组件 - 基础Markdown编辑器组件
12
- *
13
- * 该组件是Markdown编辑器的核心实现,基于Slate.js构建,提供完整的Markdown编辑功能。
14
- * 支持插件系统、工具栏、目录、只读模式等功能,是MarkdownEditor的基础组件。
15
- *
16
- * @component
17
- * @description 基础Markdown编辑器组件,提供核心的Markdown编辑功能
18
- * @param {MarkdownEditorProps} props - 组件属性
19
- * @param {string} [props.initValue] - 初始值
20
- * @param {(value: string) => void} [props.onChange] - 内容变化回调
21
- * @param {React.RefObject} [props.editorRef] - 编辑器引用
22
- * @param {boolean} [props.readonly] - 是否只读模式
23
- * @param {Plugin[]} [props.plugins] - 插件列表
24
- * @param {ToolBarConfig} [props.toolBar] - 工具栏配置
25
- * @param {boolean} [props.toc] - 是否显示目录
26
- * @param {string|number} [props.width] - 编辑器宽度
27
- * @param {string|number} [props.height] - 编辑器高度
28
- * @param {React.CSSProperties} [props.style] - 容器样式
29
- * @param {React.CSSProperties} [props.contentStyle] - 内容区域样式
30
- * @param {React.CSSProperties} [props.editorStyle] - 编辑器样式
31
- * @param {MarkdownRenderConfig} [props.markdownRenderConfig] - Markdown渲染配置
32
- * @param {Function} [props.onBlur] - 失焦回调
33
- * @param {Function} [props.onFocus] - 聚焦回调
34
- *
35
- * @example
36
- * ```tsx
37
- * <BaseMarkdownEditor
38
- * initValue="# Hello World"
39
- * onChange={(value) => console.log('内容变化:', value)}
40
- * editorRef={editorRef}
41
- * readonly={false}
42
- * toc={true}
43
- * toolBar={{ show: true }}
44
- * />
45
- * ```
46
- *
47
- * @returns {React.ReactElement} 渲染的基础Markdown编辑器组件
48
- *
49
- * @remarks
50
- * - 基于Slate.js构建
51
- * - 支持插件系统扩展
52
- * - 提供完整的工具栏功能
53
- * - 支持目录生成
54
- * - 支持只读模式
55
- * - 提供焦点管理
56
- * - 支持错误捕获
57
- * - 支持键盘事件处理
58
- * - 提供Markdown解析和渲染
59
- */
10
+ /** 基于 Slate.js 的 Markdown 编辑器核心组件,readonly + renderMode='markdown' 时走轻量 MarkdownRenderer */
60
11
  export declare const BaseMarkdownEditor: React.FC<MarkdownEditorProps>;
@@ -199,57 +199,8 @@ var I18nBoundary = function I18nBoundary(param) {
199
199
  }
200
200
  return /*#__PURE__*/ React.createElement(I18nProvide, null, children);
201
201
  };
202
- /**
203
- * BaseMarkdownEditor 组件 - 基础Markdown编辑器组件
204
- *
205
- * 该组件是Markdown编辑器的核心实现,基于Slate.js构建,提供完整的Markdown编辑功能。
206
- * 支持插件系统、工具栏、目录、只读模式等功能,是MarkdownEditor的基础组件。
207
- *
208
- * @component
209
- * @description 基础Markdown编辑器组件,提供核心的Markdown编辑功能
210
- * @param {MarkdownEditorProps} props - 组件属性
211
- * @param {string} [props.initValue] - 初始值
212
- * @param {(value: string) => void} [props.onChange] - 内容变化回调
213
- * @param {React.RefObject} [props.editorRef] - 编辑器引用
214
- * @param {boolean} [props.readonly] - 是否只读模式
215
- * @param {Plugin[]} [props.plugins] - 插件列表
216
- * @param {ToolBarConfig} [props.toolBar] - 工具栏配置
217
- * @param {boolean} [props.toc] - 是否显示目录
218
- * @param {string|number} [props.width] - 编辑器宽度
219
- * @param {string|number} [props.height] - 编辑器高度
220
- * @param {React.CSSProperties} [props.style] - 容器样式
221
- * @param {React.CSSProperties} [props.contentStyle] - 内容区域样式
222
- * @param {React.CSSProperties} [props.editorStyle] - 编辑器样式
223
- * @param {MarkdownRenderConfig} [props.markdownRenderConfig] - Markdown渲染配置
224
- * @param {Function} [props.onBlur] - 失焦回调
225
- * @param {Function} [props.onFocus] - 聚焦回调
226
- *
227
- * @example
228
- * ```tsx
229
- * <BaseMarkdownEditor
230
- * initValue="# Hello World"
231
- * onChange={(value) => console.log('内容变化:', value)}
232
- * editorRef={editorRef}
233
- * readonly={false}
234
- * toc={true}
235
- * toolBar={{ show: true }}
236
- * />
237
- * ```
238
- *
239
- * @returns {React.ReactElement} 渲染的基础Markdown编辑器组件
240
- *
241
- * @remarks
242
- * - 基于Slate.js构建
243
- * - 支持插件系统扩展
244
- * - 提供完整的工具栏功能
245
- * - 支持目录生成
246
- * - 支持只读模式
247
- * - 提供焦点管理
248
- * - 支持错误捕获
249
- * - 支持键盘事件处理
250
- * - 提供Markdown解析和渲染
251
- */ export var BaseMarkdownEditor = function BaseMarkdownEditor(props) {
252
- var _ref, _props_typewriter, _props_readonly;
202
+ /** 基于 Slate.js 的 Markdown 编辑器核心组件,readonly + renderMode='markdown' 时走轻量 MarkdownRenderer */ export var BaseMarkdownEditor = function BaseMarkdownEditor(props) {
203
+ var _ref, _ref1, _props_streaming, _props_readonly;
253
204
  var _props_jinja, _effectiveJinja_templatePanel, _props_floatBar, _props_floatBar1, _props_textAreaProps;
254
205
  var initValue = props.initValue, width = props.width, _props_toolBar = props.toolBar, toolBar = _props_toolBar === void 0 ? {} : _props_toolBar, editorRef = props.editorRef, _props_toc = props.toc, toc = _props_toc === void 0 ? false : _props_toc, readonly = props.readonly, lazy = props.lazy, style = props.style, _props_contentStyle = props.contentStyle, contentStyle = _props_contentStyle === void 0 ? {
255
206
  height: '100%'
@@ -416,8 +367,9 @@ var I18nBoundary = function I18nBoundary(param) {
416
367
  var jinjaTemplatePanelEnabled = jinjaEnabled && effectiveJinja !== undefined && effectiveJinja !== null && effectiveJinja.templatePanel !== false && (_type_of(effectiveJinja.templatePanel) !== 'object' || ((_effectiveJinja_templatePanel = effectiveJinja.templatePanel) === null || _effectiveJinja_templatePanel === void 0 ? void 0 : _effectiveJinja_templatePanel.enable) !== false);
417
368
  var _useState7 = _sliced_to_array(useState(false), 2), openJinjaTemplate = _useState7[0], setOpenJinjaTemplate = _useState7[1];
418
369
  var _useState8 = _sliced_to_array(useState(null), 2), jinjaAnchorPath = _useState8[0], setJinjaAnchorPath = _useState8[1];
370
+ var isStreaming = (_ref1 = (_props_streaming = props.streaming) !== null && _props_streaming !== void 0 ? _props_streaming : props.typewriter) !== null && _ref1 !== void 0 ? _ref1 : false;
419
371
  if (readonly && effectiveRenderMode === 'markdown') {
420
- var _props_typewriter1;
372
+ var _props_isFinished;
421
373
  var _obj;
422
374
  return wrapSSR(/*#__PURE__*/ React.createElement(I18nBoundary, null, /*#__PURE__*/ React.createElement(PluginContext.Provider, {
423
375
  value: props.plugins || []
@@ -431,7 +383,10 @@ var I18nBoundary = function I18nBoundary(param) {
431
383
  ref: markdownContainerRef
432
384
  }, /*#__PURE__*/ React.createElement(MarkdownRenderer, {
433
385
  content: initValue || '',
434
- streaming: (_props_typewriter1 = props.typewriter) !== null && _props_typewriter1 !== void 0 ? _props_typewriter1 : false,
386
+ streaming: isStreaming,
387
+ isFinished: (_props_isFinished = props.isFinished) !== null && _props_isFinished !== void 0 ? _props_isFinished : !isStreaming,
388
+ queueOptions: props.queueOptions,
389
+ streamingParagraphAnimation: props.streamingParagraphAnimation,
435
390
  plugins: props.plugins,
436
391
  remarkPlugins: props.markdownToHtmlOptions,
437
392
  codeProps: props.codeProps,
@@ -442,7 +397,8 @@ var I18nBoundary = function I18nBoundary(param) {
442
397
  prefixCls: baseClassName,
443
398
  fncProps: props.fncProps,
444
399
  linkConfig: props.linkConfig,
445
- eleRender: props.eleRender
400
+ eleRender: props.eleRender,
401
+ fileMapConfig: props.fileMapConfig
446
402
  }), children))));
447
403
  }
448
404
  var _obj1;
@@ -462,7 +418,7 @@ var I18nBoundary = function I18nBoundary(param) {
462
418
  store: instance.store,
463
419
  domRect: domRect,
464
420
  setDomRect: setDomRect,
465
- typewriter: (_props_typewriter = props.typewriter) !== null && _props_typewriter !== void 0 ? _props_typewriter : false,
421
+ typewriter: isStreaming,
466
422
  readonly: (_props_readonly = props.readonly) !== null && _props_readonly !== void 0 ? _props_readonly : false,
467
423
  editorProps: effectiveJinja !== undefined ? _object_spread_props(_object_spread({}, props), {
468
424
  jinja: effectiveJinja
@@ -498,13 +498,12 @@ var defaultAllowedTypes = [
498
498
  _getSelectionContent1 = getSelectionContent(selection), markdown1 = _getSelectionContent1.markdown, nodes1 = _getSelectionContent1.nodes;
499
499
  (_props_onSelectionChange2 = props.onSelectionChange) === null || _props_onSelectionChange2 === void 0 ? void 0 : _props_onSelectionChange2.call(props, selection, markdown1, nodes1);
500
500
  }
501
- // 只有在有实际选中文本时才显示工具栏
502
- if (!Range.isCollapsed(selection)) {
503
- range = ReactEditor.toDOMRange(markdownEditorRef.current, selection);
504
- rect = range === null || range === void 0 ? void 0 : range.getBoundingClientRect();
505
- if (rect) {
506
- setDomRect === null || setDomRect === void 0 ? void 0 : setDomRect(rect);
507
- } else {
501
+ if (!Range.isCollapsed(selection) && Editor.hasPath(markdownEditorRef.current, selection.anchor.path) && Editor.hasPath(markdownEditorRef.current, selection.focus.path)) {
502
+ try {
503
+ range = ReactEditor.toDOMRange(markdownEditorRef.current, selection);
504
+ rect = range === null || range === void 0 ? void 0 : range.getBoundingClientRect();
505
+ setDomRect === null || setDomRect === void 0 ? void 0 : setDomRect(rect !== null && rect !== void 0 ? rect : null);
506
+ } catch (unused) {
508
507
  setDomRect === null || setDomRect === void 0 ? void 0 : setDomRect(null);
509
508
  }
510
509
  } else {
@@ -651,10 +650,13 @@ var defaultAllowedTypes = [
651
650
  var _event_clipboardData;
652
651
  (_event_clipboardData = event.clipboardData) === null || _event_clipboardData === void 0 ? void 0 : _event_clipboardData.clearData();
653
652
  var editor = markdownEditorRef.current;
653
+ var sel = editor.selection;
654
+ if (!Editor.hasPath(editor, sel.anchor.path) || !Editor.hasPath(editor, sel.focus.path)) {
655
+ return false;
656
+ }
654
657
  try {
655
- // 复制HTML内容
656
658
  var tempDiv = document.createElement('div');
657
- var domRange = ReactEditor.toDOMRange(editor, editor.selection);
659
+ var domRange = ReactEditor.toDOMRange(editor, sel);
658
660
  var selectedHtml = domRange.cloneContents();
659
661
  tempDiv.appendChild(selectedHtml);
660
662
  event.clipboardData.setData('text/html', tempDiv.innerHTML);
@@ -85,6 +85,7 @@ export var Code = function Code(param) {
85
85
  // 检查代码块是否未闭合
86
86
  var isUnclosed = (element === null || element === void 0 ? void 0 : (_element_otherProps2 = element.otherProps) === null || _element_otherProps2 === void 0 ? void 0 : _element_otherProps2.finished) === false;
87
87
  return /*#__PURE__*/ React.createElement("div", _object_spread_props(_object_spread({}, attributes), {
88
+ "data-be": "code",
88
89
  "data-is-unclosed": isUnclosed || undefined,
89
90
  "data-language": element === null || element === void 0 ? void 0 : element.language,
90
91
  style: {
@@ -12,6 +12,8 @@ export type CheckMdParams = {
12
12
  interface MdNode {
13
13
  reg: RegExp;
14
14
  matchKey?: string | RegExp;
15
+ /** 为 true 时仅在 `markdown.matchInputToNode === true` 时参与匹配(避免首段 `- ` 误转列表) */
16
+ gatedByMatchInputToNode?: boolean;
15
17
  checkAllow?: (ctx: {
16
18
  editor: Editor;
17
19
  node: NodeEntry<Element>;