@hejiayue/x-markdown-test 0.0.1-beta.113 → 0.0.1-beta.116
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/style.css +1 -1
- package/dist/x-markdown.cjs.js +1 -1
- package/dist/x-markdown.cjs10.js +2 -0
- package/dist/x-markdown.cjs10.js.map +1 -0
- package/dist/x-markdown.cjs11.js +2 -0
- package/dist/x-markdown.cjs11.js.map +1 -0
- package/dist/x-markdown.cjs13.js +2 -0
- package/dist/x-markdown.cjs13.js.map +1 -0
- package/dist/x-markdown.cjs14.js +2 -0
- package/dist/x-markdown.cjs14.js.map +1 -0
- package/dist/x-markdown.cjs15.js +2 -0
- package/dist/x-markdown.cjs15.js.map +1 -0
- package/dist/x-markdown.cjs16.js +2 -0
- package/dist/x-markdown.cjs16.js.map +1 -0
- package/dist/x-markdown.cjs17.js +2 -0
- package/dist/x-markdown.cjs17.js.map +1 -0
- package/dist/x-markdown.cjs18.js +2 -0
- package/dist/x-markdown.cjs18.js.map +1 -0
- package/dist/x-markdown.cjs19.js +2 -0
- package/dist/x-markdown.cjs19.js.map +1 -0
- package/dist/x-markdown.cjs2.js +2 -0
- package/dist/x-markdown.cjs2.js.map +1 -0
- package/dist/x-markdown.cjs21.js +2 -0
- package/dist/x-markdown.cjs21.js.map +1 -0
- package/dist/x-markdown.cjs22.js +2 -0
- package/dist/x-markdown.cjs22.js.map +1 -0
- package/dist/x-markdown.cjs24.js +2 -0
- package/dist/x-markdown.cjs24.js.map +1 -0
- package/dist/x-markdown.cjs26.js +2 -0
- package/dist/x-markdown.cjs26.js.map +1 -0
- package/dist/x-markdown.cjs27.js +2 -0
- package/dist/x-markdown.cjs27.js.map +1 -0
- package/dist/x-markdown.cjs28.js +2 -0
- package/dist/x-markdown.cjs28.js.map +1 -0
- package/dist/x-markdown.cjs3.js +2 -0
- package/dist/x-markdown.cjs3.js.map +1 -0
- package/dist/x-markdown.cjs30.js +2 -0
- package/dist/x-markdown.cjs30.js.map +1 -0
- package/dist/x-markdown.cjs31.js +2 -0
- package/dist/x-markdown.cjs31.js.map +1 -0
- package/dist/x-markdown.cjs33.js +2 -0
- package/dist/x-markdown.cjs33.js.map +1 -0
- package/dist/x-markdown.cjs4.js +2 -0
- package/dist/x-markdown.cjs4.js.map +1 -0
- package/dist/x-markdown.cjs5.js +2 -0
- package/dist/x-markdown.cjs5.js.map +1 -0
- package/dist/x-markdown.cjs6.js +2 -0
- package/dist/x-markdown.cjs6.js.map +1 -0
- package/dist/x-markdown.cjs7.js +2 -0
- package/dist/x-markdown.cjs7.js.map +1 -0
- package/dist/x-markdown.cjs8.js +2 -0
- package/dist/x-markdown.cjs8.js.map +1 -0
- package/dist/x-markdown.cjs9.js +2 -0
- package/dist/x-markdown.cjs9.js.map +1 -0
- package/dist/x-markdown.es.js +26 -17
- package/dist/x-markdown.es.js.map +1 -1
- package/dist/x-markdown.es10.js +49 -0
- package/dist/x-markdown.es10.js.map +1 -0
- package/dist/x-markdown.es11.js +54 -0
- package/dist/x-markdown.es11.js.map +1 -0
- package/dist/x-markdown.es13.js +89 -0
- package/dist/x-markdown.es13.js.map +1 -0
- package/dist/x-markdown.es14.js +34 -0
- package/dist/x-markdown.es14.js.map +1 -0
- package/dist/x-markdown.es15.js +5 -0
- package/dist/x-markdown.es15.js.map +1 -0
- package/dist/x-markdown.es16.js +6 -0
- package/dist/x-markdown.es16.js.map +1 -0
- package/dist/x-markdown.es17.js +8 -0
- package/dist/x-markdown.es17.js.map +1 -0
- package/dist/x-markdown.es18.js +8 -0
- package/dist/x-markdown.es18.js.map +1 -0
- package/dist/x-markdown.es19.js +207 -0
- package/dist/x-markdown.es19.js.map +1 -0
- package/dist/x-markdown.es2.js +83 -0
- package/dist/x-markdown.es2.js.map +1 -0
- package/dist/x-markdown.es21.js +11 -0
- package/dist/x-markdown.es21.js.map +1 -0
- package/dist/x-markdown.es22.js +75 -0
- package/dist/x-markdown.es22.js.map +1 -0
- package/dist/{index-SElRorTo.js → x-markdown.es24.js} +7 -139
- package/dist/x-markdown.es24.js.map +1 -0
- package/dist/x-markdown.es26.js +160 -0
- package/dist/x-markdown.es26.js.map +1 -0
- package/dist/x-markdown.es27.js +8 -0
- package/dist/x-markdown.es27.js.map +1 -0
- package/dist/x-markdown.es28.js +142 -0
- package/dist/x-markdown.es28.js.map +1 -0
- package/dist/x-markdown.es3.js +94 -0
- package/dist/x-markdown.es3.js.map +1 -0
- package/dist/x-markdown.es30.js +78 -0
- package/dist/x-markdown.es30.js.map +1 -0
- package/dist/x-markdown.es31.js +125 -0
- package/dist/x-markdown.es31.js.map +1 -0
- package/dist/x-markdown.es33.js +6 -0
- package/dist/x-markdown.es33.js.map +1 -0
- package/dist/x-markdown.es4.js +150 -0
- package/dist/x-markdown.es4.js.map +1 -0
- package/dist/x-markdown.es5.js +40 -0
- package/dist/x-markdown.es5.js.map +1 -0
- package/dist/x-markdown.es6.js +24 -0
- package/dist/x-markdown.es6.js.map +1 -0
- package/dist/x-markdown.es7.js +279 -0
- package/dist/x-markdown.es7.js.map +1 -0
- package/dist/x-markdown.es8.js +27 -0
- package/dist/x-markdown.es8.js.map +1 -0
- package/dist/x-markdown.es9.js +409 -0
- package/dist/x-markdown.es9.js.map +1 -0
- package/package.json +3 -3
- package/dist/index-D9u8JldH.cjs +0 -2
- package/dist/index-D9u8JldH.cjs.map +0 -1
- package/dist/index-SElRorTo.js.map +0 -1
- package/dist/index-lQ_FQFr2.js +0 -1882
- package/dist/index-lQ_FQFr2.js.map +0 -1
- package/dist/index-nZ5iH1aN.cjs +0 -2
- package/dist/index-nZ5iH1aN.cjs.map +0 -1
|
@@ -0,0 +1,409 @@
|
|
|
1
|
+
import { throttle } from "lodash-es";
|
|
2
|
+
import { computed, ref, watch, onUnmounted } from "vue";
|
|
3
|
+
function downloadSvgAsPng(svg) {
|
|
4
|
+
if (!svg) return;
|
|
5
|
+
try {
|
|
6
|
+
const svgDataUrl = `data:image/svg+xml;charset=utf-8,${encodeURIComponent(svg)}`;
|
|
7
|
+
const img = new Image();
|
|
8
|
+
img.onload = () => {
|
|
9
|
+
try {
|
|
10
|
+
const canvas = document.createElement("canvas");
|
|
11
|
+
const ctx = canvas.getContext("2d", { willReadFrequently: false });
|
|
12
|
+
if (!ctx) return;
|
|
13
|
+
const scale = 2;
|
|
14
|
+
canvas.width = img.width * scale;
|
|
15
|
+
canvas.height = img.height * scale;
|
|
16
|
+
ctx.imageSmoothingEnabled = true;
|
|
17
|
+
ctx.imageSmoothingQuality = "high";
|
|
18
|
+
ctx.fillStyle = "#ffffff";
|
|
19
|
+
ctx.fillRect(0, 0, canvas.width, canvas.height);
|
|
20
|
+
ctx.drawImage(img, 0, 0, canvas.width, canvas.height);
|
|
21
|
+
const timestamp = (/* @__PURE__ */ new Date()).toISOString().slice(0, 19).replace(/:/g, "-");
|
|
22
|
+
try {
|
|
23
|
+
canvas.toBlob(
|
|
24
|
+
(blob) => {
|
|
25
|
+
if (!blob) return;
|
|
26
|
+
const url = URL.createObjectURL(blob);
|
|
27
|
+
const link = document.createElement("a");
|
|
28
|
+
link.href = url;
|
|
29
|
+
link.download = `mermaid-diagram-${timestamp}.png`;
|
|
30
|
+
document.body.appendChild(link);
|
|
31
|
+
link.click();
|
|
32
|
+
document.body.removeChild(link);
|
|
33
|
+
URL.revokeObjectURL(url);
|
|
34
|
+
},
|
|
35
|
+
"image/png",
|
|
36
|
+
0.95
|
|
37
|
+
);
|
|
38
|
+
} catch (toBlobError) {
|
|
39
|
+
console.error("Failed to convert canvas to blob:", toBlobError);
|
|
40
|
+
try {
|
|
41
|
+
const dataUrl = canvas.toDataURL("image/png", 0.95);
|
|
42
|
+
const link = document.createElement("a");
|
|
43
|
+
link.href = dataUrl;
|
|
44
|
+
link.download = `mermaid-diagram-${timestamp}.png`;
|
|
45
|
+
document.body.appendChild(link);
|
|
46
|
+
link.click();
|
|
47
|
+
document.body.removeChild(link);
|
|
48
|
+
} catch (dataUrlError) {
|
|
49
|
+
console.error("Failed to convert canvas to data URL:", dataUrlError);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
} catch (canvasError) {
|
|
53
|
+
console.error("Canvas operation failed:", canvasError);
|
|
54
|
+
}
|
|
55
|
+
};
|
|
56
|
+
img.onerror = (error) => {
|
|
57
|
+
console.error("Failed to load image:", error);
|
|
58
|
+
};
|
|
59
|
+
img.src = svgDataUrl;
|
|
60
|
+
} catch (error) {
|
|
61
|
+
console.error("Failed to download SVG:", error);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
let mermaidPromise = null;
|
|
65
|
+
let hasShownMermaidHint = false;
|
|
66
|
+
let mermaidAvailableCache = null;
|
|
67
|
+
let mermaidCheckPromise = null;
|
|
68
|
+
async function checkMermaidAvailable() {
|
|
69
|
+
if (mermaidAvailableCache !== null) {
|
|
70
|
+
return mermaidAvailableCache;
|
|
71
|
+
}
|
|
72
|
+
if (mermaidCheckPromise) {
|
|
73
|
+
return mermaidCheckPromise;
|
|
74
|
+
}
|
|
75
|
+
mermaidCheckPromise = (async () => {
|
|
76
|
+
try {
|
|
77
|
+
await import("mermaid");
|
|
78
|
+
mermaidAvailableCache = true;
|
|
79
|
+
return true;
|
|
80
|
+
} catch (error) {
|
|
81
|
+
mermaidAvailableCache = false;
|
|
82
|
+
return false;
|
|
83
|
+
}
|
|
84
|
+
})();
|
|
85
|
+
return mermaidCheckPromise;
|
|
86
|
+
}
|
|
87
|
+
const showMermaidHint = () => {
|
|
88
|
+
if (hasShownMermaidHint) return;
|
|
89
|
+
hasShownMermaidHint = true;
|
|
90
|
+
console.log(
|
|
91
|
+
"%c[x-markdown]%c Mermaid 图表功能已降级为代码块显示",
|
|
92
|
+
"font-weight: bold; color: #9333ea;",
|
|
93
|
+
"color: #666;"
|
|
94
|
+
);
|
|
95
|
+
console.log(
|
|
96
|
+
"%c如需 Mermaid 图表渲染功能,请安装:",
|
|
97
|
+
"color: #666; font-weight: bold;"
|
|
98
|
+
);
|
|
99
|
+
console.log(
|
|
100
|
+
"%c pnpm add mermaid",
|
|
101
|
+
"color: #9333ea; font-family: monospace;"
|
|
102
|
+
);
|
|
103
|
+
console.log(
|
|
104
|
+
"%c安装后请重启开发服务器",
|
|
105
|
+
"color: #999; font-size: 12px;"
|
|
106
|
+
);
|
|
107
|
+
};
|
|
108
|
+
async function loadMermaid() {
|
|
109
|
+
if (typeof window === "undefined") return null;
|
|
110
|
+
if (!mermaidPromise) {
|
|
111
|
+
mermaidPromise = (async () => {
|
|
112
|
+
try {
|
|
113
|
+
const mod = await import("mermaid");
|
|
114
|
+
return mod.default;
|
|
115
|
+
} catch {
|
|
116
|
+
showMermaidHint();
|
|
117
|
+
return null;
|
|
118
|
+
}
|
|
119
|
+
})();
|
|
120
|
+
}
|
|
121
|
+
return mermaidPromise;
|
|
122
|
+
}
|
|
123
|
+
const renderQueue = [];
|
|
124
|
+
let isProcessingQueue = false;
|
|
125
|
+
async function processRenderQueue() {
|
|
126
|
+
if (isProcessingQueue) return;
|
|
127
|
+
isProcessingQueue = true;
|
|
128
|
+
while (renderQueue.length > 0) {
|
|
129
|
+
const task = renderQueue.shift();
|
|
130
|
+
if (task) {
|
|
131
|
+
try {
|
|
132
|
+
await task();
|
|
133
|
+
} catch (err) {
|
|
134
|
+
console.error("Mermaid render queue error:", err);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
isProcessingQueue = false;
|
|
139
|
+
}
|
|
140
|
+
function addToRenderQueue(task) {
|
|
141
|
+
renderQueue.push(task);
|
|
142
|
+
processRenderQueue();
|
|
143
|
+
}
|
|
144
|
+
function useMermaid(content, options = {}) {
|
|
145
|
+
const optionsRef = computed(() => typeof options === "object" && "value" in options ? options.value : options);
|
|
146
|
+
const mermaidConfig = computed(() => ({
|
|
147
|
+
suppressErrorRendering: true,
|
|
148
|
+
startOnLoad: false,
|
|
149
|
+
securityLevel: "loose",
|
|
150
|
+
theme: optionsRef.value.theme || "default",
|
|
151
|
+
...optionsRef.value.config || {}
|
|
152
|
+
}));
|
|
153
|
+
const data = ref("");
|
|
154
|
+
const error = ref(null);
|
|
155
|
+
const isLoading = ref(false);
|
|
156
|
+
let isUnmounted = false;
|
|
157
|
+
const getRenderContainer = () => {
|
|
158
|
+
const containerOption = optionsRef.value.container;
|
|
159
|
+
if (containerOption) {
|
|
160
|
+
return typeof containerOption === "object" && "value" in containerOption ? containerOption.value : containerOption;
|
|
161
|
+
}
|
|
162
|
+
return null;
|
|
163
|
+
};
|
|
164
|
+
const throttledRender = throttle(
|
|
165
|
+
() => {
|
|
166
|
+
const contentValue = typeof content === "string" ? content : content.value;
|
|
167
|
+
if (!contentValue?.trim()) {
|
|
168
|
+
data.value = "";
|
|
169
|
+
error.value = null;
|
|
170
|
+
isLoading.value = false;
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
173
|
+
isLoading.value = true;
|
|
174
|
+
addToRenderQueue(async () => {
|
|
175
|
+
if (isUnmounted) return;
|
|
176
|
+
try {
|
|
177
|
+
const mermaidInstance = await loadMermaid();
|
|
178
|
+
if (!mermaidInstance) {
|
|
179
|
+
data.value = contentValue;
|
|
180
|
+
error.value = null;
|
|
181
|
+
isLoading.value = false;
|
|
182
|
+
return;
|
|
183
|
+
}
|
|
184
|
+
mermaidInstance.initialize(mermaidConfig.value);
|
|
185
|
+
const isValid = await mermaidInstance.parse(contentValue.trim());
|
|
186
|
+
if (!isValid) {
|
|
187
|
+
data.value = "";
|
|
188
|
+
error.value = new Error("Mermaid parse error: Invalid syntax");
|
|
189
|
+
isLoading.value = false;
|
|
190
|
+
return;
|
|
191
|
+
}
|
|
192
|
+
const renderId = `${optionsRef.value.id || "mermaid"}-${Math.random().toString(36).substring(2, 11)}`;
|
|
193
|
+
const container = getRenderContainer();
|
|
194
|
+
if (!container) {
|
|
195
|
+
isLoading.value = false;
|
|
196
|
+
return;
|
|
197
|
+
}
|
|
198
|
+
const { svg } = await mermaidInstance.render(renderId, contentValue, container);
|
|
199
|
+
data.value = svg;
|
|
200
|
+
error.value = null;
|
|
201
|
+
isLoading.value = false;
|
|
202
|
+
} catch (err) {
|
|
203
|
+
data.value = "";
|
|
204
|
+
error.value = err;
|
|
205
|
+
isLoading.value = false;
|
|
206
|
+
}
|
|
207
|
+
});
|
|
208
|
+
},
|
|
209
|
+
100,
|
|
210
|
+
{ leading: false, trailing: true }
|
|
211
|
+
);
|
|
212
|
+
watch(
|
|
213
|
+
[() => typeof content === "string" ? content : content.value, () => mermaidConfig.value],
|
|
214
|
+
() => {
|
|
215
|
+
throttledRender();
|
|
216
|
+
},
|
|
217
|
+
{ immediate: true }
|
|
218
|
+
);
|
|
219
|
+
onUnmounted(() => {
|
|
220
|
+
isUnmounted = true;
|
|
221
|
+
});
|
|
222
|
+
return {
|
|
223
|
+
data,
|
|
224
|
+
error,
|
|
225
|
+
isLoading
|
|
226
|
+
};
|
|
227
|
+
}
|
|
228
|
+
function useMermaidZoom(options) {
|
|
229
|
+
const { container } = options;
|
|
230
|
+
const scale = ref(1);
|
|
231
|
+
const posX = ref(0);
|
|
232
|
+
const posY = ref(0);
|
|
233
|
+
const isDragging = ref(false);
|
|
234
|
+
let removeEvents = null;
|
|
235
|
+
const getSvg = () => container.value?.querySelector(".syntax-mermaid__content svg");
|
|
236
|
+
const updateTransform = (svg) => {
|
|
237
|
+
svg.style.transformOrigin = "center center";
|
|
238
|
+
svg.style.transform = `translate(${posX.value}px, ${posY.value}px) scale(${scale.value})`;
|
|
239
|
+
};
|
|
240
|
+
const resetState = () => {
|
|
241
|
+
scale.value = 1;
|
|
242
|
+
posX.value = 0;
|
|
243
|
+
posY.value = 0;
|
|
244
|
+
isDragging.value = false;
|
|
245
|
+
};
|
|
246
|
+
const addInteractionEvents = (containerEl) => {
|
|
247
|
+
let startX = 0;
|
|
248
|
+
let startY = 0;
|
|
249
|
+
let isInteractingWithMermaid = false;
|
|
250
|
+
const onStart = (clientX, clientY) => {
|
|
251
|
+
isDragging.value = true;
|
|
252
|
+
startX = clientX - posX.value;
|
|
253
|
+
startY = clientY - posY.value;
|
|
254
|
+
document.body.style.userSelect = "none";
|
|
255
|
+
};
|
|
256
|
+
const onMove = (clientX, clientY) => {
|
|
257
|
+
if (isDragging.value && isInteractingWithMermaid) {
|
|
258
|
+
posX.value = clientX - startX;
|
|
259
|
+
posY.value = clientY - startY;
|
|
260
|
+
const svg = getSvg();
|
|
261
|
+
if (svg) {
|
|
262
|
+
updateTransform(svg);
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
};
|
|
266
|
+
const onEnd = () => {
|
|
267
|
+
isDragging.value = false;
|
|
268
|
+
isInteractingWithMermaid = false;
|
|
269
|
+
document.body.style.userSelect = "";
|
|
270
|
+
};
|
|
271
|
+
const onMouseDown = (e) => {
|
|
272
|
+
if (e.button !== 0) return;
|
|
273
|
+
if (e.target === containerEl || containerEl.contains(e.target)) {
|
|
274
|
+
e.preventDefault();
|
|
275
|
+
isInteractingWithMermaid = true;
|
|
276
|
+
onStart(e.clientX, e.clientY);
|
|
277
|
+
}
|
|
278
|
+
};
|
|
279
|
+
const onMouseMove = (e) => {
|
|
280
|
+
if (isInteractingWithMermaid) {
|
|
281
|
+
onMove(e.clientX, e.clientY);
|
|
282
|
+
}
|
|
283
|
+
};
|
|
284
|
+
const handleWheelZoom = (e) => {
|
|
285
|
+
const svg = getSvg();
|
|
286
|
+
if (!svg) return;
|
|
287
|
+
const containerRect = containerEl.getBoundingClientRect();
|
|
288
|
+
const svgRect = svg.getBoundingClientRect();
|
|
289
|
+
const mouseX = e.clientX - containerRect.left;
|
|
290
|
+
const mouseY = e.clientY - containerRect.top;
|
|
291
|
+
const svgCenterX = svgRect.left - containerRect.left + svgRect.width / 2;
|
|
292
|
+
const svgCenterY = svgRect.top - containerRect.top + svgRect.height / 2;
|
|
293
|
+
const offsetX = (mouseX - svgCenterX - posX.value) / scale.value;
|
|
294
|
+
const offsetY = (mouseY - svgCenterY - posY.value) / scale.value;
|
|
295
|
+
const delta = e.deltaY > 0 ? -0.05 : 0.05;
|
|
296
|
+
const newScale = Math.min(Math.max(scale.value + delta, 0.1), 10);
|
|
297
|
+
if (newScale === scale.value) return;
|
|
298
|
+
scale.value = newScale;
|
|
299
|
+
posX.value = mouseX - svgCenterX - offsetX * scale.value;
|
|
300
|
+
posY.value = mouseY - svgCenterY - offsetY * scale.value;
|
|
301
|
+
updateTransform(svg);
|
|
302
|
+
};
|
|
303
|
+
const throttledWheelZoom = throttle(handleWheelZoom, 20, { leading: true, trailing: true });
|
|
304
|
+
const onWheel = (e) => {
|
|
305
|
+
if (e.target === containerEl || containerEl.contains(e.target)) {
|
|
306
|
+
e.preventDefault();
|
|
307
|
+
throttledWheelZoom(e);
|
|
308
|
+
}
|
|
309
|
+
};
|
|
310
|
+
const onTouchStart = (e) => {
|
|
311
|
+
if (e.target === containerEl || containerEl.contains(e.target)) {
|
|
312
|
+
if (e.touches.length === 1) {
|
|
313
|
+
e.preventDefault();
|
|
314
|
+
isInteractingWithMermaid = true;
|
|
315
|
+
onStart(e.touches[0].clientX, e.touches[0].clientY);
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
};
|
|
319
|
+
const onTouchMove = (e) => {
|
|
320
|
+
if (isInteractingWithMermaid) {
|
|
321
|
+
e.preventDefault();
|
|
322
|
+
onMove(e.touches[0].clientX, e.touches[0].clientY);
|
|
323
|
+
}
|
|
324
|
+
};
|
|
325
|
+
containerEl.addEventListener("mousedown", onMouseDown);
|
|
326
|
+
document.addEventListener("mousemove", onMouseMove);
|
|
327
|
+
document.addEventListener("mouseup", onEnd);
|
|
328
|
+
containerEl.addEventListener("wheel", onWheel, { passive: false });
|
|
329
|
+
containerEl.addEventListener("touchstart", onTouchStart, { passive: false });
|
|
330
|
+
containerEl.addEventListener("touchmove", onTouchMove, { passive: false });
|
|
331
|
+
document.addEventListener("touchend", onEnd);
|
|
332
|
+
return () => {
|
|
333
|
+
containerEl.removeEventListener("mousedown", onMouseDown);
|
|
334
|
+
document.removeEventListener("mousemove", onMouseMove);
|
|
335
|
+
document.removeEventListener("mouseup", onEnd);
|
|
336
|
+
containerEl.removeEventListener("wheel", onWheel);
|
|
337
|
+
containerEl.removeEventListener("touchstart", onTouchStart);
|
|
338
|
+
containerEl.removeEventListener("touchmove", onTouchMove);
|
|
339
|
+
document.removeEventListener("touchend", onEnd);
|
|
340
|
+
document.body.style.userSelect = "";
|
|
341
|
+
};
|
|
342
|
+
};
|
|
343
|
+
const zoomIn = () => {
|
|
344
|
+
const svg = getSvg();
|
|
345
|
+
if (svg) {
|
|
346
|
+
scale.value = Math.min(scale.value + 0.2, 10);
|
|
347
|
+
updateTransform(svg);
|
|
348
|
+
}
|
|
349
|
+
};
|
|
350
|
+
const zoomOut = () => {
|
|
351
|
+
const svg = getSvg();
|
|
352
|
+
if (svg) {
|
|
353
|
+
scale.value = Math.max(scale.value - 0.2, 0.1);
|
|
354
|
+
updateTransform(svg);
|
|
355
|
+
}
|
|
356
|
+
};
|
|
357
|
+
const reset = () => {
|
|
358
|
+
const svg = getSvg();
|
|
359
|
+
if (svg) {
|
|
360
|
+
resetState();
|
|
361
|
+
updateTransform(svg);
|
|
362
|
+
}
|
|
363
|
+
};
|
|
364
|
+
const fullscreen = () => {
|
|
365
|
+
if (!container.value) return;
|
|
366
|
+
if (document.fullscreenElement) {
|
|
367
|
+
document.exitFullscreen();
|
|
368
|
+
} else {
|
|
369
|
+
container.value.requestFullscreen?.();
|
|
370
|
+
}
|
|
371
|
+
};
|
|
372
|
+
const initialize = () => {
|
|
373
|
+
if (!container.value) return;
|
|
374
|
+
resetState();
|
|
375
|
+
removeEvents = addInteractionEvents(container.value);
|
|
376
|
+
const svg = getSvg();
|
|
377
|
+
if (svg) {
|
|
378
|
+
updateTransform(svg);
|
|
379
|
+
}
|
|
380
|
+
};
|
|
381
|
+
const destroy = () => {
|
|
382
|
+
removeEvents?.();
|
|
383
|
+
removeEvents = null;
|
|
384
|
+
resetState();
|
|
385
|
+
};
|
|
386
|
+
watch(
|
|
387
|
+
() => container.value,
|
|
388
|
+
() => {
|
|
389
|
+
destroy();
|
|
390
|
+
resetState();
|
|
391
|
+
}
|
|
392
|
+
);
|
|
393
|
+
onUnmounted(destroy);
|
|
394
|
+
return {
|
|
395
|
+
zoomIn,
|
|
396
|
+
zoomOut,
|
|
397
|
+
reset,
|
|
398
|
+
fullscreen,
|
|
399
|
+
destroy,
|
|
400
|
+
initialize
|
|
401
|
+
};
|
|
402
|
+
}
|
|
403
|
+
export {
|
|
404
|
+
checkMermaidAvailable,
|
|
405
|
+
downloadSvgAsPng,
|
|
406
|
+
useMermaid,
|
|
407
|
+
useMermaidZoom
|
|
408
|
+
};
|
|
409
|
+
//# sourceMappingURL=x-markdown.es9.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"x-markdown.es9.js","sources":["../src/hooks/useMermaid.ts"],"sourcesContent":["import type { Ref } from 'vue'\r\nimport { throttle } from 'lodash-es'\r\nimport { computed, ref, watch, onUnmounted } from 'vue'\r\nimport type { MermaidZoomControls, UseMermaidZoomOptions, UseMermaidResult } from '../components/Mermaid/types'\r\n\r\nexport function downloadSvgAsPng(svg: string): void {\r\n if (!svg) return\r\n\r\n try {\r\n const svgDataUrl = `data:image/svg+xml;charset=utf-8,${encodeURIComponent(svg)}`\r\n const img = new Image()\r\n\r\n img.onload = () => {\r\n try {\r\n const canvas = document.createElement('canvas')\r\n const ctx = canvas.getContext('2d', { willReadFrequently: false })\r\n if (!ctx) return\r\n\r\n const scale = 2\r\n canvas.width = img.width * scale\r\n canvas.height = img.height * scale\r\n ctx.imageSmoothingEnabled = true\r\n ctx.imageSmoothingQuality = 'high'\r\n\r\n ctx.fillStyle = '#ffffff'\r\n ctx.fillRect(0, 0, canvas.width, canvas.height)\r\n ctx.drawImage(img, 0, 0, canvas.width, canvas.height)\r\n\r\n const timestamp = new Date().toISOString().slice(0, 19).replace(/:/g, '-')\r\n\r\n try {\r\n canvas.toBlob(\r\n (blob) => {\r\n if (!blob) return\r\n const url = URL.createObjectURL(blob)\r\n const link = document.createElement('a')\r\n link.href = url\r\n link.download = `mermaid-diagram-${timestamp}.png`\r\n document.body.appendChild(link)\r\n link.click()\r\n document.body.removeChild(link)\r\n URL.revokeObjectURL(url)\r\n },\r\n 'image/png',\r\n 0.95,\r\n )\r\n } catch (toBlobError) {\r\n console.error('Failed to convert canvas to blob:', toBlobError)\r\n try {\r\n const dataUrl = canvas.toDataURL('image/png', 0.95)\r\n const link = document.createElement('a')\r\n link.href = dataUrl\r\n link.download = `mermaid-diagram-${timestamp}.png`\r\n document.body.appendChild(link)\r\n link.click()\r\n document.body.removeChild(link)\r\n } catch (dataUrlError) {\r\n console.error('Failed to convert canvas to data URL:', dataUrlError)\r\n }\r\n }\r\n } catch (canvasError) {\r\n console.error('Canvas operation failed:', canvasError)\r\n }\r\n }\r\n\r\n img.onerror = (error) => {\r\n console.error('Failed to load image:', error)\r\n }\r\n\r\n img.src = svgDataUrl\r\n } catch (error) {\r\n console.error('Failed to download SVG:', error)\r\n }\r\n}\r\n\r\ninterface UseMermaidOptions {\r\n id?: string\r\n theme?: 'default' | 'dark' | 'forest' | 'neutral' | string\r\n config?: any\r\n container?: HTMLElement | Ref<HTMLElement | null> | null\r\n}\r\n\r\ntype UseMermaidOptionsInput = UseMermaidOptions | Ref<UseMermaidOptions>\r\n\r\nlet mermaidPromise: Promise<any> | null = null\r\nlet hasShownMermaidHint = false\r\nlet mermaidAvailableCache: boolean | null = null\r\nlet mermaidCheckPromise: Promise<boolean> | null = null\r\n\r\n/**\r\n * 同步检查缓存状态(不触发检测)\r\n * @returns 缓存状态,null 表示未检测\r\n */\r\nexport function getMermaidAvailableCache(): boolean | null {\r\n return mermaidAvailableCache\r\n}\r\n\r\n/**\r\n * 检测 mermaid 是否可用(全局缓存,只检测一次)\r\n */\r\nexport async function checkMermaidAvailable(): Promise<boolean> {\r\n // 如果已经有缓存结果,直接返回\r\n if (mermaidAvailableCache !== null) {\r\n return mermaidAvailableCache\r\n }\r\n\r\n // 如果正在检测,返回检测 Promise\r\n if (mermaidCheckPromise) {\r\n return mermaidCheckPromise\r\n }\r\n\r\n // 开始检测\r\n mermaidCheckPromise = (async () => {\r\n try {\r\n // 尝试静态导入 mermaid\r\n await import('mermaid')\r\n mermaidAvailableCache = true\r\n return true\r\n } catch (error) {\r\n mermaidAvailableCache = false\r\n return false\r\n }\r\n })()\r\n\r\n return mermaidCheckPromise\r\n}\r\n\r\nconst showMermaidHint = () => {\r\n if (hasShownMermaidHint) return\r\n hasShownMermaidHint = true\r\n\r\n console.log(\r\n '%c[x-markdown]%c Mermaid 图表功能已降级为代码块显示',\r\n 'font-weight: bold; color: #9333ea;',\r\n 'color: #666;'\r\n )\r\n console.log(\r\n '%c如需 Mermaid 图表渲染功能,请安装:',\r\n 'color: #666; font-weight: bold;'\r\n )\r\n console.log(\r\n '%c pnpm add mermaid',\r\n 'color: #9333ea; font-family: monospace;'\r\n )\r\n console.log(\r\n '%c安装后请重启开发服务器',\r\n 'color: #999; font-size: 12px;'\r\n )\r\n}\r\n\r\nasync function loadMermaid() {\r\n if (typeof window === 'undefined') return null\r\n if (!mermaidPromise) {\r\n mermaidPromise = (async () => {\r\n try {\r\n // 直接静态导入,让 Vite/Rollup 在构建时处理\r\n const mod = await import('mermaid')\r\n return (mod as any).default\r\n } catch {\r\n showMermaidHint()\r\n return null\r\n }\r\n })()\r\n }\r\n return mermaidPromise\r\n}\r\n\r\ntype RenderTask = () => Promise<void>\r\nconst renderQueue: RenderTask[] = []\r\nlet isProcessingQueue = false\r\n\r\nasync function processRenderQueue() {\r\n if (isProcessingQueue) return\r\n isProcessingQueue = true\r\n\r\n while (renderQueue.length > 0) {\r\n const task = renderQueue.shift()\r\n if (task) {\r\n try {\r\n await task()\r\n } catch (err) {\r\n console.error('Mermaid render queue error:', err)\r\n }\r\n }\r\n }\r\n\r\n isProcessingQueue = false\r\n}\r\n\r\nfunction addToRenderQueue(task: RenderTask) {\r\n renderQueue.push(task)\r\n processRenderQueue()\r\n}\r\n\r\nexport function useMermaid(content: string | Ref<string>, options: UseMermaidOptionsInput = {}): UseMermaidResult {\r\n const optionsRef = computed(() => (typeof options === 'object' && 'value' in options ? options.value : options))\r\n const mermaidConfig = computed(() => ({\r\n suppressErrorRendering: true,\r\n startOnLoad: false,\r\n securityLevel: 'loose',\r\n theme: optionsRef.value.theme || 'default',\r\n ...(optionsRef.value.config || {}),\r\n }))\r\n const data = ref('')\r\n const error = ref<unknown>(null)\r\n const isLoading = ref(false)\r\n\r\n let isUnmounted = false\r\n\r\n const getRenderContainer = () => {\r\n const containerOption = optionsRef.value.container\r\n if (containerOption) {\r\n return typeof containerOption === 'object' && 'value' in containerOption ? containerOption.value : containerOption\r\n }\r\n return null\r\n }\r\n\r\n const throttledRender = throttle(\r\n () => {\r\n const contentValue = typeof content === 'string' ? content : content.value\r\n if (!contentValue?.trim()) {\r\n data.value = ''\r\n error.value = null\r\n isLoading.value = false\r\n return\r\n }\r\n\r\n isLoading.value = true\r\n\r\n addToRenderQueue(async () => {\r\n if (isUnmounted) return\r\n\r\n try {\r\n const mermaidInstance = await loadMermaid()\r\n if (!mermaidInstance) {\r\n data.value = contentValue\r\n error.value = null\r\n isLoading.value = false\r\n return\r\n }\r\n\r\n mermaidInstance.initialize(mermaidConfig.value)\r\n\r\n const isValid = await mermaidInstance.parse(contentValue.trim())\r\n if (!isValid) {\r\n data.value = ''\r\n error.value = new Error('Mermaid parse error: Invalid syntax')\r\n isLoading.value = false\r\n return\r\n }\r\n\r\n const renderId = `${optionsRef.value.id || 'mermaid'}-${Math.random().toString(36).substring(2, 11)}`\r\n const container = getRenderContainer()\r\n if (!container) {\r\n isLoading.value = false\r\n return\r\n }\r\n\r\n const { svg } = await mermaidInstance.render(renderId, contentValue, container)\r\n data.value = svg\r\n error.value = null\r\n isLoading.value = false\r\n } catch (err) {\r\n // Mermaid render error\r\n data.value = ''\r\n error.value = err\r\n isLoading.value = false\r\n }\r\n })\r\n },\r\n 100,\r\n { leading: false, trailing: true },\r\n )\r\n\r\n watch(\r\n [() => (typeof content === 'string' ? content : content.value), () => mermaidConfig.value],\r\n () => {\r\n throttledRender()\r\n },\r\n { immediate: true },\r\n )\r\n\r\n onUnmounted(() => {\r\n isUnmounted = true\r\n })\r\n\r\n return {\r\n data,\r\n error,\r\n isLoading,\r\n }\r\n}\r\n\r\nexport function useMermaidZoom(options: UseMermaidZoomOptions): MermaidZoomControls {\r\n const { container } = options\r\n\r\n const scale = ref(1)\r\n const posX = ref(0)\r\n const posY = ref(0)\r\n const isDragging = ref(false)\r\n\r\n let removeEvents: (() => void) | null = null\r\n\r\n const getSvg = () => container.value?.querySelector('.syntax-mermaid__content svg') as HTMLElement\r\n\r\n const updateTransform = (svg: HTMLElement) => {\r\n svg.style.transformOrigin = 'center center'\r\n svg.style.transform = `translate(${posX.value}px, ${posY.value}px) scale(${scale.value})`\r\n }\r\n\r\n const resetState = () => {\r\n scale.value = 1\r\n posX.value = 0\r\n posY.value = 0\r\n isDragging.value = false\r\n }\r\n\r\n const addInteractionEvents = (containerEl: HTMLElement) => {\r\n let startX = 0\r\n let startY = 0\r\n let isInteractingWithMermaid = false\r\n\r\n const onStart = (clientX: number, clientY: number) => {\r\n isDragging.value = true\r\n startX = clientX - posX.value\r\n startY = clientY - posY.value\r\n document.body.style.userSelect = 'none'\r\n }\r\n\r\n const onMove = (clientX: number, clientY: number) => {\r\n if (isDragging.value && isInteractingWithMermaid) {\r\n posX.value = clientX - startX\r\n posY.value = clientY - startY\r\n const svg = getSvg()\r\n if (svg) {\r\n updateTransform(svg)\r\n }\r\n }\r\n }\r\n\r\n const onEnd = () => {\r\n isDragging.value = false\r\n isInteractingWithMermaid = false\r\n document.body.style.userSelect = ''\r\n }\r\n\r\n const onMouseDown = (e: MouseEvent) => {\r\n if (e.button !== 0) return\r\n if (e.target === containerEl || containerEl.contains(e.target as Node)) {\r\n e.preventDefault()\r\n isInteractingWithMermaid = true\r\n onStart(e.clientX, e.clientY)\r\n }\r\n }\r\n\r\n const onMouseMove = (e: MouseEvent) => {\r\n if (isInteractingWithMermaid) {\r\n onMove(e.clientX, e.clientY)\r\n }\r\n }\r\n\r\n const handleWheelZoom = (e: WheelEvent) => {\r\n const svg = getSvg()\r\n if (!svg) return\r\n\r\n const containerRect = containerEl.getBoundingClientRect()\r\n const svgRect = svg.getBoundingClientRect()\r\n\r\n const mouseX = e.clientX - containerRect.left\r\n const mouseY = e.clientY - containerRect.top\r\n\r\n const svgCenterX = svgRect.left - containerRect.left + svgRect.width / 2\r\n const svgCenterY = svgRect.top - containerRect.top + svgRect.height / 2\r\n\r\n const offsetX = (mouseX - svgCenterX - posX.value) / scale.value\r\n const offsetY = (mouseY - svgCenterY - posY.value) / scale.value\r\n\r\n const delta = e.deltaY > 0 ? -0.05 : 0.05\r\n const newScale = Math.min(Math.max(scale.value + delta, 0.1), 10)\r\n\r\n if (newScale === scale.value) return\r\n\r\n scale.value = newScale\r\n\r\n posX.value = mouseX - svgCenterX - offsetX * scale.value\r\n posY.value = mouseY - svgCenterY - offsetY * scale.value\r\n\r\n updateTransform(svg)\r\n }\r\n\r\n const throttledWheelZoom = throttle(handleWheelZoom, 20, { leading: true, trailing: true })\r\n\r\n const onWheel = (e: WheelEvent) => {\r\n if (e.target === containerEl || containerEl.contains(e.target as Node)) {\r\n e.preventDefault()\r\n throttledWheelZoom(e)\r\n }\r\n }\r\n\r\n const onTouchStart = (e: TouchEvent) => {\r\n if (e.target === containerEl || containerEl.contains(e.target as Node)) {\r\n if (e.touches.length === 1) {\r\n e.preventDefault()\r\n isInteractingWithMermaid = true\r\n onStart(e.touches[0].clientX, e.touches[0].clientY)\r\n }\r\n }\r\n }\r\n\r\n const onTouchMove = (e: TouchEvent) => {\r\n if (isInteractingWithMermaid) {\r\n e.preventDefault()\r\n onMove(e.touches[0].clientX, e.touches[0].clientY)\r\n }\r\n }\r\n\r\n containerEl.addEventListener('mousedown', onMouseDown)\r\n document.addEventListener('mousemove', onMouseMove)\r\n document.addEventListener('mouseup', onEnd)\r\n containerEl.addEventListener('wheel', onWheel, { passive: false })\r\n containerEl.addEventListener('touchstart', onTouchStart, { passive: false })\r\n containerEl.addEventListener('touchmove', onTouchMove, { passive: false })\r\n document.addEventListener('touchend', onEnd)\r\n\r\n return () => {\r\n containerEl.removeEventListener('mousedown', onMouseDown)\r\n document.removeEventListener('mousemove', onMouseMove)\r\n document.removeEventListener('mouseup', onEnd)\r\n containerEl.removeEventListener('wheel', onWheel)\r\n containerEl.removeEventListener('touchstart', onTouchStart)\r\n containerEl.removeEventListener('touchmove', onTouchMove)\r\n document.removeEventListener('touchend', onEnd)\r\n document.body.style.userSelect = ''\r\n }\r\n }\r\n\r\n const zoomIn = () => {\r\n const svg = getSvg()\r\n if (svg) {\r\n scale.value = Math.min(scale.value + 0.2, 10)\r\n updateTransform(svg)\r\n }\r\n }\r\n\r\n const zoomOut = () => {\r\n const svg = getSvg()\r\n if (svg) {\r\n scale.value = Math.max(scale.value - 0.2, 0.1)\r\n updateTransform(svg)\r\n }\r\n }\r\n\r\n const reset = () => {\r\n const svg = getSvg()\r\n if (svg) {\r\n resetState()\r\n updateTransform(svg)\r\n }\r\n }\r\n\r\n const fullscreen = () => {\r\n if (!container.value) return\r\n\r\n if (document.fullscreenElement) {\r\n document.exitFullscreen()\r\n } else {\r\n container.value.requestFullscreen?.()\r\n }\r\n }\r\n\r\n const initialize = () => {\r\n if (!container.value) return\r\n\r\n resetState()\r\n\r\n removeEvents = addInteractionEvents(container.value)\r\n\r\n const svg = getSvg()\r\n if (svg) {\r\n updateTransform(svg)\r\n }\r\n }\r\n\r\n const destroy = () => {\r\n removeEvents?.()\r\n removeEvents = null\r\n resetState()\r\n }\r\n\r\n watch(\r\n () => container.value,\r\n () => {\r\n destroy()\r\n resetState()\r\n },\r\n )\r\n\r\n onUnmounted(destroy)\r\n\r\n return {\r\n zoomIn,\r\n zoomOut,\r\n reset,\r\n fullscreen,\r\n destroy,\r\n initialize,\r\n }\r\n}\r\n"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hejiayue/x-markdown-test",
|
|
3
|
-
"version": "0.0.1-beta.
|
|
3
|
+
"version": "0.0.1-beta.116",
|
|
4
4
|
"description": "A markdown component library for Vue",
|
|
5
5
|
"type": "module",
|
|
6
|
-
"main": "./dist/x-markdown.cjs",
|
|
6
|
+
"main": "./dist/x-markdown.cjs.js",
|
|
7
7
|
"module": "./dist/x-markdown.es.js",
|
|
8
8
|
"types": "./dist/types/index.d.ts",
|
|
9
9
|
"exports": {
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
},
|
|
15
15
|
"require": {
|
|
16
16
|
"types": "./dist/types/index.d.ts",
|
|
17
|
-
"default": "./dist/x-markdown.cjs"
|
|
17
|
+
"default": "./dist/x-markdown.cjs.js"
|
|
18
18
|
}
|
|
19
19
|
},
|
|
20
20
|
"./style": "./dist/style.css"
|
package/dist/index-D9u8JldH.cjs
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("vue"),t=require("./index-nZ5iH1aN.cjs"),o=require("lodash-es"),a={key:0,class:"syntax-mermaid__loading"},n=["innerHTML"],l=e.defineComponent({__name:"SyntaxMermaid",props:{content:{default:""},id:{default:"mermaid-default"},isDark:{type:Boolean,default:!1},config:{default:()=>({})}},emits:["degraded","ready"],setup(l,{expose:r,emit:i}){const c=l,d=i,s=e.ref(null),m=e.computed(()=>c.content),u=e.computed(()=>({id:c.id,theme:c.isDark?"dark":"default",config:c.config,container:s.value})),v=t.useMermaid(m,u),h=e.ref(""),g=e.computed(()=>v.isLoading.value),k=e.computed(()=>v.error.value),p=e.ref(null),w=t.useMermaidZoom({container:p}),f=o.debounce(function(){e.nextTick(()=>{p.value&&w.initialize()})},500);return e.watch(()=>v.data.value,(e,t)=>{console.log("[SyntaxMermaid] mermaidResult.data.value changed:",{oldSvg:t,newSvg:e,isNewSvg:!!e,startsWithSvg:e?.trim().startsWith("<svg"),preview:e?.substring(0,50)}),e&&(h.value=e,f(),e.trim().startsWith("<svg")?(console.log("[SyntaxMermaid] Emitting ready event - Mermaid is available"),d("ready")):(console.log("[SyntaxMermaid] Emitting degraded event - Mermaid not available"),d("degraded")))},{immediate:!0}),e.watch(h,e=>{e&&f()}),e.onMounted(()=>{h.value&&f()}),r({svg:h,isLoading:g,error:k,containerRef:p,zoomIn:function(){w?.zoomIn()},zoomOut:function(){w?.zoomOut()},reset:function(){w?.reset()},fullscreen:function(){w?.fullscreen(),w?.reset()},download:function(){t.downloadSvgAsPng(h.value)},getSvg:function(){return h.value},reinitialize:function(){f()}}),(t,o)=>(e.openBlock(),e.createElementBlock("div",{ref_key:"containerRef",ref:p,class:e.normalizeClass(["syntax-mermaid",{"syntax-mermaid--dark":c.isDark}])},[e.createElementVNode("div",{ref_key:"renderContainerRef",ref:s,class:"syntax-mermaid__render-container","aria-hidden":"true"},null,512),g.value?(e.openBlock(),e.createElementBlock("div",a,[e.renderSlot(t.$slots,"loading",{},()=>[o[0]||(o[0]=e.createElementVNode("span",{class:"syntax-mermaid__loading-text"},"加载中...",-1))])])):(e.openBlock(),e.createElementBlock("div",{key:1,class:"syntax-mermaid__content",innerHTML:h.value},null,8,n))],2))}}),r={class:"toolbar-container"},i={class:"mermaid-toolbar"},c={class:"toolbar-left"},d={class:"segmented-control"},s={class:"toolbar-right"},m=["title","onClick"],u={key:0,width:"16",height:"16",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 1024 1024"},v={key:1,width:"16",height:"16",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 1024 1024"},h={class:"mermaid-source-code"},g=e.defineComponent({__name:"index",props:{isDark:{type:Boolean,default:!1},shikiTheme:{default:()=>["vitesse-light","vitesse-dark"]},config:{default:()=>({})},mermaidActions:{default:void 0},raw:{default:()=>({})}},setup(o){const a=o,n=e.ref(null),g=e.ref(!1),k=e.ref(!1),p=e.computed(()=>a.raw?.content||""),w=e.computed(()=>`mermaid-${a.raw?.key||"default"}`),f=e.computed(()=>n.value?.isLoading??!0),y=e.computed(()=>n.value?.svg??""),E=e.computed(()=>g.value?"code":"diagram");function C(e){e?.stopPropagation(),e?.preventDefault(),g.value||n.value?.zoomIn()}function V(e){e?.stopPropagation(),e?.preventDefault(),g.value||n.value?.zoomOut()}function N(e){e?.stopPropagation(),e?.preventDefault(),g.value||n.value?.reset()}function B(){g.value||n.value?.fullscreen()}function x(){g.value=!g.value}const{copy:b,copied:M}=t.useClipboard({copiedDuring:1500});function z(e){"code"!==e||g.value?"diagram"===e&&g.value&&(g.value=!1):g.value=!0}async function L(e){e?.stopPropagation(),e?.preventDefault(),M.value||a.raw.content&&await b(a.raw.content)}function S(){n.value?.download()}const _=e.computed(()=>a.mermaidActions||[]),D=e.computed(()=>_.value.filter(e=>!e.show||e.show(T.value))),T=e.computed(()=>({showSourceCode:g.value,svg:y.value,rawContent:a.raw.content||"",isLoading:f.value,copied:M.value,zoomIn:C,zoomOut:V,reset:N,fullscreen:B,toggleCode:x,copyCode:L,download:S,raw:a.raw}));function H(t){if(!t.icon)return null;if("string"==typeof t.icon)return e.h("span",{class:"mermaid-action-icon",innerHTML:t.icon});if("function"==typeof t.icon){try{const e=t.icon(T.value);if(e&&"object"==typeof e&&"__v_isVNode"in e)return e}catch{}return e.h(t.icon)}return e.h(t.icon)}const P=e.computed(()=>({showSourceCode:g.value,svg:y.value,rawContent:a.raw.content||"",isLoading:f.value,copied:M.value,zoomIn:C,zoomOut:V,reset:N,fullscreen:B,toggleCode:x,copyCode:L,download:S,raw:a.raw}));return e.onMounted(async()=>{const e=await t.checkMermaidAvailable();k.value=!e}),(o,f)=>k.value?(e.openBlock(),e.createBlock(t.CodeBlock,{key:0,code:a.raw?.content||"",language:"mermaid","is-dark":a.isDark,"light-theme":a.shikiTheme[0],"dark-theme":a.shikiTheme[1]},null,8,["code","is-dark","light-theme","dark-theme"])):(e.openBlock(),e.createElementBlock("div",{key:a.raw.key,class:e.normalizeClass(["markdown-mermaid",{"markdown-mermaid--dark":a.isDark}])},[e.createVNode(e.Transition,{name:"toolbar",appear:""},{default:e.withCtx(()=>[e.createElementVNode("div",r,[e.renderSlot(o.$slots,"mermaidHeader",e.normalizeProps(e.guardReactiveProps(P.value)),()=>[e.createElementVNode("div",i,[e.createElementVNode("div",c,[e.createElementVNode("div",d,[e.createElementVNode("div",{class:e.normalizeClass(["segmented-slider",{"slide-right":"code"===E.value}])},null,2),e.createElementVNode("div",{class:e.normalizeClass(["segment-item",{active:"diagram"===E.value}]),onClick:f[0]||(f[0]=e=>z("diagram"))},[...f[6]||(f[6]=[e.createElementVNode("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",xmlns:"http://www.w3.org/2000/svg"},[e.createElementVNode("path",{d:"M12 2L2 7L12 12L22 7L12 2Z",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"}),e.createElementVNode("path",{d:"M2 17L12 22L22 17",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"}),e.createElementVNode("path",{d:"M2 12L12 17L22 12",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"})],-1),e.createElementVNode("span",null,"预览",-1)])],2),e.createElementVNode("div",{class:e.normalizeClass(["segment-item",{active:"code"===E.value}]),onClick:f[1]||(f[1]=e=>z("code"))},[...f[7]||(f[7]=[e.createElementVNode("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",xmlns:"http://www.w3.org/2000/svg"},[e.createElementVNode("path",{d:"M16 18L22 12L16 6",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"}),e.createElementVNode("path",{d:"M8 6L2 12L8 18",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"})],-1),e.createElementVNode("span",null,"代码",-1)])],2)])]),e.createElementVNode("div",s,[e.renderSlot(o.$slots,"mermaidActions",e.normalizeProps(e.guardReactiveProps(P.value)),()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(D.value,t=>(e.openBlock(),e.createElementBlock("div",{key:t.key,class:e.normalizeClass(["toolbar-action-btn",[t.class,{"toolbar-action-btn--disabled":t.disabled}]]),style:e.normalizeStyle(t.style),title:t.title,onClick:e=>function(e){e.disabled||e.onClick?.(T.value)}(t)},[t.icon?(e.openBlock(),e.createBlock(e.resolveDynamicComponent(H(t)),{key:0})):e.createCommentVNode("",!0)],14,m))),128)),g.value?(e.openBlock(),e.createElementBlock("div",{key:0,class:e.normalizeClass(["toolbar-action-btn",{"copy-success":e.unref(M)}]),title:"复制代码",onClick:f[2]||(f[2]=e=>L(e))},[e.unref(M)?(e.openBlock(),e.createElementBlock("svg",u,[...f[8]||(f[8]=[e.createElementVNode("path",{fill:"currentColor",d:"M406.656 706.944 195.84 496.256a32 32 0 1 0-45.248 45.248l256 256 512-512a32 32 0 0 0-45.248-45.248L406.592 706.944z"},null,-1)])])):(e.openBlock(),e.createElementBlock("svg",v,[...f[9]||(f[9]=[e.createElementVNode("path",{fill:"currentColor",d:"M768 832a128 128 0 0 1-128 128H192A128 128 0 0 1 64 832V384a128 128 0 0 1 128-128v64a64 64 0 0 0-64 64v448a64 64 0 0 0 64 64h448a64 64 0 0 0 64-64z"},null,-1),e.createElementVNode("path",{fill:"currentColor",d:"M384 128a64 64 0 0 0-64 64v448a64 64 0 0 0 64 64h448a64 64 0 0 0 64-64V192a64 64 0 0 0-64-64zm0-64h448a128 128 0 0 1 128 128v448a128 128 0 0 1-128 128H384a128 128 0 0 1-128-128V192A128 128 0 0 1 384 64"},null,-1)])]))],2)):(e.openBlock(),e.createElementBlock(e.Fragment,{key:1},[e.createElementVNode("div",{class:"toolbar-action-btn",title:"缩小",onClick:f[3]||(f[3]=e=>V(e))},[...f[10]||(f[10]=[e.createElementVNode("svg",{width:"16",height:"16",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 1024 1024"},[e.createElementVNode("path",{fill:"currentColor",d:"m795.904 750.72 124.992 124.928a32 32 0 0 1-45.248 45.248L750.656 795.904a416 416 0 1 1 45.248-45.248zM480 832a352 352 0 1 0 0-704 352 352 0 0 0 0 704M352 448h256a32 32 0 0 1 0 64H352a32 32 0 0 1 0-64"})],-1)])]),e.createElementVNode("div",{class:"toolbar-action-btn",title:"放大",onClick:f[4]||(f[4]=e=>C(e))},[...f[11]||(f[11]=[e.createElementVNode("svg",{width:"16",height:"16",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 1024 1024"},[e.createElementVNode("path",{fill:"currentColor",d:"m795.904 750.72 124.992 124.928a32 32 0 0 1-45.248 45.248L750.656 795.904a416 416 0 1 1 45.248-45.248zM480 832a352 352 0 1 0 0-704 352 352 0 0 0 0 704m-32-384v-96a32 32 0 0 1 64 0v96h96a32 32 0 0 1 0 64h-96v96a32 32 0 0 1-64 0v-96h-96a32 32 0 0 1 0-64z"})],-1)])]),e.createElementVNode("div",{class:"toolbar-action-btn",title:"重置",onClick:f[5]||(f[5]=e=>N(e))},[...f[12]||(f[12]=[e.createElementVNode("svg",{width:"16",height:"16",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 1024 1024"},[e.createElementVNode("path",{fill:"currentColor",d:"M512 896a384 384 0 1 0 0-768 384 384 0 0 0 0 768m0 64a448 448 0 1 1 0-896 448 448 0 0 1 0 896"}),e.createElementVNode("path",{fill:"currentColor",d:"M512 96a32 32 0 0 1 32 32v192a32 32 0 0 1-64 0V128a32 32 0 0 1 32-32m0 576a32 32 0 0 1 32 32v192a32 32 0 1 1-64 0V704a32 32 0 0 1 32-32M96 512a32 32 0 0 1 32-32h192a32 32 0 0 1 0 64H128a32 32 0 0 1-32-32m576 0a32 32 0 0 1 32-32h192a32 32 0 1 1 0 64H704a32 32 0 0 1-32-32"})],-1)])]),e.createElementVNode("div",{class:"toolbar-action-btn",title:"下载",onClick:S},[...f[13]||(f[13]=[e.createElementVNode("svg",{width:"16",height:"16",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 1024 1024"},[e.createElementVNode("path",{fill:"currentColor",d:"M160 832h704a32 32 0 1 1 0 64H160a32 32 0 1 1 0-64m384-253.696 236.288-236.352 45.248 45.248L508.8 704 192 387.2l45.248-45.248L480 584.704V128h64z"})],-1)])])],64))])])])])])]),_:3}),e.withDirectives(e.createElementVNode("div",h,[e.createVNode(t.CodeBlock,{code:a.raw?.content||"",language:"mermaid","is-dark":a.isDark,"light-theme":a.shikiTheme[0],"dark-theme":a.shikiTheme[1],"show-code-block-header":!1,"sticky-code-block-header":!1},null,8,["code","is-dark","light-theme","dark-theme"])],512),[[e.vShow,g.value]]),e.withDirectives(e.createVNode(l,{ref_key:"syntaxMermaidRef",ref:n,content:p.value,id:w.value,"is-dark":a.isDark,config:a.config},null,8,["content","id","is-dark","config"]),[[e.vShow,!g.value]])],2))}});exports.default=g;
|
|
2
|
-
//# sourceMappingURL=index-D9u8JldH.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index-D9u8JldH.cjs","sources":["../src/components/Mermaid/SyntaxMermaid.vue","../src/components/Mermaid/index.vue"],"sourcesContent":["<script setup lang=\"ts\">\r\nimport { computed, nextTick, ref, watch, onMounted } from 'vue'\r\nimport { debounce } from 'lodash-es'\r\nimport { useMermaid, useMermaidZoom, downloadSvgAsPng } from '../../hooks'\r\n\r\ninterface SyntaxMermaidProps {\r\n content: string\r\n id?: string\r\n isDark?: boolean\r\n config?: Record<string, any>\r\n}\r\n\r\nconst props = withDefaults(defineProps<SyntaxMermaidProps>(), {\r\n content: '',\r\n id: 'mermaid-default',\r\n isDark: false,\r\n config: () => ({}),\r\n})\r\n\r\nconst emit = defineEmits<{\r\n degraded: []\r\n ready: []\r\n}>()\r\n\r\nconst renderContainerRef = ref<HTMLElement | null>(null)\r\n\r\nconst mermaidContent = computed(() => props.content)\r\nconst mermaidOptions = computed(() => ({\r\n id: props.id,\r\n theme: props.isDark ? 'dark' : 'default',\r\n config: props.config,\r\n container: renderContainerRef.value,\r\n}))\r\nconst mermaidResult = useMermaid(mermaidContent, mermaidOptions)\r\n\r\nconst svg = ref('')\r\nconst isLoading = computed(() => mermaidResult.isLoading.value)\r\nconst error = computed(() => mermaidResult.error.value)\r\n\r\nconst containerRef = ref<HTMLElement | null>(null)\r\n\r\nconst zoomControls = useMermaidZoom({\r\n container: containerRef,\r\n scaleStep: 0.2,\r\n minScale: 0.1,\r\n maxScale: 5,\r\n})\r\n\r\nconst debouncedInitialize = debounce(initializeZoom, 500)\r\n\r\nfunction initializeZoom() {\r\n nextTick(() => {\r\n if (containerRef.value) {\r\n zoomControls.initialize()\r\n }\r\n })\r\n}\r\n\r\nwatch(\r\n () => mermaidResult.data.value,\r\n (newSvg, oldSvg) => {\r\n console.log('[SyntaxMermaid] mermaidResult.data.value changed:', {\r\n oldSvg,\r\n newSvg,\r\n isNewSvg: !!newSvg,\r\n startsWithSvg: newSvg?.trim().startsWith('<svg'),\r\n preview: newSvg?.substring(0, 50)\r\n })\r\n\r\n if (newSvg) {\r\n svg.value = newSvg\r\n debouncedInitialize()\r\n\r\n // 检测是否成功渲染了 SVG(以 <svg 开头)\r\n if (newSvg.trim().startsWith('<svg')) {\r\n console.log('[SyntaxMermaid] Emitting ready event - Mermaid is available')\r\n emit('ready')\r\n } else {\r\n console.log('[SyntaxMermaid] Emitting degraded event - Mermaid not available')\r\n emit('degraded')\r\n }\r\n }\r\n },\r\n { immediate: true },\r\n)\r\n\r\nwatch(svg, (newSvg) => {\r\n if (newSvg) {\r\n debouncedInitialize()\r\n }\r\n})\r\n\r\nfunction zoomIn() {\r\n zoomControls?.zoomIn()\r\n}\r\n\r\nfunction zoomOut() {\r\n zoomControls?.zoomOut()\r\n}\r\n\r\nfunction reset() {\r\n zoomControls?.reset()\r\n}\r\n\r\nfunction fullscreen() {\r\n zoomControls?.fullscreen()\r\n zoomControls?.reset()\r\n}\r\n\r\nfunction download() {\r\n downloadSvgAsPng(svg.value)\r\n}\r\n\r\nfunction getSvg() {\r\n return svg.value\r\n}\r\n\r\nfunction reinitialize() {\r\n debouncedInitialize()\r\n}\r\n\r\nonMounted(() => {\r\n if (svg.value) {\r\n debouncedInitialize()\r\n }\r\n})\r\n\r\ndefineExpose({\r\n svg,\r\n isLoading,\r\n error,\r\n containerRef,\r\n zoomIn,\r\n zoomOut,\r\n reset,\r\n fullscreen,\r\n download,\r\n getSvg,\r\n reinitialize,\r\n})\r\n</script>\r\n\r\n<template>\r\n <div ref=\"containerRef\" class=\"syntax-mermaid\" :class=\"{ 'syntax-mermaid--dark': props.isDark }\">\r\n <div ref=\"renderContainerRef\" class=\"syntax-mermaid__render-container\" aria-hidden=\"true\" />\r\n\r\n <div v-if=\"isLoading\" class=\"syntax-mermaid__loading\">\r\n <slot name=\"loading\">\r\n <span class=\"syntax-mermaid__loading-text\">加载中...</span>\r\n </slot>\r\n </div>\r\n <div v-else class=\"syntax-mermaid__content\" v-html=\"svg\" />\r\n </div>\r\n</template>\r\n\r\n<style>\r\n.syntax-mermaid {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n min-height: 200px;\r\n overflow: hidden;\r\n cursor: grab;\r\n position: relative;\r\n}\r\n\r\n.syntax-mermaid__render-container {\r\n position: absolute;\r\n max-height: 0;\r\n opacity: 0;\r\n overflow: hidden;\r\n pointer-events: none;\r\n}\r\n\r\n.syntax-mermaid:active {\r\n cursor: grabbing;\r\n}\r\n\r\n.syntax-mermaid__content {\r\n width: 100%;\r\n height: 100%;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n}\r\n\r\n.syntax-mermaid__content svg {\r\n transform-origin: center center;\r\n max-width: 100%;\r\n max-height: 100%;\r\n}\r\n\r\n.syntax-mermaid:fullscreen {\r\n max-height: 100vh;\r\n}\r\n\r\n.syntax-mermaid:fullscreen .syntax-mermaid__content {\r\n justify-content: center;\r\n}\r\n\r\n.syntax-mermaid__loading {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 100%;\r\n height: 100%;\r\n min-height: 200px;\r\n}\r\n\r\n.syntax-mermaid__loading-text {\r\n color: #666;\r\n font-size: 14px;\r\n}\r\n\r\n.syntax-mermaid--dark .syntax-mermaid__loading-text {\r\n color: #999;\r\n}\r\n</style>\r\n","<script setup lang=\"ts\">\r\nimport type { MdComponent, MermaidExposeProps, MermaidAction, MermaidSlotProps } from './types'\r\nimport type { VNode } from 'vue'\r\nimport { computed, ref, h, onMounted } from 'vue'\r\nimport { useClipboard } from '@vueuse/core'\r\n// 使用运行时检测\r\nimport { checkMermaidAvailable } from '../../hooks/useMermaid'\r\nimport SyntaxMermaid from './SyntaxMermaid.vue'\r\nimport CodeBlock from '../CodeBlock/index.vue'\r\n\r\ninterface MermaidProps extends MdComponent {\r\n isDark?: boolean\r\n shikiTheme?: [string, string]\r\n config?: Record<string, any>\r\n mermaidActions?: MermaidAction[]\r\n}\r\n\r\nconst props = withDefaults(defineProps<MermaidProps>(), {\r\n raw: () => ({}),\r\n isDark: false,\r\n shikiTheme: () => ['vitesse-light', 'vitesse-dark'],\r\n config: () => ({}),\r\n mermaidActions: undefined,\r\n})\r\n\r\nconst syntaxMermaidRef = ref<InstanceType<typeof SyntaxMermaid> | null>(null)\r\nconst showSourceCode = ref(false)\r\n// 运行时检测 mermaid 是否可用\r\nconst isDegraded = ref(false)\r\nconst mermaidContent = computed(() => props.raw?.content || '')\r\nconst mermaidId = computed(() => `mermaid-${props.raw?.key || 'default'}`)\r\nconst isLoading = computed(() => syntaxMermaidRef.value?.isLoading ?? true)\r\nconst svg = computed(() => syntaxMermaidRef.value?.svg ?? '')\r\nconst activeTab = computed(() => (showSourceCode.value ? 'code' : 'diagram'))\r\n\r\nfunction handleZoomIn(event?: Event) {\r\n event?.stopPropagation()\r\n event?.preventDefault()\r\n if (!showSourceCode.value) {\r\n syntaxMermaidRef.value?.zoomIn()\r\n }\r\n}\r\n\r\nfunction handleZoomOut(event?: Event) {\r\n event?.stopPropagation()\r\n event?.preventDefault()\r\n if (!showSourceCode.value) {\r\n syntaxMermaidRef.value?.zoomOut()\r\n }\r\n}\r\n\r\nfunction handleReset(event?: Event) {\r\n event?.stopPropagation()\r\n event?.preventDefault()\r\n if (!showSourceCode.value) {\r\n syntaxMermaidRef.value?.reset()\r\n }\r\n}\r\n\r\nfunction handleFullscreen() {\r\n if (!showSourceCode.value) {\r\n syntaxMermaidRef.value?.fullscreen()\r\n }\r\n}\r\n\r\nfunction handleToggleCode() {\r\n showSourceCode.value = !showSourceCode.value\r\n}\r\n\r\nconst { copy: copyCode, copied } = useClipboard({ copiedDuring: 1500 })\r\n\r\nfunction handleTabClick(tabName: string) {\r\n if (tabName === 'code' && !showSourceCode.value) {\r\n showSourceCode.value = true\r\n } else if (tabName === 'diagram' && showSourceCode.value) {\r\n showSourceCode.value = false\r\n }\r\n}\r\n\r\nasync function handleCopyCode(event?: Event) {\r\n event?.stopPropagation()\r\n event?.preventDefault()\r\n\r\n if (copied.value) {\r\n return\r\n }\r\n\r\n if (!props.raw.content) {\r\n return\r\n }\r\n await copyCode(props.raw.content)\r\n}\r\n\r\nfunction handleDownload() {\r\n syntaxMermaidRef.value?.download()\r\n}\r\n\r\nconst normalizedActions = computed<MermaidAction[]>(() => {\r\n return props.mermaidActions || []\r\n})\r\n\r\nconst filteredActions = computed<MermaidAction[]>(() => {\r\n return normalizedActions.value.filter((action) => {\r\n if (!action.show) return true\r\n return action.show(slotProps.value)\r\n })\r\n})\r\n\r\nconst slotProps = computed<MermaidSlotProps>(() => ({\r\n showSourceCode: showSourceCode.value,\r\n svg: svg.value,\r\n rawContent: props.raw.content || '',\r\n isLoading: isLoading.value,\r\n copied: copied.value,\r\n zoomIn: handleZoomIn,\r\n zoomOut: handleZoomOut,\r\n reset: handleReset,\r\n fullscreen: handleFullscreen,\r\n toggleCode: handleToggleCode,\r\n copyCode: handleCopyCode,\r\n download: handleDownload,\r\n raw: props.raw,\r\n}))\r\n\r\nfunction renderActionIcon(action: MermaidAction): VNode | null {\r\n if (!action.icon) return null\r\n\r\n if (typeof action.icon === 'string') {\r\n return h('span', {\r\n class: 'mermaid-action-icon',\r\n innerHTML: action.icon,\r\n })\r\n }\r\n\r\n if (typeof action.icon === 'function') {\r\n try {\r\n const result = (action.icon as (props: MermaidSlotProps) => VNode)(slotProps.value)\r\n if (result && typeof result === 'object' && '__v_isVNode' in result) {\r\n return result\r\n }\r\n } catch {}\r\n return h(action.icon as any)\r\n }\r\n\r\n return h(action.icon as any)\r\n}\r\n\r\nfunction handleActionClick(action: MermaidAction) {\r\n if (action.disabled) return\r\n action.onClick?.(slotProps.value)\r\n}\r\n\r\nconst exposedMethods = computed(\r\n () =>\r\n ({\r\n showSourceCode: showSourceCode.value,\r\n svg: svg.value,\r\n rawContent: props.raw.content || '',\r\n isLoading: isLoading.value,\r\n copied: copied.value,\r\n zoomIn: handleZoomIn,\r\n zoomOut: handleZoomOut,\r\n reset: handleReset,\r\n fullscreen: handleFullscreen,\r\n toggleCode: handleToggleCode,\r\n copyCode: handleCopyCode,\r\n download: handleDownload,\r\n raw: props.raw,\r\n }) satisfies MermaidExposeProps,\r\n)\r\n\r\n// 组件挂载时检测 mermaid 是否可用\r\nonMounted(async () => {\r\n const hasMermaid = await checkMermaidAvailable()\r\n isDegraded.value = !hasMermaid\r\n})\r\n</script>\r\n\r\n<template>\r\n <!-- 当 Mermaid 不可用时(降级),渲染 CodeBlock -->\r\n <CodeBlock\r\n v-if=\"isDegraded\"\r\n :code=\"props.raw?.content || ''\"\r\n language=\"mermaid\"\r\n :is-dark=\"props.isDark\"\r\n :light-theme=\"props.shikiTheme[0]\"\r\n :dark-theme=\"props.shikiTheme[1]\"\r\n />\r\n\r\n <!-- 当 Mermaid 可用时,渲染完整的 Mermaid 组件 -->\r\n <div v-else :key=\"props.raw.key\" class=\"markdown-mermaid\" :class=\"{ 'markdown-mermaid--dark': props.isDark }\">\r\n <Transition name=\"toolbar\" appear>\r\n <div class=\"toolbar-container\">\r\n <slot name=\"mermaidHeader\" v-bind=\"exposedMethods\">\r\n <div class=\"mermaid-toolbar\">\r\n <div class=\"toolbar-left\">\r\n <div class=\"segmented-control\">\r\n <div class=\"segmented-slider\" :class=\"{ 'slide-right': activeTab === 'code' }\" />\r\n <div\r\n class=\"segment-item\"\r\n :class=\"{ active: activeTab === 'diagram' }\"\r\n @click=\"handleTabClick('diagram')\"\r\n >\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M12 2L2 7L12 12L22 7L12 2Z\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n <path\r\n d=\"M2 17L12 22L22 17\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n <path\r\n d=\"M2 12L12 17L22 12\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n <span>预览</span>\r\n </div>\r\n <div class=\"segment-item\" :class=\"{ active: activeTab === 'code' }\" @click=\"handleTabClick('code')\">\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M16 18L22 12L16 6\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n <path\r\n d=\"M8 6L2 12L8 18\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"2\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n />\r\n </svg>\r\n <span>代码</span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"toolbar-right\">\r\n <slot name=\"mermaidActions\" v-bind=\"exposedMethods\">\r\n <div\r\n v-for=\"action in filteredActions\"\r\n :key=\"action.key\"\r\n class=\"toolbar-action-btn\"\r\n :class=\"[action.class, { 'toolbar-action-btn--disabled': action.disabled }]\"\r\n :style=\"action.style\"\r\n :title=\"action.title\"\r\n @click=\"handleActionClick(action)\"\r\n >\r\n <component :is=\"renderActionIcon(action)\" v-if=\"action.icon\" />\r\n </div>\r\n\r\n <template v-if=\"showSourceCode\">\r\n <div\r\n class=\"toolbar-action-btn\"\r\n :class=\"{ 'copy-success': copied }\"\r\n title=\"复制代码\"\r\n @click=\"handleCopyCode($event)\"\r\n >\r\n <svg\r\n v-if=\"copied\"\r\n width=\"16\"\r\n height=\"16\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n viewBox=\"0 0 1024 1024\"\r\n >\r\n <path\r\n fill=\"currentColor\"\r\n d=\"M406.656 706.944 195.84 496.256a32 32 0 1 0-45.248 45.248l256 256 512-512a32 32 0 0 0-45.248-45.248L406.592 706.944z\"\r\n />\r\n </svg>\r\n <svg v-else width=\"16\" height=\"16\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 1024 1024\">\r\n <path\r\n fill=\"currentColor\"\r\n d=\"M768 832a128 128 0 0 1-128 128H192A128 128 0 0 1 64 832V384a128 128 0 0 1 128-128v64a64 64 0 0 0-64 64v448a64 64 0 0 0 64 64h448a64 64 0 0 0 64-64z\"\r\n />\r\n <path\r\n fill=\"currentColor\"\r\n d=\"M384 128a64 64 0 0 0-64 64v448a64 64 0 0 0 64 64h448a64 64 0 0 0 64-64V192a64 64 0 0 0-64-64zm0-64h448a128 128 0 0 1 128 128v448a128 128 0 0 1-128 128H384a128 128 0 0 1-128-128V192A128 128 0 0 1 384 64\"\r\n />\r\n </svg>\r\n </div>\r\n </template>\r\n\r\n <template v-else>\r\n <div class=\"toolbar-action-btn\" title=\"缩小\" @click=\"handleZoomOut($event)\">\r\n <svg width=\"16\" height=\"16\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 1024 1024\">\r\n <path\r\n fill=\"currentColor\"\r\n d=\"m795.904 750.72 124.992 124.928a32 32 0 0 1-45.248 45.248L750.656 795.904a416 416 0 1 1 45.248-45.248zM480 832a352 352 0 1 0 0-704 352 352 0 0 0 0 704M352 448h256a32 32 0 0 1 0 64H352a32 32 0 0 1 0-64\"\r\n />\r\n </svg>\r\n </div>\r\n\r\n <div class=\"toolbar-action-btn\" title=\"放大\" @click=\"handleZoomIn($event)\">\r\n <svg width=\"16\" height=\"16\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 1024 1024\">\r\n <path\r\n fill=\"currentColor\"\r\n d=\"m795.904 750.72 124.992 124.928a32 32 0 0 1-45.248 45.248L750.656 795.904a416 416 0 1 1 45.248-45.248zM480 832a352 352 0 1 0 0-704 352 352 0 0 0 0 704m-32-384v-96a32 32 0 0 1 64 0v96h96a32 32 0 0 1 0 64h-96v96a32 32 0 0 1-64 0v-96h-96a32 32 0 0 1 0-64z\"\r\n />\r\n </svg>\r\n </div>\r\n\r\n <div class=\"toolbar-action-btn\" title=\"重置\" @click=\"handleReset($event)\">\r\n <svg width=\"16\" height=\"16\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 1024 1024\">\r\n <path\r\n fill=\"currentColor\"\r\n d=\"M512 896a384 384 0 1 0 0-768 384 384 0 0 0 0 768m0 64a448 448 0 1 1 0-896 448 448 0 0 1 0 896\"\r\n />\r\n <path\r\n fill=\"currentColor\"\r\n d=\"M512 96a32 32 0 0 1 32 32v192a32 32 0 0 1-64 0V128a32 32 0 0 1 32-32m0 576a32 32 0 0 1 32 32v192a32 32 0 1 1-64 0V704a32 32 0 0 1 32-32M96 512a32 32 0 0 1 32-32h192a32 32 0 0 1 0 64H128a32 32 0 0 1-32-32m576 0a32 32 0 0 1 32-32h192a32 32 0 1 1 0 64H704a32 32 0 0 1-32-32\"\r\n />\r\n </svg>\r\n </div>\r\n\r\n <div class=\"toolbar-action-btn\" title=\"下载\" @click=\"handleDownload\">\r\n <svg width=\"16\" height=\"16\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 1024 1024\">\r\n <path\r\n fill=\"currentColor\"\r\n d=\"M160 832h704a32 32 0 1 1 0 64H160a32 32 0 1 1 0-64m384-253.696 236.288-236.352 45.248 45.248L508.8 704 192 387.2l45.248-45.248L480 584.704V128h64z\"\r\n />\r\n </svg>\r\n </div>\r\n </template>\r\n </slot>\r\n </div>\r\n </div>\r\n </slot>\r\n </div>\r\n </Transition>\r\n\r\n <div v-show=\"showSourceCode\" class=\"mermaid-source-code\">\r\n <CodeBlock\r\n :code=\"props.raw?.content || ''\"\r\n language=\"mermaid\"\r\n :is-dark=\"props.isDark\"\r\n :light-theme=\"props.shikiTheme[0]\"\r\n :dark-theme=\"props.shikiTheme[1]\"\r\n :show-code-block-header=\"false\"\r\n :sticky-code-block-header=\"false\"\r\n />\r\n </div>\r\n\r\n <SyntaxMermaid\r\n v-show=\"!showSourceCode\"\r\n ref=\"syntaxMermaidRef\"\r\n :content=\"mermaidContent\"\r\n :id=\"mermaidId\"\r\n :is-dark=\"props.isDark\"\r\n :config=\"props.config\"\r\n />\r\n </div>\r\n</template>\r\n\r\n<style>\r\n.markdown-mermaid {\r\n border-radius: 8px;\r\n overflow: hidden;\r\n font-size: 0;\r\n background: rgba(0, 0, 0, 0.03);\r\n}\r\n\r\n.markdown-mermaid.markdown-mermaid--dark {\r\n background: rgba(255, 255, 255, 0.13);\r\n}\r\n\r\n.markdown-mermaid .toolbar-container {\r\n position: relative;\r\n z-index: 10;\r\n flex-shrink: 0;\r\n background: rgba(0, 0, 0, 0.05);\r\n color: #333;\r\n}\r\n\r\n.markdown-mermaid.markdown-mermaid--dark .toolbar-container {\r\n background: rgba(0, 0, 0, 0.25);\r\n color: #fff;\r\n}\r\n\r\n.markdown-mermaid .mermaid-toolbar {\r\n display: flex;\r\n justify-content: space-between;\r\n align-items: center;\r\n padding: 8px 16px;\r\n background: transparent;\r\n color: inherit;\r\n}\r\n\r\n.markdown-mermaid .mermaid-toolbar .toolbar-left {\r\n display: flex;\r\n align-items: center;\r\n}\r\n\r\n.markdown-mermaid .mermaid-toolbar .segmented-control {\r\n display: flex;\r\n align-items: center;\r\n position: relative;\r\n background: rgba(0, 0, 0, 0.06);\r\n border-radius: 6px;\r\n padding: 3px;\r\n gap: 2px;\r\n}\r\n\r\n.markdown-mermaid.markdown-mermaid--dark .mermaid-toolbar .segmented-control {\r\n background: rgba(255, 255, 255, 0.08);\r\n}\r\n\r\n.markdown-mermaid .mermaid-toolbar .segmented-slider {\r\n position: absolute;\r\n top: 3px;\r\n left: 3px;\r\n width: calc(50% - 4px);\r\n height: calc(100% - 6px);\r\n background: #fff;\r\n border-radius: 4px;\r\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);\r\n transition: transform 0.25s cubic-bezier(0.4, 0, 0.2, 1);\r\n z-index: 0;\r\n}\r\n\r\n.markdown-mermaid.markdown-mermaid--dark .mermaid-toolbar .segmented-slider {\r\n background: rgba(255, 255, 255, 0.15);\r\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2);\r\n}\r\n\r\n.markdown-mermaid .mermaid-toolbar .segmented-slider.slide-right {\r\n transform: translateX(calc(100% + 2px));\r\n}\r\n\r\n.markdown-mermaid .mermaid-toolbar .segment-item {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n gap: 4px;\r\n font-size: 12px;\r\n border: none;\r\n color: inherit;\r\n min-width: 60px;\r\n text-align: center;\r\n box-sizing: border-box;\r\n font-weight: 500;\r\n cursor: pointer;\r\n border-radius: 4px;\r\n padding: 5px 12px;\r\n transition: all 0.2s ease;\r\n background: transparent;\r\n opacity: 0.6;\r\n user-select: none;\r\n position: relative;\r\n z-index: 1;\r\n}\r\n\r\n.markdown-mermaid .mermaid-toolbar .segment-item.active {\r\n opacity: 1;\r\n}\r\n\r\n.markdown-mermaid.markdown-mermaid--dark .mermaid-toolbar .segment-item.active {\r\n color: #fff;\r\n}\r\n\r\n.markdown-mermaid .mermaid-toolbar .segment-item:hover {\r\n opacity: 1;\r\n}\r\n\r\n.markdown-mermaid .mermaid-toolbar .segment-item svg {\r\n flex-shrink: 0;\r\n}\r\n\r\n.markdown-mermaid .mermaid-toolbar .toolbar-right {\r\n display: flex;\r\n align-items: center;\r\n gap: 16px;\r\n}\r\n\r\n.markdown-mermaid .mermaid-toolbar .toolbar-action-btn {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 28px;\r\n height: 28px;\r\n padding: 0;\r\n border: none;\r\n border-radius: 4px;\r\n background: transparent;\r\n color: inherit;\r\n cursor: pointer;\r\n transition: all 0.2s ease;\r\n opacity: 0.7;\r\n}\r\n\r\n.markdown-mermaid .mermaid-toolbar .toolbar-action-btn:hover {\r\n opacity: 1;\r\n background: rgba(0, 0, 0, 0.08);\r\n}\r\n\r\n.markdown-mermaid .mermaid-toolbar .toolbar-action-btn.copy-success {\r\n opacity: 1;\r\n color: #22c55e;\r\n}\r\n\r\n.markdown-mermaid.markdown-mermaid--dark .mermaid-toolbar .toolbar-action-btn:hover {\r\n background: rgba(255, 255, 255, 0.1);\r\n}\r\n\r\n.markdown-mermaid .mermaid-toolbar .toolbar-action-btn.toolbar-action-btn--disabled {\r\n opacity: 0.3;\r\n cursor: not-allowed;\r\n pointer-events: none;\r\n}\r\n\r\n.markdown-mermaid .mermaid-toolbar .mermaid-action-icon {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n}\r\n\r\n.markdown-mermaid .mermaid-toolbar .mermaid-action-icon :deep(svg) {\r\n width: 16px;\r\n height: 16px;\r\n flex-shrink: 0;\r\n}\r\n\r\n.markdown-mermaid .mermaid-source-code {\r\n position: relative;\r\n z-index: 1;\r\n flex: 1;\r\n width: 100%;\r\n overflow: auto;\r\n box-sizing: border-box;\r\n}\r\n\r\n.toolbar-enter-active,\r\n.toolbar-leave-active {\r\n transition: opacity 0.3s ease;\r\n}\r\n\r\n.toolbar-enter-from,\r\n.toolbar-leave-to {\r\n opacity: 0;\r\n}\r\n</style>\r\n"],"names":["props","__props","emit","__emit","renderContainerRef","ref","mermaidContent","computed","content","mermaidOptions","id","theme","isDark","config","container","value","mermaidResult","useMermaid","svg","isLoading","error","containerRef","zoomControls","useMermaidZoom","debouncedInitialize","debounce","nextTick","initialize","watch","data","newSvg","oldSvg","console","log","isNewSvg","startsWithSvg","trim","startsWith","preview","substring","immediate","onMounted","__expose","zoomIn","zoomOut","reset","fullscreen","download","downloadSvgAsPng","getSvg","reinitialize","_createElementBlock","class","_normalizeClass","_createElementVNode","_openBlock","_hoisted_1","_renderSlot","_ctx","_cache","innerHTML","syntaxMermaidRef","showSourceCode","isDegraded","raw","mermaidId","key","activeTab","handleZoomIn","event","stopPropagation","preventDefault","handleZoomOut","handleReset","handleFullscreen","handleToggleCode","copy","copyCode","copied","useClipboard","copiedDuring","handleTabClick","tabName","async","handleCopyCode","handleDownload","normalizedActions","mermaidActions","filteredActions","filter","action","show","slotProps","rawContent","toggleCode","renderActionIcon","icon","h","result","exposedMethods","hasMermaid","checkMermaidAvailable","_createBlock","CodeBlock","code","language","shikiTheme","_createVNode","_Transition","name","appear","$slots","_normalizeProps","_guardReactiveProps","_hoisted_2","_hoisted_3","_hoisted_4","active","onClick","width","height","viewBox","fill","xmlns","d","stroke","_hoisted_5","_Fragment","_renderList","disabled","style","_normalizeStyle","title","$event","handleActionClick","_resolveDynamicComponent","_unref","_hoisted_7","_hoisted_8","_withDirectives","_hoisted_9","SyntaxMermaid"],"mappings":"mbAYA,MAAMA,EAAQC,EAORC,EAAOC,EAKPC,EAAqBC,EAAAA,IAAwB,MAE7CC,EAAiBC,EAAAA,SAAS,IAAMP,EAAMQ,SACtCC,EAAiBF,EAAAA,SAAS,KAAA,CAC9BG,GAAIV,EAAMU,GACVC,MAAOX,EAAMY,OAAS,OAAS,UAC/BC,OAAQb,EAAMa,OACdC,UAAWV,EAAmBW,SAE1BC,EAAgBC,EAAAA,WAAWX,EAAgBG,GAE3CS,EAAMb,EAAAA,IAAI,IACVc,EAAYZ,EAAAA,SAAS,IAAMS,EAAcG,UAAUJ,OACnDK,EAAQb,EAAAA,SAAS,IAAMS,EAAcI,MAAML,OAE3CM,EAAehB,EAAAA,IAAwB,MAEvCiB,EAAeC,EAAAA,eAAe,CAClCT,UAAWO,IAMPG,EAAsBC,EAAAA,SAE5B,WACEC,EAAAA,SAAS,KACHL,EAAaN,OACfO,EAAaK,cAGnB,EARqD,YAUrDC,EAAAA,MACE,IAAMZ,EAAca,KAAKd,MACzB,CAACe,EAAQC,KACPC,QAAQC,IAAI,oDAAqD,CAC/DF,SACAD,SACAI,WAAYJ,EACZK,cAAeL,GAAQM,OAAOC,WAAW,QACzCC,QAASR,GAAQS,UAAU,EAAG,MAG5BT,IACFZ,EAAIH,MAAQe,EACZN,IAGIM,EAAOM,OAAOC,WAAW,SAC3BL,QAAQC,IAAI,+DACZ/B,EAAK,WAEL8B,QAAQC,IAAI,mEACZ/B,EAAK,eAIX,CAAEsC,WAAW,IAGfZ,QAAMV,EAAMY,IACNA,GACFN,MAiCJiB,EAAAA,UAAU,KACJvB,EAAIH,OACNS,MAIJkB,EAAa,CACXxB,MACAC,YACAC,QACAC,eACAsB,OAxCF,WACErB,GAAcqB,QAChB,EAuCEC,QArCF,WACEtB,GAAcsB,SAChB,EAoCEC,MAlCF,WACEvB,GAAcuB,OAChB,EAiCEC,WA/BF,WACExB,GAAcwB,aACdxB,GAAcuB,OAChB,EA6BEE,SA3BF,WACEC,EAAAA,iBAAiB9B,EAAIH,MACvB,EA0BEkC,OAxBF,WACE,OAAO/B,EAAIH,KACb,EAuBEmC,aArBF,WACE1B,GACF,0BAwBE2B,EAAAA,mBASM,MAAA,SATG,eAAJ9C,IAAIgB,EAAe+B,MAAKC,EAAAA,eAAA,CAAC,iBAAgB,CAAA,uBAAmCrD,EAAMY,YACrF0C,EAAAA,mBAA4F,MAAA,SAAnF,qBAAJjD,IAAID,EAAqBgD,MAAM,mCAAmC,cAAY,kBAExEjC,EAAAJ,OAAXwC,EAAAA,YAAAJ,EAAAA,mBAIM,MAJNK,EAIM,CAHJC,EAAAA,WAEOC,sBAFP,IAEO,CADLC,EAAA,KAAAA,EAAA,GAAAL,EAAAA,mBAAwD,OAAA,CAAlDF,MAAM,gCAA+B,UAAM,wBAGrDD,EAAAA,mBAA2D,MAAA,OAA/CC,MAAM,0BAA0BQ,UAAQ1C,EAAAH,onBCtIxD,MAAMf,EAAQC,EAQR4D,EAAmBxD,EAAAA,IAA+C,MAClEyD,EAAiBzD,EAAAA,KAAI,GAErB0D,EAAa1D,EAAAA,KAAI,GACjBC,EAAiBC,EAAAA,SAAS,IAAMP,EAAMgE,KAAKxD,SAAW,IACtDyD,EAAY1D,WAAS,IAAM,WAAWP,EAAMgE,KAAKE,KAAO,aACxD/C,EAAYZ,EAAAA,SAAS,IAAMsD,EAAiB9C,OAAOI,YAAa,GAChED,EAAMX,EAAAA,SAAS,IAAMsD,EAAiB9C,OAAOG,KAAO,IACpDiD,EAAY5D,EAAAA,SAAS,IAAOuD,EAAe/C,MAAQ,OAAS,WAElE,SAASqD,EAAaC,GACpBA,GAAOC,kBACPD,GAAOE,iBACFT,EAAe/C,OAClB8C,EAAiB9C,OAAO4B,QAE5B,CAEA,SAAS6B,EAAcH,GACrBA,GAAOC,kBACPD,GAAOE,iBACFT,EAAe/C,OAClB8C,EAAiB9C,OAAO6B,SAE5B,CAEA,SAAS6B,EAAYJ,GACnBA,GAAOC,kBACPD,GAAOE,iBACFT,EAAe/C,OAClB8C,EAAiB9C,OAAO8B,OAE5B,CAEA,SAAS6B,IACFZ,EAAe/C,OAClB8C,EAAiB9C,OAAO+B,YAE5B,CAEA,SAAS6B,IACPb,EAAe/C,OAAS+C,EAAe/C,KACzC,CAEA,MAAQ6D,KAAMC,EAAAC,OAAUA,GAAWC,EAAAA,aAAa,CAAEC,aAAc,OAEhE,SAASC,EAAeC,GACN,SAAZA,GAAuBpB,EAAe/C,MAEnB,YAAZmE,GAAyBpB,EAAe/C,QACjD+C,EAAe/C,OAAQ,GAFvB+C,EAAe/C,OAAQ,CAI3B,CAEAoE,eAAeC,EAAef,GAC5BA,GAAOC,kBACPD,GAAOE,iBAEHO,EAAO/D,OAINf,EAAMgE,IAAIxD,eAGTqE,EAAS7E,EAAMgE,IAAIxD,QAC3B,CAEA,SAAS6E,IACPxB,EAAiB9C,OAAOgC,UAC1B,CAEA,MAAMuC,EAAoB/E,EAAAA,SAA0B,IAC3CP,EAAMuF,gBAAkB,IAG3BC,EAAkBjF,EAAAA,SAA0B,IACzC+E,EAAkBvE,MAAM0E,OAAQC,IAChCA,EAAOC,MACLD,EAAOC,KAAKC,EAAU7E,SAI3B6E,EAAYrF,EAAAA,SAA2B,KAAA,CAC3CuD,eAAgBA,EAAe/C,MAC/BG,IAAKA,EAAIH,MACT8E,WAAY7F,EAAMgE,IAAIxD,SAAW,GACjCW,UAAWA,EAAUJ,MACrB+D,OAAQA,EAAO/D,MACf4B,OAAQyB,EACRxB,QAAS4B,EACT3B,MAAO4B,EACP3B,WAAY4B,EACZoB,WAAYnB,EACZE,SAAUO,EACVrC,SAAUsC,EACVrB,IAAKhE,EAAMgE,OAGb,SAAS+B,EAAiBL,GACxB,IAAKA,EAAOM,KAAM,OAAO,KAEzB,GAA2B,iBAAhBN,EAAOM,KAChB,OAAOC,EAAAA,EAAE,OAAQ,CACf7C,MAAO,sBACPQ,UAAW8B,EAAOM,OAItB,GAA2B,mBAAhBN,EAAOM,KAAqB,CACrC,IACE,MAAME,EAAUR,EAAOM,KAA4CJ,EAAU7E,OAC7E,GAAImF,GAA4B,iBAAXA,GAAuB,gBAAiBA,EAC3D,OAAOA,CAEX,CAAA,MAAS,CACT,OAAOD,EAAAA,EAAEP,EAAOM,KAClB,CAEA,OAAOC,EAAAA,EAAEP,EAAOM,KAClB,CAOA,MAAMG,EAAiB5F,EAAAA,SACrB,KAAA,CAEIuD,eAAgBA,EAAe/C,MAC/BG,IAAKA,EAAIH,MACT8E,WAAY7F,EAAMgE,IAAIxD,SAAW,GACjCW,UAAWA,EAAUJ,MACrB+D,OAAQA,EAAO/D,MACf4B,OAAQyB,EACRxB,QAAS4B,EACT3B,MAAO4B,EACP3B,WAAY4B,EACZoB,WAAYnB,EACZE,SAAUO,EACVrC,SAAUsC,EACVrB,IAAKhE,EAAMgE,cAKjBvB,EAAAA,UAAU0C,UACR,MAAMiB,QAAmBC,0BACzBtC,EAAWhD,OAASqF,WAOZrC,EAAAhD,qBADRuF,EAAAA,YAOEC,EAAAA,UAAA,OALCC,KAAMxG,EAAMgE,KAAKxD,SAAO,GACzBiG,SAAS,UACR,UAASzG,EAAMY,OACf,cAAaZ,EAAM0G,WAAU,GAC7B,aAAY1G,EAAM0G,WAAU,0EAI/BvD,EAAAA,mBA8KM,MAAA,CA9KOe,IAAKlE,EAAMgE,IAAIE,IAAKd,MAAKC,EAAAA,eAAA,CAAC,mBAAkB,CAAA,yBAAqCrD,EAAMY,YAClG+F,EAAAA,YAuJaC,EAAAA,WAAA,CAvJDC,KAAK,UAAUC,OAAA,uBACzB,IAqJM,CArJNxD,EAAAA,mBAqJM,MArJNE,EAqJM,CApJJC,aAmJOC,EAAAqD,OAAA,gBAAAC,EAAAA,eAAAC,EAAAA,mBAnJ4Bd,EAAApF,QAAnC,IAmJO,CAlJLuC,EAAAA,mBAiJM,MAjJN4D,EAiJM,CAhJJ5D,EAAAA,mBAqDM,MArDN6D,EAqDM,CApDJ7D,EAAAA,mBAmDM,MAnDN8D,EAmDM,CAlDJ9D,EAAAA,mBAAiF,MAAA,CAA5EF,MAAKC,EAAAA,eAAA,CAAC,mBAAkB,CAAA,cAAmC,SAATc,EAAApD,kBACvDuC,EAAAA,mBA6BM,MAAA,CA5BJF,MAAKC,EAAAA,eAAA,CAAC,eAAc,CAAAgE,OACO,YAATlD,EAAApD,SACjBuG,uBAAOrC,EAAc,8BAEtB3B,EAAAA,mBAsBM,MAAA,CAtBDiE,MAAM,KAAKC,OAAO,KAAKC,QAAQ,YAAYC,KAAK,OAAOC,MAAM,+BAChErE,EAAAA,mBAME,OAAA,CALAsE,EAAE,6BACFC,OAAO,eACP,eAAa,IACb,iBAAe,QACf,kBAAgB,UAElBvE,EAAAA,mBAME,OAAA,CALAsE,EAAE,oBACFC,OAAO,eACP,eAAa,IACb,iBAAe,QACf,kBAAgB,UAElBvE,EAAAA,mBAME,OAAA,CALAsE,EAAE,oBACFC,OAAO,eACP,eAAa,IACb,iBAAe,QACf,kBAAgB,eAGpBvE,EAAAA,mBAAe,YAAT,MAAE,SAEVA,EAAAA,mBAkBM,MAAA,CAlBDF,MAAKC,EAAAA,eAAA,CAAC,eAAc,CAAAgE,OAA4B,SAATlD,EAAApD,SAAyBuG,uBAAOrC,EAAc,2BACxF3B,EAAAA,mBAeM,MAAA,CAfDiE,MAAM,KAAKC,OAAO,KAAKC,QAAQ,YAAYC,KAAK,OAAOC,MAAM,+BAChErE,EAAAA,mBAME,OAAA,CALAsE,EAAE,oBACFC,OAAO,eACP,eAAa,IACb,iBAAe,QACf,kBAAgB,UAElBvE,EAAAA,mBAME,OAAA,CALAsE,EAAE,iBACFC,OAAO,eACP,eAAa,IACb,iBAAe,QACf,kBAAgB,eAGpBvE,EAAAA,mBAAe,YAAT,MAAE,aAKdA,EAAAA,mBAwFM,MAxFNwE,EAwFM,CAvFJrE,aAsFOC,EAAAqD,OAAA,iBAAAC,EAAAA,eAAAC,EAAAA,mBAtF6Bd,EAAApF,QAApC,IAsFO,kBArFLoC,EAAAA,mBAUM4E,EAAAA,SAAA,KAAAC,EAAAA,WATaxC,EAAAzE,MAAV2E,kBADTvC,EAAAA,mBAUM,MAAA,CARHe,IAAKwB,EAAOxB,IACbd,MAAKC,EAAAA,eAAA,CAAC,qBAAoB,CACjBqC,EAAOtC,MAAK,CAAA,+BAAoCsC,EAAOuC,aAC/DC,MAAKC,EAAAA,eAAEzC,EAAOwC,OACdE,MAAO1C,EAAO0C,MACdd,QAAKe,GAhHxB,SAA2B3C,GACrBA,EAAOuC,UACXvC,EAAO4B,UAAU1B,EAAU7E,MAC7B,CA6G0BuH,CAAkB5C,KAEsBA,EAAOM,oBAAvDM,EAAAA,YAA+DiC,EAAAA,wBAA/CxC,EAAiBL,IAAM,CAAAxB,IAAA,gDAGzBJ,EAAA/C,qBACdoC,EAAAA,mBA4BM,MAAA,OA3BJC,MAAKC,EAAAA,eAAA,CAAC,qBAAoB,CAAA,eACAmF,QAAA1D,MAC1BsD,MAAM,OACLd,QAAK3D,EAAA,KAAAA,EAAA,GAAA0E,GAAEjD,EAAeiD,MAGfG,EAAAA,MAAA1D,IADRvB,cAAAJ,EAAAA,mBAWM,MAXNsF,EAWM,IAAA9E,EAAA,KAAAA,EAAA,GAAA,CAJJL,EAAAA,mBAGE,OAAA,CAFAoE,KAAK,eACLE,EAAE,uIAGNrE,EAAAA,YAAAJ,EAAAA,mBASM,MATNuF,EASM,IAAA/E,EAAA,KAAAA,EAAA,GAAA,CARJL,EAAAA,mBAGE,OAAA,CAFAoE,KAAK,eACLE,EAAE,gKAEJtE,EAAAA,mBAGE,OAAA,CAFAoE,KAAK,eACLE,EAAE,+OAMVzE,EAAAA,mBAwCW4E,EAAAA,SAAA,CAAA7D,IAAA,GAAA,CAvCTZ,EAAAA,mBAOM,MAAA,CAPDF,MAAM,qBAAqBgF,MAAM,KAAMd,QAAK3D,EAAA,KAAAA,EAAA,GAAA0E,GAAE7D,EAAc6D,wBAC/D/E,EAAAA,mBAKM,MAAA,CALDiE,MAAM,KAAKC,OAAO,KAAKG,MAAM,6BAA6BF,QAAQ,kBACrEnE,EAAAA,mBAGE,OAAA,CAFAoE,KAAK,eACLE,EAAE,sNAKRtE,EAAAA,mBAOM,MAAA,CAPDF,MAAM,qBAAqBgF,MAAM,KAAMd,QAAK3D,EAAA,KAAAA,EAAA,GAAA0E,GAAEjE,EAAaiE,wBAC9D/E,EAAAA,mBAKM,MAAA,CALDiE,MAAM,KAAKC,OAAO,KAAKG,MAAM,6BAA6BF,QAAQ,kBACrEnE,EAAAA,mBAGE,OAAA,CAFAoE,KAAK,eACLE,EAAE,0QAKRtE,EAAAA,mBAWM,MAAA,CAXDF,MAAM,qBAAqBgF,MAAM,KAAMd,QAAK3D,EAAA,KAAAA,EAAA,GAAA0E,GAAE5D,EAAY4D,wBAC7D/E,EAAAA,mBASM,MAAA,CATDiE,MAAM,KAAKC,OAAO,KAAKG,MAAM,6BAA6BF,QAAQ,kBACrEnE,EAAAA,mBAGE,OAAA,CAFAoE,KAAK,eACLE,EAAE,kGAEJtE,EAAAA,mBAGE,OAAA,CAFAoE,KAAK,eACLE,EAAE,4RAKRtE,EAAAA,mBAOM,MAAA,CAPDF,MAAM,qBAAqBgF,MAAM,KAAMd,QAAOjC,sBACjD/B,EAAAA,mBAKM,MAAA,CALDiE,MAAM,KAAKC,OAAO,KAAKG,MAAM,6BAA6BF,QAAQ,kBACrEnE,EAAAA,mBAGE,OAAA,CAFAoE,KAAK,eACLE,EAAE,wLAYtBe,iBAAArF,EAAAA,mBAUM,MAVNsF,EAUM,CATJjC,EAAAA,YAQEJ,EAAAA,UAAA,CAPCC,KAAMxG,EAAMgE,KAAKxD,SAAO,GACzBiG,SAAS,UACR,UAASzG,EAAMY,OACf,cAAaZ,EAAM0G,WAAU,GAC7B,aAAY1G,EAAM0G,WAAU,GAC5B,0BAAwB,EACxB,4BAA0B,yEARlB5C,EAAA/C,0BAYb4F,EAAAA,YAOEkC,EAAA,SALI,mBAAJxI,IAAIwD,EACHrD,QAASF,EAAAS,MACTL,GAAIuD,EAAAlD,MACJ,UAASf,EAAMY,OACfC,OAAQb,EAAMa,+DALNiD,EAAA/C"}
|