Skip to content

Commit a536fa2

Browse files
authored
feat(nuxt): add mermaid chart support for handbook pages (#5143)
1 parent 11ed261 commit a536fa2

3 files changed

Lines changed: 1226 additions & 137 deletions

File tree

nuxt/components/prose/ProsePre.vue

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
<script setup>
2+
const props = defineProps({
3+
code: { type: String, default: '' },
4+
language: { type: String, default: null },
5+
filename: { type: String, default: null },
6+
highlights: { type: Array, default: () => [] },
7+
meta: { type: String, default: null },
8+
class: { type: String, default: null },
9+
})
10+
11+
const mermaidRef = ref(null)
12+
let renderCount = 0
13+
14+
onMounted(async () => {
15+
if (props.language !== 'mermaid' || !props.code || !mermaidRef.value) return
16+
17+
const { default: mermaid } = await import('mermaid')
18+
mermaid.initialize({ startOnLoad: false, theme: 'neutral' })
19+
20+
renderCount++
21+
const uniqueId = `mermaid-${renderCount}-${Math.random().toString(36).slice(2, 7)}`
22+
try {
23+
const { svg } = await mermaid.render(uniqueId, props.code)
24+
if (mermaidRef.value) mermaidRef.value.innerHTML = svg
25+
} catch {
26+
if (mermaidRef.value) mermaidRef.value.textContent = props.code
27+
}
28+
})
29+
</script>
30+
31+
<template>
32+
<div v-if="language === 'mermaid'" ref="mermaidRef" class="mermaid-diagram overflow-x-auto py-4" />
33+
<pre v-else :class="$props.class"><slot /></pre>
34+
</template>
35+
36+
<style>
37+
pre code .line { display: block }
38+
</style>

nuxt/package.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,9 @@
88
"generate": "nuxt generate",
99
"preview": "nuxt preview"
1010
},
11+
"dependencies": {
12+
"mermaid": "^11"
13+
},
1114
"devDependencies": {
1215
"@nuxt/content": "^3.13.0",
1316
"@nuxt/image": "^2.0.0",

0 commit comments

Comments
 (0)