@ant-design/agentic-ui 2.30.25 → 2.30.26

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 (55) hide show
  1. package/dist/Bubble/AIBubble.js +2 -3
  2. package/dist/Bubble/Bubble.js +3 -2
  3. package/dist/Bubble/List/index.js +130 -23
  4. package/dist/Bubble/MessagesContent/index.js +94 -74
  5. package/dist/Bubble/OpenAIMessageBubble/index.d.ts +6 -6
  6. package/dist/Bubble/OpenAIMessageBubble/index.js +3 -3
  7. package/dist/Bubble/OpenAIMessageBubble/mapOllamaMessages.d.ts +1 -1
  8. package/dist/Bubble/OpenAIMessageBubble/mapOpenClawMessages.d.ts +1 -1
  9. package/dist/Bubble/OpenAIMessageBubble/normalizeOllamaMessages.d.ts +1 -1
  10. package/dist/Bubble/OpenAIMessageBubble/normalizeOpenClawMessages.d.ts +1 -1
  11. package/dist/Bubble/OpenAIMessageBubble/types.d.ts +1 -1
  12. package/dist/Bubble/OpenAIMessageBubble/useOllamaMessageBubbleData.d.ts +1 -1
  13. package/dist/Bubble/OpenAIMessageBubble/useOpenClawMessageBubbleData.d.ts +1 -1
  14. package/dist/Bubble/bubblePropsAreEqual.d.ts +23 -0
  15. package/dist/Bubble/bubblePropsAreEqual.js +272 -0
  16. package/dist/Components/TypingAnimation/index.d.ts +4 -1
  17. package/dist/Components/TypingAnimation/index.js +5 -3
  18. package/dist/MarkdownEditor/BaseMarkdownEditor.js +3 -2
  19. package/dist/MarkdownEditor/editor/elements/FootnoteDefinition/index.js +1 -2
  20. package/dist/MarkdownEditor/editor/elements/FootnoteReference/index.js +1 -2
  21. package/dist/MarkdownEditor/editor/elements/Head/index.js +1 -2
  22. package/dist/MarkdownEditor/editor/elements/LinkCard/index.js +1 -2
  23. package/dist/MarkdownEditor/editor/elements/Paragraph/ReadonlyParagraph.js +6 -3
  24. package/dist/MarkdownEditor/editor/elements/Paragraph/index.js +10 -30
  25. package/dist/MarkdownEditor/editor/elements/Table/EditableTable.js +1 -1
  26. package/dist/MarkdownEditor/editor/elements/index.js +1 -1
  27. package/dist/MarkdownEditor/editor/parser/parserMarkdownToSlateNode.js +1 -1
  28. package/dist/MarkdownEditor/editor/plugins/withMarkdown.js +1 -1
  29. package/dist/MarkdownEditor/editor/plugins/withSanitizeInvalidChildren.js +69 -38
  30. package/dist/MarkdownEditor/editor/store.d.ts +3 -0
  31. package/dist/MarkdownEditor/editor/store.js +1 -0
  32. package/dist/MarkdownEditor/editor/tools/InsertAutocomplete.js +1 -0
  33. package/dist/MarkdownEditor/style.js +0 -6
  34. package/dist/MarkdownInputField/hooks/useMarkdownInputFieldRefs.js +0 -3
  35. package/dist/MarkdownRenderer/MarkdownRenderer.js +2 -2
  36. package/dist/MarkdownRenderer/index.d.ts +2 -2
  37. package/dist/MarkdownRenderer/index.js +1 -1
  38. package/dist/MarkdownRenderer/streaming/MarkdownBlockPiece.d.ts +1 -1
  39. package/dist/MarkdownRenderer/streaming/MarkdownBlockPiece.js +15 -3
  40. package/dist/MarkdownRenderer/streaming/useStreamingMarkdownReact.d.ts +2 -1
  41. package/dist/MarkdownRenderer/streaming/useStreamingMarkdownReact.js +4 -4
  42. package/dist/Plugins/chart/BarChart/index.js +1 -1
  43. package/dist/Plugins/chart/ChartAttrToolBar/index.js +1 -1
  44. package/dist/Plugins/chart/index.d.ts +1 -1
  45. package/dist/Plugins/code/utils/index.d.ts +1 -1
  46. package/dist/Plugins/mermaid/MermaidRendererImpl.js +53 -419
  47. package/dist/Plugins/mermaid/index.js +1 -2
  48. package/dist/Plugins/mermaid/style.js +57 -59
  49. package/dist/Plugins/mermaid/utils.js +67 -8
  50. package/dist/Schema/SchemaForm/index.js +1 -1
  51. package/dist/Workspace/File/FileComponent.js +1 -1
  52. package/dist/Workspace/File/PreviewComponent.js +16 -2
  53. package/dist/Workspace/File/index.d.ts +1 -1
  54. package/dist/Workspace/File/index.js +2 -1
  55. package/package.json +2 -1
@@ -1,107 +1,11 @@
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 _define_property(obj, key, value) {
10
- if (key in obj) {
11
- Object.defineProperty(obj, key, {
12
- value: value,
13
- enumerable: true,
14
- configurable: true,
15
- writable: true
16
- });
17
- } else {
18
- obj[key] = value;
19
- }
20
- return obj;
21
- }
22
- function _iterable_to_array_limit(arr, i) {
23
- var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"];
24
- if (_i == null) return;
25
- var _arr = [];
26
- var _n = true;
27
- var _d = false;
28
- var _s, _e;
29
- try {
30
- for(_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true){
31
- _arr.push(_s.value);
32
- if (i && _arr.length === i) break;
33
- }
34
- } catch (err) {
35
- _d = true;
36
- _e = err;
37
- } finally{
38
- try {
39
- if (!_n && _i["return"] != null) _i["return"]();
40
- } finally{
41
- if (_d) throw _e;
42
- }
43
- }
44
- return _arr;
45
- }
46
- function _non_iterable_rest() {
47
- throw new TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
48
- }
49
- function _object_spread(target) {
50
- for(var i = 1; i < arguments.length; i++){
51
- var source = arguments[i] != null ? arguments[i] : {};
52
- var ownKeys = Object.keys(source);
53
- if (typeof Object.getOwnPropertySymbols === "function") {
54
- ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function(sym) {
55
- return Object.getOwnPropertyDescriptor(source, sym).enumerable;
56
- }));
57
- }
58
- ownKeys.forEach(function(key) {
59
- _define_property(target, key, source[key]);
60
- });
61
- }
62
- return target;
63
- }
64
- function ownKeys(object, enumerableOnly) {
65
- var keys = Object.keys(object);
66
- if (Object.getOwnPropertySymbols) {
67
- var symbols = Object.getOwnPropertySymbols(object);
68
- if (enumerableOnly) {
69
- symbols = symbols.filter(function(sym) {
70
- return Object.getOwnPropertyDescriptor(object, sym).enumerable;
71
- });
72
- }
73
- keys.push.apply(keys, symbols);
74
- }
75
- return keys;
76
- }
77
- function _object_spread_props(target, source) {
78
- source = source != null ? source : {};
79
- if (Object.getOwnPropertyDescriptors) {
80
- Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));
81
- } else {
82
- ownKeys(Object(source)).forEach(function(key) {
83
- Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
84
- });
85
- }
86
- return target;
87
- }
88
- function _sliced_to_array(arr, i) {
89
- return _array_with_holes(arr) || _iterable_to_array_limit(arr, i) || _unsupported_iterable_to_array(arr, i) || _non_iterable_rest();
90
- }
91
- function _unsupported_iterable_to_array(o, minLen) {
92
- if (!o) return;
93
- if (typeof o === "string") return _array_like_to_array(o, minLen);
94
- var n = Object.prototype.toString.call(o).slice(8, -1);
95
- if (n === "Object" && o.constructor) n = o.constructor.name;
96
- if (n === "Map" || n === "Set") return Array.from(n);
97
- if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _array_like_to_array(o, minLen);
98
- }
99
- import { BorderOutlined, ExpandOutlined, FullscreenExitOutlined, FullscreenOutlined, ZoomInOutlined, ZoomOutOutlined } from "@ant-design/icons";
1
+ import { CopyOutlined, DownloadOutlined } from "@ant-design/icons";
100
2
  import { ConfigProvider, theme } from "antd";
101
3
  import classNames from "clsx";
102
- import React, { useCallback, useContext, useEffect, useMemo, useRef, useState } from "react";
4
+ import copy from "copy-to-clipboard";
5
+ import React, { useCallback, useContext, useMemo, useRef } from "react";
103
6
  import { ActionIconBox } from "../../Components/ActionIconBox";
104
7
  import { useIntersectionOnce } from "../../Hooks/useIntersectionOnce";
8
+ import { useLocale } from "../../I18n";
105
9
  import { useStyle } from "./style";
106
10
  import { useMermaidRender } from "./useMermaidRender";
107
11
  import { createMermaidThemeConfig } from "./utils";
@@ -110,67 +14,27 @@ var PRE_STYLE = {
110
14
  whiteSpace: 'pre-wrap',
111
15
  wordBreak: 'break-word'
112
16
  };
113
- var MIN_ZOOM_SCALE = 0.2;
114
- var MAX_ZOOM_SCALE = 12;
115
- var ZOOM_STEP_RATIO = 1.2;
116
- var FIT_PADDING = 24;
117
- var clamp = function clamp(value, min, max) {
118
- return Math.max(min, Math.min(max, value));
119
- };
120
- var getSvgNaturalSize = function getSvgNaturalSize(svgElement) {
121
- var _svgElement_viewBox;
122
- var viewBox = (_svgElement_viewBox = svgElement.viewBox) === null || _svgElement_viewBox === void 0 ? void 0 : _svgElement_viewBox.baseVal;
123
- if (viewBox && viewBox.width > 0 && viewBox.height > 0) {
124
- return {
125
- width: viewBox.width,
126
- height: viewBox.height
127
- };
128
- }
129
- var widthAttr = Number.parseFloat(svgElement.getAttribute('width') || '');
130
- var heightAttr = Number.parseFloat(svgElement.getAttribute('height') || '');
131
- if (Number.isFinite(widthAttr) && Number.isFinite(heightAttr) && widthAttr > 0 && heightAttr > 0) {
132
- return {
133
- width: widthAttr,
134
- height: heightAttr
135
- };
17
+ var serializeSvgForFile = function serializeSvgForFile(svg) {
18
+ var clone = svg.cloneNode(true);
19
+ if (!clone.getAttribute('xmlns')) {
20
+ clone.setAttribute('xmlns', 'http://www.w3.org/2000/svg');
136
21
  }
137
- try {
138
- var bbox = svgElement.getBBox();
139
- if (bbox.width > 0 && bbox.height > 0) {
140
- return {
141
- width: bbox.width,
142
- height: bbox.height
143
- };
144
- }
145
- } catch (e) {
146
- // Ignore getBBox errors in hidden/unsupported SVG contexts.
147
- }
148
- var rect = svgElement.getBoundingClientRect();
149
- if (rect.width > 0 && rect.height > 0) {
150
- return {
151
- width: rect.width,
152
- height: rect.height
153
- };
22
+ if (!clone.getAttribute('xmlns:xlink')) {
23
+ clone.setAttribute('xmlns:xlink', 'http://www.w3.org/1999/xlink');
154
24
  }
155
- return null;
25
+ return new XMLSerializer().serializeToString(clone);
156
26
  };
157
27
  export var MermaidRendererImpl = function MermaidRendererImpl(props) {
158
28
  var context = useContext(ConfigProvider.ConfigContext);
29
+ var locale = useLocale();
159
30
  var token = theme.useToken().token;
160
31
  var baseCls = (context === null || context === void 0 ? void 0 : context.getPrefixCls('agentic-plugin-mermaid')) || 'plugin-mermaid';
161
32
  var _useStyle = useStyle(baseCls), wrapSSR = _useStyle.wrapSSR, hashId = _useStyle.hashId;
162
33
  var containerRef = useRef(null);
163
34
  var divRef = useRef(null);
164
- var panSessionRef = useRef(null);
165
35
  var id = useMemo(function() {
166
36
  return 'm' + (Date.now() + Math.ceil(Math.random() * 1000));
167
37
  }, []);
168
- var _useState = _sliced_to_array(useState(1), 2), scale = _useState[0], setScale = _useState[1];
169
- var _useState1 = _sliced_to_array(useState(0), 2), panX = _useState1[0], setPanX = _useState1[1];
170
- var _useState2 = _sliced_to_array(useState(0), 2), panY = _useState2[0], setPanY = _useState2[1];
171
- var _useState3 = _sliced_to_array(useState(true), 2), showGrid = _useState3[0], setShowGrid = _useState3[1];
172
- var _useState4 = _sliced_to_array(useState(false), 2), isPanning = _useState4[0], setIsPanning = _useState4[1];
173
- var _useState5 = _sliced_to_array(useState(false), 2), isFullscreen = _useState5[0], setIsFullscreen = _useState5[1];
174
38
  var mermaidTheme = useMemo(function() {
175
39
  return createMermaidThemeConfig({
176
40
  colorBgContainer: token.colorBgContainer,
@@ -206,330 +70,100 @@ export var MermaidRendererImpl = function MermaidRendererImpl(props) {
206
70
  error
207
71
  ]);
208
72
  var isRendered = useMemo(function() {
209
- return renderedCode && !isError;
73
+ return !!renderedCode && !isError;
210
74
  }, [
211
75
  renderedCode,
212
76
  isError
213
77
  ]);
214
- var containerStyle = useMemo(function() {
78
+ var diagramStyle = useMemo(function() {
215
79
  return {
216
80
  opacity: isRendered ? 1 : 0,
217
81
  pointerEvents: isRendered ? 'auto' : 'none',
218
82
  width: '100%',
219
- height: isRendered ? '100%' : '0',
220
- overflow: isRendered ? 'auto' : 'hidden',
221
- maxHeight: isRendered ? '100%' : '0',
222
- minHeight: isRendered ? '200px' : '0'
83
+ minHeight: isRendered ? '120px' : '0',
84
+ maxHeight: isRendered ? 'none' : '0',
85
+ height: isRendered ? 'auto' : '0',
86
+ overflow: isRendered ? 'auto' : 'hidden'
223
87
  };
224
88
  }, [
225
89
  isRendered
226
90
  ]);
227
- var transformedContainerStyle = useMemo(function() {
228
- return _object_spread_props(_object_spread({}, containerStyle), {
229
- '--mermaid-pan-x': "".concat(panX, "px"),
230
- '--mermaid-pan-y': "".concat(panY, "px"),
231
- '--mermaid-scale': scale
232
- });
233
- }, [
234
- containerStyle,
235
- panX,
236
- panY,
237
- scale
238
- ]);
239
- var viewportStyle = useMemo(function() {
240
- return {
241
- backgroundImage: showGrid ? mermaidTheme.darkMode ? 'radial-gradient(circle, rgba(255, 255, 255, 0.14) 1.2px, transparent 1.2px)' : 'radial-gradient(circle, rgba(0, 0, 0, 0.08) 1.2px, transparent 1.2px)' : 'none'
242
- };
243
- }, [
244
- mermaidTheme.darkMode,
245
- showGrid
246
- ]);
247
- var getDiagramAndViewportSize = useCallback(function() {
248
- var viewportElement = divRef.current;
249
- if (!viewportElement) {
250
- return null;
251
- }
252
- var svgElement = viewportElement.querySelector('[data-mermaid-svg="true"]');
253
- if (!svgElement) {
254
- return null;
255
- }
256
- var svgSize = getSvgNaturalSize(svgElement);
257
- if (!svgSize) {
258
- return null;
259
- }
260
- var viewportWidth = viewportElement.clientWidth;
261
- var viewportHeight = viewportElement.clientHeight;
262
- if (viewportWidth <= 0 || viewportHeight <= 0) {
263
- return null;
264
- }
265
- return {
266
- viewportWidth: viewportWidth,
267
- viewportHeight: viewportHeight,
268
- diagramWidth: svgSize.width,
269
- diagramHeight: svgSize.height
270
- };
271
- }, []);
272
- var handleFitToScreen = useCallback(function() {
273
- var size = getDiagramAndViewportSize();
274
- if (!size) {
275
- return;
276
- }
277
- var usableWidth = Math.max(size.viewportWidth - FIT_PADDING * 2, 1);
278
- var usableHeight = Math.max(size.viewportHeight - FIT_PADDING * 2, 1);
279
- var fittedScale = clamp(Math.min(usableWidth / size.diagramWidth, usableHeight / size.diagramHeight), MIN_ZOOM_SCALE, MAX_ZOOM_SCALE);
280
- var centeredPanX = (size.viewportWidth - size.diagramWidth * fittedScale) / 2;
281
- var centeredPanY = (size.viewportHeight - size.diagramHeight * fittedScale) / 2;
282
- setScale(fittedScale);
283
- setPanX(centeredPanX);
284
- setPanY(centeredPanY);
285
- }, [
286
- getDiagramAndViewportSize
287
- ]);
288
- var applyScaleAtPoint = useCallback(function(nextScale, clientX, clientY) {
289
- var viewportElement = divRef.current;
290
- if (!viewportElement) {
291
- return;
292
- }
293
- var clampedScale = clamp(nextScale, MIN_ZOOM_SCALE, MAX_ZOOM_SCALE);
294
- if (clampedScale === scale) {
295
- return;
296
- }
297
- var viewportRect = viewportElement.getBoundingClientRect();
298
- var targetClientX = clientX !== null && clientX !== void 0 ? clientX : viewportRect.left + viewportRect.width / 2;
299
- var targetClientY = clientY !== null && clientY !== void 0 ? clientY : viewportRect.top + viewportRect.height / 2;
300
- var relativeX = targetClientX - viewportRect.left;
301
- var relativeY = targetClientY - viewportRect.top;
302
- var nextPanX = relativeX - (relativeX - panX) / scale * clampedScale;
303
- var nextPanY = relativeY - (relativeY - panY) / scale * clampedScale;
304
- setScale(clampedScale);
305
- setPanX(nextPanX);
306
- setPanY(nextPanY);
307
- }, [
308
- panX,
309
- panY,
310
- scale
311
- ]);
312
- var handleZoomIn = useCallback(function() {
313
- applyScaleAtPoint(scale * ZOOM_STEP_RATIO);
314
- }, [
315
- applyScaleAtPoint,
316
- scale
317
- ]);
318
- var handleZoomOut = useCallback(function() {
319
- applyScaleAtPoint(scale / ZOOM_STEP_RATIO);
320
- }, [
321
- applyScaleAtPoint,
322
- scale
323
- ]);
324
- var handleToggleFullscreen = useCallback(function() {
325
- var _containerRef_current_requestFullscreen, _containerRef_current;
326
- if (!containerRef.current) {
327
- return;
328
- }
329
- if (document.fullscreenElement === containerRef.current) {
330
- var _document_exitFullscreen, _document;
331
- (_document_exitFullscreen = (_document = document).exitFullscreen) === null || _document_exitFullscreen === void 0 ? void 0 : _document_exitFullscreen.call(_document);
332
- return;
333
- }
334
- (_containerRef_current_requestFullscreen = (_containerRef_current = containerRef.current).requestFullscreen) === null || _containerRef_current_requestFullscreen === void 0 ? void 0 : _containerRef_current_requestFullscreen.call(_containerRef_current);
335
- }, []);
336
- var handleWheel = useCallback(function(event) {
337
- var _target_closest;
338
- if (!isRendered) {
339
- return;
340
- }
341
- var target = event.target;
342
- if (target === null || target === void 0 ? void 0 : (_target_closest = target.closest) === null || _target_closest === void 0 ? void 0 : _target_closest.call(target, '[data-mermaid-toolbar]')) {
343
- return;
344
- }
345
- event.preventDefault();
346
- var scaleMultiplier = event.deltaY < 0 ? ZOOM_STEP_RATIO : 1 / ZOOM_STEP_RATIO;
347
- applyScaleAtPoint(scale * scaleMultiplier, event.clientX, event.clientY);
348
- }, [
349
- applyScaleAtPoint,
350
- isRendered,
351
- scale
352
- ]);
353
- var handlePointerDown = useCallback(function(event) {
354
- var _target_closest, _event_currentTarget_setPointerCapture, _event_currentTarget;
355
- if (!isRendered || event.button !== 0) {
356
- return;
357
- }
358
- var target = event.target;
359
- if (target === null || target === void 0 ? void 0 : (_target_closest = target.closest) === null || _target_closest === void 0 ? void 0 : _target_closest.call(target, '[data-mermaid-toolbar]')) {
360
- return;
361
- }
362
- panSessionRef.current = {
363
- startClientX: event.clientX,
364
- startClientY: event.clientY,
365
- startPanX: panX,
366
- startPanY: panY
367
- };
368
- setIsPanning(true);
369
- (_event_currentTarget_setPointerCapture = (_event_currentTarget = event.currentTarget).setPointerCapture) === null || _event_currentTarget_setPointerCapture === void 0 ? void 0 : _event_currentTarget_setPointerCapture.call(_event_currentTarget, event.pointerId);
370
- }, [
371
- isRendered,
372
- panX,
373
- panY
374
- ]);
375
- var handlePointerMove = useCallback(function(event) {
376
- var panSession = panSessionRef.current;
377
- if (!panSession) {
378
- return;
379
- }
380
- setPanX(panSession.startPanX + event.clientX - panSession.startClientX);
381
- setPanY(panSession.startPanY + event.clientY - panSession.startClientY);
382
- }, []);
383
- var finishPointerSession = useCallback(function(event) {
384
- var _event_currentTarget_releasePointerCapture, _event_currentTarget;
385
- if (!panSessionRef.current) {
386
- return;
387
- }
388
- panSessionRef.current = null;
389
- setIsPanning(false);
390
- (_event_currentTarget_releasePointerCapture = (_event_currentTarget = event.currentTarget).releasePointerCapture) === null || _event_currentTarget_releasePointerCapture === void 0 ? void 0 : _event_currentTarget_releasePointerCapture.call(_event_currentTarget, event.pointerId);
391
- }, []);
392
- useEffect(function() {
393
- var syncFullscreenState = function syncFullscreenState() {
394
- setIsFullscreen(document.fullscreenElement === containerRef.current);
395
- };
396
- syncFullscreenState();
397
- document.addEventListener('fullscreenchange', syncFullscreenState);
398
- return function() {
399
- document.removeEventListener('fullscreenchange', syncFullscreenState);
400
- };
401
- }, []);
402
- useEffect(function() {
403
- if (!isRendered) {
91
+ var code = props.element.value || '';
92
+ var handleCopySource = useCallback(function() {
93
+ if (!code) {
404
94
  return;
405
95
  }
406
- var frame = window.requestAnimationFrame(function() {
407
- handleFitToScreen();
408
- });
409
- return function() {
410
- window.cancelAnimationFrame(frame);
411
- };
96
+ copy(code);
412
97
  }, [
413
- isRendered,
414
- renderedCode,
415
- handleFitToScreen
98
+ code
416
99
  ]);
417
- useEffect(function() {
418
- if (!isRendered || !divRef.current) {
100
+ var handleDownloadSvg = useCallback(function() {
101
+ var root = divRef.current;
102
+ if (!root) {
419
103
  return;
420
104
  }
421
- if (typeof ResizeObserver === 'undefined') {
105
+ var svg = root.querySelector('[data-mermaid-svg="true"]');
106
+ if (!svg) {
422
107
  return;
423
108
  }
424
- var resizeObserver = new ResizeObserver(function() {
425
- handleFitToScreen();
109
+ var payload = serializeSvgForFile(svg);
110
+ var blob = new Blob([
111
+ payload
112
+ ], {
113
+ type: 'image/svg+xml;charset=utf-8'
426
114
  });
427
- resizeObserver.observe(divRef.current);
428
- return function() {
429
- resizeObserver.disconnect();
430
- };
431
- }, [
432
- handleFitToScreen,
433
- isRendered
434
- ]);
435
- useEffect(function() {
436
- if (!isRendered) {
437
- return;
438
- }
439
- handleFitToScreen();
440
- }, [
441
- handleFitToScreen,
442
- isFullscreen,
443
- isRendered
444
- ]);
445
- var code = props.element.value || '';
115
+ var url = URL.createObjectURL(blob);
116
+ var anchor = document.createElement('a');
117
+ anchor.href = url;
118
+ anchor.download = "mermaid-diagram-".concat(Date.now(), ".svg");
119
+ anchor.rel = 'noopener';
120
+ anchor.click();
121
+ URL.revokeObjectURL(url);
122
+ }, []);
446
123
  return wrapSSR(/*#__PURE__*/ React.createElement("div", {
447
124
  ref: containerRef,
448
- className: classNames(baseCls, hashId, _define_property({}, "".concat(baseCls, "-fullscreen"), isFullscreen)),
125
+ className: classNames(baseCls, hashId),
449
126
  contentEditable: false,
450
127
  "data-mermaid-theme": mermaidTheme.darkMode ? 'dark' : 'light'
451
128
  }, /*#__PURE__*/ React.createElement("div", {
452
129
  contentEditable: false,
453
130
  className: classNames("".concat(baseCls, "-viewport"), hashId),
454
- onWheel: handleWheel,
455
- onPointerDown: handlePointerDown,
456
- onPointerMove: handlePointerMove,
457
- onPointerUp: finishPointerSession,
458
- onPointerCancel: finishPointerSession,
459
- "data-mermaid-grid": showGrid,
460
- "data-mermaid-panning": isPanning,
461
- "data-mermaid-viewport": "true",
462
- style: viewportStyle
131
+ "data-mermaid-viewport": "true"
463
132
  }, /*#__PURE__*/ React.createElement("div", {
464
133
  contentEditable: false,
465
134
  ref: divRef,
466
135
  className: classNames(hashId),
467
- style: transformedContainerStyle,
136
+ style: diagramStyle,
468
137
  "data-mermaid-container": "true"
469
138
  }), isRendered && /*#__PURE__*/ React.createElement("div", {
470
139
  className: classNames("".concat(baseCls, "-toolbar-float"), hashId),
471
140
  role: "toolbar",
472
- "aria-label": "Mermaid diagram controls",
141
+ "aria-label": "Mermaid diagram actions",
473
142
  "data-mermaid-toolbar": true,
474
143
  onPointerDown: function onPointerDown(e) {
475
144
  e.stopPropagation();
476
145
  }
477
146
  }, /*#__PURE__*/ React.createElement("span", {
478
- "data-mermaid-action": "fit"
479
- }, /*#__PURE__*/ React.createElement(ActionIconBox, {
480
- title: "适配画布",
481
- borderLess: true,
482
- noPadding: true,
483
- onClick: handleFitToScreen,
484
- iconStyle: {
485
- color: token.colorTextSecondary
486
- }
487
- }, /*#__PURE__*/ React.createElement(ExpandOutlined, null))), /*#__PURE__*/ React.createElement("span", {
488
- "data-mermaid-action": "zoom-out"
489
- }, /*#__PURE__*/ React.createElement(ActionIconBox, {
490
- title: "缩小",
491
- borderLess: true,
492
- noPadding: true,
493
- onClick: handleZoomOut,
494
- iconStyle: {
495
- color: token.colorTextSecondary
496
- }
497
- }, /*#__PURE__*/ React.createElement(ZoomOutOutlined, null))), /*#__PURE__*/ React.createElement("span", {
498
- "data-mermaid-action": "zoom-in"
499
- }, /*#__PURE__*/ React.createElement(ActionIconBox, {
500
- title: "放大",
501
- borderLess: true,
502
- noPadding: true,
503
- onClick: handleZoomIn,
504
- iconStyle: {
505
- color: token.colorTextSecondary
506
- }
507
- }, /*#__PURE__*/ React.createElement(ZoomInOutlined, null))), /*#__PURE__*/ React.createElement("span", {
508
- "data-mermaid-action": "grid"
147
+ "data-mermaid-action": "copy-source"
509
148
  }, /*#__PURE__*/ React.createElement(ActionIconBox, {
510
- title: showGrid ? '隐藏背景网格' : '显示背景网格',
149
+ title: locale.copy,
511
150
  borderLess: true,
512
151
  noPadding: true,
513
- active: showGrid,
514
- onClick: function onClick() {
515
- setShowGrid(function(prev) {
516
- return !prev;
517
- });
518
- },
152
+ onClick: handleCopySource,
519
153
  iconStyle: {
520
154
  color: token.colorTextSecondary
521
155
  }
522
- }, /*#__PURE__*/ React.createElement(BorderOutlined, null))), /*#__PURE__*/ React.createElement("span", {
523
- "data-mermaid-action": "fullscreen"
156
+ }, /*#__PURE__*/ React.createElement(CopyOutlined, null))), /*#__PURE__*/ React.createElement("span", {
157
+ "data-mermaid-action": "download-svg"
524
158
  }, /*#__PURE__*/ React.createElement(ActionIconBox, {
525
- title: isFullscreen ? '退出全屏' : '全屏',
159
+ title: locale.download,
526
160
  borderLess: true,
527
161
  noPadding: true,
528
- onClick: handleToggleFullscreen,
162
+ onClick: handleDownloadSvg,
529
163
  iconStyle: {
530
164
  color: token.colorTextSecondary
531
165
  }
532
- }, isFullscreen ? /*#__PURE__*/ React.createElement(FullscreenExitOutlined, null) : /*#__PURE__*/ React.createElement(FullscreenOutlined, null))))), error && /*#__PURE__*/ React.createElement("div", {
166
+ }, /*#__PURE__*/ React.createElement(DownloadOutlined, null))))), error && /*#__PURE__*/ React.createElement("div", {
533
167
  className: classNames("".concat(baseCls, "-error"), hashId)
534
168
  }, /*#__PURE__*/ React.createElement("pre", {
535
169
  style: PRE_STYLE
@@ -105,7 +105,6 @@ import { ReactEditor } from "slate-react";
105
105
  import { ActionIconBox } from "../../Components/ActionIconBox";
106
106
  import { I18nContext } from "../../I18n";
107
107
  import { useEditorStore } from "../../MarkdownEditor/editor/store";
108
- import { DragHandle } from "../../MarkdownEditor/editor/tools/DragHandle";
109
108
  import { useSelStatus } from "../../MarkdownEditor/hooks/editor";
110
109
  import { Mermaid } from "./Mermaid";
111
110
  /**
@@ -184,7 +183,7 @@ import { Mermaid } from "./Mermaid";
184
183
  tabIndex: -1,
185
184
  onBlur: function onBlur() {},
186
185
  "data-lang": props.element.language
187
- }), !props.element.frontmatter && /*#__PURE__*/ React.createElement(DragHandle, null), /*#__PURE__*/ React.createElement("div", {
186
+ }), /*#__PURE__*/ React.createElement("div", {
188
187
  onClick: function onClick(e) {
189
188
  var _editorRef_current;
190
189
  e.stopPropagation();