@ant-design/agentic-ui 2.30.21 → 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 -155
- package/dist/Bubble/OpenAIMessageBubble/index.d.ts +11 -0
- package/dist/Bubble/OpenAIMessageBubble/index.js +8 -0
- package/dist/Bubble/OpenAIMessageBubble/mapOllamaMessages.d.ts +7 -0
- package/dist/Bubble/OpenAIMessageBubble/mapOllamaMessages.js +136 -0
- package/dist/Bubble/OpenAIMessageBubble/mapOpenAIMessages.d.ts +8 -0
- package/dist/Bubble/OpenAIMessageBubble/mapOpenAIMessages.js +156 -0
- package/dist/Bubble/OpenAIMessageBubble/mapOpenClawMessages.d.ts +8 -0
- package/dist/Bubble/OpenAIMessageBubble/mapOpenClawMessages.js +127 -0
- package/dist/Bubble/OpenAIMessageBubble/normalizeOllamaMessages.d.ts +16 -0
- package/dist/Bubble/OpenAIMessageBubble/normalizeOllamaMessages.js +110 -0
- package/dist/Bubble/OpenAIMessageBubble/normalizeOpenClawMessages.d.ts +10 -0
- package/dist/Bubble/OpenAIMessageBubble/normalizeOpenClawMessages.js +61 -0
- package/dist/Bubble/OpenAIMessageBubble/ollamaTypes.d.ts +48 -0
- package/dist/Bubble/OpenAIMessageBubble/ollamaTypes.js +1 -0
- package/dist/Bubble/OpenAIMessageBubble/openClawTypes.d.ts +27 -0
- package/dist/Bubble/OpenAIMessageBubble/openClawTypes.js +1 -0
- package/dist/Bubble/OpenAIMessageBubble/types.d.ts +71 -0
- package/dist/Bubble/OpenAIMessageBubble/types.js +1 -0
- package/dist/Bubble/OpenAIMessageBubble/useOllamaMessageBubbleData.d.ts +7 -0
- package/dist/Bubble/OpenAIMessageBubble/useOllamaMessageBubbleData.js +23 -0
- package/dist/Bubble/OpenAIMessageBubble/useOpenAIMessageBubbleData.d.ts +6 -0
- package/dist/Bubble/OpenAIMessageBubble/useOpenAIMessageBubbleData.js +20 -0
- package/dist/Bubble/OpenAIMessageBubble/useOpenClawMessageBubbleData.d.ts +7 -0
- package/dist/Bubble/OpenAIMessageBubble/useOpenClawMessageBubbleData.js +22 -0
- package/dist/Bubble/index.d.ts +2 -0
- package/dist/Bubble/index.js +1 -0
- 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 +35 -21
- package/dist/MarkdownEditor/editor/elements/Code/index.js +1 -0
- package/dist/MarkdownEditor/editor/elements/Table/SimpleTable.js +5 -1
- package/dist/MarkdownEditor/editor/elements/Table/commands/tableCommands.js +24 -8
- package/dist/MarkdownEditor/editor/elements/index.js +18 -14
- 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 +15 -1
- package/dist/MarkdownEditor/editor/store.js +45 -34
- package/dist/MarkdownEditor/editor/tools/InsertAutocomplete.js +15 -11
- 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/AttachmentButton/AttachmentFileList/AttachmentFileListItem.d.ts +1 -1
- package/dist/MarkdownInputField/AttachmentButton/AttachmentFileList/AttachmentFileListItem.js +4 -5
- package/dist/MarkdownInputField/AttachmentButton/AttachmentFileList/index.d.ts +1 -1
- package/dist/MarkdownInputField/AttachmentButton/index.d.ts +1 -1
- package/dist/MarkdownInputField/MarkdownInputField.js +8 -1
- 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 +12 -3
- package/dist/MarkdownInputField/hooks/useMarkdownInputFieldRefs.d.ts +1 -0
- package/dist/MarkdownInputField/hooks/useMarkdownInputFieldRefs.js +36 -5
- package/dist/MarkdownInputField/utils/renderHelpers.js +5 -0
- 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/FncRefForMarkdown.d.ts +24 -0
- package/dist/MarkdownRenderer/FncRefForMarkdown.js +65 -0
- package/dist/MarkdownRenderer/MarkdownRenderer.d.ts +1 -9
- package/dist/MarkdownRenderer/MarkdownRenderer.js +25 -18
- package/dist/MarkdownRenderer/StreamingCursor.d.ts +4 -0
- package/dist/MarkdownRenderer/StreamingCursor.js +20 -0
- package/dist/MarkdownRenderer/extractFootnoteDefinitions.d.ts +13 -0
- package/dist/MarkdownRenderer/extractFootnoteDefinitions.js +40 -0
- package/dist/MarkdownRenderer/markdownReactShared.d.ts +11 -38
- package/dist/MarkdownRenderer/markdownReactShared.js +28 -54
- package/dist/MarkdownRenderer/renderers/ChartRenderer.js +9 -1
- package/dist/MarkdownRenderer/renderers/CodeRenderer.d.ts +4 -1
- package/dist/MarkdownRenderer/renderers/CodeRenderer.js +27 -3
- package/dist/MarkdownRenderer/renderers/SchemaRenderer.d.ts +2 -0
- package/dist/MarkdownRenderer/renderers/SchemaRenderer.js +33 -5
- package/dist/MarkdownRenderer/streaming/MarkdownBlockPiece.d.ts +1 -3
- package/dist/MarkdownRenderer/streaming/MarkdownBlockPiece.js +16 -28
- package/dist/MarkdownRenderer/streaming/useStreamingMarkdownReact.js +2 -1
- package/dist/MarkdownRenderer/style.js +18 -0
- package/dist/MarkdownRenderer/types.d.ts +17 -93
- package/dist/MarkdownRenderer/useMarkdownToReact.js +1 -1
- package/dist/MarkdownRenderer/useStreaming.d.ts +1 -10
- package/dist/MarkdownRenderer/useStreaming.js +5 -13
- package/dist/Plugins/mermaid/MermaidRendererImpl.js +481 -7
- package/dist/Plugins/mermaid/style.js +71 -22
- package/dist/Plugins/mermaid/useMermaidRender.d.ts +2 -1
- package/dist/Plugins/mermaid/useMermaidRender.js +41 -13
- package/dist/Plugins/mermaid/utils.d.ts +16 -0
- package/dist/Plugins/mermaid/utils.js +197 -5
- package/dist/ThoughtChainList/MarkdownEditor.d.ts +1 -35
- package/dist/ThoughtChainList/MarkdownEditor.js +5 -44
- package/dist/Workspace/Browser/index.js +19 -1
- package/dist/Workspace/RealtimeFollow/index.d.ts +3 -0
- package/dist/Workspace/RealtimeFollow/index.js +5 -3
- package/package.json +8 -7
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { useMemo } from "react";
|
|
2
|
+
import { mapOllamaMessagesToMessageBubbleData } from "./mapOllamaMessages";
|
|
3
|
+
/**
|
|
4
|
+
* 将 Ollama `/api/chat` 的 messages 转为 MessageBubbleData[](与 {@link mapOllamaMessagesToMessageBubbleData} 一致,带 memo)。
|
|
5
|
+
*/ export function useOllamaMessageBubbleData(messages, mapOptions, mapMessage) {
|
|
6
|
+
var _ref = mapOptions !== null && mapOptions !== void 0 ? mapOptions : {}, baseTime = _ref.baseTime, timeStepMs = _ref.timeStepMs, bumpUpdateAtOnLastMessage = _ref.bumpUpdateAtOnLastMessage, getMessageId = _ref.getMessageId, toolRoleAs = _ref.toolRoleAs, appendToolCallsToContent = _ref.appendToolCallsToContent, preserveRawInExtra = _ref.preserveRawInExtra, appendThinkingToContent = _ref.appendThinkingToContent, appendImagesPlaceholder = _ref.appendImagesPlaceholder, preserveOllamaRawInExtra = _ref.preserveOllamaRawInExtra;
|
|
7
|
+
return useMemo(function() {
|
|
8
|
+
return mapOllamaMessagesToMessageBubbleData(messages, mapOptions, mapMessage);
|
|
9
|
+
}, [
|
|
10
|
+
messages,
|
|
11
|
+
baseTime,
|
|
12
|
+
timeStepMs,
|
|
13
|
+
bumpUpdateAtOnLastMessage,
|
|
14
|
+
getMessageId,
|
|
15
|
+
toolRoleAs,
|
|
16
|
+
appendToolCallsToContent,
|
|
17
|
+
preserveRawInExtra,
|
|
18
|
+
appendThinkingToContent,
|
|
19
|
+
appendImagesPlaceholder,
|
|
20
|
+
preserveOllamaRawInExtra,
|
|
21
|
+
mapMessage
|
|
22
|
+
]);
|
|
23
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { MessageBubbleData } from '../../Types/message';
|
|
2
|
+
import type { OpenAIChatMessage, OpenAIMessagesMapMessage, OpenAIMessagesMapOptions } from './types';
|
|
3
|
+
/**
|
|
4
|
+
* 将 OpenAI Chat Completions 风格的 messages 转为 MessageBubbleData[](与 {@link mapOpenAIMessagesToMessageBubbleData} 一致,带 memo)。
|
|
5
|
+
*/
|
|
6
|
+
export declare function useOpenAIMessageBubbleData(messages: OpenAIChatMessage[], mapOptions?: OpenAIMessagesMapOptions, mapMessage?: OpenAIMessagesMapMessage): MessageBubbleData[];
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { useMemo } from "react";
|
|
2
|
+
import { mapOpenAIMessagesToMessageBubbleData } from "./mapOpenAIMessages";
|
|
3
|
+
/**
|
|
4
|
+
* 将 OpenAI Chat Completions 风格的 messages 转为 MessageBubbleData[](与 {@link mapOpenAIMessagesToMessageBubbleData} 一致,带 memo)。
|
|
5
|
+
*/ export function useOpenAIMessageBubbleData(messages, mapOptions, mapMessage) {
|
|
6
|
+
var _ref = mapOptions !== null && mapOptions !== void 0 ? mapOptions : {}, baseTime = _ref.baseTime, timeStepMs = _ref.timeStepMs, bumpUpdateAtOnLastMessage = _ref.bumpUpdateAtOnLastMessage, getMessageId = _ref.getMessageId, toolRoleAs = _ref.toolRoleAs, appendToolCallsToContent = _ref.appendToolCallsToContent, preserveRawInExtra = _ref.preserveRawInExtra;
|
|
7
|
+
return useMemo(function() {
|
|
8
|
+
return mapOpenAIMessagesToMessageBubbleData(messages, mapOptions, mapMessage);
|
|
9
|
+
}, [
|
|
10
|
+
messages,
|
|
11
|
+
baseTime,
|
|
12
|
+
timeStepMs,
|
|
13
|
+
bumpUpdateAtOnLastMessage,
|
|
14
|
+
getMessageId,
|
|
15
|
+
toolRoleAs,
|
|
16
|
+
appendToolCallsToContent,
|
|
17
|
+
preserveRawInExtra,
|
|
18
|
+
mapMessage
|
|
19
|
+
]);
|
|
20
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { MessageBubbleData } from '../../Types/message';
|
|
2
|
+
import type { OpenAIMessagesMapMessage } from './types';
|
|
3
|
+
import type { OpenClawChatMessage, OpenClawMessagesMapOptions } from './openClawTypes';
|
|
4
|
+
/**
|
|
5
|
+
* 将 OpenClaw 会话 / transcript 风格的 messages 转为 MessageBubbleData[](与 {@link mapOpenClawMessagesToMessageBubbleData} 一致,带 memo)。
|
|
6
|
+
*/
|
|
7
|
+
export declare function useOpenClawMessageBubbleData(messages: OpenClawChatMessage[], mapOptions?: OpenClawMessagesMapOptions, mapMessage?: OpenAIMessagesMapMessage): MessageBubbleData[];
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { useMemo } from "react";
|
|
2
|
+
import { mapOpenClawMessagesToMessageBubbleData } from "./mapOpenClawMessages";
|
|
3
|
+
/**
|
|
4
|
+
* 将 OpenClaw 会话 / transcript 风格的 messages 转为 MessageBubbleData[](与 {@link mapOpenClawMessagesToMessageBubbleData} 一致,带 memo)。
|
|
5
|
+
*/ export function useOpenClawMessageBubbleData(messages, mapOptions, mapMessage) {
|
|
6
|
+
var _ref = mapOptions !== null && mapOptions !== void 0 ? mapOptions : {}, baseTime = _ref.baseTime, timeStepMs = _ref.timeStepMs, bumpUpdateAtOnLastMessage = _ref.bumpUpdateAtOnLastMessage, getMessageId = _ref.getMessageId, toolRoleAs = _ref.toolRoleAs, appendToolCallsToContent = _ref.appendToolCallsToContent, preserveRawInExtra = _ref.preserveRawInExtra, useOpenClawTimestamps = _ref.useOpenClawTimestamps, preserveOpenClawRawInExtra = _ref.preserveOpenClawRawInExtra;
|
|
7
|
+
return useMemo(function() {
|
|
8
|
+
return mapOpenClawMessagesToMessageBubbleData(messages, mapOptions, mapMessage);
|
|
9
|
+
}, [
|
|
10
|
+
messages,
|
|
11
|
+
baseTime,
|
|
12
|
+
timeStepMs,
|
|
13
|
+
bumpUpdateAtOnLastMessage,
|
|
14
|
+
getMessageId,
|
|
15
|
+
toolRoleAs,
|
|
16
|
+
appendToolCallsToContent,
|
|
17
|
+
preserveRawInExtra,
|
|
18
|
+
useOpenClawTimestamps,
|
|
19
|
+
preserveOpenClawRawInExtra,
|
|
20
|
+
mapMessage
|
|
21
|
+
]);
|
|
22
|
+
}
|
package/dist/Bubble/index.d.ts
CHANGED
package/dist/Bubble/index.js
CHANGED
|
@@ -12,3 +12,4 @@ export * from "./MessagesContent/BubbleContext";
|
|
|
12
12
|
export * from "./type";
|
|
13
13
|
export { UserBubble } from "./UserBubble";
|
|
14
14
|
/** Schema Editor 相关导出 */ export * from "./schema-editor";
|
|
15
|
+
/** OpenAI Chat messages → MessageBubbleData */ export * from "./OpenAIMessageBubble";
|
|
@@ -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 {
|
|
@@ -633,10 +632,14 @@ var defaultAllowedTypes = [
|
|
|
633
632
|
// 2. 检查目标元素是否可编辑,如果不可编辑,则从DOM选区中获取编辑器选区
|
|
634
633
|
if (operationType === 'copy' && !hasEditableTarget(markdownEditorRef.current, event.target)) {
|
|
635
634
|
var domSelection = window.getSelection();
|
|
636
|
-
|
|
635
|
+
if (domSelection) {
|
|
636
|
+
markdownEditorRef.current.selection = getSelectionFromDomSelection(markdownEditorRef.current, domSelection);
|
|
637
|
+
}
|
|
637
638
|
} else if (operationType === 'cut') {
|
|
638
639
|
var domSelection1 = window.getSelection();
|
|
639
|
-
|
|
640
|
+
if (domSelection1) {
|
|
641
|
+
markdownEditorRef.current.selection = getSelectionFromDomSelection(markdownEditorRef.current, domSelection1);
|
|
642
|
+
}
|
|
640
643
|
}
|
|
641
644
|
// 如果无法获取选区,则直接返回
|
|
642
645
|
if (!markdownEditorRef.current.selection) {
|
|
@@ -647,10 +650,13 @@ var defaultAllowedTypes = [
|
|
|
647
650
|
var _event_clipboardData;
|
|
648
651
|
(_event_clipboardData = event.clipboardData) === null || _event_clipboardData === void 0 ? void 0 : _event_clipboardData.clearData();
|
|
649
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
|
+
}
|
|
650
657
|
try {
|
|
651
|
-
// 复制HTML内容
|
|
652
658
|
var tempDiv = document.createElement('div');
|
|
653
|
-
var domRange = ReactEditor.toDOMRange(editor,
|
|
659
|
+
var domRange = ReactEditor.toDOMRange(editor, sel);
|
|
654
660
|
var selectedHtml = domRange.cloneContents();
|
|
655
661
|
tempDiv.appendChild(selectedHtml);
|
|
656
662
|
event.clipboardData.setData('text/html', tempDiv.innerHTML);
|
|
@@ -970,12 +976,16 @@ var defaultAllowedTypes = [
|
|
|
970
976
|
var _markdownEditorRef_current_selection1;
|
|
971
977
|
var node = Node.get(markdownEditorRef.current, ((_markdownEditorRef_current_selection1 = markdownEditorRef.current.selection) === null || _markdownEditorRef_current_selection1 === void 0 ? void 0 : _markdownEditorRef_current_selection1.focus.path) || []);
|
|
972
978
|
if (node) {
|
|
973
|
-
|
|
974
|
-
|
|
975
|
-
|
|
976
|
-
|
|
977
|
-
tagInput
|
|
979
|
+
try {
|
|
980
|
+
var dom = ReactEditor.toDOMNode(markdownEditorRef.current, node);
|
|
981
|
+
if (dom) {
|
|
982
|
+
var tagInput = dom.querySelector('[data-tag-popup-input]');
|
|
983
|
+
if (tagInput) {
|
|
984
|
+
tagInput.setAttribute('data-composition', '');
|
|
985
|
+
}
|
|
978
986
|
}
|
|
987
|
+
} catch (unused) {
|
|
988
|
+
// node may not be mounted yet; ignore
|
|
979
989
|
}
|
|
980
990
|
}
|
|
981
991
|
}
|
|
@@ -1003,12 +1013,16 @@ var defaultAllowedTypes = [
|
|
|
1003
1013
|
var _markdownEditorRef_current_selection1;
|
|
1004
1014
|
var node = Node.get(markdownEditorRef.current, ((_markdownEditorRef_current_selection1 = markdownEditorRef.current.selection) === null || _markdownEditorRef_current_selection1 === void 0 ? void 0 : _markdownEditorRef_current_selection1.focus.path) || []);
|
|
1005
1015
|
if (node) {
|
|
1006
|
-
|
|
1007
|
-
|
|
1008
|
-
|
|
1009
|
-
|
|
1010
|
-
tagInput
|
|
1016
|
+
try {
|
|
1017
|
+
var dom = ReactEditor.toDOMNode(markdownEditorRef.current, node);
|
|
1018
|
+
if (dom) {
|
|
1019
|
+
var tagInput = dom.querySelector('[data-tag-popup-input]');
|
|
1020
|
+
if (tagInput) {
|
|
1021
|
+
tagInput.removeAttribute('data-composition');
|
|
1022
|
+
}
|
|
1011
1023
|
}
|
|
1024
|
+
} catch (unused) {
|
|
1025
|
+
// node may have been unmounted during composition; ignore
|
|
1012
1026
|
}
|
|
1013
1027
|
}
|
|
1014
1028
|
}
|
|
@@ -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: {
|
|
@@ -64,7 +64,11 @@ import { TablePropsProvider } from "./TableContext";
|
|
|
64
64
|
var baseCls = getPrefixCls('agentic-md-editor-content-table');
|
|
65
65
|
var editor = useSlate();
|
|
66
66
|
var tablePath = useMemo(function() {
|
|
67
|
-
|
|
67
|
+
try {
|
|
68
|
+
return ReactEditor.findPath(editor, props.element);
|
|
69
|
+
} catch (unused) {
|
|
70
|
+
return [];
|
|
71
|
+
}
|
|
68
72
|
}, [
|
|
69
73
|
props.element
|
|
70
74
|
]);
|
|
@@ -114,8 +114,12 @@ function forEachCellPath(editor, tablePath, callback) {
|
|
|
114
114
|
}
|
|
115
115
|
export function clearTableSelection(editor, tablePath) {
|
|
116
116
|
forEachCellPath(editor, tablePath, function(_, cellNode) {
|
|
117
|
-
|
|
118
|
-
|
|
117
|
+
try {
|
|
118
|
+
var domNode = ReactEditor.toDOMNode(editor, cellNode);
|
|
119
|
+
domNode === null || domNode === void 0 ? void 0 : domNode.removeAttribute('data-select');
|
|
120
|
+
} catch (unused) {
|
|
121
|
+
// cell may not be mounted yet
|
|
122
|
+
}
|
|
119
123
|
});
|
|
120
124
|
}
|
|
121
125
|
export function selectTableRow(editor, tablePath, rowIndex) {
|
|
@@ -137,8 +141,12 @@ export function selectTableRow(editor, tablePath, rowIndex) {
|
|
|
137
141
|
if (tableCellNode.type !== 'table-cell') {
|
|
138
142
|
continue;
|
|
139
143
|
}
|
|
140
|
-
|
|
141
|
-
|
|
144
|
+
try {
|
|
145
|
+
var domNode = ReactEditor.toDOMNode(editor, tableCellNode);
|
|
146
|
+
domNode === null || domNode === void 0 ? void 0 : domNode.setAttribute('data-select', 'true');
|
|
147
|
+
} catch (unused) {
|
|
148
|
+
// cell may not be mounted yet
|
|
149
|
+
}
|
|
142
150
|
}
|
|
143
151
|
}
|
|
144
152
|
export function selectTableColumn(editor, tablePath, columnIndex) {
|
|
@@ -158,14 +166,22 @@ export function selectTableColumn(editor, tablePath, columnIndex) {
|
|
|
158
166
|
if (tableCellNode.type !== 'table-cell') {
|
|
159
167
|
continue;
|
|
160
168
|
}
|
|
161
|
-
|
|
162
|
-
|
|
169
|
+
try {
|
|
170
|
+
var domNode = ReactEditor.toDOMNode(editor, tableCellNode);
|
|
171
|
+
domNode === null || domNode === void 0 ? void 0 : domNode.setAttribute('data-select', 'true');
|
|
172
|
+
} catch (unused) {
|
|
173
|
+
// cell may not be mounted yet
|
|
174
|
+
}
|
|
163
175
|
}
|
|
164
176
|
}
|
|
165
177
|
export function selectWholeTable(editor, tablePath) {
|
|
166
178
|
forEachCellPath(editor, tablePath, function(_, cellNode) {
|
|
167
|
-
|
|
168
|
-
|
|
179
|
+
try {
|
|
180
|
+
var domNode = ReactEditor.toDOMNode(editor, cellNode);
|
|
181
|
+
domNode === null || domNode === void 0 ? void 0 : domNode.setAttribute('data-select', 'true');
|
|
182
|
+
} catch (unused) {
|
|
183
|
+
// cell may not be mounted yet
|
|
184
|
+
}
|
|
169
185
|
});
|
|
170
186
|
}
|
|
171
187
|
export function removeTableRow(editor, tablePath, rowIndex) {
|
|
@@ -387,20 +387,24 @@ var MLeafComponent = function MLeafComponent(props) {
|
|
|
387
387
|
setTimeout(function() {
|
|
388
388
|
if (!markdownEditorRef.current) return;
|
|
389
389
|
if (!(path === null || path === void 0 ? void 0 : path.length)) return;
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
390
|
+
try {
|
|
391
|
+
var nextPath = Path.next(path);
|
|
392
|
+
if (!Editor.hasPath(markdownEditorRef.current, nextPath)) {
|
|
393
|
+
Transforms.insertNodes(markdownEditorRef.current, [
|
|
394
|
+
{
|
|
395
|
+
text: ' '
|
|
396
|
+
}
|
|
397
|
+
], {
|
|
398
|
+
select: true
|
|
399
|
+
});
|
|
400
|
+
} else {
|
|
401
|
+
Transforms.select(markdownEditorRef.current, {
|
|
402
|
+
anchor: Editor.end(markdownEditorRef.current, path),
|
|
403
|
+
focus: Editor.end(markdownEditorRef.current, path)
|
|
404
|
+
});
|
|
405
|
+
}
|
|
406
|
+
} catch (unused) {
|
|
407
|
+
// path may have become stale after the timeout; ignore
|
|
404
408
|
}
|
|
405
409
|
}, 0);
|
|
406
410
|
},
|
|
@@ -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>;
|
|
@@ -329,6 +329,7 @@ export var MdElements = {
|
|
|
329
329
|
task: {
|
|
330
330
|
reg: /^\s*\[(x|\s)]\s+/,
|
|
331
331
|
matchKey: ' ',
|
|
332
|
+
gatedByMatchInputToNode: true,
|
|
332
333
|
checkAllow: function checkAllow(ctx) {
|
|
333
334
|
var _ctx_node_, _ctx_node;
|
|
334
335
|
if (((_ctx_node = ctx.node) === null || _ctx_node === void 0 ? void 0 : (_ctx_node_ = _ctx_node[0]) === null || _ctx_node_ === void 0 ? void 0 : _ctx_node_.type) === 'paragraph') {
|
|
@@ -362,6 +363,7 @@ export var MdElements = {
|
|
|
362
363
|
},
|
|
363
364
|
list: {
|
|
364
365
|
matchKey: ' ',
|
|
366
|
+
gatedByMatchInputToNode: true,
|
|
365
367
|
reg: /^\s*(\d+\.|-|\*|\+)\s+?/,
|
|
366
368
|
checkAllow: function checkAllow(ctx) {
|
|
367
369
|
var _ctx_node_, _ctx_node;
|
|
@@ -420,7 +422,7 @@ export var MdElements = {
|
|
|
420
422
|
reg: /^\s*(\*\*\*|___|---)\s*$/,
|
|
421
423
|
checkAllow: function checkAllow(ctx) {
|
|
422
424
|
var _ctx_node_, _ctx_node;
|
|
423
|
-
return ((_ctx_node = ctx.node) === null || _ctx_node === void 0 ? void 0 : (_ctx_node_ = _ctx_node[0]) === null || _ctx_node_ === void 0 ? void 0 : _ctx_node_.type) === 'paragraph'
|
|
425
|
+
return ((_ctx_node = ctx.node) === null || _ctx_node === void 0 ? void 0 : (_ctx_node_ = _ctx_node[0]) === null || _ctx_node_ === void 0 ? void 0 : _ctx_node_.type) === 'paragraph';
|
|
424
426
|
},
|
|
425
427
|
run: function run(param) {
|
|
426
428
|
var editor = param.editor, path = param.path;
|
|
@@ -446,7 +448,7 @@ export var MdElements = {
|
|
|
446
448
|
reg: /^\s*(\*\*\*|___|---)\s*/,
|
|
447
449
|
checkAllow: function checkAllow(ctx) {
|
|
448
450
|
var _ctx_node_, _ctx_node;
|
|
449
|
-
return ((_ctx_node = ctx.node) === null || _ctx_node === void 0 ? void 0 : (_ctx_node_ = _ctx_node[0]) === null || _ctx_node_ === void 0 ? void 0 : _ctx_node_.type) === 'paragraph'
|
|
451
|
+
return ((_ctx_node = ctx.node) === null || _ctx_node === void 0 ? void 0 : (_ctx_node_ = _ctx_node[0]) === null || _ctx_node_ === void 0 ? void 0 : _ctx_node_.type) === 'paragraph';
|
|
450
452
|
},
|
|
451
453
|
run: function run(param) {
|
|
452
454
|
var editor = param.editor, path = param.path;
|