@blocklet/editor 2.3.49 → 2.3.51
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/lib/main/nodes/ImageComponent.js +2 -1
- package/lib/main/nodes/MermaidComponent.d.ts +7 -0
- package/lib/main/nodes/MermaidComponent.js +24 -0
- package/lib/main/nodes/MermaidNode.d.ts +39 -0
- package/lib/main/nodes/MermaidNode.js +95 -0
- package/lib/main/nodes/PlaygroundNodes.js +2 -0
- package/package.json +3 -2
|
@@ -248,7 +248,8 @@ export default function ImageComponent({ file, src, altText, nodeKey, width, hei
|
|
|
248
248
|
uploadImage();
|
|
249
249
|
}
|
|
250
250
|
}, [src, file, confirmText]);
|
|
251
|
-
const
|
|
251
|
+
const skeleton = sizeMode === 'original' ? null : (_jsx(Skeleton, { variant: "rectangular", animation: "wave", sx: { width: 300, height: 200, borderRadius: 1 } }));
|
|
252
|
+
const placeholder = objectUrl ? (_jsx(ImageContainer, { draggable: draggable, success: !!src, loading: loading, error: error, confirmText: confirmText, uploadImage: uploadImage, placeholder: objectUrl, placeholderProps: { style: { width, height, maxWidth } } })) : (skeleton);
|
|
252
253
|
const imageDisplayWidth = useImageDisplayWidth({ src: src || objectUrl, sizeMode, width });
|
|
253
254
|
const { zoomOpened, openedImageRef } = useMediumZoom(imageRef, { enabled: !frame });
|
|
254
255
|
const renderImageAnnotationView = () => {
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import React, { useEffect } from 'react';
|
|
3
|
+
import mermaid from 'mermaid';
|
|
4
|
+
function MermaidComponent({ code }) {
|
|
5
|
+
const ref = React.useRef(null);
|
|
6
|
+
useEffect(() => {
|
|
7
|
+
if (!ref.current)
|
|
8
|
+
return;
|
|
9
|
+
ref.current.innerHTML = '';
|
|
10
|
+
mermaid.initialize({ startOnLoad: false });
|
|
11
|
+
const id = `mermaid-${Math.random().toString(36).substring(2, 9)}`;
|
|
12
|
+
try {
|
|
13
|
+
mermaid.render(id, code).then(({ svg }) => {
|
|
14
|
+
if (ref.current)
|
|
15
|
+
ref.current.innerHTML = svg;
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
catch (e) {
|
|
19
|
+
console.error(e);
|
|
20
|
+
}
|
|
21
|
+
}, [code]);
|
|
22
|
+
return _jsx("div", { ref: ref });
|
|
23
|
+
}
|
|
24
|
+
export default MermaidComponent;
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/// <reference types="react" />
|
|
2
|
+
import type { DOMConversionMap, DOMExportOutput, LexicalNode, NodeKey, SerializedLexicalNode, Spread } from 'lexical';
|
|
3
|
+
import { DecoratorNode } from 'lexical';
|
|
4
|
+
export interface MermaidPayload {
|
|
5
|
+
code: string;
|
|
6
|
+
theme?: string;
|
|
7
|
+
mode?: string;
|
|
8
|
+
key?: NodeKey;
|
|
9
|
+
}
|
|
10
|
+
export type SerializedMermaidNode = Spread<{
|
|
11
|
+
code: string;
|
|
12
|
+
theme?: string;
|
|
13
|
+
mode?: string;
|
|
14
|
+
type: 'mermaid';
|
|
15
|
+
version: 1;
|
|
16
|
+
}, SerializedLexicalNode>;
|
|
17
|
+
export declare class MermaidNode extends DecoratorNode<JSX.Element> {
|
|
18
|
+
__code: string;
|
|
19
|
+
__theme?: string;
|
|
20
|
+
__mode?: string;
|
|
21
|
+
static getType(): string;
|
|
22
|
+
static clone(node: MermaidNode): MermaidNode;
|
|
23
|
+
static importJSON(serializedNode: SerializedMermaidNode): MermaidNode;
|
|
24
|
+
exportJSON(): SerializedMermaidNode;
|
|
25
|
+
static importDOM(): DOMConversionMap | null;
|
|
26
|
+
exportDOM(): DOMExportOutput;
|
|
27
|
+
constructor(code: string, theme?: string, mode?: string, key?: NodeKey);
|
|
28
|
+
getCode(): string;
|
|
29
|
+
setCode(code: string): void;
|
|
30
|
+
getTheme(): string | undefined;
|
|
31
|
+
setTheme(theme: string): void;
|
|
32
|
+
getMode(): string | undefined;
|
|
33
|
+
setMode(mode: string): void;
|
|
34
|
+
createDOM(): HTMLElement;
|
|
35
|
+
updateDOM(): false;
|
|
36
|
+
decorate(): JSX.Element;
|
|
37
|
+
}
|
|
38
|
+
export declare function $createMermaidNode({ code, theme, mode, key }: MermaidPayload): MermaidNode;
|
|
39
|
+
export declare function $isMermaidNode(node: LexicalNode | null | undefined): node is MermaidNode;
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { DecoratorNode } from 'lexical';
|
|
3
|
+
import MermaidComponent from './MermaidComponent';
|
|
4
|
+
function convertMermaidElement(domNode) {
|
|
5
|
+
if (domNode && domNode.classList?.contains('mermaid')) {
|
|
6
|
+
const code = domNode.textContent || '';
|
|
7
|
+
const node = $createMermaidNode({ code });
|
|
8
|
+
return { node };
|
|
9
|
+
}
|
|
10
|
+
return null;
|
|
11
|
+
}
|
|
12
|
+
export class MermaidNode extends DecoratorNode {
|
|
13
|
+
__code;
|
|
14
|
+
__theme;
|
|
15
|
+
__mode;
|
|
16
|
+
static getType() {
|
|
17
|
+
return 'mermaid';
|
|
18
|
+
}
|
|
19
|
+
static clone(node) {
|
|
20
|
+
return new MermaidNode(node.__code, node.__theme, node.__mode, node.__key);
|
|
21
|
+
}
|
|
22
|
+
static importJSON(serializedNode) {
|
|
23
|
+
const { code, theme, mode } = serializedNode;
|
|
24
|
+
return $createMermaidNode({ code, theme, mode });
|
|
25
|
+
}
|
|
26
|
+
exportJSON() {
|
|
27
|
+
return {
|
|
28
|
+
code: this.__code,
|
|
29
|
+
theme: this.__theme,
|
|
30
|
+
mode: this.__mode,
|
|
31
|
+
type: 'mermaid',
|
|
32
|
+
version: 1,
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
static importDOM() {
|
|
36
|
+
return {
|
|
37
|
+
pre: (domNode) => {
|
|
38
|
+
if (domNode.classList?.contains('mermaid')) {
|
|
39
|
+
return { conversion: convertMermaidElement, priority: 0 };
|
|
40
|
+
}
|
|
41
|
+
return null;
|
|
42
|
+
},
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
exportDOM() {
|
|
46
|
+
const element = document.createElement('pre');
|
|
47
|
+
element.className = 'mermaid';
|
|
48
|
+
element.textContent = this.__code;
|
|
49
|
+
return { element };
|
|
50
|
+
}
|
|
51
|
+
constructor(code, theme, mode, key) {
|
|
52
|
+
super(key);
|
|
53
|
+
this.__code = code;
|
|
54
|
+
this.__theme = theme;
|
|
55
|
+
this.__mode = mode;
|
|
56
|
+
}
|
|
57
|
+
getCode() {
|
|
58
|
+
return this.__code;
|
|
59
|
+
}
|
|
60
|
+
setCode(code) {
|
|
61
|
+
const writable = this.getWritable();
|
|
62
|
+
writable.__code = code;
|
|
63
|
+
}
|
|
64
|
+
getTheme() {
|
|
65
|
+
return this.__theme;
|
|
66
|
+
}
|
|
67
|
+
setTheme(theme) {
|
|
68
|
+
const writable = this.getWritable();
|
|
69
|
+
writable.__theme = theme;
|
|
70
|
+
}
|
|
71
|
+
getMode() {
|
|
72
|
+
return this.__mode;
|
|
73
|
+
}
|
|
74
|
+
setMode(mode) {
|
|
75
|
+
const writable = this.getWritable();
|
|
76
|
+
writable.__mode = mode;
|
|
77
|
+
}
|
|
78
|
+
createDOM() {
|
|
79
|
+
const div = document.createElement('div');
|
|
80
|
+
div.className = 'mermaid-container';
|
|
81
|
+
return div;
|
|
82
|
+
}
|
|
83
|
+
updateDOM() {
|
|
84
|
+
return false;
|
|
85
|
+
}
|
|
86
|
+
decorate() {
|
|
87
|
+
return _jsx(MermaidComponent, { code: this.__code, theme: this.__theme, mode: this.__mode });
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
export function $createMermaidNode({ code, theme, mode, key }) {
|
|
91
|
+
return new MermaidNode(code, theme, mode, key);
|
|
92
|
+
}
|
|
93
|
+
export function $isMermaidNode(node) {
|
|
94
|
+
return node instanceof MermaidNode;
|
|
95
|
+
}
|
|
@@ -22,6 +22,7 @@ import { EquationNode } from './EquationNode';
|
|
|
22
22
|
import { ExcalidrawNode } from './ExcalidrawNode';
|
|
23
23
|
import { FigmaNode } from './FigmaNode';
|
|
24
24
|
import { ImageNode } from './ImageNode';
|
|
25
|
+
import { MermaidNode } from './MermaidNode';
|
|
25
26
|
import { KeywordNode } from './KeywordNode';
|
|
26
27
|
import { MentionNode } from './MentionNode';
|
|
27
28
|
import { StickyNode } from './StickyNode';
|
|
@@ -80,5 +81,6 @@ const PlaygroundNodes = [
|
|
|
80
81
|
SubpageListingNode,
|
|
81
82
|
PagesKitComponentNode,
|
|
82
83
|
TranslationNode,
|
|
84
|
+
MermaidNode,
|
|
83
85
|
];
|
|
84
86
|
export default PlaygroundNodes;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@blocklet/editor",
|
|
3
|
-
"version": "2.3.
|
|
3
|
+
"version": "2.3.51",
|
|
4
4
|
"main": "lib/index.js",
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"access": "public"
|
|
@@ -61,6 +61,7 @@
|
|
|
61
61
|
"markerjs-live": "^1.2.1",
|
|
62
62
|
"markerjs2": "^2.32.2",
|
|
63
63
|
"medium-zoom": "^1.1.0",
|
|
64
|
+
"mermaid": "^11.6.0",
|
|
64
65
|
"path-parser": "^6.1.0",
|
|
65
66
|
"react-player": "^2.16.0",
|
|
66
67
|
"react-popper": "^2.3.0",
|
|
@@ -68,7 +69,7 @@
|
|
|
68
69
|
"ufo": "^1.5.4",
|
|
69
70
|
"url-join": "^4.0.1",
|
|
70
71
|
"zustand": "^4.5.5",
|
|
71
|
-
"@blocklet/pdf": "^2.3.
|
|
72
|
+
"@blocklet/pdf": "^2.3.51"
|
|
72
73
|
},
|
|
73
74
|
"devDependencies": {
|
|
74
75
|
"@babel/core": "^7.25.2",
|