@ant-design/agentic-ui 2.30.22 → 2.30.23
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/MessagesContent/MarkdownPreview.d.ts +0 -58
- package/dist/Bubble/MessagesContent/MarkdownPreview.js +79 -156
- package/dist/Hooks/useAutoScroll.js +6 -4
- package/dist/MarkdownEditor/BaseMarkdownEditor.d.ts +1 -50
- package/dist/MarkdownEditor/BaseMarkdownEditor.js +11 -55
- package/dist/MarkdownEditor/editor/Editor.js +11 -9
- package/dist/MarkdownEditor/editor/elements/Code/index.js +1 -0
- package/dist/MarkdownEditor/editor/plugins/elements.d.ts +2 -0
- package/dist/MarkdownEditor/editor/plugins/elements.js +4 -2
- package/dist/MarkdownEditor/editor/plugins/handlePaste.js +46 -35
- package/dist/MarkdownEditor/editor/plugins/hotKeyCommands/backspace.js +133 -133
- package/dist/MarkdownEditor/editor/plugins/hotKeyCommands/enter.js +156 -140
- package/dist/MarkdownEditor/editor/plugins/hotKeyCommands/match.d.ts +2 -1
- package/dist/MarkdownEditor/editor/plugins/hotKeyCommands/match.js +23 -4
- package/dist/MarkdownEditor/editor/plugins/hotKeyCommands/tab.js +40 -36
- package/dist/MarkdownEditor/editor/plugins/useKeyboard.js +46 -44
- package/dist/MarkdownEditor/editor/plugins/withCodeTagPlugin.js +1 -13
- package/dist/MarkdownEditor/editor/store.d.ts +3 -1
- package/dist/MarkdownEditor/editor/store.js +15 -29
- package/dist/MarkdownEditor/editor/utils/editorCommands.js +98 -17
- package/dist/MarkdownEditor/editor/utils/editorUtils.d.ts +11 -0
- package/dist/MarkdownEditor/editor/utils/editorUtils.js +43 -6
- package/dist/MarkdownEditor/editor/utils/keyboard.js +14 -12
- package/dist/MarkdownEditor/types.d.ts +36 -414
- package/dist/MarkdownEditor/types.js +1 -4
- package/dist/MarkdownInputField/MarkdownInputField.js +2 -0
- package/dist/MarkdownInputField/SendActions/index.js +7 -4
- package/dist/MarkdownInputField/SendButton/index.d.ts +6 -0
- package/dist/MarkdownInputField/SendButton/index.js +6 -0
- package/dist/MarkdownInputField/hooks/useMarkdownInputFieldHandlers.d.ts +2 -1
- package/dist/MarkdownInputField/hooks/useMarkdownInputFieldHandlers.js +6 -1
- package/dist/MarkdownRenderer/AnimationText.d.ts +1 -5
- package/dist/MarkdownRenderer/AnimationText.js +2 -8
- package/dist/MarkdownRenderer/CharacterQueue.d.ts +0 -2
- package/dist/MarkdownRenderer/CharacterQueue.js +2 -2
- package/dist/MarkdownRenderer/MarkdownRenderer.d.ts +1 -9
- package/dist/MarkdownRenderer/MarkdownRenderer.js +1 -9
- package/dist/MarkdownRenderer/StreamingCursor.d.ts +4 -0
- package/dist/MarkdownRenderer/StreamingCursor.js +20 -0
- package/dist/MarkdownRenderer/markdownReactShared.d.ts +8 -38
- package/dist/MarkdownRenderer/markdownReactShared.js +9 -45
- package/dist/MarkdownRenderer/renderers/ChartRenderer.js +9 -1
- package/dist/MarkdownRenderer/streaming/MarkdownBlockPiece.d.ts +1 -3
- package/dist/MarkdownRenderer/streaming/MarkdownBlockPiece.js +16 -28
- package/dist/MarkdownRenderer/style.js +18 -0
- package/dist/MarkdownRenderer/types.d.ts +14 -86
- package/dist/MarkdownRenderer/useStreaming.d.ts +1 -10
- package/dist/MarkdownRenderer/useStreaming.js +5 -13
- package/dist/ThoughtChainList/MarkdownEditor.d.ts +1 -35
- package/dist/ThoughtChainList/MarkdownEditor.js +5 -44
- package/dist/Workspace/RealtimeFollow/index.d.ts +3 -0
- package/dist/Workspace/RealtimeFollow/index.js +5 -3
- 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
|
|
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
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
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
|
|
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
|
|
107
|
-
var renderMode = (_ref = (_ref1 =
|
|
108
|
-
var
|
|
109
|
-
var
|
|
110
|
-
|
|
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
|
|
89
|
+
var _editorRef_current;
|
|
117
90
|
if (renderMode !== 'slate') return;
|
|
118
|
-
|
|
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
|
|
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:
|
|
133
|
-
isFinished:
|
|
134
|
-
plugins:
|
|
135
|
-
|
|
136
|
-
|
|
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:
|
|
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:
|
|
142
|
-
margin:
|
|
143
|
-
}, (
|
|
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({},
|
|
121
|
+
return /*#__PURE__*/ React.createElement(MarkdownEditor, _object_spread_props(_object_spread({}, rc || {}), {
|
|
152
122
|
fncProps: fncProps,
|
|
153
|
-
editorRef:
|
|
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
|
-
}, (
|
|
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
|
-
}, (
|
|
173
|
-
|
|
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:
|
|
178
|
-
margin:
|
|
179
|
-
}, (
|
|
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
|
-
(
|
|
186
|
-
(
|
|
187
|
-
|
|
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
|
-
|
|
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: ' #
|
|
198
|
-
color:
|
|
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 '
|
|
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
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
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:
|
|
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
|
-
|
|
261
|
-
|
|
262
|
-
|
|
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:
|
|
274
|
-
},
|
|
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
|
|
281
|
-
|
|
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 (
|
|
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:
|
|
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
|
-
|
|
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
|
|
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:
|
|
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:
|
|
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
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
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,
|
|
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>;
|