Skip to content

Commit 07cedf8

Browse files
committed
feat: Improve Mermaid rendering reliability using tick and module interop, and remove mermaid from Vite's optimizeDeps.
1 parent 3642307 commit 07cedf8

File tree

2 files changed

+17
-6
lines changed

2 files changed

+17
-6
lines changed

src/lib/components/preview/MarkdownPreview.svelte

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<script lang="ts">
2-
import { onMount } from 'svelte';
2+
import { onMount, tick } from 'svelte';
33
import { processMarkdown, generateSettingsCSS } from '$lib/utils/markdown';
44
import { settingsStore } from '$lib/stores/settings.svelte';
55
import { i18n } from '$lib/stores/i18n.svelte';
@@ -25,7 +25,8 @@
2525
2626
// Render mermaid diagrams after DOM update
2727
if (result.mermaidBlocks.length > 0 && mermaidReady) {
28-
requestAnimationFrame(() => {
28+
// Use tick() to ensure DOM is updated with new HTML before searching for .mermaid elements
29+
tick().then(() => {
2930
renderMermaid();
3031
});
3132
}
@@ -64,8 +65,14 @@
6465
if (typeof window === 'undefined' || !previewContainer) return;
6566
6667
try {
67-
const mermaid = await import('mermaid');
68-
mermaid.default.initialize({
68+
// Small delay to ensure DOM is fully ready (tick() usually enough but this is safer for complex rendering)
69+
await tick();
70+
71+
const mermaidModule = await import('mermaid');
72+
// Handle potential CJS/ESM interop differences
73+
const mermaid = mermaidModule.default || mermaidModule;
74+
75+
mermaid.initialize({
6976
startOnLoad: false,
7077
theme: 'default',
7178
securityLevel: 'loose',
@@ -96,7 +103,7 @@
96103
97104
const mermaidDivs = previewContainer.querySelectorAll('.mermaid');
98105
if (mermaidDivs.length > 0) {
99-
await mermaid.default.run({
106+
await mermaid.run({
100107
nodes: mermaidDivs as NodeListOf<HTMLElement>
101108
});
102109
}
@@ -109,6 +116,10 @@
109116
try {
110117
await import('mermaid');
111118
mermaidReady = true;
119+
// Trigger a check in case content was loaded before mermaid
120+
if (processedHtml && previewContainer?.querySelectorAll('.mermaid').length > 0) {
121+
renderMermaid();
122+
}
112123
} catch (error) {
113124
console.error('Failed to load mermaid:', error);
114125
}

vite.config.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import topLevelAwait from 'vite-plugin-top-level-await';
77
export default defineConfig({
88
plugins: [tailwindcss(), sveltekit(), wasm(), topLevelAwait()],
99
optimizeDeps: {
10-
include: ['mermaid'],
10+
include: [],
1111
exclude: ['loro-crdt']
1212
},
1313
build: {

0 commit comments

Comments
 (0)