@ant-design/agentic-ui 2.29.7 → 2.29.8

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 (83) hide show
  1. package/dist/ChatLayout/components/FooterBackgroundLottie/index.js +1 -1
  2. package/dist/MarkdownEditor/BaseMarkdownEditor.js +1 -1
  3. package/dist/MarkdownEditor/editor/elements/Blockquote/ReadonlyBlockquote.d.ts +33 -0
  4. package/dist/MarkdownEditor/editor/elements/Blockquote/ReadonlyBlockquote.js +69 -0
  5. package/dist/MarkdownEditor/editor/elements/Break/ReadonlyBreak.d.ts +30 -0
  6. package/dist/MarkdownEditor/editor/elements/Break/ReadonlyBreak.js +88 -0
  7. package/dist/MarkdownEditor/editor/elements/Card/ReadonlyCard.d.ts +34 -0
  8. package/dist/MarkdownEditor/editor/elements/Card/ReadonlyCard.js +96 -0
  9. package/dist/MarkdownEditor/editor/elements/Code/ReadonlyCode.d.ts +33 -0
  10. package/dist/MarkdownEditor/editor/elements/Code/ReadonlyCode.js +145 -0
  11. package/dist/MarkdownEditor/editor/elements/FootnoteDefinition/ReadonlyFootnoteDefinition.d.ts +34 -0
  12. package/dist/MarkdownEditor/editor/elements/FootnoteDefinition/ReadonlyFootnoteDefinition.js +125 -0
  13. package/dist/MarkdownEditor/editor/elements/FootnoteReference/ReadonlyFootnoteReference.d.ts +34 -0
  14. package/dist/MarkdownEditor/editor/elements/FootnoteReference/ReadonlyFootnoteReference.js +101 -0
  15. package/dist/MarkdownEditor/editor/elements/Head/ReadonlyHead.d.ts +35 -0
  16. package/dist/MarkdownEditor/editor/elements/Head/ReadonlyHead.js +111 -0
  17. package/dist/MarkdownEditor/editor/elements/Head/index.d.ts +3 -0
  18. package/dist/MarkdownEditor/editor/elements/Head/index.js +3 -1
  19. package/dist/MarkdownEditor/editor/elements/Hr/ReadonlyHr.d.ts +30 -0
  20. package/dist/MarkdownEditor/editor/elements/Hr/ReadonlyHr.js +95 -0
  21. package/dist/MarkdownEditor/editor/elements/Image/ReadonlyEditorImage.d.ts +35 -0
  22. package/dist/MarkdownEditor/editor/elements/Image/ReadonlyEditorImage.js +426 -0
  23. package/dist/MarkdownEditor/editor/elements/Image/index.js +38 -50
  24. package/dist/MarkdownEditor/editor/elements/InlineKatex/ReadonlyInlineKatex.d.ts +32 -0
  25. package/dist/MarkdownEditor/editor/elements/InlineKatex/ReadonlyInlineKatex.js +100 -0
  26. package/dist/MarkdownEditor/editor/elements/Katex/ReadonlyKatex.d.ts +32 -0
  27. package/dist/MarkdownEditor/editor/elements/Katex/ReadonlyKatex.js +110 -0
  28. package/dist/MarkdownEditor/editor/elements/LinkCard/ReadonlyLinkCard.d.ts +40 -0
  29. package/dist/MarkdownEditor/editor/elements/LinkCard/ReadonlyLinkCard.js +215 -0
  30. package/dist/MarkdownEditor/editor/elements/List/List.js +27 -12
  31. package/dist/MarkdownEditor/editor/elements/List/ReadonlyList.d.ts +33 -0
  32. package/dist/MarkdownEditor/editor/elements/List/ReadonlyList.js +93 -0
  33. package/dist/MarkdownEditor/editor/elements/List/ReadonlyListItem.d.ts +35 -0
  34. package/dist/MarkdownEditor/editor/elements/List/ReadonlyListItem.js +138 -0
  35. package/dist/MarkdownEditor/editor/elements/Media/ReadonlyMedia.d.ts +36 -0
  36. package/dist/MarkdownEditor/editor/elements/Media/ReadonlyMedia.js +600 -0
  37. package/dist/MarkdownEditor/editor/elements/Mermaid/ReadonlyMermaid.d.ts +32 -0
  38. package/dist/MarkdownEditor/editor/elements/Mermaid/ReadonlyMermaid.js +101 -0
  39. package/dist/MarkdownEditor/editor/elements/Paragraph/ReadonlyParagraph.d.ts +35 -0
  40. package/dist/MarkdownEditor/editor/elements/Paragraph/ReadonlyParagraph.js +109 -0
  41. package/dist/MarkdownEditor/editor/elements/Paragraph/index.js +2 -1
  42. package/dist/MarkdownEditor/editor/elements/Schema/ReadonlySchema.d.ts +33 -0
  43. package/dist/MarkdownEditor/editor/elements/Schema/ReadonlySchema.js +163 -0
  44. package/dist/MarkdownEditor/editor/elements/index.d.ts +20 -1
  45. package/dist/MarkdownEditor/editor/elements/index.js +65 -29
  46. package/dist/MarkdownEditor/editor/parser/parse/parseBlockElements.js +18 -10
  47. package/dist/MarkdownEditor/editor/parser/parserSlateNodeToMarkdown.js +64 -21
  48. package/dist/MarkdownEditor/editor/plugins/elements.js +60 -6
  49. package/dist/MarkdownEditor/editor/plugins/hotKeyCommands/backspace.js +97 -39
  50. package/dist/MarkdownEditor/editor/plugins/hotKeyCommands/tab.d.ts +14 -0
  51. package/dist/MarkdownEditor/editor/plugins/hotKeyCommands/tab.js +117 -90
  52. package/dist/MarkdownEditor/editor/plugins/index.d.ts +8 -0
  53. package/dist/MarkdownEditor/editor/plugins/index.js +8 -0
  54. package/dist/MarkdownEditor/editor/plugins/insertParsedHtmlNodes.d.ts +12 -6
  55. package/dist/MarkdownEditor/editor/plugins/insertParsedHtmlNodes.js +67 -42
  56. package/dist/MarkdownEditor/editor/plugins/utils.d.ts +31 -0
  57. package/dist/MarkdownEditor/editor/plugins/utils.js +75 -0
  58. package/dist/MarkdownEditor/editor/plugins/withCardPlugin.d.ts +15 -0
  59. package/dist/MarkdownEditor/editor/plugins/withCardPlugin.js +329 -0
  60. package/dist/MarkdownEditor/editor/plugins/withCodeTagPlugin.d.ts +11 -0
  61. package/dist/MarkdownEditor/editor/plugins/withCodeTagPlugin.js +299 -0
  62. package/dist/MarkdownEditor/editor/plugins/withInlineNodes.d.ts +12 -0
  63. package/dist/MarkdownEditor/editor/plugins/withInlineNodes.js +17 -0
  64. package/dist/MarkdownEditor/editor/plugins/withLinkAndMediaPlugin.d.ts +11 -0
  65. package/dist/MarkdownEditor/editor/plugins/withLinkAndMediaPlugin.js +70 -0
  66. package/dist/MarkdownEditor/editor/plugins/withListsPlugin.d.ts +23 -0
  67. package/dist/MarkdownEditor/editor/plugins/withListsPlugin.js +204 -0
  68. package/dist/MarkdownEditor/editor/plugins/withMarkdown.d.ts +9 -12
  69. package/dist/MarkdownEditor/editor/plugins/withMarkdown.js +17 -764
  70. package/dist/MarkdownEditor/editor/plugins/withSchemaPlugin.d.ts +11 -0
  71. package/dist/MarkdownEditor/editor/plugins/withSchemaPlugin.js +55 -0
  72. package/dist/MarkdownEditor/editor/plugins/withVoidNodes.d.ts +12 -0
  73. package/dist/MarkdownEditor/editor/plugins/withVoidNodes.js +17 -0
  74. package/dist/MarkdownEditor/editor/store.js +1 -1
  75. package/dist/MarkdownEditor/editor/utils/docx/module.js +41 -8
  76. package/dist/MarkdownEditor/editor/utils/editorCommands.d.ts +97 -0
  77. package/dist/MarkdownEditor/editor/utils/editorCommands.js +966 -0
  78. package/dist/MarkdownEditor/editor/utils/editorUtils.js +2 -2
  79. package/dist/MarkdownEditor/editor/utils/keyboard.js +15 -391
  80. package/dist/MarkdownEditor/el.d.ts +12 -5
  81. package/dist/MarkdownInputField/MarkdownInputField.js +10 -23
  82. package/dist/MarkdownInputField/style.js +9 -4
  83. package/package.json +8 -8
@@ -0,0 +1,600 @@
1
+ function _array_like_to_array(arr, len) {
2
+ if (len == null || len > arr.length) len = arr.length;
3
+ for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];
4
+ return arr2;
5
+ }
6
+ function _array_with_holes(arr) {
7
+ if (Array.isArray(arr)) return arr;
8
+ }
9
+ function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
10
+ try {
11
+ var info = gen[key](arg);
12
+ var value = info.value;
13
+ } catch (error) {
14
+ reject(error);
15
+ return;
16
+ }
17
+ if (info.done) {
18
+ resolve(value);
19
+ } else {
20
+ Promise.resolve(value).then(_next, _throw);
21
+ }
22
+ }
23
+ function _async_to_generator(fn) {
24
+ return function() {
25
+ var self = this, args = arguments;
26
+ return new Promise(function(resolve, reject) {
27
+ var gen = fn.apply(self, args);
28
+ function _next(value) {
29
+ asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value);
30
+ }
31
+ function _throw(err) {
32
+ asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err);
33
+ }
34
+ _next(undefined);
35
+ });
36
+ };
37
+ }
38
+ function _iterable_to_array_limit(arr, i) {
39
+ var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"];
40
+ if (_i == null) return;
41
+ var _arr = [];
42
+ var _n = true;
43
+ var _d = false;
44
+ var _s, _e;
45
+ try {
46
+ for(_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true){
47
+ _arr.push(_s.value);
48
+ if (i && _arr.length === i) break;
49
+ }
50
+ } catch (err) {
51
+ _d = true;
52
+ _e = err;
53
+ } finally{
54
+ try {
55
+ if (!_n && _i["return"] != null) _i["return"]();
56
+ } finally{
57
+ if (_d) throw _e;
58
+ }
59
+ }
60
+ return _arr;
61
+ }
62
+ function _non_iterable_rest() {
63
+ throw new TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
64
+ }
65
+ function _sliced_to_array(arr, i) {
66
+ return _array_with_holes(arr) || _iterable_to_array_limit(arr, i) || _unsupported_iterable_to_array(arr, i) || _non_iterable_rest();
67
+ }
68
+ function _unsupported_iterable_to_array(o, minLen) {
69
+ if (!o) return;
70
+ if (typeof o === "string") return _array_like_to_array(o, minLen);
71
+ var n = Object.prototype.toString.call(o).slice(8, -1);
72
+ if (n === "Object" && o.constructor) n = o.constructor.name;
73
+ if (n === "Map" || n === "Set") return Array.from(n);
74
+ if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _array_like_to_array(o, minLen);
75
+ }
76
+ function _ts_generator(thisArg, body) {
77
+ var f, y, t, _ = {
78
+ label: 0,
79
+ sent: function() {
80
+ if (t[0] & 1) throw t[1];
81
+ return t[1];
82
+ },
83
+ trys: [],
84
+ ops: []
85
+ }, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype), d = Object.defineProperty;
86
+ return d(g, "next", {
87
+ value: verb(0)
88
+ }), d(g, "throw", {
89
+ value: verb(1)
90
+ }), d(g, "return", {
91
+ value: verb(2)
92
+ }), typeof Symbol === "function" && d(g, Symbol.iterator, {
93
+ value: function() {
94
+ return this;
95
+ }
96
+ }), g;
97
+ function verb(n) {
98
+ return function(v) {
99
+ return step([
100
+ n,
101
+ v
102
+ ]);
103
+ };
104
+ }
105
+ function step(op) {
106
+ if (f) throw new TypeError("Generator is already executing.");
107
+ while(g && (g = 0, op[0] && (_ = 0)), _)try {
108
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
109
+ if (y = 0, t) op = [
110
+ op[0] & 2,
111
+ t.value
112
+ ];
113
+ switch(op[0]){
114
+ case 0:
115
+ case 1:
116
+ t = op;
117
+ break;
118
+ case 4:
119
+ _.label++;
120
+ return {
121
+ value: op[1],
122
+ done: false
123
+ };
124
+ case 5:
125
+ _.label++;
126
+ y = op[1];
127
+ op = [
128
+ 0
129
+ ];
130
+ continue;
131
+ case 7:
132
+ op = _.ops.pop();
133
+ _.trys.pop();
134
+ continue;
135
+ default:
136
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {
137
+ _ = 0;
138
+ continue;
139
+ }
140
+ if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {
141
+ _.label = op[1];
142
+ break;
143
+ }
144
+ if (op[0] === 6 && _.label < t[1]) {
145
+ _.label = t[1];
146
+ t = op;
147
+ break;
148
+ }
149
+ if (t && _.label < t[2]) {
150
+ _.label = t[2];
151
+ _.ops.push(op);
152
+ break;
153
+ }
154
+ if (t[2]) _.ops.pop();
155
+ _.trys.pop();
156
+ continue;
157
+ }
158
+ op = body.call(thisArg, _);
159
+ } catch (e) {
160
+ op = [
161
+ 6,
162
+ e
163
+ ];
164
+ y = 0;
165
+ } finally{
166
+ f = t = 0;
167
+ }
168
+ if (op[0] & 5) throw op[1];
169
+ return {
170
+ value: op[0] ? op[1] : void 0,
171
+ done: true
172
+ };
173
+ }
174
+ }
175
+ import { LoadingOutlined } from "@ant-design/icons";
176
+ import { Skeleton } from "antd";
177
+ import React, { useEffect, useLayoutEffect, useMemo, useState } from "react";
178
+ import { useRefFunction } from "../../../../Hooks/useRefFunction";
179
+ import { MediaErrorLink } from "../../components/MediaErrorLink";
180
+ import { useGetSetState } from "../../utils";
181
+ import { getMediaType } from "../../utils/dom";
182
+ import { ReadonlyImage } from "../Image";
183
+ /**
184
+ * ReadonlyMedia 组件 - 只读媒体预览组件
185
+ *
186
+ * 专门针对 readonly 模式优化的媒体组件,移除了编辑相关功能(调整大小、删除等)。
187
+ * 简化渲染逻辑,提升预览模式性能。
188
+ *
189
+ * @component
190
+ * @description 只读媒体预览组件,用于预览模式下的媒体渲染
191
+ * @param {ElementProps<MediaNode>} props - 组件属性
192
+ * @param {MediaNode} props.element - 媒体节点元素
193
+ * @param {React.ReactNode} props.children - 子组件内容
194
+ * @param {Object} props.attributes - 元素属性
195
+ *
196
+ * @example
197
+ * ```tsx
198
+ * <ReadonlyMedia
199
+ * element={mediaNode}
200
+ * attributes={attributes}
201
+ * >
202
+ * 媒体内容
203
+ * </ReadonlyMedia>
204
+ * ```
205
+ *
206
+ * @returns {React.ReactElement} 渲染的只读媒体组件
207
+ *
208
+ * @remarks
209
+ * - 移除调整大小功能
210
+ * - 移除删除功能
211
+ * - 移除选择状态管理
212
+ * - 简化状态管理逻辑
213
+ * - 使用 React.memo 优化性能
214
+ * - 保持预览模式的视觉效果
215
+ */ export var ReadonlyMedia = /*#__PURE__*/ React.memo(function(param) {
216
+ var element = param.element, attributes = param.attributes, children = param.children;
217
+ var _state, _state1;
218
+ var _useState = _sliced_to_array(useState(false), 2), showAsText = _useState[0], setShowAsText = _useState[1];
219
+ var _useGetSetState = _sliced_to_array(useGetSetState({
220
+ loadSuccess: true,
221
+ url: '',
222
+ type: getMediaType(element === null || element === void 0 ? void 0 : element.url, element.alt)
223
+ }), 2), state = _useGetSetState[0], setState = _useGetSetState[1];
224
+ // 如果 finished 为 false,设置 5 秒超时,超时后显示为文本
225
+ useEffect(function() {
226
+ if (element.finished === false) {
227
+ setShowAsText(false);
228
+ var timer = setTimeout(function() {
229
+ setShowAsText(true);
230
+ }, 5000);
231
+ return function() {
232
+ clearTimeout(timer);
233
+ };
234
+ } else {
235
+ setShowAsText(false);
236
+ }
237
+ }, [
238
+ element.finished
239
+ ]);
240
+ var initial = useRefFunction(function() {
241
+ return _async_to_generator(function() {
242
+ var type, finalType, realUrl, img, video, audio;
243
+ return _ts_generator(this, function(_state) {
244
+ type = getMediaType(element === null || element === void 0 ? void 0 : element.url, element.alt);
245
+ type = !type ? 'image' : type;
246
+ finalType = [
247
+ 'image',
248
+ 'video',
249
+ 'autio',
250
+ 'attachment'
251
+ ].includes(type) ? type : 'other';
252
+ setState({
253
+ type: finalType
254
+ });
255
+ realUrl = element === null || element === void 0 ? void 0 : element.url;
256
+ setState({
257
+ url: realUrl
258
+ });
259
+ if (finalType === 'image' || finalType === 'other') {
260
+ img = document.createElement('img');
261
+ img.referrerPolicy = 'no-referrer';
262
+ img.crossOrigin = 'anonymous';
263
+ img.src = realUrl;
264
+ img.onerror = function() {
265
+ setState({
266
+ loadSuccess: false
267
+ });
268
+ };
269
+ img.onload = function() {
270
+ return setState({
271
+ loadSuccess: true
272
+ });
273
+ };
274
+ }
275
+ if (finalType === 'video') {
276
+ video = document.createElement('video');
277
+ video.src = realUrl;
278
+ video.preload = 'metadata';
279
+ video.onerror = function() {
280
+ setState({
281
+ loadSuccess: false
282
+ });
283
+ };
284
+ video.onloadedmetadata = function() {
285
+ setState({
286
+ loadSuccess: true
287
+ });
288
+ };
289
+ }
290
+ if (finalType === 'audio') {
291
+ audio = document.createElement('audio');
292
+ audio.src = realUrl;
293
+ audio.preload = 'metadata';
294
+ audio.onerror = function() {
295
+ setState({
296
+ loadSuccess: false
297
+ });
298
+ };
299
+ audio.onloadedmetadata = function() {
300
+ setState({
301
+ loadSuccess: true
302
+ });
303
+ };
304
+ }
305
+ return [
306
+ 2
307
+ ];
308
+ });
309
+ })();
310
+ });
311
+ useLayoutEffect(function() {
312
+ initial();
313
+ }, [
314
+ element === null || element === void 0 ? void 0 : element.url
315
+ ]);
316
+ // 图片预览
317
+ var imageDom = useMemo(function() {
318
+ var _state;
319
+ if (state().type !== 'image' && state().type !== 'other') return null;
320
+ // 检查是否为不完整的图片(finished 状态)
321
+ if (element.finished === false) {
322
+ // 如果 5 秒后仍未完成,显示为文本
323
+ if (showAsText) {
324
+ return /*#__PURE__*/ React.createElement("div", {
325
+ style: {
326
+ padding: '8px 12px',
327
+ border: '1px solid #d9d9d9',
328
+ borderRadius: '4px',
329
+ color: 'rgba(0, 0, 0, 0.65)',
330
+ wordBreak: 'break-all'
331
+ }
332
+ }, element.alt || element.url || '图片链接');
333
+ }
334
+ // 5 秒内显示 loading 状态的占位符
335
+ return /*#__PURE__*/ React.createElement(Skeleton.Image, {
336
+ active: true
337
+ });
338
+ }
339
+ return /*#__PURE__*/ React.createElement(ReadonlyImage, {
340
+ src: ((_state = state()) === null || _state === void 0 ? void 0 : _state.url) || (element === null || element === void 0 ? void 0 : element.url),
341
+ alt: (element === null || element === void 0 ? void 0 : element.alt) || 'image',
342
+ width: element.width,
343
+ height: element.height,
344
+ crossOrigin: "anonymous"
345
+ });
346
+ }, [
347
+ state().type,
348
+ (_state = state()) === null || _state === void 0 ? void 0 : _state.url,
349
+ element.finished,
350
+ showAsText,
351
+ element.url,
352
+ element.alt,
353
+ element.width,
354
+ element.height
355
+ ]);
356
+ // 媒体元素预览(video、audio、attachment)
357
+ var mediaElement = useMemo(function() {
358
+ var _element_otherProps;
359
+ var rawMarkdown = (element === null || element === void 0 ? void 0 : element.rawMarkdown) || (element === null || element === void 0 ? void 0 : (_element_otherProps = element.otherProps) === null || _element_otherProps === void 0 ? void 0 : _element_otherProps.rawMarkdown);
360
+ if (state().type === 'video') {
361
+ var _state;
362
+ // 如果是不完整状态
363
+ if (element.finished === false) {
364
+ // 如果 5 秒后仍未完成,显示为文本
365
+ if (showAsText) {
366
+ return /*#__PURE__*/ React.createElement("div", {
367
+ style: {
368
+ padding: '8px 12px',
369
+ border: '1px solid #d9d9d9',
370
+ borderRadius: '4px',
371
+ color: 'rgba(0, 0, 0, 0.65)',
372
+ wordBreak: 'break-all'
373
+ }
374
+ }, element.alt || element.url || '视频链接');
375
+ }
376
+ // 5 秒内显示 loading 占位符
377
+ return /*#__PURE__*/ React.createElement(Skeleton.Image, {
378
+ active: true
379
+ });
380
+ }
381
+ if (!state().loadSuccess) {
382
+ var _state1, _state2;
383
+ return /*#__PURE__*/ React.createElement(MediaErrorLink, {
384
+ url: (_state1 = state()) === null || _state1 === void 0 ? void 0 : _state1.url,
385
+ fallbackUrl: element === null || element === void 0 ? void 0 : element.url,
386
+ displayText: element.alt || ((_state2 = state()) === null || _state2 === void 0 ? void 0 : _state2.url) || (element === null || element === void 0 ? void 0 : element.url) || '视频链接'
387
+ });
388
+ }
389
+ return /*#__PURE__*/ React.createElement("video", {
390
+ "data-testid": "video-element",
391
+ controls: element.controls !== false,
392
+ autoPlay: element.autoplay,
393
+ loop: element.loop,
394
+ muted: element.muted,
395
+ poster: element.poster,
396
+ style: {
397
+ width: element.width ? "".concat(element.width, "px") : '100%',
398
+ height: element.height ? "".concat(element.height, "px") : 'auto',
399
+ maxWidth: '100%',
400
+ borderRadius: '6px',
401
+ boxShadow: '0 2px 8px rgba(0, 0, 0, 0.1)',
402
+ display: 'block'
403
+ },
404
+ src: ((_state = state()) === null || _state === void 0 ? void 0 : _state.url) || '',
405
+ preload: "metadata",
406
+ onError: function() {
407
+ var _state;
408
+ console.warn('Video failed to load:', (_state = state()) === null || _state === void 0 ? void 0 : _state.url);
409
+ setState({
410
+ loadSuccess: false
411
+ });
412
+ }
413
+ });
414
+ }
415
+ if (state().type === 'audio') {
416
+ var _state3;
417
+ // 如果是不完整状态
418
+ if (element.finished === false) {
419
+ // 如果 5 秒后仍未完成,显示为文本
420
+ if (showAsText) {
421
+ return /*#__PURE__*/ React.createElement("div", {
422
+ style: {
423
+ padding: '8px 12px',
424
+ border: '1px solid #d9d9d9',
425
+ borderRadius: '4px',
426
+ color: 'rgba(0, 0, 0, 0.65)',
427
+ wordBreak: 'break-all'
428
+ }
429
+ }, element.alt || element.url || '音频链接');
430
+ }
431
+ // 5 秒内显示 loading 占位符
432
+ return /*#__PURE__*/ React.createElement("div", {
433
+ style: {
434
+ display: 'inline-flex',
435
+ alignItems: 'center',
436
+ gap: '8px',
437
+ padding: '12px 16px',
438
+ border: '1px dashed #d9d9d9',
439
+ borderRadius: '6px',
440
+ backgroundColor: '#fafafa',
441
+ minWidth: '200px',
442
+ justifyContent: 'center'
443
+ }
444
+ }, /*#__PURE__*/ React.createElement(LoadingOutlined, {
445
+ style: {
446
+ color: '#1890ff',
447
+ fontSize: '16px'
448
+ },
449
+ spin: true
450
+ }), /*#__PURE__*/ React.createElement("span", {
451
+ style: {
452
+ color: '#666',
453
+ fontSize: '13px',
454
+ wordBreak: 'break-all'
455
+ }
456
+ }, rawMarkdown || (element === null || element === void 0 ? void 0 : element.alt) || '音频加载中...'));
457
+ }
458
+ if (!state().loadSuccess) {
459
+ var _state4, _state5;
460
+ return /*#__PURE__*/ React.createElement(MediaErrorLink, {
461
+ url: (_state4 = state()) === null || _state4 === void 0 ? void 0 : _state4.url,
462
+ fallbackUrl: element === null || element === void 0 ? void 0 : element.url,
463
+ displayText: element.alt || ((_state5 = state()) === null || _state5 === void 0 ? void 0 : _state5.url) || (element === null || element === void 0 ? void 0 : element.url) || '音频链接'
464
+ });
465
+ }
466
+ return /*#__PURE__*/ React.createElement("audio", {
467
+ "data-testid": "audio-element",
468
+ controls: true,
469
+ style: {
470
+ width: '100%',
471
+ height: 'auto'
472
+ },
473
+ src: ((_state3 = state()) === null || _state3 === void 0 ? void 0 : _state3.url) || '',
474
+ onError: function() {
475
+ var _state;
476
+ console.warn('Audio failed to load:', (_state = state()) === null || _state === void 0 ? void 0 : _state.url);
477
+ setState({
478
+ loadSuccess: false
479
+ });
480
+ }
481
+ }, "Your browser does not support the", /*#__PURE__*/ React.createElement("code", null, "audio"), " element.");
482
+ }
483
+ if (state().type === 'attachment') {
484
+ var _state6;
485
+ return /*#__PURE__*/ React.createElement("div", {
486
+ style: {
487
+ padding: 12,
488
+ boxSizing: 'border-box',
489
+ border: '1px solid #f0f0f0',
490
+ borderRadius: '0.5em',
491
+ width: '100%',
492
+ backgroundImage: 'linear-gradient(rgb(249, 251, 255) 0%, rgb(243, 248, 255) 100%)',
493
+ flex: 1,
494
+ display: 'flex',
495
+ alignItems: 'center',
496
+ gap: 12,
497
+ color: '#262626',
498
+ justifyContent: 'space-between'
499
+ }
500
+ }, /*#__PURE__*/ React.createElement("div", {
501
+ style: {
502
+ display: 'flex',
503
+ alignItems: 'center',
504
+ gap: 12,
505
+ color: '#262626',
506
+ fontSize: 16,
507
+ flex: 1,
508
+ minWidth: 0
509
+ }
510
+ }, /*#__PURE__*/ React.createElement("div", {
511
+ style: {
512
+ width: 40,
513
+ height: 40,
514
+ borderRadius: '0.25em',
515
+ backgroundColor: '#fff',
516
+ display: 'flex',
517
+ alignItems: 'center',
518
+ justifyContent: 'center',
519
+ fontSize: 20
520
+ }
521
+ }, "\uD83D\uDCCE"), /*#__PURE__*/ React.createElement("div", {
522
+ style: {
523
+ flex: 1,
524
+ minWidth: 0,
525
+ overflow: 'hidden',
526
+ textOverflow: 'ellipsis',
527
+ whiteSpace: 'nowrap'
528
+ }
529
+ }, element.alt || element.url || '附件')), /*#__PURE__*/ React.createElement("div", {
530
+ "data-icon-box": true,
531
+ style: {
532
+ padding: '0 18px'
533
+ }
534
+ }, /*#__PURE__*/ React.createElement("a", {
535
+ href: (_state6 = state()) === null || _state6 === void 0 ? void 0 : _state6.url,
536
+ target: "_blank",
537
+ rel: "noopener noreferrer",
538
+ style: {
539
+ fontSize: 16,
540
+ cursor: 'pointer',
541
+ color: '#1677ff'
542
+ }
543
+ }, "查看")));
544
+ }
545
+ return null;
546
+ }, [
547
+ state().type,
548
+ (_state1 = state()) === null || _state1 === void 0 ? void 0 : _state1.url,
549
+ element.finished,
550
+ showAsText,
551
+ element === null || element === void 0 ? void 0 : element.rawMarkdown,
552
+ element.url,
553
+ element.alt,
554
+ element.width,
555
+ element.height,
556
+ element.controls,
557
+ element.autoplay,
558
+ element.loop,
559
+ element.muted,
560
+ element.poster,
561
+ state().loadSuccess
562
+ ]);
563
+ return /*#__PURE__*/ React.createElement("div", attributes, /*#__PURE__*/ React.createElement("div", {
564
+ "data-be": "media",
565
+ "data-testid": "media-container",
566
+ style: {
567
+ position: 'relative',
568
+ display: 'flex',
569
+ alignItems: 'flex-end',
570
+ userSelect: 'none',
571
+ WebkitUserSelect: 'none',
572
+ MozUserSelect: 'none',
573
+ msUserSelect: 'none',
574
+ width: '100%',
575
+ maxWidth: '100%',
576
+ boxSizing: 'border-box'
577
+ },
578
+ draggable: false
579
+ }, /*#__PURE__*/ React.createElement("div", {
580
+ tabIndex: -1,
581
+ style: {
582
+ color: 'transparent',
583
+ padding: 4,
584
+ userSelect: 'none',
585
+ display: 'flex',
586
+ flexDirection: 'column',
587
+ width: mediaElement ? '100%' : undefined,
588
+ maxWidth: '100%',
589
+ boxSizing: 'border-box'
590
+ },
591
+ draggable: false,
592
+ contentEditable: false,
593
+ "data-be": "media-container"
594
+ }, mediaElement, imageDom, /*#__PURE__*/ React.createElement("div", {
595
+ style: {
596
+ display: 'none'
597
+ }
598
+ }, children))));
599
+ });
600
+ ReadonlyMedia.displayName = 'ReadonlyMedia';
@@ -0,0 +1,32 @@
1
+ import React from 'react';
2
+ import { RenderElementProps } from 'slate-react';
3
+ /**
4
+ * ReadonlyMermaid 组件 - 只读 Mermaid 图表预览组件
5
+ *
6
+ * 专门针对 readonly 模式优化的 Mermaid 图表组件。
7
+ * 简化渲染逻辑,提升预览模式性能。
8
+ *
9
+ * @component
10
+ * @description 只读 Mermaid 图表预览组件,用于预览模式下的 Mermaid 图表渲染
11
+ * @param {RenderElementProps} props - 组件属性
12
+ * @param {any} props.element - Mermaid 图表节点元素
13
+ * @param {React.ReactNode} props.children - 子组件内容
14
+ * @param {Object} props.attributes - 元素属性
15
+ *
16
+ * @example
17
+ * ```tsx
18
+ * <ReadonlyMermaid
19
+ * element={mermaidNode}
20
+ * attributes={attributes}
21
+ * >
22
+ * 图表内容
23
+ * </ReadonlyMermaid>
24
+ * ```
25
+ *
26
+ * @returns {React.ReactElement} 渲染的只读 Mermaid 图表组件
27
+ *
28
+ * @remarks
29
+ * - 使用 React.memo 优化性能
30
+ * - 保持预览模式的视觉效果
31
+ */
32
+ export declare const ReadonlyMermaid: React.FC<RenderElementProps>;