@richhtmleditor/diagrams 1.1.0

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.
@@ -0,0 +1,47 @@
1
+ import type { EditorPlugin } from "@richhtmleditor/core";
2
+ export type DiagramsPluginOptions = {
3
+ /**
4
+ * Render diagram source code to an HTML/SVG string for insertion into the editor.
5
+ * The returned HTML goes through editor.setContent() so embedded <style> blocks may be
6
+ * stripped — use inline styles or a data-URL if needed.
7
+ * If omitted the raw code is displayed in a styled `<pre>` block.
8
+ */
9
+ renderDiagram?: (code: string) => string | Promise<string>;
10
+ /**
11
+ * Optional separate renderer used only for the modal live-preview panel.
12
+ * Because the preview never goes through editor.setContent(), you can return
13
+ * the raw SVG (with its embedded <style>) for correct color/font rendering.
14
+ * Falls back to renderDiagram when not provided.
15
+ */
16
+ renderPreview?: (code: string) => string | Promise<string>;
17
+ /** Starter code shown in the modal. Default: 'graph TD\n A[Start] --> B[End]' */
18
+ placeholder?: string;
19
+ /** Label shown on the toolbar button. Default: 'Diagram' */
20
+ label?: string;
21
+ };
22
+ /**
23
+ * Mermaid / flowchart diagram blocks plugin.
24
+ *
25
+ * Adds an `insertDiagram` toolbar button. Diagrams are stored as
26
+ * `<figure class="de-diagram" data-diagram="...">` in the HTML.
27
+ * Click a diagram in the editor to edit it.
28
+ *
29
+ * Pass `renderDiagram` to enable live preview and rendered output:
30
+ * ```ts
31
+ * import mermaid from "mermaid";
32
+ * mermaid.initialize({ startOnLoad: false });
33
+ *
34
+ * createEditor({
35
+ * plugins: [createDiagramsPlugin({
36
+ * renderDiagram: async (code) => {
37
+ * const { svg } = await mermaid.render("d" + Date.now(), code);
38
+ * return svg;
39
+ * }
40
+ * })]
41
+ * });
42
+ * ```
43
+ */
44
+ export declare function createDiagramsPlugin(options?: DiagramsPluginOptions): EditorPlugin;
45
+ /** Strip rendered content from diagram figures, leaving only the `data-diagram` source attribute. */
46
+ export declare function prepareDiagramsForExport(html: string): string;
47
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAkB,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEzE,MAAM,MAAM,qBAAqB,GAAG;IAClC;;;;;OAKG;IACH,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC3D;;;;;OAKG;IACH,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC3D,kFAAkF;IAClF,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,4DAA4D;IAC5D,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAwYF;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,GAAE,qBAA0B,GAAG,YAAY,CAoKtF;AAED,qGAAqG;AACrG,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAQ7D"}
package/dist/index.js ADDED
@@ -0,0 +1,515 @@
1
+ const DIAGRAM_CLASS = "de-diagram";
2
+ const DIAGRAM_MODAL_CLASS = "de-diagram-modal";
3
+ const DEFAULT_PLACEHOLDER = "graph TD\n A[Start] --> B[End]";
4
+ const DIAGRAM_STARTERS = [
5
+ {
6
+ label: "Flowchart",
7
+ code: "graph TD\n A[Start] --> B{Decision}\n B -->|Yes| C[Do it]\n B -->|No| D[Skip]\n C --> E[End]\n D --> E"
8
+ },
9
+ {
10
+ label: "Sequence",
11
+ code: "sequenceDiagram\n Alice->>Bob: Hello Bob!\n Bob-->>Alice: Hi Alice!\n Alice->>Bob: How are you?\n Bob-->>Alice: Great, thanks!"
12
+ },
13
+ {
14
+ label: "Pie chart",
15
+ code: "pie title Browser Usage\n \"Chrome\" : 65\n \"Safari\" : 19\n \"Firefox\" : 9\n \"Other\" : 7"
16
+ },
17
+ {
18
+ label: "Gantt",
19
+ code: "gantt\n title Project Timeline\n dateFormat YYYY-MM-DD\n section Planning\n Research :a1, 2024-01-01, 10d\n Design :a2, after a1, 7d\n section Build\n Development :b1, after a2, 20d\n Testing :b2, after b1, 5d"
20
+ },
21
+ {
22
+ label: "Class",
23
+ code: "classDiagram\n class Animal {\n +String name\n +speak() void\n }\n class Dog {\n +fetch() void\n }\n Animal <|-- Dog"
24
+ },
25
+ {
26
+ label: "State",
27
+ code: "stateDiagram-v2\n [*] --> Idle\n Idle --> Active : start\n Active --> Idle : stop\n Active --> [*] : finish"
28
+ },
29
+ {
30
+ label: "ER",
31
+ code: "erDiagram\n CUSTOMER ||--o{ ORDER : places\n ORDER ||--|{ LINE-ITEM : contains\n CUSTOMER { string name\n string email }\n ORDER { int id\n date created }"
32
+ }
33
+ ];
34
+ function escapeHtml(s) {
35
+ return s.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;");
36
+ }
37
+ async function renderOrFallback(code, renderer) {
38
+ if (!code.trim())
39
+ return "";
40
+ if (renderer) {
41
+ try {
42
+ return await Promise.resolve(renderer(code));
43
+ }
44
+ catch (e) {
45
+ return `<span style="color:#dc2626;font-size:.8em;">Render error: ${escapeHtml(String(e))}</span>`;
46
+ }
47
+ }
48
+ return `<pre class="${DIAGRAM_CLASS}__code" style="font-family:monospace;font-size:.85rem;background:#f1f5f9;padding:12px;border-radius:6px;overflow:auto;white-space:pre;">${escapeHtml(code)}</pre>`;
49
+ }
50
+ /** Apply syntax highlighting to Mermaid code. Receives raw code, returns HTML string. */
51
+ function highlightMermaid(code) {
52
+ return code
53
+ .split("\n")
54
+ .map((rawLine) => {
55
+ let line = escapeHtml(rawLine);
56
+ const trimmed = rawLine.trim();
57
+ // Comment lines
58
+ if (trimmed.startsWith("%%")) {
59
+ return `<span style="color:#64748b;font-style:italic">${line}</span>`;
60
+ }
61
+ // Diagram-type keyword at start of line
62
+ line = line.replace(/^(graph|sequenceDiagram|classDiagram|stateDiagram(?:-v2)?|erDiagram|gantt|pie(?:\s+title)?|flowchart|journey|gitGraph|mindmap|timeline)/, '<span style="color:#c084fc;font-weight:600">$1</span>');
63
+ // Direction keywords
64
+ line = line.replace(/\b(TD|TB|LR|RL|BT)\b/g, '<span style="color:#38bdf8">$1</span>');
65
+ // Block keywords
66
+ line = line.replace(/\b(section|dateFormat|title|participant|actor|loop|end|alt|else|opt|par|autonumber|note|over|activate|deactivate|rect|critical|break|class|namespace)\b/g, (m) => `<span style="color:#a78bfa">${m}</span>`);
67
+ // Escaped arrows (HTML-escaped forms of -->, ->>, etc.)
68
+ line = line.replace(/(--&gt;&gt;?|\.\.&gt;&gt;?|-&gt;&gt;?|==&gt;|--&gt;|\.\.&gt;|-&gt;|&lt;--&gt;?|&lt;-&gt;&gt;?)/g, '<span style="color:#38bdf8">$1</span>');
69
+ // ER / class relationship symbols (||--o{, <|--, etc.)
70
+ line = line.replace(/(\|\|--o\{|\|\|--\|\{|o\|--\|\||&lt;\|--|--\|&gt;)/g, '<span style="color:#38bdf8">$1</span>');
71
+ // Pipe labels |label| — content must not span lines or contain < >
72
+ line = line.replace(/\|([^|<>]{0,60})\|/g, '|<span style="color:#fbbf24">$1</span>|');
73
+ // Square bracket node labels [...]
74
+ line = line.replace(/\[([^\]<>]{0,80})\]/g, '[<span style="color:#4ade80">$1</span>]');
75
+ // Curly brace conditions {...}
76
+ line = line.replace(/\{([^}<>]{0,60})\}/g, '{<span style="color:#fb923c">$1</span>}');
77
+ // Quoted strings &quot;...&quot;
78
+ line = line.replace(/(&quot;)([^&]{0,80})(&quot;)/g, '$1<span style="color:#fbbf24">$2</span>$3');
79
+ return line;
80
+ })
81
+ .join("\n");
82
+ }
83
+ const ALIGN_BTNS = [
84
+ { value: "left", label: "⇤", title: "Align left" },
85
+ { value: "center", label: "↔", title: "Align center" },
86
+ { value: "right", label: "⇥", title: "Align right" },
87
+ ];
88
+ function buildAlignBtns() {
89
+ return (`<span class="${DIAGRAM_CLASS}__align-btns" style="display:inline-flex;gap:2px;">` +
90
+ ALIGN_BTNS.map(({ value, label, title }) => `<button type="button" class="${DIAGRAM_CLASS}__align-btn" data-align-btn="${value}" title="${title}" ` +
91
+ `style="width:22px;height:18px;border:1px solid rgba(100,116,139,.25);border-radius:3px;background:none;` +
92
+ `cursor:pointer;font-size:11px;color:#64748b;padding:0;line-height:1;">${label}</button>`).join("") +
93
+ `</span>`);
94
+ }
95
+ function alignToJustify(align) {
96
+ return align === "left" ? "flex-start" : align === "right" ? "flex-end" : "center";
97
+ }
98
+ function buildFigureHtml(code, renderedHtml, align = "center") {
99
+ return (`<figure class="${DIAGRAM_CLASS}" data-diagram="${escapeHtml(code)}" data-align="${align}" contenteditable="false">` +
100
+ `<div class="${DIAGRAM_CLASS}__content" style="display:flex;justify-content:${alignToJustify(align)};">` +
101
+ renderedHtml +
102
+ `</div>` +
103
+ `<figcaption class="${DIAGRAM_CLASS}__edit-hint" style="align-items:center;justify-content:center;gap:8px;font-size:.75rem;color:#64748b;margin-top:6px;">` +
104
+ buildAlignBtns() +
105
+ `<span style="cursor:pointer;margin:0 4px;">Click to edit</span>` +
106
+ `<button type="button" class="${DIAGRAM_CLASS}__remove" title="Remove diagram" aria-label="Remove diagram" ` +
107
+ `style="width:18px;height:18px;border-radius:50%;border:none;background:rgba(100,116,139,.15);` +
108
+ `cursor:pointer;font-size:10px;color:#64748b;padding:0;display:inline-flex;align-items:center;justify-content:center;">✕</button>` +
109
+ `</figcaption>` +
110
+ `</figure>`);
111
+ }
112
+ const HELP_STARTERS = {
113
+ "graph TD": "graph TD\n A[Start] --> B{Decision}\n B -->|Yes| C[Do it]\n B -->|No| D[Skip]\n C --> E[End]\n D --> E",
114
+ "sequenceDiagram": "sequenceDiagram\n Alice->>Bob: Hello Bob!\n Bob-->>Alice: Hi Alice!\n Alice->>Bob: How are you?\n Bob-->>Alice: Great, thanks!",
115
+ "classDiagram": "classDiagram\n class Animal {\n +String name\n +speak() void\n }\n class Dog {\n +fetch() void\n }\n Animal <|-- Dog",
116
+ "stateDiagram-v2": "stateDiagram-v2\n [*] --> Idle\n Idle --> Active : start\n Active --> Idle : stop\n Active --> [*] : finish",
117
+ "erDiagram": "erDiagram\n CUSTOMER ||--o{ ORDER : places\n ORDER ||--|{ LINE-ITEM : contains\n CUSTOMER { string name\n string email }\n ORDER { int id\n date created }",
118
+ "gantt": "gantt\n title Project Timeline\n dateFormat YYYY-MM-DD\n section Planning\n Research :a1, 2024-01-01, 10d\n Design :a2, after a1, 7d\n section Build\n Development :b1, after a2, 20d\n Testing :b2, after b1, 5d",
119
+ "pie title X": "pie title Browser Usage\n \"Chrome\" : 65\n \"Safari\" : 19\n \"Firefox\" : 9\n \"Other\" : 7",
120
+ "mindmap": "mindmap\n root((Topic))\n Branch A\n Leaf 1\n Leaf 2\n Branch B\n Leaf 3",
121
+ };
122
+ function buildHelpHtml() {
123
+ const baseCode = "background:#1e293b;border:1px solid #334155;border-radius:4px;padding:2px 7px;font-family:monospace;font-size:.75rem;";
124
+ function staticChip(text, color) {
125
+ return `<code style="${baseCode}color:${color};">${escapeHtml(text)}</code>`;
126
+ }
127
+ function typeBtn(keyword) {
128
+ const starter = HELP_STARTERS[keyword] ?? keyword;
129
+ return `<button type="button" class="${DIAGRAM_MODAL_CLASS}__help-type" data-insert="${escapeHtml(starter)}" ` +
130
+ `title="Insert ${keyword} template" ` +
131
+ `style="${baseCode}color:#c084fc;cursor:pointer;border:1px solid #334155;transition:background .12s,border-color .12s;">${escapeHtml(keyword)}</button>`;
132
+ }
133
+ function labeled(code, color, label) {
134
+ return `<span style="display:inline-flex;align-items:center;gap:4px;">${staticChip(code, color)}<span style="color:#64748b;font-size:.7rem;">${label}</span></span>`;
135
+ }
136
+ const diagramTypes = ["graph TD", "sequenceDiagram", "classDiagram", "stateDiagram-v2", "erDiagram", "gantt", "pie title X", "mindmap"];
137
+ const nodeShapes = [["[Rect]", "Rectangle"], ["(Round)", "Rounded"], ["{Diamond}", "Decision"], ["((Circle))", "Circle"], ["[/Parallel/]", "Parallelogram"], ["([Stadium])", "Stadium"]];
138
+ const arrowStyles = [["-->", "arrow"], ["---", "no arrow"], ["-.->", "dotted"], ["==>", "thick"], ["--x", "cross"], ["-- label -->", "labelled"]];
139
+ return (`<div style="background:#0f172a;border-radius:8px;padding:14px 16px;display:flex;flex-direction:column;gap:12px;">` +
140
+ `<div><p style="font-size:.65rem;font-weight:700;letter-spacing:.08em;text-transform:uppercase;color:#64748b;margin:0 0 7px;">Diagram types — click to insert</p>` +
141
+ `<div style="display:flex;flex-wrap:wrap;gap:5px;">${diagramTypes.map((k) => typeBtn(k)).join("")}</div></div>` +
142
+ `<div><p style="font-size:.65rem;font-weight:700;letter-spacing:.08em;text-transform:uppercase;color:#64748b;margin:0 0 7px;">Flowchart node shapes</p>` +
143
+ `<div style="display:flex;flex-wrap:wrap;gap:6px;align-items:center;">${nodeShapes.map(([c, l]) => labeled(c, "#4ade80", l)).join("")}</div></div>` +
144
+ `<div><p style="font-size:.65rem;font-weight:700;letter-spacing:.08em;text-transform:uppercase;color:#64748b;margin:0 0 7px;">Arrow styles</p>` +
145
+ `<div style="display:flex;flex-wrap:wrap;gap:8px;align-items:center;">${arrowStyles.map(([a, l]) => labeled(a, "#38bdf8", l)).join("")}</div></div>` +
146
+ `<a href="https://mermaid.js.org/intro/" target="_blank" rel="noopener noreferrer" ` +
147
+ `style="font-size:.75rem;color:#60a5fa;text-decoration:none;display:inline-flex;align-items:center;gap:4px;width:fit-content;">` +
148
+ `Full Mermaid documentation ↗</a>` +
149
+ `</div>`);
150
+ }
151
+ function openDiagramModal(host, options, initialCode, initialAlign, onConfirm) {
152
+ // Inject modal CSS once (chip hover + textarea placeholder color)
153
+ const modalStyleId = "de-diagram-modal-styles";
154
+ if (!document.getElementById(modalStyleId)) {
155
+ const st = document.createElement("style");
156
+ st.id = modalStyleId;
157
+ st.textContent =
158
+ `.${DIAGRAM_MODAL_CLASS}__chip:hover{background:var(--de-primary-hover,#eff6ff)!important;border-color:var(--de-primary,#2563eb)!important;color:var(--de-primary,#2563eb)!important;}` +
159
+ `.${DIAGRAM_MODAL_CLASS}__input::placeholder{color:#475569;}` +
160
+ `.${DIAGRAM_MODAL_CLASS}__help-type:hover{background:#334155!important;border-color:#64748b!important;}` +
161
+ `.${DIAGRAM_MODAL_CLASS}__help-toggle:hover{background:rgba(100,116,139,.1)!important;border-color:#94a3b8!important;color:#334155!important;}`;
162
+ document.head.appendChild(st);
163
+ }
164
+ const backdrop = document.createElement("div");
165
+ backdrop.style.cssText = "position:fixed;inset:0;background:rgba(0,0,0,.45);z-index:9999;display:flex;align-items:center;justify-content:center;";
166
+ const panel = document.createElement("div");
167
+ panel.className = DIAGRAM_MODAL_CLASS;
168
+ panel.setAttribute("role", "dialog");
169
+ panel.setAttribute("aria-modal", "true");
170
+ panel.setAttribute("aria-label", "Insert diagram");
171
+ panel.style.cssText = "background:var(--de-toolbar-bg,#fff);border-radius:12px;padding:24px;width:min(960px,96vw);max-height:94vh;overflow:auto;box-shadow:0 16px 48px rgba(0,0,0,.2);display:flex;flex-direction:column;gap:12px;";
172
+ // Build starter chips HTML
173
+ const chipsHtml = DIAGRAM_STARTERS.map((s) => `<button type="button" class="${DIAGRAM_MODAL_CLASS}__chip" data-code="${escapeHtml(s.code)}"` +
174
+ ` style="padding:4px 11px;border:1px solid var(--de-border,#e2e8f0);border-radius:999px;` +
175
+ `background:none;cursor:pointer;font-size:.75rem;font-weight:500;color:#475569;` +
176
+ `white-space:nowrap;transition:border-color .12s,background .12s;">${s.label}</button>`).join("");
177
+ // Dark syntax-highlighted code editor: highlight layer (absolute) + transparent textarea on top
178
+ const editorWrapCss = "position:relative;height:320px;border-radius:8px;overflow:hidden;border:1px solid #334155;";
179
+ const highlightLayerCss = "position:absolute;inset:0;overflow:auto;padding:8px 10px;margin:0;" +
180
+ "font-family:monospace;font-size:.85rem;line-height:1.5;" +
181
+ "white-space:pre-wrap;word-wrap:break-word;" +
182
+ "background:#0f172a;color:#e2e8f0;pointer-events:none;box-sizing:border-box;";
183
+ const textareaCss = "position:absolute;inset:0;overflow:auto;padding:8px 10px;" +
184
+ "border:none;outline:none;resize:none;box-sizing:border-box;" +
185
+ "font-family:monospace;font-size:.85rem;line-height:1.5;" +
186
+ "white-space:pre-wrap;word-wrap:break-word;" +
187
+ "background:transparent;color:transparent;caret-color:#e2e8f0;z-index:1;";
188
+ const helpBtnStyle = "display:inline-flex;align-items:center;gap:6px;padding:5px 10px 5px 8px;border:1px solid var(--de-border,#e2e8f0);border-radius:6px;background:none;cursor:pointer;font-size:.8rem;font-weight:600;color:#64748b;transition:color .12s,background .12s,border-color .12s;";
189
+ const helpCircleStyle = "display:inline-flex;align-items:center;justify-content:center;width:16px;height:16px;border-radius:999px;border:1.5px solid currentColor;font-size:.65rem;font-weight:800;flex-shrink:0;line-height:1;";
190
+ panel.innerHTML = `
191
+ <h3 style="margin:0;font-size:1rem;font-weight:600;">Insert diagram</h3>
192
+ <div style="display:grid;grid-template-columns:1fr 1fr;gap:12px;">
193
+ <div style="display:flex;flex-direction:column;gap:8px;">
194
+ <p style="font-size:.75rem;font-weight:600;margin:0;text-transform:uppercase;letter-spacing:.04em;color:#64748b;">Diagram code</p>
195
+ <div style="${editorWrapCss}">
196
+ <div class="${DIAGRAM_MODAL_CLASS}__highlight" style="${highlightLayerCss}"></div>
197
+ <textarea class="${DIAGRAM_MODAL_CLASS}__input" spellcheck="false"
198
+ placeholder="${escapeHtml(options.placeholder ?? DEFAULT_PLACEHOLDER)}"
199
+ style="${textareaCss}">${escapeHtml(initialCode)}</textarea>
200
+ </div>
201
+ <div>
202
+ <p style="font-size:.7rem;font-weight:600;margin:0 0 6px;text-transform:uppercase;letter-spacing:.04em;color:#94a3b8;">Quick start</p>
203
+ <div class="${DIAGRAM_MODAL_CLASS}__chips" style="display:flex;flex-wrap:wrap;gap:6px;">${chipsHtml}</div>
204
+ </div>
205
+ </div>
206
+ <div style="display:flex;flex-direction:column;gap:8px;">
207
+ <p style="font-size:.75rem;font-weight:600;margin:0;text-transform:uppercase;letter-spacing:.04em;color:#64748b;">Preview</p>
208
+ <div class="${DIAGRAM_MODAL_CLASS}__preview" style="height:280px;padding:8px;border:1px solid var(--de-border,#e2e8f0);border-radius:8px;background:var(--de-content-bg,#fff);overflow:auto;"></div>
209
+ </div>
210
+ </div>
211
+ <div>
212
+ <button type="button" class="${DIAGRAM_MODAL_CLASS}__help-toggle" style="${helpBtnStyle}">
213
+ <span style="${helpCircleStyle}">?</span>
214
+ Syntax reference
215
+ <span class="${DIAGRAM_MODAL_CLASS}__help-chevron" style="font-size:.7rem;transition:transform .2s;margin-left:2px;">▾</span>
216
+ </button>
217
+ <div class="${DIAGRAM_MODAL_CLASS}__help" hidden style="margin-top:8px;">${buildHelpHtml()}</div>
218
+ </div>
219
+ <div style="display:flex;justify-content:flex-end;gap:8px;margin-top:4px;">
220
+ <button type="button" class="${DIAGRAM_MODAL_CLASS}__cancel" style="padding:7px 16px;border:1px solid var(--de-border,#e2e8f0);background:none;border-radius:8px;cursor:pointer;font-size:.875rem;">Cancel</button>
221
+ <button type="button" class="${DIAGRAM_MODAL_CLASS}__confirm" style="padding:7px 16px;background:var(--de-primary,#2563eb);color:#fff;border:none;border-radius:8px;cursor:pointer;font-size:.875rem;font-weight:500;">Insert</button>
222
+ </div>
223
+ `;
224
+ backdrop.appendChild(panel);
225
+ document.body.appendChild(backdrop);
226
+ const textarea = panel.querySelector(`.${DIAGRAM_MODAL_CLASS}__input`);
227
+ const highlight = panel.querySelector(`.${DIAGRAM_MODAL_CLASS}__highlight`);
228
+ const preview = panel.querySelector(`.${DIAGRAM_MODAL_CLASS}__preview`);
229
+ const cancelBtn = panel.querySelector(`.${DIAGRAM_MODAL_CLASS}__cancel`);
230
+ const confirmBtn = panel.querySelector(`.${DIAGRAM_MODAL_CLASS}__confirm`);
231
+ let lastRendered = "";
232
+ let previewTimer = null;
233
+ const currentAlign = initialAlign;
234
+ const updateHighlight = () => {
235
+ highlight.innerHTML = highlightMermaid(textarea.value);
236
+ };
237
+ const updatePreview = () => {
238
+ if (previewTimer)
239
+ clearTimeout(previewTimer);
240
+ previewTimer = setTimeout(async () => {
241
+ // Use renderPreview (raw SVG, styles intact) for display; renderDiagram for insertion
242
+ const editorHtml = await renderOrFallback(textarea.value, options.renderDiagram);
243
+ lastRendered = editorHtml;
244
+ const previewHtml = options.renderPreview
245
+ ? await renderOrFallback(textarea.value, options.renderPreview)
246
+ : editorHtml;
247
+ preview.innerHTML = previewHtml || `<span style="color:#94a3b8;font-size:.85rem;">Preview will appear here…</span>`;
248
+ // Scale SVG to fit preview container
249
+ const svgEl = preview.querySelector("svg");
250
+ if (svgEl) {
251
+ svgEl.removeAttribute("width");
252
+ svgEl.removeAttribute("height");
253
+ svgEl.style.width = "100%";
254
+ svgEl.style.height = "auto";
255
+ svgEl.style.display = "block";
256
+ }
257
+ }, 300);
258
+ };
259
+ // Sync scroll between transparent textarea and highlight layer
260
+ textarea.addEventListener("scroll", () => {
261
+ highlight.scrollTop = textarea.scrollTop;
262
+ highlight.scrollLeft = textarea.scrollLeft;
263
+ });
264
+ textarea.addEventListener("input", () => {
265
+ updateHighlight();
266
+ updatePreview();
267
+ });
268
+ // Initial render
269
+ updateHighlight();
270
+ updatePreview();
271
+ // Wire starter chips
272
+ panel.querySelectorAll(`.${DIAGRAM_MODAL_CLASS}__chip`).forEach((chip) => {
273
+ chip.addEventListener("click", () => {
274
+ textarea.value = chip.dataset.code ?? "";
275
+ textarea.focus();
276
+ updateHighlight();
277
+ updatePreview();
278
+ });
279
+ });
280
+ // Wire help toggle
281
+ const helpToggle = panel.querySelector(`.${DIAGRAM_MODAL_CLASS}__help-toggle`);
282
+ const helpPanel = panel.querySelector(`.${DIAGRAM_MODAL_CLASS}__help`);
283
+ const helpChevron = helpToggle.querySelector(`.${DIAGRAM_MODAL_CLASS}__help-chevron`);
284
+ helpToggle.addEventListener("click", () => {
285
+ const isOpen = !helpPanel.hidden;
286
+ helpPanel.hidden = isOpen;
287
+ helpChevron.style.transform = isOpen ? "" : "rotate(180deg)";
288
+ });
289
+ // Wire help type chips — click inserts starter code into editor
290
+ panel.querySelectorAll(`.${DIAGRAM_MODAL_CLASS}__help-type`).forEach((btn) => {
291
+ btn.addEventListener("click", () => {
292
+ textarea.value = btn.dataset.insert ?? "";
293
+ textarea.focus();
294
+ updateHighlight();
295
+ updatePreview();
296
+ });
297
+ });
298
+ const close = () => {
299
+ if (previewTimer)
300
+ clearTimeout(previewTimer);
301
+ backdrop.remove();
302
+ };
303
+ cancelBtn.addEventListener("click", close);
304
+ backdrop.addEventListener("click", (e) => { if (e.target === backdrop)
305
+ close(); });
306
+ panel.addEventListener("keydown", (e) => { if (e.key === "Escape")
307
+ close(); });
308
+ confirmBtn.addEventListener("click", async () => {
309
+ const code = textarea.value.trim();
310
+ if (!code) {
311
+ close();
312
+ return;
313
+ }
314
+ const rendered = lastRendered || await renderOrFallback(code, options.renderDiagram);
315
+ onConfirm(code, rendered, currentAlign);
316
+ close();
317
+ });
318
+ setTimeout(() => textarea.focus(), 50);
319
+ void host;
320
+ }
321
+ /**
322
+ * Mermaid / flowchart diagram blocks plugin.
323
+ *
324
+ * Adds an `insertDiagram` toolbar button. Diagrams are stored as
325
+ * `<figure class="de-diagram" data-diagram="...">` in the HTML.
326
+ * Click a diagram in the editor to edit it.
327
+ *
328
+ * Pass `renderDiagram` to enable live preview and rendered output:
329
+ * ```ts
330
+ * import mermaid from "mermaid";
331
+ * mermaid.initialize({ startOnLoad: false });
332
+ *
333
+ * createEditor({
334
+ * plugins: [createDiagramsPlugin({
335
+ * renderDiagram: async (code) => {
336
+ * const { svg } = await mermaid.render("d" + Date.now(), code);
337
+ * return svg;
338
+ * }
339
+ * })]
340
+ * });
341
+ * ```
342
+ */
343
+ export function createDiagramsPlugin(options = {}) {
344
+ return {
345
+ id: "richhtmleditor-diagrams",
346
+ tools: [
347
+ {
348
+ id: "insertDiagram",
349
+ type: "button",
350
+ label: options.label ?? "Diagram",
351
+ icon: "diagram",
352
+ display: "icon",
353
+ tooltip: "Insert Mermaid / flowchart diagram",
354
+ onClick: (editor) => {
355
+ const host = editor.element;
356
+ openDiagramModal(host, options, options.placeholder ?? DEFAULT_PLACEHOLDER, "center", async (code, rendered, align) => {
357
+ const figHtml = buildFigureHtml(code, rendered, align);
358
+ const current = editor.getHTML();
359
+ editor.setContent(`${current}<p>${figHtml}</p>`);
360
+ });
361
+ }
362
+ }
363
+ ],
364
+ attach: (editor) => {
365
+ const host = editor.element;
366
+ // Prevent re-entrant calls to rerenderAll triggered by our own setContent
367
+ let isRerendering = false;
368
+ /** Re-render figures that have no SVG yet, then sync the editor model. */
369
+ const rerenderAll = async () => {
370
+ if (!options.renderDiagram || isRerendering)
371
+ return;
372
+ const temp = document.createElement("div");
373
+ temp.innerHTML = editor.getHTML();
374
+ const figs = Array.from(temp.querySelectorAll(`figure.${DIAGRAM_CLASS}`));
375
+ // Only process figures that are not yet rendered (no svg or img child)
376
+ const toRender = figs.filter((fig) => !fig.querySelector("svg, img"));
377
+ if (!toRender.length)
378
+ return;
379
+ for (const fig of toRender) {
380
+ const code = fig.dataset.diagram ?? "";
381
+ if (!code)
382
+ continue;
383
+ const rendered = await renderOrFallback(code, options.renderDiagram);
384
+ const align = fig.dataset.align ?? "center";
385
+ const tmpl = document.createElement("template");
386
+ tmpl.innerHTML = buildFigureHtml(code, rendered, align);
387
+ fig.replaceWith(tmpl.content.firstChild);
388
+ }
389
+ isRerendering = true;
390
+ editor.setContent(temp.innerHTML);
391
+ isRerendering = false;
392
+ };
393
+ /** Return the 0-based index of a DOM figure among all diagram figures in the host. */
394
+ const figIndex = (fig) => Array.from(host.querySelectorAll(`figure.${DIAGRAM_CLASS}`)).indexOf(fig);
395
+ /** Replace the model figure at `idx` with `newFigHtml` and commit via setContent. */
396
+ const commitFigureUpdate = (idx, newFigHtml) => {
397
+ const temp = document.createElement("div");
398
+ temp.innerHTML = editor.getHTML();
399
+ const modelFigs = Array.from(temp.querySelectorAll(`figure.${DIAGRAM_CLASS}`));
400
+ const target = modelFigs[idx];
401
+ if (!target)
402
+ return;
403
+ const tmpl = document.createElement("template");
404
+ tmpl.innerHTML = newFigHtml;
405
+ target.replaceWith(tmpl.content.firstChild);
406
+ isRerendering = true;
407
+ editor.setContent(temp.innerHTML);
408
+ isRerendering = false;
409
+ };
410
+ const onFigureClick = (e) => {
411
+ const target = e.target;
412
+ // ── Alignment buttons ────────────────────────────────────────
413
+ const alignBtn = target.closest(`[data-align-btn]`);
414
+ if (alignBtn) {
415
+ e.preventDefault();
416
+ e.stopPropagation();
417
+ const fig = alignBtn.closest(`figure.${DIAGRAM_CLASS}`);
418
+ if (!fig)
419
+ return;
420
+ const newAlign = alignBtn.dataset.alignBtn;
421
+ const idx = figIndex(fig);
422
+ const temp = document.createElement("div");
423
+ temp.innerHTML = editor.getHTML();
424
+ const modelFigs = Array.from(temp.querySelectorAll(`figure.${DIAGRAM_CLASS}`));
425
+ if (modelFigs[idx]) {
426
+ modelFigs[idx].setAttribute("data-align", newAlign);
427
+ const contentDiv = modelFigs[idx].querySelector(`.${DIAGRAM_CLASS}__content`);
428
+ if (contentDiv)
429
+ contentDiv.style.justifyContent = alignToJustify(newAlign);
430
+ isRerendering = true;
431
+ editor.setContent(temp.innerHTML);
432
+ isRerendering = false;
433
+ }
434
+ return;
435
+ }
436
+ // ── Delete button ────────────────────────────────────────────
437
+ if (target.closest(`.${DIAGRAM_CLASS}__remove`)) {
438
+ e.preventDefault();
439
+ e.stopPropagation();
440
+ const fig = target.closest(`figure.${DIAGRAM_CLASS}`);
441
+ if (!fig)
442
+ return;
443
+ const idx = figIndex(fig);
444
+ const temp = document.createElement("div");
445
+ temp.innerHTML = editor.getHTML();
446
+ const modelFigs = Array.from(temp.querySelectorAll(`figure.${DIAGRAM_CLASS}`));
447
+ if (idx >= 0 && modelFigs[idx]) {
448
+ // Remove the wrapping <p> too if it is empty after removal
449
+ const parent = modelFigs[idx].parentElement;
450
+ modelFigs[idx].remove();
451
+ if (parent && parent.tagName === "P" && !parent.textContent?.trim() && !parent.children.length) {
452
+ parent.remove();
453
+ }
454
+ isRerendering = true;
455
+ editor.setContent(temp.innerHTML);
456
+ isRerendering = false;
457
+ }
458
+ else {
459
+ fig.remove();
460
+ }
461
+ return;
462
+ }
463
+ // ── Edit click ───────────────────────────────────────────────
464
+ const fig = target.closest(`figure.${DIAGRAM_CLASS}`);
465
+ if (!fig)
466
+ return;
467
+ e.preventDefault();
468
+ const code = fig.dataset.diagram ?? "";
469
+ const idx = figIndex(fig);
470
+ const currentAlign = fig.dataset.align ?? "center";
471
+ openDiagramModal(host, options, code, currentAlign, (newCode, rendered, align) => {
472
+ commitFigureUpdate(idx, buildFigureHtml(newCode, rendered, align));
473
+ });
474
+ };
475
+ const offChange = editor.on("change", () => { void rerenderAll(); });
476
+ host.addEventListener("click", onFigureClick);
477
+ // Inject CSS
478
+ const styleId = "de-diagrams-styles";
479
+ if (!document.getElementById(styleId)) {
480
+ const style = document.createElement("style");
481
+ style.id = styleId;
482
+ style.textContent = `
483
+ figure.de-diagram{display:block;margin:1rem 0;padding:12px;border:1px solid var(--de-border,#e2e8f0);border-radius:8px;background:var(--de-content-bg,#fff);cursor:pointer;}
484
+ figure.de-diagram:hover{border-color:var(--de-primary,#2563eb);}
485
+ figure.de-diagram svg,figure.de-diagram img{max-width:100%;height:auto;}
486
+ .de-diagram__content{display:flex;}
487
+ figure.de-diagram .de-diagram__edit-hint{display:none;}
488
+ [contenteditable="true"] figure.de-diagram .de-diagram__edit-hint{display:flex;}
489
+ figure.de-diagram[data-align="left"] [data-align-btn="left"],
490
+ figure.de-diagram[data-align="center"] [data-align-btn="center"],
491
+ figure.de-diagram[data-align="right"] [data-align-btn="right"]{background:var(--de-primary,#2563eb)!important;color:#fff!important;border-color:var(--de-primary,#2563eb)!important;}
492
+ .de-diagram__remove:hover{background:rgba(220,38,38,.18)!important;color:#dc2626!important;}
493
+ `.trim();
494
+ document.head.appendChild(style);
495
+ }
496
+ // Initial render
497
+ void rerenderAll();
498
+ return () => {
499
+ offChange();
500
+ host.removeEventListener("click", onFigureClick);
501
+ };
502
+ }
503
+ };
504
+ }
505
+ /** Strip rendered content from diagram figures, leaving only the `data-diagram` source attribute. */
506
+ export function prepareDiagramsForExport(html) {
507
+ const template = document.createElement("template");
508
+ template.innerHTML = html;
509
+ for (const fig of Array.from(template.content.querySelectorAll(`figure.${DIAGRAM_CLASS}`))) {
510
+ const code = fig.dataset.diagram ?? "";
511
+ fig.innerHTML = `<pre class="${DIAGRAM_CLASS}__code">${escapeHtml(code)}</pre>`;
512
+ }
513
+ return template.innerHTML;
514
+ }
515
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,27 @@
1
+ {
2
+ "name": "@richhtmleditor/diagrams",
3
+ "version": "1.1.0",
4
+ "description": "Mermaid / flowchart diagram blocks plugin for Rich HTML Editor.",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.js",
12
+ "default": "./dist/index.js"
13
+ }
14
+ },
15
+ "files": ["dist", "README.md"],
16
+ "scripts": {
17
+ "build": "tsc -p tsconfig.json",
18
+ "prepack": "node ../../scripts/assert-pack-ready.mjs"
19
+ },
20
+ "dependencies": {
21
+ "@richhtmleditor/core": "^1.1.0"
22
+ },
23
+ "keywords": ["richhtmleditor", "diagrams", "mermaid", "flowchart", "technical-docs"],
24
+ "license": "MIT",
25
+ "publishConfig": { "access": "public" },
26
+ "engines": { "node": ">=18" }
27
+ }